cs_avalonclass
Messages postés6Date d'inscriptionjeudi 14 février 2008StatutMembreDernière intervention24 février 2008
-
14 févr. 2008 à 13:27
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 2014
-
15 févr. 2008 à 10:10
Bonjour a vous, j'ai écris un ptit programme de rien du tout mais celui ci me renvoie des valeurs completement bidon quand je l'utilise... qlq'un saurait d'ou cela peu venir ?
Je suis en train de faire les "liens" entre ma fonctions main et les divers fonctions de calcul sur les vecteurs. J'ai testé ma fonction
definir(double,double,double) et affvecteur(vecteur) cepedant l'or de laffichage avec affvecteur(vecteur) j'ai des valeurs de vecteur qui ne correspond pas du tout a ce que j'ai entré. merci d'avance pour l'aide que vous pourrez me donné.
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 20086 14 févr. 2008 à 14:25
Oups non juste une correction kan meme. Dans le corps de ta fonction:
vu vecteuradef.u; //peut etre vecteuradef.u vu serai mieux ?
vv = vecteuradef.v;
vw = vecteuradef.w;
Tu mets le contenu du vecteur dans tes variables, c'est l'inverse qu'il faut faire:
vecteuradef.u = vu;
etc...
Pistol_Pete
Messages postés1053Date d'inscriptionsamedi 2 octobre 2004StatutMembreDernière intervention 9 juillet 20137 14 févr. 2008 à 14:31
Désolé si j'ai parru agressif, c'était pas voulu.Le probleme de ton programme c'est pas vu vecteur ou vecteur vu, ca c'est une erreur d'inatention mais le fait que tu retournes une variable locale est bien plus genant et cette erreur doit etre corrigée pour toutes les fonctions de ton programme.
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 14 févr. 2008 à 14:44
[auteur/PISTOLPETE/352018.aspx Pistol_Pete] >> Non. Retourner une structure est parfaitement correct. Cependant, le code que tu proposes est le plus optimisé.
Pistol_Pete
Messages postés1053Date d'inscriptionsamedi 2 octobre 2004StatutMembreDernière intervention 9 juillet 20137 14 févr. 2008 à 13:56
Salut
Tout ton programme est a revoir :
J'ai pas tout regardé mais ta fonction Vecteur Definir ( double vu,double vv,double vw ) est une farce:
Vecteur Definir ( double vu,double vv,double vw )
{
Vecteur vecteuradef; vu vecteuradef.u; //peut etre vecteuradef.u vu serai mieux ?
vv = vecteuradef.v;
vw = vecteuradef.w;
return vecteuradef; //tu retournes une variable local qui sera detruit en sortie de cette fonction....
}
Utilise des allocations dynamiques ou revois le passage de parametres.
cs_avalonclass
Messages postés6Date d'inscriptionjeudi 14 février 2008StatutMembreDernière intervention24 février 2008 14 févr. 2008 à 14:15
Bin a priori ma fonction definir était loin d'etre une farce puique écrire "vecteuradef.u = vu" en lieu et place de "vu = vecteuradef.u" a suffit a faire marcher le prog. Je comprends pas pourquoi TOUT le proramme est a revoir... pas la peine d'etre... agressif...
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 20086 14 févr. 2008 à 14:24
Tsss....
Vecteur Definir ( double vu,double vv,double vw )
{
Vecteur vecteuradef; vu vecteuradef.u; //peut etre vecteuradef.u vu serai mieux ?
vv = vecteuradef.v;
vw = vecteuradef.w;
return vecteuradef; //tu retournes une variable local qui sera detruit en sortie de cette fonction....
}
...
vecteurn1=Definir(u,v,w);
=> C'est tout a fait correct ! Très mauvais niveau performance, mais le code est correct.
J'ai pas le temps de lire en détail pour le moment.
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 14 févr. 2008 à 14:26
[auteur/PISTOLPETE/352018.aspx Pistol_Pete] >> Retourner une structure est parfaitement fonctionnel. Le compilo copira les membres de la source dans les membres de la destination.
cs_avalonclass
Messages postés6Date d'inscriptionjeudi 14 février 2008StatutMembreDernière intervention24 février 2008 14 févr. 2008 à 14:48
Ok, point de vu calcul, il faut mieu utilisé les pointeurs... je savais pas, pour l'instant je m'occupe pas vraiment des soucis de performance... j'avais l'intention de passer par les pointeurs pour amélioré le prog avec une saisie dynamique du nombre de vecteur que l'on veut utilisé. D'ou lutilisation a priori inutile de beaucoup de fonction. Merci d'avoir pris le tps de regarder mon pti programme :D
DeAtHCrAsH
Messages postés2670Date d'inscriptionvendredi 25 janvier 2002StatutMembreDernière intervention 6 février 2013 14 févr. 2008 à 15:11
Salut,
Pour les optimisations je te conseillerai aussi d'encapsuler tes fonctions (+, -, *, opposé) dans une classe.
Tu auras aussi la possibilité de sucharger des opérateurs pour une utilisation plus aisé par la suite.
Enfin en créant une collection de vecteur tu rendra le tout dynamique et optimisé.
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 14 févr. 2008 à 16:20
Salut,
Pour le coup de Pistol_Pete -> C'est renvoyer un pointeur sur une variable globale qui est l'erreur habituelle du débutant.
typedef struct _cplusplus
{
void * c;
void * objects;
}
cplusplus;
Premier cas, il recopie les 2 * 4 octets de la structure depuis le
retour vers la pile. Pas de problème (A condition de pas se soucier des
perfs).
Deuxième cas, il recopie le pointeur depuis le retour vers la pile,
mais la structure n'a pas bougé. Elle est toujours au dessus de la pile
et sera écrasée par autre chose d'ici peu.
DeAthCrAsH -> Mettre le tout dans une classe peut paraître une
"amélioration" pour une certaine quantité de personne, mais une
"optimisation", je ne pense pas que ce soit le cas, quelque soit le
compilo. Dans le meilleur des cas, les perfs seront identiques.
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 14 févr. 2008 à 16:39
Non il ne recopie pas depuis la pile. Si le nombre d'éléments présent dans la structure est négligeable (2 ou 3), il mettra le tout dans des registres puis, à la sortie, copiera des registre vers la structure.
Si il y a plus d'éléments, le compilo créera une structure "de copie" qu'il passera en paramètre à la fonction (de façon transparente) puis recopiera de cette structure de copie vers la structure destinatrice en sortie de fonction.
En gros il transforme la fonction en celle de pistol_pete puis fera une recopie dans une autre structure.
En somme, GROSSE perte de temps.
Pour ce qui est de l'encapsulation, il est vrai que ça simplifiera la programmation mais ça n'améliorera pas les performances. By desing, ce sera même l'inverse.
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 14 févr. 2008 à 17:55
Et bien, d'après l'exemple que tu avais donnée, non on n'était pas du tout d'accord. Tu semblais même avoir confondu l'asm AT&T et Intel. En plus, dans ton précédent exemple, tu ne copiais pas DE la pile mais VERS la pile (depuis les registres).
Peut-importe, je me demande aussi la même chose.
Une réponse est que rien ne garantie qu'il y ai bien une variable qui recevra ce qui sera retourné. Dans ce cas, une structure temporaire s'impose.
Mais sinon, je l'ignore aussi. Peut-être à cause de la complexité de réaliser cette optimisation.
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 14 févr. 2008 à 18:57
Ok dans ce cas tu as confondus AT&T et Intel. De toute façon, ton exemple était incohérent avec tes explications.
À supposer que tu utilisais l'AT&T, eax et edx ne pointe sur rien de valide.
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 14 févr. 2008 à 19:29
Ces phénomènes d'incompréhension totale me mettrons toujours mal à l'aise...
Je n'ai jamais rien écrit de ma vie en AT&T, et lus pas beaucoup plus.
J'ai lus et écris suffisament de ligne d'assembleur syntaxe intel pour savoir : mov destination, source
(Mais bon je peux faire une faute d'inattention.)
Citation de plus haut, assembleur récupéré en copier coller depuis VC6 (Et donc désassemblé par lui) :
0040127D mov dword ptr [ebp-8],eax
00401280 mov dword ptr [ebp-4],edx
Source : les valeurs des registres eax et edx.
Destination : valeur pointée par l'adresse calculée en prenant le contenu du registre ebp et en lui soustrayant 8.
Le compilo fait renvoyer le résultat de ReturnStruct dans eax:edx
conformément à la convention cdecl et le tout est recopié dans les
variables locales.
C'est tout à fait ce que tu as dit.
Mais c'est aussi tout à fait ce que j'ai dit, depuis le début.
Après, je me suis peut être encore plus mal exprimé que d'habitude...
Une phrase en particulier de chiffone dans mon premier post (Si oui, laquelle ?), ou tout te paraît incohérent ?
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 15 févr. 2008 à 00:01
OUPS !!!!
La phrase étant:
"Premier cas, il recopie les 2 * 4 octets de la structure depuis le retour vers la pile."
Mon cerveau la tout simplement remplacé par:
"Premier cas, il recopie les 2 * 4 octets de la structure depuis le retour à partir de la pile."
J'ai lus beaucoup trop vite et comme il y avait un saut de ligne (sur mon écran) entre "depuis le retour" et "vers la ligne", j'ai tout simplement sauté "vers" et remplacer par autre chose pour donner une phrase correct.
Et là je me suis construit tout une histoire en pensant que tu avais confondus AT&T et Intel et que tu avais zappé un truc important......
Pfffff.....
Au moins, cette confusion de ma part aura permit d'approfondir ce que fait le compilo avec les structures.
Donc OUI rt15, ton exemple est correct et OUI tes explications sont cohérentes.
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 15 févr. 2008 à 00:09
"entre "depuis le retour" et "vers la ligne""
C'est
"entre "depuis le retour" et "vers la pile""
Enfait, j'ignore si c'est le saut de ligne ou que je n'ai pas correctement interprété ce bout de phrase:
"Premier cas, il recopie les 2 * 4 octets de la structure depuis le retour vers la pile."
Peut-être les 2.
En gros, je crois plutôt que j'ai supprimer le "le retour vers" à cause du sens vague que prend le bout de phrase. (le retour de quoi ?)
Ceci donna donc:
"Premier cas, il recopie les 2 * 4 octets de la structure depuis la pile."
DeAtHCrAsH
Messages postés2670Date d'inscriptionvendredi 25 janvier 2002StatutMembreDernière intervention 6 février 2013 15 févr. 2008 à 09:42
rt15> Une optimisation ne se qualifie pas seulement par le gain en performance en terme de temps d'execution. Du code optimisé, c'est à mon sens du code facilement réutilisable, lisible, et gérant des temps d'execution suffisement rapide pour ce qu'on lui demande.
On n'a jamais vu renault créer des clio avec des moteurs de ferrari.
Un bon programmeur doit avant tout limiter ses choix et ses actions au périmètre de son application.