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:

UDTs vergleichen

 
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: 29.06.2009, 10:55    Titel: UDTs vergleichen Antworten mit Zitat

Guten Morgen allerseits!

Kleine Frage: Gibt es eine Möglichkeit 2 UDTs miteinander zu vergleichen?

Im übertragenen Sinne: Schaut Apfel A so aus wie Apfel B ?

Code:


type Apfel
    x as integer
    y as integer
    farbe as string
end type

dim a as Apfel
dim b as Apfel

a.farbe = "Rot"
b.farbe = "Grün"

if a = b then print "Gleich" else print "Ungleich"


Dieser Code scheitert natürlich an der letzten Zeile.

Ich könnte mir jedoch die Existenz einer Funktion sehr gut vorstellen, die einfach den Inhalt der beiden Speicherbereiche von Apfel A und Apfel B (byte-weise) miteinander vergleicht. Der Computer muss ja nicht wissen was die Farbe eines Apfels bedeutet, solange er weiss ob da ein unterschied ist oder nicht..
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Mao



Anmeldungsdatum: 25.09.2005
Beiträge: 4409
Wohnort: /dev/hda1

BeitragVerfasst am: 29.06.2009, 11:35    Titel: Antworten mit Zitat

So weit ich weiß müsstest du dir so eine Equals()-Funktion selbst schreiben. Bietet sich an, die gleich mit in den UDT zu packen.
_________________
Eine handvoll Glück reicht nie für zwei.
--
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 29.06.2009, 11:47    Titel: Antworten mit Zitat

Hm.. wie könnte man so eine Funktion ausschauen? Sie müsste als Parameter die Adressen beider UDTs und den Datentyp mitbekommen.. und dann Byte für Byte durchgehen.. Gibts keine (Assembler?) Funktion die auf "unterster Ebene" Datenbereiche miteinander vergleichen kann? .. vor allem sollte sie möglichst schnell arbeiten.

Ich würde einfach eine For.. Next schleife programmieren wo ein byte-pointer vom Start bis Endpunkt durchgeschoben wird und die Werte vergleicht.. Aber ich denke das wäre noch nicht das ende der Weissheit oder?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 29.06.2009, 13:19    Titel: Antworten mit Zitat

Zitat:
Hm.. wie könnte man so eine Funktion ausschauen? Sie müsste als Parameter die Adressen beider UDTs und den Datentyp mitbekommen.. und dann Byte für Byte durchgehen..

Egal ob in Assembler oder Basic, die Vergleichsfunktion muss die Struktur des Types kennen um den Inhalt vergleichen zu können.
Byte für Byte reicht nicht, ein String wird mit Kennung, Stringlänge und Adresse auf den Stringinhalt abgelegt. Selbst wenn der String gleichen Inhalt hat wird die Adresse unterschiedlich sein.
Dann doch besser:
Code:
IF a.farbe = b.farbe THEN PRINT "Gleich" ELSE PRINT "Ungleich"

_________________
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: 29.06.2009, 13:42    Titel: Antworten mit Zitat

Hm.. stimmt.. an die String-Eigenschaften hatte ich gar nicht gedacht.. die wirklichen Inhalte eines String liegen dann ja gar nicht im Adressraum der UDT traurig .. Bei UDTs die aus zstrings und Zahlen besteht würds vielleicht noch funktionieren.. Aber das ist ja schon eine einschränkung die einem dann nicht wirklich weiterhilft...

Ok, trotzdem vielen Dank!!!!!!!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Cherry



Anmeldungsdatum: 20.06.2007
Beiträge: 249

BeitragVerfasst am: 29.06.2009, 15:33    Titel: Antworten mit Zitat

Du kannst das so umsetzen:

Code:
Type Mitarbeiter
   Vorname As String
   Nachname As String
   Alter As Integer
   Gehalt As Double
End Type

Operator = (lhs As Mitarbeiter, rhs As Mitarbeiter) As Integer
   #Define Check(fld) If lhs.fld <> rhs.fld Then Return 0
   Check(Vorname)
   Check(Nachname)
   Check(Alter)
   Check(Gehalt)
   Return -1
End Operator

Operator <> (lhs As Mitarbeiter, rhs As Mitarbeiter) As Integer
   Return Not (lhs = rhs)
End Operator

Dim As Mitarbeiter ma1, ma2, ma3

With ma1
   .Vorname = "Max"
   .Nachname = "Meier"
   .Alter = 30
   .Gehalt = 2637.50
End With

With ma2
   .Vorname = "Anna"
   .Nachname = "Huber"
   .Alter = 25
   .Gehalt = 2183.30
End With

ma3 = ma1

If ma1 = ma2 Then Print "ma1 = ma2"
If ma1 = ma3 Then Print "ma1 = ma3"
If ma2 = ma3 Then Print "ma2 = ma3"

If ma1 <> ma2 Then Print "ma1 <> ma2"
If ma1 <> ma3 Then Print "ma1 <> ma3"
If ma2 <> ma3 Then Print "ma2 <> ma3"

Sleep
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail 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