Allocation statique

cs_imanewin32 Messages postés 71 Date d'inscription mardi 30 mars 2004 Statut Membre Dernière intervention 12 août 2004 - 12 août 2004 à 19:30
cs_pjb Messages postés 19 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 17 août 2004 - 16 août 2004 à 14:07
slt
je réalise une application MFC et ds une de mes classes j'ai fais l'allocation ds le constructeur de la façon:
chemain=new char[MAX_PATH+1];
comme j'ai l'habitude de faire mais on m'a proposé de faire une allocation statique vue que le nombre d'octet à allouer est tjrs fixe
j'ai pas compris ça!!!
si quelqu'un à une idée ,qu'il m'aide
merci d'avance!!!!!!!
:blush)

14 réponses

cs_imanewin32 Messages postés 71 Date d'inscription mardi 30 mars 2004 Statut Membre Dernière intervention 12 août 2004
12 août 2004 à 19:38
est ce que cela veut dire tout simplement travailler avec des tableaux de caractères
:blush)
0
cs_Arnotic Messages postés 933 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 9 janvier 2012 1
12 août 2004 à 20:19
Imagine un char szBuff[512];
Tu as un buffer de 512 octets, dans lequels tu peux te déplacer grace au pointeur (adresse qui pointe sur cette zone mémoire).

strcpy(szBuff+256, "bonjour");
MessageBox(GetFocus(), szBuff+256, "debug", 0x40);

Affiche par exemple les octets qui se trouve à la 256eme position de ton buffer jusqu'a un 0 final.

Quoi voilà après tu peux ce que tu veux dans cet espace memoire et t'y déplacer grace à un pointeur.

@+
Arnotic,
Admin CS, MVP Visual C++
0
essirc Messages postés 48 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 26 juillet 2005 3
13 août 2004 à 10:23
Salut,

Cela signifie tout simplement qu'au lieu d'avoir :

class LaClasse {
...
private :
char * chemain;
...
};

dans ta classe, tu peux écrire :

private :
char chemain[MAX_PATH + 1];

et que tu peux enlever :
chemain=new char[MAX_PATH+1];
de ton constructeur, et :

delete [] chemain; de ton destructeur

Voilà c'est tout :)

P.S : Dans les deux cas tu travailles avec des tableaux de caractères.
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
13 août 2004 à 13:27
et le constructeur de copie et l'operateur = ??
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_pjb Messages postés 19 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 17 août 2004
13 août 2004 à 18:28
une allocation statique est une allocation mémoire qui se fait en gros en entrant dans un bloc ("{ ... }"); elle est statique car les emplacements mémoires sont déjà prévus avant la compilation

ex: int i[10]; // 10 est bien une CONSTANTE

en revanche, une allocation dynamique est une allocation qui peut se produire n'importe quand dans un programme (non prévue avant compilation)

par ex:
int *n; /* ........... */
n = (int*)malloc( x * sizeof(int) ); /* x : VARIABLE (non nécessairement constante comme 10 au dessus) */

