- ベストアンサー
入門サイトのサンプルプログラムがビルドできません
- 入門サイトのサンプルプログラムがビルドできないエラーが発生しています。
- 特定のプライベートメンバへのアクセスが制限されてビルドできません。
- 入力ミスがないにも関わらず、ビルドエラーが発生しています。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 どうやら、VC2008とVC2010のC++CLIでは、構文解釈の能力が異なる様です。 ソース中に散見する、 a[x][y] と書かれた配列は、アンマネージドの2次元配列で、#NetFrameworkの2次元配列は、 a[x, y] と書きます。 推測になりますが、ソースの中にアンマネージド配列が混ざりこんでいて、その部分の判別に、VC2008とVC2010の構文解釈精度の差が出たのではないでしょうか。 要は、アンマネージド配列、 int x[400] を、 System::Windows::Forms::Control::x と勘違いしたと言う事です。まあ、この手のトラブルは、良くある事です。 VC2008でビルドさせたければ、既に回答にある様に、xとyの名前を変えるのが一番手っ取り早いでしょう。 願わくば、Form1クラスのメンバ変数として納めたい所ですが、アンマネージド配列なので、そのままではForm1のメンバ変数として、書かせてくれません。 メンバ変数としてForm1の中に収めるには、マネージド配列として、少なくとも、 public ref class Form1 : public System::Windows::Forms::Form { public: Form1(void) { InitializeComponent(); // //TODO: ここにコンストラクター コードを追加します // a1 = gcnew array<int, 2>(20, 20); a2 = gcnew array<int, 2>(20, 20); p = gcnew array<int, 2>(20, 20); cn1 = gcnew array<int>(20); cn2 = gcnew array<int>(20); x = gcnew array<int>(400); y = gcnew array<int>(400); } private: int n; private: array<int, 2>^ a1; private: array<int, 2>^ a2; private: array<int, 2>^ p; private: array<int>^ cn1; private: array<int>^ cn2; private: array<int>^ x; private: array<int>^ y; private: int s; } の様に書いた上で、2次元配列アクセスの個所を、 a1[x][y] から、 a1[x, y] の様にしなければいけません。 テキスト置換で、][ を、, にするのが手っ取り早いでしょう。
その他の回答 (6)
- osamuy
- ベストアンサー率42% (1231/2878)
> 何と「int x[400],y400];」が競合しているのがわからないです。 エラーメッセージに出ている「System::Windows::Forms::Control」がもつ変数とですね。 ただ、本来見せなくても良いもの(という意味での「private」)が見えている状態なのがおかしいというか、何か制御する方法があるように思えるので、「メンバー変数の可視制御」について勉強しといたほうが良いかなあと。 ※「可視制御」という言葉がおかしいですね。「メンバー変数の可視性制御(visibility control)」もしくは単に「access control」のほうが検索しやすいかも。 ってことで、手っ取り早く直そうと思ったら、変数xをaxに、yをayに置き換えると良いかと。 うちではそれで動きました。
お礼
丁寧に有難う御座いました。 検索して情報を見ることで、仰ってる言葉の意味がなんとなく理解できました。
- Tacosan
- ベストアンサー率23% (3656/15482)
あ~, その可能性があるか~>#3. 手元では VS 2010 なので, それで問題なかったのかも. あと, 当該ページにはいくつかタイポがあったりするので注意. 特に 末項確定方/末講確定法/末項確定法 のあたり.
- asuncion
- ベストアンサー率33% (2127/6289)
プロジェクト名やファイル名には、2バイト文字を使わないようにするのが無難でありましょう。 何せ、あちらさんが開発したソフトを使ってもの作りしようとしているんですから、ね。
お礼
使用しないよう心がけます。 有難う御座いました。
- osamuy
- ベストアンサー率42% (1231/2878)
Visual Studio 2008で試したら、同じようなエラー出ました。 元サイトでは、Visual Studio 2010を使っているようなので、そっちだとうまくいくのでは。 競合しているのは、 > int x[400],y[400]; ――なので、こっちの変数名を変えるのが手っ取り早いと思われますが、 Visual C++での可視制御についての正しい理解を得るほうに注力したほうが、後々幸せになれそうな気もします。
補足
ご回答有難う御座いました。 ただ、私の理解度が低くて、競合している、というのが 何と「int x[400],y400];」が競合しているのがわからないです。 Visual C++の可視制御について、も簡単に調べてみましたが 何の事だかわかりませんでした。 正しい理解を得たいと思いましたが残念です。
- Tacosan
- ベストアンサー率23% (3656/15482)
私のところではエラーになることなく実行できました. あなたが正確にどのような操作をしたのか, あるいはそのエラーが何行目のものなのかなどを書いてください. 前者に関しては, 「そのサイトに書いてある通りにした」とか「コピペした」とかでは当然不可. あなたが行った操作を, その操作の通りに書いてください.
補足
情報不足で申し訳ありませんでした。 ファイル→新規作成→プロジェクト→CLR→「Windowsフォームアプリケーション」を選択 →プロジェクト名に「末項確定法」を貼り付けてOKをクリック http://www5b.biglobe.ne.jp/~suugaku/vc++kougi/kiso/Form5.h を開いて、ctrl+aを押す、ctrl+cを押す。 「Form1.h」を右クリック→コードの表示を選択→ctrl+aを押す、ctrl+vを押す→F5を押してビルド です。エラーメッセージの一部ですが以下の通りです。 1>------ ビルド開始: プロジェクト: 末講確定法, 構成: Debug Win32 ------ 1>コンパイルしています... 1>末講確定法.cpp 1>c:\users\(ユーザー名)\documents\visual studio 2008\projects\sh\project1\末講確定法\末講確定法\Form1.h(420) : error C2248: 'System::Windows::Forms::Control::x' : private メンバ (クラス 'System::Windows::Forms::Control' で宣言されている) にアクセスできません。 1> c:\users\(ユーザー名)\documents\visual studio 2008\projects\sh\project1\末講確定法\末講確定法\Form1.h(20) : 'System::Windows::Forms::Control::x' の宣言を確認してください。 1> c:\windows\microsoft.net\framework\v2.0.50727\system.windows.forms.dll : 'System::Windows::Forms::Control' の宣言を確認してください。 エラーは、420行目と、他たくさんです。 使用しているのはVisual C++ 2008 ExPress Editionです。 Visual C++ 2010 Expressで試したら、「末講確定法」を「packp」に変えたら正常に動作しました。
- LOHA
- ベストアンサー率52% (203/388)
>コピペなので入力誤りはないと思うのですが、何がいけないのでしょうか? ・ちゃんとソースコードの後にある、画像通りの方法でプロジェクトを作成したか ・コピペにミスが無いか など、もう一度確認してみてください(多くのエラーが出るということは、そういう基本的な部分にミスがあるのではないかと思うので)。 #プログラミング初心者でなかったら以下は無視していただいて結構です そもそも、VisualC++(正確にはC++/CLI)はプログラミング初心者が学ぶものとして極めて不適切です。「C++/CLI」や「.NET Framework」という言葉の意味もわからない人や、ましてや「C言語」すら分からないような人がVC++でプログラミングを行うのは無謀すぎます。 もし「C言語」ができないのであれば、そちらから学習から始めるのをお勧めします。 もしくは、GUIな(ウィンドウとかボタンとかを使った)プログラミングをしたいのであれば「VisualC++」よりも「VisualC#」や「VisualBasic」の方をお勧めします。
補足
ご回答有難う御座います。 何度も確かめてみましたが、どうしてもミスが見つけられませんでした。 エラーメッセージを読むと、最初のほうで宣言しているグローバル変数?のxが 宣言が間違ってるとか、アクセス出来ないみたいなことですよね? オススメに従って、C言語の勉強から入りたいと思いますが 今のが気になって仕方がないので解決法をご助言頂ければ嬉しいです。
お礼
丁寧に有難う御座いました! 私の理解力が低くてご回答者の方々にご迷惑おかけしました。 ご回答頂いた内容を見ながら、動くように書き換えて 学んでまいります。 かさねがさね有難う御座いました。