2012-02-09 11 views
0

私が取り組んでいるプログラムは、ファイルを受け取り、1行ずつ解析し、各行をuint32_tに変更して配列に追加します。そこからqsort()で配列をソートすることになっています。 私は自分のプログラムを書いていましたが、どうすればいいはずだと思いましたが、コードをテストすると、uint32_tsはすべて同じ値であると言います。これは、文字列をuint32_tに変更すると間違いがあるためですか? strtoulを使う方が良いでしょうか? 最後に、私のqsortの実装は正しいですか? (これは、コンパイルし、それが物事をソートしているが、私はuint_32へのコンバージョンは明らかに間違っていますので、わからないことを言って とにかく、ここのコードです:。qsortを使用して符号なし整数をソート

int main(int argc, char* argv[]){ 
    char const* const fileName = argv[1]; 
    FILE* file = fopen(fileName, "r"); // should check the result 
    char line[256]; 
    uint32_t parArray[256]; 
    int compar(const void *a, const void *b){ 
    const unsigned long long *x = a, *y = b; 
    if(*x > *y) 
     return 1; 
    else 
     return(*x < *y) ? -1: 0; 
    } 
    int lineCounter = 0; // starts at 0 for the array 
    while(fgets(line, sizeof(line), file)){ 
    // parse all info here 
    uint32_t t = (uint32_t) line; 
    // build the array 
    parArray[lineCounter]=t; 
    lineCounter++; 
    printf("Original: %s, Unsigned Int: %u\n", line,t); 
    } 
    qsort(&parArray[0],lineCounter+1,sizeof(uint32_t*),compar); 
    int i; 
    for(i=0;i<lineCounter;i++){ 
    printf("%u\n",parArray[i]); 
    } 
    return 0; 
} 
+0

別の関数(ここで 'main'の中の' compar')内で関数を定義することはgcc拡張です。コードを移植したい場合は、これを使用しないでください。 'main'の前に' compar'の定義を移動してください。 –

答えて

1

あなたが読んでいるときに線を解析していません。 lineからuint32_tへのキャスティングは、メモリ内のその配列のアドレスを単に取ります。これは、出力のすべての行が同じ理由を説明します。代わりにstrtoul(line, NULL, 10)などと呼ぶことをお勧めします。

また、qsortの2番目のパラメータは1つ外れています。 lineCounterは、ループ終了時に正しい値を持ちます。ファイル内の行数です。 1つを追加することで、配列内の入力された値を読み取って未定義の動作を導入します。

3
uint32_t t = (uint32_t) line; 

ではありませんC.あなたの中に文字列を数値に変換するための正しい方法は、おそらく代わりにstrtoulを使用したい。そして、あなたのqsortは(要素の数が間違って、間違った要素サイズ)も間違っている。

parArray[lineCounter] = strtoul(line, NULL, 10); 

/* ... */ 
qsort(parArray, lineCounter, sizeof(uint32_t), compar); 

compar関数を別の関数の中に定義しています。これはGCCエクステンションなので、移植性を考慮していない限り、使用しないでください。

+0

ありがとうございました。あなたの説明は、私が読んだ他の何ものよりもはるかに優れていました。 –

+0

「これは絶対しないでください!あなたが知っている、GCCの鉱山で奴隷になっている兵士たちは長い間働いていたので、あなたは彼らの外延を却下することができました;-) –

+0

@SteveJessopあなたは正しいです。 – cnicutar

関連する問題