Pourquoi ce commentaire est faux ?

Pourquoi ce commentaire est faux ? - C - Programmation

Marsh Posté le 03-08-2006 à 18:04:46    

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
Reply

Marsh Posté le 03-08-2006 à 18:04:46   

Reply

Marsh Posté le 03-08-2006 à 18:25:39    

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

Reply

Marsh Posté le 03-08-2006 à 19:21:20    

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/
Reply

Marsh Posté le 03-08-2006 à 20:07:32    

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
Reply

Marsh Posté le 03-08-2006 à 20:15:57    

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

Reply

Marsh Posté le 03-08-2006 à 20:46:09    

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).

Reply

Marsh Posté le 03-08-2006 à 21:35:39    

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
Reply

Marsh Posté le 04-08-2006 à 12:10:20    

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 ))

Reply

Marsh Posté le 04-08-2006 à 14:27:03    

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/
Reply

Marsh Posté le 04-08-2006 à 15:48:45    

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]

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed