Объединения

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Со структурой данных вроде как определились. А вот если данные нужно вводить через диалог, то само приложение должно быть с графическим интерфейсом или как? Эти данные должны куда-нибудь сохраняться или нет?
Kazanove
Сообщения: 41
Зарегистрирован: 24 фев 2016, 14:55

вот в том то и дело что только прошли объединения и нежно именно через unuion. Единственный вариант к которому я пришел что нужно создать структуру (struct) а каждое поле через объединение (union). Не вижу в это смысла :(
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Бессмысленность задания налицо. Предлагаю это обсудить с преподавателем и уточнить задание.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Могу лишь предположить, что 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;
Kazanove
Сообщения: 41
Зарегистрирован: 24 фев 2016, 14:55

а почему оно при вот таком выдает ошибку :(
слишком много значений инициализатра

Код: Выделить всё

void main(void){
	DATA_RECORD = {
		{ "1", "Шкворень","36.00","253691","85.00","12.06.1999" }
	};
}
Kazanove
Сообщения: 41
Зарегистрирован: 24 фев 2016, 14:55

нашел ... надо было вот так

Код: Выделить всё

void main(void){
    DATA_RECORD[10] = {
        { "1", "Шкворень","36.00","253691","85.00","12.06.1999" }
    };
}
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Вообще-то правильно было бы писать так...

Код: Выделить всё

void main(void){
    DATA_RECORD data[10] = {
        { 1, "Шкворень", 36.00, 253691, 85.00, {12, 6, 1999} }
    };
}
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Вообще-то правильно было бы писать так:

Код: Выделить всё

	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);
}
Kazanove
Сообщения: 41
Зарегистрирован: 24 фев 2016, 14:55

в объявление функции что то не так
может как то так

Код: Выделить всё

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);
}
Аватара пользователя
Decoder
Сообщения: 308
Зарегистрирован: 19 фев 2008, 23:11
Откуда: Moscow

Ключевое слово static в данном примере вообще лишнее, а у тебя оно используется дважды без какой-либо необходимости.
И зачем ты убрал typedef из определения структуры DATA_RECORD_STRUCT?
Поумнеть несложно, куда труднее от дури избавиться.
Ответить