C 避免使用三重指针
C++ Avoiding Triple Pointers
我正在尝试创建一个x指针的数组,将尺寸的矩阵引用y的y y16。是否有任何方法可以在C 中实现这一目标,而无需使用三倍POINTERS?
编辑:为问题添加一些上下文。
屏幕上有许多几何形状,每个几何形状都具有变色为1x16阵列的转换。每个快照代表每个组件数量的转换。因此,矩阵维度为num_snapshots的num_components为16,其中后两个维度在运行时已知。最后,我们有许多几何形状,并采用了运动。
我正在创建一个可以使用三重指针参数的函数,尽管我无法在我的情况下使用三重指针。我还能通过哪些其他方法传递这些数据(可能是通过多个参数)?最糟糕的情况是,我考虑过将整个3D矩阵变平到一个阵列,尽管这似乎是一件马虎的事情。有更好的建议吗?
我现在拥有的:
function(..., double ***snapshot_transforms, ...)
我想完成的工作:
function (..., <1+ non-triple pointer parameters>, ...)
以下不是我要创建的功能,该功能采用三重指针,而是显示数据的全部内容。
static double ***snapshot_transforms_function (int num_snapshots, int num_geometries)
{
double component_transform[16];
double ***snapshot_transforms = new double**[num_snapshots];
for (int i = 0; i < num_snapshots; i++)
{
snapshot_transforms[i] = new double*[num_geometries];
for (int j = 0; j < num_geometries; j++)
{
snapshot_transforms[i][j] = new double[16];
// 4x4 transform put into a 1x16 array with dummy values for each component for each snapshot
for (int k = 0; k < 16; k++)
snapshot_transforms[i][j][k] = k;
}
}
return snapshot_transforms;
}
edit2:我不能创建新类,也不能使用诸如std之类的c 功能,因为标题文件中的曝光函数原型已放入包装器中(这不知道如何知道如何解释三重指针)以翻译为其他语言。
edit3:在注释中每个人的输入之后,我认为使用扁平阵列进行的阵列可能是最好的解决方案。我希望可以使用简单的数据类型(包括单个指针)整齐地跨多个数据片来划分这个三重指针,并将这些复杂数据分开。尽管我认为在这里有警告的情况下,我认为没有一种很好的方法。感谢大家的帮助=)
使用 std::vector
容易容易,更好,更少的错误。毕竟,您正在使用C ,而不是C。我用vector
s代替了所有C风格的阵列指针。Typedef doublecube
使得您不必一遍又一遍地键入vector<vector<vector<double>>>
。除此之外,代码基本上保持与您所拥有的相同。
如果您实际上不需要虚拟值,我将完全删除该最内向的k
循环。reserve
将为您保留实际数据所需的内存空间。
#include <vector>
using std::vector; // so we can just call it "vector"
typedef vector<vector<vector<double>>> doublecube;
static doublecube snapshot_transforms_function (int num_snapshots, int num_geometries)
{
// I deleted component_transform. It was never used
doublecube snapshot_transforms;
snapshot_transforms.reserve(num_snapshots);
for (int i = 0; i < num_snapshots; i++)
{
snapshot_transforms.at(i).reserve(num_geometries);
for (int j = 0; j < num_geometries; j++)
{
snapshot_transforms.at(i).at(j).reserve(16);
// 4x4 transform put into a 1x16 array with dummy values for each component for each snapshot
for (int k = 0; k < 16; k++)
snapshot_transforms.at(i).at(j).at(k) = k;
}
}
return snapshot_transforms;
}
添加一点对象 - 取向通常会使代码更易于管理 - 例如,以下是一些代码,这些代码创建了100 Matrix
对象的数组,每个矩阵数量有不同。(如果愿意,您也可以改变每个Matrix
的列数,但我在16岁时离开了):
#include <vector>
#include <memory> // for shared_ptr (not strictly necessary, but used in main() to avoid unnecessarily copying of Matrix objects)
/** Represents a (numRows x numCols) 2D matrix of doubles */
class Matrix
{
public:
// constructor
Matrix(int numRows = 0, int numCols = 0)
: _numRows(numRows)
, _numCols(numCols)
{
_values.resize(_numRows*_numCols);
std::fill(_values.begin(), _values.end(), 0.0f);
}
// copy constructor
Matrix(const Matrix & rhs)
: _numRows(rhs._numRows)
, _numCols(rhs._numCols)
{
_values.resize(_numRows*_numCols);
std::fill(_values.begin(), _values.end(), 0.0f);
}
/** Returns the value at (row/col) */
double get(int row, int col) const {return _values[(row*_numCols)+col];}
/** Sets the value at (row/col) to the specified value */
double set(int row, int col, double val) {return _values[(row*_numCols)+col] = val;}
/** Assignment operator */
Matrix & operator = (const Matrix & rhs)
{
_numRows = rhs._numRows;
_numCols = rhs._numCols;
_values = rhs._values;
return *this;
}
private:
int _numRows;
int _numCols;
std::vector<double> _values;
};
int main(int, char **)
{
const int numCols = 16;
std::vector< std::shared_ptr<Matrix> > matrixList;
for (int i=0; i<100; i++) matrixList.push_back(std::make_shared<Matrix>(i, numCols));
return 0;
}
- 毕达哥拉斯三重嵌套循环误解
- 遍历 std::set 中包含的所有三重不同值?
- 如何动态分配由三重指针到类的矩阵?
- 如何在C++中进行耗时的三重组合
- 删除BST节点:三重故障
- 启用中断时QEMU三重故障
- 如何修复我的 c++ 毕达哥拉斯三重查找器中的'access violation reading location'错误?
- 三重限制的正整数组合的非递归枚举
- 如何在三重运算符的帮助下通过最大值完成地图
- 三重继承,没有唯一的最终覆盖者
- C 避免使用三重指针
- 叮叮当当:"没有可用的目标与这三重兼容
- 复制一个三重嵌套容器
- 在 C 编程中可以有三重减号吗?什么意思
- 几何库中算法和数据的分离(需要三重调度?)
- 为什么我的三重对象被破坏了
- 三重与号"&&&"在C++中代表什么?
- 三重 AND("&& &")如何工作?
- 解引用双指针、三重指针等等
- 在另一个函数中传递一个三重指针来分配内存,sscanf异常