Autor Beitrag
CarpeDiem
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 128

WIN XP
Borland C++ 2002, CodeGear C++ 2007, C# (VS 2008)
BeitragVerfasst: Sa 15.03.08 17:39 
Hallo,

ich habe zwar schon viele Berichte gelesen, aber nichts passendes
gefunden. Ich habe ein Array, dessen Länge ich während der Laufzeit
anpassen möchte.


Bei dem Quellcode:
ausblenden Quelltext
1:
2:
  int *arr = new int[10];
  SetLength(arr, 20);

oder:
ausblenden Quelltext
1:
2:
  int arr2[10];
  SetLength(arr2, 20);


bekomme ich immer den Fehler "Aufruf der undefinierten Funktion 'SetLength'"


Stefan


Moderiert von user profile iconChristian S.: Topic aus Dateizugriff verschoben am Sa 15.03.2008 um 19:57
Moderiert von user profile iconChristian S.: Code-Tags hinzugefügt
Calculon
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 676

Win XP Professional
Delphi 7 PE, Delphi 3 PRO
BeitragVerfasst: So 16.03.08 03:11 
Hehe, jetzt wär's gut zu wissen in welcher Sprache du programmierst:

C:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
  int *arr; 
  int laenge;

  laenge = /* die Laenge des Arrays */
  arr = (int*) calloc (laenge, sizeof(int));
  
  /* hat das Speicher anfordern geklappt? */
  if arr == NULL { /* was bei Fehler gemacht werden soll */}

  /* zum Schluss Speicher wieder freigeben */
  free arr;


C++
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
  int *arr;
  int laenge;

  laenge = /* die Laenge des Arrays */
  arr = new int[laenge];

  /* hat das Speicher anfordern geklappt? */
  if arr == NULL { /* was bei Fehler gemacht werden soll */}

  /* zum Schluss Speicher wieder freigeben */
  delete[] arr;


Delphi:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
var
  arr: array of integer;
  laenge: integer;
begin
  laenge := // die Laenge des Arrays
  setlength(arr, laenge);

[OT] Wie gibt man eigentlich den Speicher von dynamischen arrays in Delphi frei? Ich mach des immer mit setlength(arr, 0); [/OT]

Kann aber auch C# sein. AFAIK ist doch die C#-Syntax eine Schnittmenge aus Delphi u. C++ und das
ausblenden C#-Quelltext
1:
2:
  int *arr = new int[10]; 
  SetLength(arr, 20);

sieht mir ziemlich nach 'nem Mix aus beiden aus...

Gruß

Calculon
--

_________________
Hallo Mutti
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: So 16.03.08 03:15 
jop, mit setlength(arr,0) gibt man den speicher frei (zumindestens bei D7)

lg elundril

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
CarpeDiem Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 128

WIN XP
Borland C++ 2002, CodeGear C++ 2007, C# (VS 2008)
BeitragVerfasst: So 16.03.08 06:42 
Danke,

hoffte, daß SetLength() auch unter C++ funktioniert, an das
dynamische anlegen eines Feldes habe ich gar nicht gedacht.


Vielen Dank.
CarpeDiem Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 128

WIN XP
Borland C++ 2002, CodeGear C++ 2007, C# (VS 2008)
BeitragVerfasst: Mo 17.03.08 05:24 
Gibt es auch eine Möglichkeit die Größe des Feldes während der Laufzeit
zu ändern, ohne daß die schon im Feld gespeicherten Daten verlorengehen?
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Mo 17.03.08 10:05 
Bitte entschuldige diese Nachfrage:
user profile iconCalculon hat folgendes geschrieben:
Hehe, jetzt wär's gut zu wissen in welcher Sprache du programmierst:

Durch Deine Signatur ist ja klar, dass es um C++ geht; also kann ich nicht antworten. Jürgen
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4809
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 17.03.08 10:47 
In C++ verwendet man für dynamische Arrays die Klasse std::vector<>:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
#include <vector>

std::vector<int> v;

for(int i=0; i<10; i++)
  v.push_back(i);

v.resize(20); // vector wird mit default (0) aufgefüllt
v.clear(); // vector wird geleert

Um Freigabe brauchst du dich dann nicht zu kümmern, da der vector sich automatisch selber zerstört, wenn er aus dem Scope geht... nur bei Zeigern müsstest du dich selber darum kümmern, aber dafür gibt es dann auch noch die sogenannten "Shared Pointer", z.B. boost::shared_ptr ([url]www.boost.org[/url]).

Eine sehr gute Referenz-Seite für die C++ Standard Klassen ist [url]www.cppreference.com[/url]

Edit: [cpp]-Tag wird nicht unterstützt -(
CarpeDiem Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 128

WIN XP
Borland C++ 2002, CodeGear C++ 2007, C# (VS 2008)
BeitragVerfasst: Mo 17.03.08 12:52 
Danke, das probier ich mal aus.