Цитата(&-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.