1

編集:この問題は、malloc(3)呼び出しをchar *にキャストしないときに受け取るエラーのために、nvccがCコンパイラではなくC++コンパイラを呼び出すことが原因であると考えています。私はこの主張に導かれます:void*からchar**への無効な会話

EDITEDIT:fileO = fopen(version、 "w");を使用すると正常に動作します。strcpyおよびstrcat呼び出しをバイパスします。(はは、私はキャットコールと言いました...)

そのため、同じプログラムのシーケンシャルバージョン(非CUDA)からファイルI/Oを収集したCUDAプログラムがあります。まったく同じコードが通常の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 に答える