1 :
ジョブス2世 :
2001/05/15(火) 21:21
3 :
デフォルトの名無しさん :2001/05/15(火) 22:18
御苦労さんage
がんばってね>ジョブス2世
5 :
C言語見習い :2001/05/16(水) 00:18
構造体について勉強しているのですが #include<string.h> struct cell{ double num; struct cell *next;} この宣言に意味がよく分かりません。 どうかご教授ください。
>>5 >この宣言に意味がよく分かりません。
質問の意味がよく分かりません。
7 :
>6 :2001/05/16(水) 00:29
おそらく初心者が本当にわからんのはこの部分だろうね。 struct cell *next; /*構造体の自己参照*/ 初心者が、あくまでも*参照*であって、実体ではないことに 気付くのはいつの頃だろうか。
8 :
名無し :2001/05/16(水) 00:29
そのくらい自分で参考書見て勉強すれば、わかるだろ!
9 :
C言語見習い :2001/05/16(水) 00:40
>>7 様
すみません。どう質問すればいいのかも分かりませんでした。
その通りstruct cell *next; この部分です。
構造体の自己参照で調べてみたいと思います。
ありがとうございました。
10 :
デフォルトの名無しさん :2001/05/16(水) 00:42
>>7 そんなに参照って負担になるかなあ?
俺は抵抗を覚えたり理解できなかったりした記憶が
全くないんだけど。
というか、さくっと理解できる人とそうでない人が
色々いるのかなあ。
いわゆる本来の意味での頭のよさとは多分別だ(w
わからなかったやつがここ
>>5 にいるだろ。
多分、右脳の発達具合とか、そんなものなんだろうね。
12 :
C言語見習い :2001/05/16(水) 01:17
すみません。調べてみましたが理解し切れませんでした。 ヒントだけでもいただけないでしょうか?
値==そこにある建物
参照(ポインタ)==住所かな。
nullポインタ==該当宛先なし。
cell a;//値
cell* pb;//ポインタ
pb = &a;//aのメモリ上の住所をpbに書き込む
>>5 は、単方向リンクリスト構造の各要素の為の宣言。
構造体のなかに、「次の構造体の住所」を書いておくところがあるということ。
ここに「次の構造体の住所」を書く。
次の構造体のその場所に、「次の次の構造体の住所」を書く。
…
で、数珠つなぎのデータの列(配列とはちょっと違っていて、要素はメモリ上の
あちこちにある)ができるというわけさね。それが何の意味があるのかは、勉強せい。
14 :
7>12 :2001/05/16(水) 01:31
イメージとしては、自分の指で自分の事を指す事と同義。 でも指で指せる対象は他人という場合もありえる。 typedef struct 人 *誰か; struct 人 { 誰か 指で指す; /* 自分や他人 */ }; test() { struct 人 わたし; struct 人 あなた; わたし.指で指す = &あなた; /* わたしはあなたを指で指す */ }
15 :
デフォルトの名無しさん :2001/05/16(水) 01:40
>>12 int i;
cell a[N+1];
cell* pcell;
for(i=0;i<N;i++) cell[i].next = &cell[i+1];
cell[i]next. = NULL;
//芋づる式にnumを参照この場合適当な値だけどな
for(pcell = &a[0];ipcell != NULL;pcell = pcell->next){
pcell->num;
}
普通はヒープを使うがな。動的確保が分からなければそれを
調べる事だ。
16 :
7> :2001/05/16(水) 01:44
誰か どなたかが指してる相手は?(誰か どなたか) { return どなたか->指で指す; } test2(誰か わたし) { 誰か 誰でしょう = どなたかが指してる相手は?(わたし); if (誰でしょう == &あなた) printf("わたしはあなたを指しています。\n"); else printf("わたしはあなた以外を指しています。\n"); }
17 :
デフォルトの名無しさん :2001/05/16(水) 01:47
C++をはじめたばかりで拙い質問ですが。 typedef float foo[3]; のような組み込み配列で作った型をコンテナとしてSTLで使おうと 思ったのですが、 typedef std::vector<foo> bar; という宣言を行うと、コンパイルエラーになってしまいます。 これはどのような理由で、どのようにすれば使えるようになるの でしょうか?
18 :
デフォルトの名無しさん :2001/05/16(水) 02:05
参照は、今の我々がすごく馴染んでいるものでいえば、 WWWのリンクが、一番似てるぞ。 #おかげで説明しやすくなったよ今は…しみじみ… structの宣言はwww頁の雛型みたいなもんだ。 便利なHTMLエディタ使ってるみたいなイメージな。 実行時にその変数を作ったりnewで作ったりするのは 雛形から自分の頁を1つづつ作るのと同じだ。 *nextっていうメンバは、「次の頁へ」のリンクだ。 で、実際に次の頁ってどの頁なのよ?という話は、 実行時つまり雛型から頁書き起こした時に決めるわけな。
19 :
デフォルトの名無しさん :2001/05/16(水) 02:10
そりゃ配列はテンプレートに書けないんじゃない? class foo{ flaot value[3]; } vector<foo> bar; とか、valueって名前が出てきちゃうのがウザイね
20 :
:2001/05/16(水) 02:18
19 ついか class foo{ float value[3]; float operator[](int i){return value[i];} } これでOKか
21 :
デフォルトの名無しさん :2001/05/16(水) 02:20
float& operator[](int i){return v[i]; すまん&が抜けた。鬱だ氏脳
22 :
デフォルトの名無しさん :2001/05/16(水) 02:22
>>17 そのコード、私の環境では通りました。
VC++をお使いなら、最新のサービスパックを当てましょう。
23 :
>20 :2001/05/16(水) 02:23
つーかpublicが抜けてる。(重箱すまそ)
24 :
デフォルトの名無しさん :2001/05/16(水) 02:26
>>17 コンストラクタとデストラクタが定義されていないから駄目なんじゃ。
classやらstructで包むしかないね。
25 :
デフォルトの名無しさん :2001/05/16(水) 02:27
>>19 templateの機能が標準に追随できてない古いコンパイラだとそうするしかないですね。
あと、vectorに格納するならoperator<とoperator==を定義してやる必要があります。
26 :
名無し :2001/05/16(水) 02:34
え?
27 :
デフォルトの名無しさん :2001/05/16(水) 02:35
typedefしないで書く時って vector<float[3]> hoge; とかでOK?
28 :
デフォルトの名無しさん :2001/05/16(水) 02:37
vector<float[3]> hoge; で通るね
29 :
25 :2001/05/16(水) 02:49
すんません、それはmapに格納するときの話でした(藁 vectorはそんな必要ないですね。逝ってきます……
30 :
デフォルトの名無しさん :2001/05/16(水) 03:07
>>25 今の規格だと std::vector<T> って T が左辺値になれない型でも大丈夫なんですか?
昔 vector の実装を読んだときには
T __x_copy = __x
みたいなコードがあって、T が左辺値になれないとダメだった覚えが。
手元の g++ (2.95.2), Visual C++ 6.0, Borland C++ Compiler 5.5 で試してみましたが、
vector<float[3]> hoge; だと construct はできるけど push_back できませぬ。
そもそも、C言語とはなんですか?師匠。
32 :
学生 :2001/05/16(水) 04:15
分割コンパイルあたりが分からんです(曖昧でごめんなさい) test1.cってファイルがこんな感じ #include <stdio.h> struct db{ char name[10]; }; int data_in(struct db data[], char *in_name, int index, int max); int main() { 中略・・・ index = data_in(data, in_name, index, 5); ・・・ } =============================== test2.cはこんな感じ #include <stdio.h> int data_in(struct db data[], char *in_name, int index, int max) { 中略 } で、bcc32 -wc test.c test2.c ってコンパイルするとtest2.cで「未定義の構造体 'db'」 とエラーに成ります。 構造体を大域で宣言してるけど、他のファイルからじゃスコープ外 ってことなんですか? アンポンタンなことやってたらごめんなさい。
33 :
学生 :2001/05/16(水) 04:17
長すぎましたね・・・。切れてる部分 で、bcc32 -wc test1.c test2.c ってコンパイルするとtest2.cで「未定義の構造体 'db'」 とエラーに成ります。 構造体を大域で宣言してるけど、他のファイルからじゃスコープ外 ってことなんですか? アンポンタンなことやってたらごめんなさい。
>>32 定義と宣言の違いをよ〜っく勉強せえ。K&Rに書いてあるよ。
35 :
学生 :2001/05/16(水) 06:04
K&R買ってきます・・・。 でも、もうチッと教えて〜。 ヘッターファイルにプロトタイプ宣言すれはええってことすっか?
bcc32 -wc test1.c test2.c は bcc32 -wc test1.c bcc32 -wc test2.c と2回に分けてコンパイルしたのと同じことだろ。 bcc32 -wc test2.c だけコンパイルすると未定義といわれるのは当然では?
結局time以外のsrandの種ができませんでした。(T_T) clockでは駄目だった。どう作ればいいのでしょう?
38 :
デフォルトの名無しさん :2001/05/16(水) 09:47
clock()はmsvcrtの実装だとプロセスが開始されてからの 時間をミリ秒単位で返すので、初期化部分に書いておくと ほとんどの場合同じ値を返します。 APIのGetTickCount()やQueryPerformanceCounter()のどちらか を使うといいと思います。ちなみに95系だとGetTickCount() は10ミリ秒単位の精度しかなかったと思います。 QueryPerformanceCounter()は64ビットの値を返すので、 上位、下位の32ビットでXORとるのがいいと思います。 POSIXなら、gettimeofday()システムコールですね。
39 :
34 :2001/05/16(水) 10:27
>>35 なかなか良いところを突いてるぞ。
>>36 微妙にそう言う問題じゃないことに気付け。
40 :
学生 :2001/05/16(水) 10:52
>34 サンクスコ とりあえず、後はK&R見て質問しますね。 僕が思ったのは、bcc32のオプションで解決する方法とか 有るのかと甘い考えもしてましたが、こっちがアンポンタンっすね。
41 :
デフォルトの名無しさん :2001/05/16(水) 11:47
1 2 3と入力した時に3 2 1 と表示したいのですが、 どこかで狂ってしまいました。 教えて下さい。 typedef struct{ int a; }b; void main(void) { b p[N]; int i; for(i=0;i<N;i++){ scanf("%d",&(p[i].a)); } sort(p[i].a); for(i=0;i<N;i++){ printf("%4d\n",p[i].a); } void swap(int* a, int* b) { int x; x = *a; *a = *b; *b = x; } void sort(b p[]) { int i = 0; int j = 0; for(i = 0; i < 3; i++) { for(j = i+1; j < 3; j++) { if(p[i].a < p[j].a) { swap(&(p[i].a), &(p[j].a)); } } } }
>>41 ・#define N 3
・sort(p[i].a); → sort(p);
・mainの閉じカッコ
ちなみにコンパイル通ったの?
43 :
41 :2001/05/16(水) 15:43
>>42 さん 解決できました!ありがとうございます。 sort(p[i].a); → sort(p); にしたら、直ったのですが、意味を理解できません(^^;
44 :
デフォルトの名無しさん :2001/05/16(水) 16:38
バカ?
45 :
デフォルトの名無しさん :2001/05/16(水) 19:10
GDBで、 print/f sin(0) って打つと0にならないのは何で?
>>43 sort 関数は b (←何でこんな名前を付ける?) のポインタを
受け取るんだから、当然 b のポインタを渡さなきゃダメでしょ。
47 :
デフォルトの名無しさん :2001/05/17(木) 00:28
48 :
850 :2001/05/17(木) 06:54
>>825 さん
>>> for(i=0; i<N; i++)
>>> printf(" %d %d\n",i,a[i]);
>>> sort(point);
>>> for(i=0; i<N; i++)
>>> printf(" %d %d\n",i,a[i]);
>>> sort(昇順に並び替え)した時に、
>>> a[i]の値は昇順になるのですが、iの値もそれと対比させて、
>>> 出力するにはどうすればよいのでしょうか?
>> int j[N] ;
>> for(i=0;i<N;i++){
>> j[i]=i;
>> printf(" %d %d\n",i,a[i]);}
>> sort(point);
>> for(i=0;i<N;i++)
>> printf(" %d %d\n",j[i],a[j[i]]);
>> ※sort(a[j[i]]の結果で、jをsortする)
> j[i]=i;
> って事は、
> printf(" %d %d\n",i,a[i]);}と
> printf(" %d %d\n",j[i],a[j[i]]);
> は、同じ意味になるのではないでしょうか?
iの値もそれと対比させて、出力すると言う事は、
同じ意味になって良いと思いますが、違いますか?
もしそうならば、あとは、全体の出力する順番を変えればOK。
j[N]をsortすれば、その順番がsortされるので、
その結果、元の順番がj[N]に残り、a[j[N]]は、sortされています。
またまた分かり辛いですが、もう少し頑張ってみて下さい。
49 :
デフォルトの名無しさん :2001/05/17(木) 09:41
50 :
デフォルトの名無しさん :2001/05/17(木) 23:16
51 :
デフォルトの名無しさん :2001/05/17(木) 23:46
main(int argv, char *argc[] ) main(int argc, char *argv[] ) より一般的なのはどっち?
>>45 (gdb) print/f sin(0)
No symbol table is loaded. Use the "file" command.
(gdb) printf sin(0)
Bad format string, missing '"'.
なんかへん
>>51 一般的ってそういう問題じゃないだろゴラァ
count vector
54 :
デフォルトの名無しさん :2001/05/18(金) 12:53
>>52 math.hをインクルードしていないプログラムを実行させていませんか?
55 :
ちゃちゃいれ野郎 :2001/05/18(金) 15:46
>>51 ,
>>53 >count vector
counter vector
だピョン。
56 :
デフォルトの名無しさん :2001/05/18(金) 16:12
57 :
デフォルトの名無しさん :2001/05/19(土) 00:19
123.4567 を_123.4567(_はスペース) のようにするには、 %4fでいいのですか?
58 :
名無し :2001/05/19(土) 00:22
%4.4f
59 :
デフォルトの名無しさん :2001/05/19(土) 23:56
処理が大きくなって途中で分からなくなり、ダメでした。 どうやればいいのでしょうか? 入力@と入力Aの各レコードでマッチング処理を行い、一致した物を抽出。 (シーケンシャルマッチ) ・マッチング処理は、 項目keyで行う ・各入力は全て項目keyでソートされている ・一致するレコードを一対とする ・入力keyにマッチしなければ、メッセージを出力 入力@フォーマット(主key) 項目key|品目名|日付 入力Aフォーマット 項目key|品目名|金額 出力フォーマット(結果) 項目key| 日付 |金額|品目名 *入力@(a.txt)と入力A(b.txt)は、既にあるファイルから読みとります。 *|は(0x7C)です。 *項目keyは、数字で4Byteです。
60 :
デフォルトの名無しさん :2001/05/20(日) 01:14
構造体の変数をもっとも簡単に シリアライズする方法おしえて。
そのままバイト配列にキャスト>60
C言語初心者の質問をちょっと聞いてください. パーセント(%)で表示させようとして 試みているのですが、どうもうまくいかないんです. キャスト、floatを使ってみたのですが、 うまくいきません。 どうやれば、うまく処理できるんでしょうか プログラマーの皆様、どうか教えてください。 お願いします。 int main (void) { int kazu=100; int a=3; float ans; int ritu;/*%で出す変数*/ ans=(float)2/100; printf("%1.3f\n",ans); ritu=ans*100; printf("%f\n",ritu); return 0; }
63 :
デフォルトの名無しさん :2001/05/20(日) 16:10
初心者です FILE *fp; for........ c=getc(fp); なぜfp++としていないのにcにはつぎつぎとファイルの値が ほりこまれていくのですか?
64 :
デフォルトの名無しさん :2001/05/20(日) 16:13
>>63 <stdio.h> 読みなよ。
というか、なんで fp++ で次のバイトが読み出せると思ったんだい?
VC++ってフリーソフトですか? マイクロソフトのホームページでダウンロードできますか?
67 :
63 :2001/05/20(日) 19:02
>>64 よんでもよくわかりませんごめんなさい。
c=getc(fp);
c=getc(fp);
c=getc(fp);
なにも操作していないのになぜcの内容がかわっていくの??
68 :
63 :2001/05/20(日) 19:05
abcdefg(改行) cdefgahkl(終わり) getcで上記のファイル内容を読もうとしたら 改行の手前までしか読めないのです。2行目はどうすれば読める のでしょうか。よろしくおねがいします。
>c=getc(fp); >c=getc(fp); >c=getc(fp); >なにも操作していないのになぜcの内容がかわっていくの?? 思いっきりgetc(fp)の結果をcに代入してるじゃん。(w ネタなら下げてやってね。
70 :
63 :2001/05/20(日) 19:23
ネタになるほどばかなのか ハァ getc(fp)とするごとに つぎの値をとっていくとゆうことで それはもうルールとしてきまりきったことなのですか?
71 :
デフォルトの名無しさん :2001/05/20(日) 19:27
>>67 fopenで開いたファイルは、現在の「読み・書きの位置」って情報を持ってるのね。
メモ帳のカーソル位置みたいなもの。
getc()はその読み・書き位置にある文字を返して、読み・書き位置を1つ進める関数。
だから、getc()を呼ぶたびに返る値が変わる。
ちなみに、現在の読み・書き位置を知りたければftell()、変更したければfseek()を使え。
>>70 だから getc() の定義を読みなよ。
73 :
63 :2001/05/20(日) 19:34
>>71 さんありがとうございます。わかりました
もしよろしければ
>>68 もおねがいしたいのですが
>>72 >>定義の説明に1文字読み込むとありました。だから
次に読む文字はどう指定するのかなと疑問に思っていました。
74 :
72 :2001/05/20(日) 19:37
>>73 定義というのはソースコードのことね。
環境依存だけど、たいていは FILE 構造体の中にバッファと、現在どこまで読んだか
の情報が格納されている。FILE 構造体と getc() 読めば全て書いてあるわけだが、
getc() はちょっと読みにくいかもしれない。
>>68 そんなはずはない。
'\n'が読まれることはわかってるか?
76 :
デフォルトの名無しさん :2001/05/20(日) 19:51
>68 getc()でも改行は読めるぞ。 getc()==0x0Aのときが改行。
>>63 あなたは荒らしと同じ事をしているのに気が付いてますか?
ここで基本的(Cを全く理解してない)な事を質問し続けられるのは迷惑でしかない。
C言語の本何冊か読破してから出直してください。
これはまじめな話です。
78 :
3冊読破した人 :2001/05/20(日) 20:27
>初心者です >FILE *fp; >for........ > c=getc(fp); >なぜfp++としていないのにcにはつぎつぎとファイルの値が >ほりこまれていくのですか? これわしも疑問。原理的にどうなってるのか知りたい。 C実践プログラミングにも独習Cにも載ってなかったよ。
>>78 だから <stdio.h> 読んでくれよ……
VC++6 の stdio.h からコピペ。うりゃ。 struct _iobuf { char *_ptr; int _cnt; char *_base; int _flag; int _file; int _charbuf; int _bufsiz; char *_tmpfname; }; typedef struct _iobuf FILE; /* Macro definitions */ #define getc(_stream) (--(_stream)->_cnt >= 0 \ ? 0xff & *(_stream)->_ptr++ : _filbuf(_stream))
81 :
63 :2001/05/20(日) 20:56
>>71 -76大変ありがとうございました。
ほぼ解決しました。
もっと初心者向けのスレに質問しようかなやみました。
>>77 うーん、タイトルと質問を見比べましたが嵐ほどには
ならないとおもうのですが。。嵐なら大変失礼しましたm(__)m
83 :
デフォルトの名無しさん :2001/05/20(日) 21:06
59の者だけど誰か教えてくれ …くれは、ダメ?
84 :
デフォルトの名無しさん :2001/05/20(日) 21:44
63よ。 あなたは、別に荒らしじゃないぞ。 できれば、同様の質問をを初心者から受けたら親切に 答えてやってくれ。それが77を見返す正当な手段だと 思うぞ。分かりやすく答えた時が真に理解した証だ。
>>63 多分根本的なことを理解していないので、
わざとやってんじゃないのか?と思われてしまうんでしょう。
K&Rを頭から最後まで読んでみるのをおすすめします。
87 :
デフォルトの名無しさん :2001/05/20(日) 22:25
>>59 どの辺りがわからなくなったの?部分的なら回答する気も起きるが
それともプログラム1本全部晒せってか?
88 :
デフォルトの名無しさん :2001/05/20(日) 23:37
>87 iskanjiを使っての0x7cを探すとこの処理。できれば、memcmpとstrcmpのどちらの 方が効率的かの指摘いただければ…。 >プログラム1本全部晒せってか? やって見せてくれるなら有り難い。
89 :
!87 :2001/05/20(日) 23:43
memcmp>88
90 :
名無したん :2001/05/21(月) 00:40
思いっきり課題で申し訳ないのですが・・ 一行に1単語が書かれたファイル「test.txt」からファイルを読み込み、それ をソートして「tests.txt」に書き出すプログラムを作れと言われました。 読み込んでいく所までならなんとかなったのですがソートして書き出すというやり方 が分かりませんです。文字列比較ならstrcmpを使えばいいんでしょうが・・。 #include <stdio.h> #define BUFFER_SIZE 200 void main(){ char buffer[BUFFER_SIZE]; FILE *fp; fp = fopen("test.txt", "r"); if ( !fp ){ printf("ファイルオープンエラー\n"); return; } while( fgets(buffer, BUFFER_SIZE, fp) ){ printf("%s", buffer); } fclose(fp); } test.txtがこうだったら・・ osaka hyogo kyoto nara wakayama shiga tests.txtが hyogo kyoto nara osaka shiga wakayama みたいになればいいようです。どなたかご教授お願いします。
91 :
45 :2001/05/21(月) 09:24
GDBで、 print/f sin(0) って打つと0にならないのは何でですか??
>>91 ソース中に
printf("%lf\n", sin(0));
を入れてみろ、出力結果が0でない場合、以下の原因が考えられる。
・math.hがincludeされていない
・数学関係のライブラリがリンクされていない(unix系だとlibm.sl)
math.hをincludeしないでコンパイル&実行ができた上に
結果が間違っている理由は知らん(誰かのフォローを期待)
それが嫌ならC++のコンパイラを使え、宣言していない関数を使おうとすると
コンパイル時にエラーとなる。
>>90 #include <stdlib.h>
int main(void)
{
return system("sort test.txt > tests.txt");
}
すまん、ネタだ。
> ソートして書き出すというやり方が分かりませんです。
まず、1行しか覚えていないのが問題。
ソートをする為には全ての行を覚えておく必要がある。
> char buffer[BUFFER_SIZE];
ではなく
char buffer[MAX_LINE_SIZE][BUFFER_SIZE];
として
int i, max_line;
/* 行の読込み */
for (i = 0 fgets(buffer[i], sizeof(buffer[0]), fp) && i < MAX_LINE_SIZE; i++ )
;
max_line = i;
if(max_line == MAX_LINE_SIZE) {
printf("行が多すぎて読めん\n");
exit( -1 );
}
/* ソート */
qsort(buffer, max_line, sizeof(buffer[0]), strcmp);
/* ソートの検証 */
for (i = 0 i < max_line; i++ ){
printf("%s", buffer[i]);
}
ファイル出力は宿題だ。これぐらいは自分でヤレ。
ソート関数は自作したいのなら検索エンジンに聞け。
課題ならば「バブルソート」をキーにすれば十分だろう。
>>62 > 試みているのですが、どうもうまくいかないんです.
> うまくいきません。
こんな質問の仕方では煽られるか放置されるかのどちらかです。
そのコードを実行した結果、どうなった?
何が出力されるとうまくいったことになるの?
我々はあなたの書いたコードは見えてもあなたの頭の中は見えません。
> int ritu;/*%で出す変数*/
> printf("%f\n",ritu);
int型で%fは使えません。
95 :
45 :2001/05/21(月) 15:29
>>92 もちろん、math.hはインクルードしてます。
printf("%lf\n", sin(0));
の結果は0になります。
GDBで直接print/f sin(0)
と書くと0でない結果になってしまいます。
96 :
デフォルトの名無しさん :2001/05/21(月) 16:33
構造体内の点数(文字型)を加算し、合計点の多い順番に並び替える。 並び替えの際、構造体のポインタを引数とする関数を作成する。
すれば?
98 :
デフォルトの名無しさん :2001/05/21(月) 19:29
>96 それが理解できてたら質問なんかしないと思われ。
どうでもいいけど、エラーとかプロンプトは fprintf(stderr, "ゴラァ\n"); としてほしいぞ。 って初心者は混乱するだけか? # UNIX でない人は無視してくれ。 # UNIX な人で初心者は心の中に秘めておいてくれ。
100 :
45 :2001/05/22(火) 11:10
101 :
Take :2001/05/22(火) 13:30
無限ループ内でKey入力等を受け取ったらループを脱出するような プログラムの作り方をご存知内でしょうか。 while(1) { /*処理*/ /*ループ脱出*/ } ちなみに do { /*処理*/ } while(getch() != 97) /* 97はAsciiでの 'a' */ のような処理だとgetch()関数で入力待ちになるので入力しない 時にはループを実行し続けるような処理がしたいんです。 (WindowのWinProc関数のような割り込み処理のようなもの) どうかお願いします。
102 :
デフォルトの名無しさん :2001/05/22(火) 14:30
select文じゃ駄目?
103 :
デフォルトの名無しさん :2001/05/22(火) 14:44
kbhit
104 :
デフォルトの名無しさん :2001/05/22(火) 15:04
>>101 OSが何か書かないとと答えようがない。
WinProcはコールバックで割り込みとは関係ない。
>>102 select文?VBの?(藁
>>101 マルチスレッドにすれば全部解決します。
やり方はOS依存なので自分で調べてください。
あと、'a'って書こうぜー?
106 :
デフォルトの名無しさん :2001/05/22(火) 18:22
107 :
デフォルトの名無しさん :2001/05/22(火) 19:05
構造体 PP long aa long bb void (*cc)() というものがあります。 short tmp[50] というものがあります。 ヘッダで以下のように宣言されています #define TMPAREA (*(PP **)&tmp[30]) tmp[32]には別の人がフラグとして情報をもたせてあります。 で、今解読しているソースで TMPAREA->bb = 50000; と書かれています。 コメントで /* tmp[30]にデフォルト値を設定 */ と書かれています。 これって問題なく動作するんですかねー??
動くかもしれないけど、 設計した奴が目の前に居たら殴るかも
109 :
107 :2001/05/22(火) 19:44
設計した人はいないけど、歴代の開発者はいっぱいいますよー 6年前から続いているシステムのソース修正を担当することになって ソース開いて 「はあ?」 の連発ですー
110 :
名無しさん@お腹いっぱい。 :2001/05/22(火) 19:49
>>100 ほんとだ、0にならんね。
#include <stdio.h>
#include <math.h>
main()
{
printf("%lf\n", sin(0));
}
をコンパイルして実行すると
0.000000
と表示する。
gdb a.out してから
(gdb) br main
(gdb) run
としたところで
(gdb) print/f sin(0)
$1 = 3.34344531e-13
とでた(Linux@Intel)。
e-13だから殆ど0だけどね:D
111 :
デフォルトの名無しさん :2001/05/23(水) 01:04
112 :
デフォルトの名無しさん :2001/05/23(水) 19:32
下のプログラムのなかの if (fds[0] != STDIN_FILENO) { dup2(fds[0], STDIN_FILENO); close(fds[0]); } がさっぱり分かりません。dup2を詳しく 解説してください switch (pid0 = fork()) { case -1: fprintf(stderr, "%s: cannot fork\n", argv[0]); return -1; case 0: close(fds[1]); if (fds[0] != STDIN_FILENO) { dup2(fds[0], STDIN_FILENO); close(fds[0]); } execl("/usr/local/bin/wc", "wc", "-l", NULL); execl("/usr/bin/wc", "wc", "-l", NULL); execl("/bin/wc", "wc", "-l", NULL); _exit(-1); } switch (pid1 = fork()) { case -1: fprintf(stderr, "%s: cannot fork\n", argv[0]); return -1; case 0: close(fds[0]); if (fds[1] != STDOUT_FILENO) { dup2(fds[1], STDOUT_FILENO); close(fds[1]); } execl("/usr/local/bin/ls", "ls", "-1", NULL); execl("/usr/bin/ls", "ls", "-1", NULL); execl("/bin/ls", "ls", "-1", NULL); _exit(-1); }
113 :
デフォルトの名無しさん :2001/05/23(水) 20:35
dup2って何する関数だっけ?
>>112 > dup2を詳しく解説してください
man dup2
名前
dup2 - duplicate an open file descriptor
形式
#include <unistd.h>
int dup2(int fildes, int fildes2);
DESCRIPTION
The dup2 function causes the file descriptor fildes2 to
refer to the same file as fildes. The fildes argument is a
file descriptor referring to an open file, and fildes2 is a
non-negative integer less than the current value for the
maximum number of open file descriptors allowed the calling
process. See getrlimit(2). If fildes2 already refers to an
open file, not fildes, it is closed first. If fildes2 refers
to fildes, or if fildes is not a valid open file descriptor,
fildes2 will not be closed first.
The dup2 function is equivalent to fcntl(fildes, F_DUP2FD,
fildes2).)
115 :
デフォルトの名無しさん :2001/05/23(水) 20:59
116 :
デフォルトの名無しさん :2001/05/23(水) 23:18
118 :
デフォルトの名無しさん :2001/05/24(木) 01:04
>>116 >どうやればいいのでしょう?
自殺でもすればー?
>>116 >処理が大きくなって途中で分からなくなり、ダメでした。
分割統治法を学び給え
120 :
デフォルトの名無しさん :2001/05/24(木) 04:28
>>96 比較関数が構造体のqsortで良いのでは?
>>112 dup2は、ファイルハンドルを複製する関数なので、
(ファイルハンドルについての、細かい事は自分で調べて下さい)
あとは、「STDIN_FILENO」の定義次第だけど、
普通に考えれば、stdinのファイルハンドルではないかと…。
つまり、この処理後は、fds[0]からの入力は、
stdinからの入力として読み込む事が出来ます…多分。
>>59 別に、それ程難しい(複雑)とは思いませんが…。(^^;
取り敢えず、自分で作れるところだけ作って、
入力部、出力部、マッチ部、等々、幾つかの関数に分け、
どうしても上手く行かない部分だけ聞いた方が良いかと…。
121 :
デフォルトの名無しさん :2001/05/24(木) 20:39
>>110 GDBのバグですかね??
私は2.12121442になりました。
Linux Red hat 6.0にて
122 :
デフォルトの名無しさん :2001/05/24(木) 20:54
C言語用.INIファイル読み取りライブラリどっかに落ちてないですか? UNIXで使いたいのですが。
123 :
デフォルトの名無しさん :2001/05/25(金) 00:45
文字列 str1 の指定された位置(左端を0としてP番目の文字以降に 文字列 str2 を挿入し,結果としてstr3を作るプログラムを作成しなさい。 str1は ABCGHI str2は EFG str3は 空っぽ Pは 3 できるだけ簡単にお願いします。ちょうどIFとかWHILE文の所の 課題です。 死にそうです。 INTはI,J,k,P でお願いします。
C の予約語には IF, WHILE, INT なんてありません。
(もちろん、if, while, int もないです。)
そのあたりのセンスというか感覚を磨いてからでないと
C どころかコンピュータそのものを操るのは無理でしょう。
と書きつつも「標準ライブラリは使用してよいのか?」
と言ってみる。
>>123
125 :
デフォルトの名無しさん :2001/05/25(金) 01:26
一応,教科書どおりに書きました。 # include <stdio.h> void main() { って始まるやつです。 これに変数の型を指定するのに intやcharを使いますよね? 標準ライブラリ?なんだろ? ソフトは「LSIC」で,メモ帳で書いて拡張子をcにして アイコンにD&Dすれば勝手にコンパイル→exeファイルができる ものです。
ぜひとも
>>125 の「void main」には反応しない様にお願いします!
>>125 >って始まるやつです。
ここに反応しそうです。
128 :
デフォルトの名無しさん :2001/05/25(金) 01:51
>>125 この程度が自分で組めないようなら、、、学校?仕事?趣味?
趣味なら、頑張れ。
学校なら、友達に聞け。友達いない? 諦めろ。才能ないし。
仕事? 辞めろ。邪魔だ。
str3 = left(str1,3) & str2 だな(w
>>123 strncpy(str3,str1,p);
strcat(str3,str2);
strcat(str3,str1+p);
標準ライブラリベタ使い(w
これは冗談としても、この先どんどん課題難しくなるから、
今のうちに勉強するか学校やめるか考えたほうがいいよ。
それかレポートを丸写しさせてくれるような友達を見つけるか。
>(もちろん、if, while, int もないです。) 全角で書いたつもり↑
132 :
デフォルトの名無しさん :2001/05/25(金) 05:18
言わんとする事の細かい部分(変数の使い方)は、 良く分かりませんが、こんな所でしょうか? でも、LSIC使ってて、課題が出るような環境って…。 やっぱ、ネタ? (^^; ------------------------------ #define MAX 10 char str1[] = "ABCGHI" ; char str2[] = "EFG" ; char str3[MAX] ; size_t P = 3 ; void main () { size_t I ; size_t J ; size_t k ; I = J = k = 0 ; while ( I < P ) { str3[k] = str1[I] ; k++ ; I++ ; } while ( str3[k] = str2[J] ) { k++ ; J++ ; } while ( str3[k] = str1[I] ) { k++ ; I++ ; } } ------------------------------
size_tとか使うと確実に写したのがバレバレだろうね(藁
malloc()でメモリの確保に失敗したとき、NULLを返さずにmalloc() の中で落ちてしまうのですがこれはどういうことなんでしょうか? サイズが小さいと落ちないようですが、確保しようとするサイズは何か 関係ありますか?
135 :
デフォルトの名無しさん :2001/05/25(金) 09:39
その式書いてみーや
136 :
デフォルトの名無しさん :2001/05/25(金) 09:46
>>134 ライブラリの蟲かヒープ壊したかでしょ
Linuxだと失敗時は使った瞬間にSEGVだった気がする
137 :
123 :2001/05/25(金) 12:26
みなさん,助けていただいてありがとうございます。 独学で昨日始めたばっかりなんです。 ちょっといきづまってしまいました。 また来るかもしれませんが,冷たくしないでください。
138 :
質問翁 :2001/05/25(金) 12:58
Cに限ったことではないですが質問があります。 他のアプリケーションのウィンドウをSetParent で 自身の子ウィンドウにした場合の弊害は何ですか? MSDNには「新しい親ウィンドウと子ウィンドウは、 同じアプリケーションに属していなければなりません。」と 書いてありますが、試してみると一応表示されるんですよね。
140 :
デフォルトの名無しさん :2001/05/25(金) 13:43
#define WRK_CODE (100*0x18*2+1) main() { char mode; mode = !WRK_CODE; ・ ・ ・ ・ modeには何が入るの?
142 :
デフォルトの名無しさん :2001/05/25(金) 13:48
>>140 WRK_CODE をビット反転した結果
>>142 は大嘘なので信じないように。ビット反転演算子は「~」だ。
W32APIと標準関数(mallocなど)を混ぜて使っているのですが これは不具合の原因になりますか?
>>134 =145
だから、その式書いてみろや!
人のいうこと聞かずに一方的に質問しないこと。常識やぞ。
int *it; *it = malloc( (int)255 ); です。
>>148 it = (int *) malloc( ... )
です。
あと、int 255 分個用意したければ malloc(sizeof(int) * 255)
ポインタについて勉強なされ。
148は偽物。何でそういう暗いことするんだ? やっぱ書き込まないのが一番だな。。。はーめんどくさ。
>>150 おいおい、バカにされたからって偽者のせいにして
自分はいかにも賢い、みたいな態度とるなよ。嫌われるぞ?
馬鹿にされたって誰が?149は148へのレスだし148だってネタだろ。 面倒くさいって言うのは偽物の指摘とこういう誤解へのレスなどのこと。 放置しとけばいいんだが俺的にキモイんでね。でもやっぱ面倒くさいので もう書き込むのはこれで最後にしとく。>153
あ〜あ、さがちゃたよ。
156 :
132 :2001/05/26(土) 00:16
>>123 誰宛てか、書くの忘れたけど分かりましたよね。(^^;
でも、独学なのに、何で課題があるの?
やっぱ、ネタだったのかな…。
本当に、昨日から始めたばかりで、気を悪くしたら、ゴメンね。
157 :
デフォルトの名無しさん :2001/05/26(土) 00:31
C言語で 文字列Aを特定の文字で切り分けて 配列にいれるっていう関数はありますでしょうか? Perlの @array = split(/\,/,$line); と同じモノです。
158 :
デフォルトの名無しさん :2001/05/26(土) 00:37
Gcc v3.0 will be released in the next few weeks. For linux at least :) これってホント?
>>154 おお、本当に偽者だったのか。それはスマん。
ま、人にものを聞く態度がなってなかったから、偽者にからかわれたんだろうね。
以後精進しなさいな(w
160 :
デフォルトの名無しさん :2001/05/26(土) 00:38
最近の言語から始めた人って、C言語の関数は不便だ不便だって 文句言うのが多いよなー ちったあ自力でやれ!自分で関数作れ!って思うことが多い・・・ スレに反するので、さげ
162 :
デフォルトの名無しさん :2001/05/26(土) 00:50
>>157 strpbrk() もしくは strtok(), を使って自分でバラす。
元の文字列を破壊して構わないなら、strtok() でセパレータを '\0' に書き換えつつ、
各要素へのポインタを記録しておくのがセオリー。
164 :
デフォルトの名無しさん :2001/05/26(土) 04:38
Cでシステムコールを勉強したいんですが、 なにかいい本など教えてください
>>164 システムコール・・・
機種や使ってるコンパイラはなんですか?
わざわざシステムコールつってんだからUNIX系と思うけど。 オンラインならlinuxのJFドキュメントとか参考になるかな?>164 本は腐るほど出てると思うけど。
167 :
デフォルトの名無しさん :2001/05/26(土) 07:07
strなんたら(strcpy、strcmp、strcat等)って正しくはなんて読むのでしょうか? 私は良く判らないのでそのまま「エスティーアールコピー」って言ってたんですが、「ストラコピー」や「ストリングコピー」っていう人もいました。 もしも正しいのが判らなければ多数派でもいいです。 お願いします。
>>167 charですらキャラ派、チャー派がいるのに
strなんかだと……
つーか正しいも糞もないので
そんなこと気にせず、勉強しなさい。
オマエモナ
170 :
デフォルトの名無しさん :2001/05/26(土) 13:23
#include <stdio.h> int main () { int c, b; while ((c = getchar()) != EOF) { b = (c & 0x01) << 7 | \ (c & 0x02) << 5 | \ (c & 0x04) << 3 | \ (c & 0x08) << 1 | \ (c & 0x10) >> 1 | \ (c & 0x20) >> 3 | \ (c & 0x40) >> 5 | \ (c & 0x80) >> 7; putchar(b); } return 0; } これってなんですか?
172 :
デフォルトの名無しさん :2001/05/26(土) 16:10
スターコピー スターコンプ スターカット これだけは譲れません。
>>170 '\'は必要無し
どっからパクってきたソースだ?
ビット列を逆順にしたものを出力するプログラム cat input.txt | foo > output.txt
175 :
デフォルトの名無しさん :2001/05/26(土) 16:24
176 :
デフォルトの名無しさん :2001/05/26(土) 16:32
>>175 Linuxデバイスドライバ (オライリー)
Linuxプログラミング (ソフトバンク)
この2冊だけでご飯3杯はいけるね。
あとは カーネルソース がおかず。
JF,JM が漬物(ただしちょっと痛んでる)。
177 :
ひよこ :2001/05/26(土) 19:39
C言語で再帰関数の勉強をしてたのですが疑問が出来たので質問させてもらいます。 A: test(d, c, b, a++); B: test(d, c, b, a+1); 例えば、このような関数を再帰関数として使うとき、Aだと「不正な処理のため強制終了」 だったのですが、Bだとなんの問題もなく通りました。 なぜなのでしょうか?
>>177 はぁ?
a++ってなに?
なんで全角混じってるの?
それと
> このような関数
と言われてもよくわからない。
まぁ仮にa++のことだとして、 a++とa+1の違いわかってる?
181 :
中途半端くん :2001/05/26(土) 20:12
>>177 a++ だと、test終了後にインクリマンコされる。
a+1だと、testに a+1 が渡されるが aの値は変化なし。
基本動作が全然違うから、
>>177 は勉強頑張りなさい
++aならよかったのにね(多分)
183 :
デフォルトの名無しさん :2001/05/26(土) 20:33
>>181 違う。a++ でもtest関数に制御が移る前にインクリ○○○される。
184 :
ひよこ :2001/05/26(土) 20:33
たくさんのレスありがとうございます。 ++の間違いでした。 a++ が間違いだということはわかりました。 でも、++a が a+1 と同じ意味というわけではありませんよね?
>>183 むう・・・処理系によって動作がことなるのか?
手元で実験したけど確かにtest後にインクりメンコされたよ。
main()
{
int b=9;
test(b++);
printf("%d\n",b);
}
test(int b)
{
printf("%d\n",b);
}
$ ./a.out
9
10
186 :
デフォルトの名無しさん :2001/05/26(土) 21:13
>>184 はい、++a が a+1 と同じ意味というわけではありません。
187 :
デフォルトの名無しさん :2001/05/26(土) 21:15
>>183 言ってる意味がわかったよ
testにはaが渡されるけど、testが実行されるときにはもうa++されてると。
勉強不足だったよ。ごめん
>>188 そう。
#include <stdio.h>
int a;
void test(int n)
{
printf("n = %d\n", n); /* nは9 */
printf("a = %d\n", a); /* aは10になっている! */
}
int main(void)
{
a = 9;
test(a++);
printf("a = %d\n", a); /* もちろん a は 10 */
return 0;
}
こんなコード、そもそもかかないことだ。
191 :
デフォルトの名無しさん :2001/05/27(日) 23:39
行列式を求めるにはどうしたらよいのでしょうか?
>>185 もともと b++ の使い方間違ってるよ。本読みなおせ。
195 :
デフォルトの名無しさん :2001/05/28(月) 02:33
週明けあげ&次ネタ待ち
196 :
デフォルトの名無しさん :2001/05/28(月) 03:17
C言語なんて古いもの、もう使ってる会社ないんじゃないの?あるの? 大抵はVC++かC++かJAVAでしょ。Cなんて役に立つのかなあ
199 :
デフォルトの名無しさん :2001/05/28(月) 07:47
>>196 C言語知らないのか?
CとC++を比べるのはいいけど、C++とVC++を別物というのは
ちょっと馬鹿っぽいぞ。まあ、違うといえば違うがな。
200 :
デフォルトの名無しさん :2001/05/28(月) 11:07
範囲1〜10の文字列にアスキーコード[0x21]〜[0x7E]の範囲の文字 をランダムに決定するにはどうしたら良いでしょうか?
>>200 なんか文がおかしいよ。
for(i=0;1<10;i++){
str[i]=rand()%(0x7e-0x21)+0x21;
}
>>196 ,
>>200 Cについて「どうも話が合わん。」って思ったとき、
相手が MS-C しか知らない or MS-C 出身者だったってこと多くない?
203 :
202 :2001/05/28(月) 11:38
>>199 > C++とVC++を別物というのは ちょっと馬鹿っぽいぞ。
C++の処理系ってVC++しかないの?
それは君の頭の中でだけだろ?
ごめん。
元はと言えば
>>196 の
> 大抵はVC++かC++かJAVAでしょ。
がおかしいのだね。
> 大抵はC++かJavaでしょ。
って言うべきって話ね。
208 :
デフォルトの名無しさん :2001/05/28(月) 16:35
if〜else文とswitch〜case文って、どっちのほうが 処理が早いの? switch〜case文で30段階ぐらいに分かれてるのと if〜else文で分岐は3つ、その中でまた細かく分かれて 合計30ぐらいの条件になっているのってどっちのほうが 負荷が軽いか、一般論でいいので教えてください。
>>208 単純に定数の比較だけなら一般的には同じ。
聞いたことある話だと、
0から始まってる連番のcaseはジャンプテーブルに展開されるので高速らしい。
if文は単純にテーブルにできるものじゃないから、
処理速度はcase<=ifじゃないかなーと思う。推測レベルですが。
>>208 の処理だと、ifの方は2段階で条件分岐をしているので、
1段階のcaseのほうが速いと思う。
211 :
208 :2001/05/28(月) 16:54
勉強になります。メモメモ。 いやあ、呼ばれる頻度の高いものが上に来るようにif文を最適化して 書いておけば、上からひとつひとつチェックされていくcase文より 結果的に早くなるよ、と言われてそれを試したところ、実際にかなり 早くなったことが8年ぐらい前にあるんです。 でも、今のCPUだとちょっとした処理程度では、速度の差なんて 見えない、ソースコードの見易さのほうが先だ・・・みたいな状況ですから どっちが本当にいいのかわからなくなってまして、ね。 ・・でもVBの場合は、select〜case〜end selectよりも、if〜end ifの 方が格段に早いような気もするなぁ・・・ タイマー関数で使ったら差を感じたことがあります。
212 :
デフォルトの名無しさん :2001/05/28(月) 17:07
>>208 、
>>210 caseの条件次第でしょう。ジャンプテーブルで簡単に分岐できる
のなら早くなるし、逆に、まったく出来ずに30回の比較になる可
能性もありえます。意外とifの方がいい場合も結構あるかと。
俺の職場のソースって大半が void aho( void ) { switch( ? ) { case a: return; case b: break; case c: return; default: return; } baka(); } になっている。これはこれで早いのかいな。
今調べたら
・caseの数がそれなりにある(10ぐらい)
・ほぼ連番(1つなら連続してない数があっても可)
・0からじゃなくても可
な条件でジャンプテーブルに展開されたよ。
一般にはcaseで逝けるところはcaseのほうがよさそう。
>>212 なんか具体的にifのがいいところがあったら教えて。
#include <stdio.h> #include <stdlib.h> #define TYPE float int main(){ int i, j, k; TYPE ***h; int L = 17, M = 13, N = 14; h = (TYPE ***)malloc(sizeof(TYPE **)*L); *h = (TYPE **)malloc(sizeof(TYPE *)*L*M); **h = (TYPE *)malloc(sizeof(TYPE)*L*M*N); for(i=0;i<L;i++){ h[i] = *h + i*M; *h[i] = **h + i*M*N; for(j=1;j<M;j++){ h[i][j] = *h[i] + j*N; } } for(i=0;i<L;i++){ for(j=0;j<M;j++){ for(k=0;k<N;k++){ h[i][j][k] = 0.1; printf("&h[%02d][%02d][%02d] = %p\n", i, j, k, &h[i][j][k]); } } } exit(0); } 3次元配列の動的確保の部分を 関数にしたいのですが、 どうしたらいいのでしょうか? void hogehoge(TYPE ****f, int X, int Y, int Z){ (関数の中身) } で、main関数で, hogehoge(&f, L, M, N); と、したいのですが...
全角スペースで字下げしてほしいの・・・
関数内で領域確保しても、関数終われば領域は破棄されるんじゃ なかったっけ。mallocは、宣言位置より下の関数に対しては有効だけど 宣言位置より上には無効じゃなかったけー?
>>217 そういうmalloc欲しいな〜
あったら便利だよね♥
でも、そんなものはない
>>215 そのmain関数を書いたのがあなたなら
そんなもの簡単に書けると思うのですが。
それとも大学の課題とかですか?
どっちにせよ僕が答える必要はないでしょ。
関数を抜けると解放されちゃうメモリを確保する関数というのは どう書いたらいいのでしょう(藁
スタックに確保する
>>221 は関数を抜けると解放されてしまうのだったら、
メモリを確保する関数など書けないではないか、
ということを言いたかったのだと思われ。
>>220 >>215 は半分以上俺が書いた
void でない関数なら1個関数を知ってるのよ
double ***mona(int X, int Y, int Z)
{
int i, j;
double ***a;
a = (double***)malloc((X+1)*sizeof(double**));
for(i=0;i<=X;i++){
a[i] = (double**)malloc((Y+1)*sizeof(double*));
for(j=0;j<=Y;j++){
a[i][j] = (double*)malloc((Z+1)*sizeof(double));
}
}
return a;
}
で、main関数で
double ***f;
f = mona(50,50,50);
とかで、確かに3次元配列の動的確保ができる。
だけど、これだとメモリに連続して確保されてないのよ。
しかも、返り値を持たない関数を作りたいので、
どうしようかと。
単にアドレスを渡して、関数側ではさっきの部分を
それぞれポインタにすればいいと思うのですが、
ドキュソなのでうまく逝かないのね。
225 :
217 :2001/05/28(月) 22:17
え? main() { char *a; seset( a ); printf( "%s", a ); } void seset( char *aa) { aa=(char *)malloc(255); strcpy(aa,"hoehoe"); } で、ちゃんとhoehoeって出るの? MS-DOSで5年ぐらい前にやったときはでなかったような・・ ごめん、もうC4年以上触ってないから自信無いです
aはどこ指してんだ?厨房は無理するな。
>>225 メモリ確保云々より、ポインタを理解するのが先だと思われるっす。
>>225 ポインタずーれーまーくーりー
悪い例てんこもりー
>>217 それってalloca()の事では?
それにしても
>宣言位置より下の関数に対しては有効だけど
ってのは違ってるが。
そんなコード、修正してやる! main() { char *a; seset( &a ); printf( "%s", a ); } void seset( char **aa ) { *aa=(char *)malloc(255); strcpy(*aa,"hoehoe"); }
>>217 はポインタの勉強を1からやりなおせ
ハゲしく勘違いしてる
233 :
デフォルトの名無しさん :2001/05/28(月) 22:57
>>215 はいったい何なの?
自分で書いたんだったら明らかだと思うのだが。
>>224 半分以上って……やっぱ宿題か…よく見るとmainも変だね。
たぶん君の意図してるのは
void hogehoge(TYPE ****f, int x, int y, int z){
*f = (TYPE***)malloc(sizeof(TYPE)*x*y*z);
}
でしょ。
236 :
デフォルトの名無しさん :2001/05/29(火) 00:43
話は違いますが strcat(a,b)などのstr系の文字列処理関数は、 引数にそれ自身が変化する文字は使えないですよね。 たとえば、for(i=0;i<99;i++)のiをbのところに置けないです。 このような変化する文字を他の文字に連結させる方法はないですか? 参考書でも調べてみたのですが、載って無かったです。
for(i=0;i<99;i++){ strcat(a,i); この処理は無理です。 文字列aの後ろに数値を連結させたいのです。 sprintfだと連結ではなくて、コピーになってしまいます。
for(i=0;i<99;i++){sprintf(c,"%d",i);srtcat(a,c);...
241 :
デフォルトの名無しさん :2001/05/29(火) 01:50
>>239 、
>>240 for(i=0;i<99;i++){a+=sprintf(a,"%d",i);}
サンキュー!!
>>241 目から鱗が30枚くらい落ちました。
勉強しよう。
いまだに236のしたいことがわからない俺はSEには絶対なれませんか?
>>236 はVBみたいに勝手に数値が文字になってくれると思い込んでるんでしょ。
まず型ってのを理解してもらわないと。
>>241 ポインタで無ければならないし、処理前のa+=strlen(a)が抜けてる
248 :
:2001/05/29(火) 05:09
目からウロコ つか、使いどころがわからん hoge01234567891011、、、なんて何に使うの?
249 :
デフォルトの名無しさん :2001/05/29(火) 05:11
>>244 キニスルナ。236の日本語が不自由なだけだよ。
日本語なら、ワシに聞け! スレでも作ろうかな
今ごろ16ビットのTurbo C++を使っている人はいないかもしれませんが、これでWindows programを作ってWinExecで他の実行プログラムを呼び出すと同じフォルダ内のプログラムは呼び出せますが、フルパスを書き込んでも他のフォルダのプログラムは呼び出せません。WinExec以外に事前指定指定すべき関数などがあるのでしょうか? また、同じくTurbo C++でEasy Winでcinやcoutによって入力ファイルや出力ファイルを指定するときも同じく、そのプログラムのあるフォルダ内のファイルしか呼び出せません。(GetApplication()->ExecDialog(new TFileDialog(this, SD_FILEOPEN, strcpy(FileName, "*.txt"))) == IDOKなどで、開くファイルや保存ファイルを指定するとフルパスで指定できるのに、WinExec, EasyWinでのcin, coutではフルパスが無効なのはなぜでしょうか?有効にするにはどうすればよいのでしょうか?
254 :
デフォルトの名無しさん :2001/05/29(火) 15:07
visual C++やってますが、”curses"をインクルードできません。もし これに変わるものがあれば教えてください。 カーソル移動なんかをやりたいのですが、できません。
255 :
デフォルトの名無しさん :2001/05/29(火) 15:08
visual C++やってますが、”curses"をインクルードできません。もし これに変わるものがあれば教えてください。 カーソル移動なんかをやりたいのですが、できません。
256 :
デフォルトの名無しさん :2001/05/29(火) 15:08
visual C++やってますが、”curses"をインクルードできません。もし これに変わるものがあれば教えてください。 カーソル移動なんかをやりたいのですが、できません。
257 :
デフォルトの名無しさん :2001/05/29(火) 15:08
visual C++やってますが、”curses"をインクルードできません。もし これに変わるものがあれば教えてください。 カーソル移動なんかをやりたいのですが、できません。
258 :
デフォルトの名無しさん :2001/05/29(火) 15:08
visual C++やってますが、”curses"をインクルードできません。もし これに変わるものがあれば教えてください。 カーソル移動なんかをやりたいのですが、できません。
259 :
デフォルトの名無しさん :2001/05/29(火) 15:08
visual C++やってますが、”curses"をインクルードできません。もし これに変わるものがあれば教えてください。 カーソル移動なんかをやりたいのですが、できません。
260 :
デフォルトの名無しさん :2001/05/29(火) 15:08
visual C++やってますが、”curses"をインクルードできません。もし これに変わるものがあれば教えてください。 カーソル移動なんかをやりたいのですが、できません。
261 :
デフォルトの名無しさん :2001/05/29(火) 15:09
visual C++やってますが、”curses"をインクルードできません。もし これに変わるものがあれば教えてください。 カーソル移動なんかをやりたいのですが、できません。
262 :
デフォルトの名無しさん :2001/05/29(火) 15:09
visual C++やってますが、”curses"をインクルードできません。もし これに変わるものがあれば教えてください。 カーソル移動なんかをやりたいのですが、できません。
263 :
デフォルトの名無しさん :2001/05/29(火) 15:09
visual C++やってますが、”curses"をインクルードできません。もし これに変わるものがあれば教えてください。 カーソル移動なんかをやりたいのですが、できません。
264 :
デフォルトの名無しさん :2001/05/29(火) 15:10
visual C++やってますが、”curses"をインクルードできません。もし これに変わるものがあれば教えてください。 カーソル移動なんかをやりたいのですが、できません。
265 :
デフォルトの名無しさん :2001/05/29(火) 15:11
visual C++やってますが、”curses"をインクルードできません。もし これに変わるものがあれば教えてください。 カーソル移動なんかをやりたいのですが、できません。
266 :
デフォルトの名無しさん :2001/05/29(火) 15:24
エスケープシーケンス
269 :
ウルトラ初心者 :2001/05/29(火) 17:10
strcmpを使用しないで文字列を比較するにはどうしたら 良いのでしょうか?
1)strcmp相当のものを自分で作る 2)アルゴリズムを見直して使用しないようにする bool cmp(char *p1,char *p2) { do{ if(*p1 != *p2) return false; }while(*(p1++) != NULL); return true; } こんな感じかな?
あ、p2をインクリメントし忘れた。打つ出汁農
do{ }while() も職場によっては嫌われるよな〜
えー、do{}while()いいじゃん。俺大好きだよ。 じゃぁ処理の結果によってループみたいなのはどうやって書くのかな。 for()?
おれは while すら嫌いで for ばっか使ってるぞ。
while(1)って嫌いなんだよね
Why?
278 :
デフォルトの名無しさん :2001/05/29(火) 20:52
ちょっとお聞きしたいのですが、 ファイルの開け方やチェイン構造体は本を読んでなんとなく わかるのですが、ファイルから文字列を一文字づつ読み込んで、 それをチェイン構造体に入れる方法がわかりません。 struct string{ char str; struct string *next; }; FILE *fp1; char s[256]; int i; i = 0; struct string *data; while(s[i] = getc(fp1) != EOF){ s[i] = getc(fp1); data->str = [i]; i++; とりあえずこんな感じでファイルの中の文字列を 構造体に変換しようとしてるのですが、うまくいきません。 なにか簡単な方法ありますでしょうか?
dataの実体が無いよ getc()を2回も呼ぶのはおかしいよ ていうか、文法がめちゃくちゃだ;_; リストがどうこうと言う前に、 C言語をもう一回勉強しなおそう。
>>253 お蔭様でうまくいきました。ありがとうございました。m(__)m
void TMy::HandleButton3Msg(RTMessage)
{
// strcpy (s1,"c:\\Tcwin\\MyApp\\Template\\test1");
strcpy (s1,"C:\\Progra~1\\Intern~1\\IEXPLORE c:\\tcwin\\myapp\\template\\help.htm");
WinExec(s1, SW_SHOWNORMAL);
}
281 :
279 :2001/05/29(火) 22:09
すみません。 コードはかなり省いて書いてある上に間違っているので、 気にしないで下さいませ。
do-whileはfindfirst/nextとかでよく使うけど if (fd = first()) { do { /*fdの処理...*/ } while(fd = next()); } これよりスマートに書けるか?
あ、書けるわ(w for (fd = first(); fd; fd = next()) { /* fdの処理 */ } すまそ。
>>278 =281
dataは、sと同じ大きさの配列で無ければいけません。
まあ、その前に、配列をチェイン化する目的も見えませんが…。
もし、それ以外の間違いなら、もう1度正しいと思っている、
(でも上手くいかない)ソースを、正しく(?)書いて下さい。
このままでは、欲しい結果(指摘)を得る事は、困難だと思われます。
要するに、間違いを気にするなと言われたら、
じゃあ、何を気にすれば良いんだ?って事になりますので…。(^^;
286 :
デフォルトの名無しさん :2001/05/30(水) 00:37
>> 282-283 書けてないんじゃない? age足
>>282 も
>>283 も大バグですな。こんなやつが制御装置組んでいる
飛行機にだけは乗りたくないものだ。
288 :
282=283 :2001/05/30(水) 02:14
すまん。どの辺が間違ってるのかわからない。 くわしく指摘してくれい。
289 :
288 :2001/05/30(水) 02:16
290 :
288 :2001/05/30(水) 02:22
代入の部分のことを言ってるとしたら、萎えだなあ・・
>>278 多分線形リストのことを言っていると思うので、
アルゴリズム辞典を買ってきて調べましょう。
>>286 俺もわからん。説明してくれ。
自分も良く知りませんが、fdはファイルハンドルとして、 ファイルハンドル関係は、失敗した時、大抵-1を返すので、 もしかしたら、成功したfdの値が0の可能性もあるのでは? まあ、結局は、first()とnext()次第だし、 本当に0を返す時があるかは、知らないけどね…。(^^;
293 :
名無しさん@お尻おっぱい。 :2001/05/30(水) 02:47
>>292 fdは確かにファイルディスクリプタとして使われる変数名だけど
ここでもその意で使ってるか?
勝手な憶測でfirst(),next()ともに成功したら何らかの数値を、
最後までたどり着いたら0を返却する関数として読んでたよ。
294 :
デフォルトの名無しさん :2001/05/30(水) 02:47
>>292 fd->ファイルハンドル
失敗->-1
決め付けはいかんなあ・・
>>282 -283を純粋に見ると、C言語の条件式同様、
成功->非0
失敗->0
として扱ってるのは自明なんじゃないのか?
>>293 自分は、成功した時にはファイル名へのポインタ、
失敗したら、NULLが帰ってくると読みました。
ただ、286,287の言うバグの可能性を考えると、
これ以外考えられなかった(思いつかなかった)ので…。
まぁ、どちらにしても、関数の戻り値次第だし、
あまり気にする必要もないのでは?
つーことは、
>>286 -287
はドキュンということでファイナルアンサー?
>>294 >決め付けはいかんなあ・・
では、負の数と訂正させて頂きます。
それと、自分の基本的な考え方は、286と287以外の方と
ほぼ同じですので、あまり、厳しく突っ込まないで下さい。(^^;
298 :
デフォルトの名無しさん :2001/05/30(水) 03:03
>>296 読解力に欠ける知能障害者だから・・・
彼らと仕事をしたら(職種が何であれ)とても大変な目にあいそうだ。
>>296 286,287の意見を聞きたいので、
テレフォンを使わせて下さい。
300 :
なもし :2001/05/30(水) 03:59
聞けって言っても教えてくれねーじゃねーか?しらね―んだろ。この
オーディエンスでお願いします。
302 :
デフォルトの名無しさん :2001/05/30(水) 09:55
>>282 、
>>283 俺はfor()の中身が長くなったらdo while()使うなぁ。
なぜか行の長さのバランスが悪いソース嫌いなんで。
>>286 -287
某スレの101、別の某スレの430だろこいつ。
どうしようもないシッタカ厨房君だから相手にしなくていいよ>all
>>305 サンクス
どのスレにもいるんだね・・・
どっちかっつーと、 fd = first(); while (fd = next()) { ・・・ } っていう形に持ち込みたいなぁ。
308 :
デフォルトの名無しさん :2001/05/30(水) 13:33
>>307 whileの中の処理を関数に分ければ出来るよ。
意味あるかどうかは知らないけど。
309 :
デフォルトの名無しさん :2001/05/30(水) 13:57
typedef unsinged char CHAR; typedef unsigned char UCHAR; unsigned char *getTable( int cnt, unsigned char *key, UCHAR *wrd, unsigned char *key2 ); この3行の意図するところを、誰か教えてください。
310 :
デフォルトの名無しさん :2001/05/30(水) 13:57
先輩のソースです
>>310 型定義とプロトタイプ宣言じゃん
(せっかくの定義型の使い方が中途半端だな。
貴殿はその辺を晒したいのか?)
312 :
親切な人 :2001/05/30(水) 14:03
>>310 その先輩を始末したら、ここに報告してくださいね
313 :
309 :2001/05/30(水) 14:05
ぐち 2 と間違えました。ごめんなさい(−−
314 :
309 :2001/05/30(水) 14:11
間違いついでに /* このプロジェクトでは未使用 */ // ここから typedef unsigned long u_long; typedef unsigned short u_short; typedef double u_double; /* このプロジェクトでは未使用 */ // ここまで じゃあ、消せよ! と思ったら別のソースで u_long getKeyNyuryoku( unsigned long ) とかやってます。
315 :
デフォルトの名無しさん :2001/05/30(水) 14:31
char dmy:6; char tmp:3; という書式があるんですが、これ何でしょう? 普通のCのソースで、コンパイルも通るのですが 何をやっているのかわかりません。 詳しい方、お教え願います。
解決しました :p
nn-? Compile 通らないけど??
319 :
うそつき :2001/05/30(水) 17:26
>>317 K&Rの本を読むと載ってます。
共用体がどうのこうのというあたりです。
ようは特定のビットを取り出してcharとかintとかとして使う為のものです。
ビットフィールドですね
322 :
デフォルトの名無しさん :2001/05/30(水) 21:44
制御屋は使う、 こともある。 I/O アクセスする時など便利。 xx番地のnビット目を調べるときいちいちビット演算子を使わなくてもすむ。 ただし、その MPU とコンパイラを十分理解しておけ!!
323 :
デフォルトの名無しさん :2001/05/30(水) 21:51
>>315 ちなみに標準でサポートされるビットフィールドの型はint, signed int,
およびunsigned intの3つだけ。
charや他の型を使えるのは処理系の独自拡張。これらの拡張は処理系ごとに
思いっきり振る舞い方が異なるから要注意ね。
>>323 ビットフィールドそのものがインプリメント依存だよ。
論理演算の方がつぶしが利く
326 :
デフォルトの名無しさん :2001/05/30(水) 22:07
>>325 制御系のCコンパイラの場合ビットフィールドの振る舞いを変える
コンパイルオプションがあるから、どちらかと言うとビットフィールド
の方が流用が効くのでは?
329 :
323 :2001/05/30(水) 22:42
>>324 標準規格の範囲であれば、処理系依存部分はせいぜいビットの順番とintの
場合の符合の有無程度。
それ以外の型を使うと、フィールドの順序までもがバラバラになる可能性が
ある。それに、そうした拡張を持つ処理系には、汎整数拡張を省略するもの
も多いから、なおのこと振る舞い方がバラバラになる。
>>325 同意。つぶしが利くのは論理演算。
ビットフィールドはつぶし云々より便利だから使うだけ。
>>327 コンパイラによる。
組み込みの場合は、いろいろな処理系を使わざるを得ないから、再利用を
考えたコードを書くときはビットフィールドは避けるか、使うにしても
signed intかunsigned intだけにして、ビットオーダを#ifで選択できる
ようにするしかない。
330 :
デフォルトの名無しさん :2001/05/30(水) 22:43
メモリマップドファイルって便利だと思うんだけど なんでみんな使わないの?
331 :
デフォルトの名無しさん :2001/05/30(水) 22:43
>>328 論理演算はエンディアンには依存しない。
333 :
331 :2001/05/30(水) 22:54
>>332 依存しない。
もし依存するというのなら、それは(入出力ポート等の)アクセス方法を
間違えている。
>>329 ビット操作でビットフィールドが良いか論理演算が良いかなんて結局
宗教みたいなもんだからどっちでもいいんじゃない?
>>331 エンディアン依存するよ。
335 :
329 :2001/05/30(水) 23:06
>>334 どちらが良いとか悪いとかは言っていない。
つぶしが利くかどうかということ。
用途に応じて使い分けるのが一番。
これまでビットフィールドを使ったプロジェクトを(自分は)見たこと無い。
しないと思うけどなー。 68系と86系で論理演算を書き分けたこととか無いよ。
>>336 同意。
Cは既に論理演算があるのに、ビットフィールドは余計だったと思う。
339 :
デフォルトの名無しさん :2001/05/30(水) 23:17
struct A{ union{ unsigned int m_Pack; char m_Char[4];// struct{ unsigned int m_Phase0 : 4; unsigned int m_Phase1 : 4; unsigned int m_Phase2 : 4; unsigned int m_Phase3 : 4; unsigned int m_Phase4 : 4; unsigned int m_Phase5 : 4; unsigned int m_Phase6 : 4; unsigned int m_Phase7 : 4; }; }; }; で論理演算の時はm_Packを使って時に応じているが。
340 :
331 :2001/05/30(水) 23:20
>>337 おそらく、バイトアクセスしないといけないデバイスを無理やりワードアクセス
するような場合を想定していると思う。
アセンブリ言語ではよくやることだけど、C言語でやる場合はエンディアン云々
以上の問題がある。可搬性については論外。
それ、バグコードですが。>339
>>333 全フィールドをバイトアクセスできるならな。
32bit単位でしかアクセスできない入出力ポートなんてのもあるのだよ。
>>336 それは経験が足りないか、または君の会社の思想の問題と思われ。
>>339 unionの間違った使い方。
m_Packとビットフィールドは対応するとは限らないよ。やばいよ。
>>340 そんな難しい話ではなくてもワード単位でアクセスするデバイスに
ワードで書き込んだだけでエンディアン依存してしまうのでは?
345 :
デフォルトの名無しさん :2001/05/30(水) 23:39
>>343 まぢ? 根拠求む
(K&R読んだけど大丈夫そうに思える)
346 :
デフォルトの名無しさん :2001/05/30(水) 23:47
m_Phase0〜7それぞれがunsigned int分の領域を使うかもしれんね。 構造体のメモリレイアウトは、メンバの順番以外保証されてなかったと思う。
>>346 GCCのオプションで構造体の最適化をしないというのがある
それをつかったら問題ない
たぶんうそ
>>340 するね。このへん、組込系とかデバドラの経験がある人ならわかると思うが。
CPUと周辺デバイスでエンディアンが違うなんてザラにあるよ。
有名なトコだと、昔のMacに載ってたNu-Bus。
Macは68kだから当然ビッグエンディアンだが、Nu-Busはリトルエンディアンでしか
アクセスできないため、ワード転送しかできないデバイスなんかはメモリから読んで
バイトスワップするか、あらかじめスワップされたイメージを用意してたよ。
>>348 outbとかinbをごりごり改造したり・・・
自分で作るソートプログラムの引数を qsort(void *,size_t,size_t,(*cmp)(const *, const *)) と同じようにしたいので、実際のqsortの中身を見たいのですが ファイルにもないし、いろいろな本やサイトにもありません どうすれば分かるのでしょうか?
>>350 30円くれたら教えてあげます。
うそ。
アルゴリズム事典とか買ってくると漏れなくついてくるよ!
>>351 辞典とかもいろいろ読みました・・・
void型ポインタ(オブジェクト)を引数に使って
るプログラムは全然なかったです
キャストしてやってみたのですが どうしてもぐちゃぐちゃしたプログラムに なってしまうので実際どうやっているのかな? とおもったのです・・・
>>354 その辺はセンスよセンス。
うそ。
ここに自作コードを書くと漏れなく採点してあげるよ。
357 :
デフォルトの名無しさん :2001/05/31(木) 01:04
typedef int (*comp_t)(const void*, const void*); qsort(void *,size_t,cmp_t cmp);
358 :
340 :2001/05/31(木) 09:02
>>348 それはデバイスのリード・ライトがエンディアンに依存するのであって、
論理演算が依存するわけではない。
&=演算子等を使った場合でも理屈は同じ。
359 :
315 :2001/05/31(木) 09:10
ビットフィールド、周りに聞いたら知らん人多かったよ ここで勉強になりました 間違った使い方しないよう十分心がけます。 ・・・ていうか先輩のソースの修正なんすけどね んでもって今日は体調悪いので休ませてもらってる。明日参考にしまーす
ビットフィールドなんて、言葉すら知らんかった… おかげで一つ賢くなれたので、はりきって逝ってきます
K&R読んでない奴がたくさんいるな。
362 :
デフォルトの名無しさん :2001/05/31(木) 20:57
旧スレageてるやつがいるのでこっちもageとこう。
>>361 今は他にいい本があるから、とか。
363 :
デフォルトの名無しさん :2001/05/31(木) 21:17
>>361 C言語の規格を知るならJISハンドブックの方が絶対いいからね。
言語の仕様を知るなら処理系のマニュアルだね。
>>358 ムキになって屁理屈こねてるね。
論理演算には少なくともリードが発生するだろうに。
その結果エンディアン依存するという指摘なんだよ。
365 :
358 :2001/05/31(木) 22:05
>>364 レジスタフェッチやイミディエイト値のリードは確かに避けられないね?
そんなものはエンディアンに依存するとは言わないよ。
それにデバイスへのアクセスは、エンディアンに依存するというよりメモリ
マップに依存するのであって、普通移植性に対する障害としてあげられる
エンディアンへの依存とはまったく別の問題だと思うけど。
366 :
あのさあ :2001/05/31(木) 22:19
K&Rって何の略? どういもの?
368 :
デフォルトの名無しさん :2001/05/31(木) 22:41
366に対する367の解答 >カニチャーハンと富豪 うーん...濃い内容だ。。。ところで、C言の話とは違うけど、 この中で【Linux】使っている人はいるのだろうか? もし使っていたらWebサーバとかにしているのだろうか?
>>368 何故にそんな話になるのかわからんが使ってるよ。
Webサーバとかにはしてないけど。
>>366 KernighanとRichieが書いた「プログラミング言語C」って本。
>>365 メモリマップ…??
「下位ビットが上位アドレスにマッピングされる」とかその逆とかを指してるなら
それこそ「移植性に対する障害として挙げられるエンディアンへの依存」に
他ならないんだけど。
ハードウェア知らないならあまり大きな口は叩かない方がいいよ。
>>365 論点がずれている。
>>322 -328から続く制御系の実装の話をしているんだから外部デバイス
に対して論理演算がエンディアン依存するか否かで語られるべき。
つまりはチップセットを変えずにMPUだけを68系から86系に変えた場合
とかがありがちなシチュエーション。
LCDなんかは簡単には変更効かないしね。
制御/組込み屋がエンディアン依存を気にするのはそういう場合だろう?
なんかさ、アドレスによってエンディアンが違うのってあるじゃん 泣きそうになるんだけど・・・
ビットフィールドをレジスタアクセスに使用すると使いまわしが 効かなくなるという意見には基本的には賛成。 だが、ビットフィールドで記述するとビットロード命令に落ちる 実装系もあるから使わざるを得ない場合が多い。 そもそもそんな場合はvolatileやpragmaが頻発するコードになるのだろう から、移植性を気にするならばマクロに切り出して毎回見直しを かけたほうが無難だと思うよ。
8bit以上のI/O扱ったこと無いから エンディアンなど知らん
376 :
デフォルトの名無しさん :2001/06/01(金) 00:16
>>375 ちゅう事は4bitI/Oか?
4bitマイコンにCは実装されているのだろうか?
晒しage
377 :
デフォルトの名無しさん :2001/06/01(金) 00:19
「読み出される値が異なるから、演算式を変更しなければいけない。 だから、論理演算はエンディアンに依存する」 これは、「ゼロクリアされたメモリ上の文字列を 足し算によって"1234"に変更するためには リトルエンディアンは0x34333231、ビッグエンディアンは0x31323334、 を加えなければならない。したがって、足し算はエンディアンに依存する。 同様に、全ての演算はエンディアンに依存する」 と言っているのと同じ。 メモリ(やI/O)から読みこんだ値はエンディアンに依存するが、 (ビッグエンディアンの 10 00)|(1) == 0x1001 == (ビッグエンディアンの 10 01) (リトルエンディアンの 00 10)|(1) == 0x1001 == (リトルエンディアンの 01 10) 同じ値に対して同じ論理演算をしたら結果は必ず同じになる。 (ビッグエンディアンの 10 00)|(1) != (リトルエンディアンの 10 00)|(1) なのは、単に「同じバイト列でも演算の対象となる『値』が違うから」のはず。 外部デバイスとエンディアンが違うから、 想定していた値と違う『値』がデバイス(メモリ)から読み出される。 つまり、エンディアンに依存するのは『値』であり、論理演算ではない。 「経験豊富なプログラマ」の頭の中は、俺には理解できないけどね。
なんでこんな話題で盛り上がるのん? 組み込み屋はアホばっかり?
380 :
デフォルトの名無しさん :2001/06/01(金) 00:38
structとtypedefってどう違うのだろう? 同じように思えるんだけど・・・。
アホがまた一人>380
だいたい、論点はなんだ?
>>331 の
>論理演算はエンディアンには依存しない。
だろ?
それを
>>332 や
>>334 がてめーの脳内で
>移植性はエンディアンに依存しない。
と読み替えて電波飛ばしてるんだよ。
384 :
デフォルトの名無しさん :2001/06/01(金) 01:09
ingってなんですか?
そういや、イングエイマルムシテーィン?ってまだ活動してるの? つーか生きてるの?
>>377 の理屈では論理演算がエンディアンに依存するしないを云々する
こと自体無意味ということになってしまうよ。
389 :
デフォルトの名無しさん :2001/06/01(金) 01:49
この板は毎日CantyGuy君が出て盛り上がるね(w 今日はアンチMFCキティ君が暴れて凄かったけど、明日のヒーローは ここの380か?
>>382 >だいたい、論点はなんだ?
>
>>331 の
>>論理演算はエンディアンには依存しない。
>だろ?
違うのねん。ビットフィールドの代替手段としての論理演算について論じている
んだから、演算式の書き換えが必要ならやっぱりエンディアンに依存する、と
いう主張なんだけど。
メモリ上はエンディアンとは無関係に01 02 03 04と並んでいて、それをロング
ワードで拾ってきて最下位アドレスの8bitを取り出す論理演算式はエンディアン
によって変わるでしょ?
392 :
デフォルトの名無しさん :2001/06/01(金) 03:56
ライブラリ関数っていうのありますよね。 math.hでsin関数などが使えるようになりますが、math.hを見てみても中身は#defineとかばっかりで実際の計算部分のソースがありません。 printfなどもそうですが。 一体これらの関数の計算部分の実体は何処にあるのでしょうか? あと、これらのソースも見てみたいのですが、ちょこっと探した感じでは見つかりませんでした。
ライブラリのソースがついてくる実装を探そう
395 :
デフォルトの名無しさん :2001/06/01(金) 04:21
392です。
>>393 なんか僕おかしな事書いたんでしょうか?_・)
>>394 UNIX系のオープンソースなやつの配布CDのソース入りのやつなら載ってたりするんでしょうか。
今からちょうどインストールしてみようと思っていたVineのやつを落としてみます。
VisualC++にも付いてこなかったっけ。
>>392 ライブラリ関数の実体は、ライブラリとして提供されています。
(ヘッダにあるのは、関数の宣言とマクロ等で、実体はありません)
自分も昔、同じような事を考えた事がありましたが、
基本的に、純粋なCのみで、一切ライブラリ関数を使用せずに、
printfのような関数を作る事は、出来ません。
(sin関数等は、知識があれば出来ますが…。)
それの意味するところは、自分で考えて見て下さい。
392=397です。
398は書き間違いで、自作自演という意味ではありません。m(_ _)m 正しくは、393=397です。
>>392 別に自分で実装したいって言っているのではなくて、
どういう処理をしているかを見てみたいと言っているのでは?
401 :
デフォルトの名無しさん :2001/06/01(金) 05:31
392です。
>>400 そのとおりです。
工房の時ですが、まだCに触れて間もない頃どんなCの入門書にも画面への自由な図形の描画方法などには触れておらずどうしてだろうと思っていました。
結局は動かすOSによるとかで、そう言うものだと納得しましたが、じゃあ普通に解説してるprintfやscanfなんかはどうなっているんだろう
と思ったのです。
>>397 >純粋なCのみで、一切ライブラリ関数を使用せずに、
>printfのような関数を作る事は、出来ません。
となると一番最初にprintfを作った人はどうしたのか、ということに・・・
ものすごくヴァカなこと聞いてるんでしょうかね・・・とりあえず引き続きライブラリのソースとやらを探してみます。
gcc開発環境のソース一式落としてくれば?>401 わかんなかったら検索しろ
>>397 は、入出力とかは結局OSに依存するから、
C言語の仕様という範疇では語れないということを言いたいんでしょ。
そのための標準ライブラリであるわけだし。
ライブラリを読むのは非常に良いことだと思いますが、
ライブラリが必ずしもよく練られた素晴らしいコードであるという保証も無いし、
実装に依存できるのをいいことに汚いコードが書いてあるかも(藁
404 :
デフォルトの名無しさん :2001/06/01(金) 08:34
GNUのlibpng-1.0.11-src.zipをダウンロードしてscriptsフォルダみたらmakefile.w32がないよー。 びえーん。
405 :
デフォルトの名無しさん :2001/06/01(金) 09:54
>>401 作れないのはOS依存の入出力等の部分で、printf等は最終的にシステム
コールを呼ぶ。それ以外の処理のほとんどは大体Cだけで書かれてる。
>>402 glibc
406 :
デフォルトの名無しさん :2001/06/01(金) 10:00
自己レス
>>404 makefile.vcawin32に名前が変わってました。
うんこっこー。
>>392 さんは聞き方とその後の態度を間違えていたら、
>>380 以上のドキュソ扱いされてたと思う・・
逆に言えば、ドキュソな質問でも、質問の仕方がドキュソでなければ、それなりの 回答が得られるということだ。ドキュソのみなさんは拳拳服膺するように。
410 :
デフォルトの名無しさん :2001/06/01(金) 13:28
411 :
デフォルトの名無しさん :2001/06/01(金) 14:27
UNIX Cでマルチスレッドのアプリを作るとき、 自スレッドだけ、一定間隔休止させたい場合、 sleep()関数でいいですか?
>>392 >最初にprintfを作った人はどうしたのか
今あるコンパイラが全て、それ以前のコンパイラによって、
コンパイルされていると仮定して、1番最初のコンパイラが、
どうやって、作られたのかを考えれば分かりますよ。
Cを勉強する上では、全く意味がありませんが、
ハードウェアに興味があれば、自分で考えてみましょう。(^^;
>>410 どこが?
>>413 使ってるCに、バグがあるか、純粋でないCでない限り、不可能でしょう。
作れるものなら見せて欲しい。(^^;
>使ってるCに、バグがあるか、純粋でないCでない限り、不可能でしょう。 日本語が変な(分かり辛い)ので書き直し。 使っているCにバグがなく、 それが、純粋なCであれば、不可能でしょう。
ライブラリを使わないと文字の出力も出来ないんじゃないの? ・・・I/O直叩きか。すでにそこから苦労しそうだな。
>>412 また嫌になるあほが出現した。このスレのレベルですか?
418 :
中途半端くん :2001/06/02(土) 01:34
>>411 それで問題ないです。
でも精度が1秒刻みなのでそれ以上細かいことやりたいときは
usleepを使いましょう。
(それでも100ミリくらいでガタがくるけど)
そういえば今月のLinuxJapanだかにそのあたりの話があったね
純粋なC、それは
>>415 の脳内にある理想の言語。萌え(w
すみません。教えてください。 main()は、どこから呼ばれるんでしょうか? gdbで見てもこのあたりよくわかりません・・・
421 :
デフォルトの名無しさん :2001/06/02(土) 01:49
usleepはあやしいのでnanosleepをつかおう
>>415 printfのソース見たことある?
必要になるのは文字列操作関数(群)と文字出力。
文字列操作なんてのはただのメモリコピーだから作るのはわけない。
文字出力部分を処理系にあわせて書いてやればいい。
>>422 可変引数は、あれはどうなんだよ
実装できねえだろ
>>423 実装のしかたが判らないのなら素直に教えてくださいと
頼めば良いのに。
>>424 ライブラリが無ければ手も足も出ないだろう、
ということを言っているんです。理解できましたか?
>>415 >printfのソース見たことある?
見たことも何も、自分で作ってます。(^^;
>必要になるのは文字列操作関数(群)と文字出力。
それを提供しているのは、各処理系依存の関数で、
K&RやANSIの定義に、それらはありますか?
自分が知っている限り、何も無い状態のCから
呼び出せる関数はmainのみだったと思うのですが、違いますか?
つまり、不可能と言うのは、そう言うことですね。(^^;
>>423 そう言えば可変引数も標準ライブラリでしたっけ…。
黙ってると、次はイランインとかが出そうなので、 先に突っ込ませて頂くと、あれも、処理系依存の、 ライブラリ関数なので、もちろん使えませんよ。
lisp/schemeなら可変引数は自然に定義できる。 みんなlisp/schemeやんなさい。
>>426 >それを提供しているのは、各処理系依存の関数で、
>K&RやANSIの定義に、それらはありますか?
今日のヒーローは君か。
処理系依存の関数作ればいいじゃん。
ANSIに無い関数は作ってはいけないとでも?
君の脳内定義を適用するとANSI標準のコンパイラってのはこの世に
存在できないことになるんだけど。
>>429 意味不明意味不明!
処理系依存の関数ってどうやって作るんだ?
可変な引数ですらライブラリ頼みなのに!
ひょっとしてすげえ面白い展開になっている?
たぶん
>>425 -428は自作自演。悲惨だなこいつ。
423=430=431=432 な気がするのは気の性?(w
>>433 いやむしろ429=430=430=431だろう。(w
なんだ、結局理論じゃ勝てねえからって荒らし行為に出てきたのか・・・ 小さい人間だな。
>>436 ごめんよ。あんまり痛いんで口出ししてしまった。
もう黙るから許してくれ。
>>423 =430
自分の持ってる処理系のstdarg.hのva_list/va_start/va_endの辺り参照。
おそらく処理系依存コードをマクロで隠蔽している筈です。
わかんなかったら2、3冊本読んだ方が早いかも。
393=397=398=399=401=403=412=414=415=423=425=426=427=430=436 信じたくないが…
>>438 読んだよ
マクロで隠蔽されているとは言っても、
機種依存だとはいっても、
Cだけでかかれていることにはかわりないから
可変引数はライブラリに頼らず実装可能?
ところでprintfはどうなんだ?
純粋なCだけで文字が出せれば、負けか・・・
442 :
>>1は :2001/06/02(土) 04:18
C言語習得に3年もかかったのか、 プログラム技術とC言語の言語とは意味が違うし。 プログラム開発とC言語とも次元が違う、 3年たってもC言語しかやらないとは情けない。
>>441 void myprintf(const char *f,...) {
va_list vaptr;
va_start(vaptr,f);
vprintf(f, vaptr);
va_end(vaptr);
}
vprintfは書式文字列fとva_listを受け取る関数。
(当然vprintfも自分で作れる)
最終的に、fputcやfwriteなどの低レベル関数を使う段階までは、
ANSI規格内で自分で作れます。
わかんなかったら、やっぱり本読んでね。
正解は、393=397=398=399=412=414=415=426です。
>>429 >今日のヒーローは君か。
理解出来ていない、あなた達です。(^^;
>最終的に、fputcやfwriteなどの低レベル関数を使う段階までは、 >ANSI規格内で自分で作れます。 本当に作れるのなら作ってみて下さい。 難しいことは言わないから、 Hello! を、一切のライブラリ関数使わずに、画面上に表示して下さい。 (勿論、標準ライブラリと、処理系依存のライブラリ全て使わずに) それが、出来たら、今日のヒーローは自分です。
今起きたんでよくわかんないんだが、 システムコールを使わずにprintfを実装できるかって話でいいの?
>393=397=398=399=412=414=415=426=444
言語仕様と実装の違いがまるで分かっていないバカタレですな。
ANSI標準だのなんだのってのはあくまで言語仕様の問題で、
その実装のために処理系依存の関数を作ったからとて標準から
外れるわけではない。
>>445 >本当に作れるのなら作ってみて下さい。
たいていのセルフCコンパイラ(とそのライブラリ)は自分で自分を
記述してると思うんだけど。(つまり、既に作られたものは無数に存在する)
397は処理系依存部分をどこで吸収すべきかが分かっていないドキュソですか?
システムコールやI/Oなんかの低レベル部分はどうやったって機種依存だろ。 C標準ってのは上っ面の規定だから実装とは関係無いだろ。 仕様と実装をごっちゃにして話してる奴がいるみたいだ。
>>452 ごっちゃにしてるのは397ただひとり。
よくわからないけど、397は「実装が機種依存するからANSI標準だけでは何もできない」 って主張してるように見えるんだけど。俺の目は節穴デスか?
さようなら397
おやすみ397
454=397 さようなら397
次レスから永遠に397関係の発言禁止
い〜つまでも〜絶える〜ことなく〜発言は〜禁止〜
>>403 が言ってるので正しいのだろうが
>>414 -415が意味不明。
そして紛糾。
>>397 は間違ってはいないが
読解力と自分の思ってることを伝える能力がかなり乏しいのかと。
彡 彡 彡 彡 ブルッ・・・ .∧ ∧ ヾ(,,゚Д゚),) 彡 人つゝ 人,, Yノ人 ノ ノノゞ⌒〜ゞ . ノ /ミ|\、 ノノ ( 彡 `⌒ .U~U`ヾ 丿 ⌒〜⌒
それにしても442はイタイ
∧ ∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
| ̄ ̄( ゚Д゚) ̄ ̄| <
>>397 、おやすみ!
|\⌒⌒⌒⌒⌒⌒\ \
| \ \  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
\ |⌒⌒⌒⌒⌒⌒|
\ |_______|
442=397
読んでない人が多いようなのでもう1度。 >ライブラリ関数の実体は、ライブラリとして提供されています。 >(ヘッダにあるのは、関数の宣言とマクロ等で、実体はありません) >自分も昔、同じような事を考えた事がありましたが、 >基本的に、純粋なCのみで、一切ライブラリ関数を使用せずに、 >printfのような関数を作る事は、出来ません。 >(sin関数等は、知識があれば出来ますが…。) >それの意味するところは、自分で考えて見て下さい。 自分の主張は、これだけです。 それでも、出来ると言う方は反論を。
ある処理系では、IOポートに文字コードを書くと表示装置に文字が出力されます。 int putchar(intc) { *((volatile int*)OUTPORT) = c; return 0; } これは純粋なCでコンパイルできませんか?
>>468 バカの相手もほどほどに。
注:あなたがバカだって言ってるわけじゃないわよ。
>>469 *純粋*なCだと無理じゃない?
処理系依存のCが純粋ってのはここでは間違ってるんでしょ。
>>472 ではないです。
でもバカは言い過ぎでした。
双方がちゃんとスレ読んでないから
こうなっただけだよ。
>>397 がバカってわけじゃない。
>>474 >でもバカは言い過ぎでした。
ってことです。
ごめんなさい。
476 :
デフォルトの名無しさん :2001/06/02(土) 07:56
>>469 コンパイルが通ればコンパイルできるんじゃない。
たいてい意図した通りにはならないけど。
477 :
441 :2001/06/02(土) 08:42
いままで厨房な発言をしててごめんなさい。
Cでフルスクラッチで記述して、画面に文字を出力することが
できました。ライブラリは一切使用していません。
よって、頑張ればライブラリ無しでprintfが作れることが
わかりました。(可変引数の件は解決してるし)
海よりも深く反省します。
>>397 、おめーのせいで恥かいちゃった
じゃないか!勉強できたからいいけど。
478 :
デフォルトの名無しさん :2001/06/02(土) 09:13
>>468 標準出力の実体が何であるかは処理系依存なので、何も画面に表示したりファイルに
出力できる必要などない。
例えば単にどこかのメモリに出力するだけならフルスクラッチで実装できるよ。
>>478 標準出力はバッファ、とか言い切れば、すでに完成していたってことか。
480 :
478 :2001/06/02(土) 10:46
>>479 だいたいそんな感じ。
もっとも、その実用価値とかはまた別の問題だけどね。
469みたいなケースなら実用になるんじゃない?
482 :
478 :2001/06/02(土) 11:07
>>481 そうだね。
テキストVRAMとかに直接出力するとか、UARTに出力するとか、マップドファイルに
出力するとかなら実用価値は十分にある。
ていうか組込用のライブラリだと、標準出力はUARTだったりするんだけどね。
484 :
478 :2001/06/02(土) 11:27
>>483 確かに。大昔のコンピュータも結構そんな感じだったりするね。
組み込み処理系(というよりフリースタンディング環境)の場合には、
printfはいわゆる標準関数ではないけど、あると重宝するもんね。
逆にCに出来ない事はレジスタレベルでのキャリー制御やボロー制御くらいのもの。 速度やタイミングを問わないのなら標準ライブラリ全てを記述できるぞ。 企業によっては標準ライブラリがグローバルにメモリを確保する事を嫌って、 自前の標準ライブラリに差し替える所もあるしね。
>>485 Cでもレジスタはどうにかならなかったっけ?
勘違いしてたらごめん
487 :
コロコロ :2001/06/02(土) 16:01
私の学校で出ている課題について教えてください。できれば、コード記述でお願いします。 課題 文字列操作 <処理概要> 入力ファイルに入っているランダムな文字列を読み込んで編集する。 入力ファイル名 \public\C言語応用\課題02\input.txt 入力ファイルの内容 io4@5ovgiq@w340 9tn@q0mikanb924 rwijra;o4 aestrawberryut@90 240strawberry9t animikanrja ddg fvbananaxjfringogqworiadf; amomolkjtcwieroutstrawberry34t7vv dsgfoiuto sdrgovq@4r q0awitflksjd;f laumikanwett errgt thhbcvbasf fitu@qo4rfachocolateaaarffvnxdkjfq23 sdfgi oq34itu aqeurgvksjd q9bananau4 tue ggsjdgoiumomoq349tifvk asrgmomoio uweringoorigporegf asdmomofg sjd;fmikanligurin@qa94it kwjegfr:bananaa ergtqaegr dfgi oeoitgu;fldkgj b9wu44tlgkjjlksvdjgfsmikanadfg oiupqoi34 ta;lkdf j;lakjdfg0987 bjlhbxcvblkj ;lkjchocolateroigeurrgssdmomoffkjahljhringoglar+ j;lkj4rti <詳細仕様> 入力ファイルの内容は、ランダムな小文字のアルファベット文字列からなり、 1行の文字数は揃っていない。これを1行ずつ読み取り、次の編集を加えて 1行を20文字に揃えて標準出力する。加える編集項目は、以下の通り。 1.文字列"ringo"を発見したら、"APPLE"に変換し、発見回数を数える。 2.文字列"mikan"を発見したら、"ORANGE"に変換し、発見回数を数える。 3.文字列"momo"を発見したら、"PEACH"に変換し、発見回数を数える。 4. 文字列"banana"を発見したら、後ろに"cake"を付ける。 5. 文字列"strawberry"を発見したら、後ろに"cake"を付ける。 6. 文字列"chocolate"を発見したら、後ろに"cake"を付ける。 7. 1〜6以外の文字列の場合は、"."(ピリオド)を出力する。 例えば、入力ファイルの1行目にq0mikanb924という文字列があるが、 この"mikan"の部分が"ORANGE"に変わる。他の文字はピリオドになる。 【結果の表示例】 .............APPLE.. .....ORANGE.......PE ACH......bananacake. ..... ringoの出現回数は、1回 mikanの出現回数は、1回 momoの出現回数は、 1回 bananaの出現回数は、1回 以上が課題の内容です。ご託宣お願い致します。
>>486 レジスタがメモリマップ上にある処理系では出来る可能性はある。
ただし、レジスタ上の振る舞いは気にしなくて良いように
コーディングするほうが良いかと。
>>487 まず何を教えて欲しいのか教えてくれ。
「課題を代わりにやって欲しい」と言うのであればもう来るな。
うまく動きません。何が悪いんでしょうか char *p,*q; int num = 0; printf("input data : ");fflush(stdin); fgets(p); q = p; for(q != '\0') { if(*q >= '0' && *q <= '9') num = num * 10 + q - '0'; else break; } printf("%u\n",p);
>>490 っていうかコンパイル時に警告が出るはずだが。
「識別子pは初期化される前に使用されている」
>>491 pの初期化とはどういうことなのでしょうか?
宣言をしているのでいいのでは
>>492 ポインタの勉強をやり直せ。
宣言と初期化は別だ。
pはどこを指している?
>>493 よくわかりません
宣言と初期化はどう違うのでしょうか
pはどこを指しているのでしょうか?
わかるのなら教えてください
>>490 >うまく動きません。何が悪いんでしょうか
おまえの頭だ
>>491 よく見ると
>for(q != '\0') {
これもおかしいな。(ここで構文エラーが出ないか?)
>num = num * 10 + q - '0';
これもな。
だからポインタの勉強をやり直せ。
>>495 わからないのならレス付けないでください
>>494 >宣言と初期化はどう違うのでしょうか
宣言:変数を使うことを高らかに宣言する
初期化:変数に初期値を与える
>pはどこを指しているのでしょうか?
知りません。実行するまで誰にもわかりません。
>>497 ここまで書いてもわからないなら出ていくのはお前の方だ。
495はかなり正しいことを書いているよ。
むしろこっちが聞きたいくらいだね。
「なんでこれしきのことがわからないのか」がわからないよ。
>>499 自分だって初心者の時があったのでしょう
頭が悪いなんてレスつける人が正しいとは思えません
お、開き直ったね(w 正しいと思えないのはやっぱり勉強が足りないから。 自分で勉強が足りないと思えないのは頭が悪いから。 どう見てもちゃんと勉強してるようには見えないんだよ。 K&Rよく読め。
週末だなぁ… 掲示板をアプリケーションウィザードだと勘違いしてる偽学生諸君、君らは 何のために親のスネをかじって学校に行ってるのか? 課題を丸投げして「動くようにしてください」なんてやってると君らの頭には 何も残らない。考える必要がないから。 そーやって単位を取得して「●●大学情報工学部卒」なんて履歴書もって 入ってこられると、困るのは俺達現場の人間だ。 頼むから向学心がないならさっさと単位をあきらめて別の道を選べ。
>>504 あれがごまかそうとしてるように見えるなら、やっぱり悪いのは君の頭だ(w
>>504 課題ができなくて逆ギレするのは結構だが、笑いものにされるだけだよ。
この板の住人は、向学心があって自助努力に欠かない学生には優しいが
君のようなまるで勉強しない掲示板ウィザード頼みの偽学生には思いきり
厳しいんだよ。理由は
>>502 を読んでね。
>>505 今自分ができるからとできない人をばかにするのは
自分の小ささを証明しているだけですよ。
昔自分が人に迷惑をかけたことまで忘れて人をばかにしているんだから
どうせネタでしょ 本当に分からなかったら、馬鹿を通り越してる
>>507 もう進むべき道は示されてるんだよ。
>>496 -498あたりで。
あとは自分で勉強しなさいって事。
まあ、勉強もしないでリロードしては恨み言を書いてるような奴は
やっぱり頭が悪いと言わざるを得ないけど。
>>507 少なくとも今ほど気軽に他人に迷惑をかけられる時代に生まれた奴は
この板にはそう多くはいないよ。
(平日の)この板の住人が君のような勉強をしていた時分には2ちゃんはおろか
パソ通すら一般的ではなかった。
日本語のnetnewsだってほとんどなかったんだよ。
だから、他人に迷惑かけようと思ってもできない。だからみんな自分で勉強して
たんだね。
ジジ臭いと思うかも知れないが、心構えの問題だ。
>>502 それいいな。コピペ用にもらっとこう(藁
#include <stdio.h> #include <malloc.h> #define BUF_SIZE 1000 void main() { char *p,*q; int num = 0; printf("input data :"); fflush(stdin); p=(char *)malloc(BUF_SIZE); fgets(p, BUF_SIZE, stdin); q = p; while(*q != '\0'){ if(*q >= '0' && *q <= '9') num = num * 10 + *q - '0'; else break; q++; } printf("%d\n",num); }
ココなんなんだ?
教えたがり君の登場で一気に盛り下がった模様…
↑は全部一人の人の自作自演と思われリ
いくらなんでもチゲー(藁
>>518 ちがうかなー
490のプログラム中途半端すぎるし、
ネタっぽいんだけど
520 :
デフォルトの名無しさん :2001/06/02(土) 18:37
毎週1〜3人の割合で根本的に馬鹿なのが登場するよな
少なくとも俺の他に1人以上いるはず(w
522 :
デフォルトの名無しさん :2001/06/02(土) 18:44
>>521 いないいない、いてもはづかしすぎて、
消えたほうがいいな
週明け、514のコードに致命的なバグがあることに気付かずに意気揚々と 課題を提出する490。先生がどんなコメントをするか楽しみだね....
おばかな質問者に勘違い回答者、それにツッコミを入れずには いられない厨房PGの三つ巴が楽しいスレ。
>>513 情報工学部ってのは、あまり見かけないので、コピペのときは「○○大学
工学部情報工学科卒」にした方が良いかと。
掲示板をアプリケーションウィザードだと勘違いしてる偽学生諸君、君らは 何のために親のスネをかじって学校に行ってるのか? 将来就きたい職業 に向けて職能を身につけるためではないのか? 課題を丸投げして「動くようにしてください」なんてやってると君らの頭には 何も残らない。職能なんか身に付かない。考える必要がないから。 それでは君らのためにならない。いや、この際君らのことはどうでもいい。 何も知らずに高い学費を払っている親御さんが不憫だし、なによりも そーやって単位を取得して「●●大学工学部情報工学科卒」なんて履歴書 もって 入ってこられると、俺達現場の人間が非常に困る。 頼むから向学心がないならさっさと単位をあきらめて別の道を選べ。 それでも課題をやって欲しかったら学校名と学籍番号を書いてくれ。 早急に人事に連絡しておくよ。「こいつが来ても追い返せ」とね。
コピペはやめとけ。今は流行は参照だ。
514ってバグはいってる?
priority of operator
533 :
デフォルトの名無しさん :2001/06/02(土) 21:34
>>485 setjmpとlongjmpの実装方法を是非教えてください。
>>533 ある処理系ではプログラムカウンタやスタックポインタなどのレジスタが
メモリ上にマップされていま(以下略
490=526=531 自分ではバグがあるのかないのか確認できないので、名無しさんのふりをして 教えてもらおうと必死です。 学校を卒業してからも、そうやって周囲に迷惑をかけながら仕事をするんでしょうね。
>>490 君のような奴にはマジかネタか区別の付かないようにレスをするのがこの板の
暗黙のルールなんだよ。あ、言っちゃった(w
537 :
533 :2001/06/02(土) 22:15
>>534 レスありがとうございます。
関数の戻り先番地やフレームポインタはスタックに積まれますから、setjmp
の引数(jmp_buf型)からの相対アドレスで操作できますね。
ほとんどの場合、関数内で破壊してはならないレジスタがいくつかあると思う
のですが、安全にjmp_buf型のオブジェクトに退避する方法がわかりません。
レジスタファイルがメモリマップ上に配置されているプロセッサの場合はとも
かく、それ以外のプロセッサの場合はやはりCだけでは実装できないのでしょ
うか?
↑のほううざいよ 無視しとけばいいのに
>>537 単純に与えられたポインタをスタックに積まれた戻り先ポインタに
差し替えてreturnすればOK。
540 :
533 :2001/06/02(土) 23:10
>>539 それだと、setjmpの後で呼び出された関数からlongjmpしたときに、正しく
レジスタが復帰しないと思うのですが。
変数を全部volatileにしても、この問題は解決しないように思います。
541 :
デフォルトの名無しさん :2001/06/02(土) 23:13
543 :
デフォルトの名無しさん :2001/06/02(土) 23:22
>>541 if文の中のif文とかの問題ではない。
答えを言ってもいいけど、それだともっと根深い問題に気づかないままに
なってしまうから控えておくよ。
悪いことは言わないから、全部捨てて書き直した方がいい。
544 :
デフォルトの名無しさん :2001/06/02(土) 23:33
>>541 他人にデバッグさせるのね。
困った人だわ。
545 :
541 :2001/06/02(土) 23:35
答えを言うと根深い問題に気づかない・・・ と言うことは,何だろう・・・? 書き直したの2度目なんだけどね・・・ とりあえず何を勉強したらよいのか教えてもらえませんか? 何も思いつかないもんで・・・ すいません・・・
546 :
541 :2001/06/02(土) 23:37
デバックさせるつもりはないですよ。 でも結果的にそうなっているのね・・・ 申し訳ないです・・・ ここでは何を聞いたらいいんでしょうか?
>>541 だれも指摘しないけど、mainが長すぎて読む気がしない。
(それが仕事なら別)
>>540 setjmp()の処理としてはスタックに積まれているレジスタ退避値や戻り先ポインタ、
呼ばれた時点でのスタックオフセットをグローバルに取られたjmp_buf ma構造体変数
に退避する。
longjump()関数内ではjmp_buf maの情報を元にスタックを辻褄合わて
リターンすれば完了。
詳細はコンパイラの実装の本を読む事をお勧めするよ。
549 :
デフォルトの名無しさん :2001/06/03(日) 00:00
こんなCの書き方ができるなんてスゴすぎる。 何に教わったんだ?
550 :
デフォルトの名無しさん :2001/06/03(日) 00:02
551 :
540 :2001/06/03(日) 00:11
>>548 しつこいようですが、コンパイラの種類によっては、関数の呼び出し時に
退避されないレジスタ群とかも結構あって、それらのレジスタを関数内で
破壊する場合は、リターン時に元に戻す必要があります。
longjmpを呼び出す前に、これらのレジスタが破壊されていた場合には、
setjmp以前の値に戻す必要があるわけですが、それらの値はスタックに
積まれているわけでもなく、レジスタを直接操作する以外には確実に退避
する方法が思いつきません。
教えていただいた方法は、関数呼び出し時に呼び出し側で保存されるレジ
スタについてはうまく退避できます(もっともこの場合はjmp_buf型に
格納する必要もないでしょう)。しかし、それ以外のレジスタについては
どうしようもありません。
それから、フレームポインタを使用しない処理系の場合にも、スタックポ
インタを元に戻す方法が思いつきません。
>>541 単純なミスです。
それより君のもってる入門書とかで
「これはあまりおすめしない」とか
「一般的にこういうときはこうしてます」
とか簡単な初心者のための定石みたいなもの書いてない?
553 :
543 :2001/06/03(日) 00:21
>>545 とりあえず、自分なりに納得がいくまで全部書き直してみて。
550の意見は聞く耳もたなくていいから注意して。
sizeof の後()で囲むのはかっこ悪いのですか?
>>551 >しつこいようですが、コンパイラの種類によっては、関数の呼び出し時に
>退避されないレジスタ群とかも結構あって、それらのレジスタを関数内で
>破壊する場合は、リターン時に元に戻す必要があります。
そのコンパイラってバグってるんでないかい?具体的な処理系を教えてちょ。
>>553 >550の意見は聞く耳もたなくていいから注意して。
俺は
>>550 じゃないけど別におかしなことを
言ってるわけではないと思うが?
よーするにif文等は全部{}つけとけって言いたいのでは?
if(a<0); a=0;
558 :
ドキュ学生 :2001/06/03(日) 00:54
すごいプログラムだね。はじめて見た。ある意味関心。
>>556 元のソースをよく読め。…いや、やっぱりいい。
見なくて済むなら見ない方が…
>>541 scanfのプロトタイプ宣言を良く見直すように。
それとポインタの勉強をやり直せ。
あと、「構造化プログラミング」ってのを勉強しておけ。
561 :
ドキュ学生 :2001/06/03(日) 01:13
>>559 あ、ごめんね。541のこと。
プログラム初心者の友達が似たようなもの書いてたが、
200行も行けば破綻するでしょ、普通。
デキる奴だから、ここまでのが書けるのかなと思った。
563 :
デフォルトの名無しさん :2001/06/03(日) 02:15
>>555 話がずれてる気がする。
>>551 が問題にしてるのは
- アセンブラを使わずC言語の範囲だけで setjmp(), longjmp() が書けるのか?
だと思われ (
>>485 を受けての発言)。これに対する答えは
- No, 場合によってはアセンブラで書かないとダメだ
で良いかい?
>>554 に便乗して、return(0) はカッコ悪い??
return ((0));にしとけ。
誰か540に教えてやれ。 「純粋なCだけで標準関数を実装できるかどうか」という問い自体が処理系依存だって。
>>567 もともとは、「ライブラリを使わなきゃ何も出来ないんだよーだ」
といいだした人がいて、その人いわく、
「Cでライブラリは書けないんだよ。printf作れるか?オラ」
とのことなので純粋なCでライブラリが書けるか論争になってます。
(オラも最初は書けないと思ってただ)
とりあえず、prinfは純粋なCのみで実装できることが一応証明された
ので、めでたしめでたしとなってます。たぶん。
>>568 それでlongjump?longjump自体がメチャメチャ処理系依存じゃん。
振る舞いも実装も処理系に任せられてるから云々しても無意味なんでは?
>>569 処理系に依存してる っつーのは百も承知だったり。
とにもかくにも Cだけ(アセンブラでのライブラリとかはナシ)
で書けるかというのが論点だったんで、まーそんなもんです。
おかげで処理系をそんなに気にせずに済むライブラリの存在が
急にすごいものに思えたりして結構面白かったような。
>>563 >>555 の質問俺も聞きたい。退避してないレジスタを呼び出し先で
ぶち壊しておいて、呼び出し元で値を期待するCコンパイラなんて
あるのか?K&R以前のC?
K&R以前とかそう言う問題じゃないと思われ(w
>>563 の脳内にある処理系で実装できるかどうかまでは
誰にも何にも言えないね。
576 :
ゴルァ :2001/06/03(日) 07:07
CとC++の違いはなじゃ〜 ゴルァ
>>576 Cで//でコメントがかけるいま、両者は私にとり同じものです(泣
>>576 一度クラスというやりかたに触れると、
そうでないスタイルに戻れなくなります。
javaでもいいから触れておくべし。
579 :
551 :2001/06/03(日) 08:28
>>555 結構いろいろな処理系がそうした実装になっています。
例えば、三菱のM16C/80用の純正コンパイラNC308の場合、すべての汎用レジスタは
呼び出された側で退避しなければなりません。また、R4000系用のIRIX CやexeGCCの
場合は、v0,v1やa0〜a3, t0〜t7レジスタは自由に破壊できますが、s0〜s7(またはs8)
は値を関数内で退避しないといけません。
if (setjmp(env) == foo())
{
hoge();
}
のような処理を想定してみてください。前後で使用する変数がすべてvolatileであった
としても、等価演算子のオペランドであるfoo()の返却値はレジスタに格納されている
場合が十分ありえます。
そして、hogeの中でそのレジスタを破壊する場合、通常であればhogeからのリターン時
にそのレジスタを元に戻すのですが、途中でlongjmpした場合にはそうした動作を期待
できません。
この場合、当然jmp_buf型の変数にそれらのレジスタの値を格納しておいて、longjmpで
元に戻す必要がありますが、レジスタを直接触れない限り、それらを確実にjmp_buf変数
に格納する方法は思いつかないのです。
580 :
579 :2001/06/03(日) 09:32
少し言葉足らずだったのか、分かりにくい内容になってしまいました。 ようは、setjmpを呼び出す前のレジスタの状態をlongjmpで同じ位置に戻って くる際に元の値に戻すには、setjmp関数内で何とかしてスタックに積まれて いないレジスタを退避する必要があるということです。 setjmpは規格上はマクロですが、関数として実装する以外にCだけで実装する ことはできないでしょうね。
>>579 -580
結局何が言いたいの?setjmpを関数として実装することに何か問題でも?
582 :
デフォルトの名無しさん :2001/06/03(日) 09:58
>>541 なんか、俺の今やってる仕事のソースに似てるな。構造が。
gotoの使い方とかmainの中で全部ってのが特に。
みんな電車の中では電源切れよな。
>>580 自分でも認めているようだが、それ以上にわけ判らんぞ。
yahoo
JISからUTF-8に変換する方法ってわかるかたいますか いたらヒントだけでも教えてください お願いします
jis2utf8
ウインドウの提供しているAPIも利用すれば変換は簡単にできるんですが 実際に内部でどんなことやっているのかわからなくて 文字コードについて書かれた本がほとんど本屋においてなくて 何かいい本があったら教えてください。 内容がわからないと通販でも買うのも躊躇してしまうし
588 :
初心者プログラマ :2001/06/03(日) 12:33
C言語で「例えば1+4とキーボードから入力した場合、 その演算結果を表示する電卓プログラムを作成せよ。 ただしswitch分を使い演算子は*,/,-,+などにも対応できるようにせよ。」 これ、教えてください。よろしく願いします。
>>588 フローチャートをかいてやる
入力
↓
構文解析
↓
実行
↓
(゚д゚)ウマー
590 :
初心者プログラマ :2001/06/03(日) 12:53
>>589 C言語始めたばっかしなので、よくわかんないです。
無能ですいません。
順を追って解説してやる。 入力は scanf でいいだろ。 使い方は調べろ。
592 :
初心者プログラマ :2001/06/03(日) 13:00
scanf は、なんとかわかります。 後、よろしくお願いします。
念のために聞きたいんだが、入力される数字は -6.0*-2 をサポートするのか? 整数のみなのか? 負のサポートは? かっこは? それによって手の抜き方がかわってくるからな
594 :
初心者プログラマ :2001/06/03(日) 13:13
小数、負のサポート、-6.0*-2 はありだと思います。かっこはまだ、 習ってないので、なしです。 お手数かけます。
>>588 -594
どっかの2ショットチャットでやれ。うざい。
596 :
七氏 :2001/06/03(日) 13:18
ここでやるで
>>595 了解。めんどうだったし、もう帰るわ。がんばれよ
598 :
初心者プログラマ :2001/06/03(日) 13:20
もう、どうでもええわ
599 :
ど素人 :2001/06/03(日) 15:14
タイマーを使いたいのですが、たとえば2秒たったら入力を 打ち切るといった使い方が分かりません。
600 :
デフォルトの名無しさん :2001/06/03(日) 15:22
ランダムでqui1に1から8の数字 ランダムでqui2に1から16の数字をいれ その2桁の数字パターンから 複数のswitch文で8×16の処理の中から1つを選び処理します 32回繰り返しつつ1度出た数字パターンは2度と繰り返さないようにする プログラムを作っていますがうまくいきません ランダムで出た数字を一度qui1とqui2にいれ 繰り返し回数をcouでカウントしながら その数字をac1[cou]とac2[cou]にいれました それをdo〜while文とfor文で for(cou=0;cou<33;cou=cou+1){ do{ qui1=rand()%8; qui2=rand()%16; } while(((qui1==ac1[0])||(qui2==ac1[7]))&&((qui2==ac2[0])||(qui2==ac2[16]))); (qui1とqui2の数字に対する処理) } while文の中は異常に長いので掲示板では略して書きました もちろん変数宣言やsrand(clock());などはしています ac1[32]ac2[32]はすべて-1をいれています うまくいきませんどうか力をかしてください
>>600 要は同じ組み合わせが出なければいいんでしょ?
検証してないから動くかはしらない
int flag[8*16]={0};
int i,qui1,qui2;
for(i=0;i<32;i++)
{
do{
qui1=rand()%8;
qui2=rand()%16;
}
while( flag[qui1*16+qui2] );
flagflag[qui1*16+qui2]=1;
/* ここでqui1とqui2が得られてる */
}
602 :
デフォルトの名無しさん :2001/06/03(日) 16:00
よーわからんけど、ac1[]とac2[]に別けてはダメなんでないの? 組み合わせの数は 8x16 有る訳だし… ac[8][16]とかで持てば十分だけろうけど… 32回繰り返すという時点で、1〜8 の qui1 は4回くらい 同じ数が出てくるでしょ?
603 :
デフォルトの名無しさん :2001/06/03(日) 16:07
>>600 >>601 のやり方でいいと思われ。
ただ、
int flagflag[8*16]={0};
が抜けてるので注意。
うまく動かないうちは、srand(clock());はやらない方がいいぞ。
毎回違う乱数が出るよりはデバッグしやすいから。
srand( 2 );とかで決め打ちすれば、毎回必ず同じ乱数でるからね。
>>603 flagflag って flag の間違い。あははのはーだ。
605 :
デフォルトの名無しさん :2001/06/03(日) 16:10
ありがとうございます早速試してみます
#define ONANIE
インディアン エンディアン どっちのほうで呼んでますか?
608 :
デフォルトの名無しさん :2001/06/03(日) 16:37
うまく動かすことができました 601〜604のプロフェッショナルの方々ありがとうございました while( flag[qui1*16+qui2] ); flag[qui1*16+qui2]=1; こんな動作はまだ2ヶ月の俺には思いつかなかったです 皆さんさすがですね
>>608 ちなみに、flag[qui1*16+qui2] となっているのは、
flag[qui1][qui2] のときの宣言時の初期化方法を
ど忘れしたからにすぎない。 わははのはーだ。
610 :
605 :2001/06/03(日) 17:14
>>609 flag[qui1][qui2]={
{0},{0}
}
もしかしたらこれで合ってますか?
611 :
605 :2001/06/03(日) 17:16
↑間違い間違い flag[8][16]={ {0},{0} } もしかしたらこうですか?
612 :
デフォルトの名無しさん :2001/06/03(日) 17:40
次のスレタイトルは、「C言語なら、俺に聞け!(宿題は手伝いません)」 にしておかないと、初心者と名乗る努力しない君がいっぱい来るぞ
613 :
603 :2001/06/03(日) 17:51
>>604 うわ!!めっちゃ恥ずかしい!!
顔から屁が出そーだ!!
ごめん、ちゃんと理解して中田よ。
>>611 int a[2][3]={ {1,2,3}, {4,5,6} };
てな感じなので、それでも一応あってるのかな?
{0}は一つでいいのでは?
>>612 だな。
614 :
shige :2001/06/03(日) 19:38
トイレに閉じ込めて3時間も放置しやがったからな・・・ これは報復なのだ・・・
615 :
shige :2001/06/03(日) 19:43
>>612 ありがとうございます。
試してみますね。
616 :
0x264 :2001/06/03(日) 20:51
?
昨日はネットに繋げなかったのですが、少し時間を空けて読んでみると、 自分が書いた事を、ちゃんと読まずに、レスを入れる人も多いけど、 自分も、人の書いた事をちゃんと読んでない事が分かりますね。 それにしても、標準出力先が、メモリ上と言う発想は、面白かったです。 (煽っている訳ではなく、本当に。) ですが、自分が出来ないと言っているのは、 K&RやANSI準拠のソースで出来た、大多数の処理系で動くCであって、 処理系依存で出来れば良いと言う話ではありません。 純粋なCという書き方で分かると思って書いたのですが、 それを、大多数の処理系で動くCとは、とって貰えなかったようですね。 尚、この話題を、今更引っ張るつもりはありませんので、あしからず。
>>617 >それにしても、標準出力先が、メモリ上と言う発想は、面白かったです。
ANSIもK&Rでも標準出力先が画面表示である必要を規定していない。
実際にあるんだよ。そう言う処理系が。
だいたい何をもって「大多数の処理系」に当てはまるかどうか判断する気か?
標準出力画面表示で標準入力がキーボードって、普及してる総数は多いが
処理系の種別としてはレアな方だぞ。
組込用の処理系なんてCPUとペリフェラルの構成ごとに実装が分かれるからな。
それこそ星の数ほどあるよ。
ちなみにメモリマップトI/Oは組込では好んで使われる。
つまり、大多数の処理系では「純粋なCだけで標準ライブラリを実装できる」事に
なるが?
411です。 418さん、421さん、レスありがとう。 sleepだとプロセス全体が休止するんじゃないかと不安でした。 LinuxJapanも見てみます。
620 :
デフォルトの名無しさん :2001/06/04(月) 21:53
>>618 そんなに偉そうに言うもんじゃないよ。
617の言っていることは、表現のまずさはともかく、特に間違ってはいない。
組み込み処理系はフリースタンディング環境だから、そもそも標準関数など規格上存在
しない。
標準関数について語る場合、特に指定しなくてもホスト環境のことに決まっている。
printfなどは純粋なCだけでスクラッチできるけど、既出のsetjmpやlongjmpはプロセ
ッサによってはやはり実装できない。戻り先番地が専用のスタックに詰まれる場合もある
からね。この場合、アセンブリ言語でないとどうしようもない。
もっとも、アセンブリ言語でしか実装できそうにないものでも、最悪の場合、機械語の
サブルーチンを配列に格納して、それを関数のポインタにキャストして無理やりコール
すれば実現できる。ところが、プログラムとデータが同一のメモリマップ上にない場合
にはこの方法は無理。
これが理由でsetjmpとlongjmpが実装できない場合が有り得る。
それにexit関数も(おそらくatexitも)無理。なぜなら、最初のmainの呼び出しから
リターンするときexitの呼び出しと等価でないといけないから。スタートアップを
書き直せばよいというかも知れないけど、ホスト環境のエントリ関数はmainであると
決まっているので、スタートアップに手を出した時点で規格合致処理系ではなくなって
しまうからね。
>>618 Cで標準出力に出力する場合は、stdoutを使いなさい。
直接メモリ上に書き込んでしまうと、意味のある標準出力になりません。
その上で、あなたが言ってる事にどれほどの意味があるか考えて下さい。
>>489 さん 大まかに言えば、バッファ確保とポインタ制御です。
>>621 stdout の出力先がメモリだ、と言っておるのだ。
fopen,fclose,fread,fwrite,fflush,signal malloc,free,time,setjmp,longjmp,exit 足りない(余分な)ものもあるかもしれないが、効率を無視すれば、 これだけあれば、ほとんどの標準関数は作れるはず。
>>624 つまり、それらは全部ライブラリってわけだ。
>>620 >>617 =
>>397 は、結論は正しい可能性があるんだけど、途中で論理破綻
したり逆切れしたりで全然信用されていないんだよ。
結局良く考えないで発言した
>>397 が否定されたせいで、どうしても
自分の考えが正しいと認めさせたいだけ。
凄く幼児的だから正しい間違っている以前に相手しない方が良いよ。
スレが汚れるだけ。
628 :
デフォルトの名無しさん :2001/06/05(火) 01:33
>>599 僕も初心者だけど、君の為に一生懸命サンプル作ったよん。
ゲーム仕立てになっているからあそんでねん。
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <time.h>
#include <stddef.h>
int GetKey(void){int i;if(kbhit())i=getch();else i=0;return i;}
int GetChar(char *p,double d){int i,j;time_t t;t = time(NULL);
for(j=0;i!='\r';){if(i=GetKey()){if(i!='\r')printf("%c",p[j++]=(char)i);
else {printf("\r\n");p[j++]='\0';return 1;}}
if (difftime(time(NULL),t) > d)return 0;}return 0;}
int main(int argc,char *argv[])
{
char c[]="NamaMugi Namagome Namatamago.";
char p[100];/*tekitou*/
printf("ねぇねぇ。「%s」って入力して。はやくはやくー!\r\n",c);
if (GetChar(p,4)){
if(strcmp(c,p))printf("ちげーよ。ダホ!");
else printf("なに真剣になってんの?バカじゃない?%s\r",p);
}else printf("遅いんじゃい!このノロマが!");
return 0;
}
>>628 勉強中の者としては役に立ったです。
他にも違うテクつかったのキボーン
>とりあえず、prinfは純粋なCのみで実装できることが一応証明された >ので、めでたしめでたしとなってます。たぶん。 とありましたが、ではいざ main() {} だけでhello worldを表示するとなると{}内にはどのような記述が考えられますか? 環境はWindows上でVC++6を使うとした場合で・・・
>>630 ”画面に表示” というのは全く議論の対象になってなかったからね。
ライブラリのソースを見てみないとにんともかんとも
>>628 とても初心者とは思えません。凄いです。
このやりかたでは、キー単発しか取得できなくて、連続押しは
出来ませんよね?連続押しできる方法はあるのでしょうか?
簡単なゲームを作りたいんですけれも挫折してたんです。
でも感謝です。テトリスとかできそうですね。
setjmpとlongjmpはANSI Cで実装できるとは限らないということで よろしいでしょうか?
>>630 >Windows上でVC++6を使うとした場合で・・・
自分もVC++の処理方法は知らないので、
もしかしたら、何をやっても、出来ないかもしれませんが、
stdoutのメンバに必要な処理をしてやれば多分OK。
バッファがフラッシュ出来ないので、あふれた場合や、
バッファリングされていない場合はNGですが、
そうでなければ、プログラム終了時に、勝手に出力されます。
他の方法は、VC++に詳しい人に期待。
635 :
デフォルトの名無しさん :2001/06/05(火) 05:42
>>634 #include "stdio.h"
main()
{
fputs("Hello World\n", stdout);
}
じゃないの?
それから、ライブラリが無いと何もできないというのは、まあ
普通に OS 提供の API やシステムコール等使うという意味では
そうなんだけど、8bit パソコンの時代や Wonder Swan みたいな
シンプルなゲーム機だったりすると、C で直接ハード叩いてあれこれ、
ってこともそれほど珍しくないと思う。Win32にしても、突き詰めると
結構多くの(OS側の)コードもCで書いてあったりするし。
typedef void *HANDLE; typedef unsigned long DWORD; HANDLE GetStdHandle( DWORD nStdHandle ); int WriteConsoleA( HANDLE hConsoleOutput, void *lpBuffer, DWORD len , DWORD *written, void *reserved ); int main() { DWORD written; HANDLE hStdout = GetStdHandle(-11); WriteConsoleA(hStdout,"Hello World!\n", 13, &written, 0); return 0; } _stdcallを宣言に入れると不純と言われる気がしたんで、 コンパイルは下のように。 cl /Gz hello.c /link /nodefaultlib kernel32.lib /entry:main /opt:nowin98
>>635 そういえばMSXのCならライブラリなんていらないな
Cで出来なくてアセンブラでしか出来ないことってある?
640 :
デフォルトの名無しさん :2001/06/05(火) 09:08
>>638 1命令のローテートシフト
コンパイラが賢いと、ここぞって所で使ってくれるんだろうか?
cpu依存の命令を使う時、MMX、SIMD、3DNowとか。
642 :
く :2001/06/05(火) 18:10
学校の課題です。誰か教えてください。 成田空港の駐車料金は以下のようになっています。最初の一時間は500円、一時間を 越えて6時間までは30分ごとに250円ずつ加算、6時間を越えて72時間までは30分ごと に30円ずつ加算、ただし、6300円が上限、72時間を越えると12時間ごとに900円ずつ 加算されます。たとえば11時間駐車すると500+2500+300円になります。年月日つき の入庫時刻と現在時刻を入力して駐車料金を表示するプログラムを書きなさい。 これって月や年が変わると以上に面倒なんですが、誰か教えてくれませんかね?
>>642 出題した先生にバットで殴る蹴るの暴行を加えれば、非常に楽になりますよ
>>642 月や年が変わっても大丈夫なように、
すべてを秒に変換してから計算なさい
>>644 それって核心に近すぎてギャグになっていないような
俺なら適当な基準点からの分単位の時間に変換して差をとる。
基準点は駐車開始年の1月1日とかにするかな?
すなおに引き算で年月日の差を求めてもいいけど、面倒。
どっちにしろ、月ごとの日数はテーブルかなんかで持ってないといけないね。
あとうるう年の計算に気をつけな。
>>645 マジもマジ。
time関数でも使うがよかろう。
>>642 月や年が買わったら「早く取りに行きましょう」と表示して終了。
>
>>647 そういえば、ちょっと前まで銀行のATMって、記帳しないでログがたまっていくと
「そろそろ記帳しませんか?」みたいメッセージ出てたよな・・・
最近はあふれた分だけ別に郵送されてくるけど。
649 :
デフォルトの名無しさん :2001/06/05(火) 20:15
>>642 その仕様では、駐車の上限、下限、使用される暦、出力通貨は何かが記載
されていなので、たとえばBC4004/1/1からユダヤ歴9010年Thischri月5日までの
駐車料金をインドネシアルピーで出力しないかんかもしれません。よって、
・各種暦からユリウス日への変換ルーチン
・無制限長の四則計算ルーチン
・ネットワークを利用して通貨変換するプログラム
などを利用するのがよいと思われます。
>>650 何はともあれ、「成田空港の駐車場」が作られるより
昔の暦は考えないでいいと思いますがどうか。
>>651 しかしlongを超える期間の処理には気を配った方が良いな。
653 :
デフォルトの名無しさん :2001/06/05(火) 22:42
>>651 未来に関しては五十億年後ぐらいまで見ておいた方がいいのかな?
消費税導入前後とかややこしそうだ
655 :
コロコロ :2001/06/05(火) 22:56
私の学校で出ている課題について教えてください。できれば、コード記述でお願いします。 課題 文字列操作 <処理概要> 入力ファイルに入っているランダムな文字列を読み込んで編集する。 入力ファイル名 \public\C言語応用\課題02\input.txt 入力ファイルの内容 io4@5ovgiq@w340 9tn@q0mikanb924 rwijra;o4 aestrawberryut@90 240strawberry9t animikanrja ddg fvbananaxjfringogqworiadf; amomolkjtcwieroutstrawberry34t7vv dsgfoiuto sdrgovq@4r q0awitflksjd;f laumikanwett errgt thhbcvbasf fitu@qo4rfachocolateaaarffvnxdkjfq23 sdfgi oq34itu aqeurgvksjd q9bananau4 tue ggsjdgoiumomoq349tifvk asrgmomoio uweringoorigporegf asdmomofg sjd;fmikanligurin@qa94it kwjegfr:bananaa ergtqaegr dfgi oeoitgu;fldkgj b9wu44tlgkjjlksvdjgfsmikanadfg oiupqoi34 ta;lkdf j;lakjdfg0987 bjlhbxcvblkj ;lkjchocolateroigeurrgssdmomoffkjahljhringoglar+ j;lkj4rti <詳細仕様> 入力ファイルの内容は、ランダムな小文字のアルファベット文字列からなり、 1行の文字数は揃っていない。これを1行ずつ読み取り、次の編集を加えて 1行を20文字に揃えて標準出力する。加える編集項目は、以下の通り。 1.文字列"ringo"を発見したら、"APPLE"に変換し、発見回数を数える。 2.文字列"mikan"を発見したら、"ORANGE"に変換し、発見回数を数える。 3.文字列"momo"を発見したら、"PEACH"に変換し、発見回数を数える。 4. 文字列"banana"を発見したら、後ろに"cake"を付ける。 5. 文字列"strawberry"を発見したら、後ろに"cake"を付ける。 6. 文字列"chocolate"を発見したら、後ろに"cake"を付ける。 7. 1〜6以外の文字列の場合は、"."(ピリオド)を出力する。 例えば、入力ファイルの1行目にq0mikanb924という文字列があるが、 この"mikan"の部分が"ORANGE"に変わる。他の文字はピリオドになる。 【結果の表示例】 ・・・・・・・・・・・・・APPLE・・ ・・・・・ORANGE・・・・・・・PE ACH・・・・・・bananacake・ ・・・・・ ringoの出現回数は、1回 mikanの出現回数は、1回 momoの出現回数は、 1回 bananaの出現回数は、1回 以上が課題の内容です。ご託宣お願い致します。 再度顔出してすみません。かなり切羽詰まってます。 私は低レベルなのでそれに即したプログラムでお教え願えないでしょうか。 また、fgetsなんかを使うのでしょうか?
いい加減にしとけよ>655
657 :
デフォルトの名無しさん :2001/06/05(火) 23:12
過去に未来か。壮大なスケールだ…
>>643 の解答にかなり納得している。
>>642 よ>643の解答通りにやったらいいのでは。そうすれば悩む必要はないね!
memmoveを用いたプロトタイプ宣言これってmemcpyと比べてどっちが便利(扱い易い)
ex)void *memcpy(void *dest,const void *src size_t n);
void *memmove(void *dest,const void *src,size_t n);
まぁ、memmoveは重複しても性格にコピー去れるみたいだけど…
もしよかったら扱い易い方の貴方の使い道ちょっこだけで書いてみて…
>>656 あんだとー
くそー
できないなら何も書き込むなよ
659 :
コロコロ :2001/06/05(火) 23:17
>>658 は偽者です。
1行読み込みはどのようにするのでしょうか?
また、リダイレクトとはどのようにするのでしょうか?
>>659 プログラムを組む以前の部分すら分かっていないようだが、
学校でいったい何をやってるの?
>>659 偽者でも本物でもどっちだっていいんだよ。
キミさ、プログラミング全く向いてないから止めちまえ。
662 :
デフォルトの名無しさん :2001/06/05(火) 23:28
>655よ。【
>>965 名前:コロコロ 投稿日:2001/06/02(土) 16:14】
と同一人物ですよね♪ nanndekokodemo同じ質問、氏点の?
ほんとに和姦ないの?
663 :
おしえてくん :2001/06/05(火) 23:30
int i=5; printf(" i=%d \n ++i=%d",i,++i); がどうしておなじすうじになるんでしょう?
ウザイ
このまま実装してしまうと、将来地価が上がったり貨幣価値が上下した り税制が変わったりと言った、高度に政治的な仕様変更に対応するのが 大変です。以下のように仕様を書き換えて提出すると評価が上がります。 成田空港の駐車料金は以下のようになっています。最初のn時間はp円、n時間を 越えてm時間まではn/2分ごとにp/2円ずつ加算、m時間を越えてo時間まではn/2分ごと にq円ずつ加算、ただし、r円が上限、o時間を越えるとl時間ごとにs円ずつ 加算されます。
>>663 てめーみてーな奴はC FAQ読めって言ってるだろ。ヴォケ。
キーワードは「引数の評価順」だ。
669 :
うんこMEN :2001/06/06(水) 00:51
あのう、数学とCについての因果関係について知りたいのですが 一体どういったところで数学の知識が必要とされるのですか? 股、どのくらいのレベルまでが必要とされるのですか? 中学生とか高校生の数Uとかあるじゃないですか。 あと、アルゴリズムについての知識があまり無いのですが どうすれば増やす事が出来ますか? それとここのプログラマーサンたちは今までどういう勉強法で取り組んでいたのか 教えていただけませんか? 股一日何時間くらいかとか、出来るだけ詳しくお願いします。 私はかれこれ2年ほどCを触っているのですが、どうもうまく出来ません。 お願いします。
670 :
久保晶彦 :2001/06/06(水) 00:58
うー・・・・。
>>669 最低限必要なのは論理学。知らないとプログラム書けない。
あとは業務によって千差万別。
たとえば波形データを扱うような場合は代数学、解析学が必要。
波形データの測定の場合にはさらに統計学も必要。
勘定系とかだと統計学とか。3Dゲームとかだと代数幾何解析全部必要。
アルゴリズムは専門の本があるから読む。
自分でアルゴリズムを開発するなら数論の勉強をしておくといろいろと
役に立つ。
673 :
うんこMEN :2001/06/06(水) 01:14
>>671 すごい・・・。
論理学ってどういうものですか!?
数論というのも今 初めて聞きましました!!
ヤバイですね・・・。
本とかあればいいんですけど・・・。
あと、代数学とか統計学とか、「必ず」必要なのでしょうか?
知識が無くてもある程度なら組めるといった甘い考えでは通用しないんですかねぇ・・・。
やっぱ・・・。
アルゴリズムの本ですか〜。
わかりました!!
今度買ってきて色々読んでみることにしますです。
ああ・・・。
難しそう・・・。
あ、わざわざご丁寧にありがとうございました!!
おかげで助かります!!
>>673 論理学ってのは命題に対して対偶・逆を導出したり…
要は「pならばq」は真だけど「qならばp」はかならずしも真ならず、
といったことを系統立てた学問。
「必要条件」とか「十分条件」て言葉くらいは聞いたことあるだろ。
数論てのは、ぶっちゃけた話、数パズル。
フェルマーの最終定理もこれに含まれる。
知識が無くてもある程度できなくもないけど、当然の事ながら
原理が理解できてないとコピペ以上のことはできない。
チューニングや仕様変更にはまるで対応不可。
なんかアニメの銃の名前みたいでかっこいいよな
そうねぇ。 ド・モルガンの定理、ベン図、カルノウ図を駆使して論理演算を最適化。 コンパイラ作ったりするには必須。 コンパイラがこれをやってくれないことが明らかな場合とか、アセンブラ でコーディングするときは知ってた方がいいな。
if(a==b && c==d) と if(!(a!=b || c!=d)) が 同じことを意味してるって位はわかる程度の論理学は必要なんでは? ∪とか∩はAAのための記号じゃないってことですよ。
でも if(foo() && bar()) と if(!(foo() || bar())) の結果は同じにならないよね
680 :
デフォルトの名無しさん :2001/06/06(水) 12:05
677に対応させるんなら if(!(!foo() || !bar())) って書きたかったんじゃないのか? 結局if(foo() && bar())とかいうときにはfoo()が偽ならbar()は評価 すらされないって事を言いたかったんだと思うが、 もうちょっと落ち着いて書け。
682 :
デフォルトの名無しさん :2001/06/06(水) 12:17
入力された文字数を調べるプログラムです。 Borland C++ Compiler 5.5でコンパイルしてみたのですが、 なぜかコメントの入っている行のprintf()が実行されません。 ちなみに、LSI C-86 Ver.3.30 試食版では正常に動作しました。 #include <stdio.h> main() { char c; long n; n = 0; c = getchar(); while (c != EOF) { ++n; c = getchar(); } printf("%ld\n", n); // 問題はこの行 return 0; } これについて何か知っている方は、ぜひ教えてください。
683 :
デフォルトの名無しさん :2001/06/06(水) 12:17
>>681 それはC++なら規定されていたかもしれないけど、
Cだと処理系依存じゃねーのか?
>>678 if( ! ( ! foo() || ! bar() ) ) じゃないかな(あってる?)
それよりも、Cで評価式の中に関数を入れるのは
わかってないとバグの元だから注意しよう。
685 :
デフォルトの名無しさん :2001/06/06(水) 12:19
Perlだと open .. or die で積極的に利用していますよね。
>>682 c = getchar();
while (c != EOF) {
++n;
c = getchar();
}
この行、無駄ねぇか・・・?
whileの()内に条件書きたがる人って、この手の無駄多いよなぁ
んだよかぶりまくりじゃーん。みんな昼休みなのか。
>>683 K&Rには
「左から右に評価され真偽が判明した時点で打ち切る」
って書いてあるから、多分規定されてるんだと思う。
while(getchar() != EOF) ++n;
>>682 はやくて見えないだけです。
一番最後に sleep(10); でもはさめばprintfは実行されます。
691 :
デフォルトの名無しさん :2001/06/06(水) 14:03
>>688 「多分」っていうか規定されています。
基本的な演算子の機能くらいみんな覚えようよ〜。
5つも10個もの言語を使わなくちゃならなくって
大変、って人はともかくとしてさ。
692 :
デフォルトの名無しさん :2001/06/06(水) 14:08
あの、VC++の乱数の作り方。 1から6までの乱数作りたいんですけど。 randだけではむりですよね。 VBだとわかるんですけど。
693 :
デフォルトの名無しさん :2001/06/06(水) 14:11
n = rand()%6+1; 数式的には算数レベルだけど、意外と思いつかないtipsなのかもね。
>>695 じゃ %ld が悪いんだなきっと。
手元にCの本が無いから分らないけど
Sleep(10000); これくらいでどうだろう(藁 うーんと、バッファがフラッシュされていない可能性はどうでしょう? fflush(stdout); を入れてみるとか。
>>697 どちらももだめなようです。
>>696 それはないと思いますよ。
コンパイラのバグということはあり得るのでしょうか。
>>681 条件が違うんだから結果が違うのは当たり前、という話だな。
printf("hello, world\n"); とでもして、printf自体が実行されてるかを確認しよう。
stdoutの向き先が変な方に行っているというのはどうだろう。 fprintf(stderr,"%ld\n",n); にしてみるとか。 よくわからんがBolandCにもコンソールってあるの?
>>682 > 実行されません。
無限ループしてないか?プロンプトは返ってきているのか?
だとしたら
> char c;
int c;
にしてみろ。
>>682 ところで、EOFってどうやって検出してるの?
その環境でのEOFの値って何だろう。
getcはちゃんとEOFを返却するのかな。
705 :
デフォルトの名無しさん :2001/06/06(水) 16:31
Ctrl+D
もしくは
Ctrl+Z
で終了させてみろ
>>682
706 :
デフォルトの名無しさん :2001/06/06(水) 17:06
今時こんな話しで悪いが MS-DOSで図形を表示したいのですが エスケープシーケンスでスクリーンの制御をするためのライブラリって なんかいいのあるかな? 図形って言うか サインカーブの曲線とかのグラフ表示したい どうなんでしょみなさん?
>>706 pc-98なら、やったことあるけど。。
>>682 >printf("%ld\n",n);
を
printf("\n%ld\n",n);
って改行入れてみればいいんでない?
いろいろと返答ありがとうございます。
すべて試してみたのですが、やはりうまくいかないようです。
↓もうひとつ試したのですが
>>682 のwhile(){}の後
printf("%ld\n", n); //表示されない
printf("Hello, world!"); //表示される
return 0;
}
また、条件をEOFの代わりに別の文字 (例えば 'q' ) にした場合は、
正常な結果が出ました。
なぞは深まるばかりです。
>>709 long n;
printf("%ld\n",n);
を
int n;
printf("%d\n",n);
に変更
>>709 コンパイラ:Borland C++ 5.5.1
OS :NT4.0 SP5
で
>>682 のソースを実行したけどうまくいくぞ?
そっちの環境を教えてくれ
713 :
デフォルトの名無しさん :2001/06/06(水) 23:18
閏年の日数計算で質問です。 例えば1800年1月1日から2001年1月1日の日数計算だったら 閏年も考慮できるんですが、それが 1800年1月1日から2001年12月31日とかになると、 正確な数字が出せません。月によって日数が違うのはどう考えたら いいんでしょうか?
>>713 そんなもの言うまでもないと思うが。
本当に思いつかないのなら、脳味噌スカスカだぞ。
715 :
デフォルトの名無しさん :2001/06/06(水) 23:28
>>714 脳みそスカスカでいいからどういうソース書いたらいいのか教えて。
716 :
デフォルトの名無しさん :2001/06/06(水) 23:30
>>682 char c ; long n ; getchar () ;
上を、全て下のように変えて、駄目だったら、
int c ; size_t n ; fgetc(stdin) ;
次の結果がどうなるか報告するように。
printf("Hello, world!\n%ld\nHello, world!",n) ;
int a; double c = 128.555; a = c; printf("%d\n",a); 結果 : 128 どうしてこうなるのでしょうか? 四捨五入がされないんですがコンパイラに問題があるのでしょうか? 教えてください。
>>722 0.5を足しても、やっぱり1人以上だな
K&Rによると、 浮動少数→整数の変換は、小数点以下が単に無視されるだけだそうです。 123.456→123ってことですね。四捨五入したかったら予め0.5を足しましょう。 負数の場合はこれじゃダメだけど。
726 :
デフォルトの名無しさん :2001/06/07(木) 01:21
自動的に四捨五入されるような代入式なんて、
怖くて使えないと思わないのかなあ
>>722
C++のdelete[] に関しての質問です。 char *buff = new char[10]; // 中略 1) delete [] buff; 2) delete buff; 1)が正しいと思うのですが、2)でもメモリーリークしない とベテランの人に言われました。本当でしょうか?
728 :
sage :2001/06/07(木) 01:45
>>727 ベテランの使ってるコンパイラは親切なのでリークしないのでしょう。
あなたが将来使うコンパイラでリークしない保証はありません
729 :
デフォルトの名無しさん :2001/06/07(木) 01:57
unsigned char aa[128]="ABC|012|DEF|345"; の時に例えば、DEFだけを取り出す処理ってどういった流れになるんでしょうか?
>>729 そのものズバリのコードを書いたほうがいい?
ヒントだけの方がいい?
aa[11] = NULL; unsigned char *bb = &aa[8];
>729 やりたい事によります。 "DEF"を探したいだけなら、strstrで十分だし、 "|"をデミリタにして、区切ってから探したいのなら、 strtokと、memcmp(strcmp)を使う。
char p = aa; while(*p!=NULL){ pからの文字列とターゲット文字列"DEF"を比較 一致した? ポインタを返す pを進める } エラー; |を区切りとして扱うなら、NULLと同格にみなしてくれる比較関数を書こう その場合pの進み先は次の|かヌルになる。
>>728 ありがとうございました。発見次第delete[]に直します。
736 :
デフォルトの名無しさん :2001/06/07(木) 02:24
main( argc, argv ) int argc; char **argv; { inst( argc, argv ); } この「int argc;」「 char **argv;」は、なぜmainの{}の外に記述 してあるのですか? {}の中に書いてはダメなのでしょうか?
>>736 それはちょっと古い書き方かな。多分。
やってることは
main( int argc, char **argv)
と何一つ変わらないよ。
>>736 ANSIでは
int main(int argc, char* argv[])
と書きます。
ていうか{}の中に書くのはローカル変数だ。
739 :
デフォルトの名無しさん :2001/06/07(木) 02:29
>>692 GetTickCount()%6+1では、どうだろう?
740 :
K&R先生 :2001/06/07(木) 02:30
ANSIは認めませんよ
>>739 それだと1/1000秒以内に数回読み出すような場合に不都合が。
2回振った合計を求める場合とか。
>>734 俺も少し前までやってたけど
NULLと比較しないでNULL文字'\0'と比較するものじゃないのですか?
743 :
デフォルトの名無しさん :2001/06/07(木) 04:36
ANSIは認めませんよ
>>742 そうですね。
鬱なのでもう一度K&Rを頭から読みます。
>>717 報告します.
一番最初の”Hello, world!\n”だけ無視されました。
何が起こっているかは少しわかりました。
どうやら、初めの改行までが表示されないようです。
もう少し調べてみます。
解決しました いろいろと騒がせてすいませんでした ほんとにバカなミスをしていたのにきずいていなかっただけでした。 ありがとうございました >> all
>>747 はずかしくてちょっと書けません
ごめんなさい
恥ずかしくないからこっちおいで
>>748 ていうか掲示板に質問投げて自力解決したらフィードバックするのがルールだぞ。
なんか<3>は進行が早いね。
>>682 関連
壮大なネタ?
それから、中途半端くんは、もしそれがネタなら書き込みを控えるように。
ここはネタすれじゃないよ。
>>752 ネタで書き込んだことなんて一度だって無いんだけど・・・
あっしは認めませんよ
>>690 >はやくて見えないだけです。
>一番最後に sleep(10); でもはさめばprintfは実行されます。
これをネタと言わずして何と言おう。
本気でこれを書いたのか?
for( if(j == 0) { i;} else { j;} ; j++) うまく動かないんですが何がわるいんでしょうか
セミコロンの数が足りない
759 :
デフォルトの名無しさん :2001/06/07(木) 16:02
ソケットで、受信待ちの間、プログラムがとまっちゃうんですけど、、 どうしたらいいのでしか?
マルチスレッドにしよう
>>755 はんぶん本気。
実行中の標準出力が別ウィンドウになってるようなのならそういうことあるし。
762 :
デフォルトの名無しさん :2001/06/07(木) 16:37
質問です。read は一行だけ読み込むのですか? ↓ではなぜ while の中に埋め込んであるのですか? read(STDIN_FILENO, buf, sizeof(buf));だけでは どこがだめなんでしょうか。 #include <sys/types.h> #include <sys/uio.h> #include <unistd.h> #include <stdio.h> #define BUFSIZE 1024 main(int argc, char *argv[]) { char buf[BUFSIZE], *p; ssize_t len, l; size_t n; while ((len = read(STDIN_FILENO, buf, sizeof(buf))) > 0) { p = buf; n = len; while (n > 0) { l = write(STDOUT_FILENO, p, n); if (l < 0) { fprintf(stderr, "%s: write error\n", argv[0]); return 2; } p += l; n -= l; } } if (len < 0) { fprintf(stderr, "%s: read error\n", argv[0]); return 1; } return 0; }
標準入力が何もなかった場合にはゼロが返るから、 エラー処理のかわりにしてるんじゃないか?
>>762 >なぜwhile の中に埋め込んであるのですか
とりあえず無限ループにしたいからでしょ。
↑ コテハンどおりの回答だな
746と748は偽者です。まだ解決してません。 出力先をファイルに切り替えた場合は、正常に出力されました。 これまでわかったことをまとめてみます。 getchar()で入力されたEOFが、画面上に表示される(?)と、 そこからは文字を「画面」に表示することが不可能になります。 ただし、改行が出力されてからは表示可能になります。
#define EOF (-1)
>>767 改行が押されるまで入力ストリームに文字は入っていかないから
取り出せない。こともある。ような気がする。
たとえば、
123<ctrl+d>
と入力しても終わらないでしょ?(このあと<enter>後に<ctrl+d>なら終わる)
123<enter>
<ctrl+d>
ならきちんと4文字入力したと出ます。(<ctrl+d>のみ なら取れる)
で、これは標準入力の問題なんで、bashだかttyだかの設定を
変更すると出来たような気がするけどその辺はよくわかんない。
>>767 いってることがよく分らなかったら、
while (c != 'A') {
とでもしていろいろ入力してみれば納得するよ。多分。
>>769 続き
>>682 の環境はDOSだったね。bashもttyもあんま関係なかったね。
Linuxなら stty -icanon で解決するんだけどねぇ。
>>761 >実行中の標準出力が別ウィンドウになってるようなのならそういうことあるし。
なんの話をしているのかさっぱり解らないよ。
それに、
>>682 の質問は「実行されないが何故か?」だろ。
それに対して、
>はやくて見えないだけです。
と書いたということは、「実行されているが*見えない*」と答えたんだろ。
そして、
>一番最後に sleep(10); でもはさめばprintfは実行されます。
などと意味不明なことを書く。
どこが「半分本気」なんだよ、馬鹿ものが。
つまらんエクスキューズをしないで、ちゃんと答えるか、ネタスレにでも
行きやがれ。
>>771 >
>>682 の環境はDOSだったね。bashもttyもあんま関係なかったね。
お前本当に名前どおりの奴だな。
>Linuxなら stty -icanon で解決するんだけどねぇ。
知らないなら口出しするなよ。
>>682 あと他に思いつくのといったら、getchar を使わずにgetch を使う くらいかな。
>>773 あんまりカリカリしてると血圧上がるよ?
>>774 あーそうかい。
お前の*ちゃんと*のレベルがわかったよ。
777 :
デフォルトの名無しさん :2001/06/07(木) 22:01
C言語があればゲームつくれるって聞いてんだけど本当?
べつにC言語じゃなくても作れるけど>777 ゾロ番おめでとう
779 :
777 :2001/06/07(木) 22:30
おっ、777だったのか。気づかんかった 何気にここ初書きこみでした。 なんか知り合いがゲーム作るのはC言語がイイ!! って言ってたんだけど実際どうなんですか? 後、もしC言語を勉強したかったら どこのサイトに行けばよくわかるですか?
>>779 ネタはsageでやってくれ。
マジなら書き込むな。
「C言語 ゲームプログラミング」で検索>777
ウインドウズプログラムでファイルを再帰的に検索するプログラムを 作ったんですが、実行するとすこし反応しなくなります。 どうすればいいのでしょうか。
>>782 てきとーなところでメッセージループを回せ。
>>682 =767
何で682で、EOFが表示されるの?
どこか、プログラムを端折ってませんか?
もしかして、682のままなら、表示されませんか?
だったら笑うけど…。
785 :
デフォルトの名無しさん :2001/06/08(金) 00:28
>>772 >>実行中の標準出力が別ウィンドウになってるようなのならそういうことあるし。
>なんの話をしているのかさっぱり解らないよ。
>>一番最後に sleep(10); でもはさめばprintfは実行されます。
>などと意味不明なことを書く。
Windows環境でDOSプログラムを実行すると、DOS窓が立ち上がってプログラムが実行されて、プログラムが終了すると窓が消えることがあるけど、761はそれが言いたいのでは?
プログラムの最後にSleep()を突っ込めば、一旦停止されるからprintf()の出力が見えるってこと。
761が説明不足なのはわかるが、おまえの理解力も足りない。
フルカラーのビットマップを24色に変換するプログラムを作れ といわれました。まったくわかりません。 ビットマップがどういうデータ構造をしているかも知りません どなたか暖かい手を差し伸べてください。お願いします。
>>786 やる気があるなら、BMPのデータ構造くらい自分で調べろ。
簡単に分かることさえやらないようなヤツには答える気はしない。
>>787 -788
しかし見栄え良く24色に減色するにはかなり高度なアルゴリズムが
必要とされると思われ。君らできる?(w
誤差拡散かディザでいいんじゃネーノ?
791 :
デフォルトの名無しさん :2001/06/08(金) 01:29
DOSでワイルドカードの展開をしたいのですが、 もしかしてsetargv.objってMS-Cにしか付いてきませんか? Quick-Cを使ってます。ネタじゃないです。
>>789 R3階調G4階調B2階調で24ビットBMPのまま単純近似じゃだめかな?
>>789 ここまで極端な減色だと、元画像の特性がどんなだろうと見栄えのある
画像にはなりにくいので、思い切った減色が必要。
モノクロにしてから256→24に減階とか、輪郭抽出して2値にしちゃうとか
前処理として強烈なフィルターかけるとか。
>>793 そう思う。俺がこの問題を解くのならモノクロ化するね。
たぶん印象は一番良いはず。
>>789 何の為の24色か分からないので、そんな無意味な事は出来ません。
と言うか、出力のフォーマットはどうなってるんだ
>>24 色
796 :
デフォルトの名無しさん :2001/06/08(金) 01:45
まず見栄えよくってどんな判定基準か説明してもらわんとな
>>789 画像サイズが大きくなって良いなら、CMYKの単/複合色の10色と
白黒2色の計12色を使用し、砂網で網点化すりゃ再現できる範囲で
写真画質も可能だが、そんな答えを期待している?
797 :
デフォルトの名無しさん :2001/06/08(金) 01:49
>>795 IndexColorのBMPファイルだと思われ
>>798 >IndexColor
上が良く分からないのですが、24色に何か意味があると言う事?
普通は16か256。百歩譲って32だと思うのですが…。
>>799 意味は無い
あえてあげるとBMPにしたとき256、32よりサイズが小さくなることのみ
32色のBMPって5bit単位データが詰まってるんでしょうか?
>>801 ここで言うBMPとは、BMPフォーマットを指しているのではなく、
ベタなフォーマットの事を指しているのだと思う。
だから、使えるかは別として、考え方は正しい。…多分。
803 :
へたれ :2001/06/08(金) 06:39
>682 確かものによっては printf( "test1\n" ); getch(); とか getch(); printf( "test2\n" ); って書いたら printf の表示がおかしくなったと思う。理由しらね。 Windows2000評価版 + VC++6 SE で printf( "test\n" ); getch(); なら問題なかったけど。
初心者です。 何の意味もないプログラムですが、 #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <time.h> long test( void ) { static long st = 0; st += ( st >> 4 ); return ++st; } int main( void ) { int i; int hairetu[1000]; clock_t start, end; for ( i=0 ; i<10 ; i++ ) hairetu[i]=0; start = clock(); printf( "start = %d\n", start ); for( i=0 ; i<10000 ; i++ ) hairetu[ test() % 2 ]++; end = clock(); printf( "start = %d\n", start ); printf( "end = %d\n", end ); return getch(); } #if 0 ===== 実行結果 ===== start = 50 start = 2530 end = 50 #endif Windows2000評価版 VC++6 SE SP1での実行結果です。 俺には何が間違っているのかわかりません。 バグですか?それとも何か間違ってるのでしょうか?
805 :
デフォルトの名無しさん :2001/06/08(金) 07:40
意味無いってか、なにやりたいかわかんねーよ
>>802 一応、フォーマットを厳密に解釈するなら、5bitIndexColorで最大24色
というBMPファイルを作ることは可能。
1ラインごとにロングワードアラインのためのパディングが入る。
>>804 startの値を変えてないのに、なんで50と2530になるの?
って質問だよね?
test()を10000回も呼び出すとstがオーバーフローしますよね。
stはunsigned型じゃないのでオーバーフローして値がマイナスになることがあります。
そんなときに hairetu[test()%2] が hairetu[-1] になることがあります。
で、たまたまhairetu-1はstartのアドレスだったって話です。
# うちの環境だと違ったけど。
ループを抜けた時点で
hairetu[0] + hairetu[1] + start - startの最初の値 = 10000になるでしょ?
startとendの値が同じなのは大して処理に時間がかからないからです。
あるファイルの文字コードの種類を判別したいのですが JIS,SJIS,EUCの判別はできるのですが、UTF-16,UTF-8の 判別法がわかりません。何かよい本、またはホームページが あったら教えていただけないでしょうか? よろしくお願いします。
811 :
デフォルトの名無しさん :2001/06/08(金) 11:48
>>808 ヴァカか?
test()が返す値は常に1だぞ?
812 :
デフォルトの名無しさん :2001/06/08(金) 11:49
と、思ったらstatic longじゃん、 逝ってくる
813 :
中途半端くん :2001/06/08(金) 12:01
814 :
デフォルトの名無しさん :2001/06/08(金) 12:01
>>809 無いと思うよ
ただ判別法ならバイト並びで、0の後に0x7f以下の値が頻出するならUTF-16とし、
UTF-8はマルチオクテット後のASCIIが正しくデコードできること、でいいんじゃない?
森本レオはオレ、オレって言ってて学校の先生に怒られたから レオにしたそうだ。
ネッシーは氏ね氏ね言われたからネッシーになったそうだ
シチューはカレーを作る途中で中止食らった過程が元で 偶然出来たから、シチューと名づけられたそうだ
カレーライスは、カレーとライスを組み合わせた 食べ物だから、カレーライスと名付けられたそうだ。
ビットマップを任意の倍率で拡大するプログラムを作れといわれた のですが方法がまったくわかりません。 どなたか暖かい手を差し伸べてください。
>>822 なんか、課題をかわりにやってくれっていっているようにしか
読めないが気のせい?
# それは自分の為にも他人の為にもならないよ
元ネタ書いたの俺なんだけど
>>821 違うぞ。そんな間違った知識どこでおぼえてきたんだ。
カレーライスは、始め立ち食いメインの名もない飯の一種だった。
彼らは、そのうち立って食することは行儀の悪いことだと悟り始めた。
そして、彼らは、椅子に座った。
つまり、そういうことだ・
宿題なんですが 4次方程式を解くプログラムを作れといわれたのですが ヒントだけでももらえませんか 言語はCです お願いします
英語の文章を解析して主語、述語、補語、目的語に分解する プログラムを作れといわれました。 なにかヒントをください お願いします
DDRをミュール変換してUTRにしたいんですが 皆さんはどのようにやっていますか? よろしかったらおしえてください。
DDRをミュール変換してUTRにしたいんですが 皆さんはどのようにやっていますか? よろしかったらおしえてください。
>>833 格情報を含む単語辞書と文型辞書を用意してパターンマッチング。
ネタではありません 単語の数を限定(1000語)してありますが それでもむずかしいです。 なにかヒントをください。
840 :
デフォルトの名無しさん :2001/06/08(金) 21:45
>>829 次の宿題だ。
5次方程式を代数的に解くプログラムを作れ。
>>839 文法の木を作って、それを文章に対して再帰的に当てはめる。
自然言語だと複数の解釈が出来上がるかもね。
>>840 自分にできないことを宿題に出すのもどうかと思うぞ
文法の木というのどういうものでしょうか? 名詞ー述語ー目的語 見たいなパターンをたくさん作って 当てはめていくという意味でしょうか?
844 :
840 :2001/06/08(金) 21:53
>>842 確かにオレにはムリだ。頼む、教えてくれ。
BNFみたいなやつ
>>843 文 := 〜 | 〜 名詞
(文は〜または 〜 または名詞から出来ている)
名詞 := 〜 | 〜
(名詞は〜または 〜から出来ている)
こんな風に、どんどん〜の部分を細分化していって、
最終的に終端記号(この場合、実際の単語)までこの
定義を行なう。
846 :
デフォルトの名無しさん :2001/06/08(金) 22:37
n個の整数からr個選び出して順列を生成するってどうやるんですか? n個の整数の順列生成はできるんですが、n個からr個選び出す ところで行き詰まっています。何かヒント頂けませんか?
>>846 r個選び出す条件って何よ?ランダム?
つーか自分で問題の意味判ってる?
848 :
デフォルトの名無しさん :2001/06/08(金) 22:45
n,rの値は自分で決めることが出来ます。#defineなどで。 例えば、n=4,r=2なら、生成する順列は、 12,13,14,21,23,24,31,32,34,41,42,43 です。どうやったらこの順列を作れるのだろうかと・・・。
>>822 「拡大」のみってのがミソだ。
つーことは、やっぱそっち系の学科だろう。
む、バイキューブリック補完とガンマ補正を組み合わせた拡大で「可」が拾えるはず。
単純線形補完なんかやると赤をもらうので注意。
「拡大」と「縮小」が同じ方法で実装しないってこと。
自然画像の処理を研究しているとこなら常識だと思ってたが
>>850
852 :
デフォルトの名無しさん :2001/06/08(金) 23:52
>>729 の者です。一応'|'区切りで取り合えず組んで見ましたが、その後|を境目に一つ一つ出力
しようとして下記のPGの8〜9目を4つコピって、3の部分を1〜4の数字に変えましたが、
どうしても、最初のABCしか出力されないので、その後所々にprintf(…)で物理チェックを
かまして見た所、startとlengが変化しないのが原因みたいなのですが、どこら辺を直せばいいか
ご指導お願いします。
インクルード省略
void kou(unsigned char *rec, unsigned char *buf, int Cnt);
main(void)
{
unsigned char aa[128]="ABC|012|DEF|345";
unsigned char bb[128];
bb[0]=0x00;
kou(rec,bb,3); |→ここの二行を後3つコピーして3を1〜4に変更。
printf("%s\n",bb); |
}
void kou(unsigned char *rec, unsigned char *buf, int Cnt)
{
int i,s,start,leng,count;
start=leng=0;
for(i=s=0;rec[i];i++,s++){
if(rec[i]==0x7c){
count++;
if(Cnt==count){
s=s-1;
leng=s;
break;
}else{
start=i+1;
s=0;
}
}
}
if(rec[i]==0x00 && Cnt==(count+1)){
leng=s;
count++;
}
if(Cnt==count){
memcpy(buf,rec+start,leng);
buf[leng]=0x00;
}
853 :
デフォルトの名無しさん :2001/06/09(土) 00:10
>>846 >>848 これはschemeでの例。
C言語には自分で直してね。(比較用にr個分の配列が必要)
もっといい方法があるかもしれないけど。
(define (disp-rev l)
(cond ((pair? l)
(disp-rev (cdr l)) (display (car l)) )))
(define (example0 n r p)
(let loop ((i 1))
(cond ((<= i n)
(cond ((< 0 r) (if (not (memv i p))
(example0 n (- r 1) (cons i p)))
(loop (+ i 1)))
(else (disp-rev p) (display " ") ))))))
(define (example n r) (example0 n r '()))
(example 4 2)
---|12 13 14 21 23 24 31 32 34 41 42 43
=>()
(example 4 3)
---|123 124 132 134 142 143 213 214 231 234 241 243
312 314 321 324 341 342 412 413 421 423 431 432
=>()
こんど、どこかの会社がA言語を開発したと聞いたのですが 本当ですか?
/⌒ヽ⌒ヽ Y 八 ヽ ( __//. ヽ,, ,) 丶1 八. !/ ζ, 八. j i 丿 、 j | 八 | | ! i 、 | | i し " i '| |ノ ( i i| ( '~ヽ ! ‖ │ i ‖ | ! || | │ | | | | | | | | | | ! | | | | ‖ / ● ● ヾ
>>848 まずその謎の言葉の定義からなんとかしろ。
普通、「整数」と言ったら「0」を含む。
普通、「順列」と言ったら「nPr」の事を指す。
普通、
>12,13,14,21,23,24,31,32,34,41,42,43
のような集合は「数列」と呼ばれる。
で、そのサンプルの数列見て集合の特性が思いつかないなら
お前は理系に向いてないからさっさとやめろ。
ちょっと手直し(n -> from to) (define (example10 from to r p) (let loop ((i from)) (cond ((<= i to) (cond ((< 0 r) (if (not (memv i p)) (example10 from to (- r 1) (cons i p))) (loop (+ i 1))) (else (disp-rev p) (display " ") )))))) (define (example1 from to r) (example10 from to r '())) (example1 0 3 2) ---|01 02 03 10 12 13 20 21 23 30 31 32 (example1 1 4 2) ---|12 13 14 21 23 24 31 32 34 41 42 43 わかるかなあ・・
>>852 mainのrecとkouのcountを、異次元から召還してます。
また、kouは{}の数すら対応していません。
通しで考えた訳ではないので、どうか分かりませんが、
rec=aa、count=0、最後に}を追加で上手くいくかも…。
でも、個人的には最初から考え直す事を勧める。
862 :
超初心者です。 :2001/06/09(土) 14:35
Cの勉強を始めて1週間の若輩者なのですが、今使っている本のなかにある サンプルプログラムがコンパイルできません。以下のようなものです。 #include <stdio.h> #include <math.h> main() { int year, double amout, principal = 1000.0, rate = .05; printf("%4%21s", "年数", "預金残高"); for (year = 1; year <= 10; year++) { amout = principal * pow(1.0 + rate, year); printf("%4d%21.2f\n", year, amout); } return 0; } というものなのですが、gccでコンパイルすると /tmp/ccA0Xbkx.o: In function `main': /tmp/ccA0Xbkx.o(.text+0x5f): undefined reference to `pow' collect2: ld returned 1 exit status というエラーメッセージが出て、コンパイルしてくれません。 ちなみにccでコンパイルしても同様のメッセージがでました。 一体どうすれば上手くいくのでしょうか。どなたかご教授ください。 ちなみに環境はTurboLinuxのWS6.0です。
864 :
超初心者です。 :2001/06/09(土) 15:03
>863さん できました。ありがとうございます。 でもどうして、"-lm"で上手くいくのでしょうか。 あとで、/usr/include/math.h を見たのですが、 powという文字列を検索しても見つかりませんでした。 どういう仕組みになってるのかすごく気になります。 gccのマニュアルを読もうとしたのですが、英語ですごく 長い文章が延々とあるもんですから、ちょっと・・・。 日本語のgccの簡単な使い方とかFAQとかってないものでしょうか。
powって関数何だよシラネーヨって怒られてるわけです。
>>863 のような引数を付けてgccすることにより、
算術関係の関数がリンクされるようになります。
確か
866 :
デフォルトの名無しさん :2001/06/09(土) 15:14
算術演算ライブラリである libm.a は、Unix系の cc ではデフォルトでリンクされません。 -lxxx は libxxx.a をリンクしろ!というオプションです。 X-Window を使う時は -lX や -lX11 とかしますよね。 アレと同じです。
今うちのTurboLinux(6.0server)でmanしてみたけど、 確かにman powとかしてもどのライブラリが要るとか書いてないね。
みなさん、レス本当にありがとうございました。 なるほど、そういう風になっていたんですねえ。 どうやら道はまだまだ遠いようですが、最初の一歩で 挫折しなくて済みました。これからも精進してまいります。
今math.hを読んでみたけど、libm.aをリンクしろって指示は書いてなかった。 manにも書いてなかった。linux.or.jpにある日本語マニュアルにも書いてなかった。 そうなると、未知の関数があった場合、どのライブラリをリンクすればいいかは、 どうやって調べたら良いんだろう。 manだけでは調べられないものなのか?
手元に環境が無いので自信なし % cd /usr/lib % foreach i (lib?*) ? echo $i ? nm $i | grep pow | grep -v UNDEF ? end
>>870 関数名が既知でリンクするライブラリが未知の場合はgrepすればいいのでは?
そもそも完全に未知の関数は調べる事もないだろうし…。
age
普段&使ってるから%がマイナス出すの忘れてた・・・。 鬱だ・・・寝よう・・・ 回答有難うございました。
875 :
デフォルトの名無しさん :2001/06/10(日) 11:20
GCC-HOWTOの 6.2 「ライブラリに尋ねる(sine()はどこにいるの?」 に、一応やり方は書いてある。 この文書、Linuxプログラミング初心者向け。JFで探して。 すでに、disk上にあるかもね。 ただ、man(3)にリンクすべきライブラリなり、コンパイルオプションなりが 書いてあると、幸せになれる人は多いよね。 Solarisのmanには、たしか書いてあって、「ウマ〜」と思った 記憶がある。
876 :
デフォルトの名無しさん :2001/06/11(月) 16:06
int は処理系に依存するという話ですけど、 32ビットマシンでもコンパイラのスイッチ次第で16ビット扱いに なったりするものなのでしょうか? それとも、コンパイラでは制御しようのないものなのでしょうか?
877 :
デフォルトの名無しさん :2001/06/11(月) 16:11
それこそ処理系に依存します(藁 コンパイラを設計する人が作ってればあるし、作ってなければ無い。
878 :
デフォルトの名無しさん :2001/06/11(月) 16:36
>>876 そういやVCってスモールモデルとかまだ作れるの?
Ver4以降触ってなくてすっかり忘れてるや。
#define int short
880 :
デフォルトの名無しさん :2001/06/11(月) 17:11
shortが16bitという保証は無い。 24bitとかの処理系だって有りうる。見たことは無いが。 でも昔は12bitCPUって結構あったし。
881 :
デフォルトの名無しさん :2001/06/11(月) 18:40
>>880 >24bitとかの処理系だって有りうる
ねーだろ
882 :
デフォルトの名無しさん :2001/06/11(月) 18:40
>>880 >24bitとかの処理系だって有りうる
ねーだろ
883 :
デフォルトの名無しさん :2001/06/11(月) 18:40
>>880 >24bitとかの処理系だって有りうる
ねーだろ
884 :
デフォルトの名無しさん :2001/06/11(月) 18:40
>>880 >24bitとかの処理系だって有りうる
ねーだろ
885 :
デフォルトの名無しさん :2001/06/11(月) 18:40
>>880 >24bitとかの処理系だって有りうる
ねーだろ
うちではshortは32bitですが何か?
887 :
名無しさん :2001/06/11(月) 18:49
初期のF−15の制禦コンピューターは IBM製の24ビットのはず。 ただし加算器の巾かアドレスバスの巾かは不明。
888 :
1 :2001/06/11(月) 18:53
>>881 -885
1byteが9bitだったマシンもあったのだよ。
longが40bitって環境なら今まさに使ってるよ。
892 :
デフォルトの名無しさん :2001/06/11(月) 21:51
893 :
デフォルトの名無しさん :2001/06/11(月) 21:55
4ビットマイコンでのCの実装例ってあるの?
895 :
デフォルトの名無しさん :2001/06/11(月) 22:35
#include <stdio.h> struct point { int x; int y; }; struct point p; void function(struct point p) { p.x = p.x + 2; p.y = p.y + 2; }; main() { p.x = 1; p.y = 2; function(p); printf("%d %d\n",p.x,p.y); } ↑で3 4が返されないのがどうしてもわかりません。 ドキュソですいませんが誰か教えて…。
>>895 実体を渡してるから。
だから、ポインタを渡せばいいよ。
構造体データを値渡ししてるから
898 :
デフォルトの名無しさん :2001/06/11(月) 22:45
あ、ありがとう。ホントに… でも、pを*pとしてp.xなどをp->xとしたら、 今度はDOS画面で「不正な処理うんぬん」とでてしまいした。
おそらくポインタに実体のアドレスを入れてないから>898
おそらくポインタに実体のアドレスを入れてないから>898
>>895 関数 void function(struct point p) の中での構造体 p は、
関数の前で宣言した外部変数の p ではなく、
関数内で宣言された自動変数だから。
例えば...
#include <stdio.h>
main()
{
int i;
i = 4;
if (i == 4) {
int i;
i = 5;
}
printf("%d\n", i);
}
↑で 5 が表示されないのと同じ理由
なんで書き込みが重複する?
>>898 void function(struct point *p)
{
p->x = p->x + 2;
p->y = p->y + 2;
};
main()
{
p.x = 1; p.y = 2;
function(&p);
きちんと学べ。あてずっぽうでコードを書くな。
904 :
デフォルトの名無しさん :2001/06/11(月) 22:54
>>895 〜897,899〜903
やっとわかりました。
本当にありがとうございました。
905 :
デフォルトの名無しさん :2001/06/12(火) 00:11
第1バイトの値を取り出すのに、 int a = 0xdo3322ff; a = (char)a; と a = (0x000000ff) & a; とするのとどっちがいいのですか?
下>905
907 :
905 :2001/06/12(火) 00:17
0xdoって何よ?ネタ?>905
おれの好み>907
910 :
905 :2001/06/12(火) 00:20
>>908 それはただの入力ミス
どっちがいいか知りたかったの
waitさせよー。
もったいよー
>>905 下
わかりやすい。
キャストしてない。
"第1バイト"なら、エンディアンの問題があるから、 共用体使うか、アドレスとってポインタをキャストして逆参照しなきゃだめじゃん。 まあ、"最下位バイト"を取得したいんだろうけどさ。
>>914 int->charのキャストにインデイアンが関係あるの?
インディアンうそつかない
>>916 君と同じ過ちを犯したやつが過去何人いた事か…
>>915 int→charへのキャスト にはインディアンは関係ない。
ただ、第1バイト っていう表現をしてるから
インディアンがしゃしゃりでてくるのだよ。アンダスタン?
頼むからくだらんネタはやめてくれ>インディアン その手の言い換えは全然かっこよくないぞ。
921 :
デフォルトの名無しさん :2001/06/12(火) 10:26
int a = 0xdo9987fe; printf("a = %x\n",(char)a); → a = fffffffe printf("a = %x\n",(unsigned char)a); → a = fe どうしてー
922 :
デフォルトの名無しさん :2001/06/12(火) 10:31
大学でCG論という講義をとっているのですが、 そこで”OpenGL”というやつをやっていますが、 よくわかりません(教授は毎週1000行近いプログラムの課題 を出します。つらい・・・)詳しいサイトや本は知りませんか?
923 :
デフォルトの名無しさん :2001/06/12(火) 10:32
924 :
922 :2001/06/12(火) 10:34
ちなみに使ってるソフトはC++Builder4です。
925 :
デフォルトの名無しさん :2001/06/12(火) 10:37
OpenGLはしょぼい・・・・・shadeとか使ったほうがサクッ!とできる(笑) し、あまりのショボさにCGを見比べると絶望する。でも CGの根本を学にはいい材料。
926 :
デフォルトの名無しさん :2001/06/12(火) 10:38
DirectXだろう
928 :
デフォルトの名無しさん :2001/06/12(火) 11:33
b<0?(int)(b-0.5f):(int)(b+0.5f) って浮動小数点数bを整数に近似丸めさせるときの 式としてあってますか?
929 :
デフォルトの名無しさん :2001/06/12(火) 11:48
930 :
デフォルトの名無しさん :2001/06/12(火) 11:51
931 :
922 :2001/06/12(火) 12:43
そうですか書名だけを見るとできそうな気がしますが(笑) 最後は努力と要領の問題でしょうが・・・・ そころでOpenGLはどうなんでしょうやって損はないでしょうか? CG論の教授は将来性抜群と絶賛していて、卒論でやってもいいとか 言っていますが。
932 :
デフォルトの名無しさん :2001/06/12(火) 13:34
損はしないね
933 :
デフォルトの名無しさん :2001/06/12(火) 15:57
>>932 ほんとかよ?
卒論なら自分でグラフィックライブラリ作るぐらいやったほうが
いいんじゃない。力もつくしサー
934 :
デフォルトの名無しさん :2001/06/12(火) 18:45
(int)floor(b+0.5f) って浮動小数点数bを整数に近似丸めさせるときの 式としてあってますか?
936 :
デフォルトの名無しさん :2001/06/12(火) 19:01
>>934 正の整数で四捨五入ってことならあってるよ
937 :
デフォルトの名無しさん :2001/06/12(火) 22:05
>>936 違うよ。四捨五入なら、小数部が0.5のとき整数部が偶数になるように丸めない
といけないのに、
>>934 ではそうなっていない。
round関数が使えればそれが一番手っ取り早いけど、そうでなければ、もう少し
処理が複雑になる。
>>937 整数部が偶数になるように? なぜ?方言?
939 :
デフォルトの名無しさん :2001/06/12(火) 22:24
> 違うよ。 違いません。方法の一つです。 >四捨五入なら、小数部が0.5のとき整数部が偶数になるように丸めない >といけない それはいわゆる「銀行丸め」だね。そういう四捨五入の方法もあるが、 一般的なじゃないよ。
ネタだとばかり思ったら、 > それはいわゆる「銀行丸め」だね。 ほぇー。こんな流儀があったのか。知らんかった。
941 :
937 :2001/06/12(火) 22:27
>>938 -939
JISでもISOでもそうなっているよ。
少なくともまともなエンジニアの間では常識。
>>941 いいよ。オレは社会で通用する常識の方をとるよ。
943 :
デフォルトの名無しさん :2001/06/12(火) 22:43
>>942 それはC言語から足を洗うという意味と見た。
944 :
デフォルトの名無しさん :2001/06/12(火) 22:48
>>937 つーか、
四捨五入は四捨五入、JIS丸めはJIS丸めで別物だろ?
946 :
デフォルトの名無しさん :2001/06/12(火) 23:20
>>945 JIS丸めなどという言い方は正式には存在しない。
正式な言い方はあくまでも「四捨五入」。
>>943 デジタル信号処理で同じ事やったら誤差が累積していくだろう?
少なくとも制御系では常識ではないよ。
948 :
デフォルトの名無しさん :2001/06/12(火) 23:29
>>947 2数の中間値を偶数方向に丸めるのは、誤差の累積を最小限に収める意図も
含まれている。
通常、浮動小数点数の端数処理は四捨五入(ここでいうJIS丸め)を採用して
入り場合がほとんど。math.hの中のFLT_ROUNDSが1になっていれば、そうだ
よ。
これは工学全体で常識だから、相手の無知が発覚しない限り、敢えて説明する
人は誰もいないだけ。制御系は工学の色彩が強いので、当然常識だよ。
というか、ほとんどの場合、何も考えなくてもこの方式で四捨五入されている。
精度に収まらない端数処理然り、printf等で文字列に変換する場合然り。
949 :
デフォルトの名無しさん :2001/06/12(火) 23:33
間違えた。 math.hではなくfloat.hの中のFLT_ROUNDSだった。
>>946 正式な言い方は「JIS Z8401 数値の丸め方」だろ
お前が四捨五入って言ってるからって、自分用語を勝手に常識にするのはやめれ
どうでもいいが、そろそろ新スレでいかんか?
よろしく>951
954 :
デフォルトの名無しさん :
2001/06/13(水) 00:56