【问题标题】:Returning arrays in C instead of switch statements, nested set of values在 C 中返回数组而不是 switch 语句,嵌套值集
【发布时间】:2017-10-19 15:23:20
【问题描述】:
int* path = malloc(sizeof(int)*4));

switch(one) {
    case NORTH:
        switch(two) {
            case NORTH:
                memcpy(path, ((int[4]){7, 8, 9, 10}), sizeof(int)*4);
                break;
            case WEST:
                memcpy(path, ((int[4]){9, 10, 11, 12}), sizeof(int)*4);
                break;
            case SOUTH:
                memcpy(path, ((int[4]){1, 2, 3, 4}), sizeof(int)*4);
                break;
            case EAST:
                memcpy(path, ((int[4]){7, 8, 9, 10}), sizeof(int)*4);
                break;
            case MAX_DIRECTION:
                return NULL;
        }
    case WEST:
        switch(two) {
            case NORTH:
                memcpy(path, ((int[4]){7, 8, 9, 10}), sizeof(int)*4);
                break;
            case WEST:
                memcpy(path, ((int[4]){1, 2, 2, 3}), sizeof(int)*4);
            ...
    ...
return path

对于此示例,对于 NORTH、WEST、SOUTH、EAST 的每种情况,依此类推。想法是您将一和二传递给函数,它将返回一个与正确值 ex 相对应的整数数组。 [北][西] = [9, 10, 11, 12]。 为了简洁起见,我将 NORTH 定义为 EAST,分别为 0-3。

我的想法是将它作为多维数组。 例如,用户将传入 0,1。它会访问对应于 0(NORTH)的第一个数组,然后它会访问对应于 1(WEST)的第二个数组,并返回所需的数组。

我已经尝试了几件事,但唯一对我来说立即有意义的事情是声明然后一一分配数组的每个索引。不知道如何一次完成所有事情并完成我想要的。

非常感谢任何帮助。

【问题讨论】:

    标签: c arrays multidimensional-array switch-statement


    【解决方案1】:

    您需要创建一个 3 维数组。前两个维度对应one和two的值,第三个维度是你要返回的数字数组。

    你可以这样声明数组:

    int arr[4][4][4] = {
        { {7, 8, 9, 10}, {9, 10, 11, 12}, {1, 2, 3, 4}, {7, 8, 9, 10} },
        { {7, 8, 9, 10}, {1, 2, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} },
        { {7, 8, 9, 10}, {1, 2, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} },
        { {7, 8, 9, 10}, {1, 2, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} }
    };
    

    然后像这样得到正确的子数组:

    int *path = arr[one][two];
    

    【讨论】:

    • 我能否从函数中返回它并能够毫无问题地访问子数组?因为我相信我必须 malloc 但不确定 malloc 是否同时声明相同的方式。
    • 无需动态分配。将数组声明为static,使其生命周期存在于函数之外,或者在文件范围内声明。
    • 这取决于您从该函数返回数组后对数组的使用。如果调用者可能会改变它,你需要 malloc+copy 。
    • 只是为了确认,将数组声明为静态是否有任何缺点?当然,这将是我在程序中声明的唯一静态变量,但我猜在使用的内存方面是否有任何缺点(以及其他潜在的缺点)?
    • 假设您不希望修改数组,那么没有问题。实际上,如果是这种情况,您可能还想声明它const。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    相关资源
    最近更新 更多