Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Franz

Anmeldungsdatum: 24.03.2007 Beiträge: 111 Wohnort: Auf ner DVD ich bin nur ein Programm
|
Verfasst am: 26.10.2007, 22:09 Titel: Fehler beim aufrufen einer Sub weiß aber nicht wie . |
|
|
Hallo,
ich bekomme immer eine Fehlermeldung wenn ich eine Sub aufrufen will.
Hier mal den Code wo declariert wird und so:
Code: |
Declare SUB umfangvier (y as double, x as integer)
SUB umfangvier (y as double, x as integer)
... ... ... ...
|
Hier wird sie aufgerufen:
Code: |
If eing = "1" then
SUB umfangvier (y as double, x as integer)
end if
|
Dann kommt immer der Fehler: error 86: Illegal inside a compound statement or scoped block, found 'SUB' in 'SUB umfangvier (y as double, x as integer)'
Was will der da von mir ?
mfg
Franz |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 26.10.2007, 22:17 Titel: |
|
|
du hast da irgendwas grundsätzlich falsch verstanden.. Oo
Code: | sub blablubb(x as integer, y as integer)
print x*y
end sub
.. code bla ..
dim a as integer
dim b as integer
a = 1234
b = 2345
blablubb(a,b)
.. code bla .. |
_________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
 |
Franz

Anmeldungsdatum: 24.03.2007 Beiträge: 111 Wohnort: Auf ner DVD ich bin nur ein Programm
|
Verfasst am: 26.10.2007, 22:23 Titel: |
|
|
Hmm...
Na gut poste ich mal alles:
Code: |
Declare SUB umfangvier (y as double, x as integer)
Dim x as single
Dim y as single
SUB umfangvier (y , x)
for x = 1 to 260
Line (80,100 + x)-(80,90 + x)
Line (560,360 - x)-(560,350 - x)
for y = 1 to 990000
next y
next x
for x = 1 to 500
Line (570 - x,100)-(570 - x,100)
Line (70,350)-(70 + x,350)
for y = 1 to 950000
next y
next x
End SUB
|
Quellcode......
Sub aufrufen:
Code: |
If eing = "1" then
SUB umfangvier (y as double, x as integer)
end if |
|
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 26.10.2007, 22:38 Titel: |
|
|
Code: | Declare SUB umfangvier (y as double, x as integer)
Dim x as single
Dim y as single
SUB umfangvier (y as double , x as integer)
for x = 1 to 260
Line (80,100 + x)-(80,90 + x)
Line (560,360 - x)-(560,350 - x)
' Was soll das denn?
' for y = 1 to 990000
' next y
' Verzögerungen funktionieren mit SLEEP <ZeitInMillisekunden>
next x
for x = 1 to 500
Line (570 - x,100)-(570 - x,100)
Line (70,350)-(70 + x,350)
'for y = 1 to 950000
'next y
next x
End SUB |
Korrigierter Aufruf-Quellcode:
Code: | If eing = "1" then
umfangvier 123, 123
end if |
Ich kann mich da MisterD nur anschließen. Du solltest dir unbedingt mal die Einsteigertutorials auf FreeBasic-Portal.de und die Befehlsreferenzeinträge zu SUB usw. durchlesen.  _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
 |
Franz

Anmeldungsdatum: 24.03.2007 Beiträge: 111 Wohnort: Auf ner DVD ich bin nur ein Programm
|
Verfasst am: 26.10.2007, 22:47 Titel: |
|
|
Cool danke jetzt gehts !
Der Fehler war nur der Aufruf der Sub ?
Mit sleep habe ichs auch schon probiert, aber das mir leider etwas zu langsam.
Die Tutorials unter Freebasic-portal hab ich gelesen aber keine Antwort gefunden.
 |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 26.10.2007, 23:46 Titel: |
|
|
Das Schlüsselwort SUB brauchst du nur, um eine SUB zu deklarieren bzw. zu definieren. Beim Aufruf wird das Schlüsselwort nicht mehr verwendet. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Franz

Anmeldungsdatum: 24.03.2007 Beiträge: 111 Wohnort: Auf ner DVD ich bin nur ein Programm
|
Verfasst am: 27.10.2007, 21:34 Titel: |
|
|
Eine letzte Frage hätte ich, aber noch.
Warum ruft man die Sub auf und schreibt für jeden Parameter ein 123 ? |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 27.10.2007, 21:46 Titel: |
|
|
Hast du dir das hier schon mal durchgelesen? _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 27.10.2007, 21:46 Titel: |
|
|
Hä? Warum? Das müsstest du als Autor der Sub doch am Besten wissen.
Sebastian's Code war nur ein Beispiel für ein Programm, das die Sub verwendet. Insofern war auch der Integer 123 nur ein Beispiel.
Btw, wenn du solche For-Next-Schleifen als Pause verwendest, wirst du auf jedem Computer unterschiedlich lange Warteschleifen haben. Das kann mitunter ganz schön stark schwanken! Deshalb solltest du wirklich lieber entweder Sleep verwenden (arbeitet in FB mit Millisekunden, nicht wie in QB mit Sekunden!), ggf. mit dem zweiten Parameter 1, der es verhindert, die Wartezeit mit einem Tastendruck zu verkürzen. Oder sonst auch mit einer Do-Loop-Schleife und Timer-Auswertung, aber da seh ich jetzt nicht 'nen wirklichen Vorteil gegenüber der Sleep-Variante. _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
Franz

