void compute(int rows, int columns, double *data) {
double (*data2D)[columns] = (double (*)[columns]) data;
// do something with data2D
}
int main(void) {
double data[25] = {0};
compute(5, 5, data);
}
Run Code Online (Sandbox Code Playgroud)
有时,将参数视为多维数组非常方便,但需要将其声明为指向平面数组的指针.将指针视为多维数组是否安全,compute如上例所示?我很确定内存布局可以保证正常工作,但我不知道标准是否允许指针以这种方式进行转换.
这会破坏任何严格的别名规则吗?指针算法的规则怎么样; 由于数据"实际上不是"a double[5][5],我们是否允许执行指针算法和索引data2D,或者是否违反了指针算法不会偏离适当数组范围的要求?是data2D即使保证指向正确的地方,还是它只是保证我们可以将它转换回并恢复data?标准报价将非常感激.
在这种情况下,最安全的方法是将元素保留在平面一维数组中,但编写访问器方法以多维方式从此数组中读取和写入。
#include <stdio.h>
#include <string.h>
const int rowCount = 10;
const int columnCount = 10;
const int dataSize = rowCount*columnCount;
double data[dataSize];
void setValue( const int x, const int y, double value)
{
if ( x>=0 && x<columnCount && y>=0 && y<rowCount) {
data[x+y*columnCount] = value;
}
}
double getValue( const int x, const int y )
{
if ( x>=0 && x<columnCount && y>=0 && y<rowCount) {
return data[x+y*columnCount];
} else {
return 0.0;
}
}
int main()
{
memset(data, 0, sizeof(double)*dataSize);
// set a value
setValue(5, 2, 12.0);
// get a value
double value = getValue(2, 7);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
该示例使用全局变量只是为了简单起见。您可以将数据数组作为附加参数传递给函数,甚至可以创建一个要使用的上下文。
在 C++ 中,您可以将数据容器包装到一个类中,并使用这两个方法作为访问方法。
| 归档时间: |
|
| 查看次数: |
248 次 |
| 最近记录: |