infoarena

infoarena - concursuri, probleme, evaluator, articole => Informatica => Subiect creat de: Valkyria Dark din Februarie 28, 2007, 21:59:02



Titlul: limita de memorie la OJI?
Scris de: Valkyria Dark din Februarie 28, 2007, 21:59:02
Aveti cumva idee ce limita de memorie e la olimpiada de info pe municipiu?
La nationala la regulament e specificat clar, dar la OJI? Nu zice nimic de asta in regulament.
Sa interpretez ca trebuie sa ma limitez la cat are borland pascal prin default?
Si daca tot e vorba de OJI, avand in vedere ca majoritatea celor de pe aici sunt olimpici, aveti vreun sfat sau vreo sugestie? (sunt clasa a 12a)  Spre ex, cum pot sa aflu timpul de rulare? (ar fi mult mai tare daca ne-ar lasa cu un linux, unde pot sa-i dau time ./numeprogram si gata...)


Titlul: Răspuns: limita de memorie la OJI?
Scris de: Tabara Mihai din Februarie 28, 2007, 22:16:48
Aveti cumva idee ce limita de memorie e la olimpiada de info pe municipiu?
La nationala la regulament e specificat clar, dar la OJI? Nu zice nimic de asta in regulament.
Sa interpretez ca trebuie sa ma limitez la cat are borland pascal prin default?
Si daca tot e vorba de OJI, avand in vedere ca majoritatea celor de pe aici sunt olimpici, aveti vreun sfat sau vreo sugestie? (sunt clasa a 12a)  Spre ex, cum pot sa aflu timpul de rulare? (ar fi mult mai tare daca ne-ar lasa cu un linux, unde pot sa-i dau time ./numeprogram si gata...)

/* Cred ca exista functia de timp din headerul "time.h". */
Stai sa imi caut niste fisiere ca nici eu nu am mai folosit demult fazele astea :-k  :sad:  :aha:

 :thumbup:


Titlul: Răspuns: limita de memorie la OJI?
Scris de: Valkyria Dark din Februarie 28, 2007, 22:39:37
ah, am uitat sa precizez... folosesc pascal ca limbaj... din pacate, nu are time.h...
mersi oricum :)


Titlul: Răspuns: limita de memorie la OJI?
Scris de: Tabara Mihai din Februarie 28, 2007, 22:47:14
Acuma numai am observat .....ai zis in postul tau initial
Sa interpretez ca trebuie sa ma limitez la cat are borland pascal prin default?

Am citit eu gresit.Sorry. :aha: Pai atunci sper sa te lamureasca un utilizator de Pascal de pr forum  :thumbup:

 :peacefingers:


Titlul: Răspuns: limita de memorie la OJI?
Scris de: Valentin Stanciu din Februarie 28, 2007, 22:47:27
Limita de memorie statica este cat te tine compilatorul, cea dinamica este cat te tine calculatorul.. nu prea e stabilit
Limita statica - cand vezi ca iti da eroare ca folosesti prea multa memorie, atunci ai depasit limita :) (parca era ceva gen 1MB)

in borland pascal parca faceam un smen sa aflu timpul de executie - ceva gen:
Cod:
var time:longint absolute 0:$46c;
    t1, t2:longint;
begin
    t1 := time;

    (programul tau)

    (...la sfarsitul programului...)
    t2 := time;
    writeln((t2-t1)/18.2:0:3);
end.
ideea e ca 46c este adresa unde se tine ceasul procesorului si cu absolute poti accesa direct o adresa de memorie; sper ca ai inteles :)


Titlul: Răspuns: Răspuns: limita de memorie la OJI?
Scris de: Tabara Mihai din Februarie 28, 2007, 22:48:40
(parca era ceva gen 1MB)

Si ca veni vorba...cam putin  :sad: :fool:
 :-'


Titlul: Răspuns: limita de memorie la OJI?
Scris de: Savin Tiberiu din Februarie 28, 2007, 22:50:19
timpul de rulare il poti aproxima in functie de complexitate. cam 1 milion de operatii intra cam in 0,1  , 20 de milioane cam intr-o secunda si iti poti face simplu o idee cam cat timp va rula programu tau, si dak ai gasit o complexitate optima.


