Dodawanie wartości do wskaźnika

0

OK, mam chyba zaćmienie. Sytuacja wygląda tak:
Mam 2D tablicę dynamiczną: array[a, x] of byte

Teraz muszę przepisać jej zawartość do pewnego miejsca w pamięci:

var
  pb: PByte;
  p: Pointer;
  i: integer;
  size: integer;
begin
  size:=a*x;
  GetMem(pb, size); 

  for i:=0 to high(MyArray) do
  begin
    p:=Pointer(pb);
    p:=p+(i*X); //<-- no i chodzi mi o tą linijkę
    CopyMemory(p, @MyArray[i][0], X);
  end;
end;

Mam nadzieję, że wszystko jest jasne.
Jak dodać jakąś wartość do wskaźnika? Czyli, jeśli w pierwszej iteracji P miało adres np. $00000000, w drugiej chcę żeby miało $00000000 + X

PS. Tak wiem, że p:=Pointer(pb) powinno być tylko raz przed pętlą. Taka konstrukcja dla uproszczenia.

0

Najlepiej chyba dać
[code]
p:^typ;
[...]
inc(p);
[/code]
Dodawanie wartości do pointera samego w sobie nie ma sensu - jakoże nie można powiedzieć czy chcesz go przesunąć o 5 bajtów czy 5 bitów, więc wtedy chyba pozostaje unia typów i przerabianie go na jakieś numerki... Czego oczywiśnie nie zalecam. Lepiej i prościej jest tak jak dałem u góry.

0
payl napisał(a)

Najlepiej chyba dać
[code]
p:^typ;
[...]
inc(p);
[/code]
Dodawanie wartości do pointera samego w sobie nie ma sensu - jakoże nie można powiedzieć czy chcesz go przesunąć o 5 bajtów czy 5 bitów, więc wtedy chyba pozostaje unia typów i przerabianie go na jakieś numerki... Czego oczywiśnie nie zalecam. Lepiej i prościej jest tak jak dałem u góry.

Tyle, że nie mogę tak, jak u góry, ponieważ mam do skopiowania np. 10 bajtów albo 12 bajtów itp. Jedyne, co mogę zrobić, to zadeklarować p jako PByte i w pętli inc(p). Ale to jest dla mnie rozwiązanie trochę bez sensu.

1
Juhas napisał(a)

Tyle, że nie mogę tak, jak u góry, ponieważ mam do skopiowania np. 10 bajtów albo 12 bajtów itp. Jedyne, co mogę zrobić, to zadeklarować p jako PByte i w pętli inc(p). Ale to jest dla mnie rozwiązanie trochę bez sensu.
albo możesz np. pomyśleć i zerknąć do helpa i zobaczyć taki magiczny myk jak inc(p, 10)

0
Misiekd napisał(a)
Juhas napisał(a)

Tyle, że nie mogę tak, jak u góry, ponieważ mam do skopiowania np. 10 bajtów albo 12 bajtów itp. Jedyne, co mogę zrobić, to zadeklarować p jako PByte i w pętli inc(p). Ale to jest dla mnie rozwiązanie trochę bez sensu.
albo możesz np. pomyśleć i zerknąć do helpa i zobaczyć taki magiczny myk jak inc(p, 10)

Od początku chciałem zastosować taki magiczny myk. Jednakże kompilator był innego zdania: "Ordinal type required".

[DOPISANE]
OK, już wiem, co zrobiłem nie tak. Od początku robiłem testy z tym INC, ale ze zmienną P zadeklarowaną jako Pointer. Przy deklaracji na PByte, faktycznie można sobie tak hasać.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.