|
указатель на тип void, попытки создать общую функцию |
|
|
|
Jan 3 2006, 13:06
|
Местный
  
Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064

|
Всех с наступившим!!! Решил написать функцию вывода строки в массив да так чтобы можно было эту строку брать как из SRAM так и из FLASH а поскольку указатели на FLASH и SRAM это разные вещи, то и типы указателей должны быть разные. решил сделать тип void чтобы тип можно было задать при вызове функции с приведением типа. вот код функции Код void LCDString(unsigned char StrNum, unsigned char StrPos, void *pStr) { unsigned char i, c; i = StrPos; c = *((char*)pStr++); while ((i < SYM_STR-2) && (c != 0x00)) { LCDStr[StrNum][i] = c; c = *((char*)pStr++); i++; } } прблема в том что компилятор не может сделать ++ для указателя типа void. если создать отдельную переменную типа char *pS; то все нормально. т.о. вопрос ? как сделать ++ указателю типа void без отдельной переменной, если возможно. И еще вопрос. Если нужен передавать параметр типа bool то можно как-то использовать #if #endif т.е. напрмер Код strcpy(char *pStr, bool S_F) { #if S_F // если передан указатель на FLASH flashcpy() #else Sramcpy() #endif } или может так : Код strcpy(char *pStr) { #ifdef S_F flashcpy() #else Sramcpy() #endif } а вызов функции делать так
#define S_F strcpy(*pStr) #undef S_F Есть еще вариант передавать два указателя, для Flash и SRAM и ненужный передавать 0 Или может еще каким образом поступают при такой задаче, просьба поделиться опытом ...
|
|
|
|
|
 |
Ответов
|
Jan 3 2006, 16:12
|
Профессионал
    
Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528

|
Цитата(&-rey @ Jan 3 2006, 19:06)  Всех с наступившим!!! Решил написать функцию вывода строки в массив да так чтобы можно было эту строку брать как из SRAM так и из FLASH а поскольку указатели на FLASH и SRAM это разные вещи, то и типы указателей должны быть разные. решил сделать тип void чтобы тип можно было задать при вызове функции с приведением типа. А компилятор какой? У IAR для AVR есть модификатор __generic для указателей. Код void LCDString(unsigned char StrNum, unsigned char StrPos, __generic char *pStr) и передавайте в эту функцию хоть char*, хоть __flash char*, компилятор разберётся (и сделает необходимые преобразования типов при передаче параметров). Цитата прблема в том что компилятор не может сделать ++ для указателя типа void. если создать отдельную переменную типа char *pS; то все нормально.
т.о. вопрос ? как сделать ++ указателю типа void без отдельной переменной, если возможно. возможно: Код c = *(char*)(pStr=(char*)pStr+1); Впрочем, ничего страшного в использовании отдельной (auto) переменной нет - на то есть оптимизация. Если эта переменная нигде больше не используется то и память под неё не будет выделяться, а регистры для вычислений (++) в любом случае будут использоваться. Можно немного помочь оптимизатору указав для этой переменной модификатор register. Цитата И еще вопрос. Если нужен передавать параметр типа bool то можно как-то использовать #if #endif Все директивы препроцессора (которые с #) обрабатываются ещё _до_ компиляции. С помощью #if, #ifdef и т.п. можно выбрать какой кусок текста будет компилироваться а какой - нет, но эти директивы обрабатывает именно препроцессор, на вход собственно компилятору попадает _текст_ после препроцессора, т.е. в данном примере или строка flashcpy() или Sramcpy().
Сообщение отредактировал SSerge - Jan 3 2006, 16:14
--------------------
Russia est omnis divisa in partes octo.
|
|
|
|
|
Jan 3 2006, 16:27
|
Местный
  
Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064

|
Цитата(SSerge @ Jan 3 2006, 20:12)  А компилятор какой? У IAR для AVR есть модификатор __generic для указателей. Код void LCDString(unsigned char StrNum, unsigned char StrPos, __generic char *pStr) и передавайте в эту функцию хоть char*, хоть __flash char*, компилятор разберётся (и сделает необходимые преобразования типов при передаче параметров). Да компилятор IAR, постоянно забываю указывать  Цитата возможно: Код c = *(char*)(pStr=(char*)pStr+1); так действительно работает, Спасибо. Цитата Все директивы препроцессора (которые с #) обрабатываются ещё _до_ компиляции. С помощью #if, Это я понимаю, меня как раз это и интересовало, чтобы код генерил препроцессор в зависимости от моих указаний. но вариант с __generic мне больше подходит.
|
|
|
|
|
Jan 3 2006, 17:08
|
Профессионал
    
Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528

|
Цитата(&-rey @ Jan 3 2006, 22:27)  Цитата(SSerge @ Jan 3 2006, 20:12)  возможно: Код c = *(char*)(pStr=(char*)pStr+1); так действительно работает, Спасибо. Тут я малость промахнулся, это аналог *++pStr а не *pStr++ как требовалось. Нуууу..., тогда так Код c = (char*)(pStr=(char*)pStr+1)[-1]; Но это уже натуральнейшее хакерство и должно выжигаться калёным железом... Уж лучше промежуточную переменную объявить.
--------------------
Russia est omnis divisa in partes octo.
|
|
|
|
|
Jan 4 2006, 07:38
|
Местный
  
Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064

|
Цитата(SSerge @ Jan 3 2006, 21:08)  Код c = (char*)(pStr=(char*)pStr+1)[-1]; Но это уже натуральнейшее хакерство и должно выжигаться калёным железом... Уж лучше промежуточную переменную объявить. Спасибо SSerge за обяснения, мне как раз это счас очень нужно для понимания процесса. а что такое [-1] ? обещаю что никогда не применю это знание во вред  )) вот что получено в результате: Код void LCDString(unsigned char StrNum, unsigned char StrPos, unsigned char __generic *pStr) { // Таблица перевода русских ASCI и псевдографики в коды ЖКИ __flash static unsigned char RusConvTbl[] = { // Псевдографика (коды от 0x80 до 0xBF) }; unsigned char *pLCDStr, c; pLCDStr = LCDStr[StrNum] + StrPos; c = *(pStr++); while ((StrPos++ < SYM_STR-2) && (c != 0x00)) { *pLCDStr++ = c; if (c < 0x80) *pLCDStr++ = c; else *pLCDStr++ = RusConvTbl[c - 0x80]; c = *(pStr++); } }
|
|
|
|
Сообщений в этой теме
&-rey указатель на тип void Jan 3 2006, 13:06 IgorKossak Всё, что Вы хотите легко реализуется перегружаемым... Jan 3 2006, 14:15 &-rey Цитата(IgorKossak @ Jan 3 2006, 18:15) Вс... Jan 3 2006, 14:26  prottoss Цитата(&-rey @ Jan 3 2006, 21:26... Jan 3 2006, 15:38   &-rey Цитата(prottoss @ Jan 3 2006, 19:38) В Си... Jan 3 2006, 15:50    prottoss [quote name='&-rey' date='Jan 3 20... Jan 3 2006, 16:17    SSerge Цитата(&-rey @ Jan 3 2006, 21:50... Jan 3 2006, 18:04   defunct Цитата(prottoss @ Jan 3 2006, 17:38) Вы с... Jan 7 2006, 13:30    prottoss Цитата(defunct @ Jan 7 2006, 20:30) Цитат... Jan 7 2006, 21:17     defunct Цитата(prottoss @ Jan 7 2006, 23:17) Цита... Jan 9 2006, 15:36      prottoss Цитата(defunct @ Jan 9 2006, 22:36) ... Jan 9 2006, 19:29       defunct Цитата(prottoss @ Jan 9 2006, 21:29) а Вы... Jan 9 2006, 20:01  IgorKossak Цитата(&-rey @ Jan 3 2006, 16:26... Jan 4 2006, 07:36   &-rey Цитата(IgorKossak @ Jan 4 2006, 11:36) На... Jan 4 2006, 07:51    IgorKossak Цитата(&-rey @ Jan 4 2006, 09:51... Jan 4 2006, 08:28     &-rey Цитата(IgorKossak @ Jan 4 2006, 12:28) ??... Jan 4 2006, 09:36      &-rey ЦитатаВ принципе это можно проверить. так и сделаю... Jan 5 2006, 07:38       Old1 To &-rey.
Я тут для себя тоже провел кое-каки... Jan 7 2006, 20:51 _artem_ sdelay tak :
c = *(((char*)pStr)++);
po moem... Jan 3 2006, 15:58 &-rey Цитата(_artem_ @ Jan 3 2006, 19:58) sdela... Jan 3 2006, 16:09 _artem_ OK, v principe kompayler prav )), on ne mozet preo... Jan 3 2006, 16:27 ObitJr Я думаю неправильно говорить компилятор незнает ил... Jan 10 2006, 19:17 prottoss Цитата(ObitJr @ Jan 11 2006, 02:17) Я дум... Jan 10 2006, 19:57 sensor_ua указатель void, ИМХО, действительно не может знать... Jan 10 2006, 20:27 ObitJr 1. Если что-то кажется, я конечно извеняюсь, есть... Jan 10 2006, 21:33 dxp Цитата(ObitJr @ Jan 11 2006, 03:33) 1. Ес... Jan 11 2006, 07:19  &-rey to Old1:
Спасибо, просмотрел Ваши функции, узнал д... Jan 11 2006, 07:55   ObitJr Ищем книгу "The New C Standard - An economic ... Jan 11 2006, 09:02   Old1 To &-rey.
ЦитатаА вот если в функции с __gener... Jan 12 2006, 09:57    &-rey to Old1:
Спасибо за ссылку, мои подозрения оправда... Jan 12 2006, 11:49    Old1 Цитата(Old1 @ Jan 12 2006, 13:57) ...если... Jan 13 2006, 09:58 _artem_ esli vse taki xotite manipulirovat void v funkcii ... Jan 11 2006, 16:22 &-rey Цитата(_artem_ @ Jan 11 2006, 20:22) esli... Jan 11 2006, 16:38
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|