【初心者歓迎】C/C++室 Ver.54【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2008/05/14(水) 01:00:02ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.53【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1208989385/l50
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
003531
2008/05/15(木) 13:05:37main関数の前に
void sort(int *p,int n);
を付け加えました。
他に間違ってるところってどこですか?
0036デフォルトの名無しさん
2008/05/15(木) 13:08:23たくさん。あり過ぎて指摘する気にもならん。
まぁ、作った関数は呼ばなきゃ意味がないことくらいは判るだろうから、
後はコンパイラのエラーメッセージをよく読んで順に潰せ。
そうそう、gccを使っているだろうから、gcc file.c -ansi -Wall -pedanticすることをお勧め。
0038デフォルトの名無しさん
2008/05/15(木) 13:11:36{
public:
HogeHoge(){};
virtual ~HogeHoge(){};
};
class Foo
{
public:
static HogeHoge hogehoge;
};
int main ()
{
Foo myClass;
return 0;
}
問題なく通るけど…
003938
2008/05/15(木) 13:14:35004032
2008/05/15(木) 13:15:08>38だとhogehogeの実体を参照しないからエラーにならないかと。
Hogehogeだけ抜き出さずに、実際にそのエラーが出るソースを作って貼ってみては?
00417
2008/05/15(木) 14:08:53してきました。
もう少し調べてみます。
0042デフォルトの名無しさん
2008/05/15(木) 14:10:170043デフォルトの名無しさん
2008/05/15(木) 15:58:58C4251でググったりはしたよね?
0044デフォルトの名無しさん
2008/05/15(木) 16:09:49> virtual ~HogeHoge(){};
セミコロン要らないだろ
0045デフォルトの名無しさん
2008/05/15(木) 17:54:36double x;
double y;
};
struct point q[200];
memcpy(q,p,(n+1)*sizeof(struct point));
これってどういう事をやってるんですか?
0046デフォルトの名無しさん
2008/05/15(木) 18:02:550047デフォルトの名無しさん
2008/05/15(木) 18:08:27恐らくはstruct point * pがあるとして、
先ずはpoint構造体の要素数200の配列qを宣言している。
続いてその配列qに、point構造体(n+1)個分のデータを配列pからコピーしている。
この部分は、for (int ic = 0; ic < n + 1; ++ic) q[ic] = p[ic];とほぼ同等。
0048デフォルトの名無しさん
2008/05/15(木) 18:19:35int func(int n,struct point p[],double d){
struct point q[200];
;
memcpy(q,p,(n+1)*sizeof(struct point));
}
みたいに構造体が引数で渡されています。
0049デフォルトの名無しさん
2008/05/15(木) 18:21:52「構造体」ではなく、「構造体へのポインタ」ね。つまりは、>47。
0050デフォルトの名無しさん
2008/05/15(木) 18:24:31実際のpの大きさがソースを書くときには不定なので、
for文での代入をしていないってことでしょうか?
0051デフォルトの名無しさん
2008/05/15(木) 18:27:58いや違う。pの大きさは、常に一定だ。何故ならpはポインタ変数だからだ。
pが指す領域のサイズについてはnに依存するわけだが、forループでも勿論巧くコピーできる。
では何故memcpy()を使うかというと、保守性よりも(見かけ上の)効率を優先したか、単に習慣か、
書いた人間にでも聞かないと判らないだろう。
0052デフォルトの名無しさん
2008/05/15(木) 18:29:130053デフォルトの名無しさん
2008/05/15(木) 18:42:400054デフォルトの名無しさん
2008/05/15(木) 18:46:59005545
2008/05/15(木) 18:49:170056デフォルトの名無しさん
2008/05/15(木) 19:00:21>memcpy(q,p,(n+1)*sizeof(struct point));
39文字
>for(int i=0;i<n+1;++i)q[i]=p[i];
32文字
0057デフォルトの名無しさん
2008/05/15(木) 20:30:03疑似命令によくある、生データを直接コードに埋め込む事って、どのようにすればいいのですか?
テーブル参照のようなことを仕様と思ったのですが、やり方がよくわからなくて…
0058デフォルトの名無しさん
2008/05/15(木) 20:34:29逆に言えば
memcpyみたいな動作をする命令があるから、
まともでない(古い)コンパイラだとfor使うより遙かに速く動作する
そういう意味では書く人の習慣の影響が強いが
0059デフォルトの名無しさん
2008/05/15(木) 22:04:53多いクラスにPimplを導入しようかと思ってるのですが、Pimplに
すると問題のあるケースなんてのもあるんでしょうか?
0060デフォルトの名無しさん
2008/05/15(木) 22:11:37>memcpy(q,p,(n+1)*sizeof(*p));
29文字
0061デフォルトの名無しさん
2008/05/15(木) 22:27:5421文字
0062デフォルトの名無しさん
2008/05/15(木) 22:45:30pimplを経由することによる性能上のオーバーヘッド
0063デフォルトの名無しさん
2008/05/15(木) 23:02:23メモリ確保のオーバーヘッドと、メモリ確保に失敗する可能性の増加。
0064デフォルトの名無しさん
2008/05/15(木) 23:23:16なるほど。速度が重要な物や大量に生成される物には
避けた方が良さそうなんですね。
0065デフォルトの名無しさん
2008/05/15(木) 23:24:01仮にPimplによる問題が出ても、
大した手間無く対処出来るから気にする必要無いよ。
0066デフォルトの名無しさん
2008/05/15(木) 23:36:11相互参照の必要な場合が多いとソースが汚く見えるようになる。
0067デフォルトの名無しさん
2008/05/16(金) 02:57:03独習Cで勉強しているのですが、月での実効体重だす問題で関数を作ったのですが
float moon(void)
{
float weight;
printf("体重を入力してください:");
scanf("%f",&weight);
return weight*(17/100);
}
という関数を作った時に
「return weight*17/100」や「return weight*0.17」時は正しい値を返してくれるのですが、
自分が分かりやすいように式を()で囲うと正しい値を返してくれずに0.00000という値が返ってきます。
理由がわからないのですが、どなたか分かる方教えて下さい。
0068デフォルトの名無しさん
2008/05/16(金) 02:59:300069デフォルトの名無しさん
2008/05/16(金) 03:01:40(17.0/100)とかならOK
0070デフォルトの名無しさん
2008/05/16(金) 03:04:1317と100が整数だから、17 / 100の結果も整数(切り捨てで0)になってしまう。
weight * 17 / 100と書いたときには、(weight * 17) / 100と扱われ、
weight * 17がfloat型で結果を返し、それに整数100を掛けても
やっぱりfloat型になるのでうまくいくという具合。
逆にいえば、17などをfloat型にすればいいわけで、
return weight * (17.0f / 100.0f);とすればうまくいく。
0071デフォルトの名無しさん
2008/05/16(金) 03:09:58>>70
なるほど、型が大きいほうに合わせられるっていうのは数値だけの計算にも当てはまるんですね。
変数だけしかそういう風にならないと勘違いしていました。
非常に分かりやすい説明ありがとうございました。勉強になりました。
0072デフォルトの名無しさん
2008/05/16(金) 11:46:560073デフォルトの名無しさん
2008/05/16(金) 11:58:440074デフォルトの名無しさん
2008/05/16(金) 13:09:380075デフォルトの名無しさん
2008/05/16(金) 20:39:22>・templateクラスにして継承関係を逆にする
> ※ template<class T> class base : T {};
これ、よく分からないので具体例あげてくれるとありがたい。
0076デフォルトの名無しさん
2008/05/17(土) 03:21:50A() { f(); }
virtual void f() = 0;
};
struct B {
virtual void f(){}
};
を
template<class T>
struct X : T {
X() { f(); }
};
struct Y {
void f() {}
};
typedef X<Y> Z;
0077デフォルトの名無しさん
2008/05/17(土) 03:22:49> X() { f(); }
X() { T::f(); }
0078デフォルトの名無しさん
2008/05/17(土) 09:58:03先日基底クラスのデストラクタを仮想にし忘れ、メモリーリークというお約束のミスをやってしまいました。
この手のミスを無くしたいのですが、warningを出させる方法や、チェックツールなどはないでしょうか?
環境はVS6.0です。
仮想関数テーブルへのアクセスによるオーバーヘッドは現状気にしていないので、全てのクラス関数を仮想にしたいのですが、たまにつけわすれてしまうのです。
0079デフォルトの名無しさん
2008/05/17(土) 10:04:15C++を学ぼうと思ってるんですが良い参考書orWebページはありますか?
008075
2008/05/17(土) 10:09:49ありがとう。
ただこの方法だと元々の継承関係が失われないかい?
(76はミスタイプと思うが、元々はstruct A : B)
質問者は継承関係は維持したいと思うけど。
0082デフォルトの名無しさん
2008/05/17(土) 13:28:04「メモリリーク 検出」とかでググれば解説してるサイトがいっぱいでてくる
0083デフォルトの名無しさん
2008/05/17(土) 13:55:08デストラクタを仮想にした基底クラスを作って、クラスを作るときに必ずそれを派生して使うようにすれば忘れることはない。
0084デフォルトの名無しさん
2008/05/17(土) 13:57:15それを忘れないようにするためって話じゃないのか?w
0085デフォルトの名無しさん
2008/05/17(土) 13:58:33デストラクタの話ね。
0086デフォルトの名無しさん
2008/05/17(土) 14:43:18個別にvirtualを書かなくて済むようにした方が良い、って意味なのでは?
でもそしたら今度は、それ継承するのを忘れない方法は?
って話になりそうだけど。
0087デフォルトの名無しさん
2008/05/17(土) 14:46:510088デフォルトの名無しさん
2008/05/17(土) 14:57:06それを忘れないようにするためって話じゃないのか?w
0089デフォルトの名無しさん
2008/05/17(土) 15:02:42忘れにくさという点で、
>>78より>83
それより>>87
と良くなっているように見えるけど。
0090デフォルトの名無しさん
2008/05/17(土) 15:10:270091デフォルトの名無しさん
2008/05/17(土) 15:42:28の : public Objectを書かなかったらやっぱりバグるわけだしなー
それじゃ意味ないだろう
継承しなければコンパイルエラーになるようにできるなら、別だが。
0092デフォルトの名無しさん
2008/05/17(土) 16:13:220093デフォルトの名無しさん
2008/05/17(土) 16:19:14#define STD_STRUCT(NAME) struct NAME : public virtual Object
#define STD_CLASS(NAME) class NAME : public virtual Object
STD_CLASS(ClassA) {
public:
~ClassA(){std::cout << "~ClassA" << std::endl;}
};
STD_CLASS(ClassB), public ClassA {
public:
~ClassB(){std::cout << "~ClassB" << std::endl;}
};
void f()
{
ClassA* p = new ClassB();
delete p;
}
0094デフォルトの名無しさん
2008/05/17(土) 16:27:100095デフォルトの名無しさん
2008/05/17(土) 16:30:03>>89
5レス前すら読めない人はこのスレに必要ありませんよ
0096デフォルトの名無しさん
2008/05/17(土) 16:31:460097デフォルトの名無しさん
2008/05/17(土) 16:33:46俺は必要としたことないから知らんが、書式チェックツールくらいないのか?
0098デフォルトの名無しさん
2008/05/17(土) 16:36:19デストラクタは先頭に ~ が付いててわかりやすいから、
その前にvirtualが付いてるかどうかくらい簡単に判定できそう
そもそもデストラクタを書いてない場合は役に立たないが・・・
0099デフォルトの名無しさん
2008/05/17(土) 16:38:42>>78を読む限り、まずミスを無くしたい、という目的があって、
その方法として警告、チェックツール「など」、
と手段の例を挙げているので、
同じく、ミスを無くす/減らす方法を書いてるレスが
意図を無視してるようには見えないけど?
0100デフォルトの名無しさん
2008/05/17(土) 17:06:19総称型プログラミングを覚えた方がいいと思った。
0101デフォルトの名無しさん
2008/05/17(土) 17:08:30実行時ポリモーフィズムが必要な場合はどうするの。
0102デフォルトの名無しさん
2008/05/17(土) 17:10:550103デフォルトの名無しさん
2008/05/17(土) 17:31:36export のない C++ でジェネリックばっかやってると
コンパイルが重くて現実的じゃない事も。
0104デフォルトの名無しさん
2008/05/17(土) 21:16:08そしてそのツールでチェックするのをつい忘れるわけですね、わかります。
0105デフォルトの名無しさん
2008/05/17(土) 22:34:11make使うならMakefileに組み込めばおk。
総合環境なら・・・ カスタムビルドステップ?
0106デフォルトの名無しさん
2008/05/17(土) 22:42:35最悪、考え方としてはおかしくなったときにチェックすればいいわけだし。
0107デフォルトの名無しさん
2008/05/17(土) 23:08:54なんかの統合環境で、virtualな関数をオーバーライドする時にvirtualつけておかないとワーニング出すって設定できたよな?
これはvirtualですよー、わかってますかー?って意味合いで
0108デフォルトの名無しさん
2008/05/18(日) 00:36:52delphiならviryualで新しく作って、overrideでオーバーライドするから間違えたらエラーになるんだがなぁ
0109デフォルトの名無しさん
2008/05/18(日) 00:37:370110デフォルトの名無しさん
2008/05/18(日) 00:41:27あれはいい仕様だと思う。
0111デフォルトの名無しさん
2008/05/18(日) 01:18:54それは余計なお世話な気もするな。コーディング規約レベルだと思う。
0112デフォルトの名無しさん
2008/05/18(日) 01:25:16仮想関数じゃないつもりで関数追加して泣きを見るのを防止できる。
0113デフォルトの名無しさん
2008/05/18(日) 09:07:18overrideはいい仕様だ
0114デフォルトの名無しさん
2008/05/18(日) 11:38:49typo で泣くことになる。
0115デフォルトの名無しさん
2008/05/18(日) 11:52:390116デフォルトの名無しさん
2008/05/18(日) 12:19:28アノテーションが用意されました。
0117デフォルトの名無しさん
2008/05/18(日) 13:19:390118デフォルトの名無しさん
2008/05/18(日) 13:30:360119デフォルトの名無しさん
2008/05/18(日) 13:40:200120デフォルトの名無しさん
2008/05/18(日) 13:42:080121デフォルトの名無しさん
2008/05/18(日) 13:42:410122デフォルトの名無しさん
2008/05/19(月) 08:14:21Num = rand() % 100;
で、0から99までの範囲に含まれる値を取得できる
と書いてあるんですが、
どうやったらこうなるんですか?
0123デフォルトの名無しさん
2008/05/19(月) 08:22:05rand() → ランダムな整数を取得
% 100 → 100で割った余り
0124デフォルトの名無しさん
2008/05/19(月) 08:28:10とりあえずここらへん読んだ方がいいと思う
0125デフォルトの名無しさん
2008/05/19(月) 09:43:37■ ■ 違う板にコピペすると、四角の枠の中に
■ ■ メッセージとURLが現れる不思議な絵。
■ ■
■ (´?ω?`) ■ (その仕組みがリンク先に書いてある)
■ ■
■ ■ この原理を応用すると、まったく新しい
■ ■ コピペが作れる予感。
■■■■■■■■■■■■■■■■
0126デフォルトの名無しさん
2008/05/19(月) 10:10:45■■■■■■■■■■■■■■■■
■ ■ 違う板にコピペすると、四角の枠の中に
■ ■ メッセージとURLが現れる不思議な絵。
■ ■
■ (´・ω・`) ■ (その仕組みがリンク先に書いてある)
■ http://kat.cc/19b06f .■
■ ■ この原理を応用すると、まったく新しい
■ ■ コピペが作れる予感。
■■■■■■■■■■■■■■■■
0127デフォルトの名無しさん
2008/05/19(月) 19:25:55取得しなおさなくて使えますか?前にvectorで痛い目見たもんで・・・
0128デフォルトの名無しさん
2008/05/19(月) 19:34:53「erase 戻り値」でgoogle
0129デフォルトの名無しさん
2008/05/19(月) 19:44:30すまん勘違いした。
listでのinsertは全てのイテレータを無効にしない。
eraseは対象イテレータのみ無効になる。
つまり、大丈夫。
0130デフォルトの名無しさん
2008/05/19(月) 20:13:430131デフォルトの名無しさん
2008/05/19(月) 20:31:31↑のやり方でやっていたのですが、どうも拙いと気付きました
巧いファイル構成を身に付けたいのですが、中々しっくり来る資料が…orz
コレ読んどけよって書籍やソースなどあればご指導願いします
0132デフォルトの名無しさん
2008/05/19(月) 20:47:43A L L h p p
0133131
2008/05/19(月) 22:32:000134デフォルトの名無しさん
2008/05/19(月) 23:42:52以下のリソースファイルをプロジェクトに加えてコンパイルすると
Visual Studioが強制終了してしまいます。なぜでしょうか?
//--- menu.rc---
#include <windows.h>
#define MENU_NEW 2000
#define MENU_OPEN 2001
SAMPLE03 MENU DISCARDABLE
{
POPUP L"ファイル"
{
MENUITEM L"新規作成",MENU_NEW
MENUITEM L"読み込み",MENU_OPEN
}
}
0135デフォルトの名無しさん
2008/05/19(月) 23:56:00同じニーズに応えたライブラリはありませんか?
■ このスレッドは過去ログ倉庫に格納されています