Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1030 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Pourquoi ce commentaire est faux ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Pourquoi ce commentaire est faux ?

n°1419108
Gattuso
Posté le 03-08-2006 à 18:04:46  profilanswer
 

Bonjour,
 
est-ce que quelqu'un pourrait m'expliquer pourquoi ce commentaire est faux ?
 

Code :
  1. /*Write 6 integers to a disk file*/
  2. void put_rec(int rec[6], FILE *fp)
  3. {
  4.   int len;
  5.   len = fwrite(rec, sizeof rec, 1, fp);
  6.   if(len != 1) printf("write error" );
  7. }


 
En parametre de la fonction, on a un

Code :
  1. int rec[6]

donc

Code :
  1. sizeof(rec)

est censé donné 6*taille d'un int
la ligne :

Code :
  1. len = fwrite(rec, sizeof(rec), 1, fp);


devrait donc écrire dans fp 1 bloc de 6 entiers.
 
Je ne comprends pas très bien pourquoi le commentaire est faux


Message édité par Gattuso le 03-08-2006 à 18:05:15
mood
Publicité
Posté le 03-08-2006 à 18:04:46  profilanswer
 

n°1419122
skelter
Posté le 03-08-2006 à 18:25:39  profilanswer
 

parceque c'est un piege syntaxique, c'est pourtant préciser dans k&r
 
void put_rec(int rec[6], FILE *fp)
 
est équivalent à
 
void put_rec(int *rec, FILE *fp)
 
on ne peut pas passer de tableau à une fonction en C, on se contente de passer son adresse et dans la fonction on se retrouve avec un pointeur contenant l'adresse d'un tableau du meme type

n°1419155
Emmanuel D​elahaye
C is a sharp tool
Posté le 03-08-2006 à 19:21:20  profilanswer
 

skelter a écrit :

on ne peut pas passer de tableau à une fonction en C, on se contente de passer son adresse et dans la fonction on se retrouve avec un pointeur contenant l'adresse d'un tableau du meme type


on se retrouve avec l'adresse du premier élément du tableau. Cette adresse est du type pointeur sur élément du tableau.[:aloy]


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1419168
Gattuso
Posté le 03-08-2006 à 20:07:32  profilanswer
 

skelter a écrit :

parceque c'est un piege syntaxique, c'est pourtant préciser dans k&r
 
void put_rec(int rec[6], FILE *fp)
 
est équivalent à
 
void put_rec(int *rec, FILE *fp)
 
on ne peut pas passer de tableau à une fonction en C, on se contente de passer son adresse et dans la fonction on se retrouve avec un pointeur contenant l'adresse d'un tableau du meme type


Il fallait donc que je précisé le nombre d'éléments souhaités(dans le cas de l'exo 6) en faisant :
  len = fwrite(rec, 6*sizeof(rec), 1, fp); ?

Message cité 1 fois
Message édité par Gattuso le 03-08-2006 à 20:07:54
n°1419171
skelter
Posté le 03-08-2006 à 20:15:57  profilanswer
 

Emmanuel Delahaye a écrit :

on se retrouve avec l'adresse du premier élément du tableau. Cette adresse est du type pointeur sur élément du tableau.[:aloy]


 
oui, j'entendais par la pointeur de type int <-> tableau de type int  :ange:  mais on dit pointeur sur
 

Citation :


Il fallait donc que je précisé le nombre d'éléments souhaités(dans le cas de l'exo 6) en faisant :
  len = fwrite(rec, 6*sizeof(rec), 1, fp); ?


 
surtout pas ! pas de nombre magique, le nombre d'élément doit etre passé en parametre

n°1419183
oseam
Yume wa kitto kanau
Posté le 03-08-2006 à 20:46:09  profilanswer
 

Gattuso a écrit :

Il fallait donc que je précisé le nombre d'éléments souhaités(dans le cas de l'exo 6) en faisant :
  len = fwrite(rec, 6*sizeof(rec), 1, fp); ?


Comme l'as dit skelter, passe la taille en paramètre.
 
Et ce n'est pas sizeof(rec) mais sizeof(*rec).

n°1419211
el muchach​o
Comfortably Numb
Posté le 03-08-2006 à 21:35:39  profilanswer
 

D'ailleurs les compilos pourraient p-ê mettre un warning quand on déclare un truc comme:  
 
void put_rec(int rec[6], FILE *fp) ;
 
ça ne coûterait rien et ça signalerait une erreur à coup sûr.


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
n°1419585
retrox
Posté le 04-08-2006 à 12:10:20  profilanswer
 

Voire meme interdire cette écriture dans le standard...  
 
(corrolaire : à qui/à quoi sert cette écriture? (à part aux professeurs qui ont le K&R sous le nez pour écrire leurs exos  :o ))

n°1419708
Emmanuel D​elahaye
C is a sharp tool
Posté le 04-08-2006 à 14:27:03  profilanswer
 

retrox a écrit :

Voire meme interdire cette écriture dans le standard...  
 
(corrolaire : à qui/à quoi sert cette écriture? (à part aux professeurs qui ont le K&R sous le nez pour écrire leurs exos  :o ))


Elle a valeur 'documentaire', et est obligatoire quand on utilise plus d'une dimension. En fait l'écriture de base est :  

Code :
  1. void f_1D (T a[X])
  2. void f_2D (T a[Y][X])
  3. void f_3D (T a[Z][Y][X])


etc.
 
Comme le compilateur n'a pas besoin de la dimension la plus à gauche, elle peut se simplifier en :

Code :
  1. void f_1D (T a[])
  2. void f_2D (T a[][X])
  3. void f_3D (T a[][Y][X])


etc.
Comme le paramètre est en réalité un pointeur et non un tableau (malgré les apparences), on peut aussi écrire comme ceci :  

Code :
  1. void f_1D (T *a)
  2. void f_2D (T (*a)[X])
  3. void f_3D (T (*a)[Y][X])


Bienvenue dans le monde magique du langage C.

Code :
  1. enum
  2. {
  3.    X = 2,
  4.    Y = 3,
  5.    Z = 4,
  6. };
  7. static void f_1D (int *a)
  8. {
  9. }
  10. static void f_2D (int (*a)[X])
  11. {
  12. }
  13. static void f_3D (int (*a)[Y][X])
  14. {
  15. }
  16. int main (void)
  17. {
  18.    int a[X];
  19.    int a2[Y][X];
  20.    int a3[Z][Y][X];
  21.    f_1D (a);
  22.    f_2D (a2);
  23.    f_3D (a3);
  24.    return 0;
  25. }


Message édité par Emmanuel Delahaye le 04-08-2006 à 15:55:28

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1419793
retrox
Posté le 04-08-2006 à 15:48:45  profilanswer
 

Merci pour les précisions. M'enfin tout ce bazard pour pas se casser à faire l'adressage soi-meme... Mais bon j'ai compris la nécessité d'avoir les n-1 dimensions "à droite", c'est déjà ça [:volta]


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Pourquoi ce commentaire est faux ?

 

Sujets relatifs
Recherche systeme de post de commentaire sur newsscripts news + commentaire
Résolu [XML JDOM] création de balise commentaire[vba] image dispropotionner dans un commentaire !
Vos commentaire d'entêtePb avec commentaire
commentaire htmlCode VBA permettant de supprimer un faux message d'erreur
RESOLU inscription commentaire selon critèreMise en forme d'un morceau de texte d'un commentaire
Plus de sujets relatifs à : Pourquoi ce commentaire est faux ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR