 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Martin
Anmeldungsdatum: 05.06.2007 Beiträge: 19
|
Verfasst am: 26.08.2008, 18:56 Titel: operatoren überladen |
|
|
Hi Leute, Ich finde leider kein Dokument, dass folgende Aktivität beschreibt:
Ich möchte meinem Objekt einen Zuweisungsoperator zur Indexierung wie bei einem Array verpassen.
Code: |
declare operator () (Index as ubyte) as BITMAP ptr
|
funktioniert schon mal nicht.
Oder geht das vielleicht gar nicht ?
Danke für die Unterstützung |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 26.08.2008, 19:09 Titel: |
|
|
Mit OPERATOR kannst du für eigene Typen überladen. Ich habe irgendwo ein Beispiel, ich suche mal schnell.
Hmm, hatte noch nichts online, aber das hier stammt aus meinem nie vollendeten Tutorial ...
Code: | TYPE bruch
zaehler AS INTEGER
nenner AS INTEGER
DECLARE CONSTRUCTOR ( z AS INTEGER, n AS INTEGER = 1 )
DECLARE CONSTRUCTOR
DECLARE OPERATOR CAST() AS DOUBLE
DECLARE OPERATOR CAST() AS STRING
END TYPE
DECLARE OPERATOR * ( BYREF b1 AS bruch, BYREF b2 AS bruch ) AS bruch
DECLARE SUB bruchKuerzen( BYREF b AS bruch )
DECLARE FUNCTION ggT ( BYVAL n1 AS INTEGER, BYVAL n2 AS INTEGER) AS INTEGER
CONSTRUCTOR bruch ( z AS INTEGER, n AS INTEGER = 1 )
' legt den Bruch z/n an
this.zaehler = z
this.nenner = n
bruchKuerzen(this)
END CONSTRUCTOR
CONSTRUCTOR bruch
' ohne Angaben wird der Bruch 0/1 angegeben
this.zaehler = 0
this.nenner = 1
END CONSTRUCTOR
OPERATOR bruch.CAST() AS DOUBLE
' wandelt eine Bruchzahl in eine Dezimalzahl um
RETURN this.zaehler / this.nenner
END OPERATOR
OPERATOR bruch.CAST() AS STRING
' gibt einen Bruch als STRING in der Form zaehler/nenner zurueck
RETURN STR(this.zaehler) + "/" + STR(this.nenner)
END OPERATOR
OPERATOR * ( BYREF b1 AS bruch, BYREF b2 AS bruch ) AS bruch
DIM neuZ AS INTEGER = b1.zaehler*b2.zaehler
DIM neuN AS INTEGER = b1.nenner*b2.nenner
RETURN TYPE <bruch> ( neuZ, neuN )
END OPERATOR
SUB bruchKuerzen ( BYREF b as bruch )
' kuerzt einen Bruch, in dem es Zaehler und Nenner
' durch den groessten gemeinsamen Teiler teilt
DIM teiler AS INTEGER
teiler = ABS ( ggT ( b.zaehler, b.nenner ) )
' sicherstellen, dass der Nenner nicht negativ ist
IF b.nenner < 0 THEN teiler = -teiler
b.zaehler \= teiler
b.nenner \= teiler
END SUB
FUNCTION ggT(byVal n1 AS INTEGER, byVal n2 AS INTEGER) AS INTEGER
' rekursive Berechnung des ggT von ytwinky, siehe Code-Beispiele
DIM AS INTEGER Ergebnis = n1 MOD n2
RETURN IIF(Ergebnis, ggT(n2, Ergebnis), n2)
END FUNCTION
DIM zahl1 AS bruch = bruch(15, 25)
DIM zahl2 AS bruch = bruch(10, 21)
' Wie man sieht, wird zahl1 bereits automatisch gekuerzt.
' CAST(STRING, bruchzahl) funktioniert genauso wie STR(bruchzahl).
PRINT "zahl1 = " + CAST(STRING, zahl1) + " = "; CAST(DOUBLE, zahl1)
PRINT "zahl2 = " + STR(zahl2) + " = "; CAST(DOUBLE, zahl2)
' Multiplikation und Ausgabe des Ergebnisses
' Als Standardausgabe fuer UDTs verwendet FreeBASIC STR().
PRINT zahl1; " * "; zahl2; " = "; zahl1 * zahl2 |
Der Zuweisungsoperator ist LET. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Martin
Anmeldungsdatum: 05.06.2007 Beiträge: 19
|
Verfasst am: 26.08.2008, 19:39 Titel: |
|
|
Danke für die Antwort.
Leider hat sie mich nicht weiter gebracht.
LET wird verwendet, wenn man einen Wert zuweisen will.
Was ich aber machen will, ist eine zuweisung wie bei einem Array.
Also:
Objekt(5) = 3
Wert = Objekt(5)
Geht das auch über LET?
Ich habe das Gefühl, das dies irgendwie garnicht geht. |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 26.08.2008, 20:58 Titel: |
|
|
Ich weiß noch nicht so ganz genau, was du machen willst. Du kannst hier (soweit ich mich entsinne) immer nur den ganzen Typen zuweisen. Wenn du nur ein bestimmten Record belegen willst (?), dann müsstest du den direkt ansprechen oder eine eigene Funktion dafür anlegen.
Wie sieht denn dein UDT aus und was davon willst du mit deiner Überladung belegen? _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Martin
Anmeldungsdatum: 05.06.2007 Beiträge: 19
|
Verfasst am: 26.08.2008, 21:09 Titel: |
|
|
Mein Typ ist
Code: |
type THEMA
Name as string*256
Grafiken as BITMAP ptr
declare constructor(Dateiname as string)
declare function extrahieren(Index as ubyte) as BITMAP ptr
end type
constructor THEMA(Dateiname as string)
dim Palette as PALETTE ptr
Grafiken = load_bitmap(Dateiname, Palette)
set_palette(Palette)
end constructor
function THEMA.extrahieren(Index as ubyte) as BITMAP ptr
return create_sub_bitmap(Grafiken, Index*16, 0, 8, 8)
end function
|
Ich will das Thema wie ein Array indexieren können um an die Rückgabewerte der methode extrahieren zu kommen. Also:
dim Thema as THEMA = "Thema.bmp"
dim Grafik as BITMAP ptr
Grafik = Thema[0] |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 26.08.2008, 21:33 Titel: |
|
|
Nein, das wird, soweit ich weiß, in FreeBASIC nicht gehen.
(abgesehen von der doppelten Verwendung des Wortes Thema einmal als Typ und einmal als Variable)
Ich sehe aber auch keinen Vorteil gegenüber dem Zugriff Variable.grafik.  _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
|
|
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.
|
|