реклама на сайте
подробности

 
 
> передача элемента структуры в ф-ю
Метценгерштейн
сообщение Nov 3 2016, 13:50
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 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);


просто если без & передавать, то тоже работает.
Не сообразить, как правильно.
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 16)
DASM
сообщение Nov 3 2016, 14:07
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



если без & то и без [] надо, а как лучше монопенисульно, ибо одно и тоже
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Nov 3 2016, 14:15
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



нет, структуры именно передаются с &, а массивы просто- имя
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Nov 3 2016, 17:54
Сообщение #4


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



Цитата(Метценгерштейн @ Nov 3 2016, 07:15) *
нет, структуры именно передаются с &, а массивы просто- имя

Ну, что называется вам виднее sm.gif
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Nov 3 2016, 19:36
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



так ответа на вопрос и не увидел.
я разве не прав, что передача структуры именно с & должна быть?
Go to the top of the page
 
+Quote Post
Kabdim
сообщение Nov 3 2016, 19:53
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



& - вполне уместен и для массивов. Вы пользуетесь неявным преобразованием в указатель, но повторюсь &arr == arr == &arr[0], с точностью до типов разумеется. Амперсанд должен быть везде где вы берете указатель, просто за его отсутствие для массива вас не ругает компилятор.
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Nov 3 2016, 19:58
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



с массивом понятно.
со структурой - не очень.
ф-я принимает аргумент- адрес массива.
у меня этот массив- поле структуры.

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

либо поле структуры.
напишите- как
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Nov 3 2016, 20:04
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 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]
...
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Nov 3 2016, 20:08
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



вот как мы можем весь массив local_outgoing скопировать в один элемент
outgoing[1] из outgoing_arr[0] ?

нужно весь local_outgoing копировать в весь outgoing из outgoing_arr[0]
Go to the top of the page
 
+Quote Post
skripach
сообщение Nov 3 2016, 22:11
Сообщение #10


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443



Код
&outgoing_arr[0].outgoing[0]

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


--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post
k155la3
сообщение Nov 4 2016, 06:57
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 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) );

Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Nov 4 2016, 07:33
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 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
Причина редактирования: Избыточное цитирование
Go to the top of the page
 
+Quote Post
k155la3
сообщение Nov 4 2016, 07:44
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



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

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

Если же Вы хотите, чтобы функции было "не все равно" - передавайте ей в кач-ве аргумента
указатель на структуру, в составе которой есть массив и может быть еще что-то.
Так обычно и делается, если надо передать блок разнородных данных - без "балластной" операции копирования.
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Nov 4 2016, 07:50
Сообщение #14


Местный
***

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Nov 4 2016, 07:58
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



я хочу передать адрес элемента структуры, который, в свою очередь, находится в одной из массивов структур.
т.о. верным решением будет для третьей структуры:
&outgoing_arr[3].outgoing[0];
и моя ф-я в качестве аргумента принимает адрес массива. А то что он находится в третьей структуре- не важно.
Подтвердите мысль.
Go to the top of the page
 
+Quote Post
k155la3
сообщение Nov 4 2016, 08:15
Сообщение #16


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



вроде как да. Только не в "третьей" (по счету) а "с индексом 3" , по счету - четвертая (0123).

Сообщение отредактировал Herz - Nov 4 2016, 09:41
Причина редактирования: Избыточное цитирование
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Nov 4 2016, 09:09
Сообщение #17


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



да, конечно. с индексом 3.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 31st July 2025 - 14:08
Рейтинг@Mail.ru


Страница сгенерированна за 0.01514 секунд с 7
ELECTRONIX ©2004-2016