Bonjour à tous,
Je voulais juste savoir si il était possible de renvoyer un tableau de valeurs à la fin d'une fonction avec l'instruction "return".
Si oui, comment?
Version imprimable
Bonjour à tous,
Je voulais juste savoir si il était possible de renvoyer un tableau de valeurs à la fin d'une fonction avec l'instruction "return".
Si oui, comment?
eh bien je ne sais pas si c'est la meilleure solution, mais tu peux faire un pointeur vers ta variable si elle n'est pas déclarée localement à la fonction :
Code:
1
2
3
4
5 char coucou[10] = "coucou"; char *test() { return coucou; }
Les variables globales sont déconseillées.Citation:
Envoyé par Myth_Titans
Soit passer un pointeur sur le tableau en paramètre.
Soit créer dynamiquement le tableau dans la fonction.
Ou plus simple utiliser la classe "vector".
Je vais essayer de creer un pointeur.
Je reposterais pour vous dire si j'y arrive ou pas.:lol:
Je viens juste d'essayer rapide avant de me coucher et voici mes premiers résultats pas tres concluant mais mieux que rien.
crétaion du pointeur:crétion de la fonction qui rassemble 2 tableau en un seul:Code:float * liste_val = new float[somme_effect()];
Dans main:Code:
1
2
3
4
5
6
7
8
9 float liste(){ int m=0; for(int i=0; i<nbvaleurs; i++){ for(int n=0; n<peffect[i]; n++){ liste_val[m]= pval[i]; m++; } } }
La boucle for affiche le résultat voulu à l'écran mais fait tout planter part la suit et affichent une énorme série de nombre (avec plein de puissance de 10 je croit)Code:
1
2
3
4 case 2: liste(); for (int i=0; i<somme_effect(); i++){ cout<<liste_val[i]; }
Il n'y a aucun code apres la fin de la boucle for et la fin de la fonction main normale ()Code:
1
2 system("PAUSE"); return EXIT_SUCCESS;
Que se passe-t-il?
PS:c'est peut etre un truc tout con mais ce soir je n'ai plus l'esprit clair....
plutôt:Code:i<somme_effect()
Code:
1
2 int n=somme_effect(); for(int i=0;i<n;i++)
Merci beaucoup !!!
Mais pourquoi ne peut-on pas écrireCode:i<somme_effect()
Si tu fais cela, somme_effect() sera évalué à chaque tour ce boucle, ce qui est inutile. On calcule donc une fois pour toutes avant la boucle
Entre une variable globale et une allocation locale avec new on a vite choisi, car la mémoire allouée avec le new ne sera sans doute jamais libérée (en tous cas on risque de l'oublier).Citation:
Envoyé par seriousme
Le plus courant, c'est de passer un tableau en paramètre
Si tu es un kamikaze, tu peux aussi retourner un tableau local, a condition de l'utiliser tout de suis après (ne pas faire d'appel de fonction ou déclaration de variable locales par exemple, car ca effacerait le tableau retourné)
Dite j'au encors un problème mais cette fois fois c'est dans le code complet je pense ....
En fait il ne fonctionne que des fois pour la médiane suivant les valeurs que je rentre aux debuts (mais lequels précisement je sais pas), les autre il se ferme directement sans rien affiché comme s'il efféctuer une fonction "quitter".
En même il y a quelque chose que je ne comprend pas, je l'ai mi en commentaire rouge.
Voici le code (il est peut être pas super mais bon je debute je l'ai fais comme je pouvais mais la je cale..):
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87 #include <cstdlib> #include <iostream> using namespace std; float somme_val(); int somme_effect(); float somme_totale(); float liste(); int nbvaleurs, choix, med; float moy; float * pval = new float[nbvaleurs]; int * peffect = new int[nbvaleurs]; float * liste_val = new float[somme_effect()]; int main(int argc, char *argv[]) { cout<<"rentrez le nombre de valeurs differentes."<<endl; cin>>nbvaleurs; for(int i=0; i<nbvaleurs; i++){ cout<<"rentrez une valeur"; cin>>pval[i]; cout<<"rentrez son effectif"; cin>>peffect[i]; } for(int i=0; i<nbvaleurs; i++){ cout<<pval[i]<<"\t"; } cout<<endl; for(int i=0; i<nbvaleurs; i++){ cout<<peffect[i]<<"\t"; } cout<<endl<<"pour calculer la moyenne tapez1, la mediane tapez2."<<endl; cin>>choix; switch(choix){ case 1: moy = somme_totale()/somme_effect(); cout<<"la moyenne est de:"<<moy<<endl; break; case 2: liste();//pour somme_effect impaire int j = somme_effect(); med = ((j+1)/2)-1;//le -1 sert a cerner la bonne case du tableau. cout<<"la mediane est:\t"<<liste_val[med]; } delete pval, peffect, liste_val; system("PAUSE"); return EXIT_SUCCESS; } float somme_val(){ float x; for(int i=0; i<nbvaleurs; i++){ x += pval[i]; } return x; } int somme_effect (){ float x; //ici si je met int pour correspondre au type de la fonction, la moyenne est fausse. for(int i=0; i<nbvaleurs; i++){ x += peffect[i]; } return x; } float somme_totale(){ float x; for(int i=0; i<nbvaleurs; i++){ x += pval[i] * peffect[i]; } return x; } float liste(){ int m= 0; for(int i=0; i<nbvaleurs; i++){ for(int n=0; n<peffect[i]; n++){ liste_val[m]= pval[i]; m++; } } }
PS: Je sais pas si le forum est fait pour vérifier des codes entiers mais bon, je ne sais pas a qui m'adresser..
Aidez-moi s'il vous plait.
Pas toujours, comportement indéfini.Citation:
Si tu es un kamikaze, tu peux aussi retourner un tableau local, a condition de l'utiliser tout de suis après
Normalement non, c'était juste pour clarifier le code.Citation:
Si tu fais cela, somme_effect() sera évalué à chaque tour ce boucle, ce qui est inutile. On calcule donc une fois pour toutes avant la boucle
Je corrige sa phrase:
... Et de ne pas travailler en multithread.Citation:
Si tu es un kamikaze, tu peux aussi retourner un tableau local déclaré static, a condition de l'utiliser tout de suite après
En fait, le tableau static correspond à une variable globale, mais en un peu plus propre puisque seule la fonction peut y accéder.
Ben si, pourquoi l'évaluation ne serait-elle pas faite a chaque fois?Citation:
Envoyé par seriousme
A partir de quand ce tableau devient il invalide?Citation:
Je corrige sa phrase:
Plus précisément quand sa mémoire est elle libérée?
En ayant réfléchi un peu je pense que le bug du logiciel vient de ce que je n'ai pas compris, là ou j'ai mis le commentaire en rouge, non?
Comment puis-je faire?
Ouais. Je fais une alloc dynamique et renvoie un auto_ptr<> ou un auto_array<> selon s'il s'agit d'un élément isolé ou d'un tableau.Citation:
Envoyé par socrate
Ca, c'est si j'ai peur pour les perf / qu'il m'a été prouvé que j'ai un problème de perf là. Sinon, c'est toujours et systématiquement le vecteur renvoyé par copie, ou pris par référence (afin de faire des resize à chaque passage dans la boucle du traitement -- ce qui sera encore plus performant que l'allocation à chaque itération).
Une variable globale ? Certainement pas!!!
Comme pour les variables globales: "Jamais".Citation:
Envoyé par seriousme
En pratique, c'est lorsque le processus se termine, quoi. Une variable locale static, c'est juste une variable globale à accès restreint (Pour les objets, il me semble avoir lu ici (ou sur MSDN) que le C++ garantit que l'objet sera construit au plus tard juste avant le premier appel à la fonction).
C'est un peu plus précis que ça : L'objet ne sera pas appelé avant le premier appel de la fonction. C'est ce point qui permet au pattern singleton de résoudre les problèmes d'ordre d'initialisation entre variables "globales".
Excusez-moi mais je me pose une question: est-ce que vous parlez entre vous ou vous repondez a ma question? Je prefererais que ce soit la première solution car je ne comprend rien....:)
PS: de temp en temp il plante aussi, je suis obliger d'aller dans le gestionnaire des taches.
Je te rassure tout de suite:
On s'est mis à parler entre nous quand socrate t'a proposé de retourner l'adresse d'un tableau local, pour l'utiliser immédiatement après.
Moi, j'ai ensuite précisé "retourner un tableau local static" et précisé les inconvénients (les mêmes que pour des variables globales, mais si tu fais "un petit programme tout simple", il y a des chances que tu n'aies pas de problèmes en faisant cela).
Le reste n'est que discussions entre nous.