0

自己実装の burrows-wheeler アルゴリズムを使用してファイルを変換すると、ファイルサイズが 59 kB を超えるファイルを読み取ると、プログラムが動かなくなります。基本的に、ターミナルでプログラムを開始しています:

./BW encode 4 < test 

ここで、4 は 4*1024 バイトを表します。前に述べたように、ファイル サイズが 59 kB 未満のファイル (生データ、テキスト ファイルなど) を処理する場合、問題は発生しません。

データが処理され、stdout に送信されるコード:

void encodeBlock(unsigned char* str,long length){
    unsigned int i, out_rownum;
    unsigned char **str_matr, *out_str, *prnt_rt_str2, *prnt_rt_str1;
    str_matr = (unsigned char**) calloc(length,sizeof(unsigned char*));
    out_str = (unsigned char*) calloc(length+1,sizeof(unsigned char));
    // make matrix with rotationstrings of str (by saving pointer to first character)
    for(i=0;i<(unsigned int) length;i++){
        str_matr[i] = &str[i];
    }
    // sorting matrix
    glob_strt = &str[0];
    glob_length = length;
    qsort(str_matr,length,sizeof(unsigned char*),strCmpEnc);
    out_str[length] = '\0';
    for(i=0;i<(unsigned int) length;i++){
        prnt_rt_str1 = printRotStr(length,&str[0],str_matr[i]);
        prnt_rt_str2 = printRotStr(length,&prnt_rt_str1[0],&prnt_rt_str1[length-1]);
        if(memcmp(str,prnt_rt_str2,length) == 0){
            out_rownum = i;
        }
        out_str[i] = prnt_rt_str1[length-1];
    }    
    printf("(%d ",out_rownum);
    fwrite((unsigned char*) out_str, 1, length, stdout);
    printf(")\n");
    free(prnt_rt_str1);
    free(prnt_rt_str2);
    free(str_matr);
    free(out_str);
}

stdin からデータを受け取るコード

void encode(unsigned short int num, unsigned int block_size){
    long b_length,length;
    unsigned char* buffer;  
    freopen(NULL, "rb", stdin);
    buffer = (unsigned char*) calloc(block_size+1,sizeof(unsigned char));
    length = fread((unsigned char*) buffer, 1, block_size, stdin);
    if(length == 0){
        // file empty
    }else{
        b_length = length;
        printf("##B-W:%ld##\n",length);
        while(length == b_length){
            buffer[block_size] = '\0';
            encodeBlock(buffer,length);
            length = fread((unsigned char*) buffer, 1, block_size, stdin);      
        }
        if(length != 0){
            printf("##B-W:%ld##\n",length); 
            buffer[length] = '\0';
            encodeBlock(buffer,length);
        }
    }
    free(buffer);
}    

行き詰まると、通常は終了し、画面に 'Killed' が表示されます。私はLinux OSに取り組んでいます。

valgrind を使用した結果: プログラムが動かなくなり、システム全体がハングします。システムを手動でシャットダウンする必要があるため、デバッグ結果を確認できません。

更新: ブロックされた読み取り (59kB 以降) の背後にある理由は、多くのメモリ リークが原因でヒープにスペースが残っていなかったためです。私はこの問題を解決し、最終的に読み取りが正常に機能しました。

4

1 に答える 1

0

行き詰まると、通常は終了し、画面に 'Killed' が表示されます。

これは、メモリ制限を使い果たし、カーネルによって強制終了される可能性が高いことを意味します。

正直なところ、valgrindを使用してください。あなたのコードは読むのが面倒すぎて、人間が致命的なエラーを指摘することはできません (致命的ではありませんが、それでも迷惑なものはたくさんあります)。

于 2012-10-18T20:33:06.533 に答える