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:

Funktions-Zeiger mit Parametern

 
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: 16.02.2009, 11:55    Titel: Funktions-Zeiger mit Parametern Antworten mit Zitat

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



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 16.02.2009, 18:01    Titel: Re: Funktions-Zeiger mit Parametern Antworten mit Zitat

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



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 16.02.2009, 22:14    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 16.02.2009, 22:34    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 16.02.2009, 22:35    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 16.02.2009, 23:23    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 17.02.2009, 05:18    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 17.02.2009, 11:02    Titel: Antworten mit Zitat

KEWL!! es reich schon aus ein cdecl hinter den funktionszeiger zu schreiben und die funktion selber auch mit cdecl zu versehen.

Klasse lächeln
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