Pointeurs, adresse de pointeur et acces à la zone pointée [Résolu]

Signaler
Messages postés
43
Date d'inscription
mercredi 24 novembre 2010
Statut
Membre
Dernière intervention
26 février 2014
-
Messages postés
43
Date d'inscription
mercredi 24 novembre 2010
Statut
Membre
Dernière intervention
26 février 2014
-
Bonjour,
j'espere que le titre reflète correctement le sujet dont il sera propos ici ( sinon libre à ceux qui le peuvent de le corriger).
Je passe tout de suite au probleme qui m'amène :
J'ai un pointeur que j'ai déclaré ainsi dans ma fonction main() :
 CONNEX *listeConnex=NULL; 

un peu plus tard, j'ai créé un thread dans lequel je passe l'adresse de listeConnex.
 pthread_create(&thr_control, NULL, &controleDesThreads, &listeConnex);

Ensuite, dans une autre fonction (appelée par le thread créé),
 
int LSupprimerConnex(CONNEX *objet, CONNEX *liste)
{
CONNEX *listeC=NULL;
listeC = liste; //(qui contient l'adresse du pointeur listeConnex de main())

fprintf(stdout, "listeC : 0x%x\n", *listeC); // affiche adresse pointée par listeConnex (main())
fprintf(stdout, "&listeC : 0x%x\n", listeC); // affiche adresse de listeConnex (main)

// jusque là mon programme affiche les adresses et elles correspondent avec
// ce qui est prévu.

// La partie qui pose probleme :
*listeC = (*objet).pNext; // de type CONNEX*
// error: incompatible types when assigning to type 'CONNEX' from type 'struct CONNEX *'
}

j'ai ensuite tenté:
 *listeC = (CONNEX) (*objet).pNext; 
// error : conversion to non-scalar type requested

A ce stade il semble important que j'indique aussi :

typedef struct SConnex CONNEX;
struct SConnex {
data *donnes;
CONNEX *pNext;
CONNEX *pBefore;
};

Je ne parviens pas à voir d'où vient le problème.
J'ai fait un sizeof de listeC et de (*objet).pNext, et ils ont la même taille,
et sont de même type ...
Je bloque !

Merci d'avance à celles et ceux qui pourront m'aider un peu !

4 réponses

Messages postés
3829
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
8 janvier 2021
114
Bonjour.

*listeC = (*objet).pNext;

Ceci me paraît suspicieux. Tu assignes un pointeur dans une valeur pointée.
Pour être compatible, je verrais plutôt:
listeC = objet->pNext;

ou
*listeC = *(objet->pNext); // Avec copie automatique membres à membres


Si tu cherches à affecter l'un des arguments, alors je verrais bien quelquechose comme:
int LSupprimerConnex(CONNEX *objet, CONNEX **liste)
{
// [...]

*liste = objet->pNext;
}

// et tu appelles:
LSupprimerConnex(objet,  &liste);


__________________________________________________________________________________________________
Améliorez votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
Messages postés
3829
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
8 janvier 2021
114
Je n'ai pas très bien saisi ce que tu veux faire, mais pour ce qui est du pointeur, je te fais un exemple fonctionnel:
void advanceNext(CONNEX** list)
{
   *list = (*list)->pNext;
}

int main(void)
{
  CONNEX* next = malloc(1 * sizeof (CONNEX));
  next->pDonnes = NULL;
  next->pNext = NULL;

  CONNEX* list = malloc(1 * sizeof (CONNEX));
  list->pDonnes = NULL;
  list->pNext = next;
  list->pBefore = NULL;

  next->pBefore = list;

  printf("liste : %x", liste);
  printf("next : %x", next);
  advanceNext(&list);
  printf("liste : %x", liste);
  printf("next : %x", next);

  free(list);
  free(next);

  return 0;
}


__________________________________________________________________________________________________
Améliorez votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
Messages postés
43
Date d'inscription
mercredi 24 novembre 2010
Statut
Membre
Dernière intervention
26 février 2014

Merci Cptpingu pour ta réponse.

J'ai fait à ta manière.. ce qui regle les erreurs à la compilation mais
en faisant :
*liste = objet->pNext; 
N'écrase-t-on pas l'adresse de listeConnex (&listeConnex dans le main). Car lorsque je fais
 printf("*liste : %x", *liste); 
ca affiche la meme chose que
 printf("&listeConnex : %x", &listeConnex); // dans le main() 

&listeConnex : 0xbeee8558
*liste : 0xbeee8558


Ce que je voudrais, c'est que listeConnex dans le main() pointe sur le meme objet que objet->pNext;
Messages postés
43
Date d'inscription
mercredi 24 novembre 2010
Statut
Membre
Dernière intervention
26 février 2014

Parfait ! Merci !