2017-04-05 5 views
0

こんにちは私は周波数のカットを理解しており、それらをコマンドラインに追加する方法を理解していますライン230は、230ヘルツでの周波数のカットがあるオーディオのプログラミングSDL - wavファイルでコマンドラインで周波数のカットを指定する方法

sound.exe 230 dbz.wav ある

私はwavファイル微は私がのカットを指定する必要がありますどのようにように失わだということだけで読み込むことができます周波数これは私がこれまでに書いたもの

if (argc <= 1) { 
     fprintf(stderr, "Usage %s <input wav file>\n", argv[0]); 
     return(1); 
    } 
    if (argv[1] == "NULL") // NUll for now as dont know how to specify the cut of frequency{ 
     argv[1] = "dbz.wav"; 
    } 

任意およびすべてのヘルプは本当によく

+0

プログラミングを学ぶときは、独立した小さなビットで問題を細分する方法を学ぶ必要があります。 C++がコマンドラインをどのように解析するかは、オーディオとは無関係です。 – MSalters

答えて

0

を高く評価され、明らかに最初のビットは、あなたが2つの引数、Usage %s <cut-off> <input wav file>を望むようになりまし間違っています。

2番目のビットは機能しません。 argv[1]=="NULL"は無意味です。それは常に偽です。 argv[1]は最初の引数へのポインタですが、"NULL"は実行可能ファイル内の文字列リテラルです。その文字列リテラルは別のポインタに変換され、2つのポインタは同じではありません。 std::string(C++スタイル)またはstrcmp(Cスタイルでは、C++ではまだ可能)を使用してください。

新しい引数については、これは別の文字列になります。結局のところ、ユーザーが入力できる内容を制御するわけではありません。彼は "sound.exe 230Hz dbv.wav"と入力するかもしれない。あなたはその議論を解析する必要があります。簡単な方法の1つはstd::atoi(argv[1])ですが、それはエラー処理の欠如からわずかに苦しんでいます。 std::strtolは構文解析がどこで停止したかを返します。したがって、ユーザーが230Hzを入力した場合、解析はHで停止しています。

0

C++のコマンドライン解析についての記事やライブラリはたくさんありますが、コンパクトで使いやすく、stlのみに依存しているので、AnyOptionを提案します。たとえば、

void example(int argc, char* argv[]) 
{ 
    AnyOption *opt = new AnyOption(); 

    opt->addUsage("Usage: "); 
    opt->addUsage(" -n --name   Wave file name "); 
    opt->addUsage(" -f --freq   Cut-off frequency "); 

    opt->setOption("name", 'n'); 
    opt->setOption("freq", 'f'); 

    opt->processCommandArgs(argc, argv); 

    char* name = NULL; 
    if(opt->getValue("name") != NULL) 
     name = opt->getValue("name"); 

    int freq = 0; 
    if(opt->getValue("freq") != NULL) 
     freq = atoi(opt->getValue("freq")); 

    delete opt; 
} 

オーディオ部分については、もう少し正確にする必要があります。あなたの目的はなんですか?信号にローパスフィルタをかけたいですか?

関連する問題