-1

C の最後の行を書いてからしばらく経ちましたが、現時点では C のコツをつかむのに問題があります。これはおそらく私が犯しているばかげた間違いだと思いますが、しばらく問題を調査した後でも、何が間違っているのかわかりませんでした。だから、これは私のコードがどのように見えるかです:

int read_signal_from_file(const char* path, float* signal, SF_INFO * info) {
    SNDFILE *sndFile;
    sndFile = sf_open(path, SFM_READ, info);
    signal = malloc(info->frames * sizeof(float));
    long numFrames = sf_readf_float(sndFile, signal, info->frames);
    ...
}

int main(int argc, char *argv[]) {
    float** signals = malloc(NUM_FILES * sizeof(float*));
    float avg = 0.0;
    SF_INFO tmp_info;
    for(int i = 0; i < NUM_FILES; i++) {
        read_signal_from_file(INPUT_FILES[i], signals[i], &tmp_info);
        for(long j = 0; j < tmp_info.frames; j++) {
            printf("Sample no #%ld: %f\n", j, signals[i][j]);
        }
    }
}

内部ではread_signal_from_file()、割り当てられたメモリ部分に問題なくアクセスできます。しかし、メイン関数のスコープからアクセスしようとするとすぐに (たとえば、上記の printf() の例のように)、初期化されていないメモリまたはオーバーフローのように疑わしい破損した結果が得られます。そのデータを操作しようとすると、 、(たとえば、 を呼び出すvDSP_meanv()と、アプリケーションはセグメンテーション違反でクラッシュします。

4

4 に答える 4

0

(前述のとおり)ポインターのsignals配列を割り当てていますが、この配列にポインターを割り当てていません。割り当てると、メモリが予約signalされread_signal_from_fileますが、ポインターはローカル signal変数に割り当てられます。signal関数のsignals配列に割り当てられたを割り当てたい場合はmain、ポインターにポインターを渡す必要があります。

read_signal_from_file(INPUT_FILES[i], &signals[i], &tmp_info);

read_signal_from_fileそれを受け入れるように関数を変更します。

int read_signal_from_file(const char* path, float ** signal, SF_INFO * info) {
    // ...
    *signal = malloc(info->frames * sizeof(float));
    // ...
于 2013-07-24T13:16:09.123 に答える
0

ポインターの配列を割り当てていますが、それらを何にも設定していません。

float** signals = malloc(NUM_FILES * sizeof(float*));

つまり、ここで初期化されていないポインター ( signals[i])を渡しています。

read_signal_from_file(INPUT_FILES[i], signals[i], &tmp_info)

値で渡されるためsignals[i]、関数呼び出しで変更されることはなく、read_signal_from_file戻り後も初期化されません。

簡単な変更は、参照渡しです。

int read_signal_from_file(const char* path, float* &signal, SF_INFO * info) { ... }
于 2013-07-24T13:10:30.877 に答える
0

に渡しfloat *signalてそこread_signal_from_file()に再割り当てしますが、ローカル varではなくvar をsignal変更するだけです。の署名をに 変更signalsignals[i]main()read_signal_from_file()

int read_signal_from_file(const char* path, float** signal, SF_INFO * info)

に変更malloc()します

*signal = malloc(info->frames * sizeof(float));

signals+i代わりに渡しますsignals[i]

于 2013-07-24T13:17:00.257 に答える