Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Delphi: Pointer auf array

Empfohlene Antworten

Veröffentlicht

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

Kann es sein das du da versuchst auf einen Pointer zu schreiben?

Erklär mal genauer, was du machen willst. Wie unterscheiden sich die Arrays?

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

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

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 ;)

ja klar.. das geht.. lliegt aber daran, das das ein refferenzierter pointer ist..

nur kann ich den im fuction head nicht verwenden, dort sind irgendwie nur unrefferenzierte zulässig.. (glaub ich.. vielleich tmach ich auch was falsch..)

gruß Taz

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.