AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Pointer of Dynamic Array

Ein Thema von Crocotronic · begonnen am 27. Feb 2015 · letzter Beitrag vom 28. Feb 2015
Antwort Antwort
Crocotronic

Registriert seit: 9. Mai 2013
258 Beiträge
 
#1

Pointer of Dynamic Array

  Alt 27. Feb 2015, 17:30
Hallo zusammen,
bei der lkJSON-Klasse gibt es eine ForEach-Methode um eine Array eines JSON-Objekts auszulesen. Als Argument muss man die CallBack-Funktion angeben und irgendeine Datenstruktur (in meinem Fall ein dynamisches Array). Folgender Code:
Delphi-Quellcode:
type
  TElement = record
   Value: String;
  end;
  TElements = array of TElement;
  PElements = ^TElements;

procedure ExtractElements(AElementName: string; AElement: TlkJSONbase; ADataPtr: Pointer; var Continue: Boolean);
var Elements: PElements;
begin
 Elements:= PElements(ADataPtr);

 SetLength(Elements^,High(Elements^)+2);
 Elements^[High(Elements^)].Value:= xxxx;
 showmessage(inttostr(High(Elements^)));
end;

// Aufruf:
var MyElements: TElements;
(AJSON.Field['su'] as TlkJSONlist).ForEach(ExtractElements, @MyElements);
Jetzt ist mein Problem, dass die Länge von dem Array nicht wächst, sonder imm bei 1 bleibt. Also das showmessage gibt mir immer 0 zurück (was dann Count=1 bedeutet).
Warum?

Viele Grüße
Croco

Geändert von Crocotronic (27. Feb 2015 um 23:01 Uhr)
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.376 Beiträge
 
Delphi 2007 Professional
 
#2

AW: Pointer of Dynamic Array

  Alt 27. Feb 2015, 18:20
Hast du mal testhabler eine Stringlist übergeben?
Delphi-Quellcode:
procedure ExtractElements(AElementName: string; AElement: TlkJSONbase;
  ElementList: TStringList; var Continue: Boolean);
begin
  ElementList.Add(..);
end;

(AJSON.Field['su'] as TlkJSONlist).ForEach(@ExtractElements, MyElementList);
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
34.931 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Pointer of Dynamic Array

  Alt 27. Feb 2015, 18:26
"theoretisch" sieht es so aus, als wenn es richtig wäre.

@StringList: Dort bleibt der Zeiger immer gleich und nur in dem Objekt ändert sich die Liste.
Beim Array wird der Speicher immer mal wieder verschoben, weswegen sich dort der Zeiger ändert, auf den sein Pointer zeigt, aber durch den Pointer sollte man ja immer richtig direkt auf die Variable zugreifen.


Rein logisch meinst du doch bestimmt SetLength(Elements^, Length(Elements^)+1); oder SetLength(Elements^, Succ(Length(Elements^))); aka "um 1 vergrößern" ?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (27. Feb 2015 um 18:28 Uhr)
  Mit Zitat antworten Zitat
Crocotronic

Registriert seit: 9. Mai 2013
258 Beiträge
 
#4

AW: Pointer of Dynamic Array

  Alt 27. Feb 2015, 18:54
SetLength(Elements^, Length(Elements^)+1); Stimmt, so geht's einfacher.
Aber das Problem bleibt. Direkt nach dem Aufruf von ForEach ist die Länge von MyElements = 0, obwohl ich sie ja definitiv erhöhe
An der ForEach-Methode kann es nicht liegen, da
Delphi-Quellcode:
procedure IncDynRec(ADataPtr: Pointer);
var Elements: TElements;
begin
 Elements:= PElements(ADataPtr)^;
 SetLength(Elements,Length(Elements)+1);
end;
genau so nicht funktioniert

Geändert von Crocotronic (27. Feb 2015 um 23:00 Uhr)
  Mit Zitat antworten Zitat
MStoll

Registriert seit: 15. Nov 2005
131 Beiträge
 
Turbo Delphi für Win32
 
#5

AW: Pointer of Dynamic Array

  Alt 27. Feb 2015, 22:23
Zunächst mal solltest du Code posten, der zumindest syntaktisch so funktionieren würde.

Zu Beginn z.B. schreibst du PElements = ^Elements , wo ein "T" nach dem "^" fehlt oder später Elements^[High(Elements)].Value:= xxxx , wo das "^" im Aufruf von high(..) fehlt. Und beim letzten Post stellt sich die Frage, was "Subjects" ist? Elements wird da beispielsweise gar nicht instantiiert...

Fehler in Code zu suchen, der vor dem Posten erst noch umgeschrieben wird, könnte vielleicht sinnlos sein, da der eigentliche Fehler durch das Umschreiben möglicherweise verschleiert wird.
"Man soll nie mehr essen als mit Gewalt reingeht!" (n.n.)
  Mit Zitat antworten Zitat
Crocotronic

Registriert seit: 9. Mai 2013
258 Beiträge
 
#6

AW: Pointer of Dynamic Array

  Alt 27. Feb 2015, 23:05
Stimmt, da sind mir wohl einige Fehler unterlaufen.
Ich versuche als meinen Code zu abstrahieren und exemplarisch anschaulich zu gestalten und ändere ihn deshalb direkt hier im Editor,
deshalb fallen mir solche Fehler nicht auf. Ich werde in Zukunft darauf achten, dass ich den Code kompiliere und fehlerfrei hier poste.
Vielen Dank für den Hinweis.

Was die Thematik betrifft: ich habe jetzt halt eine Klasse draus gemacht und speicher alle Objekte in einer TObjectList.
Somit wäre das Problem für mich nun gelöst, dennoch würde mich interessieren warum der Code nicht funktioniert. Vielleicht ergibt sich ja noch etwas.
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.376 Beiträge
 
Delphi 2007 Professional
 
#7

AW: Pointer of Dynamic Array

  Alt 28. Feb 2015, 01:36
TObjectlist? Bist du sicher, daß du #2 verstanden hast?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
34.931 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

AW: Pointer of Dynamic Array

  Alt 28. Feb 2015, 08:59
Joar, wie man schon an der #2 sieht, kann man hier beliebig die Prozedur-Signatur (Parameter) ändern, da man nur einen untypisierten Pointer zur Callback-Prozedur rein gibt.

Delphi-Quellcode:
procedure ExtractElements(AElementName: string; AElement: TlkJSONbase; ADataPtr: PElements; var Continue: Boolean);
begin
 SetLength(ADataPtr^, Length(ADataPtr^)+1);
 ADataPtr^[High(ADataPtr^)].Value:= xxxx;
 ShowMessage(IntToStr(Length(ADataPtr^)));
end;

procedure ExtractElements(AElementName: string; AElement: TlkJSONbase; var AData: TElements; var Continue: Boolean);
begin
 SetLength(AData, Length(AData)+1);
 AData[High(AData)].Value:= xxxx;
 ShowMessage(IntToStr(Length(AData)));
end;

// Aufruf(e):
var MyElements: TElements;
(AJSON.Field['su'] as TlkJSONlist).ForEach(ExtractElements, @MyElements);
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf