|
передача в ф-ю адреса массива (+) |
|
|
|
Sep 24 2018, 12:39
|
Профессионал
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079
|
Немного торможу. Ф-я принимает адрес массива. Надо передать адрес. Код p_req->write.p_data это я изначально указатель разыменовываю и работаю со значением по полю структуры. А как адрес передать этой p.data? А если еще и смещение надо передать +16, например? Код &p_req->write.p_data ?
|
|
|
|
|
Sep 24 2018, 13:16
|
Профессионал
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831
|
Цитата(Метценгерштейн @ Sep 24 2018, 15:39) А как адрес передать этой p.data? Вот так: Код &(p_req->write.p_data) Цитата А если еще и смещение надо передать +16, например?? Адрес привести к нужному типу данных и обратиться к этому адресу через новый указатель (uint16_t - тут для примера): Код *(((uint16_t*)&(p_req->write.p_data)) + 16) = ... или так (если работаете на C++ и ваш компилятор это поддерживает): Код *(reinterpret_cast<uint16_t*>(&(p_req->write.p_data)) + 16) = ... Понимаю, это - редкостная дичь :D Как избежать? Да, сразу правильно строить нужные структуры данных (в т.ч. вложенные), пользуясь struct и union, минимально используя указатели.
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Sep 24 2018, 14:07
|
Профессионал
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079
|
Цитата(Forger @ Sep 24 2018, 16:16) Вот так: Код &(p_req->write.p_data) Тоже так хотел, но уже сомневаться начал, т.к. ругается компилер. Вот вызываю ф-ю и передаю параметры: А сама ф-я принимающая: Код void AES128_ECB_decrypt(uint8_t* input, const uint8_t* key, uint8_t *output)
{} Т.е. должен просто принять указатель на массив. Кстати, правильно, что ругается, т.к. p_req->write.p_data- это уже и есть указатель и указатель на указатель- глупо.
|
|
|
|
|
Sep 24 2018, 14:07
|
Профессионал
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831
|
Цитата(Метценгерштейн @ Sep 24 2018, 16:59) Тоже так хотел, но уже сомневаться начал, т.к. ругается компилер. Все правильно ругается компилятор - вы пытаетесь ему сунуть адрес указателя (указатель на указатель), а нужно дать лишь сам указатель. Причем его стоит привести к такому типу, который ожидает получить ваша функция. Ведь вы не указали тут содержимое структуры "write", поэтому, как обычно - играем в экстрасенсов Вот так сделайте: Код AES128_ECB_decrypt((uint8_t*)(p_req->write.p_data) ... Такие ошибки легко искать разбивая операции на промежуточные путем создания временных переменных. Так хотя бы можно разобраться на каком этапе преобразований возникает ошибка.
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Sep 24 2018, 14:17
|
Профессионал
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831
|
Цитата(Метценгерштейн @ Sep 24 2018, 17:11) Это структура write. Она структура в структуре Если "const" действительно закомментирован, то тогда должно работать даже так: Код AES128_ECB_decrypt(p_req->write.p_data, ...
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Sep 24 2018, 14:19
|
Профессионал
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079
|
const- это я и закомментил. Не работает. Ругается уже на линковщике. Может я не так смещение делаю? Задача в ф-ю шифрования по 16 байт подавать. Код for (int i = 0; i < p_req->write.len; i+=16) { AES128_ECB_decrypt ((uint8_t *)p_req->write.p_data + i, key, (uint8_t *)p_req->write.p_data + i); } Ругань что не хватает места (125 ошибок)
|
|
|
|
|
Sep 24 2018, 14:23
|
Профессионал
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831
|
Цитата Не работает. Ругается уже на линковщике. Вы по ходу путаете компилятор и линковщик. Приведенные выше были ошибки компилятора. А ошибки линковщика - это уже совсем другая история... Цитата AES128_ECB_decrypt ((uint8_t *)p_req->write.p_data + i, key, (uint8_t *)p_req->write.p_data + i); Что-то мне подсказывает, что передавать в одну и ту же функцию в качестве указателя источника и получателя данных одну и ту же область - это очень подозрительно и может привести к этому: Особенно, если вы понятия не имеете, как работает внутри эта самая функция.
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Sep 24 2018, 14:41
|
Профессионал
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831
|
Цитата(Метценгерштейн @ Sep 24 2018, 17:35) Линковщик? Да, линковщик. Об этом явно говорит буковка "L" перед кодом ошибки. Кстати, этот код ошибки можно вбить в строку поиска гугля и там найти подробности В данном случае у выбранного контроллера тупо не хватает места под данные или код. Цитата Дело в том, что на прошлом SDK я такой финт проделывал(с передачей в ф-ю эту источника и выходного массива, куда писать данные)- все работало. Т.е. ф-я работоспособна в таком виде. Профи найдет источник проблемы, комментируя целые куски кода, пытаясь локализовать виновника. Дилетант будет ссылаться на то, что "ведь раньше все работало"... Не будьте дилетантом, ищите. Ведь кроме вас никто в вашем коде не разберется
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|