2012-08-05 4 views
0

이 오류의 의미를 이해하지 못합니다. 프로그램을 실행할 때 사용자가 N을 입력 할 때까지 루프를 반복해야합니다 (더 이상/종료하지 않음). 나는 무슨 일이 일어나고 있는지 이해하지 못합니다. 입력 첫 번째 집합 후에 사용자가 "새 학생을 처리 하시겠습니까?"라는 메시지가 표시되기 전에 프로그램에서 예외가 발생합니다.할당 3.exe의 0x77ea15de에서 처리되지 않은 예외 : 0xC0000005 : 위치 읽기 액세스 위반 0x33772c58

나는

누군가가 도와 드릴까요 2010 년 Geany (이 나에게 그냥 충돌 오류 정의를 제공하지 않습니다), 및 Visual Studio를 사용하여 실행했습니다?

void draw_bar_chart(int student_id[], int percentage[], int size) 
{ 
    FILE *report; 
    int i, j=0, min = 1000000, max = 0, min_pos, max_pos, l; 
    char s[20]; 

    report = fopen("report2.txt", "a"); 
    fprintf(report, "\n******* BAR CHART (YEARLY TOTAL EXPENSES: YEARLY TOTAL INCOME) *******\n\n");  

    for (i = 0; i < size; i++) 
    { 
     fprintf(report, "%d%c", student_id[i], ' '); 
     if (percentage[i] > 0){ 
      l = percentage[i]/10; //the lenght of the bar 
      if ((percentage[i]%10) > 0) 
       l++; 
      for (j = 0; j < l; j++) 
       s[j] = 'x'; 
      s[l+1] = '\0'; 
     } else { 
      s[0] = '!'; 
      s[1] = '\0'; 
     } 

     fprintf(report, "%-20s%6c%d%c\n", s, ' ', percentage[j], '%'); 

     if (percentage[j] >= 0) 
     { 
      if (percentage[j] < min)   
      { 
       min = percentage[j];   
       min_pos = j;     
      } 
      if (percentage[j] > max)  
      { 
       max = percentage[j];   
       max_pos = j;     
      } 
     } 
    } 


    fprintf(report, "***lowest percentage: %d%c (student ID: %d)\n", min, '%', student_id[min_pos]); 
    fprintf(report, "***highest percentage: %d%c (student ID: %d)\n", max, '%', student_id[max_pos]); 

    fclose(report); 

    } 
+3

디버거로 코드를 단계적으로 실행하여 문제를 찾은 다음 여기에 관련 코드를 게시하십시오. – mathematician1975

+0

루프에서 코드가 충돌하여 루프 – mathematician1975

+0

루프의 코드를 게시 할 수 있다고 확신하는 경우 루프가 추가되었지만 문제인지 여부는 확실하지 않습니다. –

답변

2

I는 다음 에러를 볼 수있다 : 그것은 S [1] = '\ 0'가 아니다 [L + 1] = '\ 0'이어야

  1. .
  2. s에 막대를 쓴 후에는 j의 모든 항목을 i로 바꿔야합니다.
  3. min_pos 및 max_pos가 초기화되지 않았을 수 있습니다.

실제 문제는 2 번입니다. 가능한 가장 작은 범위에 변수를 넣는 습관을 들여 이러한 종류의 실수를 피할 수 있습니다. 즉 당신이 쓴 :

 ... 
     fprintf(report, "%d%c", student_id[i], ' '); 

     /* display percentage */ 
     { 
      char s[20]; 

      if (percentage[i] > 0) { 
      int l, j; 

      l = percentage[i]/10; // the length of the bar 
      if ((percentage[i]%10) > 0) 
       l++; 
      for (j = 0; j < l; j++) 
       s[j] = 'x'; 
      s[l] = '\0'; 
      } 
      else { 
      s[0] = '!'; 
      s[1] = '\0'; 
      } 

      fprintf(report, "%-20s%6c%d%c\n", s, ' ', percentage[i], '%'); 
     } 

     /* update min, max */ 
     if (percentage[i] >= 0) { 
     ... 

그런 다음 코드를 따라 더 쉬웠을 것이다 컴파일러 너희에게 준 것이다 오류가 실수로 내가 대신 후/* 업데이 트를 J를 사용했다 ... * /. 백분율 디스플레이 비트를 별도의 함수에 넣는 것이 더 좋습니다.

현재이 형식의 문자열에는 % c가 필요하지 않습니다. 바로 문자를 직접 입력하십시오. % %로 이스케이프 처리 할 수 ​​있습니다.

관련 문제