想要在C++中创建一个存储Nx3值的2D指针
Want to create a 2D pointer storing Nx3 values in C++
我已经编写了下面的代码,我希望使用它来存储一些使用if-else条件的值。为了存储这些值,我创建了两个2-D指针*p和*q。现在代码似乎运行正常,但我无法打印出存储在指针p和q中的值。你能帮我吗?我做错了什么"?
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
int main()
{
int i, j, N;
double xtmp, ytmp, ztmp, delx, dely, delz, fpair, cutsq;
double rsq, r2inv, r6inv, forcelj;
double firstval[2][3], secondval[2][3];
double (*p)[2][3] = 0;
double (*q)[2][3] = 0;
int f[2][3];
p =& firstval;
q =& secondval;
double x[2][3] =
{
{0.1,0.8,0.12},
{0.5,0.9,0.13}
};
N = 2;
cutsq = 1.0;
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
xtmp = x[i][0];
ytmp = x[i][1];
ztmp = x[i][2];
delx = xtmp - x[j][0];
dely = ytmp - x[j][1];
delz = ztmp - x[j][2];
rsq = delx * delx + dely * dely + delz * delz;
if (rsq < cutsq)
{
r2inv = 1.0 / rsq;
r6inv = r2inv * r2inv * r2inv;
forcelj = r6inv * 1;
fpair = forcelj * r2inv;
f[i][0] += delx * fpair;
f[i][1] += dely * fpair;
f[i][2] += delz * fpair;
f[j][0] -= delx * fpair;
f[j][1] -= dely * fpair;
f[j][2] -= delz * fpair;
if (i != j)
{
(*p)[i][0] += delx * fpair;
(*p)[i][1] += dely * fpair;
(*p)[i][2] += delz * fpair;
(*p)[j][0] -= delx * fpair;
(*p)[j][1] -= dely * fpair;
(*p)[j][2] -= delz * fpair;
}
else
{
(*q)[i][0] += delx * fpair;
(*q)[i][1] += dely * fpair;
(*q)[i][2] += delz * fpair;
(*q)[j][0] -= delx * fpair;
(*q)[j][1] -= dely * fpair;
(*q)[j][2] -= delz * fpair;
}
std::cout << firstval << "n";
}
}
}
}
我毫不怀疑有更聪明的方法,但是
你可以写
a) 一个"知道"如何流式传输双[N]和
的模板b) 一个知道(基于第一个)如何流式传输双[M][N]的模板
template <typename T, std::size_t N>
std::ostream& operator<< (std::ostream &o, const T(&a)[N]) {
o << '[' << a[0]; // iirc zero-sized arrays are not allowed ....better look it up though.
for (std::size_t i = 1; i < N; ++i) {
o << ',' << a[i];
}
o << ']';
return o;
}
template <typename T, std::size_t M, std::size_t N>
std::ostream& operator<< (std::ostream &o, const T(&a)[M][N]) {
o << '{' << a[0];
for (std::size_t i = 1; i < M; ++i) {
o << ',' << a[i];
}
o << '}';
return o;
}
然后您可以执行std::cout << firstval << std::endl;
编辑:当然还有一个更通用的解决方案
template <typename T> void print_array(const T & a, std::size_t level=0);
template <typename T>
void print_array_impl(const T & a, std::size_t level, std::true_type)
{
std::cout << std::endl;
for (auto & x : a) print_array(x, level+1);
fill_n(std::ostream_iterator<char>(std::cout), level, ' ');
}
template <typename T>
void print_array_impl(const T & a, std::size_t level, std::false_type)
{
for (auto & x : a) std::cout << x << ',';
}
template <typename T>
void print_array(const T & a, std::size_t level)
{
fill_n(std::ostream_iterator<char>(std::cout), level, ' ');
std::cout << '[';
print_array_impl(a, level, std::is_array<typename std::remove_extent<T>::type>());
std::cout << ']' << std::endl;
}
.oO(我需要复习我的c++;它看起来仍然不优雅……)
相关文章:
- C++是否有一个容器,每个类型最多存储一个对象
- C++存储一个 const&to 临时
- 设计具有变体字段的文本类型类,其中可以存储一个或三个对象
- 是否可以存储一个在静态容器中包含unique_ptr的对象
- 编译器是否可以从全局变量中读取两次,而不是存储一个局部变量
- 在c++中存储一个对象或不存储对象的首选方式是什么
- 如何使结构一次只存储一个变量?C++
- 在std ::设置中存储一个指针的指针是安全的吗?
- 我想使用C++映射,以存储一个矩形id的4个坐标,任何人都可以举一个例子吗
- 存储一个函数的迭代结果,并在被另一个函数调用时使用它们
- 为什么要为存储一个整数(c++)声明一个双精度数组
- 在数组的每个元素中存储一个值:将C do{}while循环转换为MIPS asm
- 如何使用 cin 一次存储一个值
- 我应该通过引用、值或ptr来存储一个完全封装的成员吗
- 如何让用户键入一个值而不是存储一个常量值
- 在对象中存储一个std::函数,该函数包括std::占位符
- 如何使数组中的每个数字都存储一个字符串,就像constchar*argv[]所做的那样
- 为什么我的类模板的动态分配数组属性只能存储一个项
- 我如何存储一个文件在变量中使用GMP在c++
- 如何存储一个指针到一个位置在char *缓冲区,发送给一个函数,检索值