Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: параметр функции const float*
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
sigmaN
Столкнулся с проблемой:
Код
void func1(const float* param1){
  float* paramcpy;
  void* voidparamcpy;
  paramcpy=param1;  //и вот тут компилятор возмутился
  paramcpy=(float*)param1;  //тут тоже
  voidparamcpy=(void*)param1; /*так работает, но мне нужно будет делать инкремент указателя, а void* не инкрементируется*/


}

Компилятор CCS3.3

Как в что делать? Тип параметра менять нельзя.
Okorok
Цитата(sigmaN @ Aug 6 2008, 14:40) *
Столкнулся с проблемой:
Код
void func1(const float* param1){
  float* paramcpy;
  void* voidparamcpy;
  paramcpy=param1;  //и вот тут компилятор возмутился
  paramcpy=(float*)param1;  //тут тоже
  voidparamcpy=(void*)param1; /*так работает, но мне нужно будет делать инкремент указателя, а void* не инкрементируется*/
}
Компилятор CCS3.3
Как в что делать? Тип параметра менять нельзя.
Компилятор CCS3.3 не знаю, у меня в другом компиляторе без проблем работает "paramcpy=(float*)param1". Пробуйте так, должно работать:
Код
paramcpy=(float*)&param1[0];
Aesthete Animus
Цитата(sigmaN @ Aug 6 2008, 16:40) *
Как в что делать? Тип параметра менять нельзя.

А собственно, как именно ругается компилятор? Что если убрать const в заголовке функции?
Сергей Борщ
const float * говорит о том, что переменную, на которую указывает такой указатель менять нельзя. И компилятор понимает, что в месте, где вызвана эта функция, переменная не будет изменена. Вы же пытаетесь присвоить этот указатель обычному float *, который разрешает модифицировать переменную. Вам надо либо объявить paramcpy тоже как const float*, либо при присвоении делать явное (принудительное) приведение типа: paramcpy = (float *)param1; Но в этом случае возможны подводные камни, ибо компилятор может перед вызовом функции сохранить значение по указателю в регистрах (поскольку уверен, что оно не изменяется) и после выхода из функции использовать сохраненное значение. Значит, вы либо действуете честно - не меняете значение по указателю и, значит, можете смело объявить paramcpy как const float *, либо, если значение по указателю должно изменяться, не имеете права объявлять параметр как const float *, а должны его объявлять как float *. Раз тип параметра менять нельзя, значит нельзя и менять значение, на которое он указывает.
Aesthete Animus
2Сергей Борщ
+1 smile.gif

Умеете же Вы вс-таки объяснять!
sigmaN
Спасибо всем отозвавшимся!
Изменять переменную через указатель я не собираюсь.
Просто в функции используется доступ к значению по индексу param1[i], а я хочу сделать через param1_ptr++ в нужном месте и *param_ptr, там, где нужно значение этой переменной.
Там не один такой параметр, а 4, поэтому обеспечивается прирост производительности процентов 15-20. Испытал на макете(объявил без const и прогнал функцию). Но на место она без const не встаёт.
Теперь благодаря вашей помощи - всё Ok! Просто объявил локальную переменную с const.
Сергей Борщ
Цитата(sigmaN @ Aug 6 2008, 17:08) *
Изменять переменную через указатель я не собираюсь.
Просто в функции используется доступ к значению по индексу param1[i], а я хочу сделать через param1_ptr++ в нужном месте
Одно другому не мешает wink.gif
float * - указатель менять можно, переменную менять можно.
const float * - указатель менять можно, переменную нельзя
float * const - указатель менять нельзя, переменную можно
const float * const - указатель менять нельзя, переменную нельзя
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.