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.