Skocz do zawartości
koparka

Zmienne Dynczmiczne [pascal]

Rekomendowane odpowiedzi

Ostatnio troche bawilem sie z obliczaniem szybkosci algorytmow sortujacych.

Maksymalna tablica typu integer jaka udalo mi sie stworzych to 0..7900.

Potrzebowalem troche wiecej wiec siegnalem po wskazniki.

Sporobowalem na poczatku tak jak gdzies bylo napisane czyli

tablica:array[1..7900] of ^integer;
ale tutaj dziwnie sie zlozylo ze jescze mniej moglem

wpakowac;

po kilku dniach wpadlem na inny pomysl:

type 	   pomoc=array[0..32000] of integer;	   dane=^pomoc;var	   tablica:dane;

Nastepnie w glownej czesci programu na samym poczatku robie

new(tablica);

 

Czy to jest dobre zastosowanie, poprawne itp...?

 

Nastepnie zdzila mnie jedna rzecz:

kiedy zdeklarowalem procedure

procedure sortowanko(abc:dane;i2:integer);begin		new(abc);		{tutaj dzialanie na tej tablicy abc}		dispose(abc);end;
to nie dzialala poprawnie...

postanowailem wiec wywalic new(abc) i potem dispose(abc)

i dzialalo pieknie;

czy tego nie doczytalem gdzies, czy to jest jakies dziwne zjawisko

i wcale nie dziala poprawnie to?

 

=====================================================

 

I jescze druga sprawa:

mam zbadac liczbe porownan i zamian

sortowan przez wstawianie i wybor;

czy tu dobrze jest to zrobione, bo cos

mi sie wyniki nie zgadzaja ze wzorami

procedure wstawianie(tb:dane;i2:integer);var   pm:integer;   a:word;begin	 czaswstaw:=czas;	 for a:=2 to i2 do	 begin		  tb^[0]:=tb^[a];		  pm:=a;		  porwstaw:=porwstaw+1;		  while tb^[pm-1]>tb^[0] do		  begin			   tb^[pm]:=tb^[pm-1];			   dec(pm);			   porwstaw:=porwstaw+1;		  end;		  tb^[pm]:=tb^[0];		  zamwstaw:=zamwstaw+1;	 end;	 czaswstaw:=czas-czaswstaw;end;procedure wybor(tb:dane;i2:integer);var   i,j,k,tmp:integer;begin	 czaswybor:=czas;	 for i:=1 to i2-1 do	 begin		  k:=i;		  for j:=i+1 to i2 do		  begin			   porwybor:=porwybor+1;			   if tb^[k]>tb^[j] then k:=j;		  end;		  tmp:=tb^[i];		  tb^[i]:=tb^[k];		  tb^[k]:=tmp;		  zamwybor:=zamwybor+1;	 end;	 czaswybor:=czas-czaswybor;end;
Edytowane przez koparka

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Maksymalna tablica typu integer jaka udalo mi sie stworzych to 0..7900.

Potrzebowalem troche wiecej wiec siegnalem po wskazniki.

Sporobowalem na poczatku tak jak gdzies bylo napisane czyli

tablica:array[1..7900] of ^integer;
ale tutaj dziwnie sie zlozylo ze jescze mniej moglem

wpakowac;

Nic dziwnego, zrobiłeś tablicę wskaźników do Integer; w Turbo Pascalu każdy wskaźnik zajmuje 4 bajty, a Integer - 2.

po kilku dniach wpadlem na inny pomysl:

type 	   pomoc=array[0..32000] of integer;	   dane=^pomoc;var	   tablica:dane;

Nastepnie w glownej czesci programu na samym poczatku robie

new(tablica);

 

Czy to jest dobre zastosowanie, poprawne itp...?

Poprawne - o ile oczywiście potrzebujesz tablicy "tablica". (Dalsza część postu świadczy o tym, że chyba nie)

Nastepnie zdzila mnie jedna rzecz:

kiedy zdeklarowalem procedure

procedure sortowanko(abc:dane;i2:integer);begin		new(abc);		{tutaj dzialanie na tej tablicy abc}		dispose(abc);end;
to nie dzialala poprawnie...

postanowailem wiec wywalic new(abc) i potem dispose(abc)

