реклама на сайте
подробности

 
 
> указатель на тип void, попытки создать общую функцию
andrvisht
сообщение Jan 3 2006, 13:06
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 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
Или может еще каким образом поступают при такой задаче, просьба поделиться опытом ...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ObitJr
сообщение Jan 10 2006, 21:33
Сообщение #2


Участник
*

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



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

И вдобавок, как я уже говорил, я склоняюсь к тому, что компилятор незнает какой именно доступ применять к тем или иным указателям т.к это указатель без типа (да и проверить нельзя, разве что только по верхним адресам для FLASH) и наверное из-за этого разработчики компилятора сделали генерацию ошибки в такой ситуации (вобщем чтоб легче жить).

То что я говорил, не меняет того факта, что сделать нормальную универсальную функцию нельзя, но всетаки... смысл то имеет разобраться в стандартах и как в таких случаях поступает компилятор...
Go to the top of the page
 
+Quote Post
dxp
сообщение Jan 11 2006, 07:19
Сообщение #3


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 (если этот код вообще скомпилируется, в чем есть большие сомнения smile.gif)? И как эту ситуацию описывает Стандарт - с ссылкой на конкретный пункт, пожалуйста.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
andrvisht
сообщение Jan 11 2006, 07:55
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



to Old1:
Спасибо, просмотрел Ваши функции, узнал для себя что unsigned char можно писать как строку символов без обьявления массива smile.gif
кстати Вы в 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 прав smile.gif (по крайней с этим приходиться мириться)
Вопрос об указатели на FLASH хоть и верен, но в данном варианте не имеет значения, т.к. ошибка инкремента приведенного указателя не зависит от типа приведения и возникает на стадии компиляции самой функции.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- &-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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th June 2025 - 22:47
Рейтинг@Mail.ru


Страница сгенерированна за 0.01437 секунд с 7
ELECTRONIX ©2004-2016