begin process at 2012 05 29 13:44:22
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

Un pointeur qui disparait !


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Un pointeur qui disparait !

mardi 22 mars 2005 à 17:56:41 | Un pointeur qui disparait !

benjiiim94

Membre Club
Bonjour,

J'ai un gros problème avec un pointeur !
Je devellope une fonction qui recherche un mot dans un texte afin de stocker l'indice de début et de celui-ci. Pour ce stockage j'utilise un pointeur a deux dimensions. Malheuresement, j'ai l'impression que ce pointeur s'efface une fois que je sors de la fonction !
Si vous pouviez regarder mon code s'il vous plait...

Merci beaucoup

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int rechercher(int **selection,char *tab, int cpt_selection, char *mot, int mode,int *cpt)
{

    int cpt2;
    int tai_mot=strlen(mot);

    while (tab[*cpt]!=0)
    {

        cpt2 = 0;

        if (tab[*cpt]==mot[cpt2])
        {

            while ((tab[*cpt]==mot[cpt2])&&(cpt2<=tai_mot))
            {
                (*cpt)++;
                cpt2++;
            }

            if (cpt2==tai_mot) //on a trouvé un mot. On sauvegarde donc l'indice du début et de fin de ce mot dans le tableau de selection
            {


                selection=(int **) realloc(selection , (cpt_selection+1) * sizeof(int *));//on alloue le nombre de ligne nécessaire

                *(selection+cpt_selection)=(int *) malloc(2 * sizeof(int)); //on alloue les deux cases

                selection[cpt_selection][0]=*cpt-tai_mot;
                selection[cpt_selection][1]=*cpt-1;
                cpt_selection++;

            }

        }else
        {
            (*cpt)++;
        }

    }

    printf("\ndebut : %ld\n",selection[0][0]);
    printf("fin : %ld\n",selection[0][1]);

    return cpt_selection;
}


int main()
{
char tab[300]={"C'est un point important ! point point "};
char mot[10]={"point"};
int **selection;
int tai_util=strlen(tab);
int cpt_selection=0, mode=0, cpt=0;

selection=(int **) malloc(1 * sizeof(int *)); //on alloue de l'espace pour le tableau de selection

puts(tab);
printf("\n\n");


    printf("2 : rechercher tout");
    fflush(stdin);
    scanf("%ld",&mode);

    if (mode==2) cpt_selection=rechercher(selection,tab,cpt_selection,mot,mode,&cpt);

    printf("\ncpt selection : %ld\n",cpt_selection);
    printf("debut après : %ld\n",selection[0][0]);
    printf("fin après : %ld\n",selection[0][1]);


system("PAUSE");
return 0;
}
mardi 22 mars 2005 à 19:44:57 | Re : Un pointeur qui disparait !

NitRic

Exemple, tu vas tout comprendre(enfin, ca devrait :})

void func1( int i )
{
    i = 5;
}
int main()
{
  int i = 7;
  func1( i );

  printf("%d\n", i); /* ca va afficher: 7 */

/*
pourquoi? parce seul la valeur
de `i` est envoyée à la fonction func1()
il faudrait plutôt lui envoyer son adresse(celle de `i`)
*/

  return 0;
}


void func2( int * i )
{
  (*i) = 5; /* il faut le déréférencer */
/*
  (*i) == int i; du main()
  ta un accès direct à la variable(via son adresse)
*/
}
int main()
{
  int i = 7;
  func2( &i ); /* on envoi l'adresse de `i` */

  printf("%d\n", i); /* ca va afficher: 5 */

  return 0;
}

avec ton code:

void ta_fonction( int *** selection, ... )
{

  int ** ptr;

  /* code ... */

  ptr = (int **) realloc( (*selection), nouvelle_taille ); /* même chose ici, il faut déréférencer */
  if ( NULL != ptr )
 {
    (*selection) = ptr;
  }
  else
  {
      !!!!ERROR!!!!
   }

  /* code ... */
}
int main()
{

  int ** selection;
  ta_fonction( &selection, ... ); /* on envoi l'adresse de `selection` */

  /* ... */

  return 0;

}

Voilà, j'espère que ce n'est pas trop vague comme explication :}




