Используя перечисления в ctypes. Структура

Просто для того, чтобы добавить информацию людям, прибегающим к помощи этой web.config:

C: \ Program Files \ Common Files \ Microsoft Shared \ Расширения веб-сервера \ 12 \ ISAPI

<location path="Copy.asmx"> <!-- Name of you asmx -->
    <system.webServer>
      <security>
        <requestFiltering>
          <requestLimits maxAllowedContentLength="104857600"/> <!-- 100 megs -->
        </requestFiltering>
      </security>
    </system.webServer>
  </location>

This решил проблему после устранения этой проблемы за довольно сомнительное время.

10
задан Kamil Kisiel 9 October 2009 в 22:25
поделиться

2 ответа

По крайней мере, для GCC enum представляет собой простой числовой тип. Это может быть 8-, 16-, 32-, 64-битный или любой другой (я тестировал его с 64-битными значениями), а также подписанный или беззнаковый . Я предполагаю, что он не может превышать long long int , но на практике вы должны проверить диапазон ваших enum s и выбрать что-то вроде c_uint .

Вот пример пример. Программа C:

enum batch_op {
    OP1 = 2,
    OP2 = 3,
    OP3 = -1,
};

struct attrl {
    char *name;
    struct attrl *next;
    enum batch_op op;
};

void f(struct attrl *x) {
    x->op = OP3;
}

и программа Python:

from ctypes import (Structure, c_char_p, c_uint, c_int,
    POINTER, CDLL)

class AttrList(Structure): pass
AttrList._fields_ = [
    ('name', c_char_p),
    ('next', POINTER(AttrList)),
    ('op', c_int),
]

(OP1, OP2, OP3) = (2, 3, -1)

enum = CDLL('./libenum.so')
enum.f.argtypes = [POINTER(AttrList)]
enum.f.restype = None

a = AttrList(name=None, next=None, op=OP2)
assert a.op == OP2
enum.f(a)
assert a.op == OP3
9
ответ дан 3 December 2019 в 23:13
поделиться

Можно использовать c_int или c_uint . В качестве альтернативы, в кулинарной книге есть рецепт для класса Enumeration.

5
ответ дан 3 December 2019 в 23:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: