繁体   English   中英

如何在不使用C的全局声明的情况下返回结构

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM