Arrays zuweisen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Arrays zuweisen

Beitrag von Komoluna »

Liebes Forum,

mein Problem ist folgendes:

Code: Alles auswählen

 
Var
  Effectivity: Array [0..16,0..16] Of Float; 
 
[...]
 
  Effectivity[0] := [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.5, 0, 1, 1, 0.5]; 
 
Der Compiler sagt dazu: "pokemon.pas(32,23) Error: range check error in set constructor or duplicate set element"
Da das Array 289 Zellen groß ist, möchte ich nicht für jede Zelle eine eigene Codezeile ("Effectivity[0,0]:=1;...") verwenden...

Ich habs sowohl mit einem Statischen, als auch einem dynamischen Array probiert, selber Fehler...

Wenn man ein Array als Parameter übergibt, dann funktioniert das ja, z.B:

Code: Alles auswählen

Canvas.Polygon([Point(0,0),Point(10,55)])
Wie kann man mit möglichst wenig Code ein großes Array beschreiben, wenn jede Zelle einen speziellen Wert hat(nicht einfach mit Schleifen lösbar)?

MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2822
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Arrays zuweisen

Beitrag von m.fuchs »

So zum Beispiel:

Code: Alles auswählen

var
  Effectivity: array [0..16, 0..16] of Double = ((1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.5, 0, 1, 1, 0.5),
                                                 (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.5, 0, 1, 1, 0.5),
                                                 (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.5, 0, 1, 1, 0.5),
                                                 (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.5, 0, 1, 1, 0.5),
                                                 (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.5, 0, 1, 1, 0.5),
                                                 (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.5, 0, 1, 1, 0.5),
                                                 (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.5, 0, 1, 1, 0.5),
                                                 (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.5, 0, 1, 1, 0.5),
                                                 (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.5, 0, 1, 1, 0.5),
                                                 (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.5, 0, 1, 1, 0.5),
                                                 (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.5, 0, 1, 1, 0.5),
                                                 (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.5, 0, 1, 1, 0.5),
                                                 (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.5, 0, 1, 1, 0.5),
                                                 (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.5, 0, 1, 1, 0.5),
                                                 (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.5, 0, 1, 1, 0.5),
                                                 (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.5, 0, 1, 1, 0.5),
                                                 (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.5, 0, 1, 1, 0.5));
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Mathias
Beiträge: 6941
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Arrays zuweisen

Beitrag von Mathias »

Das habe ich gar nicht gewusst, das man sowas mit eine "var"-Deklaration lösen kann, ich habe es immer mit "const " gemacht.

Ich habe es ausprobiert, mit Delphi 6 geht es mit var, aber Borland Pascal 7 kommt eine Fehlermeldung.
Man lernt immer wieder was neues. :wink:
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2822
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Arrays zuweisen

Beitrag von m.fuchs »

Beides macht das Gleiche, eine Variable wird mit einem Startwert initialisiert. Auch wenn const davorsteht, kannst du das Ding dan später ändern. Was auch immer der verantwortliche Entwickler bei Borland damals genommen haben muss, um dafür const zu verwenden. :x :x :x
Zuletzt geändert von m.fuchs am Fr 7. Feb 2014, 22:27, insgesamt 1-mal geändert.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: Arrays zuweisen

Beitrag von Komoluna »

Danke für die Antworten...
werd ich morgen Mal ausprobieren.

MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Mathias
Beiträge: 6941
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Arrays zuweisen

Beitrag von Mathias »

Beides macht das Gleiche, eine Variable wird mit einem Startwert initialisiert. Auch wenn const davorsteht, kannst du das Ding dan später ändern.
Ich habe eine Versuch gemacht.

Je nach dem wie dieser Copilerschalter steht {$J+/-}, kann man Konstanten verändern. Auf "var" deklarierte Variablen hat dieser Schalter keinen Einfluss.

Ich habe nachgeschaut ob es unter Projekt/Projekteinstellungen.. /Compilereinstellungen auch einen Schalter gibt, aber nichts gefunden.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: Arrays zuweisen

Beitrag von Komoluna »

ich hab jetzt die methode mit der Konstate genommen, und da die Typeneffektivitäten für Pokemon ja feststehen, muss ich die Werte nicht zur Laufzeit ändern...
Danke an alle die geholfen haben

MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2822
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Arrays zuweisen

Beitrag von m.fuchs »

Komoluna hat geschrieben:ich hab jetzt die methode mit der Konstate genommen, und da die Typeneffektivitäten für Pokemon ja feststehen, muss ich die Werte nicht zur Laufzeit ändern...
Ist jetzt nur eine Anmerkung am Rande, aber: deine ''Konstante'' ist nicht konstant. Nur dass du dich nicht wunderst falls du irgendwo eine versehentlich Zuweisung drin hast.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: Arrays zuweisen

Beitrag von Komoluna »

ich hab nur eine stelle im code, wo aus dem array gelesen wird(lesemethode)...

