Hallo,

Eindelijk na veel proberen en testen een leuk programma geschreven. Nu ben ik aardig op weg maar snap nog niet alles, nu heb ik het volgende probleem: hieronder heb ik een stukje van mijn programma gezet en aangegeven welke regel ik weg wil halen alleen als ik dit doe krijg ik foutmeldingen (3stuks) onder andere dat mijn repeat/until lus niet correspondeerd.Mijn vraag, wat doe ik fout of zie ik over het hoofd?het zal iets simpels zijn maar ik kon er niet uit.


HoofdProgramma:        

While 1 = 1
Toggle RunningLed
DelayMS 200

High LedsDim 

Begin:


If SensorBegin = 0 Then
    If SensorEind = 1 Then
        GoSub LoopOp
         Repeat 
            If SensorEind = 0 Then
                High BuitenLamp
                Repeat
                    If SensorBegin = 0 Then GoTo Begin
                    DelayMS 200                        
                    Inc Timer4
                Until Timer4 = 200 Then             
                    GoSub LoopTerug
                    Low BuitenLamp
                    Clear Timer4 
                    GoTo Begin
                
              Else 
                If SensorBegin = 0 Then GoTo Begin
                DelayMS 500   
                Inc Timer2
                EndIf
        Until Timer2 = 20 Then 
           GoSub LoopTerug
           Clear Timer2
 EndIf
    
 ElseIf SensorStoep = 0 Then
    If SensorBegin = 1 Or SensorEind = 1 Then ;(DEZE REGEL WEG)      

    Repeat 
       GoSub LoopStoep
       If SensorBegin = 0 Then
         Break
         DelayMS 100                          
         Inc Timer1
       EndIf
    Until Timer1 = 10 Then 
       GoSub AllesLaag
       Clear Timer1
 EndIf   
 
 
 
 ElseIf SensorEind = 0 Then                      
    If SensorBegin = 1 Then                        
    GoSub LoopOpAchterstevoren                                                  
    Repeat 
        If SensorBegin = 0 Then 
          DelayMS 5000
          GoSub LoopOpAchterstevorenTerug
            Else 
            DelayMS 500
            Inc Timer3
          EndIf
          Until Timer3 = 50 Then 
          GoSub LoopOpAchterstevorenTerug
          Clear Timer3
 EndIf
  
 Else
     Daglicht = Pot Ldr,   200
       If  Daglicht > 30 Then
         Low LedsDim 
         GoSub AllesLaag
         GoTo ControleDonker
 EndIf

EndIf

Wend
End

Wat doe ik hier verkeerd?

Bvd,

Martin

[Bericht gewijzigd door Henry S. op (0%)]

Als je correct zou inspringen, kom je er vanzelf achter.

Ik mis oa. de 'Wend' onder de 'while' in het hoofdprogramma
En 2 repeats in 1 until

[Bericht gewijzigd door Kareltje op (17%)]

De 'Wend' klopt dat je die mist deze staat wel in programma maar met kopieeren en plakken niet goed gegaan. maar ik zie geen 2 repeats met maar 1 until.

[Bericht gewijzigd door Henry S. op (39%)]

Op 1 november 2011 20:51:13 schreef Fuzzbass:
Als je correct zou inspringen, kom je er vanzelf achter.

Netjes documenteren kan ook helpen.

If SensorBegin = 0 Then
    If SensorEind = 1 Then
        GoSub LoopOp
         Repeat                                      '1ste repeat
            If SensorEind = 0 Then
                High BuitenLamp
                Repeat                               '2de repeat
                    If SensorBegin = 0 Then GoTo Begin
                    DelayMS 200                        
                    Inc Timer4
                Until Timer4 = 200 Then             
                    GoSub LoopTerug
                    Low BuitenLamp
                    Clear Timer4 
                    GoTo Begin
 
If SensorBegin = 0 Then
    If SensorEind = 1 Then
        GoSub LoopOp
         Repeat 
            If SensorEind = 0 Then
                High BuitenLamp
                Repeat
                    If SensorBegin = 0 Then GoTo Begin
                    DelayMS 200                        
                    Inc Timer4
                Until Timer4 = 200 Then ;1e until            
                    GoSub LoopTerug
                    Low BuitenLamp
                    Clear Timer4 
                    GoTo Begin
 
              Else 
                If SensorBegin = 0 Then GoTo Begin
                DelayMS 500   
                Inc Timer2
                EndIf
        Until Timer2 = 20 Then ; 2e until
           GoSub LoopTerug
           Clear Timer2

Voor de duidelijkheid het programma werkt nu perfect. Als ik de regel die ik aangeef weghaal dan krijg ik foutmeldingen.

[Bericht gewijzigd door Henry S. op (29%)]

Klopt ook wel, bij elke repeat hoort ook een until

Dus, bij elke repeat die je weg haalt, moet je ook de until verwijderen, anders krijg je inderdaad foutmeldingen.

Ook dat begrijp ik maar ik haal dat alleen niet weg. zoals je kan zien haal ik de regel boven de eerste repaet weg:

ElseIf SensorStoep = 0 Then
    If SensorBegin = 1 Or SensorEind = 1 Then ;(DEZE REGEL WEG)      
 
    Repeat 
       GoSub LoopStoep
       If SensorBegin = 0 Then

En daar snap ik niets van want het principe blijfd hetzelfde, het enige wat ik doe is 2 extra voorwaarden weghalen voordat hij aan zijn repaet/until lus mag gaan beginnen.

