Nos, rhide fordul?

 ( NevemTeve | 2018. november 13., kedd - 19:38 )

Hát persze hogy nem. Mert hiányzik neki a TVision. És az fordul? Naná, hogy nem. És miért? Mert C++. Na jó, most megbuktam, ugyszintén a programozó kolléga:

static
unsigned iSqr( unsigned i )
{
    unsigned res1 = 2;
    unsigned res2 = i/res1;
    while( abs( res1 - res2 ) > 1 )
        {
        res1 = (res1 + res2)/2;
        res2 = i/res1;
        }
    return res1 < res2 ? res1 : res2;
}

Ezen a ponton az 'abs' felesleges, hiszen két 'unsigned' különbsége is 'unsigned'.

Szerk: a következő nagyon tudományos megoldással próbálkozom:

#define uns_abs_diff(i,j) ((i)>=(j)?(i)-(j):(j)-(i))

2018.11.23. 19:11 Eszembe jutott két további lehetőség:
1. git-ből kiszedni a forrást (git clone https://git.code.sf.net/p/tvision/code tvision-code)
2. megnézni, hogy régebbi '-std' -vel működik-e

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ő.

Egy picit zavarba jöttem...

2 - 3 = ?

(Vagy mindjárt rám olvassátok, hogy nem tudom, mi az unsigned. Maradtam volna a pákánál.)

Hát, attól tartok (gdb-ben próbáltam), (unsigned)2-(unsigned)3==MAXVAL_UNSIGNED pl 65535 (ha 16-bites).

Tegnap este elsőre én is elcsodálkoztam, aztán elővettem előbb a cint -et, aztán a cling-et, és mind a két interpreter azt állította, hogy unsigned int-ek esetén bizony szép nagy, (túlcsordult) ámde unsigned az eredmény. Persze signed-dé castolva a kifejezést, már jó lett :-) De hát ilyen ez. Logikus :-)

=====
tl;dr
Egy-két mondatban leírnátok, hogy lehet ellopni egy bitcoin-t?

Nekem a TVision simán fordult, itt egy részlet:

build() {
cd $pkgname
export CXXFLAGS+=' -std=gnu++98'
PERL_USE_UNSAFE_INC=1 ./configure --prefix=/usr --include=/usr/include
make
}

Viszont az RHIDE fordítása nem ment, az RHIDE és a SETEDIT összehangolását nem tudtam megoldani. :(

Akkor elég valószínű, hogy abandonálták...

"Ezen a ponton az 'abs' felesleges, hiszen két 'unsigned' különbsége is 'unsigned'."

Ez nem így van. Az abs meghívása átkonvertálja az 'unsigned int'-et 'int'-re, és szépen visszajön az előjel, mintha 'int' értékekkel dolgozott volna a kód (igaz, a unsigned->signed konverzió implementation-defined, de kb. minden impl. azt csinálja, amit "kell").

Itt a kód azért nem fordul le, mert a GCC 6 óta az stdlib-ben nem csak 'abs(int)' van, hanem overloadolva van, és emiatt a compiler nem tudja eldönteni, melyiket használja.

Szóval a programozó kolléga nem bukott azért meg, bár ez a kód amúgy tényleg eléggé ronda, soha nem írnék le ilyet.

Jól hangzik, bár attól tartok, így is megsemmisítünk egy bitet; 8-bites számok esetén 192 és 7 abszolút különbsége esetleg 71 lesz 185 helyett.
gdb:

print (unsigned char)(192-7)
$14 = 185

print (unsigned char)(7-192) # itt a gond
$13 = 71

print (unsigned char)7 >= (unsigned char)192 ? (unsigned char)7 - (unsigned char)192 : (unsigned char)192 - (unsigned char)7
$12 = 185

Igen, nyilván ha olyan számokon végzed el a kivonást, ahol az eredmény nem fér bele az előjeles tartományba, akkor ott gond van.

De a rutinban ilyen eset nem fordulhat elő. A legrosszabb esetben, ha i=0xffffffff, az abs-nál ennek kevesebb, mint a fele megy be, szóval jól működik minden.

Végül sikerült lefordítani?
Nekem nem ment a fordítás, de szereztem egy statikusan linkelt binárist, ami működik.