1

编辑:我认为问题是由于 nvcc 调用 C++ 编译器而不是 C 编译器,因为当我不将 malloc(3) 调用转换为 char* 时收到错误。我通过以下方式得出这个断言:从 void* 到 char** 的无效转换

编辑编辑:如果我使用 fileO = fopen(version, "w"); 效果很好 绕过 strcpy 和 strcat 调用。(哈哈,我说的是猫叫声……)

所以我有一个 CUDA 程序,我从同一程序的顺序版本(非 CUDA)中收集了一些文件 I/O。完全相同的代码适用于常规 gcc 编译,但不适用于 nvcc。我知道 nvcc 将 C/C++ 分流到本机 C++ 编译器,但由于某种原因,它只是没有打开可写文件。我已经打开和关闭了另一个文件流,用于在上面的代码中读取数据,但我在我的顺序版本中这样做,它在那里工作正常。

以下是相关代码:

else 
{
    char* version = "matrixExpCUDAx";
    char* filename = (char *)malloc(strlen(version) + strlen(argv[3]));

    strcpy(filename, version);
    strcat(filename, argv[3]);

    FILE *fileO;
    fileO = fopen(filename, "w");   

    if(DEBUG)
    {
        for (i=0; i<(dim*dim); i++) fprintf(stderr, "%f\n", h_O[i]);
    }
    else
    {
        if(fileO != NULL)
        {
            for (i=0; i<(dim*dim); i++)
            {
                fprintf(fileO, "%f\n", h_O[i]);
            }
            fclose(fileO);
        }
        else fprintf(stderr, "Write file failed to create\n");
    }
}
....

我每次都收到“写入文件创建失败”。

有任何想法吗?

4

1 回答 1

1
char* filename = (char *)malloc(strlen(version) + strlen(argv[3]));

首先,您不必将返回值从malloc(3). 如果添加#include <stdlib.h>到程序中,您将获得malloc(3)告诉编译器如何正确处理来自malloc(3). 自己铸造它可以掩盖有用的警告或可以捕获错误的错误。添加#include和删​​除演员表。

此外,这似乎没有为您的文件名分配足够的内存;不要忘记字符串末尾不包含用于终止 ASCII 字节的空间,但是您strlen(3)肯定需要那个终止.NULfilenameNUL

每当你看到这样的代码时:

bar = malloc(strlen(foo));

它几乎总是一个错误。它应该看起来像这样:

bar = malloc(strlen(foo)+1);

即使大小计算在其他地方被打破,我也经常喜欢把+1里面的malloc()调用专门放在里面,只是为了确保我知道它在将来会在那里。

当您file0是时NULL,您可能还应该打电话perror(3)告诉您为什么无法打开文件。可能是“权限被拒绝”。可能是当前工作目录不再存在。(这将阻止您在目录中创建文件,即使您的文件系统权限允许您创建文件。)

于 2012-03-21T01:17:07.287 回答