Dies ist eine statische Kopie unseres alten Forums. Es sind keine Interaktionen möglich.
This is a static copy of our old forum. Interactions are not possible.

francis-nano

Praktikant

  • "francis-nano" started this thread

Posts: 7

Date of registration: Jul 3rd 2012

1

Monday, July 9th 2012, 4:38pm

VOID Funktion Übergabe

Hallo,

kann ich von einer void Funktion etwas an eine andere void Funktion übergeben lassen?

z.B. Ich lasse in einer VoidFkt den Namen eines Textdokuments eingeben und will diesen Namen an meine zweite VoidFkt übergeben, weil diese das Textdokument auslesen soll.

Geht das?

LG danke

Finn MacCool

Junior Schreiberling

Posts: 195

Date of registration: Oct 7th 2006

2

Monday, July 9th 2012, 10:04pm

naja, du könntest mit der ersten funktion eine globale variable verändern und dann mit der zweiten funktion auf diese zugreifen. ich weiß aber nicht, ob das die eleganteste lösung ist.
So berichte uns weiter, sagte Diarmuid Donn, um der Liebe Gottes willen.
Fürwahr, sagte Finn, ich will nicht.

This post has been edited 1 times, last edit by "Finn MacCool" (Jul 9th 2012, 10:04pm)


SammysHP

Forenwolf

  • "SammysHP" is male

Posts: 712

Date of registration: Oct 11th 2010

Location: Celle

Occupation: Informatiker

3

Monday, July 9th 2012, 10:06pm

Globale Variable muss noch nichtmal sein, gibt schließlich Pointer. ;)

Finn MacCool

Junior Schreiberling

Posts: 195

Date of registration: Oct 7th 2006

4

Monday, July 9th 2012, 10:08pm

ich denke in java. ;)
So berichte uns weiter, sagte Diarmuid Donn, um der Liebe Gottes willen.
Fürwahr, sagte Finn, ich will nicht.

  • "Schokoholic" is male

Posts: 2,518

Date of registration: Oct 4th 2006

Location: Hannover

Occupation: Haarspaltung

5

Monday, July 9th 2012, 10:14pm

Ja, so etwas nennt sich "Rückgabeparameter". In C benutzt man das Konzept in der Regel, wenn eine Funktion einen String als Ergebnis liefert. Ein Beispiel ist etwa die Funktion strcpy(char *destination, const char *source);, die einen String von source nach destination kopiert.

Source code

1
2
3
4
5
6
7
int main() {
    char buffer[128];
    char text[] = "Hallo";

    strcpy(buffer, text);
    printf("%s\n", buffer); // -> Gibt "Hallo" aus.
}


Allerdings ist die Funktion ein schlechtes Beispiel, weil sie nicht weiß, wie groß der der Ziel-Speicherbereich ist.

Source code

1
2
3
4
5
6
7
8
9
10
11
int main() {
    char buffer[5];
    char text[] = "Hallooooooooooooooooooooooooooooooooooooo";

    // Die folgende Zeile schreibt mehr als 5 Zeichen in das Array buffer.
    // Dabei werden eventuell wichtige Daten überschrieben, die im Speicher hinter buffer liegen.
    // Im günstigsten Fall kriegst du sofort beim Ausführen einen Segmentation Fault,
    // im schlechtesten Fall läuft das Programm weiter und liefert falsche Ergebnisse.
    strcpy(buffer, text);
    printf("%s\n", buffer); // -> Gibt irgendetwas aus und/oder stürzt ab
}


Besser ist es deshalb, die Größe des Buffers mit anzugeben, wie zum Beispiel bei der Funktion strncpy(char *destination, const char *source, size_t num);, wo der Parameter num die maximale Anzahl an Zeichen angibt, die im Ziel-Buffer gespeichert werden können. Zum Beispiel so:

Source code

1
2
3
4
5
6
7
8
9
int main() {
    char buffer[5];
    char text[] = "Hallooooooooooooooooooooooooooooooooooooo";

    strncpy(buffer, text, sizeof(buffer)); // maximal 5 Byte kopieren
    buffer[sizeof(buffer)-1] = '\0'; // String-Ende-Marker setzen.

    printf("%s\n", buffer); // -> gibt "Hall" aus
}


Analog kannst du dir eine Funktion void nameEinlesen(char *name, int num) definieren, die den Namen von der Konsole einliest und in der übergebenen Variable name abspeichert. Quasi so:

Source code

1
2
3
4
5
6
7
8
int main() {
    char dateiname[128];

    nameEinlesen(dateiname, sizeof(dateiname));
    dateiname[sizeof(dateiname)-1] = '\0'; // String-Ende-Marker setzen (unnötig, wenn sich nameEinlesen schon darum kümmert)

    dateiAuslesen(dateiname);
}