Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   C++ Array redimensionieren (https://www.delphipraxis.net/193022-array-redimensionieren.html)

EWeiss 10. Jun 2017 21:23


Array redimensionieren
 
Delphi.

Delphi-Quellcode:
// Redim Array
if (Item + ID_MAIN) <> FlagFound then
begin
  if gP.ShortCutfound > 0 then
    NewLen := High(gS) + gP.ShortCutfound
  else
    NewLen := High(gS) + 1;

  Setlength(gS, NewLen);
  ShortCut.CreateRecycleBin(MainHandle, NewLen);
  for x := ID_FIRST to NewLen do
  begin
    gS[x] := gS[x + 1];
    if x = (NewLen - gP.ShortCutfound) then
    begin
      for X1 := (NewLen - 1) downto (NewLen - gP.ShortCutfound) do
        Delete(gS, X1);
    end;
  end;
  FlagFound := High(gS);
end;
wie bekomme ich Setlength nach c++ portiert ?
Delphi-Quellcode:
High(gS)

gibt es auch nicht. Hmmm....

gruss

Namenloser 10. Jun 2017 23:47

AW: Array redimensionieren
 
C oder C++?

In C: realloc(void *ptr, size_t size). Ein Äquivalent zu high(...) gibt es glaube ich nicht. Hier musst du selbst einen Zähler mitführen.

In C++: std::vector<> verwenden. High(...) entspricht der Methode size()-1. SetLength(...) entspricht der Methode resize(...). Wenn du einfach nur ein Element am Ende anhängen willst, dann kannst du dir das manuelle Vergrößern aber auch sparen und einfach push_back(...) verwenden.

himitsu 11. Jun 2017 00:34

AW: Array redimensionieren
 
High(gS) im Delphi ist einfach nur Length-1, da dort die Arrays bei 0 beginnen.

Das ist in C nicht anders.
Beginnt das Array nicht bei 0, dann ist es eben Length+StartIndex-1

EWeiss 11. Jun 2017 02:00

AW: Array redimensionieren
 
Zitat:

Wenn du einfach nur ein Element am Ende anhängen willst, dann kannst du dir das manuelle Vergrößern aber auch sparen und einfach push_back(...) verwenden.
Nein das sind so viele Element wie Shortcuts auf dem Desktop liegen.

Zitat:

Beginnt das Array nicht bei 0, dann ist es eben Length+StartIndex-1
Ok Danke euch.

Da es sich um ein Statisches Array mit fester länge handelt (zu spät gesehen) kann ich mir das mit SetLength sparen.
Hab es jetzt so gemacht.

Code:
if (gP.shortcutfound > 0) { NewLen = nCount + gP.shortcutfound; }
else { NewLen = nCount + 1; }
CreateRecycleBin(gP.hMain, NewLen);

for (X = ID_FIRST; X <= NewLen; X++)
{
    gS[X] = gS[X + 1];

    if (X == (NewLen - gP.shortcutfound))
    {
        gS[nCount] = gS[NewLen];
        ZeroMemory(&gS[NewLen], sizeof(SpriteArray));
    }
}
FlagFound = nCount;
Die Icons die nicht in der Configurations Datei stehen muss ich bei der Berechnung aus dem Array ausschließen.
Damit sich nach dem speichern und neu laden das Papierkorb Icon auf seiner Position in der Bar nicht verändert.

gruss

EWeiss 11. Jun 2017 13:25

AW: Array redimensionieren
 
Zitat:

C oder C++?
Sorry ich hatte es angegeben.
Aber egal ;)

gruss

Namenloser 11. Jun 2017 14:37

AW: Array redimensionieren
 
Zitat:

Zitat von EWeiss (Beitrag 1374249)
Zitat:

C oder C++?
Sorry ich hatte es angegeben.
Aber egal ;)

gruss

Ich hatte nur noch mal nachgefragt, weil einige Delphianer das gerne mal durcheinanderschmeißen. Außerdem ist nicht wirklich klar, was unter C++ ein "Array" ist. Damit könnte ein C-style Array gemeint sein, aber auch ein std::vector.

EWeiss 11. Jun 2017 14:39

AW: Array redimensionieren
 
Zitat:

Zitat von Namenloser (Beitrag 1374251)
Zitat:

Zitat von EWeiss (Beitrag 1374249)
Zitat:

C oder C++?
Sorry ich hatte es angegeben.
Aber egal ;)

gruss

Ich hatte nur noch mal nachgefragt, weil einige Delphianer das gerne mal durcheinanderschmeißen.

Ach so ;)
Kein Problem.

so wie ich weiß ist c <> makefile und C++ <> VS
es ist std::vector.

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:04 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz