1 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 23:15:45 ] エスケープシーケンスやWin32APIなどの環境依存なものでもOK。 ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.70【環境依存OK】 pc12.2ch.net/test/read.cgi/tech/1258873470/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm codepad.org/ (コンパイルもできるし出力結果も得られるのでお勧め) ◆ソースのインデントについて 半角空白やTABでのインデントはスレに貼ると無くなります。 そのため、アップローダーに上げるのも手ですが直接貼る場合は、 全角空白か に置換すると見栄えだけはよくなります。
231 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 20:58:47 ] stringはデフォでboolに変換できない。 s.c_str()とかやりなされ
232 名前:230 mailto:sage [2010/02/08(月) 21:14:31 ] >>231 s = NULLの時はfalse、s != NULLの時はtrueと教えてもらったのですが
233 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 21:33:46 ] >>232 それは騙されたんだよ。 char* ならそうなるけど、string はそうはならない。
234 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 21:45:34 ] >>232 妄信的に考えるのは良くないよ。それは何を評価してるかわかってるのかなぁ?? stringはクラスで>>230 の使い方だと特にポインタにnewしてるわけでもないので、即インスタンスは確保される。 適当な型変換をクラスの実装による変換で要求するが、 stringは変換機構を実装してないからコンパイラさんが評価できないよ〜。ってエラーを返している。
235 名前:230 mailto:sage [2010/02/08(月) 21:45:55 ] >>233 stringだからダメなんですかね? その時は、if(オブジェクト)はなぜシンタックスエラーにならないの?って質問したんですが
236 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 21:51:23 ] >>235 ifは論理式の評価の後に最終的にはboolを要求する。 boolの基本は、0がfalse、それ以外がtrueなので、 ポインタを評価したときにポインタにNULLが入っていたらNULL==0==false相当なのでそのように動く。 凄い細かい話なんだが。。。
237 名前:230 mailto:sage [2010/02/08(月) 21:53:01 ] >>236 わかりました ありがとうございます
238 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 22:21:43 ] C++テンプレートテクニックスという本に載っていた vtableを自分で実装する方法で非仮想関数を仮想関数のように扱う方法なんですが これって普通に仮想関数を使った場合とどっちが早いんですか?
239 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 22:38:26 ] if(boolean-expression) {} boolean-expression が object だった場合、 コンパイラは次の優先順序で変換を試みる。 1. operator bool() {} 2. operator 数値型() {} 3. operator ポインタ型() {} operator bool() が実装されていない場合、 かつ operator 数値型() が複数実装されている場合は、 曖昧であるためコンパイルエラーとなる。 VC2008EEで確認したら、こんな動作だった。 これは言語仕様で定義されてるのかな?
240 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 22:51:23 ] >>238 実装によるとしか。 大抵ほぼ同じになると思うが。
241 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 23:09:16 ] >>238 最適化うんぬんやらスレッド安全性などを考えても、 vtableを自分で実装なんてしなくていいともうけどね。 だいたい、仮想関数のスピードがネックになる設計なんて 今まで俺はみたことないよ。 80-20の法則ってやつを思い出すしか。
242 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 23:10:36 ] >229 おまいは今 ignore さんの存在意義を否定した。
243 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 23:29:37 ] __FreeList* element = static_cast<Integer::FreeList*>(::operator new (sizeof(Integer))); __freeList_ = element; __for (int i = 1; i < BLOCK_SIZE; ++i) { ____element->next = static_cast<Integer::FreeList*>(::operator new (sizeof(Integer))); ____element = element->next; __} __element->next = 0; これの意味が解りません
244 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 23:30:57 ] どこが分からないの?
245 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 23:44:11 ] >239 もうちょい周辺の記述も有った方が分かりやすそうだけど、とりあえず以下の規定から導かれる動作だと思われ。 > 14882:2003 > 13.3.3p1 >(略) > - the context is an initialization by user-defined conversion (see 8.5, 13.3.1.5, and 13.3.1.6) and the standard > conversion sequence from the return type of F1 to the destination type (i.e., the type of the entity > being initialized) is a better conversion sequence than the standard conversion sequence from the return > type of F2 to the destination type. > > 13.3.3.2p4 > Standard conversion sequences are ordered by their ranks: an Exact Match is a better conversion than a Promotion, > which is a better conversion than a Conversion. Two conversion sequences with the same rank are > indistinguishable unless one of the following rules applies: > - A conversion that is not a conversion of a pointer, or pointer to member, to bool is better than another > conversion that is such a conversion. >(略)
246 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 23:52:36 ] >>244 この辺がよくわかりません。 static_cast<Integer::FreeList*>(::operator new (sizeof(Integer))); 配列を確保してるのですよね?
247 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 00:40:32 ] >>241 vtableの自前実装は、型消去かバイナリ互換が主な理由だと思う。 速度目的は聞いたことないなあ。
248 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 00:55:02 ] 自前vtableっていまいち使い道が不明だと思ってたんだけど、そういうところで使うのね
249 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 01:01:23 ] ああ、自前vtableで速度向上になるって話も思い出した。 どこだか忘れたけど、概要としては非ポリモーフィックに扱う限り 非仮想関数だから最適化されやすいという理屈。 今時のコンパイラなら、仮想関数でも多態的でない状況で使われることを 検出してやるなんて朝飯前だろうから、やっぱり速度目的で自前vtableにする理由はないな。
250 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 01:41:35 ] >>246 ::operator new()というのは、 要求されたメモリを確保して void*として返す関数。 (bad_allocを投げるmalloc()、と考えてよい) したがって、sizeof(Integer)のメモリを確保して それを(void*から)Integer*にキャストしてる。
251 名前:222 mailto:sage [2010/02/09(火) 08:05:12 ] うーん、通信のプログラム難しい・・・。 HttpOpenRequestやHttpSendRequestを使うと思うのですが、どうやればいいのかわからないです。 ブラウザでPukiWikiを開いてソースを見ても、これと同じ事をwininetでやるにはどうすればいいのかさっぱり・・・。 何か良いサンプルはないでしょうか?
252 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 10:25:13 ] そもそもHTTPはわかってるの?
253 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 11:43:02 ] >>252 軽く調べた程度の知識しかないです。
254 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 11:52:52 ] じゃあまずは簡単なCGIを自作して、そいつにPOSTするようなの書いてみては
255 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 12:58:56 ] サブクラスを普通に使いつつ、スーパークラスをインスタンス化を禁止する方法ってありますか?
256 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 13:06:01 ] virtual function-name() = 0
257 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 13:06:21 ] スーパークラスのコンストラクタをprivate/protectedにして実装を書かない って技があったと思う iostreamライブラリでも使われてるってEffectiveC++のどっかに書いてあった
258 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 13:10:25 ] 抽象クラスっていうんでしょうか? ただスーパークラスの関数はすべてvirtualながらも定義していて、 必要に応じてサブクラスで上書きしているので、純粋仮想関数は使えないです スーパークラスのデフォルトコンストラクタをprotectedにしてみました これはアリでしょうか?
259 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 13:12:07 ] >>257 リロードしてなかった・・・ いまその記事発見しました ありがとうございます
260 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 13:30:30 ] >>254 どうもです。 CGI作成の方を調べたら、だいぶ分かってきました。
261 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 13:33:30 ] codepad.org/TMxmPZN4 こういうやり方もあるようだが これは正しい方法なのかな? vc++とcodepadでは期待通りになる
262 名前:257 mailto:sage [2010/02/09(火) 14:08:02 ] むしろそれが普通のやり方だね 257は訂正、protectedにして(コピーコンストラクタや代入演算子を)実装しないってのは インスタンス化は許すけどコピーは出来ないようにする といった要求がある時に使う技だった
263 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 15:08:46 ] std::tr1::unordered_set<Foo> Fooはoperator std::size_tを定義していないとだめだと聞いたんですが これはいったいどんな値を返すべきなんでしょうか?
264 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 17:17:16 ] >>249 vc++ee2008で試したら仮想関数のほうが3倍速かったわ
265 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 17:39:16 ] >>263 たぶんハッシュ値
266 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 18:19:00 ] template <typename T> class Hoo : public T という使い方は可能なのでしょうか? 例えば template <typename T> class ExceptionEX : public T としてテンプレート引数を標準例外とし、任意の標準例外を継承して 通常のメッセージの他に 行番号__LINE__やファイル名__FILE__等の情報を含む汎用的な例外を作りたいと考えています。 最終的には #define divide_by_zero_error() ExceptionEX<std::logic_error>(/*追加情報+0で除算メッセージ*/) こんな形でマクロ定義で楽ができればな、と考えています こういう事は可能なのでしょうか?
267 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 18:26:01 ] CRTPで調べてみるといいかもよ
268 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 18:49:29 ] >>266 できるよ。
269 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 19:08:32 ] 指定したAというフォルダのなかに何が入ってるか 知る方法ってありますか
270 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 19:13:49 ] コンセプトさん早くこないかな
271 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 19:21:03 ] >>265 ありがとうございます
272 名前:デフォルトの名無しさん [2010/02/09(火) 20:00:13 ] 質問です 普段はVC++ 2008 Express Editionで開発しているのですが ふと別のコンパイラでコンパイルしたところ、エラーが出ました エラーの内容は「ここでは宣言は出来ない」という文章で4箇所 47,82,93.96行の場所です どうも構造体のポインタを宣言する事が引っかかっているようです ちなみに、VC++の方ではエラーは検出されませんでした 構造体へのポインタは、サイトをざっと見て試行錯誤しながらやったものなので 何かが間違っているのだろうとは思いますが、どの辺りかがよく分かりません どなたかご指摘お願いします ソースコードです↓ codepad.org/bPyH9hRl
273 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 20:03:29 ] C言語としてコンパイルするなら途中で変数の宣言は出来ない。関数の頭へ移動されればOK
274 名前:デフォルトの名無しさん [2010/02/09(火) 20:09:10 ] >>273 つまりそれぞれの宣言を、関数の一番先頭に持ってくればよいと言う事でしょうか? それはint型などの変数でも同じなのですか?
275 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 20:17:20 ] そうだよ
276 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 20:26:43 ] >>273 ,>>275 順序を変えてみたところ、素直にコンパイルしてくれました こんな些細なことでもエラーが出るとは思いませんでした ありがとうございました
277 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 20:40:17 ] >>276 > こんな些細なことでもエラーが出るとは思いませんでした C/C++ではそんなんしょっちゅうだよ。 ・・・まあコンパイルエラーが出ているウチは楽だよ。 実行時エラーが出ると発狂しそうになる。
278 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 20:54:45 ] >>269 あるよ
279 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 20:55:38 ] オブジェクトの比較は演算子をオーバーロードするのが一般的なのですか?
280 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 20:59:23 ] >>279 うん でも比較用の関数やファンクタを使うこともしばしばある
281 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 21:04:04 ] templeteってジェネリックってことで、おk?
282 名前:296 mailto:sage [2010/02/09(火) 21:06:55 ] >>278 どうすればできますか? また、その方法が紹介されているサイトとかあったら教えてください
283 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 21:09:04 ] >>282 環境別な方法(一般的)と、大抵の環境で出来る方法があるが、どっちがいい?
284 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 21:13:43 ] >>281 まあ表面的にはそう。
285 名前:281 mailto:sage [2010/02/09(火) 21:21:48 ] >>284 thx
286 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 21:24:06 BE:1620859469-2BP(0)] >>282 1. boost::filesystem 2. dirent.h 3. Win32 APIなどの環境別API 4. system("dir > temp"); 5. __asm { 中略 int 1bh }
287 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 23:00:41 ] #include <Hoge>としただけなのに、Hoge* h = new Hoge();とできるクラスには namespaceが設定されていないんですか?
288 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 23:20:01 ] #includeとクラスとnamespaceに何の関係が?
289 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 23:29:29 ] >>288 いまいわからないから、質問しているわけで
290 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 23:33:31 BE:960508984-2BP(0)] #define Hoge foo::HogeImpl namespace foo { class HogeImpl { }; } かもしれん
291 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 23:34:50 ] 基本的に指定しなければグロバールのネームスペースに所属させられる。 明示的にくくってやればおk。
292 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 23:38:41 ] >>289 #include は、そこに書いてある名前のファイル (この場合では Hoge) の内容を、 あたかも直接書いたかのように取り込むだけです 例えばファイル Hoge の中身が class Hoge {}; で、以下のソースコード #include <Hoge> int main(){ Hoge *h = new Hoge(); } をコンパイルした場合、この #include <Hoge> の部分がファイル Hoge の中身に置き換わって class Hoge {}; int main(){ Hoge *h = new Hoge(); } と書いたかのようにコンパイルされます ファイル Hoge に namespace が書いてあればそれは書いてあるように適用されるし、書いてなければ何もなしです
293 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 23:41:15 ] C++では、enum型を==で比較するのはダメなのでしょうか。
294 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 23:41:35 ] 別にダメくない
295 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 23:44:11 ] というか比較しまくる
296 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 23:48:20 BE:720382346-2BP(0)] 他にどうやって比較するのじゃ
297 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 23:49:04 ] 引き算
298 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 23:51:21 ] 多重定義
299 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 23:52:11 BE:480255528-2BP(0)] 2重switch
300 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 23:55:33 ] >>291-292 thx
301 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 00:07:33 ] あのーplacement new[]の使い方がいまいち解りません。 Hoge* h = new Hoge[100];っていうのを placement new[]でやるには、Hogeにどんなnewを定義すればいいでしょうか?
302 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 00:30:29 ] void *p = operator new(sizeof(Hoge)*100); Hoge *h = (Hoge *)(new (p) Hoge[100]); で大丈夫かな? コンパイルは通るはずだけど。 (当然、Hogeにはデフォルトコンストラクタが必要。 デフォルト引数がある引数を持つコンストラクタで可能かは知らない) ていうか、こうすると、 全部の要素に対して個々にデストラクタを呼び出してからメモリを解放するわけだし だったらコンストラクタだって、(placement newを使って)個々に呼び出すだけで良いじゃない、という話になる。 それだったら、引数の制限も無いしね。
303 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 00:32:59 ] placement newって実装に依存するって話を聞いたんだが正確な話ではどうなってんの?
304 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 00:34:48 ] えー? new[]が要素数をどこかに保存しているから実装依存、という話ではなくて?
305 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 00:38:33 ] homepage2.nifty.com/well/Operator.html ここの配置newのところに コンパイラによって動作が異なるという問題があり って書いてあるのが気になって
306 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 00:47:35 ] void *p = ::operator new(sizeof(Hoge)); Hoge *h = new (p) Hoge; // ここで普通にhを使う h->~Hoge(); ::operator delete(h); というコードは、どのコンパイラでも通るし正常に動くと思う。 (例外対応してない点を除けば) 普通のnew演算子とdelete演算子のやっていることを エミュレートしているだけだから。
307 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 01:11:53 ] >>302 それ危ない。領域が足りない可能性が高い。 安全にやる方法は、いまのところ実装に依存する方法(実際に試してみるとか)しかない。 www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#476
308 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 01:59:04 ] int main() { printf("xx"); } returnを書かなくてもエラーにも警告にもならないのですが、 これはC++の仕様なんでしょうか、それとも環境依存なのでしょうか。 VC++2008を使っています。
309 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 02:13:03 ] 仕様
310 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 09:22:17 ] using namespace とテンプレートの特殊化についてですが template<> class hoge<std::string> という特殊化を定義してて 使用者側がusing namespace std;を宣言していて hoge<string>とした場合呼ばれるクラスは汎用のものなのか特殊化された物なのかどちらになるのでしょうか
311 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 09:23:03 ] >>308 ttp://www.open-std.org/jtc1/sc22/wg21/ からたどれる current draft の 58、59頁には If control reaches the end of main without encountering a return statement, the effect is that of executing return 0; とある
312 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 11:52:32 ] クラスのメンバ関数はいつから使用可能なのでしょうか? コンストラクタの初期化子にメンバ関数の返り値をあてることは出来るのでしょうか?
313 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 12:15:13 ] >>312 コンストラクタでメソッドが利用するメンバを初期化してたりしなければ問題ない;
314 名前:デフォルトの名無しさん [2010/02/10(水) 14:02:13 ] Microsoft Visual C++ 2008 Express Edition SP1 のフォームアプリケーションでの質問です。 char配列若しくはwchar_t配列をテキストボックス(this->textBox1->Text)に表示したいのですが 単純に下のように代入しようと char str[256]; this->textBox1->Text = str; すると下のように出てしまいます。 理由: 'char *' から 'System::String ^' へは変換できません。 テキストボックスにchar配列の内容を表示する方法を勉強できるサイトを教えてください。 よろしくお願いします。
315 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 14:15:35 ] >>314 フォームだとC++の範疇じゃない、C++/CLIになる。 this->textBox1->Text = gcnew String(str); とかかな。 とにかく、C++のサイト探しても見つかりにくいよ、C++/CLIで
316 名前:デフォルトの名無しさん [2010/02/10(水) 14:17:43 ] >>315 本当にありがとうございます!! C++/CLIで検索しつつ精進します。
317 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 14:17:56 ] >>312 初期化子でthisを使うのは直接・間接を問わずバグの原因になりうる だから初期化子でthisやメンバ関数を使うのは避けるべき スコープに入ってからならthisやメンバも使っておk
318 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 14:35:09 ] >>313 >>317 大丈夫かも知れないけど変なバグの温床になりやすいと言うことでしょうか ならばstaticなメンバにすれば大丈夫なのでしょうか
319 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 14:48:45 ] 初期化子リストを使う段階ではオブジェクトが構築されてないのでthisが危険 初期化子リストは初期化される順番が決められていないので初期化順に依存するコードは危険 メンバ関数は基本的に構築が正確に済んでいるオブジェクトから呼び出されることを前提にしているから初期化子への代入目的には基本的には使えない staticメンバは問題無いので使っていい
320 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 16:09:31 ] vc2003+MFCのコンソールアプリについてですが、 入力待ち、処理中に閉じるボタンを押された際の処理方法を 教えてもらえないでしょうか。
321 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 18:28:27 ] >初期化子リストは初期化される順番が決められていないので初期化順に依存するコードは危険 メンバの初期化順はメンバ変数が定義された順と決まってるだろう。
322 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 18:30:04 ] あれちゃんと順番に書いてる奴いんの?めんどくさいんだけど
323 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 18:42:19 ] 危険 (キリッ を放置するのが楽しいんじゃないか余計な突っ込み入れるなよぅ
324 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 18:49:19 ] プログラマって性格悪いやつすごく多くね?
325 名前:デフォルトの名無しさん [2010/02/10(水) 18:57:01 ] 以下のプログラムで、shori内のa[][]の値をそっくりメインのdata[][]に渡すにはどうすればいいのかが分かりません。教えてください。グローバル変数にしないとだめですか? void shori() { int a[2][4]; a[1][1] = 10;//などと適当な処理 } int main() { int data[2][4]; shori(); return 0; }
326 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 18:59:31 ] void shori(int a[2][4]) { a[1][1] = 10; } int main() { int data[2][4]; shori(data); return 0; }
327 名前:デフォルトの名無しさん [2010/02/10(水) 21:01:50 ] >>326 解決しました ありがとうございます
328 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 21:24:52 ] #include <iostream> #include <fstream> #include <iterator> void cat(std::istream &s) { std::istreambuf_iterator<char> it = s, end; while(it != end) { std::cout << *it; ++it; } } int main(void) { std::ifstream s("Test.cpp"); cat(s); return 0; } EffectiveC++のサンプルコードではこういう感じでファイル名を渡す形ではなくそのままストリームを渡していました なぜこの形式を使うんでしょうか?ファイル名を渡すのと比べてどんな利点があるんでしょう?
329 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 21:28:29 BE:540287429-2BP(0)] ファイル以外にも使えるようにじゃないか
330 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 21:29:41 ] >>328 ストリームをfstreamからiostreamやstringstreamに置き換えても そのまま動くからじゃね?汎用化というか
331 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 21:37:35 ] Oh! ナルホド!