Par exemple : je réserve de la mémoire pour un pointeur vers une
adresse de type caractère, pour 1 ou 2 caractères et à je demande à
l'utilisateur de saisir du texte. A chaque saisie, je réserve la place
pour un caractère supplémentaire en mémoire avec realloc, c'est
faisable? Bizarement, je ne trouve aucun code qui correspond à ce que
je recherche sur le net.
Autre question sans lien avec la première :
est-ce que écrire char* chaine = 0 et char *chaine = 0 revient à la
même chose?
Par exemple : je réserve de la mémoire pour un pointeur vers une
adresse de type caractère, pour 1 ou 2 caractères et à je demande à
l'utilisateur de saisir du texte. A chaque saisie, je réserve la place
pour un caractère supplémentaire en mémoire avec realloc, c'est
faisable? Bizarement, je ne trouve aucun code qui correspond à ce que
je recherche sur le net.
Autre question sans lien avec la première :
est-ce que écrire char* chaine = 0 et char *chaine = 0 revient à la
même chose?
Par exemple : je réserve de la mémoire pour un pointeur vers une
adresse de type caractère, pour 1 ou 2 caractères et à je demande à
l'utilisateur de saisir du texte. A chaque saisie, je réserve la place
pour un caractère supplémentaire en mémoire avec realloc, c'est
faisable? Bizarement, je ne trouve aucun code qui correspond à ce que
je recherche sur le net.
Autre question sans lien avec la première :
est-ce que écrire char* chaine = 0 et char *chaine = 0 revient à la
même chose?
Pourquoi ce code ne renvoie pas le texte saisie?
Pourquoi ce code ne renvoie pas le texte saisie?
Pourquoi ce code ne renvoie pas le texte saisie?
On 15 mai, 02:08, heron wrote:> Pourquoi ce code n e renvoie pas le texte saisie?
Ce code donne
Tapez une phrase :Hello world
^Z
Vous avez entre : 'Hello world
'
Process returned 0 (0x0) execution time : 12.058 s
Press any key to continue.
Sous Windows. Qu'est-ce qui ne va pas ?
On 15 mai, 02:08, heron <cream10...@yahoo.com> wrote:> Pourquoi ce code n e renvoie pas le texte saisie?
Ce code donne
Tapez une phrase :Hello world
^Z
Vous avez entre : 'Hello world
'
Process returned 0 (0x0) execution time : 12.058 s
Press any key to continue.
Sous Windows. Qu'est-ce qui ne va pas ?
On 15 mai, 02:08, heron wrote:> Pourquoi ce code n e renvoie pas le texte saisie?
Ce code donne
Tapez une phrase :Hello world
^Z
Vous avez entre : 'Hello world
'
Process returned 0 (0x0) execution time : 12.058 s
Press any key to continue.
Sous Windows. Qu'est-ce qui ne va pas ?
Antoine Leca a écrit :
> Attention, cela fait _ou défait_ la place pour un seul entier _tout
> court_ ; donc si avant le realloc() numbers était un pointeur vers
> l'espace pour dix entiers, après le realloc tu as _perdu_ les neuf
> derniers, d'accord ?
> ../..
> Idem, pas deux _autres_ mais deux _en tout_.
Arf.. Tres bonne remarque, j'avais même pas vu que Heron pouvait penser
que realloc travaillait en relatif "augmentait" ou "diminuais" la zone
mémoire du pointeur. Ca ne m'etait jammais venu à l'esprit que quelqu 'un
imagine cela (le manpage est clair au sujet de realloc).
Heron: la taille passée à realloc() est une taille absolue (comme
malloc), pas relative! C'est super important à comprendre!
sam (Tapons ou Héron? Héron petit, pas Tapons :) )
Antoine Leca a écrit :
> Attention, cela fait _ou défait_ la place pour un seul entier _tout
> court_ ; donc si avant le realloc() numbers était un pointeur vers
> l'espace pour dix entiers, après le realloc tu as _perdu_ les neuf
> derniers, d'accord ?
> ../..
> Idem, pas deux _autres_ mais deux _en tout_.
Arf.. Tres bonne remarque, j'avais même pas vu que Heron pouvait penser
que realloc travaillait en relatif "augmentait" ou "diminuais" la zone
mémoire du pointeur. Ca ne m'etait jammais venu à l'esprit que quelqu 'un
imagine cela (le manpage est clair au sujet de realloc).
Heron: la taille passée à realloc() est une taille absolue (comme
malloc), pas relative! C'est super important à comprendre!
sam (Tapons ou Héron? Héron petit, pas Tapons :) )
Antoine Leca a écrit :
> Attention, cela fait _ou défait_ la place pour un seul entier _tout
> court_ ; donc si avant le realloc() numbers était un pointeur vers
> l'espace pour dix entiers, après le realloc tu as _perdu_ les neuf
> derniers, d'accord ?
> ../..
> Idem, pas deux _autres_ mais deux _en tout_.
Arf.. Tres bonne remarque, j'avais même pas vu que Heron pouvait penser
que realloc travaillait en relatif "augmentait" ou "diminuais" la zone
mémoire du pointeur. Ca ne m'etait jammais venu à l'esprit que quelqu 'un
imagine cela (le manpage est clair au sujet de realloc).
Heron: la taille passée à realloc() est une taille absolue (comme
malloc), pas relative! C'est super important à comprendre!
sam (Tapons ou Héron? Héron petit, pas Tapons :) )
> Heron: la taille passée à realloc() est une taille absolue (comme
> malloc), pas relative! C'est super important à comprendre!
Avec les explications et ce que vous dites, je ne suis pas sûre de
comprendre ce que vous voulez dire par taille absolue
> Heron: la taille passée à realloc() est une taille absolue (comme
> malloc), pas relative! C'est super important à comprendre!
Avec les explications et ce que vous dites, je ne suis pas sûre de
comprendre ce que vous voulez dire par taille absolue
> Heron: la taille passée à realloc() est une taille absolue (comme
> malloc), pas relative! C'est super important à comprendre!
Avec les explications et ce que vous dites, je ne suis pas sûre de
comprendre ce que vous voulez dire par taille absolue
On 20 mai, 22:43, heron wrote:
> > Heron: la taille passée à realloc() est une taille absolue (comme
> > malloc), pas relative! C'est super important à comprendre!
> Avec les explications et ce que vous dites, je ne suis pas sûre de
> comprendre ce que vous voulez dire par taille absolue
La taille réelle. Si tu as un bloc de 100 bytes que tu veux augmenter
à 300 (cçd 200 de plus), tu passes en paramètre de realloc() 300 (la
taille réelle demandée ou 'absolue') et non 200 (la supposée taille
supplémentaire ou 'relative' : 200 de plus)
On 20 mai, 22:43, heron <cream10...@yahoo.com> wrote:
> > Heron: la taille passée à realloc() est une taille absolue (comme
> > malloc), pas relative! C'est super important à comprendre!
> Avec les explications et ce que vous dites, je ne suis pas sûre de
> comprendre ce que vous voulez dire par taille absolue
La taille réelle. Si tu as un bloc de 100 bytes que tu veux augmenter
à 300 (cçd 200 de plus), tu passes en paramètre de realloc() 300 (la
taille réelle demandée ou 'absolue') et non 200 (la supposée taille
supplémentaire ou 'relative' : 200 de plus)
On 20 mai, 22:43, heron wrote:
> > Heron: la taille passée à realloc() est une taille absolue (comme
> > malloc), pas relative! C'est super important à comprendre!
> Avec les explications et ce que vous dites, je ne suis pas sûre de
> comprendre ce que vous voulez dire par taille absolue
La taille réelle. Si tu as un bloc de 100 bytes que tu veux augmenter
à 300 (cçd 200 de plus), tu passes en paramètre de realloc() 300 (la
taille réelle demandée ou 'absolue') et non 200 (la supposée taille
supplémentaire ou 'relative' : 200 de plus)
Je comprenais que realloc était un redimensionnement, càd en partant
de dimensions initiales, on déterminait de nouvelles dimensions.
Dans les codes de ce post, il est facile de voir qu'à chaque appel,
realloc est redimensionné
et c'est la variable qui précède realloc qui
contient la nouvelle dimension je pense.
C'est visible dans les codes
plus haut. cnt * (sizeof(int))...cnt prends une valeur qui permet de
redefinir la nouvelle taille de *numbers ... à ce niveau, je n'ai pas
de difficultés.
La difficulté c'est d'utiliser malloc et realloc, comprendre à quels
moments et pourquoi les utiliser.
Dans le document de Xavier Jeannin, il dit (chapitre gestion
dynamique : classe d'allocation : )
statique : les données occupent un emplacement défini lors de la
compilation.
automatique : les données sont créées dynamiquement au fur et à
mesure
de l'exécution du pgrm, dans la pile (stack) .
dynamique : les données sont créées ou détruites à l'initia tive du
programmeur. Elle sont créées dans le tas (heap).
d'après mes connaissances :
- déclaration statique d'un tableau d'entier:
int Tableau[50] ;
- déclaration automatique (je ne suis pas très sûre) :
int Tab[50] ;
int *pTab = Tab ;
il y a aussi int *pTab[50] mais je ne suis pas sûre, c'est plus
fréquent de voir :
char *pTxt[50] ;
est-ce que c'est équivalent à :
char Txt[50];
char *pTxt = Txt ;
- déclaration dynamique (abrégé)
int *pTab = NULL ;
int i = 0 ;
i++ ;
pTab = (int *) realloc(pTab, cnt * sizeof(int) )
L'auteur dit de qui est dynamique que ça se trouve dans le heap ou
tas.
Je pensais que tout ce qui était dynamique, malloc, realloc était
toujours dans le stack ou pile.
Enfin, j'affirme sans être certain que
les pointeurs se situent toujours sur la pile (stack) car plus rapides
lors de l'exécution.
En fait, on peut lire plus loin dans le document que realloc modifie
la taille d'une zone déjà allouée. Je peux en conclure que :
int *pTab = NULL ;
est équivalent à :
int *pTab ;
pTab = (int *) malloc(0 * sizeof(int) ) ;
Je comprenais que realloc était un redimensionnement, càd en partant
de dimensions initiales, on déterminait de nouvelles dimensions.
Dans les codes de ce post, il est facile de voir qu'à chaque appel,
realloc est redimensionné
et c'est la variable qui précède realloc qui
contient la nouvelle dimension je pense.
C'est visible dans les codes
plus haut. cnt * (sizeof(int))...cnt prends une valeur qui permet de
redefinir la nouvelle taille de *numbers ... à ce niveau, je n'ai pas
de difficultés.
La difficulté c'est d'utiliser malloc et realloc, comprendre à quels
moments et pourquoi les utiliser.
Dans le document de Xavier Jeannin, il dit (chapitre gestion
dynamique : classe d'allocation : )
statique : les données occupent un emplacement défini lors de la
compilation.
automatique : les données sont créées dynamiquement au fur et à
mesure
de l'exécution du pgrm, dans la pile (stack) .
dynamique : les données sont créées ou détruites à l'initia tive du
programmeur. Elle sont créées dans le tas (heap).
d'après mes connaissances :
- déclaration statique d'un tableau d'entier:
int Tableau[50] ;
- déclaration automatique (je ne suis pas très sûre) :
int Tab[50] ;
int *pTab = Tab ;
il y a aussi int *pTab[50] mais je ne suis pas sûre, c'est plus
fréquent de voir :
char *pTxt[50] ;
est-ce que c'est équivalent à :
char Txt[50];
char *pTxt = Txt ;
- déclaration dynamique (abrégé)
int *pTab = NULL ;
int i = 0 ;
i++ ;
pTab = (int *) realloc(pTab, cnt * sizeof(int) )
L'auteur dit de qui est dynamique que ça se trouve dans le heap ou
tas.
Je pensais que tout ce qui était dynamique, malloc, realloc était
toujours dans le stack ou pile.
Enfin, j'affirme sans être certain que
les pointeurs se situent toujours sur la pile (stack) car plus rapides
lors de l'exécution.
En fait, on peut lire plus loin dans le document que realloc modifie
la taille d'une zone déjà allouée. Je peux en conclure que :
int *pTab = NULL ;
est équivalent à :
int *pTab ;
pTab = (int *) malloc(0 * sizeof(int) ) ;
Je comprenais que realloc était un redimensionnement, càd en partant
de dimensions initiales, on déterminait de nouvelles dimensions.
Dans les codes de ce post, il est facile de voir qu'à chaque appel,
realloc est redimensionné
et c'est la variable qui précède realloc qui
contient la nouvelle dimension je pense.
C'est visible dans les codes
plus haut. cnt * (sizeof(int))...cnt prends une valeur qui permet de
redefinir la nouvelle taille de *numbers ... à ce niveau, je n'ai pas
de difficultés.
La difficulté c'est d'utiliser malloc et realloc, comprendre à quels
moments et pourquoi les utiliser.
Dans le document de Xavier Jeannin, il dit (chapitre gestion
dynamique : classe d'allocation : )
statique : les données occupent un emplacement défini lors de la
compilation.
automatique : les données sont créées dynamiquement au fur et à
mesure
de l'exécution du pgrm, dans la pile (stack) .
dynamique : les données sont créées ou détruites à l'initia tive du
programmeur. Elle sont créées dans le tas (heap).
d'après mes connaissances :
- déclaration statique d'un tableau d'entier:
int Tableau[50] ;
- déclaration automatique (je ne suis pas très sûre) :
int Tab[50] ;
int *pTab = Tab ;
il y a aussi int *pTab[50] mais je ne suis pas sûre, c'est plus
fréquent de voir :
char *pTxt[50] ;
est-ce que c'est équivalent à :
char Txt[50];
char *pTxt = Txt ;
- déclaration dynamique (abrégé)
int *pTab = NULL ;
int i = 0 ;
i++ ;
pTab = (int *) realloc(pTab, cnt * sizeof(int) )
L'auteur dit de qui est dynamique que ça se trouve dans le heap ou
tas.
Je pensais que tout ce qui était dynamique, malloc, realloc était
toujours dans le stack ou pile.
Enfin, j'affirme sans être certain que
les pointeurs se situent toujours sur la pile (stack) car plus rapides
lors de l'exécution.
En fait, on peut lire plus loin dans le document que realloc modifie
la taille d'une zone déjà allouée. Je peux en conclure que :
int *pTab = NULL ;
est équivalent à :
int *pTab ;
pTab = (int *) malloc(0 * sizeof(int) ) ;
int *pTab = malloc (0 * sizeof *pTab ) ;
Pour ça, il faudrait être certain que le comportement de malloc(0)
soit bien défini par le C, ce dont je ne suis pas sûr. A vérifier dans
une doc de référence (et non une doc d'implémentation). Je te laisse
le faire ...
int *pTab = malloc (0 * sizeof *pTab ) ;
Pour ça, il faudrait être certain que le comportement de malloc(0)
soit bien défini par le C, ce dont je ne suis pas sûr. A vérifier dans
une doc de référence (et non une doc d'implémentation). Je te laisse
le faire ...
int *pTab = malloc (0 * sizeof *pTab ) ;
Pour ça, il faudrait être certain que le comportement de malloc(0)
soit bien défini par le C, ce dont je ne suis pas sûr. A vérifier dans
une doc de référence (et non une doc d'implémentation). Je te laisse
le faire ...
Alors si je comprends les bases, en fait je ne vais pas à tatons mais
les cours n'abordent pas tout les aspects de la gestion dynamique et à
mon niveau je vois 2 aspects du recours à la gestion dynamique :
1-
char *Txt[50] ; /* réservation d'un tableau de 50 lignes ou 50
chaînes? */
char LongeurLigne[100] ; /* longueur d'une ligne */
...
for ( i = 0 ; i < 50 ; i++ ) {
fgets(Txt, 50, stdin) ;
Txt[i] = (char*) malloc(strlen(LongueurLigne)+1)
if (Txt[i] )
strcpy(Txt[i], LongueurLigne) ; /* l'allocation */
else /* quitter */
...
}
...
Le gain de l'allocation dynamique d'un tableau de 50 lignes pour une
longueur maximale de 100 caractères par ligne serait d'économiser de
l'espace mémoire sur la longeur d'une ligne au lieu de déclarer :
char Txt[50][100] ;
Par contre l'inconvénient d'après moi est qu'on doit avoir une idée du
nombre de ligne sans quoi on ne peux pas modifier facilement *Txt
2-
Par contre avec :
char *chaine = 0 ;
while...
chaine = realloc(chaine, (i+1) * sizeof(char) ) ;
dans ce cas, on peut mettre en mémoire autant de ligne qu'il y a de
place en mémoire
De ces 2 cas que j'ai pu comprendre après avoir lu de nombreux cours
sur le sujet, le K&R n'est pas très bavard à ce sujet ni d'autres
ouvrage. Les recherches sur Internet font surtout apparaître le 1er
cas.
Le 2ème cas me semble avoir plus d'impact d'après ce qu'on attend de
la gestion dynamique et surtout de la flexibilité sur une déclaration
statique (aucune limite de saisie).
Là encore, je ne suis pas sûre de bien comprendre.
Alors si je comprends les bases, en fait je ne vais pas à tatons mais
les cours n'abordent pas tout les aspects de la gestion dynamique et à
mon niveau je vois 2 aspects du recours à la gestion dynamique :
1-
char *Txt[50] ; /* réservation d'un tableau de 50 lignes ou 50
chaînes? */
char LongeurLigne[100] ; /* longueur d'une ligne */
...
for ( i = 0 ; i < 50 ; i++ ) {
fgets(Txt, 50, stdin) ;
Txt[i] = (char*) malloc(strlen(LongueurLigne)+1)
if (Txt[i] )
strcpy(Txt[i], LongueurLigne) ; /* l'allocation */
else /* quitter */
...
}
...
Le gain de l'allocation dynamique d'un tableau de 50 lignes pour une
longueur maximale de 100 caractères par ligne serait d'économiser de
l'espace mémoire sur la longeur d'une ligne au lieu de déclarer :
char Txt[50][100] ;
Par contre l'inconvénient d'après moi est qu'on doit avoir une idée du
nombre de ligne sans quoi on ne peux pas modifier facilement *Txt
2-
Par contre avec :
char *chaine = 0 ;
while...
chaine = realloc(chaine, (i+1) * sizeof(char) ) ;
dans ce cas, on peut mettre en mémoire autant de ligne qu'il y a de
place en mémoire
De ces 2 cas que j'ai pu comprendre après avoir lu de nombreux cours
sur le sujet, le K&R n'est pas très bavard à ce sujet ni d'autres
ouvrage. Les recherches sur Internet font surtout apparaître le 1er
cas.
Le 2ème cas me semble avoir plus d'impact d'après ce qu'on attend de
la gestion dynamique et surtout de la flexibilité sur une déclaration
statique (aucune limite de saisie).
Là encore, je ne suis pas sûre de bien comprendre.
Alors si je comprends les bases, en fait je ne vais pas à tatons mais
les cours n'abordent pas tout les aspects de la gestion dynamique et à
mon niveau je vois 2 aspects du recours à la gestion dynamique :
1-
char *Txt[50] ; /* réservation d'un tableau de 50 lignes ou 50
chaînes? */
char LongeurLigne[100] ; /* longueur d'une ligne */
...
for ( i = 0 ; i < 50 ; i++ ) {
fgets(Txt, 50, stdin) ;
Txt[i] = (char*) malloc(strlen(LongueurLigne)+1)
if (Txt[i] )
strcpy(Txt[i], LongueurLigne) ; /* l'allocation */
else /* quitter */
...
}
...
Le gain de l'allocation dynamique d'un tableau de 50 lignes pour une
longueur maximale de 100 caractères par ligne serait d'économiser de
l'espace mémoire sur la longeur d'une ligne au lieu de déclarer :
char Txt[50][100] ;
Par contre l'inconvénient d'après moi est qu'on doit avoir une idée du
nombre de ligne sans quoi on ne peux pas modifier facilement *Txt
2-
Par contre avec :
char *chaine = 0 ;
while...
chaine = realloc(chaine, (i+1) * sizeof(char) ) ;
dans ce cas, on peut mettre en mémoire autant de ligne qu'il y a de
place en mémoire
De ces 2 cas que j'ai pu comprendre après avoir lu de nombreux cours
sur le sujet, le K&R n'est pas très bavard à ce sujet ni d'autres
ouvrage. Les recherches sur Internet font surtout apparaître le 1er
cas.
Le 2ème cas me semble avoir plus d'impact d'après ce qu'on attend de
la gestion dynamique et surtout de la flexibilité sur une déclaration
statique (aucune limite de saisie).
Là encore, je ne suis pas sûre de bien comprendre.