Allocation dynamique dans une fonction

cs_Veovis Messages postés 3 Date d'inscription dimanche 8 juin 2003 Statut Membre Dernière intervention 16 octobre 2004 - 16 oct. 2004 à 19:02
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 - 18 oct. 2004 à 16:27
Salut,

Toujours dans mon projet de TP, j'ai un petit soucis avec l'allocation dynamique dans une fonction. Ce que je voudrais faire c'est quand le tableau est plein le copier dans un nouveau tableau, supprimer le tableau et le recréer en plus grand, puis y remettre toutes les informations.

Si je mets les lignes présents dans la fonction, dans ma fonction main (tout marche impeccablement bien). Mais quand elle est dans ma fonction allocation() le programme ne marche plus.

Thanks pr les reponses.

Voici un bout de mon code :

class tableau {
private:
char nom[32];
int pointeur;

};

int n=2;
int nb=0;
int v;
tableau* tab;
tableau* t;

void* allocation();

void* allocation() {

for(int j=0;j<=n;j++) {
t[j].cpy(tab[j].return_nom(),tab[j].return_pointeur());
}

delete []tab;
tab=NULL;
v=n;
n=n+n;

tab=new tableau[n];

for(int m=0;m<=v;m++) {
tab[m].cpy(t[m].return_nom(),t[m].return_pointeur());
}
delete []t;
t=NULL;

}

int main() {
tab=new tableau[n];

if(n==i) allocation();

return 0;

}

5 réponses

Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
16 oct. 2004 à 21:36
Euh, c'est un bout de code ?
Fodra que tu m'expliques pourquoi tu définis nom et pointeur comme private déja...ça allourdis le prog paske ça t'oblige à passer par des fonctions d'interface ==> surcharge de pile pour rien même si ça "protège" les données....enfin..

Sinon, sans vouloir critiquer mais juste pour améliorer ton code, ça, ça m'horripile : tableau* tab;
Un pointeur doit TOUJOURS recevoir une adresse !
Donc la syntaxe est: tableau* tab NULL et apres tu le redéfinis dans main comme tu l'as fait ac tab new tableau(n) (des parentheses, pas des crochets!! sauf si t'as surchargé l'opérateur [])

sinon, ça : void* allocation() <<< tu m'expliques ? la fct ne retourne rien alors pourquoi un tye void* et pas void tout court ?

sinon ton algo est compliqué et comme y manque la moitié de la source, jvois aps cmt remédier au probleme....si ça marchait sans utiliser une class, le probleme vient de l'allocation dynamique qq part dans la définition de ta classe...

Genda67, à votre service !
0
plus_plus_fab Messages postés 232 Date d'inscription vendredi 9 janvier 2004 Statut Membre Dernière intervention 8 janvier 2005
17 oct. 2004 à 12:45
salut,

bon, c'est clair que le code est incomplet ou dans le désordre ou surement les deux !
donc impossible de t'aider ...

par contre pour l'encapsulation des données, ça ne surchage aucunement la pile. Ca provoque juste des appels de fonction supplémentaires, et si le temps d'exécution des fonctions est du meme ordre que le cout de leurs appels, tu les définis inline.

pour les pointeurs, c'est pas une obligation de les initialiser, tant que tu ne t'en sers pas avant de leurs avoir affecter une adresse. D'ailleurs on utilise jamais le macro NULL en C++ (uniquement en C).
Si on fait tab = new tableau[n], on construit une tableau de n éléments "tableau" en utilisant le constructeur par défaut.
tab = new tableau(n), on construit un élément "tableau" en utilisant le constructeur approprié (à un paramètre du type de n).

++
0
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
17 oct. 2004 à 12:48
Oui, c''est vrai plus_plus_fab, je suis d'accord avec toi (merci de me corriger :)), juste un truc ou je proteste toujours : les fonctions se servent de la pile !!! :-)

Genda67, à votre service !
0
plus_plus_fab Messages postés 232 Date d'inscription vendredi 9 janvier 2004 Statut Membre Dernière intervention 8 janvier 2005
17 oct. 2004 à 13:45
oui exact, mon commentaire est moyen ...
l'utilisation de la pile pour l'appel de fonction a un cout vraiment moindre quand meme ! Et si on juge que c'est couteux (ie du meme ordre que le cout d'execution de la fonction elle meme), on la définit inline, et hop ! plus d'appel de fonction (dans la tres grande majorité des cas).
0

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

Posez votre question
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
18 oct. 2004 à 16:27
en c++

NULL == 0, d'ailleur NULL n'est pas definie, si tu veux l'utiliser
definie la macros NULL 0

en c

NULL <-> ((void*)0) ou 0, la macros ets la pour ca

en c

void* et ses conversions implicites sert de type générique

en c++

ca sert à caster inutilement et à foutre la merde

en c99 comme en c++, les petites fonctions dont la définition est connue sont inliner à la compilation
0
Rejoignez-nous