verkette Liste - zuweisen von Zeiger



  • Hallo,
    habe von folgendem Link eine verkette List übernommen ..

    http://www.pronix.de/pronix-827.html

    Nachdem das erst Element angelegt wird (funktioniert prima) wird an die folgende Position das nächste Element angehängt (else)! Der erste Schritt unter else :

    zeiger = anfang;
    

    sollte der

    struct RealTimeData *anfang = NULL;
    

    an

    struct RealTimeData *zeiger = NULL;
    

    übergeben werden! Dabei erhalte ich jedoch immer eine Access Violation!

    void anhaengen(unsigned int Zeit, double *PCA1, double *PCA2) {
    
    	int i;	
       /* Zeiger zum Zugriff auf die einzelnen Elemente der Struktur*/
    	struct RealTimeData *zeiger = NULL;
    
      /* Wir fragen ab, ob es schon ein Element in der Liste gibt. Wir suchen das Element, auf das unser Zeiger
       *  *anfang zeigt. Falls *anfang immer noch auf NULL zeigt, bekommt *anfang die Adresse unseres 1. Elements und ist
       *  somit der Kopf (Anfang) unserer Liste  */
    
    	if(anfang == NULL) {
    
    	/* Wir reservieren Speicherplatz für unsere Struktur für das erste Element der Liste*/
          if((anfang = (struct RealTimeData *)malloc(sizeof(struct RealTimeData))) == NULL) {
           fprintf(stderr, "Kein Speicherplatz vorhanden für anfang\n");
           return;
          }
    
    	  anfang->Zeit = Zeit;
    	  for (i=0;i<10;i++){
    		anfang->PCA_R1[i] = PCA1[i];
    		anfang->PCA_R2[i] = PCA2[i];
    	  }	  
    
          /* Somit haben wir unseren Anfang der Liste. Von nun an zeigt der Zeiger anfang immer auf das Element vor ihm.
           * Da dies aber jetzt das 1. Element der Liste war, zeigt der Zeiger anfang auf den Zeiger next. next zeigt am
           * Ende immer wieder  NULL   */
          anfang->next = NULL;	
    	}
    
       /* Es scheint schon mindestens ein Element in der Liste vorhanden zu sein, da der Anfang nicht == NULL ist.
        * Jetzt suchen wir so lange nach dem nächsten Element, bis der *next-Zeiger auf NULL zeigt. Somit haben wir
        * das Ende der Liste gefunden und können einen neuen Datensatz anhängen  */
       else {
    	 [b]zeiger = anfang;[/b]
          //memcpy(&zeiger,&anfang,sizeof(RealTimeData));
    
    	  while(zeiger->next != NULL)
             zeiger=zeiger->next;
          /* Wir reservieren einen Speicherplatz für das letzte Element der Liste und hängen es an.   */
          if((zeiger->next = (struct RealTimeData *)malloc(sizeof(struct RealTimeData))) == NULL) {
              fprintf(stderr,"Kein Speicherplatz für das letzte Element\n");
              return;
          }
    
    	  zeiger=zeiger->next; /* zeiger auf neuen Speicherplatz */      
    
    	  zeiger->Zeit = Zeit ;
    	  for (i=0;i<10;i++){
    		zeiger->PCA_R1[i] = PCA1[i];
    		zeiger->PCA_R2[i] = PCA2[i];
    	  }
          /* Wir terminieren wieder unsere Datenstruktur */
          zeiger->next=NULL;
       }
    }
    

    Habe schon versucht die Elemente einzeln zu kopieren .. liefert das gleiche
    Ergebniss. Ebenfalls erfolglos war das kopieren mit

    memcpy(&zeiger,&anfang,sizeof(RealTimeData));
    

    Hoffe jemand kann mir da weiterhelfen!!!

    Gruß
    Michael



  • Wie ist denn RealTimeData definiert? Sind PCA_R1 und PCA_R2 Arrays oder Zeiger?

    Verschiebst du möglicherweise in einer anderen Funktion den anfang-Zeiger?



  • RealTimeData ist wie folgt definiert ..

    struct RealTimeData {
    	unsigned int Zeit;
    	double PCA_R1[12];
    	double PCA_R2[12];
    	struct RealTimeData *next;
    	};
    

    Der anfang Zeiger wird nur hier verschoben ..



  • Hi,

    bei mir funktioniert die Routine anhaengen. Dein Fehler muß woanders liegen.

    Übrigens, in anhaengen werden nur 10 Elemente kopiert, nicht 12.

    cu, Bernd

    #include <stdio.h>
    #include <malloc.h>
    
    struct RealTimeData
    {
    	unsigned int Zeit;
    	double PCA_R1[12];
    	double PCA_R2[12];
    	struct RealTimeData * next;
    };
    
    struct RealTimeData *anfang = NULL;
    struct RealTimeData *zeiger = NULL;
    
    void anhaengen(unsigned int Zeit, double *PCA1, double *PCA2);
    
    int main(void)
    {
    	double d1[10] = { 0.1,1,2,3,4,5,6,7,8,9 };
    	double d2[10] = { 0.2,1,2,3,4,5,6,7,8,9 };
    	double d3[10] = { 0.3,1,2,3,4,5,6,7,8,9 };
    
    	anhaengen( 0, d1, d2 );
    	anhaengen( 1, d2, d3 );
    	anhaengen( 2, d3, d1 );
    
    	for ( zeiger = anfang; zeiger != NULL; zeiger = zeiger->next )
    		printf( "%d:%g %g\n", zeiger->Zeit, zeiger->PCA_R1[0], zeiger->PCA_R2[0] );
    	getchar();
    	return 0;
    }
    
    void anhaengen(unsigned int Zeit, double *PCA1, double *PCA2) {
    // ...
    }
    


  • kanns Du mir mal Deine anhaengen() posten ...



  • Hi,

    die habe ich von Deinem 1. Beitrag kopiert und NICHTS daran geändert.

    cu, Bernd



  • Hi,
    bei einem Kollegen von mir geht's auch .. kann es an C/C++ Einstellungen liegen, bzw. gibt es Memory-Einstellung des Compilers, welche so ein Verhalten verursachen können? Arbeite mit VC 6.0 ..

    Gruß
    daMike


Anmelden zum Antworten