Przesuwanie wskaźnika w tablicy

0

Mam tablicę statyczną. Ustawiam wskaźnik typu Pointer na jakiś element tablicy. Teraz chcę przesunąć ten wskaźnik w lewo lub w prawo o 1 element czy też o parę elementów. Jak to zrobić?

var
  T : array [0..9] of Integer;
  Iter : Integer;
  P : Pointer;
begin
  for Iter := 0 to 9 do
    T[Iter] := Iter * 10;
  P := @T[5];
 
end;
0

hmm chodzi ci chyba o to by w tablicy trzymać adresu, a nie mogłbyś po prostu pobeiraż z tablicy adres komendą typu cos:=tablica[4] a następnie wpisywac do wskaznika tej wartości?

0
daban napisał(a)

hmm chodzi ci chyba o to by w tablicy trzymać adresu, a nie mogłbyś po prostu pobeiraż z tablicy adres komendą typu cos:=tablica[4] a następnie wpisywac do wskaznika tej wartości?

Musze to zrobić na wskaźnikach żeby jak najszybciej to działało

0

Nie pamiętam czy w Pascalu też tak można, ale w C można było dodawać do i odejmować od wskaźnika, więc spróbuj coś takiego:

P := P - SizeOf(Integer);
(lub zamiast "Integer" wstaw zmienną tego typu)
Uwaga! Tu odejmujemy od adresu jakąś wartość

To spowoduje, że wskaźnik będzie pokazywał na wcześniejszą komórkę w tablicy (z mniejszym indeksem)

Jeżeli będziesz miał tablicę innego typu to musisz odjąć (lub dodać) wielkość użytego typu do tablicy.
Musisz też tu jakoś uważać, by nie wyjść z zakresu tablicy, bo możesz nieźle namieszać.

Spróbuj, zobaczysz czy działa ;)
Pozdrawiam

0

Moge zapytac po co tak kombinujesz? Nie mozesz normalnie indexowac tablicy? [#]?

0

Wolverine:

Musze to zrobić na wskaźnikach żeby jak najszybciej to działało

Swoją drogą to się zgadzam, że nie ma sensu tak kombinować, bo przyspieszy to chyba niewiele (o ile w ogóle coś tutaj będzie przyspieszone).

0

jest jedna zasadnicza wada twojego pomysłu, muszisz meić pewność że zaalokowałeś ciągły kawałek pamięci, wówczas możesz poruszać sie po adresach w górę i w dół bezpośrednio, jeśli nie masz pewności (nie jestem pewien ale standardowo delphi chyba nie zapewnia ciągłości zaalokowanej pamięci dla tablicy) że masz ciągły kawałek pamięci to poruszając się w ten sposób po tablicy narobisz sobie kłopotów. Jeśli coś niskopoziomowego piszesz to proponuję jednak C, a jeśli w sposób świadomy chcesz umieszać pointery w tablicy to może spróbuj ze zmeinnymi typou pchar, choć ja bym za dużo nie kombinował, bo może się okazać że aby zrobić wszystko jak najszybciej tak namieszasz że aplikacja będzie działała wolniej.

0
daban napisał(a)

jest jedna zasadnicza wada twojego pomysłu, muszisz meić pewność że zaalokowałeś ciągły kawałek pamięci, wówczas możesz poruszać sie po adresach w górę i w dół bezpośrednio

No właśnie, tu może być problem.
Dlatego chyba najlepiej poruszać się po indeksach, tym bardziej, że powinno być to w delphi zoptymalizowane i rzeczywiście kombinowanie w tej sferze może tylko przynieść spowolnienie działań.
Ewentualnie zrób własą listę dwukierunkową ;)

0
daban napisał(a)

jest jedna zasadnicza wada twojego pomysłu, muszisz meić pewność że zaalokowałeś ciągły kawałek pamięci

Tablice są ciągłymi obszarami pamięci. Gorzej może być z zawartością tablic, np. array[0..99] of String (oczywiście mowa o "długich" Stringach, a nie starych, pascalowych o maks. długości 255 znaków). W takim wypadku sama tablica jest ciągła (zawiera tylko wskaźniki na rzeczone stringi), natomiast same stringi mogą być rozsiane po pamięci.

0
Piterek80 napisał(a)
var
  T : array [0..9] of Integer;
  Iter : Integer;
  P : Pointer;
begin
  for Iter := 0 to 9 do
    T[Iter] := Iter * 10;
  P := @T[5];
 
end;

Zamiast typu Pointer użyj typu wskaźnika, który jest odpowiednikiem elementu tablicy, w tym wypadku PInteger. Jeśli P będzie Twoim wskaźnikiem PInteger, to możesz normalnie wykonać Inc(P) i Dec(P) - kompilator wygeneruje kod, który przesunie wskaźnik o rozmiar wskazywanego elementu (tu: o 4 bajty).

1 użytkowników online, w tym zalogowanych: 0, gości: 1