Метценгерштейн 0 3 ноября, 2016 Опубликовано 3 ноября, 2016 · Жалоба есть структура typedef struct{ uint8_t outgoing[4]; } outgoing_t; outgoing_t outgoing_arr [10]; так корректно передать в ф-ю элемент этой структуры? memcpy(&outgoing_arr[0].outgoing, local_outgoing, 4); просто если без & передавать, то тоже работает. Не сообразить, как правильно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DASM 0 3 ноября, 2016 Опубликовано 3 ноября, 2016 · Жалоба если без & то и без [] надо, а как лучше монопенисульно, ибо одно и тоже Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 3 ноября, 2016 Опубликовано 3 ноября, 2016 · Жалоба нет, структуры именно передаются с &, а массивы просто- имя Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jorikdima 0 3 ноября, 2016 Опубликовано 3 ноября, 2016 · Жалоба нет, структуры именно передаются с &, а массивы просто- имя Ну, что называется вам виднее :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 3 ноября, 2016 Опубликовано 3 ноября, 2016 · Жалоба так ответа на вопрос и не увидел. я разве не прав, что передача структуры именно с & должна быть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 3 ноября, 2016 Опубликовано 3 ноября, 2016 · Жалоба & - вполне уместен и для массивов. Вы пользуетесь неявным преобразованием в указатель, но повторюсь &arr == arr == &arr[0], с точностью до типов разумеется. Амперсанд должен быть везде где вы берете указатель, просто за его отсутствие для массива вас не ругает компилятор. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 3 ноября, 2016 Опубликовано 3 ноября, 2016 · Жалоба с массивом понятно. со структурой - не очень. ф-я принимает аргумент- адрес массива. у меня этот массив- поле структуры. т.е. либо так передаю int arr [10]; func (arr); либо поле структуры. напишите- как Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 187 3 ноября, 2016 Опубликовано 3 ноября, 2016 · Жалоба У вас и так и так не правильно, а то что оно и так и так работает - следствие из однородности имени массива и адрес его первого элемента. 1) memcpy(&(outgoing_arr[0].outgoing[0]), local_outgoing, 4); // копирование 4 байт из local_outgoing в outgoing[0] из outgoing_arr[0] 2) memcpy(&outgoing_arr[0].outgoing[0], local_outgoing, 4); // аналогично 1) 3) memcpy(outgoing_arr[0].outgoing, local_outgoing, 4); // аналогично 1) 4) memcpy(&outgoing_arr[0].outgoing, local_outgoing, 4); // аналогично 1), работать будет, но формальная запись не совсем верная (берем адрес массива, который по сути есть одно и то же) - но тут может вылететь warning на несоответствие типов указателей memcpy(&(outgoing_arr[0].outgoing[1]), local_outgoing, 3); // копирование 3 байт из local_outgoing в outgoing[1] из outgoing_arr[0] ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 3 ноября, 2016 Опубликовано 3 ноября, 2016 · Жалоба вот как мы можем весь массив local_outgoing скопировать в один элемент outgoing[1] из outgoing_arr[0] ? нужно весь local_outgoing копировать в весь outgoing из outgoing_arr[0] Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
skripach 6 3 ноября, 2016 Опубликовано 3 ноября, 2016 · Жалоба &outgoing_arr[0].outgoing[0] Самое правильное как по мне. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 4 ноября, 2016 Опубликовано 4 ноября, 2016 · Жалоба есть 3 типа передачи аргументов в C(++) 1. По значению. Копия того, что Вы передаете в функцию, укладывается или в регистр процессора, и-или на стек. (если надо передать char-int-float-long) 2. По указателю. В функцию сами данные не передаются, на стек или в регистры процессора передается адрес данных, и Вы указываете, какой тип этих данных. 3. По ссылке (физически это тотже указатель, а синтаксис позволяет Вам использовать в функции "не-указательное", а обычное обращение к данным) "Передача" массива в ф-ию. char MyArray[] = {1,2,3,4}; void GetArray( char * in_array, int in_array_size ) { in_array[0] = . . . . in_array[1] = . . . . }; GetArray( MyArray, sizeof(MyArray) ); или GetArray( &MyArray[0], sizeof(MyArray) ); или GetArray( &(MyArray[0]), sizeof(MyArray) ); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 4 ноября, 2016 Опубликовано 4 ноября, 2016 (изменено) · Жалоба как массив в ф-ю по указателю передать- вопросов нет. Я передаю адрес нулевого элемента &MyArray[0] или просто имя, MyArray, компилятор знает, что имя массива- это адрес его нулевого элемента. Чуть запутанность при передаче поля структуры, которое является массивом. &outgoing_arr[0].outgoing[0] Самое правильное как по мне. т.е. передаем именно адрес нулевого элемента outgoing[0] т.е. при передаче элемента структуры, например 3, будет выглядеть так: &outgoing_arr[3].outgoing[0] outgoing[0] передаем всегда с нулевым индексом. Изменено 4 ноября, 2016 пользователем Herz Избыточное цитирование Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 4 ноября, 2016 Опубликовано 4 ноября, 2016 · Жалоба .... Чуть запутанность при передаче поля структуры, которое является массивом. ..... Никакой запутанности. Функции, которая получает Ваш массив - пополам, где он изначально находится - в структуре или отдельно. Так как в декларации аргументов ф-ии определено, что передается указатель на массив (другими словами, начальный адрес области памяти, где расположен массив). Соотв-но ф-ия "не знает" что он где-то в составе какой либо структуры. Или еще чего-либо :) Если же Вы хотите, чтобы функции было "не все равно" - передавайте ей в кач-ве аргумента указатель на структуру, в составе которой есть массив и может быть еще что-то. Так обычно и делается, если надо передать блок разнородных данных - без "балластной" операции копирования. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 187 4 ноября, 2016 Опубликовано 4 ноября, 2016 (изменено) · Жалоба т.е. при передаче элемента структуры, например 3, будет выглядеть так:... Вы вот определитесь, что вы хотите, передавать адрес ЭЛЕМЕНТА структуры, или адрес самой структуры в МАССИВЕ структур. У вас же ведь outgoing_arr является массивом структур, элементом которой является массив данных типа uint8_t. &outgoing_arr[3].outgoing[0]; // это адрес нулевого элемента массива-члена структуры outgoing из третьего элемента массива структур outgoing_arr. Изменено 4 ноября, 2016 пользователем Arlleex Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 4 ноября, 2016 Опубликовано 4 ноября, 2016 · Жалоба я хочу передать адрес элемента структуры, который, в свою очередь, находится в одной из массивов структур. т.о. верным решением будет для третьей структуры: &outgoing_arr[3].outgoing[0]; и моя ф-я в качестве аргумента принимает адрес массива. А то что он находится в третьей структуре- не важно. Подтвердите мысль. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться