Egyéb: Assembly, Ada...

go kerdes

Az alabbi all egy if feltetelnel:

if x > 3 {
rows, err := db.Query("select uid, username from user")
}

....

for rows.Next() {
....
}

a problema csak az, hogy mivel az if-en belul szerepel eloszor a 'rows' valtozo, ezert nem latszik az if-en kivul. Gondoltam, hogy akkor a program elejen deklaraljuk. Nade hogyan?

A https://golang.org/pkg/database/sql/#DB.Query szerint *Rows a tipusa. Nade, a https://golang.org/pkg/database/sql/#Rows meg azt mondja, hogy

type Rows struct {
// contains filtered or unexported fields
}

Namost akkor hogyan kene a rows valtozot deklaralni?

gpasm fura hibaüzenet

Sziasztok!

A program fordul, de a fordító üzen. Mit rontottam el?
Megpróbálok az áttekinthetőség kedvéeért egy gyors peszudokódot összedobni.

Főprogram

#include "cpu1.inc"
#include "config.inc"
...

A config.inc

#ifdef cpu1
...
#endif cpu1
...
#ifdef cpu2
...
init_X macro X
if (X==1)
movlw 1
else
movlw 2
movwf PSMC#v(X)CON
endif
endm
...
init_all macro
init_X 1
init_X 2
init_X 3
endm
...
#endif cpu2

Tehát a fordítás hibátlan, de megjelenik az alábbi hibaüzenet:
Symbol X not assigned a value.
Méghozzá pontosan annyiszor, ahányszor az X hivatkozás szerepel(ne) az init_all*init_X kifejtésekor. De ugye erre nem kerülhet sor, mert a cpu2 undefined.

A fordítás abszolút módban megy, a cpu1=PIC18F14K22, a cpu2=PIC16F1789.

Idiomatic Scala

Sziasztok,

Egy ideje ugykodom egy non-blocking scala kliensen a brickset.com SOAP APIjahoz.
A kod itt talalhato: https://github.com/voidcontext/scala-brickset-client .

Az a helyzet, hogy a Scala-t meg csak tanulgatom, ezert valoszinuleg vannak a kodban olyan megoldasok, amiket Scalaban lehetne szebben/jobban irni.
Szoval a kerdesem az lenne, hogy tudnam meg "Scalasabba" tenni a kodot?

Elore is koszi,
Gabor

Ki ismeri: Julia (programming language)

Ki ismeri vagy tudja, hogy letezik, ill. barmi, ami ezzel kapcsolatos tapasztalat/velemeny?

http://julialang.org/

Van egy tablazat az oldal elso harmadaban: benchmark times relative to C (smaller is better, C performance = 1.0).

itt futottam bele (Juliaba): http://www.infoworld.com/article/2840235/application-development/9-cutt…

Ötletelés - hard reset 4 byte-nyi kódból, x86 Assembly, real mode

Sziasztok!

Úgy alakult, hogy lesz egy kis szabadidőm nosztalgiázni, és x86 assembly-vel foglalkozni. Kb. 20 éve, amikor elkezdtem az x86 Assembly-vel ismerkedni, találtam egy 4 byte hosszú reset.com-ot, ami képes volt a gépet újraindítani. Mivel az eredeti négy bájtot már elfelejtettem (és nem biztos, hogy megvan valahol elásva a reset.com), az lenne a kérdésem, hogy ti milyen kóddal oldanátok meg? Mindenféle megoldás érdekel, de főleg a 4 byte-osak.

5 byte hosszú megoldások:

  • Az eredeti IBM PC reboot kódja elérhető például az FFFF:0000 címre való long jumppal: JMP FFFF:0000 (EA 00 00 FF FF).
  • Ugyancsak az eredeti IBM PC-ben az FFFF:0000 címen egy jmp utasítás van az F000:F553 címre (lehet, hogy tévedek, ma megnézem újra), kézenfekvő tehát egyből odaugrani (EA 53 F5 00 F0).

4 byte hosszú megoldások:

  • Ha kiindulhatunk abból, hogy egy EXE/COM fájl futtatásánál a négy alapregisztert nullázza a DOS, akkor egyszerűen: DEC AX; PUSH BX; PUSH AX; RETF; (48 53 50 CB)

Egyéb ötlet? :)

u.i.: 2 byte-os soft resetre ott van az int 19h (CD 19)

i2c használata, i2c-parport-light, hogy működik ez

Azért tettem ide ezt a kérdést, mert a "lavinát" az indította el, hogy clockolt soros kommunikációs modult/device -t kellene írnom.
Első lépésben a parallel portot használtam - egyenlőre csak az órajel előállítására koncentrálok, legfőképp a sebesség miatt.
Eszembe jutott, hogy az i2c (de az spi is) hasonlóan egy clockolt soros kommunikáció, amihez vannak kész driverek - nyílt forráskóddal :)
Addig eljutottam, hogy beemeltem az i2c_parport_light modult, de nem tudom "szóra bírni". Device node nem jelenik meg (vagy nem találom). Ráadásul, a forrásból ítélve ahhoz, hogy ez működjön kell az i2c_core és talán más "i2c" modul is (pl. i2c_algo_bit).
Hogy lehet a parportra kötött i2c buszt meghívni - írni, olvasni?
Talán az i2c-tools segít?
Aztán van itt valami libi2c-dev "userspace I2C programming library".
Hol kezdjem?

