allocation dynamique

Le
Bajou
Bonjour,
J'ai développé un programme sous visual et il tourne convenablement,
mais lorsque j'ai voulu le compiler sur la machine du laboratoire
(sous lunix) j'ai eu des erreurs, et je penses que c'est au niveau de
l'allocation mémoire.
Voila l'erreur:
:kmeans.cpp:(.text+0x727): référence indéfinie vers « operator new[]
(unsigned int)»

et voila le code ou j'utilise l'opérateur new:

******************************************************

int **sec;

sec=new int *[P];

for( i=0;i<P;i++) sec[i]=new int[N];



int secg[N],sec1[N];

float eval[P];



float max[M],min[M];

float ***G;

G=new float **[P];

for(i=0;i<P;i++) G[i]=new float *[M];

for(i=0;i<P;i++)

{

for(int j=0;j<M;j++) G[i][j]=new float[NC];

}



******************************************************

C'est un probleme de portabilité??? de C ansi???
Qu'est ce que je doit écrire pour corriger???
Merci d'avance
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
alex
Le #305470
bonjour,

"Bajou"

Bonjour,

J'ai développé un programme sous visual et il tourne convenablement,
mais lorsque j'ai voulu le compiler sur la machine du laboratoire
(sous lunix) j'ai eu des erreurs, et je penses que c'est au niveau de
l'allocation mémoire.
Voila l'erreur:
:kmeans.cpp:(.text+0x727): référence indéfinie vers « operator new[]
(unsigned int)»

et voila le code ou j'utilise l'opérateur new:

******************************************************

int **sec;
sec=new int *[P];
for( i=0;i<P;i++) sec[i]=new int[N];


déjà une question : y a-t-il une bonne raison pour être si "bas niveau" et
ne pas utiliser vector ? Parce que, apparement, tu veux une matrice N,P ?
Pourquoi ne pas avoir :

