Перейти к содержанию
    

передача элемента структуры в ф-ю

есть структура

typedef struct{  
    uint8_t outgoing[4];
} outgoing_t;

outgoing_t    outgoing_arr [10];

 

так корректно передать в ф-ю элемент этой структуры?

memcpy(&outgoing_arr[0].outgoing, local_outgoing, 4);

 

просто если без & передавать, то тоже работает.

Не сообразить, как правильно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

если без & то и без [] надо, а как лучше монопенисульно, ибо одно и тоже

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

нет, структуры именно передаются с &, а массивы просто- имя

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

нет, структуры именно передаются с &, а массивы просто- имя

Ну, что называется вам виднее :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

так ответа на вопрос и не увидел.

я разве не прав, что передача структуры именно с & должна быть?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

& - вполне уместен и для массивов. Вы пользуетесь неявным преобразованием в указатель, но повторюсь &arr == arr == &arr[0], с точностью до типов разумеется. Амперсанд должен быть везде где вы берете указатель, просто за его отсутствие для массива вас не ругает компилятор.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

с массивом понятно.

со структурой - не очень.

ф-я принимает аргумент- адрес массива.

у меня этот массив- поле структуры.

 

т.е. либо так передаю

int arr [10];
func (arr);

либо поле структуры.

напишите- как

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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]

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

есть 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, компилятор знает, что имя массива- это адрес его нулевого элемента.

Чуть запутанность при передаче поля структуры, которое является массивом.

&outgoing_arr[0].outgoing[0]

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

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

 

т.е. при передаче элемента структуры, например 3, будет выглядеть так:

&outgoing_arr[3].outgoing[0]

 

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

Изменено пользователем Herz
Избыточное цитирование

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

....

Чуть запутанность при передаче поля структуры, которое является массивом.

.....

Никакой запутанности. Функции, которая получает Ваш массив - пополам, где он изначально находится

- в структуре или отдельно. Так как в декларации аргументов ф-ии определено, что передается

указатель на массив (другими словами, начальный адрес области памяти, где расположен массив).

Соотв-но ф-ия "не знает" что он где-то в составе какой либо структуры. Или еще чего-либо :)

 

Если же Вы хотите, чтобы функции было "не все равно" - передавайте ей в кач-ве аргумента

указатель на структуру, в составе которой есть массив и может быть еще что-то.

Так обычно и делается, если надо передать блок разнородных данных - без "балластной" операции копирования.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

т.е. при передаче элемента структуры, например 3, будет выглядеть так:...

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

 

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

 

&outgoing_arr[3].outgoing[0]; // это адрес нулевого элемента массива-члена структуры outgoing из третьего элемента массива структур outgoing_arr.

Изменено пользователем Arlleex

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я хочу передать адрес элемента структуры, который, в свою очередь, находится в одной из массивов структур.

т.о. верным решением будет для третьей структуры:

&outgoing_arr[3].outgoing[0];

и моя ф-я в качестве аргумента принимает адрес массива. А то что он находится в третьей структуре- не важно.

Подтвердите мысль.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...