Wskazniki

0

Mam zadeklarowany typ :
PMojTyp = ^TMojTyp
TMojTyp = record
zm1 : ....
zm2 : ....
....
end;
i czesc programu :
var
zmienna : TMojTyp;
lista : TList;
PZmienna : PMojTyp;
begin
...
for i:=0 to 10 do
begin
JakiesOperacje(zmienna);
new(PZmienna);
PZmienna^:=zmienna;
lista.add(PZmienna);
......
end;
......
end;
Mam nastepujacy problem: tworze pewne operacje na zmiennej 'zmienna' i chce dodac ja po z modyfikowaniu do listy (TList);
nastepnie dalej przeprowadzam na niej operacje i zmiany znowy zapisuje do listy.
Ale niestyty mi to nie wychodzi, a mianowicie do listy dodaje, ale kazda dodana pozycja zawiera te same dane po ostatniej modyfikacji.
Powinien dodac 10 pozycji do listy zawierajacych rozne dane.
Co jest nie tak?

0

Może zrób to w takie kolejności:

  1. Przydziel pamięć na zmienną. (New)
  2. Wykonaj operacje.
  3. Dodaj.
0

Może zrób to w takie kolejności:

  1. Przydziel pamięć na zmienną. (New)
  2. Wykonaj operacje.
  3. Dodaj.

Ale mi nie chodzi o robieniu operacji na zmiennej dynamicznej tylko na zwyklej zmiennej statycznej, a potem przypisanie wartosci tej zmiennej do zmiennej dynamicznej. No i zeby oczywiscie dodawal do listy, tak zebym mogl pozniej odtworzyc przeprowadzane zmiany na zmiennej (rekordzie).

0

Musze sie przypomniec bo bardzo zalezy mi na tym.
Prosze o jakies sugestie. ;-(

0

Pętla powinna wyglądac mniej więcej tak:

type
PTyp=^TTyp;
TTyp=record
Pole1:String;
Pole2:Integer;
end;

var
lista:TList;
rec:PTyp;
i:integer;

lista:=tlist.create;

for i:=0 to 9 do
begin
new(rec);
rec^.pole1:='costam';
rec^.pole2:=i;
lista.add(rec);
end;

Nie wiem, czy nie ma jakiegoś drobnego błędu, bo pisałem z pamięci, ale ten kod powinien dodać do TList 10 róznych pozycji :)

0

for i:=0 to 9 do
begin
new(rec);
rec^.pole1:='costam';
rec^.pole2:=i;
lista.add(rec);
end;

Zgadza sie, ale w przypadku gdy rec^.pole1 przyporzadkowujesz jakas konkretna wartosc.
A mi chodzi o to, ze robisz operacje na zmiennej statycznej,
czyli deklarujesz zmienna np.:
var
Zmienna : TTyp;
// i zmienna:
PZmienna : PTyp;
begin
for i:=0 to 9 do
begin
zmienna.pole1:= i+2;
zmienna.pol2 := i*2; // tutaj robi operacje na zmiennej statycznej
New(PZmienna);
Pzmienna^:=zmienna
List.Add(Pzmienna)
end;

end;
Czyli za kazda petla ma zapisac na stos wskaznik do nowej zmiennej.
I zapisuje. Ale na liscie wszystkie elementy maja te same wartosci, takie jakie byly dla zmiennej w ostatniej petli.
A ja potrzebuje zeby na liscie znajdowaly sie elementy ktore maja wartosci takie, jakie byly po kazdej modyfikacji zmiennej.
Nie wiem czy jasno sie wyrazilem?
W skrocie: robie operacje na zmiennej statycznej i zapisuje je na liste, i znowu dokonuje zmiany tej samej zmiennej i znowu zmiany trafiaja na liste, itd....

0

Nie wiem, czy dobrze zrozumiałem, ale czy chodzi ci o zmodyfikowanie wartości jakiegoś elementu? Nie za bardzo rozumiem, po co ci jest ta statyczna zmienna... Ale jeśli moje przypuszczenia są słuszne, to kod wygląda tak:

for i:=0 to 9 do
begin
rec:=lista[i];
rec^.pole1:='jakas nowa wartosc';
rec.pole2:=rec.pole2+4;
lista[i]:=rec;
end;

A jeśli nie o to chodziło, to napisz, co chcesz osiągnąć, na pewno się znajdzie jakieś rozwiązanie :)

0

To jeszcze raz wyjasnie:
Mam zmienna typu recordowego (dosc duzo pol).
Przeprowadzam pewne operacje na tej zmiennej. Jest to caly czas jedna statyczna zmienna.
Ale wpadlem na pomysl ze chcialbym co jakis czas kopiowac wrzucac to zmienna na liste. Czyli co pewien etap liczenia zmienna miala byc kopiowana do listy. Ale dalej program uzywal by zmiennej statycznej do liczenia a nie tej z listy.
A moj problem polega na tym ze jak przyporzadkowuje zmienna statyczna do nowej zmiennej dynamicznej i dodaje ja do listy, to po dokonywaniu zmian w zmiennej statycznej wszystkie elementy listy tez sie zmieniaja. Czyli w rezultacie mam liste z takimi samymi wartosciami.

Moze teraz troche jest to bardziej czytelniejsze, ale i tak ciezko mi to wytlumaczyc.

0

W takim razie może wykonuj wszystkie operacje na wskaźniku? Wtedy nie będzie problemów :)

0

W takim razie może wykonuj wszystkie operacje na wskaźniku? Wtedy nie będzie problemów :)

Chyba bede musial tak zrobic, bo zrobilem dla proby taki programik aby dodawal mi do listy tak jak to mialo byc. I dziala dobrze.
I tak samo mialem zrobione w starym programie, ale za diabla nie chce dzialac prawidlowo.
Nie mam pojecia co moze byc.
Takze chyba bede musial przerobic wszystko na wskazania.
Dzieki za rady.
Pozdrawiam! [browar]

0

A ja już chyba wiem w czym problem :-D
Stawiam piwo, jeżeli się mylę.
Na pewno w procedurze:
JakiesOperacje(zmienna);
Parametr nie jest zadeklarowany jako var i dla tego nie zmienia wartości :)

0

A ja już chyba wiem w czym problem :-D
Stawiam piwo, jeżeli się mylę.
Na pewno w procedurze:
JakiesOperacje(zmienna);
Parametr nie jest zadeklarowany jako var i dla tego nie zmienia wartości :)

To pije piwo!
To jest zmienna public zadeklarowana w klasie.
I caly czas sie z tym mecze, nawet jak nie uzywam wskaznikow to jest ten sam problem np.:
tworze zmienna 'proba : MojTyp;
...

  1. Jakies operacje; // na zmiennej 'zmienna'

  2. proba := zmienna

  3. JakiesOperacje; // na zmiennej 'zmienna'
    ...

w lini 2 chce zachowac stare dane zmiennej 'zmienna'
w lini 3 znowu pewne operacje na zmiennej
i po tych operacjach zmienna 'proba' tez sie zmienia !
:-[
DLACZEGO!

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