我正在尝试制作一个包含菜单的程序,并且可以选择设置“当前”日期。我可以定义日期,它将一直保持到程序关闭。我有另一种方法来获取日期,通过询问用户链接一个人的日期,问题是它不会继续主菜单上的主要数据。它只是人员结构上.date的数据,我想我解释得很好。我尝试了很多方法,如果有人可以帮助我的话,我真的无法理解......
typeData readData() {
int val;
typeData data;
do {
printf("Day: ");
data.day = readInteger(MIN_DAYS, MAX_DAYS);
printf("Month: ");
data.month = readInteger(MIN_MONTH, MAX_MONTH);
printf("Year: ");
data.year = readInteger(MIN_YEAR, MAX_YEAR);
val = validateData(data);
if(val == 0) {
printf("The data is not valid.\n");
}
} while (val == 0);
return data;
}
我想我需要通过引用来获取它,但我已经尝试了一段时间而且不能这样做。谢谢大家。
答案 0 :(得分:5)
虽然它是合法的C,但是通过值传递结构并返回它们通常不是最好的方法。考虑:
void
readData(typeData *data)
{
int val;
do {
printf("Day: ");
data->day = readInteger(MIN_DAYS, MAX_DAYS);
printf("Month: ");
data->month = readInteger(MIN_MONTH, MAX_MONTH);
printf("Year: ");
data->year = readInteger(MIN_YEAR, MAX_YEAR);
val = validateData(data);
if (val == 0) {
printf("The data is not valid.\n");
}
} while (val == 0);
}
<强>更新强>
以下是一个示例主程序以及validateData
的示例更改:
int
validateData(typeData *data)
{
int data_valid = 1;
// check for error
// this is whatever checks you already do ...
if (data->... != ...)
data_valid = 0;
return data_valid;
}
int
main(int argc,char **argv)
{
typeData main_data;
readData(&main_data);
// do something useful with the data [or transform it, etc]
processData(&main_data);
// print some results
printData(&main_data);
return 0;
}
更新#2:
根据您的最新示例,这是一个经过修改的[部分]程序。我不得不猜测整个组织,但至少它对menuPrincipal
进行了必要的更改:
int
validateData(typeData *data)
{
int data_valid = 1;
// check for error
// this is whatever checks you already do ...
if (data->... != ...)
data_valid = 0;
return data_valid;
}
char
menuPrincipal(typeDate *date)
{
char option;
if (date->day == 0 && date->month == 0 && data->year == 0) {
printf("Date not set yet.\n");
}
else {
printf("Date: %d/%d/%d", date->day, date->month, date->year);
}
// more stuff
return option;
}
int
main(int argc,char **argv)
{
typeData main_data;
char option;
while (1) {
readData(&main_data);
option = menuPrincipal(&main_data);
switch (option) {
case 'a': // do something
break;
case 'b': // do something else
break;
default:
printf("unknown option: '%c'\n",option);
break;
}
}
return 0;
}
更新#3:
根据您的最新评论,我想我发现您遇到了什么问题。我已采用您最新的代码段并进行了更新:
// your original code -- this no longer works because readData is now void
if (data->ano == 0 && data->mes == 0 && data->dia == 0) {
Blah[*Bleh].date = readData(*data);
}
// one possibility -- but it does _not_ update "data"
if (data->ano == 0 && data->mes == 0 && data->dia == 0) {
readData(&Blah[*Bleh].date);
}
// this is more likely what you want -- it updates _both_:
if (data->ano == 0 && data->mes == 0 && data->dia == 0) {
readData(data);
Blah[*Bleh].date = *data;
}
答案 1 :(得分:0)
现在可以使用,我正在使用
val = validateDate(&date)
关于readData
的原始函数,现在我将其更改为
val = validateDate(date)
它有效!
我只是不知道为什么我需要使用date
代替&date
,我认为如果我通过引用传递参数,我需要&#39;&amp;& #39;符号