我正在研究一种简单的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的列表原子时,它会将其void*
(以lisp术语表示的cdr)转换为上述结构。我遇到问题的地方是弄清楚如何访问多维数组。我曾想过计算一个遍历数组的步长值,但我可以保证所有传递的数组都是连续分配的吗?
感谢任何帮助。
答案 0 :(得分:0)
内置(单向和多维)数组保证以行主模式存储在一个连续的内存区域中。但是,这可能无法解答您的问题。 _lisp_array :: data member指向的数据结构的预期布局是什么?
答案 1 :(得分:0)
由于您正在编写解释器,因此您需要决定表示并使数组连续 - 也就是说,如果您需要它是连续的。如果你使它连续,你可以通过例如(假设从零开始的索引a,b,c ...和维度大小sa,sb,sc ...)来访问元素:
(a*sb + b) * sc + c ... (row major order)
(c * sb + b) * sa + a ... (column major order)
当然,还有其他表示数组的方法 - 你可以使用指针数组到数组等。每种方法都有自己的优点和缺点;在没有任何具体用例的情况下,如果数组的边界是固定的,并且数组不是稀疏的,那么连续的缓冲区通常是一种合理的方法。
答案 2 :(得分:0)
这取决于你想要制作它的lisp样式,真的。 Lisp没有你想到的多维数组的严格定义 - 一切都是原子或列表。它最接近的是一个数组数组:
((1 2 3) (4) (5 6))
但请注意,子数组的长度不同。但它本身就没有必要,而且我认为没有办法强迫这个问题......
如果你需要严格的“矩形”阵列,这显然不会起作用,但是如果你有摆动空间,这就是我实现它的方式 - 它是一个漂亮,干净的结构(查看{{ 3}}了解更多详情。)
干杯!