1 名前:デフォルトの名無しさん [2010/04/10(土) 23:30:23 BE:454421186-S★(520172)] C言語の*入門者*向け解説スレッドです。 ★前スレ C言語なら俺に聞け(入門編)Part 62 pc12.2ch.net/test/read.cgi/tech/1269517734/ ★過去スレ makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000 ★初心者、初級者の方は他の質問スレのほうが良いかもしれません。 例えば 【初心者歓迎】C/C++室 Ver.72【環境依存OK】 pc12.2ch.net/test/read.cgi/tech/1267775473/ とか ★教えて欲しいのではなく宿題を丸投げしたいだけなら ↓宿題スレ↓へ行ってください。 C/C++の宿題片付けます 135代目 pc12.2ch.net/test/read.cgi/tech/1269438098/ ★C++言語についてはなるべく聞かないでください。C++対応明記スレへどうぞ ★分からない事をなるべく詳しく書いて下さい。 ★ソースコードを晒すと答えやすくなるかもしれません。 # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること # サイズが大きい場合は宿題スレのアップローダ等を利用してください ★開発環境や動作環境も晒すと答えが早いかもしれません。 ★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
588 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 21:44:01 ] Hello, world! の出力を21byteで思いつける天才いる・・・? code golfです。 golf.shinh.org/p.rb?hello+world
589 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 21:48:52 ] なんでgorubyがあってHQ9はないんだろうな
590 名前:588 mailto:sage [2010/04/30(金) 21:53:43 ] あ〜・・・ C言語ね・・・
591 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 22:04:09 ] >>588 #include使ったチート技じゃないかい?
592 名前:側近中の側近 ◆0351148456 [2010/04/30(金) 22:05:45 ] >>588 (っ´▽`)っ #error Hello, world!
593 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 22:16:04 ] 側近ってこんなところにも来るんだ・・・ 今日のアキバにしか存在できないと思ってた
594 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 22:16:23 ] >>592 側近死ね
595 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 22:17:24 ] 安価同じw
596 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 22:30:57 ] 側近マジ死ねよ消えてくれ。ウザい。
597 名前:デフォルトの名無しさん [2010/05/01(土) 01:29:47 ] int *cp = (int *)calloc(50, sizeof(int)); int *p[5][10]; for(int i = 0; i < 5; i++){ for(int j = 0; j < 10; j++){ p[i][j] = cp++; } } *cpのデータは外部モジュールから受け取る2次元の情報で縦、横のサイズは決まっている。 ここではとりあえずcallocで代入。 2次元として加工したいのでポインタの二次元配列を宣言して「それぞれの要素にポインタを代入していく」。 「それぞれの要素にポインタを代入していく」操作が結構まどろっこしいように思えるのですが、もう少しスマートな方法はありますか?
598 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 01:44:25 ] >>588 まったく思いつかない。 どうやったんだ?
599 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 01:55:46 ] すみません、質問させてください 問題の箇所以外ははしょってますが #define LINE_BUF 1024 main(){ int i; int num; char rf[LINE_BUF]; scanf("%d", &num); fflush(stdin); fgets(rf, LINE_BUF, stdin); } ------- 残っている改行文字をfflushして、 次のfgetsにいきたいのですが、fgetsがそのまま飛んでしまいます 改行文字が入力ストリームに残っている、という状態なのかと思いますが まずいと思われる箇所を指摘していただけると幸いです
600 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 01:59:41 ] >>599 コンパイラによっては使えることもあるけど fflush(stdin); は未定義動作
601 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 02:01:25 ] >>599 scanf("%d", &num); fflush(stdin); ↓ fgets(rf, LINE_BUF, stdin); sscanf(rf, "%d", &num);
602 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 02:03:13 ] なるほど、ありがとうございます fflush関係のページをいろいろ見てみます 夜分遅くに、早いレス大変助かりました
603 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 02:04:14 ] 調べてわからなければ聞くようにしろよ
604 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 02:06:58 ] >>601 これまた申し訳ございません なるほど、こちらは一旦文字列をクッションに使う感じですね こちらも後で試してみます ありがとうございました
605 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 02:21:37 ] >>603 fflush(stdin) を setbuf(stdin, NULL) と変更することでちゃんと動いてくれました >>601 こちらの方法でも無事確認出来ました お二人ともどうもありがとうございました
606 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 02:37:00 ] kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10582.txt kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10583.c 上のテキストファイル(年別の平均気温などのデータ)の2列目のデータの小さいほうから順番に並べかえて、ファイルに出力するプログラムを作りたいのですがうまくいきません。 コンパイルは通るのですが、うまく作動しません どこが違うんでしょうか? なんかソートの部分がうまくいってない気がするのですが、よくわかりません よろしくお願いします
607 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 03:48:20 ] nが2重に使われているのと for( n=0 ; n < number ; n++ ){ for( j=n+1 ; n < number ; j++ ){ の2行目はj < numberかと
608 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 03:54:48 ] for( n=0 ; n < number ; n++ ){ // for( j=n+1 ; n < number ; j++ ){ for( j=n+1 ; j < number ; j++ ){ // for( n=0 ; n < number ; n++ ){ for( j=0 ; j < number ; j++ ){
609 名前:607 mailto:sage [2010/05/01(土) 04:01:49 ] ああ、見直してみたらnは2重になってなかったや。。 整形せずに見たらごらんの有様だよ
610 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 04:21:21 ] It's eight tabs.
611 名前:側近中の側近 ◆0351148456 [2010/05/01(土) 07:30:02 ] >>597 (っ´▽`)っ for(int i = 0; i < 5; i++){ for(int j = 0; j < 10; j++){ p[i][j] = cp++; } } の部分が、 memcpy(p, cp, sizeof(p)); でいけそうだが。どうだろう?
612 名前:側近中の側近 ◆0351148456 [2010/05/01(土) 07:35:27 ] (っ´▽`)っ メモリ上の表現がpとcpで同じってところがポイントな。 どちらも、sizeof(int *)*50 バイト分、連続した領域が確保されている。
613 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 07:40:54 ] 何を代入してるかわかってない
614 名前:側近中の側近 ◆0351148456 [2010/05/01(土) 07:42:16 ] (っ´▽`)っ cpとcを同じ共用体で定義すれば、コピーが不要になる。 union U { int *cp; int *c[5][10]; };
615 名前:側近中の側近 ◆0351148456 [2010/05/01(土) 07:46:23 ] >>613 (っ´▽`)っ cpは実体の配列、cは各々のポインタの配列だったか・・・。 しにたい
616 名前:側近中の側近 ◆0351148456 [2010/05/01(土) 07:55:51 ] >>614 (っ´▽`)っ ダブルポインターにしないとね☆ union U { int **cp; int *c[5][10]; };
617 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 10:18:19 ] NG Name:側近中の側近 ◆0351148456
618 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 10:20:22 ] ID出ないからコテなのはありがたいねw
619 名前:梓川水乃 ◆0351148456 [2010/05/01(土) 12:57:35 ] >>618 (っ´▽`)っ そうだね☆
620 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 13:18:54 ] codepad.org/lVHSm6Xk codepad.org/JhFT5Ged codepad.org/KW2MGMGe 単純過ぎるくらい単純にしないと当方バカなので3日後に読めないのです
621 名前:606 [2010/05/01(土) 15:07:07 ] 指摘された部分を直したらファイルは出力されるようになったのですが、出力されたデータが 00000000000000000000000000000000000000みたいな感じになっちゃってます
622 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 15:20:23 ] ちゃんと>>608 の指摘した2箇所を直したか? 後半のはfprintfのループのところだぞ?
623 名前:597 [2010/05/01(土) 15:28:27 ] >>616 それだと2重ポインタの方が0x00000000のままなので、 渡されるデータの位置アドレスと、配列の先頭アドレスとで共用してくれません。 私の例ではポインタの2次元配列にしていますが、2次元配列(ポインタではない)の先頭アドレス=渡されるデータの位置アドレス となればそれが一番いいのですけど… int hairetu[5][10]; int **p = hairetu; これの逆バージョン… int *p = (int *)0x********; int a; &a = p; 無茶ぶりですが配列無しでいえばこんな動作…やっぱり無理な気がしてきました。
624 名前:606 mailto:sage [2010/05/01(土) 15:39:59 ] >>622 一つだけnがjに変わってませんでした 確認不足でした 無事に出力することができました ありがとうございます
625 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 15:50:06 ] >>623 やりたいことがいまいちわからない こういうことかな? union tag_hoge_t { int cp[50]; int c[5][10]; }hoge_t; int *p=(int*)0x********; hoge_t *q=(hoge_t*)p; q->cp[10]==q->c[1][0]; ============================================================ それともこうかな? int *cp=(int*)0x********; int (*c)[10]=(int*[10])cp; c[1][1]==cp[11];
626 名前:デフォルトの名無しさん mailto:sage [2010/05/01(土) 16:03:45 ] >>625 訂正 int (*c)[10]=(int(*)[10])cp;
627 名前:597 [2010/05/01(土) 16:20:26 ] >>625 ズバリそれです!!どちらでも理想の動作でした! 共用体のポインタもできるんですね。 後者は仕組みがよくわからないのでもう少し考えてみます。 後者の方がスマートで見た目がわかりやすいのでそちらを利用したいと思います。 以下に自分のやりたいことの完成形を載せておきます。 ありがとうございました! union tag_hoge_t { int c[5][10]; }; int *p=(int*)0x********; tag_hoge_t *q=(tag_hoge_t*)p; if(q->c[1][0] == 10)… ============================================================ int *p=(int*)0x********; int (*c)[5][10]=(int (*)[5][10])p; if((*c)[1][0] == 10)…
628 名前:597 [2010/05/01(土) 16:25:34 ] >>627 後者はポインタの配列ではなく、配列のポインタになっているんですね 勉強になりました!
629 名前:デフォルトの名無しさん [2010/05/01(土) 20:30:06 ] IMG 02691 JPG www.seikei.or.jp/kakubu/rehabili/IMG_02691.JPG 私たちが当院の言語聴覚士です 宜しくお願いします www.yushinkai.jp/hakodate/design/image/come/reha/Ststh.jpg 言語聴覚士を目指す高梨さん www19.atpages.jp/imagelinkget/get.php?t=v&u=www.tokai-med.ac.jp/kagaku/gakka_st/images/real_photo1.jpg 理学療法士 作業療法士 言語聴覚士 www.ims.gr.jp/ohtafukushima/images/section/photo_section_05.jpg
630 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 11:54:32 ] マクロ機能って標準Cに含まれるんですか?
631 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 12:22:15 ] 当然
632 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 13:13:26 ] #include <stdio.h> int main(void) { int a, b; printf("キーボードから数値を入力してください"); printf("数値1を入力してください:"); scanf("%d", &a); printf("数値2を入力してください:"); scanf("%d", &b); printf("10割る3は、%d余り%dです。\n", a / b, a % b); return (0); } 8行目が違うっぽいんだけど、なんで?
633 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 13:14:39 ] 全角スペース
634 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 13:15:19 ] printf("数値1を入力してください:"); scanf("%d", &a); scanfの前が全角スペースになってる
635 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 13:16:13 ] >printf("10割る3は、%d余り%dです。\n", a / b, a % b); printf("%d割る%dは、%d余り%dです。\n", a, b, a / b, a % b);
636 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 13:20:22 ] >>633-635 ありがとう!
637 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 14:23:17 ] 文字型の変数を初期化する時に、本のサンプルコードには char ch = '\0' って書いてあるんだけど、この\0ってエスケープシーケンスの「\xxx:8進数でxxxの文字コードを持つ文字」って解釈で良いんですかね? xxxだから数字が3文字(例えばnullを表す場合は\000のように)じゃなきゃいけないと思ってたんだけど、 上の例みたいに数字1文字で表せる場合は省略しちゃっても良いんですか?
638 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 14:51:10 ] 君は最初から最後まで間違っている
639 名前:637 mailto:sage [2010/05/02(日) 14:52:17 ] え・・・・何が間違っているのか指摘して頂けると助かるのですが・・・・
640 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 15:04:43 ] '\000' で問題ないと思うけど、'\xxx'でも'\xx' '\x'でも。
641 名前:637 mailto:sage [2010/05/02(日) 15:06:31 ] ああなるほど理解できました。ありがとうございました。 xxxっていうのは要するに一般化された時の便宜で3文字表記になってただけなんですね。
642 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 15:07:38 ] なんで'\0'より先にエスケープシーケンスがどうこう言ってるんだろう
643 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 15:12:58 ] たぶんさ 彼はポインタをNULLにしたがてる所と間違ってるとも生んだけど 厳密には\0とNULLはちげーよって言うエライ方のお話はとりあえず置いておいて
644 名前:637 mailto:sage [2010/05/02(日) 15:15:50 ] >>642 このような表記のされ方で、既に読んだ部分に書いてある知識がエスケープシーケンスしかなかったのです・・・ 本は結構親切な部類に入るんですけど、文字型変数を初期化する時の'\0'っていきなり出てきたので混乱してますorz エスケープシーケンスじゃないんですか?
645 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 15:19:47 ] '\0'なんて機械的にそういうもんだと覚えるほうが多いと思うんだが。
646 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 17:58:39 ] >>644 \で始まる表記なので、エスケープシーケンスという解釈であってるよ。
647 名前:デフォルトの名無しさん [2010/05/02(日) 20:13:31 ] >>646 だね
648 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 22:53:36 ] ダブルクォーテーションの出力ってどうすればいいのでしょう? printf(""""); こんなことやっても出てこないので泣きそうです・・・
649 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 22:55:06 ] >>648 "\"\""
650 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 22:55:21 ] \"
651 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 22:57:00 ] >>649 ありがとうございます!!
652 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 23:49:47 ] 646で思いっきりエスケーなんちゃらの話しがでてるのに いきなりprintfでダブルコーテションどうやんの?とか釣りだろ
653 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 23:54:14 ] >>652 頭の悪い奴だよなw
654 名前:デフォルトの名無しさん mailto:sage [2010/05/03(月) 00:05:58 ] おれも似たようなこと聞いて良い?? 行が長いときの行末に置く¥あるじゃないですか 行末は良いんだけど、数行になると、そこ数行だけ行頭から始まるのが嫌なんだけど あれをインデントしても良い方法ってないすか?先生方よろしくお願いします
655 名前:デフォルトの名無しさん mailto:sage [2010/05/03(月) 00:07:31 ] 文字列の話です
656 名前:デフォルトの名無しさん mailto:sage [2010/05/03(月) 00:11:45 ] >>654 一旦ダブルクォートを閉じればいい char foo[]="ABC" "DEFG" "H";
657 名前:デフォルトの名無しさん mailto:sage [2010/05/03(月) 00:44:22 ] ほんとうだ、先生ありがとう
658 名前:デフォルトの名無しさん mailto:sage [2010/05/03(月) 02:10:09 ] どういたしまして
659 名前:デフォルトの名無しさん [2010/05/03(月) 16:19:16 ] C言語により記述された次の関数fがある。ここで、display()は 画面に1個の文字Aを書く手続きであるとする。 int f(int x){ display(); if(x==0)return 1; if(x==1)return 3; if(x==2)return 5; return(f(x-1)+f(x-2)+f(x-3)); } いま、f(x)を呼び出したとき、値105が返された。このf(x)が呼び出されてから 値を返すまでの間に、文字Aは画面にいくつ書かれたか。 1.43 2.44 3.45 4.46 5.47 すみませんが、このプログラムを文章に言い換えてもらえないでしょうか?
660 名前:デフォルトの名無しさん mailto:sage [2010/05/03(月) 17:05:34 ] 我輩はfである
661 名前:デフォルトの名無しさん mailto:sage [2010/05/03(月) 17:10:58 ] >>659 下記の二式 f(x) および g(x) が与えられている f(x)=f(x-1)+f(x-2)+f(x-3) f(0)=1 f(1)=3 f(2)=5 g(x)=1+g(x-1)+g(x-2)+g(x-3) g(0)=g(1)=g(2)=1 f(x)=105 であるとき g(x) はいくらになるか?
662 名前:デフォルトの名無しさん mailto:sage [2010/05/03(月) 17:15:21 ] x>3の時、f(x)=f(x-1)+f(x-2)+f(x-3) x<=3の時、 f(0)=1 f(1)=3 f(2)=5 だな
663 名前:デフォルトの名無しさん mailto:sage [2010/05/03(月) 17:27:36 ] >>662 x≧3とx<3
664 名前:デフォルトの名無しさん mailto:sage [2010/05/03(月) 18:08:57 ] 宿題は宿題スレへ
665 名前:デフォルトの名無しさん mailto:sage [2010/05/03(月) 19:51:51 ] 「負の値が入力されるまで繰り返す」ってどうやるんだっけ?
666 名前:デフォルトの名無しさん mailto:sage [2010/05/03(月) 19:54:47 ] 入力値が0以上っていうのを継続条件にしましょう
667 名前:デフォルトの名無しさん mailto:sage [2010/05/03(月) 19:55:47 ] なんで「どうやるんだっけ?」ってまるで以前は知ってたみたいな風に聞くの?
668 名前:デフォルトの名無しさん mailto:sage [2010/05/03(月) 19:58:06 ] そういう設定なんです
669 名前:デフォルトの名無しさん mailto:sage [2010/05/03(月) 19:58:32 ] 痴呆症なんだろう
670 名前:デフォルトの名無しさん mailto:sage [2010/05/03(月) 20:08:58 ] 敵のスタンド攻撃で忘れちゃうんです
671 名前:デフォルトの名無しさん mailto:sage [2010/05/03(月) 20:10:25 ] >>661 >>662 >>663 ありがとうございます ところで >g(x)=1+g(x-1)+g(x-2)+g(x-3) >g(0)=g(1)=g(2)=1 はどこから出てきたんでしょうか?
672 名前:デフォルトの名無しさん mailto:sage [2010/05/03(月) 20:13:12 ] f(x)一回につき文字を一個表示してるところからだろw
673 名前:デフォルトの名無しさん mailto:sage [2010/05/03(月) 21:25:43 ] g(x) は表示回数を返す関数を定義してるだけ x=0,1,2 の時は 1回書いて 抜ける: g(0)=g(1)=g(2)=1 それ以外では 1回書いた後、
674 名前:デフォルトの名無しさん mailto:sage [2010/05/03(月) 21:26:58 ] 途中送信してしまったが… (上略) あとはわかるな
675 名前:デフォルトの名無しさん mailto:sage [2010/05/03(月) 23:19:16 ] ポインタのサイズは4バイトの固定というのを見た事があるのですが、 64bitの場合でも同じですか?
676 名前:デフォルトの名無しさん mailto:sage [2010/05/03(月) 23:21:17 ] 別に固定じゃない
677 名前:デフォルトの名無しさん mailto:sage [2010/05/03(月) 23:22:28 ] はい
678 名前:デフォルトの名無しさん mailto:sage [2010/05/03(月) 23:51:34 ] 見た事はすべて忘れろ
679 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 00:05:48 ] この環境のこのコンパイラは4バイト固定です、みたいな所読んだんだろ それはそれで忘れちゃダメだろ
680 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 00:14:20 ] intが16ビットの環境だとポインタも2バイトだったの?
681 名前:デフォルトの名無しさん [2010/05/04(火) 00:15:45 ] >>675 8バイトだよ main() { printf("%u", sizeof(void*)); }
682 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 00:25:49 ] データーバスのビット数とアドレスバスのビット数が違う環境があってな int 型は、おおよそデータバスのビット数にあわすことが多いが ポインタは、おおよそアドレスバスのビット数にあわすことが多い アドレスレジスタが単純に並ばない 変態的な環境もあったのさ: 16ビットレジスタx2 を使って 24ビット物理アドレス を指す。
683 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 00:28:10 ] >>681 環境書かなきゃ全く意味無いよ
684 名前:デフォルトの名無しさん [2010/05/04(火) 00:33:36 ] すぐ気付いたけどもういい
685 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 04:44:08 ] 64ビット64ビットと偉そうに言ってるけどさ、 結局はいまだ1バイト8ビットじゃん。 そろそろ進化させないのか? C言語の生まれたPDP-11でさえ10ビットあったのに。 俺に言わせりゃi7もPhenomも8ビットCPUだよ。 進歩してない。
686 名前:675 mailto:sage [2010/05/04(火) 08:15:31 ] >>681 thx
687 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 09:09:35 ] >>685 確かに1バイトは8ビットだけど、いまどきワード以外のデータを 使うなんて貧乏人だけだよ C言語のcharとかshortとか互換性のためだけに残ってるけど 富豪は常にintですよ。0か1のフラグ変数にもint使いますよ しかもILP64ですよ
688 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 10:11:45 ] ×貧乏人だけ ○キャッシュ効率のことが頭にないバカだけ
689 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 11:11:28 ] 命令増やしてキャッシュ潰してりゃ世話ないな
690 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 11:33:45 ] 文字もintなのか すげぇな
691 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 12:54:31 ] >>680 8086でMS-DOSの頃 16ビット(64KB)の範囲しか扱わないモードと1MBアクセスできるモードがあって 使い分けていた。今でもfarとかnearという残骸を見ることあるでしょ?
692 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 14:19:06 ] >>691 WIndows95の頃Morland-C++5.0を買ったんだが、えらくぶ厚い マニュアルが数冊入っていて、今では考えられない位に8086のアーキテクチャ を詳しく解説してあった Windows3.1もまだまだ現役だった頃なので、STRICTを使ったプログラミング も非常に克明に書いてあって、今読み返すと「ああこの頃はまだコンパイラ メーカはやる気があったんだなあ」と思わせる
693 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 14:20:17 ] ああビール飲んでるからかtypoした ×Morland-C++ ○Borland-C++ 昼間から酒飲めるのは今日までか・・・orz
694 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 15:35:54 ] Cの文法的に下の書き方は正しいのでしょうか? unsigned short Value; Value = ((unsigned short)('AB')); コンパイルされたアセンブリソースを見ると期待通りの結果になっているのですが、 移植等を考慮した場合、この書き方は避けるべきなのでしょうか? movw ax,#04142H 分野は組込で、コンパイラはNECのものですが、エラーも警告もなしで通ります。 ググってみたものの、'A'については記述があるものの、期待する記述には出会えませんでした。 どうか、よろしくお願い申し上げます。
695 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 16:02:52 ] 文法上は問題なし。 意味は処理系依存。
696 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 16:05:45 ] JIS X3010:2003 6.4.4.4 文字定数 より 2文字以上を含む(例えば 'ab')又は1バイトの実行文字で表現できない文字若しくは逆斜線表記を含む単純文字定数の値は, 処理系定義とする。
697 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 16:23:26 ] bccでやったら4241になったw
698 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 16:24:34 ] >>695-696 ありがとうございました。 時間があるときにJIS X3010:2003をよく読んでみます。
699 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 19:08:56 ] >>697 志村、エンディアン!エンディアン!
700 名前:デフォルトの名無しさん [2010/05/04(火) 19:11:45 ] fgets関数について質問です。 この関数はEOFに達するとNULLを返すとのことですが、 FILE *fp; char str[8]; while(fgets(str, 8, fp)){ printf("%s",str); } とやってファイルの内容を出力していった場合、最後はEOFが来てNULLが 返るので、最後のprintf1回が実行されないような気がするのですが、 そうではないようです・・・。それとも1文字ずつ判定してそのたびにprintfを 実行しているのでしょうか?
701 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 19:16:50 ] fgets内部の実装にもよるが、普通はバッファに一文字でも 書き込んだ状況でEOFが来てもフラグを設定するだけで NULLは返さず次回の同じFILE*にたいする呼び出し時に NULLを返す設計が取られるんじゃないかと... (標準仕様でもそれが期待されているようだし)
702 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 19:21:52 ] >>700 ファイルの終端に達している状態でfgets()を呼ぶとEOFを返す
703 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 19:22:50 ] >>700 意味を勘違いしてる 最後の文字までとりこむfgetsではNULLを返さず その次のfgetsでNULLを返すの
704 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 19:25:39 ] >>701 >>702 >>703 ありがとうございます! なるほど理解できました。
705 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 22:42:34 ] 質問です。 #include <stdio.h> #include <string.h> void main(void) { char name[5]; int len; do{ printf("お名前を入力して下さい\t"); scanf("%s",name); len = strlen(name); } while(len>5); printf("\nあなたのお名前は %s です。\n", name); } これでname[5]の配列に30文字くらい打ち込んで終了させると、 OSのほうから終了時にエラーが出されます。 メモリに打ち込んだ文字が残ってるからだと聞いたことがあるのですが、 これらの記録を消去して、エラーを出さないようにするにはどういうことをすればよいのでしょうか。
706 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 22:50:24 ] 最初からname[200]くらいとっておく。 200以上入力しようとするやつは知らん
707 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 22:56:16 ] それか可変長だな・・・。
708 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 23:14:08 ] >>705 エラーがでるのはスタックに積んであるリターンアドレスをぶっこわしてるから scanf("%4s",name); とかやって、そもそも配列外にアクセスしないことが大事
709 名前:デフォルトの名無しさん mailto:sage [2010/05/06(木) 12:16:27 ] >>706 その考えは身を滅ぼす。gets()を使うくらい、下策。 どうせscanf()を使っているのだから>708が妥当。
710 名前:デフォルトの名無しさん mailto:sage [2010/05/06(木) 17:44:36 ] 会社の研修の問題でもscanfは使わずにコーディングしなさい、だったぞ。
711 名前:デフォルトの名無しさん mailto:sage [2010/05/06(木) 17:51:47 ] >>710 だからなんだってんだよ・・・・・・・・・・・・・
712 名前:デフォルトの名無しさん mailto:sage [2010/05/06(木) 19:16:58 ] >>710 お前は何を言っているんだ
713 名前:デフォルトの名無しさん mailto:sage [2010/05/06(木) 19:21:55 ] / ( ●)(●) |
714 名前:デフォルトの名無しさん mailto:sage [2010/05/06(木) 19:25:49 ] scanf は使わないのが常識だよ
715 名前:デフォルトの名無しさん mailto:sage [2010/05/06(木) 19:28:23 ] printfも使わないのが常識
716 名前:デフォルトの名無しさん mailto:sage [2010/05/06(木) 19:31:22 ] >>715 携帯開発部隊の方ですか?
717 名前:デフォルトの名無しさん mailto:sage [2010/05/06(木) 19:31:35 ] scanf 使いたいときは sscanf を使うのが鉄則
718 名前:705 mailto:sage [2010/05/06(木) 21:19:16 ] バグ取れました。 次からはsscanfにすればいいのですね、ありがとうございました。
719 名前:デフォルトの名無しさん mailto:sage [2010/05/06(木) 22:04:51 ] >>715 printfの戻り値を毎回確認してからしゃべれ、クソが
720 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 11:07:13 ] >>719 なにも考えずにつかっていたが、printfって戻り値があったのかw
721 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 11:48:44 ] そりゃ関数だし
722 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 11:51:02 ] voidだとおもってたわ。
723 名前:デフォルトの名無しさん mailto:sage [2010/05/08(土) 00:42:00 ] 質問します。 #include <stdio.h> #include <stdlib.h> char *input(void){ int i; char aaa[8]; int count =0; char *bb=""; printf("番号入力する"); scanf("%07s",aaa); fflush(stdin); while (aaa[count]){ count++; } for (i=0;i<count;i++){ *(bb+i)=aaa[i]; } return(bb); } int main (void){ int i; char *p; i=atoi(input()); printf("%d\n",i); p=input(); printf("%s\n",p); return(0); } これで実行してみると、printf("%s\n",p);で表示される文字の5桁目だけ、数字が入力時から+1された状態になります。 何故このようなことが起きるのでしょうか。 正しい表示にするにはどうすればよいのでしょうか?
724 名前:デフォルトの名無しさん mailto:sage [2010/05/08(土) 01:17:34 ] わぁお、char *bb="";*(bb+i)=aaa[i]; とんでもないことしてくれてるな
725 名前:デフォルトの名無しさん mailto:sage [2010/05/08(土) 01:20:10 ] スーパースマートコーディング
726 名前:デフォルトの名無しさん mailto:sage [2010/05/08(土) 01:21:04 ] それ以前に変数名を何とかしろよw
727 名前:デフォルトの名無しさん mailto:sage [2010/05/08(土) 01:44:32 ] >>723 何をしたいプログラムなのかわからないが、差し当たりの問題点を指摘する。 char *bb=""; は、コンパイラによっては書き込み不可領域に配置される場合があり、 実行時に落ちる気場合がある。 また、"" のみで初期化した場合、確保される領域は 2 バイトであるため、バッファ オーバーフローを起こす可能性がある。 これらを防ぐには、malloc() でメモリ領域を動的に確保するか、main() 側でバッファ を用意して input() に渡し、そこに入力結果を書き込むようにする。 なお、malloc() を使用する場合は必ず呼び出し側 (こごては main()) で戻り値を 記憶し、入力結果が不要になった時点で free() すべき。
728 名前:デフォルトの名無しさん mailto:sage [2010/05/08(土) 02:52:30 ] その他の指摘。 ・fflush(stdin)は環境依存なので避けた方がいい。 ・数値入力用関数を作る積もりなら戻り値は整数の方が使い易くないか? ・scanf()の書式指定で'0'なんてあったか? printf()系の書式指定とは互換性がないと思った方がいい。 ・returnは関数じゃないから括弧はつけない方がいい。まぁ、どうしても括弧つけたいなら止めないが。 ・ポインタに対する単項の*演算子は厳格なコーディング規約では禁止される。意味的に等価なbb[i]を使うべき。 ・演習目的なら止めないが、文字列のコピーは専用の標準関数を使うべき。
729 名前:デフォルトの名無しさん mailto:sage [2010/05/08(土) 03:30:52 ] >>728 えっ ってのが二つ三つ……
730 名前:デフォルトの名無しさん mailto:sage [2010/05/08(土) 03:34:22 ] >>729 kwsk
731 名前:デフォルトの名無しさん mailto:sage [2010/05/08(土) 04:18:26 ] えっ ってのが全部なんだが…… >・fflush(stdin) 意図が分からないので書くべきコードでは無い >・数値入力用関数 はてな >・scanf()の書式指定で'0'なんてあったか? あるといえばある >書式指定とは互換性がない 何を今さら >・returnは関数じゃない 何を今さら >・ポインタに対する単項の*演算子は厳格なコーディング規約では禁止される 大変なところに迷い込んでしまいましたね、読みやすさを重視して時には間接参照しましょう スワップ関数はマクロですか、memcpy()ですか、汎用ポインタですか >文字列のコピーは専用の標準関数を使うべき 文字列のコピーをしようとしたわけでは無いかもしれない といってみるテスト
732 名前:デフォルトの名無しさん mailto:sage [2010/05/08(土) 04:27:54 ] >>731 何か勘違いしているようだから一言。 >>・ポインタに対する単項の*演算子は厳格なコーディング規約では禁止される これは文字通り、*(p+i)と書かずにp[i]と書けということ。 厳格なコーディング規約ではこのほか、ポインタ演算も禁止される場合がある。 そうそう、scanf()の書式指定では'0'は特別な意味を持たないようだね。 単純に幅指定の一部と見做されるのかな。この辺りは仕様を読み直さないとなんとも言えない。 その他は趣旨が不明なので割愛。
733 名前:デフォルトの名無しさん mailto:sage [2010/05/08(土) 09:28:17 ] >723 実行するとSegmentation faltでこけるよ。 色々おかしいところがありすぎて、何がしたいのかよくわかりません。 入力文字列を数値に変換したいように見えるが、atoi使ってイイなら 文字列をそのままつっこめばいいし、scanf使ってイイなら%d使えよ という気がする。 ま、一番の問題は>724の指摘通り; *(bb+i)=aaa[i]; だね。 bbは書き換え可能な有効な領域を指していない。
734 名前:デフォルトの名無しさん mailto:sage [2010/05/08(土) 09:40:37 ] >732 「厳格なコーディング規約」ってのは何? いずれにしても ・ポインタに対する単項の*演算子禁止 ・ポインタ演算も禁止 っていうコーディング規約は賛同できない。 >これは文字通り、*(p+i)と書かずにp[i]と書けということ。 何が文字通りなのかわからんが、p[0]ではなく *pと書くべきケースは、少なからずありますよ。 >ポインタ演算も禁止される場合がある。 揚げ足とるようですまないが、文法を厳格に解釈すれば、 p[i]は*(p + i)のシンタックスシュガーでしか無いので、これも禁止されるように 読めてしまう。こうなるとまともなコーディングは無理。 「厳格なコーディング規約」というからには、しょうもないつっこみを 受けないような、「厳格な」表現を使ってください。
735 名前:デフォルトの名無しさん mailto:sage [2010/05/08(土) 09:42:36 ] >>734 知識不足は恥じゃないけどねぇ。 今出掛けるんで、あとで資料を提示するよ。
736 名前:デフォルトの名無しさん mailto:sage [2010/05/08(土) 10:02:06 ] メモリ領域を確保したら動くようになりました。 ご指摘のとおり、数値文字のみを文字列型で入力させて その文字列をメインで受け取る入力用関数を作れという演習目的の課題でした。 質問の仕方が悪くて混乱させてしまい、すみません。 ご指摘ありがとうございました。
737 名前:デフォルトの名無しさん mailto:sage [2010/05/08(土) 10:12:45 ] 宿題は宿題スレへ
738 名前:デフォルトの名無しさん [2010/05/08(土) 12:43:57 ] 読み込むテキストファイルには*.cと書いてあるのですが、 (仮引数で拾った文字列).cに置換する方法をご教授願えないでしょうか。 以下がソースです。 色々突っ込みどころがあると思いますが宜しくお願いします #define LEN_MAX 256 int FileRewrite(char *proj_name) { FILE *fp; char *search_p; char replace_p; char line_buff[LEN_MAX]; char tar_buff[LEN_MAX]; char rep_buff[LEN_MAX]; char source_name[LEN_MAX]; sprintf(source_name, "./%s/Source/%s.c", proj_name, proj_name); if ((fp = fopen(source_name, "r+")) == NULL){ fprintf(stderr, "file open error...¥nexit status(-100)¥n"); exit(EXIT_FAILURE); } strcpy(tar_buff, "*.c"); while (fgets(line_buff, LEN_MAX, fp) != NULL) { search_p = strstr(line_buff, tar_buff); if (search_p != NULL) { sprintf(rep_buff, "// %s.c¥n", proj_name); rtn = fputs(rep_buff, search_p); } } fclose(fp); return (0); }
739 名前:デフォルトの名無しさん mailto:sage [2010/05/08(土) 12:57:08 ] >>738 ソースファイル内の *.c という文字列を全て置換するの? ソースファイルのコメント中の *.c という文字列を全て置換するの?
740 名前:デフォルトの名無しさん [2010/05/08(土) 13:02:17 ] >>739 ソースファイルのコメント中の *.c という文字列です。 紛らわしくて申し訳ないです。 *.cという文字列は読み込みファイルの中に1つしかないので全てでもアリだと思います。
741 名前:デフォルトの名無しさん mailto:sage [2010/05/08(土) 15:16:52 ] >>734 ほい、一例を。 ttp://sec.ipa.go.jp/reports/20050523/coding_guide.pdf こいつの14ページ目辺りにポインタ演算について書かれているよ。 但しこいつは、逆参照自体はNGとはしていないけれど。 まぁ少なくとも、糖衣構文を理由に双方を適合とはしないということは判ると思う。
742 名前:デフォルトの名無しさん mailto:sage [2010/05/08(土) 15:29:10 ] >>740 Cでやるよりsedやawkでやった方が楽な気がするけど。 sed -e 's/\*\.c/proj.c/' source > destination 該当ファイルを検索する辺りから含めてシェルスクリプトで書けば管理も楽だろうし。 Cでやりたいなら、以下に注意。 -- ・読み込みバッファと書き出しバッファの共有は無茶 仮令"r+"でオープンしても、読み込みと書き出しは混在できない。 1行読んだら読む前の場所まで巻き戻してから書けば書けなくはないが、 行の長さが長くなるので次の行(の先頭)を潰してしまう。 あれこれ気を遣うくらいなら、一旦別のファイルに書いた方がいい。 ・「*.c」が含まれる行は本当にそのコメント形式だけなのか 例えば「// *.c (ここに重要なコメント)」のようになっていたら、 そのコメントを潰してしまうことになる。 そこに気を遣うくらいなら、「*.c」を置換するに留めるべき。 尚、置換処理自体はsprintf()で%*.*sを駆使すれば数行で書ける。
743 名前:デフォルトの名無しさん [2010/05/08(土) 15:29:43 ] #include<stdio.h> int main(void){printf("%[d]"[2+3-1])} の計算cygwinでやったんですが、でてきません。 どこが間違ってるでしょう? 一〇進の計算です。4とでてきません 基礎すぎてすいません・・・
744 名前:デフォルトの名無しさん mailto:sage [2010/05/08(土) 15:34:12 ] >>743 ・コンパイルエラーが出る場合はエラーメッセージを貼りましょう。 ・何か参考にした資料があるなら明記しましょう。 まぁ、突っ込みどころは山ほどあるけど正解を以下に。 -- #include <stdio.h> int main() { printf("%d\n", 2 + 3 - 1); return 0; } -- 尚、空白・改行は適宜変更してもいいが、記号類は省略も追加もしないこと。
745 名前:デフォルトの名無しさん [2010/05/08(土) 15:43:40 ] >>744 レスありがとうございます。 ですが それでやってみたところ chmod:missing operand after `755' Try `chmod--help'' for more inormation.c とでてきたんですが?? 755ってなんですか?ずっと755がでるんですが
746 名前:デフォルトの名無しさん mailto:sage [2010/05/08(土) 15:52:35 ] >>741 「ポインタに対する単項の*演算子禁止」なんて規約が存在する、 というのは嘘でしたってことでいいのね?
747 名前:デフォルトの名無しさん mailto:sage [2010/05/08(土) 15:54:31 ] >>745 コマンドラインパラメータの不足 C言語関係なし コンパイル方法(打ち込む文字)が間違ってる
748 名前:デフォルトの名無しさん mailto:sage [2010/05/08(土) 15:56:26 ] >>745 いったい何を「やってみた」んだ?
749 名前:デフォルトの名無しさん mailto:sage [2010/05/08(土) 15:59:58 ] >>745 エラーメッセージを貼るときはきちんと貼りましょう。 また、自分が何をやったらそうなったのか、必要ならコマンドラインのコピーも交えて説明しましょう。 まぁ、最早Cの問題じゃないことは>747の言う通り。 このまま続けたいならエスパースレへ。
750 名前:デフォルトの名無しさん [2010/05/08(土) 16:00:40 ] やってみたとは、プログラムの実行です。 gcc(ファイル名>>744 のソース)をするとerrorがでました。 コンパイルエラーというのはプログラムの中身にエラーがあるとき 出るのですよね?
751 名前:デフォルトの名無しさん mailto:sage [2010/05/08(土) 16:02:28 ] chmodできないのはコンパイラか。 取り敢えず、コマンドラインを貼れないならソースファイル名を晒してみようか。
752 名前:デフォルトの名無しさん mailto:sage [2010/05/08(土) 16:23:32 ] 厳密に言うとコンパイラ本体じゃなくてコンパイラとリンカを呼び出すスクリプトがエラーを出してる missing operandだからソースファイル名がちゃんと入力されていないか、 コンパイルエラーでオブジェクトが生成されなくてリンカの手前でエラーが出てるかだと思う
753 名前:デフォルトの名無しさん mailto:sage [2010/05/08(土) 16:47:51 ] >>750 コンソールを全部引用しろよ お前クラスの素人の場合、普通の人が想像もしないことを やってるから、抜粋すると解決しない だいたい勝手にchmodが動くわけないし、誰かの作ったMakefileを 流用してるとかで、どっかで起動してるんじゃねーの
754 名前:734 mailto:sage [2010/05/08(土) 18:37:34 ] >732 >741 参照資料を見たけどさ、 「ポインタへの整数の加減算は使用せず、確保した領域への参照・代入は[]を用いる 配列形式で行う。」 としか書かれていないよ。 ポインタ演算禁止とは書かれておらず、丁寧に 「ポインタの演算を行う場合には、ポインタの指す範囲に気を付ける。」 と書いてある。 技術用語には「厳格な」定義があるので、勝手にねじ曲げないように。 >728で挙げている、あなたの感覚はおおむね間違っていないが、 理由付けからは、根本的な理解の甘さがかいま見える。 そのせいで、色々つっこまれている。 今回引っかかった表現は ×「ポインタに対する単項の*演算子は厳格なコーディング規約では禁止される。」 ×「ポインタ演算も禁止される場合がある」
755 名前:デフォルトの名無しさん mailto:sage [2010/05/08(土) 18:45:08 ] >750 すでにつっこみが入っているが、何をやっているのかさっぱりわからない。 >やってみたとは、プログラムの実行です。 >gcc(ファイル名>>744 のソース)をするとerrorがでました。 2行目でやっていることはコンパイルであって、プログラムの実行では無いぞ。 コンパイル中にchmodが勝手に走るなんてことは無いと思うけど。 >コンパイルエラーというのはプログラムの中身にエラーがあるとき >出るのですよね? chmod:missing operand after `755' Try `chmod--help'' for more inormation.c これはコンパイルエラーではない。chmodのエラーで、引数が無い という意味。なんでchmodが出てくるのか、想像できない。 コンソールをそのままコピペして貼り付けてみたら? もっともCの問題ではないと思えるが。
756 名前:デフォルトの名無しさん [2010/05/08(土) 19:42:10 ] >>755 すまん、弟に聞いたらできたよ。 gcc OOO.c a.exe で実行でできた、あなたが間違ってるとかじゃなかったから ごめん。 また来るよ。
757 名前:デフォルトの名無しさん [2010/05/08(土) 19:44:13 ] 今人いるかな?質問させていただきます char型の'1'をint型の1にしたいんですけど、テストしたら49になってしまう どうやったらいいです?
758 名前:デフォルトの名無しさん mailto:sage [2010/05/08(土) 19:45:17 ] 48を引きます。
759 名前:デフォルトの名無しさん [2010/05/08(土) 19:47:08 ] >>758 今VBでやってるんだが、 ほかのコンパイルでもそれで結果同じになるならいいんだがどうなんです?
760 名前:デフォルトの名無しさん [2010/05/08(土) 19:47:49 ] コンパイラーでした間違えた
761 名前:>>757 [2010/05/08(土) 19:57:04 ] ちなみにキャスト代入でやった while文で、ひとつずつchar型の数字をint型にしたいんだがどうすればいいんだorz
762 名前:デフォルトの名無しさん mailto:sage [2010/05/08(土) 20:07:34 ] ここはC言語スレです。 VBの質問ならVBスレへどうぞ。
763 名前:デフォルトの名無しさん [2010/05/08(土) 20:08:23 ] VBでC言語やってるんだ 誤解させてすまぬ
764 名前:デフォルトの名無しさん mailto:sage [2010/05/08(土) 20:20:39 ] >>761 を読む限りではこんな感じ int i, n[ 5 ]; char s[] = "12345"; for( i = 0; i < 5; ++i ) n[ i ] = s[ i ] - '0';
765 名前:デフォルトの名無しさん [2010/05/08(土) 20:22:44 ] >>764 ありがとうございます! あとでやってみます
766 名前:デフォルトの名無しさん mailto:sage [2010/05/08(土) 20:25:44 ] >>761 char型の数字をint型に int intsuji = charsuji - 48; while文で、ひとつずつひとつずつ 何をしたいの?
767 名前:デフォルトの名無しさん [2010/05/08(土) 20:29:30 ] >>766 char型に入ってる数字を一文字ずつint型にいれるっていうことを 配列でやってるんでなんか簡単にまとめられないものかとおもって;
768 名前:デフォルトの名無しさん mailto:sage [2010/05/08(土) 21:05:44 ] >>767 やりたいことを具体的に書いた方がいいよ。
769 名前:デフォルトの名無しさん [2010/05/08(土) 21:34:22 ] >>768 そうですね、あんまつたわらないしよくなかったとおもいます こんどからそうします; >>764 そのやり方でできました。ありがとうございます。
770 名前:デフォルトの名無しさん mailto:sage [2010/05/08(土) 22:39:41 ] #include <stdio.h> int main(void) { printf( "%d - %X + %o = %d\n", 398, 1FB , 327 ,398-1FB+37 ); return 0; } これどこが間違ってますか?cygwinでこれを実行したら前のプログラミングがでました。 間違えたプログラミングだと実行したら前やった実行がそのまま出るっぽいです。
771 名前:デフォルトの名無しさん mailto:sage [2010/05/08(土) 22:41:39 ] >>770 1FB じゃなくて 0x1FB じゃないの?
772 名前:デフォルトの名無しさん mailto:sage [2010/05/08(土) 22:47:54 ] レス早い、本当助かる。 なぜ0xをつけるんですか??!??! あと質問ですが何故int main()っているんですか? printfだけじゃだめなんですか?ただの数値計算なんですが・・・
773 名前:デフォルトの名無しさん mailto:sage [2010/05/08(土) 22:48:45 ] すげぇww できたwww0xつけたらできた。涙出てきたわ。ほんまありがとう また来るよ。
774 名前:デフォルトの名無しさん mailto:sage [2010/05/08(土) 22:50:01 ] 二度と来るな
775 名前:デフォルトの名無しさん mailto:sage [2010/05/08(土) 23:23:23 ] ひでぇ・・・w 1FBって16進だろ 16進ってことを表すのが0x c言語はint main()っていれなきゃいけない これは関数だからc言語は関数型言語
776 名前:デフォルトの名無しさん mailto:sage [2010/05/08(土) 23:24:37 ] >>775 手続き型言語じゃないの
777 名前:デフォルトの名無しさん mailto:sage [2010/05/08(土) 23:42:42 ] 最初よくわからなかったものが わかるとなんでわからなかったのかわからなくなる
778 名前:デフォルトの名無しさん mailto:sage [2010/05/08(土) 23:51:21 ] >>775 えっ
779 名前:デフォルトの名無しさん mailto:sage [2010/05/09(日) 00:09:04 ] 18禁ゲームからエロシーン削除して家庭用に移植というくだらない事、最初にやったアホがいると聞いて
780 名前:デフォルトの名無しさん mailto:sage [2010/05/09(日) 00:10:49 ] C言語では、プログラムがどこから始まるか、ちゃんと書かなきゃいけないルール。それがmain() C言語を発明した人がそう決めた。 ほかの言語だとファイルの先頭からいきなり始まるやつもあるし、そういうわけわかんないルールを 覚えるのも含めてプログラミングの勉強だから。
781 名前:デフォルトの名無しさん mailto:sage [2010/05/09(日) 00:50:35 ] JavaやC#よりはマシだな
782 名前:デフォルトの名無しさん [2010/05/09(日) 07:49:11 ] entry は結局日の目を見なかったね
783 名前:デフォルトの名無しさん mailto:sage [2010/05/09(日) 12:11:22 ] mainってただの慣習じゃないの
784 名前:デフォルトの名無しさん mailto:sage [2010/05/09(日) 12:21:32 ] >>783 ちがうよ。規格で定められている関数だよ。
785 名前:デフォルトの名無しさん mailto:sage [2010/05/09(日) 12:38:36 ] え?そうなの? じゃぁWinMain使うときはどういう扱いなの?
786 名前:デフォルトの名無しさん mailto:sage [2010/05/09(日) 12:43:57 ] 単なるコンパイラの独自拡張
787 名前:デフォルトの名無しさん [2010/05/09(日) 12:56:59 ] >>785 規格ではフリースタンディング環境に分類される OS はないことになっているので、あくまで利用者定義ライブラリという位置づけ
788 名前:デフォルトの名無しさん mailto:sage [2010/05/09(日) 13:00:50 ] >>786 ,787 ありがとうございました
789 名前:デフォルトの名無しさん mailto:sage [2010/05/09(日) 15:54:38 ] 質問します。 #include <iostream> using namespace std; static char *plus(char *fp_c, char *fp_c2); int main() { char buf[]="ab,cde,fghi",buf2[100]; char *fp_c,*fp_c2; fp_c=buf; fp_c2=buf; fp_c2=fp_c2+2; *fp_c2=0x00; strcpy(buf2,fp_c); cout << buf2 << '\n'; fp_c,fp_c2= plus(fp_c,fp_c2); fp_c2=fp_c2+3; *fp_c2=0x00; strcpy(buf2,fp_c); cout << buf2 << '\n'; return 0;} char *plus(char *fp_c, char *fp_c2){ return fp_c2++; //1進める return fp_c=fp_c2;} 関数plusの中でポインタを1進める物を作ろうとしたのですが 実行すると、関数の中に入ってないのか、先頭のポインタに戻っているのか 上手くいきません。上手く関数を使いポインタを進めるにはどうしたらよいのでしょう?
790 名前:デフォルトの名無しさん mailto:sage [2010/05/09(日) 16:33:21 ] 警告、いや、エラーも出ると思うが、また、お笑いコードを書くなよ っていうかスレチ
791 名前:デフォルトの名無しさん [2010/05/09(日) 21:45:19 ] 皆さんの知恵をお貸しください 今度学校の授業でモジュラス10ウェイト3のC言語のソースを書くことになったのですが、どのように入力した 数値を使ってチェックコードを導くのか苦戦しています。 どのような方法で考えればいいか教えてください。
792 名前:デフォルトの名無しさん mailto:sage [2010/05/09(日) 21:46:15 ] >>791 宿題スレ池。
793 名前:デフォルトの名無しさん mailto:sage [2010/05/09(日) 22:31:02 ] 日本語で
794 名前:デフォルトの名無しさん [2010/05/09(日) 22:36:40 ] >>791 scanfで数値を取得して、後は粛々と計算で終了では? 何を苦戦しているのか全くわからない。
795 名前:デフォルトの名無しさん mailto:sage [2010/05/09(日) 23:24:40 ] 質問です。 すでに入力されている文字列"12345678"があるとして、 "1234"だけを表示させて後は表示させないにはどうすればよいのでしょうか。 %cで一つずつ表示しか思いつかなかったのですが、よい方法はありますか?
796 名前:デフォルトの名無しさん mailto:sage [2010/05/09(日) 23:34:49 ] >>795 #include<stdio.h> int main(void) { char buf[256]="12345678"; printf("%.4s", buf); return 0; }
797 名前:デフォルトの名無しさん [2010/05/09(日) 23:34:54 ] printf("%.4s", "12345678");
798 名前:デフォルトの名無しさん mailto:sage [2010/05/09(日) 23:35:08 ] 5の部分を\0に書き換える
799 名前:795 mailto:sage [2010/05/10(月) 01:51:59 ] 素早い回答有り難う御座いました。
800 名前:デフォルトの名無しさん mailto:sage [2010/05/10(月) 02:29:34 ] Cの勉強初めて数日の者ですが質問です #include<stdio.h> main(){ char a,b; scanf("%c",&a); printf("%c",a); scanf("%c",&b); printf("%c",b); return 0; } これを実効すると 一つ目の文字を入力した時点で終了してしまうのですが何故でしょうか?
801 名前:デフォルトの名無しさん mailto:sage [2010/05/10(月) 02:35:40 ] コンピューターの機嫌が悪い
802 名前:デフォルトの名無しさん mailto:sage [2010/05/10(月) 02:44:29 ] >>800 例えば、プログラムを実行して 1[改行] と入力した場合、入力内容は '1\n' となる。 よって、2つめのscanf()が実行された時点で、未読込の文字'\n'があるので、 2つめのscanf()は、更なる入力を待たず b に '\n' を代入してすぐ返る。 よって一つ目の文字を入力した時点で終了してしまうように見える。
803 名前:デフォルトの名無しさん mailto:sage [2010/05/10(月) 02:48:42 ] >>802 なるほど 納得しました ありがとうございました
804 名前:795 [2010/05/10(月) 02:57:13 ] お早い回答ありがとうございました。
805 名前:デフォルトの名無しさん mailto:sage [2010/05/10(月) 12:01:15 ] getchar()やscanf()のような文字単位処理関数と端末エミュレータの一行編集とが相性悪いんだよな。 その点だけはGUIの方が初心者には判り易いと思うんだが。 # 尤も、そこに辿り着くまでの長い道程がGUIの最大の欠点なわけで…… 入門書ではscanf()やgetchar()を使わず、全部コマンドラインオプションでやる方がシンプルに説明できるんじゃないか? # そうすると、今度はコマンドインタプリタの余計なお世話を回避することを学ばないとならなくはなるけれど。
806 名前:デフォルトの名無しさん mailto:sage [2010/05/10(月) 14:07:23 ] >>805 コマンドラインオプション? コマンドインタプリタ? 意味が通じてない。えらそうなこという前に正しい用語ぐらい覚えておけ。
807 名前:デフォルトの名無しさん mailto:sage [2010/05/10(月) 14:47:07 ] >>806 コマンドライン引き数、コマンドラインインタプリタと言えばご満足?
808 名前:デフォルトの名無しさん mailto:sage [2010/05/10(月) 14:48:53 ] つーか、>805が偉そうだと思えるほど、>806は自信の知識の足りなさを実感しているのだろうな。
809 名前:デフォルトの名無しさん mailto:sage [2010/05/10(月) 15:01:20 ] えらそうな人は実際えらい
810 名前:デフォルトの名無しさん mailto:sage [2010/05/10(月) 15:02:27 ] 原始UIと入出力はプログラミングの基本だろ それ無しでどうやって入門するんだよ
811 名前:デフォルトの名無しさん mailto:sage [2010/05/10(月) 15:24:39 ] scanfなんて最初の勉強以外で使ったこと無いな
812 名前:デフォルトの名無しさん mailto:sage [2010/05/10(月) 17:09:08 ] >>806 も少しうざいけど、 >>805 の発言こそ「えっ」なんだが。
813 名前:JaneDoeの抽出って便利だな mailto:sage [2010/05/10(月) 17:15:50 ] なんで>729とか>731とか>778とか>812って、その「えっ」の内容を書かないんだろうな。 余程自信がないんだろうか。
814 名前:デフォルトの名無しさん mailto:sage [2010/05/10(月) 17:40:16 ] >>813 書かなくても普通にわかるだろwwww お前が書いた本人なの?添削して欲しいの?
815 名前:デフォルトの名無しさん mailto:sage [2010/05/10(月) 18:05:54 ] >>805 まじで何が言いたいのかさっぱりわからん。 >>807 それならますます意味が通じなくなる。 国語の成績が最低だったことだけはわかる。
816 名前:デフォルトの名無しさん mailto:sage [2010/05/10(月) 18:26:16 ] おれが訳してやろう getchar()やscanf()ってコマンドラインから入力とかに素直に使えないよな だから初心者はGUIのほうがいいんだろうけど、GUIはやりたいことやるまでのおまじないの解説とかが多いしな いっそコマンドラインのやつはパラメータを全部引数にしちゃって渡すとかが入門にはいいかな でも、それだと引数の解釈のところがめんどくなるだけか みたいな話だと思う、要は、えらそうにアレにもこれにも文句つけてるけど特に建設的な意見はない人だ 国語の成績はよかったと思うよ、大した事言ってないのにえらそうにするやりかたとかさ でも、人に説明とかは苦手(で、通じなくて相手を馬鹿にして非難)な人だろうな
817 名前:デフォルトの名無しさん mailto:sage [2010/05/10(月) 18:49:06 ] >>816 翻訳ありがとー 彼の言ってる内容はわかったが、その内容に意味がないこともよくわかったわw
818 名前:デフォルトの名無しさん mailto:sage [2010/05/10(月) 18:50:43 ] 研修でscanf()の使用を禁じられていたので。
819 名前:デフォルトの名無しさん mailto:sage [2010/05/10(月) 19:08:53 ] 同じ言葉を2回続けるとニュアンスが正反対になるよ!ふしぎ! 例 はい はいはい
820 名前:デフォルトの名無しさん mailto:sage [2010/05/10(月) 19:19:05 ] >>815 それはお前が低脳だからだよ 高脳なら低脳の書いたよくわからん文でも理解できるが、 低脳はさっぱりわからんで終わり。 俺も低脳だから>>805 はよく分らんがな >>817 周りは普通脳以上は、やれやれ低脳にはこんなことまでしてやらないと理解できないのか 低脳は大変だな、これじゃ仕事でも手間かかるなだろな。
821 名前:デフォルトの名無しさん mailto:sage [2010/05/10(月) 19:38:52 ] >>805 の言いたいことは解るけど、 「相性が悪い」という点に同意できないんだよ。
822 名前:デフォルトの名無しさん mailto:sage [2010/05/10(月) 19:50:03 ] >>821 それはお前が低脳だからだよ
823 名前:デフォルトの名無しさん mailto:sage [2010/05/10(月) 23:12:00 ] 仕方ない。俺が >>805 を翻訳してやろう -- >>getchar()やscanf()のような文字単位処理関数と端末エミュレータの一行編集とが相性悪いんだよな。 getchar()とかscanf()のような標準入力からデータを受け取る関数は、 echo offにしてないと出力と入力のechoが混ざって相性悪いんだよな。 >>その点だけはGUIの方が初心者には判り易いと思うんだが。 >># 尤も、そこに辿り着くまでの長い道程がGUIの最大の欠点なわけで…… その点GUIはそういうToLoveるが無いので初心者も安心。 もっともGUIアプリを作るなんて、初心者には果てしなき道のりなわけで……
824 名前:デフォルトの名無しさん mailto:sage [2010/05/10(月) 23:41:00 ] getchar()はいいだろ。 素直にストリームの動作のイメージを反映してるし。
825 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 00:05:25 ] 問題は、行内編集ができるから一文字ずつ入力するのに向かないってことでしょ。 getchar()で一文字入力しようとして「なぜか先に進む」類の罠に嵌まる質問が後を絶たないからね。
826 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 01:35:25 ] だから、単におまえの望む動作になってないってだけで全然相性は悪くないだろ。 ついでに言うと、1行編集は端末エミュレーターの機能じゃねえよ。 無知をさらしてるってことに早く気付けよ。
827 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 02:08:52 ] ファイルを分割するプログラムで疑問に思った点があります 質問させていただきます fseek(fp, 0, SEEK_END) ftell(fp) としてサイズを取得した場合 今の自分の目的としているものが 195768 バイトのファイルなので 値としても 195768 とでてきます しかし、 fseek(fp, 0, SEEK_SET) ftell(fp) として見てみると、この値は 0 とでてきます ファイルポインタを先頭に置いているときは、 ftellの結果は 1 と出てくるのが妥当ではないかと感じるのですが (fseek(fp, 195768, SEEK_SET) と fseek(fp, 0, SEEK_END) が一致するなら、データが 195769 個あるように思うため) 先頭、あるいは末尾がopenしたファイルのデータとは異なる 特殊なものになっているのでしょうか? 分かりにくいかと思いますが、上手く説明できず申し訳ないです
828 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 02:12:16 ] >>827 fseek(fp, 0, SEEK_END) のあとに fgetc(fp) してデータが取れるかな?
829 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 02:13:34 ] >>827 0バイトのファイルで考えてみて
830 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 02:14:18 ] >>827 char file[195768] に対する添え字と同じ。 fseek(fp, 0, SEEK_END) は &file[195768] ってこと。
831 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 02:15:19 ] うほ、なにやら沢山ありがとうございます 付けてもらったレスみて考えてみます 感謝
832 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 02:28:37 ] みなさまのおかげで修正したプログラムも無事動きました ありがとうございます
833 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 02:39:06 ] >>827 > ファイルポインタを先頭に置いているときは、 > ftellの結果は 1 と出てくるのが妥当ではないかと感じるのですが ファイルアドレスは 0 から始まるので、ファイルポインタが先頭、つまり 0 バイト目にある時は ftell() の結果は 0 と出るのが妥当です。 ファイルサイズ 0 の場合に fseek(fp, 0, SEEK_END) した時、ftell() が 1 を 返すのは妥当ではないと感じませんか? ファイルサイズ 1 の場合に fseek(fp, 0, SEEK_END) した時、ftell() が 2 を 返すのは妥当ではないと感じませんか? > fseek(fp, 195768, SEEK_SET) と > fseek(fp, 0, SEEK_END) > が一致するなら、データが 195769 個あるように思うため) いきなり 195768 のように大きなアドレスを扱うから混乱します。 まずファイルサイズ 0 の場合を考えてみてください。 fseek(fp, 0, SEEK_SET) ないし fseek(fp, 0, SEEK_END) をしてもファイル ポインタは先頭、つまり 0 バイト目を指したままですが、そこに 1 個目の データが存在すると思いますか? いいえ、存在しません。 同様に、ファイルサイズ 195768 の場合、fseek(fp, 195768, SEEK_SET) ないし fseek(fp, 0, SEEK_END) をしてもファイルポインタは 195768 バイト 目を指しますが、そこに 195769 個目のデータが存在すると思いますか? ファイルサイズ 195768 なのに、最後の 1 バイトのデータはどこから来る のでしょう? いいえ、どこからも来ません。データは 195768 個しかありません。 ファイルポインタが指している場所に必ずしもデータが存在するとは限り ません。
834 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 03:45:02 ] コンソールに計算式(例:34+4)を入力して演算結果を出力するプログラムを作っています。 作ってみたのですが、足し算しかうまくいきません。 どこが違ってるのかよくわからないのでアドバイスください。 kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10592.c
835 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 04:07:50 ] >>834 if(p!=NULL){ b = atoi(p + 1); printf("%d + %d = %d\n", a,b,a+b); } else if(q!=NULL) { c = atoi(q + 1); printf("%d - %d = %d\n", a,c,a-c); } else if(r!=NULL){ d = atoi(r + 1); printf("%d * %d = %d\n", a,d,a*d); } else if(s!=NULL){ e = atoi(s + 1); printf("%d / %d = %d\n", a,e,a/e); }
836 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 04:38:18 ] なんでb, c, d, eを分けてるの? ch1, ch2, ch3, ch4は何の意味があるの?
837 名前:デフォルトの名無しさん [2010/05/11(火) 12:15:32 ] >>834 それ以前に 文字列の初期化なし 入力妥当性チェックなし
838 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 12:29:04 ] >文字列の初期化なし ってなんの話?
839 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 12:30:49 ] 空の文字列入れるとか、memsetで埋めるとかしないと 何にも入ってない不定の状態での格納は危険じゃないかと。 あと、ch1〜ch4に入れるときのキャストがなんか気持ち悪い。
840 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 12:37:33 ] >>839 >何にも入ってない不定の状態での格納は危険じゃないかと。 どんな危険があるのですか?
841 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 13:12:06 ] 0でターミネートし忘れた場合とかぬかすんだろどうせw
842 名前:デフォルトの名無しさん [2010/05/11(火) 14:29:03 ] 至急!!!! 任意個数の整数を標準入力(キーボード)から入力し、 入力された整数の個数 平均値(小数点以下 1 桁まで表示) 最大値 最小値 を標準出力(ディスプレイ)に表示するプログラムがわかりません。
843 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 14:29:52 ] ただし、9999が入力されたら入力を終了するものとし、9999は入力個数、平均値、最 大値、最小値には含めない。 また、最初に9999が入力された場合には、入力個数=0、平均値=0.0、最大値=0、 最小値=0が出力されるようにする。
844 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 14:37:52 ] >>842 わかりました!!!!
845 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 14:55:29 ] >>834 NULLだろうけど変数が多いね。 kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10593.txt やりたいのはこういうこと?
846 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 15:01:03 ] >>842 まず、入力がなくなるまでループ 最初の1個目を最大値、最小値とみなす 2個目以降は最大、最小を調べる 合計値に順次足していってループ回数もメモっておく ループ抜けたら最大値、最小値、平均値を出力しておわり
847 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 15:03:30 ] 小数点一桁目まで出すのなら %.1f だっけ?
848 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 15:04:59 ] >>846 それができないから聞いてるんですけど・・・
849 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 15:27:07 ] >>484 なぜ出来ないか詳しく。 制限のためか、それともC言語を書けない為か?
850 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 15:35:03 ] ここまで書いたけど・・・とソース晒すとか、何がわからないのかを具体的・端的に説明するとかしない奴は プログラムを自分で書く気はない。 宿題スレへ。
851 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 15:36:27 ] 宿題スレどこ?w
852 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 15:48:34 ] 死ぬがよい
853 名前:デフォルトの名無しさん [2010/05/11(火) 16:44:46 ] 課題で出たんですが アルファベット1文字と整数型の数値 n を読み込んで,その文字の n 文字後の文字を表示するプログラムを書きなさい とはどういうことでしょうか?アルファベットとは数値のことですか?全体的に問題の意味が わからないんですが・・・
854 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 16:53:55 ] >>853 アルファベット1文字・・・A-Z a-z 整数型の数値n・・・0-99999999... A + 0 = A A + 1 = B A + 2 = C ...
855 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 16:56:56 ] はぁ?アルファベットはアルファベットだろうが つかCの話でもなんでもないじゃん たとえば a5 なら a から5番目→g f3なら fから3番目→i D1なら E ってことだろ もらった文字に数字足して、zをこえるならAに残ったぶんを足すんじゃね?
856 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 16:59:21 ] a5 なら a から5番目→f だったwww zまで行ったらAにもどるのめんどいなら 「そこに文字はないです」って言って再入力させるとか
857 名前:デフォルトの名無しさん [2010/05/11(火) 17:40:08 ] うん?よくわかりません、アルファベットってのは数字に値するんですか? どういう数え方ですか?アルファベットにアルファベットを足したら? このプログラムの方法もよくわかりません。頭悪くてすいません・・・一応 今日も徹夜・・
858 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 17:49:22 ] >>857 アルファベットの文字コードのことなんだけどね。 char c = 'A'; という構文はわかる? そして c = c +1; putchar(c); とすると画面には B と表示されるんだけど・・・
859 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 18:03:43 ] >>857 アスキーコードでググれ どのアルファベットがどの数字に割り当たってるのかわかるし 順番に並んでるのを見れば理解も早い
860 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 18:08:33 ] いろいろな操作を行って、例えばABCD\0が入っている文字配列Z[5]を 空にする(宣言直後の状態に戻す)方法はありますか? 例えばループ中で代入しようとするとエラーを吐いてしまいます。 まだかなり初心者だと思いますが、よろしくお願いします。
861 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 18:13:04 ] >>860 とりあえず、君が書いたコードを貼れよ あと宣言直後は空でなく、デタラメな文字が入ってるよ。
862 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 18:28:58 ] >>860 memset( Z, 0x00, sizeof( Z ) );
863 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 18:29:58 ] >>860 for(i=0;i<=5;i++)としてないかな? 添え字は0から始まるので要素数5の場合は for(i=0;i<5;i++)として0〜4の範囲を指定せねばいかんよ。 初期化の方法は Cならmemset WinAPIならZeroMemory C++ならstd::fill 使い回さずにその都度宣言した方がいいと思う
864 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 18:31:35 ] 宣言直後に入っている文字列を別の配列にコピーしておいてあとでコピーしなおせばいいんじゃないの?何がしたいのか分からんが。
865 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 18:39:44 ] >>860 *z = '\0';
866 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 20:21:33 ] >>865 君は C プログラマには向いてないから BASIC 等をやったほうが良いんじゃないかな。
867 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 20:57:13 ] >>866 なんだって
868 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 22:16:02 ] シューティングゲーム作ってるんですが、int型とdouble型では どちらのほうが計算速度が速いですか?
869 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 22:17:23 ] double型。
870 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 22:21:20 ] >>869 ありがとう!
871 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 22:22:40 ] んなわけないだろ。
872 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 23:03:44 ] いやdouble型早いから
873 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 23:16:39 ] 今時のCPUならほとんど変わらない、まぁ、実測が基本 intからdoubleとかdoubleからintへの変換が多くあると急激に遅くなる がんばって、固定小数にしてもそれほど早くもならなかったので、浮動小数でいいやとなった これ以上速くしようと思ったらアルゴリズム改良するかGPUに支援してもらうか、はぁ
874 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 23:44:15 ] VIA の CPU なら整数演算でないと激遅
875 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 23:48:05 ] 浮動小数点型はCPUによって微妙に数値誤差の出方が変わるので リプレイ機能と相性が悪い聞く事がある 同じIntel系同士でもそうなるのかは俺は知らない
876 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 23:49:50 ] 使う命令を切り替える実装を使うな
877 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 23:56:58 ] アセンブラでCPUの拡張命令(SSEとか3D Now!!)を叩くしかない。
878 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 00:11:57 ] WINAPIのwsprintfでは実数が扱えなかったので、 sprintfを使いました。 そこからWINAPIのTextOut等で、ウィンドウに文字を表示したいのですが、 char *型からLPCWSTRへの変換が出来ないのでエラーになります。 何かいい方法ありませんか?
879 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 00:22:21 ] mbstowcsって言えばいいのかな?
880 名前:デフォルトの名無しさん [2010/05/12(水) 00:41:05 ] >>858 char型って整数の範囲決まってませんでした?じゃぁnが大きいと 計算できないんじゃ?Aは65ってこと? プログラムにはアルファベットとnを入力させるように作るのですか?・・ 初心者に見せかけて相当理解力が弱いんで優しくしてください・・ まじわからんww
881 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 00:47:53 ] 文字コードってのがあんだよ。 コンピューターは01しか理解できないから文字も01に変換して処理させてるわけ。
882 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 00:54:44 ] >>878 tchar.hをインクルードして_stprintf使え。 これでcharではなく、Windows APIのTCHARが使える(正確には、ちと違うが)。
883 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 00:55:21 ] >>878 TextOutA()
884 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 00:56:04 ] ASCIIコード表を見るといいと思うよ。
885 名前:デフォルトの名無しさん [2010/05/12(水) 00:56:55 ] >>881 文字コードは01じゃないけどな。
886 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 01:00:07 ] 2進数に直したら全部01だろ馬鹿か
887 名前:デフォルトの名無しさん [2010/05/12(水) 01:00:51 ] 直すからだろw
888 名前:デフォルトの名無しさん [2010/05/12(水) 01:01:49 ] >>1 山手線符号化したら、全部駅名だろwwアホww
889 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 01:32:15 ] >>888 もしよろしければどこへの誤爆かおしえていただきたいのですがいかがですかね
890 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 01:41:51 ] >>882 TCHAR の意味解ってないだろ。 >>884 ASCII とは限らないだろ。
891 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 01:49:13 ] TCHAR? ティーチャーって先生って意味ですよね。
892 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 07:40:39 ] >>880 文字コードの文字のところ一部抜粋。 #include <stdio.h> int main(void) { int i; for (i=61;i<123;i++) { printf("%c(%3d) ",i,i); if((!(i%10))||(i==122))printf("\n"); } return 0; }
893 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 08:03:20 ] >>882 _stprintfから、swprintfの存在を知り、問題なく実数でも扱えて 処理できました。 ありがとう!
894 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 08:31:06 ] 文字コード云々じゃなくてさ、問題の意味がわからないって質問だろ? アルファベットにアルファベットを足すとか言ってるし、「整数 n」←このnをアルファベットだと思ってるんじゃないの? 入力されたアルファベットにnというアルファベットを足すってどういう意味って聞いてるんじゃないの?
895 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 08:58:14 ] 初心者質問していい?
896 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 09:02:10 ] だめ
897 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 09:51:53 ] >>895 どうぞ。 >>894 >「整数 n」←このnをアルファベットだと思ってるんじゃないの? その発想はなかったw
898 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 12:11:13 ] どうも元質問者は VBからの移行なのか variant型 が当然のようで 変数 a に 文字の '1' を与える → 整数演算の時 値として 1 に評価される という思考から抜け出せないでいるようだ
899 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 13:46:27 ] PHPとかその辺混乱しまくりw
900 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 15:29:52 ] いつの話してんだ
901 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 18:57:08 ] VC++2008を使っています. 画像を入れる配列を3つに増やそうとすると 'System.StackOverflowException' のハンドルされていない例外が ○○.exe で発生しました。 とエラーがでてしまいます.少し調べたところ,unsigned charしすぎて回帰の回数が増えたためなのかと思ったんですが,どうしても配列を3つ以上使いたいのですがあきらめるしかないのでしょうか? 以下エラーの原因と思われるソースの一部です.(main.cpp) FILE *fp; unsigned char header[54]; unsigned char screen[400][300][3];//読み込み用 unsigned char screenB[400][300][3];//保存用 unsigned char screenG[400][300][3];//保存用 //ここをコメントアウトしたらエラー消える //unsigned char screenR[400][300][3];//保存用 /* 画像サイズ */ int yl=400;//y_long //呼び出し履歴によるとここでデバッグが止まる int xl=300;//x_long /* ファイルから読む */ fp=fopen("test.bmp","rb"); /* Windowsビットマップ形式 400*300ピクセル,24ビットカラー */ fread(header,1,54,fp); /* ヘッダ(54バイト)を飛ばす */ fread(screen,1,yl*xl*3,fp); /* 残りはデータ(最下行から順に入る) */ //fread(screenB,1,yl*xl*3,fp); fclose(fp);
902 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 19:01:11 ] スタックがあふれるならヒープに取ればいいじゃない、ということで、 mallocとか使って動的にメモリを確保するんです。 多分その段階だとポインタになれてないだろうから、がんばれ、とエールを。
903 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 19:05:58 ] 取り敢えず、スタックの割り当てを増やすのも手かと。
904 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 19:09:29 ] 適当にテストするならグローバルにすればよころう。
905 名前:901 mailto:sage [2010/05/12(水) 19:13:58 ] >>902 ありがとうございます. もう一度調べなおしてみます.
906 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 20:06:33 ] >>901 >editbin /stack:1000000 とかやっとけば OK
907 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 20:38:04 ] >>906 なんでそんなひどいこというの?
908 名前:デフォルトの名無しさん [2010/05/12(水) 21:43:28 ] >>894 質問したものですが さすがにそれはないです。このスレでも意見分かれてませんか? nをたくさんたすとzまでいってまたaに戻るとか。 アルファベトに数値をたすって意味が分からないんですよ。 たとえばAに1000足したら? Aとはそもそも何か、16進数の10番目のやつか、何ちゃら 規格とかのコードなのか。それが分かりません
909 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 21:50:49 ] てst
910 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 21:55:19 ] >>908 > アルファベトに数値をたすって意味が分からないんですよ。 'A' は0x41や65の別表現でしかない。('A'==0x41==65) 全て内部的にはただの数値。 'A'+1==0x42==66=='B'
911 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 21:55:20 ] アルファベットに数字を足す問題ですが、 クラスの友達に聞いて解決しました。 ここの人たちは理解力がなさすぎだと思います
912 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 21:56:26 ] >>908 'a'+1='b' これならわかる?
913 名前:デフォルトの名無しさん [2010/05/12(水) 21:57:59 ] >>908 ja.wikipedia.org/wiki/ASCII ここを読めば文字「A」が65に対応してることがわかるとおもうよ。
914 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 22:01:28 ] まぁ、普通はアルファベットに数値を足すと聞いたらアルファベットを並べて何文字か後のことだ。なんて思わない罠。
915 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 22:58:04 ] C言語初心者です。入力した整数の数だけ*を表示したいんですが、 エラー続きです。どこをどう直せばいいか教えて下さい。 #include <stdio.h> int f(int); int main(void) { int no; printf("整数を入力:"); scanf("%d",&no); return 0; } void(int n) { while (n-->0) putchar('*'); putchar('\n'); }
916 名前:デフォルトの名無しさん [2010/05/12(水) 23:01:23 ] #include <stdio.h> int f(int); int main(void) { int no; printf("整数を入力:"); scanf("%d",&no); func(no); //☆ return 0; } void func(int n) //☆ { while (n-->0) putchar('*'); putchar('\n'); }
917 名前:デフォルトの名無しさん [2010/05/12(水) 23:02:57 ] ×func ○f
918 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 23:37:56 ] プロトタイプ宣言と定義で戻り値の型が喰い違っている。
919 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 01:18:41 ] >>915 #include <stdio.h> #include <ctype.h> /* function prototype */ void disp_char( int ); int main( void ) { char no; printf( "整数を入力してください:" ); scanf( "%c", &no ); if( isdigit( no ) == 0 ) { printf( "Error:数値以外の文字が入力されました\n" ); } else { disp_char( no - '0' ); } return 0; } void disp_char( int t ) { int i; char c = '*'; for( i = 1; i <= t; i++ ) { printf( "%c", c ); } printf( "\n" ); }
920 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 02:30:42 ] >>908 もっと単純に考えたら? Aの次のアルファベットって何?って聞かれたら困るのかな。そういうレベルよ。 Hの3つ前のアルファベットは? で、zの次は何?って聞かれた時に、 ・ないわー ・最初に戻ってa ・小文字終わったからA とするか、そこは問題に明記されてないから、あなたが決めなきゃならないという話
921 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 02:31:23 ] 解決してタワーorz
922 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 03:55:38 ] 成りすましにマジレスしなくてもw
923 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 09:44:49 ] Cでプログラム組んでます。 ファイルの扱い方で質問があります。 fopen、fread、fwrite、fseek、fclose でファイルの読み込みや書き込みを行っているのですが あるファイルを読み書き可能状態でfopenして 10バイトfwiteしたあと、fcloseせずに 書いたデータをファイルの最後から1バイトずつfseekして freadして、その1バイトが特定の条件に一致した場合に そこまで読み込んだデータを破棄して 10-fseekしたバイト数だけのファイルを作りたいのですが そんなこと可能なのでしょうか? fwiteする前に書き込みデータをチェックしたかったのですが その部分には手を入れられないため、 1度書き込んだファイルの途中をぶった切れるのかが知りたいです。 ■■■■■■■□□□ □を破棄して、■だけのデータを作りたいというようなイメージです。
924 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 09:55:29 ] chsize
925 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 09:56:49 ] >>923 ftruncate()が使えればできなくはないが、事情が許すなら別ファイルに書き出すのが無難。
926 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 10:00:44 ] >>923 fclose()した後に切り詰めたいなら>924かtruncate()、開いたまま切り詰めたいならftruncate()。 但し、後者はファイルハンドルをfileno()で取得する必要あり。
927 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 17:53:32 ] フィボナッチ数列を出力するプログラムを書いたのですが どうもうまく動きません どうすればいいでしょうか #include<stdio.h> #include<stdlib.h> #define TERM 30 int main(void){ int fivo=0,n=0,temp; FILE *fp; fp=fopen("fivo.txt","wt"); if(fp==NULL){ fprintf(stderr,"ファイルオープンエラー"); exit(1); } while(fivo<=TERM){ if(fivo==1||fivo==2)n=1; fprintf(fp,"F(%2d)=%10d\n",fivo,n); fivo++; temp=n; n+=temp; } fclose(fp); printf("正常に終了しました\nfivo.txtに保存しました"); return 0; }