Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 16.02.2009, 11:55 Titel: Funktions-Zeiger mit Parametern |
|
|
Hallo, ich werkel grade an einem kleinen progrämchen, welches Funktionen (mit rückgabewerten) in eine verkettete liste aufnimmt und abarbeitet.
Dabei haben die Funktionen unterschiedlich viele Parameter, aber maximal 20 stück.
Nun stoße ich dabei auf ein kleines problem
Hier ein kleines (funktionierendes) Beispiel:
Code: |
dim s1 as function(p1 as string,p2 as string,p3 as string) as string
function einesub(t as string) as string
return "#" & t & "#"
end function
s1 = @einesub
print s1("hallo welt!","","")
sleep
|
Und hier was NICHT funktioniert:
Code: |
dim s1 as function(p1 as string,p2 as string,p3 as string) as string
function einesub(t as string) as string
return "#" & t & "#"
end function
dim o as string
s1 = @einesub
o = s1("hallo welt!","","")
print o
sleep
|
Mir ist klar, das es nicht ganz korrekt ist, einem Funktionszeiger eine Funktion zuzuweisen die eine andere anzahl von parametern hat als beim der funktionszeiger definiert wurde.
Aber mich wundert es aber prinzipiell das das erste beispiel wunderbar, genau so wie es soll, funktioniert, aber das 2. nicht!
Kann mir jemand weiterhelfen wie ich im 2. beispiel an den korrekten rückgabewert rankomme? |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 16.02.2009, 18:01 Titel: Re: Funktions-Zeiger mit Parametern |
|
|
OneCypher hat Folgendes geschrieben: | Aber mich wundert es aber prinzipiell das das erste beispiel wunderbar, genau so wie es soll, funktioniert |
Mich auch; mein Compiler meldet beim ersten Beispiel (und beim zweiten auch) ein
Zitat: | test.bas(7) warning 4(1): Suspicious pointer assignment |
(fbc 0.20.0 for linux) _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 16.02.2009, 22:14 Titel: |
|
|
Die Anzahl der übergebenen Parameter stimmt nicht überein!
So gehts:
Code: | DIM s1 AS FUNCTION(p1 AS STRING,p2 AS STRING,p3 AS STRING) AS STRING
FUNCTION einesub(t AS String,t2 AS String,t3 AS STRING) AS STRING
RETURN "#" & t & "#"
END FUNCTION
DIM o AS STRING
s1 = @einesub
o = s1("hallo welt!","","")
PRINT o
SLEEP |
_________________ 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: 16.02.2009, 22:34 Titel: |
|
|
dass die anzahl der parametern von funktionszeiger und funktion unterschiedlich sind möchte ich ja auch haben!!
Allerdings hätte ich auch gerne das die rückgabewerte richtig abgegeben werden, wenn ich eine funktion über einen funktionszeiger mit mehr parametern aufrufe als die funktion selber besitzt.
mein ziel ist es eine art "api" bereitzustellen. Eine art runtime die mit dlls im befehlsumfang zur laufzeit erweitert werden kann. den code werde ich auch noch hier reinstellen. bisher läufts ganz gut, bis auf den umstand das ich jede funktion um die ich die runtime erweitern möchte ständig 20 parameter im kopf haben müssen.. das nervt irgendwie.
wenn man eine funktion schreibt möchte man ja bei der deklaration nicht mehr parameter definieren als man wirklich braucht... |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 16.02.2009, 22:35 Titel: |
|
|
das mit dem suspicius pointer assignment kann man per cast umgehen, aber die mühe mache ich mir in den ersten versuchen oft nicht, entschuldigt diese nachlässigkeit bitte. soweit ist es aber ein vernachlässigbare warnung. |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 16.02.2009, 23:23 Titel: |
|
|
das passiert wenn man die Frage nicht zu Ende liest.
schau dir dies mal an:
http://www.freebasic-portal.de/index.php?s=reftopic&id=556 _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 17.02.2009, 05:18 Titel: |
|
|
Wenn du eine unbekannte anzahl an argumenten einer funktion / sub übergeben willst, dann macht man sowas entweder mit overload (was allerdings dafür nicht sonderlich geeigent ist), oder aber (was weitaus sinvoller ist) mit Va_Arg, Va_First, Va_Next
Das ist quasi eine Linked list im Stack, wenn man das mal einfach betrachen will.
[edit ...] so wie volta, schon vor mir, angemerkt hat.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 17.02.2009, 11:02 Titel: |
|
|
KEWL!! es reich schon aus ein cdecl hinter den funktionszeiger zu schreiben und die funktion selber auch mit cdecl zu versehen.
Klasse  |
|
Nach oben |
|
 |
|