2017-04-10 4 views
0

Das Programm scheint in Zeile 54 beim Berechnen von Kreisen [3] [6] abzustürzen. Was könnte das verursachen? Ich habe eine Reihe von Druckanweisungen eingegeben, um einige Informationen zu finden, und alles scheint großartig zu laufen, bis genau [3] [6], was nichts Besonderes zu sein scheint, um darauf zu stürzen.Programmabsturz nach Randomisierung eines Floats

int main() { 

double a, b, circleXMax, circleYMax, circleRMax; 
double rand_float(double a, double b); 
int i, j; 
int circleInfo = 3; 
int circleNum = 50; 
int PI = 3.14; 
double circleArea; 
double circleAreaMax = 0; 
double circles[circleInfo][circleNum]; 

printf("Opened \n"); 

for(i = 1; i <= circleNum; i++) { 
    printf("Start of i = %d \n", i); 
    for(j = 1; j <= circleInfo; j++) { 
     printf("Start of j = %d \n", j); 
     if(j == 1 || j == 2) { 
      printf("Start of randomization of j (%d) \n", j); 
      circles[j][i] = rand_float(100.00, 900.00); 
      printf("circles[%d][%d] = %f \n", j, i, circles[j][i]); 
     } 
     else { 
      printf("Start of randomization of j (%d) \n", j); 
      circles[j][i] = rand_float(0.00, 100.00); 
      printf("circles[%d][%d] = %f \n", j, i, circles[j][i]); 
     } 
    } 
    printf("Start of calculation of circleArea \n"); 
    circleArea = PI * circles[3][i] * circles[3][i]; 
    printf("Completed calculation of circleArea = %f \n", circleArea); 
    if(circleArea >= circleAreaMax) { 
     printf("circle was larger then maximum current \n"); 
     circleAreaMax = circleArea; 
     circleXMax = circles[1][i]; 
     circleYMax = circles[2][i]; 
     circleRMax = circles[3][i]; 
    } else { 
     printf("circle was NOT larger then maximum current \n"); 
    } 
} 

printf("Circle with largest area (%f) has\n", circleAreaMax); 
printf("center (%f, %f) and radius %f", circleXMax, circleYMax, circleRMax); 

    } 

    double rand_float(double a, double b) { 
     printf("doing a randomization via rand_float \n"); 
     return (((double)rand()/RAND_MAX)*(b-a))+a; 
    } 

Es stürzt ab, nachdem sie gesagt:

"Start von j = 3"

"Beginn der Randomisierung von j (3)"

"eine Randomisierung über rand_float tun"

+4

Sie erinnern sich, dass Array-Indizes von "0" beginnen und auf die Größe minus eins gehen? –

+0

@Evan Hast du den vorherigen Kommentar wirklich verstanden? Ich denke nicht. –

Antwort

5

Das Problem, das ich bemerke, ist mit der Schleifengrenze. Beide Fälle

for(i = 1; i <= circleNum; i++) 

und

for(j = 1; j <= circleInfo; j++) 

Ursache off-by-one error.

C-Arrays haben eine Indexierung auf 0-Basis. Bei einem Array wie <type> arr[m][n] wäre die höchstmögliche gültige Indizierung arr[m-1][n-1].

Das heißt, einige andere Kommentare:

  • Sie haben Funktionsdeklaration innerhalb main(), sie in der Datei Rahmen sein müssen für die gesamte Übersetzungseinheit sichtbar sein. Sonst nur main() und nach ihnen definierte Funktionen haben die Deklaration für sie verfügbar.
  • int main() sollte int main(void) sein, damit eine gehostete Umgebung dem Standard entspricht (, es sei denn, Sie verwenden eine spezielle Umgebung, die explizit die frühere als gültige Signatur definiert).
+1

Ich dachte, es könnte bei m und n speichern, aber ich lag falsch, danke! – Evan

+0

@StoryTeller Ich sehe, das war in der Tat nicht meine Absicht. Irgendwelche Vorschläge, wie man die Formulierungen verbessern kann, um irgendwelche Verwirrungen zu beseitigen? Danke im Voraus. :) –