| Autor |
Beitrag |
mars
      
Beiträge: 238
Debian Woody, Win 2000, Win XP
D7 Ent, Kylix 3
|
Verfasst: Fr 21.02.03 17:25
Ich weiss, der Titel dieses Threads ist nicht sehr aussagekräftig, aber ich weiss wirklich nicht, wie ich mein Problem genauer beschreiben könnte. Here it comes:
Ich übergebe einer Funktion einen Record-Typ, welchen sie bearbeiten soll. Nun wird diese Funktion mehrmals aufgerufen, soll aber nicht immer das gleiche Feld des Records bearbeiten. Zur Verdeutlichung:
Quelltext 1: 2: 3: 4: 5: 6:
| type beispieltyp= record grösse: Integer; länge: Integer; end;
var beispiel: beispieltyp; |
Die Funktion sieht (bis jetzt) folgendermassen aus:
Quelltext 1: 2: 3: 4: 5: 6:
| function irgendwas(var t: beispieltyp); begin ... inc(t.grösse) ... end; |
Ich möchte nun aber statt dem .grösse beim zweiten aufruf der funktion das Feld .länge verändern. Welchen Typ müste ich als Parameter in dieser Funktion also angeben, um eine Art Schlüssel zu erhalten. Damit es noch etwas verständlicher wird (ich hoffe natürlich, es ist schon...  )wäre hier mein ziel:
Quelltext 1: 2: 3: 4: 5: 6:
| function irgendwas(var t:beispieltyp, schlüssel: schlüsseltyp) begin ... inc(t.schlüssel); ... end; |
und der Funktionsaufruf würde dann zb so aussehen:
Quelltext 1: 2: 3:
| irgendwas(beispiel, grösse); ... irgendwas(beispiel, länge); |
Wenn mir das jemand erklären könnte, wäre das wirklich super!
Danke im Voraus![/b]
|
|
MSCH
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: Fr 21.02.03 20:03
Titel: re: Schlüssel
Hallo,
Gutes Beispiel wie mans nicht machen sollte. Erstelle doch ein Objekt und stelle entsprechende Funktionen zur Verfügung:
Quelltext 1: 2: 3: 4: 5: 6: 7:
| type Tbeispiel = TClass Groesse: Integer; Laenge: Integer; procedure IncGroesse(value:Integer); procedure IncLaenge(value:Integer); end; |
...
Quelltext 1: 2: 3: 4: 5:
| procedure Tbeispiel.IncGroesse; begin inc(Groesse,value);end;
procedure Tbeispiel.IncLaenge; begin inc(Laenge,value);end; |
Verwende die Klasse wie folgt:
...
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| var Beispiel: Tbeispiel; begin Beispiel:= Tbeispiel.Create; Beispiel.IncLaenge(1); Beispiel.IncGroesse(-1); ... Beispiel.Free; end; |
Viel Erfolg
|
|
derDoc
      
Beiträge: 623
Win Vista Prof
D2007 Prof
|
Verfasst: Fr 21.02.03 20:13
Also zuerst muss ich MSCH zustimmen, denn das ist wirklich ein negativ Beispiel. Aber wenn du trotzdem wissen willst, wie man das machen könnte ist hier ein Vorschlag:
Du definierst einen Typ als array [0..1] of String mit den Möglichkeiten Groesse und Laenge. Dann setzt du diesen Typ als Variablentyp ein und fragst über case of ab, ob der eine oder der andere übergeben ist.
_________________ MfG derDoc
There are only 10 types of people: those who understand binary and those who don't.
|
|
mars 
      
Beiträge: 238
Debian Woody, Win 2000, Win XP
D7 Ent, Kylix 3
|
Verfasst: Fr 21.02.03 23:15
danke mal für die antworten.
@MSCH: natürlich sinds nicht so einfache Funktionen wie inc(). das war ja nur zur Verdeutlichung. Genau genommen soll beim ersten Funktionsaufruf ein Feld des array-records mit Quicksort sortiert werden, beim zweiten mal ein anderer Teil.
@DerDoc: ja sowas habe ich mir schon auch überlegt, aber der Quellcode sollte eben auch noch schön aussehen, deshalb kann ich mir sowas nicht erlauben
Ich werde mir also was anderes überlegen müssen. Trotzdem vielen Dank.
|
|
mars 
      
