Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 27.11.2009, 21:47 Titel: __FB_ARGC__ gibts nicht mehr? o_O |
|
|
Code: | Console.bas(27) error 41: Variable not declared, __FB_ARGC__ in 'ElseIf __FB_ARGC__ >= 2 Then' |
Code: | ElseIf __FB_ARGC__ >= 2 Then |
Das krasse:
Drei Zeilen weiter:
Code: | If __FB_ARGC__ > 2 Then
For n As Integer = 3 To __FB_ARGC__
sFile += Command(n)
Next
EndIf |
Und da gibts nichtmal ne Warning oder so. Habe auch mehrere male von den nicht bemängelten Stellen das ARGC kopiert... o_O |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4702 Wohnort: ~/
|
Verfasst am: 28.11.2009, 17:24 Titel: |
|
|
Ich bilde mir ja ein, dass ich __FB_ARGC__ an ein paar Stellen verwende und es keine Probleme macht. Muss mal gucken.
For n As Integer = 3 To __FB_ARGC__ sollte eigentlich sowieso übersprungen werden, wenn __FB_ARGC__ <= 2. Die Bedingungsabfrage sollte an der Stelle nicht notwendig sein. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 28.11.2009, 18:15 Titel: |
|
|
Das wundert mich ja auch irgendwie. Die danach folgenden Stellen produzieren keinen Fehler oder Warnung (was sie normalerweise tun sollten, wenn man eine nicht deklarierte Variable verwendet).
Lasse ich die Stelle weg, wo der Fehler auftritt (ersetzen durch festen Wert), dann tritt der Fehler bei der Nächsten auf. Irgendwie klingt das langsam immer mehr nach nen Compiler Bug o_O
Code: | Sub CCLI ()
If Len(Command(1)) > 3 Then
sFile = Command
bSleepAfterEnd = FALSE
bVerbose = FALSE
ElseIf __FB_ARGC__ >= 2 Then
sFile = Command(1)
If sFile[0] <> Asc("-") Then CEnd(CINVALID_CMDLINE)
bSleepAfterEnd = IIf(InStr(sFile, "s") <> 0, TRUE, FALSE)
bVerbose = IIf(InStr(sFile, "v") <> 0, TRUE, FALSE)
sFile = Command(2)
If __FB_ARGC__ > 2 Then
For n As Integer = 3 To __FB_ARGC__
sFile += Command(n)
Next
EndIf
Else
CEnd(CINVALID_CMDLINE)
EndIf
If FileExists(sFile) = vbFalse Then
CEnd("FATAL ERROR: File " & sFile & " doesn't exist!")
EndIf
End Sub
|
Ich habs jetzt erstmal anders gelöst:
Code: | If Len(Command(1)) > 3 Then
sFile = Command
bSleepAfterEnd = FALSE
bVerbose = FALSE
Else
sFile = Command(1)
If sFile[0] <> Asc("-") Then CEnd(CINVALID_CMDLINE)
bSleepAfterEnd = IIf(InStr(sFile, "s") <> 0, TRUE, FALSE)
bVerbose = IIf(InStr(sFile, "v") <> 0, TRUE, FALSE)
sFile = Right(Command, Len(Command) - (Len(Command(1))+1))
EndIf |
|
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4702 Wohnort: ~/
|
Verfasst am: 28.11.2009, 23:36 Titel: |
|
|
Zitat: | Lasse ich die Stelle weg, wo der Fehler auftritt (ersetzen durch festen Wert), dann tritt der Fehler bei der Nächsten auf. |
Das wiederum wundert mich nicht. Nach der Fehlermeldung tut fbc so, als ob die Variable definiert worden wäre (als INTEGER glaube ich), das ist bei anderen nicht definierten Variablen auch so.
Code: | foobar = "foo"
print foobar
foobar = "bar" |
Code: | fbc -w all "test.bas" (im Verzeichnis: /home/meinname/BASIC)
Kompilierung fehlgeschlagen.
test.bas(1) error 41: Variable not declared, foobar in 'foobar = "foo"'
test.bas(3) error 159: Invalid assignment/conversion in 'foobar = "bar"' |
Zu __FB_ARGC__: Kann es sein, dass die Variable nicht global (SHARED) definiert ist? _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 29.11.2009, 02:03 Titel: |
|
|
In anderen Programmen habe ich die auch in Subs, und da läuft es... |
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 19.05.2010, 20:15 Titel: |
|
|
Habe inzwischen bei einem anderen Programm auch dieses Problem. ARGV ist definiert, ARGC dagegen nicht. o_O ist das verbuggt... |
|
Nach oben |
|
 |
micha
Anmeldungsdatum: 09.12.2005 Beiträge: 72
|
Verfasst am: 20.05.2010, 00:38 Titel: |
|
|
Sollte nur auf Modul-Ebene funktionieren also nicht in subs.
Micha |
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 20.05.2010, 17:13 Titel: |
|
|
Tja, warum ist dann aber ARGV definiert? Das ist sehr inkonsequent... |
|
Nach oben |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 20.05.2010, 17:23 Titel: |
|
|
Ein Blick in die Referenz lohnt. Dort gibt es ein Bespiel, wie man das verwenden sollte.
ARGC ist ein Integerwert, ARGV ein Pointer auf einen ZString Ptr, also eigentlich wie in C auch, nur dass in C alles an ein Modul (nämlich 'main') übergeben werden muss, da es keinen Code außerhalb gibt.
Warum also soll FB da anders vorgehen als C.
Ein kleines Beispiel:
Code: | Declare Sub foo(argc As Integer = 0, argv As ZString Ptr Ptr = 0)
Print "Hauptprogramm:"
Print "ARGC: " & __FB_ARGC__
Print "ARGV: " & *__FB_ARGV__[0]
Print
foo(__FB_ARGC__, __FB_ARGV__) 'mit Übergabeparametern aufrufen
Print
foo 'ohne Übergabeparametern aufrufen
Print
Sleep
Sub foo(argc As Integer = 0, argv As ZString Ptr Ptr = 0)
If argc <> 0 And argv <> 0 Then
Print WStr("Unterprogramm mit Übergabe:")
Print "ARGC: " & argc
Print "ARGV: " & *argv[0]
Else
Print WStr("Unterprogramm ohne Übergabe:")
'Print "ARGC: " & __FB_ARGC__ 'beide sind in der Sub nicht bekannt
'Print "ARGV: " & *__FB_ARGV__[0] 'und müssen auskommentiert werden
EndIf
End Sub
|
So wie ich das sehe sind ARGV und ARGC nicht global definiert. |
|
Nach oben |
|
 |
|