Anmeldungsdatum: 24.03.2007 Beiträge: 111 Wohnort: Auf ner DVD ich bin nur ein Programm
|
|
Nach oben |
|
 |
ytwinky

Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 27.10.2007, 22:20 Titel: |
|
|
Aber, was Variablen und Parameter sind weißt du schon, oder?
(optionale Parameter habe ich hier vorsichtigerweise mal ausgelassen) _________________
v1ctor hat Folgendes geschrieben: | Yeah, i like INPUT$(n) as much as PRINT USING.. | ..also ungefähr so, wie ich GOTO.. |
|
Nach oben |
|
 |
Franz

Anmeldungsdatum: 24.03.2007 Beiträge: 111 Wohnort: Auf ner DVD ich bin nur ein Programm
|
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 28.10.2007, 12:30 Titel: |
|
|
Lies dir am Besten doch mal die Tutorials hier durch. Jedenfalls die relevanten, Anfänger-Tutorials 1-4.
/edit:
Link http://www.freebasic-portal.de/index.php?s=tutorials _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
creepi
Anmeldungsdatum: 13.06.2010 Beiträge: 59
|
Verfasst am: 28.05.2011, 13:56 Titel: |
|
|
hi,
ich habe ein ähnliches problem
Erhalte als fehler meldung zb:
Code: | error 86: Illegal inside a compound statement or scoped block, found 'Declare' in 'Declare Sub TSNE_Disconnected (ByVal V_TSNEID as UInteger)
...........
der code
Declare Sub TSNE_Disconnected (ByVal V_TSNEID as UInteger)
Declare Sub TSNE_Connected (ByVal V_TSNEID as UInteger)
Declare Sub TSNE_NewData (ByVal V_TSNEID as UInteger, ByRef V_Data as String)
) |
Wenn ich das Script an sich ausführe funktioniert es.
Include ich es kommt der fehler, ich kanns mir nicht erklären.
Der code ist 1:1 übernommen, nur eben im programm per include und andere .bas filename eingefügt.
Die TSNE_V3 blieb unberühert.
Genutzt wurde die http-client variante.
Fehler durchs includen?
Hab die declare funktion ins hauptprogramm weiter oben verfrachtet anstatt weiter unten durch include. Da kam dann die SUB fehler meldung...
Code: | error 86: Illegal inside a compound statement or scoped block, found 'Sub' in 'Sub TSNE_Disconnected(ByVal V_TSNEID as UInteger)
...........
der code
Sub TSNE_Disconnected(ByVal V_TSNEID as UInteger)
|
Fehlermeldungen ziehen sich in länge was entweder Declare oder eben Sub betrifft.
EDIT
problem gelöst
Hab den code einfach mal vorne eingebaut und dann kam keine fehler meldung. Dann nochmal da eingebaut wo es war und Sie kam wieder.
Die Lösung? Hab mal ein ' vor Do und ein ' vor Loop gemacht und es ging.
Einfach komplett in eine schleife packen is wohl nicht ; D
Muss ich mal schauen wie ich es löse aber immerhin fehler behoben und da hab ich jetzt so lang dran gesessen ne ne ne, nächste mal frag ich früher
(manchmal kann es hilfreich sein was in den raum zu werfen)  |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 28.05.2011, 14:22 Titel: |
|
|
Das Problem ist wohl gewesen, dass du ein DECLARE nicht in eine Schleife packen kannst (das ist mit der Fehlermeldung 'llegal inside a compound statement or scoped block' gemeint); ein DECLARE muss sich immer auf oberster Modulebene befinden. Wenn sich in einer mit #INCLUDE eingebundenen Datei DECLARE-Zeilen befinden, darf dieses #INCLUDE natürlich auch nicht in einer Schleife stehen (was auch Sinn macht, weil du die Datei vermutlich nicht immer und immer wieder einbinden willst). _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 28.05.2011, 14:30 Titel: |
|
|
Auch wenn es nemored schon erklärt hat, hier nochmal ein Codebeispiel, dass den Fehler ebenfalls erzeugt:
Code: | For i As Integer = 0 To 5
Declare Sub foo (ByVal bar As Integer)
Next
For j As Integer = 0 To 5
Sub foo (ByVal bar As Integer)
'
End Sub
Next |
Wie gesagt dürfen Subs (und auch Functions) und deren Declare nicht innerhalb Anweisungsblöcken liegen. Das gilt für alle Blöcke, die einen Scope erzeugen. Andere Blöcke wie Type (nur Declare) oder Namespace lassen das aber schon zu. |
|
Nach oben |
|
 |
|