Keresés

Részletes keresés

KoporShow Creative Commons License 2005.02.05 0 0 214
C-ben bool helyett altalaban int-et hasznalnak. Minden nemnulla ertek igazat jelent es csak a nulla hamis.

Elönyösebb a maszkot eltolni, igy a fordito optimalis kodot tud generalni, amelyben egyaltalan nem lesz eltolas:

if ( input & (1<<5)) { ... }

A blokkot akkor hajtja vegre, ha az input valtozo 5-ik bitje 1.

Szerintem abbol lehet kiindulni, hogy optimalizalt modban a fordito a assembler hasonlo minösegü kodot fog generalni. Szerintem assemblert gyakorlatilag csak extrem kiveteles körülmenyek között erdemes hasznalni. Ha leakarod ellenörizni a generalt kodot, akkor a "-S" kapcsoloval kell forditani. Az assembler file neve ".s"-re fog vegzödni.

Peldaul a kovetkezo fuggveny 1-et ad vissza, ha az input parameter 5-ik bitje 1, egyebkent 0-at.

unsigned f(unsigned input) { return input & (1<<5) ? 1 : 0; }

A gcc a kovetketo kodot generalja:

pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
shrl $5, %eax
andl $1, %eax
popl %ebp
ret

Ami egy meglepöen intelligens valasz, hiszen a felteteles ugrast önmagatol atalakitotta egy eltolasse es egy es-operaciova. Ez altalaban gyorsabb, mert a modern architekturakban minden feltetes ugras jelentösen lassithatja a programfutast, mert a processzor a pipeline miatt jump-prediction-t hasznal, ami ha nem jön be alapvetöen lassabb mint jopar müvelet vegrehajtasa.

A fenti megoldas persze csak ebben a specialis esetben lehetseges, amennyiben pl. lebegöpontos szamot adnank vissza, itt a fenti trükk nem müködik:

double f(unsigned input) { return input & (1<<5) ? 1.0 : 0.0; }

( -O3 agressziv optimalizalassal forditva a következö kodot adja:)

pushl %ebp
movl %esp, %ebp
testb $32, 8(%ebp)
je .L2
fld1
.L3:
popl %ebp
ret
.p2align 4,,7
.L2:
fldz
jmp .L3

Itt lathatjuk, hogy most megörizte a 32-vel törtenö maszkolast (tehat az 1<<5 müveletet forditasi idöben elvegezte), valamint kihasznalta a tehat megint eleg jo kodot generalt.

Utoljara nezzük meg, hogy mi törtenik, ha az a következö evvel ekvivalens, de kisse szuboptimalisabb kodot forditjuk (elöször az inputot balra toljuk aztan maszkolunk):

double f(unsigned input) { return ((input >> 5) & 1)? 1.0 : 0.0; }

Eredmeny:

pushl %ebp
movl %esp, %ebp
testb $32, 8(%ebp)
je .L2
fld1
.L3:
popl %ebp
ret
.p2align 4,,7
.L2:
fldz
jmp .L3

Azaz ugyanaz mint az elöbb, megint nem törtenik eltolas futasidöben!

