C++で、コンパイルエラーが

[戻る]
つくだ 2016/03/03(木) 14:00:21
いつもはC言語で書いているのですが、
今回、訳あってC++で書かなければならなくなりました。
Visual Studio 2005をWindows 10の上で動かしています。
ソースコードは(1)ですが、その下の(2)のような
コンパイルエラーになりました。
お手数ですが、どなたか、どこをどう直したらいいか、
教えていただけないでしょうか?


(1)

//定数定義、変数宣言
#define pi2 (8.0 * atan(1.0))   //2π
#define N 1000                  //データ点数                    
#define M 16                    //周波数の個数
#define FS 1000.0               //サンプリングの周波数(HZ)
#define sigma 1                 //係数のσ
#define limit 0.01              //ガボール減衰の最小値
double data[N];                 //信号データ
double result_r[M][N];          //変換結果データ[周は周][時間]実数部
double result_i[M][N];          //変換結果データ[周は周][時間]虚数部
// ψ(t) = 1 / (2 sqrt(π) σ) * exp(-t^2/σ^2) * exp(jωt)

#include <stdio.h> 
#include <math.h> 

//ガボールウェーブレット変換
void GaborTransform()
{
    //16個の周波数のループ
    for (int m = 0; m < M; m ++)
    {
        double f = 2.0 * m;    //周波数=0..31HZ
        double a = 1.0 / f;    //スケールのa=周期
        //データ点数分までのループ
        for (int p = 0; p < N; p ++)
        {
            double valr = 0.0;
            double vali = 0.0;
            //畳み込み積分のループ
            for (int n = -p ; n < N - p; n ++)
            {
                int p1 = p + n;           //畳み込み乗算の位置
                double t = n / FS / a;    //(t-b)/a
                double alfa = pi2  * t ;  //ωt
                //ガボール減衰係数=1 / (2 sqrt(π) σ) * exp(-t^2/σ^2)
                double gabor = exp(-t * t / (sigma * sigma)) / (2 * sqrt(pi2) *
sigma);
                if (gabor >= limit && 0 <= p1 && p1 < N)
                {
                    //畳み込み乗算:実数、虚数。
                    valr += data[p1] * gabor * cos(alfa);
                    vali += data[p1] * gabor * sin(alfa);
                }
            }
            //結果の保存
            result_r[m][p] = valr / sqrt(a);
            result_i[m][p] = vali / sqrt(a);
        }
    }
}

//VC++のビューのOnPaint()
void CChildView::OnPaint() 
{
    CPaintDC dc(this);
    //0.2秒毎に、周波数を0,8,16,24,0の順で
    //1秒間の正弦波のデータ作成。
    double alfa = 0.0;
    for (int i = 0; i < N; i ++)
    {
        if (i >= 800)
            data[i] = 0.0;
        else
            data[i] = 30.0 * sin(alfa);
        alfa += (i / 200) * 8.0 * pi2 / FS;
        if (i == 0)
            dc.MoveTo(i, 40 - (int)data[i]);
        else
            dc.LineTo(i, 40 - (int)data[i]);
    }
    //ガボールウェーブレット変換
    GaborTransform();

    int K = 50;
    for (int m = 0; m < M; m ++)
    {
        int y = 100 + m * 20;
        for (int n = 0; n < N; n ++)
        {
            //瞬時値を表示
            int val = (int)result_r[m][n] / K;
            //振幅値を表示
            //int val = (int)sqrt(result_r[m][n] * result_r[m][n] +
result_i[m][n] * result_i[m][n]) / K;
            if (n == 0)
                dc.MoveTo(n, y - val);
            else
                dc.LineTo(n, y - val);
        }

        CString strF;
        strF.Format(L"F:%d(HZ)", m * 2);
        dc.TextOut(1000, y - 4, strF);
    }
}

つくだ 2016/03/03(木) 14:01:18
エラーの方は、下記です。

