Langage C
Bastien
-
Baztien -
Baztien -
Bonjour à tous!
Voila mon problème:
je cherche à récupérer, depuis un fichier, des données (entiers) que je veux placer dans une structure "voisinage"; le système fonctionne suivant une chaine de "voisinage", chaque "voisinage" comportant un pointeur de "voisinage" indiquant le "voisinage" suivant... (voir programme ci-après).
Voici la tête de mon fichier de données (appelé dans mon programme "Fvsng.txt" pour "famille de voisinage"):
1
1 0 0 1 1 0 0 0 0
1 1 1 1 1 1 1 1 1
Le premier entier sera affecté au champ "ordre" de la structure "voisinage". Puis, chaque ligne correspond au tableau d'entier v de la structure "voisinage".
Par exemple ici, j'aurai un ordre de 1 pour le 1° voisinage, la première ligne correspond au champ v du 1° voisinage, puis pointeur sur NULL; je rattache le tout à un 2° voisinage, ordre égal à 1, la deuxième ligne affectée au champ v du 2° voisinage, puis pointeur sur le 1° voisinage.
Voici mon programme:
#include <stdio.h>
#include <stdlib.h>
typedef struct voisinage {
int ordre;
int *v;
struct voisinage *suiv;
}voisinage;
voisinage vois;
int CreerFVoisinage(char *nom,voisinage *vsng)
{ int o,i;
voisinage *p;
FILE *f;
vsng=(voisinage *) malloc(sizeof(voisinage));
vsng=NULL;
/* Ouverture du fichier */
f = fopen (nom, "r");
if (f == NULL)
{
printf ("ERREUR fopen(%s)\n", nom);
return -1;
}
fscanf(f,"%d",&o);
while (!feof(f))
{
p=(voisinage *) malloc(sizeof(voisinage));
p->v=(int *) malloc(sizeof(int)*(2*o+1)*(2*o+1));
p->ordre=o;
for(i=0;i<(2*o+1)*(2*o+1);i++)
fscanf(f,"%d ",&(p->v[i]));
p->suiv=vsng;
vsng=p;
}
fclose(f);
return 0;
}
void afficheVoisinage(voisinage *vsng)
{
int i;
voisinage *p;
p=vsng;
while (p!=NULL)
{ printf("--------------------\n");
for(i=0;i<(2*p->ordre+1)*(2*p->ordre+1);i++)
printf("%d\n",p->v[i]);
p=p->suiv;
}
}
int main(int argc,char **argv)
{
CreerFVoisinage("Fvsng.txt",&vois);
afficheVoisinage(&vois);
return 0;
}
Ce qui est curieux, c'est que si je demande entre le fclose(f); et le return 0; de la fonction CreerFVoisinage la visualisation des données de ma chaine de "voisinage", tout semble avoir été affecté correctement, alors qu'à l'extérieur (dans le main avec la fonction afficheVoisinage) rien ne semble avoir été "mémorisé"...
Voila,
j'espère avoir été clair :-)
J'ajouterai que la compilation ne retourne aucune erreur ni aucun "warning" :-)
Je remercie d'avance tout ceux qui pourront m'aider sur ce petit problème de langage C, en tout cas tout ceux qui auront pris le temps de lire ce sujet jusqu'à la fin.
Cordialement,
Bastien.
Voila mon problème:
je cherche à récupérer, depuis un fichier, des données (entiers) que je veux placer dans une structure "voisinage"; le système fonctionne suivant une chaine de "voisinage", chaque "voisinage" comportant un pointeur de "voisinage" indiquant le "voisinage" suivant... (voir programme ci-après).
Voici la tête de mon fichier de données (appelé dans mon programme "Fvsng.txt" pour "famille de voisinage"):
1
1 0 0 1 1 0 0 0 0
1 1 1 1 1 1 1 1 1
Le premier entier sera affecté au champ "ordre" de la structure "voisinage". Puis, chaque ligne correspond au tableau d'entier v de la structure "voisinage".
Par exemple ici, j'aurai un ordre de 1 pour le 1° voisinage, la première ligne correspond au champ v du 1° voisinage, puis pointeur sur NULL; je rattache le tout à un 2° voisinage, ordre égal à 1, la deuxième ligne affectée au champ v du 2° voisinage, puis pointeur sur le 1° voisinage.
Voici mon programme:
#include <stdio.h>
#include <stdlib.h>
typedef struct voisinage {
int ordre;
int *v;
struct voisinage *suiv;
}voisinage;
voisinage vois;
int CreerFVoisinage(char *nom,voisinage *vsng)
{ int o,i;
voisinage *p;
FILE *f;
vsng=(voisinage *) malloc(sizeof(voisinage));
vsng=NULL;
/* Ouverture du fichier */
f = fopen (nom, "r");
if (f == NULL)
{
printf ("ERREUR fopen(%s)\n", nom);
return -1;
}
fscanf(f,"%d",&o);
while (!feof(f))
{
p=(voisinage *) malloc(sizeof(voisinage));
p->v=(int *) malloc(sizeof(int)*(2*o+1)*(2*o+1));
p->ordre=o;
for(i=0;i<(2*o+1)*(2*o+1);i++)
fscanf(f,"%d ",&(p->v[i]));
p->suiv=vsng;
vsng=p;
}
fclose(f);
return 0;
}
void afficheVoisinage(voisinage *vsng)
{
int i;
voisinage *p;
p=vsng;
while (p!=NULL)
{ printf("--------------------\n");
for(i=0;i<(2*p->ordre+1)*(2*p->ordre+1);i++)
printf("%d\n",p->v[i]);
p=p->suiv;
}
}
int main(int argc,char **argv)
{
CreerFVoisinage("Fvsng.txt",&vois);
afficheVoisinage(&vois);
return 0;
}
Ce qui est curieux, c'est que si je demande entre le fclose(f); et le return 0; de la fonction CreerFVoisinage la visualisation des données de ma chaine de "voisinage", tout semble avoir été affecté correctement, alors qu'à l'extérieur (dans le main avec la fonction afficheVoisinage) rien ne semble avoir été "mémorisé"...
Voila,
j'espère avoir été clair :-)
J'ajouterai que la compilation ne retourne aucune erreur ni aucun "warning" :-)
Je remercie d'avance tout ceux qui pourront m'aider sur ce petit problème de langage C, en tout cas tout ceux qui auront pris le temps de lire ce sujet jusqu'à la fin.
Cordialement,
Bastien.
A voir également:
- Langage C
- Langage ascii - Guide
- Langage binaire - Guide
- Langage visual basic - Télécharger - Langages
- Pascal langage - Télécharger - Édition & Programmation
- Langage basic gratuit - Télécharger - Édition & Programmation
1 réponse
Tu sembles te mélanger dans tes pointeurs !
Déjà aux lignes.
vsng=(voisinage *) malloc(sizeof(voisinage));
vsng=NULL;
Je ne comprends pas ce que tu fais ! Ton malloc va réserver une zone mémoire et renvoyer l'adresse pointant vers cette zone, adresse que tu perds immédiatement en mettant vsng à la valeur NULL.
Tu peux supprimer la première de ces deux lignes déjà :-)
En fait le problème est que tu envoit l'adresse de ta variagle globale vois à la fonction creerFNVoisinage, adresse qui est rangée dans le pointeur vsng de type voisinage*. Oui, mais si tu modifie vsng dans le corps de creerFNVoisinage ça ne va pas modifier vois !
Le plus simple serait de modifier l'en-tête de ta fonction en :
voisinage * CreerFVoisinage(char *nom)
Que ta globale vois, soit un pointeur vers un voisinage plutot qu'un voisinage.
Puis de modifier ton main comme ceci :
vois = CreerFVoisinage("Fvsng.txt");
afficheVoisinage(vois);
A partir de là, ça devrait marcher !
En fait ta confusion vient du fait d'une - il me semble - mauvaise compréhension du passages de variables par addresse :
void bidule(int * pint)
{
....
}
void main()
{
int foo = 3;
bidule(&foo);
....
}
Passer &foo à la fonction bidule permet que la valeur de foo soit modifié dans main, après l'appel de la fonction... à la condition que tu agisse sur *pint dans la fonction bidule ! Si tu modifie pint lui-même, ça ne marche plus, ça ne va pas modifier magiquement l'adresse de la variable foo !
Cordialement,
Bastien (aussi)
Déjà aux lignes.
vsng=(voisinage *) malloc(sizeof(voisinage));
vsng=NULL;
Je ne comprends pas ce que tu fais ! Ton malloc va réserver une zone mémoire et renvoyer l'adresse pointant vers cette zone, adresse que tu perds immédiatement en mettant vsng à la valeur NULL.
Tu peux supprimer la première de ces deux lignes déjà :-)
En fait le problème est que tu envoit l'adresse de ta variagle globale vois à la fonction creerFNVoisinage, adresse qui est rangée dans le pointeur vsng de type voisinage*. Oui, mais si tu modifie vsng dans le corps de creerFNVoisinage ça ne va pas modifier vois !
Le plus simple serait de modifier l'en-tête de ta fonction en :
voisinage * CreerFVoisinage(char *nom)
Que ta globale vois, soit un pointeur vers un voisinage plutot qu'un voisinage.
Puis de modifier ton main comme ceci :
vois = CreerFVoisinage("Fvsng.txt");
afficheVoisinage(vois);
A partir de là, ça devrait marcher !
En fait ta confusion vient du fait d'une - il me semble - mauvaise compréhension du passages de variables par addresse :
void bidule(int * pint)
{
....
}
void main()
{
int foo = 3;
bidule(&foo);
....
}
Passer &foo à la fonction bidule permet que la valeur de foo soit modifié dans main, après l'appel de la fonction... à la condition que tu agisse sur *pint dans la fonction bidule ! Si tu modifie pint lui-même, ça ne marche plus, ça ne va pas modifier magiquement l'adresse de la variable foo !
Cordialement,
Bastien (aussi)