Самая очевидная проблема для меня заключается в том, что у вас нет проверки ошибок на выходе token
или val
.Это может быть NULL
, если strtok
достигает конца строки, и вы просто не справляетесь с этим.Из-за отсутствия поддающегося проверке примера трудно понять, что является реальной проблемой
Затем в комментариях @ead было отмечено несколько проблем:
PythonСтроки должны быть неизменными, но strtok
изменяет указатель, который он дал.Это вряд ли вызовет сбой, который вы видите, но может вызвать проблемы с Python.
line
, скорее всего, неверный указатель, как только он создан (поскольку объект Python основан наникогда не хранится)
Я думаю, что эти проблемы можно решить с помощью чего-то вроде
cdef char* line_ptr
for line in f: # line IS NOT TYPED
line_ba = bytearray(line) # bytearray is mutable - changing it is fine
line_ptr = line_ba # line_ptr is valid as long as line_ba exists
И в вашем коде, и в предложенной мной замене есть много преобразований между Pythonи C-строки, которые никогда не бывают чрезвычайно быстрыми (и их трудно получить правильно).Это похоже на то, что было бы проще написать на Python - я сомневаюсь, что вы действительно извлекаете выгоду из вызовов Си.