Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

allocation dynamique

4 réponses
Avatar
Bajou
Bonjour,
J'ai d=E9velopp=E9 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=E9moire.
Voila l'erreur:
:kmeans.cpp:(.text+0x727): r=E9f=E9rence ind=E9finie vers =AB operator new[]
(unsigned int)=BB

et voila le code ou j'utilise l'op=E9rateur new:

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

int **sec;

sec=3Dnew int *[P];

for( i=3D0;i<P;i++) sec[i]=3Dnew int[N];



int secg[N],sec1[N];

float eval[P];



float max[M],min[M];

float ***G;

G=3Dnew float **[P];

for(i=3D0;i<P;i++) G[i]=3Dnew float *[M];

for(i=3D0;i<P;i++)

{

for(int j=3D0;j<M;j++) G[i][j]=3Dnew float[NC];

}



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

C'est un probleme de portabilit=E9??? de C ansi???
Qu'est ce que je doit =E9crire pour corriger???
Merci d'avance

4 réponses

Avatar
alex
bonjour,

"Bajou" a écrit dans le message de news:

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...


Avatar
Bajou
On 28 mar, 19:22, "alex" wrote:
bonjour,

"Bajou" a écrit dans le message de news:

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" !!!! ?



Avatar
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.
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"

Avatar
James Kanze
On Mar 29, 8:43 pm, "alex" wrote:
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