C++ 用c语言存储多维数组

C++ 用c语言存储多维数组,c++,c,interpreted-language,C++,C,Interpreted Language,我正在研究一种简单的lisp风格的预处理器语言。 在API中,我希望用户能够将任意尺寸和大小的数组传递给可以使用该语言操作的预处理器。 目前我有一个类型的枚举 typedef enum LISP_TYPE { LT_UINT, LT_FLOAT, LT_ARRAY ..., ... } _LISP_TYPE; 我很难找到一种高效且易于使用的存储和访问阵列的方法。 我专门为数组使用另一种结构 typedef struct _lisp_array { LISP_TYPE t

我正在研究一种简单的lisp风格的预处理器语言。 在API中,我希望用户能够将任意尺寸和大小的数组传递给可以使用该语言操作的预处理器。 目前我有一个类型的枚举

typedef enum LISP_TYPE
{
  LT_UINT,
  LT_FLOAT,
  LT_ARRAY
  ...,
  ...
} _LISP_TYPE;
我很难找到一种高效且易于使用的存储和访问阵列的方法。 我专门为数组使用另一种结构

typedef struct _lisp_array
{
  LISP_TYPE type;
  unsigned int length;
  void* data;

} lisp_array;
当预处理器看到一个类型为LT_ARRAY的列表原子时,它将用lisp术语将其void*cdr转换为上述结构。我遇到的问题是如何访问多维数组。我曾想过计算一个步长值来遍历数组,但我能保证传递的所有数组都将被连续分配吗


非常感谢您的帮助。

C内置的单个和多维数组保证以行主模式存储在一个连续的内存区域中。然而,这可能无法回答您的问题。_lisp_array::data member指向的数据结构的预期布局是什么?

C内置的单维和多维数组保证以行主模式存储在一个连续的内存区域中。然而,这可能无法回答您的问题。_lisp_array::data member所指向的数据结构的预期布局是什么?

既然您正在编写解释器,那么就由您决定表示形式并使数组连续—也就是说,如果您需要它连续的话。如果将其设置为连续的,则可以通过以下方式访问元素:例如,假设从零开始的索引a、b、c。。。尺寸sa、sb、sc.:

(a*sb + b) * sc + c   ... (row major order)
(c * sb + b) * sa + a ... (column major order)

当然,还有其他表示数组的方法——可以使用指向数组的指针数组,等等。每种方法都有自己的优缺点;在没有任何用例细节的情况下,如果数组的边界是固定的,并且数组不希望稀疏,那么连续缓冲区通常是一种合理的方法。

既然您正在编写解释器,那么就由您决定表示形式并使数组连续-也就是说,如果您需要它连续的话。如果将其设置为连续的,则可以通过以下方式访问元素:例如,假设从零开始的索引a、b、c。。。尺寸sa、sb、sc.:

(a*sb + b) * sc + c   ... (row major order)
(c * sb + b) * sa + a ... (column major order)

当然,还有其他表示数组的方法——可以使用指向数组的指针数组,等等。每种方法都有自己的优缺点;在没有任何用例细节的情况下,如果数组的边界是固定的,并且数组不希望稀疏,那么连续缓冲区通常是一种合理的方法。

这将取决于您希望如何使用lisp。Lisp并没有你所想的多维数组的严格定义——一切都是一个原子或一个列表。最接近它的是一个数组:

((1 2 3) (4) (5 6))
但是请注意,子数组的长度不同。但他们不一定是天生的口齿不清,而且我不认为有办法强迫这个问题

如果你需要严格的矩形阵列,这显然是行不通的,但是如果你有摆动空间,这就是我如何实现它的——这是一个很好的、干净的结构,请查看更多细节


干杯

这将取决于你想让lisp怎么做,真的。Lisp并没有你所想的多维数组的严格定义——一切都是一个原子或一个列表。最接近它的是一个数组:

((1 2 3) (4) (5 6))
但是请注意,子数组的长度不同。但他们不一定是天生的口齿不清,而且我不认为有办法强迫这个问题

如果你需要严格的矩形阵列,这显然是行不通的,但是如果你有摆动空间,这就是我如何实现它的——这是一个很好的、干净的结构,请查看更多细节


干杯

预期的布局取决于_lisp_array::type。如果这是FLOAT、CHAR、INT或任何其他类型,那么数据将是这些类型的数组。如果类型为ARRAY,则应表示多个维度。这就是我被困的地方,我应该如何表达?顺便说一句,我期望动态分配的数组以及静态连续数组。当它是一种数组类型,而您没有显示它时,期望的布局是什么?正如我所说的,我还没有做到这一点。我正在考虑另一个lisp_数组指针。预期的布局取决于_lisp_数组::类型。如果这是FLOAT、CHAR、INT或任何其他类型,那么数据将是这些类型的数组。如果类型为ARRAY,则应表示多个维度。这就是我被困的地方,我应该如何表达?顺便说一句,我期望动态分配的数组以及静态连续数组。当它是一种数组类型,而您没有显示它时,期望的布局是什么?正如我所说的,我还没有做到这一点。我在想另一个LISPHINA数组指针,你不能简单地使用C++模板吗? 你只使用C++模板?