Comment renvoyer un tableau en C++ ??
Fermé
pom
-
10 janv. 2005 à 10:19
tafiscobar Messages postés 1277 Date d'inscription jeudi 7 décembre 2000 Statut Contributeur Dernière intervention 26 février 2009 - 15 janv. 2005 à 21:13
tafiscobar Messages postés 1277 Date d'inscription jeudi 7 décembre 2000 Statut Contributeur Dernière intervention 26 février 2009 - 15 janv. 2005 à 21:13
A voir également:
- Comment renvoyer un tableau en C++ ??
- Tableau croisé dynamique - Guide
- Comment faire un tableau - Guide
- Tableau ascii - Guide
- Comment imprimer un tableau excel sur une seule page - Guide
- Trier un tableau excel - Guide
7 réponses
tafiscobar
Messages postés
1277
Date d'inscription
jeudi 7 décembre 2000
Statut
Contributeur
Dernière intervention
26 février 2009
177
10 janv. 2005 à 10:37
10 janv. 2005 à 10:37
pour renvoyer un tableau en C/C++, c'est impossible. D'ou l'interet des pointeurs. Tu declares ton tableau coe pointeur et tu renvoies ce pointeur.
tafiscobar "lou waye def bopame"
la nullite n'existe pas, l'ignorance oui, ah je suppose!!!
tafiscobar "lou waye def bopame"
la nullite n'existe pas, l'ignorance oui, ah je suppose!!!
ah d'accord, mais comme je voudrais avoir un tableau de tableau (car après ce trace mes courbes avec Matalb) je dois donc faire un pointeur sur un pointeur d'un double ou qqch comme ca non ?
Voici ma fonction conversion qui renvoie dont un pointeur sur un double
#include<iostream>
#include<vector>
using namespace std;
double * conversion(vector<double> & v,const int & N)
{
const int ligne=v.size()/N;
double tab[ligne][N];
unsigned int compteur=0;
for(int i=0;i<ligne;i++)
for(int j=0;j<N;j++)
{
tab[i][j]=v[compteur];
compteur++;
}
return tab;
}
mais voici le message d'erreur :
cannot convert `double (*)[N]' to `double*' in return
j'ai essayé de renvoyer un double ** mais ca ne marche pas vraiment...
Merci encore
#include<iostream>
#include<vector>
using namespace std;
double * conversion(vector<double> & v,const int & N)
{
const int ligne=v.size()/N;
double tab[ligne][N];
unsigned int compteur=0;
for(int i=0;i<ligne;i++)
for(int j=0;j<N;j++)
{
tab[i][j]=v[compteur];
compteur++;
}
return tab;
}
mais voici le message d'erreur :
cannot convert `double (*)[N]' to `double*' in return
j'ai essayé de renvoyer un double ** mais ca ne marche pas vraiment...
Merci encore
tafiscobar
Messages postés
1277
Date d'inscription
jeudi 7 décembre 2000
Statut
Contributeur
Dernière intervention
26 février 2009
177
11 janv. 2005 à 12:14
11 janv. 2005 à 12:14
double **f (-) { double **tab ; // tu lui alloue aprés de la mémoire ... return tab; }
RM: n'oublie pas de désallouer ce q te retourne ta fct lorsq t'en auras plus besoin, sinon t'auras des fuites de mémoire.
L'autre solution, c'est de déclarer ton tableau a l'extérieur de ta fct et tu le donnes en paramétres a ta fonction. Mais ce n'est pas propre et pas joli, mais cela dépend de ce que tu fais ds ton code.
tafiscobar "lou waye def bopame"
la nullite n'existe pas, l'ignorance oui, ah je suppose!!!
Ravachol
Messages postés
566
Date d'inscription
vendredi 5 mars 2004
Statut
Membre
Dernière intervention
30 octobre 2005
120
10 janv. 2005 à 11:33
10 janv. 2005 à 11:33
Salut,
Si tu renvois double ** il faut écrire return &tab. Mais tab étant alloué dans la fonction tu risques te te retrouver avec un pointeur pointant sur une zone désallouée.
A++
C'est pas parce qu'ils sont nombreux à avoir tort
qu'ils ont raison! (COLUCHE)
Si tu renvois double ** il faut écrire return &tab. Mais tab étant alloué dans la fonction tu risques te te retrouver avec un pointeur pointant sur une zone désallouée.
A++
C'est pas parce qu'ils sont nombreux à avoir tort
qu'ils ont raison! (COLUCHE)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bonjour, je suis un peu perdu pas vos réponses...
Voici ce que j'ai fait :
double ** conversion(vector<double> & v,const int & N)
{
const int ligne=v.size()/N;
double** tab; // ne faudrait-il pas faire double ** tab=new qqch ?
unsigned int compteur=0;
for(int i=0;i<ligne;i++)
for(int j=0;j<N;j++)
{
tab[i][j]=v[compteur]; // comment lui faire comprendre l'élément (i,j) ?
compteur++;
}
return tab;
}
Mais ca plante à tab[i][j]=v[compteur];
Merci encore
Voici ce que j'ai fait :
double ** conversion(vector<double> & v,const int & N)
{
const int ligne=v.size()/N;
double** tab; // ne faudrait-il pas faire double ** tab=new qqch ?
unsigned int compteur=0;
for(int i=0;i<ligne;i++)
for(int j=0;j<N;j++)
{
tab[i][j]=v[compteur]; // comment lui faire comprendre l'élément (i,j) ?
compteur++;
}
return tab;
}
Mais ca plante à tab[i][j]=v[compteur];
Merci encore
Ravachol
Messages postés
566
Date d'inscription
vendredi 5 mars 2004
Statut
Membre
Dernière intervention
30 octobre 2005
120
11 janv. 2005 à 18:48
11 janv. 2005 à 18:48
Salut,
Tu pourrais peut-être t'inspirer de cet exemple:
http://perso.enst-bretagne.fr/~brunet/Cours/Gestion_Memoire/TutCpp_Mem_Part1.html
A++
C'est pas parce qu'ils sont nombreux à avoir tort
qu'ils ont raison! (COLUCHE)
Tu pourrais peut-être t'inspirer de cet exemple:
http://perso.enst-bretagne.fr/~brunet/Cours/Gestion_Memoire/TutCpp_Mem_Part1.html
A++
C'est pas parce qu'ils sont nombreux à avoir tort
qu'ils ont raison! (COLUCHE)
merci ! je pense qu'avec ton lien je vais trouver mon bonheur !
Mais si je veux "pousser le bouchon un peu plus loin" : je m'étais fait une classe Matrice de la manière suivante :
double * m=new double[nb_ligne*nb_colonne];
L'avantage, comme l'explique ton lien que tu m'as envoyé, est que si je veux remplacer une ligne, c'est plus rapide que par ma classe matrice. Mais d'un point de vu temps d'accès à un élément d'une matrice, lequel sera plus rapide ? Le double **m; ou bien mon double * m ?
Merci bcp en tout cas !
Pom
Mais si je veux "pousser le bouchon un peu plus loin" : je m'étais fait une classe Matrice de la manière suivante :
double * m=new double[nb_ligne*nb_colonne];
L'avantage, comme l'explique ton lien que tu m'as envoyé, est que si je veux remplacer une ligne, c'est plus rapide que par ma classe matrice. Mais d'un point de vu temps d'accès à un élément d'une matrice, lequel sera plus rapide ? Le double **m; ou bien mon double * m ?
Merci bcp en tout cas !
Pom
Ravachol
Messages postés
566
Date d'inscription
vendredi 5 mars 2004
Statut
Membre
Dernière intervention
30 octobre 2005
120
12 janv. 2005 à 09:48
12 janv. 2005 à 09:48
Salut,
Pour ma part, n'ayant pas une très grosse expérience en C++ je ne me hazarderais pas à te donner une réponse en terme de différence du tps d'accès à un élément, au risque de dire une ânerie. Joker donc ;-)
Plus sérieusement, je préfère laisser l'éventuelle réponse à un spécialiste C++.
A++
C'est pas parce qu'ils sont nombreux à avoir tort
qu'ils ont raison! (COLUCHE)
Pour ma part, n'ayant pas une très grosse expérience en C++ je ne me hazarderais pas à te donner une réponse en terme de différence du tps d'accès à un élément, au risque de dire une ânerie. Joker donc ;-)
Plus sérieusement, je préfère laisser l'éventuelle réponse à un spécialiste C++.
A++
C'est pas parce qu'ils sont nombreux à avoir tort
qu'ils ont raison! (COLUCHE)
tafiscobar
Messages postés
1277
Date d'inscription
jeudi 7 décembre 2000
Statut
Contributeur
Dernière intervention
26 février 2009
177
12 janv. 2005 à 15:00
12 janv. 2005 à 15:00
Si on réfléchit en terme de "ticks" d'horloge, c'est plus cher car il ya une indirection de plus. Mais, je ne pense pas que cela soit couteux ds ton cas.
tafiscobar "lou waye def bopame"
la nullite n'existe pas, l'ignorance oui, ah je suppose!!!
tafiscobar "lou waye def bopame"
la nullite n'existe pas, l'ignorance oui, ah je suppose!!!
pom
>
tafiscobar
Messages postés
1277
Date d'inscription
jeudi 7 décembre 2000
Statut
Contributeur
Dernière intervention
26 février 2009
12 janv. 2005 à 16:50
12 janv. 2005 à 16:50
Salut, j'ai fait des tests et voici mes résultats :
class Matrice
{
double * m;
blabla
};
class Matrice2
{
double **m;
blabla
}
Matrice m1(50,50)
Matrice m2(50,50)
Matrice m3=m1*m2
Matrice2 m4(50,50)
Matrice2 m5(50,50)
Matrice2 m6=m4*m5
double m7[50][50];
double m8[50][50];
double m9[50][50];
m9=m7*m8 (a été programé)
Je répète 10 000 fois chaque multiplication et je calcule le temps mis.
Matrice 37 s
Matrice2 33s
sans les pointeurs (variables m9) : 30 s
Je comprends tout à fait que sans les pointeurs cela aille plus vite mais je ne comprend pas pourquoi avec un double ** ca va plus vite qu'avec un double * (meme si le gain n'est pas probant)
class Matrice
{
double * m;
blabla
};
class Matrice2
{
double **m;
blabla
}
Matrice m1(50,50)
Matrice m2(50,50)
Matrice m3=m1*m2
Matrice2 m4(50,50)
Matrice2 m5(50,50)
Matrice2 m6=m4*m5
double m7[50][50];
double m8[50][50];
double m9[50][50];
m9=m7*m8 (a été programé)
Je répète 10 000 fois chaque multiplication et je calcule le temps mis.
Matrice 37 s
Matrice2 33s
sans les pointeurs (variables m9) : 30 s
Je comprends tout à fait que sans les pointeurs cela aille plus vite mais je ne comprend pas pourquoi avec un double ** ca va plus vite qu'avec un double * (meme si le gain n'est pas probant)
tafiscobar
Messages postés
1277
Date d'inscription
jeudi 7 décembre 2000
Statut
Contributeur
Dernière intervention
26 février 2009
177
>
pom
13 janv. 2005 à 20:16
13 janv. 2005 à 20:16
salut, je peux voir comment tu accédes a tes elts ds le cas double* ?
tafiscobar "lou waye def bopame"
la nullite n'existe pas, l'ignorance oui, ah je suppose!!!
tafiscobar "lou waye def bopame"
la nullite n'existe pas, l'ignorance oui, ah je suppose!!!
pom
>
tafiscobar
Messages postés
1277
Date d'inscription
jeudi 7 décembre 2000
Statut
Contributeur
Dernière intervention
26 février 2009
14 janv. 2005 à 10:03
14 janv. 2005 à 10:03
Salut, dans le cas d'un double * :
c est le nb de colonne, et mes elements vont de 1 a nb ligne ou nb colonne (et non de 0 a nb ligne-1)
inline const double& Matrice::operator()(ulong i,ulong j) const {assert((i<=l) && (i>0) && (j>0) && (j<=c)); return m[(i-1)*c+(j-1)];}
inline double& Matrice::operator()(ulong i,ulong j) {assert((i<=l) && (i>0) && (j>0) && (j<=c)); return m[(i-1)*c+(j-1)];}
Dans le cas d'un double ** :
inline const double& Matrice::operator()(uint i,uint j) const {assert((i<=NB_LIGNE) && (i>0) && (j>0) && (j<=NB_COL)); return m[i-1][j-1];}
inline double& Matrice::operator()(uint i,uint j) {assert((i<=NB_LIGNE) && (i>0) && (j>0) && (j<=NB_COL)); return m[i-1][j-1];}
Voila, j'espere que c'est comprehensible
c est le nb de colonne, et mes elements vont de 1 a nb ligne ou nb colonne (et non de 0 a nb ligne-1)
inline const double& Matrice::operator()(ulong i,ulong j) const {assert((i<=l) && (i>0) && (j>0) && (j<=c)); return m[(i-1)*c+(j-1)];}
inline double& Matrice::operator()(ulong i,ulong j) {assert((i<=l) && (i>0) && (j>0) && (j<=c)); return m[(i-1)*c+(j-1)];}
Dans le cas d'un double ** :
inline const double& Matrice::operator()(uint i,uint j) const {assert((i<=NB_LIGNE) && (i>0) && (j>0) && (j<=NB_COL)); return m[i-1][j-1];}
inline double& Matrice::operator()(uint i,uint j) {assert((i<=NB_LIGNE) && (i>0) && (j>0) && (j<=NB_COL)); return m[i-1][j-1];}
Voila, j'espere que c'est comprehensible