Titlul: Răspuns: Răspuns: limita de memorie la OJI?
Scris de: Valentin Stanciu din Februarie 28, 2007, 23:01:24
(parca era ceva gen 1MB)

Si ca veni vorba...cam putin  :sad: :fool:
 :-'
in rest poti aloca dinamic cat vrei..
timpul de rulare il poti aproxima in functie de complexitate. cam 1 milion de operatii intra cam in 0,1  , 20 de milioane cam intr-o secunda si iti poti face simplu o idee cam cat timp va rula programu tau, si dak ai gasit o complexitate optima.
compilezi pe windows cu borland -> 1 milion de operatii intr-o secunda :)


Titlul: Răspuns: limita de memorie la OJI?
Scris de: Airinei Adrian din Februarie 28, 2007, 23:20:04
Alocarea dinamica in borlandc e un fel de marca sau banul  :shock:


Titlul: Răspuns: Răspuns: limita de memorie la OJI?
Scris de: Valkyria Dark din Februarie 28, 2007, 23:25:45
Limita de memorie statica este cat te tine compilatorul, cea dinamica este cat te tine calculatorul.. nu prea e stabilit
Limita statica - cand vezi ca iti da eroare ca folosesti prea multa memorie, atunci ai depasit limita :) (parca era ceva gen 1MB)

in borland pascal parca faceam un smen sa aflu timpul de executie - ceva gen:
Cod:
var time:longint absolute 0:$46c;
    t1, t2:longint;
begin
    t1 := time;

    (programul tau)

    (...la sfarsitul programului...)
    t2 := time;
    writeln((t2-t1)/18.2:0:3);
end.
ideea e ca 46c este adresa unde se tine ceasul procesorului si cu absolute poti accesa direct o adresa de memorie; sper ca ai inteles :)
mersi, asa ceva cautam :)
acum mai ramane si sa il pun in practica, si apare o mica problema
compilandu-l cu fpc imi da 2 erori la linia var time:longint absolute 0:$46c;
Cod:
Error: absolute can only be associated with a var or const
Error: Syntax error, ";" expected but ":" found
cum functioneaza treaba cu absolute mai exact?

timpul de rulare il poti aproxima in functie de complexitate. cam 1 milion de operatii intra cam in 0,1  , 20 de milioane cam intr-o secunda si iti poti face simplu o idee cam cat timp va rula programu tau, si dak ai gasit o complexitate optima.
Da, e si asta o solutie, mersi pt idee, numai ca am 2 mici probleme:
1 - inca mai am de invatat cum se calculeaza complexitatea. Pana acum, m-am bazat mai mult pe intuitie, si nu am stat niciodata sa calculez... (se explica de ce n-am trecut niciodata de municipiu), dar o sa invat intr-un timp apropiat
2 - nu e foarte exact... depinde de compilator, procesor, etc


in rest poti aloca dinamic cat vrei..
tin minte ca parca era o limita si pt asta...


Titlul: Răspuns: limita de memorie la OJI?
Scris de: Tabara Mihai din Februarie 28, 2007, 23:38:11
Alocarea dinamica in borlandc e un fel de marca sau banul  :shock:

Bine zis!  ](*,)


Titlul: Răspuns: limita de memorie la OJI?
Scris de: Andrei Grigorean din Martie 01, 2007, 00:24:47
Programul scris de svalentin compileaza in borland pascal 7.0 (compilatorul folosit la OJI). Il poti folosi cu incredere.


Titlul: Răspuns: limita de memorie la OJI?
Scris de: Valkyria Dark din Martie 01, 2007, 00:59:17
Programul scris de svalentin compileaza in borland pascal 7.0 (compilatorul folosit la OJI). Il poti folosi cu incredere.
Aaa... asa se intampla cand am prea multe sisteme de operare si mi-e lene sa dau reboot... :D
Da, merge in borland pascal. Mersi.

