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

Definisanje strukutre u header fajlu

[es] :: C/C++ programiranje :: Definisanje strukutre u header fajlu

Strane: 1 2

[ Pregleda: 4421 | Odgovora: 22 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Texas Instruments

Član broj: 227540
Poruke: 272
*.amres.ac.rs.



+61 Profil

icon Definisanje strukutre u header fajlu27.03.2012. u 11:15 - pre 147 meseci
Kako da definišem strukturu u nekom .h fajlu, koji će biti uključen u više .c fajlova, a da izbegnem grešku prilikom linkovanja o višestrukom definisanju?

Npr. heder fajl bi izgledao ovako.

Code:

#ifndef HEDER_H_
#define HEDER_H_

struct X {
    int a;
    int b;
};

struct X nizX [] = {
        [0] = {
                .a = 1,
                .b = 2,
        },
        [1] = {
                .a = 3,
                .b = 4,
        },
        [2] = {
                .a = 5,
                .b = 6,
        },
};

#endif /* HEDER_H_ */


A onda u nekim drugim .c fajlovima da imam #include "heder.h". Imam problem sa nekim kodom koji nisam ja pisao, a treba da ga nekako lokalizujem, tako da se na što manje mesta vrši izmena u programu. Ova strukutra se definiše prilikom menjanja programa i još neke stvari pa sam to mislio da izvučem u poseban fajl.
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.dynamic.sbb.rs.



+395 Profil

icon Re: Definisanje strukutre u header fajlu27.03.2012. u 11:32 - pre 147 meseci
Upravo ovaj
Citat:

#ifndef HEDER_H_
#define HEDER_H_
..
..
..
#endif

bi trebalo da ti sredi problem visestrukog definisanje strukture ...
Viva lollapalooza
 
Odgovor na temu

Texas Instruments

Član broj: 227540
Poruke: 272
*.amres.ac.rs.



+61 Profil

icon Re: Definisanje strukutre u header fajlu27.03.2012. u 11:39 - pre 147 meseci
To sam i ja mislio, ali nije. Evo npr. kako izgledaju ti .c fajlovi.

Code:

// prvi.c

#include "heder.h"

void t(int a, int b) {
    nizX[0].a = a;
    nizX[0].b = b;
}


Code:

// drugi.c

#include "heder.h"
#include <stdio.h>

int main() {
    nizX[1].a = 5;
    nizX[2].b = 6;

    int i;
    for (i = 0; i < sizeof(nizX)/sizeof(struct X); i++) {
        printf("%d := %d %d", i, nizX[i].a, nizX[i].b);
    }
    return 0;
}


Linker prijavljuje grešku.
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.dynamic.sbb.rs.



+395 Profil

icon Re: Definisanje strukutre u header fajlu27.03.2012. u 12:14 - pre 147 meseci
Hmm... probaj sa
Code:
 
#pragma once 


umesto onog ifndef-a

mada je to u principu isto ..
Prikazi celu gresku koju ti linker izbacuje ..

Da li externi lib ima neke linkovane module ili tako nesto ..
Vrlo moguce je da mozda nisi setovao neki #define za taj lib pa prilikom kompajliranja odlazi u drugu granu definicije gde ne bi trebalo pa je to uzrok greske ...





Viva lollapalooza
 
Odgovor na temu

Texas Instruments

Član broj: 227540
Poruke: 272
*.amres.ac.rs.



+61 Profil

icon Re: Definisanje strukutre u header fajlu27.03.2012. u 13:41 - pre 147 meseci
Evo bukvalno ovako sam napravio fajlove kao test primer i isto mi se dešava.

Code:

// heder.h

#ifndef HEDER_H_
#define HEDER_H_

struct X {
    int a;
    int b;
};

struct X nizX[] = {
        [0] = {
                .a = 1,
                .b = 2,
        },
        [1] = {
                .a = 3,
                .b = 4,
        },
        [2] = {
                .a = 5,
                .b = 6,
        },
};

#endif /* HEDER_H_ */


Code:

// prvi.c

#include "heder.h"

void t(int a, int b) {
    nizX[0].a = a;
    nizX[0].b = b;
}


Code:

// drugi.c


#include "heder.h"
#include <stdio.h>

int main() {
    nizX[1].a = 5;
    nizX[2].b = 6;

    int i;
    for (i = 0; i < sizeof(nizX)/sizeof(struct X); i++) {
        printf("%d := %d %d", i, nizX[i].a, nizX[i].b);
    }
    return 0;
}


Eclipse C projekat sa mingw kompajelrom.

Code:
Description                           Resource    Path                 Location    Type
first defined here                      prvi.c    /struktura/src            C/C++ Problem
multiple definition of `nizX'     drugi.c    /struktura/src            C/C++ Problem


Code:

**** Build of configuration Debug for project struktura ****

**** Internal Builder is used for build               ****
gcc -O0 -g3 -Wall -c -fmessage-length=0 -o src\drugi.o ..\src\drugi.c
gcc -o struktura.exe src\prvi.o src\drugi.o
src\drugi.o:drugi.c:(.data+0x0): multiple definition of `nizX'
src\prvi.o:prvi.c:(.data+0x0): first defined here
collect2: ld returned 1 exit status
Build error occurred, build is stopped
Time consumed: 438  ms.  


Verovatno treba negde da se stavi extern, ali ni to nisam uspeo da provalim.
 
Odgovor na temu

milanche
San Francisco

Član broj: 2447
Poruke: 1200
*.hfc.comcastbusiness.net.



+1001 Profil

icon Re: Definisanje strukutre u header fajlu27.03.2012. u 19:19 - pre 147 meseci
Instancijacija strukture globalnog scope-a/vidljivosti treba da se obavi na samo jednom mestu,
a to ne moze da bude header fajl koji se include-uje na vise mesta.

Bolje je da se obavi u nekom od source fajlova u projektu. Definicija structX treba da ostane u
heder.h, i source fajl u kojem se instancira nizX treba da include-uje heder.h. U svim ostalim
source fajlovima koji referenciraju nizX treba da se include-uje heder.h kao i da se deklarise
eksterni simbol:

Code:

extern struct X nizX;


negde na pocetku svakog od fajlova. Ovako definisano, linker nece imati problema da bez zabune,
jednoznacno razresi (resolve) simbol.


[Ovu poruku je menjao milanche dana 27.03.2012. u 21:58 GMT+1]
 
Odgovor na temu

Texas Instruments

Član broj: 227540
Poruke: 272
95.180.72.*



+61 Profil

icon Re: Definisanje strukutre u header fajlu27.03.2012. u 19:44 - pre 147 meseci
Pretpostavio sam da je tako nešto u pitanju. Problem je što sam hteo da sve takve strukture koje se definišu u zavisnosti od nekih parametara izdvojim u poseban fajl kako ne bi morao da menjam na "sto" mesta u kodu, pa mi je logično bilo da napravim poseban .h fajl u kojem bi to definisao i onda uključivao gde mi je potrebno.
 
Odgovor na temu

milanche
San Francisco

Član broj: 2447
Poruke: 1200
*.hfc.comcastbusiness.net.



+1001 Profil

icon Re: Definisanje strukutre u header fajlu27.03.2012. u 21:02 - pre 147 meseci
Ni to nije problem.

Rezervisi jedan source fajl (.cpp) da sadrzi instance struktura konstantog (preset) sadrzaja.
Te instance mozes da stavis u niz (array) kao sto si vec krenuo (structX nizX[]).

Sve ostalo ide na isti recept - kome god taj niz treba, deklarise ga kao extern, i menja samo
indeks kojim prema potrebi pristupa clanicama.
 
Odgovor na temu

Texas Instruments

Član broj: 227540
Poruke: 272
*.amres.ac.rs.



+61 Profil

icon Re: Definisanje strukutre u header fajlu28.03.2012. u 10:52 - pre 147 meseci
Ali imam sledeći problem. Kada uključim .h fajl i deklarišem niz struktura sa extern, prilikom prolaska kroz petlju
Code:

for (i = 0; i < sizeof(nizX)/sizeof(struct X); i++) {
        printf("%d %d\n", nizX[i].a, nizX[i].b);
    }

dobijam grešku.
Code:

invalid application of 'sizeof' to incomplete type 'struct X[]'    main.c    /struktura/src    line 16    C/C++ Problem


Kako da mi ostane operator sizeof (pošto ne mogu da znam koliko će biti članova u nizu), a da opet menjam to samo na jednom mestu?

Code:

// heder.h
#ifndef HEDER_H_
#define HEDER_H_

struct X {
    int a;
    int b;
};

#endif /* HEDER_H_ */


Code:

// prvi.c
#include "heder.h"

struct X nizX[] = {
        [0] = {
                .a = 1,
                .b = 2,
        },
        [1] = {
                .a = 3,
                .b = 4,
        },
        [2] = {
                .a = 5,
                .b = 6,
        },
};


Code:

// main.c
#include <stdio.h>
#include "heder.h"

extern struct X nizX[];

int main() {

    int i;
    for (i = 0; i < sizeof(nizX)/sizeof(struct X); i++) {
        printf("%d %d\n", nizX[i].a, nizX[i].b);
    }

    return 0;
}
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.dynamic.sbb.rs.



+395 Profil

icon Re: Definisanje strukutre u header fajlu28.03.2012. u 11:19 - pre 147 meseci
Umesto ovog :
Code:

for (i = 0; i < sizeof(nizX)/sizeof(struct X); i++) {
        printf("%d %d\n", nizX[i].a, nizX[i].b);
    }

valjda ide ovo :

Code:

extern struct X nizX[3]; 

for (i = 0; i < sizeof(nizX)/sizeof(X); i++) {
        printf("%d %d\n", nizX[i].a, nizX[i].b);
    }


Primecujes razliku ?


[Ovu poruku je menjao deerbeer dana 28.03.2012. u 12:39 GMT+1]
Viva lollapalooza
 
Odgovor na temu

Texas Instruments

Član broj: 227540
Poruke: 272
*.amres.ac.rs.



+61 Profil

icon Re: Definisanje strukutre u header fajlu28.03.2012. u 11:46 - pre 147 meseci
Mislim da grešiš. Probaj da iskompajliraš to što si napisao i videćeš da neće znati šta je X. A i druga stvar je što meni treba nešto što mi neće zavisiti od broja elemenata niza (ne mogu da znam hoće li bit 1, 2, 3 ... 10 elemenata).
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.dynamic.sbb.rs.



+395 Profil

icon Re: Definisanje strukutre u header fajlu28.03.2012. u 12:06 - pre 147 meseci
Probao i kompajlira se sa msvc kompajlerom . Sto ne stavis to kao static varijablu i X i nizX u header fajl i proci ce sigurno ?


header.h

Code:
 
#pragma once  

struct X {
    int a;
    int b;
};

 static X nizX[] = {
        {
           1,
           2,
        },
        {
           3,
           4,
        },
        {
           5,
           6,
        },
 } ; 



[Ovu poruku je menjao deerbeer dana 28.03.2012. u 13:25 GMT+1]
Viva lollapalooza
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.dynamic.sbb.rs.



+395 Profil

icon Re: Definisanje strukutre u header fajlu28.03.2012. u 12:24 - pre 147 meseci
Eh radi sa extern samo je bila mala zabuna
Kad si napisao :
Code:

extern X nizX [] ;  

Ti si ustvari deklarisao niz nizova od X i nije znao njegovu velicinu

Ako stavis :
Code:

extern X nizX ;  

On vec zna da je to niz koji je inicijalizovan i ne treba mu [] bas onako kako je @milanche napisao ..




Viva lollapalooza
 
Odgovor na temu

Texas Instruments

Član broj: 227540
Poruke: 272
*.amres.ac.rs.



+61 Profil

icon Re: Definisanje strukutre u header fajlu28.03.2012. u 12:38 - pre 147 meseci
Hajde iskopiraj tačno po fajlovima kako ti je definisano, pošto sad ne znam tačno šta si koristio. I druga stvar, msvc možda i radi, ali ovo treba da radi sa gcc-om, pošto je ovo program za neki MCU. ;)
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.dynamic.sbb.rs.



