Объединения
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
Со структурой данных вроде как определились. А вот если данные нужно вводить через диалог, то само приложение должно быть с графическим интерфейсом или как? Эти данные должны куда-нибудь сохраняться или нет?
вот в том то и дело что только прошли объединения и нежно именно через unuion. Единственный вариант к которому я пришел что нужно создать структуру (struct) а каждое поле через объединение (union). Не вижу в это смысла 

- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Бессмысленность задания налицо. Предлагаю это обсудить с преподавателем и уточнить задание.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Могу лишь предположить, что union должен представлять некий унифицированный тип данных (целое число, указатель на строку, дата, дробное число). Если это так, то данные будут представлены следующим образом...
Код: Выделить всё
typedef struct DATE_STRUCT
{
unsigned char Day;
unsigned char Month;
unsigned short Year;
} DATE;
typedef union DATA_UNION
{
char* text;
long number;
float real;
DATE date;
} UNIDATA;
typedef struct DATA_RECORD_STRUCT
{
UNIDATA count; // Порядковый номер
UNIDATA name; // Наименование
UNIDATA weight; // Вес
UNIDATA index; // Номер по каталогу
UNIDATA price; // Цена
UNIDATA release; // Дата выпуска
} DATA_RECORD;
а почему оно при вот таком выдает ошибку 
слишком много значений инициализатра

слишком много значений инициализатра
Код: Выделить всё
void main(void){
DATA_RECORD = {
{ "1", "Шкворень","36.00","253691","85.00","12.06.1999" }
};
}
нашел ... надо было вот так
Код: Выделить всё
void main(void){
DATA_RECORD[10] = {
{ "1", "Шкворень","36.00","253691","85.00","12.06.1999" }
};
}
Вообще-то правильно было бы писать так...
Код: Выделить всё
void main(void){
DATA_RECORD data[10] = {
{ 1, "Шкворень", 36.00, 253691, 85.00, {12, 6, 1999} }
};
}
Вообще-то правильно было бы писать так:
Но такая явная инициализация каждой записи будет выглядеть слишком громоздко и неудобно будет вносить изменения. Поэтому лучше будет создать отдельную функцию для инициализации полей записи. В эту функцию будут передаваться данные нужного типа по всем полям записи, а внутри функции будет происходить инициализация соответствующих полей структуры.
Вот как-то так это должно выглядеть...
Код: Выделить всё
DATA_RECORD data[10] = {0};
data[0].count.number = 1;
data[0].name.text = "Шкворень";
data[0].weight.real = 36.00;
data[0].index.number = 253691;
data[0].price.real = 85.00;
data[0].release.date.Day = 12 ;
data[0].release.date.Month = 6;
data[0].release.date.Year = 1999;
Вот как-то так это должно выглядеть...
Код: Выделить всё
void InitRecord(DATA_RECORD& record, long count, char* name, float weight, long index, float price, const DATE& date)
{
record.count.number = count;
record.name.text = name;
record.weight.real = weight;
record.index.number = index;
record.price.real = price;
record.release.date = date;
}
void main (void)
{
DATA_RECORD data[10] = {0};
DATE release = {12, 6, 1999};
InitRecord(data[0], 1, "Шкворень", 36.00, 253691, 85.00, release);
}
в объявление функции что то не так
может как то так
может как то так
Код: Выделить всё
typedef struct DATE_STRUCT{
unsigned char Day;
unsigned char Month;
unsigned short Year;
} DATE;
typedef union DATA_UNION{
char* text;
long number;
float real;
DATE date;
} UNIDATA;
static struct DATA_RECORD_STRUCT{
UNIDATA count; // Порядковый номер
UNIDATA name; // Наименование
UNIDATA weight; // Вес
UNIDATA index; // Номер по каталогу
UNIDATA price; // Цена
UNIDATA release; // Дата выпуска
};
void InitRecord(struct DATA_RECORD_STRUCT &record, long count, char* name, float weight, long index, float price, const DATE &date)
{
record.count.number = count;
record.name.text = name;
record.weight.real = weight;
record.index.number = index;
record.price.real = price;
record.release.date = date;
}
void main(void)
{
static struct DATA_RECORD_STRUCT DATA_RECORD[10] = { 0 };
DATE release = { 12, 6, 1999 };
InitRecord(DATA_RECORD[0], 1, "Шкворень", 36.00, 253691, 85.00, release);
}
Ключевое слово static в данном примере вообще лишнее, а у тебя оно используется дважды без какой-либо необходимости.
И зачем ты убрал typedef из определения структуры DATA_RECORD_STRUCT?
И зачем ты убрал typedef из определения структуры DATA_RECORD_STRUCT?
Поумнеть несложно, куда труднее от дури избавиться.