Метценгерштейн 0 24 сентября, 2018 Опубликовано 24 сентября, 2018 · Жалоба Немного торможу. Ф-я принимает адрес массива. Надо передать адрес. p_req->write.p_data это я изначально указатель разыменовываю и работаю со значением по полю структуры. А как адрес передать этой p.data? А если еще и смещение надо передать +16, например? &p_req->write.p_data ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 24 сентября, 2018 Опубликовано 24 сентября, 2018 · Жалоба А как адрес передать этой 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, минимально используя указатели. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 24 сентября, 2018 Опубликовано 24 сентября, 2018 · Жалоба Вот так: &(p_req->write.p_data) Тоже так хотел, но уже сомневаться начал, т.к. ругается компилер. Вот вызываю ф-ю и передаю параметры: А сама ф-я принимающая: void AES128_ECB_decrypt(uint8_t* input, const uint8_t* key, uint8_t *output) {} Т.е. должен просто принять указатель на массив. Кстати, правильно, что ругается, т.к. p_req->write.p_data- это уже и есть указатель и указатель на указатель- глупо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 24 сентября, 2018 Опубликовано 24 сентября, 2018 · Жалоба Тоже так хотел, но уже сомневаться начал, т.к. ругается компилер. Все правильно ругается компилятор - вы пытаетесь ему сунуть адрес указателя (указатель на указатель), а нужно дать лишь сам указатель. Причем его стоит привести к такому типу, который ожидает получить ваша функция. Ведь вы не указали тут содержимое структуры "write", поэтому, как обычно - играем в экстрасенсов :wacko: Вот так сделайте: AES128_ECB_decrypt((uint8_t*)(p_req->write.p_data) ... Такие ошибки легко искать разбивая операции на промежуточные путем создания временных переменных. Так хотя бы можно разобраться на каком этапе преобразований возникает ошибка. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 24 сентября, 2018 Опубликовано 24 сентября, 2018 · Жалоба typedef struct { uint8_t /*const*/ * p_data; //!< Data. uint16_t len; //!< Length of data in @ref nrf_dfu_request_write_t::p_data. } nrf_dfu_request_write_t; Это структура write. Она структура в структуре Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 24 сентября, 2018 Опубликовано 24 сентября, 2018 · Жалоба Это структура write. Она структура в структуре Если "const" действительно закомментирован, то тогда должно работать даже так: AES128_ECB_decrypt(p_req->write.p_data, ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 24 сентября, 2018 Опубликовано 24 сентября, 2018 · Жалоба 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 ошибок) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 24 сентября, 2018 Опубликовано 24 сентября, 2018 · Жалоба Не работает. Ругается уже на линковщике. Вы по ходу путаете компилятор и линковщик. Приведенные выше были ошибки компилятора. А ошибки линковщика - это уже совсем другая история... AES128_ECB_decrypt ((uint8_t *)p_req->write.p_data + i, key, (uint8_t *)p_req->write.p_data + i); Что-то мне подсказывает, что передавать в одну и ту же функцию в качестве указателя источника и получателя данных одну и ту же область - это очень подозрительно и может привести к этому: :smile3046: Особенно, если вы понятия не имеете, как работает внутри эта самая функция. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 24 сентября, 2018 Опубликовано 24 сентября, 2018 · Жалоба Из прошлого сообщения была ругань компилятора. Сейчас ругается так: Линковщик? Дело в том, что на прошлом SDK я такой финт проделывал(с передачей в ф-ю эту источника и выходного массива, куда писать данные одного массива)- все работало. Т.е. ф-я работоспособна в таком виде. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 24 сентября, 2018 Опубликовано 24 сентября, 2018 · Жалоба Линковщик? Да, линковщик. Об этом явно говорит буковка "L" перед кодом ошибки. Кстати, этот код ошибки можно вбить в строку поиска гугля и там найти подробности ;) В данном случае у выбранного контроллера тупо не хватает места под данные или код. Дело в том, что на прошлом SDK я такой финт проделывал(с передачей в ф-ю эту источника и выходного массива, куда писать данные)- все работало. Т.е. ф-я работоспособна в таком виде. Профи найдет источник проблемы, комментируя целые куски кода, пытаясь локализовать виновника. Дилетант будет ссылаться на то, что "ведь раньше все работало"... Не будьте дилетантом, ищите. Ведь кроме вас никто в вашем коде не разберется :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 0 24 сентября, 2018 Опубликовано 24 сентября, 2018 · Жалоба По ходу банально места уже нет, не может линковщик огромный кусок кода впихнуть в маленькую память контроллера :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 24 сентября, 2018 Опубликовано 24 сентября, 2018 · Жалоба Не будьте дилетантом, ищите. Ведь кроме вас никто в вашем коде не разберется :) Да понятно) Спасибо за помощь. Отпишусь тут - что получилось в результате. По ходу банально места уже нет, не может линковщик огромный кусок кода впихнуть в маленькую память контроллера :rolleyes: По мне, так странно. Я же не прошу его впихивать весь блок. Я прошу его по 16 байт заменить один кусок кода другим. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 24 сентября, 2018 Опубликовано 24 сентября, 2018 · Жалоба Спасибо за помощь. :beer: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 0 24 сентября, 2018 Опубликовано 24 сентября, 2018 · Жалоба По мне, так странно. Я же не прошу его впихивать весь блок. Я прошу его по 16 байт заменить один кусок кода другим. я про то, что компилятор накомпилил такой объём кода, что линковщик хватается за голову и говорит, что в секции ANY, в выделенном ей пространстве, не хватает места, чтобы этот код туда запихать Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 25 сентября, 2018 Опубликовано 25 сентября, 2018 · Жалоба я про то, что компилятор накомпилил такой объём кода, что линковщик хватается за голову и говорит, что в секции ANY, в выделенном ей пространстве, не хватает места, чтобы этот код туда запихать И как выйти из положения можно? Увеличить чего-нибудь? Или просто сам код написан так, что рекурсия получилось и вызывается как матрешка друг за другом? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться