Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C语言中使用结构或多维数组_C - Fatal编程技术网

在C语言中使用结构或多维数组

在C语言中使用结构或多维数组,c,C,我想创建一个故障日志。故障日志应该能够存储最后10个故障 故障有3条信息: 1.故障数。 2.错误名称。 3.故障日期和时间 如何使用structs执行此操作 或者我应该使用数组来实现它,如果是这样,如何实现 故障日志仅用于存储在内存中。我假设您希望将其存储在内存中,那么您可以使用struct和array的组合 像下面这样的方法可以: typedef struct { int number; char* name; // You can use an array instead

我想创建一个故障日志。故障日志应该能够存储最后10个故障

故障有3条信息: 1.故障数。 2.错误名称。 3.故障日期和时间

如何使用structs执行此操作

或者我应该使用数组来实现它,如果是这样,如何实现


故障日志仅用于存储在内存中。

我假设您希望将其存储在内存中,那么您可以使用struct和array的组合

像下面这样的方法可以:

typedef struct {
    int number;
    char* name; // You can use an array instead char name[MAX_FAULT_NAME_LENGTH]
    int timestamp;
} fault_entry;

fault_entry fault_log[10];

当然这是挥手。如果要将其存储到文件中,则需要序列化。您需要考虑日期/时间和名称的数据类型。但是它应该可以帮助您入门。

我假设您希望将其存储在内存中,然后您可以使用struct和array的组合

像下面这样的方法可以:

typedef struct {
    int number;
    char* name; // You can use an array instead char name[MAX_FAULT_NAME_LENGTH]
    int timestamp;
} fault_entry;

fault_entry fault_log[10];

当然这是挥手。如果要将其存储到文件中,则需要序列化。您需要考虑日期/时间和名称的数据类型。但它应该可以帮助您入门。

您应该使用结构类型的数组,例如

#define NAME_MAXLEN 20
struct fault {
     int number;
     time_t time;
     char name[NAME_MAXLEN];
};

struct fault faults[10];

])

应该使用结构类型的数组,例如

#define NAME_MAXLEN 20
struct fault {
     int number;
     time_t time;
     char name[NAME_MAXLEN];
};

struct fault faults[10];

])

大致如下:

typedef struct fault
{
    int number;
    char *name;
    char *date;
} fault;

fault faults[10];

faults[0].number = 1;
faults[0].name = "Fault Number 1";
faults[0].date = "Today's Date";

/*etc*/

printf("%d\n", faults[0].number);
printf("%s\n", faults[0].name);
printf("%s\n", faults[0].date);

当然,您需要决定使用哪种时间类型。这里,我使用了一个字符串。

大致如下:

typedef struct fault
{
    int number;
    char *name;
    char *date;
} fault;

fault faults[10];

faults[0].number = 1;
faults[0].name = "Fault Number 1";
faults[0].date = "Today's Date";

/*etc*/

printf("%d\n", faults[0].number);
printf("%s\n", faults[0].name);
printf("%s\n", faults[0].date);

当然,您需要决定使用哪种时间类型。在这里,我使用了一个字符串。

日志通常意味着某种更持久的存储,这可能意味着它应该写入文件。如果是这样,则不一定需要结构。它可以实现为一个函数,接受所需信息并生成其他信息(例如,时间/日期)

但如果它确实是一种临时存储类型,那么它可以存储在一个简单的循环数组中。保留数组中当前位置的索引并写入该位置

typedef struct {
   int faultNumber;
   char faultName[50];  // length should probably be a #define
   char faultDate[20];  // date in C could be stored in some kind of char array.
                        // or it could be something representing results of something
                        // like a time_t result.
} LOG_ENTRY;

LOG_ENTRY LOGS[10];
int iCurPos = 0;

然后在当前位置添加一个条目,并递增iCurPos,当它到达末尾时将其循环回0。

日志通常意味着某种更持久的存储,这可能意味着它应该写入文件。如果是这样,则不一定需要结构。它可以实现为一个函数,接受所需信息并生成其他信息(例如,时间/日期)

但如果它确实是一种临时存储类型,那么它可以存储在一个简单的循环数组中。保留数组中当前位置的索引并写入该位置

typedef struct {
   int faultNumber;
   char faultName[50];  // length should probably be a #define
   char faultDate[20];  // date in C could be stored in some kind of char array.
                        // or it could be something representing results of something
                        // like a time_t result.
} LOG_ENTRY;

LOG_ENTRY LOGS[10];
int iCurPos = 0;

然后在当前位置添加一个条目,并递增iCurPos,当它到达末尾时将其循环回0。

正如您所提到的,在需要序列化的情况下,最好使用固定宽度的字符数组作为名称字符串。是的,我只想将其存储在内存中。我知道你在那里做了什么。有没有一种方法可以让阵列按最新故障的先后顺序排列?是的,你可以。为此,每次插入图元之前,都要将所有现有图元复制到下一个位置,并删除最后一个图元。在位置0处插入新元素。如果您想经常对其中的字符数组执行这些操作,那么最好保留char*。一个更好的选择是,每次添加一个元素时移动所有元素,只需保留当前“top”元素的索引,并在替换当前“top”元素时增加该索引(模10)。根据Mark Wilkins的回答,这是一个循环缓冲区:正如你提到的,如果你想序列化,最好使用固定宽度的字符数组作为名称字符串。是的,我只想将其存储在内存中。我知道你在那里做了什么。有没有一种方法可以让阵列按最新故障的先后顺序排列?是的,你可以。为此,每次插入图元之前,都要将所有现有图元复制到下一个位置,并删除最后一个图元。在位置0处插入新元素。如果您想经常对其中的字符数组执行这些操作,那么最好保留char*。一个更好的选择是,每次添加一个元素时移动所有元素,只需保留当前“top”元素的索引,并在替换当前“top”元素时增加该索引(模10)。根据马克·威尔金斯的回答,这是一个循环缓冲区:@nobugz:不要假设代码运行在有文件系统的地方,只是试图覆盖99%的情况。如果没有,他们会知道的。希望如此。@nobugz:不要假设代码运行在有文件系统的地方。只是尝试覆盖99%的情况。如果没有,他们会知道的。有希望地。