我做了以下功能:
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]);
}
有人可以帮我提一些建议吗?我无法弄清楚如何继续。
答案 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;
}