J'ai une question pour vous!Tableau dynamique 2D non initialisé - argument à fonction C
I ont un programme de C dans lequel i ont un tableau 2D dynamique dans ma fonction principale:
int **neighbours;
qui i initialiser basé sur des arguments de ligne de commande. Le problème est que je veux nettoyer le code un peu. Pour ce faire, je veux créer une fonction dans un fichier d'en-tête qui prend le tableau non initialisé comme argument de référence et l'initialiser là.
Voilà comment j'appelle la fonction:
init(&nodeNum, &neighbours, argv[1], &nodes);
c'est comment je déclare la fonction dans le fichier d'en-tête:
int init(int *nodeNum, int ***neighbours, char *arg, struct node **nodes)
et voici comment essayer d'allouer la mémoire:
neighbours=malloc(*nodeNum*sizeof(int *));
for(i=0;i<*nodeNum;i++){
neighbours[i] = malloc(*nodeNum*sizeof(int *));
}
bien évidemment quelque chose ne va pas bien et il se bloque! des conseils sur ce que je peux faire mal?
grâce à l'aide de gens sympathiques, le malloc fonctionne maintenant, mais le remplissage des nœuds échoue!
est ici tout le code de la fonction:
int init(int *nodeNum, int ***neighbours, char *arg, struct node **nodes){
FILE *file;
char buffer[4];
int i,y,distance;
if(strcmp(arg,"-l")==0){
file = fopen("C:\\Users\\trendkiller\\thesis\\matrix.txt","r");
printf("parsing adjacency matrix from file\n\n");
//file = fopen ("C:\\Users\\trendkiller\\thesis\\matrix.txt", "r") ;
*nodeNum = atoi(fgets(buffer,4,file));
*neighbours=malloc(*nodeNum*sizeof(int *));
for(i=0;i<*nodeNum;i++){
(*neighbours)[i] = malloc(*nodeNum*sizeof(int *));
}
printf("this prints\n");
printf("number of nodes: %s", buffer);
for(i=0;i<*nodeNum;i++){
for(y=0;y<*nodeNum;y++){
fgets(buffer,4,file);
(*neighbours)[i][y]=atoi(buffer);
}
}
}
else{
*nodeNum = atoi(arg);
*neighbours=malloc(*nodeNum*sizeof(int *));
printf("this prints\n");
for(i=0;i<*nodeNum;i++){
(*neighbours)[i] = malloc(*nodeNum*sizeof(int *));
}
*nodes=malloc(*nodeNum*sizeof(struct node));
for(i=0;i<30;i++){
(*nodes)[i].x=rand()%100;
(*nodes)[i].y=rand()%100;
}
printf("this prints\n");
printf("creating new adjacency matrix\n\n");
for(i=0; i<*nodeNum; i++){
for(y=0; y<*nodeNum; y++){
distance=sqrt((((*nodes)[y].x-(*nodes)[i].x)*((*nodes)[y].x-(*nodes)[i].x))+(((*nodes)[y].y-(*nodes)[i].y)*((*nodes)[y].y-(*nodes)[i].y)));
if(i==y){
(*neighbours)[i][y]=-1;
}
else if(distance<=20){
(*neighbours)[i][y]=1;
}
else {
(*neighbours)[i][y]=0;
}
}
}
file = fopen("C:\\Users\\trendkiller\\thesis\\matrix.txt","a+");
fprintf(file,"%d\n",*nodeNum);
for(i=0;i<*nodeNum;i++){
for(y=0;y<*nodeNum;y++){
fprintf(file,"%d\n", (*neighbours)[i][y]);
}
}
}
return 0;
}
Merci d'avance pour votre aide!
Vous avez un pointeur sur pointeur, pas un tableau 2D. Vous pouvez utiliser cela comme une émulation pour cela, mais pourquoi ne pas simplement utiliser des tableaux dynamiques 2D comme ils viennent en C depuis C99. De plus, le but de vos 'arg' et' noeuds 'n'est pas clair. –
Je ne suis pas sûr de ce que vous voulez dire "juste utiliser des tableaux 2D dynamiques" Je pensais que c'est ce que je fais! (juste pas avec succès ..) le paramètre arg est le premier argument de la ligne de commande, qui est un nombre ou une chaîne. si c'est un nombre je crée autant de noeuds dans le "noeud de noeud * de structure" sinon si c'est une chaîne j'analyse une matrice d'adjacence (voisins) d'un fichier qui remplit aussi le tableau "noeud de noeud * noeuds". – tk66