» »

[C] parse error

[C] parse error

ql000 ::

Pozdrav vsem skupaj!
Pišem (prepisujem) driver za LAN W3100A čip iz 8051 arh. v kodo (C jezik), da jo bo razumel PIC mikrokontroler. Pojavi se mi problem, ko hočem prevest nekaj takega:

header datoteka ima definiran:
#define I2CHIP_BASE 0x8000
#define INT_REG (*((volatile u_char xdata *)(I2CHIP_BASE + 0x08))



potem pa to zadevo kličem v main.c:
void neka_funk(void)
{
  u_char status;

  status = INT_REG; // parse error
}


Kompiler mi javi parse error in pokaže na vrstico v main.c. Kaj ne štima?
  • spremenil: ql000 ()

OwcA ::

En zaklepaj premalo (pri #define INT_REG)? ;)
Otroška radovednost - gonilo napredka.

Zgodovina sprememb…

  • spremenilo: OwcA ()

ql000 ::

Sorry, sem ga pozabil natipkat v post! V kodi imam tretji zaklepaj pa zadeva še vedno ne deluje!:( Na enem forumu sem zasledil, da naj najprej deklariram union preden deklariram prototip funkcije. Samo kje!?

OwcA ::

Zakaj pa union (kej sploh to uporabljaš)? V vsakem primeru dvomim v to diagnozo, če bi bil kak nepoznan simbol bi se drugače pritožil.

Poskusi mogoče INT_REG izpisati v vrstici z napako.
Otroška radovednost - gonilo napredka.

ql000 ::

Kako to misliš?

OwcA ::

status = (*((volatile u_char xdata *)(I2CHIP_BASE + 0x08))

Če je še vedno parse error v tej vrstici je nekaj narobe z izrazom (potem ga poenostavljaš dokler ne dela), drugače dogaja preprocesorju.
Otroška radovednost - gonilo napredka.

ql000 ::

Matr mu! Še vedno parse error before xdata! A je to mogoče problem prevajalnika?

OwcA ::

Ni, sem poskusil na ICC 9 (kar se mene tiče najboljša implementacija ANSI C in zlasti C++) in pravi:
error: type name is not allowed

če odstranim xdata, pa požre brez pritoževanja.
Otroška radovednost - gonilo napredka.

Zgodovina sprememb…

  • spremenilo: OwcA ()

ql000 ::

Zgleda, da ga jebe ta xdata v #definu! Problem je v tem, ker se mi xdata pojavljan povsod:

header:
#define	COMMAND(i)		(*((volatile char xdata *)(I2CHIP_BASE + i)))
#define	INT_STATUS(i)		(*((volatile char xdata *)(I2CHIP_BASE + 0x04 + i)))
//#define	INT_REG			(*((volatile char xdata *)(I2CHIP_BASE + 0x08)))
#define	INTMASK			(*((volatile char xdata *)(I2CHIP_BASE + 0x09)))
#define	RESETSOCK		(*((volatile char xdata *)(I2CHIP_BASE + 0x0A)))


A je ta koda (*((volatile char xdata *)(I2CHIP_BASE + 0x0A))) samo kazalčna aritimetika ali je kaka višja znanost tu not?

OwcA ::

xdata ne poznam, ostalo pravi

vrednost kazalca na naslov I2CHIP_BASE + 0x0A tipa u_char, ki se lahko nenadno spremeni.
Otroška radovednost - gonilo napredka.

OwcA ::

Sem se malo izobrazil o xdata.

Sicer ni rešitev, ampak lahko poskusiš dati čisto na začetek programa

#define xdata

A prevajalnik naj bi načeloma to podpiral tudi v kakšnih bolj eksotičnih situacijah kot je z volatile?
Otroška radovednost - gonilo napredka.

ql000 ::

Ja, ja ta xdata ga serje! Xdata se uporablja za mapiranje memorije v 8051 arhitekturi! Kar pomeni, da ga jaz, če uporabim besednjak Braneta2, z orgazmičnim užitkom pobrišem! >:D


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[C] LPC1343 - UART - AT commands

Oddelek: Programiranje
91139 (1029) JanezovJanez
»

C in funkcije ter #define

Oddelek: Programiranje
463964 (2325) misek
»

[baze] Povezava do slike ali BLOB?

Oddelek: Programiranje
101666 (1463) BlueRunner
»

[c++] segmentation fault?????

Oddelek: Programiranje
212309 (1853) Vesoljc
»

[java ali C] Datoteka v obliki 0 in 1

Oddelek: Programiranje
191853 (1573) Mmm'Aah

Več podobnih tem