Как вернуть структуру без использования глобального объявления структуры в C - PullRequest
0 голосов
/ 29 января 2012

Здравствуйте, я пытаюсь вернуть структуру из функции, но я не могу найти способ сделать это, не объявляя структуру как глобальную.Как это может быть сделано?Вот код (ЭТО РАБОТАЕТ, КАК ЭТО ЕСТЬ)

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

3 голосов
/ 29 января 2012
 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 голос
/ 29 января 2012

Если вы хотите использовать некоторую структуру в 2 разных подпрограммах - вы должны объявить ее вне их обоих, так как они оба должны увидеть, как структурирована эта структура. Кстати, вы вызываете log_in, но не используете его возвращаемое значение.

1 голос
/ 29 января 2012

Передайте указатель на 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 в командной строке. (Если вы этого не сделаете, неопределенное поведение.)

1 голос
/ 29 января 2012

Сначала объявите структуру, затем создайте переменную temp. Как это:

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

Затем вы можете создать локальную переменную, такую ​​как

struct node tmp;
0 голосов
/ 29 января 2012

Вы не можете оперировать с неизвестным типом.Если 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)
{
}
...