C:在单独的函数中操作结构

C:在单独的函数中操作结构,c,struct,C,Struct,我不确定这是否适合这种论坛,因为这是一个非常具体的问题,但我还是要问 我有三个文件: main.c functions.c functions.h 在functions.c和functions.h中,我创建了一个struct,并将其定义为一个名为control的类型: typedef struct { char cUp, cLeft, cDown, cRight } control; 我创建了control的一个实例,并在main.c的开头初始化了名为Keys的实例: #include

我不确定这是否适合这种论坛,因为这是一个非常具体的问题,但我还是要问

我有三个文件:

  • main.c
  • functions.c
  • functions.h
  • functions.c
    functions.h
    中,我创建了一个
    struct
    ,并将其定义为一个名为
    control
    的类型:

    typedef struct
    {
        char cUp, cLeft, cDown, cRight
    } control;
    
    我创建了
    control
    的一个实例,并在
    main.c
    的开头初始化了名为
    Keys
    的实例:

    #include <stdio.h>
    #include <stdlib.h>
    #include "functions.h"
    
    int main()
    {
        control Keys = {'w', 'a', 's', 'd'};
    
        //...
    }
    
    options\u f
    位于
    functions.c
    中,如下所示:

    control options_f(control Keys)
    {
        system("cls");
    
        printf("\nENTER | Place your symbol.\n\n1| %c |Move up.\n\n2| %c |Move left.\n\n3| %c  |Move down.\n\n4| %c |Move right.\n", Keys.cUp, Keys.cLeft, Keys.cDown, Keys.cRight);
        printf("\n\nTo change the keys: NUMBER,SYMBOL (enter 0 to return to menu).\n\n");
    
        int iTemp = 0;
        char cTemp = '\0';
        scanf("%i,%c", &iTemp, &cTemp);
    
        switch(iTemp)
        {
            case 0:
                break;
            case 1:
                Keys.cUp = cTemp;
                Keys = options_f(Keys);
                break;
            case 2:
                Keys.cLeft = cTemp;
                Keys = options_f(Keys);
                break;
            case 3:
                Keys.cDown = cTemp;
                Keys = options_f(Keys);
                break;
            case 4:
                Keys.cRight = cTemp;
                Keys = options_f(Keys);
                break;
            default:
                printf("Please enter a number from 1-4.");
                stop_f(2);
                options_f(Keys);
                break;
        }
    }
    
    该功能允许我更改
    中字符的内容。输入
    0
    并返回菜单后,我再次调用
    options\u f
    。只有它将存储在
    字符中的值更改为一些垃圾值

    为什么呢

    如果您需要有关我使用的其他功能的更多信息,请询问。
    我很抱歉,如果这对你来说是非常低级和愚蠢的,但我正在努力学习,这就是为什么我要问


    谢谢:)

    您需要从
    options\u f()
    函数返回一个值(可能是
    返回键;
    )。这甚至不是有效的C代码。

    您需要从
    options\u f()
    函数返回一个值(可能是
    返回键;
    )。这甚至不是有效的C代码。

    对!老兄,我完全错过了^^非常感谢!正确的!老兄,我完全错过了^^非常感谢!只需将
    键作为指针传入即可
    void options\u f(control*keys){…}
    并像
    options\u f(&keys)一样调用它除了速度之外,作为指针传递它有什么好处吗?这只是逻辑上的一个区别。使用
    controloptions\u f(control keys)
    读取(对我来说)为
    options\u f
    使用
    keys
    创建一个新的
    控件
    ,而
    void options\u f(control*keys)
    读取的内容更多,因为
    options\u f
    修改
    keys
    。只需将
    keys
    作为指针传入即可
    void options\u f(control*keys){…}
    并像
    options\u f(&keys)一样调用它除了速度之外,作为指针传递它有什么好处吗?这只是逻辑上的一个区别。使用
    controloptions\u f(控制键)
    读取(对我来说)为
    options\u f
    使用
    创建新的
    控件
    ,而
    void options\u f(控制键)
    读取的内容更多,因为
    选项
    修改
    control options_f(control Keys)
    {
        system("cls");
    
        printf("\nENTER | Place your symbol.\n\n1| %c |Move up.\n\n2| %c |Move left.\n\n3| %c  |Move down.\n\n4| %c |Move right.\n", Keys.cUp, Keys.cLeft, Keys.cDown, Keys.cRight);
        printf("\n\nTo change the keys: NUMBER,SYMBOL (enter 0 to return to menu).\n\n");
    
        int iTemp = 0;
        char cTemp = '\0';
        scanf("%i,%c", &iTemp, &cTemp);
    
        switch(iTemp)
        {
            case 0:
                break;
            case 1:
                Keys.cUp = cTemp;
                Keys = options_f(Keys);
                break;
            case 2:
                Keys.cLeft = cTemp;
                Keys = options_f(Keys);
                break;
            case 3:
                Keys.cDown = cTemp;
                Keys = options_f(Keys);
                break;
            case 4:
                Keys.cRight = cTemp;
                Keys = options_f(Keys);
                break;
            default:
                printf("Please enter a number from 1-4.");
                stop_f(2);
                options_f(Keys);
                break;
        }
    }