+395 Profil

icon Re: Definisanje strukutre u header fajlu28.03.2012. u 12:53 - pre 147 meseci
header.h
Code:

#pragma once  
 struct X {
    int a;
    int b;
};


header.c
Code:

#include "header.h" 
 X nizX[] = {
        {
           1,
           2,
        },
        {
           3,
           4,
        },
        {
           5,
           6,
        },
};


u bilo kom *.c ili cpp

Code:

#include "header.h"  

extern X nizX ; 

for (i = 0; i < sizeof(nizX)/sizeof(X); i++) {
     printf("%d %d\n", nizX[i].a, nizX[i].b);
}



Viva lollapalooza
 
Odgovor na temu

Texas Instruments

Član broj: 227540
Poruke: 272
*.amres.ac.rs.



+61 Profil

icon Re: Definisanje strukutre u header fajlu28.03.2012. u 13:22 - pre 147 meseci
Veruj mi, ovo ne radi. Možda prolazi sa msvc-om, ali sa gcc-om ne može.
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.dynamic.sbb.rs.



+395 Profil

icon Re: Definisanje strukutre u header fajlu28.03.2012. u 13:24 - pre 147 meseci
Ista greska (sizeof operator) ili nesto drugo ?

Viva lollapalooza
 
Odgovor na temu

