keine ausabe aus struct :-(



  • hallo, ich versuche meine daten aus einem struct zu bekommen, leider ohne erfolg 😞

    typedef struct na2
    {
      char*  name;
      int    anz;
    } na2element
    
    im main:
    
    na2element einname[1024];
    
    initialisierung:
    
      for (i = 0; i < 1024; i++)
      {
        einname[i].name = NULL;
        einname[i].anz = 0;
      }
    
    in einer while schleife gebe ich datein in das struct:
    
      while (bedingung)
      {
        // daten werden umständlicher gefüllt, deshalb hier nur ein Beispiel. aber auch dieses funktioniert nicht
    
        einname[i].name = "test";
        einname[i].anz++;
    i++
    
    // wenn ich hier ein cout mache, bekomm ich ein Ergebniss:
        printf("%5i  %s\n",anz, name);
      }
    
    // wenn ich hier ein cout mache, bekomm ich KEIN Ergebniss:
    
    for(i=0;i<=1024;i++){
        printf("%5i  %s\n",einname[i].anz, einname[i].name);
    }
    

    wo liegt mein Problem??



  • In dieser Zeile: einname[i].name = "test";
    weist du dem Pointer einen Verweis auf einen temporären String zu. Wenn du den Gültigkeitsbereich verläßt, ist das Verhalten undefiniert bzw. Glück etc. Also entweder für name Speicher reservieren (zB mit new) oder gleich std::string benutzen.



  • lege ich in dieser Zeile nicht ein struct mit 1024 Feldern an UND sie bekommen automatisch speicher zugewiesen?

    na2element einname[1024];

    oder ungefähr so?

    na2element einname[1024]= (na2element) malloc(1024*(sizeof(na2element)));



  • Poste das doch ins C Forum. C++ ist das nämlich nicht.



  • _mache_fehler schrieb:

    hallo, ich versuche meine daten aus einem struct zu bekommen, leider ohne erfolg :-(...

    Wie wäre es wenn du einfach auf std::string umsteigst und nicht den armen PC mit schreiben in nichtallozierte Speicherbereiche quälst 😉 Aber ich glaube nicht das du überhaupt ins richtige Forum gepostet hast da kein Teil deines Codes auf C++ deutet.

    char* name; <-- Zeiger
    name = "test"; <-- Vereinfacht gesprochen: Dein Zeiger mag nun wohin Zeigen, aber der Speicher wurde dafür nicht alloziert.

    Das der erste printf noch ein Ergebnis ausgibt ist eher Glück...

    cu André



  • _mache_fehler schrieb:

    lege ich in dieser Zeile nicht ein struct mit 1024 Feldern an UND sie bekommen automatisch speicher zugewiesen?

    na2element einname[1024];
    ...

    Dein na2element ist im Speicher vorhanden, auch der Zeiger "name", nicht aber ein Speicherbereich hinter dem Zeiger.

    cu André



  • Mach aus dem:

    _mache_fehler schrieb:

    ...

    typedef struct na2
    {
      char*  name;
      int    anz;
    } na2element
    ...
    

    das hier:

    #include <string>
    
    struct na2element
    {
      std::string  name;
      int    anz;
       na2element() : name(), anz(0) {}
    };
    

    und streiche diesen Abschnitt

    ...
      for (i = 0; i < 1024; i++)
      {
        einname[i].name = NULL;
        einname[i].anz = 0;
      }
    ...
    

    Wenn du dann noch die printf() durch passenden std::cout-Konstrukte ersetzt, näherst du dich langsam der Programmiersprache, um die es in diesem Forums geht und das Teil könnte laufen 😉

    Gruß,

    Simon2.


Anmelden zum Antworten