1 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 06:14:52 ] C言語の入門者向け解説スレです。 ・C++言語はスレ違いです。 ・分からない事をなるべく詳しく書いて下さい。 ・ソースコードを晒すと答えやすくなるかもしれません。 ・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。 前スレ C言語なら俺に聞け(入門篇) Part 14 pc11.2ch.net/test/read.cgi/tech/1181735298/ 教えて欲しいのではなく丸投げしたいならこちらへ C/C++の宿題を片付けます 91代目 pc11.2ch.net/test/read.cgi/tech/1182607405/
588 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 12:00:28 ] >>587 char配列がint安全な場所に作られる保証はない。 その点ではunionの方がまし。 しかし、unionには言語仕様的に実装依存の罠が。 そういう意味では>585でいいのだがエンディアンの問題が残る。 まぁ、最近のコンパイラならどれで書いても同じようなコードを吐くしね。
589 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 12:11:23 ] >>588 そういやこういう場合かもしれんしな。 #include <stdio.h> #include <stddef.h> int main() { struct A { char a; char b[4]; }; printf("%ld\n", offsetof(struct A, b)); }
590 名前:581 mailto:sage [2007/07/03(火) 12:30:43 ] >>583 一番簡潔なのですがかなり難解です。これから考えます。 >>585 一番分かり易いです。 unionの使い方に悩みましたがcharの配列と一つのintのメンバ変数を用意して charの配列にデータを入れてintのメンバ変数でアクセスすればいいのですね。面白い。
591 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 12:36:02 ] GCC で試した所、 -O (最適化レベル1か、それ以上) -funroll-loops (ループ展開最適化) フラグを立てると >>585 みたいなコードを吐いてくれるみたいだ。 int toInt(const char* ch) { union { char ch[sizeof (int)]; int i; } endian; int i; int shift, dshift; int n = 0; endian.i = 0; shift = *endian.ch ? 0 : (sizeof (int) - 1) * CHAR_BIT; dshift = *endian.ch ? CHAR_BIT : -CHAR_BIT; for(i = 0; i < sizeof (int); i++) { n |= ch[i] << shift; shift += dshift; } return n; }
592 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 14:59:59 ] 最近、関数のメモリの場所をポインタで取得できることを知ったのですが、 これを利用してデリゲートまがいなことってできませんかね?
593 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 15:00:37 ] qsort() とか使ったことない?
594 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 15:41:43 ] int a, b; があって両者の絶対値の大きさを比較したいとき 自乗した値を比較するのとabs()を使うのではどちらが速いのでしょう? 自乗してもintの範囲を超えないことは保証されているという前提で。 またこういったベンチマークテストはどうやって行うのでしょう?
595 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 16:02:53 ] 数百万回〜数億回くらい実行して、速度を比較する。
596 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 16:15:19 ] >>594 こんなコードを書いてみる。 #include <stdio.h> #include <stdlib.h> int main() { volatile int a; volatile int b; for (int ic = 0; ic < 100 * 1000 * 1000; ++ic) { #if 1 volatile int c = abs(a) > abs(b); #else volatile int c = a * a > b * b; #endif } return 0; } こいつをこんな感じで実行してみる。 $ gcc foo.c -std=c99 -O3 ; time ./a foo.c: In function `main': foo.c:11: warning: unused variable `c' real 0m0.734s user 0m0.687s sys 0m0.047s 意外にも、abs()の方が遅かった。
597 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 16:18:21 ] abs は条件判定が必要だからな。
598 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 16:34:10 ] あー、volatile宣言のお蔭で、参照回数の影響も出ちゃった。 よって一部訂正。 #if 0 int aa = a; int bb = b; volatile int c = abs(aa) > abs(bb); #else int aa = a; int bb = b; volatile int c = aa * aa > bb * bb; #endif 今回は大勢に影響はなかったけど。 で、ついでに-Sでアセンブリ出力を眺める。二乗版はこんだけ。 movl -4(%ebp), %eax movl -8(%ebp), %edx imull %eax, %eax imull %edx, %edx cmpl %edx, %eax setg %dl movb %dl, -9(%ebp) abs()版はどうしても条件分岐しないためにビット操作であれこれ捻り過ぎ。 movl -8(%ebp), %edx movl -12(%ebp), %eax movl %edx, %ecx sarl $31, %ecx xorl %ecx, %edx subl %ecx, %edx movl %eax, %ecx sarl $31, %ecx xorl %ecx, %eax subl %ecx, %eax cmpl %eax, %edx setg %dl movb %dl, -13(%ebp)
599 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 16:50:59 ] バイナリーサーチというものをやる場合 データが小さい順もしくは大きい順に並んでなかったらできない? つまりめちゃくちゃなデーターがあったら一旦それをバブルソートなどで整列させないとダメってことですか?
600 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 16:51:52 ] そう。
601 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 16:52:21 ] わざわざバブルソートを選択する理由も無いけどな
602 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 16:52:46 ] >>599 その通りです バブルソートである必要はありませんが…
603 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 17:00:04 ] バブルソート突っ込まれ過ぎワロタ
604 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 17:19:51 ] >>599 揃っているからこそのバイナリサーチじゃないか。 って、仕組み見たら一目瞭然だと思うが・・・・・ で、バブルソートである意味はない。 でも、ふと思ったのは、必要なものをすべて見つける必要はなくて 一つ見つければいいというのであれば、動的に必要な部分だけ ソートしながら利用するっていう使い方もあるのかな、と思った。 レイトバインディングのように、対象要素が大きくて ソートの初期化コストが大きかったり頻繁に要素が追加されるという状況で使えないかな? それともそういう場合はB-Treeとかを使っておくべき?(追加のコストによるのかな?)
605 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 19:08:21 ] #include いろいろ struct list{ int data; struct list *next; }; void showlist(); int main(void){ int indata,i,j; struct list *head,*test; head=NULL; while(1){ printf("数を入力(終了は0)>");scanf("%d",&indata); if(indata==0) break; test=(struct list*)malloc(sizeof(struct list)); test->data=indata; test->next=head; head=test; } showlist(); return 0; } void showlist(){ struct list *now; while (now!=NULL){ printf("%d ",now->data); now=now->next; } }; 構造ポインタで次々入力しshowlistで表示するというのを作ったんだけど これ実行したら、mainのreturn 0の上のshowlistがプロトタイプ宣言が無いと警告でるんですがどうしたらいいですか?
606 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 19:25:05 ] void showlist(void); ↑型を入れる
607 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 20:14:24 ] #include <stdio.h> void inputdata(int data[],int n); int main(void){ int x[10]; inputdata(x,10); return 0; } void inputdata(int data[],int n){//inputdata関数 int i; for(i=0;i<n;i++){ printf("Input data>"); scanf("%d",&data[i]); } for(i=0;i<n;i++){ printf("data[%d]=%d",i,*data[i]); } } C言語について質問です 配列x[0]〜x[9]のそれぞれに値を入れて表示するというinputdata関数を作ってみたいんですが これ動きません。どのように関数を直せばよいのでしょうか?
608 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 20:19:42 ] int *data[]
609 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 20:34:33 ] printf("data[%d]=%d",i,*data[i]); ↓ printf("data[%d]=%d",i,data[i]);
610 名前:デフォルトの名無しさん [2007/07/03(火) 20:55:02 ] 2^8は65,536でしょうか?
611 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 20:58:26 ] それくらいぐぐれよ www.google.co.jp/search?q=2%5E8
612 名前:デフォルトの名無しさん [2007/07/03(火) 21:09:46 ] さんkyさう
613 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 21:15:15 ] つーかプログラミング勉強してる奴が電卓の使い方も(その存在も?)和歌ランとは・・・
614 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 21:19:11 ] 小学生なんだろ。
615 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 21:47:58 ] 2^8 = 16^2 = 0xFF
616 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 21:52:29 ] 二次元配列で構造体を使って その中身の計算に 違う二次元配列の中身を用いないといけないんだけど すげーキレそう
617 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 21:57:59 ] ゆとりは相変わらずキレやすいな。
618 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:03:50 ] トイレに行くと血が・・・ orz
619 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:04:52 ] >>618 今日あの日だろ
620 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:14:14 ] >>618 肛門様を大事に
621 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 23:25:36 ] cdっていう配列があったとして &cd[0] と cd は全く同じ意味ですか?
622 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 23:27:05 ] ほぼ同じ意味
623 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 23:27:28 ] >>621 「2*2」と「1*4」は同じですか? という質問と同じです。 値も型も同じですが、意図が違います
624 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 23:27:32 ] cdとブルーレイくらいしか変わらない
625 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 23:28:25 ] sizeofの引数にしてみそ
626 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 23:47:34 ] void型の関数でwhileやifの途中で関数を終わらせるにはどうしたらいいでしょうか? int型とかなら if(x==1) return 0; とかやれば関数から抜け出せるけど void型はどうやるんですか?
627 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 23:48:33 ] return;
628 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 00:02:09 ] だが、ループの途中からリターンするのはあんまり気持ちのいいもんじゃないよ。
629 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 00:05:51 ] そして、じゃあbreakはどうなんだ?というような宗教論争に
630 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 00:12:35 ] ネストされたループとか考えるとループ中のreturnはやむを得ない気がする。
631 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 01:03:33 ] 10GBぐらいある巨大なテキストデータの中のある1行を 書き換えたいんだけどどうやればできますか。 普通にやると,また10GB書き出さないと出来ないような。
632 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 01:10:57 ] 双方向リストに関する質問です。 kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/4492.txt 双方向リストの先頭と末尾へ要素を追加する関数と、 先頭と末尾の要素を削除する関数を書いてみたのですが、 末尾要素を削除する関数 DelTail() が思うように動いてくれません。 free()する対象が悪いのではないかと推測していますが、 検討もつかないというのが実際のところです。 他の関数についてもツッコミいただければと思います。
633 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 01:11:06 ] >>621 int cd[10]; として、 &cd[0] の型は int* で、 cd の型は int [10] だな。 全く同じではない。
634 名前:デフォルトの名無しさん [2007/07/04(水) 01:18:05 ] 632 www.geocities.jp/ky_webid/cpp/library/003.html ●C++編(標準ライブラリ) 第3章 list listは双方向リストを構築したテンプレートクラスです。
635 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 01:18:07 ] >>631 ファイルでもメモリーでもどっちでもいいが、書き換えサイズが同じなら、読んで書いて閉じればそれで終わり。 挿入や削除ならそこでちょん切ってリスト構造で繋ぎ直す。
636 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 01:43:20 ] >>634 そのページのC編のほうのも参考にしてみたのですが、 できればグローバル変数を使わずに、 かつ、リスト操作関数の引数も、リストへのポインタだけにしたいのです。 逆に、関数内で作業用の変数が増えるのはあまりこだわりません。 もちろん、良識のある範囲で少ないほうがいいのですが。
637 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 01:44:58 ] Add系の関数の引数はデータもあるので、 増やす方は2コ(リストと要素)、減らす方は1コ、というのが正しいですね。
638 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 01:45:03 ] >>631 ファイルをリスト構造にする。 ところどころにダミーデータをいれておいて、そこをバッファに使う。 書き換えたい所を含んだクラスタを別のクラスタに繋ぎなおす。 別のファイルにパッチ情報として〜行目はこの内容に置き換わりました、のような情報を入れてセットで扱う。 直した所から後ろをそっくり書き直す
639 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 02:11:46 ] fgets(hoge, 64, stdin); みたいにしたとき、入力が64文字以上あるとどうなりますか? 63文字目までがhogeに入って後は無視されるんでしょうか?
640 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 02:14:48 ] 63文字だけ stdin から読み込む、だけ。 後は次の読み込みがあれば、その時に読み込まれる。
641 名前:639 mailto:sage [2007/07/04(水) 03:07:44 ] では、64文字目以降の改行までを無視することはできますか? fflush(stdin); してしまうと、リダイレクトされてきた時に 改行以降も全て捨てられてしまうのでは?
642 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 03:16:35 ] hoge[62] = 0; hoge[63] = 1; fgets(hoge, 64, stdin); if(hoge[63] == 0 && hoge[62] != '\n') { scanf("%*[^\n]s"); getchar(); }
643 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 08:40:22 ] int *p,a; p=&a; ってやったら *pはaと同じ(*p=a)になるんでしょ でも@=&aとやらず*p=aはなんでダメなの?
644 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 08:43:50 ] *p==a p==&a
645 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 08:48:28 ] int *p,a; p=&a; *p = 10; printf("%d\n",a); a = 20; printf("%d\n",*p);
646 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 08:50:31 ] pが未初期化だとどこさしてるかわからんのに その先に値を書き込もうとするか
647 名前:デフォルトの名無しさん [2007/07/04(水) 12:10:01 ] STL勉強してるんだけど vector<string>とかできるの?
648 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 12:10:52 ] スレタイ読めないの?
649 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 12:42:43 ] 試せば分かることをわざわざ聞きにくるやつに スレタイを正しく読むのは難しいだろ
650 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 13:05:10 ] 試して出来ないから聞いてんじゃないの? 少しは予測しろよw
651 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 13:16:20 ] それは有り得ない話だ。
652 名前:デフォルトの名無しさん [2007/07/04(水) 13:20:44 ] STL勉強してるんだけど vector<vector>とかできるの? vector<vector<int>>とか vector<vector<vector>> とかできるの?
653 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 13:25:34 ] これはひどい
654 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 13:31:33 ] スレタイくらい読め
655 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 13:58:39 ] STLはC言語では使えん vector<vector<int> > vector<vector<vector<int> > > で試せ
656 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 14:34:52 ] つ[名前空間] まあスレタイも読めないおばかさんは一生悩んでろ。
657 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 17:09:49 ] switch( uMsg ) case WM_CREATE: test1=1; test2=2; break; case WM_CREATE: { test1=1; test2=2; } break; case WM_CREATE: { test1=1; test2=2; } return; case WM_CREATE: { test1=1; test2=2; return; } どれ使ってもOK?
658 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 17:11:06 ] OK
659 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 17:11:26 ] {}で囲むのは途中で変数宣言したいとき。 breakとreturnは意味が違う。
660 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 17:16:09 ] 別に変数宣言しなくても囲ってもいい
661 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 18:09:43 ] switch、caseに関わらず、別にスコープは好きなところで使って構わない。
662 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 18:14:36 ] 関数内ならね。
663 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 18:16:27 ] >>641 fflushは入力バッファに対してどう作用するか定められていない (出力バッファを吐き出すことだけが規定されている)ので、 このスレとしては知らないという答えになる。
664 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 18:50:24 ] { }は見やすくするためにつけたけど、どこでも使ってOKなのね。 breakとreturnはよく考えるとぜんぜん意味が違う事に気づいた なぜreturnが入ってたんだろうw
665 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 19:07:30 ] 関数と定義するとき、プロトタイプ宣言が必要って言われてますよね? プロトタイプ宣言って必要なんですか? なくても動くと思うのですが・・・
666 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 19:13:08 ] なくても動きますし、必須でもありません。 あなたがいらないと思うなら必要ではないでしょう・
667 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 19:16:40 ] なくても必ず正しく動くわけじゃないぞ。
668 名前:デフォルトの名無しさん [2007/07/04(水) 19:20:45 ] 自前の関数を関数内で使うときじょんじょが大事になる
669 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 19:35:19 ] 例えばいつもおなじみのstdio.hという標準入出力ライブラリのヘッダファイルには printf関数やらfopen関数やらのプロトタイプ宣言がずらずらと並んでる stdio.hにはプロトタイプ宣言だけが書かれてて,printf関数やfopen関数の実装はstdio.cに記述されている ライブラリってのはヘッダファイルとソースファイルが対になっていて ヘッダファイルに「このライブラリはこんな機能を提供しますよ〜」っと目次みたいなもんを書いてるわけだ それがプロトタイプ宣言 なんでこんなことを分けるするかってのはソースを分割して機能別にライブラリ化するため 1個だけのソースファイルでプログラミングしてる時は必要無いけど普通はプロトタイプ宣言も書いておく main関数の前にずらずら別の関数の実装が並んでいると,どこがmainの始まりか探すのが大変なのもある
670 名前:デフォルトの名無しさん [2007/07/04(水) 20:18:02 ] 年と月を入力して 2007 7 sun mon tue wed thu fri sat 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 みたいな万年カレンダーを作りたいんですけど、アルゴリズムを詳しく教えてほしいです。 よろしくおねがいします。
671 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 20:19:53 ] あ、数字がずれてる…。 sunのnの下に1がきてmonのnのしたに2がくる感じです
672 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 20:38:15 ] kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/4502.txt 上のプログラムは、入力した文字を逆向きにプリントしちゃうはずの 自分でゆうのもなんですが、優れものなんです。が 実行すると、何故か変な文字列が入っちゃいます>< こんな感じ↓(testと入力した場合) www.uploda.org/uporg888409.jpg.html どなたか、原因を教えてくださいな 教えてくれた方に、僕のケツ穴差し上げます><
673 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 20:42:44 ] ソース見た瞬間意識が朦朧としてきた
674 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 20:49:51 ] >672 文字列の終端は'\n'じゃない てめえの汚えケツ穴なんぞ誰がいるかってんだ
675 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 21:05:09 ] >>673 朦朧としてると、こっちから押し倒しちゃうze(はぁと >>674 ありがちんこ☆ \0か!
676 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 21:09:59 ] あえて断言しよう >>674 は絶好のチャンスを失った、と。
677 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 21:12:21 ] >>670 #include <unistd.h> int main(int argc, char *argv[]){return execlp("cal", "cal", argv[2], argv[1], NULL);}
678 名前:デフォルトの名無しさん mailto:age [2007/07/04(水) 21:14:37 ] 例えば、以下のような4つの要素からなる列が複数あるものに対して、 次のような処理: (1)1番目の要素が同一の場合、後から出現したものを採用する (2)3番目の要素でソートする を行いたいのですが、どのようなアルゴリズムになりますか? 例) 0010 ABC 60 70 0022 BCD 56 76 0010 EFG 85 34 0003 HIJ 70 98 ↓ 0010 EFG 85 34 0003 HIJ 70 98 0022 BCD 56 76
679 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 21:15:51 ] 普通に配列につめてソートします。
680 名前:678 mailto:age [2007/07/04(水) 21:50:09 ] >>679 普通に配列からソートする場合、 どのように(1)の条件をクリアしますか? そこで困っています。
681 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 21:59:03 ] 同じものが出てきたら上書きする
682 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:25:35 ] 1番目の要素が同一かどうか調べて、同一なら上書きすればいい(例だと、消去してる?)
683 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:29:19 ] >>680 0000番から9999番までの箱を用意してそれぞれの箱に入れていく。 で、既に入ってる場合は入ってるものを捨てて代わりを入れる。 全部入れ終わったらソート。 無駄だらけだけど分かりやすい考え方だとこんな感じ?
684 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:30:50 ] int i, j, k, n; for(i=n-1; i> 0; i--) { for(j=i-1; j>=0; j--) { if(a[j]==a[i]) { for(k=j; k<n-1; k++) a[k] = a[k+1]; n--; i--; } } } こんな感じで同じものを消去すりゃいいんじゃね?
685 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:31:14 ] ソートしてからの方が効率いいだろ・・・
686 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:34:55 ] >>685 ソートしちゃうとどれが先にでてきたか分からなくならない? いや、マージソートとかならいいけど
687 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:38:45 ] >>686 そのための安定ソートだろ 入門篇ならバブルソートだろう
688 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:44:16 ] >>685 ソートは3番目の要素でするんだぞ?
689 名前:678 mailto:age [2007/07/04(水) 22:45:58 ] >>683 それ考えたんですけど、 実際は0000000000番から9999999999番まで(10桁)あり、 番号も全部あるわけじゃないからやっぱり効率悪いですよね。 はやさも求められているんで・・・ ハッシュとか2分探索とか使うんですかね?
690 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:50:51 ] >688 一番目の要素で安定ソート 一番目の要素でのかぶりを削除 三番目の要素でソート ってことだろ。
691 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:53:29 ] インデックス情報を付加しといて qsort という手もある。
692 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 23:05:49 ] 標準ライブラリに無いのが難点だけど 重複してるかどうか調べるのはハッシュ使うのがいいと思う
693 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 23:08:01 ] インデックス用の配列mallocしてqsortが一番楽だろ
694 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 09:38:27 ] >>672 それどっかの入門書に載ってたぞ
695 名前:デフォルトの名無しさん [2007/07/05(木) 15:50:14 ] CからつかえるフリーのXMLライブラリないですか?
696 名前:デフォルトの名無しさん [2007/07/05(木) 15:53:13 ] 何方か標準関数のプログラムの作り方教えてください
697 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 15:54:07 ] 日本語でもう一度
698 名前:デフォルトの名無しさん [2007/07/05(木) 15:55:33 ] >>672 見たらmain内で関数宣言してるけど、これはなに? そういう手法があるの?関数の内容よりそっちに目がいった。 こんなことしたことないけど、どうなの?
699 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 15:58:24 ] そりゃキミが知らないだけだろ
700 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 16:06:00 ] プロトタイプ宣言くらい関数内でできる。
701 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 16:41:17 ] 次のような関数を作りました。 Vertices isMaxNoVer(Vertices R[]){ Vertices max; int i, count=0; max.num = 0; max.deg = 0; max.no = 0; count = countVer(R); for(i=0; i<count-1; i++){ if(max.no < R[i].no){ max = R[i]; } } return max; } この関数を、次の再帰関数を使って二度目に呼び出した時、 動作がおかしくなり、以下のようなおかしな値が入ります。 test expand 1, 8 -1073747304 134516287 更にその後2度目のtest expand 3に入る前に セグメントエラーを起こして止まってしまいます。 これだけの情報でわかって頂けるかわかりませんが、 誰か助けてください。
702 名前:701 mailto:sage [2007/07/05(木) 16:42:43 ] void expand(Vertices R[]){ Vertices p, buf[N], Rp[N]; while(countVer(R) != 0){ p = isMaxNoVer(R); printf("test expand 1, %d %d %d\n", p.num, p.deg, p.no); if((countVer(Q) + p.no) > countVer(Qmax)){ syokikaVer(buf); mataha(Q, p); printf("test expand 2\n"); syokikaVer(buf); ganma(buf, p.no, G); printf("test expand 3\n"); syokikaVer(Rp); katu(Rp, buf, R); printf("test expand 4\n");
703 名前:701 mailto:sage [2007/07/05(木) 16:44:38 ] if(countVer(Rp) != 0){ numberSort(Rp); expand(Rp); } else if(countVer(Q) > countVer(Qmax)){ copyVer(Qmax, Q); } hiku(p, Q); } else return; hiku(p, R); } return; } QやQmax、Gはグローバル変数です。
704 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 18:03:30 ] >>701 それだけだと分からんなぁ〜 katu(Rp, buf, R); numberSort(Rp); このへんの関数に問題ありそうだけど
705 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 18:29:52 ] 質問です。 今、以下のような関数と構造体を作ったのですが、 typedef struct { int Length, Maximam, ValueSize; void* Array; } ArrayList; char* GetValue(ArrayList* list, int index) { char* data = (char*)list->Array, item = malloc(list->ValueSize); int i = 0; unsigned int p = index * list->ValueSize; if(list->Length > index && item != NULL) { for(; i < list->ValueSize; i++) { item[i] = data[p + i]; } return item; } else { return NULL; } } 以下続く
706 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 18:33:11 ] item
707 名前:705 mailto:sage [2007/07/05(木) 18:33:11 ] void AddRange(ArrayList* list, const void* values, int length) { char* data = (char*)list->Array, item = (char*)values; unsigned int i = 0, itemlength = length * list->Maximam, index = list->Length * list->ValueSize; if(list->Length + length >= list->Maximam) { list->Maximam += length * 2; list->Array = realloc(list->Array, list->ValueSize * list->Maximam); } for(; i < itemlength; i++) { data[index + i] = item[i]; } list->Length += length; } void main (void) { ArrayList list = { 0, 4, sizeof(int), malloc(sizeof(int) * 4) }; int i = 0; int s[10] = { 0, 1, 2, 3, 4, 5, 6 ,7 ,8 ,9 }; AddRange(&list, s, 10); AddRange(&list, s, 10); for(; i < list.Length; i++) { printf("%d\n", *((int*)GetValue(&list, i))); } } どうしてもGetValueのchar* itemの領域が確保できないんです。 他にも、listのArrayをいじってもヒープが壊れてますとか言われるのですが… なにかやってはいけないことでもやってしまっているのでしょうか? 行数圧縮しているため読みにくいとは思いますが、よろしくお願いします。
708 名前:705 mailto:sage [2007/07/05(木) 18:34:36 ] ちなみに、元のソースではすべて int i = 0; int j = 0; のように宣言しています。
709 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 18:38:04 ] itemはchar型変数として宣言されてる *itemで宣言しなきゃダメだろ
710 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 18:41:16 ] >>709 元ソースでは char*になってたんですが… 削りすぎた orz
711 名前:705 mailto:sage [2007/07/05(木) 19:07:04 ] いろいろ試してみたのですが、 AddRange(&list, s, 10);を 連続でなくとも2回使用するとGetValueのitemの中がNULLに、 3回目からはAddRange(&list, s, 10);で行われるreallocで ヒープが壊れているというエラーが出てくるようです。 何が悪いんだろ orz
712 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 19:09:20 ] AddRangeの2回目でヒープ壊してる itemlengthとreallocのサイズが乖離してる
713 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 19:17:30 ] つーかGetValue()って範囲チェック除けば char *GetValue(ArrayList list, int index) { return (char*)list.Array + index * list.ValueSize; } これで十分じゃね?
714 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 19:24:04 ] itemlength = length * list->Maximam → itemlength = length * list->ValueSize でいけるかな?
715 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 19:29:48 ] >>712 itemlength = length * list->Maximam のMaximamが原因でした。ValueSizeにするはずだったのに… 1回の使用だけだとエラーが出なかったので問題ないと思い込んで 気づかなかった orz >>713 そんなやり方もあったんですか… void*だとサイズわかんねぇよって怒られるのでchar*にして コピーする方法しか知りませんでした。 >>714 全くその通りです。 まともにコードかけるようになるのは時間がかかりそうだ orz ありがとうございました!
716 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 19:34:00 ] 素直に型を限定すればいいのに
717 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 21:55:47 ] int型の数字を文字列に変換するのってどうやるん? 具体的に言うと int n = 34; char* nStr = intToStr( n ); /* nStr = "34" */ という風にしたいのだけれど。
718 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 22:03:14 ] char *buf; int n=34; buf=メモリ確保 ssprintf(buf,"%d",n);
719 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 22:05:12 ] >>717 sが一個多かった sprintf
720 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 22:35:49 ] >>718 サンキュ! inline char* int2str( int n ) { char *buffer; buffer = malloc( sizeof( char ) ); sprintf( buffer, "%d", n ); return buffer != NULL ? buffer: "FAULT!!"; } 一応こういう感じで。
721 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 22:43:17 ] >>720 >buffer = malloc( sizeof( char ) ); 1バイトしか確保できないよ '\0'しか格納できない もう少し多めに確保して >return buffer != NULL ? buffer:"FAULT!!"; buffer の確保が失敗した場合 sprintf( buffer, "%d", n ); でエラーが出る buffer = malloc( sizeof( char ) ); if(buffer){ sprintf( buffer, "%d", n ); return buffer; } else { return "FAULT!!"; } のほうがいい気がする
722 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 22:57:49 ] >>721 せっかくならmallocも直してやれよw 11桁くらい確保すれば十分の気がする
723 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 23:16:28 ] >>720 んじゃ buffer = malloc(sizeof( char ) *12); または buffer = malloc(12); >>722 符号付の場合、'\0'いれると12文字になる
724 名前:デフォルトの名無しさん [2007/07/05(木) 23:40:25 ] 最強の関数教えてください
725 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 23:42:07 ] VIPでやれ
726 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 23:42:25 ] どう考えても main だろ。
727 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 23:43:51 ] >>724 abort
728 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 23:49:33 ] exit
729 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 01:35:39 ] buffer = (char*)malloc(sizeof( char ) *12); ↑これは?
730 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 01:36:56 ] bufferの型にあわせてあるんだろ。 C++じゃ必須の書き方だがCじゃいらん。
731 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 01:47:14 ] CとかC++の問題じゃねーだろ・・・知ったかの初心者がレスしてんのか、ここは? キャスト演算子とか知ってなさそうだな・・・平気で型の違う変数をキャスト演算子なしで 代入しちゃうようなヘボプログラマーかw
732 名前:デフォルトの名無しさん [2007/07/06(金) 01:48:12 ] 配列の添え字に変数を指定することは可能でしょうか?
733 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 01:54:01 ] コンパイラが自動的にやってくれるのを当てにして失敗するプログラマー(プ
734 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 01:56:50 ] >>730 (・∀・)ニヤニヤ > bufferの型にあわせてあるんだろ。 > C++じゃ必須の書き方だがCじゃいらん。
735 名前:732 mailto:sage [2007/07/06(金) 01:57:25 ] 自己解決しました 可能っぽいですね
736 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:01:26 ] >>730 (・∀・)y-~~~ ヤニヤニ
737 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:01:26 ] C だと void* から別のポインタ型への変換は暗黙にできるだろ・・・常識的に考えて。
738 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:04:22 ] void*が無かった頃のCならmallocはchar*を返したから キャストしないと警告もんだとか言い出してみる。
739 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:04:47 ] >>730 (・∀・)ニヤニヤ ヘボプログラマー必死だな
740 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:08:16 ] >>738 malloc で気を使っても、 どっかで void* 使ってたらそれだけでアウツだけどな。 その環境なら。
741 名前:732 ◆L/nntMgEC6 [2007/07/06(金) 02:11:36 ] >>735 可能なんですか?
742 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:12:01 ] >>730 (・∀・)ニヤニヤ あるんだろ。Cじゃいらん。
743 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:24:21 ] >>738 (・∀・)ニヤニヤ > void*が無かった頃のCなら
744 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:27:29 ] >>732 char a[10]; int i; でa[i]ってことですか? もちろん可能。 添え字は整数の値をとる式ならなんでもおkだぞ。
745 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:29:22 ] >>744 (・∀・)ニヤニヤ > 添え字は整数の値をとる式ならなんでもおkだぞ。 (VIPPERのAA略)<常識的に考えて配列の要素番号の範囲内だろ
746 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:33:49 ] アホが常駐しとるな
747 名前:744 mailto:sage [2007/07/06(金) 02:34:12 ] >>745 おまい!大丈夫か! >>732 は文法的に許されるかと質問しているんだろ!
748 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:34:50 ] よい子がC言語の勉強実況してるからみてやろうぜ WMPのファイル→URLを開く→matoinu.orz.hm:30000 をコピペ→OK 実況スレ 何でも実況V なんでも実況フリーダム live24.2ch.net/test/read.cgi/livevenus/1183654888/ 面白いぜwwwwww
749 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:38:25 ] 範囲外まで指定できちゃうのがエラーの温床になってるしな。
750 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:40:29 ] とりあえず (・∀・)ニヤニヤ を NG にした。
751 名前:732 ◆L/nntMgEC6 [2007/07/06(金) 02:42:37 ] >>744 さん 回答有難う御座います。 int i; char a[]="abc"; i=strlen(a); char b[i]; のような感じで使いたいのですが、可能でしょうか?
752 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:44:57 ] >>747 (・∀・)ニヤニヤ 適切と不適切がわからないプログラマーワロスw キャストは不要でつか〜〜〜?
753 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:46:39 ] 746 名前:デフォルトの名無しさん 投稿日:2007/07/06(金) 02:33:49 アホが常駐しとるな (VIPPERのAA略) < 常識的に考えて知ったかぶって初心者にありもしないことを言う方がおかしいだろ どう考えて配列を適切に参照できる、要素番号の範囲内の値をとる式ならって話ならわかるけどw
754 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:48:03 ] とりあえず (VIPPERのAA略) を NG にした
755 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:49:35 ] >>744 (^∀^) ニタニタ > 添え字は整数の値をとる式ならなんでもおkだぞ。 整数の値をとる式ならなんでも 整数の値をとる式ならなんでも こやつは要素数と参照できる範囲外の値をとってもおkなんだぞぉーーー!
756 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:50:28 ] >>744 m9(^д^)9m プププ、(ダブル)プギャー
757 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:53:33 ] 文体変えてAA使っても、いつものアホだってことはバレバレ
758 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:53:52 ] >>754 all right, I will use AA that's not for short.
759 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:54:34 ] >>757 > いつものアホ アホとか言っちゃってるよぉ〜〜〜、お前がアホのくせして初心者に大嘘教えているくせにw お前みたいな奴にアホ言われたくね〜〜なぁ。俺は間違ってねーし。お前は不適切。
760 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:56:01 ] VIPPER の AA 略 < 常識的に考えて、文法的におkってことを持ち出して 不十分な(というか間違っている)説明の言い訳をするかぁ? んじゃお前は a[10] の配列の10番目を参照するときは a[10] とでもやってろよ
761 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:56:21 ] >>751 それはダメ。 配列変数の宣言文には変数は使えない。 それをするなら nt i; char a[]="abc"; char *b; i=strlen(a); b=(char*)malloc(sizeof(char)*i);
762 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:56:51 ] >>751 int i; char a[]="abc"; char *b; i=strlen(a); b = (char*)malloc(sizeof(char)*i); free(b); スレの流れからすればこんな感じ bにaと同じ長さの文字列を入れるなら+1しないと駄目だけど。
763 名前:732 ◆L/nntMgEC6 [2007/07/06(金) 02:58:25 ] >>761 さん 有難う御座います。おかげで疑問が解けました。
764 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 03:00:43 ] | ( ●)(●) いい加減な説明をしていることを指摘されて . | (__人__) 指摘した相手をアホとか言う方がアホだろ | ` ⌒´ノ 常識的に考えて・・・
765 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 03:01:22 ] >>761 C99ならできるというのは禁句かい?
766 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 03:03:23 ] 回答者が書く補足としては、ありだとおもう。 突っ込みとしては、ちょっと弱い。
767 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 03:04:15 ] / ノ ⌒ \ 文法的にも間違っていることを言う奴が | (●)(●) | 間違っていない奴にアホって言うアホだろ . | (__人__) | 常識的に考えて。ちゃんとキャストしろよ
768 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 03:05:15 ] 常考常考うるせーよ 貶し合ってないで意味のある話をしろ
769 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 03:08:42 ] >>763 VBだとそれができるんだよね。 それはVBなどのインタープリター言語は実行時に変数宣言文も実行文もおなじように上から処理してゆくから。 Cのようなコンパイラ言語はコンパイル時に変数宣言文を処理してゆく。 だからコンパイル時に配列変数のサイズがわかっていないと処理ができない。 JavaもVBと同じだと思う。
770 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 03:09:22 ] ここは初心者が鼻息を荒くして入門書読みながらレスしてるのが多くて注意が必要
771 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 03:09:45 ] >>765 C99ならできるの?
772 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 03:10:54 ] | ( ●)(●) お前みたいな奴は、たとえドラマの役者として . | (__人__) 起用されても、まともなキャスティングもされずに | ` ⌒´ノ 脇役かエキストラに決まってんじゃん>アホ言うたアホ
773 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 03:12:15 ] AA厨も早く寝ろ 今日はお開きだ
774 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 03:15:42 ] >>773 (・∀・)キャスキャス
775 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 03:17:05 ] いまさらやらない夫のAA貼り付けて喜んでんのかよw
776 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 03:27:41 ] >>771 余裕
777 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 03:27:46 ] いまさら やらない か?っつか、いまさらキャストも適切に出来ない奴が 初心者相手にいい加減な説明、笑えねぇ〜〜〜〜〜。お前、指導者に向いてねーよ。
778 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 04:13:51 ] キャストすると型によってアドレスが変わるプロセッサの話をすると、へんなのを召喚しちゃいますか?
779 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 04:41:39 ] それがどうかしたのか? printf に渡すときの話とはわけが違うぞ?
780 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 06:14:06 ] 1バイト文字と2バイト文字が混在してる文字列を ループ使って1バイトずつputchar()で画面に表示しても ちゃんとどちらも表示されるのは、シェルやプロンプトの方で 何バイト文字か確認して1バイト文字じゃない時は 一度バッファに溜める、とかしてるからですか?
781 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 06:21:01 ] ものによるとしか
782 名前:780 mailto:sage [2007/07/06(金) 06:49:14 ] >>781 例えばどうやって処理してるんですか?
783 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 07:35:00 ] >>780 いいえ、シェルプログラムはそんなことはしません。
784 名前:780 mailto:sage [2007/07/06(金) 07:52:43 ] >>783 あ、コンパイラがやってくれてるんですか?
785 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 08:09:19 ] >>784 いいえ、勿論コンパイラの知ったこっちゃありません。 もしかしたら、画面表示はシェルプログラムがやっていると思っているんですか? 例えば他のPCにリモートログインしたときには相手先のシェルプログラムが動くわけですが、 そのシェルプログラムが自分の使っているPCの画面を直接アクセスするなんて夢でも見ているんですか?
786 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 08:23:14 ] >>780 マルチバイト文字などに関係なく、標準入出力は 行単位バッファリングされていることが多い。 バッファリングなしにしても、まあ正しいマルチバイト文字列になった時点で 正しく表示されると仮定していいと思う。
787 名前:780 mailto:sage [2007/07/06(金) 08:24:22 ] >>785 ということはOSの画面表示を担当するプログラムが putchar()で2バイト文字の一部を出力しようとした時に 2バイト文字の一部だと判断し表示を一時中断して 次に送られてくるputcharの引数と組み合わせて それに対応する2バイト文字を出力していているんでしょうか?
788 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 08:26:31 ] 2バイト文字で、1バイト目単体で文字としてなりたっているようなのってなんかあったっけ?
789 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 08:28:46 ] >>788 iso-2022-jpの1バイト目はASCII文字と同じコード。
790 名前:780 mailto:sage [2007/07/06(金) 08:30:47 ] >>786 行単位でバッファリングするんですね それで予め2バイト文字があるかないか調べるわけですか、なるほど
791 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 08:39:37 ] >>789 Shift_JISしか考えてなかった。参考になった ありがとう
792 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 08:41:44 ] 文字コードの体系もしっかり管理しときゃ良い。
793 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 09:11:21 ] 型で区別するんじゃない? char型ならその分のデータを受け取るまで待つ
794 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 09:18:02 ] ASCIIコード体系でなければ左へ受け流すぅ〜
795 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 11:50:43 ] 1: 3.2 2.6 3.4 2.1 5.2 3.4 5.2 2.4 4.2 4.1 0.2 4.2 5.3 2: 3.2 2.4 3.4 2.2 5.2 3.4 5.2 2.4 4.2 4.3 0.2 4.2 5.3 3: 3.1 2.6 3.4 2.1 6.2 3.4 5.2 2.4 4.2 4.0 0.2 4.2 5.3 っていうデータがあるとして 10個目(つまり4.3 4.1 ,4.0)だけを抜き出すプログラムをつくれといわれると float型でやりますか?char型でやりますか?
796 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 12:26:17 ] 「作れ」っつった本人に仕様を確認する。
797 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 13:03:17 ] とりあえず float は使わない。 使うなら double 。
798 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 13:51:36 ] つーか、計算もしないし区切りもはっきりしてるなら 文字列のままで通しちゃったほうがいいべ
799 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 14:01:23 ] >>793 それはない。そんなことしたら、ファイルにリダイレクトできない。 >>791 iso-2022-jpの場合、KanjiInが来た後は2バイト文字、そうでなければAsciiという分け方。 だから2バイト文字の後にKanjiOutが来ないと文字化けする。 >>790 バッファリングはするかもしれないが、出力の判断とは直接的には無縁。 でなければエスケープシーケンスでの制御ができない。
800 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 15:41:47 ] >>799 >KanjiInが来た後は >KanjiOutが来ないと そんなコード/シーケンスはありません。
801 名前:デフォルトの名無しさん [2007/07/06(金) 18:09:25 ] Windows2000で作られたソフトはWindowsXPではうまく動作しないことが あるのですか。LSI C-86を使ってC言語を学ぶという趣旨の本を5年前に 買ったのを今になって勉強しようとしてインストールしたという次第です。 最初のコマンドプロンプトがC:\>になるはずのところ、C:Documents and Settings□□>となりエラーと表示されました。□□は、再起動時に アカウント指定を要求され、自分の名前を入れたものです。 別な場所へインストールすればよいのですか。よろしくお願いします。
802 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 18:15:05 ] >>801 LSI-C86は遺物なので、特殊性を理解できていないなら使ってはいけない。 MSのVisualStudioでもgccでも、無料で手に入るほかのコンパイラを使うことをお勧めする。
803 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 18:18:59 ] まあコマンドプロンプトをC:\>にしたいなら、cd \ でいいけどな。 本と同じになるだけで、役には立たないだろうけど。
804 名前:デフォルトの名無しさん [2007/07/06(金) 18:26:59 ] >802 responseありがとうございます。早速入手しようと思います。
805 名前:デフォルトの名無しさん [2007/07/06(金) 18:43:58 ] ソーカcd¥−enterで続けられるのか。
806 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 18:59:38 ] >>800 の意図が気になる。
807 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 19:03:18 ] >>804 たぶん電子メールのレスと2ちゃんのレスは同じ意味を持ってると思うんだが、 だとしたら君が使ってるresponseはレスという意味とは違うぞ
808 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 19:06:00 ] >>807 ja.wikipedia.org/wiki/%E3%83%AC%E3%82%B9
809 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 19:37:26 ] nullponceというのを提案しまnce
810 名前:723 mailto:sage [2007/07/06(金) 19:39:17 ] >>729 忘れてた
811 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 19:43:03 ] 英語版ウィキペには Reply. Its abbreviation followed by colon (Re:) is prepended to e-mail subject lines when answering a received message って書いてるんだよな。 まあ、スレ違いだからどうでもいいが。
812 名前:デフォルトの名無しさん [2007/07/06(金) 20:22:37 ] A)入力装置に関する記述のうち,適切なものはどれか。 1 ジョイスティックは,画面上に透明なセンサを取り付けたものであり,画面に指などを押し付けて座標を指示する。 2 タブレットは,ペンのような装置と板状の装置を組み合わせた入力機器であり,ペンのような装置を押し付けて座標を指示する。 3 ディジタイザは,人間のもつ静電気を利用して指の位置を検出するポインティングデバイスであり,操作面を指して座標を指示する。 4 トラックパッドは,球の一部分が装置の上面に出ているポインティングデバイスであり,球を指で直接回転させて,その変化量で座標を指示する。 すみません、質問なのですが今上の問題がハードウエアの組み込みの 参考書の問題がわかりませんので、教えてはいただけないでしょうか?
813 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 20:25:09 ] >>812 2
814 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 20:26:34 ] 1はジョイスティックの説明ではない事は明らかだから× 2は正しいと思うから○ 3は知らんから知らん 4はトラックパッドじゃなくてトラックボールの説明だから×
815 名前:デフォルトの名無しさん [2007/07/06(金) 20:29:48 ] ありがとうございました。 これで先に行けます。
816 名前:デフォルトの名無しさん [2007/07/06(金) 20:32:06 ] 制御系といえば、C言語だけど Cのすごい所って何?
817 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 20:38:01 ] 体にぴったり張り付くスク水の用に、ハードウェアに貼り付ける所
818 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 20:38:40 ] >>816 おまえの方がすごいと思う。
819 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 20:38:58 ] 3はタッチセンサとか、タッチスクリーンとか言われている物のうちの1種だね
820 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 20:41:36 ] >>812 3の説明がトラックパッドっぽいな
821 名前:デフォルトの名無しさん [2007/07/06(金) 20:42:36 ] C言語にできることは、C++にもできるって聞いたんだけど、 C++も体にぴったり張り付くスク水のように、 ハードウェアに貼りつけるの??
822 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 20:43:22 ] Cと同じようにできる。
823 名前:デフォルトの名無しさん [2007/07/06(金) 20:44:46 ] C++もC言語と同じように最強ならば、 C++も制御系によく使われるの? それともC++はオープン系(WEB系も含む)?
824 名前:デフォルトの名無しさん [2007/07/06(金) 20:47:10 ] 質問です。年月日を入力してツェラーの公式を利用して曜日を表示するプログラム をつくりたいんですけど、BCCでコンパイルしたら公式のところでエラー 「浮動小数点の不正な使用」ってでるんですけど、どうしてだかわかりますかね? #include <stdio.h> int main(void){ int year,month,day; char youbi[7][10]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"}; int i; printf("Year?"); scanf("%d",&year); printf("Month?"); scanf("%d",&month); printf("Day?"); scanf("%d",&day); i=(year + (year/4) - (year/100) + (year/400) + (2.6*month +1.6) + day)%7; printf("It's %s.",youbi[i]); return 0; }
825 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 20:49:26 ] >>821 C++の場合スク水フェチのオジサンが自分で着る用に作ったものもあるので注意
826 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 20:56:27 ] >>824 (2.6*month +1.6)を(int)(2.6*month +1.6)にしろ。 ここが整数でないから、%の左側全体が整数型でなくなっている。 剰余演算子は浮動小数点数を演算対象にできないので、件のエラーになる。
827 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 20:57:13 ] >>823 Cが制御系で使われるのは「最強」だからではなく「高級アセンブラ」だから。 C++も制御系で使われるよ。C++として使われるかはともかく。 つか、最強ってなんだよ。
828 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 20:58:38 ] >>824 剰余演算子%というオペランドは整数同士でないとダメ 演算してる行の型がごっちゃになってるから明示的にキャストしたり読みやすくすべき 基本的にコメント文とかで説明もなしに実数を整数に叩き込んだりしちゃだめ
829 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 21:19:14 ] なるほど。できました、ありがとうございます。
830 名前:デフォルトの名無しさん [2007/07/06(金) 21:30:26 ] スレ違いかもだけど、ここの人達他のスレより頼りになりそうなので。。。 基本情報の午後問をCで受かりたいのですが、なんの本を読めばいいですか? 当方、C言語はよくわかりません。COBOLは少しできます。 ただCで受けたいのです。
831 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 21:32:10 ] >>830 試験は慣れたものでやるべき
832 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 21:58:20 ] >>830 アセンブラがオススメ 例年一番簡単
833 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 21:59:06 ] C言語ってeclipceかbolandか、 それともvisual basic かどれでやればいいですか?
834 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:04:13 ] その質問おもしろい?
835 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:10:25 ] visual studioだっけ?
836 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:12:46 ] >>833 Linuxでもできるよ。
837 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:14:19 ] 整数型配列は int iarray[10]; memset(iarray, 0, sizeof(array)); ですべて0で初期化できると知ったのですが、 実数型配列を double darray[10]; memset(darray, 0.0, sizeof(array)); のように初期化してもかまいませんか? つまり実数型配列の全ての要素を0.0にしたいのです
838 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:16:31 ] >>837 いいんじゃね? DirectXとか、そういう方法で、実数やらポインタやらバリバリクリアしてたな。 移植性は無くなる。
839 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:17:55 ] > memset(darray, 0.0, sizeof(array)); あ、これは、警告かエラーになるな。 sizeof のところはミスだよね?
840 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:19:54 ] >>837 ANSI/ISO Cへの移植性を望むなら避けるべき。 浮動小数点数がIEEE 754に則っていることを仮定してよいなら構わない。
841 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:21:17 ] >>833 ほとんどにアルゴリズムの問題 ポケコンのCインタプリタでおk
842 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:26:29 ] >>839 あと、0.0 は 0 だな。
843 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:27:49 ] >>839 すみません sizeof(darray) です あとmanページでmenset関数を調べてみると #include <string.h> void *memset(void *buf, int ch, size_t n); となっていたので int ch に0.0と渡してもだめなんですね ということは関数の仕様上は memset(darray, 0, sizeof(darray)); と書くのが正しくて、 しかもCコンパイラの浮動小数点がIEEE754前提での使い方なので 結局は配列の要素数の分だけループで回して初期化するのが 一番いちゃもん言われにくいということでよろしいでしょうか? ありがとうございました
844 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:29:23 ] エクセス64で 0 ってどうなるの?