07/05/06 15:29:45
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
【初心者歓迎】C/C++室 Ver.36【環境依存OK】
スレリンク(tech板)
【アップローダー】(質問が長い時はココ使うと便利)
URLリンク(kansai2channeler.hp.infoseek.co.jp)
2:1
07/05/06 15:30:35
埋めるなら次スレ建てろよなまったく
3:デフォルトの名無しさん
07/05/06 15:59:20
埋めるならじゃなくて、こういう板では埋めは荒らしってスタンスじゃないと(ry
4:デフォルトの名無しさん
07/05/06 17:25:42
埋めたの1000だけじゃん
5:デフォルトの名無しさん
07/05/06 22:22:07
初めまして、C++の内部クラスについて質問があります。
例えば、OUTというクラスの中にINNERというクラスがありまして、
そのINNERクラスのメンバ関数から、OUTクラスのメンバ変数にアクセスしたいのですが、
どうすればいいのか分かりません。クラスの宣言の仕方がポイントのような気がするのですが、
メンバ関数の実装は宣言の外で個別に行いたいと思います。
どうか、ご指導、助言等よろしくお願いします。
6:デフォルトの名無しさん
07/05/06 22:29:41
Javaとは違うのだよJavaとは
7:デフォルトの名無しさん
07/05/06 22:33:07
>>5
#include <iostream>
using namespace std;
class Outer {
friend class Inner;
class Inner {
Outer& outer;
public:
Inner(Outer* theOuter) : outer(*theOuter) { }
void hoge() { cout << outer.foo << endl; }
};
private:
int foo;
public:
Outer() : foo(3) { }
void hoge() { Inner inner(this); inner.hoge(); }
};
int main() {
Outer outer;
outer.hoge();
}
8:デフォルトの名無しさん
07/05/06 23:14:14
>>6
レスありがとうございます。
確かに検索してもJAVAの情報ばかりでした。
C++ではあまりしないのでしょうか。
>>7
プログラムまで書いて頂きありがとうございます!
まだ全ては理解できていないですが、
Outerクラスのインスタンスを作った時点では、
まだInnerクラスのインスタンスは出来てないんですね。
だから、thisポインタを渡して、インスタンスを作っていると、
そこまでは分かりました。
この方法で私のしたいことが出来そうです。
本当にありがとうございました。
9:デフォルトの名無しさん
07/05/06 23:25:16
いやだから
Javaでは親子関係がある(から外側のメンバにアクセスできる)けど
C++ではただのnamespaceみたいなもんだから。
内部クラス単独のインスタンスも作れる。
10:デフォルトの名無しさん
07/05/06 23:40:27
質問です
int hoge(char inputStr)
{
return inputStr == '\t' || inputStr == ' ';
}
入力された引数inputStr
を数値で返すというのは分かるんですが、
returnの行の動作は
if(inputStr == '\t'){
return 1;
}
else if(inputStr == ' '){
return 0;
}
と同じ意味ですか?
11:デフォルトの名無しさん
07/05/06 23:48:02
いや、キミの書き方にあわせるとこうなる
if(inputStr == '\t'){
return 1;
}
else if(inputStr == ' '){
return 1;
}
else {
return 0;
}
12:デフォルトの名無しさん
07/05/06 23:56:29
>>11
ありがとうございます
解決しました
13:デフォルトの名無しさん
07/05/07 14:58:22
>>10
int hoge(char inputStr)
{
if (inputStr == '\t') {
return 1;
}
if (inputStr == ' ') {
return 1;
}
return 0;
}
14:デフォルトの名無しさん
07/05/07 23:49:32
振り子の振動をオイラー法を使って解析して
理論上の振動と比較するプログラムをC言語でつくっているのですが、
URLリンク(kansai2channeler.hp.infoseek.co.jp)
このプログラムだと周期が異常に多く、何十秒にもなっていたりします。
位相が小さかったら、この場合だと大体6秒ちょっとだとおもうのですが・・・
どこをどう直せばいいのでしょうか?
15:デフォルトの名無しさん
07/05/08 09:34:21
まだ見てないけど、プロファイラとってみては
16:デフォルトの名無しさん
07/05/08 09:37:35
って実行時間じゃないのか
17:デフォルトの名無しさん
07/05/08 14:31:51
>>14
> /* 理論上の微分方程式の一般解 */
> double differentiation_function(double t){return ( theta_i*cos(sqrt(g/r)*t*RADIAN) );}
DEG → RAD 化係数の場所が違うんでない?
return (theta_i *RADIAN) * cos(sqrt(g/r)*t);
18:14
07/05/09 00:31:24
そもそも三角関数の使い方って、こんな感じでよかったものか・・・
19:デフォルトの名無しさん
07/05/09 09:31:16
size_t と uintptr_t って、違いが出る環境あるのか?
20:デフォルトの名無しさん
07/05/09 09:48:56
例えばDOSのlargeモデルは
ポインタ32bitでsize_tは16bit。
まあ当時uintptr_tなんて名前は無かったが。
21:デフォルトの名無しさん
07/05/09 09:53:20
>>19
違う環境は見たことないけど、
Intel 8086 あたりは違うかもしれない。
22:デフォルトの名無しさん
07/05/09 09:54:47
なるほど。
23:デフォルトの名無しさん
07/05/09 10:01:17
ファイルサイズってなぜかsize_tではないんだよな。
24:デフォルトの名無しさん
07/05/09 10:18:41
long > size_t の環境もまさに16ビット環境だな。
25:デフォルトの名無しさん
07/05/09 10:19:34
size_tを64bitの型にしなきゃいけないからね。
26:デフォルトの名無しさん
07/05/09 10:32:42
fgetpos/fsetpos の方か。
27:デフォルトの名無しさん
07/05/09 19:10:40
Linux or OS X + GCCです。
foo.cとfoo.hがあって、
foo.hの中でvoid foo()を宣言、
foo.cの中でvoid foo()を定義してるとします。
で、bar.hとbar.cxxがあって、
class barのメンバ関数の内部でfoo()を呼んでいます。
で、これを1つにまとめてライブラリlibfoobar.aにしたいんですが、
1) ccでfoo.cをコンパイル
2) g++でbar.cxxをコンパイル
3) arでlibfoobar.aに合体
という手順を踏みました。
ところが、libfoobar.aを利用したプログラムを書くと、
libfoobar.aとリンクさせたときに
undefined reference to foo()
などと怒られてしまいます。
CとC++を混在させてライブラリ作る時って、
何か違う手順を踏まないといけないんでしょうか?
28:デフォルトの名無しさん
07/05/09 19:12:03
extern "C" はしてるの?
あとは、cc って gcc ?
29:27
07/05/09 19:21:50
extern "C"が必要なのか。
foo.cのほうは他所から持ってきたパッケージだったので、
中をいじっておりませんでした。
extern "C"をしてきます。
さんくす。
30:デフォルトの名無しさん
07/05/09 19:22:09
foo.c の方じゃなくて、foo.h の方に必要。
31:デフォルトの名無しさん
07/05/09 19:24:42
コンパイラが違えば、
オブジェクトファイル内で識別子名に _ が付くか付かないか、
付くならどこに付くか、
とかいうややこしい問題があるんだけど、
それは大丈夫なのかね?
32:27
07/05/09 19:33:48
ccはGCCです。
foo.hはいじりたくないので、
extern "C" {
#include "foo.h"
}
とbar.hの頭に書いたんですが、
これで問題ないでしょうか。
コンパイルは通るようになったのですが、
普通はfoo.hの中でexternすると思うので、
後になにか弊害を起こすとかありますか?
33:デフォルトの名無しさん
07/05/09 19:39:13
>>32
なら、
// foo.hpp
#ifndef FOO_HPP_
#define FOO_HPP_
#ifdef __cplusplus
extern "C" {
#endif
#include "foo.h"
#ifdef __cplusplus
}
#endif
#endif // #ifndef FOO_HPP_
ってのを作って、C++ からは foo.hpp をインクルードするといいよ。
別に弊害はないかと。
34:デフォルトの名無しさん
07/05/09 19:53:46
URLリンク(s-io.net)
35:27
07/05/09 20:03:18
>>33
ありがとうございます。
CとC++の部分は解決したのですが、
その他所から持ってきたfoo.c/foo.hがですね、
hoge.fも使ってるんです。
hoge.fの中にSUBROUTINE hoge()があって、
今度はリンクするときにhogeがundefinedだと怒られました。
hoge.fはg77でコンパイルしています。
何か、.fも混在させる時の方法があるんでしょうか。
ググっても、1回ライブラリにしてから、というのが見つからない。
何度もすみません。
36:デフォルトの名無しさん
07/05/09 20:23:17
F77 もあるのかw
すげーチャンポンだな。
それはまさに >>31 の問題があるはず。
nm コマンドを使うとオブジェクトファイル内のシンボル名一覧が表示されるけど、
gcc の出すシンボル名と g77 の出すシンボル名に違いがあるんじゃないかと思う。
gcc はシンボル名の先頭にアンダースコアを付けるけど、
g77 はまた別の形になってるんじゃないかと。
それが両方で同じになるようにアンダースコアを付けて調整すればうまくいくと思う。
あとは、そのライブラリを使う際に、
F77, C, C++ の標準ライブラリが全てリンクされる状態にしないといけない点にも注意。
37:27
07/05/09 21:01:49
>>36
なるほど。
確かにnmすると、アンダースコアがついてました。
そこを直して動きました。
ありがとうございます。
38:デフォルトの名無しさん
07/05/09 23:30:46
STLのmapのeraseなんだけど
size_type erase(const key_type& x)
ってことは、xはキーを指定するんだよね?
39:デフォルトの名無しさん
07/05/09 23:39:49
class Base{
virtual void Complete();
protected:
int m_nStatus;
};
class A : public Base{
void Complete(){ /* A固有の処理(m_nStatusを更新) */ };
};
class B : public Base{
void Complete(){ /* B固有の処理(m_nStatusを更新) */ };
};
↑こんなクラス構成があって、↓に格納されています。
std::vector<Base*> BaseList;
仕様変更で、新規クラスが追加されました。
これが曲者でして、Updateを呼び出すと、自分自身をベクタから削除すると
いう変な仕様でして…。
class C : public Base{
void Complete(){ /* C固有の処理(自分を削除) */ };
};
これを実装するとしたら、どんな方法があるでしょうか?
ヒントでもいいので、教えていただけないでしょうか?
40:デフォルトの名無しさん
07/05/10 00:10:05
Updateってやつの記述がないけど、Completeでいいのかな。
問題は自分を管理しているvectorをどうやって知るか、
どのタイミングで知るべきかってことだよね。
CのインスタンスよりもBaseListの寿命が長いことが確実なら、
std::vector<Base *> *m_pBaseList;
をCに追加してコンストラクタで渡すのが手っ取り早いと思うけど。
41:デフォルトの名無しさん
07/05/10 00:11:58
>>38
それくらい、ヘルプや規格書読んだりググったりして自分で確認しようよ
42:デフォルトの名無しさん
07/05/10 01:00:19
環境:Linux gcc
X上CUIで、マッピングが施される前のキーコード(物理的キーコード)をキーが押下された際に取得したいです。
スキャンコードまで低レベルでなくてよく、xmodmap -pk や xev で調べられる KeyCode に相当するものが丁度いいのですが、
showkey のソースを参考にした方法では /dev/console を Xサーバが握ってしまっていて不可能、
xev のソースの方法ではXウィンドウを生成せねばならず、CUI上で実装する方法が見つかりません…。
ncurses の keybound なども試してみましたがこちらはマッピング後のキー情報しか得られませんでした。
最悪 xmodmap した結果をパースして利用するなりでなんとかなるとは思うのですが、
何か都合の良い方法があるのではないかと諦めきれず質問させて頂きました。
識者の方がいらっしゃいましたらご教授くださいませ。
43:39
07/05/10 01:43:10
>>40
レスありがとうございます。
参考にさせていただきます。
44:デフォルトの名無しさん
07/05/10 11:03:54
std::stringのリテラルを埋め込むにはどうすりゃいいのですか
45:デフォルトの名無しさん
07/05/10 11:13:12
リテラルの意味が分かってるんだろうか
46:デフォルトの名無しさん
07/05/10 11:22:21
>>42
その種の質問はUnixプログラミング質問スレかUnix/Linux板のほうが
回答を得られやすいと思われ
47:デフォルトの名無しさん
07/05/10 22:01:06
環境:タブ幅4, XP, bcc5.5.1, Cpad
猫でもわかるプログラミング / C言語編 第1部 /
第69章 URLリンク(www.kumei.ne.jp)
第70章 URLリンク(www.kumei.ne.jp)
第70章について、#include <stdlib.h>,<ctype.h>,<string.h>
が抜けているのはすぐに解かるのですが、
第69章から第70章になり、変数宣言などが書き換えられてから
実行結果で"A1"が入力できずに以下のように判定されてしまいます。
if (check_location(row, col) != 0) {
Locate(hOut, 0, MASU + 3);
printf("そこには置けません!");
goto INP;
}
また、後手を選択すると"A2"も入力できず同様に判定されます、このときコンピュータは"A2"に置けます。
48:デフォルトの名無しさん
07/05/10 22:01:48
入力した"A1","A2"に何が入っているか調べるため
printf("そこには置けません! %d,%d", row, col);
とすると、(0,0)、(0,1) となり問題は無いはずなのですが
何処を直したら良いのかわかりません。第70章、第71章をコピペしても同様な状態です。
ソースどす
URLリンク(kansai2channeler.hp.infoseek.co.jp)
以下のsけいしさんのサイトではチェックされていませんでした。
sけいし発のホームページたち / DevC++でC++入門
URLリンク(skeishi.web.fc2.com)
コメントまみれで汚いですが突っ込みお願いします。
49:デフォルトの名無しさん
07/05/11 00:09:56
惜しい、猫の話じゃなければ相談に乗るんだが。
50:デフォルトの名無しさん
07/05/11 00:10:27
>>42
つ[XLibスレ]
51:デフォルトの名無しさん
07/05/11 14:58:41
>>48
printf("そこには置けません! %d,%d, %d", row, col, ban[row][col] );
こうすると、A1の時にはban[0][0]になんか値が入ってるぞ。
値が入ってたら、check_locationが!0を返すのは仕方ない事だな。
で、main()の宣言直後に初期化してみたが、
// init
for ( row=0; row<MASU; ++row )
for ( col=0; col<MASU; ++col )
ban[row][col] = 0;
それでも現象が変わらんね。
調べるのが面倒になったから、check_locationを改変してお茶を濁す。
int check_location(int row, int col) {
if (ban[row][col]!=1 && ban[row][col]!=2)
return 0;
else
return -1;
}
これでA1に置けるようになったぞ。
でもなんか石を取るロジックとかバグ多くないか?w
52:デフォルトの名無しさん
07/05/11 20:30:51
class A
{
public:
virtual A& a()
{
return *this;
}
};
class B : public A {};
int main()
{
B b = A().a();
}
とするとAをBに変換できないって怒られるけど、いちいちBでもa()をオーバーライドしないとダメ?
理屈は分かるんだけど、継承してるんだから勝手に変換してくれりゃいいのに・・・
↑みたいなことやるのに何か良い方法ないですか?
53:デフォルトの名無しさん
07/05/11 20:42:31
>>52
> B b = A().a();
では B(const A&) というコンストラクタが呼ばれる事になる。
だから、それを作る必要がある。
54:デフォルトの名無しさん
07/05/11 20:55:35
>>53
サンクス。派生するたびにいちいち面倒な・・・
Bから呼ばれたa()のthisはBのポインタなんだからBに代入できても良いと思うんだけどなぁ。
なんで勝手に virtual B& a() を定義してくれないんだろう。
55:デフォルトの名無しさん
07/05/11 20:58:34
情報が足りないんだから当たり前じゃ。
56:デフォルトの名無しさん
07/05/11 21:03:58
>>54
Bから呼ばれたってどういうこと? >>52 では A() に対して a() を呼び出してるんだろ。
B& なんて返せるわけ無い。
57:デフォルトの名無しさん
07/05/11 21:10:59
virtual B& a() が勝手に定義されるなど、なんて恐ろしい((((;゚Д゚)))ガクガクブルブル
58:デフォルトの名無しさん
07/05/11 22:00:41
sizeof(A) != sizeof(B)
だったらどうなると思う?
59:42
07/05/11 23:25:57
アドバイス・誘導をして頂いた方、ありがとうございます。
微妙なスレ違いで申し訳ありませんでした。
60:デフォルトの名無しさん
07/05/12 00:10:17
printf("%s/n","Hello World");
上のprintf文の%sでどのように"Hello World"を処理しているのか分かりません。
どなたかご教授して下さい。
61:デフォルトの名無しさん
07/05/12 00:23:25
XのCUIってどういうこと?xterm上で起動してたりしたら、
それを検出してX->xtermの入力を掻っ払うってはなし?
ktermとかmltermとかだったり、間にscreenがはさまってたり、
したらどうするわけ?
62:デフォルトの名無しさん
07/05/12 00:29:52
爪楊枝でとる
63:デフォルトの名無しさん
07/05/12 00:34:05
すいません,c++勉強始めたばかりの超初心者です.
とあるc++のソースをc#に書き換えるという作業をしているのですが,下記記述の意味がわかりませんでした.
MyClass* mc;
mc = (Myclass*) aList -> at(n);
aListは List* aListで宣言してあります.
なぜリスト型のポインタの前で,再度クラスのポインタを()の中に記述するのでしょうか?
どうぞよろしくお願いいたします.
64:デフォルトの名無しさん
07/05/12 00:36:25
優先順位。
mc = (Myclass*) ( aList -> at(n) );
65:デフォルトの名無しさん
07/05/12 00:47:46
>>63
それはキャスト演算。
aListは、T型のオブジェクトを要素としてやりとりするようになっているのだと思う。
(Tが何なのか俺にはわからないので、これは仮称)
そしてaList->atの戻り値の型はT*。
MyClassはTから派生しており、MyClassへのポインタへダウンキャストしているのだろう。
C#はわかるというなら、aListの型がSystem.Collections.ArrayList、
T*はobject、atをインデクサだと思えば事情は大体同じ。
66:63
07/05/12 01:02:07
>>64
>>65
ありがとうございました.
キャストだったんですね...ポインタにキャストできるって初めて知りました.
また考えてみます.
67:デフォルトの名無しさん
07/05/12 01:18:27
>>60
const char* str = "Hello World";
printf("%s/n", str);
こう書けばわかるか?
68:デフォルトの名無しさん
07/05/12 01:53:38
>>67
strのポインタが指す'H'のアドレスから'\0'までの文字を%sが文字列として表示してくれる
ということですか?
69:デフォルトの名無しさん
07/05/12 01:57:00
>>51
ban[row][col]、気がつきませんでした、値が入ってしまってますね。
初期化と改変の流れまで教えていただきありがとうございました。
ロジックは猫に習ってということで、
あとあとリバーシのアルゴリズムを勉強するときにちゃんとしたものをゴリゴリします。
70:デフォルトの名無しさん
07/05/12 10:32:53
>>68
「printf 書式指定」でググるか、開発環境に付いてるマニュアル読め
71:デフォルトの名無しさん
07/05/12 14:52:41
sprintf使ってみ
72:デフォルトの名無しさん
07/05/12 20:23:20
std::stringを継承して、メンバ関数を増やしたクラスを作りたいんですが、
(具体的には、中身UTF-8nに特化した文字列クラスを作りたい)
class my_string : public std::string
{
public:
my_string() : std::string() {}
my_string(const char* src) : std::string(src) {}
my_string(const my_string& src) : std::string(src) {}
…
}
こんな感じでコンストラクタをずらずら書いていって、
あとは自分の好きなだけメンバ関数増やしていくだけで大丈夫ですか?
73:デフォルトの名無しさん
07/05/12 20:43:44
>>72
std::string はデストラクタがバーチャルじゃ無いので、
オブジェクトの削除時には注意が必要。
具体的には、
std::string *str = new my_string("('A')");
...
delete str;
とやるとstd::stringのデストラクタが呼ばれてしまう。
ほとんどの場合は大丈夫だと思うのだけど、
ふとした拍子にはまることになるかもしれない。
74:デフォルトの名無しさん
07/05/13 09:14:28
wstringでも使っとけ
75:デフォルトの名無しさん
07/05/13 14:59:30
関数の前にコロンを二つ付けるのは
何の意味があるんでしょうか?
76:デフォルトの名無しさん
07/05/13 15:21:14
aが1かそれ以外になるタイミングはプログラマが完全に把握でき、
処理nanntokaが頻繁に起こる場合において、
//hinnpann
if(a==1){
//nanntoka
}
とするか
//junnbi
void voidfunc(){}//何もしない関数
void nanntokafunc(){ /* nanntoka */ }
void(*pfunc)();//a==1ならnanntokafuncが、それ以外ならvoidfunc
//hinnpann
pfunc();
とするかでは、後者の方が条件判断をしない分早いんですか?
それとも無駄に何もしない関数にジャンプする分だけ遅いんですか?
あと歯を磨くのが面倒くさいので、
手軽に口内の歯垢を生成する菌そのものを除去するオススメの方法って知りませんか?
77:デフォルトの名無しさん
07/05/13 15:26:54
>>76
速度は実測が基本。
菌の除去には強酸を使うのはどうだろう?
塩酸とか硫酸とかでよーくうがいすれば、きっと菌なんて生きてられないはず。
78:デフォルトの名無しさん
07/05/13 15:27:45
>>75 スコープ解決演算子
79:デフォルトの名無しさん
07/05/13 15:32:41
やっぱりCPUによって違いますよね・・・。
「頻繁」とか、曖昧な表現をしてすみませんでした。
塩酸や硫酸は、練り歯磨き粉に入ってる分だけでも痛いのに
リステインなどは泣きそうになるほど厳しいです。
ミュータンス菌も生きるために必死だから、そうそううまい話なんてありませんよね。
80:デフォルトの名無しさん
07/05/13 18:11:27
水酸化ナトリウムや水酸化カリウムなんかの強塩基でも菌を破壊できます。
81:デフォルトの名無しさん
07/05/13 19:35:17
>>75
グローバルスコープだね。
ローカルと明示的に分ける場合に必要
82:デフォルトの名無しさん
07/05/13 20:29:41
// Foo.h
class Foo {
private:
int a;
public:
static int GetA() const
};
// Foo.cxx
#include "Foo.h"
int Foo::GetA const
{
return a;
}
っていうのは、なんか間違ってますか?
GCCで
./include/Foo.h:6: error: static member function 'static int GetA()' cannot have cv-qualifier
src/Foo.cxx:2: error: static member function 'intt Foo::GetA() const' declared with type qualifiers
と怒られます。
staticメンバ関数ってconstに出来ないんでしょうか。
83:82
07/05/13 20:31:18
簡略化して書くときに書き間違えました。
実際には、int aはstaticになっていて、
Foo.cxxの中で定義されてます。
84:デフォルトの名無しさん
07/05/13 20:34:34
staticはthisがないという指定なのに、
thisをconstにする指定を併用しても仕方ない
85:デフォルトの名無しさん
07/05/13 20:34:35
>src/Foo.cxx:2: error: static member function 'intt Foo::GetA() const' declared with type qualifiers
intt?
セミコロンもないし、単純ミスじゃね?
86:82
07/05/13 20:40:11
>>84
あー、なるほど。そういうことですか。
>>85
実際のコードはもっと長いので、
抜き出して書いてます。
inttとか、GetAに()がついてないのとかは、
簡略化したときの打ち間違い。
ってーことは、例えばGetAの中でa++とかやったりとかして、
const関数にしておけばコンパイラが注意してくれるのに、
っていうのは期待できないということですか。
87:デフォルトの名無しさん
07/05/13 20:44:51
簡略化するときに何カ所も間違えるようなうっかりさんは、
実際のコードでもミスしてそうだな
88:デフォルトの名無しさん
07/05/13 20:48:20
エラーメッセージはコピペだろうから、
intt ってのはリアルで間違ってんじゃね?って思って指摘したんだけどな
89:82
07/05/13 21:00:52
本当に申し訳ございませんでした。
皆さん、ありがとうございます。
90:デフォルトの名無しさん
07/05/13 21:56:10
すみません。ポインタの素朴な疑問です。
いれこの構造体enemyを固定領域に確保したいときは
struct enemy {
short mainface;
short b;
struct POS Pos[32];
};
struct POS {
short X;
short Y;
};
struct enemy *enemy_struct;
enemy_struct = (enemy*)malloc(sizeof(struct enemy));
でいいんですか?
あとsizeof(struct enemy*)=4ってなるんですけど
struct enemy *enemy_struct;で消費されるenemy型へのポインタの
メモリ領域は4Byteってことですか?
よろしくお願いします。
91:デフォルトの名無しさん
07/05/13 22:04:45
>struct enemy *enemy_struct;
>enemy_struct = (enemy*)malloc(sizeof(struct enemy));
>でいいんですか?
だめです。型違いです。
>あとsizeof(struct enemy*)=4ってなるんですけど
struct enemy *enemy_struct;で消費される4byteでおけ
92:デフォルトの名無しさん
07/05/13 22:11:23
んんん?問題なくね?
93:デフォルトの名無しさん
07/05/13 22:17:37
... = (enemy*)malloc( ...
94:90
07/05/13 23:18:34
すんません。型違いということは
..=(struct enemy *)malloc(..
と訂正すればいいんですか?
95:デフォルトの名無しさん
07/05/14 01:01:39
>>94
そうだね。それでおk。
実際コンパイルしてみて確認すればいいと思うよ。
入れ子であっても特に使い方に変わりはないよ。
自己参照構造体と呼ばれる特殊な入れ子は慣れるまで厄介(慣れれば便利)
なんだけど、今回はそれじゃないし。
にしても、short変数とか微妙なの使うなあ。
ところでstructが省略できないって事はCを使用しているんだね。
C++では省略が許されたはず。「//」によるコメントみたいに
C++で先に作られてから後になって、ANSIがCの文法として認めたものも
あるから将来は>>90のような書き方も許されるかも。
まあtypedefすれば良いだけなんだけどね。
96:デフォルトの名無しさん
07/05/14 01:08:45
printf("1¥n");
printf("2¥n");
printf("3¥n");
としたあとに1、2、3を4、5、6と上書きしたいんですが、
CRで先頭に戻るのは分かるのですが(最終行は上書き可能)、
1行前に戻るってのはできるんでしょうか?
97:デフォルトの名無しさん
07/05/14 01:18:53
それは処理系依存な方法を使わないとダメ
エスケープシーケンスとか、ConsoleAPIとか
98:96
07/05/14 01:26:38
>>97
すいません。環境書き忘れてました。(VT100相当)
エスケープシーケンスでググって、
printf("¥x1b[3A");
で解決しました。
ありがとうございます。
99:デフォルトの名無しさん
07/05/14 01:52:37
>>90のやり方でもコンパイルは通るんだな。
100:デフォルトの名無しさん
07/05/14 12:50:17
asdf<int (int)> a;
みたいな事がしたいんですが、asdfの定義はどういう風にすれば良いかはなんてググれば詳しく出てくるんでしょうか
101:デフォルトの名無しさん
07/05/14 12:53:32
boost::function
102:デフォルトの名無しさん
07/05/14 12:54:17
なるほど
103:デフォルトの名無しさん
07/05/14 13:00:06
asdf<int (*)(int)> a;
のことか?
104:デフォルトの名無しさん
07/05/14 13:03:15
なんだと
105:デフォルトの名無しさん
07/05/14 14:32:49
C言語のあるプログラムで、
Cファイルではなく、hヘッダに
関数を実装している人がいるんですけど
普通なんですか?
やっぱりヘッダに実装する方がベターなんでしょうか?
106:デフォルトの名無しさん
07/05/14 14:42:46
はっきり言ってどっちでも良い。
技術的でない話題はマ板へ
107:デフォルトの名無しさん
07/05/14 15:00:45
どっちでも良くないよw
ヘッダに実装できるのは内部リンケージの関数だけだけど、
そんなことやっちゃったら同じ関数が複数のソースに定義されて
無駄にも程がある状況になる。
ヘッダに実装する必要があるのはインライン関数だけ。
他は普通はヘッダに実装してはいけない。
108:デフォルトの名無しさん
07/05/14 15:11:06
インクルードガードやってたから気づかなかった
109:デフォルトの名無しさん
07/05/14 15:16:39
インクルードガードとは関係ない話。
a.h を a.c と b.c でインクルードすれば
a.c と b.c の両方に関数定義が展開される。
110:デフォルトの名無しさん
07/05/14 15:17:55
インクルードガードしてりゃそんなけったいなことにはならんだろ。
111:デフォルトの名無しさん
07/05/14 15:18:54
と、思ったがなるな。スマン
112:105
07/05/14 15:23:06
そうですね。勉強になりました。
ありがとうございました。
113:デフォルトの名無しさん
07/05/14 15:48:21
C++ だとテンプレートの実装もヘッダに書く必要がある。
export なんてあってないような仕様だし。
クラスの宣言内に直接関数定義することもあるけど、
これはインライン関数になるから >>107 の範囲内。
114:デフォルトの名無しさん
07/05/14 16:55:40
>>a.h を a.c と b.c でインクルードすれば
>>a.c と b.c の両方に関数定義が展開される。
それはへたくそなインクルードガード。
関数の重複インクにならんやり方はちょっと考えれみれ。直ぐわかるやろ。
a.h
#ifndef …
a.c
#incliude "a.h"
…
b.c
#incliude "a.h"
…
ただし、それがエエ方法やとは言うてへんど。
115:デフォルトの名無しさん
07/05/14 17:06:20
>>114
重複インクルードが問題なのではなく、同じ関数が複数リンクされることが問題。
理解できていないなら、無理にレスしなくていいからね。
116:デフォルトの名無しさん
07/05/14 17:38:43
>>重複インクルードが問題なのではなく、同じ関数が複数リンクされることが問題。
>>理解できていないなら、無理にレスしなくていいからね。
だから、「同じ関数が複数リンク]されない方法があるって言うとんじゃ、阿呆かいな。
それとも、ホンマの初心者か?
117:デフォルトの名無しさん
07/05/14 17:46:42
そういう方法があるんかしらんが、>>114では何の解決にもなってない。
118:デフォルトの名無しさん
07/05/14 17:48:08
>>116
>「同じ関数が複数リンク]されない方法がある
だったらそれを書き給え。
尤も、それならそれで>114の「関数の重複インクにならんやり方」は
一体全体なんなのかという疑問は残るが。
119:≠114
07/05/14 17:51:13
>>118
これでOK。
--a.h
#ifdef NEED_FUNC
void func() {}
--a.c
#define NEED_FUNC
#include "a.h"
--b.c
#include "b.h"
--
ただし、これをインクルードガードとは言わないと思う。
120:デフォルトの名無しさん
07/05/14 17:53:03
それだとa.cでfuncが使いたいときに困るだろ。
121:デフォルトの名無しさん
07/05/14 17:54:27
114のインクファイル中の記述で、ちょっと工夫したら(ヒントは関数の定義じゃ)できると言うとんじゃ。
これだけ言うたら、普通のC言語1年坊主でも気が付くど。気が付かんようなら、C諦めた方がええで。
それより、こんなレベルで初心者を教えるな! 初心者も迷惑じゃ。
>>だったらそれを書き給え。
誰に向かって言うとんじゃ、ボケ。
122:デフォルトの名無しさん
07/05/14 17:55:50
すみません、喧嘩しないで頂けますか?
123:デフォルトの名無しさん
07/05/14 17:56:24
>>121
分からなくても別に誤魔化さなくていいよ。
俺だって分かんないんだもん。
124:デフォルトの名無しさん
07/05/14 17:58:28
まだわからんか?
そもそも”関数名”て何や?
125:デフォルトの名無しさん
07/05/14 17:58:51
まさかstaticを付けるというオチでは・・・
126:デフォルトの名無しさん
07/05/14 17:59:44
void foo ( ナンたらこたら…
↑で "foo" は何をしとるんや?
127:デフォルトの名無しさん
07/05/14 18:00:37
#define foo
↑で foo は何をされとんねん?
128:デフォルトの名無しさん
07/05/14 18:00:44
>>121
もちろんその方法では、
* a.h に関数の実装を記述する。
* a.c, b.c でインクルードすればどちらからでも使える。
* 関数は重複してリンクされない。
が満たされるんだよな。
129:デフォルトの名無しさん
07/05/14 18:01:33
>>127
焦らさないでくれよ
130:デフォルトの名無しさん
07/05/14 18:01:36
当たり前だのクラッカ
131:デフォルトの名無しさん
07/05/14 18:02:38
もったいぶっちゃって、どうせそんな方法ないんだろ・・・
132:デフォルトの名無しさん
07/05/14 18:05:42
void foo ( なんたらこたら
…
void bar (ああでもこうでも
…
#ifndef foo
printf ( "宣言済み" )
#else
printf ( "未宣言" )
#endif
…
これでもわからんか?
133:デフォルトの名無しさん
07/05/14 18:07:29
void foo ( なんたらこたら
#undef foo
int foo ( ああでもないこでもない
これではどや?
134:≠114
07/05/14 18:08:42
staticつけても同じ(内容の)関数が複数リンクされることには違いないしなぁ。
双方のソースから同じ名前で参照される別物の関数と言う条件だと、
どうにもならない気がしてきた。
>>132
まさかとは思うけど、関数を定義したかどうかをディレクティブで
判定できるなんて思っちゃいないよね?
そろそろ正解をどんと出してみてよ。
135:デフォルトの名無しさん
07/05/14 18:08:47
訂正
誤:int foo ( ああでもないこでもない
正:int foo ( ああでもないこうでもない
136:デフォルトの名無しさん
07/05/14 18:09:19
>>133
俺頭悪いからわかんないんだって・・・
意地悪しないで教えてくれよ
137:デフォルトの名無しさん
07/05/14 18:12:58
わかった。リンカディレクティブだッ(w
138:デフォルトの名無しさん
07/05/14 18:15:32
静的メンバ関数として実装するとか?
struct HOGE_unique{
static int hoge() { ... }
};
#define hoge Hoge_unique::hoge
139:デフォルトの名無しさん
07/05/14 18:17:24
もはやCじゃないがな
140:デフォルトの名無しさん
07/05/14 18:19:45
// aaa.h
#ifndef test
int test(int i){return i + 10;}
#endif
// bbb.c
#include "aaa.h"
int test ( int i );
int foo(int i){return test(i)+10;}
// main.c
#include <stdio.h>
#include "aaa.h"
void foo(int i);
int main(void){printf("%d",test(i)+foo(i);}
141:デフォルトの名無しさん
07/05/14 18:23:16
只今>>133は>134を読んで真っ青になっている最中です。
次の御託を思い付くまでもう暫くお待ちください。
142:デフォルトの名無しさん
07/05/14 18:23:51
↑アホ
143:デフォルトの名無しさん
07/05/14 18:30:33
>>137
URLリンク(sund1.sakura.ne.jp)
144:デフォルトの名無しさん
07/05/14 18:32:28
>>140
こんなふうにプリプロセスされました。
// main.c
#include <stdio.h>
int test(int i){return i + 10;}
int foo(int i);
int main(void){printf("%d",test(1)+foo(1));}
// bbb.c
int test(int i){return i + 10;}
int test ( int i );
int foo(int i){return test(i)+10;}
145:デフォルトの名無しさん
07/05/14 18:34:23
>>140
testなんかどこで#defineしてるの?
146:デフォルトの名無しさん
07/05/14 18:35:01
test は何回定義されとるん?アセブルリスト見てみ?
147:デフォルトの名無しさん
07/05/14 18:36:30
>>145
宣言されとらんから次のtest()がインクルードされるねんやんかいな。
148:デフォルトの名無しさん
07/05/14 18:39:30
トリッキやよって別々ライブではとおらんけどな。
わしが言いたいのんは「決めつけんな」ちゅうこと。
149:デフォルトの名無しさん
07/05/14 18:40:53
$ gcc -c main.c bbb.c
$ nm main.o
00000000 b .bss
00000000 d .data
00000000 r .rdata
00000000 t .text
U ___main
U __alloca
U _foo
0000000b T _main
U _printf
00000000 T _test
$nm bbb.o
00000000 b .bss
00000000 d .data
00000000 t .text
0000000b T _foo
00000000 T _test
どう見ても両方にtestが含まれてるんだが
150:デフォルトの名無しさん
07/05/14 18:41:22
つまり、関西弁のような発言に見えるからと言って、関西人だと決めつけるな、ということですね?
151:デフォルトの名無しさん
07/05/14 18:42:26
↑そうそう。
それと、gcc はバカやよって別別オブジェ作るねん。
152:デフォルトの名無しさん
07/05/14 18:43:00
なんだ、もう少し笑わせてくれるのかと思ったら意外に伸びなかったな。がっかりだぜ。
153:デフォルトの名無しさん
07/05/14 18:43:09
ようするにはったりだったわけだろ
154:デフォルトの名無しさん
07/05/14 18:44:08
違うやろ、call _test のアドレス見れ
155:デフォルトの名無しさん
07/05/14 18:49:46
char line[] = "abcde¥012345¥0ABCDE";
みたいなことやりたいんですが、
'¥0'があるために、
lineの中身は"abcde¥0"となってしまいます。
当たり前と言えば当たり前なんですが、
回避方法はあるでしょうか。
'¥0'を含む長いchar配列を、
classのstatic constメンバ変数として持たせたいんです。
156:デフォルトの名無しさん
07/05/14 18:50:49
>>155
> lineの中身は"abcde¥0"となってしまいます。
どうやって確認したんだよ。
ちゃんと最後まで入っているはずだ。
157:デフォルトの名無しさん
07/05/14 18:51:27
初心者アドバイザは、今、それどころやありません。
158:154
07/05/14 18:52:42
「長いchar配列」というのは、数万文字あります。
なので、配列長を確保してから1つずつ代入というのは厳しい。
そんなもん別のテキストファイルにして必要なときに読めよ、
という以外のでお願いします。
159:155
07/05/14 19:02:58
#include <iostream>
using namespace std;
int main()
{
char line[] = "abcde¥012345¥0ABCDE";
for(int i=0; i<18; i++){
cout << "(" << line[i] << "," << (int)line[i] << ")";
} // i
return 0;
}
$ ./a.out
(a,97)(b,98)(c,99)(d,100)(e,101)(
,10)(3,51)(4,52)(5,53)(,0)(A,65)(B,66)(C,67)(D,68)(E,69)(,0)(,0)(,0)
となります。
160:デフォルトの名無しさん
07/05/14 19:05:13
>>159
コンソールで確認するなよ・・・
161:155
07/05/14 19:07:45
> lineの中身は"abcde¥0"となってしまいます。
は不正確でした。すみません。
"12345"の"12"が改行コードLF=10になっています。
162:デフォルトの名無しさん
07/05/14 19:08:43
>>159
char line[] = "abcde\0" "12345\0" "ABCDE";
こうしとけ。
163:155
07/05/14 19:10:14
>>160
あれ?なんかまずかったですか?
見やすいかと思って。
i=15, 16, 17のときに(,0)となってるので、
ここに何も入ってないんですよね。
なんで"¥012"が"¥0¥n"に化けてしまうのか。
164:デフォルトの名無しさん
07/05/14 19:12:28
"\012" が {'\0', '1', '2'} ではなく {'\012'} とみなされてるんだから、
配列の全長が2文字分みじかくなってる。
つまり最後の二つの0は不正なアクセス。
165:155
07/05/14 19:12:35
>>162
その方法で、
(a,97)(b,98)(c,99)(d,100)(e,101)(,0)(1,49)(2,50)(3,51)(4,52)(5,53)(,0)(A,65)(B,66)(C,67)(D,68)(E,69)(,0)
になりました。
ありがとうございます。
166:155
07/05/14 19:13:53
>>164
ああ、octで解釈されてるわけですか。
なるほど。
167:デフォルトの名無しさん
07/05/14 19:24:34
>>159
みたいに
for(int i=0; i<10; i++){
} // i
とか
if(hoge){
} // if
っていう書き方を推奨してる本って、
なんかありませんでしたっけ?
この書き方をどっかで読んだ記憶があるんです。
168:54
07/05/14 21:52:47
>>55-58
class A
{
int a;
public:
A(int i) : a(i) {}
A& geta() { return *this; }
virtual void prt() const { printf("a:%d\n", a); }
};
class B : public A
{
int b;
public:
B(int i) : A(0), b(i) {}
virtual void prt() const { printf("b:%d\n", b); }
};
int main()
{
B b(100);
b.geta().prt();
}
これを動かすと「b:100」と表示されて、geta()はA&を戻す筈なのに実際は
B&を戻している訳ですよ。B&を返すメソッドを勝手に定義してくれたほうが
よっぽど自然だと思うんですが、私が愚かしいこと言ってるんですかね?
169:デフォルトの名無しさん
07/05/14 22:21:23
うん、けっこう愚かしいと思うよ…。
170:デフォルトの名無しさん
07/05/14 22:25:34
>>168が理解できない
どこでB&を戻してるの?
171:デフォルトの名無しさん
07/05/14 22:28:25
>>168
class C : public B
{
public:
A& geta()
{
static A a(0);
return a;
}
//コンストラクタほか省略
};
このとき、こうされたらどうする?
C c;
B& b = c;
b.geta().ptr();
B型の式に対してgeta()を呼ぶとB&が返ってくることにしたら、
このb.geta()ではA型のインスタンスへの参照を返しているので型システムを侵すことになる。
だから暗黙的にやらないで、B内ではB&を返すgetaを明示的にオーバーライドしてやったほうがいい。
次のコードはC::getaでコンパイルエラーになる
struct A {virtual A& geta();};
struct B : A {virtual B& geta();};
struct C : B {virtual A& geta();};
172:171
07/05/14 22:30:14
すまん
168のgetaも仮想関数だと思い込んでいたorz
173:デフォルトの名無しさん
07/05/14 22:41:55
とあるソースを読んでいる初心者です.
クラスClass1のヘッダファイル先頭に,下記のように他のクラスClass2,Class3の記述がありました.
#ifndef *******
#include ************
class Class2; class Class3; ←これ
class Class1
public 以下略
これはいったいどういう意味を持つのでしょうか?
174:デフォルトの名無しさん
07/05/14 22:57:07
Class2, Class3は別のところでちゃんと定義されてますよ
ってコンパイラに教えるためのおまじない
175:54
07/05/14 22:58:24
>>171
なるほど。そのとおりでした。
サンクス。
176:デフォルトの名無しさん
07/05/14 23:01:02
>>173
試しにその行を削除するなりコメントアウトするなりしてコンパイルしてみろ
たぶんエラー吐くから
177:デフォルトの名無しさん
07/05/15 02:58:46
>>168
そのルールでいくと、自分の型のポインタか参照を返すようなメソッドは
すべて下位クラスで再定義する必要がある。
('return *this' だけのメソッドは特別なんていうルールを採用する?)
ちなみに、以下のようなプログラムではどんな結果になるべき?
void prt3(A* obj) { printf("prt3(A)\n"); }
void prt3(B* obj) { printf("prt3(B)\n"); }
class A {
public:
A() {}
virtual void prt() const { printf("A::prt\n"); }
void prt2() const { printf("A::prt2\n"); }
// thisの型はA?,B? return時だけB?
A& geta() { prt(); prt2(); prt3(*this); return *this; }
};
class B : public A {
public:
B() {}
virtual void prt() const { printf("B::prt\n"); }
void prt2() const { printf("B::prt2\n"); }
};
int main() {B b; b.geta(); }
結果
B::prt
?::prt2
prt3(?)
178:デフォルトの名無しさん
07/05/15 03:35:58
*thisをthisにしてVC2003でコンパイル
結果:
B::prt
A::prt2
prt3(A)
179:デフォルトの名無しさん
07/05/15 18:49:47
VS2005,XPです。
HWND hwnd;
RECT rc;
GetWindowRect(hwnd,&rc);
if ((rc.bottom-rc.top) == GetSystemMetrics(SM_CYCAPTION))
うまくいかないのですが、こういう比較の仕方は使えないのでしょうか?
使えない場合、どのように直せばいいですか?
180:デフォルトの名無しさん
07/05/15 19:33:30
クラスなどを使って、通常存在しないサイズの変数にアクセスできませんか?
int型の変数を24と8ビットに分けて使うような
x.aは24bit
x.bは8bit
として使いたいんですが
181:デフォルトの名無しさん
07/05/15 19:33:42
>>17
D&Eには、できるようにしたところでメリットがない(オーバーライドできる仮想関数がない)し、
Cの型変換のルールが混沌としていて内蔵型をクラスとして扱おうとしてもうまくいかないと、
そうできるようにしなかった理由が書かれている。
182:180
07/05/15 19:34:31
代入、参照が普通の変数のように出来る方法を教えてください
183:デフォルトの名無しさん
07/05/15 19:35:55
>>180
どうしてもやりたいなら、ビットフィールドがその目的に使える。
但し、移植性を大きく損なうことになりかねないので注意。
184:デフォルトの名無しさん
07/05/15 19:40:06
>>183
サンクス!!!
185:デフォルトの名無しさん
07/05/15 19:59:46
>>183
すみません boolとcharだとどっちを使った方がいいとかありますか???
struct A{
char n : 1; char m : 7;
};
struct A{
bool n : 1; bool m : 7;
};
186:デフォルトの名無しさん
07/05/15 20:02:53
>>179
何をしたいのか分からんが、使える。
187:185
07/05/15 20:07:05
自己解決しました
移植性を考慮して、unsigned char n : 1; にしておきますね
188:デフォルトの名無しさん
07/05/15 20:10:51
移植性が欲しいならunsigned intにしておけ
189:デフォルトの名無しさん
07/05/15 20:12:37
>>188
サイズは出来るだけ削りたいんです
上の例では32bit使っていますけど
8bit以内ならcharのほうが削れます
190:デフォルトの名無しさん
07/05/15 20:13:25
ビットフィールドに使えるのはsignedかunsignedのintだけ。
191:デフォルトの名無しさん
07/05/15 20:15:54
ビットフィールドの移植性って実のところどうなの?
一応、標準だよね?
192:デフォルトの名無しさん
07/05/15 20:16:15
bcc(c++)だと使えますけど
193:デフォルトの名無しさん
07/05/15 20:21:35
>>192
処理系依存で他の型が使えても構わないことにはなっている。
194:デフォルトの名無しさん
07/05/15 20:22:42
C++ならほとんどの整数型が使えるだろ。
195:デフォルトの名無しさん
07/05/15 20:31:15
>>189
unsigned charがビットフィールドに使える処理系で、
同じ8ビットのビットフィールドでもunsigned intにするかunsigned charにするかで
違いが生じるなんて話聞いたことがない。
196:デフォルトの名無しさん
07/05/15 20:42:39
>>195
#include <iostream>
template<typename T> struct S { T a: 1; T b: 7; };
int main() {
std::cout << "sizeof(S<unsigned int>) = " << sizeof(S<unsigned int>) << std::endl;
std::cout << "sizeof(S<unsigned char>) = " << sizeof(S<unsigned char>) << std::endl;
}
g++だと違う結果になったが。
197:デフォルトの名無しさん
07/05/15 20:42:42
>>195
違いますけど・・・
#include <stdio.h>
int main(void){
struct A{
unsigned int m : 1;
unsigned int n : 7;};
struct B{
unsigned char m : 1;
unsigned char n : 7;};
printf( "%u\n", sizeof(struct A) );
printf( "%u\n", sizeof(struct B) );
return 0;}
198:デフォルトの名無しさん
07/05/15 20:51:15
VC8で確認。こちらも違った。
199:デフォルトの名無しさん
07/05/15 21:54:53
VC7.1でも違った。
200:デフォルトの名無しさん
07/05/15 21:58:58
ふつう違うよな
int とchar
一バイトと四バイトだんもんな
201:デフォルトの名無しさん
07/05/15 22:01:29
その理屈はおかしい。
202:デフォルトの名無しさん
07/05/15 22:29:47
BCC55で次のソースをコンパイルするとリンカがエラーを出すのですが、
私は何を誤っているのでしょうか?
どう直せばよいか教えていただけないでしょうか。
●ソース
#include<iostream>
class Singleton {
public:
static Singleton getInstance() {
if(&singleton == '\0') {
singleton = *(new Singleton());
std::cout << "Created!" << std::endl;
} else {
std::cout << "Not Created!" << std::endl;
}
return singleton;
}
~Singleton() {}
private:
static Singleton singleton;
Singleton() {}
};
int main() {
Singleton s1 = Singleton::getInstance();
Singleton s2 = Singleton::getInstance();
}
203:202
07/05/15 22:31:15
エラーの内容は次の通りです。
●コマンドラインとエラー
X:\>bcc32 -nX:\data\bin -5 -f X:\data\src\Singleton.cpp
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
X:\data\src\Singleton.cpp:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: 外部シンボル 'Singleton::singleton' が未解決(X:\DATA\BIN\SINGLETON.OBJ が参照)
204:デフォルトの名無しさん
07/05/15 22:33:49
一時オブジェクトとして使うならコンストラクタ呼び出さないと駄目ぽ
Singleton()::getInstance();
205:デフォルトの名無しさん
07/05/15 22:39:53
static変数の実体がないって怒ってるわけなんだが…
そんなことよりも、何もかもが誤りだから
ポインタと参照とシングルトンの勉強をしたほうがいいと思うよ。
206:デフォルトの名無しさん
07/05/15 22:41:02
>>202
クラスの静的メンバ変数は、外部で定義しなければならない。
Cのグローバル変数がヘッダで宣言して、どこか1ヶ所で定義するのと同じ理屈。
それはともかくマルチスレッドを考慮しないのなら、単にこうでいい。
class Singleton {
public:
static Singleton getInstance() {
return singleton;
}
~Singleton() {}
private:
static Singleton singleton;
Singleton() {}
};
static Singleton Singleton::singleton;
マルチスレッドを考慮するなら、Singletonはポインタ、
当然std::auto_ptrやboost::scoped_ptrあたりにすべき。
207:202
07/05/15 23:07:21
>>204-206
有難うございます。
マルチスレッドやboostのライブラリは当分手を出しません。
コマンドラインアプリをある程度満足に作れるようになってから先に行きます。
まだポインタの使い方も習得できてないわけですし。
ずっとJavaをやってきたんですが、アレは全部参照扱いだから
ポインタと実体を意識するシーンは限定されてたんですが、
C++はそうでないから難しいです。
C++プログラマにJavaを教える本はあるのに、その逆はないんですよね。
仕事ではないので、手探りでなんとかやっていこうと思います。
208:デフォルトの名無しさん
07/05/15 23:12:41
Accelerated C++マジオヌヌメ
209:206
07/05/16 00:07:44
>>206
getInstanceがSingletonへの参照を返すようにするのを忘れていたorz
正しくはこう
class Singleton {
public:
static Singleton& getInstance() {
return singleton;
}
private:
static Singleton singleton;
Singleton() {}
Singleton(const Singleton&);
~Singleton() {}
Singleton& operator =(const Singleton&);
};
210:202
07/05/16 01:31:34
>>208
Amazonのレビューによると、
既に他言語の知識がある人間にとって丁度良い本のようですね。
店頭で探してみます。
>>209
ありがとうございます。
operatorを使うんですね・・・。
まだ「パッと見」で、なぜこれがシングルトンを実現するのかが
分からないレベルなので、ソースを研究してみます。
211:デフォルトの名無しさん
07/05/16 01:44:03
Singleton(const Singleton&);
Singleton& operator =(const Singleton&);
はインスタンスのコピーを禁止するためのちょっとした工夫だよ。
privateにする&処理の内容を記述しないことで、
コピーしようとしたらコンパイルエラーになるようにしてる。
あと、コンストラクタをprivateにしてるのも、
getInstance()以外で勝手にインスタンスを作られないようにするため。
212:202
07/05/16 01:58:23
>>211
ありがとうございます。
なるほど、インスタンスのコピー禁止も意識しないといけないんですね。
privateなコンストラクタについては、Javaも同じ手法なのでわかりました。
213:デフォルトの名無しさん
07/05/16 06:57:01
C++で読むデザインパターン
URLリンク(www.01-tec.com)
214:デフォルトの名無しさん
07/05/16 09:59:08
XPです。
タスクトレイのアイコンを指定しても違うアイコン(赤い×マーク)が出るんですけど何故でしょうか?
アイコンは32x32,256色と16x16,256色が入ってます。
215:214
07/05/16 10:36:34
ソース
nid.hIcon = (HICON)LoadImage(hInstance,MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, 16, 16, 0);
リソース
IDI_ICON1 ICON "1.ico"
こんな感じで読み込んでます。
それとあともう一つお願いします。
タスクトレイのアイコンを右クリックしたらTrackPopupMenuという便利な位置指定できる関数がありますが、
右クリックメニューからダイアログなどのウィンドウを開いた場合のウィンドウ位置の指定はどうやるのがスマートでしょうか?
タスクバーを移動してる場合にも、アイコン位置の角に表示させたいです。
それぞれの位置の場合の処理を書く必要があるんでしょうか?
216:デフォルトの名無しさん
07/05/16 10:51:57
そのアイコンを試しにクライアントエリアに描いてみては
位置指定は、、、思ったとおりにやってみなよ
217:デフォルトの名無しさん
07/05/16 13:59:23
struct base{};
template<typename T>struct drived:base{
template<typename TT>bool typecmp(){ return typeid(T)==typeid(TT); }
};
base *p1=new drived<int> , *p2=new drived<char>;
//で、base*からdrived::typecmpにアクセスしたい訳だが
218:デフォルトの名無しさん
07/05/16 14:01:53
vipの方が人がいそうなので。
スレリンク(tech板:217番)
217 名前:デフォルトの名無しさん[sage] 投稿日:2007/05/16(水) 13:59:23
struct base{};
template<typename T>struct drived:base{
template<typename TT>bool typecmp(){ return typeid(T)==typeid(TT); }
};
base *p1=new drived<int> , *p2=new drived<char>;
//で、base*からdrived::typecmpにアクセスしたい訳だが
これをやりたいんだけど、やっぱり原理的に無理だよね?
219:218
07/05/16 14:02:42
すみません、218は誤爆です
220:デフォルトの名無しさん
07/05/16 16:30:30
>>215
IDI_ICON1の値が問題な希ガス
ヘッダでの#defineも晒したほうがいいとおも
221:デフォルトの名無しさん
07/05/16 16:48:29
>>217
お勧めはしないがdynamic_cast<derived<int>*>(p1)->typecmp<int>()
222:デフォルトの名無しさん
07/05/16 21:35:09
URLリンク(kansai2channeler.hp.infoseek.co.jp)
誰か応えてください。
223:デフォルトの名無しさん
07/05/16 21:57:45
>>222
よく読んでないけど、delete p;は実行されないと思うぞ
配列はmain関数側で作って渡した方がいいと思うぞ
224:デフォルトの名無しさん
07/05/16 22:00:19
あ、やっぱりそうですか。
・・・あ、なるほど、思いついた
ありがとさんでした
225:デフォルトの名無しさん
07/05/16 23:27:10
>>221
仮想関数無いと dynamic_cast って効かないんじゃない?
>>217
new drived した直後なら static_cast でいいだろう。
やっぱりお勧めはできないんだけども。
226:202
07/05/16 23:39:03
>>213
ありがとうございます。
こういうサイトは良いですね。
今は鯖落ちしてるようで、キャッシュを見ていますが・・・。
227:デフォルトの名無しさん
07/05/16 23:51:44
なんで実行時に決まる子の型を、コンパイル時判定で
親が使いたい、なんて言う発想になるんだろう
228:デフォルトの名無しさん
07/05/16 23:54:10
vectorについてどなたか教えて下さい。
例えば、メイン関数で空のvectorを定義して
別の関数でその中に数値を代入したい場合には
何を渡して、何を仮引数にとってやればいいのでしょうか?
あくまで別関数のreturnは0か1で返したく、別関数で代入するだけで
メイン関数vectorの値を操作したいのです。
sub(?????)
{
こちらで値を入れたい
}
int main()
{
vector<int> Vint;
sub(?????);
}
何も入っていないためかiteratorを渡しても駄目でした。
またmain{sub(&Vint)}で、sub(vecter<int> *Vint){}でも
値の代入は出来ませんでした。困っていますよろしくお願いします。
229:デフォルトの名無しさん
07/05/17 00:01:12
>>228
一番最後のポインタを使った奴なら大丈夫なはず。
できなかったってのは、何をしたらどうなったんだ?
ポインタのかわりに参照を使うのが C++ 的に適切。
230:デフォルトの名無しさん
07/05/17 00:02:35
>またmain{sub(&Vint)}で、sub(vecter<int> *Vint){}でも
>値の代入は出来ませんでした。
できるよ
…気になったんだが、main の中で値を入れることはできるの?
resize もせずに Vint[0] = 1; とかやってないよな?
231:214
07/05/17 00:38:52
ありがとうございます。
>>216
クライアントエリアにも赤い×マークが描かれました。
>>220
#define IDI_ICON1 103
です。
232:デフォルトの名無しさん
07/05/17 00:54:09
>>231
じゃあそういうデータなんだよ
複数の形式でアイコンが入ってるなら全部チェックしてみては
233:214
07/05/17 01:00:02
自分で作ったアイコンなので赤い×マークなんて入ってないんですが・・・。
実行ファイルのアイコンとタイトルバー左上のアイコンも同じアイコンを使っていてそちらはちゃんと出ます。
234:デフォルトの名無しさん
07/05/17 01:54:58
んじゃOEMアイコンを読んでるんだな。
hInstanceがNULLだったりしないか?
235:214
07/05/17 02:08:59
ビンゴでした。
すいません、どうもありがとうございました。
236:デフォルトの名無しさん
07/05/17 04:06:34
VC++で
ULONGLONG x = 0;
x += 10000000 * 60 * 60 * 3;
ULONGLONG y = 0;
y += (ULONGLONG)10000000 * 60 * 60 * 3;
if (x != y)
cout << "Different" << endl;
とするとxの方はオーバーフローになってxとyが違う数字になってしまうんだけど
64ビットコンパイラではこれは起こらないんだよね? この辺の仕様について
書いてあるページとか無いだろうか?
237:デフォルトの名無しさん
07/05/17 04:17:24
>>236
intが64bitなら起きないけど、VC++の64bitターゲットはintが32bitな
ので、起きる。
ページは知らね。探してないけど、Cの規格書にあるはず。
238:デフォルトの名無しさん
07/05/17 04:35:12
整数定数は(特に記述が無ければ)int。
int同士の演算はintで行われ、結果もint。
これはどんなコンパイラでも一緒。
つまり、>>237の通り。俺もページは知らないが。
239:デフォルトの名無しさん
07/05/17 05:33:31
VIPPERが意外と侮れない
昨日VIPでレスついてた
130 名前:以下、名無しにかわりましてVIPがお送りします。[] 投稿日:2007/05/16(水) 14:52:36.04 ID:G4TJRFdQ0
struct base
{
private:
virtual bool typecmp( const type_info &typeinfo ){ return false; };
public:
template<typename TT> bool typecmp(){ return typecmp( typeid(TT) ); };
};
template<typename T> struct drived : public base
{
public:
virtual bool typecmp( const type_info &typeinfo ){ return typeid(T) == typeinfo; }
};
こんなんでどうだい?
240:デフォルトの名無しさん
07/05/17 07:35:47
>>229-230
一番下ので可能とのことで、もう一度やってみます。
resizeというものに関しては知らなかったです。
どうもありがとうございました。
241:デフォルトの名無しさん
07/05/17 11:28:44
char *strという変数に文字列を格納するのを関数で行う場合
どういう渡し方すれば良いんでしょうか?
242:デフォルトの名無しさん
07/05/17 11:29:48
hoge(char *dst, int dst_size)
243:デフォルトの名無しさん
07/05/17 11:49:19
>>241
その変数に、文字列は格納できない。
244:241
07/05/17 11:56:44
あれ?文字列を格納するのって
char str[50]="hoge";
char *str="hoge";
の二種類でやるのではないのですか?
C言語は今日から勉強し始めたので激しく狂ったこと言ってたらすいません。
245:デフォルトの名無しさん
07/05/17 11:58:10
おとなしく、配列とポインタの関係あたりを勉強してからにしろ。
246:デフォルトの名無しさん
07/05/17 14:23:09
if(a==b)とif(b==a)って同じですか?
247:デフォルトの名無しさん
07/05/17 14:24:50
>>246
それがC++で特殊な演算子オーバロードされていると言うことがないなら、同じ。
248:デフォルトの名無しさん
07/05/17 14:29:06
a, b の型が異なっても同じだったけ?
int と long とか double と int とか
249:デフォルトの名無しさん
07/05/17 14:40:08
>>248
promotion rule に従うってだけで同じじゃね?
250:デフォルトの名無しさん
07/05/17 17:31:45
mallocはnew、freeはdeleteに置き換え可能だと思いますが、
reallocはどうしたらいいでしょうか。(STLのコンテナ使え、は無しで
251:デフォルトの名無しさん
07/05/17 17:42:35
>>250
STLのコンテナを使わない理由を調べ、その理由如何では敢えてnew/deleteに置き換えずにそのままrealloc()を使うべし。
252:デフォルトの名無しさん
07/05/17 17:43:48
C++の機能に置き換えるというなら、インラインアセンブリでシコシコ
253:デフォルトの名無しさん
07/05/17 18:06:40
つplacement new
254:デフォルトの名無しさん
07/05/17 18:56:04
>>236
(ULONGLONG)10000000よりも10000000ullのほうがすっきり
255:デフォルトの名無しさん
07/05/17 19:13:51
意味が違うだろ。
256:デフォルトの名無しさん
07/05/17 20:26:09
scanfでdouble型変数に数値を入力し、その数値を1/2,1/4,1/5の値を出力するプログラムを作成
したいのですが、どのようにして作ればいいのでしょうか?
257:デフォルトの名無しさん
07/05/17 20:32:49
inline指定した関数がインライン展開されなかったとき、なんで警告が出ないの?
個人的には「この関数は現在の設定(orコンパイラ)ではインライン展開されません」という警告が低いレベルで出て欲しい。
258:デフォルトの名無しさん
07/05/17 20:37:56
それでデバッグビルド/サイズ優先ビルドで警告が出まくりか?
259:デフォルトの名無しさん
07/05/17 20:41:57
>>256
どこで躓いてるのか分からん。
scanfでint型変数に数値を入力し、その値を2, 4, 5倍して
出力するプログラムは作れるかい?
260:デフォルトの名無しさん
07/05/17 21:31:09
foo = !!bar;
という文を見たんですか、これは bar をboolにしてるだけで、
foo = (bool)bar;
と同じですか?
261:デフォルトの名無しさん
07/05/17 21:36:14
C++で変態的な演算子定義をしていないなら。
(operator !だけ定義してあるとか)
262:デフォルトの名無しさん
07/05/17 21:42:02
>>259
いやつくれません
263:デフォルトの名無しさん
07/05/17 21:58:16
>>257
コンパイラ作成者に言え。
264:デフォルトの名無しさん
07/05/17 22:07:36
>>262
本買って勉強しよう
265:デフォルトの名無しさん
07/05/17 22:31:35
>>257
警告を出すようにできるものもあるぞ。例えばVisual C++。
/W4でも出てこず、/wで個別指定もしくは/Wallで出てくる。
URLリンク(msdn2.microsoft.com)(vs.80).aspx
URLリンク(msdn2.microsoft.com)(vs.80).aspx
Borland C++Compilerでも警告が出た覚えがある。
266:デフォルトの名無しさん
07/05/17 22:33:39
VC++は-W4異常以上は標準ヘッダですら警告出たりして煩かったから
使ったことないなぁ
今はどうだか知らないが
267:デフォルトの名無しさん
07/05/17 22:39:57
なるほど。
独習C++で「展開されるか否かはコンパイラによる」って書いてあった気がしたから
低血圧な俺は心配しすぎで心拍数上がってぶっ倒れそうだったけど安心した。
268:デフォルトの名無しさん
07/05/17 22:52:02
>>266
標準ライブラリは滅多に出てこないが、
Boostなんかの外部のライブラリのヘッダではよく出てくるから、
#pragma warningが手放せない。
269:デフォルトの名無しさん
07/05/17 23:25:06
自作の型に対し、プリミティブな型と同じような四則演算を行う場合って、
+ - * / % += -= /= %= ++ -- の12個全部定義しないとダメ?
270:デフォルトの名無しさん
07/05/17 23:38:45
boost::operatorsを使えば手間が省けるかと思う。
271:デフォルトの名無しさん
07/05/17 23:52:35
>270
boostに頼るのが現実的っぽいですね。ありがとうございました。
しかし、これを使わないとすると一体何パターン定義すればいいのやら……比較やら何やら。
272:デフォルトの名無しさん
07/05/18 00:02:31
何の型かは知らんが、例えば同じ * でも
MyType * MyType、MyType * int、int * MyType は別定義かもしれんしな
後 const ありなしとか
273:デフォルトの名無しさん
07/05/18 00:16:17
非メンバな演算子でもboost::operatorで定義出来るんですかいね?
274:デフォルトの名無しさん
07/05/18 08:22:41
>>273
クラス定義内で friend 関数を定義することで実現するみたい。
275:デフォルトの名無しさん
07/05/18 11:34:58
VC++2003にSP1あてたら強制コンパイル(Ctrl+F7)できなくなった
のですが、どなたか対処法知りませんか?
276:デフォルトの名無しさん
07/05/18 11:57:41
C/C++の話ではないような・・・
オプションのキーボードで、ビルドのコンパイルがどれに割り当てられているか見てみては
277:デフォルトの名無しさん
07/05/18 13:03:36
>>275です。
>>276さんレスありがとうございました。
ここはスレ違いっぽいとは思いながら該当するスレがみつからず
書いてしまいました。すみません。
書き方が悪かったです。
キーの割り当てがどうという問題ではなく、
1度コンパイルしたソースファイルを
もう1度強制的にコンパイルすることがSP1になってから
できなくなってしまったのです。
適切なスレ探して聞いてみます。
278:デフォルトの名無しさん
07/05/18 13:42:29
Ctrl-F7は普通のビルドだから強制でもなんでもないだろ
リビルドしたいのか?
279:デフォルトの名無しさん
07/05/18 14:05:34
>>277
コマンドラインからdevenv /rebuildしたらどうなる?
280:275
07/05/18 14:26:11
>>278さんレスありがとうございました。
こっちのスレで同様な質問かいてしまいました・・・。
Visual Studio IDE環境
スレリンク(tech板)
要はOBJファイルが存在する状態でも
リビルドではなく普通にもう1度コンパイルかけたいだけなんです。
理由は、ソリューションが巨大なため単にリビルドでなくて一部のみコンパイル
かけたいときがあるので・・・。
>>279さん
OBJ消したり、リビルドすれば大丈夫なのは分かっているのですが、
業務上他のVer.(2005など)のVisualStudioも使うので同様の操作
で何故できないのかと。
ちなみにSP1あてる前は普通にできてたことですし、
VS6.0SP6,2005,2005SP1でも同様に問題なくできていました。
281:デフォルトの名無しさん
07/05/18 14:33:06
コンパイルできなくなったってだけじゃ何もわからんよ。
具体的にどうなってんのか(ビルドログとか)晒せ。
282:デフォルトの名無しさん
07/05/18 14:37:38
普通build っつーのは src target の依存関係を追って時刻更新がかかったもだけを
更新する作業だと思うのだが…
make -u はリビルドと同じだし、なんのことかわかんね<強制ビルド
まさか単に時刻が崩れているおち?
283:275
07/05/18 14:51:25
ログ晒します。
1回目のコンパイル。当然通常通りです。
------ ビルド開始 : プロジェクト : AAAAA, 構成 : Debug Win32 ------
コンパイルしています...
BBBBB.cpp
WINVER not defined. Defaulting to 0x0501 (Windows XP and Windows .NET Server)
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\afx.h(281) : warning C4005: 'ASSERT' : マクロが再定義されました。
コマンド ラインの引数 : 'ASSERT' の前の定義を確認してください。
ビルドログは "file://d:\AAAAA\Debug\BuildLog.htm" に保存されました。
AAAAA - エラー 0、警告 1
---------------------- 終了 ----------------------
ビルド : 1 正常終了、0 失敗、0 スキップ
2回目のコンパイル。スキップされてしまいます。
------ ビルド開始 : プロジェクト : AAAAA, 構成 : Debug Win32 ------
---------------------- 終了 ----------------------
ビルド : 1 正常終了、0 失敗、0 スキップ
ソリューション壊れてるのかな・・・?
ちなみに2005で同等のソリューションでは1回目も2回目も同じログはきます。
284:デフォルトの名無しさん
07/05/18 14:58:05
むしろ2回目も同じログ吐くほうがおかしくないか・・・
PCの時刻とファイルのタイムスタンプのチェック、
あと新規でソリューション作って試してみて
285:275
07/05/18 15:06:39
>>284さん
>むしろ2回目も同じログ吐くほうがおかしくないか・・・
ですが、今までSP1あてる前とか、VC6.0のときもこんな動作
してなかったのですが。
PCの時刻やタイムスタンプが壊れていることはないです。
ソリューション大きすぎるとおかしいんですかね?
VC6やVC2005で新規ソリューションで同様の操作してみます。
286:デフォルトの名無しさん
07/05/18 15:07:45
ログじゃなくてゲロ吐きそう・・・・
287:デフォルトの名無しさん
07/05/18 15:09:19
OBJ とかの中間生成物が違うフォルダを指してるとか read-only とかそういうことないか?
288:275
07/05/18 15:26:53
VC6.0MFCアプリで新規プロジェクト作ったら、
2回目スキップされました。あれ?2003SP1と同じでした。
・・・
VC2005のMFCアプリの新規ソリューションも
2回目スキップされました・・・。
ごめんなさい。これがデフォルト動作なんですね・・・。
でもそうすると今あるこの巨大ソリューションの2005版で
こうならないのは何故??
いや、そもそも2003SP1当てる前はスキップされなかった
ですし。
プロジェクトファイルを起こすところからやりなおした方が
よさそうですね。
皆様お騒がせしました。ありがとうございました。
289:デフォルトの名無しさん
07/05/18 15:47:30
>>288
巨大ソリューションの日付が未来。
290:288
07/05/18 15:48:15
SP1前後で違うんだったな。無視してくれ。
291:290
07/05/18 15:50:33
289 だった…orz
292:デフォルトの名無しさん
07/05/18 18:43:13
URLリンク(kansai2channeler.hp.infoseek.co.jp)
画像の情報を圧縮するプログラムをつくろうと思い
今、その前段階で
圧縮せずにそのままの情報量で画像を出力するプログラムをつくっているのですが
元の画像がほぼ復元されるはずなのに全くかけ離れた結果が出てしまいます
どこを修正すればよいのでしょうか?
環境は OS:Linux GCC:4.1.2 言語:C++ です
293:デフォルトの名無しさん
07/05/18 20:22:19
>>292
デバッグ依頼なら他スレ逝ってくれ
294:デフォルトの名無しさん
07/05/18 21:33:10
戻り値として配列を戻したいんだが、そういう時ってのはどうやればいいんでしょうかね?
戻り値の型はどうすればいいのか、return の後に書くのは関数内の配列名でいいのか、関数を呼び出した場所の=の左オペランドはどういう型にすればいいのか
教えてください。
295:デフォルトの名無しさん
07/05/18 21:39:07
引数に配列のポインタ受け取ってそれを操作すればいいような気もする
296:デフォルトの名無しさん
07/05/18 21:41:17
C++でnew演算子には三種類あるらしいですが
普通のnew、placement new、あともう一つは何ですか?
297:デフォルトの名無しさん
07/05/18 21:41:49
>>294
具体的なテストケース書いてみ
298:デフォルトの名無しさん
07/05/18 21:42:54
というよりCではそれが一番使われている。
ほかには、構造体を返したりC++ならstd::vectorを使ったりする方法がある。
関数内でメモリ確保して、呼出元で解放してもらうという手もある。
299:デフォルトの名無しさん
07/05/18 21:43:44
>>296
new[]のような気がするが、そうするとplacement new[]も考えられるんだよな
300:デフォルトの名無しさん
07/05/18 21:45:19
new(nothrow) のことか?
301:デフォルトの名無しさん
07/05/18 21:48:47
>>300
第三のnewはそれでしたか…名前からするにbad_alloc例外を投げないnewってところかな?
ともあれ回答ありがとうございました
302:デフォルトの名無しさん
07/05/18 21:49:41
>>294
配列を含む構造体を使う。
C++ なら std::vector も使える。
303:デフォルトの名無しさん
07/05/18 21:50:49
new(nothrow) は placement new の一種だろう。
三種類あると言ってる人の認識がどうなってるか知らないけど。
304:294
07/05/18 22:06:48
//ん~、こんなんでしょうか?(実際作りたいプログラムはこんなじゃないですけど
#include<iostream>
using namespace std;
int factor(int a[]){
for(int i =0; i<5 ; i++){
a[i]=i+1;
}
return a;
}
int main(){
int a[5];
a = factor(a);
for(int i =0; i<5 ; i++){
cout <<a[i];
}
return 0;
}
て、コンパイルが出来ませんでした。コンパイラはVC。メッセージは次の通りです。
test.cpp(9) : error C2440: 'return' : 'int []' から 'int' に変換できません。
この変換が可能なコンテキストはありません。
test.cpp(14) : error C2440: '=' : 'int' から 'int [5]' に変換できません。
配列型への変換はありませんが、参照またはポインタから配列への変換があります。
やっぱり引数と戻り値の型らへんの知識があいまいなので、どうやって渡してどうやって戻せばいいのか分かりません。
このコード直してくれたりすると、ありがたいんですけど・・・wさすがに無理な頼みでしょうか
305:デフォルトの名無しさん
07/05/18 22:23:24
STL使った方が遥かに楽だと思う
#include <vector>
#include <iostream>
int factor(std::vector<int>& in) {
enum { NUM=5 };
typedef std::vector<int>::size_type vec_sz;
in.reserve(NUM);
for (vec_sz i = 0; i < NUM; ++i)
in.push_back(static_cast<int>(i));
return 0;
}
int out(const std::vector<int>& in) {
for (std::vector<int>::const_iterator i = in.begin(); i != in.end(); ++i)
std::cout << *i << " ";
return 0;
}
int main() {
std::vector<int> v;
factor(v);
out(v);
return 0;
}
306:デフォルトの名無しさん
07/05/18 22:28:29
>>304
JavaかC#でもやっていたのかもしれないけど、
まずCには「配列を渡す」という概念自体がない。
ポインタの型で配列のサイズを指定するというやり方が
ないわけでもないけど、やはり普通は配列の先頭の要素の
アドレス(ポインタ)を渡して処理をすることになる。
その辺が面倒だと言うのならSTLか配列かクラス使う。
307:デフォルトの名無しさん
07/05/18 22:32:47
こんにちは。Cでプログラムをしているのですが、
_beginthread()で作成したスレッドをCloseHandleで終了させる時に、
デバッグなしで実行すると何もエラーは起こらないのですが、
デバッグありで実行すると、例外が発生してしまいます。
おそらくCloseHandleで出ているエラーなのですが、正常な終了方法ではないのでしょうか?
なんか、_freeptd(ptd);の所に矢印があります・・・。
スレッドの作成の部分と終了の部分は下のようになってます。
hThread = (HANDLE)_beginthread(connect, 0, NULL);
CloseHandle(hThread_connect);
308:デフォルトの名無しさん
07/05/18 22:36:27
>>307
_beginthread のマニュアルに
_beginthread に対応する関数書いてない?
malloc と fclose は対応してない様に
違う関数呼ぶと問題が多いよ
309:デフォルトの名無しさん
07/05/18 22:37:48
_beginthreadで開始したスレッドはCloseHandleしちゃ駄目。
310:デフォルトの名無しさん
07/05/18 22:38:24
>>303
new(nothrow) は確保に失敗したら NULL を返す new 。
placement new は既に確保してあるメモリを利用する new 。
全然違う。
311:デフォルトの名無しさん
07/05/18 23:11:19
>>308
_endthreadというのがあって、そのスレッドの最後に
_endthread();すればスレッドが終わるようなのですが、
スレッドの外から強制的にスレッドを終わらしたいのです。
しかも_endthreadは引数を持たないので複数スレッドを走らせている場合は
どのようにスレッドの外から強制的に終わらせればいいのか・・・
>>309
そうなんですか・・・。それはエラーが出るわけですね;;
ん~・・・
312:デフォルトの名無しさん
07/05/18 23:20:19
>>310
new に与える追加の引数のことを総じて new-placement と言う。 (5.3.4)
元々は new (place) T として配置に使う構文として追加されたから
こんな名前になってるんだろうけどね。
313:デフォルトの名無しさん
07/05/18 23:24:43
単純な方法としては
生成時にスレッドを生成して、消滅時にスレッドを終了させる
っていうスレッドそのものを表すクラスは作ってそいつに自殺するように命令するとか
となるとそいつらを生成、管理するクラスが必要になるわけで…
314:デフォルトの名無しさん
07/05/18 23:26:00
ExitThreadでスレッドを終了させた場合、その終了させたスレッドが
プロセスの最後のスレッドであれば、そのプロセスも終了するっぽいので、
これはこれで非常に使いにくいです。一体どうすれば・・・
315:デフォルトの名無しさん
07/05/18 23:28:24
>>311
短い答え:
スレッドを強制的に終了させる必要などないような設計に汁
少し長い答え:
_beginthreadex(), TerminateThread()を使え
316:315
07/05/18 23:29:08
おっと後者のほうが短かったぜ
317:デフォルトの名無しさん
07/05/18 23:44:55
>>315
ありがとうございます。Exではありませんが、
_beginthread()とTerminateThread()でエラーが出ないようになりました。
色々調べたところ、あるサンプルプログラムにおいて
TerminateThread()の後にCloseHandle()で更にハンドル開放を行ってますが
これは必要なのでしょうか?
318:デフォルトの名無しさん
07/05/19 00:05:57
>>317
イベントを受け取ったら自分で_endthreadして死ぬようにした方がいいと思う。
スレッドを無理やり止めるってことはどこで止まるか分からないんだぞ。気色悪い。
319:315
07/05/19 00:12:44
>>317
長い答え:
ヘルプに書いてある筈だが、_beginthread()で開始したスレッドは
自分が終了する時に自分でCloseHandle()を呼び出してスレッドハンドルを
破棄する。言い換えると、_beginthread()で開始したスレッドのハンドルが
いつ無効になるか外からは全く分からないので、スレッドのハンドルを
外から何らかの形で使いたいのなら、必ず_beginthreadex()を使え。
_beginthreadex()で開始したスレッドは自分でCloseHandle()を
呼び出さないので、リークを避けたければ誰かが責任を持って代わりに
呼び出してやる必要がある。つまりWaitForMultipleObjects()などを使って
終了を待ち、その後CloseHandle()を呼ぶ必要があるってことだ。
TerminateThread()した場合も同様だな。
320:デフォルトの名無しさん
07/05/19 00:22:37
>>318
とりあえずスレッドではrecv()をSOCKET_ERRORが出るまで永遠にループさせています。
サーバーが終了した時などは、自動でループを抜けて終了するのですが、
それ以外にこちらから接続を終了する切断ボタンを用意しています。
そのボタンを押したときに強制的にスレッドを終了させているのですが、
ボタンを押されたイベントをスレッド内で取得してすぐにスレッドを終了させる
事なんて出来るのでしょうか・・・?
>>319
丁寧にありがとうございます。とても分かりやすいですw
321:デフォルトの名無しさん
07/05/19 00:41:34
Linux,gccです。
./aaa 3 2 | ./bbb
というように、最初に実行したaaaの結果をパイプでつないで、後ろのbbbというプログラムで操作したいのですが、
うまくbbbに渡すことができません。
aaaは、
1 -2
-1
2
のように出力するので、bbbで
int main(int argc,char **argv) として読み取ろうとしているのですが、
argcの値を出力してみると1とでるので、./bbbそのものしか読み取れていません。
自分としてはここで ./bbb 1 -2 -1 2 でargcの値が5になるようしたいのですが、
このようなパイプの使い方は間違いでしょうか?
322:デフォルトの名無しさん
07/05/19 00:45:11
>>321
大間違い。パイプの使い方の勉強してらっしゃい。
要は、標準出力と標準入力を繋ぐだけだから。
>>320
おいおい、recv()しているスレッドをいきなり殺しちゃ拙いだろ。
323:デフォルトの名無しさん
07/05/19 00:51:05
>>322
ではサーバーとの接続をぷちって切りたい時は
どうすればいいのでしょうか?
324:315
07/05/19 01:01:18
>>320
長い答え:
ブロッキングモードでひたすらrecv()ループをしているんだな。
確かに簡単だが、それでは綺麗にスレッドを終了させられない。
1)ブロッキングモードでrecv()を使う代わりに、
例えばasynchronousモードでWSARecv()+WSAGetOverlappedResult()を使う
2)スレッド間通信用にEventを作る。そのスレッドを止めたい場合は
外からSetEvent()でやんわりと「お願い」する。
3)受信スレッドでは、WSARecv()でトリガした受信の完了と上記のイベントの2つを、
WSAWaitForMultipleEvents()などを用いて、同時に待つようにする。
4)SetEvent()によって待機から抜けた場合は、スレッドが自分で終了する。
こんな感じにすればできるぞ。まあ、基本的なテクニックだが。
325:デフォルトの名無しさん
07/05/19 01:40:49
>>324
初めて聞く関数がいっぱい出てきたので
ちょっくら勉強してきます!
326:デフォルトの名無しさん
07/05/19 02:26:01
まあ要するに、recv()という「外(他スレッド)からブレーク出来ないもの」を使う代わりに
他のもので待機してrecv()ではブロックしないようにする、ということだな。
ネットワークでは誰もが必要とすることなので、対処法もほぼ確立してる。
一般的には「select系」と呼ばれるけど、Windowsにもそれに向けた方法が用意されている。
327:デフォルトの名無しさん
07/05/19 02:54:08
OS依存しない現時点でC++の仕様を網羅した入門的教科
書ってなにかよいのないでしょうか。
クラスとかSTLのさわりのところまで知っているのですが
数年やっていなかったので今どういう機能が投入されている
のかわかりません。図書館でパラパラみていたら
「詳説C++第2版」というのが値段も含めて
よいかなと思ったのですが。
328:デフォルトの名無しさん
07/05/19 02:58:23
CALLBACK関数内で変数の宣言をすると処理が重くなりますか?
329:デフォルトの名無しさん
07/05/19 03:04:22
>>328
↓のどっちと比べて重くなるって言ってるの?
1.CALLBACKじゃない関数で変数の宣言をする
2.CALLBACK関数内で変数の宣言をしない
330:328
07/05/19 03:05:34
すみません。
1.CALLBACKじゃない関数で変数の宣言をする
です。
331:デフォルトの名無しさん
07/05/19 03:10:37
>>327
興味を持ってるところに水を差して悪いが…
>クラスとかSTLのさわりのところまで
このレベルで「最新の仕様」を知る事に意味があるのか?
それならまだ知らないC++の基本を押さえるのが先じゃないか?
332:デフォルトの名無しさん
07/05/19 03:19:00
C系のを中断してLispとかHaskellあと言語そのものを作ったりとか
とかしばらくやっていたので
今度は今のC++らしいところが全体的に知りたいっていう
かんじなんです。
そのあたりの気分を理解していただけますでしょうか。
333:デフォルトの名無しさん
07/05/19 03:34:23
それなら安心して Effective C++
334:デフォルトの名無しさん
07/05/19 03:50:56
質問ですが、ワードパッドの[ファイル]メニューの[送信]コマンドのように
既存の標準電子メールソフトから送信用ウィンドウを呼び出す機能を実現するには
どうすれば良いのでしょうか?
335:デフォルトの名無しさん
07/05/19 03:53:49
gcc -pg でコンパイルしたらそれまで出てなかった
Detaching after fork from child process XXX
と言うメッセージ出るようになったんですけど、これは何ですか?なにか問題あるでしょうか?
336:デフォルトの名無しさん
07/05/19 05:25:39
>>334
「ファイル名を指定して実行」で
mailto::
やってみれ
337:334
07/05/19 06:52:25
>>336
忝い
338:304
07/05/19 07:10:12
>>305
答えてくれてありがとうございました。
が、関数とか全くと言っていいほど知らないので、書いてくださったコードは理解できませんでした・・・。
どうにか自分のコードをちょちょいと直してコンパイルエラー無くなるようにならないでしょうか?
もし良ければお答え下さい。
>>306
>JavaかC#でもやっていたのかもしれないけど
すみません、全くのプログラミング初めて2ヶ月の初心者です
配列の先頭要素のアドレスを渡すには配列名を書けばいい、と本に載っていましたが、それでいいんですよね?
関数内でいじった配列を、元のところに戻してやるとき、returnの後と、関数の戻り値の型はどう書けばいいのか教えてください;;
339:デフォルトの名無しさん
07/05/19 07:29:12
>>338
上手くいかないというのは、知識が足りていない事の証明。
解らないと思うなら、他人に聞く前に死ぬ気で調べなさい。
その方が自分のためだよ。
配列とポインタの関係について、ぐぐりつつ、テストコードを書きつつで、
ちゃんと基本を押さえれば、難しいことはないよ。
340:304
07/05/19 07:44:56
そうですね。甘えてました。
出直してきます。
ありがとうございました!
341:デフォルトの名無しさん
07/05/19 07:47:02
>>338
配列を関数で変更したいだけなら、例えばこれだけでいい。
void incrementArray(int * foo, unsigned nFoo)
{
for (int ic = 0; ic < nFoo; ++ic) {
++foo[ic];
}
}
別の配列にコピーする場合も、関数で配列を新規に確保するのは判り難いからやめた方がいい。
void copyArray(int * bar, int const * foo, unsigned nFoo)
{
for (int ic = 0; ic < nFoo; ++ic) {
bar[ic] = foo[ic];
}
}
342:デフォルトの名無しさん
07/05/19 07:50:14
コピーのほうの仮引数名は
fooだのbarだの書かずにsrc,destにしようぜ。
343:デフォルトの名無しさん
07/05/19 07:51:54
Linuxでの初心者の質問です。
C++のstd::sort(v.begin(), v.end())のsort()の実装を見てみたいのですが、
どこをみればよいのでしょうか。
関数ポインタ2つだけを引数にしなくても、v自体を引数にする仕様の方が
自然な感じがするのですが。。。
どなたかよろしくお願いします。
344:デフォルトの名無しさん
07/05/19 07:55:20
>>343
それでは「配列」か「コンテナ」か、どれか一つの全体しかソートできない。
例えば、vectorの二番目からソートしたいかも知れない。
345:デフォルトの名無しさん
07/05/19 07:58:43
>>343
ディストリビューションによるけど、たとえば
/usr/include/c++/*/bits/stl_algo.h
渡しているのは関数ポインタじゃなくて、イテレータオブジェクトだよ。
範囲を指定できるようにしておけば、コンテナの全体をソートするのも
一部をソートするのも同じ使い方にできるから、いい設計。
346:332
07/05/19 08:48:50
>それなら安心して Effective C++
どうもありがとうございました。読んでみます。
347:デフォルトの名無しさん
07/05/19 09:15:15
>>327
入門的教科書の条件は満たさないが、規格書でも買っとけば?
348:デフォルトの名無しさん
07/05/19 09:18:23
>>330
変数の型が糞重たいコンストラクタ/デストラクタを持ってるクラスだったら重くなるだろうね。
まぁ環境による
349:デフォルトの名無しさん
07/05/19 09:20:24
mixiで暴れてる猫皇って何者?激しく不快なんだけど
C言語コミュ
URLリンク(mixi.jp)
初心者の為のC言語
URLリンク(mixi.jp)
350:デフォルトの名無しさん
07/05/19 09:36:21
>>327
今書いてるから待ってて。
351:デフォルトの名無しさん
07/05/19 10:14:01
執筆中かよw
いつ出版されるんだ?w
352:デフォルトの名無しさん
07/05/19 10:34:30
>>350に期待
353:デフォルトの名無しさん
07/05/19 10:37:36
>>327
その本俺持ってるけど、初心者には詳しく書きすぎてあって読んでいる
うちに眠くなるよ。
独習C++などの問題集を一通りやってみてはいかがかな。あれなら
一冊やり終えた所である程度の力が付く。
354:デフォルトの名無しさん
07/05/19 15:19:22
>349
諦めとけ。
Kusakabe氏と猫王(猫皇)氏の参加コミュニティには近付かないが吉。
自分も「なるほど、考え方の違いですね」などと発言したら
「バカにするのもいい加減にしてください」とか返されてビックリですよ。詳細曖昧でごめん。
355:デフォルトの名無しさん
07/05/19 15:27:12
ミクシィ(笑)
356:デフォルトの名無しさん
07/05/19 15:30:09
2ch(笑)
357:デフォルトの名無しさん
07/05/19 15:32:14
独習C++、exceptional C++以外にC++の問題集ってありますか?
358:デフォルトの名無しさん
07/05/19 15:57:35
C with Classes 問題集
359:デフォルトの名無しさん
07/05/19 16:04:49
そのK氏、マイミクのマイミクなんだよなあ……
なんであんなキチガイと付き合いあるんだろうあの人。
360:デフォルトの名無しさん
07/05/19 16:43:19
A man is judged by the company he keeps.
類は友を呼ぶ。
キチガイの知り合いはキチガイ。
361:デフォルトの名無しさん
07/05/19 17:05:02
つまり359は無自覚のキチガイ
362:デフォルトの名無しさん
07/05/19 17:24:16
話題に対して関係ない人についての言及は思わぬ蛇を出させる
363:デフォルトの名無しさん
07/05/19 17:25:43
キューを配列で作りたいのですが
enqueue時にデータが一杯の時の処理が上手く出来ません
↓は自分で考えてみたものです
URLリンク(kansai2channeler.hp.infoseek.co.jp)
どこが悪いのか教えていただけないでしょうか
(headは先頭要素の一つ手前の要素数、tailは最後尾の要素の要素数)
364:デフォルトの名無しさん
07/05/19 22:20:21
>>363
デバッグくらい自分でしろよ。
デバッグの過程で学ぶ事は、プログラムを書く事以上にあるんだぞ。
365:デフォルトの名無しさん
07/05/19 23:20:06
わからないので書き込んだのですが…
366:デフォルトの名無しさん
07/05/19 23:21:09
わかってて書き込んでたらそれはさすがにまずいだろ
367:デフォルトの名無しさん
07/05/19 23:56:39
>>363
とりあえず、データが一杯の時に
「どういう動きにしたいのか」
「実際はどういう動きをするのか」
を、まとめてみるのはどうだろうか
368:デフォルトの名無しさん
07/05/20 04:20:25
友愛数を探すプログラム
「博士が愛した数式」で出てきた友愛数
友愛数の定義
URLリンク(ja.wikipedia.org)
Aの約数の和=B、Bの約数の和=Aのとき、A、Bは友愛数である
(ただし約数には自分自身を含めない)
例:220と284
220の約数の和=1+2+4+5+10+11+20+22+44+55+110=284
284の約数の和=1+2+4+71+142=220
とりあえず1,000,000まで探してみた。39組あった。
オイラーは60余り見つけたらしい。
が、いかんせん遅すぎる。(Athlon64 3500+で33分)
誰か高速化してくださいな。
ソース:URLリンク(kansai2channeler.hp.infoseek.co.jp)
高速化のポイント
・約数をもっとスマートに見つける方法はないか?(これがかなり遅い)
・10の約数の和が100になるわけないので本探索のjのループに無駄が多い
かといって、どこまではしょっていいかわからない j = i / 2 ~ とか?
・あ、jをループにするから遅いんだ。yakuwaをソートして二分木探索すればいいんだ
369:デフォルトの名無しさん
07/05/20 06:55:55
100まで求めるやつらしい
URLリンク(www.saoyagi.net)
370:デフォルトの名無しさん
07/05/20 08:28:32
Aという起動中のプログラム(既存)のウィンドウを、Bというプログラム(自作)から開きたいです。
できるだけ簡単に開く場合はどんな方法がありますか?(SendMessage?)
Aのウィンドウはメニューから開くタイプでアクセラレータキーは付いていません。
371:デフォルトの名無しさん
07/05/20 08:39:58
std::vectorについて質問です。
#include <vector>
template <class T>
class test{
public:
test(T a){ data.resize(1); data[0] = a; }
const T& getData() const{ return data[0]; }
private:
std::vector <T> data;
};
int main()
{
test <bool> a(true);
a.getData();
test <int> b(0);
b.getData();
return 0;
}
boolで初期化された方にはVC8、GCC3.4共に、テンポラリのリファレンスを返すと怒られてしまいます。
boolとintでどのような違いがあるのでしょうか?
識者の方、ご教授お願いします。
372:デフォルトの名無しさん
07/05/20 09:06:18
>>371
Effective C++第18項
vector<bool>の返す型はbool*ではなくvector<bool>::reference型だから
参照は返せない。だから値で返すしかない。
const T& → const T
内部でプロキシオブジェクトを使っているのでアドレスが取れないため。
373:デフォルトの名無しさん
07/05/20 09:06:47
×Effective C++
○Effective STL
374:デフォルトの名無しさん
07/05/20 10:47:19
なるほど、vector< bool >にそんな事情があったとは。
const T& → const T にすると、vectorの中身によっては、
コピーが馬鹿にならない場合もあるので、この制約は嫌らしいですね。
375:デフォルトの名無しさん
07/05/20 11:02:00
>>374
一応補足しておくと、
const T となるのは vector<bool> ’のみ’ね