C: копирование элементов структуры / массива - PullRequest
1 голос
/ 03 октября 2009

У меня есть файл в известном формате, и я хочу преобразовать его в новый формат, например ::

struct foo {
    char            bar[256];
};

struct old_format {
    char            name[128];
    struct foo      data[16];
};

struct new_format {
    int             nr;
    char            name[128];
    struct foo      data[16];
};

static struct old_format old[10];
static struct new_format new[10];

Проблема: после заполнения «старых» данными я не знаю, как скопировать их содержимое в «новые». Если я сделаю

new[0].name = old[0].name;
new[0].data = old[0].data;

Я получаю ошибку компиляции о назначении char * для char [128] (struct foo * для struct foo [16] соответственно).

Я попробовал решение, которое нашел через Google для строковой части:

strcpy (new[0].name, old[0].name);
new[0].data = old[0].data;

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

Ответы [ 3 ]

4 голосов
/ 03 октября 2009

Если вы не хотите изучать C, вы должны иметь возможность читать старый формат файла на любом языке с полуприличной библиотекой ввода-вывода.

Чтобы завершить то, что вы пытаетесь сделать в C, вы можете использовать memcpy.

Так что вместо:

new[0].data = old[0].data;

Используйте

memcpy(new[0].data, old[0].data, sizeof(foo) * 16);
2 голосов
/ 03 октября 2009

Вы также можете обернуть массивы C в struct. Тогда копирующие элементы автоматически скопируют массив.

typedef struct {
    char name[100];
} name_array_t;

struct {
    name_array_t name_struct;
    ...
} x;

struct {
    name_array_t name_struct;
    ... other members ...
} y;

x.name_struct = y.name_struct;
0 голосов
/ 03 октября 2009

(может быть слишком очевидное решение)

Поскольку мы имеем дело с массивом, мы не можем выполнять такую ​​операцию

new.name = old.name;

так что я полагаю, вам нужно написать функцию

void Function (char * name, struct new_format * new); где вам нужно назначить персонажа один за другим.

Очевидно, вы будете вызывать так: Функция (old.name, & new)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...