PICBasic: Error: The basic file is nested too deeply

Deze foutmelding zag ik plotseling staan toen ik fanatiek aan het programmeren was
Wat kan ik doen om dit te voorkomen?
Kan ik dit oplossen door een ander type PIC te kiezen...

Het bestand staat in te veel submappen, heb het ook een keer gehad toen ik het op het bureaublad had opgeslagen, sla het anders direct op je hd op (X:\filname.bas)

Ik kan eea wel gewoon opslaan, maar of ik het kan proggen... Da's de vraag...
Daarom vraag ik me af of het op te lossen is met een grotere PIC

Je moet het ergens anders opslaan, dus niet in allemaal mapjes (dus ook niet op het bureaublad of in Mijn Documenten) gewoon direct op je hardeschijf (één mapje mag wel hoor), heeft niets met de PIC of jou programma te maken. Je kan het dus gewoon proggen als je het ergens anders opslaat.

Edit:
Het komt door het feit dat de compiler niet van lange namen houd (dus met allemaal mapjes ertussen).

[Bericht gewijzigd door Switching Power op ]

Fantomaz, ik ben benieuwd hoe je programma eruit ziet.

Als je met subroutines bezig bent:
Waarschijnlijk heb je dan een subroutine, waarin een GOSUB staat naar een andere subroutine, waarin daar weer een GOSUB staat naar weer een andere subroutine, waarin daar opnieuw een GOSUB staat naar nog weer een andere subroutine.
Bij een 16F628A ben je dan al uitgekakt en heb je "te diep genest".
De PIC moet alle terugkeer adressen onthouden en een 16F628A heeft maar een kleine stack geheugen (stapel geheugen) waar hij die terugkeeradressen in kan bewaren.
(Lees hiervoor ook PIC Basic cursus deel 6, het gedeelte van GOSUB op www.picbasic.nl/picbasic_nl )

Mogelijk is het nog wat anders, daarom schreef ik:
"Fantomaz, ik ben benieuwd hoe je programma eruit ziet."

Ik had inderdaad dat stukje over de Gosubs in je cursus gelezen. En ik had al zo'n vermoeden.
Ik zal waarschijnlijk ergens een return gemist hebben, waardoor de subroutine doorloopt in een volgende.

In hoofdlijnen bestaat het programma uit een hoofdlus waarin er, onder bepaalde condities (If then Gosub) een subroutine wordt uitgevoerd. Na deze "zijstraat" komt het programma weer terug in die hoofdlus. Ik kan me niet herinneren dat er binnen een zijstraat een volgende zijstraat zit.
Ik zal het eens doornemen.
Bedankt tot zover!

Gaat dit trouwens alleen op voor Gosubs? Of maken teveel While/Wend en IF/Then GOTO-regels de boel onhandelbaar?

Fantomaz

[Bericht gewijzigd door Fantomaz op ]

Het kan inderdaad ook zijn wat Switching Power schreef.
Als je PIC Basic cursus deel 1 gewoon opvolgt is er niets aan de hand.
Daar staat duidelijk onder Instellingen
1.
Lange mapnamen geven problemen bij het compileren, daarom is het belangrijk dat de compiler eerst goed wordt ingesteld!

Met daaronder 3 knoppen.
In de cursus wordt onder andere aanbevolen om eerst een map in de hoofddirectory te maken:
c:\PIC programma's

Dit moet direct achter C:\ omdat lange mapnamen (directorynamen zoals
C:\Documents and Settings\Frits\Mijn documenten\Programma's\PIC programma's) problemen geven bij het compileren.
Hier komen straks je Basic programma's in te staan.

Op 31 januari 2006 23:43:14 schreef Fantomaz:
Gaat dit trouwens alleen op voor Gosubs? Of maken teveel While/Wend en IF/Then GOTO-regels de boel onhandelbaar?
Fantomaz

Dit geldt niet voor WHILE - WEND, REPEAT - UNTIL, FOR - NEXT, IF...THEN...ELSE.

Mogelijke fout?
1 Gosub-opdracht leid naar een zijstraat waar er(afhankelijk van omstandigheden) op 2 plekken ge"returned" kan worden.
2x Return op 1 Gosub...

Op 31 januari 2006 23:45:19 schreef Frits Kieftenbelt:
In de cursus wordt onder andere aanbevolen om eerst een map in de hoofddirectory te maken:
c:\PIC programma's

Dit moet direct achter C:\ omdat lange mapnamen (directorynamen zoals
C:\Documents and Settings\Frits\Mijn documenten\Programma's\PIC programma's) problemen geven bij het compileren.
Hier komen straks je Basic programma's in te staan.

Ja, ik kan het me herinneren.
Daarbij heb ik meteen de fout ontdekt.
Ik werk nu op de laptop van mijn vrouw (Woonkamer nét even wat warmer dan studeerkamer) en ik werk met een .Bas file die ik op de PC in de studeerkamer heb staan...

