C язык: копировать данные из одной структуры typedef в другую и возвращать значение - PullRequest
0 голосов
/ 16 апреля 2020

Я новичок в C и сейчас я работаю со структурами. Я застрял и был бы очень признателен, если бы кто-нибудь пришел мне на помощь. Поэтому у меня есть функция для записи входных данных из основного модуля в субмодуль. Он должен вернуть 0, если он пишет успешно, и 1, если это не удалось. Я читал широко, но я все еще не уверен, использовать ли memcpy или нет. Затем по возвращаемому значению я прочитал, что memcpy возвращает 0, если операция прошла успешно, и 1, если это не так. Вот эта часть моего кода:

typedef struct {
    UINT32 carnum_n;
    UINT32 carnum_k;
    UINT32 results[30];
    UINT32 feedback[30];  
    UINT32 errors[30];
} MAIN;

typedef struct {
   UINT32 carnum_n;
   UINT32 carnum_k;
   UINT32 feedback[30];
} SETTING;

/* function to copy the data from the main to the sub-module */    
UINT32 Write( MAIN *data, SETTING *info)
{
   sc_memcpy ( &info->carnum_k, &data->carnum_k, sizeof (SETTING));
   sc_memcpy ( &info->feedback, &data->feedback, sizeof (SETTING));  //copies the array
}
  1. Скажите, пожалуйста, это правильно? Если нет, как правильно написать? Или какие у меня есть альтернативы?
  2. Поскольку у меня также есть массив, как мне go узнать об этом? Что изменится, когда мне придётся сохранить, скажем, up to fb [10] из основного модуля в подмодуль?
  3. Как включить условие возврата, учитывая, что я должен написать ОДНУ строку кода для копирования каждого тип данных из таблицы основного модуля во входную таблицу субмодуля?

Я действительно хочу сделать это правильно. Заранее спасибо:)

1 Ответ

0 голосов
/ 16 апреля 2020

Вопрос 1, ваш код неверен.

При копировании carnum_k неправильный sizeof(SETTING). sizeof (SETTING) означает размер всех данных в структуре SETTING. Но вам просто нужно скопировать carnum_k, поэтому вам нужно указать размер carnum_k, который равен sizeof (UINT32), UINT32 - это тип carnum_k.

memcpy ( &info->carnum_k, &data->carnum_k, sizeof (UINT32));

Вы также можете просто написать назначение info->carnum_k = data->carnum_k.

У копии обратной связи есть две проблемы.

  1. sizeof (SETTING) не так, как при копировании carnum_k. Вы можете использовать sizeof(UINT32 [30]), UINT32 [30] - тип feedback.
  2. info->feedback - адрес массива, поэтому нет необходимости &info->feedback, просто info->feedback.
memcpy(info->feedback, data->feedback, sizeof(UINT32 [30]));

Вопрос 2. Я думаю, вы хотите просто скопировать часть feedback.

Когда вы копируете память, вам нужно выяснить sr c адрес памяти, адрес памяти dest и размер памяти, которую вы хотите скопировать.

, поэтому если вы хотите скопировать с feedback[2] в feedback[10].

  • адрес источника равен &(data->feedback[2])
  • адрес назначения - &(info->feedback[2]).
  • . От 2 до 10 необходимо скопировать 9 значений, поэтому общий размер составляет 9 * sizeof(UINT32)
memcpy(&(info->feedback[2]), &(data->feedback[2]), 9*sizeof(UINT32));

Вопрос 3.

Я не знаю ответа.

...