编辑:我认为问题是由于nvcc调用C ++编译器而不是C编译器,因为我没有将malloc(3)调用转换为char *时收到错误。我通过以下方式引出了这个断言:Invalid converstion from void* to char**
EDITEDIT:如果我使用fileO = fopen(版本,“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");
}
}
....
我每次都得到“写文件无法创建”。
有什么想法吗?
答案 0 :(得分:1)
char* filename = (char *)malloc(strlen(version) + strlen(argv[3]));
首先,您不必从malloc(3)
转换返回值。如果将#include <stdlib.h>
添加到程序中,您将获得malloc(3)
原型,告诉编译器如何正确处理来自malloc(3)
的返回值。自己投射可以提供有用的警告或可以捕获错误的错误。添加#include
并移除演员。
此外,这似乎没有为您的文件名分配足够的内存;不要忘记strlen(3)
不包含字符串末尾的终止ASCII NUL
字节的空格,但您的filename
肯定需要终止NUL
。
每当你看到这样的代码时:
bar = malloc(strlen(foo));
它几乎总是一个bug。它应该是这样的:
bar = malloc(strlen(foo)+1);
即使大小计算在其他地方被突破,我也经常希望+1
专门针对malloc()
来电,只是为了确保我知道它将来会存在。
当您file0
为NULL
时,您可能还应致电perror(3)
告诉您为什么您无法打开该文件。它可能是“许可被拒绝”。可能是当前工作目录不再存在。 (这将阻止您在目录中创建文件,即使您的文件系统权限允许您创建文件。)