std:vector< std::vector<int> > sec(P, std::vector<int>(N) ;

int secg[N],sec1[N];
N doit donc être une expression constante, comme

int const N;

float eval[P];
De même pour P.


float max[M],min[M];
Donc de même pour M...


float ***G;
3 niveaux d'indirection, ça a de quoi engendrer des erreurs, des difficultés

de lecture, etc...
Je passe le reste du code, mais AMA, ça serait + simple d'utiliser vector,
ne serais-ce que pour ne pas gérer l'allocation... Ou alors, faire une
classe tab2n, ou autre, avec un seul niveau d'indirection...


Bajou
Le #305443
On 28 mar, 19:22, "alex"
bonjour,

"Bajou"

Bonjour,

J'ai développé un programme sous visual et il tourne convenablement,
mais lorsque j'ai voulu le compiler sur la machine du laboratoire
(sous lunix) j'ai eu des erreurs, et je penses que c'est au niveau de
l'allocation mémoire.
Voila l'erreur:
:kmeans.cpp:(.text+0x727): référence indéfinie vers « operator n ew[]
(unsigned int)»
et voila le code ou j'utilise l'opérateur new:
******************************************************
int **sec;
sec=new int *[P];
for( i=0;i<P;i++) sec[i]=new int[N];


déjà une question : y a-t-il une bonne raison pour être si "bas niv eau" et
ne pas utiliser vector ? Parce que, apparement, tu veux une matrice N,P ?
Pourquoi ne pas avoir :

std:vector< std::vector<int> > sec(P, std::vector<int>(N) ;

int secg[N],sec1[N];


N doit donc être une expression constante, comme
int const N;

float eval[P];


De même pour P.

float max[M],min[M];


Donc de même pour M...

float ***G;


3 niveaux d'indirection, ça a de quoi engendrer des erreurs, des diffic ultés
de lecture, etc...
Je passe le reste du code, mais AMA, ça serait + simple d'utiliser vect or,
ne serais-ce que pour ne pas gérer l'allocation... Ou alors, faire une
classe tab2n, ou autre, avec un seul niveau d'indirection...


Merci pour la réponse
En fait, le probleme a était résolu en utilisant le compilateur g++
parceque au départ j'utilise le gcc
Je ne connais pas "vector" !!!! ?



alex
Le #305439
Merci pour la réponse
En fait, le probleme a était résolu en utilisant le compilateur g++
parceque au départ j'utilise le gcc
Je ne connais pas "vector" !!!! ?


effectivement, gcc ne compile que du C, donc "new" n'est évidemment pas
connu.
Si tu ne connais pas vector, je te conseille de te renseigner, soit avec un
bon livre sur le C++ (je n'ai pas de référence en français à te conseiller
hélas), soit en cherchant sur le web ,mais attention, il y a à boire et à
manger...

Grosso modo, vector est un conteneur, générique (c'est un template) et
standard (il est présent sur tous les implémentations C++) qui représente un
tableau. IL encapsule les allocations/réallocations/libérations nécessaires,
pour que tu n'aies pas à t'en occuper.
Exemple :

std::cout<<"Entrez la taille du tableau :";
int taille; std::cin>>taille;
std::vector<int> V(taille); // création d'un tableau d'entiers
std::cout<<"Entrez les valeurs :";
for(int i=0;i< V.size(); i++) // la méthode size() renvoie le nombre
d'éléments
std::cin>>V[i]; // accès via les [] comme un tableau "C"

et lorsque V sortira de sa portée, la mémoire allouée par son constructeur
sera libérée par son destructeur...
Et c'est encore plus simple en cas de multiples dimensions (pénibles avec
les *****) :

typedef std::vector<double> ligne;
typedef std::vector<ligne> matrice;

matrice M(3,5) ; // allocation automatique des deux dimensions : cool !
M[0][0];// accès via [] comme pour les tableaux "C"

James Kanze
Le #305416
On Mar 29, 8:43 pm, "alex"
Merci pour la réponse
En fait, le probleme a était résolu en utilisant le compilateur g++
parceque au départ j'utilise le gcc
Je ne connais pas "vector" !!!! ?


effectivement, gcc ne compile que du C, donc "new" n'est évidemment pas
connu.


Ce n'est pas tout à fait vrai. Et gcc et g++ sont des pilotes de
compilateur, non des compilateurs proprement dits, et tout les
deux invoqueront le compilateur C++ sur un fichier dont le nom
termine en .cc ou .cpp (ou .cxx ou .C aussi, je crois). En
revanche, gcc ne connaît pas plus, et ne passerait pas au
préprocesseur les options de chemin supplémentaire nécessaires
pour trouver les en-têtes C++, ni à l'éditeur de liens les
bibliothèques C++.

Si tu ne connais pas vector, je te conseille de te renseigner, soit avec un
bon livre sur le C++ (je n'ai pas de référence en français à te c onseiller
hélas), soit en cherchant sur le web ,mais attention, il y a à boire et à
manger...

Grosso modo, vector est un conteneur, générique (c'est un template) et
standard (il est présent sur tous les implémentations C++) qui repr ésente un
tableau. IL encapsule les allocations/réallocations/libérations néc essaires,
pour que tu n'aies pas à t'en occuper.
Exemple :

std::cout<<"Entrez la taille du tableau :";
int taille; std::cin>>taille;
std::vector<int> V(taille); // création d'un tableau d'entiers
std::cout<<"Entrez les valeurs :";
for(int i=0;i< V.size(); i++) // la méthode size() renvoie le nomb re
d'éléments
std::cin>>V[i]; // accès via les [] comme un tableau "C"

et lorsque V sortira de sa portée, la mémoire allouée par son const ructeur
sera libérée par son destructeur...
Et c'est encore plus simple en cas de multiples dimensions (pénibles av ec
les *****) :

typedef std::vector<double> ligne;
typedef std::vector<ligne> matrice;

matrice M(3,5) ; // allocation automatique des deux dimensions : cool !


Attention : la norme dit bien que ça doit marcher, mais je
crois qu'on discute encore si c'est exprès, ou une erreur. La
syntaxe ne s'étend pas à des dimensions supérieurs, et certains
compilateurs, je crois, ne le permettent pas. La syntaxe
réelement voulue pour une matrice serait :

matrice M( 3, ligne( 5 ) ) ;

Dans la pratique, si j'avais à utiliser les tableaux à deux
dimensions (ou plus), j'écrirais des classes pour le faire (ou
j'en trouverais tout faites sur le Web).

--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Publicité
Poster une réponse
Anonyme