Probleme de compilateur... mais qui faut-il croire .....
34 réponses
Irsla
Voila j'ai un code qui semble correct seulement voila
Visual c++ 6.0 ( oui je sais c'est du C et non du cpp mais bon il devrait le
comprendre vu que le fichier est un .c) le compile sans erreur mais provoque
une erreur a l'execution ("la memoire ne peut etre written")
Dev_c++ 4 (en projet C et non C++) me le compile parfaitement et je n'ai
aucun pb a l'execution
et enfin
gcc sur un Freebsd avec juste un -o ( desole je ne suis pas un grand
habituer des unix\linux ) me sort un seg fault...
donc qui croire ...
je vous colle ci contre le code :
char *my_strcpy(char *dest,const char *src)
{
int i;
i = 0;
while (src[i])
{
//bien evidement c la que VC++ me dis que ca foire ....
dest[i] = src[i];
i++;
}
dest[i+1]='\0';
return (dest);
}
int my_printf(char *toprint)
{
int j=0;
for (j=0;toprint[j];j++)
{
}
_write(1,toprint,j);
return 0;
}
int main(void)
{
char *tmp;
char *sortie;
int j=0;
tmp = "HELLO WORLD !";
//c'est ici que je copie ce que contient tmp dans sortie
sortie = my_strcpy(sortie,tmp);
//puis j'impirme sortie ;)
my_printf(sortie);
return 0;
}
voila j'avoue que je ne sais qui croire en esperant que c'est un pb de
compilateur est pas de code ( ni des 2 a la fois ;) )
Merci d'avance
--
Irsla
--------------------------------------------------------------------
Une visite fait toujours plaisir, si ce n'est a l'arrivée c'est au départ ;)
--------------------------------------------------------------------
Voila j'ai un code qui semble correct seulement voila
Visual c++ 6.0 ( oui je sais c'est du C et non du cpp mais bon il devrait le comprendre vu que le fichier est un .c) le compile sans erreur mais provoque une erreur a l'execution ("la memoire ne peut etre written")
Du mélange français/anglais dans le texte? Etonnant...
Dev_c++ 4 (en projet C et non C++) me le compile parfaitement et je n'ai aucun pb a l'execution
et enfin
gcc sur un Freebsd avec juste un -o ( desole je ne suis pas un grand habituer des unixlinux ) me sort un seg fault... donc qui croire ...
Typique d'un "Undefined Behaviour" (UB)
je vous colle ci contre le code :
char *my_strcpy(char *dest,const char *src) { int i; i = 0; while (src[i]) { //bien evidement c la que VC++ me dis que ca foire .... dest[i] = src[i]; i++; } dest[i+1]=' '; return (dest); }
int my_printf(char *toprint) { int j=0; for (j=0;toprint[j];j++) { } _write(1,toprint,j); return 0; }
int main(void) {
char *tmp; char *sortie; int j=0; tmp = "HELLO WORLD !";
//c'est ici que je copie ce que contient tmp dans sortie sortie = my_strcpy(sortie,tmp);
Voilà ton UB. Tu devrais avoir un warning du genre 'utilisation d'une variable non initialisée'.
main.c: In function `my_printf': main.c:21: warning: implicit declaration of function `_write'
main.c: In function `main': main.c:31: warning: unused variable `j'
main.c:30: warning: `sortie' might be used uninitialized in this function
'sortie' est un pointeur sur char /non initialisé/. Tu passes donc un contenu indeterminé (rappel, les passages de paramètres se font par toujours par valeur en C). La fonction ecrit bêtement à l'adresse indique (n'importe quoi), et c'est le UB.
Un jour ça fait semblant de fonctionner, l'autre jour ça fait exploser une fusée... Fait pas faire ça. Il faut initialiser le pointeur avec une adresse correcte (adresse ou nom d'un tableau, retour de malloc(), contenu d'un pointeur correctement initialisé).
voila j'avoue que je ne sais qui croire en esperant que c'est un pb de compilateur est pas de code ( ni des 2 a la fois ;) )
Ce n'est pas du tout un problème de compilateur, mais de codage. Je te conseille de relire ton livre de C. (Et je ne te parles pas de la fonction inconnue '_write'...)
-- -ed- [remove YOURBRA before answering me] The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html <blank line> FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/
In 'fr.comp.lang.c', "Irsla" <whowen99~~no-spam@hotmail.com> wrote:
Voila j'ai un code qui semble correct seulement voila
Visual c++ 6.0 ( oui je sais c'est du C et non du cpp mais bon il
devrait le comprendre vu que le fichier est un .c) le compile sans
erreur mais provoque une erreur a l'execution ("la memoire ne peut etre
written")
Du mélange français/anglais dans le texte? Etonnant...
Dev_c++ 4 (en projet C et non C++) me le compile parfaitement et je n'ai
aucun pb a l'execution
et enfin
gcc sur un Freebsd avec juste un -o ( desole je ne suis pas un grand
habituer des unixlinux ) me sort un seg fault...
donc qui croire ...
Typique d'un "Undefined Behaviour" (UB)
je vous colle ci contre le code :
char *my_strcpy(char *dest,const char *src)
{
int i;
i = 0;
while (src[i])
{
//bien evidement c la que VC++ me dis que ca foire ....
dest[i] = src[i];
i++;
}
dest[i+1]=' ';
return (dest);
}
int my_printf(char *toprint)
{
int j=0;
for (j=0;toprint[j];j++)
{
}
_write(1,toprint,j);
return 0;
}
int main(void)
{
char *tmp;
char *sortie;
int j=0;
tmp = "HELLO WORLD !";
//c'est ici que je copie ce que contient tmp dans sortie
sortie = my_strcpy(sortie,tmp);
Voilà ton UB. Tu devrais avoir un warning du genre 'utilisation d'une
variable non initialisée'.
main.c: In function `my_printf':
main.c:21: warning: implicit declaration of function `_write'
main.c: In function `main':
main.c:31: warning: unused variable `j'
main.c:30: warning: `sortie' might be used uninitialized in this function
'sortie' est un pointeur sur char /non initialisé/. Tu passes donc un contenu
indeterminé (rappel, les passages de paramètres se font par toujours par
valeur en C). La fonction ecrit bêtement à l'adresse indique (n'importe
quoi), et c'est le UB.
Un jour ça fait semblant de fonctionner, l'autre jour ça fait exploser une
fusée... Fait pas faire ça. Il faut initialiser le pointeur avec une adresse
correcte (adresse ou nom d'un tableau, retour de malloc(), contenu d'un
pointeur correctement initialisé).
voila j'avoue que je ne sais qui croire en esperant que c'est un pb de
compilateur est pas de code ( ni des 2 a la fois ;) )
Ce n'est pas du tout un problème de compilateur, mais de codage. Je te
conseille de relire ton livre de C. (Et je ne te parles pas de la fonction
inconnue '_write'...)
--
-ed- emdelYOURBRA@noos.fr [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
<blank line>
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/
Voila j'ai un code qui semble correct seulement voila
Visual c++ 6.0 ( oui je sais c'est du C et non du cpp mais bon il devrait le comprendre vu que le fichier est un .c) le compile sans erreur mais provoque une erreur a l'execution ("la memoire ne peut etre written")
Du mélange français/anglais dans le texte? Etonnant...
Dev_c++ 4 (en projet C et non C++) me le compile parfaitement et je n'ai aucun pb a l'execution
et enfin
gcc sur un Freebsd avec juste un -o ( desole je ne suis pas un grand habituer des unixlinux ) me sort un seg fault... donc qui croire ...
Typique d'un "Undefined Behaviour" (UB)
je vous colle ci contre le code :
char *my_strcpy(char *dest,const char *src) { int i; i = 0; while (src[i]) { //bien evidement c la que VC++ me dis que ca foire .... dest[i] = src[i]; i++; } dest[i+1]=' '; return (dest); }
int my_printf(char *toprint) { int j=0; for (j=0;toprint[j];j++) { } _write(1,toprint,j); return 0; }
int main(void) {
char *tmp; char *sortie; int j=0; tmp = "HELLO WORLD !";
//c'est ici que je copie ce que contient tmp dans sortie sortie = my_strcpy(sortie,tmp);
Voilà ton UB. Tu devrais avoir un warning du genre 'utilisation d'une variable non initialisée'.
main.c: In function `my_printf': main.c:21: warning: implicit declaration of function `_write'
main.c: In function `main': main.c:31: warning: unused variable `j'
main.c:30: warning: `sortie' might be used uninitialized in this function
'sortie' est un pointeur sur char /non initialisé/. Tu passes donc un contenu indeterminé (rappel, les passages de paramètres se font par toujours par valeur en C). La fonction ecrit bêtement à l'adresse indique (n'importe quoi), et c'est le UB.
Un jour ça fait semblant de fonctionner, l'autre jour ça fait exploser une fusée... Fait pas faire ça. Il faut initialiser le pointeur avec une adresse correcte (adresse ou nom d'un tableau, retour de malloc(), contenu d'un pointeur correctement initialisé).
voila j'avoue que je ne sais qui croire en esperant que c'est un pb de compilateur est pas de code ( ni des 2 a la fois ;) )
Ce n'est pas du tout un problème de compilateur, mais de codage. Je te conseille de relire ton livre de C. (Et je ne te parles pas de la fonction inconnue '_write'...)
-- -ed- [remove YOURBRA before answering me] The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html <blank line> FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/
DG
"Irsla" <whowen99~~ writes:
Voila j'ai un code qui semble correct seulement voila
Visual c++ 6.0 ( oui je sais c'est du C et non du cpp mais bon il devrait le comprendre vu que le fichier est un .c) le compile sans erreur mais provoque une erreur a l'execution ("la memoire ne peut etre written")
Dev_c++ 4 (en projet C et non C++) me le compile parfaitement et je n'ai aucun pb a l'execution
et enfin
gcc sur un Freebsd avec juste un -o ( desole je ne suis pas un grand habituer des unixlinux ) me sort un seg fault... donc qui croire ...
je vous colle ci contre le code :
char *my_strcpy(char *dest,const char *src) { int i; i = 0; while (src[i]) { //bien evidement c la que VC++ me dis que ca foire .... dest[i] = src[i]; i++; } dest[i+1]=' '; return (dest); }
int my_printf(char *toprint) { int j=0; for (j=0;toprint[j];j++) { } _write(1,toprint,j); return 0; }
int main(void) {
char *tmp; char *sortie; int j=0; tmp = "HELLO WORLD !";
Tu n'a pas alloué la chaîne sortie. Tu peux le faire par exemple de la manière suivante (tu peux aussi utiliser un buffer statique...) : sortie = malloc (sizeof (tmp) + 1);
//c'est ici que je copie ce que contient tmp dans sortie sortie = my_strcpy(sortie,tmp); //puis j'impirme sortie ;) my_printf(sortie); free (sortie);
return 0; }
Je viens de regarder rapidement ton code et il semblerait que tu es déjà un problème dans ta fonction main. En effet, la chaîne «sortie» n'est jamais allouée (et my_strcpy part de l'hypothèse que sa chaîne dest est préalablement correctement allouée). Si ça peut t'aider...
"Irsla" <whowen99~~no-spam@hotmail.com> writes:
Voila j'ai un code qui semble correct seulement voila
Visual c++ 6.0 ( oui je sais c'est du C et non du cpp mais bon il devrait le
comprendre vu que le fichier est un .c) le compile sans erreur mais provoque
une erreur a l'execution ("la memoire ne peut etre written")
Dev_c++ 4 (en projet C et non C++) me le compile parfaitement et je n'ai
aucun pb a l'execution
et enfin
gcc sur un Freebsd avec juste un -o ( desole je ne suis pas un grand
habituer des unixlinux ) me sort un seg fault...
donc qui croire ...
je vous colle ci contre le code :
char *my_strcpy(char *dest,const char *src)
{
int i;
i = 0;
while (src[i])
{
//bien evidement c la que VC++ me dis que ca foire ....
dest[i] = src[i];
i++;
}
dest[i+1]=' ';
return (dest);
}
int my_printf(char *toprint)
{
int j=0;
for (j=0;toprint[j];j++)
{
}
_write(1,toprint,j);
return 0;
}
int main(void)
{
char *tmp;
char *sortie;
int j=0;
tmp = "HELLO WORLD !";
Tu n'a pas alloué la chaîne sortie. Tu peux le faire par exemple de la
manière suivante (tu peux aussi utiliser un buffer statique...) :
sortie = malloc (sizeof (tmp) + 1);
//c'est ici que je copie ce que contient tmp dans sortie
sortie = my_strcpy(sortie,tmp);
//puis j'impirme sortie ;)
my_printf(sortie);
free (sortie);
return 0;
}
Je viens de regarder rapidement ton code et il semblerait que tu es
déjà un problème dans ta fonction main. En effet, la chaîne «sortie»
n'est jamais allouée (et my_strcpy part de l'hypothèse que sa chaîne
dest est préalablement correctement allouée).
Si ça peut t'aider...
Voila j'ai un code qui semble correct seulement voila
Visual c++ 6.0 ( oui je sais c'est du C et non du cpp mais bon il devrait le comprendre vu que le fichier est un .c) le compile sans erreur mais provoque une erreur a l'execution ("la memoire ne peut etre written")
Dev_c++ 4 (en projet C et non C++) me le compile parfaitement et je n'ai aucun pb a l'execution
et enfin
gcc sur un Freebsd avec juste un -o ( desole je ne suis pas un grand habituer des unixlinux ) me sort un seg fault... donc qui croire ...
je vous colle ci contre le code :
char *my_strcpy(char *dest,const char *src) { int i; i = 0; while (src[i]) { //bien evidement c la que VC++ me dis que ca foire .... dest[i] = src[i]; i++; } dest[i+1]=' '; return (dest); }
int my_printf(char *toprint) { int j=0; for (j=0;toprint[j];j++) { } _write(1,toprint,j); return 0; }
int main(void) {
char *tmp; char *sortie; int j=0; tmp = "HELLO WORLD !";
Tu n'a pas alloué la chaîne sortie. Tu peux le faire par exemple de la manière suivante (tu peux aussi utiliser un buffer statique...) : sortie = malloc (sizeof (tmp) + 1);
//c'est ici que je copie ce que contient tmp dans sortie sortie = my_strcpy(sortie,tmp); //puis j'impirme sortie ;) my_printf(sortie); free (sortie);
return 0; }
Je viens de regarder rapidement ton code et il semblerait que tu es déjà un problème dans ta fonction main. En effet, la chaîne «sortie» n'est jamais allouée (et my_strcpy part de l'hypothèse que sa chaîne dest est préalablement correctement allouée). Si ça peut t'aider...
Kalkul
char *my_strcpy(char *dest,const char *src) { int i; i = 0; while (src[i]) { //bien evidement c la que VC++ me dis que ca foire .... dest[i] = src[i];
Il est normal que ça plante. dest est un pointeur vers char. C'est à dire que c'est une variable qui peut contenir l'adresse d'un char et toi tu essais d'y ranger des char. Même en tassant bien, ça ne rentrera pas ;-) Il faut allouer de la mémoire pour stocker la chaine. Kalkul
char *my_strcpy(char *dest,const char *src)
{
int i;
i = 0;
while (src[i])
{
//bien evidement c la que VC++ me dis que ca foire ....
dest[i] = src[i];
Il est normal que ça plante.
dest est un pointeur vers char. C'est à dire que c'est une variable qui
peut contenir l'adresse d'un char et toi tu essais d'y ranger des char.
Même en tassant bien, ça ne rentrera pas ;-)
Il faut allouer de la mémoire pour stocker la chaine.
Kalkul
char *my_strcpy(char *dest,const char *src) { int i; i = 0; while (src[i]) { //bien evidement c la que VC++ me dis que ca foire .... dest[i] = src[i];
Il est normal que ça plante. dest est un pointeur vers char. C'est à dire que c'est une variable qui peut contenir l'adresse d'un char et toi tu essais d'y ranger des char. Même en tassant bien, ça ne rentrera pas ;-) Il faut allouer de la mémoire pour stocker la chaine. Kalkul
Emmanuel Delahaye
In 'fr.comp.lang.c', DG wrote:
int main(void) {
char *tmp; char *sortie; int j=0; tmp = "HELLO WORLD !";
Tu n'a pas alloué la chaîne sortie. Tu peux le faire par exemple de la manière suivante (tu peux aussi utiliser un buffer statique...) : sortie = malloc (sizeof (tmp) + 1);
Certainement pas.
sortie = malloc (sizeof "HELLO WORLD !");
ou
sortie = malloc (strlen (tmp) + 1);
un fois que tmp est initialisé.
-- -ed- [remove YOURBRA before answering me] The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html <blank line> FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/
In 'fr.comp.lang.c', DG <dany42NOSPAM@free.fr> wrote:
int main(void)
{
char *tmp;
char *sortie;
int j=0;
tmp = "HELLO WORLD !";
Tu n'a pas alloué la chaîne sortie. Tu peux le faire par exemple de la
manière suivante (tu peux aussi utiliser un buffer statique...) :
sortie = malloc (sizeof (tmp) + 1);
Certainement pas.
sortie = malloc (sizeof "HELLO WORLD !");
ou
sortie = malloc (strlen (tmp) + 1);
un fois que tmp est initialisé.
--
-ed- emdelYOURBRA@noos.fr [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
<blank line>
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/
char *tmp; char *sortie; int j=0; tmp = "HELLO WORLD !";
Tu n'a pas alloué la chaîne sortie. Tu peux le faire par exemple de la manière suivante (tu peux aussi utiliser un buffer statique...) : sortie = malloc (sizeof (tmp) + 1);
Certainement pas.
sortie = malloc (sizeof "HELLO WORLD !");
ou
sortie = malloc (strlen (tmp) + 1);
un fois que tmp est initialisé.
-- -ed- [remove YOURBRA before answering me] The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html <blank line> FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/
DG
Emmanuel Delahaye writes:
In 'fr.comp.lang.c', DG wrote:
int main(void) {
char *tmp; char *sortie; int j=0; tmp = "HELLO WORLD !";
Tu n'a pas alloué la chaîne sortie. Tu peux le faire par exemple de la manière suivante (tu peux aussi utiliser un buffer statique...) : sortie = malloc (sizeof (tmp) + 1);
Certainement pas.
sortie = malloc (sizeof "HELLO WORLD !");
ou
sortie = malloc (strlen (tmp) + 1);
un fois que tmp est initialisé.
Yep,
J'ai un peu tout mélangé (faut dire c'est diamnche matin :-) et surtout j'ai pas fait attention que tmp était un pointeur sur char et non un tableau. En fait, je pensais à truc comme ça:
In 'fr.comp.lang.c', DG <dany42NOSPAM@free.fr> wrote:
int main(void)
{
char *tmp;
char *sortie;
int j=0;
tmp = "HELLO WORLD !";
Tu n'a pas alloué la chaîne sortie. Tu peux le faire par exemple de la
manière suivante (tu peux aussi utiliser un buffer statique...) :
sortie = malloc (sizeof (tmp) + 1);
Certainement pas.
sortie = malloc (sizeof "HELLO WORLD !");
ou
sortie = malloc (strlen (tmp) + 1);
un fois que tmp est initialisé.
Yep,
J'ai un peu tout mélangé (faut dire c'est diamnche matin :-) et
surtout j'ai pas fait attention que tmp était un pointeur sur char et
non un tableau. En fait, je pensais à truc comme ça:
char *tmp; char *sortie; int j=0; tmp = "HELLO WORLD !";
Tu n'a pas alloué la chaîne sortie. Tu peux le faire par exemple de la manière suivante (tu peux aussi utiliser un buffer statique...) : sortie = malloc (sizeof (tmp) + 1);
Certainement pas.
sortie = malloc (sizeof "HELLO WORLD !");
ou
sortie = malloc (strlen (tmp) + 1);
un fois que tmp est initialisé.
Yep,
J'ai un peu tout mélangé (faut dire c'est diamnche matin :-) et surtout j'ai pas fait attention que tmp était un pointeur sur char et non un tableau. En fait, je pensais à truc comme ça:
Mais pour moi, ça ne sert à rien de retourner le pointeur du buffer cible car il est transmit en paramètre (ça consomme des cycles CPU pour rien). A la rigueur, tu peux retourner le nombre de char copié, ce serait déjà plus utile AMHA.
Mais pour moi, ça ne sert à rien de retourner le pointeur du buffer
cible car il est transmit en paramètre (ça consomme des cycles CPU
pour rien). A la rigueur, tu peux retourner le nombre de char copié,
ce serait déjà plus utile AMHA.
Mais pour moi, ça ne sert à rien de retourner le pointeur du buffer cible car il est transmit en paramètre (ça consomme des cycles CPU pour rien). A la rigueur, tu peux retourner le nombre de char copié, ce serait déjà plus utile AMHA.
"Emmanuel Delahaye" a écrit dans le message de news:
In 'fr.comp.lang.c', "Irsla" <whowen99~~ wrote:
Voila j'ai un code qui semble correct seulement voila
Visual c++ 6.0 ( oui je sais c'est du C et non du cpp mais bon il devrait le comprendre vu que le fichier est un .c) le compile sans erreur mais provoque une erreur a l'execution ("la memoire ne peut etre written")
Du mélange français/anglais dans le texte? Etonnant...
bah ca tu le dis a mon Win2k ;)
Dev_c++ 4 (en projet C et non C++) me le compile parfaitement et je n'ai aucun pb a l'execution
et enfin
gcc sur un Freebsd avec juste un -o ( desole je ne suis pas un grand habituer des unixlinux ) me sort un seg fault... donc qui croire ...
Typique d'un "Undefined Behaviour" (UB)
je vous colle ci contre le code :
char *my_strcpy(char *dest,const char *src) { int i; i = 0; while (src[i]) { //bien evidement c la que VC++ me dis que ca foire .... dest[i] = src[i]; i++; } dest[i+1]=' '; return (dest); }
int my_printf(char *toprint) { int j=0; for (j=0;toprint[j];j++) { } _write(1,toprint,j); return 0; }
int main(void) {
char *tmp; char *sortie; int j=0; tmp = "HELLO WORLD !";
//c'est ici que je copie ce que contient tmp dans sortie sortie = my_strcpy(sortie,tmp);
Voilà ton UB. Tu devrais avoir un warning du genre 'utilisation d'une variable non initialisée'.
exacte je l'ai
main.c: In function `my_printf': main.c:21: warning: implicit declaration of function `_write'
main.c: In function `main': main.c:31: warning: unused variable `j'
main.c:30: warning: `sortie' might be used uninitialized in this function
'sortie' est un pointeur sur char /non initialisé/. Tu passes donc un contenu
indeterminé (rappel, les passages de paramètres se font par toujours par valeur en C). La fonction ecrit bêtement à l'adresse indique (n'importe quoi), et c'est le UB.
Un jour ça fait semblant de fonctionner, l'autre jour ça fait exploser une fusée... Fait pas faire ça. Il faut initialiser le pointeur avec une adresse
correcte (adresse ou nom d'un tableau, retour de malloc(), contenu d'un pointeur correctement initialisé).
bien pour la conclusion d'une eventuelle solution malheuresement je n'ai aps le droit d'utiliser malloc ;)
voila j'avoue que je ne sais qui croire en esperant que c'est un pb de compilateur est pas de code ( ni des 2 a la fois ;) )
Ce n'est pas du tout un problème de compilateur, mais de codage. Je te conseille de relire ton livre de C. (Et je ne te parles pas de la fonction inconnue '_write'...)
pour ce qui est de la fonction _write regarde dans le msdn a : "write ou _write" ou alros un ptit man write , t'expliquera ce que fait cette fonction ;)
merci qd meme pour l'aide
-- Irsla -------------------------------------------------------------------- Une visite fait toujours plaisir, si ce n'est a l'arrivée c'est au départ ;) --------------------------------------------------------------------
"Emmanuel Delahaye" <emdelYOURBRA@noos.fr> a écrit dans le message de
news:Xns940474E8F910Ahsnoservernet@130.133.1.4...
In 'fr.comp.lang.c', "Irsla" <whowen99~~no-spam@hotmail.com> wrote:
Voila j'ai un code qui semble correct seulement voila
Visual c++ 6.0 ( oui je sais c'est du C et non du cpp mais bon il
devrait le comprendre vu que le fichier est un .c) le compile sans
erreur mais provoque une erreur a l'execution ("la memoire ne peut etre
written")
Du mélange français/anglais dans le texte? Etonnant...
bah ca tu le dis a mon Win2k ;)
Dev_c++ 4 (en projet C et non C++) me le compile parfaitement et je n'ai
aucun pb a l'execution
et enfin
gcc sur un Freebsd avec juste un -o ( desole je ne suis pas un grand
habituer des unixlinux ) me sort un seg fault...
donc qui croire ...
Typique d'un "Undefined Behaviour" (UB)
je vous colle ci contre le code :
char *my_strcpy(char *dest,const char *src)
{
int i;
i = 0;
while (src[i])
{
//bien evidement c la que VC++ me dis que ca foire ....
dest[i] = src[i];
i++;
}
dest[i+1]=' ';
return (dest);
}
int my_printf(char *toprint)
{
int j=0;
for (j=0;toprint[j];j++)
{
}
_write(1,toprint,j);
return 0;
}
int main(void)
{
char *tmp;
char *sortie;
int j=0;
tmp = "HELLO WORLD !";
//c'est ici que je copie ce que contient tmp dans sortie
sortie = my_strcpy(sortie,tmp);
Voilà ton UB. Tu devrais avoir un warning du genre 'utilisation d'une
variable non initialisée'.
exacte je l'ai
main.c: In function `my_printf':
main.c:21: warning: implicit declaration of function `_write'
main.c: In function `main':
main.c:31: warning: unused variable `j'
main.c:30: warning: `sortie' might be used uninitialized in this function
'sortie' est un pointeur sur char /non initialisé/. Tu passes donc un
contenu
indeterminé (rappel, les passages de paramètres se font par toujours par
valeur en C). La fonction ecrit bêtement à l'adresse indique (n'importe
quoi), et c'est le UB.
Un jour ça fait semblant de fonctionner, l'autre jour ça fait exploser une
fusée... Fait pas faire ça. Il faut initialiser le pointeur avec une
adresse
correcte (adresse ou nom d'un tableau, retour de malloc(), contenu d'un
pointeur correctement initialisé).
bien pour la conclusion d'une eventuelle solution malheuresement je n'ai aps
le droit d'utiliser malloc ;)
voila j'avoue que je ne sais qui croire en esperant que c'est un pb de
compilateur est pas de code ( ni des 2 a la fois ;) )
Ce n'est pas du tout un problème de compilateur, mais de codage. Je te
conseille de relire ton livre de C. (Et je ne te parles pas de la fonction
inconnue '_write'...)
pour ce qui est de la fonction _write regarde dans le msdn a : "write ou
_write"
ou alros un ptit man write , t'expliquera ce que fait cette fonction ;)
merci qd meme pour l'aide
--
Irsla
--------------------------------------------------------------------
Une visite fait toujours plaisir, si ce n'est a l'arrivée c'est au départ ;)
--------------------------------------------------------------------
"Emmanuel Delahaye" a écrit dans le message de news:
In 'fr.comp.lang.c', "Irsla" <whowen99~~ wrote:
Voila j'ai un code qui semble correct seulement voila
Visual c++ 6.0 ( oui je sais c'est du C et non du cpp mais bon il devrait le comprendre vu que le fichier est un .c) le compile sans erreur mais provoque une erreur a l'execution ("la memoire ne peut etre written")
Du mélange français/anglais dans le texte? Etonnant...
bah ca tu le dis a mon Win2k ;)
Dev_c++ 4 (en projet C et non C++) me le compile parfaitement et je n'ai aucun pb a l'execution
et enfin
gcc sur un Freebsd avec juste un -o ( desole je ne suis pas un grand habituer des unixlinux ) me sort un seg fault... donc qui croire ...
Typique d'un "Undefined Behaviour" (UB)
je vous colle ci contre le code :
char *my_strcpy(char *dest,const char *src) { int i; i = 0; while (src[i]) { //bien evidement c la que VC++ me dis que ca foire .... dest[i] = src[i]; i++; } dest[i+1]=' '; return (dest); }
int my_printf(char *toprint) { int j=0; for (j=0;toprint[j];j++) { } _write(1,toprint,j); return 0; }
int main(void) {
char *tmp; char *sortie; int j=0; tmp = "HELLO WORLD !";
//c'est ici que je copie ce que contient tmp dans sortie sortie = my_strcpy(sortie,tmp);
Voilà ton UB. Tu devrais avoir un warning du genre 'utilisation d'une variable non initialisée'.
exacte je l'ai
main.c: In function `my_printf': main.c:21: warning: implicit declaration of function `_write'
main.c: In function `main': main.c:31: warning: unused variable `j'
main.c:30: warning: `sortie' might be used uninitialized in this function
'sortie' est un pointeur sur char /non initialisé/. Tu passes donc un contenu
indeterminé (rappel, les passages de paramètres se font par toujours par valeur en C). La fonction ecrit bêtement à l'adresse indique (n'importe quoi), et c'est le UB.
Un jour ça fait semblant de fonctionner, l'autre jour ça fait exploser une fusée... Fait pas faire ça. Il faut initialiser le pointeur avec une adresse
correcte (adresse ou nom d'un tableau, retour de malloc(), contenu d'un pointeur correctement initialisé).
bien pour la conclusion d'une eventuelle solution malheuresement je n'ai aps le droit d'utiliser malloc ;)
voila j'avoue que je ne sais qui croire en esperant que c'est un pb de compilateur est pas de code ( ni des 2 a la fois ;) )
Ce n'est pas du tout un problème de compilateur, mais de codage. Je te conseille de relire ton livre de C. (Et je ne te parles pas de la fonction inconnue '_write'...)
pour ce qui est de la fonction _write regarde dans le msdn a : "write ou _write" ou alros un ptit man write , t'expliquera ce que fait cette fonction ;)
merci qd meme pour l'aide
-- Irsla -------------------------------------------------------------------- Une visite fait toujours plaisir, si ce n'est a l'arrivée c'est au départ ;) --------------------------------------------------------------------
Irsla
"DG" a écrit dans le message de news:
"Irsla" <whowen99~~ writes:
Voila j'ai un code qui semble correct seulement voila
Visual c++ 6.0 ( oui je sais c'est du C et non du cpp mais bon il devrait le
comprendre vu que le fichier est un .c) le compile sans erreur mais provoque
une erreur a l'execution ("la memoire ne peut etre written")
Dev_c++ 4 (en projet C et non C++) me le compile parfaitement et je n'ai aucun pb a l'execution
et enfin
gcc sur un Freebsd avec juste un -o ( desole je ne suis pas un grand habituer des unixlinux ) me sort un seg fault... donc qui croire ...
je vous colle ci contre le code :
char *my_strcpy(char *dest,const char *src) { int i; i = 0; while (src[i]) { //bien evidement c la que VC++ me dis que ca foire .... dest[i] = src[i]; i++; } dest[i+1]=' '; return (dest); }
int my_printf(char *toprint) { int j=0; for (j=0;toprint[j];j++) { } _write(1,toprint,j); return 0; }
int main(void) {
char *tmp; char *sortie; int j=0; tmp = "HELLO WORLD !";
Tu n'a pas alloué la chaîne sortie. Tu peux le faire par exemple de la manière suivante (tu peux aussi utiliser un buffer statique...) : sortie = malloc (sizeof (tmp) + 1);
oui si seulement je pouvais le faire ;) lol mais ca m'est interdis ;)
//c'est ici que je copie ce que contient tmp dans sortie sortie = my_strcpy(sortie,tmp); //puis j'impirme sortie ;) my_printf(sortie); free (sortie);
return 0; }
Je viens de regarder rapidement ton code et il semblerait que tu es déjà un problème dans ta fonction main. En effet, la chaîne «sortie» n'est jamais allouée (et my_strcpy part de l'hypothèse que sa chaîne dest est préalablement correctement allouée). Si ça peut t'aider...
ouep ca aussi je sais .. ;)
"DG" <dany42NOSPAM@free.fr> a écrit dans le message de
news:8665jdxnoo.fsf@macphisto.homeunix.org...
"Irsla" <whowen99~~no-spam@hotmail.com> writes:
Voila j'ai un code qui semble correct seulement voila
Visual c++ 6.0 ( oui je sais c'est du C et non du cpp mais bon il
devrait le
comprendre vu que le fichier est un .c) le compile sans erreur mais
provoque
une erreur a l'execution ("la memoire ne peut etre written")
Dev_c++ 4 (en projet C et non C++) me le compile parfaitement et je n'ai
aucun pb a l'execution
et enfin
gcc sur un Freebsd avec juste un -o ( desole je ne suis pas un grand
habituer des unixlinux ) me sort un seg fault...
donc qui croire ...
je vous colle ci contre le code :
char *my_strcpy(char *dest,const char *src)
{
int i;
i = 0;
while (src[i])
{
//bien evidement c la que VC++ me dis que ca foire ....
dest[i] = src[i];
i++;
}
dest[i+1]=' ';
return (dest);
}
int my_printf(char *toprint)
{
int j=0;
for (j=0;toprint[j];j++)
{
}
_write(1,toprint,j);
return 0;
}
int main(void)
{
char *tmp;
char *sortie;
int j=0;
tmp = "HELLO WORLD !";
Tu n'a pas alloué la chaîne sortie. Tu peux le faire par exemple de la
manière suivante (tu peux aussi utiliser un buffer statique...) :
sortie = malloc (sizeof (tmp) + 1);
oui si seulement je pouvais le faire ;) lol mais ca m'est interdis ;)
//c'est ici que je copie ce que contient tmp dans sortie
sortie = my_strcpy(sortie,tmp);
//puis j'impirme sortie ;)
my_printf(sortie);
free (sortie);
return 0;
}
Je viens de regarder rapidement ton code et il semblerait que tu es
déjà un problème dans ta fonction main. En effet, la chaîne «sortie»
n'est jamais allouée (et my_strcpy part de l'hypothèse que sa chaîne
dest est préalablement correctement allouée).
Si ça peut t'aider...
Voila j'ai un code qui semble correct seulement voila
Visual c++ 6.0 ( oui je sais c'est du C et non du cpp mais bon il devrait le
comprendre vu que le fichier est un .c) le compile sans erreur mais provoque
une erreur a l'execution ("la memoire ne peut etre written")
Dev_c++ 4 (en projet C et non C++) me le compile parfaitement et je n'ai aucun pb a l'execution
et enfin
gcc sur un Freebsd avec juste un -o ( desole je ne suis pas un grand habituer des unixlinux ) me sort un seg fault... donc qui croire ...
je vous colle ci contre le code :
char *my_strcpy(char *dest,const char *src) { int i; i = 0; while (src[i]) { //bien evidement c la que VC++ me dis que ca foire .... dest[i] = src[i]; i++; } dest[i+1]=' '; return (dest); }
int my_printf(char *toprint) { int j=0; for (j=0;toprint[j];j++) { } _write(1,toprint,j); return 0; }
int main(void) {
char *tmp; char *sortie; int j=0; tmp = "HELLO WORLD !";
Tu n'a pas alloué la chaîne sortie. Tu peux le faire par exemple de la manière suivante (tu peux aussi utiliser un buffer statique...) : sortie = malloc (sizeof (tmp) + 1);
oui si seulement je pouvais le faire ;) lol mais ca m'est interdis ;)
//c'est ici que je copie ce que contient tmp dans sortie sortie = my_strcpy(sortie,tmp); //puis j'impirme sortie ;) my_printf(sortie); free (sortie);
return 0; }
Je viens de regarder rapidement ton code et il semblerait que tu es déjà un problème dans ta fonction main. En effet, la chaîne «sortie» n'est jamais allouée (et my_strcpy part de l'hypothèse que sa chaîne dest est préalablement correctement allouée). Si ça peut t'aider...
ouep ca aussi je sais .. ;)
Irsla
"DG" a écrit dans le message de news:
Emmanuel Delahaye writes:
In 'fr.comp.lang.c', DG wrote:
int main(void) {
char *tmp; char *sortie; int j=0; tmp = "HELLO WORLD !";
Tu n'a pas alloué la chaîne sortie. Tu peux le faire par exemple de la manière suivante (tu peux aussi utiliser un buffer statique...) : sortie = malloc (sizeof (tmp) + 1);
Certainement pas.
sortie = malloc (sizeof "HELLO WORLD !");
ou
sortie = malloc (strlen (tmp) + 1);
un fois que tmp est initialisé.
Yep,
J'ai un peu tout mélangé (faut dire c'est diamnche matin :-) et surtout j'ai pas fait attention que tmp était un pointeur sur char et non un tableau. En fait, je pensais à truc comme ça:
"DG" <dany42NOSPAM@free.fr> a écrit dans le message de
news:861xu1xkm1.fsf@macphisto.homeunix.org...
Emmanuel Delahaye <emdelYOURBRA@noos.fr> writes:
In 'fr.comp.lang.c', DG <dany42NOSPAM@free.fr> wrote:
int main(void)
{
char *tmp;
char *sortie;
int j=0;
tmp = "HELLO WORLD !";
Tu n'a pas alloué la chaîne sortie. Tu peux le faire par exemple de la
manière suivante (tu peux aussi utiliser un buffer statique...) :
sortie = malloc (sizeof (tmp) + 1);
Certainement pas.
sortie = malloc (sizeof "HELLO WORLD !");
ou
sortie = malloc (strlen (tmp) + 1);
un fois que tmp est initialisé.
Yep,
J'ai un peu tout mélangé (faut dire c'est diamnche matin :-) et
surtout j'ai pas fait attention que tmp était un pointeur sur char et
non un tableau. En fait, je pensais à truc comme ça:
char *tmp; char *sortie; int j=0; tmp = "HELLO WORLD !";
Tu n'a pas alloué la chaîne sortie. Tu peux le faire par exemple de la manière suivante (tu peux aussi utiliser un buffer statique...) : sortie = malloc (sizeof (tmp) + 1);
Certainement pas.
sortie = malloc (sizeof "HELLO WORLD !");
ou
sortie = malloc (strlen (tmp) + 1);
un fois que tmp est initialisé.
Yep,
J'ai un peu tout mélangé (faut dire c'est diamnche matin :-) et surtout j'ai pas fait attention que tmp était un pointeur sur char et non un tableau. En fait, je pensais à truc comme ça:
Mais pour moi, ça ne sert à rien de retourner le pointeur du buffer cible car il est transmit en paramètre (ça consomme des cycles CPU pour rien). A la rigueur, tu peux retourner le nombre de char copié, ce serait déjà plus utile AMHA.
-- Irsla -------------------------------------------------------------------- Une visite fait toujours plaisir, si ce n'est a l'arrivée c'est au départ ;) --------------------------------------------------------------------
"Jean-Marc" <Utilisez.le.Reply-to@merci.fr.invalid> a écrit dans le message
de news:3f76d4a3$0$20634$626a54ce@news.free.fr...
"Irsla" a écrit:
[...]
je vous colle ci contre le code :
Je rajouterais ceci:
char *my_strcpy(char *dest,const char *src)
{
int i;
i = 0;
Tu peux écrire:
int i=0;
while (src[i])
{
/* bien evidement c la que VC++ me dis que ca foire .... */
dest[i] = src[i];
i++;
}
dest[i+1]=' ';
Ceci va écrire en dehors du buffer, si le buffer destination a la
taille du buffer source.
dest[i]=' ';
ouep merci j'avais corriger cette erreur la ;)
return (dest);
}
Qui donne:
char *my_strcpy(char *dest, const char *src)
{
int i=0;
while (src[i])
{
dest[i] = src[i];
i++;
}
dest[i]=' ';
Mais pour moi, ça ne sert à rien de retourner le pointeur du buffer
cible car il est transmit en paramètre (ça consomme des cycles CPU
pour rien). A la rigueur, tu peux retourner le nombre de char copié,
ce serait déjà plus utile AMHA.
--
Irsla
--------------------------------------------------------------------
Une visite fait toujours plaisir, si ce n'est a l'arrivée c'est au départ ;)
--------------------------------------------------------------------
Mais pour moi, ça ne sert à rien de retourner le pointeur du buffer cible car il est transmit en paramètre (ça consomme des cycles CPU pour rien). A la rigueur, tu peux retourner le nombre de char copié, ce serait déjà plus utile AMHA.
-- Irsla -------------------------------------------------------------------- Une visite fait toujours plaisir, si ce n'est a l'arrivée c'est au départ ;) --------------------------------------------------------------------