Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 13.01.2008, 15:27 Titel: Fragen zu Static-Variablen |
|
|
Folgendes Beispiel: Ich erstelle in einer Sub oder Funktion eine STATIC-Variable. Der Wert der Variable bleibt nach Abschluß der Funktion erhalten, so daß ich sie beim nächsten Funktionsaufruf wieder abfragen kann.
Ist diese Variable dann auch im Hautprogramm gültig, wenn die Funktion schon abgeschlossen ist?
Umgekehrt: Kann ich eine Static-Variable, die im Hauptprogramm erstellt wird, auch in einer Funktion verwenden, oder muß ich sie als Parameter übergeben? _________________ Und die Grundgebihr is aa scho drin- DOS is jo nett. |
|
Nach oben |
|
 |
ytwinky

Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 13.01.2008, 16:11 Titel: Re: Fragen zu Static-Variablen |
|
|
Elektronix hat Folgendes geschrieben: | Ist diese Variable dann auch im Hautprogramm gültig, wenn die Funktion schon abgeschlossen ist? | Wenn die Variable im UP Static ist, gilt das nur für das UP, eine gleichlautende Variable im HP ist davon nicht betroffen.
Elektronix hat Folgendes geschrieben: | Umgekehrt: Kann ich eine Static-Variable, die im Hauptprogramm erstellt wird, auch in einer Funktion verwenden, oder muß ich sie als Parameter übergeben? | Wenn du sie Shared machst UND vor dem UP deklarierst, brauchst du sie nicht zu übergeben, wenn sie NICHT Shared ist, mußt du sie per Parameterliste übergeben. Zum Ausprobieren habe ich diesen Code: | Static Shared i As Integer=17+4
Static Shared j As Integer=4711
Sub Test()
Static j As Integer=4712
Print "i=" &i
Print "j=" &j
i*=2
End Sub
Test()
Print "i=" &i
Print "j=" &j
Print "Eniki..";
Sleep
End | benutzt(und die Ref natürlich..)
Gruß
ytwinky _________________
v1ctor hat Folgendes geschrieben: | Yeah, i like INPUT$(n) as much as PRINT USING.. | ..also ungefähr so, wie ich GOTO.. |
|
Nach oben |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 13.01.2008, 23:25 Titel: |
|
|
Danke für die Aufklärung. Ich habe jetzt folgendes Problem:
Ich habe ein Unterprogramm, in dem ein UDT erstellt wird, auf das aber im Hauptprogramm bzw. in anderen Funktionen zugegriffen werden soll. Als Zugriffsoperator soll dieses UP einen Pointer auf den UDT zurückgeben. Das kann so nicht gehen, weil nach Abschluß der Funktion der UDT ungültig wird und der Pointer dann ins Nirvana zeigt.
Ich müßte also den UDT VOR dem UP dimensionieren und dann ByVal übergeben. Das macht die ganze Sache aber wesentlich komplizierter. Welche Lösung gibt es da?
Bei der Gelegenheit: Unter Windows macht die Funktion "CreateWindow" genau das, nur daß sie ein Fensterhandle zurückgibt statt des Pointers. Wie funktioniert das? _________________ Und die Grundgebihr is aa scho drin- DOS is jo nett. |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 14.01.2008, 00:06 Titel: |
|
|
Wenn du den UDT im Hauptprogramm als SHARED definierst, kannst du auch im Unterprogramm darauf zugreifen. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
ytwinky

Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 14.01.2008, 00:21 Titel: |
|
|
Elektronix, hast du dir schon mal Type Forward Referencing angesehen?
Könnte sein, daß das was für dich ist.. _________________
v1ctor hat Folgendes geschrieben: | Yeah, i like INPUT$(n) as much as PRINT USING.. | ..also ungefähr so, wie ich GOTO.. |
|
Nach oben |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 14.01.2008, 10:42 Titel: |
|
|
@ytwinky
Danke für den Tip, ist für andere Belange sicherlich hilfreich.
Das Problem hierbei ist: Die Funktion, um die es geht, soll anhand eines UDT, der innerhalb der Funktion dimensioniert und initialisiert wird, eine kleine Frafik auf den Bildschirm zeichnen. Die Funktion soll später in eine .bi ausgelagert werden. Mit dieser Grafik soll dann das Hauptprogramm oder andere Funktionen agieren. Das müßte dann also auf den UDT zugreifen. Aber da die Funktion dann schon abgeschlossen ist, ist der UDT ungültig. D. h. auch der Forward-Referenzierte Zeiger hätte kein Ziel. Oder verstehe ich etwas falsch?
Ich setze den UDT nicht gerne als Shared fest, um die Zugriffe besser zu regeln. "So global wie nötig, so lokal wie möglich." _________________ Und die Grundgebihr is aa scho drin- DOS is jo nett.
Zuletzt bearbeitet von Elektronix am 14.01.2008, 10:45, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
croco97

Anmeldungsdatum: 04.11.2005 Beiträge: 260
|
Verfasst am: 14.01.2008, 10:44 Titel: |
|
|
@Elektronix:
So?
Code: |
TYPE Myudt
a as integer
END TYPE
'----------------------------------------------
Function myfunc() as Myudt ptr
dim as Myudt ptr temp
temp=allocate(Len(Myudt))
if (temp=NULL) then
? "Das war nix"
end
end if
temp->a=99
Function=temp
End Function
'-----------------------------
SUB main
dim as Myudt foo
foo=myfunc()
? foo->a
'Nicht vergessen!
deallocate foo
END SUB
|
|
|
Nach oben |
|
 |
|