2009-07-27 2 views
0

При запуске следующего сценария я получаю ошибку сегментации. Выход состоит из «здесь 5a». Но ничего кроме него. Любые предложения о том, что может пойти не так?Нужна помощь в определении ошибки сегрегации, возникающей в цикле?

if(model==1) 
    fptr3=fopen("poisson.pro","r"); 
if(model==2) 
    fptr3=fopen("jtt.pro","r"); 
if(model==3) 
    fptr3=fopen("estimate.pro","r"); 

printf ("here 5a\n"); 
for (i=0;i<20;i++) 
    fscanf(fptr3,"%lf", &freq[i]); 
printf ("here 5ai\n"); 

for (i=0;i<20;i++) 
{ 
    printf ("here 5b\n"); 
    for (j=0;j<20;j++) 
    { 
    printf ("here 5c\n"); 
    fscanf(fptr3,"%lf", &prob[i][j]); 
    if(model==3) 
     prob[i][j]=prob[i][j]/10000.0; 
    } 
} 

UPDATE

double freq[20], prob[20][20]; 
+0

Вы действительно используете 20 или это только для примера? Вы не можете выделять большие массивы в стеке. – Ben

+0

@Ben: Я действительно использую 20. – shubster

ответ

2

Вы уверены, что этот код вызывается, а «модель» - 1, 2 или 3? Если нет, fptr3 не будет установлен, поэтому, если вы попытаетесь что-либо сделать с этим, у вас возникнут проблемы.

Попробуйте вместо ?:

void modeltest (int model) 
{ 
    FILE *fptr3 = NULL; 
    int i = 0; 
    int j = 0; 
    double freq[20], prob[20][20]; 

    if(model==1) fptr3=fopen("poisson.pro","r"); 
    if(model==2) fptr3=fopen("jtt.pro","r"); 
    if(model==3) fptr3=fopen("estimate.pro","r"); 

    printf ("here 5a\n"); 
    if (fptr3 != NULL) { 
     for (i=0;i<20;i++) fscanf(fptr3,"%lf", &freq[i]); 
     printf ("here 5ai\n"); 
     for (i=0;i<20;i++) { 
      printf ("here 5b\n"); 
      for (j=0;j<20;j++) { 
       printf ("here 5c\n"); 
       fscanf(fptr3,"%lf", &prob[i][j]); 
       if(model==3) prob[i][j]=prob[i][j]/10000.0; 
      } 
     } 
    } 
    else { 
     printf ("fptr3 is NULL!\n"); 
    } 
} 

Additonal нотой. Пожалуйста, пожалуйста, подумайте о последовательных стилях браслета! :)

0

Что частота определяется как? Что такое проблема?

Является первым для цикла, предназначенным только для запуска fscanf для freq? Или он должен охватывать весь блок?

EDIT: Обоснование. Если все, что вы видите, равно 5a, то это ошибка в fscanf по частоте. Возможно, вы выделили слишком мало места для freq или использовали неправильный тип.

+0

@Matthew: Я добавил определение freq и prob в коде. – shubster

+0

В свете изменений даниэль, вероятно, находится на правильном пути. Вы абсолютно уверены, что fptr3 действительно? –

2

Это C# ???? wooow не шутит, что вы получаете segfaults ... Знаете ли вы, какие коды возврата для ??? Вам действительно нужно улучшить свой код, прежде чем просить такого рода помощь .... это действительно нечитаемым, и уродливый код ... Начало добавив некоторые проверки ваших указателей файлов

if(1==model) 
{ 
fptr3=fopen("poisson.pro","r"); 
if(null == fptr3) 
{ 
    perror("Fopen failed"); 
} 

...

+1

Он помечен как C, и, глядя на код, я предполагаю, что это не C#;) –

+0

@Matthew: Он * был отмечен как C#, но это, очевидно, C, поэтому я его перезапустил;) – Sean

+0

Прошу прощения, ребята. Помечено это C# по ошибке. – shubster

2

valgrind является суверенным средством защиты от segfaults в C. Он находит ошибки до segfault и точно сообщает, что вы сделали неправильно. Для максимальной выгоды скомпилируйте с включенными отладочными символами.

0
  1. Проверьте код возврата и при необходимости сообщите код ошибки своих файлов с perror() (см. Ответ daniel). Вызов fscanf() с FILE * в NULL, безусловно, сделает segfault.

  2. Как вы указали% lf, частота должна быть массивом не менее 20 удвоений, а не только плавать. См. Man ffrintf().

  3. использовать отладчик вместо printf().

+0

После ваших изменений я предлагаю вам использовать valgrind, как говорит Норман – Ben

1

Я согласен с Даниэлем, вам нужно проверить свои возвращаемые значения и указатели.

Я также согласен с тем, что вам нужно сделать лучшую работу по блокировке и форматированию кода. Предположим, что вы единственный, кто когда-либо читал это, через пару недель даже вы достаточно забыли, что вы не сможете следовать за ним.

к точке Matthews, вы можете попробовать удалить все, начиная с линии:

printf ("here 5ai\n"); 

Конечно, только возиться с этим после проверки указателя файла.

Еще одна сумасшедшая идея будет проходить через нее с помощью отладчика. Я знаю, что трудно использовать отладчик, когда у вас такие отличные параметры отладки, как инструкция printf, но иногда отладчик может быть огромной экономии времени (например, когда вы продолжаете получать segfault). Кроме того, изучение того, как использовать отладчик для платформы, которую вы разрабатываете, является одной из вещей, отделяющих хорошие кодеры от пакета средних хаков.(FYI, вы даже можете попытаться взглянуть на ваше ядро ​​в отладчике и, возможно, увидеть, где именно проблема. (Подсказка: если у вас нет основного файла, попробуйте «man ulimit».))

Если вы настаивая на том, чтобы использовать printf в качестве единственного средства отладки, а затем вызывать флеш сразу после каждого использования.

0

Вы должны опубликовать содержимое начала любого файла, который открывается, так как он сбой в fscanf. Либо файл не существует, либо он искажен при укладке против того, как вы пытаетесь его проанализировать.

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