1 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 13:10:57 ] このスレは標準Cのみの限定スレです。 まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。 質問する前には最低限検索を。 エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。 C FAQ 日本語訳 www.kouno.jp/home/c_faq/ Cプログラマ必読 ・プログラミング言語C(通称 K&R) www.amazon.co.jp/exec/obidos/ASIN/4320026926/250-7563469-9920244 他の過去ログはここに nssearch.hp.infoseek.co.jp/clang/ 前スレ 【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 131 pc11.2ch.net/test/read.cgi/tech/1170338926/ GUIなどの標準Cではできない事の質問、ソース丸投げ、宿題、書籍 は 専門の別スレッド↓があるのでそこへさようなら。 【初心者歓迎】C/C++室 Ver.42【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1188748806/ C/C++の宿題を片付けます 95代目 pc11.2ch.net/test/read.cgi/tech/1187944110/ 【このスレ住人としての心得】 ビットシフトはなんの役に立つのでしょうか でググれ
398 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 17:12:01 ] >>397 §6.7.3.6 An object that has volatile-qualified type may be modified in ways unknown to the implementation or have other unknown side effects. Therefore any expression referring to such an object shall be evaluated strictly according to the rules of the abstract machine, as described in 5.1.2.3. Furthermore, at every sequence point the value last stored in the object shall agree with that prescribed by the abstract machine, except as modified by theunknown factors mentioned previously.114) What constitutes an access to an object that has volatile-qualified type is implementation-defined. 確かに実装依存と書いてあるね。しかしアトミックである事を保証できないのならvolatile修飾子の意味は 無い事になってしまう。規格には保証されてなくても実際volatileをそのような目的に使うなら、CPU固有の 振る舞いを知っておく事は非常に重要なはずだ。
399 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 17:30:16 ] 主旨には同意するが > アトミックである事を保証できないのならvolatile修飾子の意味は > 無い事になってしまう。 これは言い過ぎ。例えば volatile x; x = 2; x = 3; の x = 2; が実行されることが保証されること等、 アトミシティ以外にも存在する意味はある。
400 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 17:57:20 ] ベンチでCPU側にとって無意味なループを省略させないとかかね
401 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 18:43:50 ] >>400 保証されない。 xが32bitだとして16bitのCPUなら、上位16ビットを代入した直後に 割り込みが入って上位16ビットを書き換えたらもうダメ。
402 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 18:44:18 ] ×>>400 ○>>399
403 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 21:02:16 ] アトミックとvolatileは全然違う概念だと俺は信じてたけど…? >>401 >>399 は別に、xに2が設定されることが保障されると 言ってはいないと思う。
404 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 21:30:30 ] すると。 int X X = 1+1; dly_tsk(100); /* ウエイト */ if(X==2) これはXは必ずしも真とはいえないのと同じか・・・?(割り込みで値なんていくらでも変更できるので) volatileは最適化の抑止であって値の保証とは違うと思うが。 それともなんか俺、頭がおかしいのか? 最適化といえば、よくあるのがF-ROMのライトシーケンスやイレースシーケンスとかなんか同じアドレスに0xAAだの0x55だの書くから 最適化されるとうまく動かなくなるね。 ちなみに組み込みをやるとハードがらみで泣かされることがしばしば。 センサ情報で何度泣かされたか。ノイズで何度泣かされたか。静電気で・・・
405 名前:デフォルトの名無しさん [2007/10/26(金) 21:31:10 ] setjmpとallocaって、呼び出しの前後順によってはlongjmpが おきた時に何か問題おきるかな?
406 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 23:03:52 ] 自信を持っては言えないのだが、多分volatileがあることで、 (処理系の詳細ではなく仕様で定められたセマンティクスの範囲内でも) 実装可能になる並列データ構造とかは存在するんではなかろうか?
407 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 23:11:46 ] ハードの熱で泣かされたことが……
408 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 23:15:14 ] >>405 をおながいします。 allocaでずれたスタックポインタlongjmpで先祖がえりしてしまうような ことは無いのか、どうなんでしょう?
409 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 23:15:59 ] スタックポインタ「が」longjmp
410 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 23:24:37 ] >>401 そんなあなたに sig_atomic_t
411 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 23:28:54 ] allocaがなんなのか知ってる?
412 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 23:33:53 ] void *p; int result; result = setjmp(); if (!result) { p = alloca(256); hoge(); /* hoge calles longjmp, NO RETURN */ /* NOT REACHED HERE */ } /* ここで p の指す先は大丈夫か? */ ということ?
413 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 00:21:05 ] >>412 そうそんな感じです。C言語として保証されてるのかな?と ふと思ったので。
414 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 00:39:46 ] allocaは標準Cで既定されている関数ではないから、実装依存としか言いようがない。
415 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 00:40:12 ] alloca は C の標準関数じゃないので・・・
416 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 00:45:12 ] ああそうなんだ。知らなかったっす。どうもありがとう。
417 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 01:48:57 ] >>410 それがはC標準関数ではない 標準ではない型を別途定める必要があること自体C標準ではできないことの証明
418 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 02:26:56 ] sig_atomic_t は <signal.h> で定義されてる ANSI C 標準の型ですが何か?
419 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 02:45:54 ] 関数ではないなw
420 名前:デフォルトの名無しさん [2007/11/05(月) 22:32:44 ] 規制中につき携帯から失礼します。 2バイト文字の文字コードを持つint型の変数があるときに この変数の文字コードに該当する文字を取得しようとしたのですが char型にぶちこもうとしたら1バイトずつに分けられて格納されて、wcharを使っても分けられてしまうようなのですが どうにか2バイトまとめて一つの文字コードだと判断させる方法はないでしょうか?
421 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 22:37:42 ] Java の char と違って、ふつ〜 C の char は 8 ビットだからどうにもならない
422 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 22:40:31 ] sage忘れたorz
423 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 22:52:09 ] >>419 フイタw
424 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 22:58:14 ] >>420 何言ってるのか良く分からん。 >wcharを使っても分けられてしまうようなのですが この部分を検証したコードと実行結果plz
425 名前:デフォルトの名無しさん [2007/11/06(火) 00:29:42 ] scanfを使って整数型の変数に1〜100の値を入力された時のみ 続く処理をして、それ以外は再度入力を促すプログラムを作ってます。 入力された値のエラーのチェックにはどんな処理が必要か わからないので教えてください。 あと数値を入力してEnterを押して実行したあとに 前回入力した数値が残ったままになっているのを 消すにはどうすればいいですか?
426 名前:425 [2007/11/06(火) 00:32:34 ] スレ間違いすいません 初心者いってきます
427 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 14:29:16 ] typedef struct _target
428 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 14:42:22 ] >>427 そんなところに予約識別子使うやつ死ねって思う。
429 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 19:55:32 ] >>428 構造体タグは独立した名前空間だから別にいいんじゃね? C++に移植したときにはまらないとも限らんが。
430 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 20:09:22 ] ダメなんだぜ。 7.1.3 Reserved identifiers > - All identifiers that begin with an underscore are always reserved for use as identifiers > with file scope in both the ordinary and tag name spaces.
431 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 10:35:25 ] >>430 俺が訳してやるぜ アンダースコアから始まる識別子を使うな、どアホ
432 名前:デフォルトの名無しさん [2007/11/15(木) 12:01:23 ] pc11.2ch.net/test/read.cgi/tech/1194016813/328-334 > 加減演算子 > > ポインタオペランド及びその結果の両方が同じ配列オブジェクトの要素、又は > 配列オブジェクトの最後の要素を一つ越えたところを指している場合、演算に > よって、オーバーフローを生じてはならない。それ以外の場合、動作は未定義 > とする。 これ見て思ったんだけど、たとえばメモリ空間がアドレス 0x0000-0xffff の環境で、 メモリ空間の終端 16 バイトに char a[16] が割り当てられて a が 0xfff0 を指す場合、 a + 16 は 0x0000 に対応することになると思うんだ。で、さらにその実装が 0x0000 を ヌルポインタとしていた場合、 a + 16 == 0 が真になるようなことがあるかもしれない。 これはオーバーフローっぽいから配列をそんなところに割り当てないようにしないと いけないのかもしれないけど、実際のところ a + 16 はオブジェクトを指す必要がないから ヌルポインタになったところで問題ないのかもしれないとも思う。 配列の最後の要素を一つ越えたところを指しているポインタがヌルポインタと 等しくなるような実装って、規格の範囲内なのかね?
433 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 12:15:14 ] だめなんじゃない? 6.5.8 Relational operators の 5 >If the expression P points to an element of an array object >and the expression Q points to the last element of the same array object, >the pointer expression Q+1 compares greater than P. char a[16] に対しては a < a+16 が成立しなきゃいけないらしい
434 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 12:29:14 ] 効率の面から全然現実的じゃないけど、大小比較においてはぬるぽを特別扱いして 最強としておけば a < a + 16 の要件は満たせる。明示的なぬるぽとの比較は 未定義動作だから、これによって規格から外れるということにはならない・・・かなり苦しいな。
435 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 12:40:35 ] ってことは、アドレス 0 をヌルポインタに使っている実装で、 ROM や RAM が アドレス空間の終端にあるようなときは、ちょっと気をつけて終端ぴったりにオブジェクトが 配置されないようにする必要がある、ってことになるのかな? リンカに指示するマッピングで終端1ワード(バイト?)ぐらい予約にしてやればいいのか。
436 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 18:22:24 ] >>434 >432のメモリモデルでユーザメモリ空間が0x8000以上なら、 ポインタ演算を符合付き整数で行なう実装ができそうだ。
437 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 21:26:34 ] いかれた規格野郎のために、これでまともに動作すれば規格合致で portable なことが保証できる、規格の限界を極めた変態処理系とかできないもんかな。
438 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 00:07:49 ] #include <stdio.h> int main (void) { int a,b; scanf("%d",&a); scanf("%d",&b); printf("2番目の数みたい%d1番目の数みたい%dこれはどこ?%d"); return 0; } printfの%dはいったいどうった仕様でよまれているんでしょうか?
439 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 00:15:32 ] www.linux.or.jp/JM/html/LDP_man-pages/man3/printf.3.html
440 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 00:19:39 ] >>438 printfの%dは、何を表示したいか最後に引数で指定しないとだめ printf("2番目の数みたい%d1番目の数みたい%dこれはどこ?%d", a, b, 42);
441 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 01:10:04 ] >>439 >>440 どうもです。 よくわからんかったんですけど、stdinのなかでも読んでるのかな? いつもは書式("%d",a)見たいな感じで使ってるんですけど、 前問題で scanf("%d",&a); printf("あなたが入力したのは%dです"); があって、aの値が出力されたのでなんでだろうと思って聞いてみました。
442 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 01:39:09 ] 未定義動作なので、単なる偶然。 たぶんスタックが関係してるとおもうけど。
443 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 11:11:03 ] > よくわからんかったんですけど、stdinのなかでも読んでるのかな? 違います。第2引数以降に順番に対応します。%d に限らずみんなそうです。 >>440 の例をよく吟味してみてください。 > 前問題で > scanf("%d",&a); > printf("あなたが入力したのは%dです"); > があって、aの値が出力されたのでなんでだろうと思って聞いてみました。 の答えが >>442 で、何かの問題としてそういうプログラムがあったのだったら、 それは誤植かバグ。
444 名前:デフォルトの名無しさん [2007/11/20(火) 12:26:52 ] 10から99までの10進数の数値を1の桁と10の桁に分けたい場合 どうすればいいでしょう? 例えば56を5と6に分けたい場合、どうすればいいのでしょう?
445 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 12:28:12 ] 56 / 10 → 5 56 % 10 → 6
446 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 12:36:56 ] long型なんですが・・・
447 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 12:37:44 ] あっ間違えました。ありがとうございました
448 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 12:48:28 ] ↑のような質問のスレではないので次の質問を書く人は注意
449 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 15:42:08 ] >>448 これがゆとり世代と言うもの
450 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 14:20:32 ] 予約識別子について質問です。 今までは ・下線 _ で始まり英小文字 a-z が続く一般識別子は global namespace で予約済み というルールから、 type_t function( type_t _parameter ){ return _parameter; }; のような仮引数名は予約識別子ではなかったはず(FAQでも同様の回答)なのですが、 「C99 では Reserved identifiers が『マクロ名を含む』になったから global namespace で #define _paramete されてたら仮引数名も上書きされない?」 と指摘されました。 恥ずかしながら、規格を読んでみても具体的に何が変わったのか私には分かりませんでした。 「今後は避けられるなら避けた方がよい」のは前提として、 既にある _parameter のような仮引数名は今でも安全なのでしょうか?
451 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 14:33:26 ] 処理系が _parameter というマクロを定義可能になったから、 処理系が _parameter というマクロを定義していた場合に その引数の _parameter という部分が置き換えられるかもしれない、 という話じゃね。 C99 に対応してないだろう ANSI C/C++ 辞典を見ると、 下線で始まるマクロ名は全て予約識別子らしいから、 今でも問題があるかと。 下線を付ける場合は、普通後ろに1つだけ付ける。
452 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 15:06:34 ] >>450 規格の範囲内で問題ないかといえば、問題ない。 >430 にあるように、タグ名を含む ファイルスコープの識別子として予約されていて、マクロにも使える下線+英大文字とは 区別されている。 ただし、そういう指摘を受けて規格の詳細を見直さないと自信が持てないような 状況を避けるため、はじめから下線始まりの識別子を使わないようにしたほうがいい。
453 名前:デフォルトの名無しさん [2007/11/27(火) 15:48:32 ] C言語ってさ、他のソースに定義してある関数とか引数ちがってmainの中で使ってもコンパイルエラーださないじゃん。 あと、まったく未定義な関数つかっても他のソースにあるかもしれないからとかいう理由でコンパイルエラーだしてくれないじゃん。 とても不便だよね。 なんで、コンパイラはそれくらいのことをしてくれないのかな?別に面倒じゃないと思うんだけど。
454 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 15:57:06 ] >>453 大抵のまともなコンパイラなら、(宣言が見つからないと言う理由で)警告を出してくれると思います。 尤も、中にはデフォルトではその警告を出さないコンパイラもありますが。 詳しいことは、それぞれのコンパイラのスレなどでどうぞ。
455 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 16:03:46 ] >>453 のような話題のためのスレではないので次の質問を書く人は注意
456 名前:453 [2007/11/27(火) 16:14:35 ] >>454 thx 俺のコンパイラがいけんのか。そうか。 やっぱ高いのじゃないとだめだね。なんでも。貧乏人は苦労するよ。 >>455 C言語のコンパイラ全部そうだとおもってたんだよ。俺はトウシロウだから。
457 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 16:24:38 ] >>456 ここはコンパイラの使い方のスレではないので程々に。 今無料で利用できるコンパイラの多くが警告を出せると思うので、調べてみてください。
458 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 16:51:26 ] gccなら-Wall つけとけ
459 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 20:47:25 ] 本当はリンカの仕事だからな
460 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 00:49:19 ] リンカにその情報は渡らんだろ。渡せるように作れるが。
461 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 07:14:08 ] >>460 Cの関数はデフォルトだと内部リンケージだったっけ?
462 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 10:45:04 ] いいえ。
463 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 20:12:34 ] strcpy と wcscpy のようにアルゴリズムが殆ど同じだが扱う型・定数が微妙に違う関数を同時に実装する必要があるとします。 実装しなければならない数は 2〜3 型 x 30〜40 関数ぐらいとします。 このような場合、 /* strcpy.cpp */ char *strcpy( char *dst_, const char *src_ ) { char *head = dst_; while( '\0' != (*dst_++ = *src_++) ){ /* nop */; } return head; } /* wcscpy.cpp */ wchar_t *wcscpy( wchar_t *dst_, const wchar_t *src_ ) { wchar_t *head = dst_; while( L'\0' != (*dst_++ = *src_++) ){ /* nop */; } return head; } と一つづつ同じような関数を書いていくのと /* fallthrough */
464 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 20:13:12 ] アルゴリズムだけ書いた /* template/strcpy.cpp */ #ifdef XCS_IS_CHAR #define char_t char #define xcscpy_ strcpy #define text_( text ) text #endif #ifdef XCS_IS_WCHAR #define char_t wchar_t #define xcscpy_ wcscpy #define text_( text ) L ## text #endif /* strcpy, wcscpy */ char_t *xcscpy_( char_t *dst_, const char_t *src_ ){ char_t *head = dst_; while( text_('\0') != (*dst_++ = *src_++) ){ /* nop */; } return head; } のようなテンプレートを用意して /* strcpy.cpp */ #define XCS_IS_WCHAR #include <template/strcpy.cpp> /* wcscpy.cpp */ #define XCS_IS_CHAR #include <template/strcpy.cpp> と読み込ませるので、どちらが良いと思いますか? あるいは、もっと良い方法がありますか?
465 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 20:16:38 ] ちなみに発想は VC++ の crt のソースからです。 >>464 の訂正 /* ファイル名が逆 */ /* strcpy.cpp */ #define XCS_IS_CHAR #include <template/strcpy.cpp> /* wcscpy.cpp */ #define XCS_IS_WCHAR #include <template/strcpy.cpp>
466 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 20:16:53 ] C++だったら、C++の関数テンプレート機能を使う方がいい template<typename T> T *xcscpy( T *dst_, const T *src_ ){ T *head = dst_; while( 0 != (*dst_++ = *src_++) ){ /* nop */; } return head; };
467 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 20:21:52 ] >>466 でもここは残念ながらCのスレ
468 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 20:50:08 ] 同時に実装しなければならないならプリプロセッサでの切り分けはできないと思うが
469 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 20:52:18 ] 早速の回答ありがとうございます。 共有するヘッダには C++ を使えないことになってますが、私のコードの中だけでも許可が出れば /* strcpy.cpp */ template<typename T> T *xcscpy( T *dst_, const T *src_ ){ T *head = dst_; while( 0 != (*dst_++ = *src_++) ){ /* nop */; } return head; }; char *strcpy( char *dst_, const char *src_ ) { return xcscpy( dst_, src_ ); } wchar_t *wcscpy( wchar_t *dst_, const wchar_t *src_ ) { return xcscpy( dst_, src_ ); } /* strcpy.h */ char *strcpy( char *dst_, const char *src_ ); wchar_t *wcscpy( wchar_t *dst_, const wchar_t *src_ ); とは書けますね。 訊いてみます。 ただ、'\0' を 0 としなければならないのが少し気になります。 関数によっては既存の定数や関数を参照しなければならないところもあるので #define INVALID_INPUTCHARS "*?\"<>|\a\b\t\n\v\f\r" /* 入力禁止文字群 */ #define t_( text ) L ## text #define xt_( text ) t_( text ) strhoge(){ return strpbrk( test_, INVALID_INPUTCHARS ); } wcshoge(){ return wcspbrk( test_, xt_( INVALID_INPUTCHARS ) ); } のような変換も自動で出来ると嬉しいのですが。
470 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 20:59:13 ] >>468 ファイルスコープにしてファイルを分ければ可能
471 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 21:03:42 ] >>468 >同時に実装しなければならないならプリプロセッサでの切り分けはできないと思うが できますよ、というか出来てます。#undef まで書けば同じファイルにすら実装できます。 下の 2 ファイルを用意して test.cpp をプリプロセッサにかけてみてください。 /* ./template/test.cpp */ #ifdef TYPE_A #define type_ type_ar #define name_ func_a #endif #ifdef TYPE_B #define type_ type_b #define name_ func_b #endif type_ *name_( type_ *param ); #undef type_ #undef name_ /* ./test.cpp */ #define TYPE_A #include "./template/test.cpp" #undef TYPE_A #define TYPE_B #include "./template/test.cpp" #undef TYPE_B
472 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 21:10:02 ] >>471 それでいいならこれでもいいんじゃない? #include<stdio.h> #define DEF_SWAP(type) void swap_ ## type(type *a, type *b){type c;c=*a;*a=*b;*b=c;} DEF_SWAP(int) DEF_SWAP(char) int main(void) { char val_char[2]={'A', 'B'}; int val_int[2]={1234, 5678}; printf("%c %c\n", val_char[0], val_char[1]); swap_char(&val_char[0], &val_char[1]); printf("%c %c\n", val_char[0], val_char[1]); printf("%d %d\n", val_int[0], val_int[1]); swap_int(&val_int[0], &val_int[1]); printf("%d %d\n", val_int[0], val_int[1]); return 0; }
473 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 21:15:40 ] いつだったかム板のどこかで C 言語で STL ってのを見た記憶がある もちろんマクロ全開で使いまくりだが、中身を見なければ幸せだった気がする
474 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 21:20:23 ] 昔こんなんなら書かされた記憶はある。やっつけで再現してみた。 ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5351.zip
475 名前:デフォルトの名無しさん mailto:sage [2007/11/29(木) 01:29:50 ] >>473 これか? sourceforge.jp/projects/cstl
476 名前:デフォルトの名無しさん mailto:sage [2007/11/29(木) 06:41:15 ] 統合開発環境なににしようか迷っているんですが・・・orz アドバイスください。。。
477 名前:デフォルトの名無しさん mailto:sage [2007/11/29(木) 08:41:56 ] >>1 読め
478 名前:デフォルトの名無しさん mailto:sage [2007/11/29(木) 09:38:48 ] こんなところにマルチしに来ててワロス
479 名前:デフォルトの名無しさん [2007/11/29(木) 11:50:29 ] ・半角アルファベットの文字列を引数をして、文字列に含まれる大文字を すべて小文字に変換する関数tolower_strを作成せよ ・この関数を用い、入力した半角アルファベットの文字列に含まれる大文字を すべて小文字に変換し表示するプログラムを作成せよ コード #include<stdio.h> void tolower_str( char []); int main(void){ char str[256]; printf("文字列を入力して下さい:"); scanf("%s",str); tolower_str(str); printf("%s",str); return 0; } void tolower_str(char t[]){ int k; for (k=0;k!='\0';k++){ if(k>='a' && k<='z'){ k=k+'A'-'a'; }else if (k>='A' && k<='Z'){ k=k+'a'-'A'; } } } 実行結果 文字列を入力して下さい:TEST TEST 変換できないのですtt教えて下さいlol
480 名前:デフォルトの名無しさん mailto:sage [2007/11/29(木) 12:07:03 ] >>479 小文字を変換しようとしてるのはどうして? まあそれは置いといて、 for (k=0;k!='\0';k++){ ここでkを0に初期化してる(k=0)のに、0だったら抜ける(k!='\0')判定してるから
481 名前:デフォルトの名無しさん mailto:sage [2007/11/29(木) 12:08:32 ] もっと言うと、文字はkじゃなくてt[k]だろ。
482 名前:デフォルトの名無しさん mailto:sage [2007/11/29(木) 12:12:48 ] つーか、宿題スレか初心者スレへどうぞ。
483 名前:ニャン [2007/11/30(金) 18:15:48 ] いくつか聞きたいことがあります 友達が検索エンジンに一括登録するソフトを作ったそうなんですが ネット上のボタンをクリックしたり コメント枠に書き込んだりするのはどうやってプログラムするのですか? それから初歩的なんですが 2文字以上の文字を保管するのはどうすればいいのですか? char だと1文字しか保管できません それから乱数の関数の使い方教えて下さい あと 画像の表示方も教えて下さい
484 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 18:18:08 ] 次の患者さんどうぞ
485 名前:ニャン [2007/11/30(金) 18:21:03 ] 友達が検索エンジンに一括登録するソフトを作ったそうなんですが ネット上のボタンをクリックしたり コメント枠に書き込んだりするのはどうやってプログラムするのですか? それから初歩的なんですが 2文字以上の文字を保管するのはどうすればいいのですか? char だと1文字しか保管できません それから乱数の関数の使い方教えて下さい あと 画像の表示方も教えて下さい
486 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 18:24:22 ] 関連が無いものを複数いっぺんに聞くなよ・・・ あと環境依存のやつはそれなりのスレで。
487 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 18:28:15 ] >>483 > ネット上のボタンをクリックしたり コメント枠に書き込んだり > するのはどうやってプログラムするのですか? ブラウザがどういう仕組みで動いているのかを調べれば、どうやってプ ログラムするかもわかるようになるよ。HTTP とか HTML とかね。
488 名前:ニャン [2007/11/30(金) 18:28:18 ] すみません いろいろ困ってたんで せめて1番上だけでも答えてください お願いします ところで 環境依存ってなんですか?
489 名前:ニャン [2007/11/30(金) 18:30:40 ] ブラウザってどうやって見るのですか?
490 名前:ニャン [2007/11/30(金) 18:36:20 ] 俺 コマンドプロンプト内で文字を表示させるくらいまでしか プログラムできないんで もっと詳しく教えて下さい
491 名前:ニャン [2007/11/30(金) 18:45:33 ] その友達に訊けばいいんじゃないですか。
492 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 18:48:52 ] まず >>1 を読め 読み終わったら >>1 を読め 一回休んで、もう一度 >>1 を読め ついでに >>2 も読んでおけ
493 名前:ニャン [2007/11/30(金) 18:49:23 ] 教えてくれないんです
494 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 19:36:43 ] これはひどい
495 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 20:01:15 ] 9,6,4,7,12,14,1,11,10,15,3,5,8,13,2を小さいものから順に並び替える関数です。 0 #include<stdio.h> 1 void quicksort(int x[],int n){ 2 int m; 3 int *pa=x+2. *pz=x+n 4 if(n==2){ 5 if(x[1]>x[2])m=x[1],x[1]x[2],x[2]=m; 6 return; 7 } 8 while(pa<pz){ 9 while(pa<=x+n && *pa<x[1])pa++; 10 while(pz>=x+2 && *pz>=x[1])pz--; 11 if(pa<pz)m=*pa, *pa++=*pz, *pz--=m; 12 } 13 if(pa>x+2)m=x[1],x[1]=*(--pa),:pa=m; 14 if(pa-x>2)quicksort(x,pa-1-x); 15 if(x+n-pz>1)quicksort(pz.x+n-pz); 16 } これの8〜12行目の部分は、9行目で前から数列の6,4,7,12まで進み、 10行目で後ろから2まで進み、12と2を交換するという意味であってますか?
496 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 20:04:18 ] >>495 ですが、もしかしてスレ違いですか?
497 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 20:15:03 ] そうです 次の患者さんどうぞ
498 名前:デフォルトの名無しさん [2007/11/30(金) 22:40:30 ] Cで動的初期化というか、やりたいのは以下のような感じなんだが、 いいアイディアない? あるヘッダファイルに以下のような定義がある。 typedef const struct ID_ { uint32_t a; uint8_t bc[2] } * ID; extern const ID ID_HOGE; んで、実体は以下のような感じ。ちなみにID_HOGE_は公開されていない。 static const struct ID_ ID_HOGE_ = {0xaaaa, {0xbb, 0xcc}}; const ID ID_HOGE = &ID_HOGE_; んで、このIDと名前みたいなヤツの対応を静的に書いておきたい。 struct { ID id; char *name; } MAP; static struct MAP map[]={ {ID_HOGE,"hoge"}, ... }; だが、動的な初期化が出来ないってコンパイラにはじかれてしまう。 どうしたらいい?ボスケテ天才プログラマー。