Fonctions

bbjodel83 Messages postés 6 Date d'inscription vendredi 2 mars 2007 Statut Membre Dernière intervention 7 août 2007 - 7 août 2007 à 13:20
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 - 7 août 2007 à 15:33
Bonjour, novice en VB6, voici ma question:
Comment recuperer en appelant une fonction deux ou plusieurs resultats ?

Public Function WS_WD(CRS, HDG, TAS, GS)
'Wind functions
'return unknown wind [wd,ws]
'use rad arguments and result
CRSRad = (Pi / 180) * CRS
HDGRad = (Pi / 180) * HDG
hdmcrs = HDGRad - CRSRad
WS = Sqr((TAS - GS) ^ 2 + 4 * TAS * GS * (Sin(hdmcrs / 2)) ^ 2)
WD = Modcrs(CRSRad + Atn2(TAS * Sin(hdmcrs), TAS * Cos(hdmcrs) - GS))
End Function

Je voudrais recuper les resultats de WS et WD, jusqu'a present c'est l'une ou l'autre, mais pas les deux a la fois, pouvez vous m'aider ?

Pouvez vous me donner le code a mettre derriere le bouton pour appeler cette fonction avec les deux resultats ?

Merci par avance Fred

9 réponses

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
7 août 2007 à 13:34
Oulàlà tu connaîs la déclaration de variables ?

Ton code revu est corrigé :
Public SubWS_WD(byval CRS as Double, byval HDG as double, byval TAS as double, byval GS as double, ByRef WS as double, Byref WD as double)
'Wind functions
'return unknown wind [wd,ws]
'use rad arguments and result
Dim CRSRad As Double
Dim HDGRad As Double
Dim hdmcrs As Double

CRSRad = (Pi / 180) * CRS
HDGRad = (Pi / 180) * HDG
hdmcrs = HDGRad - CRSRad
WS = Sqr((TAS - GS) ^ 2 + 4 * TAS * GS * (Sin(hdmcrs / 2)) ^ 2)
WD = Modcrs(CRSRad + Atn2(TAS * Sin(hdmcrs), TAS * Cos(hdmcrs) - GS))
End Function

Et tu n'as plus qu'à lui envoyé 2 variables de plus qui contiendrons la nouvelle valeur de WS et WD
0
bbjodel83 Messages postés 6 Date d'inscription vendredi 2 mars 2007 Statut Membre Dernière intervention 7 août 2007
7 août 2007 à 13:48
En faite toutes les variables sont declarées, voici l'ensemble du code (fichier *.bas)

Public Const Pi As Double = 3.14159265358979




Public Function Modcrs(CRS)
' Return crs in range 0<crs<=2*pi
twopi = 2 * Pi
Modcrs = twopi - md(twopi - CRS, (twopi))
End Function


Public Function md(Y As Double, X As Double) As Double
' Equivalent of spreadsheet Mod(y,x)
' Returns the remainder on dividing y by x in the range
' 0<=Md <x
md = Y - X * Int(Y / X)
End Function


Public Function Atn2(Y, X)
' Equivalent of spreadsheet Atan2(x,y)
' Note argument order!
' No value for x=y=0
' Returns result in -pi< Atn2 <= pi
pi2 = Pi / 2
If (Abs(Y) >= Abs(X)) Then
  Atn2 = Sgn(Y) * pi2 - Atn(X / Y)
Else
  If (X > 0) Then
    Atn2 = Atn(Y / X)
  Else
    If (Y >= 0) Then
      Atn2 = Pi + Atn(Y / X)
    Else
      Atn2 = -Pi + Atn(Y / X)
    End If
  End If
End If
End Function


Public Function WS_WD(CRS, HDG, TAS, GS)
'Wind functions
'return unknown wind [wd,ws]
'use rad arguments and result
CRSRad = (Pi / 180) * CRS
HDGRad = (Pi / 180) * HDG
hdmcrs = HDGRad - CRSRad
WS = Sqr((TAS - GS) ^ 2 + 4 * TAS * GS * (Sin(hdmcrs / 2)) ^ 2)
WD = Modcrs(CRSRad + Atn2(TAS * Sin(hdmcrs), TAS * Cos(hdmcrs) - GS))End Function
0
cs_etniqs Messages postés 201 Date d'inscription mardi 7 octobre 2003 Statut Membre Dernière intervention 10 mai 2016
7 août 2007 à 13:53
tu peux aussi créer un type perso :

type as result
WS as double
WD as double
End type

Public Function WS_WD(CRS, HDG, TAS, GS) as result
dim result_set as result
CRSRad = (Pi / 180) * CRS
HDGRad = (Pi / 180) * HDG
hdmcrs = HDGRad - CRSRad
result_set.WS = Sqr((TAS - GS) ^ 2 + 4 * TAS * GS * (Sin(hdmcrs / 2)) ^ 2)
result_set.WD = Modcrs(CRSRad + Atn2(TAS * Sin(hdmcrs), TAS * Cos(hdmcrs) - GS))
WS_WD = result_set
End Function

Que tu appelles via
sub ma_sub
dim result_get as result
...
result_get = WS_WD(mes arguments)

msgbox result_get.WS
msgbox result_get.WD
end sub
0
bbjodel83 Messages postés 6 Date d'inscription vendredi 2 mars 2007 Statut Membre Dernière intervention 7 août 2007
7 août 2007 à 13:57
Je me suis sans doute mal expliqué, j'en suis desolé.

Dans ma feuille il y a 6 champs comme ceci:
CRS, HDG, TAS, WD sont a remplir par l'utilisateur, par exemple:

CRS ===> 300
HDG ===> 305
TAS ===> 130
WD ===> 125

En cliquant sur le bouton "Calculer" le resultat de cette fonction doit s'afficher sur les deux autres champs WD et WS.

On doit trouver:
WS ===> 12,1
WD ===> 8,3
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_etniqs Messages postés 201 Date d'inscription mardi 7 octobre 2003 Statut Membre Dernière intervention 10 mai 2016
7 août 2007 à 13:59
Oups , c'est pas "type AS result"

C'est "Type result" (le nom du type que tu crées !)
0
bbjodel83 Messages postés 6 Date d'inscription vendredi 2 mars 2007 Statut Membre Dernière intervention 7 août 2007
7 août 2007 à 14:03
Je me suis encore trompé (misere)

Dans ma feuille il y a 6 champs comme ceci:
CRS, HDG, TAS, GS sont a remplir par l'utilisateur, par exemple:

CRS ===> 300
HDG ===> 305
TAS ===> 130
GS   ===> 125

En cliquant sur le bouton "Calculer" le resultat de cette fonction doit s'afficher sur les deux autres champs WD et WS.

On doit trouver:
WS ===> 12,1
WD ===> 8,3
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
7 août 2007 à 14:56
CRS, HDG, etc ne sont donc pas des variables mais des contrôles d'un form ?
0
bbjodel83 Messages postés 6 Date d'inscription vendredi 2 mars 2007 Statut Membre Dernière intervention 7 août 2007
7 août 2007 à 15:09
CRS, HDG, TAS et GS sont des champs de saisie TextBox ou l'utilisateur rentre des données numeriques pour le calcul pour trouver le resultat sur WS et WD (TextBox) apres avoir cliqué sur un bouton nommé "Calculer".

A propos, je me presente, je m'appelle Fred, je suis Pilote Privé Avion - Instructeur ULM et en cours de passer mon Pilote Professionnel Avion, dans le cadre de mes cours, je voudrais developper un computer de type E6B sous forme d'un programme pour moi et mon ecole. Jusqu'a present j'ai essayé de le faire sous Windev 10 que je maitrise assez bien mais c'est la galere, j'ai essayé de faire une DLL en C# (dont je ne suis pas assz calé) cela fonctionne mais la conversion du langage est dure !!!.
Ce prog que j'essaye de faire est tiré d'un site tres connu Aviation Formulary dont voici l'adresse http://williams.best.vwh.net/avform.htm il existe sous format excel donc les codes sont du vba.
Ce prog calculera le vent, les routes, les derives etc....

Amicalement Fred
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
7 août 2007 à 15:33
Arf, si tu fais du VBA pourquoi tu poste dans le forum VB6 ???

Je déplace vers le forum approprié !

Sinon concernant le problème, modifie légèrement ton code :
Public SubWS_WD(byval CRS as Double, byval HDG as Double, byval TAS as Double, byval GS as double, ByRef WS as double, Byref WD as Double)
'Wind functions
'return unknown wind [wd,ws]
'use rad arguments and result
Dim CRSRad As Double
Dim HDGRad As Double
Dim hdmcrs As Double

CRSRad = (Pi / 180) * CRS
HDGRad = (Pi / 180) * HDG
hdmcrs = HDGRad - CRSRad
WS = Sqr((TAS - GS) ^ 2 + 4 * TAS * GS * (Sin(hdmcrs / 2)) ^ 2)
WD = Modcrs(CRSRad + Atn2(TAS * Sin(hdmcrs), TAS * Cos(hdmcrs) - GS))
End Function

Et pour l'appel de ta fonction :
Dim WS as double
Dim WD as double
WS_WD(Val(CRS.Text), Val(HDG.Text), Val(TAS.Text), Val(GS.Text), WS, WD)

MsgBox WS & " " & WD
0
Rejoignez-nous