ページ 1 / 1
C言語のプログラムをC++に直すメリットとは何でしょうか?
Posted: 2012年7月30日(月) 20:44
by メロンパン
今までお世話になっていました。メロンパンです。
今まで100個以上のプログラムを全てCだけで書いていました。
ある日、C++に直せば部品の組み換えが効くと思い、
VisualStudioを用いてCのプログラムをC++に直していたのですが、
少しつまづいてしまい分からないエラーが出てきました。
練習のためにはいいかと思うのですが、これはメリットのあることなのでしょうか?
ちなみに、プログラムは下記のようなものです。よろしくお願い致します。
コード:
/*N*Nマスの正方形に互いに縦横に自分しか存在しない状態を作る。*/
/*(8飛車問題)*/
#include <stdio.h>
#define N 8
int flag[N];
int pos[N];
/*i行目の値を表示させる関数*/
void print(void)
{
int i;
for (i = 0; i < N; i++)
{
printf("%d", pos[i]);
}
putchar('\n');
}
/*N飛車問題を全探索で解く処理*/
void set(int i)
{
int j;
for (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;
}
}
}
}
/*メイン関数*/
void main(void)
{
int i;
for (i = 0; i < N; i++)
{
flag[i] = 0;
}
set(0);
}
Re: C言語のプログラムをC++に直すメリットとは何でしょうか?
Posted: 2012年7月30日(月) 20:56
by box
メリットの件はよくわかりません。
メロンパン さんが書きました:
コード:
/*メイン関数*/
void main(void)
戻り値の型が間違っているからコンパイルできないのではないでしょうか。
Re: C言語のプログラムをC++に直すメリットとは何でしょうか?
Posted: 2012年7月30日(月) 20:57
by みけCAT
まずエラーメッセージを貼り付けてください。
Re: C言語のプログラムをC++に直すメリットとは何でしょうか?
Posted: 2012年7月30日(月) 20:58
by softya(ソフト屋)
まったくC++になっていませんからC言語のものでしょうか?
コンパイラとオプションによっては、エラーが出ないんですが問題点の説明をお願いします。
あとC++ならではの事をしないとC++を使った効果がありません。
ちょっとした事でも良いのでC++を使う意義のあることを行けないわけですが、stringを使うとかvectorを使うだけでも良いです。
C++にしたからと言って「部品の組み換えが効く」わけでもないで、使い回しを考えるなら使いまわす部分は、あるいていど設計段階からオブジェクト指向しておくべきだと思います。
Re: C言語のプログラムをC++に直すメリットとは何でしょうか?
Posted: 2012年7月30日(月) 21:24
by たかぎ
CにくらべるとC++は静的な型チェックが強力ですので、Cで書かれたソースコードをC++でもコンパイルできるようにするのは、潜在的な不具合を減少させるという意味で、それなりのメリットがあります。
Re: C言語のプログラムをC++に直すメリットとは何でしょうか?
Posted: 2012年7月30日(月) 21:45
by rere
ただC++でしか使えない関数を使ってるだけなので、そのソースには意味はないですね。
オブジェクト指向のプログラムを組んでみたらどうですか?
Re: C言語のプログラムをC++に直すメリットとは何でしょうか?
Posted: 2012年7月30日(月) 23:42
by かずま
メリットのひとつは、標準ライブラリが C より豊富なこと。
同じ結果を出力するプログラムが次のように書けます。
コード:
#include <iostream>
#include <algorithm>
const int N = 8;
int main()
{
int a[N];
for (int i = 0; i < N; i++) a[i] = i;
do {
for (int i = 0; i < N; i++) std::cout << a[i];
std::cout << std::endl;
} while (std::next_permutation(a, a + N));
}
Re: C言語のプログラムをC++に直すメリットとは何でしょうか?
Posted: 2012年7月30日(月) 23:48
by softya(ソフト屋)
同じような話題が過去にありましたね。
あの時はメロンパンさんは何をどうされたいのか謎のまま終わりましたが、メロンパンさんの思う「C++に直せば部品の組み換えが効くと思い」と言うのはどういう点なのか説明して頂きたいです。前の話だとライブラリ的なものが必要そうなものを全く作られていなかったと認識しているのですが。
Re: C言語のプログラムをC++に直すメリットとは何でしょうか?
Posted: 2012年7月31日(火) 02:37
by たいちう
部品の組み換えが効く、というのはどんなイメージを持っているのでしょうか?
曖昧な印象を受けますが、正確に表現できますか?
ライブラリ的な物を作るとか、そのような意図ならば、
C言語のままでも、十分できたはずです。
C++にしてオブジェクト指向に沿うことで、
より高度なライブラリは作成可能ですが、
C++にしたからといって、自動的にオブジェクト指向になるわけではありません。
メロンパンさんの質問は、「これはメリットのあることなのでしょうか?」
という事だったと思います。練習以外にはメリットはないでしょう。
そもそも、練習の為に作ったプログラムを書き換えて、
練習以外の何の役に立つと考えていますか?
自分の作った100以上のプログラムがあるならば、
C言語のままだろうと、C++に書き換えようと、共通化はしやすいでしょう。
C++に書き換えることで、Cではできなかった共通化ができたならば、
オブジェクト指向の理解が深まり、非常に有意義な練習だったと思います。
Re: C言語のプログラムをC++に直すメリットとは何でしょうか?
Posted: 2012年7月31日(火) 12:41
by メロンパン
返信おそくなりまして申し訳ありません。
皆さんのご回答が非常に参考になっております。ありがとうございます。
早くて今日の夜にはご返事いたしますので、少々お待ち頂ければと思います。
取り急ぎ失礼致します。
Re: C言語のプログラムをC++に直すメリットとは何でしょうか?
Posted: 2012年7月31日(火) 20:50
by メロンパン
お世話になっております。メロンパンです。
私が質問したい内容はほぼ「たいちう」さんが説明されている通りです。
今までC言語を1つのファイルにまとめて書いていたため、
オブジェクト指向プログラミングにするにはどうしたらいいか考えた結果、
今までのソースをC++に直せばいいのではと単純に考えていました。
タイトルが「直すメリットとは何でしょうか?」となっておりますが、
訂正すると「直すメリットはあるのでしょうか?」でした。
それと、「かずま」さんが載せて頂いたコードを実行したところ、
すんなり私のプログラムと同じ結果が出てました。お見事でした。
と思うと、「softya」さんの回答を拝見し思い出しまして、
確かこのプログラム以前もご指摘頂いた気がすると思いましたが、
何がしたかったのかは思い出せません。申し訳ありません。
なお、私の今のPCではC++はコンパイル実行可能なのですが、
Cはコンパイル実行出来ないため、エラーが貼り付けられません。
VisualStudio2008を積んでおります。(「みけCAT」さんへ)
そもそも学校で6年間もC言語を初年度からやっていて、
このレベルでは趣味程度のアマチュアプログラマしかなれないと
思いまして、今文字入力の仕事をしています。
本当はPHPとかC++とかバリバリに強くなりたいので、
まだスクールに通いながら勉強を続けています。
ここでは本当にお世話になってばかりですが、
よろしくお願い致します。そしてありがとうございます。
Re: C言語のプログラムをC++に直すメリットとは何でしょうか?
Posted: 2012年7月31日(火) 21:00
by box
メロンパン さんが書きました:
なお、私の今のPCではC++はコンパイル実行可能なのですが、
Cはコンパイル実行出来ないため、エラーが貼り付けられません。
VisualStudio2008を積んでおります。(「みけCAT」さんへ)
うそ~ん。
ソースファイルの拡張子をcppにするかcにするかの違いだけじゃないんですか?
Re: C言語のプログラムをC++に直すメリットとは何でしょうか?
Posted: 2012年7月31日(火) 21:05
by softya(ソフト屋)
メロンパン さんが書きました:今までのソースをC++に直せばいいのではと単純に考えていました。
タイトルが「直すメリットとは何でしょうか?」となっておりますが、
訂正すると「直すメリットはあるのでしょうか?」でした。
シンプルに考えてC++に直すと言う話を聞けば、まず思い浮かぶのはかずまさんの様にC++の機能を利用することだと思います。
なので、メロンパンさんが目指されていたC++に直すということが単なるコンパイルを通すことであればC++を修得するという意味においてはたかぎさんの言われたC言語の悪い癖を取る意味ぐらいしかありません。
今回はどの様な着地点を目指されていたのでしょうか? 皆さんが聞きたい最大の疑問点だと思います。
一応、 たいちうさんの言われるとおりとおっしゃっていますが前回の事もあるので再確認させて下さい。
(1) C++の機能を使って完全に書きなおすこと。
(2) とりあえずC++でコンパイルを通すこと。
(3) (1)を目指しているが、とりあえず(2)で問題が出たため質問した。
(4) それ以外。
メロンパン さんが書きました:
なお、私の今のPCではC++はコンパイル実行可能なのですが、
Cはコンパイル実行出来ないため、エラーが貼り付けられません。
VisualStudio2008を積んでおります。(「みけCAT」さんへ)
この説明が、
メロンパン さんが書きました:
ある日、C++に直せば部品の組み換えが効くと思い、
VisualStudioを用いてCのプログラムをC++に直していたのですが、
少しつまづいてしまい分からないエラーが出てきました。
ここの最初に質問と矛盾しているのですが、最初の質問で書かれたC言語のコードは何が問題なのでしょうか?
(A) VisualStudio2008でエラーが出た。
(B) 別のコンパイラでエラーが出た。
(C) 実はエラーがあったのは別のプログラムだった。
(D) それ以外。
ちなみに、VisualStudio2008でも/TCオプションでC90規則のC言語でコンパイル可能です。
※ あるいはboxさんの言われる通り拡張子を.cに変えるだけです。
Re: C言語のプログラムをC++に直すメリットとは何でしょうか?
Posted: 2012年7月31日(火) 21:10
by peach
box さんが書きました:
うそ~ん。
ソースファイルの拡張子をcppにするかcにするかの違いだけじゃないんですか?
厳密に言えばVS2008はC++サポートしてるからC99はサポートしなくてもいいでしょという考えで設計されているので一概にはそうとは言えません。
Re: C言語のプログラムをC++に直すメリットとは何でしょうか?
Posted: 2012年8月01日(水) 01:19
by メロンパン
皆さん、お騒がせしております。メロンパンです。
softyaさんの質問にお答えしますと、
(3) ,(C)が正解です。
(3)については、話すと長くなりますので、手短に説明します。
学生時代に研究していたある題材(今でいうプロジェクト)を作成していたのですが、
1つのファイルに全て書き込んで1つのプロジェクトにしていたため何度も同じ関数を
書いては、無駄が多いと思っていたのでオブジェクト指向を取り入れたくC++にしました。
(C)については、みっともないので出しませんでしたが、
C言語で書いたプログラム自体には問題がなく(返り値の指摘を受けたところは除いて)
C++で以下の様なプログラムを書いてエラーになりました。
そのため、質問をしました。(エラーの内容はコピーできませんでした)
コード:
//N*Nマスの正方形に互いに縦横に自分しか存在しない状態を作る。
//(8飛車問題)
#include <iostream>
using namespace std;
int num = 3;
int flag[3];
int pos[3];
void print(void);
void set(int);
/*i行目の値を表示させる関数*/
void print(void)
{
for (int i = 0; i < num; i++)
{
cout << pos[i] << endl;
}
cout << "\n" << endl;
}
/*num飛車問題を全探索で解く処理*/
void set(int i)
{
for (int j = 0; j < num; j++)
{
if (!flag[j])
{
pos[i] = j;
if (i == (num - 1))
{
print();
}
else
{
flag[j] = 1;
set(i + 1); /*再帰呼び出し*/
flag[j] = 0;
}
}
}
}
/*メイン関数*/
int main(void)
{
for (int i = 0; i < num; i++)
{
cout << flag[i] << 0 << endl;
}
set(0);
return 0;
}
Re: C言語のプログラムをC++に直すメリットとは何でしょうか?
Posted: 2012年8月01日(水) 07:48
by beatle
少なくとも僕の環境(Mac + GCC)だとエラーが出ませんでしたが、メロンパンさんの環境ではどのようなエラーがでるのでしょうか。
コピー出来ないと言いますが、手で書き写すとか、スクリーンショットを撮るとか、やり方はあるはずです。
Re: C言語のプログラムをC++に直すメリットとは何でしょうか?
Posted: 2012年8月01日(水) 12:59
by softya(ソフト屋)
エラーに関しては、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
Re: C言語のプログラムをC++に直すメリットとは何でしょうか?
Posted: 2012年8月02日(木) 07:22
by メロンパン
おはようございます。メロンパンです。
softyaさん、どうもありがとうございます。
肩の荷が降りました。
まだ既存のCはC++には殆ど直していない状態ですので、
Cだけでオブジェクト志向的な構造を作りたいと思います。
また、プログラムの添削ありがとうございました。
Re: C言語のプログラムをC++に直すメリットとは何でしょうか?
Posted: 2012年8月02日(木) 07:24
by メロンパン
みなさんありがとうございました。
解決しました。
それにしてもこの掲示板素晴らしすぎる。。
Re: C言語のプログラムをC++に直すメリットとは何でしょうか?
Posted: 2012年8月02日(木) 10:53
by softya(ソフト屋)
メロンパン さんが書きました:
肩の荷が降りました。
まだ既存のCはC++には殆ど直していない状態ですので、
Cだけでオブジェクト志向的な構造を作りたいと思います。
また、プログラムの添削ありがとうございました。
メロンパンさんがCでやるべき事は、オブジェクト指向ではなくファイル分割・モジュール化(一種のオブジェクト化)・ライブラリ化です。
出来れば、ここで添削してもらった方が良いと思いますよ。
オブジェクト指向的にC言語で組むことは可能ですが、それをやるのはC++が本格的に理解できてからで良いと思います。
あと、仕事の練習として一般的(まず簡単なエディタとかデータ管理ツールなど)なアプリを組んでみる事はメロンパンさんにとって大事なことだと思います。
今まで一度もそのようなコードを見せてもらっていませんが自分で組んだことが無いのではと思いますが如何でしょう。
例えば、ここのCUIの練習問題ですが7と8とかちゃっちゃっと作れますでしょうか?
「C言語 練習問題」
http://www.geocities.jp/kenji_y0328/crenshu/index.html
やりたくないというのなら無理にとは言いません。