我正在尝试在循环中创建一个由结构组成的数组(或者可能创建结构数组?),该代码适用于单个结构,但我需要使用 losuj_liczbe 函数在循环中创建其中 5 个,以分配随机数。每次我收到此错误: 可变大小的对象可能无法初始化。 请帮忙!
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define n 5
typedef enum
{
Bialy,
Czarny,
Czerwony,
Niebieski
}Kolor;
typedef enum
{
Podstawowe,
Standard,
Premium
}Wyposazenie;
typedef struct Samochod
{
int waga;
int cena;
Kolor kolor;
Wyposazenie wyposazenie;
}Samochod;
int losuj_liczbe(int min, int max)
{
int rolex;
time_t tt;
rolex=time(tt);
srand(rolex);
int temp;
if (max >=min)
max -= min;
else{
temp = min - max;
min = max;
max = temp;
}
return ((rand()% (max-min) + min));
}
int main()
{
int i;
Samochod automobil[n];
for(i=0; i<n; i++){
Samochod automobil[i] = {{.waga = losuj_liczbe(500,1500),
.cena = losuj_liczbe(20000,30000),
.kolor = ((0 == losuj_liczbe(0,3)) ? Bialy :(1 == losuj_liczbe(0,3)) ? Czarny :(2 == losuj_liczbe(0,3)) ? Czerwony : Niebieski),
.wyposazenie = ((0 == losuj_liczbe(0,2)) ? Podstawowe :(1 == losuj_liczbe(0,2)) ? Standard : Premium)}};
}
printf("%d | %d | %s | %s",
automobil.waga,
automobil.cena,
(0 == automobil.kolor) ? "Bialy" : (1 == automobil.kolor) ? "Czarny" : (2 == automobil.kolor) ? "Czerwony" : "Niebieski",
(0 == automobil.wyposazenie) ? "Podstawowe" : (1 == automobil.wyposazenie) ? "Standard" : "Premium");
return 0;
}
最佳答案
有很多问题:
仅举几例:
srand
只能在程序开始时调用一次。单个 srand(time(NULL)); 就足够了。阅读srand
和time
函数的文档- 第一次循环中
automobil[i]
的赋值全部错误 - 您的
printf
是错误且毫无意义的,您需要执行另一个for
循环来显示所有汽车。 - 您需要在
printf
格式字符串的末尾添加\n
。 - 按照惯例,所有宏名称都应大写,因此您应该使用
#define NUMBEROFCARS 5
,而不是#define n 5
。并且绝对应该避免短宏名称,例如N
、A
、X
。这只是一个可读性问题。
您可能想要这个:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define NUMBEROFCARS 5
typedef enum
{
Bialy,
Czarny,
Czerwony,
Niebieski
}Kolor;
typedef enum
{
Podstawowe,
Standard,
Premium
}Wyposazenie;
typedef struct Samochod
{
int waga;
int cena;
Kolor kolor;
Wyposazenie wyposazenie;
}Samochod;
int losuj_liczbe(int min, int max)
{
int temp;
if (max >= min)
max -= min;
else {
temp = min - max;
min = max;
max = temp;
}
return ((rand() % (max - min) + min));
}
int main()
{
srand(time(NULL));
int i;
Samochod automobil[NUMBEROFCARS];
for (i = 0; i < NUMBEROFCARS; i++) {
automobil[i].waga = losuj_liczbe(500, 1500);
automobil[i].cena = losuj_liczbe(20000, 30000);
automobil[i].kolor = ((0 == losuj_liczbe(0, 3)) ? Bialy : (1 == losuj_liczbe(0, 3)) ? Czarny : (2 == losuj_liczbe(0, 3)) ? Czerwony : Niebieski);
automobil[i].wyposazenie = ((0 == losuj_liczbe(0,2)) ? Podstawowe : (1 == losuj_liczbe(0,2)) ? Standard : Premium);
}
for (i = 0; i < NUMBEROFCARS; i++) {
printf("%d | %d | %s | %s\n",
automobil[i].waga,
automobil[i].cena,
(0 == automobil[i].kolor) ? "Bialy" : (1 == automobil[i].kolor) ? "Czarny" : (2 == automobil[i].kolor) ? "Czerwony" : "Niebieski",
(0 == automobil[i].wyposazenie) ? "Podstawowe" : (1 == automobil[i].wyposazenie) ? "Standard" : "Premium");
}
return 0;
}
这个程序还是很尴尬,尤其是把颜色转换为颜色名称的可怕的三元表达式应该重构。
关于C:在 for 循环中创建结构体数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46643741/