我需要使用win32线程并行化应用程序。代码的一部分涉及使用线程修改静态数组。
我将数组作为参数传递:
struct threadParameter {
float **array;
int row;
}
示例代码如下:
// Main
float data[100][100]
for (int i = 0; i < 100; i ++) {
tp = (*threadParameter) new threadParameter;
tp->array = (float **) data;
tp->row = i;
AfxBeginThread... // Begin thread code
}
// Thread Code
UINT myThread(LPVOID param) {
threadParameter *pp = (threadParameter *) param;
for (int j = 0; j < 100; j ++) {
pp->array[pp->row][j] = NEWVALUE;
}
}
但是,在执行项目时,当我尝试通过**数组指针加入数组时,出现“访问冲突错误”。如果数组数据是,则不会发生此问题 动态。有没有办法解决这个问题(我不允许将数组数据从静态更改为动态)?
答案 0 :(得分:7)
静态数组不是指针的指针 - 整个数组是单个巨大的数据块,并且可以通过单个指针寻址,即指向数组基址的指针。因此
tp->array = (float **) data;
不正确,因为你在数组中取消引用一个数字。 (你需要强制转换的事实也应该引发一个红旗,因为数组被隐式转换为适当的指针类型。)
这就是为什么常见的短语“数组只是指针”是不正确的;它对于一维数组来说是半真的,但对于多维数组则完全错误。如果需要使用两个索引,请将单个索引转换为行列索引,方法是将行乘以行大小,然后使用指针将列和索引添加到数组中。