Tablica z różnymi typami

0

znalazlem taka definicję:

type tablica = array [Boolean,1..20] of array [integer] of char;

Potrzebuja teraz zrobic tablice z dwiema kolumnami integer i ileś o typie real
szerokosc i dlugosc tablicy ustalam dynamicznie

jak powinienem zdefinowac, ustalac dlugosc jej (SetLength) i odnosic sie do danych komórek ??

0

Potrzebuja teraz zrobic tablice z dwiema kolumnami integer i ileś o typie real
szerokosc i dlugosc tablicy ustalam dynamicznie

jak powinienem zdefinowac, ustalac dlugosc jej (SetLength) i odnosic sie do danych komórek ??

Po co sobie tak utrudniać? Bierz wszystko jako real, a tam, gdzie masz integer po prostu posłuż się funkcją trunc

0

chodzi mi o optymalizacje bo rekordów mam kolo 40 tys a kazda mili sekunda dla mnie jest bardzo wazna :p

0

Jak wazna dla ciebie jest milisekunda to nie baw sie w tablice dynamiczne tylko w listy, drzewa, reczny malloc itp.

0
Wolverine napisał(a)

Jak wazna dla ciebie jest milisekunda to nie baw sie w tablice dynamiczne tylko w listy, drzewa, reczny malloc itp.

BTW. Zawsze zastanawiałem się, na czym polega zrobienie listy. Chociażby zwykłej listy prostej jednokierunkowej. Jak na razie jestem tylko teoretykiem w listach, a chodzi mi np. jak ma wyglądać taki typ. Czy ktoś może się podzielić wiedzą?

0

nie da się tak jak Ty chcesz. Możesz zrobić np. tak

type
  TMojRec = record
    Calk: Integer;
    Rzecz: Real;
  end;

var
  Tablica: array of TMojRec;

Przykład, który podałeś (type tablica = array [Boolean,1..20] of array [integer] of char;) to w rzeczywistości tablica 3-wymiarowa i równie dobrze można by to zapisać tak: type tablica = array [Boolean,1..20, integer] of char;

0

Jeśli mają byc 2 kolumny integer i nieznana liczba kolumn real, to po po prostu zrób dwie tablice:

Tab1: array [1..2] of array of integer;
Tab2: array of array of Real;

Kiedy juz wiesz ile chcesz kolumn Real, dajesz SetLength(Tab2, LiczbaKolumnReal);

Wielkości kolumn ustawiasz:
SetLength(Tab1[1],DlugoscKolumny1Int);
SetLength(Tab1[2],DlugoscKolumny2Int);
SetLength(Tab2[0],DlugoscKolumny0Real);
itd.

Jeśli kolumny maja byc równej długosci (nie muszą być!) to oczywiście najlepiej zrobić to w petli.

0

a najlepiej będzie shivanwk jak powiesz po co Ci taka tablica, bo mam niejasne przeczucie, że zabierasz się do czegoś od d*** strony :P

PS
no i nic nie stoi na przeszkodzie, żeby to:

type
  TMojRec = record
    Calk: Integer;
    Rzecz: Real;
  end;

var
  Tablica: array of TMojRec;

zamienić np. tak:

type
  TMojRec = record
    Calk: array of Integer;
    Rzecz: array of Real;
  end;

var
  Tablica: array of TMojRec;
0

potrzebuje miec tablice w ktorej jest podany data,czas i wartosc real
operacje ktore wykonuje na niej to tylko odpowiednie szukanie

format miej wiecej taki:
050901,1430,3.555
050901,1535,4.565
050901,1600,3.885
050901,1730,42.599
050901,1830,31.225
050902,0730,31.225

potrzebuje potem tylko sprawdzac w danej kolumnie i danym wierszu wartosci tej tablicy.

Jak powinienem ją skonstruować by zajmowała jak najmniej pamięci i by szybko mozna bylo robic operacje np. tablica[3][2]:=tablica[1][2]+tablica[2][2];

Wolverine 03-10-2005 20:44
Jak wazna dla ciebie jest milisekunda to nie baw sie w tablice dynamiczne tylko w listy, drzewa, reczny malloc itp.

czy mogłbyś przedstawić przykład alokacji pamięci , drzew lub listy ? - czy to bedzie szybsze od tablicy dynamicznej?

ja robie:
-setLength()
-wczytuje do tablicy dane
-potem jak potrzebuje to robie szukanie w tej tablicy odnoszac sie do konkretnej komórki ( to w listach kierunkowych chyba jest nie mozliwe)
Według mnie w grę wchodzi tylko malloc ale nigdzie nie widze przykładów pod Delphi/Pascal :(

0

jak masz mao tych danych (powiedzmy liczone w kilku tysicach) to np. tak:

type
  TMojRec = record
    Data: Integer;
    Czas: Integer;
    Wartosc: Real;
  end;

var
  Tablica: array of TMojRec;
...
  Tablica[1].Czas := Tablica[1].Czas + Tablica[2].Czas;
  Tablica[1] := Tablica[2]; //tez chyba przejdzie

a jak wiecej tych danych to zastanow sie nad jakas baza

0

dane te mi sa potrzebne tylko do obliczen - nie chce ich przechowywac. a ilosc rekordów powinnna sie miescic w okolo 50 tys.Zależy mi tu przede wszystkim na szybkosci wykonywania na nich - prostych obliczeń i przeszukiwania.

0

jesli znasz mniej wiecej gorna granice ilosci danych (i nie jest ona duzo wieksza od minimalnej ilosci danych) to zamiast tablicy dynamicznej uzyj statycznej - jest szybsza. Tak samo jesli chcesz miec dostep do kilku "komorek" jednoczesnie to daj sobie spokoj z listami i kolejkami.

PS. u mnie na K7 1,66GHz wypenienie tablicy statycznej 50000 rekordow trwa niecale 0,001895 sekundy a dynamicznej 0,00207

type
  TMojRec = record
    Data: Integer;
    Czas: Integer;
    Wartosc: Real;
  end;

var
  Tablica: array[1..50000] of TMojRec;

procedure TForm2.btn1Click(Sender: TObject);
var
  i: Integer;
  co, co1, fr: Int64;
begin
  QueryPerformanceFrequency(fr);
  QueryPerformanceCounter(co);
  for I := 1 to 50000 do
  begin
    Tablica[i].Data := Random(2000);
    Tablica[i].Data := Random(5000);
    Tablica[i].Wartosc := Random(10000) / 1000;
  end;
  QueryPerformanceCounter(co1);
  ShowMessage(FloatToStr((co1-co) / fr));
end;
0

tak jak pisalem wartosc jest jeszce rozszezona o X kolumn
czyli tak naprawde to ta tablica jest

data,czas i zawsze kolo 300 kolumn z wartoscia

potem biorę np. 100 wiersz i w kazdej z wartosci pisze sume stu poprzednich

czyli wartosci jest 50tys x 300 kolumn x 100 (suma)

Przykładowe obliczenia jakie potrzebuje :

 for i:=m to count do
   Begin
    temp1:=tab[i][2];
    for l:=0 to hot_count-1 do 
    begin
     j:=0;
     for k:=l downto 0 do
      if temp1<tab[i-k-1][2] then j:=j+w[l+1][k] else j:=j-w[l+1][k];
     tab[i][l+3]:=j
    end;
   end;

także potrzebuje sie odwoływać do każdej komórki w tabeli - obliczen jest sporo :)

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