1

Bonjour : petit problème
Pourquoi quand je fais ça je n'ai aucune erreur...

int n=2;
float **z;
z=new float*[n];
for (i=0;i<n;i++)
z[i]=new float[n];


et quand je fais ça j'ai cette erreur : error: taille d'un nouveau tableau (new) doit avoir un type


int n=2;
double N;
N=pow(2,n);
float **z;
z=new float*[N];
for (i=0;i<N;i++)
z[i]=new float[N];


En gros je passe d'une declaration de tableau en dynamique de n par n a une declaration de 2^n par 2^n ...
Merci

2

La taille d'un tableau doit être entière. Tu ne peux pas avoir un tableau de 2.5 cases. Même si dans ton code la taille est entière, le compilateur ne le sait pas. La fonction pow renvoie un double, donc le compilateur pense qu'il est possible que la valeur retournée ne soit pas entière.
int N = 1<<n;
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

3

ok ... et est ce possible alors de convertir un double en un int ?

4

Oui : (int)N.
Mais je te conseille d'utiliser mon code, il est plus efficace.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

5

Ouais merci ta soluce marche bien mais j'ai quand meme un warning...
algo_3d.cpp:45: attention : converting to `int' from `double'

6

Quelle solution tu utilises ?
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

7

la tienne

8

Celle du post ./2 ou ./4 ?
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

9

Au fait, je te conseille de lire un bouquin sur le C (ou le C++, comme tu veux), tu comprendras mieux ce que tu écris.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

10

post /1

Pour le bouquin...j'ai déja pas mal de cours a lire (ou plutot relire) et j'avoue que la programmation n'est pas vraiment mon point fort ;-)

11

Marrant. Essaie int N = (int)(1<<n);
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

12

ouais bah ça change rien...

13

Normal en fait.
Tu peux me montrer ton code exact, en précisant la ligne qui génère le warning ?
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

14

#include <stdlib.h>
#include <time.h>
#include <iostream.h>
#include <math.h>


float rando()
{
float a,b;
srand(time(NULL));
a=(rand()%1000000);
b=a/1000000;
return b;
}