A tanulsag: nem erdemes tul sokat agyalni alacsony szintü trükkökön, a fordito jo esellyel megtalalja az optimalis megoldast, talan jobbat meg jobbat is, mint ami a programozonak eszebe jutna. Erdemes inkabb a magasabb szintü algoritmikus kerdesekre koncentralni assembler tuningolas helyett.
Előzmény: thuram (213)
thuram Creative Commons License 2005.02.05 0 0 213
Erre én is rájö(he)ttem volna:). Nekem itt néha csak 1 bitre van szükségem, néha 8 ra. Bool változó itt nincsen? mert a könyvemben nem találtam:). 1 bit az általad leirt módszerrel való kinyerése mennyivel lassab (kb.) mint egy asm mel kinyert 1 bit a végéről ill elejéről.  Hogyan kell beszurni asm kódot? Egyébként az általad leirt módszerben az a jó hogy tetszoleges részből kinyerhető vele bit, forgatás nélkül.
Előzmény: NevemTeve (209)
DonQuijote Creative Commons License 2005.02.05 0 0 212
Ez a két értékadás nem ugyanaz. y az, amit ő akar, de x szerintem input / 32.
Előzmény: NevemTeve (209)
thuram Creative Commons License 2005.02.05 0 0 211
Ez igaz, de azért kell így tárolni (nem én találtam ki), mert ebből könnyebben lehet lépéseket generálni. Általában 14 darab ilyen ugynevezett bitboard van (gyalogok, bástya,huszár,futó,király,vezér }*2+ összes világos +összes sötét bábu). Valahogy ezekkel könnyebb legenrálni hogy honnan hova lehet lépni.
Előzmény: NevemTeve (208)
DonQuijote Creative Commons License 2005.02.05 0 1 210
Ez valami meghekkelt tévétávirányítón futó embedded Linux, vagy mi, hogy nincs erre 64 byte RAM, hanem bitekkel kell bűvészkedni?
NevemTeve Creative Commons License 2005.02.05 0 0 209
Hogyne lehetne, pl
x = input >> 5;
y = input & 31;
Előzmény: thuram (207)
NevemTeve Creative Commons License 2005.02.05 0 0 208
Ez akkor lenne igaz, ha egy figura egyszerre akárhány mezőn jelen lehetne... amennyiben ez nem áll fenn, hanem mindig csak egy mezőn van egyszerre, akkor a 64 bites számodnak mindig egyetlen bitje lesz 1, a többi nulla. Elegánsabb megoldás 6 biten (sőt, 2*3 biten) tárolni azt az egyetlen mezőt, amelyiken van.
Előzmény: thuram (206)
thuram Creative Commons License 2005.02.05 0 0 207
Van lehetőség a jobbra tolás (>>) esetén a kieső bit értékének megkapására valami változóban? Vagy ehhez már asm kell?
Előzmény: thuram (206)
thuram Creative Commons License 2005.02.04 0 0 206
"A "long long" 64 bites, de speciel a sakktáblához elég 6 bit. Ellenőrizd: 2^6=64."

Igen valóban az unsigned long long kell nekem:). Azt hogy 2^6= 64 azt még én is tudom:), mivel azonban a 64 mezőről azt kell tárolni hogy ott van-e vagy nincs-e (azaz minden mezőről 1-1 bit információ) ez 2^64 ent jelent.

Köszönöm a példát.
Előzmény: NevemTeve (205)
NevemTeve Creative Commons License 2005.02.04 0 0 205
Hogyan oldaható meg szépen hogyha nem int ek közül akarok switchelni?
Hanem? Ha int,short,char,long,enum típusod van, akkor switch-elhetsz, egyébként "if".

64 bites számokra lenne szükségem.(ahhoz hogy a sakktábla mely mezején áll az adott bábu) de egyenlőre csak 32 bites számról tudok,
A "long long" 64 bites, de speciel a sakktáblához elég 6 bit. Ellenőrizd: 2^6=64.

scanf után hogyan kérdezhetem le szépen hogy valóban a megfelelő tipusut (amit én kértem) pötyögték be?
Utána már nemigen... legfeljebb a visszaadott értékét lehet ellenőrizni: annyi, ahány értéket beolvasott... igényesebb működéshez a következők ajánlottak: fgets, strtok, strtol (és társai)

A legfontosabb változókat amiket használok hova szokás tenni? ( egy header fájlba vagy a main be vagy mindegy?)
Nincs külön szabály a változók fontossága szerint... legjobb minden változót abban a legszűkebb körben definiálni, ahol szükség van rá - ha csak egy függvényen belül kell, akkor ott, ha csak egy source-nak kell, akkor abban a source-ban static-ként, ha több source is használja, akkor egy modulban definiáljuk (int fontoska;) a többiben deklaráljuk (extern int fontoska) - a deklarációt praktikusan egy header-fileba tesszük.

