2009-10-03 1 views
1

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

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]; 

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

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

Я получаю ошибку компиляции о назначении обугленного * на символ [128] (структура Foo * на структуру Foo [16], соответственно).

Я попробовал решение, которое я нашел с помощью Google для части строки:

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

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

+0

домашнего задания любым? –

+1

Почему я должен брать классы C, не желая учиться C? – 2009-10-03 10:46:07

+1

'bar' и' name' не являются (обязательно) строками с нулевым завершением - они являются массивами символов фиксированной длины. Без дополнительной информации о том, что эти массивы действительно содержат, вы не должны использовать strcpy вообще. –

ответ

4

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

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

Таким образом, вместо:

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

Использование

memcpy(new[0].data, old[0].data, sizeof(foo) * 16); 
+0

И я предполагаю, что это будет работать независимо от типов элементов структуры (например, если у меня есть uint32_t из stdint)? – 2009-10-03 10:50:08

+0

На самом деле это было memcpy (new [0] .data, old [0] .data, sizeof (struct foo) * 16); но это сработало, спасибо большое! – 2009-10-03 10:55:36

+0

Вы можете взять константу с помощью sizeof (old [0] .data) вместо явного вычисления (sizeof (element) * number_of_elements). Таким образом, он не будет разрываться, если массив расширен в размере. –

2

Вы также можете обернуть массивы 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

Ницца! И тебе спасибо! – 2009-10-03 11:14:01

0

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

Как мы имеем дело с массивом, мы не можем сделать этот вид операции

new.name = old.name;

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

недействительной функции (символ * имя, структура new_format * новый); , где вам нужно назначить charecter один за другим.

Очевидно вы назовете так: Function (old.name, & новым)