- 1 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 20:07:56 ]
- スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。
過去ログ スレを勃てるまでもないC/C++の質問はここで pc11.2ch.net/test/read.cgi/tech/1167476845/ スレを勃てるまでもないC/C++の質問はここで 2 pc11.2ch.net/test/read.cgi/tech/1178503366/
- 82 名前:67 mailto:sage [2007/09/05(水) 08:31:06 ]
- >>69-70
ありがとうございます。 これはエグい機能ですね。 どうりで今まで使いみちが理解できなかったわけです。 これを使うべき場面というのはあるのでしょうか。
- 83 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 09:11:26 ]
- >>71
C++に不慣れなうちは、delete this するようなクラスを作るのは、やめたほうがいいと思う。 なぜなら、delete this は、どうしてもそれが必要な特別な場合だけに限定すべきだから。 どうして、自分自身を破棄するようなメンバ関数が必要なの? もっと適切で良い方法を教えられるかも。
- 84 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 10:45:08 ]
- >>82
メンバ関数ポインタ でぐぐると使用例がいくつかヒットするかもしれない。 まぁでも滅多に使うもんじゃない。
- 85 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 11:21:37 ]
- 直接メンバへのポインタには触れないけど、
mem_fun(やboost::bind)の中で使っているんだろうなとは思う。
- 86 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 22:29:14 ]
- >>83はもしかしからデストラクタを呼びたいのかも。
- 87 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 22:30:20 ]
- >>83じゃねえや>>71だな。
- 88 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 13:10:16 ]
- 関数の引数で、
読み取りのみで変更を行わないものは、 void hoge(const Type& o) ; void hoge(const Type* p) ; どう使い分けるべきなのでしょうか。
- 89 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 13:19:56 ]
- 常に前者。
ただし、配列の要素を指すポインタを受け取るのであれば、 要素数を示す引数を追加した上で、ポインタを使う。 しかし、イテレータで済むならそっちを使う。
- 90 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 15:59:14 ]
- なぜポインタではなく参照を使うのでしょうか。
- 91 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん [2007/09/08(土) 16:58:52 ]
- C++で色々なプログラムを作りそのときの考え方を示し
実際にどのようにして作るのか解説してくれる本はありませんか?
- 93 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 17:25:48 ]
- 88です。
ポインタの安全ではない部分を解決するために、C++で参照が導入されたのだから、 参照を使ったほうがいい、ということですね。
- 94 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 00:30:37 ]
- >>91
NULLで参照がエラーになるのはNULLだからじゃなくて型が違うからだろ。
- 95 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 01:14:54 ]
- >>94
>>91はそういう話をしている。何も間違ってない。
- 96 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 01:46:04 ]
- >>95
>>91の書き方はからは読み取れない。 補足も意味不明。
- 97 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 01:51:34 ]
- 日本語でおk
- 98 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 01:55:28 ]
- >>97
日本語じゃなくてC++が分かってないんだろ。
- 99 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 02:00:32 ]
- 何や此奴俺初めて書き込んだのに
- 100 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 02:03:39 ]
- 91の言いたいことはわかるが、
説明がいまいちだったな。
- 101 名前:デフォルトの名無しさん [2007/09/09(日) 02:23:37 ]
- 94の言いたいことはわからないし、
人としていまいちだったな。
- 102 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 02:29:00 ]
- >>91 のポインタだと常にNULLチェックが必要ってのも素人くさいな。
- 103 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 02:32:35 ]
- >>102
まぁその辺は宗教入って来る話な気もするし、無しにしようや。
- 104 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 02:32:52 ]
- >>91
補足は、hoge(p); でなくて、hoge(*p); だよな。 hoge(p);とhoge(NULL); なら、どっちも参照ならエラーだし、ポインタならエラーにならないし。
- 105 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 02:45:13 ]
- >>103
宗教って言うと「常にNULLチェックする」ほうにも理があるみたいじゃん。
- 106 名前:デフォルトの名無しさん [2007/09/09(日) 04:51:23 ]
- 今BCCを使ってC言語の勉強をしていますが何かアプリケーションを作製したいときってどんなソフトがいりますか?
- 107 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 04:52:58 ]
- >>106
VisualC++
- 108 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 04:54:27 ]
- >>107 ありがとうございます!
- 109 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 07:18:46 ]
- >>106
107は、あなたをからかっている。 BCCでもアプリケーションは作れるが、 便利で強力な道具を使えば手間が省けるというもの。 どのようなアプリケーションを作りたいの?
- 110 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 07:44:59 ]
- >>109 メーラーです。複雑な機能は抜きとしてメールサーバーからメールを取ってくるというものです
- 111 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 07:58:30 ]
- GUIとCUIどっち?
- 112 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 08:02:49 ]
- GUIです。最低限の機能としてメール受信送信それと閲覧ができれば。
- 113 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 08:21:34 ]
- じゃぁ、C++Builder
- 114 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 09:35:15 ]
- >>112
何故作りたいの? 一発で巧く動くものが作れればいいけどそうでなければメールサーバに迷惑を掛けることにもなりかねないし、 何より便利なメールソフトが腐るほどあるのに。
- 115 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 09:37:33 ]
- >メールサーバに迷惑を掛けることにもなりかねない
ここには同意だが、なぜそんなにもやってみようという気持ちをくじくようなことを言うのか。
- 116 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 09:57:01 ]
- どうせやるなら、そこらに無いものを作ろうよ。
- 117 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 09:57:54 ]
- >>114
言語の話とはズレるけど、メールサーバを自分で立てるという発想は無いのか?
- 118 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 10:05:25 ]
- >>105
ある。 例えばバグの早期発見と原因分析に役立つ。
- 119 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 10:34:43 ]
- NULLポインタに何か意味があるならともかく、
そうでないなら、 NULLチェックなんてするとバグを見落とすことになる。 デバッグ中は、 NULLチェックせずに例外で落ちたほうがマシだと思うよ。
- 120 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 10:53:18 ]
- >>119
そういうのを含めてNULLチェックというんでないの? NULLに対し何らかの処理が必要という意味で
- 121 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 10:56:34 ]
- >>104
Type* p = NULL; のあとに*pとかやったら関数とか関係なく落ちるだろ…それもコンパイル時には分からん品
- 122 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 11:20:55 ]
- >>120
ふつ〜NULLチェックといったら、 NULLでないことを確認してからポインタの指す先を触り、NULLの場合はエラーとしてfalseを返す だろう。 正しくエラー処理していて堅牢に見えるけど、かえって、バグを抱えたまま、それらしく動いたりするのよ。
- 123 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 11:25:27 ]
- >>119
例外で落ちるってWindowsのメモリアクセス違反例外のこと? さておき。 単にセグメンテーションフォルトされたら、 落ちた位置とか原因とか分かり辛くなるじゃん。 現象が再現するとも限らないし、 テスト環境に開発環境があるとも限らないし。 異常発生後も動くのが嫌ならNULLチェックで 例外投げるなりexit()するようにしたら良いよ。 少なくともログ出せない落ち方よりログ出せる落ち方のが良いと思う。 そいえば。 Linuxとかでcore吐いてたら、まだコールスタックやら拾えるかなぁ。 VCとかにもそういうのあるの?
- 124 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 11:52:27 ]
- >>123
Windows限定ではないけど、いまどきのリッチな環境向けのOSなら、 NULLポインタの指す先にアクセスしたら、OSが待ったをかけてくれると思う。 メモリ保護がないハードとかは・・・別の話にしてほしい。 Windowsローカルの話だと、Dr.ワトソンというログ記録ツールが、OS標準搭載されてる。 メモリアクセス違反をやらかした場所のコードを逆アセンブルし、レジスタとスタックの状態を テキストファイルで保存してくれる。設定でプロセスのメモリイメージのダンプも可能。 下手にハンドルして貴重な情報をログに残さず捨ててしまうくらいなら、これを使ったほうがいい。 まぁ普通は、開発環境が入っているPCでテストしている最中に問題を見つけるし、 逆に言うと、その段階で問題を見つけられるようにテストすべきだから、 メモリアクセス違反をやらかしたらデバッガをアタッチすることになるかと。 自分は使うに至ったことないけど、リモートデバッグもできるとのこと。 これなら、リモートデバッグ用のエージェントだけをターゲットマシンに インストールすればいいので軽い。
- 125 名前:124 mailto:sage [2007/09/09(日) 12:04:27 ]
- 捕捉
逆アセンブルされたコードを見ても、C/C++のソースの該当箇所がわからないとダメなので、 コンパイルするときに、ソースコード付きでリスティングファイルを出力 リンクするときに、mapファイルを出力 んでもって、これらを生成されたバイナリとセットでしっかり管理する。
- 126 名前:デフォルトの名無しさん [2007/09/09(日) 12:44:44 ]
- データへのポインタpDataを取得する関数が、
こんな感じで定義されているのですが、 long GetData( void*& pData ) 「*」と「&」が並んでいるところのわけがわかりません。 void*& pDataのところは「*」がpDataのポインタをさしていて、 「&」はその参照を受け取る、というようなことなんでしょうか。 自分の持っている初心者向けの参考書には「参照には*をつける必要はない」と 書いているのですが…。
- 127 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 12:57:45 ]
- int &x
bool &y void* &pData
- 128 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 14:32:38 ]
- "voidポインタ"型の参照 と思え
それがよくわかるように>>127みたいに書くのを俺はすすめる (int* a, b; ってできないから困るが。)
- 130 名前:デフォルトの名無しさん [2007/09/09(日) 14:55:46 ]
- 質問です。
stl::listやstl::queueなどを複数のスレッドから操作 (push_back()やpop_front()など)する場合ミューテックスで ロックする必要があるのでしょうか? それとも元からスレッドセーフになっているのでしょうか?
- 131 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 15:38:10 ]
- VC++の場合はロックする必要がある
msdn2.microsoft.com/en-us/library/c9ceah3b(VS.80).aspx gccの場合もロックする必要がある gcc.gnu.org/onlinedocs/libstdc++/faq/index.html#5_6 他の実装でもたぶんロックする必要がある あと stl:: っていう名前空間はないと思うが
- 132 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 16:30:35 ]
- >>130
もしWindowsなら、Mutexよりも、CriticalSectionを使おう。 念のため言っとくけど、 STLのコンテナのメンバ関数を1つ呼び出す直前・直後でロックするのはダメよ。 iteratorやコンテナ内のオブジェクトへのポインタの有効期間を考えて、適切な範囲でロックすべし。
- 133 名前:デフォルトの名無しさん [2007/09/09(日) 17:01:58 ]
- >>131
>>132 ありがとうございます。参考になりました。(英語はあんまり読めないけど。) コンテナのメンバ関数内で勝手にロックされるわけではないのですね。 >>131 std::の間違いでした。
- 134 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 19:49:57 ]
- >>114 何故?といわれましても別に仕事でもなく学校の課題でもないのですが個人的に作りたいと思いまして・・・
サーバーに関しては知り合いの許可をもらいやるので大丈夫です
- 135 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 19:59:33 ]
- テスト用のメールサーバくらい、VMwareとかVirtualPCとか使って、Linuxで適当に立てればいいじゃん。
通信するプログラムの場合、自分側だけでなく、相手側もデバッグモードにしたり、ログをチェックしたりするよ?
- 136 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 20:09:18 ]
- >>135 ありがとうございます。ちょと調べてみます。
- 137 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 20:13:29 ]
- パケットモニタも用意しよう。
暗闇を照らすものは多ければ多いほどいい。
- 138 名前:デフォルトの名無しさん [2007/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 名前:デフォルトの名無しさん [2007/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 名前:デフォルトの名無しさん [2007/09/09(日) 22:00:34 ]
- コピペ?
- 141 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 22:03:03 ]
- すいません
聞く場所を間違えたのでここにコピペしました
- 142 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 22:11:19 ]
- >>121
だから>>91が意味わからんって言ってるんじゃないの。 「補足」どの部分の何を補足してるつもりなのか、意味がわからん。
- 143 名前:140 [2007/09/09(日) 22:17:53 ]
- >>141
すまそんとりあえず分かる範囲で… listen関数の第2引数は待ち受けの数を表し、 複数のクライアントからの接続要求を待つようです。
- 144 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 22:32:27 ]
- >>143
このプログラムでは待ちうけ数が5であるということは 接続要求が1つ来たらコードのlisten以下に処理が移るということですよね? このときの待ち受け数は4でこのプロセスはwhile内部の処理を行う そして、closeしたら待ち受け数が5になる 以下接続要求が来るごとにそれぞれのプロセスがlisten以下をcloseされるまで 実行するということですか? かなり日本語がおかしくて申し訳ないです
- 145 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 22:42:01 ]
- 違う。
listenは5つ分の接続要求を貯めるキューを作ってポートを開くだけ。 acceptで実際に接続が来るまで待ち、接続が来たらacceptから下にいく。 クライアントにHELLOを送って、接続を閉じて、またacceptで次の接続を待つ。
- 146 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 22:47:06 ]
- 待ち受け数とかプロセスとか妙な言葉を使ってるけど、別に複数のプロセスが立ち上がるわけでもないし、同時並行的に5つの接続を捌けるわけでもない。
listenに指定する5っていうのは、プログラムの処理が追いつかなくてクライアントをどんどんacceptするのが追いつかないときに、OSが裏で5つまで接続要求を貯めておけるだけ。 6つめが来るとクライアントは接続拒否される。
- 147 名前:140 [2007/09/09(日) 22:47:45 ]
- ソケットは扱った事が余り無いのでなんとも言えませんが
その通りだと思います。 また、複数の接続要求(この場合だと5以下)が来た時は、 待ち行列に置かれアクセプト待ちに 越えると無視されるようです。 つ UNIXネットワークプログラミング入門 雪田修一 著 買ったは良いが今日まで読む機会が無かったありがとう…orz
- 148 名前:144 mailto:sage [2007/09/09(日) 22:54:48 ]
- >>145
>>146 並列的に処理をするものとばかり・・・ 実際は処理を行っているのは1つだけであとはためておくんですね listenで停止する(待つ)のではなくてacceptで停止して接続を待つんですね
- 149 名前:144 mailto:sage [2007/09/09(日) 22:59:27 ]
- あともうひとつ聞きたんですがlen = sizeof(client)という処理を行っているんですけど
この時点でclientには代入などが行われていないのでこのような処理を行うことは 出来ないと思うのですが?
- 150 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 23:08:02 ]
- 代入してなくても、その変数のサイズ (つまり sockaddr_in 構造体のサイズ) くらいはわかる
- 151 名前:144 mailto:sage [2007/09/09(日) 23:09:28 ]
- >>150
ああそういえば・・・ 色々答えていたただいてありがとうございました
- 152 名前:140 [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 00:04:13 ]
- おやすみ。
明日からは ネットワークプログラミング相談室 Port20 pc11.2ch.net/test/read.cgi/tech/1186418855 へどうぞ。
- 154 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 00:11:46 ]
- (struct tm)* now;
と書いてもキャストだと思わず「struct tm型」のポインタだと思ってくれるコンパイラない?
- 155 名前:デフォルトの名無しさん [2007/09/10(月) 17:26:31 ]
- 今度、就職するときにC,C++を勉強しなくてはいけないのですが
オススメの教習本ってありますか?
- 156 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 17:46:15 ]
- Boostのドキュメント
- 157 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 18:19:54 ]
- >>155
参考書スレがあるから、そっちを読んだほうがいい。 とりあえず自分からアドバイスできるのは、 ・文法だけ理解しても、使いこなすことはできない ・世の中、良書もあれば、ろくでもない本もある。とくに後者の罠は引っかかりやすい。 ってこと。 文法を解説する本だけでなく、 使いこなし方を解説する本も読もう。 C++の使いこなし入門としては、 Effective C++ Effective STL この2冊をお勧めする。 本の値段は安くないが、値段の10倍の価値はある。 少なくとも自力で悟りを開くよりは、遥かに近道だ。
- 158 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 22:00:27 ]
- 質問です。実行中のプログラムにコマンドラインから設定を渡すにはどうすればよいでしょうか?
これは、実行中のプログラムがコマンドラインを監視するのではなく、 2重起動時にパラメータだけ渡されるようなイメージです。 お願いします。
- 159 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 22:09:32 ]
- 先に起動した方は何かの通信手段でデータを受信できるように待機しておいて、
後に起動した方はその通信手段でコマンドライン情報を送信する。
- 160 名前:158 mailto:sage [2007/09/10(月) 22:12:35 ]
- >>159
共有メモリ/Socket以外の方法で可能なら、それを教えてください。 へたれですいません。お願いします。
- 161 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 22:16:50 ]
- なぜ共有メモリやらソケットがイヤなのかその理由を書かないと、何か提案しても、やっぱりそれもイヤとか言われる予感。
あと、ANSIの範囲外の話は、OSの種類を書いてください。
- 162 名前:158 mailto:sage [2007/09/10(月) 22:23:09 ]
- >>161
上記以外の方法で、より簡単な方法があればそれで行きたいからです。 規格はANSIで。Winだったらメッセージ使うんですが。 それと、上記の方法がいやな理由は以下の通り。 ・共有メモリ -> 保守/拡張がめんどい ・ソケット -> プログラム規模が大きくなるからめんどい よろしくお願いします。
- 163 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 22:26:45 ]
- ANSI ではプロセス間通信の方法は fopen で同じファイルを読み書きする以外にありません。 終わり。
- 164 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 22:31:25 ]
- ちなみに共有メモリもソケットも ANSI には無いものですから 残念
- 165 名前:158 mailto:sage [2007/09/10(月) 22:44:57 ]
- >>163, 164
ANSIではファイル以外にはないですが・・・どうもです! 共有メモリってANSIではないのですね。勉強になります。 ソケットはそうですね。OS依存で言語使用ではないですね。仰るとおり。 ご丁寧にどうも!
- 166 名前:やおい [2007/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 名前:やおい mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 02:41:37 ]
- 質問です。
char* foo(){ return new char[50]; } という関数があって、戻り値をdeleteしたいとき、 char* buf=foo(); delete buf; でよいの? delete[]にできなくて気持ち悪いんだが。 char[] foo(){ とか書けないし。
- 169 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 04:32:34 ]
- >>168
普通にdelete[] bufと書けばいいのでは?
- 170 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 07:24:39 ]
- 最後Enterを押すまでウィンドウを閉じないようにしたいのですがどうすればいいですか?
- 171 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 07:50:08 ]
- >>170
止めたいところで getchar();
- 172 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/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 mailto:sage [2007/09/11(火) 08:17:23 ]
- 追加
stringを使うにしても何にしても while の中でもう一個ループ組まないと一行に2回以上"test"があっても1回しか数えてくれないよ
- 175 名前:173 mailto:sage [2007/09/11(火) 08:20:43 ]
- たびたびすまん
if((start...) != NULL) じゃなくて while((start...) !=NULL) だ。
- 176 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 08:23:33 ]
- >>172
strstreamとか strstreambufとかを調べろ
- 177 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 08:27:49 ]
- >>170
話を端折りすぎ。 何のために? 誰が作ったウィンドウを? さっぱりわからん。
- 178 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 08:34:11 ]
- >>172
buf.find("test") != std::string::nposか、 std::strstr(buf.c_str(), "test") != NULL でも、これだと1行に2個以上あったときにまずくないか?
- 179 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 08:52:37 ]
- C言語らしく。
まずは、ある文字列が1行に何回出現するのかカウントして返す関数を作るべし。 その後に、1行読んでは、出現回数を積算するループを回すべし。
- 180 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 08:53:48 ]
- >>173
おいおい、間違いすぎだろ。それから、startを更新しているのに使っていないぞ。 それに、strstr()でマッチしたときにstartはstrlen()分進める方がよくないか?
- 181 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 08:58:49 ]
- >>171
ありがとうございます。うまくいきました
- 182 名前:やおい mailto:sage [2007/09/11(火) 09:09:19 ]
- >>166-167
この問題についても分かる方居ましたら是非お願いします・・・。
|

|