первый пост здесь. Я пытаюсь через функцию инициализировать 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