verem méret lekérdezése

 ( nzmark | 2005. március 27., vasárnap - 23:17 )

verem méret lekérdezése

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Sziasztok!

köszi a hozzászólásokat. A helyzet az, hogy elég szűkszavúan fogalmaztam.
Van egy másik topicom is itt, ami rajzolgatós témákkal foglalkozik, vagyis a flood fill kitöltéssel. azt sikerült megoldanom, viszont egy másik problámába botlottam, ez a verem. a flood fill egy önrekurzív függvény és mint ilyen a stack-et használja. bizonyos méretű primitív kitöltésekor segmentation fault -ot kaptam, aztán rájöttem, hogy ez bizony a stack méret limit miatt van. azért kellene ez a verem lekérdezéses dolog, mert a programot be kell majd mutassam és elegánsabbnak éreztem volna ha a programom menet közben le tudja kérdezni a verem méretét és ha kritikus, akkor leállítja a flood fillt, nem pedig segmentation faultol, ugyanis nem tudom előre, hogy ahol be kell mutassam ott a tanár felhasználói joga nincsen -e annyira megnyirbálva, hogy nem tudja ulimittel változtatni a stack méretét.
persze ez a getrlimit setrlimit nagyon jó, mert ezzel le tudom kérdezni ezt az értéket.

[quote:eb74eb826a="nzmark"]...flood fill kitöltéssel...[/quote:eb74eb826a]
Lehet optimalizálni kicsit azzal, hogy pásztákat (összefüggő függ. ill. vízsz. csíkokat) ciklusból fillezel, így kevesebb a rekurzió, de gondolom, ezt már megtetted :).
Egyébként teszt-mintának tudom javasolni a lóugrás-mintát, nem tudok olyat, ami ennél durvább igényű lenne, ritka szemét, mert nincs benne 4-nél hosszabb pászma, ugyanakkor a kitöltöttsége csak 20%-os. Ami algoritmus/implementáció ezzel elbír egy adott képméreten, azt más se nagyon fogja megrázni...
[code:1:eb74eb826a]
1oooo
oo1oo
oooo1
o1ooo
ooo1o
[/code:1:eb74eb826a]

a verem ilyen esetben szűk keresztmetszet.
ne a rekurzív verziót használkd, hanem írd át ciklusra + saját tárolóra
pl std::stack
ilyenkor a heap a korlát, ami valszeg sokkal többet bír /bár lehet hogy lassabb/

Szia Nzmark!

Ha emlékeim nem csalnak, C-ben nincs kifejezett verem típus. Rád van bízva, hogy a verem szerkezetet mivel valósítod meg (tömb, lista), és ennek függvénye képpen birod megállapítani, hogy mennyi elemet helyezhetsz el a veremben.
Pl tömb megvalósításnál annyi elemet helyezhetsz el a tömben, amekkora a tömb mérete. (Igaz többet is, de ezt már túlcsordulásnak nevezik, és szerencse kell hozzá, hogy ne vesszen el adat)
A biztonságosabb és dinamikusabb megoldást a láncolt lista jelenti, melynek csak a szabad memória szabhat határt.
Üdv
S81

[quote:0da3a82163="bocs"]a verem ilyen esetben szűk keresztmetszet.
ne a rekurzív verziót használkd, hanem írd át ciklusra + saját tárolóra
pl std::stack
ilyenkor a heap a korlát, ami valszeg sokkal többet bír /bár lehet hogy lassabb/[/quote:0da3a82163]
Linuxról beszélünk (ugye), az alapértelmezett verem 8M, ami 16 byte/hívással számolva 512k mélységig elég. Ez azt jelenti, hogy egy 800x600-as kép minden pixelére bőséggel elég, 33%-os kitöltöttségnél meg az 1024x768-ra is, de akkor már elég gyér az algoritmus.
Szerintem ilyesmire (mármint ahol a sebesség is számít), ne nagyon használj olyat, ami heap allokációt csinál, mert az irgalmatlan lassú. No pláne stl: tegyél egy kiírást csak a konstruktorokba/destruktorokba, és nézd meg, hogy hány átmeneti példány keletkezik a műveletek során. Na az min. annyi malloc és free...

[quote:6a6ec28591="nzmark"]melyik C függvébny adja meg a verem méretét? esetleg a verem még fel nem használt méretét?[/quote:6a6ec28591]
Ez már rendszerfüggő, de gondolom nem borlandc 3.1-hez kellene :). Linux alatt az aktuális processznek engedélyezett maximális, ill. abból aktuálisan használt veremmennyiséget a getrlimit ill. getrusage függvények mondják meg. Valamiért a getrusage nekem 0-t ad vissza, megnézem bsd-n is, aztán ja jutottam valamire, akkor írok.

Megnéztem, úgy tűnik, hogy félreértelmeztem:
[code:1:6a6ec28591]
ru_idrss an integral value of the amount of unshared memory residing
in the data segment of a process (expressed in units of
kilobytes * ticks-of-execution).
[/code:1:6a6ec28591]

Ezek szerint az aktuálisra nem tudok jobbat a lenti mókolásnál.

[code:1:6a6ec28591]
#include <stdio.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <unistd.h>

void veremkiir(void)
{
struct rlimit limit;
struct rusage usage;
int res;

res=getrlimit(RLIMIT_STACK, &limit);
if (res) printf("getrlimit hiba: %d\n", res);
res=getrusage(RUSAGE_SELF, &usage);
if (res) printf("getrusage hiba: %d\n", res);
printf("Verem soft limit=%d, hard limit=%d, hasznalat=%ld\n",
limit.rlim_cur, limit.rlim_max, usage.ru_isrss);
}

void reku(int n)
{
if (n) reku(n-1); else veremkiir();
}

int main(void)
{
printf("mainbol hivva: ");
veremkiir();
printf("fuggvenyhivasbol hivva: ");
reku(1000);
return 0;
}
[/code:1:6a6ec28591]

Persze a verem becslésére van csúnya trükk is, de ez tényleg durva eretnekség:

[code:1:6a6ec28591]
char* eredeti_verem;

int veremhasznalat(void)
{
char barmi;
return eredeti_verem - &barmi;
}

int main(void)
{
char barmi;

eredeti_verem=&barmi;
printf("veremhasznalat=%d\n", veremhasznalat();
return 0;
}
[/code:1:6a6ec28591]

melyik C függvébny adja meg a verem méretét? esetleg a verem még fel nem használt méretét?