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
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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)»
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 :
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...
bonjour,
"Bajou" <bajou123@yahoo.fr> a écrit dans le message de news:
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)»
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 :
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...
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)»
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 :
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
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 :
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" !!!! ?
On 28 mar, 19:22, "alex" <alexandre_21000@hotmail.fr> wrote:
bonjour,
"Bajou" <bajou123@yahoo.fr> a écrit dans le message de news:
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 :
N doit donc être une expression constante, comme
int const N=10;
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" !!!! ?
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 :
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
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 *****) :
matrice M(3,5) ; // allocation automatique des deux dimensions : cool ! M[0][0];// accès via [] comme pour les tableaux "C"
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 *****) :
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 *****) :
matrice M(3,5) ; // allocation automatique des deux dimensions : cool ! M[0][0];// accès via [] comme pour les tableaux "C"
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 *****) :
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
On Mar 29, 8:43 pm, "alex" <alexandre_21...@hotmail.fr> 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 *****) :
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:james.kanze@gmail.com
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
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 *****) :
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