繁体   English   中英

对于循环不在c中终止

[英]For loop not terminating in c

我正在写一些代码,我收到一个奇怪的错误:当条件语句变为false时,我的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 *缓冲区指向使用u“example”创建的内部unicode python对象),我得到以下输出:

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解释器(我正在为python包装ac模块)崩溃。

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包装器创建的框架中。 这不是问题,因为我可以使用链接框架调用函数,就在我调用使用上面显示的辅助函数的函数时,我是否会遇到问题。

我在这里愚蠢并做了一些非常基本的错误或编译器出了什么问题? 任何帮助将非常感激!

我认为这主要与数字精确度有关。 如果Py_ssize_t是64位类型,则它可能是以下形式: 0xffffffff00000008 (可能是因为先前的计算值涉及不正确的精度数,或者是使用无符号计算进行混合)。 当被认为是int (32位)时,其结果为8,但当被认为是64位值时,它产生非常小的负数(带符号)或非常大的正数(无符号)。 尝试更改wprintf表达式以写入长十进制( %ld )并查看打印的内容,或使用gdb调试代码以查看实际大小的数字。

你能尝试使用int i和int strLength吗?

我不知道Py_ssize_t类型,但在printf使用%d进行隐式转换可能会隐藏问题

什么是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));

除了使用char* (一次)调用wprintf ,您对Py_ssize_t类型的值使用"%d"说明Py_ssize_t

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM