Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

aggregate value used where an integer was expected

[es] :: C/C++ programiranje :: aggregate value used where an integer was expected

[ Pregleda: 3224 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

aleksazr
zrenjanin

Član broj: 196784
Poruke: 245
..106.109.adsl.dyn.beotel.net.



+11 Profil

icon aggregate value used where an integer was expected18.02.2012. u 15:31 - pre 147 meseci
Code:

typedef struct {        // 16 bits, one WORD
  unsigned short B4:4;  // (koristim GCC kompajler)
  unsigned short B9:9;
  unsigned short B1:1;
  unsigned short B2:2;
} S1;

typedef struct {
  S1 q1, q2;
} S2;

static S2 table[2]= {
    {{1,1,1,1}, {1,1,1,1}},
    {{1,1,1,1}, {1,1,1,1}}
};

unsigned short getq1 (int i)
{
    unsigned short bit16;

        // error: aggregate value used where an integer was expected
        bit16 = (unsigned short) table[i].q1;

        return bit16;
}



Tu gde čitam bit16 dobijem grešku... S1 jeste 16 bita, ne razumem u čemu je problem..
Kako da pročitam strukturu S1 u WORD?

CYRfree 2.0.5 - ako bi ćirilicu radije čitali kao latinicu.
Serbian Latin & Cyrillic keyboard layout 08.nov.2022 - za QWERTY tastature sa našeg tržišta.
http://users.beotel.net/~gwh/

 
Odgovor na temu

milanche
San Francisco

Član broj: 2447
Poruke: 1200
*.hsd1.ca.comcast.net.



+1001 Profil

icon Re: aggregate value used where an integer was expected18.02.2012. u 16:22 - pre 147 meseci
Jedan od nacina je da deklarises union

Code:

typedef struct {        // 16 bits, one WORD
  unsigned short B4:4;  // (koristim GCC kompajler)
  unsigned short B9:9;
  unsigned short B1:1;
  unsigned short B2:2;
} BitField;

typedef union
{
  unsigned short sviZajedno;
  BitField bits;
} S1;

...
...

unsigned short getq1 (int i)
{
  return table[i].q1.sviZajedno;
}



Mozda moze posao da obavi i ova mala prljavstina sa cast-ovanjem (mada zbog raznih scenarija sa alignment-om struktura
nisam prijatelj ovakvih navika u programiranju)

Code:


unsigned short getq1 (int i)
{
  bit16 = *((unsigned short*)&(table[i].q1));
}


 
Odgovor na temu

aleksazr
zrenjanin

Član broj: 196784
Poruke: 245
..106.109.adsl.dyn.beotel.net.



+11 Profil

icon Re: aggregate value used where an integer was expected18.02.2012. u 16:41 - pre 147 meseci
Da, zaboravio sam, nažalost, da kažem... znam da bi možda išlo lakše kao UNION, ali onda ne znam kako da napravim samu tabelu.
A i ti si, vidim, izbegao da inicijalizuješ tabelu :) Sad ću da potražim...
CYRfree 2.0.5 - ako bi ćirilicu radije čitali kao latinicu.
Serbian Latin & Cyrillic keyboard layout 08.nov.2022 - za QWERTY tastature sa našeg tržišta.
http://users.beotel.net/~gwh/

 
Odgovor na temu

aleksazr
zrenjanin

Član broj: 196784
Poruke: 245
..106.109.adsl.dyn.beotel.net.



+11 Profil

icon Re: aggregate value used where an integer was expected18.02.2012. u 17:22 - pre 147 meseci
Dobro, ne mogu da nađem... može neko da napiše konkretno?

GCC mi daje grešku: missing braces around initializer,

i to nakon što sam promenuo
Code:

typedef union
 {
   unsigned short sviZajedno;
   BitField bits;
 } S1;


u ovo

Code:

typedef union
 {
   BitField bits;
   unsigned short sviZajedno;
 } S1;


Pročitao sam da može da se inicijalizuje samo prvi element unije (a u ovom slučaju to je bit field)
CYRfree 2.0.5 - ako bi ćirilicu radije čitali kao latinicu.
Serbian Latin & Cyrillic keyboard layout 08.nov.2022 - za QWERTY tastature sa našeg tržišta.
http://users.beotel.net/~gwh/

 
Odgovor na temu

aleksazr
zrenjanin

Član broj: 196784
Poruke: 245
212.178.245.*



+11 Profil

icon Re: aggregate value used where an integer was expected18.02.2012. u 19:11 - pre 147 meseci
http://groups.google.com/group...hread/thread/54933b882bfc9bac#

Treba da se stave još jedne zagrade, da izgleda ovako:

static S2 table[2]= {
{{{1,1,1,1}}, {{1,1,1,1}}},
{{{1,1,1,1}}, {{1,1,1,1}}}
};
CYRfree 2.0.5 - ako bi ćirilicu radije čitali kao latinicu.
Serbian Latin & Cyrillic keyboard layout 08.nov.2022 - za QWERTY tastature sa našeg tržišta.
http://users.beotel.net/~gwh/

 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.3gnet.mts.telekom.rs.



+2789 Profil

icon Re: aggregate value used where an integer was expected19.02.2012. u 11:48 - pre 147 meseci
Ja sa GNU kompajlerom dobijam ispravnu poruku o grešci

Code:
error: invalid cast from type 'S1' to type 'short unsigned int'


Treba ti nešto poput

Code:
bit16 = reinterpret_cast<unsigned short>(table[i].q1);


ako je program pisan u C++-u, a ako je u C-u onda

Code:
bit16 = *(unsigned int*)&(table[i].q1);

Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

