2013-06-11 3 views
-3

Я довольно новичок в программировании с базовыми знаниями в C & C++. Я пытался запустить код в моем .dat-файле, который я использую для анализа изображений.file.exe прекратил работать

В основном этот .dat-файл имеет x & y положения кластеров вместе с их радиусом. С помощью этого кода я пытаюсь разделить мое изображение (размером 200 мм х 300 мм по размеру, после масштабирования пикселей) в сетки размером 5 мм x 5 мм и найти количество точек с радиусом = 1 и количеством точек с радиусом = 100.

Вот мой код:

#include<stdio.h> 
int main() 
{ 
    int i=0,g,h,ng[350][250],ns[350][250],ntot[350][250]; 
    float a[6001],b[6001],c[6001]; 
    FILE *fres1, *fres2; 

    for(g=5;g<=350;g=g+5) 
    { 
     for(h=5;h<=250;h=h+5) 
     { 
      ng[g][h]=0; 
      ns[g][h]=0; 
      ntot[g][h]=0; 
     } 
    } 

    fres1 = fopen("trial_final_1.dat","r+"); 
    fres2 = fopen("result_boxes.dat","w"); 

    if(fres1 == NULL) 
    { 
     printf("Error!! Cannot open file \n"); 
     return 1; 
    } 
    else 
    { 
     printf("File opened successfully, kindly check your folder for result_boxes file :) \n"); 
     fprintf(fres2,"x(mm)  y(mm)  no. of glass beads  no. of stain-less steel balls  total no. of balls \n"); 
     while(!feof(fres1)) 
     { 
      fscanf(fres1,"%f %f %f",&a[i],&b[i],&c[i]);   
      g = ((a[i]/5) + 1)*5; 
      h = ((b[i]/5) + 1)*5; 
      if(c[i] == 100) 
      { 
       ng[g][h] = ng[g][h]+1; 
      } 
      else 
      { 
       ns[g][h] = ns[g][h] + 1; 
      } 
      ntot[g][h] = ntot[g][h] + 1; 
      ++i; 
     } 
     g = 5; 
     h = 5; 
     for(g=5;g<=350;g=g+5) 
     { 
      for(h=5;h<=250; h=h+5) 
      { 
       fprintf(fres2,"%d  %d   %d      %d       %d\n",g,h,ng[g][h],ns[g][h],ntot[g][h]); 

      } 
     } 
    } 

    fclose(fres1); 
    fclose(fres2); 
    return 0;  

} 

Мой вход .dat файл (т.е. 'trial_final_1.dat') содержит данные, как:

150.505951 0.797619 100.000000 
172.327438 5.976130 100.000000 
137.538651 11.089217 100.000000 
151.304276 10.139803 100.000000 
137.008926 13.175000 100.000000 
120.400734 13.943015 1.000000 
136.759262 14.199074 100.000000 

На мой код работает, сначала я получаю выход " Файл открыт успешно, любезно проверьте вашу папку для файла result_boxes :) », но после этого я получаю сообщение о том, что файл.exe перестает работать. Помогите мне устранить эту проблему. Я также пытался использовать while(fscanf(fres1,"%f %f %f",&a[i],&b[i],&c[i])!=EOF) вместо while(!feof(fres1)), но выход в обоих случаях остался прежним.

+0

Запустите его в отладчике, чтобы вы могли видеть, где он сбой. Это означает, что вы, вероятно, использовали какую-то память, которая не принадлежит вам. Как и ваш файл был больше, чем 6001 элементов, которые вы выделили для a/b/c или что-то в этом роде. – xaxxon

+2

Кроме того, имея бессмысленные имена переменных, никто не захочет читать ваш код. Потеряйте некоторые вертикальные пробелы, обрезайте части, которые не требуются для воспроизведения ошибки, дайте значимые имена переменных и обновите свой вопрос. – xaxxon

+0

эй, я буду держать ур внушение в виду, задавая вопрос в следующий раз ..... thnx для времени ура :) – user2470358

ответ

1

Вы не проверяете границы своих массивов. Быстрые обезжиренные ваш код показывает, что вы накат границы ng, ns и ntot с этим контуром:

for(g=5;g<=350;g=g+5) 
{ 
    for(h=5;h<=250; h=h+5) 
    { 
     ... 
    } 
} 

Проблемой выше является то, что вы используете <= вместо <, или что ваших размеров массива являются одним элемент слишком мал.

Вы также не проверяете, является ли fres2 действительным файловым дескриптором до его записи, а также не проверено, что ваши звонки на fscanf преуспели. Например:

fscanf(fres1,"%f %f %f",&a[i],&b[i],&c[i]);   
g = ((a[i]/5) + 1)*5; 
h = ((b[i]/5) + 1)*5; 

Если вышеуказанный вызов не удается, вы можете использовать неинициализированные значения для a[i] или b[i], которые вы потом использовать в качестве индексов массива без ограничивающей-проверки. Это рецепт катастрофы, и это, вероятно, всегда произойдет, потому что ваша петля проверяет EOF перед, которую вы пытаетесь прочитать.

По крайней мере, вы должны сделать это:

if(3 != fscanf(fres1,"%f %f %f",&a[i],&b[i],&c[i])) break; 

И еще одна вещь ... Как вы думаете, что происходит, когда i достигает значения 6001?

+0

Большое вам спасибо за такой быстрый ответ ..... размер массива падал недолго. .... программа работает нормально сейчас .... thnx для ur time :) – user2470358

Смежные вопросы