Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: передача элемента структуры в ф-ю
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Метценгерштейн
есть структура
Код
typedef struct{  
    uint8_t outgoing[4];
} outgoing_t;

outgoing_t    outgoing_arr [10];


так корректно передать в ф-ю элемент этой структуры?
Код
memcpy(&outgoing_arr[0].outgoing, local_outgoing, 4);


просто если без & передавать, то тоже работает.
Не сообразить, как правильно.
DASM
если без & то и без [] надо, а как лучше монопенисульно, ибо одно и тоже
Метценгерштейн
нет, структуры именно передаются с &, а массивы просто- имя
jorikdima
Цитата(Метценгерштейн @ Nov 3 2016, 07:15) *
нет, структуры именно передаются с &, а массивы просто- имя

Ну, что называется вам виднее sm.gif
Метценгерштейн
так ответа на вопрос и не увидел.
я разве не прав, что передача структуры именно с & должна быть?
Kabdim
& - вполне уместен и для массивов. Вы пользуетесь неявным преобразованием в указатель, но повторюсь &arr == arr == &arr[0], с точностью до типов разумеется. Амперсанд должен быть везде где вы берете указатель, просто за его отсутствие для массива вас не ругает компилятор.
Метценгерштейн
с массивом понятно.
со структурой - не очень.
ф-я принимает аргумент- адрес массива.
у меня этот массив- поле структуры.

т.е. либо так передаю
Код
int arr [10];
func (arr);

либо поле структуры.
напишите- как
Arlleex
У вас и так и так не правильно, а то что оно и так и так работает - следствие из однородности имени массива и адрес его первого элемента.

Код
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]
...
Метценгерштейн
вот как мы можем весь массив local_outgoing скопировать в один элемент
outgoing[1] из outgoing_arr[0] ?

нужно весь local_outgoing копировать в весь outgoing из outgoing_arr[0]
skripach
Код
&outgoing_arr[0].outgoing[0]

Самое правильное как по мне.
k155la3
есть 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) );

Метценгерштейн
как массив в ф-ю по указателю передать- вопросов нет. Я передаю адрес нулевого элемента
&MyArray[0]
или просто имя,
MyArray, компилятор знает, что имя массива- это адрес его нулевого элемента.
Чуть запутанность при передаче поля структуры, которое является массивом.
Цитата(skripach @ Nov 4 2016, 01:11) *
Код
&outgoing_arr[0].outgoing[0]

Самое правильное как по мне.

т.е. передаем именно адрес нулевого элемента outgoing[0]

т.е. при передаче элемента структуры, например 3, будет выглядеть так:
Код
&outgoing_arr[3].outgoing[0]


outgoing[0] передаем всегда с нулевым индексом.
k155la3
Цитата(Метценгерштейн @ Nov 4 2016, 11:33) *
....
Чуть запутанность при передаче поля структуры, которое является массивом.
.....

Никакой запутанности. Функции, которая получает Ваш массив - пополам, где он изначально находится
- в структуре или отдельно. Так как в декларации аргументов ф-ии определено, что передается
указатель на массив
(другими словами, начальный адрес области памяти, где расположен массив).
Соотв-но ф-ия "не знает" что он где-то в составе какой либо структуры. Или еще чего-либо sm.gif

Если же Вы хотите, чтобы функции было "не все равно" - передавайте ей в кач-ве аргумента
указатель на структуру, в составе которой есть массив и может быть еще что-то.
Так обычно и делается, если надо передать блок разнородных данных - без "балластной" операции копирования.
Arlleex
Цитата
т.е. при передаче элемента структуры, например 3, будет выглядеть так:...

Вы вот определитесь, что вы хотите, передавать адрес ЭЛЕМЕНТА структуры, или адрес самой структуры в МАССИВЕ структур.

У вас же ведь outgoing_arr является массивом структур, элементом которой является массив данных типа uint8_t.

Код
&outgoing_arr[3].outgoing[0]; // это адрес нулевого элемента массива-члена структуры outgoing из третьего элемента массива структур outgoing_arr.
Метценгерштейн
я хочу передать адрес элемента структуры, который, в свою очередь, находится в одной из массивов структур.
т.о. верным решением будет для третьей структуры:
&outgoing_arr[3].outgoing[0];
и моя ф-я в качестве аргумента принимает адрес массива. А то что он находится в третьей структуре- не важно.
Подтвердите мысль.
k155la3
вроде как да. Только не в "третьей" (по счету) а "с индексом 3" , по счету - четвертая (0123).
Метценгерштейн
да, конечно. с индексом 3.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.