[Podstawy C] Inicjalizacja zmiennych

Witam!!

Pytanie dotyczy podstaw C, ale do zastosowania w GCC dla AVRów ;)...

Chodzi mi o przypisanie "startowej" wartości dla tablich charow...

Zapis typu: unsigned char[] = "ABC1"; działa poprawnie... jeśli chcę zastąpić znak '1' *znakiem* *o* *kodzie*

1 zrobię to tak: unsigned char[] = "ABC/1"; i też wszystko będzie działało!! Mogę nawet zrobić tak: unsigned char[] = "ABC" "/1"; i też będzie dobrze... ale ponieważ ta wartość /1 się zmieniać może w poszczególnych kompilacjach, chciałbym to zrobić tak:

#define MOJ_ZNAK 1 unsigned char[] = "ABC ..... i właśnie - jak dokończyć tę linię aby wstawić w nią znak o kodzie 1 używając słowa MOJ_ZNAK? Tak, aby zmiania definicji zmieniła też zawartość tej zmiennej... Próbowałem tak: unsigned char[] = "ABC" MOJ_ZNAK ale niestety nie działa... różnych cudów próbowałem i nic...

Zastosowanie - znaki specjalne na wyświetlaczu LCD.

Przepraszam, za pytanie trochę OT i bardzo bardzo nie na poziomie... ale nie potrafię spytać googla tak, aby odpowiedział właściwie :(... dostaję z reguły odpowiedzi na poziomie przypisania "ABC1" itp... przypomnieć sobie też nie potrafię, metoda prób i błędów także nie zdała egzaminu. Boję się, że to jakaś przypadłość GCC, dlatego wolę tutaj zapytać :)... a może w ogóle się tego nie da zrobić??

Pozdrawiam Konop

Reply to
Konop
Loading thread data ...

In the darkest hour on Sat, 31 Oct 2009 02:50:00 +0100, Konop snipped-for-privacy@gazeta.pl screamed:

Najprościej #define MOJ_ZNAK "1"

Teraz zadziała.

Reply to
Artur M. Piwko

Konop pisze:

Ukośnik powinien być w drugą stronę.

#define MOJ_ZNAK "\1"

char aqq[] = "ABC" MOJ_ZNAK;

Reply to
Zbych

In the darkest hour on Sat, 31 Oct 2009 11:51:42 +0100, Zbych snipped-for-privacy@onet.pl screamed:

Przy okazji, trochę to niebezpieczne... Za chwilkę może chcieć dodać cokolwiek po \1 i okaże się, że od czasu do czasu trafi na to miejsce jakaś cyfra.

Lepiej od razu:

#define MOJ_ZNAK "\x01"

Reply to
Artur M. Piwko

Racja, dzięki za uwagi. Tego nie sprawdzałem z innego względu... część znaków używam w ten sposób: unsigned char ch;

ch = MOJ_ZNAK;

No i teraz to już nie działa :(... czyli wychodzi na to, że i tak muszę mieć dwa define'y ;)... jeden do wstawiania do napisów, drugi do użycia jako pojedynczy znak. Czy da się to może jakoś pogodzić??

Pozdrawiam Konop

Reply to
Konop

Artur M. Piwko pisze:

Nie ma takiej potrzeby jeśli teksty są rozdzielone cudzysłowami.

Reply to
Zbych

Użytkownik "Konop" snipped-for-privacy@gazeta.pl napisał w wiadomości news:hchdh2$10c$ snipped-for-privacy@inews.gazeta.pl...

A może tak: #define ZNAK 1 char txt[]={'A','l','a',ZNAK,0};

P.G.

Reply to
Piotr Gałka

Piotr Gałka pisze:

Fakt, tak działa :).. Dzięki za informację, na pewno się przyda czasami :) tyle tylko, że trochę upierdliwie się to wpisuje, bo każdy znak trzeba w osobnym ' '... i o to mi właśnie chodzi - czy da się połączyć " " z ' ' ?? Bo jak chcę zrobić parę napisów, z których każdy ma kilkanaście, bądź kilkadziesiąt znaków i w środku wstawić jeden znak specjalny, to już wolę zrobić to tak:

#define MOJ_ZNAK '\1' #define MOJ_ZNAK_INIT "\1"

unsigned char txt[] = "Jakis tekst" MOJ_ZNAK_INIT "inny tekst"; unsigned char ch; ch = MOJ_ZNAK;

Pozdrawiam Konop

Reply to
Konop

Konop pisze:

Wykorzystaj operator # zamieniający identyfikator na ciąg znaków. Zobacz w helpie do języka C (a dokładniej mówiąc do preprocesora).

Reply to
Adam Dybkowski

Adam Dybkowski pisze:

# mu nie pomoże, bo on chce mieć znak o kodzie 1, a nie 1 ascii (0x31).

Reply to
Zbych

Zbych pisze:

Ehhh, a ja ambitnie sam chciałem dojść do tego jak użyć tego #... no ale nic mi nie wyszło ;)... efekt był taki, jakiego można się było spodziewać - zamiast znaku numer 1 uzyskalem napis MOJ_ZNAK na LCD ;)...

Pozdrawiam Konop

Reply to
Konop

In the darkest hour on Sat, 31 Oct 2009 14:29:00 +0100, Zbych snipped-for-privacy@onet.pl screamed:

Jest, jeśli będzie chciał dać w tym #define. Może nie w tym przypadku, ale jeśli tego typu regułę zastosuje później w innym miejscu.

Reply to
Artur M. Piwko

Da się.

Masz

#define MOJ_ZNAK "\1"

I możesz potem zrobić tak:

ch = MOJ_ZNAK[0];

Zwróć uwagę że zapis "/1" w języku C oznacza faktycznie tablicę typu "const char[2]". Pierwszym znakiem jest /1 a drugim zero (ASCIIZ). Zapis ch = MOJ_ZNAK[0]; preprocesor rozwinie według Twojego #define i kompilator to zobaczy jako:

ch = "/1"[0];

i nie powinien mieć problemów, mimo iż to może dziwnie wyglądać :-)

Zaletą takiego rozwiązania jest pojedynczy #define.

Reply to
Pszemol

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.