Я не понимаю мою ошибку, пытаясь инициализировать и заполнить динамический c 2D массив, используя данные в файле - PullRequest
0 голосов
/ 07 апреля 2020

первый пост здесь. Я пытаюсь через функцию инициализировать 2D-массив. Прежде чем использовать функцию, я не знаю размеров массива, поэтому думаю, что мне нужно использовать mallo c. Более того, данные, которые я пытаюсь прочитать, располагаются в файле .txt, поэтому я использую функцию fscanf. Вот код, который, безусловно, более понятен.

    typedef struct Level Level;   
    struct Level{
        int height;
        int width;
        int **matrix;
     };

     int main(){
     Level test;
     Level *testPtr=&test;
     getLvl(testPtr);
     int i,j;
     printf("height=%d,width=%d",test.height,test.width); //veryfing I get the right height and width
     for(i=0;i<test.height;i++){
         for(j=0;j<test.width;j++){
             printf("test[%d][%d]=%d\n",i,j,test.matrix[i][j]);//printing the value supposed to be there
          }
      }

     }
     void getLvl(Level *testPtr){
         FILE *doc=NULL;
         doc=fopen("doc.txt","r");  //open my file
         fscanf(doc,"%d",&testPtr->height);    //get the height and width
         fscanf(doc,"%d",&testPtr->width);
         test->matrix=malloc(sizeof(int*)*testPtr->height*testPtr->width);  //initialise the matrix as an array of pointer
         int i,j;
         for(i=0;i<testPtr->height;i++){
             test->matrix[i]=malloc(sizeof(int)*testPtr->width);   //allocate every elements of the array enough memory to store the data of every 
             for(j=0;j<test->width;j++){
                 fscanf(doc,"%d",matrix[i][j]);
              }
         }

     }

Поэтому, когда я пытаюсь выполнить свой код, у меня нет проблем с получением высоты и ширины. Однако получение значений массива приводит к сбою консоли. Из того, что я знаю, это происходит из-за проблемы с памятью, к которой у меня нет доступа. Мой файл do c выглядит примерно так:

10
10
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1    

РЕДАКТИРОВАТЬ: Вот оригинальный код (на французском языке):

typedef struct Niveau Niveau;
struct Niveau{
 int hauteur;
 int largeur;
 int **cases;
 int positionX;
 int positionY;

};
void getLvl(Niveau *test);


int main()
{
    Niveau test;
    Niveau *testPTR=&test;
    getLvl(testPTR);
    printf("hauteur vaut %d\n",test.hauteur);
    printf("largeur vaut %d\n",test.largeur);
    int i,j;
    for(i=0;i<10;i++){
        for(j=0;j<10;j++){
            printf("Valeur de tableau[%d][%d] vaut %d\n",i,j,test.cases[i][j]);
        }
    }
}


void getLvl(Niveau *test){
    char verif;
    FILE* doc=NULL;
    doc=fopen("doc.txt","r");
    fscanf(doc,"%c",&verif);
    int i,j;
    if(verif=='A'){
        fscanf(doc,"%d",&test->hauteur);
        fscanf(doc,"%d",&test->largeur);
    }
    fscanf(doc,"%c",&verif);
    if(verif=='B'){
        test->cases=malloc(sizeof(int*)*test->hauteur*test->largeur);
        for (i=0;i<test->hauteur;i++){
            test->cases[i]=malloc(sizeof(int)*test->largeur);
            for(j=0;j<test->largeur;j++){
                fscanf(doc,"%d",test->cases[i][j]);
            }
        }
    }
}

Основной текстовый файл точно:

A
10
10
B
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
C

1 Ответ

0 голосов
/ 07 апреля 2020

здесь добавьте один пробел fscanf(doc, " %c", &verif); в этом fscanf перед %c, в противном случае вы получите \n в качестве ввода.

и здесь fscanf(doc, "%d", test->cases[i][j]); добавьте & к вашему fscanf как это fscanf(doc, "%d", &test->cases[i][j]);

...