Comment renvoyer un tableau en C++ ??

pom -  
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
A voir également:

7 réponses

tafiscobar Messages postés 1277 Date d'inscription   Statut Contributeur Dernière intervention   177
 
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!!!
0
pom
 
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 ?
0
pom
 
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
0
tafiscobar Messages postés 1277 Date d'inscription   Statut Contributeur Dernière intervention   177
 
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!!!
0
Ravachol Messages postés 566 Date d'inscription   Statut Membre Dernière intervention   120
 
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)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
pom
 
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
0
Ravachol Messages postés 566 Date d'inscription   Statut Membre Dernière intervention   120
 
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)
0
pom
 
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
0
Ravachol Messages postés 566 Date d'inscription   Statut Membre Dernière intervention   120
 
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)
0
tafiscobar Messages postés 1277 Date d'inscription   Statut Contributeur Dernière intervention   177
 
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!!!
0
pom > tafiscobar Messages postés 1277 Date d'inscription   Statut Contributeur Dernière intervention  
 
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)
0
tafiscobar Messages postés 1277 Date d'inscription   Statut Contributeur Dernière intervention   177 > pom
 
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!!!
0
pom > tafiscobar Messages postés 1277 Date d'inscription   Statut Contributeur Dernière intervention  
 
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
0
pom
 
ok, merci de ton honneté (et de ton immense coup de main)

Pom
0