1

磁力計のサンプリング関数を書いています。

期待どおりにサイクルを実行します。ここで、samplesPerAxis = 33、MAX_AXESは3、MAXは999です。

ご覧のとおり、forループが完了した後にセグメンテーション違反が発生しますが、最後の「終了」は出力されません。

void createSamplingData(){
    int i, indexOfValue,  numaxis=0, sampling_value ;
    printf("%i %i %i\n", magmin[0], magmin[1], magmin[2]);
    printf("%i %i %i\n", magmax[0], magmax[1], magmax[2]);

    for (numaxis = 0; numaxis < MAX_AXES; numaxis++){
        printf("beginAxis: %i\n", numaxis);

        sampling_value = magmin[numaxis];
        for (i = samplesPerAxis*numaxis ; i < samplesPerAxis*(numaxis+1) ; i++){
            indexOfValue = findIndexOfClosestValue(sampling_value, numaxis);
            printf("%i: %i => %i\t", i, sampling_value, indexOfValue);
            MagSamples[i][0] = MagInput[indexOfValue][0];
            MagSamples[i][1] = MagInput[indexOfValue][1];
            MagSamples[i][2] = MagInput[indexOfValue][2];            
            printf("%i %i %i\n", MagSamples[i][0], MagSamples[i][1], MagSamples[i][2]);
            sampling_value = sampling_value + (magmax[numaxis]-magmin[numaxis])/samplesPerAxis;
        // creates and even range between mag in min in each axis
        }
        printf("end axis\n");
    }
    printf("\nend");
}

私が得る出力:..。

beginAxis: 0
0: 32648 => 263         32648 32760 32916
1: 32656 => 258         32656 32724 32888
2: 32664 => 130         32664 32754 32898
...
29: 32880 => 488    32880 32774 32804
30: 32888 => 469    32888 32706 32822
31: 32896 => 990    32896 32752 32812
32: 32904 => 973    32904 32808 32844
end axis
beginAxis: 1
33: 32624 => 463    32790 32624 32906
34: 32631 => 685    32784 32632 32884
35: 32638 => 652    32756 32638 32926
36: 32645 => 465    32833 32645 32867
...
63: 32834 => 601    32690 32834 32930
64: 32841 => 597    32689 32841 32923
65: 32848 => 627    32690 32848 32914
end axis
beginAxis: 2
66: 32769 => 511    32793 32749 32769
67: 32777 => 512    32785 32755 32777
68: 32785 => 520    32769 32731 32785
69: 32793 => 504    32853 32707 32793
...
98: 33025 => 86 32805 32775 33025
end axis

Segmentation fault: 11

どうしたの?

編集:samplesPerAxisは次のように定義されています

#define samplesPerAxis 33
4

1 に答える 1

2

推測として、障害は関数の外にあると思います。機能は印刷で終了します

 printf("\nend");

末尾に「\n」がないことに注意してください。そのため、「終了」は後でフラッシュされます。したがって、出力には表示されません。その間、あなたは続行し、障害に遭遇します。

編集:

i think you are right. Could you elaborate on how the flush would 
process with the trailing \n?

このprintf関数は、送信先をバッファstdoutリングし、改行(指定した内容)に遭遇するとフラッシュします(つまり、端末に送信します)。改行文字を追加せずに強制的にフラッシュするには、を使用できますfflush(stdout);

于 2012-11-21T02:18:27.350 に答える