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:

operatoren überladen

 
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
Martin



Anmeldungsdatum: 05.06.2007
Beiträge: 19

BeitragVerfasst am: 26.08.2008, 18:56    Titel: operatoren überladen Antworten mit Zitat

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



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

BeitragVerfasst am: 26.08.2008, 19:09    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 05.06.2007
Beiträge: 19

BeitragVerfasst am: 26.08.2008, 19:39    Titel: Antworten mit Zitat

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



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

BeitragVerfasst am: 26.08.2008, 20:58    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 05.06.2007
Beiträge: 19

BeitragVerfasst am: 26.08.2008, 21:09    Titel: Antworten mit Zitat

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



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

BeitragVerfasst am: 26.08.2008, 21:33    Titel: Antworten mit Zitat

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. lächeln
_________________
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
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