Variable ändert selbstständig ihren Wert



  • Guten Morgen,

    Habe mein kleines Programm inzwischen erweitert und bin dabei erneut auf ein Problem gestoßen.

    Während des Erprobens einer neuen Funktion ist das Programm bei einer bestimmten Kombination von Benutzereingaben abgestürzt. Durch mein letztes Problem (http://www.c-plusplus.net/forum/viewtopic-var-p-is-1737932.html) habe ich dazugelernt und kam recht schnell auf den Grund. Ein Zugriff auf eine nicht existierende Zelle einer Matrix. Ich habe mir mit printf an den relevanten Stellen den Wert der Variable ausgeben lassen, die die Matrix-Zelle wählt. Dabei habe ich festgestellt, dass sich der Wert der Variable an einer bestimmten Stelle (eine verschachtelte Schleife) ändert, ohne dass die Variable da überhaupt Anwendung findet.

    Hier würde ich jetzt gern ein Bild einfügen ... da das nicht geht versuche ich es anders. Hier ein Auszug aus der Bildschirmausgabe:

    Parameter 21: '119(0)' '119(0)' '119(0)' '119(1)' '119(1)' '119(1)' '119(2)' '11
    9(2)' '119(2)' '119(3)' '119(3)' '119(3)' '119(4)' '119(4)' '119(4)' '119(5)' '1
    19(5)' '119(5)' '119(6)' '119(6)' '119(6)' '119(7)' '119(7)' '119(7)' 2563
    Creeping 0A03

    Parameter 22: '119(0)' '119(0)' '119(0)' '119(1)' '119(1)' '119(1)' '119(2)' '11
    9(2)' '119(2)' '119(3)' '119(3)' '119(3)' '119(4)' '0(4)' '0(4)' '0(5)' '0(5)' '
    0(5)' '0(6)' '0(6)' '0(6)' '0(7)' '0(7)' '0(7)' 2817
    Wheel Slip

    Parameter 23: '0(0)' '0(0)' '0(0)' '0(1)' '0(1)' '0(1)' '0(2)' '0(2)' '0(2)' '0(
    3)' '0(3)' '0(3)' '0(4)' '0(4)' '0(4)' '0(5)' '0(5)' '0(5)' '0(6)' '0(6)' '0(6)'
    '0(7)' '0(7)' '0(7)' 3072
    Drive Shaft Oscillation Damping

    Die Nummer des Parameters (z.B. 21) ist die äußere Schleife, die Zahl in Klammer (z.B. (2) ) die innere Schleife. Die Zahl vor der Klammer ist der Wert der Variablen. Der sollte durchgehend 119 betragen.

    Bei Parameter 22, Durchlauf 4 ändert sich da aber plötzlich der Wert auf 0.

    (Lasse ich die Schleife seltener durchlaufen tritt der Fehler nicht auf, lasse ich sie häufiger durchlaufen kommt er an der gleichen Stelle. Immer 22/4)

    else if(calcmode[k] == 11) {
    
    			for(i = 0; i < paranum[k]; i++) {
    
                    fseek(FDatei, parad, SEEK_SET);
    	   		printf("Parameter %i: ",i+1);
    
    				for(m = 0; m < 8; m++) {
    
    //printf("'%i(%i)' ", chchoose[0],m);
    
    	                ccpar[i][m] = fgetc(FDatei);
    
    //printf("'%i(%i)' ", chchoose[0],m);
    
    	                union_var.c[m] = ccpar[i][m];
    
    //printf("'%i(%i)' ", chchoose[0],m);
    				}
    
    	   			printf("%g\n",union_var.d);
       				ccparam[k][i] = union_var.d;
    				parad = parad + 8;
    				fseek(FDatei, parad, SEEK_SET);
    
    				for(j = 0; j < 32; j++) {
                        table[k][i][j] = fgetc(FDatei);
    				}
    
    				printf("%s\n", table[k][i]);
       				parad = parad + 32;
       			printf("\n");
       			}
    		}
    

    Die auskommentierten printf sorgen für oben gezeigte Ausgabe. Die Variable chchoose[0] ist die sich verändernde.

    Meine Vermutung (zum Abschluß dieses Marathon-Posts) ist, dass der Speicher der Variablen doppelt belegt ist. Ist das plausibel? Vielleicht durch calloc()? Wie kann ich das überprüfen?

    Grüße,
    Blue][ce



  • Habe jetzt mit...

    printf("'%i(%i)::%p::%p' ", chchoose[0],m, &chchoose[0],&ccpar[i][m]);
    

    ... (etwas unübersichtlich) die Adressen ausgegeben. Und tatsächlich sind sie an der betreffenden Stelle gleich.

    '0(4)::0022FCE0::0022FCE0'

    Das bestätigt zwar meine Vermutung, aber ich habe trotzdem keine Idee was ich tun kann.
    Tipps?

    Greez,
    Blue][ce



  • Vermutlich sind deine Arrays einfach nicht so groß, wie du glaubst. Du greifst über die Arraygrenzen hinaus, und da stehen eben andere Daten.



  • MFK schrieb:

    Vermutlich sind deine Arrays einfach nicht so groß, wie du glaubst. Du greifst über die Arraygrenzen hinaus, und da stehen eben andere Daten.

    Darauf hätte ich auch selber kommen können. Ist natürlich des Rätsels-Lösung.

    Trotzdem Danke!


Anmelden zum Antworten