Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

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

Re: Unterschied zwischen dynamischen und statischen Array ??

  Alt 11. Mai 2007, 19:07
dynamische Arrays sind Zeiger, demnach sind die Unterarrays dieses auch


c: Array Of Array Of Array Of byte;
Delphi-Quellcode:
type c2 = Array Of byte;
type c1 = Array Of c2;
var c: Array Of c1;
die ganzen unterarrays (c2) liegen also beim dynamischen Array nicht hintereinander, da für jedes dynamische array ein eigener Speicherblock resserviert wird.
Stell dir C einfach so vor:
Delphi-Quellcode:
type c2 = Array Of byte;
type c1 = Array Of Pointer{@c2};
var c: Array Of Pointer{@c1};
demnach ist @c[0, 0, 0] nur ein Zeiger auf c[0, 0, 0] bis c[0, 0, ende].
du ließt also nur einen ArrayTeil aus, nämlich c[0, 0] und nachfolgend 'ne Menge Bytes, welche nicht zu deinem Array gehören müssen (halt "undefinierten" Speicher).


[add]
wenn du eine dynamisch Größe brauchst, dann kommst du am einfachsten wenn du nur ein dynamisches Array nimmst und dessen Speicher selber einteilst.

z.B.: (ungetestet, aber ich denk mal es stimmt)
Delphi-Quellcode:
Function LoadAplhaSourceTexture(Maskname, Filename: String): Gluint;
Var
  a: packed Array Of Record r, g, b, a: Byte; end;
  i, j: Integer;
  b, b2: Tbitmap;
const
  x = 128;
  y = 128;
Begin
  b2 := TBitmap.create;
  b2.LoadFromFile(Filename);
  b := TBitmap.create;
  b.LoadFromFile(Maskname);
  setlength(c, x * y);
  For i := 0 To high(a) Do
    For j := 0 To high(c[0]) Do Begin
      a[j * y + i].r := getrvalue(b2.canvas.pixels[i, y - 1 - j]);
      a[j * y + i].g := getgvalue(b2.canvas.pixels[i, y - 1 - j]);
      a[j * y + i].b := getbvalue(b2.canvas.pixels[i, y - 1 - j]);
      If b.Canvas.pixels[i, y - 1 - j] = clblack Then a[j * y + i].a := 255
      Else a[j * y + i].a := 0;
    End;
  glGenTextures(1, @Result);
  glBindTexture(GL_TEXTURE_2D, Result);
  glEnable(GL_TEXTURE_2D);
  glTexParameteri(gl_texture_2d, GL_GENERATE_MIPMAP_SGIS, GL_TRUE);
  glTexParameteri(gl_texture_2d, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
  glTexParameteri(gl_texture_2d, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);
  gluBuild2DMipmaps(gl_Texture_2d, GL_RGBA, x, y, GL_RGBA, GL_UNSIGNED_BYTE, @a[0]);
  a := nil; // SetLength(a, 0);
  b.free;
  b2.free;
End;
PS: high(a) + 1 = Length(a)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat