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

 
 
> параметр функции const float*, невозможно присвоить локальной переменной float*
sigmaN
сообщение Aug 6 2008, 12:40
Сообщение #1


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Столкнулся с проблемой:
Код
void func1(const float* param1){
  float* paramcpy;
  void* voidparamcpy;
  paramcpy=param1;  //и вот тут компилятор возмутился
  paramcpy=(float*)param1;  //тут тоже
  voidparamcpy=(void*)param1; /*так работает, но мне нужно будет делать инкремент указателя, а void* не инкрементируется*/


}

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

Как в что делать? Тип параметра менять нельзя.


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 6)
Okorok
сообщение Aug 6 2008, 12:57
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 289
Регистрация: 17-06-07
Пользователь №: 28 498



Цитата(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];
Go to the top of the page
 
+Quote Post
Aesthete Animus
сообщение Aug 6 2008, 13:04
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 222
Регистрация: 9-06-07
Пользователь №: 28 317



Цитата(sigmaN @ Aug 6 2008, 16:40) *
Как в что делать? Тип параметра менять нельзя.

А собственно, как именно ругается компилятор? Что если убрать const в заголовке функции?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 6 2008, 13:05
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



const float * говорит о том, что переменную, на которую указывает такой указатель менять нельзя. И компилятор понимает, что в месте, где вызвана эта функция, переменная не будет изменена. Вы же пытаетесь присвоить этот указатель обычному float *, который разрешает модифицировать переменную. Вам надо либо объявить paramcpy тоже как const float*, либо при присвоении делать явное (принудительное) приведение типа: paramcpy = (float *)param1; Но в этом случае возможны подводные камни, ибо компилятор может перед вызовом функции сохранить значение по указателю в регистрах (поскольку уверен, что оно не изменяется) и после выхода из функции использовать сохраненное значение. Значит, вы либо действуете честно - не меняете значение по указателю и, значит, можете смело объявить paramcpy как const float *, либо, если значение по указателю должно изменяться, не имеете права объявлять параметр как const float *, а должны его объявлять как float *. Раз тип параметра менять нельзя, значит нельзя и менять значение, на которое он указывает.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Aesthete Animus
сообщение Aug 6 2008, 13:12
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 222
Регистрация: 9-06-07
Пользователь №: 28 317



2Сергей Борщ
+1 smile.gif

Умеете же Вы вс-таки объяснять!
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Aug 6 2008, 14:08
Сообщение #6


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Спасибо всем отозвавшимся!
Изменять переменную через указатель я не собираюсь.
Просто в функции используется доступ к значению по индексу param1[i], а я хочу сделать через param1_ptr++ в нужном месте и *param_ptr, там, где нужно значение этой переменной.
Там не один такой параметр, а 4, поэтому обеспечивается прирост производительности процентов 15-20. Испытал на макете(объявил без const и прогнал функцию). Но на место она без const не встаёт.
Теперь благодаря вашей помощи - всё Ok! Просто объявил локальную переменную с const.


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 6 2008, 16:08
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(sigmaN @ Aug 6 2008, 17:08) *
Изменять переменную через указатель я не собираюсь.
Просто в функции используется доступ к значению по индексу param1[i], а я хочу сделать через param1_ptr++ в нужном месте
Одно другому не мешает wink.gif
float * - указатель менять можно, переменную менять можно.
const float * - указатель менять можно, переменную нельзя
float * const - указатель менять нельзя, переменную можно
const float * const - указатель менять нельзя, переменную нельзя


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 27th July 2025 - 21:01
Рейтинг@Mail.ru


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