int main()
{
// -------Constantes---------

const int n=3; //nombre d'tapes
int N=1<<n;
int i,j;
float r=1.53;// Coefficient de rugosité

float niv_base=0;
//int nc,nb_pt,nb_new_pt,l,c;
//int pas;
//float moy;


//Déclaration et allocation de la taille du tableau 2D en fonction du nombre d'itérations.
N=pow(2,n); C'est que se produit le warning
float **z;
z=new float*[N];
for (i=0;i<=N;i++)
z[i]=new float[N];

cout<<"val de N "<<N<<endl;


// -----Initialisations-------

//Points de départ
z [0 [0=(rando()-0.5)*r+niv_base;
z[0[N]=(rando()-0.5)*r+niv_base;
z[N][0=(rando()-0.5)*r+niv_base;
z[N][N]=(rando()-0.5)*r+niv_base;


for (i=0;i<=N;i++)
{
cout<<endl;
for (j=0; j<=N; j++)
{

z[i][j]=1;
cout<<z[i][j]<<" ";

}
}
return 0;
}


apres compilation :

cd /mnt/Datas/cpe/Informatique/Synthese d'images/paysage aleatoire/
make -k
g++ -c -o algo_3d.o algo_3d.cpp
Dans le fichier inclus partir de /usr/include/c++/3.3/backward/iostream.h:31,
partir de algo_3d.cpp:3:
/usr/include/c++/3.3/backward/backward_warning.h:32:2: attention : #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <sstream> instead of the deprecated header <strstream.h>. To disable this warning use -Wno-deprecated.
algo_3d.cpp: Dans function int main() :
algo_3d.cpp:45: attention : converting to `int' from `double'
g++ algo_3d.o -o algo_3d -lglut -lm

15

Evidemment... Il faut virer la ligne N = pow(2,n);
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

16

(aujourd'hui je suis bien luné, je vais tout bien espliquer happy)

Deja, ta premiere erreur vient du fait que le compilateur refuse d'allouer un tableau avec un type non-entier (dans ton exemple, N est declaré comme double) : tu ne peux pas allouer un tableau de 3.1 éléments, donc plutot que de faire une cuisine dans ton dos pour essayer d'arrondir vers l'entier le plus proche ou un truc comme ca, le compilateur refuse au cas ou tu te serais trompé smile

A partir de la la solution la plus simple (mais la moins bonne, je vais expliquer pkoi) serait de tout simplement declarer N comme entier, et de remplacer l'affectation N = pow(2,n) par N = (int)pow(2,n). Mais ce n'est pas une bonne solution, parce que pow() est une fonction qui convertit d'abord ses arguments en flottant (type 'double'), puis qui fait des calculs sur les flottants, renvoie un flottant, et le '(int)' devant le pow convertit ce flottant en entier. Tout ca, non seulement c'est beaucoup de travail pour le pauvre petit processeur (mais ca, ca n'est pas forcement grave), mais surtout les conversions entier->flottant ont des gros risques d'erreurs d'arrondi! A ce moment-la, tu te dis "pas grave, qu'est-ce qu'une erreur de 0.001 sur pow(2,5)=32 pourrait bien faire ?" Hé ben pas de chance, les arrondis en C/C++ se font vers 0 : ca veut dire que si pow(2,n) te renvoie 31.999, alors N va valoir 31 et pas 32! Ca, ca veut dire que ton programme risque de planter, ou pire de renvoyer un resultat faux, ou encore pire d'avoir une faille de sécurité qu'un pirate pourrait exploiter couic (note : je ne dis pas que ca arrivera tout le temps, c'est probable que (int)pow(2,5) te renvoie 32 et pas 31, mais rien n'empeche qu'un jour en changeant de compilateur par exemple ca se mette a te renvoyer 31 sans que tu n'aies rien fait!)

Moralité : ne jamais passer par des flottants a moins d'avoir une tres bonne raison de le faire. Mais alors comment faire dans ce cas precis ? C'est tres simple, pour un ordinateur calculer des puissances de 2 (et meme, plus generalement, multiplier par une puissance de 2) c'est tres facile : comme il calcule en binaire, il suffit qu'il ecrive en binaire un '1' avec cinq '0' apres pour calculer 2^5 (de meme que comme nous on calcule en base dix, 10^5 = 100000 s'ecrit '1' avec cinq '0' apres). Et il y a un operateur special pour lui dire de rajouter n '0' a la fin d'un nombre : c'est << (decalage a gauche). Donc la on part du chiffre '1', et on rajoute n '0' derriere : ca fait (1<<n) = (2 puissance n) smile Donc la c'est tres simple, il suffit d'ecrire N = 1<<n et c'est fini ^^ (et la tu n'auras aucun probleme d'arrondi, et en plus l'ordinateur l'executera tres rapidement)

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

17

Eh bien je crois que ton post va conclure ma soirée de programmation...en tous les cas merci a sasume et a toi de m'avoir eclairci...(c vrai que le truc du decalage en plusj'avais pas compris...)Enfin bon grace a vous je me coucherai moins con

18

ca change quand pollux est bien lunétongue

19

arg utilise les cochonerie du C++ dans un programme en C sick

(cin/cout et new sicksicksicksicksick)
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

20

./19> c'est un programme C++
(cf "g++", et nom_fichier".cpp")

par contre, il utilise les anciens Header C++, et non les récents
genre
#include <iostream.h>
au lieu de
#include <iostream>
using namespace std;
avatar
Tutorial C (TI-89/92+/v200) - Articles Développement Web (PHP, Javascript, ...)
« What is the sound of Perl? Is it not the sound of a wall that people have stopped banging their heads against? » - Larry Wall

21

a aucun endroit du code donné le C++ n'est utile

on fait exactement la meme chose avec un compilo C en nettoyant ces saletées (et c'est aps OpenGL qui force a faire du C++ loin de la)

la plupars du temps ceux qui utilise un copilo spécifiquement C++ c'est pour utiliser cin/cout les trucs de fénéants (ou new et delete)

a savoir que new ne fait pas que allouer la taille des données demandés (contrairement a malloc) utiliser une syntaxe purement C++ (et encore certaines choses bien sale a la cin/cout on peu s'en passer largement) sont quand on fait de l'objet, le "++" quoi sinon bof bof
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

22

si il doit faire ca pour son école, c'est possible qu'ils apprennent uniquement le C++ (plutot que d'apprendre le C et "perdre du temps" a migrer vers le C++ apres), donc il utilise les allocations "style C++", meme si il n'utilise pour l'instant que les possibilités du C... c'est un choix discutable (etant donne que C++ a un lourd heritage de C, c'est utile de connaitre C pour voir pourquoi tel comportement bizarre a ete choisi), mais compréhensible s'ils n'ont par exemple pas assez d'heures de cours pour tout voir...

maintenant je ne sais pas du tout quel est le contexte, et effectivement s'il fait ca en autodidacte ce serait mieux de faire du C avant (mais bon c'est pas ce que laisse supposer ./10 ^^)

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

23

Certe et j'en connais qui on commencé l'année par du C++ pour finir l'année avec le C et je trouve ça completement illogique :/
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

24

Ne vous emballez pas !! je sais tres bien que ce programme est tres tres tres tres loin d'etre parfait....C'est vrai que j'ai commencé mes études par du C++ pour etre passé seulement cette année au C donc j'ai légèrement plus l'habitude du C++. Quand au choix d'utiliser plutot du C++ que du C, je crois que c'est essentiellement influencé par ce choix.
Toutes lse critiques ne me dérangent absolument pas, au contraire elles me font progresser donc vous pouvez bien dire ce que voulez.
Ce programme est tres loin d'etre fini donc si vous voulez critiquer je vous conseille d'attendre qu'il soit fini et je le posterai si ça vous fait plaisir, ça sera plus interessant pour moi et pour vous en fait

Voila sur ce amusez-vous bien wink