[C] Deklaracja nowego typu wyliczeniowego...

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
spark
Użytkownik
Posty: 412
Rejestracja: 25 lis 2004, 15:50
Lokalizacja: Wrocław

[C] Deklaracja nowego typu wyliczeniowego...

Post autor: spark » 14 paź 2008, 17:04

Witam,

Korzystając z środowiska programistycznego WinAVR spróbowałem napisać dla mikrokontrolerów AVR taki oto prosty skrypt:

Kod: Zaznacz cały

#include <avr/io.h>

#define numLED	10

enum NColors { RED, GREEN, BLUE, YELLOW, PURPLE, CYAN, WHITE, EMPTY, UNDEFINED };

NColors tabColors[numLED];

int main(void)
{
	for(;;)
	{
	}

	return 0;
}
Wygląda na to że składniowo wszystko jest ok, choć mogę się mylić, za to kompilator buntuje się wysyłając komunikat:
AVR-GCC pisze:main.c:14: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'tabColors'
Wykomentowanie deklaracji tablicy tabColors pozwala na poprawną kompilację algorytmu...
Czy ktoś podejrzewa co może być przyczyną błędu?

Pozdrawiam,
Spark

Awatar użytkownika
edwacc
Użytkownik
Posty: 163
Rejestracja: 14 paź 2008, 10:19
Lokalizacja: świętokrzyskie knieje

Post autor: edwacc » 14 paź 2008, 17:25

sprobuj z takim kodem:

Kod: Zaznacz cały

#include <avr/io.h>

#define numLED    10

enum NColors { RED, GREEN, BLUE, YELLOW, PURPLE, CYAN, WHITE, EMPTY, UNDEFINED };

enum NColors tabColors[numLED];

int main(void)
{
    for(;;)
    {
    }

    return 0;
}

spark
Użytkownik
Posty: 412
Rejestracja: 25 lis 2004, 15:50
Lokalizacja: Wrocław

Post autor: spark » 14 paź 2008, 17:36

Dzięki, kompilator to łyknął. Powinno już działać ale z drugiej strony dziwna jest ta deklaracja, zupełnie niepodobna do 'standardowej' wykorzystywanej w języku C. Czy wiesz może co jest tego przyczyną i dlaczego należy ją poprzedzać słowem kluczowym enum?

Awatar użytkownika
edwacc
Użytkownik
Posty: 163
Rejestracja: 14 paź 2008, 10:19
Lokalizacja: świętokrzyskie knieje

Post autor: edwacc » 14 paź 2008, 18:54

Nie myl C z C++, standardowo w C należy poprzedzać zmienną typu enum słowem kluczowym 'enum', podobnie jak struktury 'struct'. Mozna to sprowadzic do 'normalnosci' stosujac slowo kluczowe 'typedef'.

spark
Użytkownik
Posty: 412
Rejestracja: 25 lis 2004, 15:50
Lokalizacja: Wrocław

Post autor: spark » 14 paź 2008, 19:30

hmm... czyli jesl dobrze rozumiem znaczy to, że pisząc w języku C++ nie będzie ode mnie wymagane poprzedzania słów kluczowych w tego typu deklaracjach?
Przyznam się, że sam siebie wprowadziłem nieco w błąd, gdyż lojalnie wierzyłem, że C++ jest bogatsza od C tylko w obiekty, a deklaracje są podobne w obu przypadkach zgodnie z ideą kompatybilności C z C++ w 99%.
Zauważyłem zresztą, że literatura dostępna na rynku rzadko zwraca uwagę czytelnikowi czy dane zagadnienie tyczy się czysto C czy też może jest gdzieś tam przemycony C++.

Czyli aby powrócić do 'normalności' w zapisie musiałbym dodać do programu poniższe linie:

Kod: Zaznacz cały

typedef enum NColors NC;
NC tabColors[numLED];
I one w całości rozwiązują ten problem dla tego właśnie konkretnego typu wyliczeniowego?

Awatar użytkownika
edwacc
Użytkownik
Posty: 163
Rejestracja: 14 paź 2008, 10:19
Lokalizacja: świętokrzyskie knieje

Post autor: edwacc » 14 paź 2008, 19:53

Spark89 pisze: Czyli aby powrócić do 'normalności' w zapisie musiałbym dodać do programu poniższe linie:

Kod: Zaznacz cały

typedef enum NColors NC;
NC tabColors[numLED];
I one w całości rozwiązują ten problem dla tego właśnie konkretnego typu wyliczeniowego?
tak, w ten sposób zdefiniujesz nowy typ, którego możesz 'używać' bez słowa kluczowego 'enum':

Kod: Zaznacz cały

#include <avr/io.h>

#define numLED    10

enum NColors { RED, GREEN, BLUE, YELLOW, PURPLE, CYAN, WHITE, EMPTY, UNDEFINED };

typedef enum NColors TNColors;

TNColors tabColors[numLED];

int main(void)
{
    for(;;)
    {
    }

    return 0;
}

spark
Użytkownik
Posty: 412
Rejestracja: 25 lis 2004, 15:50
Lokalizacja: Wrocław

Post autor: spark » 14 paź 2008, 19:55

Ah! No to teraz wszystko jasne. Dziękuję Ci bardzo za pomoc i pozdrawiam!

ODPOWIEDZ