CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C++] Allocation dynamique de tableau

Aldebran
Aldebran
Niveau 10
26 janvier 2006 à 19:24:54

J´ai un pointeur *table et j´aimerais faire une fonction du genre :

void (int x, int y)
{
table = new int[x][y];
}

Mais, je ne sais pas pourquoi, Dev-C++ m´affiche ce message d´erreur à la compilation :

`y´ cannot appear in a constant-expression

Quelqu´un peut-il m´aider parce que je ne vois vraiment pas où est le problème.

Quintoff
Quintoff
Niveau 10
26 janvier 2006 à 19:28:27

Essaye de déclarer tes variables x et y constantes dans ta liste de paramètres .

sangohan42
sangohan42
Niveau 9
26 janvier 2006 à 20:04:08

j´aurais dis la meme chause tu met const

Virtuality
Virtuality
Niveau 8
26 janvier 2006 à 20:06:10

Seul X peut être variable, ceux qui suivent doivent être constant.
Du moins c´est ce dont je me souvient, c´était p´tet un autre cas.
Pour tester, remplace y par un nombre...

Virtuality
Virtuality
Niveau 8
26 janvier 2006 à 20:07:12

Pour préciser je parle pas des arguments de la fonction mais bien de l´allocation de mémoir elle même.
Exemple :
table = new int[x][10];

Je le répète, il se peut que je me gourre totalement :p)

Virtuality
Virtuality
Niveau 8
26 janvier 2006 à 20:27:34

Ha, ben non, j´avais raison, j´ai retrouvé la phrase que je cherchais :-)
D´après le cours de christian casteyde :

"Toutefois, seule la première dimension du tableau peut être variable, et les dimensions deux et suivantes doivent avoir une taille entière positive et constante. Par exemple, seule la deuxième ligne de l´exemple qui suit est une allocation dynamique de tableau valide :"

Comme solution il propose :
"Si l´on désire réellement avoir des tableaux dont plusieurs dimensions sont de taille variable, on devra allouer un tableau de pointeurs et, pour chaque ligne de ce tableau, allouer un autre tableau à la main."

J´espère que ça t´aidera :)

Quintoff
Quintoff
Niveau 10
26 janvier 2006 à 20:30:35

Mais si il décrale y constant ça devrait aller non? :doute:

Quintoff
Quintoff
Niveau 10
26 janvier 2006 à 20:30:50

Euh déclare pardon ^^

Virtuality
Virtuality
Niveau 8
26 janvier 2006 à 20:34:35

non, car ca signifie simplement que la variable pourra pas être modifé, hors, lors de l´allocation, c´est pas une question de variable constante ou pas, mais il doit s´agir bien d´un nombre.
Exemple :

int test_table(int x, int y)
{
int (*table)[4] = new int[x][4];
table[2][3]=2;
return table[2][3];
}

int main(void)
{
cout << test_table(3,4) << endl;
system("PAUSE");
}

Ce code marche parfaitement, hors si tu fait ta fonction test_table ainsi :

int test_table(int x, const int y)
{

int (*table)[4] = new int[x][y];
table[2][3]=2;
return table[2][3];
}

Ta variable y sera bien constante, mais ton allocation échouera et t´affichera la même erreur que si y n´était pas constant...
La profonde raison, je crois pas la connaitre :-p

JeanYvesYves
JeanYvesYves
Niveau 10
26 janvier 2006 à 20:38:07

Berk ! Je ne suis pas d´accord avec ces méthodes : elles sont mis statiques mis dynamiques !
Je te conseille une allocation completement dynamique

exemple :

int** alloc(int x,int y)
{
int i;
int** res;
res = new int[x];
for(i=0;i<x;i++)
{
res[i] = new int[y];
}
return res;
}

(note que tu as un tableau a 2 entrées, donc en mémoire un pointeur vers un tableau de pointeurs (vers d´autres zones mémoire) )
donc un int** (2 étoiles)

Quintoff
Quintoff
Niveau 10
26 janvier 2006 à 20:40:20

Et après il y en a qui se demandent à quoi servent les pointeurs :p)

JeanYvesYves
JeanYvesYves
Niveau 10
26 janvier 2006 à 20:40:40

et si tu ne veux pas te faire chier avec les allocations, tu peux utiliser les stl :

  1. include <vector>

using namespace std;

vector<vector<int> > V;
V.resize(x);
for(i=0;i<V.size();i++)
V[i].resize(y);

Ensuite tu te sers de V[i][j] qui te donne un int comme tu le voulais au départ.
Et l´avantage, c´est que tu n´as pas besoin de désallouer, c´est une philosophie purement statique

Soit tu bosses en statiques, soit en dynamique
mais les

new int[x][10];

alors la, beeeerrrkk !! !

Virtuality
Virtuality
Niveau 8
26 janvier 2006 à 20:46:16

Moi je faisais que lui donner le code juste hein :-)))

Sinon c´est clair que la stl est bien plus pratique à plusieurs niveau... notemment dans ce cas.

Quintoff
Quintoff
Niveau 10
26 janvier 2006 à 20:46:25

L´utilisation des vecteus me parait quand même plus simple. Il y a des différences de performances?

Virtuality
Virtuality
Niveau 8
26 janvier 2006 à 20:50:36

Je pense pas, vu que c´est spécialement créé dans ce but, mais je vais arrêter de dire des bêtises et laisser jyy répondre :-p

Sinon, jyy, aurais-tu des ouvrages à conseiller?
J´ai entendu bcp de bien de "Accelerated C++" et aussi sur ce forum de "effective C++".
Tu connais ces ouvrages?
merci d´avance

JeanYvesYves
JeanYvesYves
Niveau 10
26 janvier 2006 à 20:52:15

non, les vectors sont tres rapides et tres simples d´utilisation.
En fait, c´est simplement un "tableau dynamique" camouflé, qui a été fait de façon a étre utilisé comme un élément statique :)
Le vector a l´avantage d´optimiser les éventuelles allocations (quand tu rajoutes des éléments avec la méthode push_back)

Attention piege :
Tu peux passer un vector en parametre dans une fonction (un peu comme si tu passais un int)
Mais si tu fais ça, le tableau est ENTIEREMENT recopié lors du passage de la fonction (en effet, un passage de base est un passage pas copie)
Donc ne pas oublier d´utiliser les passages par référence avec & (sauf si vraiment la copie est nécessaire)

JeanYvesYves
JeanYvesYves
Niveau 10
26 janvier 2006 à 20:54:30

Hélas, ma connaissance en ouvrages est tres restreinte ! j´ai chez moi le RedBook de OpenGL, un livre de chevet sur les STL, et c´est tout :)

J´avais des bouquins de basic avant, ce qui m´a permis d´apprendre l´algorithmique de façon générale (le basic que j´utilisais est completement dépassé) mais apres, quand je suis passé en pascal ou en C, je me suis servi du net, ainsi que de potes a moi passionés, puis plus tard de mes cours a la fac :-)

Quintoff
Quintoff
Niveau 10
26 janvier 2006 à 20:56:06

Merci des infos :ok:

Virtuality
Virtuality
Niveau 8
26 janvier 2006 à 20:56:48

Ok, merci, je me lance et je verrai bien ce que ça vaut (qui ne tente rien n´a rien! :) ).
Je crois que je vais commencer par "accelerated C++", et au pire, si c´est trop dur, c´est un investissement futur :p)

Quintoff
Quintoff
Niveau 10
26 janvier 2006 à 21:00:52

Perso je suis en train de lire "Tout sur le code : Pour concevoir des logiciels de qualité, dans tous les langages." et je suis très content des méthodes de conception et de "bonne" programmation qu´il m´apprend ou me rapelle :)
Mais ce n´est pas vraiment le même domaine.

Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de Jeux
  • Programmation
  • Création de sites web
  • Linux
  • Internet
  • Steam Deck
  • Hardware
La vidéo du moment