Beiträge: 238
Debian Woody, Win 2000, Win XP
D7 Ent, Kylix 3
|
Verfasst: Sa 22.02.03 09:33
etwas würde mich hier aber schon noch interessieren. Warum sollte man das nicht machen? Und weshalb ist das ein Negativ-Beispiel?
|
|
MSCH
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: Sa 22.02.03 13:30
Titel: Negativ vs. Positiv
Hi,
negativ darum, wenn du immer die gleiche Funktion die auf ein und dieselbe Variable zugreift, ggf. ein dutzend mal im Quellcode hast und ggf. dann auch überall ändern musst. Borland hat ja darum aus Pascal (procedurale Sprache) viele Erweiterungen reingebastelt und eine Klassen (Objekt) orientierte Sprache gemacht. Positiv deshalb, Du deklariert ein Objekt, zugehörige Variablen und Funktionen einmal und verwendest diese im gesamten Quelltext. Zukünftige Erweiterungen deines Programmes beschränken sich dann auf die Objekte. Weiterhin ist die Vererbarkeit von Klassen. Hierüber jetzt was zu posten würde etwas den Rahmen sprengen, vieleicht schaust du mal in Delphi Büchern nach. Dort ist i.d.R. gut die Vererbung beschrieben.
Grüße
MSCH
|
|
mars 
      
Beiträge: 238
Debian Woody, Win 2000, Win XP
D7 Ent, Kylix 3
|
Verfasst: Sa 22.02.03 15:02
Leider verstehe ich dich nicht ganz, denn ich will ja die Funktion genau nicht mehrere Male im Quellcode haben und immer anpassen müssen. Deshalb habe ich ja nach einem Schlüssel gesucht. Natürlich ist mir klar, dass Objekten die perfekte Lösung wären, aber wenn du meinen gesamten Quellcode anschauen würdest, sähest du, dass dies nicht möglich ist.
|
|
MSCH
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: Sa 22.02.03 15:43
Titel: geht nicht gibts nicht!
| mars hat folgendes geschrieben: | | Leider verstehe ich dich nicht ganz, denn ich will ja die Funktion genau nicht mehrere Male im Quellcode haben und immer anpassen müssen. Deshalb habe ich ja nach einem Schlüssel gesucht. Natürlich ist mir klar, dass Objekten die perfekte Lösung wären, aber wenn du meinen gesamten Quellcode anschauen würdest, sähest du, dass dies nicht möglich ist. |
Hi, das glaube ich dir nicht, dass es nicht geht.
 Überlege mal, was ist, wenn ein Datentyp hinzukommt? Du müsstest nicht nur den Schlüssel ändern sondern auch die aufrufenden Routinen. Ersetz doch einfach Record mit Class füge die Funktion hinzu und schon hast du eine schöne Objektorientierte Sprache. Wenn Du dann noch eine Basisklasse definierst und für jeden Datentyp einfach eine Ableitung sprich Vererbung machst, ist's noch einfacher.
Und - ein Objekt ist erst vorhanden, wenn es eine Instanz (mit New bzw. Create) gibt, schont den Arbeitsspeicher.
Grüße
MSCH
|
|
mars 
      
Beiträge: 238
Debian Woody, Win 2000, Win XP
D7 Ent, Kylix 3
|
Verfasst: Sa 22.02.03 17:24
Dann musst du mir aber schon erklären, wie das funktionieren soll:
Ich habe nämlich einen Array des Typs Record. Und dieser Array soll nun zuerst nach Record.Integer1 sortiert werden; dann kommen einige Zeilen Quellcode und dann soll das gleiche Array nach Record.Integer2 sortiert werden.
Wie soll das nun mit Objekten gehen?!? Also wenn du mir das erklären kannst...dann... 
|
|
MSCH
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: Sa 22.02.03 22:01
Titel: Beispiel
HI
Ein Beispiel würde hier einige Seiten füllen sorry  , aber wenn du dir die Quelltexte von TSTRINGLIST anschaust und statt Strings ein Objekt nimmst, hast du die Lösung. Du musst dort nicht alle Funktionen übernehmen, nur die fürs einfügen, verschieben und löschen.
Dass ist deine Basisklasse. Nun leitest du eine weitere ab und überschreibst die Sortierroutinen (e.g. Feld_1). Dann leitest Du wieder eine Klasse ab und überschreibst wieder die Sortierroutine (e.g.Feld_2).
MFG MSCH
|
|
HeLe
      
Beiträge: 21
|
Verfasst: So 02.03.03 11:52
du kannst die objekte auch einfach in eine tobjectlist schmeißen und dann mittels der sort-methode sortieren. diese methode erwartet eine vergleichsfunktion als parameter, wodurch du nach jedem beliebigen schlüssel sortieren kannst
|
|
mars 
      
Beiträge: 238
Debian Woody, Win 2000, Win XP
D7 Ent, Kylix 3
|
Verfasst: So 02.03.03 13:04
@HeLe: Danke. Genau das werde ich jetzt machen.
|
|
|