#1 Le 15/05/2007, à 19:52
- Sysko le prospecteur
[C] passage par réference dans une fonction ,[ resolu ]
bien le bonsoir
( décidément j'en pose des questions ^^
donc mon problème aujourd'hui
j'ai une fonction qui pour le moment ressemble à ce-ci
int chargementNiveau ( int*** futurTableau )
{
// par lecture dans un fichier on recupere un entier X et un entier Y
// ici on crée avec le pointeur futurTableau un tableau de X lignes et Y colonne d'entier
// et on lui alloue la memoire nécessaire , jusqu'ici aucun problème
}
cependant je veux récupérer les valeurs de X et Y dans le main , le return étant deja utiliser pour gerer les erreurs eventuel ( erreur d'ouverture de fichier, erreur d'allocation memoire , erreur si on est sous windows and so on )
donc j'ai tout naturellement penser transformer ma fonction en
int chargementNiveau ( int*** futurTableau , int* PointeurSurX , int PointeurSurY )
{
// le code est identique sauf que je rajoute :
*PointeurSurX = X
*ointeurSurY = y
}
et la je compile , et bam segmentation fault , core dumped , j'avoue que je ne comprend pas vu que sans cela la fonction fonctionne ( ^^) parfaitement
donc à moins que je soit vraiment une grosse buse ( ce qui n'est pas impossible me direz vous ) , je ne voit pas où j'aurais bien pu faire une erreur
Dernière modification par Sysko le prospecteur (Le 17/05/2007, à 18:16)
Projet tatoeba : projet collaboratif visant à créer un corpus de phrases d'exemples traduites dans le plus de langues possibles
Hors ligne
#2 Le 15/05/2007, à 20:28
- abetsic
Re : [C] passage par réference dans une fonction ,[ resolu ]
Bonjour,
On peut voir comment tu appelles la fonction changementNiveau() dans ton main ?
En particulier, est ce que tu passes bien des adresses pour les champs PointeurSurX et PointeurSurY. Si ces adresses correspondent bien à un int mappé en mémoire...
Hors ligne
#3 Le 15/05/2007, à 20:36
- Sysko le prospecteur
Re : [C] passage par réference dans une fonction ,[ resolu ]
oui bien sur
je fait
un
int valeurX = 0 , valeurY = 0 ;
int** tableauXY
chargement niveau ( &tableauXY , &valeurX , &valeurY );
voila
même quand au lieu de créer dans le main deux entiers , je créé deux pointeurs sur entier , le même problème se passe
en tout cas merci pour avoir répondu aussi vite
Projet tatoeba : projet collaboratif visant à créer un corpus de phrases d'exemples traduites dans le plus de langues possibles
Hors ligne
#4 Le 15/05/2007, à 20:41
- abetsic
Re : [C] passage par réference dans une fonction ,[ resolu ]
L'appel à la fonction me semble correct.
Et à la compilation avec le flag -Wall il n'y pas de warning ?
Es tu sûr que le segfault est dû à l'affectation de X et Y ? Tu peux utiliser des printf dans ton code pour voir jusqu'où le programme s'execute.
Sinon tu peux utiliser gdb pour débugger (une recherche sur google et tu trouveras comment l'utiliser)
Hors ligne
#5 Le 15/05/2007, à 20:50
- Sysko le prospecteur
Re : [C] passage par réference dans une fonction ,[ resolu ]
je compile via un IDE ( codeblock si cela te dit quelquechose ) , visiblement dans les rapport de compilations il ne me marque aucun warning alors que d'habitude quand il y a un problème il me le marque
sinon chose encore plus bizarre j'ai beau mettre un printf n'importe ou ( même au tout debut du main ! ) il ne me marque que segmentation fault et le "press enter to continue "
vous avez dit étrange ? ^^
Projet tatoeba : projet collaboratif visant à créer un corpus de phrases d'exemples traduites dans le plus de langues possibles
Hors ligne
#6 Le 15/05/2007, à 20:58
- abetsic
Re : [C] passage par réference dans une fonction ,[ resolu ]
Tu as bien mis le "\n" à la fin de ta chaine dans ton printf ?
Si tu executes ton programme à partir de codeblock, essaye de l'executer à partir d'un terminal classique, peut être que la console de codeblock ne t'affiche que les messages qui sortent sur stderr.
Hors ligne
#7 Le 17/05/2007, à 12:30
- Sysko le prospecteur
Re : [C] passage par réference dans une fonction ,[ resolu ]
( exact sa marche meiux avec des \n ^^ )
donc codeblocks m'affiche bien mes printf à présent
donc le problème vient de la fonction
int chargementNiveau ( int*** quadrillageNiveau , int* X, int* Y )
{
FILE* fichierNiveau = NULL;
int i = 0, j = 0 ;
int finComptage = 0 ;
int longueur = 0 , nombreDeLigne =0 , tailleLigne = 0;
fichierNiveau = fopen ( "niveau.txt" , "r" ); // on l'ouvre ne lecture seul
if ( fichierNiveau == NULL ) // revnoi une erreur si le fichier ne s'ouvre pas et quitte la fonction
{
printf ( " erreur sur niveau.txt ");
return 1;
}
while (finComptage == 0 )
{
switch ( fgetc ( fichierNiveau )) // on lit fichier caractère par caracère
{
default :
// on ne compte que la taille de la première ligne
longueur++; // les autres lignes étant censé être de même taille)
break;
case '\n' : // on compte le nombre de ligne
nombreDeLigne ++ ;
break;
case EOF : // à EOF on a atteind la fin du fichier donc on peut quitter
finComptage = 1;
break;
}
}
tailleLigne= longueur / nombreDeLigne;
*quadrillageNiveau = malloc ( sizeof(int*) * nombreDeLigne);
**quadrillageNiveau = malloc ( sizeof(int) * longueur );
[quote]le problème vient de cette boucle[/quote]
for ( i = 0 ; i < nombreDeLigne ; i++ )
{
*(*quadrillageNiveau)[i] = **quadrillageNiveau[ tailleLigne*i ];
}
printf ( "%d " , nombreDeLigne );
printf ("%d " , longueur ) ;
rewind ( fichierNiveau);
for ( i = 0 ; i < tailleLigne ; i++) // on remplit le tableau en relisant le fichier
{ // depuis le debut en mettant dans chaque case un chiffre
for ( j = 0 ; j < nombreDeLigne ; j++ )
(*quadrillageNiveau)[j][i] = fgetc ( fichierNiveau ) ;
}
printf ("%c " , (*quadrillageNiveau)[0][0] ) ;
return 0;
}
donc quand je met un printf à l'intérieur de la boucle ( qui avant marchait correctement ) il m'affiche autant de " test " que "nombredeligne " et ensuite il marque le
"core dumped "
je reprécise qu'avant cela marchait sans problème
Projet tatoeba : projet collaboratif visant à créer un corpus de phrases d'exemples traduites dans le plus de langues possibles
Hors ligne
#8 Le 17/05/2007, à 15:16
- abetsic
Re : [C] passage par réference dans une fonction ,[ resolu ]
Quand tu n'avais pas de segfault, as tu vérifié que ton tableau était initialisé comme tu le voulais ?
Il n'est pas rare que des segfaults apparaissent à des endroits où l'on n'a pas fait de modifications. Ca m'est notamment arrivé en supprimant des printf() dans un code. La plupart du temps ce sont des malloc qui n'ont pas été fait correctement.
Ton deuxième malloc est sûrement en cause, ça doit être quelquechose du genre :
*quadrillageNiveau = malloc(nombredeLigne*sizeof(int*));
for (i=0; i<nombreDeLigne; i++)
quadrillageNiveau[i] = malloc(tailleLigne*sizeof(int));
Vérifies aussi que longeur, nombreDeLigne et LongeurLigne correspondent bien à ce que tu souhaites... Si il y a une erreur dans le comptage, ça peut expliquer le segfault.
Hors ligne
#9 Le 17/05/2007, à 17:49
- Geoffrey
Re : [C] passage par réference dans une fonction ,[ resolu ]
oui bien sur
je fait
un
int valeurX = 0 , valeurY = 0 ; int** tableauXY chargement niveau ( &tableauXY , &valeurX , &valeurY );
voila
même quand au lieu de créer dans le main deux entiers , je créé deux pointeurs sur entier , le même problème se passe
en tout cas merci pour avoir répondu aussi vite
pourquoi &tableauXY ? C'est déjà un pointeur
Hors ligne
#10 Le 17/05/2007, à 17:49
- Sysko le prospecteur
Re : [C] passage par réference dans une fonction ,[ resolu ]
impeccable ! cela marche avec ton bout de code
merki beaucoup , bon maintenant y a plus qu'à terminer ce programme
encore merci
et à la prochaine car j'ai pas fini d'avoir des problème lol
bon normalement l'année prochaine j'entre en ecole d'infromatique
donc je devrais aoir moins de problème ;-)
Projet tatoeba : projet collaboratif visant à créer un corpus de phrases d'exemples traduites dans le plus de langues possibles
Hors ligne
#11 Le 17/05/2007, à 18:04
- Sysko le prospecteur
Re : [C] passage par réference dans une fonction ,[ resolu ]
car mon tableauXY servira à faire un tableau à 2 dimension de int du coup pour le créer dans un fonction il faut un int*** voila pourquoi
Projet tatoeba : projet collaboratif visant à créer un corpus de phrases d'exemples traduites dans le plus de langues possibles
Hors ligne
#12 Le 17/05/2007, à 22:28
- Geoffrey
Re : [C] passage par réference dans une fonction ,[ resolu ]
int** ca ne suffit pas ?
Hors ligne
#13 Le 18/05/2007, à 15:57
- Sysko le prospecteur
Re : [C] passage par réference dans une fonction ,[ resolu ]
int ** suffirait si je créais le tableau dans le main , la pas de problème mais comme je modifie le pointeur int** futurTableau dans le fonction chargement niveau ( en lui allouant de la mémoire ) je doit le passez par réference donc rajouter unt *
Projet tatoeba : projet collaboratif visant à créer un corpus de phrases d'exemples traduites dans le plus de langues possibles
Hors ligne
#14 Le 18/05/2007, à 22:41
- Geoffrey
Re : [C] passage par réference dans une fonction ,[ resolu ]
si tu fais un int** tableau
la variable tableau est un pointeur, donc utilisable dans une sous fonction aussi il me semble.
Je crois avoir fait ca l'année dernière en TP
tableau pointe alors vers tableau[0]
Hors ligne
#15 Le 18/05/2007, à 23:00
- abetsic
Re : [C] passage par réference dans une fonction ,[ resolu ]
Oui, mais dans son cas il veut pouvoir affecter tableau dans la fonction appelée et que tableau puisse être utilisée dans la fonction appelante. Il doit donc passer à la fonction, le pointeur vers le pointeur du tableau.
Hors ligne