i dzialalo pieknie;

czy tego nie doczytalem gdzies, czy to jest jakies dziwne zjawisko

i wcale nie dziala poprawnie to?

Dziwne. Może akurat brakło pamięci po alokacji wcześniej zmiennej "tablica"?

A tak w ogóle, to nie wiem, po co przekazujesz parametr abc do procedury. To powinna być tutaj zmienna lokalna.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

chodzi o to ze porownuje ze soba algorytmy sortujace dla takich samych danych wprowadzonych - zeby bylo widac ze np dla konkretnej tablicy ktoras metoda jest wolniejsza od innej,

Poprawne - o ile oczywiście potrzebujesz tablicy "tablica". (Dalsza część postu świadczy o tym, że chyba nie)

musze miec glowna globalna tablice (tablica) zeby wpierw wprowdzic do niej dane do posrotwania i zeby kazda pozniejsza procedura korzytsala z tej tablicy

A tak w ogóle, to nie wiem, po co przekazujesz parametr abc do procedury. To powinna być tutaj zmienna lokalna.

jak mam procedury sortujace to wywoluje je nastepujaco, np. bubblesort(tablica,zakres); a jest ona zdeklarowana

procedure bubblesort(abc:dane,i2:integer);

wiec abc jest zmienna lokalna (tylko na czas sortowania), ktora dostaje wlasnie wartosci "tablicy", zeby nie zmienic wartosci "tablica", bo do innego sortowania musza byc takie same dane (tak wiec operacje odbywaja sie tylko na abc);

troche nieskladnie napisane, ale chyba rozumiesz o co chodzi :)

Dziwne. Może akurat brakło pamięci po alokacji wcześniej zmiennej "tablica"?

nie za bardzo rozumiem to zdanie... ale czy jakis brak pamieci moze spowodowac to ze moge dizalac na zmiennej wskazywanej nie dkelarujac jej "new"?

a moze jak w procdurze jej zdeklarowany lokalnie wskaznik to automtycznie sie zalacza na czas jej dzialania?

 

W ogole, to dzieki za zainteresowanie tematem i odpowiedz :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

jak mam procedury sortujace to wywoluje je nastepujaco, np. bubblesort(tablica,zakres); a jest ona zdeklarowana

procedure bubblesort(abc:dane,i2:integer);

wiec abc jest zmienna lokalna (tylko na czas sortowania), ktora dostaje wlasnie wartosci "tablicy", zeby nie zmienic wartosci "tablica", bo do innego sortowania musza byc takie same dane (tak wiec operacje odbywaja sie tylko na abc);

troche nieskladnie napisane, ale chyba rozumiesz o co chodzi :)

Skoro tak, to nie powinieneś wewnątrz procedury alokować nowej tablicy (a właśnie to robi procedura New).

Poprzednio mnie to zmyliło, teraz widzę o co chodzi ;) po prostu tam nie ma być ani New ani Dispose (tak jak zrobiłeś). Wystarczą 2 tablice alokowane raz na cały czas działania programu.

A pomiar czasu wygląda na dobry. Można wiedzieć, z jakimi wzorami wyniki się nie zgadzają?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

nie chodzi mi o pomiar czasu - bo to chyba jest ok, ale bardziej o pomiar ilosci zmaian i porownan w poszczegolnych sortowniach:

np jak we wstawianiu jest jakies poronanie to zmienna

porwstaw zostaje powieszkona o 1 i tak samo z

zamina zmienna zamwstaw jest powiekszana,

wzorki to http://www.twobeds.com/upload/userfiles/kuba222/sorty.txtPO to porwnania, a P to przestawienia-zamiany

Skoro tak, to nie powinieneś wewnątrz procedury alokować nowej tablicy (a właśnie to robi procedura New).

Czyli ze juz automtycznie sie zalacza wskaznik wewnatrz procedury i moge dizalac na niej bez new?

A co dokladnie znaczy alokowac, bo tego slowka za bardzo nie kumam :]

By google:

Alokować - zarezerwować ilość pamięci wystarczającą na potrzeby operacji wykonywanych przez program.

Czy o takie znaczenie chodzi?

Edytowane przez koparka

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...