我有一个功能:
void foo(double[][4]);
采用二维数组,第二维等于4.如何分配二维数组以便将其传递给函数?如果我这样做:
double * arr[4];
arr = new double[n][4];
其中编译器不知道n。我无法编译。如果我使用通用的2d动态数组,函数foo将不会接受它。
答案 0 :(得分:4)
根据要求,最好使用typedef
typedef double four[4];
four *arr; // equivalently double (*arr)[4];
arr = new four[n];
如果没有typedef
,你会变得更加神秘
double (*arr)[4];
arr = new double [n][4];
您应该考虑使用标准容器(std::vector
等)或容器容器。
答案 1 :(得分:2)
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/angular_material/1.1.0/angular-material.min.css">
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular-animate.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular-aria.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular-messages.min.js"></script>
<script src="https://s3-us-west-2.amazonaws.com/s.cdpn.io/t-114/svg-assets-cache.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/angular_material/1.1.0/angular-material.min.js"></script>
<script>
angular.module("elcomaApp", ['ngMaterial', 'ngMessages', 'material.svgAssetsCache'])
.config(function($mdIconProvider){
$mdIconProvider.iconSet('mdsize', 'fileSrc.txt', 204);
})
.controller("MainController", function() {
});
</script>
</head>
<body ng-app="elcomaApp" ng-controller="MainController" ng-cloak>
<md-icon md-svg-icon="mdsize:A"></md-icon>
</body>
</html>
考虑切换到数组和向量。
答案 2 :(得分:0)
我知道它可能不是OP打算做的,但它可能会帮助其他需要类似答案的人。
您正在尝试创建一个静态成功数组的动态数组。 STL得到了您的解决方案:std::vector
和std::array
使用这些容器,事情变得容易:
std::vector<std::array<int, 4>> foo;
// Allocate memory
foo.reserve(8);
// Or instead of 8, you can use some runtime value
foo.reserve(someSize);
// Or did not allocated 8 + someSize, but ensured
// that vector has allocated at least someSize
// Add entries
foo.push_back({1, 2, 3, 4});
// Looping
for (auto&& arr : foo) {
arr[3] = 3;
}
// Access elements
foo[5][2] = 2;
答案 3 :(得分:-2)
除了创建新类型并占用符号之外,您还可以创建指向指针的指针,并按照以下方式执行:
double **arr = new double*[j];
for (int i = 0; i < j; ++i)
{
arr[i] = new double[4];
}
而j
是保存动态值的int
变量。
我已经编写了一个显示有效的简单代码,请查看here。