Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Parameter?

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 11.12.2008, 14:25    Titel: Parameter? Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Elektronix



Anmeldungsdatum: 29.06.2006
Beiträge: 742

BeitragVerfasst am: 11.12.2008, 14:40    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 11.12.2008, 14:56    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 11.12.2008, 15:04    Titel: Antworten mit Zitat

Subs und funktionen muss man nicht deklarieren wenn sie über dem eigentlichen Programmcode stehen zwinkern

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
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 11.12.2008, 15:52    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 11.12.2008, 16:32    Titel: Antworten mit Zitat

Okay, also mal davon abgesehen das ich mich an assembler bisher nich rangetraut hab, ists schon recht aufschlussreich! THX@ Volta lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 11.12.2008, 17:25    Titel: Antworten mit Zitat

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. grinsen
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 12.12.2008, 12:27    Titel: Antworten mit Zitat

Ja, einerseits ein Segen, andererseits muss man ganz genau wissen was man tut. Da warnt nichts und niemand vor fehlern happy
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz