1 名前:デフォルトの名無しさん [2010/03/05(金) 16:51:13 ] エスケープシーケンスやWin32APIなどの環境依存なものでもOK。 ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.71【環境依存OK】 pc12.2ch.net/test/read.cgi/tech/1264774545/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm codepad.org/ (コンパイルもできるし出力結果も得られるのでお勧め) ◆ソースのインデントについて 半角空白やTABでのインデントはスレに貼ると無くなります。 そのため、アップローダーに上げるのも手ですが直接貼る場合は、 全角空白か に置換すると見栄えだけはよくなります。
549 名前:デフォルトの名無しさん mailto:sage [2010/04/29(木) 22:25:26 ] 正しく間違えられた場合と、例外的な状態の違い ・・・って、言葉がまんま過ぎてそろそろゲシュタルト崩壊しそうな人もいるかも試練
550 名前:デフォルトの名無しさん mailto:sage [2010/04/29(木) 22:39:37 ] とある要素数10の配列を表す処理について、例えば外から11番目の値をくれとお願いをした時、 「私は0〜9の要素を持つ配列だ。私に対して11番目を欲しいという要求は、 私にとってはあってはならない異常な要求だ」 として例外を投げるかもしれない。 でも、3番目の要素が例えばNULLだったとしても、「私はただの配列だ。その内容までは関知しない」 から、そのまま返す。 そして受け取った側にとって、NULLが戻る事が、例えば進行上異常だったとしても、 配列にとっては異常な訳じゃない。 だから、彼はそのまま返すし、進行上、それでは問題があるなら、 受け取った側が何か対策するか、あるいはこの配列処理そのもののスタンスを変えてしまえばいい。 例外と、何かを表す値の関係ってこんな感じじゃね? …今更かもしれないけども
551 名前:デフォルトの名無しさん mailto:sage [2010/04/29(木) 22:41:48 ] vectorのatですねわかります
552 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 04:53:30 ] #include <stdio.h> int main(void){ int i, j; for(i=1; i<=5; i++){ for(j=1; j==i; j++){ printf("*"); } printf("\n"); } return 0; } ↑どこが間違っていますか? 実行結果を * ** *** **** ***** にしたいのですが。
553 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 05:23:04 ] × j==i ○ j<=i
554 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 05:25:38 ] >>553 ありがとうございました
555 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 05:34:02 ] 余計な老婆心だが、 ループカウンタは1.for内で宣言 2.0から開始 を癖にしたほうがいい。 1.は変数のスコープはなるべく狭いほうがいいのと、 2.はC配列のインデックスが0から開始のため。 int main() { for (int i = 0; i < 5; i++) { for (int j = 0; j < i; j++) { printf("*"); } printf("\n"); } return 0; }
556 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 05:36:40 ] >>555 ごめんなさい。入門書を読んでいて、そんなことが出来るなんて知りませんでした。 これからはそうやって書こうと思います。
557 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 05:38:17 ] 556ですが、 1.の意味は、forのなかで宣言するようにすると、forの中だけでiが有効になるから 節約できるって事ですか?
558 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 05:42:32 ] あと、何度もすいません、 test.c:2: error: 'for' loop initial declaration used outside C99 mode test.c:3: error: 'for' loop initial declaration used outside C99 mode ってエラーがでてコンパイルできなくなりました…
559 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 05:47:09 ] >>558 は事故解決しました
560 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 06:29:28 ] 関数が長くなったり、処理が複雑になってきたときに int i; /* i を外で宣言したら */ for (i = 0... i = 5; /* ループカウンタ以外で i を使ったりすると管理が面倒 */ string::iterator i; /* 同じ識別子を宣言できない */ とかの状況を回避する。 要するにコードの保守性を上げるため。 グローバル変数多用しない、とかも同じ理由。
561 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 06:53:02 ] >>560 つまりコードの上のほうでループ用にiつかって、 おそらくそのデータはそのループのカウント用にしか使わないなと思ったら 次の場所でiを再び使うこともある、そのブロック内で宣言しておけばOKってことですか?(最初に宣言してるとだめ?)
562 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 09:39:00 ] >>561 ちょっと解釈は変かな。 本来、関数内で違う目的に同じ名前の変数を使うのは設計が悪い。 但し、ループ制御変数みたいに同じ*ような*目的に一々違う名前を使う習慣がない場合もある。 そんなとき、次のループで前のループ制御変数をそのまま使うと問題がある*かもしれない*し、ループだけ移動するかもしれない。 だったら有効範囲を限定してしまえば宣言を遠くまで探しに行かなくて済むし、影響を心配することもなくなるということ。 但し、古いCではブロックの途中での宣言ができないことと問題のfor文内での宣言ができないことに注意。 -- void func(int a) { int b = a; // ブロックの先頭なので問題なし if (a == 0) return; int c = a; // ブロックの先頭ではなくif文の後なので古いCではエラー { int d = a; // ここはブロックの先頭なので問題なし for (int i = 0; i < a; ++i) { // for文内での宣言は古いCではエラー int e = a; // ここもブロックの先頭なので問題なし } for (d = 0; d < a; ++d) ; // これは当然、問題なし } -- >>560 グローバル変数を極力使用しないのは、有効範囲を限定する目的以外にも名前を公開しないと言う目的もあることに注意。
563 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 15:09:02 ] 横から質問失礼 グローバル変数をやむなく使うというのは例えばどういう状況でしょうか 自分は結構頻繁に使ってましたorz
564 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 15:54:23 ] >>563 やむなく使う状況が分からない、なぜならグローバル変数を使ったことがないから、なら筋が通るんだけど 頻繁に今使ってるのであれば、それを極力減らすように努力してみてはいかがか
565 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 16:01:47 ] >>563 グローバル変数を使うと何が便利だと思う? その裏返しで、便利さ故の厄介な目に遭いたくないから使いたくないのよ。
566 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 16:14:30 ] それはグローバル変数のデメリットなわけで、やむなく使う状況の説明になっていません
567 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 16:16:17 ] あと、微妙な問題だけど、 1.for内で宣言 これコンパイルとおらない環境あるから。。 for(int i...){} for(int i...){} とやるとiの多重宣言だといわれるのがVC6
568 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 16:26:14 ] >>567 今更そんな過渡期のコンパイラなんて無視していいでしょ。 今後サポートされているOSではVC6自体がサポートされないのだから。 >>566 已む無く使う状況は、その状況になれば判ります。 逆に言えば、そうならない限り無視して構いません。
569 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 16:33:38 ] 学校の環境がそれであることが十分ありうることは宿題スレを見てると実感できるよ。 あと、業務でも出会う可能性もあって、VC6でビルドできないとリリースさせてもらえない現場があった。 まあ、捨てちゃいなよ、とは思うんだけどさ。。
570 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 17:29:43 ] >>567 YOU! #define for if (false); else for しちゃいなYO!
571 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 19:54:37 ] 563です。亀レス失礼 自分は趣味の域なんで大きいサイズを扱わないからってのが グローバルの怖さがわからない一番大きな要因だと思います とりあえず今後は減らす方向で色々やってくことにします >>564 世間一般的にはグローバルは「やむなく」使うのかなと 自分はやむなくと言うより結構頻繁に使ってたもので ややこしい文面で申し訳ない いずれにせよ勉強あるのみってことで
572 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 20:12:41 ] おまえみたいなやつは一番信用ならんので, プログラマにならないでください
573 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 20:14:56 ] >>570 上を説得する気もなかったのでそれやらないまま任務遂行したYO!
574 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 20:17:45 ] >>571 ああ、なるほど。 自分が神様ですべてを把握できているのなら、グローバル祭りでも特に困らないままだよ。 というのは、複数人が触る、または他人のコードをメンテするときに困ることが多いから。
575 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 20:28:48 ] グローバル変数のよくない理由はみんな分かってるし、それでも メリットを見出して使うんだから、基本的にはどんどん使っていい 2chとかの頭でっかちは、グローバル変数ときいただけでとにかくダメって わめくけど、気にする必要はない。そういう奴に限って、10個も20個も引数のある 関数作って、グローバル変数使ってないからって理由でドヤ顔だったりする
576 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 20:43:00 ] とにかくグローバル変数はダメだろ。
577 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 20:46:14 ] 異なる翻訳単位におけるローカルでない静的オブジェクトの 初期化の順番は不定である。 っていうことは皆さん 分かっていて話をしているの? それともこのスレの半分くらいは まさかこれを知らないで話をしているわけではないよね?
578 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 20:46:43 ] >>572 苦労したんだね(´;ω;`)ブワッ
579 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 20:49:49 ] >>577 とりあえず >>575 あたりは知らないまま自信満々になってると思うw
580 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 20:51:53 ] >>575 限ってといっても大半の人がグローバル否定派なんだから、その例は極端すぎ
581 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 20:54:32 ] 引数10個も20個もいるような内容ならクラスなり構造体使うだろjk >>575 は何を言っているんだ。頭悪いのか
582 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 20:56:15 ] 本当にグローバル変数は使ったことがない。 (引数が8個以上の関数も定義したことがない) どうしても必要な場合のみSingletonパターンか 関数ローカルなstatic変数を返すようにしてる。
583 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 21:02:02 ] シングルトンパターンが確立している以上、グローバルはまったく使わないな。
584 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 21:08:23 ] どうせ,571はクラス設計より,動かすことを優先してつくってる. 趣味レベルであるにもかかわらず, そこをバランスよく出来ないあたり,センスがかけている. さらにそれが仕事になったとき, 締め切りにおわれて痛いコードを量産することは目に見えてる.
585 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 21:13:09 ] 屈折した思い込みや妄想はその辺で。 思い込み激しいとデバッグ能力下がるぞ
586 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 21:36:29 ] >>575 > 10個も20個も引数のある > 関数作って、グローバル変数使ってないからって > 理由でドヤ顔だったりする どういうシチュエーションなのか全く伝わらないのに PCの向こうでドヤ顔してそうな気がするのは俺だけではあるまい。
587 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 21:37:34 ] >>582 それは大袈裟だろ。 俺だってこのウン年で使った事ないけど、 初心者の頃は使った事あるよ。 グローバル変数を人生で一度も使わないC/C++プログラマは 居ないだろ。
588 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 21:43:17 ] >>587 そりゃ人生単位で括れば使ったことはあるさ。 厳密には「現在も活用したり保守したり、あるいはテストや学習目的を含めて、少なくとも手元に残してるコードの中では」 使ったことがないと言えばいいか?w
589 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 22:30:13 ] なんか知らんがここが【初心者歓迎】ではないことだけは良く分かったw
590 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 22:33:19 ] 初心者歓迎だからこそ、「グローバルを基本的にはどんどん使っていい」なんてことは言ってはいけないだろうにと言いたいんだろうよ。
591 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 22:38:21 ] プログラムすんなとかセンスがないとかそれを初心者に言ってどーすんだって キモイ発言が目立つんだけど
592 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 23:10:01 ] 一部が目立つのなんて2ちゃんじゃ良くある事 でもそれがイコールで全体の意見なんて事は無いだろ
593 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 23:21:05 ] そう言うのはどこにでもいる そう言うのはどこでも基本スルー
594 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 23:21:05 ] 画面の向こうの敵に負け・厭気を植え付けられん程度の機知で中途半端に批判するくらいなら 黙ってろ
595 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 23:52:15 ] test(kakikomi());
596 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 00:26:57 ] たしかにそーだね ベテラン同士で無知だどうだと殺り合うのはいいが 素人狙い撃ちするキモイのがいるなってことが言いたかった ま、スルーだね
597 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 00:40:59 ] ベテラン同士で無知だどうだとやりあうニアイコール罵り合うのは不毛 素人狙い撃ちするキモイのがいるのは同意
598 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 01:52:13 ] VC++ 2008 Express edition で timeGetTime() を使おうと思って とりあえずmmsystem.hをインクルードした以下のようなコードを書きました。 #include <mmsystem.h> using namespace std; int main() { } これをコンパイルしただけで大量のコンパイルエラーが出ます。 1>C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\mmsystem.h(103) : error C2146: 構文エラー : ';' が、識別子 'MMVERSION' の前に必要です。 1>C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\mmsystem.h(103) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません ・・・・・・ 何か根本的に設定が不足しているのでしょうか?
599 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 01:56:10 ] >>598 #include<windows.h> にすればいいと思うよ
600 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 01:56:15 ] #include <windows.h> #include <mmsystem.h> ググったらすぐ出てきたぞ。
601 名前:598 mailto:sage [2010/05/01(土) 02:00:59 ] >>599 >>600 ありがとうございます! mmsystem.hはwindows.hが必要なのに内部でincludeしていない。 でも>>600 みたいに実際に使うところで一緒に書くと上手くいく。 これはどういうことなのでしょうか?
602 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 02:03:37 ] >>601 windows.h をインクルードすればいいようにできている mmsystem.h みたいなのは直接使っちゃダメ
603 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 06:36:51 ] forの中に(ループ変数以外に)変数を用意する場合、最初に一度初期化したい場合はforの外側に書いてやるしかないですか? できればforの中だけに出てくるようにしたいんですが
604 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 06:57:48 ] { /* スコープを限定したいなら、ブロックで囲んで */ /* 普通にループの外(ブロック内)で定義してやるのが定石かな */ std::vector<int> v(100, 100); for (std::vector<int>::iterator i = v.begin(), last = v.end(); i != last; ++i) { *i *= 2; } }
605 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 06:58:17 ] for(int i=0,tagprm=reinterpret_cast<int>(&PRM(0,0));i<N;++i){ PRM &prm = &reinterpret_cast<PRM*>(tagprm);
606 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 07:16:06 ] >>605 邪悪なコードを吹き込むなw というかいろいろ間違いすぎ
607 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 11:51:06 ] #include <stdio.h> int main(void){ char *str ="Hello"; printf("%s", str); return 0; } これでなんでHelloが出てくるのか分りません strはポインタですよね? アドレスが入るんですよね? じゃあ*strとしないと中身は出てこないんじゃないでしょうか?
608 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 11:58:14 ] %sが必要とするのは文字列の先頭を指すポインタ
609 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 12:01:57 ] *strで出てくるのは'H'だよ
610 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 12:14:23 ] >>607 そのコードをもっと分かり易く(分かり難く?)書くとこんな感じ const char hello[] = { 'H', 'e', 'l', 'l', 'o', '\0' }; const char *str = hello; printf("%s", str); str は char型の配列の先頭アドレスを保持してるだけ
611 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 12:15:45 ] つまり最後のstrは配列名ってことですか? だとしたら先頭の文字が格納されたアドレスが出てくるのではないかと思うのですが… %sというのはそれを文字に変換する機能があるって事なんでしょうか。
612 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 12:17:42 ] *strで取り出していくのはprintfの中の仕事だから
613 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 12:18:39 ] printfの中の人が%sが来たらこの値は文字列の先頭アドレスだなって勝手に解釈して処理を分岐してくれるんだよ
614 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 12:19:58 ] C言語での文字列ってのはただの配列 関数内部で配列の中身読んでるだけ
615 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 12:21:13 ] なるほど、ありがとうございます 文字列の時だけはそういうものだと覚えてしまう事にします
616 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 14:25:58 ] 配列とかポインタとかじゃなくて >%sというのはそれを文字に変換する機能があるって事なんでしょうか。 これが聞きたかっただけじゃないの?
617 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 14:38:05 ] はっきり言ってイミフだものそれ
618 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 15:32:03 ] 一時的なバッファ領域をローカルに確保するとき(バッファのサイズはコンパイル時にわかっている) バッファのサイズが大きい場合は静的配列じゃなくて動的配列でとった方がいいのかな?
619 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 15:37:35 ] 場合によるけど静的変数だと複数のスレッドでアクセスしたときに 困るかも
620 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 15:53:46 ] staticの意味じゃなくてスタックにって意味じゃないかな スタックあふれないならスタックでいいと思う
621 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 16:27:41 ] 一時変数かmalloc/newかとも取れる
622 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 19:20:35 ] >611 610ではないのだが、 >つまり最後のstrは配列名ってことですか? 違う。strはポインタ。配列名はhello。 ただしstr=hello; とすることでstrはhelloを指している。 printf("%p, %p\n", str, hello); とすれば両方とも同じポインタ値(普通はアドレス)だと言うことがわかる。 >%sというのはそれを文字に変換する機能があるって事なんでしょうか。 変換って言うのはまた微妙な表現だね。%sは対応する変数がC文字列を 指している物として、その文字列を表示する。
623 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 21:40:01 ] void myPrint(const char *str) // char のポインタを受け取るだけ { printf("%s", str); } int main() { myPrint("ABCDE"); // その1:const 文字"列の先頭"の、アドレスを渡している char foo[] = "XYZ"; // その2:char 配"列の先頭"の、アドレスを渡している myPrint(foo); char *bar = foo; // その3:その2の配"列の先頭のアドレス"を、コピーしてから渡している myPrint(bar); myPrint(&(*bar)); // その4:意味は無いがその3のポインタが指す先のアドレスを渡している // ※その4での動きは、 bar はポインタ変数、*bar はポインタ変数が指している何か、 // &(*bar) は、ポインタ変数が指している何かのアドレス=ポインタ変数に格納されているアドレス return 0; }
624 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 21:44:56 ] const文字列を引数に受け取る場合 とりあえずconst string &にしとけって言われたんだけど ぶっちゃけconst char *の方が実行効率はいいよね?
625 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 21:48:07 ] 静的解析通すためのNULLチェックめんどいです><
626 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 22:41:51 ] C言語ですが、 配列の要素数の宣言に変数は使用できませんよね? gcc(MinGW?)では可能と聞いたのですが、本当ですか? またそれによって実行ファイルが環境に依存することはありますか?
627 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 22:46:18 ] >>626 なんで配列の要素数の"宣言"に"変"数が使えないと思う?
628 名前:626 mailto:sage [2010/05/01(土) 22:55:43 ] >>627 すみません、わかりません。 perlを少しやっていて 配列の要素数の宣言に変数を使うことが当たり前だと思ったので。
629 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 22:58:06 ] #include <stdio.h> double avg(int *pt); int main(void){ int test[5]; double ans; printf("5人のテストの点数を入力してください。\n"); for(int i=0; i<5; i++){ scanf("%d", &test[i]); } ans = avg(test); printf("平均点は%lf点です。\n", ans); return 0; } double avg(int *pt){ double sum = 0.0;; for(int i=0; i<5; i++){ sum += pt[i]; } return sum/5; } 平均を出すプログラムなのですがどこが間違ってますか? 平均点が0.0点担ってしまいます
630 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 23:05:14 ] >>628 静的に確保されるメモリ領域の宣言は、「どのくらいの量を確保するのか」 決まっていないと確保のしようがない。 変数の値は動的に変わるので、そのような動的な線形リストを使いたい場合には、別途 std::vector などに頼るか、 あるいはストレートに malloc などでメモリ領域を確保しないといけない。 Perlなどのより高級言語の世界では、この辺の「メモリ空間の割り当て」などが人間向けに隠されているので 多分使っていても意識はしてなかったと思うけど、C/C++ の世界ではメモリの管理は自分でする。 あるいは、他人がした物を利用する必要がある。 お前さんは今、Perlとかの世界よりも、もっとCPUやメモリに近い所に立っているんだよ。 >>629 × int test[5]; ○ double test[5];
631 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 23:07:52 ] doubleじゃなくてよくね
632 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 23:08:37 ] >>629 vc2008eeで試したが、ちゃんと平均出たぞ?
633 名前:626 mailto:sage [2010/05/01(土) 23:12:10 ] >>630 中々C言語は難しいですね。 勉強します。
634 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 23:13:15 ] C99なら配列の要素数の宣言に変数が使える それによって実行ファイルが環境に依存することはありえる まあそんな処理系知らないけど
635 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 23:57:58 ] >>631 >>632 なぜなんでしょうね…mingwというコンパイラを使ってるんですが、0.000000点と表示されてしまうんです
636 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 00:12:01 ] すみません、自己解決しました %llfにしていたのが原因でした
637 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 00:12:24 ] ↑ミス すみません、自己解決しました %lfにしていたのが原因でした
638 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 00:15:53 ] てか書籍のサンプルコードも普通にprintf("%lf", ans);になってるんですが、どっちを信じたらいいんでしょうか?
639 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 00:19:59 ] >>633 C++なら可変長配列にはvectorを使う。この辺はC++の方が簡単だからC++を勧めるよ。 #include<vector> void func() { int n=10; std::vector<int> a(n); //intの配列 a[3]=100; int g=a[7]; }
640 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 00:48:45 ] >>638 www.kijineko.co.jp/tech/superstitions/printf-format-for-double.html
641 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 01:38:29 ] www.kouno.jp/home/c_faq/c12.html#9
642 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 07:45:33 ] コードをLinux(GCC)、Windows(VC++)どちらでも使えるように ifdefで自動的に切り替えられるようにしたいのですが GCC、VC++特有のdefineで定義されている定数はありませんか?
643 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 07:52:25 ] #include <stdio.h> #include <string.h> int main(void){ char str0[20]; char str1[20]; char str2[20]; strcpy(str1, "Hello"); strcpy(str2, "Goodday"); strcat(str0, str1); strcat(str0, str2); printf("str1の文字は%sです。\n", str1); printf("str2の文字は%sです。\n", str2); printf("str0の文字は%sです。\n", str0); printf("str0の文字数は%dです。\n", strlen(str0)); return 0; } なぜかstr0の前に文字化けみたいなのがついて文字数もおかしくなります。 どうすればいいでしょうか?
644 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 07:52:40 ] msdn.microsoft.com/ja-jp/library/ms253913%28VS.90%29.aspx www.sra.co.jp/wingnut/gcc/cpp-j.html#Predefined
645 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 07:56:22 ] >>643 strcpy(str1, "Hello"); strcpy(str2, "Goodday"); str0[0]='\0'; // ← これ strcat(str0, str1); strcat(str0, str2); str0 の領域をゼロレングス文字列にしてから、strcat
646 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 08:03:17 ] >>645 ありがとうございます。動きました。
647 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 08:03:26 ] >>643 strcatは0を探して、そこから文字列を連結するってのは分かってるよな? これを実行してみればいい。 #include <stdio.h> #include <string.h> int main(void){ int i; char str0[20]; for (i = 0; i < 20; i++) { printf("str0[%d] の中身は %d です。\n", i, str0[i]); } return 0; }
648 名前:642 mailto:sage [2010/05/02(日) 08:04:44 ] >>644 ありがとうございます。
649 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 08:08:33 ] ちなみに、>>645 がどういう意味かと言うと、 1.単に char str0[20]; としただけじゃメモリ領域が確保されただけなので、 そこには既に何かの値が残っているかもしれない 2.printf や strlen など、「ここからここまでを文字列とみなす」 処理は、ASCIIコード 0x00 を終端として見ている 3.1と2から、中身をクリアしていない str0 を渡したらどうなるかは誰にもわからない なので、先に 0x00 を置いて「空っぽの文字列」を表した。 と、言う事 str0[0]='\0'; とする代わりに strcpy(str0, ""); でもいいよ