~(.:: NitRic ::.)~
mardi 22 mars 2005 à 19:54:30 | Re : Un pointeur qui disparait !

NitRic

Au fait:

pointeur = realloc( pointeur, nouvelle_taille );

c'est mauvais ca, très mauvais, si realloc() échoue
tu pers tout. exemple:

  char * string;
  string = malloc( 256 );

  strcpy( string, une_chaine_ici );
  string = realloc( string, 512 );

Si realloc() échoue, string vaut NULL par la suite et donc
la mémoire allouée via malloc() est perdu => fuite de mémoire

donc, un pointeur supplémentaire est, et de loin, préférable.

  char * string;
  char * pointer;

  string = malloc( 256 );

  strcpy( string, une_chaine_ici );
  pointer = realloc( string, 512 );

  if ( NULL != pointer )
    string = pointer;
  else
    puts("ERROR!!!");

Si realloc() échoue, `pointer` vaut NULL mais `string` reste inchangé donc
tu as toujours ton pointeur sur la mémoire allouée

Au fait, pour ce qui est de l'accès aux différents éléments de ton tableau `selection` dans
ta fonction, c'est simple:

void ta_fonction( int *** selection, ... )
{

  /* code, allocation, code, ... */
 (*selection)[x][y] = valeur;

 /* etc ... */

}




~(.:: NitRic ::.)~
mardi 22 mars 2005 à 21:13:20 | Re : Un pointeur qui disparait !

benjiiim94

Membre Club
Oki pour le realloc, je securiserai ca plus tard.

En ce qui concerne le passage du pointeur, si je peus me permettre tu as tort....
En effet, je vai pas t'aprendre que le pointeur est une adresse, donc en metant **selection, ca passe.
Le problème n'est malheuresement pas ici. Je viens juste de m'apercevoir qu'il fonctionne très bien avec le mode pas a pas de Dev C++ ! C'est a ne rien n'y comprendre !

Merci de votre aide
mercredi 23 mars 2005 à 03:34:10 | Re : Un pointeur qui disparait !

NitRic

Fait un test tout bête:

void fonction( int ** tableau )
{
    tableau = (int **) malloc( 5 * sizeof(int *) );
    (*tableau) = malloc( 5 * sizeof(int) );

    (*tableau)[0] = 5;
    (*tableau)[1] = 17;
}
int main()
{
    int ** tableau;

    fonction( tableau );
    printf("%d - %d\n", (*tableau)[0], (*tableau)[1]);

    free( *tableau );
    free( tableau );

    return 0;
}

Si tu as de la chance, ca va afficher du garbage, dans le cas contraire, ca va planter!
Ta fonction doit accepter un `int *** selection` et tu dois lui passer `&selection`

La variable elle-même représente une adresse, pour pouvoir modifier directement `selection`, tu dois donner aux fonctions l'adresse de cette dernière. Le code, version fonctionnel, serait:

void fonction( int *** tableau )
{
    (*tableau) = (int **) malloc( 5 * sizeof(int *) );
    *(*tableau) = malloc( 5 * sizeof(int) );

    *(*tableau)[0] = 5;
    *(*tableau)[1] = 17;

    /*********************************************
     *
         *tableau pointe sur `selection` (dans le main())
         *(*tableau) pointe sur `*selection` ou si tu préfère, sur `selection[0]`
         *(*tableau)[0] pointe sur `(*selection)[0]` ou encore: `selection[0][0]`

         Toi, dans ton code, lorsque tu `tente` de déréférencer `selection`
         tu pointe sur: selection[0][0]

         type func( int ** selection, ... )
         {
            /* code ... */
            *(selection+cpt_selection)=(int *) malloc( ... );
            /* code ... */
         }

         Dans ce code, tu pointe tout simplement sur `selection[0][cpt_selection]`

         Va relire un peu sur les pointeurs, déréférencements, allocations mémoires,
         etc ... etc ...

         Dis toi que les variables que tes fonctions recoivent sont
         locals aux fonctions alors, pour pouvoir modifier une variable
         externe à la fonction(reçu en paramètre), la fonction doit
         connaître l'adresse de la variable à modifier => son adresse !!!
         Alors donne lui l'adresse de la variable à modifier!

         Si ca peu t'aider, regarde ceci:

         int ** selection;
         &selection == adresse de base(de la variable)
         * == pointeur qui pointe sur rien au début
         * == autre pointeur qui pointe aussi sur rien

         en gros, ca donne ceci:
            & => * => adresse de `selection`
            *  => *
            *  => *
         Voilà d'ou provient les trois astérix
     *
     *********************************************/

}
int main()
{
    int ** tableau;

    fonction( &tableau );
    printf("%d - %d\n", (*tableau)[0], (*tableau)[1]);

    free( *tableau );
    free( tableau );

    return 0;
}


