Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 ]

Sysko le prospecteur a écrit :

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