Для цикла, не заканчивающегося в c - PullRequest
9 голосов
/ 23 августа 2011

Я пишу некоторый код и получаю странную ошибку: мой цикл for не завершается, когда оператор условия становится ложным.Код выглядит следующим образом:

static void wstrcpy_from_Py_UNICODE(Py_UNICODE *inBuf, Py_ssize_t strLength, wchar_t **outBuf)
{
    if (strLength == 0) *outBuf = NULL;
    else
    {
        Py_ssize_t i;
        wprintf(L"String Length: %d\n", strLength);
        *outBuf = (wchar_t *)malloc (sizeof (wchar_t) * (strLength +1));
        for (i=0; i < strLength; i++)
        {
            wprintf("i:%d, strLength:%d\n", i, strLength);
            (*outBuf)[i] = (wchar_t)(inBuf[i]);
            wprintf(L"i < strLength: %d\n\n", i < strLength);
        }
    /* Make sure new string is zero terminated */
    (*outBuf)[i] = L'\0';
    }
}

При запуске этого кода с вводом примера (буфер Py_UNICODE * указывает на внутренний объект Python Unicode, созданный с помощью «примера»), я получаю следующий вывод:

String Length: 7
i:0, strLength: 7
i < strLength: 1

i:1, strLength: 7
i < strLength: 1

i:2, strLength: 7
i < strLength: 1

i:3, strLength: 7
i < strLength: 1

i:4, strLength: 7
i < strLength: 1

i:5, strLength: 7
i < strLength: 1

i:6, strLength: 7
i < strLength: 1

i:7, strLength: 7
i < strLength: 1

i:8, strLength: 7
i < strLength: 1

...

Цикл не завершается до тех пор, пока не произойдет сбой интерпретатора Python, из которого выполняется код (я обертываю модуль ac для python).

Для отладки были введены printf.

Я компилирую это на Mac OSX 10.6, вот команды, которые я использую для компиляции:

gcc -c source.c -I/usr/include/python2.6 -I/usr/lib/python2.6
ld -bundle -flat_namespace -undefined suppress -o out.so source.o -F./ -framework some_framework -macosx_version_min 10.6 -rpath ./

Как вы видите, я связываю в фреймворке, что я создаю оболочку Python для,Это не проблема, так как я могу нормально вызывать функции, использующие связанную инфраструктуру, только когда я вызываю функцию, которая использует вспомогательную функцию, показанную выше, я получаю проблему.

Я глупый здесь иделать что-то очень плохое или что-то не так с компилятором?Любая помощь будет высоко ценится!

Ответы [ 3 ]

14 голосов
/ 23 августа 2011

Я думаю, что это в основном связано с точностью числа. Если Py_ssize_t является 64-битным типом, он может иметь форму: 0xffffffff00000008 (возможно, из-за предыдущего значения вычисления, которое включает в себя неправильные числа точности или смешивание, подписанное с вычислениями без знака). Когда рассматривается как int (32 бита), его результат равен 8, но если рассматривать его как 64-битное значение, он дает очень маленькое отрицательное число (со знаком) или очень большое положительное число (без знака). Попробуйте изменить выражения wprintf, чтобы записать длинное десятичное число (%ld), и посмотреть, что напечатано, или отладить свой код с помощью gdb, чтобы увидеть число в его реальном размере.

5 голосов
/ 23 августа 2011

Можете ли вы попробовать использовать int i и int strLength?

Я не знаю Py_ssize_t тип, но неявное приведение с %d в printf может скрыть проблему

3 голосов
/ 23 августа 2011

Что такое Py_ssize_t?

printf("sizeof (int) is %d\n", (int)sizeof (int));
printf("sizeof (Py_ssize_t) is %d\n", (int)sizeof (Py_ssize_t));

Кроме вызова wprintf с char* (один раз), вы используете спецификатор "%d" для значений типа Py_ssize_t

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...