Frage zu DO-LOOP UNTIL

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • Frage zu DO-LOOP UNTIL

      Ich habe da mal eine Frage.
      Kann es sein, dass DO-LOOP UNTIL nur eine bestimmte Menge an Code verkraftet.

      Oder wie sonst sollte man diese Fehlermeldung deuten:

      Error : 221 Line : 2760 Backward jump out of range [_DO24 [ 2608]] , in File :....
      Diese Fehlermeldung "geht weg" wenn man etwas Code innerhalb des Do-Loop-Konstrukts auskommentiert.
      Es kommt dabei aber nicht auf den jeweiligen Code selbst an sondern offenbar auf die Menge.
      Das jeweils auskommentierte Codesegment für sich kann nämlich fehlerfrei kompiliert werden.
    • Was haste den für nen Prozessor benutzt? Ab ner gewissen Programmgrösse könnt das ja z.b. bei nem M2560 in den Bereich laufen der irgendwelche extra behandlungen braucht wenn das Programm z.b. schon im oberen Speicherbereich ist, die Rücksprungadresse aber im unteren. Da war doch irgendwas...
      Oder bist du einfach out of memory? Mal mit nem gösseren compiled?

      Tobias
    • Das ist ein ATMEGA1284P wo der Flash inzwischen mit gut 70% belegt ist.
      Was ich mir aber auf deinen Hinweis hin eventuell vorstellen könnte, wäre, dass der Compiler eventuell in 64k-Pages "denkt".
      Ich werde morgen mal versuchen, die betroffene SUB so nach oben zu verschieben, dass die sicher komplett innerhalb einer dieser Pages zu liegen kommt.
      Allerdings ist das ja nicht mein erstes Projekt mit einem 1284p, hab ich da bisher immer Glück gehabt?
    • Probier doch mal alles zwischen do und loop in eine sub zu packen, dass zwischen do und loop nur ein gosub steht. Dann ist die Sprungweite kurz.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Nachdem ein do..loop die Hauptschleife bildet und offensichtlich keine Probleme macht, ist ein do..loop until intern wohl anders umgesetzt. Das müsste aber doch auch mit einem if Abfrage then goto ersetzt werden können. Ein do..loop ist ja nur ein goto, und das until eine if-Abfrage.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Nachdem das Auslagern in Subs auch keinen Erfolg brachte.
      Habe ich mir mit dem auslösenden Code ein Testprogramm zusammen gestrickt welches nur mehr 5% Flash des ATmega1284p belegt.
      Und auch dieses Programm bringt beim Kompilieren den genannten Fehler.


      Error : 221 Line : 691 Backward jump out of range [_DO1 [ 2783]] , in File : D:\Arbeit\MicroController\BasCom\__TEST__\noname2.bas
      Ich suche weiter...
    • So hier ist der Code im Anhang (war sonst zu lang) mit dem man das Verhalten testen kann und auch die mögliche Lösung (oder besser Umgehung) dazu.
      Der Code ist übrigens so weit reduziert, dass die Subs und Funktionen neutral sind und einzelne Variablen mit zufälligen Werten belegt wurden.
      Dies tur aber nichts zur Sache, da es ja nur um das Kompilierverhalten geht und dieses hier sehr gut präsentiert wird.
      Meiner Meinung nach hat der BasCom-Kompiler hier ein Problem, da ich ein derartiges DO-LOOP-UNTIL - Konstrukt ja nicht zum ersten mal so verwende.Im Anlassfall verschluckt sich dieser aber am Befehl LOOP UNTIL X < 2.
      Was ich aber in so ferne eigenartig finde, weil im "großen" Programm dieses Befehlskonstrukt ja nicht nur einmal vorkommt sich der Kompiler aber nur bei diesem einem DO-LOOP-UNTIL verschluckt.

      Fehler.bas
    • @Zitronenfalter wenn du schreibst until 2>x ist der Fehler weg. Komischerweise ergibt x=2 auch keinen Fehler :huh:

      Es liegt wohl an dem < -Zeichen, ein 2 < x ergibt auch einen Fehler. So gesehen sollte man das < vermeiden.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------

      The post was edited 1 time, last by tschoeatsch ().

    • Es mag ja sein, dass der Kompiler Schluckauf bekommt beim Zeichen <.
      Nur müsste mir dann wer erklären, warum der Kompiler diesen erst jetzt bekommen hat.
      Es ist nämlich schon so, dass sich diese Befehlssequenz zum einen noch immer mehrmals und zum anderen nicht erst seit gestern im Progamm befindet und der Kompiler auch nur an einer Stelle meckert (und das auch erst nachdem dort wieder etwas Code hinzugefügt wurde).
      An den anderen Stellen wo es identem Bdedingungscode gibt, macht das dem Kompiler nichts aus.

      Es kann aber IMHO auch direkt nichts mit der Menge an Bytes innerhalb der Schleife zu tun haben, da durch dich inzwischen bewiesen wurde, dass wenn die Parameter nur verdreht werden, das ganze auch wieder funktioniert.
      Andererseits, wenn man dort Code auskommentiert, geht der Fehler auch wieder weg.
      Alles in allem ein Rätsel ?( .
    • Ob es funktioniert, weiß man nicht, es gibt halt keinen Fehler beim compilieren. Man müsste das halt mal im Assemblercode anschauen, vielleicht wird da ein bedingter Sprung mit ungenügender Reichweite verwendet. Ich kenn mich halt kaum bis garnicht damit aus.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Hallo,

      IDE ?

      Bekomme ab 2.0.8.0 auch ein Error : 211 Line : 1409 External routine not found [_NUM2BIN_INT], diese Meldung ist auch in ASM nicht nachvollziehbar. Code funktioniert nach wie vor mit verschiedene µC Typen seit 2010 fehlerfrei.

      Versuch es mal so zum Test mit eine ältere Version. Da kam bei mir keine Fehlermeldung mehr.

      Kann ja sein das der neue Hund nur bellt aber nicht beist.

      Gruß