Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
espie
In article , idem101010 wrote:
Bonjour
Je ne comprends pas que ce code après exécution sans erreurs apparentes lors de la compilation renvoie :
[ pas besoin de plus ]
void ReadTxt(char *FTxt) ;
int main(void) { char *Pfb2 = 0 ;
printf("nEntrez un mot : n") ; ReadTxt(Pfb2) ;
printf("nTest 2 : %s n", Pfb2) ;
free(Pfb2) ;
return 0 ; }
En C, les parametres sont toujours passes par valeur. Il n'y a pas besoin de regarder le reste du code, la valeur de Pfb2 ne peut pas changer, ca sera toujours un pointeur nul.
In article <71a3befd-3ac1-4a49-a58a-734c82f4ce79@i18g2000yqn.googlegroups.com>,
idem101010 <idem101010@hotmail.fr> wrote:
Bonjour
Je ne comprends pas que ce code après exécution sans erreurs
apparentes lors de la compilation renvoie :
[ pas besoin de plus ]
void ReadTxt(char *FTxt) ;
int main(void)
{
char *Pfb2 = 0 ;
printf("nEntrez un mot : n") ;
ReadTxt(Pfb2) ;
printf("nTest 2 : %s n", Pfb2) ;
free(Pfb2) ;
return 0 ;
}
En C, les parametres sont toujours passes par valeur. Il n'y a pas besoin
de regarder le reste du code, la valeur de Pfb2 ne peut pas changer, ca
sera toujours un pointeur nul.
Je ne comprends pas que ce code après exécution sans erreurs apparentes lors de la compilation renvoie :
[ pas besoin de plus ]
void ReadTxt(char *FTxt) ;
int main(void) { char *Pfb2 = 0 ;
printf("nEntrez un mot : n") ; ReadTxt(Pfb2) ;
printf("nTest 2 : %s n", Pfb2) ;
free(Pfb2) ;
return 0 ; }
En C, les parametres sont toujours passes par valeur. Il n'y a pas besoin de regarder le reste du code, la valeur de Pfb2 ne peut pas changer, ca sera toujours un pointeur nul.
Benoit Izac
Bonjour,
le 05/12/2010 à 13:49, idem a écrit dans le message :
Je ne comprends pas que ce code après exécution sans erreurs apparentes lors de la compilation renvoie : ====== > Entrez un mot : test
Test 2 : (null)
====== > Le code :
#include <stdio.h> #include <stdlib.h>
void ReadTxt(char *FTxt) ;
int main(void) { char *Pfb2 = 0 ;
printf("nEntrez un mot : n") ; ReadTxt(Pfb2) ;
printf("nTest 2 : %s n", Pfb2) ;
free(Pfb2) ;
return 0 ; }
void ReadTxt(char *FTxt)
En C, le passage d'argument se fait par copie. Quand tu rentres dans ReadTxt, FTxt vaut NULL, quand tu en ressorts, il vaut toujours NULL (quelque soit la valeur que FTxt prend dans la fonction).
Le mieux c'est plutôt de faire « char *ReadTxt(void) » qui renvoie un pointeur sur la la zone que tu auras allouée et dans laquelle tu auras copié la saisie soit NULL en cas d'erreur. Ensuite dans main :
i = 0 ; while ( (c = getchar() ) && c != EOF && c != 'n' ) { i++ ; if ((FTxt = realloc(FTxt, i * sizeof(char))) != NULL)
Par définition sizeof char == 1. Lors du premier appel, tu alloues 1, ce qui n'est pas suffisant pour stocker c et ' '. Si realloc échoue, tu perds l'adresse de la mémoire sur laquelle pointait FTxt avant l'appelle. Plus moyen de libérer la mémoire.
char *tmp;
tmp = realloc(i + 1); if (tmp == NULL) { free(FTxt); /* mesures à prendre en cas d'erreur */ } else { FTxt = tmp; /* on continue le traitement avec FTxt */ }
-- Benoit Izac
Bonjour,
le 05/12/2010 à 13:49, idem a écrit dans le message
<71a3befd-3ac1-4a49-a58a-734c82f4ce79@i18g2000yqn.googlegroups.com> :
Je ne comprends pas que ce code après exécution sans erreurs
apparentes lors de la compilation renvoie :
====== >
Entrez un mot :
test
Test 2 : (null)
====== > Le code :
#include <stdio.h>
#include <stdlib.h>
void ReadTxt(char *FTxt) ;
int main(void)
{
char *Pfb2 = 0 ;
printf("nEntrez un mot : n") ;
ReadTxt(Pfb2) ;
printf("nTest 2 : %s n", Pfb2) ;
free(Pfb2) ;
return 0 ;
}
void ReadTxt(char *FTxt)
En C, le passage d'argument se fait par copie. Quand tu rentres dans
ReadTxt, FTxt vaut NULL, quand tu en ressorts, il vaut toujours NULL
(quelque soit la valeur que FTxt prend dans la fonction).
Le mieux c'est plutôt de faire « char *ReadTxt(void) » qui renvoie un
pointeur sur la la zone que tu auras allouée et dans laquelle tu auras
copié la saisie soit NULL en cas d'erreur. Ensuite dans main :
i = 0 ;
while ( (c = getchar() ) && c != EOF && c != 'n' )
{
i++ ;
if ((FTxt = realloc(FTxt, i * sizeof(char))) != NULL)
Par définition sizeof char == 1. Lors du premier appel, tu alloues 1, ce
qui n'est pas suffisant pour stocker c et ' '. Si realloc échoue, tu
perds l'adresse de la mémoire sur laquelle pointait FTxt avant
l'appelle. Plus moyen de libérer la mémoire.
char *tmp;
tmp = realloc(i + 1);
if (tmp == NULL) {
free(FTxt);
/* mesures à prendre en cas d'erreur */
} else {
FTxt = tmp;
/* on continue le traitement avec FTxt */
}
le 05/12/2010 à 13:49, idem a écrit dans le message :
Je ne comprends pas que ce code après exécution sans erreurs apparentes lors de la compilation renvoie : ====== > Entrez un mot : test
Test 2 : (null)
====== > Le code :
#include <stdio.h> #include <stdlib.h>
void ReadTxt(char *FTxt) ;
int main(void) { char *Pfb2 = 0 ;
printf("nEntrez un mot : n") ; ReadTxt(Pfb2) ;
printf("nTest 2 : %s n", Pfb2) ;
free(Pfb2) ;
return 0 ; }
void ReadTxt(char *FTxt)
En C, le passage d'argument se fait par copie. Quand tu rentres dans ReadTxt, FTxt vaut NULL, quand tu en ressorts, il vaut toujours NULL (quelque soit la valeur que FTxt prend dans la fonction).
Le mieux c'est plutôt de faire « char *ReadTxt(void) » qui renvoie un pointeur sur la la zone que tu auras allouée et dans laquelle tu auras copié la saisie soit NULL en cas d'erreur. Ensuite dans main :
i = 0 ; while ( (c = getchar() ) && c != EOF && c != 'n' ) { i++ ; if ((FTxt = realloc(FTxt, i * sizeof(char))) != NULL)
Par définition sizeof char == 1. Lors du premier appel, tu alloues 1, ce qui n'est pas suffisant pour stocker c et ' '. Si realloc échoue, tu perds l'adresse de la mémoire sur laquelle pointait FTxt avant l'appelle. Plus moyen de libérer la mémoire.
char *tmp;
tmp = realloc(i + 1); if (tmp == NULL) { free(FTxt); /* mesures à prendre en cas d'erreur */ } else { FTxt = tmp; /* on continue le traitement avec FTxt */ }
-- Benoit Izac
Mickaël Wolff
On 05/12/10 13:18, Marc Espie wrote:
[ pas besoin de plus ]
void ReadTxt(char *FTxt) ;
En C, les parametres sont toujours passes par valeur. Il n'y a pas besoin de regarder le reste du code, la valeur de Pfb2 ne peut pas changer, ca sera toujours un pointeur nul.
Benoit a proposé de renvoyer un pointeur sur la nouvelle zone allouée. Une autre manière de faire est de passer un pointeur sur le pointeur, et de mettre à jour son contenu dans la fonction appelante :
void ReadTxt(char ** pp_text) ;
Et d'appeler ainsi : ReadTxt(&Pfb2) ;
On 05/12/10 13:18, Marc Espie wrote:
[ pas besoin de plus ]
void ReadTxt(char *FTxt) ;
En C, les parametres sont toujours passes par valeur. Il n'y a pas besoin
de regarder le reste du code, la valeur de Pfb2 ne peut pas changer, ca
sera toujours un pointeur nul.
Benoit a proposé de renvoyer un pointeur sur la nouvelle zone
allouée. Une autre manière de faire est de passer un pointeur sur le
pointeur, et de mettre à jour son contenu dans la fonction appelante :
En C, les parametres sont toujours passes par valeur. Il n'y a pas besoin de regarder le reste du code, la valeur de Pfb2 ne peut pas changer, ca sera toujours un pointeur nul.
Benoit a proposé de renvoyer un pointeur sur la nouvelle zone allouée. Une autre manière de faire est de passer un pointeur sur le pointeur, et de mettre à jour son contenu dans la fonction appelante :
void ReadTxt(char ** pp_text) ;
Et d'appeler ainsi : ReadTxt(&Pfb2) ;
-ed-
On 5 déc, 13:49, idem101010 wrote:
void ReadTxt(char *FTxt) { int c ; int i ;
i = 0 ; while ( (c = getchar() ) && c != EOF && c != 'n' ) { i++ ; if ((FTxt = realloc(FTxt, i * sizeof(char))) != NULL) { FTxt[i-1] = c ; FTxt[i] = 0 ; } else { printf("nErreur allocationn") ; exit(EXIT_FAILURE) ; } }