none
QB problème avec "STOP' ? RRS feed

  • Discussion générale

  • Bonjour,

    Qbasic ne tourne plus sous Vista, alors j'ai pris QB64 (source C free), chat marche, mais l'interprétateur (run) ne veux pas avaler une ligne de mon module BAS à cause d'un STOP, donc, je vous prie, que fait au juste le STOP et par quoi puis-je le remplacer (en QB) ?

    142 If Len(C$) = 0 Then GoTo 145 Else Stop
    145 J = 1: M = M + 1: If M > 12 Then KMAX = K - 1: GoTo 155
    150 GoTo 50
    155 For K = 1 To KMAX
    160   M = M(K): J = J(K): LO = 0: LA = 0: GoSub 185
    165 Next K
    170 If WL = 180 Then GoTo 180
    175 WL = 180: E$ = "Lune": WK = -1: M = 1: J = 1: K = 1: GoTo 50
    180
    181 End
    

    Merci, cordialement.

     

     


    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    dimanche 6 juin 2010 19:30

Toutes les réponses

  • Bonjour,

     

    J’ai teste une application similaire et je n’ai pas des problèmes avec le Stop. Pouvez-vous vérifier si le problème ne vient pas d’autre part ?

     

    Cordialement,

    Alex

    __________________________________________________________________________________________

    Publiez un article sur une de ces technologies : Visual Basic, C#, C++, .NET, ASP.NET, SQL Server, Silverlight, SharePoint 2010, SharePoint 2007

     

    Astuces pour Visual Studio 2010

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Workflow Foundation

     

     

    mardi 8 juin 2010 11:57
  • salut EhJoe

     

    je n'y connais (plus rien) à Qbasic, mais pourquoi ne fais tu pas un goto 181 ?

    Quel est l'intérêt de mettre un stop ici ?

     

    Driss

     

     


    Driss HANIB
    mardi 8 juin 2010 12:41
  • Bonjour Driss,

    En fait le code n'est pas de moi, ce sont des modules faits en qbasic, celui qui a fait ça en 1975 ou 80 je crois, est astrophysicien mais pas très ordonné sur la programmation.

    Je crois que le "stop" correspond à un "exit sub", seulement, ensuite, comme dans le module qui est tout seul il n'y a pas d'autre structure, il va au End directement ou pas, ah...

    En plus après je me suis aperçu que qb64 qui est le descendant de qBasic ou gwBasic (source récente en C) que j'avais trouvé sur Internet plante lui aussi avec Vista, car en fait, il n'interprète pas comme le Basic, mais compile et fait un exe, et il n'y arrive pas avec l'assemblage de modules que j'ai.

    Bon, ce n'est pas très grave, j'ai essayé plein de fois de le traduire en VB, mais c'est quasiment impossible tellement c'est tortueux, les variable font n'importe quoi, sont réutilisées 10 fois de façons différentes, il y a des instructions du type "resume" que j'ai connu en Basic mais sans équivalent VB, qu'il faut donc contourner par un code différent, en fait si ms souvenirs sont bon le "Resume" charge une fois en RAM un sorte de variable tableau (structure), et donc après sa lecture il faut employer "Resume" pour la recharger, un truc pour ne pas encombrer la mémoire à l'époque où y avait 64 ko je crois... Bref, j'ai abandonné la traduction de ce code tellement il est mal écrit et utilisé, à chaque fois je me plante de pas grand chose sans doute, mais les résultats sont faux, voici un exemple du code, tu vas voir que la structure laisse à désirer, c'est pas clair, c'est le moins qu'on puisse dire, ça manque d'aération.

    Par exemple la variable M, elle prend le mois au début, donc Byte, puis se transforme en M$ plus loin pour afficher du texte String, voir le deux à la fois l'un derrière l'autre…

     

    Cordialement. 

     

     

      ' Paques
    20 Cls
      DefDbl J, N: DefInt D, M
    
    25 INPUT " Ann‚e "; A
      M = 1: J = 1: D = 0
    30 NO = A Mod 19 + 1
    35 EJ = (NO * 11 - 3) Mod 30
    40 EG = EJ - Fix(A / 100) + Fix(A / 300) + Fix(A / 400)
    45 If A < 1583 Then E = EJ Else E = EG
    50 If E < 0 Then E = E + 30
    55 If E < 13 Or E > 23 Then GoTo 60 Else GoTo 65
    60 M = 4: M$ = "AVRIL": L = 43 - E: GoTo 70
    65 M = 3: M$ = "MARS": L = 44 - E: GoTo 85
    70 If L > 30 Then L = L - 30: M$ = "AVRIL": M = 4
    75 If E = 24 Then L = 18
    80 If E = 25 And NO > 11 Then L = 17
    85 J = L
      GoSub 6000
      JJ = JJ - DN
      GoSub 6100
    105 Print " La Pleine Lune Pascale est le "; J$; L; M$; " "; A
    110 P = L + 8 - Q
      If P > 31 Then P = P - 31: M$ = " AVRIL": M = 4
    115 Print " Le Jour de Pƒques est le DIMANCHE "; P; M$; " "; A
    120 End
    
    
    
    6000 '....................MODULE "JULIEN"
    6005 '
    6010 C = A Mod 4: B = A + 4712: N = B * 365 + Fix((B + 3) / 4)
    6015 N0 = N: DN = 0: If C = 0 Then F = 1: FJ = 1 Else F = 0: FJ = 0
    6020 If A > 1582 Then DN = 10
    6025 If A = 1582 And M = 12 And J > 19 Then DN = 10
    6030 If A >= 1700 Then GoTo 6035 Else GoTo 6040
    6035 DM = -Fix((A - 1) / 100) + 12 + Fix((A - 1) / 400): N0 = N
    6040 If A / 400 <> Fix(A / 400) And A / 100 = Fix(A / 100) Then F = 0
    6045 DN = DN - DM
    6050 If M <= 8 Then N = N + (M - 1) * 30 + Fix(M / 2)
    6055 If M > 8 Then N = N + (M - 1) * 30 + Fix((M - 1) / 2) + 1
    6060 If M >= 3 And F = 1 Then N = N - 1
    6065 If M >= 3 And F = 0 Then N = N - 2 + FJ: DN = DN + FJ
    6070 JJ = N + J - 1.5: HJ = H / 24: JJ = JJ + HJ
    6075 JE = Fix(JJ + 0.5) - N0 + 1: JE = JE Mod 365
    6080 If JJ <= 2299236# Then GoTo 6090
    6085 If JJ > 2299236# And A = 1582 Then JE = JE - 10
    6090 Return
    
    6100 '....................MODULE "JOUR"
    6105 '
    6110 Q = Fix(JJ) - Fix(JJ / 7) * 7 + 2
    6115 If JJ - Fix(JJ) >= 0.5 Then Q = Q + 1
    6120 If Q > 7 Then Q = Q - 7
    6125 If Q = 1 Then J$ = "DIMANCHE"
    6130 If Q = 2 Then J$ = "LUNDI"
    6135 If Q = 3 Then J$ = "MARDI"
    6140 If Q = 4 Then J$ = "MERCREDI"
    6145 If Q = 5 Then J$ = "JEUDI"
    6150 If Q = 6 Then J$ = "VENDREDI"
    6155 If Q = 7 Then J$ = "SAMEDI"
    6160 Return

    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    mardi 8 juin 2010 17:08
  • Hello,

     

    Ce n'est effectivement pas très joli, mais j'ai vu pire (je ne citerai pas de noms :-) ).

     

    Voici une version VB de la chose avec exemple d'utilisation, le tout testé, comme d'habitude :-)

     

     

    Option Explicit
    ' Programme vérifié avec : http://www.dioceserimouski.com/ch/paqueslimit.html
    
    Private Sub Command1_Click()
    Dim mois() As String
    Dim jour() As String
    Dim str1 As String
    Dim str2 As String
    
    Dim annee As Long
    
    Dim plp_jn As Long
    Dim plp_j As Long
    Dim plp_m As Long
    Dim djp_j As Long
    Dim djp_m As Long
    
    
     jour = Split("DUMMY,DIMANCHE,LUNDI,MARDI,MERCREDI,JEUDI,VENDREDI,SAMEDI", ",")
     mois = Split("DUMMY,Janvier,Fevrier,Mars,Avril,Mai,Juin,Juillet,Aout,Septembre,Octobre,Novembre,Decembre", ",")
    
     annee = Val(Text1.Text)
     
     Call CalculPLP_JDP(annee, plp_jn, plp_j, plp_m, djp_j, djp_m)
     
     str1 = "La Pleine Lune Pascale est le " & jour(plp_jn) & " " & plp_j & " " & mois(plp_m) & " " & annee
     str2 = "Le Jour de Paques est le Dimanche " & djp_j & " " & mois(djp_m) & " " & annee
     
     MsgBox (str1 & vbCrLf & str2)
     
    End Sub
    
    Private Sub CalculPLP_JDP(ByVal annee As Long, _
           ByRef plp_jour_num As Long, _
           ByRef plp_jour As Long, _
           ByRef plp_mois As Long, _
           ByRef djp_jour As Long, _
           ByRef djp_mois As Long)
    Dim d  As Long
    Dim dn  As Long
    Dim e  As Long
    
    Dim jj  As Double
    Dim k  As Double
    Dim m  As Long
    Dim no  As Long
    Dim p  As Long
    Dim q  As Long
    
     no = (annee Mod 19) + 1
     
     If annee < 1583 Then
      e = (no * 11 - 3) Mod 30
     Else
      e = ((no * 11 - 3) Mod 30) - Fix(annee / 100) + Fix(annee / 300) + Fix(annee / 400)
     End If
     
     If e < 0 Then
      e = e + 30
     End If
     
      If (e < 13) Or (e > 23) Then
      m = 4
      k = 43 - e
      
      If k > 30 Then
       k = k - 30: m = 4
      End If
      
      If e = 24 Then
       k = 18
      ElseIf (e = 25) And (no > 11) Then
       k = 17
      End If
     Else
      m = 3
      k = 44 - e
     End If
     
     Call ModuleJulien(annee, k, jj, m)
     
     q = ModuleJour(jj)
     
     plp_jour_num = q
     plp_jour = k
     plp_mois = m
     
     p = k + 8 - q
     If p > 31 Then
      p = p - 31
      m = 4
     End If
     
     djp_jour = p
     djp_mois = m
     
    End Sub
    
    Private Sub ModuleJulien(ByVal a As Long, _
           ByVal j As Long, _
           ByRef jj As Double, _
           ByVal m As Long)
    Dim c As Long
    Dim b As Long
    Dim dm As Long
    Dim dn As Long
    Dim je As Long
    Dim n As Long
    Dim f As Long
    Dim fj As Long
    Dim hj As Double
    Dim h As Double
    
     c = a Mod 4
     b = a + 4712
     n = b * 365 + Fix((b + 3) / 4)
     
     If c = 0 Then
      f = 1
      fj = 1
     Else
      f = 0
      fj = 0
     End If
     
      If (a > 1582) Or _
      ((a = 1582) And (m = 12) And (j > 19)) Then
       dn = 10
     End If
     
     If a >= 1700 Then
      dm = -Fix((a - 1) / 100) + 12 + Fix((a - 1) / 400)
     End If
     
     If ((a / 400) <> Fix(a / 400)) And ((a / 100) = Fix(a / 100)) Then
      f = 0
     End If
     
     dn = dn - dm
     If m <= 8 Then
      n = n + (m - 1) * 30 + Fix(m / 2)
     Else
      n = n + (m - 1) * 30 + Fix((m - 1) / 2) + 1
     End If
     
     If (m >= 3) Then
      If f = 1 Then
       n = n - 1
      ElseIf f = 0 Then
       n = n - 2 + fj
       dn = dn + fj
      End If
     End If
     
     jj = n + j - 1.5
     jj = jj - dn
     
    End Sub
    
    ' Module Jour
    '
    Private Function ModuleJour(ByVal n As Double) As Long
    Dim q As Long
    
     q = Fix(n) - Fix(n / 7) * 7 + 2
     
     If (n - CDbl(Fix(n))) >= 0.5 Then
      q = q + 1
     End If
     
     If q > 7 Then
      q = q - 7
     End If
     
     ModuleJour = q
     
    End Function
     
    

     

    --
    Jean-Marc Noury

     


    Jean-marc
    dimanche 11 juillet 2010 13:42
  • Hello,

     

    Dans les anciens basics interprétés, l'instruction "Stop" permettait d'arrêter le programme à l'endroit du Stop et de rendre la main à l'interpréteur de ligne de commande. Toutes les variables restaient chargées en mémoire et il était donc possible de débugger, en faisant des "print" des variables que l'on voulait examiner. on pouvait aussi changer la valeur d'une variable, etc. Si on veut, c'était plus ou moins la même chose qu'un point d'arrêt dans l'IDE de VB6. On pouvait ensuite redémarrer le programme la ou il en était en tapant la commande "run" ou "rerun", ça dépendait.

    De la même façon qu'un point d'arrêt n'a de sens que sous IDE, l'instruction "Stop" n'a de sens qu'en mode interprété. Il est donc légitime que le compilateur "râle" sur cette instruction.

    J'imagine que dans ton cas, l'intention du programmeur était de mettre un point d'arrêt sur la ligne 142, point d'arrêt conditionné par le fait que la variable C$ contienne ou non quelque chose.

     

    Dans ton cas, c'est tout simple:

    Tu supprimes purement et simplement la ligne 142.

     

    Cordialement,

     

    JM

     


    Jean-marc
    dimanche 11 juillet 2010 20:18
  • Bonjour Jean-Marc,

    Merci, cordialement.


    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    dimanche 11 juillet 2010 20:25