le C interdit par ex. l'allocation dynamique suivante : int i[ x ];
(même si t'as mis x = 10 juste avant avant)

(essirc donne un bon exemple ci-dessus : MAX_PATH est une constante avant la compilation car macro d'ou alloc. stat.)

@+
j'espère avoir été clair
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
13 août 2004 à 19:41
c99 autorise int i[ x ]; si x est specifier const

le cast de malloc est inutile

en dynamique on alloue sur le tas et en statique dans la pile (pour une fonction)

plutot que faire

void func()
{
char c[ MAX_PATH ];
}

pour ne pas encombrer la pile on peut faire

void func()
{
static char c[ MAX_PATH ];

}

ou

void func()
{
char *c;

c = malloc( MAX_PATH );

free(c);
}

la premiere solution est la plus performante mais la zone memoire est la meme pour chaque appel
0
cs_pjb Messages postés 19 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 17 août 2004
14 août 2004 à 13:46
1: je parle du C, et la norme ne prévoit pas de faire int i[ x ];

2: le cast de malloc est certes (souvent) inutile mais fortement conseillé pour des raisons de portabilité : certains compileurs te gètent si tu ne fais pas le cast, ou tout simplement des warnings peuvent avoir lieu...

3: "en dynamique on alloue sur le tas et en statique dans la pile (pour une fonction) [...] "
tu as tout-à fait raison, mais je ne crois pas qu' imanewin32 attendait une réponse "technique" comme celle-ci, je ne suis pas sur qu'il va la comprendre (sinon il ne poserait pas des questions comme celle-là)

@bientot
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
14 août 2004 à 16:23
"je parle du C, et la norme ne prévoit pas de faire int i[ x ];"

on parle pas de norme, le standard autorise int i[ x ]; si x est const, apres precise si tu parle de c ansi (c89) ou c99
0
cs_pjb Messages postés 19 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 17 août 2004
14 août 2004 à 18:48
tu as effectivement raison, j'ai dit une grosse annerie (je n'avais pas vu le qualifieur CONST dans ta phrase)

je voulais lui expliquer la diff entre stat. et dyn. simplement, de manière un peu vulgarisée, sans trop entrer dans tous les détails (notamment "const"), mais t'as raison de me le faire remarquer...

@bientot
0
cs_pjb Messages postés 19 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 17 août 2004
14 août 2004 à 18:48
tu as effectivement raison, j'ai dit une grosse annerie (je n'avais pas vu le qualifieur CONST dans ta phrase)

je voulais lui expliquer la diff entre stat. et dyn. simplement, de manière un peu vulgarisée, sans trop entrer dans tous les détails (notamment "const"), mais t'as raison de me le faire remarquer...

@bientot
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
15 août 2004 à 14:00
ok pas de probleme, pour le cast du malloc, je dirais juste que vu que la conversion d'un void* est implicite en c (meme si le compilo gueule, c'est un comportement illogique car void* est le type generique en c)

la seule raison de conserver le cast du malloc est pour la compatibilité en c++ (ou seul la conversion void* -> int* est implicite), mais c'est pas bien de melanger source c et c++ ;)
0
cs_pjb Messages postés 19 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 17 août 2004
15 août 2004 à 19:02
je suis d'accord ac toi...

mais je ne pensais même pas au c++ (bah que j'aime pas ça !!!, tout comme le java...), c'est juste pour éviter les warnings, ça fait désordre je trouve de créer des progs ac des warnings à foison, et je pense que bcp sont d'accord ac moi

mais c vrai qu'on ne devrait même pas avoir à le faire (je crois que même gcc chibre lorqu'on ne cast pas :(, sans vouloir dire des conneries )
ça améliore en revanche la lisibilité du programme je touve

salut !

peut être que tu vas pouvoir me dépanner ? :
quel model de mémoire est utilisé par les compilos C (notamment LCC ou GCC) ? (flat ?), car je n'arrive pas à linker deux .obj (1 ac .asm & 1 ac .C)

merci !
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
15 août 2004 à 21:07
d'apres la doc c'est flat

pour le cast du malloc, pourquoi ca te parait plus claire avec ?

ca peut meme causer des bug si tu oubli l'entete stdlib.h lors de la compilation du source
0
cs_pjb Messages postés 19 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 17 août 2004
16 août 2004 à 14:07
merci, c bien ce que je pensais, donc j'ai un autre prob... (je vais le poster ds qq jrs si je ne trouve pas). (ça m'énerve de buter sur un simple problème de liaison !!!!! qqc doit m'échapper...).

pour le cast du malloc, l'avantage est que l'on voit dirrectement quel est le type de la variable, et dans un gros programme, ça améliore un peu la lisibilité , je trouve (notamment qd t'as plein plein de variables).

j'inclus presque toujours <stdlib.h>, dc pas de prob :) .

@+
0