/* valami.h */
extern int fontoska;

/* valami.c */
#include "fontoska.h"
int fontoska = 38;

/* main.c */
#include "fontoska.h"
int main(void) {
 printf ("fontoska=%dn", fontoska);
 return 0;
}
Előzmény: thuram (204)
thuram Creative Commons License 2005.02.04 0 0 204
Hát hazudnék ha azt mondanám, hogy értem no mindegy egyenlőre még nincs rá szükségem. Vannak viszont fontosabb kérdéseim:
1: hogyan oldaható meg szépen hogyha nem int ek közül akarok switchelni?
2: 64 bites számokra lenne szükségem.(ahhoz hogy a sakktábla mely mezején áll az adott bábu) de egyenlőre csak 32 bites számról tudok,szóval füzzek össze kettőt. (azaz minden bábuhoz csinálhatok egy kételemű long int tömböt) van egyszerübb?
3:scanf után hogyan kérdezhetem le szépen hogy valóban a megfelelő tipusut (amit én kértem) pötyögték be?
4:A legfontosabb változókat amiket használok hova szokás tenni? ( egy header fájlba vagy a main be vagy mindegy?)
Egyenlőre nem akarom több kérdéssel fárasztani a népet ugyhogy egyenlőre bőven elég lenne ha erre is választ kapnék.
Előzmény: NevemTeve (203)
NevemTeve Creative Commons License 2005.02.03 0 0 203
Épp a minap kérdezte ezt valaki egy másik topikban, úgyhogy elég átpasztáznom onnan:


# Makefile

CFLAGS = -g -Wall
LDFLAGS = -g

all: hello

clean:
<TAB>rm *.o hello 2>/dev/null || true

hello: hello.o func.o


ehhez tegyünk még hozzá egy-két függőséget


hello.o: hello.c func.h

func.o: func.c func.h


a többit a make tudja magát... ja, és még meg kell írnod a hello.c, func.c, func.h file-okat... ez már a te feladatod...
Előzmény: thuram (202)
thuram Creative Commons License 2005.02.03 0 0 202
Aszem ez kell nekem:)

Tudnátok mutatni olyan egyszerű példát a make re ahol van 2-3 .c kiterjesztésű (lehetőleg egyszerű) file 1-2 .h kiterjesztésű ill egy make file. (persze nem várom hogy irjatok olyat tökéletes ha a netről letudom tölteni)
NevemTeve Creative Commons License 2004.12.26 0 0 201
Aki nem rendszergazda, az beteheti az aktuális könyvtárat a PATH-ba, valahogy így:
PATH=/bin:/usr/bin:/usr/local/bin:
a végén lévő üresség jelenti az aktuális könyvtárat
tkeda Creative Commons License 2004.12.26 0 0 200
Köszi! Asszem ide még visszanézek párszor...
Előzmény: locsemege (199)
locsemege Creative Commons License 2004.12.25 0 0 199
Igen, dj helyesen írta, de nem magyarázta meg. A linuxban a parancsot a shell a PATH környezeti változóban megadott elérési utakban keresi. Szemben a DOS-szal, Windows-zal, az aktuális könyvtárban nem keresi, és mivel az nem volt a path-ban, nem is találta meg. Ezért meg kell adni az elérési utat is. Te ezt úgy tetted, hogy feljebb mentél, majd onnan CProg/a.out-tal indítottad. Mivel az aktuális könyvtár jele a . - akár a Windows-ban -, elindíthattad volna úgy is a progidat, hogy nem mész feljebb (ahogy dj is írta):

./a.out
Előzmény: tkeda (197)
dj Creative Commons License 2004.12.25 0 0 198
Általában így kell:
dma@linux:~/Documents/CProg> ./a.out
Előzmény: tkeda (197)
tkeda Creative Commons License 2004.12.25 0 0 197
dma@linux:~/Documents/CProg> a.out
bash: a.out: command not found
dma@linux:~/Documents/CProg> ..
dma@linux:~/Documents> CProg/a.out
Helló világ!!!dma@linux:~/Documents>
Előzmény: N.G.J. (196)
N.G.J. Creative Commons License 2004.12.24 0 0 196
Mi a pontos hibaüzenet?

