7

ここで、コードの何が問題なのかを突き止めようとしていますが、うまくいきませんでした :( リサンプラーを書いていますが、それはまったく興味がないと思います。この愚かな警告をなくそうとしています。コード:

ddc.hpp

#ifndef __DIGITAL_DOWN_CONVERTER_H__
#define __DIGITAL_DOWN_CONVERTER_H__

#include <vector>
#include "interpolator.h"

namespace ddc {
    void decimate(std::vector<float> &, unsigned int);
    void expand(std::vector<float> &, unsigned int);
    void perform_resampling(std::vector<float>, unsigned int, unsigned int);
    void generate_filter(std::vector<float> &, unsigned int, unsigned int);
    float Sinc(float);
    unsigned int mcd(unsigned int, unsigned int);
}

#endif

ddc.cpp

#include "ddc.hpp"

namespace ddc {
    void perform_resampling(std::vector<float> &data, unsigned int freq_1, unsigned int freq_2) {
        unsigned int i, gcd = mcd(freq_1, freq_2);
        unsigned int downFactor, upFactor;
        std::vector<float> filter;

        downFactor = freq_1/gcd;
        upFactor   = freq_2/gcd;

        generate_filter(filter, 1024 /* lobi della semi-sinc */, upFactor);

        decimate(data, downFactor);
        expand(data, upFactor);
        interpolate_fft(data, filter);
    }
}

main.cpp

#include <vector>
#include "ddc.hpp"

using namespace std;

int main() {
    vector<float> data;
    // bla bla

    ddc::perform_resampling(data, 1000000, 60000);
    return 0;
}

g++ (Linux) でコンパイルすると、次のエラーが発生します。

$ make all
g++ -c ddc.cpp -o ddc.o -Wall -O3 -lm -m64
g++ -c main.cpp -o main.o -Wall -O3 -lm -m64
g++ ddc.o main.o -o ../bin/resampler
main.o: In function `main':
main.cpp:(.text.startup+0x255): undefine d reference to
`ddc::perform_resampling(std::vector<float, std::allocator<float> >, unsigned int, unsigned int)'
collect2: ld returned 1 exit status
make: *** [../bin/resampler] Error 1

気が狂いそうです、助けてください!私は何を間違っていますか?さらに、メイン関数から削除するddc::と、gcc は次のように提案します。

main.cpp:59:49: note: suggested alternative:
ddc.hpp:24:7: note:   ‘ddc::perform_resampling’
4

3 に答える 3

3

これら 2 つは異なります。

void perform_resampling(std::vector<float> &data, unsigned int freq_1, unsigned int freq_2) 
void perform_resampling(std::vector<float> data, unsigned int freq_1, unsigned int freq_2) 

PS これは、厳密には必須ではありませんが、プロトタイプにパラメーター名を入れる正当な理由の 1 つを示しています。パラメータ名を使用すると、プロトタイプを定義と直接比較でき、文字ごとに一致する必要があります

于 2013-05-22T18:08:11.663 に答える
3

最初の引数として値によってベクトルを取る関数を宣言し、参照によってベクトルを取る関数を定義します。これにより別のオーバーロードが生成され、宣言された関数には定義がありません。おそらく参照のはずなので&、ヘッダーの宣言に追加します。

名前空間の外で関数を定義すると、より有用なコンパイラ エラーが発生します。

void ddc::perform_resampling(std::vector<float> &data, unsigned int freq_1, unsigned int freq_2) {
//   ^^^^^
    // blah blah
}

宣言されていない場合、修飾名で関数を定義するのはエラーになるためです。

于 2013-05-22T18:10:09.943 に答える
1

あなたのプロトタイプでは、あなたが欠けています &

void perform_resampling(std::vector<float>, unsigned int, unsigned int);

定義に出てくる

void perform_resampling(std::vector<float> &data, unsigned int freq_1, unsigned int freq_2) {
    unsigned int i, gcd = mcd(freq_1, freq_2);
    unsigned int downFactor, upFactor;
    std::vector<float> filter;

    downFactor = freq_1/gcd;
    upFactor   = freq_2/gcd;

    generate_filter(filter, 1024 /* lobi della semi-sinc */, upFactor);

    decimate(data, downFactor);
    expand(data, upFactor);
    interpolate_fft(data, filter);
}
于 2013-05-22T18:08:46.670 に答える