

お世話になります。  
Windows10にMinGWをインストールして、G++を利用して、CPPのソースをコンパイルしようとしているんですが、下記のソースコードをコンパイルすると、エラーが発生します。

[code]

    #define _USE_MATH_DEFINES
    #include <cmath>
    #include "beeps.h"
    
    const int sampleRate=44100;
    const int amplitude=14000;
    
    int generateBeep(short* buf, const float hz, const int length, const int left, const int right) {
        const int samplesPerCycle=static_cast<int>(sampleRate/hz);
        int totalSamples=static_cast<int>((length/1000.0)/(1.0/sampleRate));
        totalSamples+=samplesPerCycle-(totalSamples%samplesPerCycle);
        if (!buf) { //just return buffer length
            return totalSamples*4;
        }
        const double lpan=(left/100.0)*amplitude, rpan=(right/100.0)*amplitude;
        const double sinFreq=(2.0*M_PI)/(sampleRate/hz); //DON'T use samplesPerCycle here
        for (int sampleNum=0; sampleNum<totalSamples; ++sampleNum) {
            const double sample=min(max(sin((sampleNum%sampleRate)*sinFreq)*2.0,-1.0),1.0);
            buf[sampleNum*2]=static_cast<short>(sample*lpan);
            buf[sampleNum*2+1]=static_cast<short>(sample*rpan);
        }
        return totalSamples*4;
    }
    
[/code]

エラー内容は、下記のとおりです。

[code]

    beeps.cpp:18:75: error: 'max' was not declared in this scope
    const double sample=min(max(sin((sampleNum%sampleRate)*sinFreq)*2.0,-1.0),1.0);
    
    beeps.cpp:18:80: error: 'min' was not declared in this scope
    const double sample=min(max(sin((sampleNum%sampleRate)*sinFreq)*2.0,-1.0),1.0);
    
[/code]

何かインストールが必要なパッケージ等があるのでしょうか。  
何か解決方法がありましたら、教えていただけると幸いです。  
よろしくお願いいたします。


CC BY-SA 4.0
2018-09-24T15:16:19.737
48682
2018-09-27T04:45:53.330
2018-09-27T04:45:53.330
19110
29034
question
c++
G++でのコンパイルエラー: 'max' was not declared in this scope


[標準ライブラリヘッダ
`<cmath>`](https://ja.cppreference.com/w/cpp/header/cmath)では`min`や`max`は宣言されていません。`std::min`や`std::max`であれば
[`<algorithm>` で定義](https://ja.cppreference.com/w/cpp/algorithm/min)されています。

ちなみに`<algorithm>`の[`std::clamp`](https://ja.cppreference.com/w/cpp/algorithm/clamp)を使用すると

>
[code]

>     const double
> sample=min(max(sin((sampleNum%sampleRate)*sinFreq)*2.0,-1.0),1.0);
>  
[/code]

は

[code]

    const double sample=std::clamp(sin((sampleNum%sampleRate)*sinFreq)*2.0,-1.0,1.0);
    
[/code]

と書くことができ、コードがわかりやすくなります。


CC BY-SA 4.0
2018-09-24T22:42:16.457
48683
2018-09-24T22:42:16.457
4236
48682
answer