|
указатель на тип 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 10 2006, 21:33
|
Участник

Группа: Участник
Сообщений: 16
Регистрация: 23-07-05
Пользователь №: 7 043

|
1. Если что-то кажется, я конечно извеняюсь, есть единственный выход - берем стандарт к примеру 99й и смотрим. 2. Можно приводить примеры работы со структурами, пайпами и.т.д, но ни я никто другой ничего об этом не говорил, а говорили об адресации. 3. Также, я не говорил что через указатель на void можно перескакивать через несколько байт, слов или элементов структур (применительно к их расположению в памяти) (хотя по стандарту для некоторых архитектур возможно), а адресация к ячейкам памяти - пожайлуста. 4. В этом топике обсуждались функции вывода СТРОК только из двух источников, а не чего-либо из структур (можно и строку расположить по три символа в разных частях SRAM - тогда все приведенные функции будут неверны). 5. К 1 вдогонку - попробуйте на любых других архитектурах (x86, PowerPC тотже ARM) сделать инкремент УКАЗАТЕЛЯ на void - и все ОК, для 86й на куче компиляторов, на PPC и ARM тоже все нормально (правда только под gcc пробовал).
И вдобавок, как я уже говорил, я склоняюсь к тому, что компилятор незнает какой именно доступ применять к тем или иным указателям т.к это указатель без типа (да и проверить нельзя, разве что только по верхним адресам для FLASH) и наверное из-за этого разработчики компилятора сделали генерацию ошибки в такой ситуации (вобщем чтоб легче жить).
То что я говорил, не меняет того факта, что сделать нормальную универсальную функцию нельзя, но всетаки... смысл то имеет разобраться в стандартах и как в таких случаях поступает компилятор...
|
|
|
|
|
Jan 11 2006, 07:19
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(ObitJr @ Jan 11 2006, 03:33)  1. Если что-то кажется, я конечно извеняюсь, есть единственный выход - берем стандарт к примеру 99й и смотрим. ... То что я говорил, не меняет того факта, что сделать нормальную универсальную функцию нельзя, но всетаки... смысл то имеет разобраться в стандартах и как в таких случаях поступает компилятор... Что-то все равно не понятно. Отсылания к Стандартам, к сожалению, не проясняют ситуацию. Если уж ссылаетесь на Стандарт, то указывайте конкретный номер параграфа и пункта. А еще лучше прямо цитату сюда. Я проще спрошу, хотя и тоже на примере (чтобы понятнее было). Вот имеем функцию: Код void f(void* p) { *p++ = 10; *p++ = 20; } Условия следующие: пусть аппаратная платформа AVR программная EWAVR - все это означает, что sizeof(char) == 1 sizeof(int) == 2 sizeof(long) == 4 sizeof(float) == 4 sizeof(void*) == 2 и т.д. Теперь пусть имеем, скажем, массив char A[64]; расположенный по адресу 0x100, и передаем его адрес в функцию: ... f((void*)A); ... Вопрос: по какому адресу запишется число 20 (если этот код вообще скомпилируется, в чем есть большие сомнения  )? И как эту ситуацию описывает Стандарт - с ссылкой на конкретный пункт, пожалуйста.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Jan 11 2006, 07:55
|
Местный
  
Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064

|
to Old1: Спасибо, просмотрел Ваши функции, узнал для себя что unsigned char можно писать как строку символов без обьявления массива  кстати Вы в def.h делаете так: Код #ifdef __FUNK1__ void Write_massiv_1(void *P_STRING, unsigned char *P_MASSIV, unsigned char STRING_TYPE); #else extern void Write_massiv_1(void *P_STRING, unsigned char *P_MASSIV, unsigned char STRING_TYPE); #endif//__FUNK1__ в книге по С сказано: Цитата Если спецификатор класса памяти не указан, то подразумевается класс памяти extern. т.о. можно сократить запись, чего нельзя сказать о переменных... А вот если в функции с __generic переставить местами аргументы то результаты будут чуть лучьше. 366 цикл. и 405 цикл. соответственно. Для void такое мероприятие в некоторых случаях даже ухудшает дело. конечно оптимизировать можно до бесконечности ... , по крайней мере выводы я сделал. И еще такой вопрос: У IAR по умолчанию функция main возвращает значение int = 0; понятно что такого быть не должно, и она может быть void. но ведь для чего-то IAR так делает, а иногда (причину пока не выяснил) IAR дает сообщение на main что возвращаемый тип должен быть int. ??? to ObitJr абсолютно согласен, в книге по С такой пример есть. А в IAR нет, вот только после данной ветки мне теперь кажется что IAR прав  (по крайней с этим приходиться мириться) Вопрос об указатели на FLASH хоть и верен, но в данном варианте не имеет значения, т.к. ошибка инкремента приведенного указателя не зависит от типа приведения и возникает на стадии компиляции самой функции.
|
|
|
|
Сообщений в этой теме
&-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 SSerge Цитата(&-rey @ Jan 3 2006, 19:06... Jan 3 2006, 16:12 &-rey Цитата(SSerge @ Jan 3 2006, 20:12) А комп... Jan 3 2006, 16:27  SSerge Цитата(&-rey @ Jan 3 2006, 22:27... Jan 3 2006, 17:08   &-rey Цитата(SSerge @ Jan 3 2006, 21:08) Код c... Jan 4 2006, 07:38 _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 Ищем книгу "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
|
|
|