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:

Gemogelter OVERLOAD möglich ?

 
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
tom_dehn



Anmeldungsdatum: 05.10.2015
Beiträge: 30

BeitragVerfasst am: 14.02.2018, 11:53    Titel: Gemogelter OVERLOAD möglich ? Antworten mit Zitat

Hallo,

öfters schon gelesen:

"Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht (AnyFUNC) nicht zur Verfügung und kann nur über __(AnyFUNC) aufgerufen werden."

AnyFUNC steht z.B. für __EXTERN, __SCREENPTR und und und ...

Q: Ob und wenn dann wie kann sich solche "Macros"(?) von -lang FB aufrufen?
Hintergrund: Das wäre ein gemogelter OVERLOAD

z.B: Trim[,any]
Code:
#undef trim
function trim overload (cntLeft as int,cntRight as int, anyString) as string 'cut ANY chars
 'links und rechts egal was wegzwicken
end function

function trim overload (anyString) as string 'cut ANY chars
 ' "classic"
  return (__TRIM(anyString)) ' oder wie auch immer
end function


Danke!
Tom
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 14.02.2018, 17:50    Titel: Antworten mit Zitat

Die Befehle wie __SCREENPTR gibt es in dieser Form nur in -lang "qb". Dass sie überhaupt existieren, hat einen einfachen Grund: SCREENPTR z. B. existieren in QBasic nicht, wäre dort aber ebenfalls ganz praktisch. Da es aber sein kann, dass der Funktionsname (der ja in QBasic kein reserviertes Schlüsselwort ist) im Programm bereits verwendet wird und man Kompatibilität zu QBasic herstellen will, wird stattdessen die Variante mit den beiden Unterstrichen genommen.

In FreeBASIC besteht dazu keine Notwendigkeit, und daher wird __SCREENPTR auch nicht definiert. Möglicherweise werden die Funktionen intern noch einmal anders bezeichnet und können auf diesem Weg aufgerufen werden, aber das müsste man im Detail im Quellcode des Compilers nachsehen - und für ganz akkurat halte ich diesen Weg dann auch nicht, weil sich ja jederzeit in einer neuen Compiler-Version was intern ändern könnte, was von außen (mit den "offiziellen" Befehlen) gar nicht sichtbar wird.

Zur Überladung hätte ich als Alternativvorschlag, deinen Befehl einfach anders zu nennen:
Code:
function powertrim overload (cntLeft as integer, cntRight as integer, anyString as String) as string 'cut ANY chars
 'links und rechts egal was wegzwicken
end function

function powertrim overload (anyString as String) as string
 ' "classic"
  return trim(anyString)
end function


(obwohl es mir scheint, als ob die erste Funktion eher eine modifizierte MID-Version sein soll).

Ansonsten ist FreeBASIC leider nicht dazu ausgelegt, bestehende Befehle zu überladen.
_________________
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
tom_dehn



Anmeldungsdatum: 05.10.2015
Beiträge: 30

BeitragVerfasst am: 14.02.2018, 20:59    Titel: Antworten mit Zitat

Danke Nemored.

Umfassende Antwort.

Folisofie ON
Ich habe mir halt gedacht, dass man Syntax einfach erweitern könnte,
wenn die Grundfunktion schon "von der Hand fließt".
Reservierte Worte haben wir schon genug in FB (IMHO).
Folisofie OFF

Gerade vor wenigen Minuten habe ich mich geärgert gerade über den TRIM mit Zusatz ANY.
Der macht keineswegs, was man (sprich:ich zwinkern ) erwartet.
Beispiel siehe unten.

Da könnte man als BugFix eine .bi oder so was einbauen, bis der Compiler
resp. die RTL eine neue Version erfährt.

Allgemein am Bsp. Trim (Syntax hier unbeachtlich) :
Code:

'REM' #undef trim  wollte ich vermeiden
dim fn trim overload (as string)=@__TRIM()
' die "reparierte" Version reinflicken
declare fn trim overload (s as string,ANY as string) as string


nemored hat Folgendes geschrieben:

Zur Überladung hätte ich als Alternativvorschlag, deinen Befehl einfach anders zu nennen

So weit war ich schon. Und wollte es vermeiden.

Hier also der Beispielcode zu meinem ANY-Problem:

Code:

