struct in funktion kopieren?



  • Moin,

    ich hab da ein problem...

    in meiner funktion benutze ich ein struct STRUCT[NUMBERS].
    dieses STRUCT[NUMBERS] hat bereits bestimmte werte in "main" bekommen, die ich in der funktion nutzen will.

    Da kommt das problem:
    mein compiler meckaht, das STRUCT[NUMBERS] in der funktion nicht definiert sei.

    UND DA KOMMT IHR INS SPIEL!
    sendet mir eure problemlösungsvorschläge.

    bitte möglichst mit kleinem beispiel 🙄

    UND FÜR GANZ SCHLAUE:
    kann ich den inhalt einer variable in einen pointer (in ein STRUCT) speichern,
    OHNE dass ich den pointer auf die Variable ansetzte?



  • Ich hoffe doch du hast dein struct nicht wirklich STRUCT genannt, oder?
    (Btw. Rück mal den Code raus)

    Wie auch immer, hast du das struct global erstellt oder in der main-Funktion?
    Wenn du's in main erstellt hast kann die Funktion es nicht finden, also gibst du's einfach als Parameter an die Funktion.



  • Ich bin mir nicht 100%ig sicher, was du mit struct STRUCT[NUMBERS] meinst, aber vielleicht ja das:

    #include <stdio.h>
    #define NUMBERS 2
    
    struct foo {
       int bar;
    };
    
    void func(struct foo STRUCT[NUMBERS]) {
       int i;
       for(i=0; i < NUMBERS; i++)
          printf("%i\n", STRUCT[i].bar);
    }
    
    int main (int argc, char **argv) { 
       struct foo STRUCT[NUMBERS];
       STRUCT[0].bar = 2;
       STRUCT[1].bar = 3;
       func(STRUCT);
    
    }
    

    UND FÜR GANZ SCHLAUE:
    kann ich den inhalt einer variable in einen pointer (in ein STRUCT) speichern,
    OHNE dass ich den pointer auf die Variable ansetzte?

    Keine Ahnung was du meinst. Kannst du das mal verständlich umformulieren?



  • // struct_test2 - To test structs
    
    #include <stdio.h>
    #include <stdlib.h>
    
    //-----------------------------------------------------------------------------------------------
    
    //-----------------------------------------------------------------------------------------------
    
    struct Daten
    {
      char *vorname;
      char *nachname;
    
      char *telefonnummer;
      char *handynummer;
      char *email;
    };
    
    int suche_vorname(int max_count, char zu_suchen);
    
    //-----------------------------------------------------------------------------------------------
    
    int main()
    {
      int count = 0;
    
      FILE * datei;
      datei = fopen("namen.txt","r");
    
      int max_count;
      fscanf(datei, " %d\n", &max_count);
    
      char *vorname_temp = malloc(100 * sizeof(char));
      char *nachname_temp = malloc(100 * sizeof(char));
      char *telefonnummer_temp = malloc(100 * sizeof(char));
      char *handynummer_temp = malloc(100 * sizeof(char));
      char *email_temp = malloc(100 * sizeof(char));
    
      struct Daten DatenSpeichern[max_count];
    
     FSCANF:
      fscanf(datei, " %s %s\t%s\t%s\t%s\n",
    	 vorname_temp,
    	 nachname_temp,
    	 telefonnummer_temp,
    	 handynummer_temp,
    	 email_temp);
    
      DatenSpeichern[count].vorname = vorname_temp;
      DatenSpeichern[count].nachname = nachname_temp;
      DatenSpeichern[count].telefonnummer = telefonnummer_temp;
      DatenSpeichern[count].handynummer = handynummer_temp;
      DatenSpeichern[count].email = email_temp;
    
      *vorname_temp = '\0';
      *nachname_temp = '\0';
      *telefonnummer_temp = '\0';
      *handynummer_temp = '\0';
      *email_temp = '\0';
    
      if(!(count == (max_count-1)))
        {
          count++;
          goto FSCANF;
        }
    
      fclose(datei);
    
      return(0);
    }
    
    //-----------------------------------------------------------------------------------------------
    
    //void nuetzliches()
    //{
    //  printf("%s %s\t%s\t%s\t%s\n",
    //	 DatenSpeichern[count].vorname,
    //	 DatenSpeichern[count].nachname,
    //	 DatenSpeichern[count].telefonnummer,
    //	 DatenSpeichern[count].handynummer,
    //	 DatenSpeichern[count].email);
    //
    //  return(0);
    //}
    
    //-----------------------------------------------------------------------------------------------
    
    int suche_vorname(int max_count, char zu_suchen, struct *DatenSpeichern)
    {
      int count = 0;
      int count2 = 0;
      int max_count2 = 0;
      char *Gesuchtes_vorname = malloc(max_count * sizeof(char));
      char *Gesuchtes_nachname = malloc(max_count * sizeof(char));
    
      for(count = -1; count < max_count; ++count)
        {
          if(DatenSpeichern[count].vorname == zu_suchen)
    	{
    	  Gesuchtes_vorname[count2] = DatenSpeichern[count].vorname;
    	  Gesuchtes_nachname[count2] = DatenSpeichern[count].nachname;
    	  count2 += 1;
    	  max_count2 += 1;
    	}
        }
    
      if(max_count2 == 0)
        {
          printf("Zur Suche liegen keine Ergebnisse vor\n");
          return(0);
        }
    
      printf("ERGEBNISSE:\n");
      count = -1;
      while(++count < max_count2)
        printf(" %s %s\n",
    	   Gesuchtes_vorname[count],
    	   Gesuchtes_nachname[count]);
    
      return(0);
    }
    

    an dieser stelle möchte ich erwähnen, dass
    1. das sehr viel text is (tschuldigung)
    2. die funktion noch nicht aufgerufen wird, DAS ÄNDERT SICH NOCH (hoffe ich)



  • wenn

    char 1;
    

    und

    *Daten[0].frage
    

    dann

    *daten[0].frage = 1
    

    ?



  • struct Daten
    {
      char *vorname;
      char *nachname;
    
      char *telefonnummer;
      char *handynummer;
      char *email;
    };
    

    Uninitialisierte Pointer sind ziemlich heikel.
    Warum nicht einfach

    char vorname[30];
    
    FSCANF:
    

    Das könntest du mit einer do-while Loop ersetzen.

    Und dein Zugriffsproblem liegt einfach darin dass das struct DatenSpeichern in main also lokales Objekt definiert ist und deshalb keine andere Funktion Zugriff darauf hat.
    Entweder du erstellst DatenSpeichern global (net gut) oder (besser) du übergibst das struct an die Funktion nuetzliches als Parameter.
    Vergiss nicht die Variablen max_count und count global zu definieren, sonst hast du das gleiche Problem wie vorher.

    void nuetzliches(struct Daten DS[max_count]) {
      printf("%s %s\t%s\t%s\t%s\n",
         DS[count].vorname,
         DS[count].nachname,
         DS[count].telefonnummer,
         DS[count].handynummer,
         DS[count].email);
    
    }
    


  • warum schreibt mein compiler immer

    ERROR: NEED EXPLIZITE TYPE TO CONVERT
    FROM: INT
    TO: CHAR*

    wenn ich

    if(DatenSpeichern[count].vorname == zu_suchen)
    

    habe?



  • ItsNotYou schrieb:

    warum schreibt mein compiler immer

    ERROR: NEED EXPLIZITE TYPE TO CONVERT
    FROM: INT
    TO: CHAR*

    wenn ich

    if(DatenSpeichern[count].vorname == zu_suchen)
    

    habe?

    Weil du nicht einfach so einen char* mit einem char vergleichen kannst. Du könntest vorname explizit zu einem int casten; aber das Ergebnis wäre bestimmt nicht das, was du willst.



  • [quote="GPC"][quote]

    void nuetzliches(struct Daten DS[max_count])
    

    [quote]

    wie ich das ding jetzt in void definiere, hat mir sehr geholfen.
    ABA:

    wie schreibe ich das jetzt in MAIN?

    funktions_kontrolle = nuetzliches(struct Daten DS[max_count])
    

    oder

    funktions_kontrolle = nuetzliches(Daten DS[max_count])
    

    Ich habe einiges ausprobiert, aber mein compiler meckert überall.

    mit andern worten ICH BRÄUCHTE DA MAL GANZ SCHNELLE HILFE!!!



  • ItsNotYou schrieb:

    mit andern worten ICH BRÄUCHTE DA MAL GANZ SCHNELLE HILFE!!!

    Was du brauchst sind:
    - ein besseres Auffassungsvermögen => Schau dir nochmal meinen 1. Beitrag an.
    - ein Tutorial => das sind absolute Grundlagen.



  • ich habe bereits ein buch, da ist das thema STRUCTS aba mehr als dürftig abgearbeitet.

    trotzdem danke



  • wie schreibe ich das jetzt in MAIN?

    nuetzliches(DatenSpeichern);
    

    du solltest dir echt mal ein tut durchlesen.


Anmelden zum Antworten