用小的阵列形成一个大阵列

时间:2014-06-21 14:16:52

标签: c arrays

我做了以下功能:

int * getMat(char x){
    int[2][2] returnValue;
    switch(x){
        case "0": returnValue = [0,0;0,0];
                break;
        case "1": returnValue = [1,1;1,0];
                break;
        .... 
        etc
    }
    return returnValue;
}

在main函数中,我有这些向量:

 char a[] = "010110"
 int bigArray[100][2];

我需要通过迭代[]中的每个char来填充bigArray [] [],并将返回的数组从getMat()添加到bigArray。

换句话说,对于char序列" 010110",bigArray应该如下所示:

[0,0,1,1,0,0,1,1,1,1,0,0;
 0,0,1,0,0,0,1,0,1,0,0,0]

我坚持这个:

int bigArray[100][2];
for(int i=0; i<strlen(a); i++){
    int mat[2][2] = getMat(a[i]);

}

有人可以帮我提一些建议吗?我无法弄清楚如何继续。

2 个答案:

答案 0 :(得分:1)

您不能在C中返回数组。相反,您可以做的是向getMat指示应该在哪里写入其输出。

例如:

void make_big(char in, char *out_row1, char *out_row2)
{
    char const *temp = "0000";
    switch(in)
    {
    case 1: temp = "1110";
    // etc.
    }
    out_row1[0] = temp[0]; 
    out_row1[1] = temp[1];
    out_row2[0] = temp[2]; 
    out_row2[1] = temp[3];
}

// in main
char big[2][100+1] = { 0 };    // [rows][cols], and null terminator
for(int i=0; i<strlen(a) && i < 50; i++)
{
    make_big(a[i], &big[0][i*2], &big[1][i*2]);
}

如果'temp'的值都可以用字符串文字表示,那么你可以返回一个指向它们的指针,让调用函数执行定位逻辑。您可以返回指向数组元素的指针,但是在函数返回后数组必须仍然存在(即它不能是函数的非静态局部变量)。但是如果你需要在运行时计算这些值,这将不起作用。

答案 1 :(得分:1)

#include <stdio.h>
#include <string.h>

int (*getMat(char x))[2][2] {
    static int returnValue[][2][2] = {
        {{0,0},{0,0}},
        {{1,1},{1,0}},
        //...
    };
    switch(x){
    case '0':
        return &returnValue[0];
    case '1':
        return &returnValue[1];
    //.... 
    //etc
    }
    return NULL;
}


int main(void){
    char a[] = "010110";
    int bigArray[2][100];
    int (*tmp)[2][2];
    for(int i=0;a[i];++i){
        tmp = getMat(a[i]);
        memcpy(&bigArray[0][i*2], &(*tmp)[0], sizeof((*tmp)[0]));
        memcpy(&bigArray[1][i*2], &(*tmp)[1], sizeof((*tmp)[1]));
    }
    //test print
    for(int i=0;i<12;++i)
        printf("%d ", bigArray[0][i]);//0 0 1 1 0 0 1 1 1 1 0 0
    printf("\n");
    for(int i=0;i<12;++i)
        printf("%d ", bigArray[1][i]);//0 0 1 0 0 0 1 0 1 0 0 0
    printf("\n");
    return 0;
}