Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Hallo,
Sagetmal, kennt irgendwer eine Methode, wie ich einen Record, der einen String oder ein Array enthält dynamisch erzeugen kann (=> irgendwie einen Pointer auf diesen Record initialisieren)? Oder muss ich da zu klassen greifen? wenn ich einfach GetMem mache, verreckt er mir bei einer Größenänderung des Arrays, wohl weil es nicht initialisiert wurde.
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Di Mai 18, 2004 16:45 Beiträge: 2623 Wohnort: Berlin
Programmiersprache: Go, C/C++
Code:
var myarray:arrayof MyRecord;
...
begin
setlength(myarray,length(myarray)+1);
myarray[high(myarray)].mystring:="empty";
Ich finde folgende Version viel schöner, da ich weiß was wirklich passiert und nicht alles hinter den Kulissen gemacht wird.
String ist in der Regel als array [0..256] of char definiert und ist ein pointer auf das 2. char(das 1. ist ja die länge) und dann entspricht es ^char.
Die Zuweisung von "empty" sollte dafür sorgen, dass Speicher für ein String reserviert wird.
Ich glaube(programmiere schon sehr sehr lange ned mehr OP), dass du auch getmem(myarray[high(myarray)].mystring,sizeof(TString)); geht.
Code:
var myarray:arrayof pMyRecord;
...
begin
setlength(myarray,length(myarray)+1);
getmem(myarray[high(myarray)],sizeof(MyRecord));
myarray[high(myarray)].mystring:="empty";
_________________ "Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren" Benjamin Franklin
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Guter Ansatz, nur leider genau falschrum. Das Array ist in meinem Record und ich habe ein Dynamisches Array mit Pointern auf diesen Record....
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Mi Jan 31, 2007 18:32 Beiträge: 150
Programmiersprache: Pascal
@ Markus
Ne Anmerkung zu deinem Code abgesehen von dem eigentlichen Problem ...
Code:
for i:= 0 to 19 - 1 do begin
SetLength(MyArray, Length(MyArray) + 1);
New(MyArray[High(MyArray)]);
SetLength(MyArray[High(MyArray)]^.Arr, i);
for j:= 0 to i - 1 do
MyArray[High(MyArray)]^.Arr[j]:= j;
end;
würd ich net machen bei so kleinen arrays mit nur 19 elementen spielts zwar keine Rolle aber wenn es möglich ist solltest du es so machen
Code:
SetLength(MyArray, 19);
for i := low(MyArray) to High(MyArray) do
begin
// code
end;
sonst schiebst du deinen array ständig im speicher durch die gegend was alles andere als effektiv ist ... wenn du nämlich die länge vergrößerst ist nicht gewährlichstet das der array an der gleichen Postion im speicher bleibt, sprich nach deiner array struktur im speicher noch platz für ein weiteres elemnt ist und somit wird dein array ggf. an einer anderen Position im Speicher platziert.
So zur eigentlichen Frage ... Du musst nichts anderes tun als mit New den Record zu erstellen, getMem geht hier nicht Problemlos (ich hatte diesbezüglich auch schon mal probleme) wenn das nicht funktioniert (bin mir gerade nicht zu sicher) würd ich es mal fersuchen in dem record einfach nur einen pointer auf den array zu hinterlegen...
natürlich mach ich das nicht so, wenn ich was produktiv programmiere Ich hab das nur kurz so hingeschrieben, und da TAK das auch so hatte, hab ich das grad abgeschrieben.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Ahhh... New... Ich dachte, das geht nur für objects. Ich werds dann mal ausprobieren. Morgen oder so. Danke auf jeden fall für die Hilfe
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
New hat leider auch nicht geholfen... Wobei ich mir auch nicht sicher bin, wo der Fehler genau lag. Ich habe die Codepassage und alles, was damit näher zusammenhing jetzt mit Klassen neu geschrieben. Jetzt hakts zwar woanders, aber das wird entweder bestandteil eines neuen Threads oder ich löse es noch selber.
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Di Okt 03, 2006 14:07 Beiträge: 1277 Wohnort: Wien
Entschuldige, dass ich jetzt erst antworte.
Ich halte mich normalerweise an mein altes Delphi-Handbuch, denn man kommt mit diesen Angaben auch in FPC ganz gut weiter.
Zu den dynamischen Arrays steht Folgendes drin:
„Wenden Sie auf dynamische Array-Variablen nicht den Derefenzierungsoperator (^) an, und übergeben
Sie sie auch nicht an die Prozeduren New oder Dispose.“
Sollte mich sehr wundern, wenn das in der Zwischenzeit geändert worden wäre.
Mitglieder in diesem Forum: 0 Mitglieder und 10 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.