2013-03-25 7 views
0

У меня есть следующий код:вина Сегментация по вызову функции с двухмерного массива

#define MAXSAMPLES 1024 
typedef int sample_t; 
typedef sample_t sub_band_t[MAXSAMPLES][MAXSAMPLES]; 

void blah(sample_t a[][MAXSAMPLES], int u0, int v0, int u1, int v1) { 
. . . . 
} 


int main(int argc, char *argv[]) { 
    sub_band_t in_data; 
    int k =0; 

    if (argc < 2) { 
     printf("\nInput filename required\n"); 
     return 0; 
    } 

    FILE *input_file = fopen(argv[1], "r"); 
    char del = '\0'; 

    int i = 0, j = 0; 
    int cols = 0; 
    sample_t x; 
    while (! feof(input_file)) { 
     if (fscanf(input_file, "%d%c", &x, &del) != 2) { 
      i--; 
      break; 
     } 
     in_data[i][j] = x; 
     if (del == '\n') { 
      i++; 
      j =0; 
      continue; 
     } 
     j++; 
     cols = j > cols ? j : cols; 
     x = 0; 
    } 
    blah(in_data, 0, 0, i, cols); 
} 

Когда я запускаю эту программу с входным файлом с 10 * 10 целых чисел, я получаю ошибку сегментации при вызове blah функции в основном. Я не в состоянии подобрать какую-либо информацию о неисправности сегментации с помощью GDB также, он просто говорит:

0x0000000000400928 in blah (a=Cannot access memory at address 0x7ffffdbfe198) at blah.c 

Что я здесь делаю неправильно? Любая помощь будет высоко оценен.

+5

, если причина сбоя связана с функцией blah, поэтому почему вы не поместили ее код? – MOHAMED

+0

Какая строка в 'blah' вызывает крах? Что ты делаешь там? Вы меняете 'a', чтобы указать на что-то еще? –

+0

Авария происходит до инициализации функции, прямо на линии прототипа. Раньше функция была в порядке, но я поменял ее, чтобы взять двухмерный массив в качестве аргумента вместо двойного указателя. Я предполагаю, что проблема только в этом, но не может быть точным. – Dronacharya

ответ

1

Вы typedef subband_t в виде нескольких мегабайтных больших двухмерных массивов. Для этого потребуется несколько МБ памяти стека. Работает ли это вопрос качества реализации. Выполняет ли программа segfault для #define MAXSAMPLES 10? Тогда это твоя проблема.

И заметьте, что

while (! feof(input_file)) { ... } 

никогда не работал и никогда не будет, потому что флаг EOF устанавливается только после операции ввода хит EOF. См. Часто задаваемые вопросы по comp.lang.c.

+0

На самом деле я объявлял больше типов sub_band_t в blah, поэтому проблема нехватки памяти стека была бы проблемой. Большое спасибо. – Dronacharya

1

Вы запутались в определениях типов: Ты:

typedef sample_t sub_band_t[MAXSAMPLES][MAXSAMPLES]; 
  • Edit:

Там пример здесь подобный вопрос: Create a pointer to two-dimensional array

Так это выглядит например, typedef является правильным, это может быть выделение так много памяти в стеке, неужели это все равно ault, когда вы определяете MAXSAMPLES как 10? Также, как он сказал, есть проблема. И как я прокомментировал, ваша функция будет получать 6 параметров, и вы отправляете только 5 ...

+0

Типид, который вы предлагаете, дает ошибку: 'error: ожидаемый идентификатор или '(' before '[' token'. Я взял здесь typedef: http://stackoverflow.com/questions/1052818/create-a- указатель на двумерный массив, – Dronacharya