Строки и указатели в программной памяти (WinAVR)
Использую вот такую функцию:
extern void PrintString (u08 *p, u08 SX, u08 SY); // указатель на строку и масштаб
Так объявил строку:
u08 __attribute__ ((progmem)) Vovka[]={ "Vovka The Best"};
При вызове таким образом:
PrintString(&Vovka,2,4);
Получаю 2 ошибки
uart.h:36: warning: passing arg 1 of `PrintString' from incompatible pointer type
uart.h:37: warning: passing arg 1 of `PrintString' discards qualifiers from pointer target type
Для устранения warning объявил указатель:
void *ptrString;
и вызываю функцию так:
ptrString=&Vovka;
PrintString(ptrString,2,4); // указатель на строку и масштаб
Компилируется и работает без ошибок.
Но хочется сделать правильно и понять, как объявлять строки и указатели.
Решил использовать макрос PSTR.
Раньше использовал его так:
// Объявление функции
void dbgString(const char *addr)
{
char c;
while ((c=PRG_RDB(addr++))) UART1_SendByte(c);
}
// Вызов функции с передачей указателя
dbgString(PSTR("\nStart OK"));
Переобъявил функцию и строку:
extern void PrintString_P(const char *p, u08 SX, u08 SY);
extern const char Vovka[];
Вызов как в примере PrintString_P(PSTR("FOO"),2,4);
Работает корректно.
Такой вызов вызывает ошибку:
PrintString_P(&Vovka,2,4);
uart.h:32: warning: passing arg 1 of `PrintString_P' from incompatible pointer type
Залез в pgmspace.h посмотрел на макрос
#define PSTR(s) ({static char __c[] PROGMEM = (s); __c;})
покрутил:
const char Vovka[]={"Vovka The Best"};
const char Vovka[] PROGMEM=("Vovka The Best");
static char Vovka[]={"Vovka The Best"};
Не получается :-(
uart.h:32: warning: passing arg 1 of `PrintString_P' from incompatible pointer type
Где выход из трех сосен? :-)
Спасибо.
-
- PrintString_P(Vovka,2,4); // :-) - vet2(04.01.2006 13:10,
)
- А ларчик просто открывался! :-) - misyachniy(04.01.2006 13:54,
)
- А ларчик просто открывался! :-) - misyachniy(04.01.2006 13:54,
- PrintString_P(Vovka,2,4); // :-) - vet2(04.01.2006 13:10,