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

时间:2012-01-29 10:20:25

标签: c struct return return-value

你好我试图从一个函数返回一个结构但我无法找到一种方法这样做而不将结构声明为全局。如何才能做到这一点?这是代码(这就是它的工作原理)

...
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
}
...

我想要实现的是将结构节点声明放在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;
    }
    ...

5 个答案:

答案 0 :(得分:3)

 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()中的另一个变量。

答案 1 :(得分:1)

首先声明结构,然后创建变量temp。像这样:

struct node
{
    char name_log[20];
    int passlog;
    int user_point;
};

然后你可以创建像

这样的局部变量
struct node tmp;

答案 2 :(得分:1)

将指向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。 (如果不这样做,未定义的行为。)

答案 3 :(得分:1)

如果你想在两个不同的例程中使用一些结构 - 你必须在它们之外声明它,因为它们都必须看到这个结构的结构。 顺便说一句 - 您调用log_in但不使用其返回值。

答案 4 :(得分:0)

您无法对未知类型进行操作。如果log_in()不知道struct node的定义,则无法直接使用它。它唯一能做的就是以某种方式接收指向这种类型变量的指针,然后将其视为原始数据(字节序列)或将指针强制转换为指向已知log_in()类型的指针并使用这一点。

您还可以在struct node内重新定义log_in(),这是让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)
{
}