Structure en langage C
Résolu/Fermé
Hanan
-
17 févr. 2011 à 12:03
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 19 juin 2014 à 20:04
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 19 juin 2014 à 20:04
A voir également:
- Structure en langage C
- Langage ascii - Guide
- Langage binaire - Guide
- Logiciel calcul structure bois gratuit - Télécharger - Architecture & Déco
- Pascal langage - Télécharger - Édition & Programmation
- Structure d'un rapport de stage - Guide
14 réponses
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
17 févr. 2011 à 12:27
17 févr. 2011 à 12:27
attention à bien passer un pointeur ou son équivalent dans la fonction scanf ! ce qui 'nest pas totalement le cas ici.
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
17 févr. 2011 à 12:36
17 févr. 2011 à 12:36
Si tu ne comprends pas, c'est que tu ne sais pas utiliser scanf. Je te recommande donc de te renseigner pour savoir comment l'utiliser correctement. (genre un tutoriel)
Oui t'as raison quand j'utliser "&" le prog ca marche ,mais notre prof nous a dit que dans les structures c pas necessaire de la mettre!!!!
y t-il des cas vraiment ou on px ne pas mettre "&" dans scanf?ou b1 notre prof est LOCO =D
y t-il des cas vraiment ou on px ne pas mettre "&" dans scanf?ou b1 notre prof est LOCO =D
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
17 févr. 2011 à 12:54
17 févr. 2011 à 12:54
ton prof à tord, et la tu ne passe pas une structure, mais une variable d'un structure.
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
17 févr. 2011 à 14:04
17 févr. 2011 à 14:04
à vérifier peut être.
ton prof a peu être raison, mais je ne connais pas le comportement de scanf si tu passes une structure. Et que mettre dans la chaine de caractère ?
Une chose est sure, en C++ il aurait tort. Il me semble qu'une structure est une variable à part entière et non une référence. Il est possible d'accéder au différent membres d'une structure ainsi ;
struct {int a;float b;char c[20]} A;
scanf("%d %f",(int*)(&A),(float*)(sizeof(int)+(char*)&A); // si char* est bien de taille 1.
Les cas où il ne fait pas mettre de &, c'est lorsque tu passes un pointeur. Il faut toujours penser au passage par valeur ou par référence/adresse pour comprendre le pourquoi du comment.
ton prof a peu être raison, mais je ne connais pas le comportement de scanf si tu passes une structure. Et que mettre dans la chaine de caractère ?
Une chose est sure, en C++ il aurait tort. Il me semble qu'une structure est une variable à part entière et non une référence. Il est possible d'accéder au différent membres d'une structure ainsi ;
struct {int a;float b;char c[20]} A;
scanf("%d %f",(int*)(&A),(float*)(sizeof(int)+(char*)&A); // si char* est bien de taille 1.
Les cas où il ne fait pas mettre de &, c'est lorsque tu passes un pointeur. Il faut toujours penser au passage par valeur ou par référence/adresse pour comprendre le pourquoi du comment.
il faut que la definition de structure avant main
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
24 avril 2011 à 00:55
24 avril 2011 à 00:55
Non narjes, ce n'est pas une obligation. Cela marche très bien en laissant la structure comme il l'a mis. Après, l'utilisation, c'est vrai que ce n'est pas courant...
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
26 avril 2011 à 21:06
26 avril 2011 à 21:06
Comme dit précédemment, ce n'est pas une obligation...
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
Modifié par fiddy le 24/04/2011 à 01:31
Modifié par fiddy le 24/04/2011 à 01:31
Bonjour,
Je confirme les propos de Char Snipeur.
Que ce soit une structure ou pas, l'esperluette (&) est obligatoire pour les types natifs (int, char, double, ...).
Par contre, attention Char Snipeur, si on peut accéder aux différents membres, le compilateur se réserve le droit de réorganiser l'ordre des données.
Et l'accès des données comme tu l'as fait ne risque pas de marcher. Il ne faut surtout pas utiliser de sizeof, un simple cast avec un décalage de 1 suffit pour atteindre le champ suivant.
Cdlt,
Je confirme les propos de Char Snipeur.
Que ce soit une structure ou pas, l'esperluette (&) est obligatoire pour les types natifs (int, char, double, ...).
Par contre, attention Char Snipeur, si on peut accéder aux différents membres, le compilateur se réserve le droit de réorganiser l'ordre des données.
Et l'accès des données comme tu l'as fait ne risque pas de marcher. Il ne faut surtout pas utiliser de sizeof, un simple cast avec un décalage de 1 suffit pour atteindre le champ suivant.
Cdlt,
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
25 avril 2011 à 23:15
25 avril 2011 à 23:15
Les réorganisé ?? Jamais entendu parler de ça. Si c'était vraiment le cas, le mix fortran + C ne fonctionnerai pas (COMMON vs. struct), en revanche le compilateur se réserve le droit de les alignés comme il veux. (Ce qui fait que ma "méthode" peut grave merder, mais c'était pour illustré, j'aurai du préciser)
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
Modifié par fiddy le 25/04/2011 à 23:50
Modifié par fiddy le 25/04/2011 à 23:50
Par réorganiser je voulais plutôt dire alignement (je me souvenais plus du nom).
Mais même s'il n'y avait pas d'alignements, ta "méthode" ne pouvait pas marcher.
Pour se décaler, il ne faut pas de sizeof. L'unité de Si tu veux un exemple, n'hésite pas.l'offset n'est pas le byte.
Mais même s'il n'y avait pas d'alignements, ta "méthode" ne pouvait pas marcher.
Pour se décaler, il ne faut pas de sizeof. L'unité de Si tu veux un exemple, n'hésite pas.l'offset n'est pas le byte.
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
26 avril 2011 à 08:33
26 avril 2011 à 08:33
Oui, exact, j'ai écrit n'importe quoi.
scanf("%d %f",(int*)(&A),(float*)(1+(int*)&A);
Là ça doit être bon, si l'alignement est celui de base. Merci de la correction fiddy.
scanf("%d %f",(int*)(&A),(float*)(1+(int*)&A);
Là ça doit être bon, si l'alignement est celui de base. Merci de la correction fiddy.
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
26 avril 2011 à 21:05
26 avril 2011 à 21:05
Yep, c'est mieux maintenant :-). Il manque juste une petite parenthèse, mais le principal est là.