Acum ramane doar sa-mi dau seama exact ce si cum.
Deci sa vad daca am inteles. In urma rularii programului cu un delay la mijloc, am asa:
- cu delay(1000), deci 1 secunda, imi afiseaza 0
- cu delay(10000), deci 10 secunde, imi afiseaza 0,055, iar t2-t1=1
- cu delay(50000) deci 50 secunde, numaistiucat afisa, t2-t1=6...
- la un merge sort pe un vector cu n=10000 imi afiseaza tot 0
Deci, in concluzie... tot ce am inteles e ca la olimpiada ar trebui sa imi afiseze 0, si ca nr de secunde e aproximativ egal cu (t2-t1)*10...  Sunt pe-aproape? :))


Titlul: Răspuns: limita de memorie la OJI?
Scris de: Cezar Mocan din Martie 01, 2007, 09:52:42
Daca vrei sa-ti mearga in FPC poti cu gettime(a,b,c,d), unde a=ore, b=minute, c=secunde, d=milisecunde.
Pui unu la inceputu programului si unu la sfarsit si te uiti cat e diferenta dintre cele 2.
P.S.:Cred ca merge si in Borland (da' nu-s sigur... n-am lucrat de mult in Borland)...  :-k
:monkey:


Titlul: Răspuns: limita de memorie la OJI?
Scris de: Valentin Stanciu din Martie 01, 2007, 13:28:15
Cu fpc nu prea poti accesa ce adresa de memorie vrei tu, cum te taie capul; teoretic nici sistemul de operare nu ar trebui sa te lase. Poate poti face ceva asemanator si in fpc (ma refer la accesa o adresa de memorie oarecare), dar eu nu cunosc.
delay(1000) nu inseamna neaparat o secunda! inseamna 1000 de operatii (nu stiu exact ce operatii face delay ca sa iti zic cat dureaza una); dar ideea e ca delay(1000) nu tine mereu un timp X, depinde de cat de rapid este procesorul pe care rulezi programul.

Nu stiu de ce nu iti merge tie cum trebuie.. programul dat de mine trebuia sa iti afiseze numarul de secunde de executie cu 3 zecimale.. uite de exemplu un program care masoare timpul de executie al altui program:
Cod:
{$M $4000,0,0 }   {no heap, sa lase loc pentru programul executat}
uses dos;
var stestnr:string;
    t:longint absolute 0:$046c;
    t1,t2:longint;

begin
 stestnr:=paramstr(2);

 t1:=t;
 exec(paramstr(1),'');
 t2:=t;
 writeln('Programul a rulat in ',(t2-t1)/18.2:0:3,' secunde');
end.
daca merge sortul tau se cheama a.exe si programul scris mai sus eval.exe; vezi timpul de executie apeland:
Citat
eval.exe a.exe


Titlul: Răspuns: Răspuns: limita de memorie la OJI?
Scris de: Sima Cotizo din Martie 01, 2007, 21:15:47
Limita de memorie statica este cat te tine compilatorul, cea dinamica este cat te tine calculatorul.. nu prea e stabilit
Limita statica - cand vezi ca iti da eroare ca folosesti prea multa memorie, atunci ai depasit limita :) (parca era ceva gen 1MB)

