Flux rss
Collection CommentCaMarche.net
Rechercher : dans
Par : Mots clés Nom d'utilisateur
Messages sans réponse

Pointeur de structure dans fonction C

solid360, le mercredi 6 décembre 2006 à 22:48:36 
 Signaler ce message aux modérateurs

Salut à tous,

j'ai une fonction InsereDansListe rien de plus normal qui doit commme son nom l'indique inserer un pointeur vers un element dans une liste.

Le probleme c'est que lorsque je passe un pointeur sur une liste vide ou même pleine et que j'alloue un emplacment mémoire pour la stocker, je perd le pointeur quand je sors de la fonction et c'est comme si javai pisser dans un violon.

Pourtant, je pensai qu'en faisant un pointeur cela conserverai mes opérations même à la sortie de la fonction.

Voila la fonction :
int InsereDansListe(Liste *L, Tache *Nouvelle) //insérer une nouvelle tache dans la liste L.
{
Liste* New = (Liste*)malloc(sizeof(struct liste));
if (New == NULL)
return 0;
InitListe(New);

New->t = Nouvelle; //pointeur sur la tâche
if (ListeVide(L)){
L = New;
}
else {
while (L->suivant != NULL){
L = L->suivant;
// Si la tâche est déjà présente dans la liste
if (L->t == Nouvelle){
free(New);
return 0;
}
}
L->suivant = New;
}
return 1;
}

Merci d'avance à ceux qui me répondront

1

mamiemando, le jeudi 7 décembre 2006 à 00:37:02
  • +2

Bon un petit rappel pour commencer.

Rappel sur les fonctions en C

- En C les paramètres de fonction sont des recopies.
- A la fin d'une fonction les variables locales sont effacées.
- Par contre ce qui a pu être alloué dans la fonction n'est pas désalloué si ce n'est pas demandé explicitement.

Rappel sur les pointeurs

