Se connecter avec
S'enregistrer | Connectez-vous

[Résolu]affichage d'un type enrengistrement en {in/out} via printf

Dernière réponse : dans Programmation

Bonjour à tous,
je suis en train de faire un programme où l'on cherche à manipuler des rectangles. Cependant je suis novice en langage C et j'ai quelques problèmes avec l'instruction scanf.
je vous copie le code qui montre comment cela marche:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <assert.h>
  4. #include <math.h>
  5. #include <stdbool.h>
  6.  
  7.  
  8. // DEFINITION DES TYPES
  9.  
  10. typedef float Flottant; // choix du type de précision
  11.  
  12. struct Sommet { // on a besoin de l'abcisse et de l'ordonnée d'un sommet pour le décrire
  13. Flottant abcisse;
  14. Flottant ordonnee;
  15. };
  16. typedef struct Sommet Sommet; // on définit un type Sommet afin d'éviter de taper struct à chaque fois qu'on l'utilise
  17.  
  18. struct Rectangle { // on peut décrire un rectangle totalement en connaissant les coordonnées de deux de ses sommets opposés
  19. Sommet sommet_origine;
  20. Sommet sommet_oppose;
  21. };
  22. typedef struct Rectangle Rectangle; // on définit un type Rectangle afin d'éviter de taper struct à chaque fois qu'on l'utilise
  23.  
  24. struct Longueur_largeur { // longueur et largeur d'un rectangle
  25. Flottant longueur;
  26. Flottant largeur;
  27. };
  28. typedef struct Longueur_largeur Longueur_largeur; // on définit un type Longueur_largeur afin d'éviter de taper struct à chaque fois qu'on l'utilise
  29.  
  30. struct Vecteur { // vecteur de translation d'un rectangle
  31. Flottant abcisse_vecteur;
  32. Flottant ordonnee_vecteur;
  33. };
  34. typedef struct Vecteur Vecteur; // on définit un type Vecteur afin d'éviter de taper struct à chaque fois qu'on l'utilise
  35.  
  36.  
  37. // PROGRAMMES "OUTILS"
  38.  
  39. void differenciation_sommets (Rectangle* rect) { // nom pas terrible pour l'instant
  40. /* Imposer au rectangle que le sommet sommet_origine soit celui en haut à
  41. * gauche et le sommet somet_oppose soit celui en bas à droite
  42. */
  43.  
  44. /* Permuter les sommets sommet_origine et sommet_oppose si le sommet sommet_origine a une ordonnée plus petite que celle du sommet sommet_oppose */
  45. if ((*rect).sommet_origine.ordonnee < (*rect).sommet_oppose.ordonnee) {
  46. Sommet memoire_sommet_oppose; // on stocke en mémoire le sommet sommet_oppose afin d'effectuer une permutation entre sommet_origine et sommet_oppose
  47. memoire_sommet_oppose.abcisse = (*rect).sommet_oppose.abcisse;
  48. memoire_sommet_oppose.ordonnee = (*rect).sommet_oppose.ordonnee;
  49.  
  50. (*rect).sommet_oppose.abcisse = (*rect).sommet_origine.abcisse; // on effectue la permutation
  51. (*rect).sommet_oppose.ordonnee = (*rect).sommet_origine.ordonnee;
  52. (*rect).sommet_origine.abcisse = memoire_sommet_oppose.abcisse;
  53. (*rect).sommet_origine.ordonnee = memoire_sommet_oppose.ordonnee;
  54. printf("ici");
  55. [color=#55ff00]printf("\n %d,%d, , %d, %d\n", &((*rect).sommet_origine.abcisse), &((*rect).sommet_origine.ordonnee), &((*rect).sommet_oppose.abcisse), &((*rect).sommet_oppose.ordonnee));
  56. }; [/color]
  57.  
  58. /* Permuter les abcisses des sommets sommet_origine et sommet_oppose si le sommet sommet_origine a une abcisse plus grande que celle du sommet sommet_oppose */
  59. if ((*rect).sommet_origine.abcisse > (*rect).sommet_oppose.abcisse) {
  60. Flottant memoire_abcisse_sommet_oppose = (*rect).sommet_oppose.abcisse; // on stocke en mémoire l'abcisse du sommet sommet_oppose afin d'effectuer une permutation entre sommet_origine.abcisse et sommet_oppose.abcisse
  61. (*rect).sommet_oppose.abcisse = (*rect).sommet_origine.abcisse; // on effectue la permutation
  62. (*rect).sommet_origine.abcisse = memoire_abcisse_sommet_oppose;
  63. printf("là");
  64. };
  65.  
  66. };
  67.  
  68.  
  69. Rectangle initialisation_rectangle_sommets(const Sommet som_org, const Sommet som_opp) {
  70. /* OP_1: Initialiser un rectangle à partir de deux sommets opposés
  71. */
  72.  
  73. Rectangle rect;
  74. rect.sommet_origine.abcisse = som_org.abcisse; // le rectangle est initialisé à partir de ses sommets opposés
  75. rect.sommet_origine.ordonnee = som_org.ordonnee;
  76. rect.sommet_oppose.abcisse = som_opp.abcisse; // le rectangle est initialisé à partir de ses sommets opposés
  77. rect.sommet_oppose.ordonnee = som_opp.ordonnee;
  78.  
  79. //assert(est_rectangle_valide(rect)); // vérification de la postcondition
  80.  
  81. differenciation_sommets(&rect); // on place les sommets de façon naturelle
  82.  
  83. return rect;
  84. };
  85.  
  86.  
  87. void test_op_1() {
  88. /* Tester l'opération OP_1 */
  89.  
  90. /* On réalise une initialisation avec un rectangle dont les sommets
  91. * sont disposés de façon inhabituelle: le sommet sommet_origine est en bas
  92. * à droite et le sommet sommet_oppose est en haut à gauche.
  93. * Cela permet de tester le sous-programme differenciation_sommets qui se
  94. * trouve dans le programme initialisation_rectangle_sommets.
  95. * On initialise un rectangle R1d, qu'on teste ensuite.
  96. */
  97. Sommet sommet_origine_R1d;
  98. sommet_origine_R1d.abcisse = -5;
  99. sommet_origine_R1d.ordonnee = 10;
  100. Sommet sommet_oppose_R1d;
  101. sommet_oppose_R1d.abcisse = 4;
  102. sommet_oppose_R1d.ordonnee = -3;
  103. Rectangle R1d;
  104. R1d = initialisation_rectangle_sommets(sommet_origine_R1d, sommet_oppose_R1d);
  105. [color=#55ff00] //assert((R1d.sommet_origine.abcisse == 4) && (R1d.sommet_origine.ordonnee == -3) && (R1d.sommet_oppose.abcisse == -5) && (R1d.sommet_oppose.ordonnee == 10)); // on teste les coordonnées disposées de façon naturelle[/color]
  106. printf("Le rectangle R1d a été initialisé avec succès.\n");
  107. };
  108.  
  109. int main()
  110. {
  111. /* On teste les différentes opérations */
  112. test_op_1();
  113.  
  114. return EXIT_SUCCESS;
  115. }


Ici j'ai deux problèmes: le programme ne fonctionne pas comme je le souhaite donc j'ai mis l'assert en couleur en commentaires pour l'instant; cependant ce problème je dois le résoudre tout seul et j'ai besoin des traces que peut me laisser le printf qui me pose problème.
Quand je compile avec l'option -Wall j'obtiens

  1. rectangle.c: Dans la fonction « differenciation_sommets »:
  2. rectangle.c:61: attention : format int, arg pointeur (arg 2)
  3. rectangle.c:61: attention : format int, arg pointeur (arg 3)
  4. rectangle.c:61: attention : format int, arg pointeur (arg 4)
  5. rectangle.c:61: attention : format int, arg pointeur (arg 5)


Et lorsque je tape rectangle l'affichage du printf ne marche pas.
pourriez-vous m'aider svp?
Lassé par la pub ? Créez un compte
Expert Programmation

Tu ne veux pas écrire
rect->sommet_oppose.abcisse
plutot que
(*rect).sommet_oppose.abcisse


Pourquoi diable, ligne 55, mets-tu des & devant tes valeurs entières, ça les transforme en adresse, d'où les warnings. Révise la fonction printf, elle n'a rien à voir avec scanf.

A propos de scanf, tu en parles au début, on ne la voit pas dans ton code.
Expert Programmation

Tu peux nous remettre le code de differenciation_sommets et nous dire à quelle ligne de ce code correspont la ligne 61 originelle.

Ne t'embête pas à mettre des couleurs, ça ne marche pas, mais tu me laisse la balise CODE (ou CPP) :) 
Lassé par la pub ? Créez un compte