absturz nach entfernen der Testschleife (übergeben von arrays mit zeigern)



  • Hallo,
    habe hier folgendes Problem:
    Ich soll für die Uni einige C-Programme schreiben. Unter anderem eins das arithmetisches und geometrisches Mittel sowie den Median einer Liste berechnet.
    Arithmetisches und Geometrisches Mittel soweit Ok. aber beim Median ist folgendes Problem aufgetreten:

    Habe während des Schreibens zum Testen eine Prüfschleife eingebaut.
    Hatte mich dann schon gefreut das alles ging doch dann:

    solange die Schleife noch drinne ist funktioniert alles einwandfrei aber sobald sie entfernt wird hängt sich das ganze programm auf 😮

    Verstehe nicht wo das Problem ist, da es sich ja wie gesagt nur um eine Prüfschleife handelt.
    Könnte mir höchstens vorstellen das irgendwas mit dem Zeiger falsch gelaufen ist, aber wo weiß ich auch nicht.
    Hier mal der SourceCode:

    danke schon mal für etwaige Hilfe
    LG chan

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    /*
    /avg
    /- calcs the arithmetic mean
    /
    */
    float avg(int *list, int n){
    	int i;	
    	float average = 0.0f;
    
    	for(i=0; i < n; i++){
    		average += list[i];
    	}
    
    	return (float)average/n;
    }
    
    /*
    /geom
    /- calcs the geometric mean
    /
    */
    float geom(int *list, int n){
    
    	float geom = 1.0f;
    	int i;
    	for(i=0; i < n; i++){
    		geom *= (float)list[i];
    	}
    
    	return pow(geom,1.0f/n);
    }
    
    /*
    /median
    /- sorts list
    /- calcs the median
    /
    */
    float median(int *list, int n){
    
    	int i, j, k;
    	int min, minIndex;
    	for(i=0; i<(n-1); i++){
    
    		min = list[i];
    		for(j=(i+1); j<n; j++){
    			if(min > list[j]){
    				min = list[j];
    				minIndex = j;
    			}
    		}
    		list[minIndex]=list[i];
    		list[i] = min;		
    	}
    	/*
    	/ wenn diese schleife entfernt wird stürzt es ab ??
    	*/
    	//////////////////////////////////
    	for(k=0;k < n;k++){
    		printf("%d",list[k]);
    	}
    	//////////////////////////////////	
    
    	if(n%2==0){return (float)(list[(n/2)-1]+list[n/2])/2;}
    	else {return (float)list[n/2];}
    }
    
    /*
    /main
    /
    */
    int main(int argc, char * argv[]){
    
    	int marks[] = {1,2,7,5,3,2,4,9,9,9};
    	int i;			
    
    	printf("\n\n");
    	printf("List: ");
    	for(i=0;i < sizeof(marks)/sizeof(int);i++){
    		printf("%d",marks[i]);
    		if(i<((sizeof(marks)/sizeof(int))-1)){
    			printf(", ");
    		}
    	}	 
    	printf("\n\n");
    	printf("aritmetic mean:  %f\n", avg(marks, sizeof(marks)/sizeof(int)));
    	printf("geometric mean:  %f\n", geom(marks, sizeof(marks)/sizeof(int)));
    	printf("        median:  %f\n", median(marks,sizeof(marks)/sizeof(int)));
    
    return EXIT_SUCCESS;
    }
    


  • Ist denn sichergestellt, dass minIndex in Z.56 immer ein gültiger Index ist?



  • Versteif dich mal nicht zu sehr auf diese Schleife. Die macht nichts, was undefiniertes Verhalten verhindert, dass es mit Schleife nicht abstürzt ist also reiner Zufall.

    Da minIndex in Zeile 56 als Index benutzt wird, aber vorher möglicherweise abhängig von Bedingungen gar nicht gesetzt wird, könnte das das Problem sein.



  • Super das wars 🙂

    Dank euch riesig

    aber komisch, hatte es ja echt gefühlt tausend mal rein und rausgenommen
    und jedes mal das selbe Ergebnis -> mit schleife geht's und ohne nicht
    hatte sogar den rechner neu gestartet 😕

    Hauptsache es geht Dankeschön

    LG chan


Anmelden zum Antworten