Dodawanie wartości do wskaźnika

Odpowiedz Nowy wątek
2011-07-18 17:06
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.

Pozostało 580 znaków

2011-07-18 21:26
0

Najlepiej chyba dać

p:^typ;
[...]
inc(p);

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.


Nie pisz do mnie PM o czymś co nie dotyczy bezpośrednio mnie. | Nie rozmawiaj ze mną jeśli brak Ci kultury (wystarczy że mi brakuje) | Nie jestem zły, jestem po prostu zły.

Pozostało 580 znaków

2011-07-19 11:38
0
payl napisał(a)

Najlepiej chyba dać

p:^typ;
[...]
inc(p);

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.

edytowany 1x, ostatnio: Juhas, 2011-07-19 11:38

Pozostało 580 znaków

2011-07-19 11:43
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)


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij
O boże. Chyba tylko Misiekd z nas przytomny :D - payl 2011-07-19 14:51

Pozostało 580 znaków

2011-07-19 15:09
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ć.

edytowany 1x, ostatnio: Juhas, 2011-07-19 15:15

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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