Jak można obliczyć (oszacować) ilość pamięci zajmowanej przez program skompilowany na Linux-ie na podstawie kodu i znanej ilości zajmowanej pamięci skompilowanego na Windowsa (5MB)?
Oszacować sobie można - coś pomiędzy 1MiB a 1000MiB;
Serio, po co Ci takie obliczenia? Masz 32MB pamięci, że o zajętość się martwisz? Skompiluj pod Linuxa i uruchom - tylko wtedy dowiesz się konkretnie ile program pamięci wymaga w danym momencie jego użytkowania; Na pewno wynik będzie podobny.
Właśnie Linux jest TYLKO na laptopie, który się "popsuł". Da się go odzyskać, ale najwcześniej w weekend. Obliczenia są mi potrzebne do OIG (Olimpiada Informatyczna Gimnazjalistów). Napisali, iż moje programy wychodzą poza zakres tablicy i dochodzi do przekroczenia ilości pamięci, której jest max 64MB. A coś się nie chce mi się wierzyć, że ten sam program skompilowany na Windowsa zajmuje ponad 12 razy więcej pamięci w Linuxie.
No chyba, że źle interpretuje, to co mi napisali.
Obliczenia są mi potrzebne do OIG (Olimpiada Informatyczna Gimnazjalistów).
Takie informacje powinieneś podać od razu, w pierwszym poście;
Napisali, iż moje programy wychodzą poza zakres tablicy i dochodzi do przekroczenia ilości pamięci, której jest max 64MB.
Czyli Twój kod jest błędy, bo wykroczenie poza zakres tablicy to najzwyklejszy błąd, którego skutkiem jest wyjątek out of range
; Musisz taki kod poprawić;
A coś się nie chce mi się wierzyć, że ten sam program skompilowany na Windowsa zajmuje ponad 12 razy więcej pamięci w Linuxie.
To trochę dziwnie brzmi - fakt.
Idę o zakład że ilość pamieci zależy od danych wejściowych więc twoje szacowania są z dupy
. Albo tworzysz sobie tam tablicę o rozmiarze wczytanym z klawiatury co przekracza dostępną pamięć albo np. masz rekurencje która wychodzi poza dostępny stos.
Podsumowując: nie szukaj dziury w całym, bo problem jest W TWOIM KODZIE
Jednak moim zdaniem jeśli wyjątek (wyjście poza zakres tablicy) zachodzi w Linux-ie, to powinien być teź w Windows-ie. Natomiast tu działa prawidłowo.
Pokaż ten kod, a zobaczymy czy faktycznie jest poprawnie napisany.
program zadanie3;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
s, s2 : string;
ciag : array of integer;
wyniki : array of string;
Count, i, roznica, dane, petla, start, stop : integer;
b : boolean;
begin
readln(s);
s2 := s;
Delete(s2, pos(' ', s2), Length(s2) + 1 - pos(' ', s2));
Count := StrToInt(s2);
Delete(s, 1, pos(' ', s));
dane := StrToInt(s);
setlength(ciag, Count + 1);
readln(s);
for i := 1 to Count do
begin
s2 := s;
Delete(s2, pos(' ', s2), Length(s2) + 1 - pos(' ', s2));
ciag[i] := StrToInt(s2);
Delete(s, 1, pos(' ', s));
end;
setlength(wyniki, dane);
for i := 1 to dane do
begin
readln(s);
b := True;
s2 := s;
Delete(s2, pos(' ', s2), Length(s2) + 1 - pos(' ', s2));
start := StrToInt(s2);
Delete(s, 1, pos(' ', s));
stop := StrToInt(s);
roznica := ciag[start] - ciag[start + 1];
for petla := start + 1 to stop do
begin
if not (ciag[petla - 1] - ciag[petla] = roznica) then
b := False;
end;
if b then
wyniki[i - 1] := 'Tak'
else
wyniki[i - 1] := 'Nie';
end;
for i := 0 to dane - 1 do
writeln(wyniki[i]);
end.
Wejście:
10 5
5 5 5 10 15 20 15 10 9 8
3 6
3 7
8 10
7 9
1 10
Wyjście:
TAK
NIE
TAK
NIE
NIE
program zadanie5;
uses
SysUtils;
var
s : string;
i, suma : word;
begin
readln(s);
suma := 0;
Delete(s, pos('?', s), 1);
for i := 1 to Length(s) do
Inc(suma, word(s[i]) - 48);
writeln((3 - suma mod 3) mod 3);
end.
wejście:
16?
Wyjście:
2
Są to dwa z pięciu zadań. Wszystko mam wyzerowane.
No dobra ale widze że ustawiasz sobie dynamicznie rozmiar tablic w tych programach. A jaką masz pewność że nie ma testu gdzie taka tablica będzie za duża po prostu? Bo rozumiesz że ten sam problem można rozwiązać 10 różnymi algorytmami i nie każdy algorytm dający poprawne wyniki jest poprawnym rozwiązaniem zadania, prawda?
A nie lepiej to:
setlength(ciag, Count + 1);
readln(s);
for i := 1 to Count do
begin
s2 := s;
Delete(s2, pos(' ', s2), Length(s2) + 1 - pos(' ', s2));
ciag[i] := StrToInt(s2);
Delete(s, 1, pos(' ', s));
end;
setlength(wyniki, dane);
Zamienić na to:
setlength(ciag, Count);
readln(s);
for i := 0 to Count - 1 do
begin
s2 := s;
Delete(s2, pos(' ', s2), Length(s2) + 1 - pos(' ', s2));
ciag[i] := StrToInt(s2);
Delete(s, 1, pos(' ', s));
end;
setlength(wyniki, dane);
Już zaoszczędzisz pamięć. To raz.
Dwa:
for petla := start + 1 to stop do
begin
if not (ciag[petla - 1] - ciag[petla] = roznica) then
b := False;
end;
zmień na
for petla := start + 1 to stop do
begin
if (ciag[petla - 1] - ciag[petla] = roznica) then
writeln('Tak');
else
writeln('Nie');
end;
i znowu trochę pamięci zaoszczędzone gdyż pozbywamy się niepotrzebnej zmiennej pomocniczej i niepotrzebnej tablicy.
A teraz trochę bolesnej prawdy.
Twój kod to kupa, nie licz, że wygrasz.
@babubabu Z tym drugim mogę się nie zgodzić, pomijając twój błąd przy
if (ciag[petla - 1] - ciag[petla] = roznica) then
writeln('Tak'); //po co ten średnik?
else
writeln('Nie');
to wychodzą mi całkowite głupoty na wyjściu. Weź to sprawdź.
@babubabu Program musi sprawdzić, czy zachodzi warunek na wszystkich elementach tablicy, a następnie wypisać. U ciebie sprawdza dwa sąsiednie i wypisuje dla nich. Wynik będzie poprawny tylko dla dwuelementowej tablicy.
@pawel24pl - pokaż może treści zadań, bo chyba łatwiej będzie napisać kod na spokojnie od początku, niż poprawiać to co już jest i nie działa prawidłowo.
Dodaje treści zadań, i jeszcze dodam coś co może być ważne, a czego wczoraj zapomniałem.
Na platformie zadania mają status "Błąd uruchomienia" (wszystkie 5 zadań na 50 testach każde),
co oznacza, że sie nie uruchamiają.
Wzrost pamięci w moich programach wzrasta po uruchomieniu, po wpisaniu danych, a nie
podczas uruchamiania.
@babubabu Szacowanie wielkości na tej podstawie jest dobre, jednak w przypadku zad5 wyjdzie 2*word+string, czyli 4 bajty + tekst do 150 znaków (w przypadku tego zadania), czyli niecałe 160B. Jest to mniej, niż 64MB. Jednak dlaczego to zadanie na wszystkich 50 testach ma błąd uruchomienia? Jak pisałem, wszystkie programy mają ten status z powodu uzasadnionego:
wyjście poza zakres tablicy, przekroczenie ilości pamięci.
Nie pasuje, bo tam nie ma tablic (pomijając, że na upartego "string" to "array of char"), ani wyjścia poza zakres pamięci.
Dlatego też chciałbym mieć nieco konkretniejsze liczby (+-1MB) do ewentualnego odwołania (no chyba, że sie totalnie mylę).