2017-04-10 1 views
0

Le programme semble se bloquer sur la ligne 54 lors du calcul des cercles [3] [6]. Qu'est-ce qui peut causer cela? Je suis entré dans un tas de déclarations d'impression pour trouver des informations et tout semble aller bien jusqu'à exactement [3] [6], ce qui ne semble pas être quelque chose de spécial pour qu'il se bloque.Le programme plante après randomisation d'un flotteur

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; 
    } 

Il tombe en panne après avoir dit:

"Début de j = 3"

"Début de la randomisation de j (3)"

"faire une randomisation via rand_float"

+4

Vous vous souvenez que les index de tableau commencent à partir de '0' et vont à la taille moins un? –

+0

@Evan Avez-vous réellement compris le commentaire précédent? Je ne le pense pas. –

Répondre

5

Le problème que je remarque est avec la limite de la boucle. Les deux cas

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

et

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

cause de off-by-one error.

Les tableaux ont une indexation 0, donc pour un tableau défini comme <type> arr[m][n], l'indexation valide la plus élevée possible serait arr[m-1][n-1].

Cela dit, d'autres commentaires:

  • Vous avez déclaration de fonction à l'intérieur main(), ils doivent être dans le champ de fichier pour être visible à l'ensemble de l'unité de traduction. Autrement seulement main() et les fonctions définies après eux auront la déclaration à leur disposition.
  • int main() pour un environnement hébergé pour se conformer à la norme (sauf si vous utilisez un environnement spécialisé qui définit explicitement la première comme étant une signature valide).
+1

J'ai pensé qu'il pourrait stocker à m et n, mais je me suis trompé, merci! – Evan

+0

@StoryTeller Je vois, le plus tard n'était pas mon intention, en effet. Des suggestions sur la façon d'améliorer les formulations pour éliminer toute confusion? Merci d'avance. :) –