_mem_cpy

Создание исполняемых модулей для электронных ключей SenseLock

_mem_cpy

Сообщение Kartavykh » Ср, 03 окт 2012 07:15

Добрый день.
Не пойму как все-таки правильно? Вот есть такой код внутри ключа:

unsigned char retVal[10*sizeof(float)];
float step;
int cnt = 0;
int pCount = 2;

for(i=0; i<pCount; i++)
{
step = .... // как-то вычисляем

_mem_move(&retVal+cnt, &step, sizeof(float));
cnt+=2;
}
_set_response(pCount*sizeof(float), (BYTE *)retVal);

По идее float - 4 байта, однако если в коде поставить cnt+=4 он реально пишет в retVal по 8 байт. Точнее он пишет по 4, но между значениями 4 байта мусора.
Я понимаю, что cnt+=2 это вроде не правильно - однако так работает....
Пожалуйста разъясните ситуацию кто в курсе.
Kartavykh
 
Сообщения: 3
Зарегистрирован: Ср, 03 окт 2012 06:51

Re: _mem_cpy

Сообщение Alexey » Ср, 03 окт 2012 21:43

Ошибка очень нехорошая. Добавляя cnt к адресу, вы оперируете не элементом массива (char), а всей переменной retVal, размер которой 10*4=40 байт.
При cnt не равной нулю вы вылезаете за границы массива, что недопустимо и может приводить к непредсказуемым последствиям.
Исправив
_mem_move(&retVal+cnt, &step, sizeof(float));
на
_mem_move(&retVal[0]+cnt, &step, sizeof(float));
программа заработает при cnt+=4;


Если уж у вас retVal - массив, то проще так:

for(i=0; i<pCount; i++)
{
step = ...some evaluation...
_mem_move((void**)&retVal[i*sizeof(float)], &step, sizeof(float));
}

Приведение к нетипизированному указателю нужно для того, чтобы компилятор не выводи warning. Вообще старайтесь писать код так, чтобы ворнингов не было вообще.
Переменная cnt становится ненужной.
Для оптимизации кода можно заменить [i*sizeof(float)] на [i<<2].

PS: а зачем retVal объявлен ка массив байтов? Не проще объявить его как массив флоатов?
Alexey
 
Сообщения: 69
Зарегистрирован: Сб, 21 мар 2009 14:43

Re: _mem_cpy

Сообщение Kartavykh » Чт, 04 окт 2012 09:32

Спасибо огромное за ответ!
При написании совсем забыл про обязательное указание первого элемента массива (&retVal[0]) для получения адреса :(
Ну и Ваше замечание насчет описания массива как массив флоатов - конечно это проще и правильнее... Сделал так.

Спасибо.
Kartavykh
 
Сообщения: 3
Зарегистрирован: Ср, 03 окт 2012 06:51


Вернуться в Исполняемые модули

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron