C absolut cimu valtozo generalasa
Andras Tantos
andras_tantos at yahoo.com
Thu Jan 8 22:56:23 CET 2004
> > Mar igy is eleg sokan szidjak a C/C++-t azert, mert azonos dolgokat
sokfele
> > keppen lehet leirni. Miert kell ezeket az eseteket meg tovabb
szaporitani?
>
> Peldaul miket?
Per pillanat nem tudom, valahol olvastam. Megprobaluk utana nezni.
> > Bit-valtozoval nem definialod a viselkedest, sot meg csak nem is a
> > forditora, hanem a CPU-ra bizod a dontest.
>
> Ne keszits mar ki! Mar tisztaztuk, es 10 sorral feljebb te is irod, hogy
> ugyanazt a kodot generalja. Akkor most mi van?
>
> Egyebkent mondom azt is, hogy van a procinak ilyen utasitasa, es
assemblyben
> is van ilyen. Azert mert van egy-ket dolog amire figyelni kell, akkor
inkabb
> ne hasznaljuk?!
Latom meg mindig nem ertjuk egymast. Ime egy pelda:
static bit ElsoBit @ 0x20*8+1;
static bit MasodikBit @ 0x20*8+2;
void main() {
ElsoBit = 1;
}
A fenti program milyen erteket ad a MasodikBit-nek? Es mit tesz a 0x20-as
cim harmadik bitjevel? A valasz az, hogy nem tudod, legalabbis nem a
forraskodbol.
#define HuszasCim *((unsigned char *)(0x20))
void main() {
HuszasCim |= 0x01;
}
Ez a masodik program mar teljesen egyertelmuen az egesz byte erteken vegez
muveletet: kiolvassa, a legalso bit-et 1-be allitja, majd visszairja.
Persze az elso program is ugyanezt csinalja, csak epp a forrasbol ez nem
derul ki. Ahhoz, hogy rajojj, hogy mi is tortenik ismerned kell az adott
fordito es CPU lelki vilagat, tudnod kell a bit-muveletek leterol, es arrol,
hogy a fordito milyen kodot keszit. A magasszintu nyelven valo programozas
egyik lenyege eppen az, hogy ezzel ne kelljen foglalkozni. De ez nem azt
jelenti, hogy a problemat (illetve a megoldast) nem kell teljes
egyertelmuseggel leiirni.
> > Nem ez a mondokam lenyege, hanem ez: nem difinalod pontosan a
viselkedest,
> > de a program mukodese fugg a viselkedestol. Azaz a
> > fordito/kornyezet/processzor/architektura kenye-kedvere bizod az
eredmenyt.
> > Ez nem helyes. Egyebkent szerintem a sorrend fordito fuggo, de ez
mellekes.
>
> Akkor ha pl. ket 8-bites regiszterben megadott 10-bites ereteket hogy
> konnvertalsz egy 16-bites valtozoba?
>
> Te hasznalod inkabb a X=varH*256+varL variaciot a sokkal gyorsabb
> varH<<8|varL megoldas helyett?
Nem, de nem ertem, mire akarsz ramutatni. Egyebkent egy valamire valo
fordito rajonne, ha masra nem is, de arra, hogy a szorzas az tulajdon keppen
egy eltolas. De persze arra is, hogy az eltolas tulajdon keppen egy szorzas.
Es az adott kornyezetben optimalis megoldast valasztja. Az osszeadasrol mar
nem vagyok meggyozodve, de nem is az a draga muvelet, feltehetoen az
ugyanannyi ciklusba kerul.
> >>Belegabalyodtal sajat allitasodba. A vita targya (static bit) konkretan
> >>leirja mit akarsz. Ha x|=40-et irsz, az nem.
> >
> > Pont forditva. A bit-valtozo nem ir elo semmit a tobbi bitre
vonatkozoan,
> > mig az x|=0x40 az egesz byte-ra nezve ir elo viselkedest.
>
> Van amikor a tobbi bitre nem is akarok eloirni semmit, mert csak egyet
> akarok valtoztatni.
Nem, nem. Eloirod, hogy nem akarod valtoztani. Meg inkabb azt irod elo, hogy
*hogy* nem akarod valtoztani. Szepen bele irtad a forraskodba, hogy a tobbi
bitre egy olvasast, es a valtozatlan ertek visszairasat kered. Pont ez
hianyzik a masik leirasi modbol.
Udv,
Tantos Andras
<http://andras.tantos.homelinux.org>
u.i.: lehet, hogy ezt maganban kene folytatni, a listat ugy tunik nem
erdekli a vitank...
More information about the Elektro
mailing list