Строки и указатели в программной памяти (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, )
- PrintString_P(Vovka,2,4); // :-) - vet2(04.01.2006 13:10, )