Als je If...Then weghaalt, moet er ook een EndIf weg uiteraard...

Zat ik toch verkeerd te kijken heb elke keer rond de verkeerde Endif zitten kijken. Nu werkt het wel. Bedankt voor het mee denken.

Op 1 november 2011 21:11:47 schreef Henry S.:
[...]
Netjes documenteren kan ook helpen.

Het zou ook helpen als sommige dingen duidelijk worden verteld. Zo kunnen met volgende post daar rekening mee worden gehouden. Als een vraag/post niet duidelijk is en er word half op gereageerd zal ook de volgende post geen verbetering hebben.

[Bericht gewijzigd door Henry S. op (14%)]

Wat ook kan helpen is eerst de FAQ te lezen voordat je gaat klagen over de antwoorden... ook is dat mede handig om onnodige quotes te voorkomen (zie de edits bij je posts).

Verder is het een feit dat documenteren helpt omdat je dan code in delen overzichtelijke delen opsplitst. Samen met netjes indenten zie je dan precies of je routine wel of niet af is.

Je moet je ook nooit blind staren op de inhoud van een foutmelding. Die komt zelden op de regel waar de fout optreedt, maar op het punt waar de compiler er achter komt dat de boel uit de pas begint te lopen. Ook is de foutmelding vaak anders. Dit omdat de compiler er in dit geval achter komt bij de repeat loop dat er ergens iets mist...
(De compiler weet uiteraard niet waar de If...Then zou moeten staan)

Ik snap het. nu ik het terug zie ik ook dat alles drie de meldingen maar met 1 foutje te maken had. Weer wat geleerd, beetje bij beetje komt het wel goed. morgen maar even kijken of het werkt.

Als je iets in een code wijzigd, zet er dan achter, wat je gedaan hebt.
Nu zet je 2 lappen code in het topic, en laat anderen raden zelf uitzoeken wat je gedaan hebt.
Die 'rem'regels zijn er niet voor niets.

Hieronder een voorbeeld hoe je het duidelijk kan brengen:

If irsens2 = laag Then                      'rechtersensor ziet opstakel
   Print At 2, 3, "detect links"
           GoSub stoppen
           DelayMS 200
           GoSub rechtsaf 
           DelayMS 2000
           GoSub rechtdoor 'deze heb ik nu boven de volgende IF gezet
           EndIf 
    If irsens2 = hoog Then
    Print At 2, 3, " vrij "
        EndIf
Until toets3 = hoog xor toets5 = hoog xor toets7 = hoog xor toets9 = hoog   'deze lus beeindigen wanneer er een aandere mode geselekteerd word
Return 

Dit is een stukje code waarin ik hulp gevraagt heb.

Als dit gelijk werd gevraagd had ik alle commentaar er in laten staan ik heb achter elke regel iets staan. ik dacht eigenlijk dat het er minder overzichtelijk door werd voor jullie. Daarom heb ik alles eerst weggehaald voor ik het poste. Maar dan weet ik dat voor de volgende keer.Dit is een duidelijke opmerking.

@ Henry S.
Als er iets word gewijzigd zonder uit te leggen wat kan ik mij daar niet op aan passen. En ja, de FAQ heb ik gelezen maar aangezien ik nog steeds een mens ben zie ik weleens iets over het hoofd of denk ik dat ik het begrijp (wat dan niet zo is).

Klagen over de antwoorden doe ik niet, ik vraag enkel iets meer uitleg.

Edit:

Jullie bedoelen dit?:

While 1 = 1 
Daglicht = Pot Ldr, 200                 ;LDR meting 
 If Daglicht < 10 Then                  ;Als het donker word dan..
     GoSub HoofdProgramma               ;Spring naar Hoofdprgramma
 DelayMS 500                            ;Meting om de halve seconde
 EndIf
Wend     


HoofdProgramma:                         ;Begin van Hoofdprogramma:
While 1 = 1                             ;Continu lus
Toggle RunningLed                       ;Als led aan = uit zetten en andersom
DelayMS 200                             ;Snelheid waarmee runningled knipperd

High LedsDim                            ;Zet leds op dim stand (8,6Volt)

Begin:


If SensorBegin = 0 Then                                      ;Als sensor begin hoog is dan..
    If SensorEind = 1 Then                                   ;Als sensor eind laag is..
        GoSub LoopOp                                         ;Spring naar subroutine LoopOp
         Repeat                                                 
            If SensorEind = 0 Then                                   ;Als sensor eind hoog is..
                High BuitenLamp                                      ;Zet buitenlamp aan
                Repeat                                               
                    If SensorBegin = 0 Then GoTo Begin               ;Als sensor begin hoog is terug springen naar Begin
                    DelayMS 200                                      
                    Inc Timer4                                       ;Verhoog timer4 
                Until Timer4 = 200 Then                              ;Tot timer4 =200
                    GoSub LoopTerug                                  ;Spring naar subroutine LoopTerug
                    Low BuitenLamp                                   ;Zet buitenlamp uit
                    Clear Timer4                                     ;Zet timer4 op 0
                    GoTo Begin                                       ;Spring naar Begin:
                
            Else 
                If SensorBegin = 0 Then GoTo Begin                   ;Als sensor eind niet hoog is dan..
                DelayMS 100                                          
                Inc Timer2                                           ;Verhoog timer2
                EndIf
        Until Timer2 = 90 Then                                       ;Tot timer2 =90
           GoSub LoopTerug                                           ;Spring naar subroutine LoopTerug
           Clear Timer2                                              ;Zet timer2 op 0