エラーに関しては、VisualStudioの出力ウィンドウからコピペ可能ですね。
フォルダ名から個人名がバレるので要修正ですが。
メロンパン さんが書きました:皆さん、お騒がせしております。メロンパンです。
softyaさんの質問にお答えしますと、
(3) ,(C)が正解です。
(3)については、話すと長くなりますので、手短に説明します。
学生時代に研究していたある題材(今でいうプロジェクト)を作成していたのですが、
1つのファイルに全て書き込んで1つのプロジェクトにしていたため何度も同じ関数を
書いては、無駄が多いと思っていたのでオブジェクト指向を取り入れたくC++にしました。
C言語でもライブラリ化や、オブジェクト化はできますので無駄はその時点で排除できたはずです。
なのでC++だと効率化するってのは状況によると思います。
C++は魔法ではありませんので、オブジェクト指向設計されないと大抵の場合はC言語で事足ります。
メロンパン さんが書きました:
(C)については、みっともないので出しませんでしたが、
C言語で書いたプログラム自体には問題がなく(返り値の指摘を受けたところは除いて)
C++で以下の様なプログラムを書いてエラーになりました。
そのため、質問をしました。(エラーの内容はコピーできませんでした)
そこを出してもらわないと意味が無いというかタイトルとずれていた原因ですね。
恥ずかしがっているよりもC++を理解することを優先したほうが良いと思います。
せっかく添削してもらえるのにここを利用する意味が無いというか・・・。
ちなみに同じvc++2008でコンパイルしましたがコンパイルエラーは出ませんでした。
C++版を見て感じたこと。
・endlと"\n"が区別されていません。ほぼ同等だと思って下さい。
・初期化で不思議な事をしています。cout << flag
<< 0 << endl
やりたかったことは次のような感じでしょうか。
コード:
//N*Nマスの正方形に互いに縦横に自分しか存在しない状態を作る。
//(8飛車問題)
#include <iostream>
using namespace std;
const int N = 8;
int flag[N];
int pos[N];
void print(void);
void set(int);
/*i行目の値を表示させる関数*/
void print(void)
{
for (int i = 0; i < N; i++)
{
cout << pos[i];
}
cout << endl;
}
/*N飛車問題を全探索で解く処理*/
void set(int i)
{
for (int j = 0; j < N; j++)
{
if (!flag[j])
{
pos[i] = j;
if (i == (N - 1))
{
print();
}
else
{
flag[j] = 1;
set(i + 1); /*再帰呼び出し*/
flag[j] = 0;
}
}
}
}
/*メイン関数*/
int main(void)
{
for (int i = 0; i < N; i++)
{
flag[i] = 0;
}
set(0);
return 0;
}
【補足】
coutに変えてdefineの排除程度だとC++の基本的な事の理解にはなると思いますが、同じ事を数個以上やる意味は無いと思います。
前の話題の時も問題になったのですがメロンパンさんの手持ちのコードの中でファイル分割やライブラリ化出来るコードを提示して貰わないと質問のテーマであるC++化するメリットとは?にあまりお答えできると思えません。「C++に直せば部品の組み換えが効く」と言う部分も話題にできないと思いますのでご検討下さい。
※ 一番問題となるのは、何処をどうやってライブラリ化やファイル分割すれば良いのか分からないと言う根源的な問題の場合です。
去年の質問の時に問題提示した私の言葉です。「実際のところ、もっと長いプログラムを見ないと評価できないですね。」
http://dixq.net/forum/viewtopic.php?f=3&t=8825#p71884