Array als Returwert aus Funktion



  • Hallo, hab da ein "kleines" Problem, bei dem unten stehendem Code. Sinn sollte normal folgender sein, er öffnet in der Funktion func() eine .txt Datei, ließt daraus ein Wort, speichert es in der Variable word[15] ab und soll es zurückgeben. Später soll dann der return Wert der func() an die Variable word in main() zugewiesen werden.

    int main(int argc, char **argv)
    {
         unsigned char word[15];
         ...
         word = func(); /*  :warning: */
         ...
         return 0;
    }
    
    unsigned char func(void)
    {
         FILE *fd;
         unsigned char word[15];
         ...
         fgets(word, strlen(word), fd);
         ...
         return word; /*  :warning: */
    }
    

    So... nur meckert da der Compiler, hoffe mir kann da einer helfen.

    Danke



  • Wenn eine Funktion einen unsigned char zurückgibt, dann gibt sie genau ein Zeichen zurück. Du versuchst aber ein Array von chars zurückzugeben, was natürlich nicht funktioniert.
    Da Du ein Array nicht direkt an ein anderes zuweisen kannst und word[15] innerhlab von func() ohnehin nur lokal ist - d.h. nach zurückkehren aus der Funktion zerstört wird -, bringt es da jetzt auch nicht viel, den Rückgabetyp zu ändern.
    Am Besten wäre es wahrscheinlich, wenn Du word als Parameter an die Funktion übergibst und dann damit in der Funktion arbeitest:

    void func(unsigned char *word)   //evtl. int als Rückgabetyp, z.B. als Fehlercode
    {
    FILE *fd;
    ...
    fgets((char*)word, strlen(word), fd);
    }
    
    int main()
    {
    ...
    unsigned char word[15];
    func(word)
    }
    

    Warum willst Du word eigentlich unbedingt als unsigned haben? Bei fgets() musst Du word dann ohnehin zu (char 😉 casten, damit das Programm funktioniert.



  • Danke dir, funktioniert 🙂

    Warum willst Du word eigentlich unbedingt als unsigned haben? Bei fgets() musst Du word dann ohnehin zu (char 😉 casten, damit das Programm funktioniert.

    kA, ich wollte nur die Variablen richtig deklarieren, naja 😉

    ....

    Aber da stellt sich mir jetzt ein anderes Problem in die "Quere" und zwar wollte ich mit einem Wert, der durch einen Zufallsgenerator ermittelt wurde, die jeweilige Zeile auslesen.

    int func(char *word)
    {
         int line, ctr, ch;
         ...
         while(ch = fgetc(file)) != EOF)
              if(ch == '\n')
                  ++ctr; /* z.b 8 */
    
         line = rand() % ctr; /* dann z.b line = 5 */
    
         fgets(word, strlen(word), file);  
         /* :warning: 
            Wie kann man es nun machen das er die/das 5. Zeile/Wort ausgibt?
         */
         fclose(file);
         return 0;
    }
    

    Danke



  • podok schrieb:

    int func(char *word)
    {
         int line, ctr, ch;
         ...
         while(ch = fgetc(file)) != EOF)
              if(ch == '\n')
                  ++ctr; /* z.b 8 */
    
         line = rand() % ctr; /* dann z.b line = 5 */
    
         fgets(word, strlen(word), file);  
         /* :warning: 
            Wie kann man es nun machen das er die/das 5. Zeile/Wort ausgibt?
         */
         fclose(file);
         return 0;
    }
    

    Es macht wenig Sinn, das File bis zum Ende (EOF) auszulesen,
    und dann zu versuchen, mit fgets noch eine Zeile zu lesen.
    Du solltes entweder, wenn moeglich, mit fseek das file
    zuruecksetzten oder es schliessen und noch einmal oeffnen.

    Danach kannst du die Zeilen am Anfang ueberlesen
    mit

    if(line>0) while(--line) fgets(word,....)
    

    oder mit

    if (line>0) while((c=fgetc(file)!=EOF)&&(line-=(c=='\n')));
    


  • Sorry, aber ich versteh das nicht so ganz. Ist das nun so richtig:

    int main(int argc, char **argv)
    {
         char word[MAX]; /* MAX=15 */
    
         if(func(word) == -1)
              return -1;
         fprintf(stdout, "%s", word);
    
         return 0;
    }
    
    int func(char *word)
    {
         FILE *file;
         unsigned int line, counter, character;
    
         if((file = fopen("datei.txt", "r")) == NULL)
              return -1;
    
         while(character = fgetc(file)) != EOF)
              if(character == '\n')
                  ++counter;
    
         fseek(file, 0L, SEEK_SET);
    
         line = rand() % counter;
    
         if(line>0)
              while(--line)
                   fgets(word, strlen(word), file);  
    
         fclose(file);
    
         return 0;
    }
    

    ...denn irgendwie kommt kein word in der main() an. 😞



  • 1. musst Du counter vor der Benutzung initialisieren, sonst steht da nur Müll drin.
    2. solltest Du vor rand() srand() aufrufen, um den Zufallszahlengenerator zu initialisieren, sonst kommen immer die gleichen Werte Bsp.:

    #include <ctime>
    ...
    srand((unsigned int)time(NULL));
    ...
    

    3. wird die letzte Zeile bei Deinem Programm nie gelesen, wenn die Zeile nicht mit '\n' abschliesst
    4. erzeugt rand() Zufallszahlen zwischen 0 und counter. Im Fall von 0 wird bei Dir nichts gelesen (if line>0) und word zeigt dann auf irgendetwas. Am besten bei der Erzeugung der Zufallszahl noch eine 1 hinzuaddieren.

    Bei mir läuft es so:

    int func(char *word)
    {
         FILE *file;
         unsigned int line, counter = 0, character;
    
         if((file = fopen("datei.txt", "r")) == NULL)
              return -1;
    
         while((character = fgetc(file)) != EOF)
              if(character == '\n')
                  ++counter;
    
         fseek(file, 0L, SEEK_SET);
    
         line = 1 + rand() % counter;
    
    	 if(line)
          while(line--)
    		{
                  fgets(word, 25, file);  
    		 }
    
         fclose(file);
    
         return 0;
    }
    

Anmelden zum Antworten