2014-09-30 3 views
2

Я принимаю во входе из текстового файла, который выглядит примерно так:Печать указателя на матрицу без скобок

3 
2 
4 
1 2 
3 4 
5 6 
7 8 9 10 
11 12 13 14 

С первой строкой представляет собой число строк в матрице А хранится в м, Вторая строка - количество столбцов в матрице A и количество строк в матрице B, хранящихся в n, а третья строка - количество столбцов в матрице B, хранящихся в p.

Я захватывая информации из текстового файла, используя эту функцию:

void read_matrices(int **A, int **B, int **C, int *m, int *n, int *p, char *file) { 
    FILE *fp = fopen(file, "r"); 
    if (!fp) { 
     fprintf(stderr, "\n Error: file open failed for file '%s'\n\n", file); 
     exit(0); 
    } 

    /* read & output m, n, p */ 
    fscanf(fp, "%d\n%d\n%d\n", m, n, p); 

    /* allocate memory for A and set values to null */ 
    *A = (int*)calloc(*m * *n, sizeof(int)); 

    /* read A */ 
    int i, j; 
    for (i = 0; i < *m; i++) { 
     fscanf(fp, "\n"); 
     for (j = 0; j < *n; j++) { 
      fscanf(fp, "%d", (A + i * *n + j)); 
     } 
    } 

    /* allocate memory for B and set values null */ 
    *B = (int*)calloc(*n * *p, sizeof(int)); 

    /* read B */ 
    for (i = 0; i < *n; i++) { 
     fscanf(fp, "\n"); 
     for (j = 0; j < *p; j++) { 
      fscanf(fp, "%d", (B + i * *p + j)); 
     } 
    } 

    /* allocate memory for C and set values null */ 
    *C = (int*)calloc(*m * *p, sizeof(int)); 

    /* close FP & free allocated memory */ 
    fclose(fp); 
} 

Я печать матрицы с помощью функции:

void print_matrix(int *mtx, int r, int c) { 
    int i, j; 
    for (i = 0; i < r; i++) { 
     printf("\n"); 
     for (j = 0; j < c; j++) { 
      printf("%5d", (mtx + i * c + j)); 
     } 
    } 
} 

Когда я распечатать Матрицы я набираюсь неправильные номера. Но когда я пытаюсь распечатать внутри функции чтения, я получаю правильный результат. Я получаю результат:

Matrix A contents: 

    8 12 
    16 20 
    24 28 
Matrix B contents: 

    7 11 15 19 
    23 27 31 35 

Кроме того, при изменении fscanf (Fp, "% D", (A + I * * N + J)); к fscanf (fp, "% d", * (A + i * * n + j)); Я получаю сообщение об ошибке шины, но, как у меня есть, теперь я получаю предупреждение: int format, pointer arg.

ответ

1

Обе цели для записи в ваших чтениях элементов используют неправильные значения указателя.

fscanf(fp, "%d", (A + i * *n + j)); 

должен быть

fscanf(fp, "%d", (*A + i * *n + j)); 
// here ----------^ 

Аналогичная проблема со второй матрицы:

fscanf(fp, "%d", (B + i * *p + j)); 

должен быть

fscanf(fp, "%d", (*B + i * *p + j)); 
// here ----------^ 

Большинство современных компиляторов предупредит вас об этом, и если вы не используете ни джек предупреждений компилятора или получить инструментальную цепочку с мозгами. clang, например, испускает:

main.c:24:30: Format specifies type 'int *' but the argument has type 'int **' 
+0

Это также printf ("% 5d", * (mtx + i * c + j)); также? – user3339703

+0

@ user3339703 да, и его отдельная проблема, но также должна быть исправлена. Меня больше интересовало то, что вы писали с неправильным вычислением указателя. – WhozCraig

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