[C] záhada

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Jenda_KL
Příspěvky: 1173
Registrován: 10 zář 2008, 02:00
Bydliště: Kadaň
Kontaktovat uživatele:

[C] záhada

#1 Příspěvek 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.

p32
Příspěvky: 15069
Registrován: 13 led 2007, 01:00
Bydliště: Olomouc

#2 Příspěvek od p32 »

Snad jen to, že řádek 1 není to samé co je na řádku 2 a 3.

Jenda_KL
Příspěvky: 1173
Registrován: 10 zář 2008, 02:00
Bydliště: Kadaň
Kontaktovat uživatele:

#3 Příspěvek od Jenda_KL »

Tak to jsem asi úplně slepej.

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

Uživatelský avatar
Panda38
Příspěvky: 713
Registrován: 21 lis 2012, 01:00
Bydliště: Most, Praha, Lanžhot
Kontaktovat uživatele:

#4 Příspěvek 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.

Jenda_KL
Příspěvky: 1173
Registrován: 10 zář 2008, 02:00
Bydliště: Kadaň
Kontaktovat uživatele:

#5 Příspěvek 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.

Uživatelský avatar
mtajovsky
Příspěvky: 3694
Registrován: 19 zář 2007, 02:00
Bydliště: Praha

#6 Příspěvek 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.

p32
Příspěvky: 15069
Registrován: 13 led 2007, 01:00
Bydliště: Olomouc

#7 Příspěvek od p32 »

Asi se pletu, ... :lol:
Naposledy upravil(a) p32 dne 14 pro 2012, 21:04, celkem upraveno 1 x.

Uživatelský avatar
rnbw
Příspěvky: 32312
Registrován: 21 bře 2006, 01:00
Bydliště: Bratislava

#8 Příspěvek od rnbw »

To radsej vymaz...

Uživatelský avatar
mtajovsky
Příspěvky: 3694
Registrován: 19 zář 2007, 02:00
Bydliště: Praha

#9 Příspěvek od mtajovsky »

p32 píše:Asi se pletu, ...
Určitě :)

p32
Příspěvky: 15069
Registrován: 13 led 2007, 01:00
Bydliště: Olomouc

#10 Příspěvek od p32 »

Jo, byl to jen hec. :wink:

Jenda_KL
Příspěvky: 1173
Registrován: 10 zář 2008, 02:00
Bydliště: Kadaň
Kontaktovat uživatele:

#11 Příspěvek od Jenda_KL »

škoda, možno to mohlo ....

Uživatelský avatar
Standa33
Příspěvky: 283
Registrován: 07 lis 2009, 01:00

#12 Příspěvek od Standa33 »

Co to zkusit zapsat takhle:

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

Uživatelský avatar
piitr
Příspěvky: 1003
Registrován: 19 říj 2007, 02:00
Kontaktovat uživatele:

#13 Příspěvek 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.

Uživatelský avatar
mtajovsky
Příspěvky: 3694
Registrován: 19 zář 2007, 02:00
Bydliště: Praha

#14 Příspěvek 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.

Uživatelský avatar
piitr
Příspěvky: 1003
Registrován: 19 říj 2007, 02:00
Kontaktovat uživatele:

#15 Příspěvek 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ší.

Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“