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
3840
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
11 juin 2021
121
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
3840
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
11 juin 2021
121
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 !