Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 11.12.2008, 14:25 Titel: Parameter? |
|
|
Subs und Functionen (im weiteren Prozeduren genannt) können Parameter haben.
Prozeduren haben auch Addressen und daher kann man auch Pointer erzeugen die auf den "Anfang" einer Prozedur zeigen.
Code: |
dim pptr as sub(p1 as integer,p2 as integer,p3 as integer)
sub testen(p1 as integer, p2 as integer, p3 as integer)
print p1 &";" & p2 &";" & p3
end sub
pptr = @testen
pptr(10,20,30)
sleep
|
bei meinem Beispiel wird die sub "testen" mit 3 parametern aufgerufen. Soweit logisch und funktioniert so wie gedacht.
Was der Kompiler aber auch klaglos macht:
Code: |
dim pptr as sub()
sub testen(p1 as integer, p2 as integer, p3 as integer)
print p1 &";" & p2 &";" & p3
end sub
pptr = @testen
pptr()
sleep
|
Beim Ausführen kommts dann zu "seltsamen" Ergebnissen. Die Parameter der Sub wurden nicht übergeben und trotzdem kann eine solche sub aufgerufen werden.
Noch etwas: Umgekehrt geht es tatsächlich auch - Eine Sub die tatsächlich keine Parameter entgegen nimmt, kann per pointer mit parametern aufgerufen werden:
Code: |
dim pptr as sub(p1 as integer, p2 as integer, p3 as integer)
sub testen()
print "Hier gibts keine Parameter"
end sub
pptr = @testen
pptr(10,20,30)
sleep
|
Was mit den Werten der Parameter (10,20,30) geschieht weiss nur der liebe kompiler... vielleicht aber auch der nicht.
- Was genau geschieht bei der übergabe von Parametern an eine Prozedur?
- Woher kommen die Werte für p1,p2,p3 in meinem 2. Beispiel?
- In wie weit ist es gefährlich mit Zeiger auf Prozeduren umzugehen? |
|
Nach oben |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 11.12.2008, 14:40 Titel: |
|
|
Zitat: | Beim Ausführen kommts dann zu "seltsamen" Ergebnissen. Die Parameter der Sub wurden nicht übergeben und trotzdem kann eine solche sub aufgerufen werden. |
Was gibt das Prog denn bei Dir aus?
Bei mir wird das Prog korrekt ausgeführt. Nur, wenn ich die Parameterliste ändere, meldet der Compiler "Argument count missmatch". Also alles normal.
Dein zweites Beispiel (Parameter im Header der Sub angegeben, aber beim Aufruf nicht übergeben) ist logisch: Wenn die Parameter nicht übergeben werden, enthält der dafür reservierte Speicher zufällige Werte. Die werden dann halt angezeigt.
Allerdings: Du hast im getaggten Code die Sub nicht deklariert. Interessanterweise hat der Compiler das bei mir nicht bemängelt. Programm läuft trotzdem normal, und auch die Fehlermeldung (bei anderer Parameterliste) kommt. _________________ Und die Grundgebihr is aa scho drin- DOS is jo nett. |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 11.12.2008, 14:56 Titel: |
|
|
Zitat: | - Was genau geschieht bei der übergabe von Parametern an eine Prozedur? | Die Parameter werden über den Stack übergeben.
Sie dir mal das Asm-Listing an (Compileroption -R).
Zitat: | - Woher kommen die Werte für p1,p2,p3 in meinem 2. Beispiel? | Wenn vorher keine Werte auf den Stack gelegt wurden werden zufällig zuvor dort abgelegte Werte genommen.
Zitat: | - In wie weit ist es gefährlich mit Zeiger auf Prozeduren umzugehen? | Du kannst dir doch denken, dass es bei falscher Handhabung zu unvorhersehbaren Ergebnissen und auch Programmabsturz kommen kann. _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 11.12.2008, 15:04 Titel: |
|
|
Subs und funktionen muss man nicht deklarieren wenn sie über dem eigentlichen Programmcode stehen
Das 2. Beispiel gibt bei mir:
4199120;0;1245104
aus. Das meinte ich mit "seltsame " Ergebnisse. Ich denke das sind die zufälligen daten im reservierten speicher die du angesprochen hattest.
"Argument count mismatch" bekomme ich nur dann, wenn ich versuche eine andere anzahl von parametern an den zeiger der sub zu übergeben als bei der dimensionierung des sub-zeigers angegeben wurde.
Mich würde prinzipiell interessieren was genau beim aufruf einer sub über einen zeiger mit parametern geschieht... |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 11.12.2008, 15:52 Titel: |
|
|
Zitat: | Mich würde prinzipiell interessieren was genau beim aufruf einer sub über einen zeiger mit parametern geschieht... | Schau dir doch das Asm-Listing an... Code: | DIM pptr AS SUB(p1 AS INTEGER, p2 AS INTEGER, p3 AS INTEGER)
SUB testen()
PRINT "Hier gibts keine Parameter"
END SUB
pptr = @testen
pptr(10,20,30)
SLEEP
'.globl _TESTEN@0
'_TESTEN@0: 'SUB testen()
'push 1 'Platz für den Text
'push 26 '26 Zeichen
'push offset _Lt_0005
'call _fb_StrAllocTempDescZEx@8
'push eax 'PRINT
'push 0
'call _fb_PrintString@12
'ret 'END SUB
'.globl _main
'_main:
'
'mov eax, offset _TESTEN@0 'pptr = @testen
'mov dword ptr [ebp-8], eax '[ebp-8]->pptr
'push 30 'pptr(10,20,30) Werte auf den Stack
'push 20
'push 10
'call dword ptr [ebp-8] 'call pptr
'push -1
'call _fb_Sleep@4 'SLEEP | Die Parameter werden auf den Stack gelegt (push 30, push 20, push 10).
Normalerweise wird der Stack dann von der aufgerufenen Prozedur abgebaut , z.B. call _fb_Sleep@4 ein Integerwert wird auf den Stack gepuscht und 4 Byte (@4) werden von der Sleep-Prozedur abgebaut.
Deine SUB testen baut keine (_TESTEN@0) Byte vom Stack ab also verbleiben sie dort. _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 11.12.2008, 16:32 Titel: |
|
|
Okay, also mal davon abgesehen das ich mich an assembler bisher nich rangetraut hab, ists schon recht aufschlussreich! THX@ Volta  |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 11.12.2008, 17:25 Titel: |
|
|
Das ist wieder mal so ein Problem, wie auch bei "Privat nicht wirklich vertraulich?", mit Pointern.
Man hat in FB die Möglichkeit (Freiheit) auf vieles mit Pointern zuzugreifen, ohne dass der Kompiler einem den Spass verdirbt.  _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 12.12.2008, 12:27 Titel: |
|
|
Ja, einerseits ein Segen, andererseits muss man ganz genau wissen was man tut. Da warnt nichts und niemand vor fehlern  |
|
Nach oben |
|
 |
|