Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 29.06.2009, 10:55 Titel: UDTs vergleichen |
|
|
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 |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 29.06.2009, 11:35 Titel: |
|
|
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 |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 29.06.2009, 11:47 Titel: |
|
|
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 |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 29.06.2009, 13:19 Titel: |
|
|
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 |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 29.06.2009, 13:42 Titel: |
|
|
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 .. 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 |
|
 |
Cherry
Anmeldungsdatum: 20.06.2007 Beiträge: 249
|
Verfasst am: 29.06.2009, 15:33 Titel: |
|
|
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 |
|
 |
|