milanche
San Francisco

Član broj: 2447
Poruke: 1200
*.hsd1.ca.comcast.net.



+1001 Profil

icon Re: aggregate value used where an integer was expected19.02.2012. u 16:46 - pre 147 meseci
@Nedeljko

Ako pogledas moj prvi post, pri dnu (..."Mozda moze posao da obavi i ova mala prljavstina sa cast-ovanjem"...)
je ponudjeno i to resenje, mada sam naglasio da to nije sasvim zdrava programerska navika, primenjiva na
sve platforme.

Zasto ?

U principu, u zavisnosti od implicitnih zahteva koji poticu negde od DMA kontrolera pa navise, na masi embedded
sistema (ne na x86, tj. PC-jevima, ali u masi drugih slucajeva) postoje alignment zahtevi, tj. da recimo int32_t
bude na memorijskoj adresi cija je vrednost multiple od sizeof(int32_t).

Direktan assignment tipa <promenljiva> = <kastovanje><memorijska adresa> moze da ili izazove trenutan
crash, ili da u promenljivu spakuju nekorektnu vrednost uzetu sa lokacije koja pocinje na prvoj narednoj aligned
adresi (sto ocito nije ono sto se zeli).

Resenje koje ima najbolje pocetne sanse da uvek radi je prost memcpy(&promenljiva, &strukture, brojBajtova).
U ovom konkretnom slucaju, kad je struktura ocito nista vise nego 16-bita, radice bez problema uvek i svugde.

Medjutim....cak i tada nije sve gotovo. U opstijem slucaju u kojem struktura moze da sadrzi gomilu raznih drugih
tipova ili drugih struktura (recimo:

Code:

typedef struct 
{
     bool b1;
     char c1;
     char c2;
     uint32_t ui1;
     uint64_t ui_1;
} nekaStruktura;


ne moze se u potpunosti verovati vrednosti koju vraca sizeof(struktura), jer varira od toga kakav je alignment u
trenutku izvrsavanja.

Alignment obicno funkcionise tako da prilikom kompajliranja prvo ustanovi koji je najveci type upotrebljen u strukturi
(u ovom slucaju uint64_t), pa prema tome prvo align-uje celu strukturu, i ako se eksplicitno ne navede (...pogledati #pragma align...)
zeljeni alignment, desice se da je svaki deo strukture smesten (od bool-a do uint64_t) na medjusobnom razmaku
od 8 bajtova, tako da ce sizeof(nekaStruktura) dati rezultat 5*8 = 40.

Dosta lepo je cela prica objasnjena ovde http://en.wikipedia.org/wiki/Data_structure_alignment).

Da naglasim jos jednom (sto kazu lepo i u ovom poslednjem linku):

Citat:
x86 architecture originally did not require aligned memory access and still works without it


tj. u slucaju x86 (na PC-ju) ce sve lepo raditi i ovako i onako. Medjutim, taj pristup u principu nije sasvim zdrava programerska navika.
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
95.180.23.*



+395 Profil

icon Re: aggregate value used where an integer was expected19.02.2012. u 17:27 - pre 147 meseci
Cak je i cika Bjarne vise puta naglasio da je kastovanje jedan od primera loseg dizajna tj. navike
http://www2.research.att.com/~bs/learn.html

Viva lollapalooza
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.3gnet.mts.telekom.rs.



+2789 Profil

icon Re: aggregate value used where an integer was expected19.02.2012. u 20:43 - pre 147 meseci
milanche

Sve je to meni jasno. No, ovde je po svoj prilici početnik u pitanju.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

milanche
San Francisco

Član broj: 2447
Poruke: 1200
*.hsd1.ca.comcast.net.



+1001 Profil

icon Re: aggregate value used where an integer was expected19.02.2012. u 21:34 - pre 147 meseci
Ma OK smo.
 
Odgovor na temu

Goran Arandjelovic
Beograd

Član broj: 29116
Poruke: 387
*.dynamic.sbb.rs.



+9 Profil

icon Re: aggregate value used where an integer was expected22.02.2012. u 02:11 - pre 147 meseci
Code:

#include <iostream>
#include <vector>
#include <utility>

struct A
{
    void AF()
    {
        std::cout << "AF" << std::endl;
    }
};

struct B
{
    void BF()
    {
        std::cout << "BF" << std::endl;
    }
};

struct C;

int main()
{
    std::vector<std::pair<C*, void(C::*)()>> v;

    A a;
    B b;

    void (C::*pAF)() = reinterpret_cast<void(C::*)()>(&A::AF);
    void (C::*pBF)() = reinterpret_cast<void(C::*)()>(&B::BF);

    C *cA = reinterpret_cast<C*>(&a);
    C *cB = reinterpret_cast<C*>(&b);

    v.push_back({cA, pAF});
    v.push_back({cB, pBF});

    for(auto it = v.begin(); it != v.end(); ++it)
    {
        (it->first->*it->second)();
    }

    return(0);
}


Nekada se ovako nešto koristilo kao najkraće rešenje za problem kako napraviti niz pokazivača na member f-je klasa koje nisu ni u kakvoj relaciji i kasnije ih iskoristiti. Ovde nije poremećen alignment, već je reinterpret cast iskorišćen samo da bi se zaobišao type sistem. Naravno, niko ni u ludilu ovo ne bi trebalo da piše ovako. Nije ovo nužno nezdrava stvar, ali je treba koristiti možda u vrlo retkim i izolovanim situacijama.
 
Odgovor na temu

[es] :: C/C++ programiranje :: aggregate value used where an integer was expected

[ Pregleda: 3224 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.