PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bacom FOR NEXT mit GOSUB Fehler?



dremler
23.07.2010, 23:22
Hallo,

ich hab folgenden code:



do

gosub trigger

For I = 0 To 2

Gosub 10
Gosub 0
Gosub 01
Gosub 1

Next I

loop

der geht nicht....die for next schleife wird nicht wiederholt...sondern nur einmal ausgeführt...(quasi ohne for next schleife)


ziel ist, dass


Gosub 10
Gosub 0
Gosub 01
Gosub 1


mehrfach ausgeführt wird.

warum gelingt das nicht?

die subs sind korrekt mit "label:" und "return"

Kampi
23.07.2010, 23:52
Mach mal das Do und das Loop weg. Wenn die Schleife nur von 0-2 laufen soll ist es bischen unnütz diese 3 Schleifendurchläufe dann in eine Endlosschleife zu packen oder?

dremler
23.07.2010, 23:58
das do loop ist die hauptschleife...


das in der for next schleife wird eine präambel, also eine zeit lang der gleiche code....


danach folgt ein anderer indvidueller code, dass ganze wiederholt sich dann....

for next wird am ende ca. 600 erreichen...

for_ro
24.07.2010, 00:02
Dim I As Byte
do

gosub trigger

For I = 0 To 2

Gosub 10
Gosub 0
Gosub 01
Gosub 1

Next I

Loop

10:
Print "10"
Return

0:
Print "0"
Return

01:
Print "01"
Return

1:
Print "1"
Return

Trigger:
Print "trigger"
Return
Dies läuft bei mir im Simulator.

Kampi
24.07.2010, 08:47
Eventuell liegt der Fehler bei dir in einer der Unterprogramme. Weil die For-Next Schleife sieht soweit in Ordnung aus.

Vitis
24.07.2010, 09:50
benutzt Du die Variable "I " auch in einer Subroutine?
Wenn ja hängts daran, dass dort der Wert gesetzt
wird und die for-Next dann aufgrund des neuen Wertes
verlassen wird.

peterfido
24.07.2010, 09:54
Da wird wohl I in einer der Subs benutzt.

Eine weitere Möglichkeit:



do

gosub trigger
gosub VierSubs
gosub VierSubs
gosub VierSubs


loop
end

VierSubs:
Gosub 10
Gosub 0
Gosub 01
Gosub 1

return



edit:

@Vitis: gleicher Gedanke...

PicNick
24.07.2010, 16:11
Bist du sicher, dass er z.B. bei GOSUB 0 den Label anspringt und nicht die Adresse 0

Oder ist das ein "O" ?

peterfido
24.07.2010, 16:18
Stimmt, ist mir gar nicht aufgefallen. Gosub 0 sollte man nicht verwenden. Überhaupt reine Zahlen...

for_ro
24.07.2010, 16:58
Bist du sicher, dass er z.B. bei GOSUB 0 den Label anspringt und nicht die Adresse 0

Oder ist das ein "O" ?
Bascom verarbeitet das so wie es da steht. Auch das Label 0: wird angesprungen. Hatte ich doch oben geschrieben.
Allerdings geht jetzt kein Goto 0 mehr, um einen Pseudo-Reset durchzuführen.
Ansonsten ist das ja ganz normal, Labels als Zahlen zu haben.
Ich wüsste keinen Grund, warum man das nicht machen sollte. Höchstens das Labels sinnhafte Namen haben sollten.

dremler
24.07.2010, 21:51
nein ich hab den fehler gefunden...gosub mit zahlen geht einwandfrei......

hatte I mehrfach verwendet...deshalb hat die schleife oben nicht funktioniert...war nur ein tippfehler..

PicNick
25.07.2010, 08:34
.....Höchstens das Labels sinnhafte Namen haben sollten.
Interessanter Gedanke. Sollte man vielleicht mal diskutieren.

dremler
25.07.2010, 09:36
das sind sinnhafte namen...die einzige aufgabe des Atmegas ist es eine gewisse 10101010110... folge zu produzieren.

Dabei gibt es die zustände 1 und 0 und die flankenübergänge 01 und 10.

das ganze wird durch ein 8 bit r2r netzwerk erzeugt.

ich könnte natürlich auch als namen "flankevonobennachunten:" oder "vonnullnacheins" nehmen...oder einfach die die oben stehen;)


die möglichkeit von peterfido hab ich absichtlich nicht genommen, da ich sonst eine sub mehr hätte, da ich ja "1" "0" "01" "10" sowieso brauche...:)

funkheld
25.07.2010, 13:44
das sind keine sinnhaften namen. das ist nur unsinn den bascom nicht versteht.

gruss

dremler
25.07.2010, 14:22
Es sind sinhafte namen und BASCOM versteht sie sehr wohl! Erst probieren, dann labern!

peterfido
26.07.2010, 20:38
Beides wird vom Compiler eh in Adressen umgewandelt. Sinnhafte Namen sind also nur für uns Programmierer einfacher zu handhaben. Ein gosub Uhranzeigen sagt mir mehr als ein gosub 1.

Meine Version von oben kann unter Umständen den fertigen Programmcode verkürzen, wie ich bei Optimierungsarbeiten schon feststellen durfte. Ebenso ist ein >=11 platzsparender als ein >10. Aber das ist OffTopic...

funkheld
18.08.2010, 19:17
Es sind sinhafte namen


Das ist dummes Zeug und kein sinnhafter Name: 0 01 0.... ](*,)

Richard
18.08.2010, 21:50
Es sind sinhafte namen und BASCOM versteht sie sehr wohl! Erst probieren, dann labern!

Verstehst DU die Labels noch in/nach 10 Jahren wenn Du den code noch einmal Brauchst? Dku, labels,kommentare...sind lästig aber sehr wichitig!

Gruß Richard