(2)

1>------ すべてのリビルド開始: プロジェクト: Wavelet, 構成: Debug Win32 ------
1>プロジェクト 'Wavelet'、構成 'Debug|Win32' の中間出力ファイルを削除しています。
1>コンパイルしています...
1>Gabor.cpp
1>c:\cs\wavelet\gabor.cpp(52) : error C2653: 'CChildView' : 識別子がクラス名でも
名前空間名でもありません。
1>c:\cs\wavelet\gabor.cpp(54) : error C2065: 'CPaintDC' : 定義されていない識別子
です。
1>c:\cs\wavelet\gabor.cpp(54) : error C2146: 構文エラー : ';' が、識別子 'dc' の
前に必要です。
1>c:\cs\wavelet\gabor.cpp(54) : error C2673: 'OnPaint' : グローバル関数にアクセ
スするための 'this' ポインタがありません。
1>c:\cs\wavelet\gabor.cpp(54) : error C3861: 'dc': 識別子が見つかりませんでした
1>c:\cs\wavelet\gabor.cpp(66) : error C2228: '.MoveTo' の左側はクラス、構造体、
共用体でなければなりません
1>        型は ''unknown-type'' です。
1>c:\cs\wavelet\gabor.cpp(68) : error C2228: '.LineTo' の左側はクラス、構造体、
共用体でなければなりません
1>        型は ''unknown-type'' です。
1>c:\cs\wavelet\gabor.cpp(84) : error C2228: '.MoveTo' の左側はクラス、構造体、
共用体でなければなりません
1>        型は ''unknown-type'' です。
1>c:\cs\wavelet\gabor.cpp(86) : error C2228: '.LineTo' の左側はクラス、構造体、
共用体でなければなりません
1>        型は ''unknown-type'' です。
1>c:\cs\wavelet\gabor.cpp(89) : error C2065: 'CString' : 定義されていない識別子
です。
1>c:\cs\wavelet\gabor.cpp(89) : error C2146: 構文エラー : ';' が、識別子 'strF'
の前に必要です。
1>c:\cs\wavelet\gabor.cpp(89) : error C2065: 'strF' : 定義されていない識別子です。
1>c:\cs\wavelet\gabor.cpp(90) : error C2228: '.Format' の左側はクラス、構造体、
共用体でなければなりません
1>        型は ''unknown-type'' です。
1>c:\cs\wavelet\gabor.cpp(91) : error C2228: '.TextOut' の左側はクラス、構造体、
共用体でなければなりません
1>        型は ''unknown-type'' です。
1>ビルドログは "file://c:\CS\Wavelet\Debug\BuildLog.htm" に保存されました。
1>Wavelet - エラー 14、警告 0
========== すべてリビルド: 0 正常終了、1 失敗、0 スキップ ==========

tetrapod 2016/03/03(木) 15:42:00
(1) がソースコード全文なら #include 類がまったく足りていない。
MFC ベースの Window Application だよね。
フツーに Wizard を使って MFC Application を作ったのなら

#include "stdafx.h"
#include "なんちゃらview.h"
があるソースコードにしないとうまくコンパイル通らないと思われる。

っていうか既にある なんちゃらview.cpp にて OnPaint を実装しよう。

ITO 2016/03/04(金) 09:23:47
http://www.kumei.ne.jp/c_lang/indexmfc.html
ここがいいかな?
出来れば読み物がいいですね。
サイトでは頭にはいらないですね。

ITO 2016/03/04(金) 09:39:04
http://www-higashi.ist.osaka-u.ac.jp/~k-maeda/vcpp/
骨格が自動で作られるタイプです。
あと、言い忘れましたが、Visual Studio 2005のMFCでWINDOWS10は非対応です。
仮に動作してもマイクロソフト等のサポート・保証がないです。
回答する側も、少なからずバージョンが低いからとしか言いようのない場合もあります。

古いスレッドには追加発言できません。