Je suis surpris. J'ai rajouté les options de compilation -W -Wall
-stdÈ9. Voila ce qu'il me dit:
warning: unused parameter `argc'.
Je suis surpris. J'ai rajouté les options de compilation -W -Wall
-stdÈ9. Voila ce qu'il me dit:
warning: unused parameter `argc'.
Je suis surpris. J'ai rajouté les options de compilation -W -Wall
-stdÈ9. Voila ce qu'il me dit:
warning: unused parameter `argc'.
Oups,#if ( __STDC_VERSION__ < 199901L )
#if !defined(__STDC_VERSION__) || ( __STDC_VERSION__ < 199901L )
Oups,
#if ( __STDC_VERSION__ < 199901L )
#if !defined(__STDC_VERSION__) || ( __STDC_VERSION__ < 199901L )
Oups,#if ( __STDC_VERSION__ < 199901L )
#if !defined(__STDC_VERSION__) || ( __STDC_VERSION__ < 199901L )
Targeur fou wrote:
Merci pour toutes ces astuces. J'avais pensé aussi à les
donner en argument en utilisant "wc -l fichier" mais j'ai un
probleme pour lire ces arguments. A l'interieur du programme
j'ecris:
int nombre_de_lignes;
nombre_de_lignes = argv[3]; // j'ai déja deux autres parametres
qui sont
les deux fichiers.
Ben si comptes mettre un char * dans un entier, c'est normal
tu récupères n'importe quoi.
Ce qui serait normal, c'est que le code ne se compile pas.
Je ne suis pas d'accord avec toi sur ce point, on n'a pas le
typage fort de C++.
On peut même avec certaines implémentations C99 stocker la
valeur d'un pointeur dans un entier de façon sûre avec les
types intptr_t et uintptr_t (stdint.h) via un pointeur de type
void *.
#if !defined( __STDC__)
#error "Pas une implementation ou une compilation conforme ISO C"
#endif
#if ( __STDC_VERSION__ < 199901L )
#error "Pas une implementation ou une compilation supportant la version
ISO C 1999"
#endif
#include <stdio.h>
#include <stdint.h>
int main(void)
{
intptr_t ptrAsInt = 0;
void * p = NULL;
char * src = "hello";
char * dst = NULL;
puts(src);
// Une facon idiote de faire dst = src; pour exemple
p = src; // §6.3.2.3
ptrAsInt = p; // §7.18.1.4
p = ptrAsInt; // §7.18.1.4
dst = p; // §6.3.2.3
puts(dst);
return 0;
}
Par contre, il est bien dit dans §7.18.1.4 de ma n1124 que les
types intptr_t et uintptr_t sont optionnels. Je n'ai trouvé
nulle part le moyen de savoir si ces types étaient présents ou
non dans une implémentation C99 donnée, à part bien sûr se
faire jeter à la compil'.
Targeur fou wrote:
Merci pour toutes ces astuces. J'avais pensé aussi à les
donner en argument en utilisant "wc -l fichier" mais j'ai un
probleme pour lire ces arguments. A l'interieur du programme
j'ecris:
int nombre_de_lignes;
nombre_de_lignes = argv[3]; // j'ai déja deux autres parametres
qui sont
les deux fichiers.
Ben si comptes mettre un char * dans un entier, c'est normal
tu récupères n'importe quoi.
Ce qui serait normal, c'est que le code ne se compile pas.
Je ne suis pas d'accord avec toi sur ce point, on n'a pas le
typage fort de C++.
On peut même avec certaines implémentations C99 stocker la
valeur d'un pointeur dans un entier de façon sûre avec les
types intptr_t et uintptr_t (stdint.h) via un pointeur de type
void *.
#if !defined( __STDC__)
#error "Pas une implementation ou une compilation conforme ISO C"
#endif
#if ( __STDC_VERSION__ < 199901L )
#error "Pas une implementation ou une compilation supportant la version
ISO C 1999"
#endif
#include <stdio.h>
#include <stdint.h>
int main(void)
{
intptr_t ptrAsInt = 0;
void * p = NULL;
char * src = "hello";
char * dst = NULL;
puts(src);
// Une facon idiote de faire dst = src; pour exemple
p = src; // §6.3.2.3
ptrAsInt = p; // §7.18.1.4
p = ptrAsInt; // §7.18.1.4
dst = p; // §6.3.2.3
puts(dst);
return 0;
}
Par contre, il est bien dit dans §7.18.1.4 de ma n1124 que les
types intptr_t et uintptr_t sont optionnels. Je n'ai trouvé
nulle part le moyen de savoir si ces types étaient présents ou
non dans une implémentation C99 donnée, à part bien sûr se
faire jeter à la compil'.
Targeur fou wrote:
Merci pour toutes ces astuces. J'avais pensé aussi à les
donner en argument en utilisant "wc -l fichier" mais j'ai un
probleme pour lire ces arguments. A l'interieur du programme
j'ecris:
int nombre_de_lignes;
nombre_de_lignes = argv[3]; // j'ai déja deux autres parametres
qui sont
les deux fichiers.
Ben si comptes mettre un char * dans un entier, c'est normal
tu récupères n'importe quoi.
Ce qui serait normal, c'est que le code ne se compile pas.
Je ne suis pas d'accord avec toi sur ce point, on n'a pas le
typage fort de C++.
On peut même avec certaines implémentations C99 stocker la
valeur d'un pointeur dans un entier de façon sûre avec les
types intptr_t et uintptr_t (stdint.h) via un pointeur de type
void *.
#if !defined( __STDC__)
#error "Pas une implementation ou une compilation conforme ISO C"
#endif
#if ( __STDC_VERSION__ < 199901L )
#error "Pas une implementation ou une compilation supportant la version
ISO C 1999"
#endif
#include <stdio.h>
#include <stdint.h>
int main(void)
{
intptr_t ptrAsInt = 0;
void * p = NULL;
char * src = "hello";
char * dst = NULL;
puts(src);
// Une facon idiote de faire dst = src; pour exemple
p = src; // §6.3.2.3
ptrAsInt = p; // §7.18.1.4
p = ptrAsInt; // §7.18.1.4
dst = p; // §6.3.2.3
puts(dst);
return 0;
}
Par contre, il est bien dit dans §7.18.1.4 de ma n1124 que les
types intptr_t et uintptr_t sont optionnels. Je n'ai trouvé
nulle part le moyen de savoir si ces types étaient présents ou
non dans une implémentation C99 donnée, à part bien sûr se
faire jeter à la compil'.
Targeur fou wrote:Targeur fou wrote:Merci pour toutes ces astuces. J'avais pensé aussi à les
donner en argument en utilisant "wc -l fichier" mais j'ai un
probleme pour lire ces arguments. A l'interieur du programme
j'ecris:
int nombre_de_lignes;
nombre_de_lignes = argv[3]; // j'ai déja deux autres parametr es
qui sontles deux fichiers.
Ben si comptes mettre un char * dans un entier, c'est normal
tu récupères n'importe quoi.
Ce qui serait normal, c'est que le code ne se compile pas.
Je ne suis pas d'accord avec toi sur ce point, on n'a pas le
typage fort de C++.
Ce n'est pas une question d'un avis personel. C'est la norme C
qui l'interdit. Et même avant la norme... La conversion
implicite d'un int en pointeur n'a jamais fait partie de C --
K&R (ed. 1) dit à peu près la même chose que la norme C. (C-à-d
qu'il faut que la conversion soit explicite, et qu'elle n'est
autorisée qu'avec un type entier assez grand pour contenir un
pointeur -- qui pourrait ne pas exister.)
On peut même avec certaines implémentations C99 stocker la
valeur d'un pointeur dans un entier de façon sûre avec les
types intptr_t et uintptr_t (stdint.h) via un pointeur de type
void *.
Sauf qu'il faut toujours que la conversion soit explicite. Comme
c'était déjà le cas en K&R.
#if !defined( __STDC__)
#error "Pas une implementation ou une compilation conforme ISO C"
#endif
#if ( __STDC_VERSION__ < 199901L )
#error "Pas une implementation ou une compilation supportant la version
ISO C 1999"
#endif
#include <stdio.h>
#include <stdint.h>
int main(void)
{
intptr_t ptrAsInt = 0;
Tu as dû oublier un #ifdef INTPTR_MAX quelque part. En C99,
l'existance d'intptr_t n'est pas garantie, et on est censé la
tester avant de s'en servir.
void * p = NULL;
char * src = "hello";
char * dst = NULL;
puts(src);
// Une facon idiote de faire dst = src; pour exemple
p = src; // §6.3.2.3
Pas de problème ici.ptrAsInt = p; // §7.18.1.4
Il faut une conversion explicite ici. Au moins si tu as un
compilateur C.p = ptrAsInt; // §7.18.1.4
De même.
Voir §6.5.4/3 : "Conversions that involve pointers, other than
where permitted by the constraints of 6.5.16.1, shall be
specified by means of an explicit cast." Ou §14.4 du K&R1 :
«@Certain conversions on pointers are permitted but have
implementation-dependant aspects. They are all specified by
means of an explicit type-conversion operator. » Ça, c'est 1978,
et ça n'a pas changé depuis. (Mais ailleurs, K&R 1 avoue que
certains compileurs anciens l'acceptaient. Il a donc bien existé
en C, mais a été enlevé avant 1978. Alors, si tu as du code
écrit avant 1978, il se peut que tu le vois.)dst = p; // §6.3.2.3
puts(dst);
return 0;
}
Par contre, il est bien dit dans §7.18.1.4 de ma n1124 que les
types intptr_t et uintptr_t sont optionnels. Je n'ai trouvé
nulle part le moyen de savoir si ces types étaient présents ou
non dans une implémentation C99 donnée, à part bien sûr se
faire jeter à la compil'.
Pour un type <t> définit dans §7.18.1, si le type est présent,
<t>_MAX et <t>_MIN (voir §7.18.2) doivent être définis, sinon
non.
Targeur fou wrote:
Targeur fou wrote:
Merci pour toutes ces astuces. J'avais pensé aussi à les
donner en argument en utilisant "wc -l fichier" mais j'ai un
probleme pour lire ces arguments. A l'interieur du programme
j'ecris:
int nombre_de_lignes;
nombre_de_lignes = argv[3]; // j'ai déja deux autres parametr es
qui sont
les deux fichiers.
Ben si comptes mettre un char * dans un entier, c'est normal
tu récupères n'importe quoi.
Ce qui serait normal, c'est que le code ne se compile pas.
Je ne suis pas d'accord avec toi sur ce point, on n'a pas le
typage fort de C++.
Ce n'est pas une question d'un avis personel. C'est la norme C
qui l'interdit. Et même avant la norme... La conversion
implicite d'un int en pointeur n'a jamais fait partie de C --
K&R (ed. 1) dit à peu près la même chose que la norme C. (C-à-d
qu'il faut que la conversion soit explicite, et qu'elle n'est
autorisée qu'avec un type entier assez grand pour contenir un
pointeur -- qui pourrait ne pas exister.)
On peut même avec certaines implémentations C99 stocker la
valeur d'un pointeur dans un entier de façon sûre avec les
types intptr_t et uintptr_t (stdint.h) via un pointeur de type
void *.
Sauf qu'il faut toujours que la conversion soit explicite. Comme
c'était déjà le cas en K&R.
#if !defined( __STDC__)
#error "Pas une implementation ou une compilation conforme ISO C"
#endif
#if ( __STDC_VERSION__ < 199901L )
#error "Pas une implementation ou une compilation supportant la version
ISO C 1999"
#endif
#include <stdio.h>
#include <stdint.h>
int main(void)
{
intptr_t ptrAsInt = 0;
Tu as dû oublier un #ifdef INTPTR_MAX quelque part. En C99,
l'existance d'intptr_t n'est pas garantie, et on est censé la
tester avant de s'en servir.
void * p = NULL;
char * src = "hello";
char * dst = NULL;
puts(src);
// Une facon idiote de faire dst = src; pour exemple
p = src; // §6.3.2.3
Pas de problème ici.
ptrAsInt = p; // §7.18.1.4
Il faut une conversion explicite ici. Au moins si tu as un
compilateur C.
p = ptrAsInt; // §7.18.1.4
De même.
Voir §6.5.4/3 : "Conversions that involve pointers, other than
where permitted by the constraints of 6.5.16.1, shall be
specified by means of an explicit cast." Ou §14.4 du K&R1 :
«@Certain conversions on pointers are permitted but have
implementation-dependant aspects. They are all specified by
means of an explicit type-conversion operator. » Ça, c'est 1978,
et ça n'a pas changé depuis. (Mais ailleurs, K&R 1 avoue que
certains compileurs anciens l'acceptaient. Il a donc bien existé
en C, mais a été enlevé avant 1978. Alors, si tu as du code
écrit avant 1978, il se peut que tu le vois.)
dst = p; // §6.3.2.3
puts(dst);
return 0;
}
Par contre, il est bien dit dans §7.18.1.4 de ma n1124 que les
types intptr_t et uintptr_t sont optionnels. Je n'ai trouvé
nulle part le moyen de savoir si ces types étaient présents ou
non dans une implémentation C99 donnée, à part bien sûr se
faire jeter à la compil'.
Pour un type <t> définit dans §7.18.1, si le type est présent,
<t>_MAX et <t>_MIN (voir §7.18.2) doivent être définis, sinon
non.
Targeur fou wrote:Targeur fou wrote:Merci pour toutes ces astuces. J'avais pensé aussi à les
donner en argument en utilisant "wc -l fichier" mais j'ai un
probleme pour lire ces arguments. A l'interieur du programme
j'ecris:
int nombre_de_lignes;
nombre_de_lignes = argv[3]; // j'ai déja deux autres parametr es
qui sontles deux fichiers.
Ben si comptes mettre un char * dans un entier, c'est normal
tu récupères n'importe quoi.
Ce qui serait normal, c'est que le code ne se compile pas.
Je ne suis pas d'accord avec toi sur ce point, on n'a pas le
typage fort de C++.
Ce n'est pas une question d'un avis personel. C'est la norme C
qui l'interdit. Et même avant la norme... La conversion
implicite d'un int en pointeur n'a jamais fait partie de C --
K&R (ed. 1) dit à peu près la même chose que la norme C. (C-à-d
qu'il faut que la conversion soit explicite, et qu'elle n'est
autorisée qu'avec un type entier assez grand pour contenir un
pointeur -- qui pourrait ne pas exister.)
On peut même avec certaines implémentations C99 stocker la
valeur d'un pointeur dans un entier de façon sûre avec les
types intptr_t et uintptr_t (stdint.h) via un pointeur de type
void *.
Sauf qu'il faut toujours que la conversion soit explicite. Comme
c'était déjà le cas en K&R.
#if !defined( __STDC__)
#error "Pas une implementation ou une compilation conforme ISO C"
#endif
#if ( __STDC_VERSION__ < 199901L )
#error "Pas une implementation ou une compilation supportant la version
ISO C 1999"
#endif
#include <stdio.h>
#include <stdint.h>
int main(void)
{
intptr_t ptrAsInt = 0;
Tu as dû oublier un #ifdef INTPTR_MAX quelque part. En C99,
l'existance d'intptr_t n'est pas garantie, et on est censé la
tester avant de s'en servir.
void * p = NULL;
char * src = "hello";
char * dst = NULL;
puts(src);
// Une facon idiote de faire dst = src; pour exemple
p = src; // §6.3.2.3
Pas de problème ici.ptrAsInt = p; // §7.18.1.4
Il faut une conversion explicite ici. Au moins si tu as un
compilateur C.p = ptrAsInt; // §7.18.1.4
De même.
Voir §6.5.4/3 : "Conversions that involve pointers, other than
where permitted by the constraints of 6.5.16.1, shall be
specified by means of an explicit cast." Ou §14.4 du K&R1 :
«@Certain conversions on pointers are permitted but have
implementation-dependant aspects. They are all specified by
means of an explicit type-conversion operator. » Ça, c'est 1978,
et ça n'a pas changé depuis. (Mais ailleurs, K&R 1 avoue que
certains compileurs anciens l'acceptaient. Il a donc bien existé
en C, mais a été enlevé avant 1978. Alors, si tu as du code
écrit avant 1978, il se peut que tu le vois.)dst = p; // §6.3.2.3
puts(dst);
return 0;
}
Par contre, il est bien dit dans §7.18.1.4 de ma n1124 que les
types intptr_t et uintptr_t sont optionnels. Je n'ai trouvé
nulle part le moyen de savoir si ces types étaient présents ou
non dans une implémentation C99 donnée, à part bien sûr se
faire jeter à la compil'.
Pour un type <t> définit dans §7.18.1, si le type est présent,
<t>_MAX et <t>_MIN (voir §7.18.2) doivent être définis, sinon
non.