Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Probleme de compilateur... mais qui faut-il croire .....

34 réponses
Avatar
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 ;)
--------------------------------------------------------------------

10 réponses

1 2 3 4
Avatar
Emmanuel Delahaye
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...

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

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


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/

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

Avatar
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

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


Avatar
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:

char tmp[] = "HELLO WORLD !";
sortie = malloc (sizeof (tmp));



Avatar
Jean-Marc
"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]='';

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]='';

return (dest);
}

[...]

int main(void)
{
[...]

sortie = my_strcpy(sortie,tmp);
my_printf(sortie);


Tu peux écrire:

my_printf( my_strcpy(sortie,tmp) );

vu que my_strcpy retourne le pointeur sur sortie


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.

my_strcpy(sortie,tmp);
my_printf(sortie);

ou

size_string = my_strcpy(sortie,tmp);
my_printf(sortie);


return 0;
}


A
+
Jean-Marc
Novice N1

Avatar
Irsla
"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 ;)



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


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


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


Avatar
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:

char tmp[] = "HELLO WORLD !";
sortie = malloc (sizeof (tmp));


ca change pas le pb j'y ai pas le droit ;)




Avatar
Irsla
"Jean-Marc" a écrit dans le message
de news:3f76d4a3$0$20634$

"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]='';

return (dest);
}

[...]

int main(void)
{
[...]

sortie = my_strcpy(sortie,tmp);
my_printf(sortie);


Tu peux écrire:

my_printf( my_strcpy(sortie,tmp) );

vu que my_strcpy retourne le pointeur sur sortie


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.

my_strcpy(sortie,tmp);
my_printf(sortie);

ou

size_string = my_strcpy(sortie,tmp);
my_printf(sortie);


return 0;
}


A
+
Jean-Marc
Novice N1







je vais essayer merci pour l'aide ;)


--
Irsla
--------------------------------------------------------------------
Une visite fait toujours plaisir, si ce n'est a l'arrivée c'est au départ ;)
--------------------------------------------------------------------


1 2 3 4