Comment renvoyer un tableau en C++ ??
pom
-
tafiscobar Messages postés 1277 Date d'inscription Statut Contributeur Dernière intervention -
tafiscobar Messages postés 1277 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour, j'ai un std::vector v d'une longueur L (L=v.size()) et je sais que L est un multiple de N (const int N). N est connu.
Je voudrais convertir v en un tableau de tableau.
Mon idée est la suivante :
const unsigned int ligne=v.size()/N; // nombre de ligne de mon tableau à N colonnes
double tab[ligne][N]={0.};
unsigned long int compteur=0;
for(int i=0;i<ligne;i++)
for(int j=0;j<N;j++)
{
tab[i][j]=v[compteur];
compteur++;
}
Jusqu'à là, l'algo est facile.
Je voudrais en fait faire une fonction conversion qui me convertit mon std::vector en tableau de tableau. Mais comment déclarer cette fonction ??
double mon_tableau_de_tableau conversion(const std::vector<double> & v,const int & N)
{
// je recopie l'algo ci-dessus
return tab;
}
mais comment renvoyer un tableau de tableau avec une fonction ?
Merci beaucoup
Pom
Je voudrais convertir v en un tableau de tableau.
Mon idée est la suivante :
const unsigned int ligne=v.size()/N; // nombre de ligne de mon tableau à N colonnes
double tab[ligne][N]={0.};
unsigned long int compteur=0;
for(int i=0;i<ligne;i++)
for(int j=0;j<N;j++)
{
tab[i][j]=v[compteur];
compteur++;
}
Jusqu'à là, l'algo est facile.
Je voudrais en fait faire une fonction conversion qui me convertit mon std::vector en tableau de tableau. Mais comment déclarer cette fonction ??
double mon_tableau_de_tableau conversion(const std::vector<double> & v,const int & N)
{
// je recopie l'algo ci-dessus
return tab;
}
mais comment renvoyer un tableau de tableau avec une fonction ?
Merci beaucoup
Pom
A voir également:
- Comment renvoyer un tableau en C++ ??
- Tableau word - Guide
- Trier un tableau excel - Guide
- Tableau ascii - Guide
- Comment imprimer un tableau excel sur une seule page - Guide
- Comment faire un tableau croisé dynamique - Guide
7 réponses
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
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!!!
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
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
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)
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)
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