RTV forum PL | NewsGroups PL

Jak w C zdefiniować tablicę char z dynamicznie zmiennym znakiem z #define?

[Podstawy C] Inicjalizacja zmiennych CHAR wartością zależną

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Jak w C zdefiniować tablicę char z dynamicznie zmiennym znakiem z #define?

Konop
Guest

Sat Oct 31, 2009 2:50 am   



Witam!!

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

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 Sad... 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ć Smile...
a może w ogóle się tego nie da zrobić??

Pozdrawiam
Konop

Artur M. Piwko
Guest

Sat Oct 31, 2009 7:51 am   



In the darkest hour on Sat, 31 Oct 2009 02:50:00 +0100,
Konop <konoppo@gazeta.pl> screamed:
Quote:
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

Najprościej #define MOJ_ZNAK "1"

Quote:
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...


Teraz zadziała.

--
[ Artur M. Piwko : Pipen : AMP29-RIPE : RLU:100918 : From == Trap! : SIG:238B ]
[ 07:50:27 user up 12242 days, 19:45, 1 user, load average: 0.99, 0.98, 0.40 ]

Insanity is hereditary: You can get it from your children. -- Sam Levinson

Zbych
Guest

Sat Oct 31, 2009 11:51 am   



Konop pisze:

Quote:
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";

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

Quote:
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

#define MOJ_ZNAK "\1"

char aqq[] = "ABC" MOJ_ZNAK;

Artur M. Piwko
Guest

Sat Oct 31, 2009 12:18 pm   



In the darkest hour on Sat, 31 Oct 2009 11:51:42 +0100,
Zbych <zbych@onet.pl> screamed:
Quote:
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

#define MOJ_ZNAK "\1"

char aqq[] = "ABC" MOJ_ZNAK;

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"

--
[ Artur M. Piwko : Pipen : AMP29-RIPE : RLU:100918 : From == Trap! : SIG:230B ]
[ 12:16:57 user up 12242 days, 0:11, 1 user, load average: 0.99, 0.98, 0.40 ]

Just because I don't care doesn't meant I don't understand.

Konop
Guest

Sat Oct 31, 2009 2:19 pm   



Quote:
Najprościej #define MOJ_ZNAK "\1"
Teraz zadziała.

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 Sad... czyli wychodzi na to, że i tak muszę
mieć dwa define'y Wink... jeden do wstawiania do napisów, drugi do użycia
jako pojedynczy znak. Czy da się to może jakoś pogodzić??

Pozdrawiam
Konop

Zbych
Guest

Sat Oct 31, 2009 2:29 pm   



Artur M. Piwko pisze:

Quote:
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"


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

Piotr Gałka
Guest

Sat Oct 31, 2009 2:30 pm   



Użytkownik "Konop" <konoppo@gazeta.pl> napisał w wiadomości
news:hchdh2$10c$1@inews.gazeta.pl...
Quote:
Czy da się to może jakoś pogodzić??

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

P.G.

Konop
Guest

Sat Oct 31, 2009 2:49 pm   



Piotr Gałka pisze:
Quote:

Użytkownik "Konop" <konoppo@gazeta.pl> napisał w wiadomości
news:hchdh2$10c$1@inews.gazeta.pl...
Czy da się to może jakoś pogodzić??

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

Fakt, tak działa Smile.. Dzięki za informację, na pewno się przyda czasami
Smile 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

Adam Dybkowski
Guest

Sat Oct 31, 2009 7:18 pm   



Konop pisze:

Quote:
#define ZNAK 1
char txt[]={'A','l','a',ZNAK,0};

Fakt, tak działa Smile.. Dzięki za informację, na pewno się przyda czasami
Smile 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"

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).

--
Adam Dybkowski
http://dybkowski.net/

Uwaga: przed wysłaniem do mnie maila usuń cyfry z adresu.

Zbych
Guest

Sat Oct 31, 2009 8:45 pm   



Adam Dybkowski pisze:

Quote:
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).

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

Konop
Guest

Sat Oct 31, 2009 11:31 pm   



Zbych pisze:
Quote:
Adam Dybkowski 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).

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

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

Pozdrawiam
Konop

Artur M. Piwko
Guest

Mon Nov 02, 2009 8:08 am   



In the darkest hour on Sat, 31 Oct 2009 14:29:00 +0100,
Zbych <zbych@onet.pl> screamed:
Quote:
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"

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

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.

--
[ Artur M. Piwko : Pipen : AMP29-RIPE : RLU:100918 : From == Trap! : SIG:232B ]
[ 08:07:26 user up 12244 days, 20:02, 1 user, load average: 0.90, 0.98, 0.59 ]

If dolphins are so smart, why did Flipper work for television?

Pszemol
Guest

Fri Nov 06, 2009 7:13 pm   



"Konop" <konoppo@gazeta.pl> wrote in message
news:hchdh2$10c$1@inews.gazeta.pl...
Quote:
Najprościej #define MOJ_ZNAK "\1"
Teraz zadziała.

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 Sad... czyli wychodzi na to, że i tak muszę
mieć dwa define'y Wink... jeden do wstawiania do napisów, drugi do użycia
jako pojedynczy znak. Czy da się to może jakoś pogodzić??

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.

elektroda NewsGroups Forum Index - Elektronika Polska - Jak w C zdefiniować tablicę char z dynamicznie zmiennym znakiem z #define?

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map