AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Array an procedure übergeben

Ein Thema von Igotcha · begonnen am 23. Dez 2003 · letzter Beitrag vom 28. Dez 2003
Antwort Antwort
Seite 1 von 2  1 2      
Igotcha

Registriert seit: 22. Dez 2003
544 Beiträge
 
Delphi 2006 Professional
 
#1

Array an procedure übergeben

  Alt 23. Dez 2003, 14:05
Hallo zusammen,

folgendes Problem:

Ich habe ein dynamisches Array der Form

Delphi-Quellcode:
type EKarte = record
    name: string;
    ort: integer;
    status: integer;
end;
mit

P1EKarte, P2EKarte: Array of Ekarte; und einem späteren

SetLength(P1EKarte,20).

Jetzt möchte ich das Array mischen und mir dazu eine Prozedur "mischen" schreiben, die von 0 bis High(P1EKarte) läuft und die Einträge von 0 bis zum Ende mit einem zufälligen Eintrag vertauscht. Dazu benötige ich aber ein Dummyrecord vom Typ EKarte als Zwischenspeicher.

Folgendes funktioniert schon mal nicht

Delphi-Quellcode:
procedure MixECards(PECards: Array of EKarte);
var
  CDummy: EKarte;
  ix: integer;
begin
    For ix:=0 to High(PECards) do
    begin
    CDummy:=Copy(PECards, ix, 1);
    end;
end;
Das Mischen selbst ist noch nicht implementiert, da ich hier bereits schon mit inkompatiblen Typen zu kämpfen habe.

Gruß Kay

[edit=sakura] [delphi]-Tags gesetzt. Mfg, sakura[/edit]
  Mit Zitat antworten Zitat
choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#2

Re: Array an procedure übergeben

  Alt 23. Dez 2003, 14:09
Hallo Igotcha,

die Erklärung für dieses Phänomens sowie eine brauchbare Lösung solltest Du in dem Thread array of String als Result einer Funktion finden.
gruß, choose
  Mit Zitat antworten Zitat
Benutzerbild von Sanchez
Sanchez

Registriert seit: 24. Apr 2003
Ort: Neumarkt Stmk
892 Beiträge
 
Delphi XE6 Enterprise
 
#3

Re: Array an procedure übergeben

  Alt 23. Dez 2003, 14:13
Zitat von Igotcha:
procedure MixECards(PECards: Array of EKarte);
var
CDummy: EKarte;
ix: integer;
begin
For ix:=0 to High(PECards) do
begin
CDummy:=Copy(PECards, ix, 1);
end;
end;

Das Mischen selbst ist noch nicht implementiert, da ich hier bereits schon mit inkompatiblen Typen zu kämpfen habe.
Die inkompatiblen Typen bekommst du aber beim Copy.
Willst du einfach die EKarte am Index ix in CDummy kopieren?

Wenn ja dann so:

  CDummy := PECards[ix]; grüße, daniel
Daniel
Testen ist feige!
  Mit Zitat antworten Zitat
Igotcha

Registriert seit: 22. Dez 2003
544 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Array an procedure übergeben

  Alt 23. Dez 2003, 15:52
Ja, beim Copy, stimmt.

CDummy := PECards[ix] funktioniert aber grundsätzlich.

Ich habe aber noch einen völlig anderen Denkfehler drin Das Array wird so natürlich in der Procedure schön gemischt, aber mein Input-Array nicht.

Ich benötige also folgendes:

Code:
GemischtesArray:=MixECards(UngemischtesArray);
oder

Code:
P1EKarte:=MixEcards(P1EKarte);
Wobei ein

Code:
P2EKarte:=MixEcards(P2EKarte) natürlich auch funktionieren sollte.
Das bekomme ich aber auch nicht so recht hin...

Gruß Kay
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

Re: Array an procedure übergeben

  Alt 23. Dez 2003, 16:11
Meinst du das so etwa ?

Delphi-Quellcode:
Type EKarte = Record
    name: String;
    ort: Integer;
    status: Integer;
  End;
  AEKarte = Array of EKarte;

Var P1EKarte: AEKarte;

Procedure MixECards(Var PECards: AEKarte);
  Var CDummy: EKarte;
    ix, p1, p2: Integer;

  Begin
    //For ix := 0 to High(PECards) do
    // CDummy := PECards[ix];
    For ix := 0 to 10000 do Begin
      p1 := Random(High(PECards)); //zu tauschende Karten ermitteln
      p2 := Random(High(PECards));
      CDummy := PECards[p1]; //Karten tauschen
      PECards[p1] := PECards[p2]
      PECards[p2] := CDummy;
    End;
  End;


...
MixECards(P1EKarte);
  Mit Zitat antworten Zitat
Igotcha

Registriert seit: 22. Dez 2003
544 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Array an procedure übergeben

  Alt 23. Dez 2003, 16:49
Ich versuche es mal etwas ausführlicher:

Gegeben ist

Code:
Type EKarte = Record
    name: String;
    ort: Integer;
    status: Integer;
  End;
Davon gibt es nun für die beiden Spieler

Code:
var
   P1Ekarte, P2EKarte: Array of Ekarte
Diese beiden Arrays werden nun mit den Karten der Spieler geladen. Da es ist keine festgesetzte Anzahl von Karten gibt, wurde ein dynamisches Array verwendet (beim Laden wird mit Setlength jeweils die Endgröße der Arrays P1EKarte und P2EKarte bestimmt.

Jetzt soll eine Funktion / Prozedur existieren, die die gefüllten Arrays "mischt". Nach dem Mischen sollen in den beiden Arrays jeweils die ursprünglichen Karten vorhanden sein, nur gemischt.

Gesucht ist also ein Funktion / Prozedur "MixECards" in der Form:

Code:
P1EKarte (gemischt) :=MixECards(P1Ekarte (ungemischt));
die sich dann auch als

Code:
P2EKarte (gemischt) :=MixECards(P2Ekarte (ungemischt));
benutzen lassen sollte.

Wie schon geschrieben, ein Mischen innerhalb der Prozedur habe ich hinbekommen, nur blieb da mein Input-Array unverändert.

Code:
procedure MixECards(PECards: Array of EKarte);
begin
     ...
end;
Bei einem MixEcards(P1EKarte) wurde praktisch "PECards" innerhalb der Prozedur gemischt, aber nicht "P1EKarte" als Ergebnis.

Gruß Kay
  Mit Zitat antworten Zitat
choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#7

Re: Array an procedure übergeben

  Alt 23. Dez 2003, 16:56
In dem Thread, auf den ich in meinem vorherigen Posting verwiesen habe, würdest Du etwas in der Art
Delphi-Quellcode:
type
  TMyArray = array of TMyType;

function MyFunc(const AParam: TMyArray): TMyArray;
begin
  SetLength(Result, Length(AParam));
  //...
end;

//...
  AnArray:= MyFunc(AnotherArray);
finden...
gruß, choose
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#8

Re: Array an procedure übergeben

  Alt 23. Dez 2003, 17:32
Also dann so ?

Delphi-Quellcode:
Type EKarte = Record
    name: String;
    ort: Integer;
    status: Integer;
  End;
  AEKarte = Array of EKarte;

Var P1Ekarte, P2EKarte: AEKarte;

Procedure MixECards(Var PECards: AEKarte);
  Var CDummy: EKarte;
    ix, p1, p2: Integer;

  Begin
    For ix := 0 to 10000 do Begin {je mehr Durchgänge, desto mehr wird gemischt}
      //2 Karten durch Zufall auswählen, die getauscht werden sollen
      p1 := Random(High(PECards));
      p2 := Random(High(PECards));
      //die Beiden ermittelten Karten austauschen
      CDummy := PECards[p1];
      PECards[p1] := PECards[p2];
      PECards[p2] := CDummy;
    End;
  End;

IrgendeineProzedur/Funkktion;
  Begin
    ...
    {hier sind die Karten noch ungemischt}
    MixECards(P1EKarte);
    MixECards(P2EKarte);
    {und hier sind sie gemischt}
    ...
  End;


Sowas ist doch nicht nötig:
Delphi-Quellcode:
Function MixECards(PECards: AEKarte): AEKarte;
  ...


P1EKarte := MixECards(P1EKarte);
P2EKarte := MixECards(P2EKarte);
Es geht doch so viel einfacher:
Delphi-Quellcode:
Procedure MixECards(Var PECards: AEKarte);
  ...


MixECards(P1EKarte);
MixECards(P2EKarte);
Die Angabe von VAR in der Parameterdeklaration der Prozedur gibt an, dass der übergebene Parameter geändert werden kann, daher ist auch der Umweg über ein zweites Array nicht nötig.
  Mit Zitat antworten Zitat
Igotcha

Registriert seit: 22. Dez 2003
544 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Array an procedure übergeben

  Alt 23. Dez 2003, 17:42
Zitat von choose:
type EDummy = array of EDummy; natürlich
und das habe ich geändert in

Delphi-Quellcode:
function MixECards(const AParam: EDummy): EDummy;

function MixECards(Var AParam: EDummy): EDummy;
Oh Mann, schwere Geburt, aber keine Typenfehler mehr

Vielen Dank Euch und ein frohes Fest...

Gruß Kay
  Mit Zitat antworten Zitat
choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#10

Re: Array an procedure übergeben

  Alt 23. Dez 2003, 17:48
Bitte ändere zunächst Deine Bezeichnungen. Typen, die mit einem großen "E" beginnen, haben in Delphi eine besondere Bedeutung...

Das Problem besteht erneut in den unterschiedlichen Typen TKarteArray (vormals EDummy) versus array of TKarte (vormals EKarte). Ändere einfach die Deklaration von P1EKarte entsprechend ab und es sollte funktionieren (abgesehen davon, dass Dir die Funktion MixCards (vormals MixECards) zwar ein Array der passenden größe allerdings mit nicht belegten Daten zurückgibt...).
gruß, choose
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:44 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz