Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

pointeur sur structure

27 réponses
Avatar
Québec
struct maStructure{
char data;
struct maStructure;
};
typedef maStructure MaStructure;
typedef MaStructure *MaStructure;

versFonction(& MaStructure);

Fonction(* MaStructure)

Et voici la question:

* MaStructure déréférence quoi? Quelle valeur?

data?


Jean Pierre

10 réponses

1 2 3
Avatar
Alexandre Bacquart
Québec wrote:

struct maStructure{
char data;
struct maStructure;
};


Pas conforme. GCC dit :

main.c:3: field `type name' has incomplete type
main.c:4: confused by earlier errors, bailing out

Et on se met facilement à sa place...

--
Tek

Avatar
Pierre Maurette
"Québec" a écrit:

struct maStructure{
char data;
struct maStructure;
};
typedef maStructure MaStructure;
typedef MaStructure *MaStructure;

versFonction(& MaStructure);

Fonction(* MaStructure)

Et voici la question:

* MaStructure déréférence quoi? Quelle valeur?

data?
Bonjour, merci, tout ça ...

Sinon, c'est un gag? La bière? L'herbe qui fait rire?
--
Pierre

Avatar
Québec
Et ça, s'tu t'un gag?
==================== struct listNode { /* self-referential structure */
char data;
struct listNode *nextPtr;
};

typedef struct listNode ListNode;
typedef ListNode *ListNodePtr;

void insert( ListNodePtr *, char );
char delete( ListNodePtr *, char );
int isEmpty( ListNodePtr );
void printList( ListNodePtr );
void instructions( void );

int main()
{
ListNodePtr startPtr = NULL;
int choice;
char item;

instructions(); /* display the menu */
printf( "? " );
scanf( "%d", &choice );

while ( choice != 3 ) {

switch ( choice ) {

case 1:
printf( "Enter a character: " );
scanf( "n%c", &item );
printf( "startPtr before input: %pn", startPtr);
insert( &startPtr, item );
printList( startPtr );
break;
........................
void insert( ListNodePtr *sPtr, char value )
{
ListNodePtr newPtr, previousPtr, currentPtr;

newPtr = malloc( sizeof( ListNode ) );

if ( newPtr != NULL ) { /* is space available */
newPtr->data = value;
newPtr->nextPtr = NULL;

previousPtr = NULL;
currentPtr = *sPtr;
...............................

Ma question demeure,
ListNodePtr *sPtr, déréférence quoi?


Jean
Avatar
Anthony Fleury
Tout d'abord bonjour,

Québec wrote:
Et ça, s'tu t'un gag?
==================== > struct listNode { /* self-referential structure */
char data;
struct listNode *nextPtr;
};


Déjà ceci ne ressemble pas à la première version à laquelle il manquait une
* sur le deuxième membre de la structure.


typedef struct listNode ListNode;
typedef ListNode *ListNodePtr;
[...]



Ma question demeure,
ListNodePtr *sPtr, déréférence quoi?


Et ceci ne ressemble pas non plus à la question de départ qui avait une
écriture bizarre genre mafonction(*ListNodePtr).
D'où la notion de gag soulignée par Pierre Maurette, en plus de souligner
l'absence de toute forme de politesse genre bonjour, merci... :-)

Pour ce qui est de la question, en gros c'est une liste chainée. Une
structure ListNode contient une valeur, représentée par le char data et une
pointeur sur son suivant.
Au dessus de ceci est défini un autre type, ListNodePtr, qui est en fait un
pointeur sur une structure ListNode et ce avec le deuxième typedef.
Un ListNodePtr*, qui est le type de sPtr, est donc un pointeur sur un
pointeur sur une struct ListNode, donc une struct ListNode**.

Je n'ai pas compris à quel point ce code était dérangeant et donc je n'ai
pas vraiment compris la question qui est assez vague, mais pour comprendre
l'intêret de ce struct ListNode**, il faut voir comment on insère dans la
liste chainée. En clair, ce qu'on envoie à la fonction InsertItem() c'est
l'adresse du Pointeur de départ (startPtr) sur une ListNode. Ceci te donne
à tout moment le premier élement de ta liste chainée, qui te permettra de
la parcourir. Là InsertItem recoit un pointeur sur cet élement de départ
pour le modifier. En clair quand tu vas insérer un nouveau noeud dans ta
liste, tu vas créer ce noeud avec malloc() puis tu vas dire le suivant du
noeud que je viens de créer c'est le pointeur de départ que j'ai recu, donc
l'ancien début de ma liste et ensuite je vais changer le début de ma liste
pour qu'il devienne l'élement que j'ai créé avec malloc. En gros tu inclus
ton élement au début de ta liste, car c'est le plus simple.

Ton début de liste étant un pointeur sur une structure ListNode, tu vas
recevoir un pointeur sur pointeur de ListNode pour modifier le début de la
liste.

Donc ListNodePtr* déréférence un pointeur sur une ListNode, donc est un
ListNode**. Cette réponse me parait un peu simple et je ne vosi pas trop où
était le problème, donc je ne suis pas sûr d'avoir répondu à la question,
mais j'espère avoir été clair !

Anthony
--
Alan Turing thought about criteria to settle the question of whether
machines can think, a question of which we now know that it is about as
relevant as the question of whether submarines can swim.
-- Dijkstra

Avatar
Pierre Maurette
"Québec" a écrit:

Et ça, s'tu t'un gag?
==================== >struct listNode { /* self-referential structure */
char data;
struct listNode *nextPtr;
};

typedef struct listNode ListNode;
typedef ListNode *ListNodePtr;
Et vous avez posté ça:


struct maStructure{
char data;
struct maStructure;
};
typedef maStructure MaStructure;
typedef MaStructure *MaStructure;


[...]
Ma question demeure,
ListNodePtr *sPtr, déréférence quoi?
Ma remarque demeure: soyez poli (bonjour, merci, patati, patata ...).


Et évitez de signer du nom d'une province qui n'a pas mérité ça.

--
Pierre

Avatar
Québec
Et évitez de signer du nom d'une province qui n'a pas mérité ça.



Je ne vous apprendrez pas à être Français. Mêlez-vous de vos affaires.


Jean

Avatar
Québec
En général, mes posts comportent un bonjour,

mais pour comprendre
l'intêret de ce struct ListNode**,

Je ne voyais pas ce 'pointeur sur pointeur'

Merci,


Bonsoir
Jean :-)

Avatar
AG
Je ne vous apprendrez pas à être Français. Mêlez-vous de vos affaires.
Et si Pierre n'était pas français.


Avatar
Québec
Et si je n'étais pas québécois?


"AG" a écrit dans le message de
news:414b0de3$0$32726$
Je ne vous apprendrez pas à être Français. Mêlez-vous de vos affaires.
Et si Pierre n'était pas français.




Avatar
Québec
J'oubliais. Et si ce n'était pas du C?

Et où est votre bonjour à vous?

Jean
"Québec" a écrit dans le message de
news:JsE2d.11731$
Et si je n'étais pas québécois?


"AG" a écrit dans le message de
news:414b0de3$0$32726$
Je ne vous apprendrez pas à être Français. Mêlez-vous de vos affaires.
Et si Pierre n'était pas français.








1 2 3