Problem mit verketteter Liste (System.NullReferenceException)



  • N'abnd!

    Sitz hier scho en ganzen Tag an verketteten Listen und versteh diesen immer wiederkehrenden Fehler einfach net - bin kurz vorm verzweifeln 😞 .

    Hier erstmal'n bissal code:

    struct elem_t
    	{
    	struct elem_t *next;
    	double messwert;
    	};
    
    struct elem_t *next;
    struct elem_t *anfang;
    
    struct elem_t *ListEin(struct elem_t *anfang)
    {
    	struct elem_t *zeiger;
    	struct elem_t *letzter;
    	zeiger = anfang;
    
    	if(zeiger->next == NULL)    :warning:  :warning: 
    	{
    		zeiger = (struct elem_t *) malloc(sizeof(struct elem_t));
    		printf("Messwert eingeben: ");
    		scanf("%lf", &zeiger->messwert);
    	}
    

    Bei ⚠ gibt er mir während dem Programmablauf dann aus: "System.NullReferenceException: Object reference not set to an instance of an object".

    Ich krieg den Fehler meistens (nicht immer?!) wenn ich über zeiger-> next oder zeiger->messwert versuche auf ein Element der Liste zuzugreifen.

    Edit: vielleicht noch nen bisschen ausführlicher, denn, das tritt ja net nur dort auf.

    An diesen Stellen ausserdem auch noch:

    void Ausgabe(struct elem_t *anfang)
    {
    	struct elem_t *zeiger;
    	zeiger = anfang;
    
    	printf("\n\n %lf", zeiger->messwert);               \\zum testen
    	zeiger = zeiger->next;  :warning:  :warning:  
    	printf("\n\n %lf", zeiger->messwert);               \\zum testen
    
    	while(zeiger->next != NULL);   :warning:   :warning: 
    	{
    		printf("\n Wert: %lf", zeiger->messwert);
    		zeiger = zeiger->next;		 :warning:  :warning: 
    	}
    

    Besonders deprimierend is ja dass ich scho versucht hab aus tutorials heraus 1:1 dasselbe zu machen, ich aber trotzdem immer denselben Fehler bekomm.

    Was mach ich falsch?

    Danke im voraus!



  • anfang->next ist wahrscheinlich nicht initialisiert.



  • Meh schrieb:

    System.NullReferenceException: ...

    kommt das von einer VM (.NET)?
    seit wann geht da C?



  • der code hat nicht nur einen fehler drin

    struct elem_t
    	{
    	struct elem_t *next;
    	double messwert;
    	};
    
    struct elem_t *next;//sinnvoll ??
    struct elem_t *anfang;
    
    struct elem_t *ListEin(struct elem_t *anfang)
    {
    	struct elem_t *zeiger;
    	struct elem_t *letzter;//wozu ??
    	zeiger = anfang;//Wozu ??
    
    	if(zeiger->next == NULL)//was wenn zieger == 0 ??
    	{
    		zeiger = (struct elem_t *) malloc(sizeof(struct elem_t));
    		printf("Messwert eingeben: ");
    		scanf("%lf", &zeiger->messwert);//zeiger->messwert ist schon ein zeiger, du gibst die adresse des zeigers an.
    	}
    
    void Ausgabe(struct elem_t *anfang)
    {
    	struct elem_t *zeiger;
    	zeiger = anfang;//wozu immer die zuweisungen in den funktionen. der zeiger anfang is doch eh nur ne kopie von dem 
    //aus main und deshalb kannst du den auch verändern wie du willst.
    
    	printf("\n\n %lf", zeiger->messwert);               \\zum testen
    	zeiger = zeiger->next;  :warning:  :warning:  
    	printf("\n\n %lf", zeiger->messwert);               \\zum testen
    
    	while(zeiger->next != NULL);//wie oben while (zeiger && zeiger->next)
    //Wenn zeiger=0 dann wird der rest nicht mehr geprüft, also auch kein fehler
    	{
    		printf("\n Wert: %lf", zeiger->messwert);
    		zeiger = zeiger->next;		 :warning:  :warning: 
    	}
    


  • Hi Eddi,

    das Zeug sollte Funzen:

    // ****************************************************
    // ********** internal Structures ********************
    // ****************************************************
    struct buzz_tone
    {
    	unsigned int hoehe;
    	char dauer;
    	struct buzz_tone far *next_buzz;
    };
    // **************************************************
    // ********** internal variables  *******************
    // **************************************************
    static struct buzz_tone far *buzz_first = NULL;
    static struct buzz_tone far *buzz_last = NULL;
    static char buzzes = 0;
    static char enabled = 255;
    // **************************************************
    // ********** internal Prototypes *******************
    // **************************************************
    void buzz_delete(struct buzz_tone far *del_buzz); 	// Destruktorfunktion
    
    // ********************************************************************************************************
    // *******  Ton  löschen ****************************************************************************
    // ********************************************************************************************************
    void buzz_delete(struct buzz_tone far *del_buzz)	// Destruktorfunktion
    {
    		free(del_buzz);
    		buzzes--;
    }
    // ********************************************************************************************************
    // *******  neuen buzz in Liste eintragen  ***************************************************************
    // ********************************************************************************************************
    char BuzzListEntry(unsigned int hoehe_n, char dauer_n)
    {
    struct buzz_tone far *new_entry;
    	if (enabled)
    		{
    			new_entry = malloc(sizeof(struct buzz_tone));
    			if (new_entry)	
    			{
    				new_entry->hoehe = hoehe_n;
    				new_entry->dauer = dauer_n;
    				new_entry->next_buzz = NULL;
    				if (buzzes) buzz_last->next_buzz = new_entry;
    				else buzz_first = new_entry;
    				buzz_last = new_entry;
    				buzzes++;
    			}
    		}
    		return(buzzes); 
    }
    /*************************************************************/
    /************** Piepser **********************/
    /*************************************************************/
    void BuzzPlay(void) 
    {                   // Buzzer
    struct buzz_tone far *follow_event;
    if (buzzes)
    		if (ta3s)	// Hardware- Flag abfragen
    		{
    			if (!(--(buzz_first->dauer)))	// Spieldauer abgelaufen?
    			{
    				ta3s = 0; 
    				follow_event = buzz_first->next_buzz;
    							// aus Liste löschen
    				buzz_delete(buzz_first);	// Destruktor des Events
    				buzz_first = follow_event;
    				if (buzzes)
    				{
    					ta3= buzz_first->hoehe;
    					ta3s = 1;
    				}
    			}
    		}
    		else
    		{
    			ta3= buzz_first->hoehe;
    			ta3s = 1;
    		}
    }
    

    War meine erste vorwärtsverkettete Liste mit zwei Ankern (erstes, letztes Element) in C, die funktioniert hat und seit drei Jahren ohne Probleme irgendeinen Käse zum Dudeln bringt. 🤡
    War auch nur Abpinselei aus einem Büchlein ... Abmalen und zu verstehen versuchen ... 🙂
    Der far- Modifyer ist beim PC einfach zu überlesen, ta3 ist nur irgendein Timer, BuzzPlay() wird zyklisch über 'nen anderen Timer aufgerufen, Du willst ja nicht Dudelwerte ausspucken, sondern Meßwerte aufheben und irgendwann wieder lesen. Nicht ganz das Gleiche, aber ähnlich genug 😉



  • pale dog schrieb:

    Meh schrieb:

    System.NullReferenceException: ...

    kommt das von einer VM (.NET)?
    seit wann geht da C?

    seit immer.


Anmelden zum Antworten