PDA

Voir la version complète : Question C++ sur le "return value"



Kalimmba
20/03/2015, 10h20
Salut les canards,

Débutant en prog, je me suis lancé dans le C++ parce que bon voila faut bien commencer quelque part
Bref, c'etait le pourquoi du comment.
La situation est la suivante : j'ai un main.cpp et un fonction.cpp
Le fonction.cpp se termine avec un return value qui est un int
Ma question : Comment puis je récupérer le value en question dans mon main.cpp ?
Merci par avance

Grosnours
20/03/2015, 10h33
Ben en appelant la fonction tout simplement, de préférence avec les arguments qu'il te faut.
Je te conseille ce topic-ci : http://forum.canardpc.com/threads/56721-Le-topic-de-la-programmation-string-cha%C3%AEnes-cuir-et-compagnie
pour toute question concernant la programmation. ;)

Kalimmba
20/03/2015, 10h59
Ben justement j'appelle ma fonction avec l'argument qui va bien. Dans la fonction proprement dite tout est ok mais des que je veux récupérer le value dans le main, beh ca coince. Un argument sert à utiliser une fonction, pas à récup un resultat. Si ?

Merci pour le lien, il me semblait en avoir vu un il y a longtemps.

Hideo
20/03/2015, 11h02
Tu n'as pas choisi le langage le plus simple pour commencer ^_^
Ca me fait penser que j'ai vu ça hier, et que ca peut t'aider à avoir une vision un peu plus précise du monde de la prog'. Je trouve ça assez proche de la réalité.

Dans ton main tu vas avoir un appel de fonction un peu comme ça (je suis pas sur de la synthaxe C++)

maFonction(MesArguments);

avec ça tu vas rentrer dans ta fonctions, et pour récupérer ce qui en sort il faut tu utilises une variable du type de ton return (donc int ici) pour recupérer ta valeur à la sortie de la fonction :

int MaVariable = maFonction(MesArguments);

et dans Mavariable tu auras la valeur de ton return :lol:

http://tof.canardpc.com/preview2/f9b4302f-efb5-4f2e-8292-96815da1db1e.jpg (http://tof.canardpc.com/view/f9b4302f-efb5-4f2e-8292-96815da1db1e.jpg)

Kalimmba
20/03/2015, 11h18
C'est exactement ce que je fais...Sauf que ma fonction est dans un autre fichier et du coup, ben ca marche pas. C'est sûrement pas la raison mais bon je cherche
En gros : maFonction (Arg1, Arg2)
Arg 1 est utilisé dans le fichier main et dans le fonction
Arg 2 que dans le fichier fonction, et en l'occurence c'est le résultat que je veux récupérer
Ce que je pige pas c'est que je pensais que les arguments servaient à utiliser la fonction, la faire tourner quoi mais pas obtenir le résultat de la dite fonction. C'est sûrement un truc tout bête mais bon

Tu n'as pas choisi le langage le plus simple pour commencer
Oui je sais bien mais j'aime les défis et puis je fais deja du vbs, mais pas tres poussé j'avoue