Hogyan próbáltad indítani? Csak a beírtad a program nevét, vagy eléírtad az éppen aktuális könyvtárra való hivatkozást is? (program_neve vagy ./program_neve formában próbáltad indítani)
Előzmény: tkeda (195)
tkeda Creative Commons License 2004.12.24 0 0 195
Miért nem lehet futtatni abban könyvtárban a lefordított
kódot ahol van, miért kell eggyel feljebb lépni???(suse9.0,gcc)
dj Creative Commons License 2004.11.11 0 0 194
Köszönöm, meglett.
Előzmény: zsowy (193)
zsowy Creative Commons License 2004.11.11 0 0 193
adatbázisnak ezt kell mondani:
set client_encoding to 'UNICODE';
Előzmény: dj (188)
dj Creative Commons License 2004.11.03 0 0 192
Kössz! Letöltöm, biztosan jó az anyag.
Előzmény: N.G.J. (191)
N.G.J. Creative Commons License 2004.10.30 0 0 191
A QT-ről pont a napokban tettek ingyenesen letölthetőve egy
nagyon jónak mondott könyvet.
Letölthető innen, a Downloads pontra kattintva.
Előzmény: dj (188)
dj Creative Commons License 2004.10.29 0 0 190
Kössz! Mostmár igen :)
Előzmény: NevemTeve (189)
NevemTeve Creative Commons License 2004.10.29 0 0 189
Ezt olvastad?
http://developer.postgresql.org/docs/postgres/multibyte.html#AEN19684
Előzmény: dj (188)
dj Creative Commons License 2004.10.29 0 0 188
Sziasztok!

Nem tudom, hogy ezt itt vagy valami QT-s topikban kellene feltenni, először ide próbálom. Volna feltöltött postgres adatbázis amire QT-s guit kellene csinálni. Az a bajom egyelőre, hogy ha felteszem a táblát grafikus felületre akkor a magyar ékezetes szavak így jelennek meg:
"Termék azonosító" ilyenre "Term??k azonos??t??" változik.

Hol tudom megadni a kódolást QT-ban? Vagy nem lehet összehozni a kettőt? A PG most iso8859-2-t használ a QT alkalmazás pedig UTF8-at.

Köszi előre is!
Belohin Creative Commons License 2004.09.23 0 0 187
Köszi, megvan a tettes (természetesen jómagam). Az -o mögül hiányzott az object file neve, és nyilván ez megkeverte a paraméterkezelést. Kezdők okulására talán alkalmas. De hát még belohin vagyok...
Előzmény: NevemTeve (186)
NevemTeve Creative Commons License 2004.09.22 0 0 186
Mit ír ki a pkg-config, és hol van a hiányzó include-file? Biztos hogy az hiányzik, amire gondolsz? Nem inkább abban van egy újabb include?
Előzmény: Belohin (185)
Belohin Creative Commons License 2004.09.22 0 0 185
Sziasztok!
Nem találtam közelebbi topicot...
Nagy nehezen felkönyörögtem forrásból a gtkmm-2.4.3-at SUSE 9.0 alá. A legegyszerűbb példával szerettem volna kipróbálni a tutorial-ból: simple.cc. A javasolt utasítás: g++ simple.cc -o `package-config gtkmm-2.4 --libs --cflags`.
Nem találja a header file-t, pedig ha beírom külön a backtick-ben levőt, a package-config kimenete rendben levőnek látszik.
A f* man-ban olyasmit láttam, hogy a -I paraméter figyelmen kívül marad, ha rendszer-include könyvtár. De hol, hogyan tudatom a rendszerrel, hogy a /usr/local/include/gtkmm-2.4 -ben is keressen?

Ha kedveled azért, ha nem azért nyomj egy lájkot a Fórumért!