|
передача элемента структуры в ф-ю |
|
|
|
Nov 3 2016, 13:50
|
Профессионал
    
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079

|
есть структура Код typedef struct{ uint8_t outgoing[4]; } outgoing_t;
outgoing_t outgoing_arr [10]; так корректно передать в ф-ю элемент этой структуры? Код memcpy(&outgoing_arr[0].outgoing, local_outgoing, 4); просто если без & передавать, то тоже работает. Не сообразить, как правильно.
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 16)
|
Nov 3 2016, 19:58
|
Профессионал
    
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079

|
с массивом понятно. со структурой - не очень. ф-я принимает аргумент- адрес массива. у меня этот массив- поле структуры. т.е. либо так передаю Код int arr [10]; func (arr); либо поле структуры. напишите- как
|
|
|
|
|
Nov 3 2016, 20:04
|

Местный
  
Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264

|
У вас и так и так не правильно, а то что оно и так и так работает - следствие из однородности имени массива и адрес его первого элемента. Код 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] ...
|
|
|
|
|
Nov 3 2016, 22:11
|
■ ■ ■ ■
    
Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443

|
Код &outgoing_arr[0].outgoing[0] Самое правильное как по мне.
--------------------
Делай что должен и будь что будет.
|
|
|
|
|
Nov 4 2016, 06:57
|
Профессионал
    
Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848

|
есть 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) );
|
|
|
|
|
Nov 4 2016, 07:33
|
Профессионал
    
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079

|
как массив в ф-ю по указателю передать- вопросов нет. Я передаю адрес нулевого элемента &MyArray[0] или просто имя, MyArray, компилятор знает, что имя массива- это адрес его нулевого элемента. Чуть запутанность при передаче поля структуры, которое является массивом. Цитата(skripach @ Nov 4 2016, 01:11)  Код &outgoing_arr[0].outgoing[0] Самое правильное как по мне. т.е. передаем именно адрес нулевого элемента outgoing[0] т.е. при передаче элемента структуры, например 3, будет выглядеть так: Код &outgoing_arr[3].outgoing[0] outgoing[0] передаем всегда с нулевым индексом.
Сообщение отредактировал Herz - Nov 4 2016, 09:40
Причина редактирования: Избыточное цитирование
|
|
|
|
|
Nov 4 2016, 07:44
|
Профессионал
    
Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848

|
Цитата(Метценгерштейн @ Nov 4 2016, 11:33)  .... Чуть запутанность при передаче поля структуры, которое является массивом. ..... Никакой запутанности. Функции, которая получает Ваш массив - пополам, где он изначально находится - в структуре или отдельно. Так как в декларации аргументов ф-ии определено, что передается указатель на массив (другими словами, начальный адрес области памяти, где расположен массив). Соотв-но ф-ия "не знает" что он где-то в составе какой либо структуры. Или еще чего-либо  Если же Вы хотите, чтобы функции было "не все равно" - передавайте ей в кач-ве аргумента указатель на структуру, в составе которой есть массив и может быть еще что-то. Так обычно и делается, если надо передать блок разнородных данных - без "балластной" операции копирования.
|
|
|
|
|
Nov 4 2016, 07:50
|

Местный
  
Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264

|
Цитата т.е. при передаче элемента структуры, например 3, будет выглядеть так:... Вы вот определитесь, что вы хотите, передавать адрес ЭЛЕМЕНТА структуры, или адрес самой структуры в МАССИВЕ структур. У вас же ведь outgoing_arr является массивом структур, элементом которой является массив данных типа uint8_t. Код &outgoing_arr[3].outgoing[0]; // это адрес нулевого элемента массива-члена структуры outgoing из третьего элемента массива структур outgoing_arr.
Сообщение отредактировал Arlleex - Nov 4 2016, 07:51
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|