Parca era de 64KB, stiti voi anecdota cu Bill Gates ... (ca 64KB ar trebui sa fie de ajuns pt toti, zisa in anii '80) :P...

In Windows exista aplicatia ptime (o poti cauta la google) ... si daca ai net inainte de proba (cum ai norocul de obicei) o poti descarca... e utila si nu te ajuta la programare, nu e un material ceva deci nu vad de ce ar fi ilegala...  :-'


Titlul: Răspuns: limita de memorie la OJI?
Scris de: Cezar Mocan din Martie 01, 2007, 21:29:38
Totusi, mie gettime mi se pare cel mai practic. Nu trebuie sa descarci nimic de pe net sau sa tii minte adrese de memorie. Chestia e ca nu stiu ce dezavantaje are... Poate imi spune si mie cineva care sunt dezavantajele acestei proceduri.   :?
:monkey:


Titlul: Răspuns: limita de memorie la OJI?
Scris de: Tabara Mihai din Martie 01, 2007, 21:37:07
Totusi, mie gettime mi se pare cel mai practic. Nu trebuie sa descarci nimic de pe net sau sa tii minte adrese de memorie. Chestia e ca nu stiu ce dezavantaje are... Poate imi spune si mie cineva care sunt dezavantajele acestei proceduri.   :?
:monkey:
Ca trebuie sa faci o scadere probabil.  :D

 :ok:  :peacefingers:


Titlul: Răspuns: limita de memorie la OJI?
Scris de: Valentin Stanciu din Martie 01, 2007, 22:49:52
Este mai rapid sa accesezi direct memoria decat sa apelezi o funcite.. si cred ca e si mai precis.
Stiu ca pe vremea cand implementam backuri omorate dupa 0.9 secunde, era vital sa folosesc asta si nu gettime tocmai din faptul ca verificam des timpul si sa am un overhead cat mai mic.


Titlul: Răspuns: Răspuns: limita de memorie la OJI?
Scris de: Valkyria Dark din Martie 02, 2007, 22:58:33
Hmm, vad ca gettime nu e o functie recunoscuta de borland pascal. Ori e de printr-un unit ceva, ori nu e.... ar fi fost buna, sa compar rezultatul cu cealalta metoda...

Cu fpc nu prea poti accesa ce adresa de memorie vrei tu, cum te taie capul; teoretic nici sistemul de operare nu ar trebui sa te lase. Poate poti face ceva asemanator si in fpc (ma refer la accesa o adresa de memorie oarecare), dar eu nu cunosc.
delay(1000) nu inseamna neaparat o secunda! inseamna 1000 de operatii (nu stiu exact ce operatii face delay ca sa iti zic cat dureaza una); dar ideea e ca delay(1000) nu tine mereu un timp X, depinde de cat de rapid este procesorul pe care rulezi programul.

Nu stiu de ce nu iti merge tie cum trebuie.. programul dat de mine trebuia sa iti afiseze numarul de secunde de executie cu 3 zecimale.. uite de exemplu un program care masoare timpul de executie al altui program:
Cod:
{$M $4000,0,0 }   {no heap, sa lase loc pentru programul executat}
uses dos;
var stestnr:string;
    t:longint absolute 0:$046c;
    t1,t2:longint;

begin
 stestnr:=paramstr(2);

 t1:=t;
 exec(paramstr(1),'');
 t2:=t;
 writeln('Programul a rulat in ',(t2-t1)/18.2:0:3,' secunde');
end.
daca merge sortul tau se cheama a.exe si programul scris mai sus eval.exe; vezi timpul de executie apeland:
Citat
eval.exe a.exe
Asa, am facut si asta... oarecum... Pe scurt, valorile par mai apropiate de realitate, dar... nu sunt prea buna la estimari...
Deci deoarece habar n-am cum sa creez un executabil cu borland pascal, am facut asa:
- am luat sortul simplu (ii zicem sort.pas) si l-am compilat cu fpc (rezultand sort.exe)
- am deschis... eval.pas cu borland pascal, am presupus ca daca bag "sort.exe" la Parameters (era printr-un meniu), ar trebui sa mearga... si l-am rulat.
Rezultatul: eval-ul ruleaza sort.exe, si asteapta sa ii dau enter, si abia dupa afiseaza timpul...
Si daca ii dau spre ex enter dupa (estimativ) 10s, imi afiseaza ceva cu o valuare aproximativ pe-acolo... Deci... merge cat de cat...
Mai reiau testele una din zilele urmatoare, sa stiu sigur ce si cum :)


Titlul: Răspuns: limita de memorie la OJI?
Scris de: Valentin Stanciu din Martie 02, 2007, 23:50:25
Deci deoarece habar n-am cum sa creez un executabil cu borland pascal, am facut asa:
din directorul in care este fisierul .pas apelezi "bpc eval.pas" si iti creeaza eval.exe.

Programului aluia care sorteaza numere spune-i sa nu mai astepte enter!


Titlul: Răspuns: limita de memorie la OJI?
Scris de: Valkyria Dark din Martie 03, 2007, 00:26:16
Ups...  eram sigura ca stersesem readln-u de acolo...  :oops:
Pare sa mearga destul de bine acum...
Nu am bpc pe-acolo, e o versiune mai ciudata a programului...
Ok, mersi mult, si scuze ca sunt neatenta... promit sa nu mai incerc sa invat chestii noi cand mi se inchid ochii de somn...  :oops:


Titlul: Răspuns: limita de memorie la OJI?
Scris de: Sima Cotizo din Martie 04, 2007, 08:13:35
Nu am bpc pe-acolo, e o versiune mai ciudata a programului...
:eyebrow: si pascalul ala cu ce compileaza? ...
daca nu ai borland pascal, cauta si tu in directorul bin/ , unde se afla si executabilul pe care il rulezi, un program [de dos, deci cauta-l din cmd] care afiseaza ceva cu "compiler" ;) ... [daca nu ai bpc probabil ai turbo pascal, mi se pare ca ala compileaza cu tpc... :) dar pot gresi]


Titlul: Răspuns: limita de memorie la OJI?
Scris de: Vlad Saveluc din Martie 06, 2007, 00:24:14
Alocarea dinamica in borlandc e un fel de marca sau banul  :shock:
Poti fi mai explicit. Vad ca multi se plang de alocarea dinamica din C. Ai avut vreodata probleme cu alocarea dinamica ?


Titlul: Răspuns: limita de memorie la OJI?
Scris de: Airinei Adrian din Martie 06, 2007, 00:37:32
De exemplu, odata incercam sa aloc dinamic liste de adiacenta pentru un graf folosind realloc. Am generat un fisier de test cu mai multe muchii, si cand am rulat programul se bloca inexplicabil. Am facut debug pas cu pas si am constat ca la un moment dat, cand incerca sa aloce o muchie aparea ecranul negru si nu se intampla nimic, ceva de genul bucla infinita.


Titlul: Răspuns: limita de memorie la OJI?
Scris de: Valentin Stanciu din Martie 06, 2007, 11:22:51
De exemplu, odata incercam sa aloc dinamic liste de adiacenta pentru un graf folosind realloc. Am generat un fisier de test cu mai multe muchii, si cand am rulat programul se bloca inexplicabil. Am facut debug pas cu pas si am constat ca la un moment dat, cand incerca sa aloce o muchie aparea ecranul negru si nu se intampla nimic, ceva de genul bucla infinita.
Alocai cu malloc si erai in modelul de memorie small. Malloc aloca din heap (64k max pe small) si doar pe modelele de memorie compact, large sau huge aloca din far heap (unde ai spatiu cat te tine RAMul sau nelimitat in windows/linux). Daca la programul ala compilai cu model de memorie compact, iti mergea perfect.
Daca vrei sa nu depinzi de modelul de memorie aloca memoria cu farmalloc.. dar ai grija ca apoi trebuie peste tot sa lucrezi cu far pointeri (ex: int far *a). Prin urmare scanf nu o sa mearga cu variabilele respective (el lucreaza cu pointeri, nu cu far pointeri) si inca cateva functii care trebuie sa le tratezi mai special (memcopy devine fmemcopy... etc)

Sau.. poti sa bati comisia de la OJI la cap sa compileze toate sursele cu modelul de memorie compact sau large (huge nu recomand).. tot ce au de facut este sa adauge -ml la linia de compilare.
Sau.. poti sa folosesti pragma si sa setezi explicit in programul tau modelul de memorie in care vrei sa compilezi (dar daca ai un model specificat cu pragma si la compilare setezi alt model, nu stiu exact pe care din cele doua le ia in considerare)

Alocarea de memorie merge foarte bine in BC, doar ca este putin mai complex facuta dupa cum am detaliat mai sus.. este asa ca acel compilator poate creea executabile si pentru procesoare 386, care nu aveau decat 64k + memorie extended paginata sau chiar procesoare mai varza :)


Titlul: Răspuns: limita de memorie la OJI?
Scris de: Airinei Adrian din Martie 06, 2007, 14:06:51
Intr-adevar, mersi de informatii  =D> Am facut acuma cu malloc si am compilat cu modelul compact sau large si a mers.


Titlul: Răspuns: limita de memorie la OJI?
Scris de: Iacob Eduard din Martie 07, 2007, 18:57:11
Am o intrebare,intrucat asta e primul an cand merg la OJI.Sursele se compileaza pe acelasi calculator?Ca de ex,un calculator poate avea un procesor mai bun ca altul...
Si a mai zis cineva ca un milion de operatii => 0.1 sec.Am inteles bine aici?


Titlul: Răspuns: limita de memorie la OJI?
Scris de: Bondane Cosmin din Martie 07, 2007, 18:59:11
Da se va evalua la acelasi computer.


Titlul: Răspuns: Răspuns: limita de memorie la OJI?
Scris de: Tudorica Constantin Alexandru din Martie 08, 2007, 08:20:17
Daca vrei sa nu depinzi de modelul de memorie aloca memoria cu farmalloc.. dar ai grija ca apoi trebuie peste tot sa lucrezi cu far pointeri (ex: int far *a). Prin urmare scanf nu o sa mearga cu variabilele respective (el lucreaza cu pointeri, nu cu far pointeri) si inca cateva functii care trebuie sa le tratezi mai special (memcopy devine fmemcopy... etc)
Si cum poti citi cu scanf o variabila far? Sau trebuie sa citesti un int si apoi sa il faci ceva de genu a=t; ??


Titlul: Răspuns: limita de memorie la OJI?
Scris de: Valentin Stanciu din Martie 08, 2007, 09:23:30
ai cam ghicit :)
Cod:
int a;
int far b;
...
scanf("%d\n", &a);
b=a;


Titlul: Răspuns: limita de memorie la OJI?
Scris de: Kerekes Felix din Martie 08, 2007, 17:24:44
Am o intrebare,intrucat asta e primul an cand merg la OJI.Sursele se compileaza pe acelasi calculator?Ca de ex,un calculator poate avea un procesor mai bun ca altul...
Aici cred ca depinde de fiecare comisie judeteana. Anul trecut nu mi s-a acordat dreptul sa supraveghez evaluarea, chiar daca am solicitat acest lucru. Asa ca cel mai bine intreaba profesorul tau sau comisia de evaluare


Titlul: Răspuns: limita de memorie la OJI?
Scris de: Codrea Marcel din Martie 09, 2007, 00:53:36
Am o intrebare,intrucat asta e primul an cand merg la OJI.Sursele se compileaza pe acelasi calculator?Ca de ex,un calculator poate avea un procesor mai bun ca altul...
Anul trecut , pe mine m-au lasat sa particip si au evaluat pe acelasi calculator !  :peacefingers:


Titlul: Răspuns: limita de memorie la OJI?
Scris de: Ivan Nicolae din Martie 09, 2007, 10:27:26
 Probabil se va compila pe un calculator cu aceleasi resurse ca cel pe care ai lucrat tu.


Titlul: Răspuns: limita de memorie la OJI?
Scris de: Sebastian Crisan din Martie 11, 2007, 13:57:00
explicati-mi va rog cum se compileaza o sursa din linia de comanda?


Titlul: Răspuns: limita de memorie la OJI?
Scris de: Sima Cotizo din Martie 11, 2007, 14:45:17
In borland, daca e in pascal dai direct "bpc sursa.pas", iar in c/c++ intai setezi variabila %PATH%  astfel incat sa indice spre directorul "bin" al borland c si pe urma "bcc sursa.cpp"... (chestia aia cu variabila parca era "set %PATH%=%path%;C:\borlandc\bin" )...