minimal halokartya driver keszitese

Assemblyben irnek egy minimalis meretu es tudasu halokartya drivert.Olvastam ilyen temaju cikkeket es lattam a linux forrasban a drivert.
En valami sokkal egyszerubbet irnek. Egyetlen tipusra, raw packetekhez. Ehhez kellene alkalmas dokumentacio es/vagy minimal peldakodok. Tudtok ajanlani szakkonyvet/eloadasjegyzetet/irc csatornat?
Koszonom.

[solved] Elsore melyik funkcionalis nyelvet miert?

Sziasztok,

Ha most kezdenetek el megtanulni az elso funkcionalis nyelvet, akkor melyik lenne az, es miert? Pl: x mert konnyu elso funcionalis nyelvnek, y mert elterjedt, z mert hasznos/piackepes etc...

Update:

Latom, vagy rosszul fogalmaztam, vagy a szovegertes nem megy:
Tisztan funkcionalis vagy hibrid nyelvekre lennek kivancsi, pl: Scala, Haskell, Erlang, etc.

avr-gcc inline assembler viselt dolgai

Sziasztok!

Adott AVR8 alatt egy egyszeru problema: ossze kellene szorozni egy 32bites es egy 8bites szamot. Ha csinalok erre egy ilyesmit, hogy


static inline uint32_t mul32x8(uint32_t a,uint8_t b)
{
 return(a*b);
}

akkor ez nagyon lassu lesz. Tobbek kozott azert mert 32x32bites szorzasra alakitja es egy avr-libc konyvtarban implementalt (valami __mul32... jellegu nevvel megaldott) fuggvenyt hiv. Es ez ugye egy RISC architektura alatt (plane 8 biten) koltseges. Marmint mind az a luxus hogy 8bit helyett 32bittel dolgozunk, mind a fuggvenyhivas.

Nosza, irjuk meg asm-ben. Halistennek a linuxos avr-gcc fejleszteseben is tevekenyen ott van az Atmel, a referenciadoksi is nagyon jo, igy szepen el lehet indulni. Ossze is sikerult dobni egy ilyet:


static inline uint32_t mul32x8(uint32_t a,uint8_t b)
{
 uint32_t       prod;

 __asm__ 
  (
        "       mul     %A[a], %[b]     \n\t"
        "       mov     %A[p], r0       \n\t"
        "       mov     %B[p], r1       \n\t"
        "       eor     %C[p], %C[p]    \n\t"
        "       eor     %D[p], %D[p]    \n\t"
        "       mul     %B[a], %[b]     \n\t"
        "       add     %B[p], r0       \n\t"
        "       adc     %C[p], r1       \n\t"
        "       mul     %C[a], %[b]     \n\t"
        "       add     %C[p], r0       \n\t"
        "       adc     %D[p], r1       \n\t"
        "       mul     %D[a], %[b]     \n\t"
        "       add     %D[p], r0       \n\t"

        : [p] "=&d" (prod)
        : [a] "d" (a), [b] "d" (b) 
        :  "r0", "r1", "cc"
  );

 return(prod);
}

Offline debugger szerint is megy, jo kodot is general (avr-objdump -d), elesben is majdnem mukodik, csak neha nem. Akkor viszont valahogy ugy kifagyasztja az MCU-t hogy WDR-ig se sikerul eljutnia :] Akkor nem mukodik (neha), ha ket egymas koveto" szorzas van, kis egyeb aritmetikaval (pl osszeadas). Igy felmerul a lehetoseg, hogy optimalizacio (-O3) soran valamit a parameter-regiszterekkel (lasd [p], [a], [b]) igencsak osszekavar itten.

Szoval a lenyegi kerdes: van-e valakinek tapasztalata hogy gcc inline asm mellett az output es/vagy input parametereknel az egyes regisztereket hogyan erdemes es/vagy ajanlott beallitani? Esetleg pont AVR8 alatt? A "d" itten kvazi hasrautes szeru" volt, de ha pl =&d helyett csak =d-t adok meg outputkent akkor az -O3-as kod mar debugger szinten nem lesz jo. A clobber szekcioban meg az r0, r1 es a flags-on kivul mast csakcsak nem kell megadni (a mul explicite csak az r0,r1-et bantja, a tobbi meg csak a parametereit es a cc-t). De valszeg a kiakada's azert van mert itten rosszul adok meg valamit... Lehet hogy "d" helyett "a" kene? A referencia szepen osszefoglalja az opciokat (r, d, a, l, ...) de hogy ebben az esetben mi a banat baja lehet azt nem tudom...

thx, A