Pointeurs, adresse de pointeur et acces à la zone pointée

Résolu
StayCrunchy Messages postés 43 Date d'inscription mercredi 24 novembre 2010 Statut Membre Dernière intervention 26 février 2014 - 13 févr. 2014 à 14:11
StayCrunchy Messages postés 43 Date d'inscription mercredi 24 novembre 2010 Statut Membre Dernière intervention 26 février 2014 - 14 févr. 2014 à 03:48
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 !
A voir également:

4 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
Modifié par cptpingu le 13/02/2014 à 14:48
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
1
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
Modifié par cptpingu le 13/02/2014 à 19:52
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
1
StayCrunchy Messages postés 43 Date d'inscription mercredi 24 novembre 2010 Statut Membre Dernière intervention 26 février 2014
Modifié par StayCrunchy le 13/02/2014 à 18:54
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;
0
StayCrunchy Messages postés 43 Date d'inscription mercredi 24 novembre 2010 Statut Membre Dernière intervention 26 février 2014
14 févr. 2014 à 03:48
Parfait ! Merci !
0
Rejoignez-nous