Fonctions pas étanches ? Gnh ??? [Résolu]

Messages postés
459
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
8 avril 2009
- - Dernière réponse : DeltaFX
Messages postés
459
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
8 avril 2009
- 13 mai 2006 à 22:48
Bonjour,

Alors là, je tombe des nues : J'ai une fonction qui recoit un parametre Dans cette fonction, j'appelle une autre fonction qui n'a besoin d'aucun parametre. Eh ben une fois que cette fonction a renvoyé son résultat, le parametre quej'aipasséà lafonction premiere a changé !

En détail :
j'appelle rebuildSkin(0) et je suis pas à pas son déroulement

function RebuildSkins(FormNb:integer):boolean;
var AA,BB,CC:Tpicture;
f,IndexLow,IndexHigh,p:integer;
NewAlpha:extended;
begin
...
.... {ici FormNb =0, c'est normal}

NewAlpha:=CalculeAlpha;

...{et là FormNb vaut un truc hallucinant}

étant donné que je ne touche pas a FormNb, que CalculAlpha ne prend aucun parametre, je ne capte plus rien.

à l'aide ???????
Afficher la suite 

15 réponses

Meilleure réponse
Messages postés
4200
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
26
3
Merci
"Je me satisfait tres bien de ce niveau de pourriture."


haha ... oui on peu s'en contenter ... mais c'est comme mieux si on arrive a faire plus propre et de plus ça dechargeras un peu le CPU de methodes lourde et peu adaptée meme si fonctionnelle ...

en effet oui si tu as un positionnement et un temps definit par GPS ... la pas de precalc ... ce serait meme erroné...

function CalculeAlpha : integer;

var H,M,S,Z : word;
Hdec : single;

begin
SysUtils.DecodeTime(Now, H, M, S, Z)

HDec := H + (M / 60) + (S / 3600);

SunTime := GetSunTime(GpsPos);


with SunTime do
result := Trunc((255/(e3-e2))*(((e1-HDec)/abs(e1-HDec))*(HDec-e1)+e3));

{ y'a un truc pas logique la dedans ... explique un peu cette partie}
if (Result < 0) then Result:=0;
if (Result > 255) then Result:=255;
if not UseTwilight then begin
if (Result > 0) then Result:=255;
if (Result < 255) then Result:=0;
end;
end;

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 128 internautes nous ont dit merci ce mois-ci

Commenter la réponse de f0xi
Messages postés
84
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
12 octobre 2007
0
Merci
en pas à pas détaillé tu n'arrives pas à trouver ? a mon avis tu devrais regarder en détail les valeurs de formnb dans ta fonction calculalpha
Commenter la réponse de jace1975
Messages postés
459
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
8 avril 2009
1
0
Merci
Mais CalculALpha ne prend aucun parametre, et je n'ai aucune variable appelée FormNb dans CalculAlpha.
Commenter la réponse de DeltaFX
Messages postés
3821
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 août 2019
85
0
Merci
Question bête: Tu as essayé de désactiver les optimisations du compilateur dans les options lorsque tu trace ?
Commenter la réponse de cptpingu
Messages postés
84
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
12 octobre 2007
0
Merci
Ben le mieux c'est de montrer un peu plus de code que ci dessus.
Ensuite as-tu essayé le pas à pas détaillé comme indiqué en évaluant la variable formnb.
Es-tu sur a tout hasard qu'il n'existe pas une variable globale portant le même nom que la variable de ta fonction?
Commenter la réponse de jace1975
Messages postés
459
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
8 avril 2009
1
0
Merci
En décochant optimisation, ca marche normalement, mais ca n'en reste pas moins fortement etrange. Ca veut dire que je dois me passer des optimisations pour tout le reste du prog ?

Mettre + de code :

//--------------------------------------------------------

function CalculeAlpha:extended;

var H,M,S: string;

Hdec: extended;

begin

SunTime:=GetSunTime(GpsPos);



//On calcule l'heure décimale

H:=TimeToStr(Now);

S:=copy(H,7,2);

M:=copy(H,4,2);

H:=copy(H,1,2);

Hdec:=StrToInt(H)+StrToInt(M)/60+StrToInt(S)/3600;



{Pourcentage de crépuscule !}

Result:=Trunc((255/(SunTime.e3-SunTime.e2))*(((SunTime.e1-hdec)/abs(SunTime.e1-hdec))*(Hdec-SunTime.e1)+SunTime.e3));

//Alpha < 0 : il fait nuit

if (Result < 0) then Result:=0;



//Alpha > 255 : il fait jour

if (Result > 255) then Result:=255;



if not UseTwilight then

begin

if (Result > 0) then Result:=255; //Nuit->Jour

if (Result < 255) then Result:=0; //Jour->Nuit

end;



end;






//--------------------------------------------------------
function RebuildSkins(FormNb:integer):boolean;
var AA,BB,CC:Tpicture;
f,IndexLow,IndexHigh,p:integer;
NewAlpha:extended;

begin
Result:=False;


Gamma.e1:=0.8; //Gamma Red
Gamma.e2:=0.8; //Gamma Green
Gamma.e3:=0.8; //Gamma Blue

adapt:=false;
UseTwilight:=true;

// on précharge, cas pour TOUTES les form
IndexLow:=0;
IndexHigh:=NbOfForms;

// on reconstruit juste pour UNE form
if (FormNb > -1) and (FormNb <= NbOfForms) then
begin
IndexLow:=FormNb;
IndexHigh:=FormNb;
end;

NewAlpha:=CalculeAlpha; // obvious...

if NewAlpha<>Alpha then
begin
Alpha:=NewAlpha;

for f:=IndexLow to IndexHigh do
begin
Snooze(20,5);
// Pour chaque Form
for p:=2 to NbOfPics do // Pas touche au mask !

if (Length(Album[f,p])>0) then
if Adapt then
begin // on mixe les skins
AA:=TPicture.Create;
BB:=TPicture.Create;
CC:=TPicture.Create;
AA.LoadFromFile(PicStoreDir+Album[f,p]+NSufix+PicXts);
BB.LoadFromFile(PicStoreDir+Album[f,p]+DSufix+PicXts);
SkinMix(AA,BB,CC);
CC.SaveToFile(PicWorkDir+Album[f,p]+PicXts);
AA.Free; BB.Free; CC.Free;
end
else // on corrige la luminosité
begin
AA:=TPicture.Create;
CC:=TPicture.Create;
AA.LoadFromFile(PicStoreDir+Album[f,p]+PicXts);
AdjustGamma(Alpha*(1-Gamma.e1)/255 + Gamma.e1,
Alpha*(1-Gamma.e2)/255 + Gamma.e2,
Alpha*(1-Gamma.e3)/255 + Gamma.e3,
AA,CC);
CC.SaveToFile(PicWorkDir+Album[f,p]+PicXts);
AA.Free; CC.Free;
end;
end;
Result:=True;
end;

end;
Commenter la réponse de DeltaFX
Messages postés
3821
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 août 2019
85
0
Merci
Est-ce que cela empêche ton code de fonctionner correctement ?
Je sais qu'en tracant un simple "for i:=0 to nb-1" la variable i affiché par le debugger allait de nb-1 a 1 !!! Mais ca ne genait pas lors de l'excution tout semblait fonctionnner correctement.
Commenter la réponse de cptpingu
Messages postés
84
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
12 octobre 2007
0
Merci
je rentre du pub un petit peu fatigué pour pas dire bourré, mais je vais comme meme essaye te faire quelques remarques :

ta fonction retourne un extended mais dans le code je vois au final
result:=255
ou result:=0 ?????

extended dans la doc delphi "Extended 3.6 x 10^-4951 .. 1.1 x 10^4932 19-20 10 octets"

un byte, "Byte 0..255 8 bits non signé", un boolean ou un integer me paraitrait plus sage .

ensuite mais ca c'est perso, je n'affecte "result" qu'une fois que je suis sur du resultat de ma fonction, cad crée plutot une variable temporaire pour stocker le calcul que tu fais ( trunc renvoie un integer me semble t -il )

Result:=Trunc((255/(SunTime.e3-SunTime.e2))*(((SunTime.e1-hdec)/abs(SunTime.e1-hdec))*(Hdec-SunTime.e1)+SunTime.e3));

Ensuite c'est quoi UseTwilight qui se ballade dans ta fonction, il serait pas mieux dans les paramètres , non?

test avec mes remarques je pense que ca devrait resoudre ton pb.

autre remarque sur l'autre fonction
a quoi ca sert de faire

if (FormNb > -1) and (FormNb <= NbOfForms) then
begin
IndexLow:=FormNb;
IndexHigh:=FormNb;
end;
...
for f:=IndexLow to IndexHigh do
begin

alors que formnb=i , indexlow=i, indexhigh=i , peut etre ai je mal compris, mais si tu ne traite qu'une form a la fois, pas besoin de faire tout ca. A moins que tu appelles ta fonction avec i plus grans que le nombre d'éléments dans ton tableau, mais ce genre d'appel est source de problème.

bon courage
Commenter la réponse de jace1975
Messages postés
4200
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
26
0
Merci
deja un point important :

var H,M,S,Z : word;
HDEC : single; {pas besoin de la precision du type etendus)
begin
sysutils.DecodeTime(now,h,m,s,z);
Hdec := H + (M/60) + (S/3600);
end;

pour le reste ... c'est tellement ... mmm ... pourris que tu ferais mieux de tout revoir a zero ... la logique et les methodes mises en place semble mal choisies.

ensuite ... je ne vois pas l'interet d'arrondir une valeur pour la placée dans un extended ... et au quel cas il depense de l'etendue 0..255 on renvois encore une fois un entier et non un réel ...

donc le resultat de la fonction serat au plus un single si l'on veut garder un flottant sinon au moins un integer ...

pour diminuer les temps de calcul on peu egalement definir des plages de temps pour travailler uniquement sur les heures et minutes voir sur les m dizaines de minutes:

var H,M,S,Z : word;
begin
SysUtils.DecodeTime(Now, H, M, S, Z)
H := ((H * 60) + M) div 10;
case H of
0..36 : {0:00 a 6:00 nuit}
37..48 : {6:10 a 8:00 aurore}
ect...
end;
end;
et on definit des valeurs précalculée ...
une simple routine nous permettras d'observer les saisons car on sais precisement d'une année a l'autre a qu'elle heure le soleil se leve et a quelle
heure la nuit tombe...
Commenter la réponse de f0xi
Messages postés
459
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
8 avril 2009
1
0
Merci
Alors:

Jace : yep, pour calculalpha, un type en extended est exagéré aujourd'hui,vieille fct qui jadis sortait un extended... les maths sont bonnes et testées !). Elle ne renvoie pas que 0 ou 255 si UseTwilight est true, mais tte les valeurs entre. Ce n'est que dans le cas ou UseTwilight est false que je restreint la sortie a 0 ou 255.

UseTwilight est une variable globale qui me dit si lors des transition jour-> nuit, le prog doit utilier la pénombre civile, donc pendant les 25 minutes, réadapter les skins toutes les 30 secondes (en back ground), (pour le skinengine), mais aussi pour déterminer les corrections sur une webcam).

L'autre truc que tu cite sur FormNB, c'est que pour une valeur entre 0 et NbOfForms, ca ne calcul que pour cette form, si par contre je lance Rebuildskins(-1) il me fait toute les forms. Je teste égalament que FormNb =< NbOfForms, car les noms des fichiers bmp/jpeg utiliser pour chaque form sont stockés dans un tableau. Un test de plus me dérange pas, et comme ca je suis sur qu'en cas d'inattention de ma part en codant, je dépasse pas du tableau.

Foxi : Oui, meme remarque, j'ai oublié de rénover calculalpha qui au début me renvoyait un extended (réellement)....

Pourquoi me faire chier avec des valeurs précalculées pour les heures de lever/coucher du soleil qui ne seraient valable que pour un seul endroit sur terre ? T'as pas vu ca : SunTime:=GetSunTime(GpsPos); ?
Ben rien que ca, ca me donne les heures de lever/coucher/pénombre civile/militaire/astronomique où que je sois sur Terre (meme au dela des cercles polaires ou le soleil ne se couche/leve pas, quel que soit mon fuseau horaire, DayLight-saving y compris. (et oui.... y a un gps dans le truc)

Pourle timedecode, simplement quand j'ai écrit cette fonction, je ne connaissais pas.

L'appli elle-meme (là y a juste 2 fcts qui ne servent quasiment jamais), tourne en temps réel sur un transmeta 600 mHz (en gros un p233), en gérant une webcam a 30fps en VGA. Je me satisfait tres bien de ce niveau de pourriture.
Commenter la réponse de DeltaFX
Messages postés
84
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
12 octobre 2007
0
Merci
Un petit conseil insistant, on ne mets jamais une variable globale dans une fonction, mais plutot en paramètre de celle-ci. Actuellement j'écris un programme qui utilise une centaine de fonction, et il me parait peu concevable en terme de maintenance, de test et de rapidité de développement de fonctionner comme tu le fait sur la première fonction.cette remarque vaut aussi pour la deuxième fonction.

d'ailleurs quite a bien faire, utilise la gestion des erreurs dans ces fonctions.

Ce petit effort te fera gagner énormément de temps au fil de test developpements, et évitera en de nombreuses occasions le PB original auquel tu es confronté.

Ces remarques vont dans le sens des propos de Foxi meme si je suis un peu plus modéré. Un petit effort dans la construction de tes fonctions, et dans la structurations de ton PGM sera bénéfique à moyen terme, quand tu voudra rajouter des nouvelles fonctionnalités,les modifier, etc...
Commenter la réponse de jace1975
Messages postés
459
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
8 avril 2009
1
0
Merci
Ah tiens, pareil, le with "truc" do, au moment de l'ecriture de cette fonction, j'ignorais l'usage de with.....

Quant au truc pas logique, faut savoir que alpha représente le pourcentage de "jour" d'un Twilight Time : alpha =0 nuit, alpha = 127, on est pil au mileu de la période de crépuscule (civil dans ce cas), alpha =255, pouf, le centre du soleil a dépassé l'horizon, il fait jour. Ca c'est pour le matin (0 -->255). Pour le soir, c'est le meme principe mais dans l'autre sens (255 -->0). Donc au lieu d'avoir a verifier l'heure en fonction du midi solaire pour savoir si soir ou matin, j'ai pondu un peu de maths pour obtenir alpha directement (d'ou la valeur absolue dans le calcul). Alpha n'a de "sens" que pendant les période de pénombre. en plein mileu de nuit alpha devient négatif, et en pleine journée, alpha execede 255 gaillardement, et n'est jamais entier.

Or, j'utilise alpha dans la fonction skinmix comme niveau de transparence entre un skin de nuit, peu contrasté, concu pour pas gené l'adaptation de l'oeil à la vision nocturne (donc a dominante rouge), et un skin de jour, plus contrasté. J'utilise pour ca AlphaBlend, et le niveau de transparence c'est l'alpha (un byte). Pour faire vite a l'époque, au lieu de tout modifier pourque ca soit homogène, j'avais juste rajouter un trunc.

donc :
if (Result < 0) then Result:=0;
if (Result > 255) then Result:=255;
permettait de m'assurer qu'alpha était bien constaint entre 0 et 255.

if not UseTwilight then
begin

if (Result > 0) then Result:=255;
if (Result < 255) then Result:=0;
end;

et ca, dans le cas ou l'utilisateur ne souhaite pas de transition douce (UseTwilight=false), ca me permet de dire que le jour commence en fait dès qu'il ne fait plus strictement nuit, et que la nuit commence dès qu'il ne fait plus strictement jour. Selon les valeur des test et l'ordre, je peux trancher ou je veux, à mi-pénombre.... etc etc.

Bon c'est vrai qu'elle est moisie cette série de procédures, je dois les reprendre sérieusement et les remettre a plat, les expurger toussa. M'enfin je me les sers moi meme avec assez de verve, mais je ne permets pas qu'un autre me les serve, les réflexions pas gentilles sur mes procédures toutes pourrites.

Et pis c'est pas de ma faute d'abords, c'est la faute au tmediaplayer de delphi qui lui, est tout moisi et se met en vrac parfois selon le path du fichier son. Voyant ca, il a fallu que je m'attelle au WMP importé en activeX, pour finalement me rendre compte qu'avec ma plateforme win98se WMP6.4, j'étais a la traine vis à vis des WMP7.1, 9, 10 etc etc.... et que mon code pour ma bécane risquait de foutre le souk sous d'autre envirronement....

Moralité, ben j'ai attacké Bass.dll, histoire de me débarrassé des trucs zindoz. Et là, mmmmh bass.dll, j'ai pas pu m'empecher de mettre un equaliseur 20bandes, puis faire une tite bricole EAX pour balader la source du son en 3D sur 2 hp, puis tester le coup de je joue un mp3 sur les hp avant de la voiture, et le son d'un fim sur les HP arrieres (j'ai viré tout ca tres vite, c'était pour me roder)

Jace, heureusement que t'as pas vu le reste du source avant que je découvre les design pattern observer, moi et mes forms qui ne se connaissent pas, mais doivent s'échanger des messages, j'avais une tripoté de globales et des timers partout pour regarder quelle var avait changé.

Pis bon, 3 ans a creuser dans une mine de cobol 8heures/jour, putain ca encrasse les neurones !
Commenter la réponse de DeltaFX
Messages postés
84
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
12 octobre 2007
0
Merci
au fait ca marche maintenant ????
Commenter la réponse de jace1975
Messages postés
459
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
8 avril 2009
1
0
Merci
Pas encore testé. En ce moment mon delphi est mal luné, si je veux qu'il s'arrete aux points d'arrets, il faut que je dégomme les dcu et le .exe avant de construire.
Commenter la réponse de DeltaFX
Messages postés
459
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
8 avril 2009
1
0
Merci
Ca marche mieux. Mais franchement il était temps que je me repenche sur ces fonctions moisies.

Merci a tous.
Commenter la réponse de DeltaFX