我的代码有一些奇怪的问题,我不知道我做错了什么。我对C语言比较陌生,所以如果有人能指出我做的是愚蠢的话,我真的很感激。
我正在尝试将文件中的数据读入 state 类型的二维数组中。类型状态定义如下:
typedef uint8_t state [4][4];
我定义了方法 read_block ,它将文件指针作为参数获取,并返回指针二维类型 state 数组,其中包含该文件的前16个字节。
state* read_block(FILE *fp) {
state *arr = (state*) malloc(sizeof (state));
uint8_t *temp = (uint8_t*) malloc(sizeof (uint8_t)*16);
fread(temp, 16, 1, fp);
/*
for (int y = 0; y < 16; y++) {
printf("%u ", temp[y]);
}
printf("\n");
*/
int n = 0;
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
/*
printf("%u ", temp[n]);
*/
*arr[i][j] = temp[n];
n++;
}
}
return arr;
}
代码编译并运行正常,但方法返回的类型 state 数组总是包含一个错误的值。具体来说,位置[3] [0]中的值总是错误的。
我正在尝试阅读的测试文件包含数字:
0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3
我决定检查值是否正确读取,如果删除printf行周围的注释,我得到输出:
0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3
0 1 2 3 0 1 2 3 0 1 2 3 3 1 2 3
其中第一行完全正确(在 fread()之后打印)但由于某种原因第二行不正确(在将值插入 arr时打印) )。
我无法弄清楚造成这种情况的原因。我也尝试用 fread 一次读取一个字节的值,但是同样的值仍然是错误的。我正在使用NetBeans,所以我不确定这是否是由它引起的。
答案 0 :(得分:8)
您正在遇到运营商优先权。
public Plan Plan {get; set; }
[Column("Plan_PlanId")]
[ForeignKey("Plan")]
public int PlanId { get; set; }
与
相同*arr[i][j]
仅在*(arr[i][j]) // or arr[i][j][0]
时,即在第一行中,这是相同的。
你想要的是
i == 0
答案 1 :(得分:4)
将数组隐藏在typedef后面并不是一个好主意。这是问题的根源,因为arr
实际上是uint8_t (*)[4][4]
类型的数组指针。当取消引用数组指针时,您必须首先获取指针的内容以获取数组,然后在访问特定索引之后。也就是说,您必须(*arr)[i][j]
而不是*arr[i][j]
。
为了避免使用这种可疑语法,您可以使用技巧并声明指向最外层维度的数组指针:uint8_t(*)[4]
。然后你可以突然输入arr[i][j]
。 arr[i]
则意味着对uint8_t(*)[4]
类型执行指针运算,然后在获得的结果中,您可以访问特定的数组索引[j]
。
除了运算符优先级问题之外,您可能还希望将数据直接存储到数组中。您没有理由不能fread(arr, 16, 1, fp);
,因为您按照分配的顺序使用该数组。
我还没有对它进行测试,但您应该可以用这个替换整个功能:
void read_block(FILE* fp, uint8_t (*arr)[4][4])
{
const size_t size = sizeof(uint8_t[4][4]);
*arr = malloc(size);
fread(*arr, size, 1, fp);
}