[ pisac @ 19.01.2006. 23:52 ] @
Nisam programer, ali me mnogo zanima sledeće:

U jednoj aplikaciji postoji bag (1), i bag je ispravljen (2). Ali ja nikako da ukapiram gde je tu promena. Sve je isto ali obrnuto napisano.

1)
Code:

if (!IS_DIGITAL(ast->transfercapability)) 
{
    set_actual_gain(p->subs[SUB_REAL].zfd, 0, p->rxgain, p->txgain, p->law); 

else 

    set_actual_gain(p->subs[SUB_REAL].zfd, 0, 0, 0, p->law); 
}   


2)
Code:

if (IS_DIGITAL(ast->transfercapability)) 
{
    set_actual_gain(p->subs[SUB_REAL].zfd, 0, 0, 0, p->law); 
}
else
{
    set_actual_gain(p->subs[SUB_REAL].zfd, 0, p->rxgain, p->txgain, p->law); 
}   
[ Goran Arandjelovic @ 20.01.2006. 14:59 ] @
Zaista ne vidim u čemu bi mogao da bude problem...
ako uzmeš najbanalniji primer...

Code:

#include <iostream>
using namespace std;

int main(int argc, char *argv[])
{
    bool x = true;
    int a = 0, b = 0;
    
    /*
    if(!x){
    a = 5;
    }else{
    b = 5;
    }*/
    
    if(x){
    b = 5;
    }else{
    a = 5;
    }
    
    cout << a << endl << b << endl;
}


Ove dve stvari su potpuno iste. Samo po sebi x, ili u tvom slucaju funkcija IS_DIGITAL, može biti SAMO true ili false i ništa treće pošto vraća bool, ne znam...
neka se javi još neko. Ovo (je!) odnosno deluje tako očigledno.
[ pisac @ 20.01.2006. 15:50 ] @
Veruj mi, ni ja nisam shvatao ali zaista radi. Pitao sam tipa koji mi je poslao patch gde je tu razlika, a on je rekao da i on ne zna ali da mu je patch poslao programer koji je pisao softver i da zaista radi kad se primeni.

E, sad, ja izmenio tih nekoliko linija, iskompajlirao, i zaista radi!

Inače u pitanju je linux program za manipulisanje sa ISDN pozivima preko ISDN kartice. A problem sa (1) je što ne primenjuje rx/txgain iz konfiguracionog fajla prilikom odlaznih poziva (pa su preglasni u mom slučaju) ali dolazni rade kako treba. Kada primenim (2) i kompajliram, tada primenjuje rx/txgain i prilikom odlaznih i dolaznih poziva pa sve radi kako treba.

I šta ja sad da pomislim. Možda je bag do kompajlera?
[ bojan_bozovic @ 20.01.2006. 15:54 ] @
IS_DIGITAL vraca true ili false kad ne bi trebalo.
[ Goran Arandjelovic @ 20.01.2006. 16:18 ] @
Ok...ali zasto bi to trebalo da ima bilo kakve veze sa onim uslovom koji je van te funckije? Da li je to bool promenljiva ili funkcija koja vraca bool, nema nikakve veze. Dakle, ako je problem u funkciji IS_DIGITAL, ne vidim zasto bi ovo bio patch za ovo...:)
[ bojan_bozovic @ 20.01.2006. 19:27 ] @
Pa identicni su iskazi, i kompajler, ako ih ispravno evaluira dace identican ili ekvivalentan kod. My two cents. Dakle, ovo jedino ako je neki bag u kompajleru (s obzirom da je GNjU i ne cudi me uopste da i bude tako nesto).
[ X Files @ 20.01.2006. 19:33 ] @
A sta ako je IS_DIGITAL neki (neispravan) makro? Ne bi trebalo, ali...


[ pisac @ 20.01.2006. 23:35 ] @
Dobio sam odgovor. IS_DIGITAL jeste makro!

Evo:

The problem results from the way the IS_DIGITAL() macro is defined in
include/asterisk/transcap.h:

#define IS_DIGITAL(cap)\
(cap) & AST_TRANS_CAP_DIGITAL ? 1 : 0

So the expression
!IS_DIGITAL(foo)
expands to
!(foo) & AST_TRANS_CAP_DIGITAL ? 1 : 0
which is equivalent to
( !(foo) ) & AST_TRANS_CAP_DIGITAL ? 1 : 0
while one would like to have
!( (foo) & AST_TRANS_CAP_DIGITAL ? 1 : 0 )

Rewriting the original statement removes the "!" operator and everything
is fine.

The two "if" statements would be equivalent (and both correct) if the
definition in transcap.h followed best practices to avoid problems with
operator precedence and looked like this:

#define IS_DIGITAL(cap)\
((cap) & AST_TRANS_CAP_DIGITAL ? 1 : 0)

Regards,
Mike
[ Goran Arandjelovic @ 21.01.2006. 00:34 ] @
Fino...lepo je što si ovo našao i postovao. Može biti od koristi. :)
Možda bih se setio da je makro u pitanju, ali ne tako brzo.
S tim što je logičnije da ovaj patch bude ispravka makroa, a ne granjanja u nekom drugom delu koda.

[Ovu poruku je menjao Goran Arandjelovic dana 21.01.2006. u 01:41 GMT+1]
[ bojan_bozovic @ 21.01.2006. 01:57 ] @
Da ali onda to ne bi bio GNU sors. ;-)
[ X Files @ 21.01.2006. 12:15 ] @
Jesam li polozio ;) ?