Désolé si mes explications ne sont pas parfaites, j'avous ne pas être très doué dans ce domaine.




~(.:: NitRic ::.)~

mercredi 23 mars 2005 à 03:39:05 | Re : Un pointeur qui disparait !

NitRic

En parlant du mode pas-a-pas, c'est normal, comme j'ai dis plus haut, variable => local
alors c'est tout à fait normal que les allocations mémoire/manipulations/etc... n'échoue pas, le contraire ne serait pas normal par contre.



~(.:: NitRic ::.)~
mercredi 23 mars 2005 à 03:46:59 | Re : Un pointeur qui disparait !

NitRic

Dernière petite chose, si dans ta fonction tu voudrais éviter les: *(*(selection))[x] etc ... avoir quelque chose de plus ... `jolie/simple/...!?`, tu peux très bien faire par exemple:

type func( int *** selection, ... )
{

   int ** ptr = NULL;
   int ** sel = (*selection);

   /* ... */
   ptr = (int **) realloc( sel, ... );
   /* ... */
   sel[0] = (int *) malloc( ... );
   /* ... */

   (*selection) = sel; /* à ne pas oublier */
   return value;
}



~(.:: NitRic ::.)~
mercredi 23 mars 2005 à 03:51:13 | Re : Un pointeur qui disparait !

NitRic

Les Pointeurs:
[ Lien ]



~(.:: NitRic ::.)~


Cette discussion est classée dans : int, mot, tab, selection, cpt


Répondre à ce message

Sujets en rapport avec ce message

Problème avec quick sort avec des chaines de caractères [ par bakka72 ] Bonjour,Je dois réalisé un quick sort de chaines et jai u souci .1er. je parcourt kle fichier a trié pour compter le nombre délément 2eme je crée un t exclusion d'un Intervalle dans un tableau ... [ par pirana ] Bonjour à tous , j'aimerais sauté un intervale dans un textevoici mon code je pense que ca sera plus explicite :)data[]={01234567ABCDEFLI01234567ABCDE deplacement avec fleche directionnelle [ par dami13014 ] bonjours tout le monde voila je débute en programmation et j'ai fait un petit sudoku il et pa trés complex mais j'aimerai bien pouvoir me déplacer ave anagrammes récursifs [ par sumakotra ] /* Bonjour a tous ... voila j'voulais faire un programme sortant tout les anagrammes d'un mot en permutant les différentes lettres et en affichant a c Exercice sur Pointeurs, classes, héritage... [ par snoozriton ] Bonjour à tous, étant en train d'étudier le C++, j'ai quelques soucis avec un exercice. C'est un classique dont je vous donne l'énoncé : [b]1. Défini remplir un nombre dans un tableau [ par alex934 ] Bonjour, j'ai besoin de votre aide :) Voila je souhaite mettre un nombre stocké(int) dans un tableau exemple: int a=132; int tab[3]; je voudrais besoin d'aide pour corrigé mon exercice [ par darktn ] Salut Tout le monde , j'ai quelque bug dans ce programme besoin d'aide , Le But De faire une deuxième matrice contient les Caractère qui ce trouve dan un peut d'aide svp. (pointeur?) [ par mana ] int *tab[10]; int *pos; int create(int val){ if (val>=0 && val=0 && val<10) pos=tab[val]; // ligne OK } dans la fo projet d'un debutant (classement) [ par emilienheude ] bonjour à tous, je suis debutant dans la programmation en c et mes enseignents on eu la bonne idée de nous faire travailler sur un projet de sondage.


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,827 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales