Problème dans mon appel de procédure

Résolu
Killteck Messages postés 8 Date d'inscription mercredi 27 décembre 2000 Statut Membre Dernière intervention 21 juillet 2011 - 6 oct. 2009 à 21:18
cs_Ayr Messages postés 221 Date d'inscription mercredi 9 avril 2003 Statut Membre Dernière intervention 13 décembre 2009 - 7 oct. 2009 à 02:26
Bonsoir j'ai un problème avec mon code mon appelle de procédure m'affiche une erreur dans le programme principal alors que ma structure est correctement déclaré...
Voici tout mon code :



Public Class Form1

Structure Table
Dim Numero As Integer
Dim Statut As String
End Structure

Public Sub InitTableau(ByRef T_Salarié() As Table)
Dim i As Integer
Dim reponse As String
i = 1
reponse = "oui"
Do While reponse = "oui"
T_Salarié(i).Numero = i
T_Salarié(i).Statut = InputBox("Veuillez indiquez le statuts du salarié n° " & i)
i = i + 1
Loop
End Sub

Function Mystere(ByVal taux As Double, ByVal Nb25 As Double, ByVal Nb50 As Double)
Dim resultat As Double
resultat = (169 * taux) + (taux * 1.25 * Nb25) + (taux * 1.5 * Nb50)
Return resultat
End Function

Public Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim T_Salarié() As Table
Dim T_SB() As Double
Dim H_Sup25 As Double
Dim H_Sup50 As Double
Dim TxAnnuel As Double
Dim Tx1 As Double
Dim Tx2 As Double
Dim I As Integer
Dim TotalSalaire As Double
Dim SalaireBrut As Object
Dim FSys As Object

Call InitTableau( T_Salarié()
)

Est la il me marque : Le nombre d'indices est inférieur au nombre de dimensions du tableau indexé.



I = 1
Tx1 = 50
Tx2 = 60
Do While T_Salarié(I).Numero = ""
H_Sup25 = InputBox("Veuilez indiquez le nombre d'heure mensuelles suplémentaire a 25% du salarié n° " & I)
H_Sup50 = InputBox("Veuilez indiquez le nombre d'heure mensuelles suplémentaire a 50% du salarié n° " & I)
If T_Salarié(I).Statut = "saisonnier" Then
TxAnnuel = Tx1
Else : TxAnnuel = Tx2
End If
T_SB(I) = Mystere(TxAnnuel, H_Sup25, H_Sup50)
I = I + 1
Loop
FSys = CreateObject("Scripting.FileSystemObject")
SalaireBrut = FSys.CreateTextFile("c:\windows\bureau\fichier.txt")
With SalaireBrut
Do While T_SB(I) <> ""
.writeLine(T_SB(I))
I = I + 1
Loop
End With
I = 1
Do While T_SB(I) <> ""
TotalSalaire = TotalSalaire + T_SB(I)
I = I + 1
Loop
MsgBox("Le total des salaires est de " & TotalSalaire)
MsgBox("Le salaire moyen est de " & TotalSalaire / I)

End Sub
End Class


Voila le problème je ne comprend pas pourquoi il me marque ce message d'erreur alors que ma structure est correctement déclarer. J'espère que vous pourrez m'aider.

2 réponses

Profil bloqué
6 oct. 2009 à 23:55
Salut

1) tu es en VB Net et non VB 6.0 ( d'après ta sub Button_1)
2) ton tableau T_Salarié() est bien déclaré mais il n'est pas dimensionné
3) Dans ta Sub Initableau ta boucle est infinie car réponse ne passe jamais à "non"
4) Les tableaux commencent à 0 : dim T_salarié(0 to 99) pour 100 salariés de 0 à 99
5) Inutile de faire une Sub pour initialiser le tableau
6) Quand ton tableau est créé inutile de faire des boucles Do While pour l'explorer et faire les calculs : utilise une boucle For Next car tu connais la taille de ton tableau


bon courage et bonne prog

La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

GRENIER Alain
3
cs_Ayr Messages postés 221 Date d'inscription mercredi 9 avril 2003 Statut Membre Dernière intervention 13 décembre 2009 2
7 oct. 2009 à 02:26
Bonjour,

7) Tu définie mal la visibilité de ta structure. Laisse faire au minimum le compilateur, définie toi même quand tu veux que tes différents éléments doivent êtres Private ou Public. C'est mieux pour la lisibilité.
8) Dans ton exemple, Numero n'est pas utilisé, tu n'as donc pas besoin de la structure.
9) Dans InitTableau il est préférable de définir réponse comme un Boolean. Mais comme le dit Galain, dans ton cas tu es sensé connaitre la taille du tableau.
10) Ta fonction Mystere n'a pas de type de retour. Tu doit le définir.
Function Mystere(ByVal taux As Double, ByVal Nb25 As Double, ByVal Nb50 As Double) As Double


Dans l'évènement click du bouton :
11) Tx1 et Tx2 ne varient pas, tu peux les définir comme constantes.
12) La fonction InputBox renvoie un string et H_Sup25 et H_Sup50 sont des Double. Il est très préférable de faire la convertion de type. Même genre de problème pour SalaireBrut et FSys.
13) Tu es en .Net, utilise les classes de System.IO pour écrire et lire dans un fichier.
14) Tu fait plusieurs boucles où tu pourrais en utiliser qu'une. Dans ce cas T_SB n'a pas besoin d'être un tableau.
15) Si tu tiens à séparer la saisie des statut et du nombre d'heures sup, T_Salarié doit être un tableau, sinon tu peux éliminer encore une boucle (celle d'init du tableau) et T_Salarié n'a pas besoin d'être un tableau.

Voilà à quoi pourrait ressembler ton code si on saisie le statut et le nombres d'heure en deux temps:
Public Class Form1
  Private Const NbSalaries As Integer = 2 '-- remplacer 2 par le nombre voulu
  Private Const TAUX1	As Integer = 50
  Private Const TAUX2	As Integer = 60
  Function Mystere(ByVal taux As Integer, ByVal Nb25 As Double, ByVal Nb50 As Double) As Double
    Return (169 * taux) + (taux * 1.25 * Nb25) + (taux * 1.5 * Nb50)
  End Function 
  Public Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim T_Salarié(NbSalaries) As String
    Dim T_SB As Double
    Dim H_Sup25 As Double
    Dim H_Sup50 As Double
    Dim TotalSalaire As Double
    For i As Integer = 0 to T_Salarié.Length - 1
      T_Salarié(i) = InputBox("Veuillez indiquez le statuts du salarié n° " & i)
    Next i
    Using SalaireBrut As System.IO.StreamWriter = New System.IO.StreamWriter("d:\fichier.txt")
      For I As Integer = 0 to T_Salarié.Length - 1
        H_Sup25 = CType(InputBox("Veuilez indiquez le nombre d'heure mensuelles suplémentaire a 25% du salarié n° " & I), Double)
        H_Sup50 = CType(InputBox("Veuilez indiquez le nombre d'heure mensuelles suplémentaire a 50% du salarié n° " & I), Double)
        T_SB Mystere(If(T_Salarié(I) "saisonnier", TAUX1, TAUX2), H_Sup25, H_Sup50)
        SalaireBrut.WriteLine(T_SB)
        TotalSalaire += T_SB
      Next i
      SalaireBrut.Close()
    End Using
    MsgBox("Le total des salaires est de " & TotalSalaire.ToString("# ##.00 €"))
    MsgBox("Le salaire moyen est de " & (TotalSalaire / T_Salarié.Length).ToString("# ##.00 €"))
  End Sub	
End Class

De manière plus générale:
Pense à utiliser Option Strict On.
Si tu as beaucoup de salariés, tu devrais penser à une manière plus ergonomique de saisir les infos. Tu cours un risque important d'erreurs de saisie avec ta méthode, sans compter le côté rébarbatif.

Bonne courage,
A+
3
Rejoignez-nous