2015-01-05 3 views
0

Для школы (да, школьные проекты) Мне нужно адаптировать одну программу на C ... Мне нужно создать массив со значениями из txt-файла (что, я думаю, было правильно сделанный). Теперь я хотел распечатать значения, и в этом проблема! Я пробовал много способов, но я всегда вижу адрес памяти. Вот код:C - Невозможно напечатать значения динамических массивов

int* init_dados(char *nome,int *m, int *n, int *iter) 
{ 
     FILE *f; 
     int *p, *q; 
     int i, j,k,contador=0,lixo=0,aux=0,flag=0; 

     f=fopen(nome, "r"); 
     if(!f) 
     { 
       printf("Erro no acesso ao ficheiro dos dados\n"); 
       exit(1); 
     } 

     fscanf(f, " %d %d", m,n); 

     p = malloc(sizeof(int)*(*m)*(*n)); 
     if(!p) 
     { 
      printf("Erro na alocacao de memoria\n"); 
      exit(1); 
     } 

     q=p; 

     for (i = 0; i < *m; i++) 
     { 
       for (j = 0; j<*n; j++) 
       { 
         //se ainda nao leu nada 
         if (flag == 0) 
         { 
           for (contador = 0; contador < *n; contador++) 
           { 
             fscanf(f, "%d", &lixo); 
           } 
           flag = 1; 
           break; 
         } 

         if (flag == 1) 
         { 
           fscanf(f, " %d", &k); 
           break; 
         } 

         for (contador = 0; contador < k; contador++) 
         { 
           fscanf(f, " %d", q++); 
         } 
       } 
     } 

     //PRINTING CODE 
     for (i = 0; i < *m; i++) 
     { 
       printf("\n"); 
       for (j = 0; j < *n; j++) 
       { 
         printf("%d ", &q[j]); 
         q++; 
       } 
     } 

     fclose(f); 

     return p; 
    } 

Жду ваших мыслей, спасибо!

EDIT: @iharob Я изменил это:

for (contador = 0; contador < k; contador++) 
      { 
       fscanf(f, " %d", q++); 
      } 

и

for (i = 0; i < *m; i++) 
    { 
     printf("\n"); 
     for (j = 0; j < *n; j++) 
     { 
      printf("%d ", p[j]); 
      p++; 
     } 
    } 

и до сих пор не работает

EDIT2: файл:

10 10 
1 1 1 1 1 1 1 1 1 1 
2 
1 8 
2 
5 6 
4 
1 2 3 4 
1 
1 
4 
1 2 5 8 
2 
6 10 
1 
9 
4 
1 2 3 5 
1 
8 
1 
7 

печать результата до сих пор:

enter image description here

ответ

2

Это неправильно

printf("%d ", &q[i]); 

изменить его p[i] вместо &q[i]

printf("%d ", p[i]); 

, когда вы достигнете printf("%d ", q[i])q пунктов до конца массива, поэтому q[0] == q[lengthOfQ], который прошел q, вы назначили q = p;, чтобы сохранить p, указывая на начало массива, поэтому вы должны использовать p в printf("%d ", q[i]); вместо q.

Я думаю, что этот код должен быть то, что вам нужно

int *init_dados(char *nome,int *m, int *n, int *iter) 
{ 
    FILE *f; 
    int *p, *q; 
    int i, j, k, contador = 0, lixo = 0, flag = 0; 

    f = fopen(nome, "r"); 
    if (f == NULL) 
    { 
     printf("Erro no acesso ao ficheiro dos dados\n"); 
     exit(1); 
    } 
    fscanf(f, " %d %d", m, n); 

    p = malloc(sizeof(int) * *m * *n); 
    if (p == NULL) 
    { 
     fclose(f); 
     printf("Erro na alocacao de memoria\n"); 

     exit(1); 
    } 

    q = p; 
    for (i = 0; i < *m; i++) 
    { 
     for (j = 0 ; j <* n ; j++) 
     { 
      //se ainda nao leu nada 
      if (flag == 0) 
      { 
       for (contador = 0 ; contador < *n ; contador++) 
        fscanf(f, "%d", &lixo); 
       printf("----\n"); 
       flag = 1; 

       break; 
      } 
      else if (flag == 1) 
      { 
       fscanf(f, " %d", &k); 
       flag = 2; 
       break; 
      } 
      else if (flag == 2) 
      { 
       for (contador = 0 ; contador < k ; contador++) 
        fscanf(f, " %d", q++); 
       } 
       flag = 1; 
      } 
     } 
    } 

    //PRINTING CODE 
    for (i = 0; i < *m; i++) 
    { 
     for (j = 0; j < *n; j++) 
      printf("%d ", p[j]); 
     printf("\n"); 
    } 
    fclose(f); 

    return p; 
} 
+0

