Posted By: Marwin (*** hating Microsoft ***) on 'CZprogram'
Title:     Re: ladeni ceckovskejch programu pod Junixem
Date:      Wed May 21 09:25:24 1997

> Naprogramoval jsem tento script (program) pod dosem a tam mi v pohode chodi.
> Prelozil jsem ho pod unix a tam to porad pada s touto hlaskou:
> Segmentation fault

   No, uz jsem to tady jednou psal, ale protoze mam ted delat bakalarku a moc 
se mi do toho nechce, klidne to zopakuju. ;) 

>    nevite co to znamena?

   Vime. :) Na 99% je to chyba v Tvem programu. DOS pracuje v realnem (tedy 
nijak nechranenem) modu. Kdyz pristupujes do pameti, ktera neni Tvoje, nic se 
nedeje. Tedy samozrejme nez prepises neco, co je potreba jinde. Ale protoze 
hned tak na nejakem tom bajtiku nezalezi, vetsinou program funguje, i kdyz si 
sahne do pameti, ktera neni jeho. Dvojnasob to plati pri cteni z pameti. DOSu 
je uplne jedno, ze ctes odnekud, kde nic neni - proste Ti vrati nejakou 
hodnotu a kdyz pro Tvuj program neni nejak kriticka (treba kdyz ji vubec 
nepouzijes), tak vsechno slape. V UNIXu kazdy pristup do pameti, ktera mi 
nepatri, vyvola "Segmentation fault". Takze to, ze program funguje pod DOSem 
jeste zdaleka neznamena, ze je spravne. :) Stejny problem by jsi mel pod 
jakymkoli jinym rozumnym operacnim systemem a dokonce nekdy i pod Windows (i 
kdyz ty si toho obcas nevsimnou).
   Pro lepsi predstavu ukazka kousku programu, ktery to muze zpusobit. 
Samozrejme, ze to je jen jednoduchy priklad, ve skutecnosti to pravdepodobne 
bude mnohem slozitejsi a ladeni Ti vubec ale vubec nezavidim.

   char* pole = malloc (MAX_SIZE);
   Vypln_Pole (pole);
   /***** ted tam chci najit cislo VALUE *****/
   int i = 0;
   while ( pole[i] != VALUE && i < MAX_SIZE )  ++i;
   if ( i < MAX_SIZE )  Nalezeno();  else  Nenalezeno();

   Na prvni pohled vypada vsechno dobre a v DOSu by to melo i fungovat (pokud 
jsem se nekde nespletl ;). Ale pod UNIXem to v pripade, ze se hledana hodnota 
v poli nevyskytuje, pravdepodobne spadne.
  Pri poslednim pruchodu cyklem bude totiz i==MAX_SIZE a pokusi se vyhodnotit 
podminka cyklu 'while'. Nejprve jeji leva cast: pole[i]!=VALUE, tedy 
pole[MAX_SIZE]!=VALUE a uz to leti, protoze 'pole' je deklarovane jenom na 
MAX_SIZE polozek a ja se snazim cist o jednu vic. Takze ctu z pameti, ktera 
mi nepatri, a vznikne "Segmentation fault". A to presto, ze prectenou hodnotu 
nijak nepotrebuju, protoze to stejne vyhnije na ty druhy podmince 
(i<MAX_SIZE).
   Jeste poznamcicka: prehozenim podminek (i<MAX_SIZE && pole[i]!=VALUE) si 
prilis nepomuzu, protoze nikde neni psano, ze se ma vyhodnocovat nejdriv leva 
cast a potom prava. 

> dotaz2:
>   Jak je mozno ladit pod unixem ceckovske programy??

   Blbe.

> pokud mozno popsat co nejpodrobneji...

   Bylo to dostatecne podrobne? ;) Sorry, ale to nedelam, vzdy si pouze 
porizuju kontrolni vypisy primo z programu...
   Uffff, to jsem se zase rozkecal...
   Marwin.

Search the boards