Bonjour,
J'ai une fonction qui doit me retourner un tableau de string... mais je ne sais pas au départ(au moment de l'appel de ma fonction) le nombre d'élément que contient mon tableau.
Comment puis gérer cela???
Merci
Version imprimable
Bonjour,
J'ai une fonction qui doit me retourner un tableau de string... mais je ne sais pas au départ(au moment de l'appel de ma fonction) le nombre d'élément que contient mon tableau.
Comment puis gérer cela???
Merci
Tu peux utiliser un container STL (vector,deque, list)
Maintenant la question est de savoir s'il est judicieux de faire renvoyer à une fonction une telle chose... (le faire renvoyer par une fonction suppose de le copier sauf cas particulier)
yo
au lieu de retourner un vector<string>, la fonction peut prendre un vector<string>& en paramètre. de cette façon il n'y a pas de duplication de vector.Citation:
Envoyé par Gandalf
Les compilos optimisent la valeur de retour, et au pire y'a l'astuce du swap:
Code:
1
2
3
4
5 vector<string> test(); vector<string> v; v.swap( test() );
A priori, un compilateur intelligent ne copie pas.Citation:
Maintenant la question est de savoir s'il est judicieux de faire renvoyer à une fonction une telle chose... (le faire renvoyer par une fonction suppose de le copier sauf cas particulier)
Cela fait partie des optimisations possibles indiquées dans la norme.
Dans ce cas, un compilateur intelligent n'effectue aucune copie.Code:
1
2
3
4
5
6
7
8
9
10 T foo() { T bar; return bar; } int main() { T baz = foo(); }
Comme certains l'ont indiqué le compilo peut faire une optimisation.Citation:
Envoyé par bigboomshakala
le fait de renvoyer une reference est un cas particulier (méthode classe renvoyant une réfrence sur un membre ou fonction renvoyant une référence sur une globale ou une static).
En général c'est une erreur.
J'utilise cette fonction dans une dll, donc je fais
Et l'appel sur un bouton dans mon applicationCode:
1
2
3
4
5
6
7
8
9 class testdll { testdll(){} void test (vector<string>& v_ref){ ..... v_ref.push_back("test"); v_ref.push_pack("re"); ... } }
J'ai un plantage lorsque je clique une 2ème fois sur le bouton , j'ai "mémoire insuffisante" dans ma dll ....Code:
1
2
3
4
5
6 void __fastcall TForm1::Button3Click(TObject *Sender) { testdll * ptestdll = new testdll(); vector<string> res; ptestdll ->test(res);}
Bonjour
Mais il me semble que ta fonction test ne retourne pas un tableau de string. Elle en prend juste un en paramètre et le modifie.
Tes ptestdll, tu les détruit bien à la fin (avec un delete)?
En effet, au départ j'étais parti sur le fait de retourner une liste et puis vu les post, je me suis dit qu'à priori il était préférable d'utiliser une référence et de passer la liste paramètre ....Citation:
Mais il me semble que ta fonction test ne retourne pas un tableau de string. Elle en prend juste un en paramètre et le modifie.
Concernant le problème de mémoire insuffisante... j'ai refait des tests uniquement avec ma fonction et ça marche.... le problème vient donc apparement d'ailleurs.....
merci
Utiliser le terme "liste" pour parler de std::vector<> est à éviter.
On contraire, on a dit que retourner un objet n'impliquait pas forcément des copies intempestives.Citation:
En effet, au départ j'étais parti sur le fait de retourner une liste et puis vu les post, je me suis dit qu'à priori il était préférable d'utiliser une référence et de passer la liste paramètre ....
J'ai testé avec des références
En retour de fonctionCode:void test (vector<string>& v_ref){ }
Mais aucun des 2 ne marche.... je sais pas comment marche l'allocation de mémoire dans la dll... mais ça plante avec "mémoire insuffisante" au bout du 2ème appel !!!Code:vector<string> test (){ }
Impossible de faire fonctionner ma dll... un peu d'aide serait la bienvenue !!!
Merci
Si ton code fonctionne en dehors de la DLL c'est que le problème vient de la DLL.
Des spécialistes windows serait peut-être donc plus à même de t'aider.