Столкнулся с проблемой:
Код
void func1(const float* param1){
float* paramcpy;
void* voidparamcpy;
paramcpy=param1; //и вот тут компилятор возмутился
paramcpy=(float*)param1; //тут тоже
voidparamcpy=(void*)param1; /*так работает, но мне нужно будет делать инкремент указателя, а void* не инкрементируется*/
}
Компилятор CCS3.3
Как в что делать? Тип параметра менять нельзя.
Цитата(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*)¶m1[0];
Aesthete Animus
Aug 6 2008, 13:04
Цитата(sigmaN @ Aug 6 2008, 16:40)

Как в что делать? Тип параметра менять нельзя.
А собственно, как именно ругается компилятор? Что если убрать
const в заголовке функции?
Сергей Борщ
Aug 6 2008, 13:05
const float * говорит о том, что переменную, на которую указывает такой указатель менять нельзя. И компилятор понимает, что в месте, где вызвана эта функция, переменная не будет изменена. Вы же пытаетесь присвоить этот указатель обычному float *, который разрешает модифицировать переменную. Вам надо либо объявить paramcpy тоже как const float*, либо при присвоении делать явное (принудительное) приведение типа: paramcpy = (float *)param1; Но в этом случае возможны подводные камни, ибо компилятор может перед вызовом функции сохранить значение по указателю в регистрах (поскольку уверен, что оно не изменяется) и после выхода из функции использовать сохраненное значение. Значит, вы либо действуете честно - не меняете значение по указателю и, значит, можете смело объявить paramcpy как const float *, либо, если значение по указателю должно изменяться, не имеете права объявлять параметр как const float *, а должны его объявлять как float *. Раз тип параметра менять нельзя, значит нельзя и менять значение, на которое он указывает.
Aesthete Animus
Aug 6 2008, 13:12
2
Сергей Борщ+1
Умеете же Вы вс-таки объяснять!
Спасибо всем отозвавшимся!
Изменять переменную через указатель я не собираюсь.
Просто в функции используется доступ к значению по индексу param1[i], а я хочу сделать через param1_ptr++ в нужном месте и *param_ptr, там, где нужно значение этой переменной.
Там не один такой параметр, а 4, поэтому обеспечивается прирост производительности процентов 15-20. Испытал на макете(объявил без const и прогнал функцию). Но на место она без const не встаёт.
Теперь благодаря вашей помощи - всё Ok! Просто объявил локальную переменную с const.
Сергей Борщ
Aug 6 2008, 16:08
Цитата(sigmaN @ Aug 6 2008, 17:08)

Изменять переменную через указатель я не собираюсь.
Просто в функции используется доступ к значению по индексу param1[i], а я хочу сделать через param1_ptr++ в нужном месте
Одно другому не мешает
float * - указатель менять можно, переменную менять можно.
const float * - указатель менять можно, переменную нельзя
float * const - указатель менять нельзя, переменную можно
const float * const - указатель менять нельзя, переменную нельзя