Érthetetlen hiba.

 ( emberk | 2013. november 27., szerda - 16:55 )

nem is mondok a dologról semmit:
Gdb kimenet:
* /home/ek/upp/_out/MyApps/GCC4.Debug.Debug_Full.Gui.Mt.Shared.Sse2/gaus3d 27.11.2013 15:46:32, user: ek

fms = 999.9990234375
fms =
gaus3d.log (END)

Ez pedig a c++ kód ami a ezt a kimenetet adja:
http://pastebin.com/JcVySBmr

Teljesen értelmezhetetlen a számomra. Mi okozhatja azt, hogy "meghal" egy float változó.

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Memória korrupció? (szépen magyarul) Valami felülvágja a változót egy olyan értékkel, ami nem érvényes float.

Memtest?

De ez egy lokálisan definiált float, amit kimásolok egy "globális float"-ba, hogy később a szálak tudják olvasni, hogy mennyi a gyökök minimuma. Ötletem sincs mivel "korrumpálhat".

------
3 fajta matematikus létezik. Aki tud számolni, és aki nem.

Az a logaritmálás ott hogy is van? Legalább egyszer biztosan nullának veszed a logaritmusát.

---
Science for fun...

Igen igaz. Ez hiba. Javíta. De maradt a probléma.

------
3 fajta matematikus létezik. Aki tud számolni, és aki nem.

Hogyan javítottad? Mert a példában ugye a 0 logaritmusát akarod a végén kiíratni, az meg -inf.

Az ugye megvan, hogy C++-ban van for ciklus?

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee." -- Ted Ts'o

Ezt:

while (i < v.GetCount())
{
if (v[i].z < fms)
fms=v[i].z;
i++;
}

cseréld ki erre:

while (i < v.GetCount())
{
if (v[i].z < fms)
fms=v[i].z;
DUMP(fms + " : " + i);
i++;
}


Meglesz, hogy hol nullázódik ki az érték. Szerintem a v[i].z -nek nem lesz értéke valahol.
--
Coding for fun. ;)

Érdekelne, hogy mi az a DUMP() makró, illetve a helyedben én megnézném, hogy log nélkül lefut-e.

Szerintem egyébként a log ad csúnya eredményt és a kiírás hal meg emiatt.
Biztos, hogy a v[i].z nem lehet negatív vagy 0 a log hívásnál? (Fentebb írtad, hogy a 0-t kiküszöbölted, de hasznos lenne látni a javított kódodat.)

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee." -- Ted Ts'o

Szia,
Kicsit kevés a részlet, de pár apróbb kérdés:
- honnan származik a 'v' változó?
- Változhat időközben v tartalma?
- Változhat a v.GetCount kimenete? És, eleve, mit is ad vissza? - Meg, miért is kell 3* v.GetCount()-szor meghívni ?
- Amikor v[i].z-t csökkented minimummal (középső ciklus), nem lehet , hogy alulcsordulsz, és 0-zol? ( És, v[i].z milyen típusú is? Bár, gondolom float :) ), vagy nem lehetséges olyan állapot, ahol v[i].z = minimum? (pl. a minimum pontnál? )
Csak ötletek, bár az utolsót kiemelném :)
Üdv,
LuiseX
Szerk.: Mellékes kérdés, de biztos, hogy szükségszerű a második minimumkiválasztás? Már, csak a logaritmus tulajdonságait figyelembe véve... Persze, a bemeneteit nem ismerem :)

Szerintem valami típuskonverziós probléma ez a DUMP()-ban.
Ha végigköveted a forrást, végül egy AsString() hívás alakítja Stringgé a floatodat, de a probléma ott lesz szerintem, hogy nincs float argumentumú AsString(), csak double. Valószínűleg az implicit konverziónál valami olyan értéket vesz fel belül, hogy Null értéknek hiszi az AsString()-en belüli IsNull()-ban.
Néhány jellegzetes szimbólumból felismerhető, hogy U++ forrás :)

Ha lépésenként végrehajtod, valszeg többet fogsz látni, mint én innen a partvonalról, de első körben a floatot lecserélném double-ra vagy a DUMP-ot valami másra.

Szerk:
Igen, IsNull() így néz ki double-ra:

template<> inline bool IsNull(const double& r) { return r < DOUBLE_NULL_LIM; }

DOUBLE_NULL_LIM pedig:

const double DOUBLE_NULL_LIM = -1.0E+307;