Ik zal eens copieren en in de laptop plakken.
Ik vond het al zo gek dat ik het in de studeerkamer niet had.

[edit]
Dat ging niet op...
Het bestand plakken in een map c:\test blijft aangeven dat ik me te diep in de nesten heb gewerkt. Morgen ga ik dit uitspitten...

Op 31 januari 2006 23:53:22 schreef Fantomaz:
Ik zal eens copieren en in de laptop plakken.
Ik vond het al zo gek dat ik het in de studeerkamer niet had.

[edit]
Dat ging niet op...
Het bestand plakken in een map c:\test blijft aangeven dat ik me te diep in de nesten heb gewerkt. Morgen ga ik dit uitspitten...

En dan het gecopieerde bestand geopend?

Op 31 januari 2006 23:49:39 schreef Fantomaz:
Mogelijke fout?
1 Gosub-opdracht leid naar een zijstraat waar er(afhankelijk van omstandigheden) op 2 plekken ge"returned" kan worden.
2x Return op 1 Gosub...

Dat mag, als je maar 1 van die GOSUB's uitvoerd, anders krijg je ook een stack probleem.

GOSUB = adres op stack
RETURN = adres van stack wat met GOSUB er op gezet is.

Op 1 februari 2006 17:34:26 schreef Switching Power:
En dan het gecopieerde bestand geopend?

Eehh ja dat bedoelde ik ;-)
Ik kon het wel openen maar bleef die innestel melding krijgen.

Op 1 februari 2006 17:42:10 schreef Henry S.:
Dat mag, als je maar 1 van die GOSUB's uitvoerd, anders krijg je ook een stack probleem.

GOSUB = adres op stack
RETURN = adres van stack wat met GOSUB er op gezet is.

Wat houd dat stack gebreuren in, Henry?

Bedoel je het volgende:
PIC wordt door Gosub opdracht naar subroutine geleid.
In die subroutine zijn er omstandigheden die middels een GOTO langs 2 wegen bij een Return opdracht uitkomen.
Maar! Binnen 1 van die subs, kan een andere GOTO opdracht ook deze sub verlaten, buiten die Return om.
Is dit het struikelblok?

Dit is het struikelblok!
In cursus deel 6 wordt er echt voor gewaarschuwd.

Lees onder het kopje Nesten: in deel 6:
...Spring daarom ook nooit met een GOTO uit een subroutine, maar doe dat altijd met een RETURN.
Als je met een GOTO uit de subroutine springt, dan blijft de PIC het terugkeeradres onthouden terwijl hij al lang niet meer in de subroutine zit, waardoor op een moment het stapelgeheugen volloopt (= stack overflow)...

Op 1 februari 2006 22:02:05 schreef Fantomaz:
[...]

Eehh ja dat bedoelde ik ;-)
Ik kon het wel openen maar bleef die innestel melding krijgen.
[...]

Wat houd dat stack gebreuren in, Henry?

Bedoel je het volgende:
PIC wordt door Gosub opdracht naar subroutine geleid.
In die subroutine zijn er omstandigheden die middels een GOTO langs 2 wegen bij een Return opdracht uitkomen.
Maar! Binnen 1 van die subs, kan een andere GOTO opdracht ook deze sub verlaten, buiten die Return om.
Is dit het struikelblok?

http://plaatjes.metalruilen.nl/spank.gif

Duidelijk? :P

Op 1 februari 2006 23:37:57 schreef Frits Kieftenbelt:
Dit is het struikelblok!
In cursus deel 6 wordt er echt voor gewaarschuwd.

Lees onder het kopje Nesten: in deel 6:
...Spring daarom ook nooit met een GOTO uit een subroutine, maar doe dat altijd met een RETURN.
Als je met een GOTO uit de subroutine springt, dan blijft de PIC het terugkeeradres onthouden terwijl hij al lang niet meer in de subroutine zit, waardoor op een moment het stapelgeheugen volloopt (= stack overflow)...

OK dat is me duidelijk...
Ik zoek nu naar een andere oplossing. Ik denk aan een variabele die "hoog" wordt ipv de Goto opdracht.
Na de Return kan ik in het main programma wel die variabele koppelen aan die GOTO.

Op 1 februari 2006 23:55:53 schreef Henry S.:

[afbeelding]

Duidelijk? :P

@Henry...
Straf me, ik heb het verdient.
Je mag me opzoeken in recreatie gebied de bruine groene ster nabij Leeuwarden.
Sein maar met je autolampen dan kom ik vast wel naar je toe.
Ik weet niet hoe ik eruit zie, maar ik ben dan in voor alles.
Laat me even weten wat ik er van vond. ;-)

Ze moeten me vandaag wel hebben :P