Un pointeur sert :
1- à modifier quelque chose qu'on aurait aimé passer en paramètre. Concrètement l'adresse est recopiée, mais pas ce qui est à cette adresse
2- à passer un paramètre plus petit (une adresse est plus rapide à recopier qu'une grosse structure)
3- à ne stocker qu'une fois qu'une donnée si on a besoin dans plusieurs structures.

Les allocations mémoires

En toute rigueur :
- à chaque malloc est associé un free situé dans le même horizon (un horizon est une paire d'accolade)
- parfois ce n'est pas possible donc on crée une sorte de constructeur qui fait l'allocation, et on pense à appeler le destructeur à la fin pour libérer la mémoire.

Les listes chainées

typedef struct maillon{
  struct maillon * suivant;
  int *data; // dans ton cas une tâche
} maillon_t;

typedef maillon_t * liste_t;

int inserer_tache(liste_t * l,int nouveau){
  maillon_t * mcur,mlast;
  for(mcur = l; mcur; mcur = mcur->suivant){
     if( *(mcur->data) == nouveau ) return 0; // deja présent dans la liste
  }
  // liste parcourue, on a rien trouvé ! ajout du nouveau maillon
  mcur->suivant = (maillon_t *)malloc(sizeof(maillon_t));
  mlast = mcur->suivant;
  mlast->suivant = NULL;
  mlast->data = nouveau;
  return 1;
}


Mieux que les listes, les sets

Concrètement ce n'est pas une structure très rapide car l'insertion et l'accès se font en O(n). Une structure de liste triée serait plus rapide, mais idéalement il faudrait une structure d'arbre pour bénéficier d'une dichotomie. Celà suppose que tu aies une relation d'ordre sur les datas. En C++ ca s'écrit présque immédiatement :
#include <set>

// Definition d'une tache
struct tache_t{
  int x;
  tache_t(int x0=0):x(x0){}
};

// La relation d'ordre
bool operator<(
  const tache_t & t1,
  const tache_t & t2
){
  return (t1.x < t2.x);
}

int main(){
  std::set<tache_t> taches; // ensemble des taches
  tache_t t1(1),t2(5),t3(2);
  taches.insert(t1);
  taches.insert(t2);
  taches.insert(t3);
  return 0;
}

Le set permet définit un ensemble ordonné d'élément insérés de manière unique. L'accès et l'insertion se font en O(log(n)) ce qui est nettement plus rapide...

Bonne chance

Répondre à mamiemando

2

Char Snipeur, le jeudi 7 décembre 2006 à 08:54:21

Salut.
En effet, lors de l'appel d'une fonction avec passage par pointeur, l'adresse est RECOPIER.
exemple :
void sqr(double *x){return*x**x;}
int main {double *y=21;*y=sqr(y);...}
ce qui se passe :
Quand tu declare ta variable y, et que tu l'initialise y prend la valeur \0x001. qui pointe vers une mémoire qui contient 21.
Lors de l'appel de la fonction, tu créé une nouvelle variable 'x' qui prend pour valeur : \0x001.
Si au sein de cette fonction tu modifie x en lui changeant sa valeur :
x=\0x003, et que ensuite tu modifie la case pointé par x, tu ne modifie pas la valeur de y, ni sa valeur pointé.
C'est un peu comme si tu fesait la séquance suivante :
double *y=21;// y vaut \0x001
double* x;x=y;
*x=3;//Ok, tu modifie bien la valeur *y
x=new double;// tu modifie le pointeut x qui vaut \0x002
*x=32;// tu modifie *x, mais pas *y car y vaut toujours \0x001

Voilà, j'espère que ça va t'aider et que j'ai été suffisament clair. Salutation !
Char Snipeur

Répondre à Char Snipeur

3

 solid360, le jeudi 7 décembre 2006 à 11:08:31

Ok, j'ai compris mon problème merci d'avoir répondu aussi vite.

Répondre à solid360
Fonction C++ de conversion en héxadécimal (Résolu) Salut tous , peut quelqu'un de vous me dire quelle est la fonction C++ de convertion en héxadécimal ? merci pour toute réponse postée ! www.commentcamarche.net/forum/affich-2050513-fonction-c-de-conversion-en-hexadecimal
Les pointeurs en langage C Définition d'un pointeur Un pointeur est une variable contenant l'adresse d'une autre variable d'un type donné. La notion de pointeur fait souvent peur car il s'agit d'une technique de programmation très puissante, permettant de définir des... www.commentcamarche.net/contents/c/cpoint.php3
Structure en langage c (Résolu) bonjour tout le monde j'ai du mal a comprendre le cour de structures en c j'aimerai bien recevoir un cour bien detalle et pourquoi pas des astuces si cela est possible .merci d'avance www.commentcamarche.net/forum/affich-1891882-structure-en-langage-c
Les files en langage CLes files - Premier Entré Premier Sorti Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la file IV. Opérations sur les files A. Initialisation B. Insertion d'un élément dans la file C. Oter un... www.commentcamarche.net/faq/sujet-8282-les-files-en-langage-c
La compilation et les modules en C et en C++Cet article a pour vocation d'introduire les notions de bases de la compilation en C et en C++ et de la programmation modulaire. Il permet de mieux comprendre les messages d'erreur du compilateur. Les notions abordées ici sont indépendantes du... www.commentcamarche.net/faq/sujet-14440-la-compilation-et-les-modules-en-c-et-en-c
Interfacer du code assembleur et du CInterfacer du code assembleur et du C Introduction Appeler du code assembleur écrit dans un fichier source externe Avec Nasm (x86 uniquement) Compilation/Execution sous Linux Avec Gcc (multiplateforme) Introduction Si, à tout hasard,... www.commentcamarche.net/faq/sujet-8257-interfacer-du-code-assembleur-et-du-c
Pb de tableau de structure en CBonjour à tous, je suis en train d'apprendre le c et j'ai un pb. J'ai déclaré un structure: struct eleve { nom[20] prenom[20] absences[20] } absence un tableau contenant ma strucure : eleve ClasseEntiere[40]; Dans mon programme j'arrive à enregistrer... www.commentcamarche.net/forum/affich-52132-pb-de-tableau-de-structure-en-c
Sur le pointeur null en C et les fichiers .hsalut à tous. je debute en C et des questions me gênent(2 pour l'instant) merci de m'eclairer 1)j'ai lu que NULL est defini comme égale à la constante entière 0 ; la ou le bat blesse c'est que c'est censé ne pointer sur ... rien alors que 0=0000 est... www.commentcamarche.net/forum/affich-720906-sur-le-pointeur-null-en-c-et-les-fichiers-h
Allocation dynamique/structures (lange C)Bonjour, j'aimerais utiliser des structures tout en tirant parti de l'allocation dynamique du C, comme des listes chainées et/ou arbres binaires.Je ne sais pas vraiment comment m'y prendre .Donc mes questions sont les suivantes : -quelles sont les... www.commentcamarche.net/forum/affich-9158771-allocation-dynamique-structures-lange-c
Langage C++ - Les pointeursComme en langage C, le langage C++ permet d'utiliser des pointeurs pour manipuler des données, mais il introduit aussi le concept de référence, très pratique pour permettre la modification d'une donnée passée en paramètre d'une fonction. Définition... www.commentcamarche.net/contents/cpp/cpppoint.php3
Langage C - Les listes chaînéesLa notion de structure autoréferrentielle Une structure autoréferrentielle (parfois appelée structure récursive) correspond à une structure dont au moins un des champs contient un pointeur vers une structure de même type. De cette façon on crée... www.commentcamarche.net/contents/c/cliste.php3
Les structures en langage CDifférence entre une structure et un tableau Un tableau permet de regrouper des éléments de même type, c'est-à-dire codés sur le même nombre de bits et de la même façon. Toutefois, il est généralement utile de pouvoir rassembler des éléments de... www.commentcamarche.net/contents/c/cstruct.php3