Zum Inhalt springen

Delphi: Pointer auf array


TAZttDevil

Empfohlene Beiträge

Hallo zusammen...

ich habe ein kleines Problem. Ich habe vor einiger Zeit mal ein Programm geschrieben, welches mit einen String in Teile zerlegt und dies in ein array speichert.

Nun schreibe ich wieder ein Programm und brauche eine ähnliche funktion. Nur

diesmal unterscheiden sich bei aufrufen die arrays. Also habe ich gedacht, ich übergebe mir den pointer auf ein array...

Dummerweise läst Delphi im Funktionskopf nur unrefferenzierte poiner zu (oder mach ich was falsch??). Das wäre ja kein problem, nur wie kann ich den Pointer auf ein Array refferenzieren?? Hier der Code:


procedure pc_ParsZeile( str_pars : string; p_array : pointer );

var

  i_tabs : integer;        //alte Variable zum Trennzeichen zählen, dient als Zeiger im Array

  i : integer;             //einfachere Zähler

  i_last : integer;        //letzte Stelle in str_Pars an dem ein Trennzeichen vorkam

begin

  i_last := 1;             //init der Variablen

  i_tabs := 1;

  for i := 1 to 100 do     //löscht das Array

     RefferenzierMich( p_array^ )[i] := '';

  for i := 1 to length( str_pars ) do         //

    if str_pars[i] in [';', #9] then begin    //sucht nach Trennzeichen

      //wenn gefunden dann schreibe die Sachen zwischen dem letztem Trennzeichen (i_last)

      //und dem gefunden ins array

      RefferenzierMich( p_array^ )[i_tabs] := copy( str_pars, i_last, i - i_last);

      inc( i_tabs );                          //erhöhe Zähler

      i_last := i+1;                          //setzte i_last neu

  end;

  RefferenzierMich( p_array^ )[i_tabs] := copy( str_pars, i_last, length( str_pars ));

//  i_AnzahlTabsD1 := i_tabs;

end;

der Aufruf RefferenzierMich müsste nur ersetzt werden.. nur cih weis nicht durch was...

Gruß Taz

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi..

ich möchte den pointer refferenzieren und zwar auf ein array, dann möchte ich in dieses Array schreiben.

Die Arrays sind erst mal identisch. Mein vorhaben ist folgendes:

Ich öffne zwei dateien. Dieses Dateien sind tabellarisch aufgebaut, Zeilen und Spalten. Nun möchte ich bestimmte werte aus diesen dateien mit einander vergleichen. Dazu lese ich die jeweilig zeile. Nun muss ich diese Zeile aufteilen in spalten (bzw. Zellen), dazu suche ich nach einem Feldtrennzeichen (siehe Routine oben). Die einzelnen Zellen sollen dann in ein array gespeichert werden. Das heisst eigentlich in zwei arrays, für jede datei (bzw. Zeile) ein eingenes Array. Da ich nun nicht zwei identische routinen benutzen möchte, wollte ich meiner Funktion neben der zur zerteilenden Zeile auch das Ziel array übergben. Da es aber ein wenig viel wird, das ganze array zu übergen (eine zeiel kann mehrere MB haben, und welcher stack macht das mit?? das ist verschwendung), wollte ich nur einen Pointer auf das array übergeben. Das funktioniert mit meinen stringlisten auc ganz hervoragend..

... hmmm... wenn ic hdas so lese, ist das eigentlich die lösung... ich nehem statt einem array einfach ne stringliste.. .. hmm... mal schauen..

wenn trozdem noch jemand eine Lösung dafür hat, bitte immer her damit..

gruß Taz

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo..

hier nun meine Lösung mit den Stringlisten.. funktioniert einwandfrei:


procedure pc_ParsZeile( str_pars : string; p_DestList : pointer );

var

  i : integer;

  i_last : integer;

begin

  i_last := 1;

  for i := 0 to TStringList( p_DestList^ ).count -1 do

    TStringList( p_DestList^ ).Delete( 0 );

  for i := 1 to length( str_pars ) do

    if str_pars[i] in [';', #9] then begin

      TStringList( p_DestList^ ).Add( copy( str_pars, i_last, i - i_last ));                         				//erhöhe Zähler

      i_last := i+1;                          				//setzte i_last neu

  end;

  TStringList( p_DestList^ ).add( copy( str_pars, i_last, length( str_pars )));

end;

ich lösche daie liest mit der for schleife, da mit mit der routine: TStringList( p_DestList^ ).clear nicht nur die Inhalte sondern auch die refferenzen gelöscht werden. as Clear mach eich an einer anderen stelle im Programm...

so long Taz

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hier ein Beispiel aus der Unit Forms:


type

  PCursorRec = ^TCursorRec;

  TCursorRec = record

    Next: PCursorRec;

    Index: Integer;

    Handle: HCURSOR;

  end;


procedure TScreen.InsertCursor(Index: Integer; Handle: HCURSOR);

var

  P: PCursorRec;

begin

  New(P);

  P^.Next := FCursorList;

  P^.Index := Index;

  P^.Handle := Handle;

  FCursorList := P;

end;


Den Typ PCursorRec solltest du auch bei Procedure Parametern verwenden können...

vielleicht hilft dir das, hab nämlich auch nicht so ganz verstanden was du eigentlich willst ;)

Wieder ein bisschen lang fürs schreiben gebraucht ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...