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

Tableaux C++

Pixcoder
Pixcoder
Niveau 4
06 mars 2006 à 21:56:57

Salut,

quand j´essaie de créer un tableau en C++ à partir d´une variable entière, le compilateur (Visual C++, je viens de changer) me sort une erreur :

Voici le code :

float carre_longueur [mesh[indice_mesh].nb_points] [mesh[indice_mesh].nb_points];

Voici les erreurs :

c:\Documents and
Settings\Pix\Bureau\Shaders\Visual_Shaders\Moteur3
D\objet3d.cpp(717) : error C2057: expression de constante attendue
c:\Documents and
Settings\Pix\Bureau\Shaders\Visual_Shaders\Moteur3
D\objet3d.cpp(717) : error C2466: impossible d´allouer un tableau de taille constante 0
c:\Documents and
Settings\Pix\Bureau\Shaders\Visual_Shaders\Moteur3
D\objet3d.cpp(717) : error C2057: expression de constante attendue
c:\Documents and
Settings\Pix\Bureau\Shaders\Visual_Shaders\Moteur3
D\objet3d.cpp(717) : error C2466: impossible d´allouer un tableau de taille constante 0
c:\Documents and
Settings\Pix\Bureau\Shaders\Visual_Shaders\Moteur3
D\objet3d.cpp(717) : error C2087: ´carre_longueur´ : indice manquant
c:\Documents and
Settings\Pix\Bureau\Shaders\Visual_Shaders\Moteur3
D\objet3d.cpp(717) : error C2133: ´carre_longueur´ : taille inconnue

Je comprends bien qu´il faut mettre une constante entière lors de la déf du tableau, mais on ne peut vraiment pas faire ca autrement?? J´aimerais avoir mesh[indice_mesh].nb_points² emplacements dans le tableau...

Merci de m´aider!! :)

PiX

guyver2
guyver2
Niveau 10
06 mars 2006 à 22:12:57

il faut absolument une constante pour declarer de maniere statique un tableau. pour faire ce que tu veux utilise malloc ou new
float* carre_longueur=(float*) malloc((mesh[indice_mesh].nb_points+ mesh[indice_mesh].nb_points)*sizeof(float));
ou
float* carre_longueur= new float(mesh[indice_mesh].nb_points+ mesh[indice_mesh].nb_points);

l´exemple ci dessous compile:

  1. include <stdlib.h>

int main()
{
int toto;
float* carre_longueur= new float(toto);
float* carre_lon=(float*) malloc((toto)*sizeof(float));

return 1;
}

dnob700
dnob700
Niveau 10
06 mars 2006 à 22:20:08

est ce que tu programme en C, ou en C++ ? (ou tu t´en fout, auquel cas, la bonne réponse est C++)

guyver2
guyver2
Niveau 10
06 mars 2006 à 22:31:18

oula je m´appercoit que j´ai mis un peu n´importe quoi:
mon code est valable pour des tableau a 1 dimension et tu voulais un tableau a 2 dimension

donc voila.

  1. include <stdlib.h>
  2. include <stdio.h>

int main()
{
int toto=40;

float* carre_longueur[2];
carre_longueur[0] = new float(toto);
carre_longueur[1] = new float(toto);

float* carre_lon[2];
carre_lon[0]=(float*) malloc((toto)*sizeof(float*));
carre_lon[1]=(float*) malloc((toto)*sizeof(float*));

int i=0,j=0;
while (i<2)
{
j=0;
while (j<40){
carre_longueur[i][j]=i*j;
carre_lon[i][j]=i*j;
j++;
}
i++;
}

for (i=0;i<2;i++)
{
for (j=0;j<40;j++)
{
printf("i= %d j= %d => t1 %f t2 %f\n",i,j,carre_longueur[i][j],carre_lon[i][j]);
}
}
system("pause");
return 1;
}

il y a la methode C (malloc) et C++ (new)

Poulpix
Poulpix
Niveau 6
06 mars 2006 à 23:22:10

int a = mesh[indice_mesh].nb_points;

float carre_longueur [a][a];

Essaie ca au pire

JeanYvesYves
JeanYvesYves
Niveau 10
06 mars 2006 à 23:26:20

Haha !! ! Ton raisonnement est tres bon Pixcoder. Ta question te montre l´utilité de l´allocation dynamique, en te mettant typiquement devant un probleme d´allocation :)

tellement de monde ne comprennent pas l´utilité de l´allocation dynamique, toi au moins, tu as été mis au pied du mur, et tu comprendras bien mieux que d´autres son utilité :)

Pixcoder
Pixcoder
Niveau 4
07 mars 2006 à 12:01:08

Merci de vos réponses!

dnob : je code en C++. En C ce genre de choses marche, je crois! En plus c´est simplement avec Visual C++ que ce genre de déclaration de tableaux ne marche pas! Sous Dev C++ ça fonctionne.

poulpix : j´ai essayé, ça ne marche pas! :)

Je vais faire d´autres essais avec le code de guyver2, je reviens! :)

PiX

JeanYvesYves
JeanYvesYves
Niveau 10
07 mars 2006 à 12:27:53

Dev C++ te permet d´écrire ?

int tab[n];
avec un n choisi ?

Ce n´est pas normal, et pas normalisé, pas ANSI. C´est interdit en, C++, ça :)

Passe par les pointeurs :)
(ou alors le std::vector si tu veux rester statique)

[LoCkLeSs]
[LoCkLeSs]
Niveau 10
07 mars 2006 à 12:43:51

lockless@tekone ~/Desktop $ cat test.c

  1. include <stdio.h>

int main()
{
int n = 4;
int tab[n];

tab[0] = 45;
return 0;
}
lockless@tekone ~/Desktop $ gcc -Wall -ansi test.c
lockless@tekone ~/Desktop $

Je confirme, ça marche gcc même avec l´option ansi, ça me parait bizarre à moi aussi :-\

Pixcoder
Pixcoder
Niveau 4
07 mars 2006 à 13:27:25

voui Lockness, ça je crois que c´est normal.

Par contre JeanYvesYves, comment faire avec les pointeurs? parce que je peux faire par exemple

float *tab = new float[N];

mais si N n´est pas une constante, Visual C++ me sort la même erreur , non?

PiX

[LoCkLeSs]
[LoCkLeSs]
Niveau 10
07 mars 2006 à 14:29:11

Ben normalement non, puisque l´interet c´est de créer des tableaux de manière dynamique.

godrik
godrik
Niveau 30
07 mars 2006 à 15:32:47

lockless, en C c´est autorisé mais pas en C++.

Pixcoder, je te conseille de lire le tuto de jyy (URL disponible sur sa carte de visite.). non, visual ne te sortira pas d´erreur, c´est justenet l´interet de l´allocation dynamique.

guyver2
guyver2
Niveau 10
07 mars 2006 à 16:26:51

c´est pas
float *tab = new float[N];
mais
float *tab = new float(N);

avec des parentheses et pas des crochets.
Tu confond allocation dynamique et tableaux statiques

dnob700
dnob700
Niveau 10
07 mars 2006 à 16:30:01

non non, c´est bien des crochets là aussi.

Pour l´allocation avec une variable, on en a parlé il y a peu de temps, et il semblerait que ce soit autorisé dans certain cas très précis. Mais esasye de compiler :

int n;
cin >> n;
int t[n];
et je ne crois pas que ça va marcher.

[LoCkLeSs]
[LoCkLeSs]
Niveau 10
07 mars 2006 à 16:43:15

Ben si ça compile justement, j´ai essayé en C avec gcc, et en C++ avec g++, et ça marche pour les deux cas :-\

Pixcoder
Pixcoder
Niveau 4
07 mars 2006 à 16:45:10

voui ca marche sous DevCpp en tout cas, je ne pense pas que ca marche sous visual... je vais voir

Arf, j´ai vraiment l´impression de redevenir un vrai novice :p bon j´exagère en disant ca! :)

Pixcoder
Pixcoder
Niveau 4
07 mars 2006 à 16:51:16

Sous Visual, ca ne compile pas! Et j´ai remplacé par un new, et ca marche...

Voilà! :) c´est résolu (enfin, dans le sens où le pb est localisé)! après faut voir pkoi Dev ne respecte pas les normes....

guyver2
guyver2
Niveau 10
07 mars 2006 à 16:52:38

non non, c´est bien des crochets là aussi.

autant pour moi je vien d´essayer et les 2 compilent sans pb...

( float *tab = new float[N];
et
float *tab = new float(N); )

JeanYvesYves
JeanYvesYves
Niveau 10
07 mars 2006 à 16:59:41

Attention a la sémantique de ces 2 syntaxes : c´est un probleme tres vicieux :)

float *tab = new float[N];
et
float *tab = new float(N);

Le premier crée un tableau de float, de N éléments.
Le second est a éviter absolument :

Il crée un double dynamique (UN SEUL !! !) donc l´adresse est tab
Il est la meme chose que :

float* tab = new float;

a un bémol pres : il appelle un constructeur, ce constructeur de int (car N est un int) pour float, est casté, et la valeur de N est donnée au float.

Concretement, si vous faites la deuxieme syntaxe (avec les parentheses)
tab[1] -> Hors de tableau, risque de plantage !!
tab[0] = N.

guyver2
guyver2
Niveau 10
07 mars 2006 à 17:24:24

ok merci pour la precision. Ca m´évitera de me trouver devant une erreur de pointeur, toujours assez spéciales a deboguer.

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