Спасибо за ответ ... Сначала это было д [у] Я забыл, чтобы изменить его. О том, что вы говорите, я пробовал все это уже, если я это делаю, и q [j] он дает мне значения типа «2519824», если я делаю q [j], дает значения, такие как -842150451 – luidgi27

+0

@ luidgi27 Потому что вы пошли на бейдонские границы с 'q ++ 'измените его на' p'. –

+0

см. Edit please – luidgi27

2

этот код:

for (contador = 0; contador < k; contador++) 
{ 
    fscanf(f, " %d", q++); 
} 

никогда не будет выполняться.

Он находится в блоке кода цикла, где движущая сила является «флагом», а флаг установлен только на 0 и 1, и случай 0, и 1 случай выходят из общего цикла «для».

Вы сбросили результирующий массив «p», чтобы убедиться, что значения верны?

При запуске программы вы заметили, что этот код никогда не выполняется?

+0

Да, тогда я понял, что флаг неправильный, мой плохой! thanks :) – luidgi27

1
this code: 

for (i = 0; i < *m; i++) 
{ 
    printf("\n"); 
    for (j = 0; j < *n; j++) 
    { 
     printf("%d ", p[j]); 
     p++; 
    } 
} 

has the problem that 'p' should not be incremented. 
for two reasons: 
1) need to keep pointer to malloc'd memory 
2) the variable 'j' is indexing off of 'p' so no need to increment 'p' 
+0

Почему у вас есть 3 ответа? –

1
the following code compiles, but does raise a compiler warning about unused paramter 
the code implements the OPs requirements 

#include <stdio.h> 
#include <stdlib.h> 

// the 'iter' parameter is not used, raises compiler warning, 
// suggest adding code to use it or remove that parameter 
int* init_dados(char *nome,int *m, int *n, int *iter) 
{ 
    FILE *f = NULL; 
    int *p = NULL; // ptr to malloc'd memory 
    if(NULL == (p = malloc(1))) 
    { // then, malloc failed 
     perror("malloc failed"); 
     exit(EXIT_FAILURE); 
    } 

    // implied else, malloc successful 

    int *q = p; // steps into malloc'd memory 

    int j; // group loop index 
    int k; // group data size 
    int contador=0; // read loop counter 
    int lixo=0; // read and discard work area 



    if(NULL == (f=fopen(nome, "r"))) 
    { // then, fopen failed 
     perror("fopen failed"); 
     printf("Erro no acesso ao ficheiro dos dados\n"); 
     exit(EXIT_FAILURE); 
    } 

    // implied else, fopen successful 

    if(2 != (fscanf(f, " %d %d", m,n))) 
    { // then, fscanf failed 
     perror("fscanf failed for first line of file"); 
     free(p); 
     exit(EXIT_FAILURE); 
    } 

    // implied else, fscanf for m, n successful 

    //se ainda nao leu nada 
    for (contador = 0; contador < *n; contador++) 
    { 
     if(1 != fscanf(f, " %d", &lixo)) 
     { // then, fscanf failed for throwaway data 
      perror("fscanf failed for throwaway data line"); 
      free(p); 
      exit(EXIT_FAILURE); 
     } 

     // implied else, fscanf successful 
    } // end for 


    // for each data group 
    for (j = 0; j<(*n); j++) 
    { 
     if(1 != fscanf(f, " %d", &k)) 
     { // then, fscanf failed 
      perror("fscanf failed for count of data in group"); 
      free(p); 
      exit(EXIT_FAILURE); 
     } 

     // implied else, fscanf successful 

     // input data from data group, with echo 
     printf("\nGroup Number: %d with data count: %d\n", j, k); 
     for (contador = 0; contador < k; contador++, q++) 
     { 
      if(1 != fscanf(f, " %d", q)) 
      { // then, fscanf failed 
       perror("fscanf failed for data entry in data group"); 
       free(p); 
       exit(EXIT_FAILURE); 
      } 

      // implied else, fscanf successful 

      printf("%3d ", *q); 
     } // end for 
    } // end for 

    fclose(f); 

    return p; 
} // end function: init_dados 
+0

BTW: для каждой группы необходимо сделать запрос на realloc(), чтобы изменить размер области malloc'd, чтобы добавить место для новой группы элементов данных. В противном случае данные будут записаны за конец области malloc'd, что приведет к неопределенному поведению и (возможно) событию сбоя seg. чтобы исправить это, потребуется переменная, чтобы отслеживать текущий размер malloc и временную переменную int *, поэтому можно проверить возвращаемое значение из realloc(), прежде чем совершить изменение переменной p – user3629249

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