Может кто-нибудь сказать мне, что делает этот код C? - PullRequest
0 голосов
/ 30 апреля 2011

Cansome, скажите мне, что происходит в этом коде Cython.Полный код можно посмотреть по адресу:

https://github.com/scipy/scipy/blob/master/scipy/spatial/ckdtree.pyx

# this is the standard trick for variable-size arrays:
# malloc sizeof(nodeinfo)+self.m*sizeof(double) bytes.
cdef struct nodeinfo:
    innernode* node
    double side_distances[0]

Ответы [ 2 ]

3 голосов
/ 30 апреля 2011

Это старый трюк на Си. Если вы не знаете, сколько нужно side_distances, обычно потому, что оно варьируется от одного экземпляра nodeinfo к другому, тогда вы объявляете размер массива нулевым. Затем, когда вы выделяете память для узла, вы выделяете размер структуры , как это было определено (sizeof(nodeinfo)), плюс дополнительная память для количества значений, которые вы хотите в этом конкретном экземпляре (+something * sizeof(double)). В результате для этого экземпляра у нас достаточно памяти для массива указанного нами размера.

Это «трюк» в том смысле, что для большинства применений вы можете выделить отдельный массив и сохранить указатель на него в этом массиве. Хранение всего в одном выделении - это (попытка) оптимизации.

IIRC, однако, массив нулевого размера допускается только стандартом C ++, но не стандартом C. В C вы должны определить его как массив гибкого размера side_distances[], хотя, без сомнения, многие компиляторы допускают версию C ++ в C как расширение. В любом случае, сама структура не содержит места для каких-либо элементов, хотя она будет правильно выровнена для double.

2 голосов
/ 30 апреля 2011

Это struct hack в C. Я не знаю, как он ведет себя в Python (или cython), , но я думаю, что вам лучше использовать какую-то другую структуру данных .

В Си он используется для того, чтобы притворяться, что имеет «массив переменного размера».
Требуется динамическое выделение памяти.

...