Diskuze: Rozdílné chování na Linuxu a Windows

C++ C a C++ Rozdílné chování na Linuxu a Windows

Avatar
Frunta
Redaktor
Avatar
Frunta:

Zdravím,
mám menší problém. Programuji nějakou 3D hru a právě řeším jednoduché kolize. Když program zkompiluji na Linuxu přes g++, tak vše funguje, jak má. Pakliže ale kompiluji na Windows v Dev-Cpp, program se chová trochu jinak.
Mám kolize kvádrů s kvádry a když s panáčkem jdu proti nějakému objektu, tak po něm sklouzne, to se děje na Linuxu. Ale na Windowsech se jen zastaví. Když by to bylo rozdílným chováním kompilátorů, tak nechápu, proč zrovna tato část. Pak ale jen doufám, že to není chyba týkající se ukazatelů až na úrovni pamětí apod.
Přikládám kódy: http://leteckaposta.cz/984003075
(Kód, který řeší kolize, je ve třídě Entita, ve funkci pohnoutSe().)
Prosím Vás o radu.

 
Odpovědět 18.11.2013 16:41
Avatar
Martin Dráb
Redaktor
Avatar
Martin Dráb:

Ahoj,

tady by možná stálo za to si do té metody pohnoutSe umístit breakpoint (třeba i podmíněný) a zkusit si opravdu prokrokovat, co se v danou situaci děje. Nevím, jakým způsobem hledáš chyby. V tomhle případě by krokování nemuselo být až tak náročné.

Díval jsem se jen na příslušnou metodu dané třídy, jak jsi ji uvedl ve svém příspěvku. Je samozřejmě možné, že ti někde nějaký ukazatel ukazuje někam, kam nemá, nebo nějaká část tvého programu přpeisuje paměť, kde nemá (tyhle věci se mohou chovat rozdílně na Linuxu a na Windows).

Jinak by bylo dobré, kdybys před uploadem zdrojáků na web odstranil různé dočasné soubory, kterých, jak se mi zdá, tam máš víc než dost.

Jinak svádět vinu na kompilátor je cesta do pekel. Ne že by chyby v překladačích neexistovaly (1-2 měsíce zpátky jsme se s jednou potkali), ale není to moc pravděpodobné. Operační systém ale může tvůj program ovlivňovat i ve věcech, kterých sis nevšiml. Těžko takhle říci. Musel bych prolézat celý zdroják, což se mi, přiznám se, dnes rozhodně nechce.

Nahoru Odpovědět 18.11.2013 20:53
2 + 2 = 5 for extremely large values of 2
Avatar
Frunta
Redaktor
Avatar
Odpovídá na Martin Dráb
Frunta:

Děkuji. S těmi ukazateli mívám často problém. Vlastně jsem rád, když mi aplikace nespadne kvůli neoprávněnému přístupu do paměti. Použít breakpointy mě nenapadlo, asi zkusím trochu přehodnotit, jak vyhodnocuji kolize, protože se mi to zdá možná příliš dlouhé a mám pocit, že jsem to už kdysi vyřešil jednodušeji.

No jo, ty dočasné soubory, ty tam nadělal Linux a jelikož jsem to komprimoval na něm, tak jsem je neviděl.

Editováno 20.11.2013 10:32
 
Nahoru Odpovědět 20.11.2013 10:31
Avatar
Frunta
Redaktor
Avatar
Odpovídá na Martin Dráb
Frunta:

Tak už je to vyřešené. Problém byl v tom, že funkce, která měla vracet true/false, vracela jen true nebo nic. Byla to funkce koliduje ve třídě Mapa.

Editováno 20.11.2013 17:34
 
Nahoru Odpovědět 20.11.2013 17:34
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Frunta
Martin Dráb:

To je jeden z důvodů, proč ve svém kódu používám Pravidlo jednoho returnu. Pak se mi nemůže stát, že by funkce někdy hodnotu nevracela. Některé překladače dokážou situaci, kdy jedna větev výpočtu ve funkci nevrací žádnou hodnotu (což je nepřesně řečeno, funkce vždy vrací hodnotu, alespoň na rozšířených architekturách), detekovat a ohlásit ji prostřednictvím varování. Nelze to ale detekovat zdaleka vždy.

Jinak, co jsem viděl pár metod tvého kódu, docela často tam máš něco ve smyslu:

if (podminka)
  return true;
else return false;

To lze ekvivalentně napsat takto:

return (podminka);

Hodnota podmínky není nic speciálního, jedná se vlatně o logický typ, což v čistém C bude číslo, v C++ už snad existuje něco jako bool.

Nahoru Odpovědět 20.11.2013 18:24
2 + 2 = 5 for extremely large values of 2
Avatar
Kit
Redaktor
Avatar
Odpovídá na Martin Dráb
Kit:

Returnů mívám ve funkci či metodě klidně i deset. Je to lepší než break.

Nahoru Odpovědět 20.11.2013 18:32
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovídá na Martin Dráb
Zdeněk Pavlátka:

Aby funkce vždy vracela nějakou hodnotu, stačí na její konec připsat return s nějakou výchozí hodnotou.

Nahoru Odpovědět 20.11.2013 18:35
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Kit
Martin Dráb:

Kit: jasně, záleží na každém, jak se mu dobře programuje. Myslím, že u mně jeden return ve funkci snížil výskyt některýc hchyb (spolu s dalšími opatřeními), takže ho používám a mám ho rád. Ale ať si každý programuje, jak chce.

Nahoru Odpovědět 20.11.2013 19:23
2 + 2 = 5 for extremely large values of 2
Avatar
Kit
Redaktor
Avatar
Odpovídá na Martin Dráb
Kit:

Na druhou stranu chápu, že třeba v Javě se v returnu chyba udělat nedá, ale v C++ je to raz dva. Proto mám v Javě jistotu, že i když těch returnů je 10, tak jsou všechny správně a žádný nechybí.

Nahoru Odpovědět 20.11.2013 20:07
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 9 zpráv z 9.