[C] Konflikt zwischen Pointer und Integer Wert?!

Hi,
ich hab nun angewandt was du mir beschrieben hast. Aber irgendwas mache ich anscheinend beim kopieren der Namen falsch. Das Programm reserviert zwar die korrekte Anzahl an Zeilen für Namen (d.h. wenn zu der Jahreszahl 3 Namen gehören, wird auch Speicher für 3 Strings reserviert) aber irgendwie bleiben die leer. Soll heißen die Ausgabe liefert:
Jahr: 1978
Namen:
(null)
(null)
(null)
Jahr: 1991
Namen:
(null)
Woran könnte das liegen?
Code:
// Ueberpruefung ob leere Zeile oder KOmmentar vorliegt
      if(line[0]!='#' && line[0]!='\n')
      {
        // Initialisierung
        valid_line=1;
        charcounter=0;

        linelen=strlen(line);

        // Auslesen der Jahreszahl aus der Zeile
        while(line[charcounter]!=32) // ASCII(32)=' '
        {
          charcounter++;
          if(charcounter==linelen) valid_line=0;
        }  // Nach der Jahreszahl angelangt  
        
        if(valid_line==1) {
          // Kopieren der Jahreszahl in die temporaere Datei
          strncpy(temp,line,charcounter);
          // Anhaengen des "Stringende" Zeichens
          temp[charcounter]='\0';

          no=(nobel_p)malloc(sizeof(nobel_t));  // Reservierung des Speichers
                                                // fuer das neue Element
          // Setzen der "next" Zeiger auf NULL und initialisierung von position
          no->l=NULL;
          no->r=NULL;
          no->position=0;

          // Speicherreservierung
          no->names=(char**)malloc(sizeof(char*)*anzahl_kommas(line)+1);

          // Einlesen der Jahreszahl ins Datenelement
          sscanf(temp,"%d",&no->year);

          charcounter++;
          start=charcounter;
          i=0;

          while(line[charcounter]!='\n')
          {
            while(line[charcounter]!=',' && line[charcounter]!='\n')
            {
              charcounter++;
            }  // Nach dem ersten Namen angelangt  

            strncpy(temp,&line[start],charcounter-start);
            temp[charcounter-start]='\0';

            fprintf(stdout,"temp: %s\n",temp);
            
            namenlaenge=strlen(temp);
            
            no->names[no->position]=(char*)malloc(sizeof(char)*namenlaenge+1);
            memset(no->names[no->position],0,namenlaenge+1);

            //Namen kopieren            
            no->names[no->position] = temp;

            no->position++;

            if(line[charcounter]!='\n')
            {
              charcounter++;
              start=charcounter+1;
            }
          }
          
          no->names=names;

          fprintf(stdout,"Einfuegen des Eintrags %d\n",no->year);// Zeilenausgabe
          fprintf(stdout,"Wurzelzeiger->");// Zeilenausgabe
          treehead = tree_add(treehead);
        }
      }
 
Code:
no->names[no->position] = temp;

Das ist falsch. Damit setzt du den Zeiger no->names[no->position] um. Richtig wäre:

Code:
strcpy(no->names[no->position],temp);

(Dann kann auch die memset-Zeile zuvor wegfallen.)

Code:
no->names=names;

Was soll diese Zeile? Damit machst du alle Reservierungen wieder ungültig.

Code:
// Auslesen der Jahreszahl aus der Zeile
while(line[charcounter]!=32) // ASCII(32)=' '
{
     charcounter++;
     if(charcounter==linelen) valid_line=0;
}

Würde ich noch abändern zu:
Code:
// Auslesen der Jahreszahl aus der Zeile
while(line[charcounter]!=32) // ASCII(32)=' '
{
     charcounter++;
     if(charcounter==linelen) 
     {
          valid_line=0;
          break;
     }
}
Sonst zählt er immer weiter, selbst wenn valid_line schon 0 ist.

Was ist eigentlich mit temp? Wie hast du temp deklariert?
 
Original geschrieben von Dudadida
Code:
no->names=names;


Was soll diese Zeile? Damit machst du alle Reservierungen wieder ungültig.
Danke für den Hinweis, das ist mir früher beim lernen von PHP schon immer passiert. Wenn ich code Beispiele übernehme, vergesse ich immer eigene Sachen rauszunehmen :D
Original geschrieben von Dudadida
Code:
no->names[no->position] = temp;


Das ist falsch. Damit setzt du den Zeiger no->names[no->position] um. Richtig wäre:

Code:
strcpy(no->names[no->position],temp);


(Dann kann auch die memset-Zeile zuvor wegfallen.)
Damit funktioniert jetzt das Programm einwandfrei, danke für die Mühe.
Original geschrieben von Dudadida
Code:
// Auslesen der Jahreszahl aus der Zeile
while(line[charcounter]!=32) // ASCII(32)=' '
{
     charcounter++;
     if(charcounter==linelen) valid_line=0;
}


Würde ich noch abändern zu:
Code:
// Auslesen der Jahreszahl aus der Zeile
while(line[charcounter]!=32) // ASCII(32)=' '
{
     charcounter++;
     if(charcounter==linelen) 
     {
          valid_line=0;
          break;
     }
}

Sonst zählt er immer weiter, selbst wenn valid_line schon 0 ist.
Direkt nach dem pasten des Codes war mir das vorhin selber aufgefallen und ich habs einfach in
Code:
// Auslesen der Jahreszahl aus der Zeile
while(line[charcounter]!=32 && line[charcounter]!='\n') // ASCII(32)=' '
{
  charcounter++;
  if(charcounter==linelen) valid_line=0;
}  // Nach der Jahreszahl angelangt
geändert.
Original geschrieben von Dudadida
Was ist eigentlich mit temp? Wie hast du temp deklariert?
Code:
char temp[200];     // temp. Variable zum Zwischenspeichern

Könntest du mir vielleicht noch kurz die memset Zeile erklären? Sie ist ja jetzt nicht mehr nötig, aber was bringt sie?
 
Mit der memset-Zeile wurde der ganze reservierte Speicher auf das Zeichen 0 gesetzt. (Allgemein schreibt man damit an eine bestimmte Adresse eine bestimmte Anzahl von Bytes mit einem bestimmten Zeichen, bestimmt?... äh alles klar? ;))

Syntax: memset(adresse,zeichen,anzahl);

Das ist ne "Nummer-sicher-Lösung" wenn man mit strings arbeitet. So wird der String immer korrekt beendet, weil - egal an welcher Stelle man einfügt - immer eine 0 folgt. Ist bei den Stringroutinen aber meist nicht nötig, da die für gewöhnlich die 0 mitkopieren.
 
Zurück