2016-04-05 3 views
1

Как правильно загрузить значения из файла в матрицу в другую функцию?Загрузить значение из файла в значение двумерного указателя массива

void someFunction(int ***matrix, n, m) { 
    int c, d; 
    FILE *fp = fopen("some.txt", "r"); // načtení souboru 
    for (c = 0; c < m; c++) { 
     for (d = 0; d < n; d++) { 
      fscanf(fp, "%i", &matrix[c][d]); //4th read throws error 
     } 
    } 
} 

int main() { 
    int i; 
    int **matrix; 
    int n = 3; // columns 
    int m = 2; // rows 

    first = (int **)malloc(n * sizeof(int*)); 
    for (i = 0; i < n; i++) 
     first[i] = (int *)malloc(m * sizeof(int)); 

    someFunction(&matrix, n, m); 

    free(matrix); 
    for (i = 0; i < n; i++) 
     free(first[i]); 
} 

fscanf(fp, "%i", &matice[c][d]) правый?

Он не работает (ошибка памяти) на [1][0], но [0][0],[0][1],[0][2] работает нормально. Я не уверен, что я сделал неправильно.

+0

Что такое 'matice'? Вы имеете в виду «матрицу»? –

+0

@johnbollinger Да, извините, моя вина, ошибочно. Теперь он пересмотрен. – Lucfia

ответ

2

У вас есть массив указателей, каждый элемент которого указывает на динамически выделенный блок. Это не 2D-массив, хотя вы можете индексировать в общую структуру данных через тот же синтаксис, который вы бы использовали для 2D-массива.

У вас есть по крайней мере две проблемы:

  1. По вашей стратегии распределения, первый индекс вашего массива работает от 0 до n - 1, а индексы в заостренный-массивам бежать от 0 к m - 1. Вы меняете это в своем цикле чтения, тем самым обходя ограничения по крайней мере одного из ваших массивов, если n и m отличаются.

  2. Более того, указатель на хранилище, который вы передаете fscanf(), неверен. В someFunction() переменная matrix имеет тип int ***, и вы передаете адрес вашего int **. Элемент по индексу [c] [] поэтому (*matrix)[c][d], а адрес этого элемента - &(*matrix)[c][d], что совсем не то же самое, что и &matrix[c][d], равно как и то же, что и matrix[c][d].

+0

1. Мое невнимание, спасибо 2. Это именно то, что мне нужно знать! Спасибо! – Lucfia

-1

попробовать этот

void someFunction(int **matrix, int n, int m) { 
    int c, d; 
    FILE *fp = fopen("some.txt", "r"); 
    for (c = 0; c < n; c++) { 
     for (d = 0; d < m; d++) { 
      fscanf(fp, "%i", &matrix[c][d]); 
     } 
    } 
    fclose(fp); 
} 

int main(void) { 
    int i; 
    int **matrix; 
    int n = 3; // rows 
    int m = 2; // columns 

    matrix = (int **)malloc(n * sizeof(int*)); 
    for (i = 0; i < n; i++) 
     matrix[i] = (int *)malloc(m * sizeof(int)); 

    someFunction(matrix, n, m); 

    for (i = 0; i < n; i++) 
     free(matrix[i]); 
    free(matrix); 
} 
+0

У меня было это так, но это ломается на «free (first [1])» :( – Lucfia

+0

@Lucfia В вашем случае, что является плохой причиной для выполнения 'free (matrix);' впереди. – BLUEPIXY

+0

'first' опечатано как 'matrix': D – BLUEPIXY

-1

Оно должно быть:

void someFunction(int **matrix, n, m) 
//     ^^^^ 

У вас было слишком много звезд. В результате вы пытались сканировать указатель вместо сканирования в int, вызывая повреждение памяти.

Звонок будет someFunction(first, n, m);.

Это не ясно, что matrix для в main() - избавиться от него (и, конечно, не free, потому что вы никогда не делали это указать в любом месте).