スレを勃てるまでもな ..
46:デフォルトの名無しさん
07/09/01 01:55:49
>>44
先ずは、動作の安定したしっかりしたプログラムを作ること。
勿論それは、速度向上のために今後修正されるのだからそれを考慮して読みやすく誤解の少ないものであるべき。
後は、適当なリビジョン管理ツールと速度評価ツールを用意し、格闘するだけだな。
47:デフォルトの名無しさん
07/09/01 01:57:38
と書かれていたような気がしました。
48:デフォルトの名無しさん
07/09/01 02:38:14
>>44
すでにあるプログラムの速度を改善したいのか
それとも
これから書くプログラムを速くしたいのか
速くしたいのはどれくらいか、
数割なのか、それとも桁違いなのか
それによって答えは違ってくるよ。
49:デフォルトの名無しさん
07/09/01 02:42:29
と書かれていたような気がしました。
50:44
07/09/01 09:52:47
みなさんおはようございます。
すでにあるプログラムの速度を改善したいと思っております。
速くしたいのはどれだけ、というのは難しくとにかくできるだけ
処理時間を短くしたいと思います。
そのようなコーディングの”コツ”を未熟ながらわかっておりません。
ですので、相談させていただきました。
51:デフォルトの名無しさん
07/09/01 09:58:26
まずはプロファイラで何回も実行される部分を見付ける。
そこが最も実行時間上ネックになっているところだから、
そこを重点的に高速化する。80:20の法則。
52:デフォルトの名無しさん
07/09/01 10:23:55
>>51
最初は、実行回数よりも、実行時間の合計が大きな関数を見つけるほうがいいと思う。
ミクロな最適化して速度を稼ぐのは、後からでもいい。
53:デフォルトの名無しさん
07/09/01 10:33:26
>>52
うるせーバ〜カ
54:48
07/09/01 10:40:57
>>50
> 速くしたいのはどれだけ、というのは難しくとにかくできるだけ
達成すべき目標が与えられていないのなら、現状を目標にしてしまえ。
何もしなくても目標達成だ。おめでとう。
「とにかくできるだけ」つまり速度無限大が目標なら、
それを実現するためのコストも無限大が必要だ。
ということは、
自分でやらないで金を出してプロを雇ったほうがいい。
まぁいいや、桁違いに速くしたい、ということだと解釈しよう。
処理時間の大半を占めている部分について、
データ量Nに対して処理のオーダーがNのX乗になっている部分を探し、
よりオーダーの小さいアルゴリズムに変更する。
下手なプログラムなら、これで桁違いに速くなる。
55:デフォルトの名無しさん
07/09/01 10:41:52
>>53
心が寂しいんだね。同情するよ。
56:デフォルトの名無しさん
07/09/01 10:53:11
>>55
同情するな金をくれ!
57:デフォルトの名無しさん
07/09/01 10:56:55
>>56
同情ってことは、俺も心が寂しいってことだ。
だから金はやれない。
あの安達祐実のセリフは日本語として間違っている。
「同情するなら〜」ではなく、「哀れむなら〜」のほうが意味としては適切かと。インパクトないけどね。
58:デフォルトの名無しさん
07/09/01 11:06:12
もう少し日本語を勉強したほうが良いと思うよ・・・
59:デフォルトの名無しさん
07/09/01 17:44:33
gcc -O2 hoge.c
60:デフォルトの名無しさん
07/09/03 11:33:14
まあ、この書き込みもみたくねぇって言われるのは承知の上で、
なんでここ、IDでないの?
こんなウザイ書き込みIDNGワードにしてしまいたい。
61:デフォルトの名無しさん
07/09/03 11:39:07
>>60
死ね
62:デフォルトの名無しさん
07/09/03 23:00:16
たった一言で誰だか分かってしまうこのクォリティw
63:44
07/09/04 00:45:27
返事がすごく遅れて申し訳ありません。アドバイスありがとうございます。
>データ量Nに対して処理のオーダーがNのX乗になっている部分を探し、
>よりオーダーの小さいアルゴリズムに変更する。
オーダーがNのX乗になる部分の探し方がわからないです。
まずはぐぐってみます。
そして、実行時間、実行回数が多い関数を探し出し(プロファイル使用。
使用したことはないのですが・・・)、その部分のより適した
計算方法を検討することを行ってみます。
大体このような流れでみなさんも処理時間の短縮を図っているのでしょうか?
64:デフォルトの名無しさん
07/09/04 00:56:30
わかりやすいボトルネックは二重ループしてるところとかかな。
でもループ内から呼び出した関数の中で別のループをしてるような一見わかりにくいものもある。
ま、プロファイラを使えば簡単に見つかるだろうけど。
65:デフォルトの名無しさん
07/09/04 03:04:58
>>63
> オーダーがNのX乗になる部分の探し方がわからないです。
データ量Nを10倍にしてみて、実行時間が100倍になれば2乗、1000倍になれば3乗。
66:65
07/09/04 03:08:06
言葉が足りなかったかも。
プログラムを見て探すのではなく、
実際にプログラムを走らせてみて、
実行時間の変化を見るのです。
10倍だと極端かもしれません。
2倍とか3倍とか適当に試して。
67:デフォルトの名無しさん
07/09/04 05:00:10
C++の演算子の
.*
->*
は、どういう時に、どのように使うものなのですか?
68:デフォルトの名無しさん
07/09/04 05:18:11
(構造体).(構造体のメンバ)
(構造体へのポインタ)->(構造体のメンバ)
69:デフォルトの名無しさん
07/09/04 07:47:22
メンバポインタのようにも見える
→ *
70:デフォルトの名無しさん
07/09/04 12:43:16
メンバポインタだな
X x, *p;
int X::*m;
というのがあったとき、
x.*m = 1;
p->*m = 2;
このように使う
71:デフォルトの名無しさん
07/09/04 23:53:45
クラスのメンバに、
自分自身を破棄してメモリを解放する関数って作れるのでしょうか?
例えばこんな感じです。
void destroy(){
DELETE(this);//インスタンスを破棄してメモリ解放する関数
}
72:デフォルトの名無しさん
07/09/04 23:56:10
そうすると静的に作ったインスタンスの扱いはどうなるの?
インスタンスが有効かどうかを保持するフラグをメンバ変数に持たせておく、
ぐらいの解決方法が一番な気がする。
73:デフォルトの名無しさん
07/09/04 23:56:36
delete this;
当然newしたものである必要がある。
74:デフォルトの名無しさん
07/09/05 00:08:48
newで作ってないインスタンスはdeleteで消せないんですね。
Javaしかやったことがないので、メモリ解放がイマイチ馴染まず、
できるだけ意識せず簡単に消せる作りにしたいんです。
メソッドのスコープ抜けたり、参照外れたりしたら、
勝手に解放されるとかいう風に作るのは無理でしょうか。
75:デフォルトの名無しさん
07/09/05 00:15:31
つ[スマートポインタ]
76:デフォルトの名無しさん
07/09/05 00:22:07
>>74
そもそもnewする必要がないものをわざわざnewして作ることもないと思うが。
77:デフォルトの名無しさん
07/09/05 00:23:59
>>75
stdっていうのが無いので使えませんたぶん…
>>76
もしかしてnewで作らなければ、メソッドのスコープ抜けたとき勝手に破棄されるんでしょうか。
78:デフォルトの名無しさん
07/09/05 00:25:26
>>77
される(それはJavaと同じ)。
てか、まずは試してみたらどうだろう?
79:デフォルトの名無しさん
07/09/05 00:27:27
スタックとヒープの区別すらついていないとは…まるで知性を感じませんよ
newで作ったやつ…関数抜けても消えない。ヒープに取るから
ローカル変数…関数抜けたら消える。以降は使用不可
80:デフォルトの名無しさん
07/09/05 00:33:04
スタックとヒープなんとなく違いが分かりました。
確かに知識不足ですね。まだ始めたばかりなんで勉強してみます。
81:デフォルトの名無しさん
07/09/05 07:06:58
>>77
ないならば、用意すればいい。
テンプレートが使えるコンパイラなら、
boost::scoped_ptrやboost::shared_ptrが使える。
もちろん外部のライブラリ使用禁止なら、
適当に名前空間を変えて自己責任で使えばいい。
そんなに複雑なものでもないし。
82:67
07/09/05 08:31:06
>>69-70
ありがとうございます。
これはエグい機能ですね。
どうりで今まで使いみちが理解できなかったわけです。
これを使うべき場面というのはあるのでしょうか。
83:デフォルトの名無しさん
07/09/05 09:11:26
>>71
C++に不慣れなうちは、delete this するようなクラスを作るのは、やめたほうがいいと思う。
なぜなら、delete this は、どうしてもそれが必要な特別な場合だけに限定すべきだから。
どうして、自分自身を破棄するようなメンバ関数が必要なの?
もっと適切で良い方法を教えられるかも。
84:デフォルトの名無しさん
07/09/05 10:45:08
>>82
メンバ関数ポインタ でぐぐると使用例がいくつかヒットするかもしれない。
まぁでも滅多に使うもんじゃない。
85:デフォルトの名無しさん
07/09/05 11:21:37
直接メンバへのポインタには触れないけど、
mem_fun(やboost::bind)の中で使っているんだろうなとは思う。
86:デフォルトの名無しさん
07/09/07 22:29:14
>>83はもしかしからデストラクタを呼びたいのかも。
87:デフォルトの名無しさん
07/09/07 22:30:20
>>83じゃねえや>>71だな。
88:デフォルトの名無しさん
07/09/08 13:10:16
関数の引数で、
読み取りのみで変更を行わないものは、
void hoge(const Type& o) ;
void hoge(const Type* p) ;
どう使い分けるべきなのでしょうか。
89:デフォルトの名無しさん
07/09/08 13:19:56
常に前者。
ただし、配列の要素を指すポインタを受け取るのであれば、
要素数を示す引数を追加した上で、ポインタを使う。
しかし、イテレータで済むならそっちを使う。
90:デフォルトの名無しさん
07/09/08 15:59:14
なぜポインタではなく参照を使うのでしょうか。
91:デフォルトの名無しさん
07/09/08 16:04:27
void hoge(const Type& o) ;
だったら引数にNULLを設定した場合、コンパイル時にエラーが分かるから。
ついでに
void hoge(const Type* o) ;
だと常にNULLチェックが必要、そうしないと実行時にどんなエラーが起こるやら。
ちなみにNULLがありえる場合は後者を使う。
ちなみに、ここでいうNULLとは
Type* p = NULL; hoge(p);
のことではなく
hoge(NULL);
のことですぅ。念のため補足
92:デフォルトの名無しさん
07/09/08 16:58:52
C++で色々なプログラムを作りそのときの考え方を示し
実際にどのようにして作るのか解説してくれる本はありませんか?
93:デフォルトの名無しさん
07/09/08 17:25:48
88です。
ポインタの安全ではない部分を解決するために、C++で参照が導入されたのだから、
参照を使ったほうがいい、ということですね。
94:デフォルトの名無しさん
07/09/09 00:30:37
>>91
NULLで参照がエラーになるのはNULLだからじゃなくて型が違うからだろ。
95:デフォルトの名無しさん
07/09/09 01:14:54
>>94
>>91はそういう話をしている。何も間違ってない。
96:デフォルトの名無しさん
07/09/09 01:46:04
>>95
>>91の書き方はからは読み取れない。
補足も意味不明。
97:デフォルトの名無しさん
07/09/09 01:51:34
日本語でおk
98:デフォルトの名無しさん
07/09/09 01:55:28
>>97
日本語じゃなくてC++が分かってないんだろ。
99:デフォルトの名無しさん
07/09/09 02:00:32
何や此奴俺初めて書き込んだのに
100:デフォルトの名無しさん
07/09/09 02:03:39
91の言いたいことはわかるが、
説明がいまいちだったな。
101:デフォルトの名無しさん
07/09/09 02:23:37
94の言いたいことはわからないし、
人としていまいちだったな。
102:デフォルトの名無しさん
07/09/09 02:29:00
>>91 のポインタだと常にNULLチェックが必要ってのも素人くさいな。
103:デフォルトの名無しさん
07/09/09 02:32:35
>>102
まぁその辺は宗教入って来る話な気もするし、無しにしようや。
104:デフォルトの名無しさん
07/09/09 02:32:52
>>91
補足は、hoge(p); でなくて、hoge(*p); だよな。
hoge(p);とhoge(NULL); なら、どっちも参照ならエラーだし、ポインタならエラーにならないし。
105:デフォルトの名無しさん
07/09/09 02:45:13
>>103
宗教って言うと「常にNULLチェックする」ほうにも理があるみたいじゃん。
106:デフォルトの名無しさん
07/09/09 04:51:23
今BCCを使ってC言語の勉強をしていますが何かアプリケーションを作製したいときってどんなソフトがいりますか?
107:デフォルトの名無しさん
07/09/09 04:52:58
>>106
VisualC++
108:デフォルトの名無しさん
07/09/09 04:54:27
>>107 ありがとうございます!
109:デフォルトの名無しさん
07/09/09 07:18:46
>>106
107は、あなたをからかっている。
BCCでもアプリケーションは作れるが、
便利で強力な道具を使えば手間が省けるというもの。
どのようなアプリケーションを作りたいの?
110:デフォルトの名無しさん
07/09/09 07:44:59
>>109 メーラーです。複雑な機能は抜きとしてメールサーバーからメールを取ってくるというものです
111:デフォルトの名無しさん
07/09/09 07:58:30
GUIとCUIどっち?
112:デフォルトの名無しさん
07/09/09 08:02:49
GUIです。最低限の機能としてメール受信送信それと閲覧ができれば。
113:デフォルトの名無しさん
07/09/09 08:21:34
じゃぁ、C++Builder
114:デフォルトの名無しさん
07/09/09 09:35:15
>>112
何故作りたいの?
一発で巧く動くものが作れればいいけどそうでなければメールサーバに迷惑を掛けることにもなりかねないし、
何より便利なメールソフトが腐るほどあるのに。
115:デフォルトの名無しさん
07/09/09 09:37:33
>メールサーバに迷惑を掛けることにもなりかねない
ここには同意だが、なぜそんなにもやってみようという気持ちをくじくようなことを言うのか。
116:デフォルトの名無しさん
07/09/09 09:57:01
どうせやるなら、そこらに無いものを作ろうよ。
117:デフォルトの名無しさん
07/09/09 09:57:54
>>114
言語の話とはズレるけど、メールサーバを自分で立てるという発想は無いのか?
118:デフォルトの名無しさん
07/09/09 10:05:25
>>105
ある。
例えばバグの早期発見と原因分析に役立つ。
119:デフォルトの名無しさん
07/09/09 10:34:43
NULLポインタに何か意味があるならともかく、
そうでないなら、
NULLチェックなんてするとバグを見落とすことになる。
デバッグ中は、
NULLチェックせずに例外で落ちたほうがマシだと思うよ。
120:デフォルトの名無しさん
07/09/09 10:53:18
>>119
そういうのを含めてNULLチェックというんでないの?
NULLに対し何らかの処理が必要という意味で
121:デフォルトの名無しさん
07/09/09 10:56:34
>>104
Type* p = NULL;
のあとに*pとかやったら関数とか関係なく落ちるだろ…それもコンパイル時には分からん品
122:デフォルトの名無しさん
07/09/09 11:20:55
>>120
ふつ〜NULLチェックといったら、
NULLでないことを確認してからポインタの指す先を触り、NULLの場合はエラーとしてfalseを返す
だろう。
正しくエラー処理していて堅牢に見えるけど、かえって、バグを抱えたまま、それらしく動いたりするのよ。
123:デフォルトの名無しさん
07/09/09 11:25:27
>>119
例外で落ちるってWindowsのメモリアクセス違反例外のこと?
さておき。
単にセグメンテーションフォルトされたら、
落ちた位置とか原因とか分かり辛くなるじゃん。
現象が再現するとも限らないし、
テスト環境に開発環境があるとも限らないし。
異常発生後も動くのが嫌ならNULLチェックで
例外投げるなりexit()するようにしたら良いよ。
少なくともログ出せない落ち方よりログ出せる落ち方のが良いと思う。
そいえば。
Linuxとかでcore吐いてたら、まだコールスタックやら拾えるかなぁ。
VCとかにもそういうのあるの?
124:デフォルトの名無しさん
07/09/09 11:52:27
>>123
Windows限定ではないけど、いまどきのリッチな環境向けのOSなら、
NULLポインタの指す先にアクセスしたら、OSが待ったをかけてくれると思う。
メモリ保護がないハードとかは・・・別の話にしてほしい。
Windowsローカルの話だと、Dr.ワトソンというログ記録ツールが、OS標準搭載されてる。
メモリアクセス違反をやらかした場所のコードを逆アセンブルし、レジスタとスタックの状態を
テキストファイルで保存してくれる。設定でプロセスのメモリイメージのダンプも可能。
下手にハンドルして貴重な情報をログに残さず捨ててしまうくらいなら、これを使ったほうがいい。
まぁ普通は、開発環境が入っているPCでテストしている最中に問題を見つけるし、
逆に言うと、その段階で問題を見つけられるようにテストすべきだから、
メモリアクセス違反をやらかしたらデバッガをアタッチすることになるかと。
自分は使うに至ったことないけど、リモートデバッグもできるとのこと。
これなら、リモートデバッグ用のエージェントだけをターゲットマシンに
インストールすればいいので軽い。
125:124
07/09/09 12:04:27
捕捉
逆アセンブルされたコードを見ても、C/C++のソースの該当箇所がわからないとダメなので、
コンパイルするときに、ソースコード付きでリスティングファイルを出力
リンクするときに、mapファイルを出力
んでもって、これらを生成されたバイナリとセットでしっかり管理する。
126:デフォルトの名無しさん
07/09/09 12:44:44
データへのポインタpDataを取得する関数が、
こんな感じで定義されているのですが、
long GetData( void*& pData )
「*」と「&」が並んでいるところのわけがわかりません。
void*& pDataのところは「*」がpDataのポインタをさしていて、
「&」はその参照を受け取る、というようなことなんでしょうか。
自分の持っている初心者向けの参考書には「参照には*をつける必要はない」と
書いているのですが…。
127:デフォルトの名無しさん
07/09/09 12:57:45
int &x
bool &y
void* &pData
128:デフォルトの名無しさん
07/09/09 12:59:01
>>126
たとえば、
typedef void* VOID_PTR ;
としたならば、
long GetData(VOID_PTR& pData )
と同等。
仮に参照を使わなければ、
long GetData(VOID_PTR* ppData )
long GetData(void** ppData )
かな。
129:デフォルトの名無しさん
07/09/09 14:32:38
"voidポインタ"型の参照 と思え
それがよくわかるように>>127みたいに書くのを俺はすすめる
(int* a, b; ってできないから困るが。)
130:デフォルトの名無しさん
07/09/09 14:55:46
質問です。
stl::listやstl::queueなどを複数のスレッドから操作
(push_back()やpop_front()など)する場合ミューテックスで
ロックする必要があるのでしょうか?
それとも元からスレッドセーフになっているのでしょうか?
131:デフォルトの名無しさん
07/09/09 15:38:10
VC++の場合はロックする必要がある
URLリンク(msdn2.microsoft.com)(VS.80).aspx
gccの場合もロックする必要がある
URLリンク(gcc.gnu.org)
他の実装でもたぶんロックする必要がある
あと stl:: っていう名前空間はないと思うが
132:デフォルトの名無しさん
07/09/09 16:30:35
>>130
もしWindowsなら、Mutexよりも、CriticalSectionを使おう。
念のため言っとくけど、
STLのコンテナのメンバ関数を1つ呼び出す直前・直後でロックするのはダメよ。
iteratorやコンテナ内のオブジェクトへのポインタの有効期間を考えて、適切な範囲でロックすべし。
133:デフォルトの名無しさん
07/09/09 17:01:58
>>131
>>132
ありがとうございます。参考になりました。(英語はあんまり読めないけど。)
コンテナのメンバ関数内で勝手にロックされるわけではないのですね。
>>131
std::の間違いでした。
134:デフォルトの名無しさん
07/09/09 19:49:57
>>114 何故?といわれましても別に仕事でもなく学校の課題でもないのですが個人的に作りたいと思いまして・・・
サーバーに関しては知り合いの許可をもらいやるので大丈夫です
135:デフォルトの名無しさん
07/09/09 19:59:33
テスト用のメールサーバくらい、VMwareとかVirtualPCとか使って、Linuxで適当に立てればいいじゃん。
通信するプログラムの場合、自分側だけでなく、相手側もデバッグモードにしたり、ログをチェックしたりするよ?
136:デフォルトの名無しさん
07/09/09 20:09:18
>>135 ありがとうございます。ちょと調べてみます。
137:デフォルトの名無しさん
07/09/09 20:13:29
パケットモニタも用意しよう。
暗闇を照らすものは多ければ多いほどいい。
138:デフォルトの名無しさん
07/09/09 21:57:47
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
int
main()
{
int sock0;
struct sockaddr_in addr;
struct sockaddr_in client;
int len;
int sock;
sock0 = socket(AF_INET, SOCK_STREAM, 0);
addr.sin_family = AF_INET;
addr.sin_port = htons(12345);
addr.sin_addr.s_addr = INADDR_ANY;
bind(sock0, (struct sockaddr *)&addr, sizeof(addr));
listen(sock0, 5);
139:デフォルトの名無しさん
07/09/09 21:58:48
while (1) {
len = sizeof(client);
sock = accept(sock0, (struct sockaddr *)&client, &len);
write(sock, "HELLO", 5);
close(sock);
}
close(sock0);
return 0;
}
364 名前:デフォルトの名無しさん[] 投稿日:2007/09/09(日) 21:48:41
このプログラムは複数のクライアントと接続するサーバプログラムらしいのですが
なぜ複数のクライアントと接続することができるんですか?
実際、このプログラムはどのように動作するんですか?
まず、listen(sock0, 5);で接続受付状態になって停止して
接続を受け付けたらwhile以下を実行するんですよね?
140:デフォルトの名無しさん
07/09/09 22:00:34
コピペ?
141:デフォルトの名無しさん
07/09/09 22:03:03
すいません
聞く場所を間違えたのでここにコピペしました
142:デフォルトの名無しさん
07/09/09 22:11:19
>>121
だから>>91が意味わからんって言ってるんじゃないの。
「補足」どの部分の何を補足してるつもりなのか、意味がわからん。
143:140
07/09/09 22:17:53
>>141
すまそんとりあえず分かる範囲で…
listen関数の第2引数は待ち受けの数を表し、
複数のクライアントからの接続要求を待つようです。
144:デフォルトの名無しさん
07/09/09 22:32:27
>>143
このプログラムでは待ちうけ数が5であるということは
接続要求が1つ来たらコードのlisten以下に処理が移るということですよね?
このときの待ち受け数は4でこのプロセスはwhile内部の処理を行う
そして、closeしたら待ち受け数が5になる
以下接続要求が来るごとにそれぞれのプロセスがlisten以下をcloseされるまで
実行するということですか?
かなり日本語がおかしくて申し訳ないです
145:デフォルトの名無しさん
07/09/09 22:42:01
違う。
listenは5つ分の接続要求を貯めるキューを作ってポートを開くだけ。
acceptで実際に接続が来るまで待ち、接続が来たらacceptから下にいく。
クライアントにHELLOを送って、接続を閉じて、またacceptで次の接続を待つ。
146:デフォルトの名無しさん
07/09/09 22:47:06
待ち受け数とかプロセスとか妙な言葉を使ってるけど、別に複数のプロセスが立ち上がるわけでもないし、同時並行的に5つの接続を捌けるわけでもない。
listenに指定する5っていうのは、プログラムの処理が追いつかなくてクライアントをどんどんacceptするのが追いつかないときに、OSが裏で5つまで接続要求を貯めておけるだけ。
6つめが来るとクライアントは接続拒否される。
147:140
07/09/09 22:47:45
ソケットは扱った事が余り無いのでなんとも言えませんが
その通りだと思います。
また、複数の接続要求(この場合だと5以下)が来た時は、
待ち行列に置かれアクセプト待ちに
越えると無視されるようです。
つ UNIXネットワークプログラミング入門 雪田修一 著
買ったは良いが今日まで読む機会が無かったありがとう…orz
148:144
07/09/09 22:54:48
>>145
>>146
並列的に処理をするものとばかり・・・
実際は処理を行っているのは1つだけであとはためておくんですね
listenで停止する(待つ)のではなくてacceptで停止して接続を待つんですね
149:144
07/09/09 22:59:27
あともうひとつ聞きたんですがlen = sizeof(client)という処理を行っているんですけど
この時点でclientには代入などが行われていないのでこのような処理を行うことは
出来ないと思うのですが?
150:デフォルトの名無しさん
07/09/09 23:08:02
代入してなくても、その変数のサイズ (つまり sockaddr_in 構造体のサイズ) くらいはわかる
151:144
07/09/09 23:09:28
>>150
ああそういえば・・・
色々答えていたただいてありがとうございました
152:140
07/09/09 23:32:37
#include <sys/types.h>
#include <sys/socket.h>
int accept(int s, struct socketaddr *addr, socklen_t *addrlen);
s…ソケットに結びついているディスクリプタ
addr…ユーザプログラムの責任でアロケートしたアドレス格納用バッファへのポインタ
addrlen…socklen_tへのポインタ
よって
struct sockaddr_in client;
とあるので
第2引数にはclientのポインタが…
&client
第3引数にはアドレス用バッファのバイト数が入ります。
int len = sizeof(client);
はぁ、もう寝よ…
153:デフォルトの名無しさん
07/09/10 00:04:13
おやすみ。
明日からは
ネットワークプログラミング相談室 Port20
スレリンク(tech板)
へどうぞ。
154:デフォルトの名無しさん
07/09/10 00:11:46
(struct tm)* now;
と書いてもキャストだと思わず「struct tm型」のポインタだと思ってくれるコンパイラない?
155:デフォルトの名無しさん
07/09/10 17:26:31
今度、就職するときにC,C++を勉強しなくてはいけないのですが
オススメの教習本ってありますか?
156:デフォルトの名無しさん
07/09/10 17:46:15
Boostのドキュメント
157:デフォルトの名無しさん
07/09/10 18:19:54
>>155
参考書スレがあるから、そっちを読んだほうがいい。
とりあえず自分からアドバイスできるのは、
・文法だけ理解しても、使いこなすことはできない
・世の中、良書もあれば、ろくでもない本もある。とくに後者の罠は引っかかりやすい。
ってこと。
文法を解説する本だけでなく、
使いこなし方を解説する本も読もう。
C++の使いこなし入門としては、
Effective C++
Effective STL
この2冊をお勧めする。
本の値段は安くないが、値段の10倍の価値はある。
少なくとも自力で悟りを開くよりは、遥かに近道だ。
158:デフォルトの名無しさん
07/09/10 22:00:27
質問です。実行中のプログラムにコマンドラインから設定を渡すにはどうすればよいでしょうか?
これは、実行中のプログラムがコマンドラインを監視するのではなく、
2重起動時にパラメータだけ渡されるようなイメージです。
お願いします。
159:デフォルトの名無しさん
07/09/10 22:09:32
先に起動した方は何かの通信手段でデータを受信できるように待機しておいて、
後に起動した方はその通信手段でコマンドライン情報を送信する。
160:158
07/09/10 22:12:35
>>159
共有メモリ/Socket以外の方法で可能なら、それを教えてください。
へたれですいません。お願いします。
161:デフォルトの名無しさん
07/09/10 22:16:50
なぜ共有メモリやらソケットがイヤなのかその理由を書かないと、何か提案しても、やっぱりそれもイヤとか言われる予感。
あと、ANSIの範囲外の話は、OSの種類を書いてください。
162:158
07/09/10 22:23:09
>>161
上記以外の方法で、より簡単な方法があればそれで行きたいからです。
規格はANSIで。Winだったらメッセージ使うんですが。
それと、上記の方法がいやな理由は以下の通り。
・共有メモリ -> 保守/拡張がめんどい
・ソケット -> プログラム規模が大きくなるからめんどい
よろしくお願いします。
163:デフォルトの名無しさん
07/09/10 22:26:45
ANSI ではプロセス間通信の方法は fopen で同じファイルを読み書きする以外にありません。 終わり。
164:デフォルトの名無しさん
07/09/10 22:31:25
ちなみに共有メモリもソケットも ANSI には無いものですから 残念
165:158
07/09/10 22:44:57
>>163, 164
ANSIではファイル以外にはないですが・・・どうもです!
共有メモリってANSIではないのですね。勉強になります。
ソケットはそうですね。OS依存で言語使用ではないですね。仰るとおり。
ご丁寧にどうも!
166:やおい
07/09/10 23:49:58
typedef unsigned long dword;
typedef unsigned char byte;
typedef union _struct{
byte data[12];
struct test_bit{
dword program_info_length :12;
dword flag_4 :4;
dword PCR :13;
dword flag_3 :3;
dword last_section_number :8;
dword section_number :8;
dword current_next_indicator:1;
dword version_:5;
dword flag_11:2;
dword program_number :16;
dword section_length:12;
dword falg_2_ :2;
dword flag_0:1;
dword testdata :1;
dword table_id :8;
}bit;
}header_type;
167:やおい
07/09/10 23:50:47
上記のようなビットフィールド構造を作ってdata配列に値を入れて共用体のメンバから
欲しいビット値を手に入れると言ったプログラムを作ってます。
上記の様に定義してprintfで出力し一つ一つ確認を行ったところ
dword program_number以降に入るデータが期待する値と違うものが入ってしまいます。
共用体で切った容量と、構造体で切った配列は同じ大きさだと思うのですが・・・何故こんな
事が起こるのかわかりません・・・。
ちなみに dword program_number :16;の部分を
>dword program_number1 :8;
>dword program_number2 :8;
で二つに分けるとprogram_number以降も正しくデータが入りました。
原因が分かる方が居ましたら是非、お願いします。
168:デフォルトの名無しさん
07/09/11 02:41:37
質問です。
char* foo(){
return new char[50];
}
という関数があって、戻り値をdeleteしたいとき、
char* buf=foo();
delete buf;
でよいの? delete[]にできなくて気持ち悪いんだが。
char[] foo(){ とか書けないし。
169:デフォルトの名無しさん
07/09/11 04:32:34
>>168
普通にdelete[] bufと書けばいいのでは?
170:デフォルトの名無しさん
07/09/11 07:24:39
最後Enterを押すまでウィンドウを閉じないようにしたいのですがどうすればいいですか?
171:デフォルトの名無しさん
07/09/11 07:50:08
>>170
止めたいところで getchar();
172:デフォルトの名無しさん
07/09/11 08:05:49
テキストファイルを読み込んで指定した文字が何個含まれるかを出力するプログラム
を作りたいと思いこんな感じで書いてみたんですが、stringで宣言したbufファイル
はstrstrでは使えないみたいで困ってます
他に何かいい方法ありませんか?
int count=0;
string buf;
while(getline(test, buf)) {//読み込んだテキストファイル(test)を1行ずつbufにコピー
if(strstr(buf,"test")!=NULL)//もしbufにtestという文字があれば
count++;
}
out<<cout<<endl;//out.textに何個あったか書き出す
173:デフォルトの名無しさん
07/09/11 08:15:30
C++は知らない俺の案
string buf → char buf[1024]
としてgetlineではなくfgetsを使う。
ただしstrstr(buf,"test")とするといつまでも一個めの"test"に引っかかるので、
char* start;
while(...){
if((start=strstr(buf,"test")) != NULL){
count++;
start++;
//startを"test"の先頭の次、つまり'e'を指すようにして、次回同じ"test"にひっかからないようにする
}
}
などとする
174:173
07/09/11 08:17:23
追加
stringを使うにしても何にしても while の中でもう一個ループ組まないと一行に2回以上"test"があっても1回しか数えてくれないよ
175:173
07/09/11 08:20:43
たびたびすまん
if((start...) != NULL) じゃなくて while((start...) !=NULL) だ。
176:デフォルトの名無しさん
07/09/11 08:23:33
>>172
strstreamとか
strstreambufとかを調べろ
177:デフォルトの名無しさん
07/09/11 08:27:49
>>170
話を端折りすぎ。
何のために?
誰が作ったウィンドウを?
さっぱりわからん。
178:デフォルトの名無しさん
07/09/11 08:34:11
>>172
buf.find("test") != std::string::nposか、
std::strstr(buf.c_str(), "test") != NULL
でも、これだと1行に2個以上あったときにまずくないか?
179:デフォルトの名無しさん
07/09/11 08:52:37
C言語らしく。
まずは、ある文字列が1行に何回出現するのかカウントして返す関数を作るべし。
その後に、1行読んでは、出現回数を積算するループを回すべし。
180:デフォルトの名無しさん
07/09/11 08:53:48
>>173
おいおい、間違いすぎだろ。それから、startを更新しているのに使っていないぞ。
それに、strstr()でマッチしたときにstartはstrlen()分進める方がよくないか?
181:デフォルトの名無しさん
07/09/11 08:58:49
>>171
ありがとうございます。うまくいきました
182:やおい
07/09/11 09:09:19
>>166-167
この問題についても分かる方居ましたら是非お願いします・・・。
183:デフォルトの名無しさん
07/09/11 09:15:37
ビットフィールドの配置なんて処理系依存なんだから、
まずはお前が何のコンパイラを使っているか書かないと始まらない。
184:デフォルトの名無しさん
07/09/11 09:29:07
>>182
フィールド幅が16だから、16ビット境界(2バイト境界)に配置されたと思われ。
pragma packかなにかでスタブ0にしてやれば間が埋まって想定どおりになるかと。
それはさておき、ビットフィールドに於いて、整数型の幅は意味がないので
dwordなんて書かれると却って混乱する。signed/unsignedと書いておくことお勧め。
185:デフォルトの名無しさん
07/09/11 18:36:31
C言語で何かアプリケーションを作成したい時、ソフトは何を使えばいいですか?
GUIの物を作ってみたいのですが。
ちなみにOSはWindowsXPを使っています
186:デフォルトの名無しさん
07/09/11 18:39:25
VC
187:デフォルトの名無しさん
07/09/11 18:54:21
Visual C++というのでいいのでしょうか?
188:デフォルトの名無しさん
07/09/11 18:57:53
VC#
189:デフォルトの名無しさん
07/09/11 18:59:44
>>185
C++ではなく、Cで?
それはまた酔狂だな。
VisualC++なんていらない。
BCCでも、PlatformSDK付属コンパイラでも、何でもいいよ。
190:デフォルトの名無しさん
07/09/11 20:27:52
何でも良いけど強いてというならVisualC++で、コンパイラオプションを設定してCとしてコンパイルすれば良い。
191:デフォルトの名無しさん
07/09/11 21:45:11
VC++6.0なら拡張子を .c にしとけば勝手にCだと思ってくれるよ
2005は知らね
192:デフォルトの名無しさん
07/09/11 22:21:48
2005もだけど
193:デフォルトの名無しさん
07/09/11 23:47:52
ありがとうございます。それを取って使ってみようと思います。
194:やおい
07/09/14 00:03:55
>>183-184
遅くなってすみません。
返信ありがとうございました。
言われた通りpragmaを使って挑戦したいと思います。
ビットフィールドって処理系に依存していたんですね。
その編の事も含めて初めて知りました。
ちなみに使っているのはVisual C++6.0です。
195:デフォルトの名無しさん
07/09/18 01:47:52
ファイルがあって先頭にHEADERがついています
-------
○
○○○
○ ○ ○
以下必要な部分…1万行以上
--------
先頭部分が6行くらいで一定で続いていて
その後の必要な部分はRGB値がこの順番で入っています
この形式のファイルを1000個くらい連続で読み込む必要があるのですが
こういう作業をしたことが無いので、ヒントやどういう風にやればいいのか教えてください。
先頭6行分を飛ばして、あとをfscanf(%f)なんかで読めるといいのですが…
196:デフォルトの名無しさん
07/09/18 01:57:15
>>195
固定長ならfseek()でスキップ、可変長ならfgets()で空読み
197:デフォルトの名無しさん
07/09/18 13:28:35
>>195
ヒント
同じような処理をしているプログラムのソースを見る。
unix系には、画像のファイル形式で、テキストなのがあったと思う。
ていうか、あなたのは、まさに、それなんじゃないか?
ファイルの拡張子なんだい? それで検索すれば見つかると思うぞ。
ちなみに、学校の宿題っぽいな。
198:デフォルトの名無しさん
07/09/18 19:43:59
PPMやBMPならばfgetsでヘッダーを全部とばして、そのあとfreadすればOK.
199:デフォルトの名無しさん
07/09/18 21:13:03
>>198
ハァ?
200:デフォルトの名無しさん
07/09/18 23:32:55
>>199
pbmのtypoだろ。察してやれよ。
# だとしたら、pgmの立場がないけどねw
201:デフォルトの名無しさん
07/09/22 02:07:32
C++のmutableは、どういう時に使うものなのでしょうか?
202:デフォルトの名無しさん
07/09/22 02:10:41
例えばこういうとき。
class MyObject {
mutable int hashcode_cache;
public:
int hashcode() const {
if(hashcode_cache == 0) {
hashcode_cache = なにかすごい複雑な計算;
}
return cached_hashcode;
}
};
203:デフォルトの名無しさん
07/09/22 02:48:03
なるほど。
ありがとうございます。
204:デフォルトの名無しさん
07/09/23 03:51:04
void foo(int *ar){
printf("%d",ar[2]);
}
void main(){
int array[2][2] ={{0,1},{2,3}}
printf("%d",array[0][0]); //a
printf("%d",array[0]); //b
printf("%d",array[2]); //c
foo(&array[0][0]); //d
}
上のaは0が表示、
bはa[0][0]のアドレスが表示され、
cは配列の範囲外参照になる、で合ってますか?
(cのarray[2]でarray[1][0]が表示されたりはしませんよね?)
そしてdですが、やはりこれも範囲外参照、ということになりますか?
どうにかして二次元配列を一次元扱いすることはできませんか?
205:デフォルトの名無しさん
07/09/23 08:24:29
>>204
int * p = & array[0][0];
for (int i = 0; i < sizeof(a); ++i) {
printf("%d\n", p[i]);
}
206:デフォルトの名無しさん
07/09/23 08:42:46
C++でもおkってんならboost::multi_arrayを導入するのを考えてもいいよ
って僕の隣のboost厨がいってます
207:デフォルトの名無しさん
07/09/23 15:42:16
>>205
環境が整い次第、それで試してみます。
二次元配列はそれぞれの列(行?)が連続的に配置されているとは限らない、とどっかに書いてあったので、
それを鵜呑みにしていました……。
ということは>>204のdはarray[1][0]を表すということですよね。
それならなんとかなりそうです。
ありがとうございます。
>>206
C++は今はちょっと……
答えてくださりありがとうございます。
208:デフォルトの名無しさん
07/09/23 16:27:40
>>207
>ということは>>204のdはarray[1][0]を表すということですよね。
いいえ。関数内でアクセスしているのは、array[1][0]ですが。
209:デフォルトの名無しさん
07/09/23 17:21:40
>>207
隙間なく連続しているとは限らないというのは、正しい。
210:デフォルトの名無しさん
07/09/23 18:12:53
>>207
>二次元配列はそれぞれの列(行?)が連続的に配置されているとは限らない、とどっかに書いてあったので、
いいえ、それが二次元配列として定義されたものなら連続しているはずです。
211:デフォルトの名無しさん
07/09/24 15:58:38
#include <stdio.h>
#include <stdlib.h>
void dary(int *ary,size_t n);
void pary(int *ary,int *aryeof);
int main(){
int ary1[100] = {0};
int ary2[10][10] = {0};
int i,j,*temp;
dary(ary1,100);
pary(&ary2[0][0],&ary2[9][9]);
for(i = 0,j = 1; i < 100; i++,j++){
printf("%-3d ",ary1[i]);
if(!(j%10)) putchar('\n');
}
for(temp = &ary2[0][0],j = 1; temp <= &ary2[9][9]; temp++,j++){
printf("%-3d ",*temp);
if(!(j%10)) putchar('\n');
}
return 0;}
void dary(int *ary,size_t n){
int i = 0;
for(i = 0; i < n; i++)
ary[i] = i;}
void pary(int *ary,int *aryeof){
int i = 0;
int *temp;
for(temp = ary,i = 0; temp <= aryeof; temp++,i++)
*temp =i;}
212:デフォルトの名無しさん
07/09/25 22:39:29
超初心者質問ですが「defineできる」とはどういう意味ですか?
defineで定数を宣言するということでしょうか?
213:デフォルトの名無しさん
07/09/25 22:48:24
前後の文脈が分からんとなんとも。
直訳すると「定義することが出来る」か?
214:デフォルトの名無しさん
07/09/26 01:44:40
すみません、これの違いって何ですか?
ポインタかどうか?だけですか?
MyClass my;
my.foo(5);
と、
MyClass* my;
my = new MyClass;
my->foo(5);
delete my;
215:デフォルトの名無しさん
07/09/26 01:49:08
VC6 の SDK で、ボタンを作ってあーだこーだしているのですが、
描画がうまくいきません。マウスを左クリックしたときに
そのメッセージを捕まえて、描画更新すればよいのかと思って
いたのですが、上手くいきません。
WM_LBUTTONDOWNと、WM_LBUTTONUPは取れてます。が、ボタンを押す
と、凹まないし、凹んだと思ったら、他のボタンは凹まないし・・
描画処理が足らないのかと思っているのですが、どこに何を入れれば
いいのでしょう?ちなみにWM_LBUTTONDOWNを受信したときに
InvalidateRectと、UpdateWindowを呼んでみたのですが、何も変わりませんでした。
よろしくおねがいします。
216:デフォルトの名無しさん
07/09/26 02:02:57
>>214
前者はローカル変数としてスタックに確保しているが、
後者はヒープに確保している。
巨大なクラスでないなら前者にするべき。
217:214
07/09/26 02:07:53
>>216
そういうことでしたか。ありがとうございます。
サクっとは前者で、ぐごごご、は後者みたいな感じですね。
これからはサイズや用途などを考えて使い分けるようにします。
218:デフォルトの名無しさん
07/09/26 02:11:52
>>212
文脈がわからんからなんともいえないけど、「defineできる」って、
誰かに言われたの?だとすると、「defineできる」って言わせる何か
(プライスレス)があったわけだと思うわけですよ。
もし、そこに整数や文字列なんかがあった場合、それらはソース
コード上に書くよりdefineできるから、そこらへん修正しちゃってYO
みたいな感じになるのかな?
219:超初心者です
07/09/26 02:13:15
質問があるんですがよろしくお願いします。
C++を使ってヘリコプタのシミュレータを作っています。
今回「compact flight controller」というコントローラを使いたいと考えています。
コントローラで動きを入力するとその動きがシミュレータにも反映されるようにしたいです。
入力した動きを数値化して代入すればいいのかなと思っているのですが、
動きをC++に取り込む方法が分かりません。誰か教えて頂けませんか?
説明がへたくそですごく分かりにくくなってしまいました。申し訳ありません。
220:デフォルトの名無しさん
07/09/26 07:02:17
>>219
質問のポイントが漠然としすぎてる。
まるで、
私の代わりに作ってください
と言っているようなものだ。
221:デフォルトの名無しさん
07/09/26 08:03:39
デバイスドライバと連携をとりたいとかかなあ。
222:デフォルトの名無しさん
07/09/26 08:36:58
>>219
DirectX
223:超初心者です
07/09/26 15:55:37
すいません。漠然としすぎでした。本当に初心者なのでどう質問していいか
分かりませんでした。
ジョイパッドの入力データをC++に取り込む関数みたいなものがあると
聞いたので、もしあるのなら教えていただきたいです。
224:デフォルトの名無しさん
07/09/26 16:11:41
超初心者はプログラムするな
225:デフォルトの名無しさん
07/09/26 16:14:01
あほか
226:デフォルトの名無しさん
07/09/26 16:20:33
DXライブラリ使いなさい
目的の関数はマニュアル見れば一発で見つかるから
227:デフォルトの名無しさん
07/09/26 17:00:31
質問です
cout.precision(17);
cout << .8F + .1F << endl; //Line a
cout << .8 + .1 << endl; //Line b
これを実行すると
0.90000003576278687
0.90000000000000002
と表示されるのですが0.900000000・・・とならないのは
Line aのほうはfloat型、Line bのほうはdouble型でメモリ上に確保されていて
確保していない領域まで表示してしまった結果と考えてよいのでしょうか?
まったく見当違いなことを言っていましたら、どなたかなぜ0.9000・・・・とならないのかご指導お願いできますか?
よろしくお願いします
228:デフォルトの名無しさん
07/09/26 17:25:42
>>227
2進数だから。
229:デフォルトの名無しさん
07/09/26 17:28:31
たとえば、
10進数の0.5は、2進数なら0.10000000000000000・・・・・
では、
10進数の0.9を、2進数で現わすと? 何桁必要なのか。
それを有限の桁数で打ち切って、さらに10進数に変換すると、どうなるのか。
ちょっと自分で計算してみればわかる。
230:デフォルトの名無しさん
07/09/26 18:01:12
>>228
>>229
ありがとうございます
二進数だと0.111001100110011・・・・
って感じで無限に続いてっちゃうんですね
それでサイズに入らない分は切り捨てられると
なんかぜんぜん見当違いなことかいててすみません
勉強になりました
ありがとうございました
231:デフォルトの名無しさん
07/09/26 22:47:40
[1] 授業: 教科書
[2] OS Windows
[3]問題
double data[5] ={10.8,20.3,30,6.40,10.4,2.12}:
配列の全要素の合計と平気を求めるプログラムをポインタを使って作成しなさい
誰か宜しくお願いします
ちなみに初心者です
232:デフォルトの名無しさん
07/09/26 23:10:54
>>231
template <int N> double sum( double (&array)[N] ) {
double result = 0;
for( double* i = array ; i < &array[N] ; ++i) {
result += *i ;
}
return result ;
}
template <int N> double average( double (&array)[N] ) {
return sum(array)/N ;
}
233:デフォルトの名無しさん
07/09/26 23:16:12
double result = 0;
↓
double result(0.0) ;
のほうがいい気がする。
234:774
07/09/27 22:47:40
log10f()はVC6ではどのライブラリに含まれてるんでしょうか?
リンクで未解決になっちゃう。
235:デフォルトの名無しさん
07/09/27 22:56:38
>>234
VC6はC99未対応だから無いんで内科医?
236:デフォルトの名無しさん
07/09/28 01:13:27
未入力のエラーチェックしたいのですが
getsだと簡単なのにscanfだとうまくいかない
getsは非推奨だそうなので出来ればscanfでやりたいのですが
いい方法ありますか?
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4725日前に更新/260 KB
担当:undef