[英]How to return a struct without using global declaration of struct in C
您好,我正在尝试从函数返回结构,但是我没有找到一种方法来将结构声明为全局结构。 如何才能做到这一点? 这是代码(按原样工作)
...
void log_in();
struct node
{
char name_log[20];
int passlog;
int user_point;
}tmp;
int main()
{
...
else if(sel=='2')
{
log_in();
if (tmp.passlog==TRUE)
logged_in(tmp.name_log,tmp.user_point); //and here i want to use the retun values
}
void log_in()
{
... //make the changes in the struct
}
...
我要实现的是将struct节点声明放置在main内,但可惜它无法正常工作。 因此,这是我要尝试执行的操作:(此操作无效)
...
struct node log_in();
int main() {
...
else if(sel=='2') {
struct node //here is where i want to declare
{
char name_log[20];
int passlog;
int user_point;
}tmp;
log_in();
if (tmp.passlog==TRUE)
logged_in(tmp.name_log,tmp.user_point); //and here i want to use the retun values
}
struct node log_in()
{
...
return tmp;
}
...
else if(sel=='2') //or within this block but I don't know how.
{ struct node tmp;
tmp=log_in();
if (tmp.passlog==TRUE)
logged_in(tmp.name_log,tmp.user_point); //and here I want to use the return values
}
在函数log_in()中
struct node log_in()
{
struct tmp
...
return tmp;
}
在函数内部使用局部变量并返回此变量。 将其分配给main()中的另一个变量。
首先声明结构,然后创建变量temp
。 像这样:
struct node
{
char name_log[20];
int passlog;
int user_point;
};
然后您可以创建局部变量,例如
struct node tmp;
将指向struct node
的指针传递到log_in
函数,并使其返回布尔值,以便调用方可以检查是否成功登录。 (请注意,我正在尝试猜测您想要实现的目标,而且我可能正在猜测错误。)
#include <stdio.h>
#include <string.h>
struct node {
char name_log[20];
int passlog;
int user_point;
};
int log_in(char, struct node *);
int log_in(char sel, struct node * tmp) {
int ret = 0;
if (sel == '2') {
ret = 1;
strcpy( tmp->name_log, "Gonzo" );
tmp->passlog = 33;
tmp->user_point = 99;
}
return ret;
}
int main(int argc, char ** argv) {
struct node tmp;
char sel = argv[1][0];
if ( log_in(sel, &tmp) ) {
// tmp initialized
printf( "%s, %d, %d\n", tmp.name_log, tmp.passlog, tmp.user_point );
}
else {
// tmp not initialized
}
}
在命令行上调用传递2
。 (如果不这样做,则不确定的行为。)
如果要在2个不同的例程中使用某些结构,则必须在两个例程的外部声明它,因为它们都必须了解此结构的结构。 顺便说一句-您调用log_in但不使用其返回值。
您不能对未知类型进行操作。 如果log_in()
不知道struct node
的定义,则不能直接使用它。 它唯一能做的就是以某种方式接收指向该类型变量的指针,然后将其视为原始数据(字节序列),或将所述指针转换为指向已知log_in()
类型的指针并进行处理。
您还可以在log_in()
内部重新定义struct node
,这是使log_in()
在已知类型上运行的一种方式:
void log_in(void*);
void logged_in(char*, int);
int main(void)
{
int sel = '2';
if (sel == '2')
{
struct node
{
char name_log[20];
int passlog;
int user_point;
} tmp;
log_in(&tmp);
if (tmp.passlog)
logged_in(tmp.name_log, tmp.user_point);
}
return 0;
}
void log_in(void* n)
{
struct node
{
char name_log[20];
int passlog;
int user_point;
} *p = n;
p->passlog = 1;
}
void logged_in(char* name, int point)
{
}
如果您不想通过正式引用将tmp
传递到log_in()
,则必须使其全局可用。 例如这样:
void log_in(void);
void logged_in(char*, int);
void* pTmp;
int main(void)
{
int sel = '2';
if (sel == '2')
{
struct node
{
char name_log[20];
int passlog;
int user_point;
} tmp;
pTmp = &tmp;
log_in();
if (tmp.passlog)
logged_in(tmp.name_log, tmp.user_point);
}
return 0;
}
void log_in(void)
{
struct node
{
char name_log[20];
int passlog;
int user_point;
} *p = pTmp;
p->passlog = 1;
}
void logged_in(char* name, int point)
{
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.