Hideo
20/03/2015, 11h23
Si je comprend bien tu fais appel a ta fonction dans le main avec un argument qui vient de ton fichier main et un argument de ton fichier secondaire ? C'pas très catholique ça, il faut faire attention au scope (portée de tes variables).
Tu as fais tes imports ? Pour dire a ton fichier main qu'il faut qu'il aille voir dans le fichier secondaire quand tu appels certaines fonctions ? (je dirai que oui si tu utilises déjà ta fonction dans le main alors qu'elle est dans ton autre fichier)

Mais faire un appel de fonction avec des variables qui viennent de plusieurs fichiers differents, ce n'est pas une très bonne idée à la base je pense ^_^

Tu pensais bien, les arguments permettent de donner a la fonctions les informations dont elle a besoin pour faire tourner son "algo".
Une fois les informations "brutes" traités (les arguments) elle peut éventuellement renvoyer quelque chose (n'importe quoi, un true ou false pour dire comment s'est passé le déroulement de la fonction, un resultat d'un calcul,....).
On ne renvoie pas un argument comme ça, ca ne sert a rien puisque l'argument tu l'as déjà avant l'appel de ta fonction. Sauf si tu lui fais subir des modifications.

Grosnours
20/03/2015, 11h26
Ne le prends pas mal mais qu'est-ce que c'est confus tout cela.
La programmation c'est l’école de la rigueur (sauf si tu fais du PHP je suppose). Si tu as un problème il faut savoir l’énoncer clairement. Bonus si tu postes le code direct cela ira plus vite. Et encore mieux si on a un quelconque code d'erreur. Non, dire "ça marche pas" n'est pas suffisant.
Ici on découvre le problème au fur et à mesure des questions, ça n'aide pas du tout. Là je ne suis même plus certain de comprendre de quoi tu parles.
Si ta fonction est dans un autre fichier, tu as pensé à créer un header ?

Kalimmba
20/03/2015, 11h46
Je me disais bien que c'était pas super clair
Je recacap donc
J'ai 2 fichiers, un main et un fonction
Le main fait appel à la fonction qui va sortir un résultat
Je veux récupérer ce résultat dans le main
Le code en lui meme n'est pas interessant, je cherche à comprendre la logique, la structure du truc disons. Ce n'est pas le probleme d'ailleurs. Si je mets ma fonction dans le main c'est bon, j'ai mon resultat qui s'affiche.
Mais bon voici le code
Main.cpp

f_Random(nDifficulte);
cout<<nbHasard<<endl;

Fonction.cpp

nLimit = nDifficulte + 3;
srand(time(0));
nbHasard = rand()%nLimit;
return nbHasard;

Pas un truc de ouf hein, mais ça m'affiche -2 alors que si je mets un cout dans la fonction, j'ai bien un nb aleatoire entre 0 et la limite

J'espere avoir été plus clair.

Grosnours
20/03/2015, 12h04
Heu c'est tout le code ?
Tu aurais pas oublié des trucs du genre int main() {} et pareil pour ta fonction dans ton fichier ?
Et est-ce que tu utilises un fichier .h ?

Si tu veux un exemple avec une question proche de la tienne, regarde ceci :
http://stackoverflow.com/questions/15891781/how-to-call-on-a-function-found-on-another-file

De manière générale d'ailleurs stackoverflow est plutôt sympathique comme source d'aide si ton code coince quelque part.

Kalimmba
20/03/2015, 12h22
Bon beh voila
Ya probablement encore des trucs en trop mais bon je suis en phase de test/compréhension

main.cpp

#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <vector>
#include "random.h"
using namespace std;
//f_Random(nDifficulte);
int main()
{

cout<<"Choix de la difficulté "<<endl;cout<<"1 - Facile"<<endl;cout<<"2 - Moyen"<<endl;cout<<"3 - Difficile"<<endl;cout<<"4 - IMPOSSIBLE !!"<<endl;
int nChoix, nDifficulte, nLimit, nbHasard, nResult;
cin>>nChoix;
nDifficulte = nChoix;
cout<<"difficulte = "<<nChoix<<endl;



switch(nChoix)
{

case 1:
cout<<"Easy"<<endl;
f_Random(nDifficulte);
cout<<nDifficulte<<endl;
cout<<nbHasard<<endl;
break;
}
}
f_Random.cpp


#include <iostream>
#include <time.h>
#include <windows.h>
#include "random.h"
using namespace std;
int f_Random (int nDifficulte)

{
int nLimit, nbHasard;
cout<<"DEBUT fonction RANDOM"<<'\n'<<"+++++++++++++++++++++"<<'\n';
nLimit = nDifficulte + 3;
srand(time(0)); // Initialisation des nombres aleatoires
nbHasard = rand()%nLimit; // quantité de nombre
cout<<"nb aleatoire est compris entre 0 et "<<nLimit<<endl;
cout<<"nb aleatoire dans la fonction est "<< nbHasard<<endl;
cout<<nDifficulte<<endl;
cout<<"+++++++++++++++++++++"<<endl<<"FIN fonction RANDOM"<<endl;
return nbHasard;

}


f_random.h

#ifndef RANDOM_H_INCLUDED
#define RANDOM_H_INCLUDED

int f_Random (int nDifficulte);

#endif // RANDOM_H_INCLUDED

bilbo10
20/03/2015, 12h27
Dans ton main, dans cette partie là :

case 1:
cout<<"Easy"<<endl;
f_Random(nDifficulte);
cout<<nDifficulte<<endl;
cout<<nbHasard<<endl;
break;

cette ligne là :
f_Random(nDifficulte);

C'est ton appel de fonction ?

Parce que si c'est le cas, tu récupères pas la valeur renvoyé par ta fonction, donc forcément ça peut pas marcher.

Kalimmba
20/03/2015, 12h31
Parce que si c'est le cas, tu récupères pas la valeur renvoyé par ta fonction, donc forcément ça peut pas marcher.
Oui c'est exactement ça.
Comment je récupère cette p"#!grrr!!! de valeur ?

bilbo10
20/03/2015, 12h34
Dans ton main tu vas avoir un appel de fonction un peu comme ça (je suis pas sur de la synthaxe C++)

maFonction(MesArguments);

avec ça tu vas rentrer dans ta fonctions, et pour récupérer ce qui en sort il faut tu utilises une variable du type de ton return (donc int ici) pour recupérer ta valeur à la sortie de la fonction :

int MaVariable = maFonction(MesArguments);

et dans Mavariable tu auras la valeur de ton return :lol:


Tout est expliqué dans le message que je te quote ;)

LaVaBo
20/03/2015, 12h37
Oui c'est exactement ça.
Comment je récupère cette p"#!grrr!!! de valeur ?

Tu crées une variable dans laquelle tu stockes le résultat de la fonction, comme indiqué plus haut par Hideo.

ta_variable = taFonction(tesParametres)

Donc ici :

int result;

result = f_Random(nDifficulte);

Kalimmba
20/03/2015, 12h42
Ben j'avais essayé ça suite à ton message mais il me sortait une erreur
Et là, ben ça fonctionne o_O
Il devait y avoir une faute de ma part qq part
OK merci bcp

EdwardGreysky
20/03/2015, 12h44
Ton problème est très simple : Tu as deux variables nbHasard qui sont différentes.

Dans ton main.cpp, tu déclare une variable nbHasard, puis tu essayes d'en afficher le contenu. Mais tu ne lui a jamais affecté de valeur.

La variable nbHasard dans ton f_Random.cpp est locale à ce fichier (Et même à la fonction f_Random(), en l'occurence) tu ne peux donc pas l'utiliser dans main.cpp

Tu fais bien appel à ta fonction dans le main, mais tu ne récupères pas ta valeur de retour.

Ce que tu dois faire c'est nbHasard= f_Random(nDifficulte);

Ta variable nbHasard (De main.cpp) contiendra alors la valeur que retourne ta fonction f_Random et tu pourras l'afficher sans problème.

Hideo
20/03/2015, 15h53
Soit dit en passant, si tu cherches a t'initier au joies de la programmation, je ne pense pas que le C++ soit forcement le meilleur choix.
Comme le montre le schema que j'ai posté au dessus, le C++ c'est assez barbu, et très très manuel, il y a beaucoup de choses qui doit être mises en place par le programmeur (gestion de la mémoire etc) qui sont des notions intéressantes mais pas forcement celles par lesquelles il faut commencer.

Alors une fois que tu as pigé le C++ et que tu te sens à l'aise avec, la à part l'assembleur et ce genre de trucs imbouffables, tout le reste te semblera "facile".

Je fais mes études dans la programmation, en cours nous avons commencé par le C (assez proche de c++ ) c'est pas le langage le plus docile mais ça fais son taff pour comprendre les notions de gestion de mémoire et se construire une base solide en prog.

Y'a de très bon tuto sur OpenClassroom pour se lancer dans la prog, et si tu fais ça sur ton temps libre, y'a des langages qui te permettrons de voir plus de notions de "bases" plus rapidement et surtout plus "ludiquement".
Le python par exemple est un bonheur, très simple (et pas du tout simpliste, c'est très puissant comme langage) et à l'avantage de forcer le programmeur a tenir un code propre (et ça c'est comme l'orthographe aujourd'hui, ca se lit mais putain ca nique les yeux quand c'est mal ecrit).

Le java aussi est assez simple, la gestion de la mémoire est plus ou moins automatique et pour apprendre l'objet je trouve ça cool et comme c'est très portable, c'est utilisé un peu partout.

Kalimmba
23/03/2015, 15h58
Merci pour les conseils Hideo
Justement, je me suis mis au C++ parce que c'est du 'barbu' comme tu dis mais peut etre un poil trop ambitieux je sais pas.
Pour le moment je m'en sors. D'autant plus que cette solution je m'en suis deja servi dans du scripting vbs pffff :rolleyes:
bref
Java je sais pas trop mais pas tenté
Python par contre why not ?
thanks guyz

Roscopolo
23/03/2015, 18h47
Justement, je me suis mis au C++ parce que c'est du 'barbu' comme tu dis mais peut etre un poil trop ambitieux je sais pas.
Attention à ce qu'on entend par "barbu". Le C++ offre un contrôle bas-niveau qui te fait rester proche de la machine et ça c'est cool.

Mais la grosse difficulté du C++ c'est surtout qu'il est anachronique : il va sur les cinquante ans, on a empilé couche sur couche, il souffre d'erreurs dues à son statut de précurseur à l'époque, et surtout son modèle de compilation par inclusion est une grosse daube qui se justifiait à l'époque par le fait que les ordinateurs avaient trop peu de RAM pour y conserver une représentation syntaxique abstraite du code (AST). D'où les messages d'erreurs incompréhensibles pointant au mauvais endroit, les inclusions, l'outillage qui ne fonctionne pas (intellisense toujours bogué & co), le fait que tu doives placer la déclaration d'une fonction en amont de son utilisation, les temps de compilation interminables, etc.


Java je sais pas trop mais pas tenté Python par contre why not ?
Si on parle de langage rust est un langage bas-niveau moderne, python a une belle syntaxe, C# est bien foutu et dispose d'une belle biblio et d'un excellent IDE (VS - aussi bon avec C# que mauvais avec C++), Haskell a des concepts vraiment sympas, etc. Ce sont des langages "plaisir" (chacun dans leur genre - un débutant aura du mal à apprécier Haskell).

Mais si on parle de ce que tu peux utiliser en pratique pour faire un jeu alors il faut surtout regarder les outils et, là, ton choix est beaucoup plus restreint. Pour de la 2D tu peux prendre presque n'importe quoi (sauf 2D avancée) mais pour de la 3D c'est C# ou C++ et point barre (on peut ergoter mais j'ai raison).

A ce stade note la hiérarchie :
* Moteur de jeu = tout compris. Unity, UE4, CryEngine, etc.
* Moteur 3D = pas d'UI, pas d'audio, pas de lecture de films, pas de couche d'abstraction du système (gestion multiplateforme des entrées, du système de fichiers, etc), pas d'éditeur de monde, pas de moteur d'animation par squelette, pas de générateur de lightmaps, pas de... Et je parle de vrais composants utilisables dans de vrais projets, pas de petits machins faits en deux jours avec des limitations telles que tu ne peux pas les utiliser.
* Framework = panoplie en kit généralement encore plus dépourvue qu'un simple moteur 3D.

Pour être réaliste il faut prendre un moteur de jeu : on ne réinvente pas la roue en 2015 à moins de vouloir passer cinq ans à faire un moteur de jeu plutôt qu'à faire un jeu.

Cela dit, peut-être en tant que débutant vaut-ill mieux créer son propre moteur, pour comprendre.