Texas Instruments

Član broj: 227540
Poruke: 272
*.amres.ac.rs.



+61 Profil

icon Re: Definisanje strukutre u header fajlu28.03.2012. u 13:34 - pre 147 meseci
Sad sam probao i sa msvc-om da se uverim da radi kao što si napisao i ne može.
Code:

error C2061: syntax error : identifier 'nizX'
error C2059: syntax error : ';'
error C2065: 'nizX' : undeclared identifier
error C2065: 'X' : undeclared identifier

itd...


gcc se buni kod linije X nizX[] = { u header.c
Code:


Description    Resource    Path    Location    Type
expected '=', ',', ';', 'asm' or '__attribute__' before 'nizX'    header.c    /strukutra2/src    line 10    C/C++ Problem


Ne znam kako tebi to prolazi?
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.dynamic.sbb.rs.



+395 Profil

icon Re: Definisanje strukutre u header fajlu28.03.2012. u 14:10 - pre 147 meseci
Hmm .. u pravi si izgleda printf ne radi tj. u kodu ne mozes koristiti [] operator jer extern nije definisan tako .
Ali ako si u debug vidi taj niz bez problema ...bas cudno .

Ja sam prvo bez njega kompajlirao misleci da je problem u sizeof-u pa je taj deo bio slucajno iskomentarisan .




Evo i projekta
Viva lollapalooza
Prikačeni fajlovi
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.dynamic.sbb.rs.



+395 Profil

icon Re: Definisanje strukutre u header fajlu28.03.2012. u 14:37 - pre 147 meseci
Ono sto je zaobilazno resenje je da u header.c fajlu definises metode koje pristupaju nizu pa ti prakticno extern ni ne treba:
Dakle :

Code:
 
#pragma once  
 struct X {
    int a;
    int b;
};


X* getValue (int index ) ; 
int size () ; 





Code:

#include "header.h" 

struct X nizX[] = {
        {
           1,
           2,
        },
        {
           3,
           4,
        },
        {
           5,
           6,
        },
};


X* getX (int index ) 
{
    return &nizX[index] ; 
}

int size () 
{
    return sizeof (nizX) / sizeof(X) ; 
}



U kodu :

Code:

for (int i = 0; i < size();  i++) {
   
    printf("%d %d\n", getX(i)->a, getX(i)->b); 
        
}


Cak ni ovaj prethodni primer sa sizeof nije radio a debugu prikazuje sve lepo :)


BTW Ako kompajliras u vs2010 i za header.c fajl moras staviti u properties da se compile as (C++) kod.
Za Default ne prolazi. Ako nemas potrebe za c fajlovima koristi cpp extenizije i radice ti sa default .



[Ovu poruku je menjao deerbeer dana 28.03.2012. u 15:49 GMT+1]

[Ovu poruku je menjao deerbeer dana 28.03.2012. u 15:52 GMT+1]
Viva lollapalooza
 
Odgovor na temu

[es] :: C/C++ programiranje :: Definisanje strukutre u header fajlu

Strane: 1 2

[ Pregleda: 4421 | Odgovora: 22 ] > FB > Twit

Postavi temu Odgovori

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