Stránka 1 z 2

[C] záhada

Napsal: 14 pro 2012, 16:26
od Jenda_KL
Co je špatně na prvním řádku ??

Kód: Vybrat vše

      //printf("TDSver:%d Prog:\"%s\"\n\r",ver,msg);
      printf("TDSver:%d ",ver);
      printf("Prog:\"%s\"\n\r",msg);
způsobuje BSOD a to (řekl bych) jen proto, že se pokouším zobrazit různé formáty a je to tímpádem bug kdesi v string.h ?
Když ho rozdělím do 2 a 3 tak to funguje.

Napsal: 14 pro 2012, 16:30
od p32
Snad jen to, že řádek 1 není to samé co je na řádku 2 a 3.

Napsal: 14 pro 2012, 16:55
od Jenda_KL
Tak to jsem asi úplně slepej.

Jasně, rozdíl je v tom, že to není řádek jeden ale dva ))

Napsal: 14 pro 2012, 17:28
od Panda38
Možná přetečení velikosti dekódovacího bufferu? To by se poznalo tím, že to závisí na délce toho stringu.

Napsal: 14 pro 2012, 17:55
od Jenda_KL
Tohle bych vyloučil, msg má maximálně 20 znaků.
Simulativně jsem předto napsal
msg[0]=0x31;
msg[1]=0;
což nepomohlo ani trochu.

Napsal: 14 pro 2012, 20:31
od mtajovsky
Chyba tam není. Co je to za kompilátor? V BSOD by neměl program skončit nikdy, to je spíš konec OS. Výjimky z úlohy jsou zachyceny systémem a úloha by měla normálně spadnout, vypsat se varovné hlášení do MessageBox nebo na terminál v Unixu a případně s vytvořením dumpů pro JIT debugger.

printf() má hlavičku v stdio.h, ale případný bug nebude v háčku, ale v CRTL.

Napsal: 14 pro 2012, 20:55
od p32
Asi se pletu, ... :lol:

Napsal: 14 pro 2012, 20:57
od rnbw
To radsej vymaz...

Napsal: 14 pro 2012, 21:02
od mtajovsky
p32 píše:Asi se pletu, ...
Určitě :)

Napsal: 14 pro 2012, 21:17
od p32
Jo, byl to jen hec. :wink:

Napsal: 15 pro 2012, 09:02
od Jenda_KL
škoda, možno to mohlo ....

Napsal: 15 pro 2012, 10:34
od Standa33
Co to zkusit zapsat takhle:

printf("TDSver:%d Prog:%s \n\r",ver,msg);

Napsal: 15 pro 2012, 12:38
od piitr
Co takhle?

Kód: Vybrat vše

printf("TDSver:%d Prog:\"%s\"\r\n",(int)ver,(const char *)msg);
A ten konec řádku má být 13 10 a ne 10 13.

Napsal: 17 pro 2012, 11:32
od mtajovsky
(int)ver nepomůže, protože to si dělá printf() implicitně sama. Jestli je to na nějakém RISC a nastává bus error, pak je třeba:

Kód: Vybrat vše

int temp;
    memcpy(&temp, &ver, sizeof(int));
    printf("TDSver:%d Prog:\"%s\"\r\n", temp, msg);
Ještě by se dalo uvažovat, jestli nepřetéká stack.

Napsal: 17 pro 2012, 11:59
od piitr
mtajovsky píše:(int)ver nepomůže, protože to si dělá printf() implicitně sama.
Těžko říct. Ono záleží na tom, jak je definováno to ver. Moje hypotéza je, že by mohlo nastat to, že ver není typu int, ale třeba long, nevím. Pak by rozdělení na dva příkazy fungovalo, protože printf by si vzal jen část, což nevadí. Ale při obou hodnotách v jednom příkazu by se místo druhé hodnoty přečetl nějaký nesmysl, což by mohlo způsobit chybu, protože je to ukazatel. A tohle ten printf sám právě asi moc nevyřeší, protože to %d se zpracovává až při běhu programu, zatímco konverzi parametrů je třeba dělat během překladu. Je ale taky možné, že je tam špatně něco jiného, pak by tohle asi nepomohlo, ale zatím mi to přijde nejpravděpodobnější.