#define w bibliotekach

Odpowiedz Nowy wątek
2011-10-06 19:26
0

Witam,
chciałbym w pliku nagłówkowym zapisać stałą #definie i używać jej w pliku c, jednak występuje błąd.

main.c:
//------------------------------------------------------------------------------
#include <avr/io.h>

#include "lib.h"

int main(void)
{
    while(1)
    {
        //TODO:: Please write your application code 
    }
}
//------------------------------------------------------------------------------

lib.h:
//------------------------------------------------------------------------------
#ifndef LIB_H_
#define LIB_H_

#define PORT PORTA

void funkcja(void);

#endif /* LIB_H_ */
//------------------------------------------------------------------------------

lib.c:
//------------------------------------------------------------------------------
void funkcja(void)
{
    PORT = 23;
}
//------------------------------------------------------------------------------

Podczas kompilacji wyskakuje błąd:

Error   1   'PORT' undeclared (first use in this function)  C:\Users\xxx\Documents\AVRStudio\AVRGCC2\AVRGCC2\lib.c
Error   2   each undeclared identifier is reported only once for each function it appears in    C:\Users\xxx\Documents\AVRStudio\AVRGCC2\AVRGCC2\lib.c

Błąd znika kiedy dodam #include "lib.h" do lib.c, jednak wydaje mi się iż dodawanie własnego pliku nagłówkowego jest dziwne przynajmniej, szczególnie kiedy przeczytałem że #definie powinny znajdywać się w plikach h (http://cpp0x.pl/kursy/Kurs-C+[...]a-kilka-plikow-zrodlowych/310).

Korzystam z Atmel AVR Studio 5 (Version: 5.0.1163)
AVR GCC 8-bit Toolchain
Version: gcc version 4.5.1 (AVR_8_bit_GNU_Toolchain_3.2.3_315)

Taki include przed którym się bronisz jest jak najbardziej naturalny. - vpiotr 2011-10-06 19:48

Pozostało 580 znaków

2011-10-06 19:36

w c/c++ #define'a możesz sobie wsadzić i wewnątrz .c/.cpp (nawet wewnątrz funkcji).
Tutaj masz błędy takiego typu:
1)NIGDZIE nie ma tej dyrektywy #define PORT 23
2)Poczytaj jak działają makra,bo operacja PORT=23 to nie pójdzie-port NIE JEST zmienną,tylko makrem którego wystąpienia w kodzie zostaną zastąpione na pałę tekstem znajdującym się po spacji tuż przed kompilacją(w moim przypadku będzie to 23);


"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]
edytowany 1x, ostatnio: MasterBLB, 2011-10-06 19:37

Pozostało 580 znaków

2011-10-06 19:46
0

Dzięki, miałem jednak nadzieje że makra dołączane są tak jak zmienne, funkcje.

Pozostało 580 znaków

2011-10-06 20:44
0

Ależ są:
plik.h

#define PORT 23

plik.c

#include "plik.h"

void someFunction(void)
{
    setPortNumber(PORT);//a jej deklaracja to void setPortNumber(int portNumber);
}

"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]
edytowany 1x, ostatnio: MasterBLB, 2011-10-06 20:46

Pozostało 580 znaków

2011-10-06 21:17
0

Poczytaj jak działają makra,bo operacja PORT=23 to nie pójdzie-port NIE JEST zmienną,tylko makrem którego wystąpienia w kodzie zostaną zastąpione na pałę tekstem znajdującym się po spacji tuż przed kompilacją(w moim przypadku będzie to 23);

to akurat dobrze robi, PORTA jest rejestrem procesora AVR, a pytający chce sobie „zmienić nazwę” na po prostu PORT. tak to przynajmniej zrozumiałem.
jedyne czego brakowało to właśnie tego #include "lib.h" w lib.c

edytowany 3x, ostatnio: Azarien, 2011-10-06 21:19

Pozostało 580 znaków

2011-10-06 22:45
0

a plik lib.h nie bedzie w takim przypadku dwa razy włączony do kompilacji?

main.c -> lib.h
           |
           +-> lib.c -> lib.h
edytowany 1x, ostatnio: cys_ek, 2011-10-06 22:45
Poczytaj o dyrektywach preprocesora, szczególnie o #ifndef, #define i #endif - stfu 2011-10-06 22:56

Pozostało 580 znaków

2011-10-07 07:59
0

właśnie dlatego używa się tego

#ifndef LIB_H_
#define LIB_H_
cała treść pliku
#endif

za pierwszym inkludem LIB_H_ nie jest zdefiniowane, więc zostaje zdefiniowane i cała treść pliku wchodzi. za drugim LIB_H_ jest już zdefiniowane, więc cała treść pliku jest przeskakiwana.

edytowany 2x, ostatnio: Azarien, 2011-10-07 08:05

Pozostało 580 znaków

2011-10-07 14:58
0

Kompilacja wygląda raczej tak:

main.c -> lib.h -> main.obj
lib.c -> lib.h -> lib.obj

a potem linker: main.exe -> lib.obj + main.obj

Szacuje się, że w Polsce brakuje 50 tys. programistów
edytowany 1x, ostatnio: vpiotr, 2011-10-07 15:01

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0