'_trimany
dim As String str_B,str_A
str_A="!#ene mene mu#?"
Print str_A
:
str_B=Trim(str_A,"?!#")
' erwartet:#ene mene mu#
' noch "erwarteter", aber so nicht beschrieben:
' ene mene mu ( das wäre wohl ein TrimAll(s,ANY) )
' aber...
Print str_B
:
str_B=Trim(str_A,"!?")
Print str_B
str_B=Trim(str_A,"?!")
Print str_B
' man wird bescheidener...
str_B=Trim(str_A,"?")
Print str_B
Sleep


Anm.: Gerade obigen Code noch mal verifiziert. FB 1.05/x64, Win10

Mit Danke! und Grüssen
Tom
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 910
Wohnort: Austria

BeitragVerfasst am: 14.02.2018, 21:10    Titel: Antworten mit Zitat

Dein Beispielcode macht was er machen soll. Wenn du "any" nicht angibst muss die gesamte Zeichenfolge im String vorkommen, damit sie entfernt wird. Vielleicht kannst du erklären welchen Verhalten du dir erwartet hättest und welches du beobachtest?
_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 14.02.2018, 21:47    Titel: Antworten mit Zitat

Vielleicht hilft dir das hier beim Verständnis weiter:
http://users.freebasic-portal.de/nemored/buchBeginner/15_stringfunktionen.htm#kap15_2_6

(Falls es nicht weiterhilft, bitte melden, damit ich es verbessern kann. grinsen )
Die Kapitel 13-15 sind aber noch eher im Rohbau.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.


Zuletzt bearbeitet von nemored am 14.02.2018, 21:57, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 836
Wohnort: Ruhrpott

BeitragVerfasst am: 14.02.2018, 21:52    Titel: Antworten mit Zitat

nemored hat Folgendes geschrieben:
Ansonsten ist FreeBASIC leider nicht dazu ausgelegt, bestehende Befehle zu überladen.
Wobei sich die Frage erhebt, ob das wirklich ein Nachteil ist. Es dürfte nicht unbedingt die Lesbarkeit eines Quelltextes erhöhen, wenn ein Schlüsselwort neben der ursprünglichen Bedeutung zusätzlich noch alles mögliche sein kann.

tom_dehn hat Folgendes geschrieben:
Gerade vor wenigen Minuten habe ich mich geärgert gerade über den TRIM mit Zusatz ANY.
Der macht keineswegs, was man (sprich:ich zwinkern ) erwartet.
Das ist das vertrackte beim Programmieren: Der Computer macht nicht das, was du willst, sondern das, was du ihm sagst. Und das muß nicht zwangsläufig übereinstimmen. grinsen

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 14.02.2018, 22:10    Titel: Antworten mit Zitat

grindstone hat Folgendes geschrieben:
nemored hat Folgendes geschrieben:
Ansonsten ist FreeBASIC leider nicht dazu ausgelegt, bestehende Befehle zu überladen.
Wobei sich die Frage erhebt, ob das wirklich ein Nachteil ist. Es dürfte nicht unbedingt die Lesbarkeit eines Quelltextes erhöhen, wenn ein Schlüsselwort neben der ursprünglichen Bedeutung zusätzlich noch alles mögliche sein kann.

Ich sehe das weder als Vor- noch als Nachteil. Lisp beispielsweise zeichnet sich dadurch aus, seine Syntax selbst erweitern zu können. Andere Programmiersprachen bieten diese Möglichkeit nicht, und das ist auch in Ordnung so.
_________________
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
tom_dehn



Anmeldungsdatum: 05.10.2015
Beiträge: 30

BeitragVerfasst am: 24.02.2018, 08:06    Titel: Antworten mit Zitat

Hi,

typisch: ich war zu schusselig. Schlicht die eckigen Klammern um das Wort "ANY" herum übersehen und darum damit auch nicht herum probiert. lächeln
Danke für die Erhellung.

Damit es nicht zu theoretisch wird:
Code:
' und hier (grob!), was ich vorhatte:
' (brauch ich oefter mal insbes. bei Dateinamen)
Declare Function Unquote(s1 As String, pattern As String="""") As String

str_A="""'ene mene mu""'"
Print str_A
Print Unquote(str_A)
Print Unquote(str_A,"""'")
Sleep
End
'
Function Unquote(s1 As String, pattern As String="""") As String
 Return(Trim(s1, Any pattern))   
End Function


Tom

EDIT: Die Sache mit Aufrufen von "__irgendwas" war ja eh schon erledigt.
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