簡単なソースです ひとつバグが含まれています – プログラミング – Home

簡単なソースです ひとつバグが含まれて...
 
通知
すべてクリア

[解決済] 簡単なソースです ひとつバグが含まれています

固定ページ 1 / 2

ねずみ
 ねずみ
(@ねずみ)
ゲスト
結合: 22年前
投稿: 2
Topic starter  

「以下のソースに、ひとつバグが含まれています。
具体的には、void func()の中でひとつ処理が抜けています。
このソースはJavaとして動かせばちゃんとうごくそうです。
でも、C++として動かすとコンパイルでエラーになるそうです。」

私、C++を勉強したことがないんです。
このソースの中のバグをさがしていただけませんでしょうか?
これは仕事を依頼してきている会社からの宿題(試されてる??)
なのです。。。

#include <stdio.h>

class Foo
{
public:
int i;
Foo(int j) { i = j; }
Print() { printf(%d, i); }
};

void func()
{
Foo* foo = new Foo(5);
foo->Print();
return;
}

int main()
{
func();
}


引用未解決
トピックタグ
______
 ______
(@______)
ゲスト
結合: 22年前
投稿: 2
 

こちらは?

http://www.mtakahashi.com/log/09132.html


返信引用
田中(れ)
 田中(れ)
(@田中(れ))
ゲスト
結合: 22年前
投稿: 1
 

>C++として動かすとコンパイルでエラーになるそうです。
コンパイルしてみましょう。コンパイラがエラーを教えてくれます。


返信引用
PAI
 PAI
(@PAI)
ゲスト
結合: 24年前
投稿: 359
 

まず、『試されてる??』と思うなら自分でやるべきではないですか?
C++を勉強したことがない、のなら『これをたたき台にC++を勉強してみろ』
という意味で試されているのかもしれませんよ。

>Javaとして動かせばちゃんとうごくそうです
試しましたか?動きませんよ。というより全然違う。
コンパイルとおらないしトップレベルに関数置けない。

>このソースの中のバグをさがしていただけませんでしょうか?
最終的にどうなっていればいいのか(このプログラムが何をすればいいのか)
がわからないのに、バグを探せ、といわれても何も出来ません。
コンパイルエラーをなくせというのならPrintの戻り値が表記されてないので
voidにデモしてあげてください。

あと、動くのと、コンパイルが通るのは全然別問題なので、
用語も気をつけたほうが良いかと。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 23年前
投稿: 1301
 

>>C++として動かすとコンパイルでエラーになるそうです。
>コンパイルしてみましょう。コンパイラがエラーを教えてくれます。

ぜんぜん関係のない個所でwarningが2個出ますな ^^;
問題自体に誤りがありそうです。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 23年前
投稿: 1301
 

> 問題自体に誤りがありそうです。

あ、ひょっとして '問題がヘン' と答えれば合格?
だとすると出題者は賢いヒトだ。


返信引用
______
 ______
(@______)
ゲスト
結合: 22年前
投稿: 2

返信引用
PAI
 PAI
(@PAI)
ゲスト
結合: 24年前
投稿: 359
 

あ、戻り値無いのは警告にしかなりませんか。


返信引用
アイススケーター
 アイススケーター
(@アイススケーター)
ゲスト
結合: 23年前
投稿: 280
 

メモリリークのことではないですか

newがあるのにdeleteが無い


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 23年前
投稿: 1301
 

> newがあるのにdeleteが無い

それが理由でコンパイルエラーにはなりませぬ。
# おそらく実行時エラーにもならんな。


返信引用
PAI
 PAI
(@PAI)
ゲスト
結合: 24年前
投稿: 359
 

こういうのその出題した人が見たらどう思うんでしょう。

class Foo
{
public:
int i;
Foo(int j) { i = j; }
// i の初期化が冗長になる。
// Foo(int j): i(j) {} とすべきである。

Print() { printf(%d, i); }
// 戻り値が無いため警告となる。
// 内容を変更しないため、constとすべきである。
// void Print() const { printf(%d, i ); }

};

void func()
{
Foo* foo = new Foo(5);
// そもそもヒープに Foo のインスタンスを生成する理由が見当たらない。
// Foo foo(5);
// とすべきである。

foo->Print();
// スタック上に生成したなら
// foo.Print();
// となる。

return;
// ここでfooのスコープから外れ、ヒープ上に生成した場合追跡不可能となり、
// メモリリークが起こる。
// が、この関数自体を一度しか呼ばないのであれば、それはメモリプールであり、
// バグとはいえないかもしれない。
// foncを複数回呼ぶことが考えられるのであれば、
// スタックに生成するようにするかdeleteするか、auto_ptr等を使用すべきであ
る。
}

int main()
// mainは引数int, char** を受けるべきである。
{
func();

// 戻り値がintであるのに値を返していない。
// 適切な return を入れるべきである。
}


返信引用
PIP
 PIP
(@PIP)
ゲスト
結合: 22年前
投稿: 16
 

はじめまして。

C++ですよね?
ならばコンパイルエラーは
>#include <stdio.h>
ではないかと。

たしかC++では拡張子.hがつくヘッダは使えなくなったはず‥。
違うかな。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 23年前
投稿: 1301
 

>ならばコンパイルエラーは
>>#include <stdio.h>
>ではないかと。

もしそうなら、std::printf(...) でなくては。


返信引用
PAI
 PAI
(@PAI)
ゲスト
結合: 24年前
投稿: 359
 

ああ、それもあったか。じゃ、追加。

#include <stdio.h>
// C++としては推奨されない
// #include <cstdio>
// とし、適切なネームスペース解決をすべきである。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 23年前
投稿: 1301
 

int i; がpublicなのもいかがなものかと。

# スレ主そっちのけで遊んでるね^^;
# そのくらい'いいかげん'な問題なんだが。


返信引用
固定ページ 1 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました