1 名前:デフォルトの名無しさん [2006/08/22(火) 09:21:31 ] はきだめのスレへようこそ ここは、C/C++に挫折し、それにもかかわらず、C/C++やらなければならない者達がたむろするスレです。 なお、質問する人は回答はあまり期待しないでください。 前スレ:はきだめC/C++下級者の質問箱 pc8.2ch.net/test/read.cgi/tech/1124256027/
24 名前:11 mailto:sage [2006/08/26(土) 18:17:50 ] >>13 バカの一つ覚えでvoidでなく、とりあえずboolやっとけってのがある。それでかも >>15 元ネタがパクリで覚えてない CSVとかのコンマ区切り用で実際使ってます
25 名前:デフォルトの名無しさん mailto:sage [2006/08/26(土) 19:29:13 ] >>20 間違いだらけって、どこが間違い? いや、煽りじゃなくて、純粋に知りたい。
26 名前:デフォルトの名無しさん mailto:sage [2006/08/26(土) 19:57:23 ] >>25 >20じゃないけど気づいた点を列挙。 >>>16 >大体あってます。 そうでもないでしょ。 >Unixの場合は、 >・testセグメント(命令(コード)の領域) これは>19だね。 >・dataセグメント(グローバル変数・static変数の領域) 明示的に初期化される場合のみ。 >・bssセグメント(Block Started by Symbol) 初期化されない静的変数などはこちら。 例えば0で初期化している場合は実装依存と思われ。 >またヒープを使うのは、動的にメモリを取りたいという要求があるからです。 表現が微妙だ。 >グローバル変数やstatic変数では、この要求は満たせません。また、ヒープ >領域はごく限られたサイズしかないため、ヒープを使います。 >23だが「ごく限られた」が相対的だなぁ。 ついでに言えば、自動変数でも動的確保できるんだが。
27 名前:デフォルトの名無しさん mailto:sage [2006/08/26(土) 20:07:04 ] 大体あってるじゃん。
28 名前:26 mailto:sage [2006/08/26(土) 20:14:53 ] そうかなぁ、スタックがワークに使われている理由を理解できていない気がするんだが。 それと、スタックのもう一つの重要な役割も書かれていないし。 #それらは末節だと言うのなら大体あっているってことだろうけどね。
29 名前:デフォルトの名無しさん mailto:sage [2006/08/26(土) 20:22:12 ] >>28 > そうかなぁ、スタックがワークに使われている理由を理解できていない気がするんだが。 その理由とは? > それと、スタックのもう一つの重要な役割も書かれていないし。 その役割とは?
30 名前:デフォルトの名無しさん mailto:sage [2006/08/26(土) 20:33:54 ] 再帰 関数の戻り先の保存
31 名前:デフォルトの名無しさん mailto:sage [2006/08/26(土) 20:37:36 ] >>30 「〜などのいわゆるワーク」って書いてるじゃん。 明記してないから、理解してないということ?
32 名前:デフォルトの名無しさん mailto:sage [2006/08/26(土) 21:42:27 ] >>16 メモリ領域は環境によっていろいろ変わるから、それで完全に 正しいかどうかは判別できない。でも一般的な区分として そういう領域があるというのは正しい。以下は一般的な話。 プログラム領域にロードされるのはソースじゃなくてコンパイルされた マシンコードね。 ヒープを使うのは、他のやつらが不適切なとき。 静的領域を使うと、プログラム起動中はずっとメモリを握ったままになるので 大きな領域で、必要な場合と不要な場合が分かれるようなときは効率が悪い。 スタックを使えば要らなくなったときにすぐ解放できるけど、解放の順序が 必ず確保と逆順じゃないといけない。あとはサイズに制限がある環境がほとんど。
33 名前:デフォルトの名無しさん mailto:sage [2006/08/26(土) 22:48:50 ] つまり、大体あってるってことじゃん。
34 名前:デフォルトの名無しさん mailto:sage [2006/08/28(月) 16:56:19 ] 「大体」の基じゅ(ry
35 名前:デフォルトの名無しさん mailto:sage [2006/08/28(月) 17:00:19 ] 0 点じゃないってことじゃないの?
36 名前:デフォルトの名無しさん mailto:sage [2006/08/28(月) 19:35:32 ] 3点満点で1点てところだね どうにも割り切れない
37 名前:16 mailto:sage [2006/08/29(火) 16:49:19 ] 色々議論になってしまってすみません。 メモリ領域の分類については、 現時点の自分のレベルで理解する分には 差し支えないと思いました。 malloc(ヒープ)の利用については、以下のように解釈しました。 処理中で扱う配列データの個数が不定な場合に、 その時々に応じて臨機応変に配列を用意したい。 そのためにmallocで動的に配列用のメモリを確保する。 →メモリ節約技の1つ なるべく理解してから書こうと思ったので、 レスが遅れました。すみませんでした。 ご回答頂いた>>18 、>>26 、>>32 さん、 その他皆様ありがとう御座います。
38 名前:デフォルトの名無しさん mailto:sage [2006/09/01(金) 03:32:13 ] builder使ってます。 ファイルを一行ずつ読んで、printfで出力したいんですが、 「メモリが"written"できませんでした」っていうエラーになります。 配列とかポインタとか良くわかってないので、その辺がおかしいんだと思います。 また、下記の場合読み込むファイルが3行だけになってるんですが、 行数が決まってないときのlist[num]を動的に処理する方法も どうしたらいいのがわかりません。よろしくお願いします。 #include <stdio.h> #include <fstream> #include <iostream> #include <iomanip> int main() { std::ifstream fin("hoge.txt"); if(!fin){ printf("エラー"); return -1; } const int num = 3; char* list[num]; for(int i=0; i<num; i++){ fin >> list[i]; } for(int j=0; j<num; j++){ printf("%s\n",list[j]); } fin.close(); return 0; }
39 名前:デフォルトの名無しさん mailto:sage [2006/09/01(金) 05:02:26 ] char *list[num]は、ポインタの配列だが、配列の中身(=各ポインタの値)は不定。 C99とGCC以外では、配列の大きさは「定数」として、コンパイル時に決まってなければいけない。 あらかじめわからない場合は動的に確保する。(何も考えずにvectorを使うのも可)
40 名前:デフォルトの名無しさん mailto:sage [2006/09/01(金) 07:48:28 ] >>39 アドバイスありがとうございます。 vector使って書いてみました。 vectorとstringで、文字数と行数が動的できたと思うんですが、 これで大丈夫でしょうか?ちょっと心配です。 int main() { std::ifstream fin("hoge.txt"); if(!fin){ printf("エラー"); return -1; } std::vector<std::string> list; std::string s; while(!fin.eof()){ getline(fin,s); list.push_back(s); } for(int j=0; j<list.size(); j++){ printf("%s\n",list[j]); } fin.close(); return 0; }
41 名前:デフォルトの名無しさん mailto:sage [2006/09/01(金) 08:46:05 ] listという名前のvector...
42 名前:デフォルトの名無しさん mailto:sage [2006/09/01(金) 09:25:52 ] 「大丈夫でしょうか?」って・・・実行はしてみたの?
43 名前:デフォルトの名無しさん mailto:sage [2006/09/01(金) 09:46:35 ] そりゃ一応動くらしきもの書いて、期待の動きはしてるようだが はたして重大なバグが潜んでいないか心配なので添削お願いできますか ということだろ。なんでみんなギスギスしてんの?
44 名前:デフォルトの名無しさん mailto:sage [2006/09/01(金) 10:53:29 ] はきだめだから
45 名前:デフォルトの名無しさん mailto:sage [2006/09/01(金) 11:16:17 ] だよな
46 名前:デフォルトの名無しさん mailto:sage [2006/09/01(金) 18:55:48 ] まあとりあえず ・while (!fin.eof()) {} というやり方は大抵望み通りの動作にはならない ・printfにstringをそのまま渡しても大抵望みどおりの動作にはならない とだけ
47 名前:デフォルトの名無しさん mailto:sage [2006/09/01(金) 21:39:21 ] これで十分だろう。 while (getline(fin, s)) { list.push_back(s); }
48 名前:デフォルトの名無しさん mailto:sage [2006/09/01(金) 22:41:15 ] >>46 c_str()無いですね。 正常に動いてたっぽいんですが、違うソース 貼り付けてしまったのかもしれません。 while (!fin.eof()) {} は良くないですか。 奥が深いです。 難しいので今後の課題にさせてください。 >>47 ありがとうございます。 while (getline(fin, s))というのもできるんですね。 こちらに変えてみます。
49 名前:デフォルトの名無しさん mailto:sage [2006/09/01(金) 23:19:17 ] while (!feof()) 系のやり方の駄目具合は、 最終行に改行だけの行(空行)がないファイルや 最後に改行がないファイルを扱ってみるとわかる。 なぜそうなるかは、feof()の仕組みを考えながら動きを追ってみるとよい。 もちろん、fin.eof()でも同じ。
50 名前:デフォルトの名無しさん mailto:sage [2006/09/01(金) 23:29:51 ] Cのfeof()が立つのは、ファイルを読んだ後。 ~~~~~~~~~~~~~~~~~~~~~~ BASICとは違うのです。
51 名前:デフォルトの名無しさん mailto:sage [2006/09/02(土) 00:13:19 ] クララが立つのはいつ?
52 名前:デフォルトの名無しさん mailto:sage [2006/09/02(土) 00:27:24 ] においのいい草を食わせた後
53 名前:デフォルトの名無しさん mailto:sage [2006/09/03(日) 01:29:21 ] >>49 >>50 詳しくありがとうございます。 こういうのって、経験して覚えていくんでしょうか。 覚えることがいっぱいあって大変です。
54 名前:デフォルトの名無しさん mailto:sage [2006/09/04(月) 05:53:30 ] すごい簡単なことなんですが、ifの条件ってintだと、 0はfalseでそれ以外はtrueっていうことでよかったでしょうか。 -10~10までやってみました。 自分で関数作るときに-1をfalseにしてたんですが、 ほかの人がみたら変に思われますか? #include <stdio.h> for(int i = -10; i<10 ; i++){ if(i){ printf("%dはtrue\n",i); }else{ printf("%dはfalse\n",i); } }
55 名前:デフォルトの名無しさん mailto:sage [2006/09/04(月) 05:59:34 ] 確認画面見ようと思ったら 書き込まれてしまいました。 コード、段落とかint main()とか抜けててすみません。
56 名前:デフォルトの名無しさん mailto:sage [2006/09/04(月) 06:09:48 ] >>54 > すごい簡単なことなんですが、ifの条件ってintだと、 > 0はfalseでそれ以外はtrueっていうことでよかったでしょうか。 良い。 > 自分で関数作るときに-1をfalseにしてたんですが、 > ほかの人がみたら変に思われますか? 非負値を返す関数のエラーとして負値を返す事はある。 getchar の EOF とか。 真偽値しか返さない場合は、偽の場合 0 を返すのが当然。 真の方に関しては、何を返すかは case by case だが、 普通は 1 を返したのでいい。 is 系関数とか、真の時 1 以外の値も返す実装の場合もあるけど、 これは高速化の為にそうしてるだけ。 まあどちらにしろ、非 0 を返すのが当然。 C++ なら普通は bool 型にして true/false を返すけど。
57 名前:デフォルトの名無しさん mailto:sage [2006/09/04(月) 06:29:01 ] さっそく、お返事ありがとうございます。 勉強始めたばかりなんですが、本でエラーのとき return -1っていうのがあったような気がして、 -1にしてたんですが、if文書いてて「あれ」っと思いました。 いろんな種類のエラーを返す複数のエラー処理を してたのも知れません。 0が偽で1が真ですか。了解しました。
58 名前:デフォルトの名無しさん mailto:sage [2006/09/04(月) 09:44:59 ] >57 「エラーを返す」と「偽を返す」の違いを考えてみよう
59 名前:デフォルトの名無しさん mailto:sage [2006/09/04(月) 21:24:03 ] エラーの内容が複数ある場合は、 0 を正常として、他の値をエラーとするね。
60 名前:デフォルトの名無しさん mailto:sage [2006/09/04(月) 21:31:23 ] 俺は0をエラー、1を正常にして、エラー番号をポインタでもらった引数に入れる。
61 名前:デフォルトの名無しさん mailto:sage [2006/09/04(月) 21:41:19 ] そういう実装も見るね。
62 名前:デフォルトの名無しさん mailto:sage [2006/09/04(月) 23:23:19 ] UNIX系で 0=OK、 1、2、3、4=エラーって見かける
63 名前:デフォルトの名無しさん mailto:sage [2006/09/04(月) 23:28:30 ] DirectX も D3D_OK(0) が正常で他がエラーとか。
64 名前:デフォルトの名無しさん [2006/09/04(月) 23:30:30 ] 質問です。 std::vector<std::vector<int> > array; とある場合、clearをする場合は array.clear(); を呼ぶだけでメモリは解放されるのですか? それともループでまわしながら解放しなければいけませんか?
65 名前:デフォルトの名無しさん mailto:sage [2006/09/04(月) 23:37:51 ] >>64 array.clear() でいいよ。ループは要らない。
66 名前:64 [2006/09/04(月) 23:54:11 ] >65 どうもありがとうございます。 助かりました。
67 名前:デフォルトの名無しさん [2006/09/05(火) 00:04:00 ] ちょっとクラスについて質問です。 入門用の本とかを見ると、C++のクラスは Javaで言うJavaBeansみたいな使い方ばかり書いてあるけど、 関数の塊のようなクラスは、普通作らないものなのでしょうか? 単純にヘッダをインクルードして関数を呼び出すものなのか、 それとも関数群をクラスにして、そこから呼び出したほうがいいのか。 悩んでおります。
68 名前:デフォルトの名無しさん mailto:sage [2006/09/05(火) 00:09:48 ] >>67 クラスにするメリットがあるなら、そうすればいい。 Java とか関係無しに、それだけの話じゃないのか?
69 名前:67 mailto:sage [2006/09/05(火) 00:24:16 ] >>68 オブジェクト指向って言うから、オブジェクト的にしなきゃ いけないのかなぁ、と思いまして。 好きにすりゃいい、ってことなんでしょうけど。 特にメリットもなく、関数全部クラスにしたようなプログラムは クソソース扱いなんだろうかと思うと、夜も寝られません。
70 名前:デフォルトの名無しさん mailto:sage [2006/09/05(火) 00:34:30 ] >>69 何のメリットも無いのに複雑度を上げるソースは糞ソースに違いない。
71 名前:デフォルトの名無しさん mailto:sage [2006/09/05(火) 00:40:54 ] > 関数の塊のようなクラス 俺からすれば、これはJavaが普通の関数を持てない(全てクラス内に入れないといけない)から、 仕方なくやっているという風にしか見えない。
72 名前:67 mailto:sage [2006/09/05(火) 00:46:56 ] >>69 確かにそうッスね。 ライブラリとして、クラスにしてまとめるのも変? >>71 あ、僕も最初はそう思ってたけど、だんだん麻痺して、 最初にクラスありきな頭になってたかも。
73 名前:デフォルトの名無しさん mailto:sage [2006/09/05(火) 00:54:51 ] その関数群が共通となるデータを持たないのなら、クラスにする必要ないでしょ。 まぁ、共通のデータ構造を持っているならネームスペースに放り込んじゃえばいいしね。
74 名前:デフォルトの名無しさん mailto:sage [2006/09/05(火) 08:13:31 ] あるフォルダのどんどん増えていく複数のテキストファイルを圧縮するって いうアプリを作りたいのですが質問です。 複数のテキストファイルを選択して、zipなどで圧縮するというのは できると思うんですが、新しく増えたテキストファイルを圧縮ファイルと 一緒にする方法を悩んでいます。 私の頭では、下記のような手順しかできそうにありません。 @圧縮したファイルをフォルダに解凍 A新しいファイルをそのフォルダにコピー Bまとめて圧縮 ただ、この方法だと圧縮された容量の大きいファイルを 毎回、解凍、圧縮することになります。 それで、下記のようなようなことをしたいんですが アドバイスをお願いできないでしょうか。 新しいファイルを圧縮して、それを圧縮ファイルに追加で 書き込むっていうことができれば、負担が少なくて良いかと 思っているんですがどうなんでしょうか。 また、圧縮ファイル内でもファイル名で区切れば、 全部解凍しないでも、そのファイル名での区間を 読み取って解凍すれば部分的に取り出すことができると思います。 えっと、圧縮するときも解凍するときも毎回丸々全部を 計算しないで、加えるところだけ圧縮、 読みたいところだけ解凍って言うことがしたいです。
75 名前:デフォルトの名無しさん mailto:sage [2006/09/05(火) 08:16:28 ] >>74 やりたいことはわかった。あとは、何をやったらどんな問題が出たのかも書いてほしい。
76 名前:デフォルトの名無しさん mailto:sage [2006/09/05(火) 08:18:11 ] >>74 使ってる圧縮フォーマットは何? ライブラリ使って操作してるんなら、どのライブラリ?
77 名前:デフォルトの名無しさん mailto:sage [2006/09/05(火) 08:25:14 ] >>75 それはもう書いてあるだろ。
78 名前:デフォルトの名無しさん mailto:sage [2006/09/05(火) 08:38:15 ] >>75 >>76 すみません。実はこれから作ろうと思ってます。 ろくに調べないで質問してしまい 申し訳ございません。当方、初心者なのでこういうことが 実現可能かどうかわからず、それが知りたいということでした。 確かに、何が聞きたいのかわからない文章でした。 実現できそうということで、ひとつずつ調べて 書いてみます。 わからないことがあったら、また よろしくお願いします。 時間掛かりそうですが、できたらコード書きます。 ありがとうございました。
79 名前:デフォルトの名無しさん mailto:sage [2006/09/05(火) 08:45:23 ] 共通アーカイブライブラリに行ってみたらどうだろう。
80 名前:デフォルトの名無しさん mailto:sage [2006/09/05(火) 10:02:02 ] >77 m9プ
81 名前:デフォルトの名無しさん mailto:sage [2006/09/06(水) 11:37:38 ] 少なくとも、自前実装であれば、実現はできるだろう。 何かのライブラリ使うなら、マニュアルを百万回繰り返して読んでみてくれ。 俺なら、>>79 の方法をとるが…。(でも、ZIPだけシェアウェアだったような希ガス…。) うろ覚えですまんが、lzhだったら、全体のヘッダの後に、個数分の(ファイルごとのヘッダ+圧縮データ)が並んでるだけ。 だから、最後に単純にデータ付加すりゃヨロシ。 zipは知らないので、今、仕様を斜め読みしてみたが、最初のヘッダがなくて、個数分の(ファイルごとのヘッダ+圧縮データ)が並んで、 なんか、最後に変なデータ(ディレクトリツリーのデータ?)がついてるみたい。 (バイナリエディタで、zipファイルを覗いてみても、最後のあたりに、ファイル名のデータが入ってるね。) まあ、それでも、たいした大きさじゃないので、どこかにデータ退避させれば、簡単にデータ付加できるだろ。
82 名前:デフォルトの名無しさん [2006/09/07(木) 14:53:42 ] ファイルの読み込みの仕方を教えてください PGM形式の画像を読み込みたいんですが、コメント行の読み飛ばしなどがよくわかりません。 どうやって読み込んだらいいのでしょうか?
83 名前:デフォルトの名無しさん mailto:sage [2006/09/07(木) 15:01:05 ] >>82 つ[libpnm]
84 名前:デフォルトの名無しさん [2006/09/08(金) 06:22:28 ] C++の資格って何かありますか?
85 名前:デフォルトの名無しさん mailto:sage [2006/09/08(金) 07:46:02 ] >>82 pngじゃないのかよワロス テキスト形式の画像フォーマットなんだ。おもしろい。 読み込み専用でいいなら、Susieのプラグインもあるみたいだね。 コメント行の最初は#になってるんだね。(改行は\n限定(\r\n不可)で。) じゃ、最初1バイト読んで、分岐させて、次の行に逝けばいいじゃん。 ファイルから読んでるのか、メモリから読んでるのか、 また、テキスト読み込みには、何のクラス・関数使ってるのか分からんので、 これ以上は答えられない。 >>84 基本情報技術者・ソフトウェア開発技術者は持ってるので、 別の資格が欲しいってこと?
86 名前:デフォルトの名無しさん [2006/09/08(金) 08:55:19 ] >>85 基本情報は取ったんだけど何とろうか迷ってる さすがに今更サーティファイのCやJAVAなんて受ける気になれないしさ
87 名前:デフォルトの名無しさん [2006/09/08(金) 09:14:14 ] 資格より職務経歴
88 名前:デフォルトの名無しさん mailto:sage [2006/09/08(金) 11:27:15 ] コールバックについて質問です。 手元の本3冊にも全く書いてないのですが どのように書けばよいのでしょうか。 コールバック関数は普通の関数みたいなんですが、 呼び出す側の関数がどのように書くものなのかわかりませんでした。 下記は、pro2の引数がおかしいっていうエラーがでますが 呼び出した関数が実行されて、次にコールバック関数が実行、 "hello2hello"と出力されることを期待して書きました。 ネットで関数のポインタを渡すと呼ばれるって解説があったので、 ただ、priを引数に入れただけです。 これを動くようにしたいんですが、よろしくお願いします。 簡単に説明しているページなども歓迎です。 #include<stdio.h> int pri(){ char* str = "hello"; printf("%s",str); return 1; } int pri2(pri){ char* str = "hello2"; printf("%s",str); return 1; } int main() { pri2(pri); return 1; }
89 名前:デフォルトの名無しさん mailto:sage [2006/09/08(金) 11:35:19 ] >>88 www.google.co.jp/search?q=%e9%96%a2%e6%95%b0%e3%83%9d%e3%82%a4%e3%83%b3%e3%82%bf
90 名前:デフォルトの名無しさん mailto:sage [2006/09/08(金) 13:09:32 ] >>89 関数ポインタで、ぐぐれば良かったですか。 見てみます。 ありがとうございました!
91 名前:デフォルトの名無しさん mailto:sage [2006/09/08(金) 15:17:37 ] お世話になっております。 関数ポインタのページいくと、コールバック関数について 触れているページもありました。 自分で作った関数を引数にして渡せるAPI関数(なかのコードがわからないブラックボックスの) なんか見かけるんですが、ちゃんとその関数は、返り血の型、引数の型と個数が 定義されていて関数の中でポインタで呼び出されてるんですね。 ただ単に、引数にコールバック関数の名前だけを入れると 実行されるわけでは無いんですね。 普通に考えてもそんな意味のわからないルール作らないですよね。 見かけてもいきなり関数名だけ、引数に入れているので今まで 意味がわかりませんでした。 と思ったのですが、こういう解釈でよかったでしょうか。
92 名前:デフォルトの名無しさん mailto:sage [2006/09/08(金) 18:34:13 ] >>91 解釈と感想がごっちゃになっててよくわからん。 きっと君自身ごっちゃになっているのだろうね。 先ずは、他人にきちんと説明できるように整理してみたら?
93 名前:デフォルトの名無しさん mailto:sage [2006/09/09(土) 14:09:42 ] 環境 OS:windows2000 コンパイラ:Borland C++ プログラム中においてフォルダを作成して その中にデータファイルの保存をしたいんですけど、 どうやればいいんですか?
94 名前:デフォルトの名無しさん mailto:sage [2006/09/09(土) 15:06:52 ] つ[mkdir()]
95 名前:93 mailto:sage [2006/09/09(土) 17:31:20 ] >>94 #include<windows.h> int main(void) { system("md test"); return 0; } これで実現することができました。 ただこれだとフォルダ名が固定になってしまいます。 そこでフォルダ名を決めれるようにするにはどうしたらよいのでしょうか?
96 名前:デフォルトの名無しさん mailto:sage [2006/09/09(土) 18:26:21 ] >>95 mkdir()は使わんの? どちらにしろユーザーから入力された文字列を渡せばいいじゃない。 めっちゃ基本中の基本だけど。
97 名前:デフォルトの名無しさん mailto:sage [2006/09/09(土) 18:31:00 ] >>95 つ[sprintf()] つ[boost::format()] つ[_mkdir()] つ[CreateDirectory()] つーか、調べるってことはできんもんかね。
98 名前:デフォルトの名無しさん mailto:sage [2006/09/09(土) 21:32:04 ] systemなんて恐ろしい関数をよく使う気に
99 名前:デフォルトの名無しさん mailto:sage [2006/09/10(日) 14:20:44 ] まあ確かに普通はあまり使わんかな。 外で何されてもわかんないもんなー。
100 名前:デフォルトの名無しさん mailto:sage [2006/09/10(日) 20:58:47 ] 現在ポインタ及びリスト構造の学習中で tagData * EraseNext(tagData *p); こういう文を見かけたのですが、どういう意味かわかりません tagdata * の”*”はどういう意味でしょうか?
101 名前:デフォルトの名無しさん mailto:sage [2006/09/10(日) 21:18:35 ] >>100 仮引数と同じ、tagDataへのポインタ。としか言いようがない。
102 名前:デフォルトの名無しさん mailto:sage [2006/09/11(月) 10:12:05 ] ポインタの学習中でその質問はないだろー
103 名前:デフォルトの名無しさん mailto:sage [2006/09/11(月) 10:33:44 ] ×学習中 ○たった今学習を始めたところ
104 名前:デフォルトの名無しさん mailto:sage [2006/09/11(月) 15:33:01 ] たとえば、(tagData* p)と、(tagData *p)を別物と思ってるとか。
105 名前:デフォルトの名無しさん mailto:sage [2006/09/11(月) 17:51:29 ] 初心者以前のレベルの質問なのでこちらにきました。 telnetのクライアントの送受信の並列処理(マルチスレッド)について質問です。 telnetクライアント並列処理(親スレッドは受信、子スレッドは送信)を 実装することは、どういうことができるようになることなのでしょうか? 受信と送信のスレッドが起動していて、受信も送信もどちらでもできて、 単純な"送信→受信"だけじゃなくて、 「接続が確立したらいきなり"受信だけ"とか"受信→送信"というのもできる」ように なることをいうのでしょうか? サーバーの場合は、親スレッドがアクセプトして、 子スレッドを作って処理をさせることによって、 「複数のクライアントを相手することができる」というのは勉強しました。 よろしくお願いします。
106 名前:デフォルトの名無しさん mailto:sage [2006/09/11(月) 18:14:08 ] >>105 送信が連続している状況でも安定して受信できる。 telnetのプロトコルはチャットほど単純じゃないから敢えてそうすることもあるんでないかな?
107 名前:デフォルトの名無しさん mailto:sage [2006/09/11(月) 21:15:07 ] >>106 ありがとうございます。 >送信が連続している状況でも安定して受信できる。 スレッドがたくさん作られるということでしょうか? スレッドだとちょっと複雑で自分的に難しいので、マルチプロセスで考えさせてください。 以下かなり省略した物になりますがコードです。 if(pid>0){ //親プロセス while(1){ //受信処理 } //シグナル送信、プロセス終了の処理 } else if(pid=fork()){ //子プロセス while(1){ //入力と送信処理 } //シグナル送信、プロセス終了の処理 } サーバーの場合、たくさんのプロセスが作られることになると思いますが、 上記のコードの場合は、親と子2つしかプロセスが作られないことになりますでしょうか? アプリケーションを起動すると"標準入力から送信"、"受信"この2つのプロセスが起動して同時にできるだけ。 送信を連続でした場合、受信は並列ではなく、送信した命令の順番どおり受信することになるでしょうか? 長文すみません。変なところあると思いますので ご指摘ください。補足させていただきます。 よろしくお願いします。
108 名前:デフォルトの名無しさん mailto:sage [2006/09/12(火) 01:46:54 ] >スレッドがたくさん作られるということでしょうか? いいえ。 >上記のコードの場合は、親と子2つしかプロセスが作られないことになりますでしょうか? はい。 >送信を連続でした場合、受信は並列ではなく、送信した命令の順番どおり受信することになるでしょうか? サーバの御心次第です。 telnetプロトコルもそうだが、例えば標準入出力をみても必ずしも対になっていないことに注意。
109 名前:デフォルトの名無しさん mailto:sage [2006/09/12(火) 08:23:15 ] >>108 ずばりの回答ありがとうございます。 すっきりできました。
110 名前:デフォルトの名無しさん mailto:sage [2006/09/22(金) 03:42:09 ] pthread_createで複数スレッドを作ったときの プロセス内のスレッドの数が知りたいんですが方法 ありますでしょうか。 よろしくお願いします。
111 名前:デフォルトの名無しさん mailto:sage [2006/09/24(日) 01:24:23 ] linuxのfork+execについて質問です。 下記のコードは10回繰り返し、execvを繰り返して、 プロセスが生成できなかったときは、もう一度繰り返したいため 失敗したときに、i--;してます。 ・このコードでエラーのときの処理できているか確認したいのですが、 プロセス生成をわざと失敗するようにすることできるでしょうか? ・i--で繰り返しの処理はできてるでしょうか? for(i=0;i<10;i++){ //子プロセスの生成 if((pid=fork())==0){ execv(path,opt); }else if(pid>0){ //親プロセス }else{ //子プロセス生成失敗の時はiを一つ減らして繰り返し i--; } }
112 名前:デフォルトの名無しさん mailto:sage [2006/09/24(日) 03:10:28 ] >>111 実験してみたいだけならこんなマクロでも用意すればよろしかろ。 #define myFork(x) (fgetc(stdin) != (x) ? fork() : -1) #んで、fork()の代わりにmyFork('\n')とでもすればいい。
113 名前:デフォルトの名無しさん mailto:sage [2006/09/24(日) 07:36:29 ] >>112 関数のマクロ定義ってこういうふうに使えるんですね。 はじめてみました。 ど初心者なので感動しました。 どうやって勉強していけば、こういう感覚が身につくんだろう。。。
114 名前:デフォルトの名無しさん mailto:sage [2006/09/24(日) 20:28:57 ] 「勉強」しているうちは無理。
115 名前:デフォルトの名無しさん mailto:sage [2006/09/25(月) 09:28:13 ] 君は勉強をやめたの?
116 名前:デフォルトの名無しさん mailto:sage [2006/09/26(火) 00:58:06 ] >>115 やってることは同じでも「勉強」だと認識してやってるようなうちは芽が出ないってこと。
117 名前:デフォルトの名無しさん mailto:sage [2006/09/26(火) 09:10:23 ] なにその理屈w
118 名前:デフォルトの名無しさん mailto:sage [2006/09/26(火) 12:04:37 ] 勉強をやめてしまうことこそ芽がしぼむだろ普通に考えて。
119 名前:デフォルトの名無しさん mailto:sage [2006/09/26(火) 12:09:54 ] 日々是勉強
120 名前:デフォルトの名無しさん mailto:sage [2006/09/28(木) 10:52:48 ] ファイルの排他制御をしたいのですが、open()関数を使って、 ファイルディスクリプタをflockの引数に入れてロックする方法はできました。 ディスクリプタではなくて、ストリームを使って排他モードで開きたいと思ってます。 コードです。 #include <fstream> int main(){ using namespace std; ifstream fin; fin.open("filepath",ios::in, filebuf::sh_none); return 0; } こんなエラーが出ます。 error: `sh_none' is not a member of `std::filebuf' tp://www.codeguru.com/forum/printthread.php?t=293846 こういうページが見つかったので、filebuf.sh_noneにしてみましたが だめでした。 買ったばかりのlinuxのパソコン壊れて、現在の環境はcygwinです。 ・filebuf::sh_noneはどのようにすればよいでしょうか。 ・排他制御は、他にスマートで簡単な方法ありますでしょうか。 よろしくお願いします。
121 名前:デフォルトの名無しさん mailto:sage [2006/09/28(木) 11:49:22 ] filebuf.sh_noneなんて非標準だから使えないのは別に悪く無い。 正攻法ではファイルディスクプリタで読み書きするバッファクラスを自分で作れということになるのだが、まあ面倒。
122 名前:デフォルトの名無しさん mailto:sage [2006/09/28(木) 14:42:23 ] >>121 お返事ありがとうございます。 >filebuf.sh_noneなんて非標準だから使えないのは別に悪く無い。 非標準とかそういうこともあるんですか。知りませんでした。 tp://www.kumei.ne.jp/c_lang/cpp/cpp_38.htm 有名そうなページでもfilebufってでてきたので、エラーがでるのは、 自分の書き方が変だと思いこんでました。 いろいろ検索してみると、ifstreamで排他モードはできない と書いてある掲示板の書き込みもありました。 windowsだとライブラリあるんですが、linuxだとそういうの 簡単にできるの無いっぽいです。 boostもちょっと見てみたんですが良くわからないし、 自分のスキル的にopen+flockじゃないとだめのようです。
123 名前:デフォルトの名無しさん mailto:sage [2006/09/28(木) 15:04:29 ] 実はflock()は完全ではない罠。
124 名前:デフォルトの名無しさん mailto:sage [2006/09/29(金) 00:01:02 ] >>123 flock調べたんですが、どういうところが完全じゃないんでしょうか? cじゃなくてperlのページなんですが、自分でファイルのある無しの 関数作るよりも、flock使うほうがいいってあったんですが。 検索していたらこういうページを発見しました。 tp://www.tietew.jp/cppll/archive/4753 [io]fstream <=> fd こういうことできるってことしか読み取れませんでしたが、 1、[io]fstream で開く、 2、[io]fstream => fdでディスクリプタ取得 3、flockでロック 4、[io]fstreamで操作 っていうことができないでしょうか。 ストリームとディスクリプタがどんなものかわかって無いので、 並行して操作できるのかどうかわかりませんが。 4番目の操作が、ストリームで操作できないと、 はじめからディスクリプタで開くしかないですよね。 読んでもわからないので、とりあえずやってみるしか無いでしょうか。