aber warum heißt es dann "Konstante", wenn es nicht konstant ist? eine konstante ist doch schon per funktionsprinzip/definition konstant...
oder ist da bei der logik was schiefgelaufen?

MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Arrays zuweisen

Beitrag von Socke »

Komoluna hat geschrieben:aber warum heißt es dann "Konstante", wenn es nicht konstant ist? eine konstante ist doch schon per funktionsprinzip/definition konstant...
oder ist da bei der logik was schiefgelaufen?
Borland hat damals in Turbo Pascal das so eingebaut, weil die keine Variablen mit Initialwert machen konnten. Die Variablen mit Standardwert kamen erst später hinzu.
Auf technischer Ebene gibt es aber auch einen Unterschied zwischen echten Konstanten, typisierten Konstante (so heißen die, wenn man denen einen Wert zuweisen kann) und Variablen. Der Speicher wird an unterschiedlichen Stellen im Programm/in der Programmdatei reserviert und auch mit den Startwerten versorgt. Für die meisten Anwendungen sind die Unterschiede aber vernachlässigbar.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Hartkern
Beiträge: 69
Registriert: Sa 5. Dez 2015, 20:03
OS, Lazarus, FPC: Win10 IDE 1.6
CPU-Target: 64Bit
Wohnort: Leipzig

Re: Arrays zuweisen

Beitrag von Hartkern »

Ich hab wahrscheinlich dasselbe Problem...jedoch muss ich erst den array zur Laufzeit mit verschiedenen Werten füllen..gibt's da nen Workaround...mit Const funktioniert es ja...

Mathias
Beiträge: 6941
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Arrays zuweisen

Beitrag von Mathias »

Das es nicht auf direkten Weg geht, habe ich es so gelöst:

Code: Alles auswählen

procedure TMatrix.Identity;
const
  m: Tmat4x4 = ((1.0, 0.0, 0.0, 0.0), (0.0, 1.0, 0.0, 0.0), (0.0, 0.0, 1.0, 0.0), (0.0, 0.0, 0.0, 1.0));
begin
  FMatrix := m;
end
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Hartkern
Beiträge: 69
Registriert: Sa 5. Dez 2015, 20:03
OS, Lazarus, FPC: Win10 IDE 1.6
CPU-Target: 64Bit
Wohnort: Leipzig

Re: Arrays zuweisen

Beitrag von Hartkern »

Da kopierSt du aber nur konstante Werte.

Ich werd wohl doch den guten alten packed Record versuchen um nen Vertex Array zu erschaffen :( :D

Mathias
Beiträge: 6941
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Arrays zuweisen

Beitrag von Mathias »

Ich werd wohl doch den guten alten packed Record versuchen um nen Vertex Array zu erschaffen
Ein Record wird garantiert unflexibler sein, als eine Array.

Das befüllen mit werten ist in beiden fast Varianten gleich.
Nur mit der Array wirst du den Vorteil habe, das man die in einer ForTo.Schleife einsetzen kann.

Code: Alles auswählen

var
  r: record
    x, y, z: single;
  end;
  a: array[0..2] of single;
begin
  r.x := 12.34;
  r.y := 22.34;
  r.z := 32.34;
  a[0] := 12.34;
  a[1] := 22.34;
  a[2] := 13.34;
 
  for i := 0 to 2 do begin
    a[i] := 12.34;
  end;
end; 
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Hartkern
Beiträge: 69
Registriert: Sa 5. Dez 2015, 20:03
OS, Lazarus, FPC: Win10 IDE 1.6
CPU-Target: 64Bit
Wohnort: Leipzig

Re: Arrays zuweisen

Beitrag von Hartkern »

Da es hier gerade um Arrays geht,

(wenn es hier doch falsch ist, dann bitte umlagern in eigenen Thread..danke)

dank der Hilfe von Mathias hab ich jetzt nen sog. Vertexarray gebastelt. Wenn ich das Array statisch anlege, dann bekomm ich was gezeichnet..Deklariere ich den Array jedoch dynmisch und lege mit SetLenght(acube,1) die Länge ebenso auf 1 Eintrag fest, passiert obwohl das Array wie bei aCube : array[0..0] gefüllt wird nix...


Code: Alles auswählen

type
  TVertex3f = array[0..2] of GLfloat;
  TVertexArr = array[0..2] of TVertex3f;           

Code: Alles auswählen

 private
    { private declarations }
    aCube : array[0..0] of TVertexArr;     


hier das befüllen.

Code: Alles auswählen

  // VertexArray füllen
  //setlength(aCube,1);   ---> das geht nicht...
  aCube[0,0,0] :=1.0;      //1. Vertex
  aCube[0,0,1] :=1.0;
  aCube[0,0,2] :=1.0;
 
  aCube[0,1,0] :=-1.0;      //2. Vertex
  aCube[0,1,1] :=1.0;
  aCube[0,1,2] := 1.0;
 
  aCube[0,2,0] :=1.0;      //3. Vertex
  aCube[0,2,1] :=-1.0;
  aCube[0,2,2] :=1.0;
 

Antworten