Przesyłanie tekstu do funkcji w C i argument funkcji.

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
slawek55
Użytkownik
Posty: 484
Rejestracja: 16 sie 2005, 11:47
Lokalizacja: Szczecin

Przesyłanie tekstu do funkcji w C i argument funkcji.

Post autor: slawek55 » 09 lis 2007, 6:54

Cześć.
Powiedzcie mi taką rzecz bo juz tego nie rozumiem.
Powiedzmy że mam funkcję napisaną w AVR-GCC wyświetlającą na LCD tekst.

deklaruję sobie np cos takiego

Kod: Zaznacz cały

void lcd_p(const prog_char *ptr)
{
char a;
while((a=pgm_read_byte(ptr++)))LCD_Data(a);
}
wywołuje ją poprzez

Kod: Zaznacz cały

lcd_p(PSTR("jakiś tekst na lcd"));

dlaczego nie ma róznicy w definicji funkcji a dokładniej w jej parapetrze ptr jak napiszę zamiast powyższczego takie coś:

Kod: Zaznacz cały

void lcd_p(const char *ptr)
{
char a;
..........
Czyli zamiast prog_char napiszę char.
W ogóle tego nie rozumiem. raz jest tak a raz tak, czy jest jakaś reguła na to?

Awatar użytkownika
Koppel
Użytkownik
Posty: 500
Rejestracja: 24 lip 2005, 18:05
Lokalizacja: Gliwice

Post autor: Koppel » 09 lis 2007, 11:18

W praktyce to nie ma wielkiego znaczenia czy jako parametr funkcji podamy prog_char *str czy char *str. W obu przypadkach będą to 16-bitowe zmienne wskazujące na początek łańcucha znaków w pamięci. Najważniejsze jest że zarówno prog_char jak i char mają ten sam rozmiar (jeden bajt). W AVR-GCC rozróżnienia pomiędzy zmiennymi w pamięci programu a w pamięci danych dokonujemy przez inny sposób odczytywania takich obiektów.

Ze względu na czytelność zapisu jednak korzystniej jest używać w tym przypadku wskaźnika na prog_char.

slawek55
Użytkownik
Posty: 484
Rejestracja: 16 sie 2005, 11:47
Lokalizacja: Szczecin

Post autor: slawek55 » 09 lis 2007, 12:22

Mam jakby przy okazji pytanie.
Dlaczego w czasie przesyłania tekstu do np funkcji lcd_text jest używane rzutowanie np

Kod: Zaznacz cały

lcd_text((prog_char*)PSTR("jakis tekst"));
zamiast uzywać takiej składni funkcji i pzbyc sie rzutowania

Kod: Zaznacz cały

void lcd_text(const prog_char *ptr)
{ ...
i wywołanie wtedy jest typu:

Kod: Zaznacz cały

lcd_text(PSTR("tekst"));
Chyba że jest inny powód takiego zapisu o którym nie wiem

[ Dodano: 2007-11-10, 07:08 ]
Przeprowadziłem sobie próby z użyciem zmiennej prog_char (chodzi o typ prog) i tego już nie rozumiem w ogóle.
Jeśli zadeklarowałem zmienną

Kod: Zaznacz cały

prog_char data;
wewnatrz funkcji main to sledząc tą zmienną okazało się że został jej przydzielony rejestr R24.
Natomiast jak to samo napisałem przed main to pojawił się błąd (zrozumiały)
error: assignment of read-only variable `data'

Nie rozumiem dlaczego tak się dzieje przy komilacji?
Mogę prosić o pomoc i wyjaśnienie

ODPOWIEDZ