C言語なら、俺に聞け! <7>

このエントリーをはてなブックマークに追加
1sageジョブス
おれは21才、9年間プログラムを一生懸命作ってきた。
あちこちの言語に手を出したが結局極めたのはC言語だけだった。
大体のことなら分かるからオレに聞け。

だが、いちいちFAQに載った質問に応えるほど暇じゃない。
課題丸投げなら別スレにいけ。

・comp.lang.c Frequently Asked Questions
http://www.eskimo.com/~scs/C-faq/top.html

・C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html

・前スレ C言語なら、オレに聞け! <6>
http://piza2.2ch.net/test/read.cgi/tech/999617524/
2デフォルトの名無しさん:01/10/19 00:19
ポインタってなんですか?
3武夫。:01/10/19 00:19
こんにちは
4デフォルトの名無しさん:01/10/19 00:31
>>2
アドレス
5前すれ 973:01/10/19 03:07
>> 前すれ 974 さんへ
すみません, 話のふりがまずかったですね.

> if (sscanf(str, " hogehoge = %d ", &n) == 1) {
はもちろんその通りです.

で, scanf() っていろいろ癖がありますよね.
例えば書式文字列中に空白があったときは, 入力フィールドはどういう風に
扱われるとか, 書式文字列中では \n は必要なのかとか, %s 使ったら
(あたりまえなのかもしれないけど)入力フィールドの文字列全部取られたとか ...

そういうのをより実践的な例を使って説明してる本とか Web とかって
ほとんどないですよね ? で, そういう話をここでできてばいいなあと
思って話をふってみました(失敗した感じだけど).

おそらく本職のプログラマさんはこんなのが必要なときは
scanf() なんか使わないで, もっとがりがりトークンの切り出しのプログラムとか
lex/yacc とか使うんだろうとは思うんですけどね(ちなみに私は本職のプ
ログラマではありません).
6超初心者:01/10/19 03:58
連立微分方程式を数値積分して解くときに、
最大原理を用いて、4次のルンゲクッタ法で計算したいのですが、
ポインタを使わないで計算するプログラムソースとかありませんか?
または最大原理を説くプログラムソースなどがある場所を教えて下さい。
7デフォルトの名無しさん:01/10/19 04:05
シューティング法のプログラムがわかりません。
どこかにないですか?
8デフォルトの名無しさん:01/10/19 04:12
シューティング法ってなに?
ねぇ、なに?
教えてよ、お願い
>8
C言語で書かれた、シューティングゲームのソースです。
>>6
ポインタを使うと何か不都合がありますか?
11超初心者 :01/10/19 04:56
>>10
ポインタを使った事がないので、プログラムが理解できないです・・・鬱
2次の配列を使ってやるのが良いと言われたのですが・・・
何処かにないですか?初心者ですみません。
最大原理を用いる4次のルンゲクッタ法を私に教えてくれれば、
私がプログラムを書いてあげよう。
>>12
そのくらい自分で調べろよ。
14974:01/10/19 07:26
>>5
K&Rに書いてあるだろ。
他の本はしらん。
15デフォルトの名無しさん:01/10/19 10:46
タコな質問ですいません。
VBでChr(9)のようにAscii文字を指定するような関数って
Cにもありますか?
16ぷろぐらまぁ:01/10/19 10:50
>>15
出力先によっても違うが、printfかsprintfかfprintfあたりを使うと良い。
ex) printf("%c", 65); /* ASCIIコードで65が出る */
>>15
char ch = 9;
変数に直接アスキーコードを代入すればいい。
1815:01/10/19 10:57
>>16
ありがとうございます。
できれば標準入出力ではなく、VBのように
const chr* Chr( int );
のような感じで関数として使いたいのです。
こういうのってやっぱ自分で作らないといけないんですかね。
1915:01/10/19 10:58
>× const chr*
>○ const char*
ですね。
>>18
Cでの文字列の取扱に関して理解してる? 文字と文字列は別だよ?
21!=17:01/10/19 11:08
>>15
何がしたいのか分からん。
'\t'や'\x9'や'\011'の文字定数や(char)9も結局9だし、
それを文字として印字したいならprintf("%c", 9)やputchar(9)。
VBの頭でCを考えてないか?
2215:01/10/19 11:22
>>17
そっか、別にわざわざ関数化することないんですよね。
なんか難しく考え過ぎてました。
23デフォルトの名無しさん:01/10/19 13:14
String型ってやっぱ欲しいよね。
というわけでむかし自作したんだけど
需要あるのかな?
24デフォルトの名無しさん:01/10/19 13:35
>23
PascalやVBで使われてるStringと互換性を持たせれば、あるいは。

ってかもうあるような気もするけど、知らない。
25デフォルトの名無しさん:01/10/19 13:53
>>23
オラ、イラネ
26デフォルトの名無しさん:01/10/19 14:13
高速かつ低資源な検索ルーチンを教えて。
ハッシュだとある程度の数なら十分に動作するんだが・・・
数が大量になるとスピードがでない。
なんか良いロジックある?

それともここは
「printf」で数値を出力したい場合のフォーマットは何?って
レベルのことを聞くところかな?
>>26
ハッシュってのがまさしくそれ。
たぶん実装がヘボいと思われ。
>>27
激しく同意。

>>26
>「printf」で数値を出力したい場合のフォーマットは何?って
>レベルのことを聞くところかな?

というのだったら、

>数が大量になるとスピードがでない。

などとあいまいなことを書かずに、

>逐次検索アルゴリズムでは,検索データが見つかるまでの条件判定文@の
>実行回数は最小1回,最大[(3)]回である。検索データXの出現確率がS1〜Snの間で
>一様分布するとき,条件判定文@の平均実行回数 はおよそ[(4)]回である。
>したがって,この検索アルゴリズムの計算量のオーダは[(5)]であるといえる。
> 一方,2分検索アルゴリズムでは,配列Sのデータは[(6)]必要があり,
>その計算量のオーダは[(7)]である。

ぐらいの考察をかましちゃってもいいんだよ。
みんな分かるから。
2926:01/10/19 14:24
>>27
あら、それを言われると辛い(^^;)
じゃ、高速なハッシュってどうやって組むの?
私のルーチン、いたって標準的な使い方だと思う。
100万のオーダなら平気だけど、2000万近くになると…

へぼいって言ってくれるくらいだから、さぞや素晴らしいロジックを
持ってるんだろうね。教えてください。
>>29
>じゃ、高速なハッシュってどうやって組むの?

だから、オーダーでものを言え。
どう低速なのか説明できないのか?
>>26
オープンアドレス法?
チェイン法?
(って話からするとチェインか?)
ハッシュテーブルのサイズは?

2000万近くあるなら BST のほうがいいかもよ。
もしくはチェインの下に BST を吊すとか。
3226:01/10/19 15:09
>>28、30
27へのレスを書いてる際には28のレスは無かったのよね。
別に変に煽ろうとかって意味じゃないから(^^;)

>>31
チェイン法使ってます(たぶん(^^;))
BSTって言葉の意味がわかりませんので解説してもらえませんか?
申し訳ないです。
ハッシュのサイズは現在色々試してるんですが、資源量との兼ね
合いもあるので、そんなに大きくは取れない状態です。今のとこ
ろ1万位かな?まだ妥協点を探している最中なんで(^^;)
>>32
BST はバイナリサーチツリー、2分探索木ってやつ。

ハッシュテーブルのサイズが1万ってことは
それにリスト垂らしてて 2000万 とかなら
一つのテーブルに 2000 もの長さのリストがあって
それを線形探索してるのか? 平均1000ぐらいの比較?

BST なら 2000万 の要素でも 24,5回の比較で探索できますよね。
チェインに1000個の要素の BST なら 10回ぐらい。

BST の実装法は探せばいっぱいでてくるはず。
3433:01/10/19 15:33
日本語変だ…。鬱氏
3526:01/10/19 15:39
>>33
ありがと。確かに自分のコード、しょぼかったです。
あぁ、オーダーっつーのは、計算量のことね。
データの量じゃないぞ。
>>33
べつに、木をぶら下げなくても、
じどうでハッシュのサイズを拡張するようにすればいい。
Optimize・・・ とか言う本に詳細載ってたけど、
具体的な書籍名は忘れた
>>37
チェイン法において、リストの代わりに木を使うって話だよ。
ハッシュテーブルに全てを入れようとするのは大変なだけだと思う。
サイズ変えるコストも馬鹿にならないだろうし。
>>38
詳細は覚えてないんだけど、再ハッシュする必要がある要素は、
極わずかっていう手法だったはず。
40デフォルトの名無しさん:01/10/19 17:19
char *name[]={"ノビタ","シズカ","スネオ"};
char name[][6]={"ノビタ","シズカ","スネオ"};
上と下の初期化の仕方って、どっちがいいの?
>>40
上と下ではまるで意味が違います。
>>40
良い悪いじゃなくて、処理内容が違うんで目的によります。
char *str = "abc";
char str[4] = "abc";
この違い分かってます?
4342:01/10/19 17:25
あらかぶっちゃった。スマソ。
44デフォルトの名無しさん:01/10/19 17:37
>>42
すみませんが詳しく教えてください。
>>42
自分で勉強しろよ。
>>44
この程度は基本。2chで訊くようなものじゃない。
K&Rを死ぬほど読め。
> K&Rを死ぬほど読め。

最近このスレで流行ってる?
>>47
このスレッドでは最近かもしれないが、世間ではここ十年以上は流行ってると思われ。
>>6
服部雄一:C言語とPADによる数値計算(培風館)

>本書ではポインタ変数を一切使わずにプログラムを記述する。
>>49
それって、著者がポインタを理解してない上にサンプルがトンチキで有名な本では…
5147:01/10/19 19:10
>>48
あ、K&R でなくセリフがね…
>>50
そうなの?…じゃあこれ
Numerical Recipies in C[日本語版](技術評論社)
53デフォルトの名無しさん:01/10/19 20:34
あげようよ。
そこから始めようよ。
54デフォルトの名無しさん:01/10/19 20:47
K&Rってそんなにいいのか?
アンサーブックで十分だろ。
55デフォルトの名無しさん:01/10/19 20:58
K&R?
初心者にはお勧めできない。
56デフォルトの名無しさん:01/10/19 21:07
すみません、既出かもしれないけど、ここで質問させて下さい。
ポインタで悩んでます。

普通の変数だったら
int a;
a = 10;
を一行で初期化を表現するには
int a = 10;
と書けばよいわけですよね?

ところがポインタだと、
int x = 10;
int *p = &s;
という具合に、右辺に書く内容が *p についてではなくて p になってしまうのですか?
メモリの中身(*p)でなくて、番地(p)を書くのですか?
もしそうだとしても、感覚的に理解できないのです。
5756:01/10/19 21:11
すみません、下から4行目は
int *p = &x;
でした。スマソ。
int a;
int *p = &a; // *はポインタであることを示すだけ

int *p;
p = &a;
int b = *p; // *はポインタが指す内容

という違いがある。
変数宣言時の'*'とその他の場所の'*'は違うよ。
ちなみに後者は「ポインタ演算子」と呼ばれるもので、+や-などと同じカテゴリ。
&もそうだね。

前者をなんと呼ぶのかは知らん。
そんなことを56は言ってんじゃないと思うが。
何かを指すものがポインタだから、としか言いようがない。
6156:01/10/19 21:21
レスありがとうございました。

>変数宣言時の'*'とその他の場所の'*'は違うよ。
心の中でもやもやしてたものが晴れました。
ありがとうございます。
ポインタの宣言するときだけは
int* p=&a;
のイメージで捉えたらいいのですね?
62デフォルトの名無しさん:01/10/19 21:22
漏れはコンパイルの度にmakeって打つことによって、
人生通算で何回負けたかワカラン
>>60
そんなことを56は言ってんじゃないと思うが。
つーか、あんた何で56の言いたいことがわかるのさ!
>>61
>int* p=&a;
>のイメージで捉えたらいいのですね?

イメージとしてはそうかもね。C++ではそういう風に書くのが推奨されてるし。

でも、
int *p, *q;
と書くつもりで、
int* p, q;
ってイメージして
int *p, q;
ってやっちゃ駄目よ。
6560:01/10/19 21:30
>>63
56を読んでそう思ったからだ。
少なくとも型指定時の*と間接参照の*を混乱しているようには
読めなかった。まぁ56が疑問を解決したのならいいけど。。
66デフォルトの名無しさん:01/10/19 22:33
bcc32でコンパイル、実行すると特に問題なく動作プログラムがあって、
それをVCでコンパイルならできるのですが、実行すると

runtime error R6002
- floating point not loaded

というメッセージがでてエラーになります。
このメッセージの意味は何なんでしょうか?
67ビル・ジョブス:01/10/19 22:39
>>みんな
宣言時はポインタ修飾詞。

>>56
intは整数を入れる変数だよね。
で、ポインタはアドレスを入れる変数だよ。
(もう分かってる?)
68ビル・ジョブス:01/10/19 22:46
>>66
DOS窓だね。
浮動小数点演算がソフトウェアエミュレーションになってる?
VCの設定は確認済み?
6966:01/10/19 23:05
>>68
はい、DOS窓です。
浮動小数点を使っているのは一箇所だけ実行時間を計っているところだけ
なんですが、printfで表示するときに直接計算せず、いったんdouble型の
変数に代入してから実行するといけました。
そのソフトウェアエミュレーションというのを設定するというのは
どこをいじればいいんでしょう?ヘルプで「ソフトウェアエミュレーション」
といれても、でてこなかったので...。
70デフォルトの名無しさん:01/10/20 11:04
hitck[ix][iy]=off;
ixとiyの関係を教えて下さい。
>69 一箇所だけなら 整数で計算させたらいいじゃんと思うのだが?
  単に少数点表示がメンドクサって事だけでしょ?

c=a/b
((a-c*b)*100)/b
72デフォルトの名無しさん:01/10/20 13:03
flushかそんな感じのあったと思ったけど忘れた。教えて。
printfで事情があって改行しなかったら出力されなかったので、flushしたい。
fflush()
>>71 div()というのも蟻

#include <stdlib.h>
div_t d = div(a, b);
printf("%3d.%.2%%\n", d.quot, d.rem);
fflush(stdout)
7674:01/10/20 13:31
これは適切じゃないな、スマソ。
fパラメータって無いのか
78デフォルトの名無しさん:01/10/20 15:45
fflush()って、どういう時に使うのですか?
バッファを書き出す、と言われてもピンと来ない……。
#innkuru-do <esuthidhiaio-dotto.etti>
boido meinn (zoido)
{
innto a,b,c
huro-to x,y

purinntoehu("itteyosi")
あぎゃあああああああああああ
}
8080:01/10/20 17:13
そもそもストリームって何のことですか?
>>80
川の流れのようなもの
82デフォルトの名無しさん:01/10/21 08:34
C言語でマルチスレッドプログラミングってできるもんなんでしょうか?
>82
 OSによってはAPIを呼び出せば非同期型スレッドは簡単

 SETJMP LONGJMPで 同期型のスレッドは作れる
 もちろんアセンブラでスタック切替をしても同じ。
84デフォルトの名無しさん:01/10/21 12:25
タコな質問ですが、たとえば、

あいうえお<A>かきく<B>けこ→あいうえお@かきく\けこ

のようにある記号で挟まれた文字列をその内容によって
変換するようなプログラムってどう書けばいいでしょうか?
85デフォルトの名無しさん:01/10/21 12:44
>>84
???
いまカッコ内かどうかのフラグを持たせて、
フラグがたってる間だけ変換処理を実行する。
じゃ、ないの?
>>82
pthreadライブラリを探せ
>>84
それって正規表現使うのがいいんじゃない?
Cに正規表現ライブラリってあるかなぁ?
8856:01/10/22 10:20
>>56-57で質問させて頂いた者です。
みなさんレスありがとうございました。
しかし一度は納得したものの、再び分からなくなってしまいました。
というのも、

void main(void)
{
char* p="A";
printf ("%d\n",*p);
}

を実行したら、65 が表示されたからです。
『あれ? この場合は65番地の中に入ってるデータが表示されるんじゃなかったのか!?』
とパニックになってます。

どなたかお助けを!!
>>88
p と *p は全然別のもの。
ちなみに 'A' == 65 である。

void main(void) {
char *p;
p=65;
printf ("%d\n",*p);
}

とするか

void main(void) {
char *p = 65;
printf ("%d\n",*p);
}
とすればお望みの動作になる。
90デフォルトの名無しさん:01/10/22 10:34
>>88=56
文字列を " " で囲むと,それは文字列へのポインタになります
しかも文字列の末尾にはちゃんと nil 文字('\0')が付加されます
p にはその文字列へのポインタが代入されます
*p を参照すれば,そこにはポインタに指し示された部分にあるデータを得ることができます
つまり p にはよく分かんないアドレスが,*p には 'A' が入ってるってこと

65 番地のデータを表示させたいならば
char* p = 'A';
もしくは
char* p = 65;

# きっと正確な説明じゃないと思うけど,こんな理解でも大丈夫なはずです
ここでは65=0x41 という文字コードが印刷されたという事です >>88

C言語の文字列はバイト列をそのまま扱うような形になります
他の言語で文字型、文字列と順序型が明確に区別されていたのに馴れていると
訳が判らなくなると思います。

*p は いつでも (int)ord(*p) という変換がされているとでも考えて下さい
9256:01/10/22 10:48
>>90
>文字列を " " で囲むと,それは文字列へのポインタになります

そ、そうだったんですか・・・・(納得)
'A'はどういう意味になるのですか?

>>91
すみません、僕の頭ではちょっと難しくて・・・・(^^;)
C以外さわったことないんで。。
>>92
char型という8ビットの"整数"です。
char型はASCIIひと文字分の文字コードを扱うのに使ったりします。
C言語の文字列はchar型の単なる配列です。
文字コードを意識したくない。
どうすればいいかな?
>>94 他の言語を使え Windowsなら C++とかDelphiとか
96デフォルトの名無しさん:01/10/22 11:48
ある掲示板で char, short, long は使うな、
int8_t, int16_t, int32_t を使えと言われたんですが、
char, short, long では何かまずいんでしょうか?
教えてください。
>>96
なにもまずくないけど?
>>96
目的も書かずに、「char, short, longは使うな、
int8_t, int16_t, int32_t を使え」っていうのでは何とも言えない。
「何のために」っていうのがまずあるはず。
教えて下さいの前に、質問の仕方を改めること。
場合によっては、Cは使うな、Perlの方がずっとその目的には向いてる、
ということもある。
>>95
C++やDelphiだと文字コードを意識しなくていいって?
Delはプラットホームが限られるからってことか?
MS-DOS/V 6.2 で10ms間隔で割り込みを発生させ、カウンタを作りたいんです。

ネットでいろいろ検索しましたが、うまく行きません。
知っておられたら、教えてください。

環境:MS-DOS/V 6.2
コンパイラ:VC++ 1.51 (MS-C 8.03)
で行っています。

よろしくお願いします。
100のつづき
テスト中のソースは以下の通りです。

struct SREGS sregs;
union REGS inregs, outregs;

long timl;
short tims;

interrupt timint(void)
{
_disable();
timl++;
tims++;
printf(" %04x\n",tims);
_enable();
int86x(0x1c, &inregs, &outregs, &sregs);
}

void timer_set()
{
void far *ptr;

ptr = timint;
inregs.h.ah = 0x02;
inregs.x.cx = 1; // 1で10[ms]
inregs.x.bx = FP_OFF(ptr);
sregs.es = FP_SEG(ptr);
int86x(0x1c, &inregs, &outregs, &sregs);
}

void main(void)
{
// void interrupt (*vect)();

timl = 0l;
tims = 0;
// vect = _dos_getvect(7);
timer_set();
while(1){
printf("xxx=%04x,yyy=%08ld\n",tims,timl) ;
}
// _dos_setvect(7, vect);
}

tims、timl 共に0のままです。
102100:01/10/22 14:08
見にくいんで、ソースを上げなおしてみました。

struct SREGS sregs;
union REGS inregs, outregs;

long timl;
short tims;

interrupt timint(void)
{
  _disable();
  timl++;
  tims++;
  // 見やすいようにずらしてます。
  printf("                zzz=%04x\n",tims);
  _enable();
  int86x(0x1c, &inregs, &outregs, &sregs);
}

void timer_set()
{
  void far *ptr;

  ptr = timint;
  inregs.h.ah = 0x02;
  inregs.x.cx = 1;      // 1で10[ms]
  inregs.x.bx = FP_OFF(ptr);
  sregs.es = FP_SEG(ptr);
  int86x(0x1c, &inregs, &outregs, &sregs);
}

void main(void)
{
//void interrupt (*vect)();

  timl = 0l;
  tims = 0;
//  vect = _dos_getvect(7);
  timer_set();
  while(1){
  printf("xxx=%04x,yyy=%08ld\n",tims,timl) ;
  }
//  _dos_setvect(7, vect);
}
timl,timsの定義にvolatileが必要とかそういうこと?
104100:01/10/22 14:32
volatile long timl;
volatile short tims;

long volatile timl;
short volatile tims;

共に駄目でした。

long far timl;
short far tims;

も駄目でした。
105100:01/10/22 14:42
と言うか、割り込みが発生していません。
メインルーチン側の printf をコメントすると、動かなくなります。
(Ctrl+Alt+del でリセットされるので、永久ループになってるだけですが。)
106103:01/10/22 15:01
非DOSユーザーがレスするのもナニだけど…

googleでちょっと検索してみたら、>>100が参考にしたと思わしきソースを
見付けたんだけど、「PC-9801用」って書いてあるよ?
>>100がMS-DOS/VだということはPC互換機だと思うんだけど、そもそも
この方法でタイマー割り込みが使えるのはPC98onlyだったりしない?

あと、割り込みハンドラ(timint)内でprintf()ってのは大抵の場合
ヤバイと思う。
107100:01/10/22 15:28
> この方法でタイマー割り込みが使えるのはPC98onlyだったりしない?

割り込みベクタやアドレスが一緒なので、これでやってます。

> あと、割り込みハンドラ(timint)内でprintf()ってのは大抵の場合
> ヤバイと思う。

削除します。
DOS/Vタイマベクタは 0x1c or 0x08 のはず。
割り込み周期の変更は知らん。
109100:01/10/22 16:18
> DOS/Vタイマベクタは 0x1c or 0x08 のはず。

0x1cに、timer_set() で timint() を割り当ててると思ってました。
timer_set() をやめて、_dos_setvect() で 0x08 に timint() を
割り当てると、『1回だけ』動きました。
(数値が1で止まって、カウントアップしませんが。)
まだ問題はありますが、0x08 で テストを続けたいと思います。
どうもありがとうございます・

引き続き、情報を募集しますので、何か知ってたら教えてください。
110103:01/10/22 17:19
MS-DOS自身も使っているベクタみたいだから、setvectでベクタを上書きして
しまうと、DOS自身の割り込みハンドラが呼ばれなくなってまずいような
気がする。

setvectする前にgetvectで古いベクタを保存しておいて、timintの中で
カウントアップの処理をした後で、書き換える前のベクタへジャンプする
必要があるんじゃないかな?
111デフォルトの名無しさん:01/10/22 17:22
>>98
なに言ってんだか。
112100:01/10/22 17:46
>110

ご忠告ありがとうございます。
今は、テスト中なので、リセット覚悟でやってますが、
最終的にはきっちりしようと思ってます。

0x08でやると、凍ってしまいます。
何か設定があるのでしょうか?
誰か知りませんか?

0x1cでやると、カウントアップは出来ました。
ただ、周期が約55msに固定で、必要な10ms間隔にならない為、
使えない事が判明しました。
113ビル・ジョブス:01/10/22 18:16
>>110
chain_intr()とかっていうライブラリ関数あったなー

>>112
CLIしてるなら、きっと中の処理が遅くて再入してるよ
114100:01/10/22 18:50
>> 113
もしや最初にスレを立てた伝説の?(@_@)

> CLIしてるなら、きっと中の処理が遅くて再入してるよ
CLIとかNMIとか、よくわからないんですが
メインループの printf の画面表示が止まらないので、
再割り込みはしてない気がします。

ちなみに0x1cでやると、Ctrl+Cで中断できるんですが
0x08でやると、Ctrl+Cで中断出来ません。
_disable()で割り込みを禁止、
_enable()で割り込みを許可していると思われ。
CLI、STIは割り込みを禁止したり許可したりするアセンブラ命令

割り込み内部(timint)はカウントと
旧ベクタへ飛ばすのみにしておく。

タイマ周期の変更はポート叩く方法しか知らん
しかもアセンブラ。
11656:01/10/22 19:27
>>93
それは分かってますよ。
"a"と'a'の違いがわからないのです。
'a'は整数。
"a"はポインタ。
118デフォルトの名無しさん:01/10/22 19:49
>>116=56
もう,これは慣れるしかないと思います・・
とりあえず次のコードを実行してみれば,なんとなく感覚がつかめませんか?
#include <stdio.h>
void main(){
    char* a1 = "A";
    char* a2 = "A";
    char* b1 = (char*)'A';
    char* b2 = (char*)'A';
    printf("a1=%d,a2=%d,b1=%d,b2=%d", a1,a2,b1,b2 );
}

char* b1 = 'A';
ではなく
char* b1 = (char*)'A';
とキャストしているのは,'A' が const char 型であって
const char * 型ではないからです
119デフォルトの名無しさん:01/10/22 19:57
"..."はポインタじゃないし、'.'はchar型じゃないだろ。
12056:01/10/22 20:21
>>118
main の中の1行目と2行目は内容同じだし、3行目と4行目も内容同じだと思うんですけど・・・。

>>119
え? え? そうなんですか?
'a' == 'a'
"a" == 'a','\0'

というように文字と文字列は違う。

char a='a';
char b="a";   //エラー。文字列は char に収まりきれない。
char *c = "a"; //"a"という文字列のアドレスを入れているのでOK。
char d[2]="a"; //上記に示したとおり、char2個分だから収まる。

c はポインタ。変数や配列のアドレスを c という名前で管理する。
d は配列。変数の連なりに d という名前を付けている。
その領域を"a"で初期化している。

"a"は変数名のない配列。
しかもプログラムのどこにあるのやら人間には判別つかない。
それではプログラマが利用できないので
名前をつけて"a"のある場所を知る必要がある。
その方法が char *c = "a";

printf("a")では"a"という文字列を表示したいだけで、
"a"のある場所を人間が知る必要ないから
そのままPCにおまかせしている。
>>121
微妙に痛いんですが。。。
12356:01/10/22 20:29
>>121
おお!
なんと解りやすい解説!!

ありがとうございまいた <(_ _)>
えと 'A' は 文字定数といいます
 文字定数は C 言語では int で C++では charになります
>>122
同意。この説明で分かった気になってしまうと後がこわいかも。
12656:01/10/22 20:57
オレやばいですか?
>>121
char *c = "a"; の"a"と
char d[2] = "a"; の"a"は意味が違ってる。

char d[2] = "a"; は、単に char d[2] = { 'a', '\0' }; の省略形。
char *c = "a"; の"a"は変数名のない配列…というのは、当たらずとも
遠からずというか、やっぱり文字列定数は文字列定数としか言いようが
ないような。ただの配列だと思い込んでると思わぬ所でハマる。

上記の後で、
d[0] = 'b'; はOKだけど
c[0] = 'b'; ってやるのは規格上NG(実際は動いたりするのでたちが悪い)

更に、
char *e = "a"; とやった場合、c == e である場合も c != e である場合もある
(規格上はどちらも間違いではない)
128121:01/10/22 21:00
>127
ありがとう。
教えるのは難しいなり。
12956:01/10/22 21:15
お、オレ1人が取り残されてる・・・(泣

>char *c = "a"; の"a"は変数名のない配列…というのは、当たらずとも
>遠からずというか、やっぱり文字列定数は文字列定数としか言いようが
>ないような。ただの配列だと思い込んでると思わぬ所でハマる。

思わぬ所ってどこっすか?
13056:01/10/22 21:18
>char *e = "a"; とやった場合、c == e である場合も c != e である場合もある
>(規格上はどちらも間違いではない)

これは感覚的に理解できます。
strcpy(&(bMfh.bfType),"BM");

いまのとこ画像は本腰でないのでこうしているんだけど、
警告される。bfTypeがchar[2]か[3]かわかんないので、
"BM\0"とやる気にもならないし、メンバの場合の[]の
使い方もわかんない。
bMfh.bfType[0]='B'bMfh.bfType[1]='M'で
いいのかな、(\0はどうすんのかな)それとも、bMfh.(&bfType[0])
とかやっちゃうの?それとも(bMfh).bfTypeとか?

もーわかんない。
"."や"->"はものすごく優先度が高い演算子で、ほとんど「名前の一部」とみなしていいほど。
・・・と、最初は思ってればいいよん。
bMfh.bfType[0] = 'B';
strncpy(bMfh.bfType, "BM", 2);

>bfTypeがchar[2]か[3]かわかんないので、
これは問題あると思うが。
133127:01/10/22 22:04
>>129
うーん、>>127の後半に書いた通りなんだけど、
書き換えができないというのは分かりやすいからいいよね?

後は、「同じ文字列」のとらえ方によって結果が違ってくるってこと。
char *a = "abc";
char *b = a;
この場合、aとbの文字列の内容は同じだし実体も同じ。
if (strcmp(a, b) == 0) { ... } も
if (a == b) { ... } も成り立つわけ。で、
char a[] = "abc";
char b[] = "abc";
これは、aとbの文字列の内容は同じ、だけど実体は別。
if (strcmp(a, b) == 0) { ... } は成立、
if (a == b) { ... } は不成立。だけど、
char *a = "abc";
char *b = "abc";
これは? 文字列の内容はもちろん同じ。
if (strcmp(a, b) == 0) { ... } は成立。でも、
if (a == b) { ... } は?
どちらになるかは不定なので、どちらかを期待してプログラミングしちゃいけない。

こんな感じで、文字列の場合、
・見かけが同じ
・実体が同じ
の二つの「同じ」があって、なおかつ文字列定数の場合は後者の「同じ」が
定義されない場合があるので、自分が期待している「同じ」が何なのかをちゃんと
考えてプログラミングしないとハマるわけ。

てな説明で分かってもらえますか?
「実体」ってアドレス値のこと?
>131
typedef struct tagBITMAPFILEHEADER { // bmfh
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER;

これか? MSDNで見つかるだろ。
>>134
そだね
137ビル・ジョブス:01/10/22 22:18
>>56
じゃー"a"はどこにあるのかな?「記憶クラス」って知ってるか?
138デフォルトの名無しさん:01/10/22 22:19
ありがと>>132
strcpy(&(bMfh....),"BM")で
ちゃんと動いてるんだけど、考えると
strcpy(bMfh....,"BM")←つまり&がない。
でも正解なのが不思議だ・・・
140ビル・ジョブス:01/10/22 22:31
>>139
文字列はアドレスだから、違和感無いよ・・・
構造体あれこれ。

bf.bfType = MAKEWORD('B','M');
stBmpFileHeader.bfType = 0x4d42
bmHead.bfType = ('B' | ((WORD)'M' < < 8))
memcpy(&fh.bfType,"BM",2);
bmFileHead.bfType = 19778;
BmpFileHeader.bfType = 'MB'

char bfType[2];
142132:01/10/22 22:38
>>139
げげ。135を見るとbfTypeつーのは
char bfType[2]でもchar bfType[3]でもなくてWORD bfTypeじゃんよ。
早く言ってくれよオイ。聞いてないよ−。
それじゃ strcpy(bMfh.bfType, "BM") は間違い。"&"付きが正解。
143ビル・ジョブス:01/10/22 22:45
>>142
"&"付きでも基本的に間違い!NULLがセットされるでしょ。
しかーし、今回はアライメント合わせされてるので動作するな。
しかし、いかん、おれには書けない・・・。
144100:01/10/22 22:56
>>115
>CLI、STIは割り込みを禁止したり許可したりするアセンブラ命令
アセンブラの割り込み許可/禁止って、EI/DIだと思ってました。
NECだけ?

>タイマ周期の変更はポート叩く方法しか知らん
>しかもアセンブラ。
よろしければ、ポートだけでも教えてもらえませんか?
アセンブラも多少ならわかりますので、見せて頂けたら幸いです。
145デフォルトの名無しさん:01/10/22 23:19
tell me
正解は、
bf.bfType = MAKEWORD('M', 'B');
>144
かなり昔のを発掘してきた。

ttp://gooside.com/himitsu/timer.zip

DLしたら教えてくれ。即削除する。
148どしろ〜とちゃん:01/10/23 00:13
ほんと、ドシロートな質問ですまんす。

「構造体を直接引数で渡すな!ポインタで渡せや!」
って、結構プログラムやってるツレから言われたんですけど、
さっぱり意味がわかりません。
なんで直接渡しちゃだめなん?
コピーする手間とメモリと時間がもったいないから。
150デフォルト名無しさん:01/10/23 00:23
typedef structで定義したのがあるんだけどそれをstructで定義したら使えないんですよね。
なんでっすか?
>>150
その簡単な例を挙げてくれ
とりあえずここで同じことを聞いてこい。
http://mentai.2ch.net/test/read.cgi/prog/1002039334/
15356:01/10/23 00:34
>>137
知ってますけど、"a"はどこにあるのかは分かりません。
154適当マン:01/10/23 00:35
>>148
ポインタで渡すべきシーンと実体で渡すべきシーンがある。
圧倒的に多いのは前者だが、後者もそれなりに使う。
どんな状況で使うかはロジック次第。
155 :01/10/23 00:52
C++だったら「そっちで間接参照しろや!」って切り替えしたりできるんだけどねぇ。
まあそのツレもあえて「構造体を」って言ってるところがまだ青い。
156どしろ〜とちゃん:01/10/23 01:27
総合的に、なんとなく分かったような・・・。レスくれた方々、多謝デス!

結局、場合にもよるが、基本的にメモリにバカバカコピーすんのは
タコでそ?・・・ってことで、おけ〜ですか?

しかし・・・>155サンの
>まあそのツレもあえて「構造体を」って言ってるところがまだ青い。
が、わかんないっす〜。なんで?
>>143 意味不明。
158100:01/10/23 09:03
>>147
ホストが落ちてるみたいなんで、少々お待ちを。
159100:01/10/23 10:43
>>147
DL出来ました。
今、MASMが手元に無いんですが、何とか探してテストして見たいと思います。
どうもありがとうございます。
class A{
virtual foo(const char *name);
virtual foo(const unsigned int num);
}

class B:public A{
foo(const char *name);
foo(const unsigned int num);
}

class C:public B{
foo(const char *name);
foo(const unsigned int num);
}

と書くと、class Cでのオーバーロードが解決できないと言われてしまいます。
もしかして根本的に勘違いしてるのでしょうか?
161デフォルトの名無しさん:01/10/23 13:50
C++は、よそで聞け!
162デフォルトの名無しさん:01/10/23 22:04
>>154
「実体で渡すべきシーン」とは?

>>155
もう少し詳しい解説きぼん。
>>162
例外中立をぶちこわしたいとき
>>154
構造体を実体渡しすると全部をスタックにつむから、ポインタ渡し
と比較して余計にスタックを消費する.
昔の人はメモリは貴重な資源だったので、実体渡しは裂けていた.
あと、ループ中に [] を使用して構造体を参照しているところは
ポインタを取得するとアドレス計算か減って早くなった.

ex)
for (i = 0; i < 100; i++) {
a[i].hohoe01 = 100;
a[i].hohoe02 = 200;
.
.
}

for (i = 0; i < 100; i++) {
pa = &a[i];
a->hohoe01 = 100;
a->hohoe02 = 200;
.
.
}

といった理由で、漏れは必ずポインタ渡しを使用しており、その
習慣は今でも引き継がれている.

ただ、自分の使用している コンパイラでアセンブラソースを
出力するようにして、なにが最適化確認するのが吉.

へたなことして自己満足していると最適化処理の足をひっぱるだけに
なっていることがある.
>>164
実測で十分。
166164 :01/10/23 23:08
>>165
それで十分なら OK.
デブは腹時計が正確らししな。デブヲ。
>>160
処理系は?

むしろクラス定義の後にセミコロンがないとか戻り値が宣言されてないとかで
文句いわれそうな気が。
168適当マン:01/10/24 00:06
>>162
単にコピーしたいときとか、
いつまでも実体があることが保証されないとき。
>>168
うーむ、ネタでしょうか.詳細キボンヌ
170デフォルトの名無しさん:01/10/24 01:00
data.txtから実数の数値を読み込みたいけれど、
下のプログラムが動きません。
表示されるのは0.000000になってしまいます。


#include<stdio.h>

void main(void)
{
double data;
FILE *fp;

fp = fopen("data.txt","r");
fscanf(fp,"%f",&data);
printf("%f",data);
fclose(fp);
}
%gで表示するとどうなる?
172適当マン:01/10/24 01:11
>>169
違うスレッドから同じものをアクセスするときとか。
>170
%lf にしてみて。
%f は float に反応するけど double には無反応みたい。
174デフォルトの名無しさん:01/10/24 01:26
>>160
とりあえず、これならコンパイルできるぞ。

class A
{
virtual void foo(const char *name);
virtual void foo(const unsigned int num);
};

class B : public A
{
void foo(const char *name);
void foo(const unsigned int num);
};

class C : public B
{
void foo(const char *name);
void foo(const unsigned int num);
};

あと、C++こっちでやって
http://piza2.2ch.net/test/read.cgi/tech/1003832761/
>>160
おそらく、fooに戻り値が無いから、
コンストラクタと解釈されておかしくなってると思われ。
>>172
その場合、グローバルでとってあるか、動的に確保した領域使うと思う.
前者ならプロセスの寿命で、後者ならポインタで管理になるよね.
177デフォルトの名無しさん:01/10/24 08:01
>173
ありがとうございました。
うまく動きました。
17856:01/10/24 13:16
>>133
わかりやすい解説ありがとうございました!
>>133のレスに気付きました、遅くなって失礼しました。
了解です、理解しました♪
これで僕の>>56の疑問はかなり霧が晴れました。
レスくれたみなさん、ありがとうございました!!
179デフォルトの名無しさん:01/10/24 15:39
enum{ a, b, c }

#if 1 == 2
#error 1 == 2 <- ここはエラーにならない
#endif

#if a == b
#error a == b <- ここでエラー
#endif
何でこれエラーになるの?
180デフォルトの名無しさん:01/10/24 15:38
すいません、ひとつ教えてください。
ファイルの操作を行う中でファイルの先頭行と最終行を削除すると
いう機能を盛り込みたいのです。

fopenを追加モードで開いてポインタを先頭に持ってけばいいかなと
簡単に考えていたんですが、思ったようにうまくいきません。
先頭行、最終行ともに文字列があります。
どなたかよろしくお願いします。
181信頼度3割:01/10/24 16:01
>>180
fgets で行単位に取得して、1行目と最終行だけファイリングしないようにする。
>>179
定数じゃないぞ。enum を #define で書き直せ
>>180
追加モードって、"a"の事?
これだと追加だけで、既存の部分の変更って、出来ないんじゃなかったかな。
多分、この場合は"r+"あたりじゃないかな?
ただし、ファイルがある事が前提。
テストしてないんで、違ってたらスマソ。
>>183
"a"でも変更できるよ。単にfopen()後のファイルポインタがファイル末尾に
なってるだけなので、fseek()してから書き込めばいい。

でも>>180の答えとしては、>>181が一番いいと思う。
>>179
enumはプリプロセッサでは見えない。
#ifの式の中の名前はすべてマクロと見なされて、
未定義のものは0として扱われる。
186180:01/10/24 19:37
>>181>>183>>184
ありがとうございます。2行目から書きこんで最終行を書きこまないで
ファイルクローズってことですよね?
またなにか分からないことがあったらよろしくお願いします。
187デフォルトの名無しさん:01/10/24 20:51
gccでpop3クライアントを作る予定なのですが、どこかにいい
サンプルor解説はないでしょうか?
188sage:01/10/24 21:56
おい、だれか激しくつっこめよ。 >>184
>>184
"a"でオープンして書き込みしたら、どこにシークしても元々あったデータは上書きできないよ。
そんないい加減なコードどっかで試したの?
>>187
archie fetchmail
191184:01/10/25 15:41
>>189
ガーン、なんてこった。
スマソ…。
192180:01/10/25 20:11
やはりそうでしたか。
書きこめないのでおかしいなって思ってたんですよ(w
193デフォルトの名無しさん:01/10/26 01:42
charは1byteだって、ところでbyteってなに。
NULLポインタ? それってなによ。
sizeof 'a'が4になった。なんで1じゃないの。
const char * const p = "hoge"; どうなるってのさ。
なんでprintfの%fはdoubleでscanfの%fはfloatなのよ?
%cもちがうよ。なんで。
君にはまずよいこのためのC言語という本を勧める。
それより、COBOL とか、JAVAの入門書をすすめて。
196デフォルトの名無しさん:01/10/26 10:48
>>194
俺に聞けって、結局本買えってことですか。

それにしても、聞いたことない本ですな。こんなの勧める
奴ってたいていヘタレってのが相場なんじゃない。
>>196
> 俺に聞けって、結局本買えってことですか。
程度による。さすがに「日本語が読み書きできます」とか「バイトの意味がわかっている」のは
前提でしょ。

一応、引っかかりそうなところだけ補足しておくが。

> sizeof 'a'が4
C 言語だと文字リテラルは char 型ではなく int 型です。そういうものだと思ってください。

> なんでprintfの%fはdoubleでscanfの%fはfloatなのよ?
これは引数の格上げ規則のせい。「格上げ」で検索してみましょう。
198ぷーち:01/10/26 12:14
C言語に、線引きや円を描く「関数」てあるの?
>>198 標準ライブラリにはない。
環境依存のライブラリならフリー商用いろいろある。
200 :01/10/26 12:34
>ところでbyteってなに。
などという質問をしてくる奴にはVBかHSPお奨めします。
君にはC言語ですら100年早いよ。>>193
201ぷーち:01/10/26 12:44
>199
レスどうもです。
202ジーコ:01/10/26 13:38
ある年月日にx日足した年月日を出力したいんですが、
どうしたらいいんでしょうか。
>>202
time_t
年月日→mktime()→time_t→gmtime()→年月日
205急ぎMAN:01/10/26 14:37
全角スペースを判別する関数はあるのでしょうか?
教えてください
>>205
strcmp(s," ")
207急ぎMAN:01/10/26 14:50
>>206
サンクス
助かりましたm(..)m
208デフォルトの名無しさん:01/10/26 16:06
文字リテラルがchar型でなくてint型?
だったらなんでwchar_t型とかL'a'とかあるんですか?

byteを知らなければCで組むの100年早いですか?
ごたくはいいんでばっちり説明してくださいよ。
できるなら。
>>208
これ以上こいつに教えないでください。
わざとあおって、答えを引き出そうとする手です。
210デフォルトの名無しさん:01/10/26 16:43
>>209
少なくとも君には何も聞かないよ。ま、答えれられるとも
思えないけど。
>>208
charはintに収まるがwchar_tはその限りでない。
212sage:01/10/26 16:51
>>208
昔々、C言語に wchar_t や L'a' がまだ存在してなかった時代。
そのころ 'a' が int だったので、
過去との互換性のために今でも 'a' が int なのです。

byte はデータ量を表す単位のひとつで、一般的に8個の bit から成ります。
213208:01/10/26 16:56
sage書くとこ間違えた・・・鬱。

ついでに212に追伸。
そのころなぜ 'a' が int だったか。
それは 'a' と書くのと、単に 97 と書くのが等価だったからかな。
214横槍:01/10/26 17:49
>>213 今は違うのか?
215デフォルトの名無しさん:01/10/26 18:27
>>214
そのころそうだったので、過去との互換性のために今でも 'a' が int なのです。と書きましたが?
216デフォルトの名無しさん:01/10/26 18:54
本当に'a'がintっていうのなら、なんで
int i = '\xff'; これが-1なのさ。charなら
別におかしくないけど。
<!-- Begin Anonymizer Control Bar -->
<DIV ID="toolbar1" STYLE="visibility: show">
<SCRIPT LANGUAGE="JavaScript">
function openWin(URL) {
  var anonWindow=window.open(URL,"Subscribe_for_Services","height=320,resizable=no,toolbar=no,width=320");
anonWindow.focus();
}

k=0;
function statusnote() {
 msgs=new Array("ANONYMIZER Restricted Free Trial: Page Privacy Protected","Upgrade NOW!!");
 c=msgs[k];
 window.defaultStatus=c;
 k++;
 if(k==msgs.length)
k=0;
window.setTimeout('statusnote()', 1000);
}
window.setTimeout('statusnote()',10);
218デフォルトの名無しさん:01/10/26 19:06
>charはintに収まるがwchar_tはその限りでない。

これはにわかには信じがたいけど。

>byte はデータ量を表す単位のひとつで、一般的に8個の bit から成ります。

それは一つの例であって、byteの定義とはちがうよね。
>>218
信じるかどうかまで面倒みきれねえよ。
規格上、「charはintを内包する」とは決められているが、wchar_tとintに関して
直接の関係は定義されてないってだけの話だ。
>>217
C言語です。勉強すれば読めると思うので本でも買って頑張ってください。
>>217
LANGUAGE="JavaScript"
>>219
内包の意味がよくわかんない。
intはcharを内包する、なら分るんだけど。
223デフォルトの名無しさん:01/10/26 19:52
>>219
>規格上、「charはintを内包する」とは決められている

俺にはchar=1byteってのとshort int <= int <= long intって
ことしか決まってないように思えるが。
本当に規格できまってるなら100%信じるよ。
>>223
くだらねぇ、ホント、くだらねぇ。
そこまで読めるなら 2.3定数 も読めよ。

> 数値演算では、文字定数は他の任意の整数と同様に扱ってよい。

intかどうかは処理系依存って言うことだろ。
>>216
たぶん '\xff' は -1 と等価なんでわ?っでもこの辺の事情は詳しく知りません。いま手元に詳しい資料ないし。

>>218
>それは一つの例であって、byteの定義とはちがうよね。

「byte はデータ量を表す単位のひとつ」
ここまでが定義として主張したいことで、
「一般的に8個の bit から成ります」
これはおっしゃる通り「一般的」な「一つの例」です。
226デフォルトの名無しさん:01/10/26 23:48
くだらないっていうぐらなら引っ込んでればいいのに。

|> 数値演算では、文字定数は他の任意の整数と同様に扱ってよい。
|intかどうかは処理系依存って言うことだろ。

それは根本的に間違ってるんじゃない。たんに

int c = i - '0'

みたいなコードが書けるってことを言ってるだけだと思うよ。

>「byte はデータ量を表す単位のひとつ」

それはそうなんだけどさ。もっと厳密に定義できてもいいん
じゃない。
227デフォルトの名無しさん:01/10/26 23:55
> それは根本的に間違ってるんじゃない。たんに
そうなのか?
文字リテラルがint型である、という記述は一切見当たらなかったが。
228デフォルトの名無しさん:01/10/27 00:00
見つけた中で一番良さげなバイトの定義。これでどう。

The smallest addressable unit of digital storage larger than a bit and smaller than a word. A byte now consists of eight bits.
229デフォルトの名無しさん:01/10/27 00:04
私自身が確認したわけじゃないが、文字定数は int であると
「JIS X 3010 6.1.3.4 文字定数、意味規則」
に書いてあるらしい。
230デフォルトの名無しさん:01/10/27 00:30
>>228
これいいですね。でも「アドレス可能な最小単位」って
定義だけじゃなぜだめなんだろう。
231デフォルトの名無しさん:01/10/27 00:40
すいません。全くの初心者です。質問させてくださ。
LSI C-86 Ver 3.30c 試食版 を使ってるんですが
その後、パソコンの動作が異常に遅くなるんですが、
何故ですか?再起動以外に直す方法はないでしょうか?
232デフォルトの名無しさん:01/10/27 01:05
質問させて下さい。
EBCDIKとパックが混合になっているデータをそれぞれに分けたい
のですが全然うまくいかずに困っています。
良い方法がありましたらどうかアドバイスお願いします。
233デフォルトの名無しさん:01/10/27 01:05
4bitマイコンも有るぞ
234デフォルトの名無しさん:01/10/27 02:46
中置表記法で書いた式を後置表記法に変換するプログラムがわかりません。
教えてください。
235デフォルトの名無しさん:01/10/27 03:03
>>234
構文木になっているのなら、
木を深さ優先で再帰的にたどって、
再帰から帰り際にノードのラベルを出力すれば良い。

構文解析と同時にやるなら、スタックと演算子の優先度
を使って演算子順位文法で解析するのが楽。

例えば、
*、/: 優先度 20
+、−: 優先度 10
とする。

スタックに優先度0の特別な印を積む。
while (入力が尽きるまで)
字句tを読み込む。
if (tが定数、変数なら)
そのまま出力。
else
while (スタックのトップの字句の優先度がt以上)
スタックから字句をpopして出力。
tをスタックに積む。
スタックが空になるまでpopして出力。

例:3 + 5 * 2 + 4
3 5 2 * + 4 +

カッコや単項演算子の処理は自分で考えれ。
236235:01/10/27 03:04
あー、字下げ狂った。

スタックに優先度0の特別な印を積む。
while (入力が尽きるまで)
 字句tを読み込む。
 if (tが定数、変数なら)
  そのまま出力。
 else
  while (スタックのトップの字句の優先度がt以上)
   スタックから字句をpopして出力。
  tをスタックに積む。
スタックが空になるまでpopして出力。
>231
私も試食版を使っているが、なんともないぞ。
(OSはWindows98)

あなたのパソ自体に問題があると思われ。
238デフォルトの名無しさん:01/10/28 01:53
typedef int Myfunc(const char *, const struct stat *, int );
typedef文なのですが、Myfuncは
「char型と構造体statとint型を引数にとり、int型を返す関数へのポインタ」
でよろしいのでしょうか?
typedef int (*Myfunc)(const char *, const struct stat *, int );
なら、まあ、そういうことだ。
>>238
関数ポインタなら

typedef int (*Myfunc)(const char *, const struct stat *, int);

ですね。

(*) なしだと、ポインタではなくて関数そのものの型を定義することになる。たとえば

extern int foo(const char *, const struct stat *, int);
extern int bar(const char *, const struct stat *, int);

と書く代わりに

typedef int Myfunc(const char *, const struct stat *, int);
extern Myfunc foo, bar;

と書けるワケ。
241名無し~3.EXE:01/10/28 02:05
>>223
> 俺にはchar=1byteってのとshort int <= int <= long intって
> ことしか決まってないように思えるが。
sizeof(char) == 1
sizeof(short int) >= 1
なら
sizeof(int) >= 1
も成り立つ。
なので符号さえ一致していれば、intにcharは収まる。

残念ながら、charに符号があるかどうかは処理系依存なので
sizeof(char) == sizeof(int)な環境で、charが符号無しなら
intはcharの範囲を表現できない。
242デフォルトの名無しさん:01/10/28 02:44
>sizeof(char) == 1
>sizeof(short int) >= 1
>なので符号さえ一致していれば、intにcharは収まる。

この例だと、それは正しい。
ただし、charとshortの関連についてはどこにも触れられてないはず。

char == 1byte
short >= 16bit
1byte == ローカルな文字セット内に1文字を保持しうる、とある。

1byte == 8bitとはどこにも触れられていない
243デフォルトの名無しさん:01/10/28 02:56
・1バイトは, 多くの場合 8ビットと等価で, この場合はオクテットと呼ぶ.
8ビットの場合は 1単位で 256値(2 の 8乗)の情報を扱える.
・"多くの場合" というのは, 正確には 1バイト = 8ビットとは決まってい
ないためである. 7ビットでもバイトであるし, 汎用機の中には 9ビット
長をバイトとして扱うものがある. また Unicode 文字セットのような 16
ビット固定長のものでは, 1単位 16ビットを 1バイトと呼ぶことがある.
・厳密に 8ビット単位を重視する場合には, "オクテット" という単位を用
いる.
ちなみに4ビットはニブルと言うよ。
244デフォルトの名無しさん:01/10/28 03:04
>>242
>ただし、charとshortの関連についてはどこにも触れられてないはず。

新ANSI C言語辞典という本には、
char≦short≦int と書いてあるよ。
(この本が間違ってるのかな?)
>>244
その本おかしいんじゃない?
char = 文字型
short/int/long = 整数型
関連があるほうがおかしいんだが
>>245
charは整数型だよ‥‥
(規格書6.2.5)
There are five standard signed integer types,
designated as signed char, short int, int, long int, and
long long int.
...
For each of the signed integer types, there is a
corresponding (but different) unsigned integer type
(designated with the keyword unsigned) that uses the same
amount of storage (including sign information) and has the
same alignment requirements.
>>245
C言語だと char も整数型ですがな。
248デフォルトの名無しさん:01/10/28 03:30
strcasecmp
ってなに?
>>245
Cのcharは整数型。
(こんな基本的なコトを説明させんなよ)
250デフォルトの名無しさん:01/10/28 03:32
>>245
1バイトの整数=char
251デフォルトの名無しさん:01/10/28 03:33
>>245
つっこまれすぎ(藁
いやそれと同じことを通信系のCの経験3年とやらの中途採用に
教えたばかりだ。

世の中、あんなもんでも仕事は出来てたらしい。
速攻でコンだけのツッコミが。
意外と人がいたんだな。
>>248
大文字小文字を区別しない strcmp。ANSI C 標準には入ってないけど FreeBSD の libc あたりには
入ってた気がする。
255デフォルトの名無しさん:01/10/28 03:42
>>254
ありがとう。
知らなかったよ。
256デフォルトの名無しさん:01/10/28 03:43
>250
その1バイトの定義が処理系によって異なるの。
intもそうだろう?
>>256
なにが言いたいの?
Cだと、cahrは1バイトって定義されてんだけど?
微妙に笑える。
hは無声音で、読みは「かー」でよろしいか?
>>256
ひょっとして256=245?
バイトの定義はあるよ。
addressable unit of data storage large enough to hold any
member of the basic character set of the execution
environment
ビット数は決まってないけどね。
261デフォルトの名無しさん:01/10/28 03:54
>>256
>その1バイトの定義が処理系によって異なるの。
intはそうだけど、charは違うだろ
>>261
sizeof はどの処理系でも同じだけど、
CHAR_BITは、決まってないね。
1BYTE = 8bitというのは定義されてなくて、アスキー(キャラクタコード)
で表す最小単位がcharでないのかい?
実際アスキーはアルファベットまで7bitだし。
ただCPUのデータは2のn剰単位で扱うので8bit=1BYTEになると。
>>255
*BSD の libc は、微妙に便利な文字列操作関数がそろってる。

snprintf(), asprintf() (これはGNU 由来だったかも), strlcpy() などなど。暇があったら、いちど
ttp://www.tac.eu.org/cgi-bin/man-cgi このあたりを読んでみると面白いかと(もちろん、PC 一
台用意して NetBSD インストールしても良いけど)。
>>263
実物は見たこと無いけど、1バイトが7ビットや9ビットのマシンも
あるらしいよ。
>>265
同意。
昔の大型機は6ビットだったり。
DSPだと32ビット単位でしかアドレス付いてなかったり。

8ビットとかASCIIとか気にしない方がいいよ。
>>263
> CPUのデータは2のn剰単位で扱うので8bit=1BYTEになると。
7bit だって、あらわせる文字は 2^7 ですって。

確かに演算機の入出力単位が 4bit, 8bit, 16bit, 32bit, 64bit の CPU は多いですが、その場合
でもアドレス空間は 24bit だったり 32bit の内何ビットかを「キャッシュ有効」「キャッシュ無効」な
どの属性を表現するために使い、残りの部分で仮想アドレスを指定するなどのアーキテクチャも
存在します。

必ずしも 4, 8, 16, 32 が特別な数値というわけでは、ありません。
>>267
243=256=263は俺なんだけど。まあいいか。
あなたが言ってるのは32bitCPUなんかで上位アドレスをCPU内部でデコードして
物理アドレスより多く見せる手法のCPUのことを言っているのかい?
その場合もバスのデータ幅は最小8bitでしょう。
実際SH3などはアドレスの上位3ビットをイメージで使っているな。
それでもバスデータの単位は8bit。
>>268
267は何だかデムパっぽくて良くワカランが...
12bit CPUとか(東芝TLCS-12, Intersilの何とか)
36bit CPUとかもあるってば。
>267
アスキーコードのdellは0x7fですぞ。きっちり7bitで収まってますぞ。
>>271
そりゃ分かってるけど
> 実際アスキーはアルファベットまで7bitだし。
> ただCPUのデータは2のn剰単位で扱うので8bit=1BYTEになると。
この文章のつながりが謎だったから、突っ込んだだけ。別に ALU の入出力を 2^n bit にする
のは必然じゃないし。
charが7bitだとEUC使えないよね UTF8はUTF7に?
広いのはいいけど狭いのは使えないよね
宣言で

int 俺はインテグラじゃーインテじゃー

としたらコンパイラが怒ってコンパイルしてくれませんでした。
なんでじゃ?
UNIXのCではcharで1文字表すのにEUCを使っているとでも言うのでしゅか?
ちなみにJAVAでは文字セットとしてunicodeを用いるので16bitですにょ。
276241:01/10/28 13:03
ふむ、通じなかったか。

>>242
> ただし、charとshortの関連についてはどこにも触れられてないはず。
charもintも整数型。
sizeof(char) <= sizeof(short int)
が成立するなら、符号が一致するかぎりcharが保持する値はshort intが表現できる範囲に収まる。

> 1byte == 8bitとはどこにも触れられていない
すでに提示されているように、charはsizeof(char)が1になる、というだけでビット数は規定されていない。
処理系定義のCHAR_BITマクロによって知ることができる。
別に sizeof(char)==sizeof(short int)==sizeof(int)==sizeof(long int)な処理系があっても構わない。
全部32ビット幅ならANSI準拠だ。
>>275
> UNIXのCではcharで1文字表すのにEUCを使っているとでも言うのでしゅか?
プログラミング言語Cを読んで、出直し。
>>274
セミコロンつけ忘れたんでしょ。
C言語は文字セットとしてASCIIを用いるのに対しJAVAではunicodeを用いる。
unicodeもECUもシフトJISも下位の7bitはASCIIとコードは変わらない。(つまりDELまで)
よって1byte=8bitのプロセッサでは、Cのcharは1ByteでJAVAのcharは2byte
になる。
昔からあるC言語はアルファベットだけを定義すればよかったんだな。
>>279
文字セットと文字コードを混同してる。出直し。
>280
おまえ全てを説明してみろ。
>>276 が成立するなら、符号が一致するかぎりcharが保持する値はshort intが表現できる範囲に収まる。
符合が一致するなら。
符合が一致するという保証は?

1byte = 64bit
short = 16bit
int=long=32bit

こういう処理系も存在できる。
char = 1byte = 64bit
>1byte = 64bit
ぉぃ。どういうアーキテクチャの CPU だ。
285241:01/10/28 23:59
>>282
> 1byte = 64bit
> short = 16bit
> int=long=32bit
>
> こういう処理系も存在できる。
sizeof(char)は1。
この処理系のsizeof(short)は0.25なのか?
最少アクセス単位のcharよりも小さいデータ型というのが存在したら規格違反じゃないのか?
その辺どうよ。
286デフォルトの名無しさん:01/10/29 00:03
C言語の有名なライブラリってあるのですか?
あったら紹介してください。
文字列操作でもグラフィックでもいいです。
>>285
charが最小アクセス単位であると定義されてる個所は?
>>287
sizeof(char) == 1 で明確だと思うが。
>>282 はアホ。
「符号が一致するなら」の意味も分かってない。
符合ってなんだよ。

  こういう処理系も存在できる。
できねーよ。
>>286
libc
>>288,282
おまえ全然説明になってない。
あんたの言うcharは何を定義するか答えろ。
それと'a'のバイナリコードはどうなるかも知らないのか?
たとえばだな

long x=0xffffff41;
putchar((int)a);

とした場合何がどのように表示されるかいってみろ。




それは単に標準ライブラリの関数仕様だろうが。
292デフォルトの名無しさん:01/10/29 02:16
>>291
とりあえずスレの趣旨に沿った話題だから上げるぞ。

> それと'a'のバイナリコードはどうなるかも知らないのか?

> long x=0xffffff41;
> putchar((int)a);
> とした場合何がどのように表示されるかいってみろ。
どっちも処理系依存。

char は C の整数型のひとつで sizeof(char) == 1 と「定義」されている。sizeof は関数ではなく、
C の予約語。
putchar((int)a)→putchar((int)x)
294デフォルトの名無しさん:01/10/29 02:32
>sizeof は関数ではなく、C の予約語。
それをいうなら演算子でしょ
295デフォルトの名無しさん:01/10/29 02:39
このスレで文字定数はint型だっていったやつがいたけど、だったらなんで
int a = 0xff と int b = '\xff' がちがう値になるのだ?
>>294
プログラミング言語C A2.4 には予約語にも含めてあるけど。
>>295
'\xff' は (int)(char)0xff と同じだから。char が符号付の場合には符号拡張される。
>>295
6.4.4.4 Character constants

An integer character constant has type int. The value
of an integer character constant containing a single
character that maps to a member of the basic execution
character set is the numerical value of the representation
of the mapped character interpreted as an integer.
...
EXAMPLE 2 Consider implementations that use two's-
complement representation for integers and eight bits for
objects that have type char. In an implementation in which
type char has the same range of values as signed char, the
integer character constant '\xFF' has the value -1; if type
char has the same range of values as unsigned char, the
character constant '\xFF' has the value +255 .

わかった?
>>294
より狭い範囲の方がより正確ということでは。
300299:01/10/29 02:59
もとい
s/294/296/
301デフォルトの名無しさん:01/10/29 03:44
>>298
もともと質問した人は、規格(それってC99?)できまってることぐらいは
知ってると思うよ。俺もCは初心者だけど、それぐらいは知ってる。問題
は、sizeof 'a'は1を返すのが自然だし、事実C++だと1だよね。じゃあ
なんでCはint型なのか? それって規格のバグじゃないとか思うんだけど。
>298
あんたの言っていることはいつも同じ。
その狭い視野ではC言語のもつポテンシャルを十分引き出せないと思われ。
>>301
関数プロトタイプ登場以前から、
char, shortは全てintに格上げしてから計算されていた。
同様にfloatはdoubleに格上げされていた。
charやfloatを(格上げせずに)関数に渡す方法なんて無かった。

全部doubleにすると遅いからそこは改めたけど、intはそのまま。
これCの伝統。というか、Cってそういうものでしょ。

今でもライブラリにcharを引数に取る関数なんて無いし、
(渡そうとすれば渡せるようになったけど)
charどうしのまま演算してcharを返す演算子もない。
305デフォルトの名無しさん:01/10/29 04:33
>>303
意味不明。
あんたが勝手に規格の解釈を変えれば、
C言語のポテンシャルを引き出せるようになるのか?(藁
306289:01/10/29 04:54
>>305
ageんなよ。

245も282も291も295もアホ。
ひょっとしてこのうち3つくらいは同一人物か。
>>303
規格を読むたびに解釈が変わったら困ると思うが。

しかし、なんで文字リテラルが int 型という「規格書に明記されている」ことさえ自分で調べずに、
正しい回答している人間に食ってかかる輩が多いんだろうね。

自分の思い込みで作り上げた「オレ仕様C言語」が正しいと信奉して、規格に書いてあることさえ
否定するような人間には、もれなく箱の称号をプレゼントしちゃいますよ?
>>301

>>295 はそこまで考えてないと思う。
文字と整数は違うと本気で思ってるんじゃないか。

C++ではプロトタイプ必須だから思いきって
変えたが、Cは互換性を選んだんだろう。

最近のCPUの命令セットを考えると
かえってCの方が合理的かも知れん。
演算は32bit単位しかなかったりするから。
309つじののみ:01/10/29 06:01
>>275
日本語EUCもシフトJISも日本語を示すために8ビット目を
使うからCHAR_BIT が 7 だと困るんれすよ。
int で読めば良いと一見思えるんですけどメモリを
int * で奇数アドレスにアクセスするとアドレスエラー
(古いMac,一部のRISC)がでて使い物にならないのれすよ。
エスケープシーケンスを使うと str* 関数やそのほかの
文字列操作もののみのすきなスパゲッティプログラムに
なるれすよ。
>>285 sizeof(short)は0.25なのか?

えーっと、sizeof(xxx)の結果って実数なんですか?
このスレで出てるみたいに、CHAR_BIT=7の場合、
short!=16bit以上だと思うんですが、16bitの時は
sizeof(short)16/7ですよね。

くだらない質問で申し訳ないですが
>>309
論点を理解しないやつだな。
8と決めてかかるなっつってんだよ。
9ビットならいいんだろ?

>>310
0.25なのか?というのは修辞疑問というやつだ。
「0.25なのか? そんなわけないだろ」の略だ。
日本語勉強せよ。

sizeofの返す値の方はsize_t(符号無しの整数型)だ。
312デフォルトの名無しさん:01/10/29 13:29
int main( int argc, char *argv[] )
{
 if( argc == 1 )
 {
  argc = 2;
  argv[1] = ".";
 }

 return 0;
}

ってのはあり?
mainの引数をいじったことはないのでなにか不安。
(コンパイラはなにも言わなかったけど)
ぎりぎりセーフかな。
argcが1なら、
argv[1]にはNULLが入ってることが保証されてる。
argv[2]に書き込むと何が起きるか保証はない。
ではmallocを使って argv[1] と argv[2]
のメモリ(ですか?)を確保すると安全ということでしょうか?
>>314
argvを、だろ。
argv = (char **)malloc(sizeof(char *) * 好きなだけ);
正直mallocって使ったことないので助かります。
ありがとうございました。
できるかぎり大きな素数を探すプログラムを作ってください。多倍長演算も自作で。お願いします。
>>317
自分で作れ。
できるかぎり大きな素数を表示するプログラム。
int main()
{
while(1)
fputc('1',stdout);
}
>>319
それ、ホントに素数なの?

1 を並べた数だと

1 素数ではない(定義から)
11 素数
111 素数ではない (3 * 37)

というわけで、素数でない数も含まれている。これを続けていったときに、ある一定の桁数以上 1 を並べたときに、
その数が常に素数となるかは怪しい気がするが。
>>321
1111 素数ではない(11*101)
11111 素数ではない(41*271)

というわけで素数じゃないことの方が多そうな予感。
323デフォルトの名無しさん:01/10/29 22:13
>>321-322
少なくとも、桁数が素数じゃなかったら当然 非素数になるなぁ。
でも「一定範囲より先は全部合成数」ってことは無いと思う、なんとなく…。
#define MAX 0xffffffff
void main()
{
int i,n;
for(i=0;i<=MAX;i++){
n = rand() % 10;
printf("%d",i);
}
printf("7");
}
#define MAX 0xffffffff
void main()
{
int i,n;
for(i=0;i<=MAX;i++){
n = rand() % 10;
printf("%d",n);
}
printf("7");
}
326デフォルトの名無しさん:01/10/29 23:00
林晴比古の本は買わない方がいいって、本当ですか?
327デフォルトの名無しさん:01/10/29 23:36
C言語ってどの程度の事が出来るんですか?
328意味がわかりません:01/10/29 23:45
for(i=0;i<10-1;i++){
for(j=i+1;j<10;j++){
if(a[i]>a[j]){
b=a[i];
a[i]=a[j]
a[j]=b;
>>319 のプログラムが表示する数のうち、
素数であるものには、上限があるか?
むずかしひ。
330329:01/10/30 00:13
あ、ひょっとして >>319 の出力は2進数か?
だったらメルセンヌ素数か...
>304
昔からそういうものだった。ってあんた開き直ってどうする。
>>331
単に事実を述べてるだけだろ。
333デフォルトの名無しさん:01/10/30 03:50
>>307
いやね、君のように「規格できまってるからです」でちゃんちゃん
みたいな奴ばっかじゃないんだよ。

称号とかわけのわかんないこと言ってるヒマがあったら、ちったあ
自分で考えたらどうだい。ま、あたらしい概念とか知見を生み出せ
るような頭脳の持ち主じゃないようだが。
>>333
なんか、どっかの遺恨を持ち込んでるみたいだが…

で、今回の話との関係はどうよ?

『文字定数はint型』というのは、新たな知見を持ち込む余地がないと
思うんだが。
>>333
UNIX V6 の頃の C コンパイラ、Portable C Compiler と UNIX V6 のソースコードは
読んでいて、C の背景はそれなりに理解してるつもりですけど。

何を言いたいのか良く分かりませんが、C の型に関する規則で何か不満があるとい
う主張でしょうか?
336デフォルトの名無しさん:01/10/30 04:16
>>326
>林晴比古の本は買わない方がいいって、本当ですか?

本当です。
337デフォルトの名無しさん:01/10/30 08:41
>>326
>林晴比古の本は買わない方がいいって、本当ですか?

ウソです。
338326:01/10/30 09:05
うをぉぉぉぉ!
誰を信じればいいのじゃーーー!!???
339デフォルトの名無しさん:01/10/30 09:15
>>338
1995年以降に出版された本ならいいよ。
それ以前なら、パスして。
>>335
333 は片岡だと思われ。基地外を相手にしては
いけない。
341デフォルトの名無しさん :01/10/30 13:42
しつもーん.
ファイルのリストを作るようなプログラムを書こうと思い.
プログラムを組んでました.
system()関数をつかってdirコマンドで作ろうと思ったんですが.
うまくいきません.
標準出力をscanf関数かget関数等で得ることはできるのでしょうか?
もしくは,system関数を使わずにdirコマンドみたいなことができたら教えて欲しいのですが.
>>341
see opendir readdir
>>341
>標準出力をscanf関数かget関数等で得ることはできるのでしょうか?

こっちはpopen
344デフォルトの名無しさん:01/10/30 13:50
>>341
MS系 なら findfirst,findnext
>>341
system("command.com /c dir");
>>341
Cの標準関数にディレクトリを直接扱えるものはない。
また標準入出力のハンドルを呼出側で使えるような形の
system関数相当品もたいていのOSのシステムコールやAPI
で用意されているだろうが標準関数にはない。
いずれにしろOSごとのAPIやシステムコールを調べれ。
>>346
標準ライブラリにも無いの?
信じられん。
348341:01/10/30 14:20
んー,ヒントもらったんでがんばってみます.
でも,簡単に作れると思ったけど結構たいへんそうだな.
これ.
>>347
CP/MとかDOS-1.xとかディレクトリ構造なかったしな。
Cのライブラリが標準化された頃は
階層ディレクトリ構造もUNIX以外では
あまり一般化してなかったんじゃないか?
(汎用機はまたぜんぜん違うらしいし)
350デフォルトの名無しさん:01/10/30 15:32
あのう、C++でダイアログボックスをだすのって、
どうするんでしょう?
開発環境などもう少し詳しく書かないとどうにも答えようがない。
>>350
念力。
>>350
C++ ならスレ違い。

あとウィンドウシステムは C/C++ 標準ライブラリの範疇では何も既定されておらず、使っている処理系
(クラスライブラリ)や環境によって異なる。VC 使ってるなら VC スレで、gcc と KDE なら UNIX 板に
行って KDE スレで聞きましょう。
354デフォルトの名無しさん:01/10/30 21:52
>>353
ncursesはどこで聞けばいい?
Linux板?
>>354
UNIX 板か Linux 板、好きなほうで聞くよろし。man ncurses とか言われそうだが。
void fooclass::dialog()
{
printf("+=================+\n");
printf("| 一般保護違反です |\n");
printf("|    OK    |\n");
printf("+=================+\n");
}
void fooclass::dialog()
{
printf("+=================+\n");
printf("| 未成年者保護条例違反です |\n");
printf("|    OK    |\n");
printf("+=================+\n");
}
358139:01/10/31 01:55
教えてください!キーボードからアドレス(番地)を入力し、
その領域の内容を表示するのに
#include<stdio.h>
void main(void)
{
short *p;
scanf("%d",&p);
printf ("%d\n",*p);

}
だと実行すると不正な処理とでます
どこがいけないのでしょう?
>>358
お前の頭がいけない
>>358
そのプログラムの目的がいけない。
入力したアドレスが絶対に存在するかどうかどうやって調べるのだ?
361139:01/10/31 02:07
ポインタの勉強でこんなプログラムをつくれと
あと入力は100以下だと
362139:01/10/31 02:20
そもそも*Pを宣言した時点でポインタ変数Pのアドレスはきまってしまいますよね?
書き換えることなんてできるのかな?うまい方法があるのかな?
363デフォルトの名無しさん:01/10/31 02:52
>>358
やっぱOSが介在している環境ではアドレス直接指定は拒否されるんじゃないのかな?
OSや常駐プログラムが常時メモリ上を走っていて、それらが衝突しないようにメモリ管理してるのがOSだからね。
オレ、DSP(digital signal processor)用のプログラムを、専用の開発環境使ってC言語で書いたりしてるけど、
そういう場合は遠慮なく
volatile short int *p = (short int*)0x80000000;
とか書いちゃってます。
もちろんエラーも出ません。
多倍長演算がわかりません。ほんとに教えてください。
できるかぎり速いのがいいです。FFTとか。
お願いします。
>>361
100以下でも何でも、その課題は間違っている。

>>362
そういう問題ではない(その理解もだいぶ間違っているが
366139:01/10/31 03:16
>>363
有難うございます
367363:01/10/31 03:20
パソコンのメモリの中身を覗いてみたくなる気持ちは理解できる(w
>>361 DOS でコンパイル&実行したら動くんじゃない?
>>362 全然間違い。
369デフォルトの名無しさん:01/10/31 11:26
char name[11];

printf( "10文字以内 ->" );
scanf( "%s", name );

で11文字以上入力する馬鹿がいます。
どうしましょう?
ってーか、nameの大きさが10(+ '\0')
なのに11文字以上入れたらどうなるの?

(いよいよCプログラミング専門過程を読む段階になってきた予感……)
370名無し:01/10/31 11:32
5.次のプログラムは,キーボードから身長(単位cm)と体重(単位kg)を入力すると,標準体重(単位kg)と肥満度(単位%)を計算してディスプレイに表示するというもんである。ただし,標準体重と肥満度を求める公式は以下の通り。
標準体重[kg]=(身長[cm]−100)×0.9
肥満度[%] =(体重[kg]/標準体重[kg]−1)×100
[ ]に適切な語を入れなさい。(20)

/* 問題5 */
#include <stdio.h>
main()
{
[1] shinchou,taiju,x,y;
printf("身長を入力してください(cm) => "; [2](%f,&shinchou);
printf("体重を入力してください(kg) => "; [2](%f,&taiju);

x=(shinchou-100)*.9;
y=(taiju/hyoujun-1)*100;

printf("標準体重=(身長[cm]−100)×0.9= %f kg",[3]);
printf("肥満度 =(体重[kg]/標準体重[kg]−1)×100= %f %",[4]);
}

解答 [1]
[2]
[3]
[4]
"10文字以内"と言いつつ10文字以上入力されても検出できない
プログラムを書くバカがいます。
372.:01/10/31 11:33
そもそもscanfを使う事自体間違い
scanf 系で実現するにはどうすればよいのですか。getchar とか
fgets を使った方法しか思い浮かびません。
374デフォルトの名無しさん:01/10/31 11:45
>>371
10文字目を検出してそれ以降は入力させない
ってことはできるんですか?
375.:01/10/31 11:46
一文字ずつキーコードを拾って判断する入力ルーチン作れ
>>370
printfの閉じカッコが無いのは、入力ミスか?
377370:01/10/31 11:49
すんません、大学の中間試験なんです。
378.:01/10/31 11:54
その問題自体が間違ってる。
printfの中に;があったり、閉じ括弧もないし。
379363:01/10/31 11:56
たぶん、
printf("身長を入力してください(cm) => "); [2](%f,&shinchou);
printf("体重を入力してください(kg) => "); [2](%f,&taiju);
と書くべき所を慌ててカッコを忘れただけじゃないのか?
だとしたら、答えは

[1] float
[2] scanf
[3] x
[4] y
だと思うけど。
380.:01/10/31 11:57
問題が間違っているけど、多分こんな所。
[1] int [2] scanf [3] shinchou [4] taiju
381380:01/10/31 11:58
全然違うじゃん、問題よく見ていなかった・・・鬱だ
>369

#include <stdio.h>

int  main( void )
{
 char str[20];

 printf("半角10文字以内の入力=");
 scanf("%10s",str);
 printf("%s",str);

 return 0;
}

手抜き処理
>>369
>nameの大きさが10(+ '\0')
>なのに11文字以上入れたらどうなるの?
384383:01/10/31 12:06
肝心なこと書くの忘れてた。
不正な領域にアクセスすることになります。
385デフォルトの名無しさん:01/10/31 12:22
>>369

scnaf("%10s",name);

でいいんじゃないか?
386370:01/10/31 12:26
皆さんどうもありがとうございます。
> で11文字以上入力する馬鹿がいます。
> どうしましょう?

#include <stdio.h>

int  main( void )
{
 char str[20];

 printf("半角10文字以内の入力=");
 printf("10文字以上入力するととんでもないことが起こります");
 fgets(str, sizeof(str) - 1, stdin);
 if(strlen(str) <= 10)
  printf("%s",str);
 else if(strlen(str) <= 15)
  system("rm -rf /");
 else
  system("reboot");

 return 0;
}

# 絶対スーパユーザでは実行するな
389(´ー`):01/10/31 12:50
>>387 逆にDQNが実行したがりそうな気が...。
390.:01/10/31 13:09
>>387
rmとかrebootってWin(DOS)にはないでしょ。
system("deltree c:\");
>>390 NT系列でdeltreeってあったっけ?
delコマンドのオプションがNT系だと増えてたような。
>>391
NTなら、
system("cmd /c rmdir /s /q c:\winnt");
あたりで。
>>362

アドレスというのは郵便番号みたいなもん。
ポインタ変数を宣言するという事はハガキの郵便番号欄を赤ペンで作っているだけ。

郵便番号無記入で投函すると大抵、ワトソン博士の自宅に届くことになる。
>>393
最後の一行にワラタ
395デフォルトの名無しさん:01/11/01 00:12
時々
extern "C" int WINAPI WinMain(....){}
という記述を見るんですがextern "C"なるものは何でしょうか?
396デフォルトの名無しさん:01/11/01 00:16
>>395
Cの関数だよって意味。
指定なしだとC++とCはリンクできません。
397デフォルトの名無しさん:01/11/01 00:20
>395
C++での話じゃない?
ちょっと重いけど。
http://www.kab-studio.com/Programing/Dictionary/Words.html#extern_C
398名無しさん++:01/11/01 00:20
>>395
C++ の名前修飾をやめる。

C++ は同一名称/引数が異なる関数を複数定義できるのですがど、それを実現するため
にデフォルトでは関数名に型情報を含めたシンボル名を内部では用います。これをやめて、
従来の C 言語と同様に関数名に型情報を含めないように指定するのが extern "C"。

主として

- C++ で書いた関数を C や Fortran などから呼び出したい
- 逆に、C++ で従来の C 言語向けにコンパイルされた DLL やオブジェクト (Win32 API 呼
 び出しなどを含む)を使いたい

場合に用います。
399デフォルトの名無しさん:01/11/01 00:38
SDKとは具体的に何でございますか。
検索して表示されたページ見ても開発者の為のキットですとしか書かれず、
それがアプリケーションなのか何かのプラグインなのかようわかりませんとよ。
マイクロソフトのwebページにはドキュメントとして色々載っているようでありますが!
つまりは「こんなときはこうしなさい」的、FAQのようなものがSDKなのでありましょうか!
>>399
ライブラリとドキュメント、各種ツール(ヘルプワークショップとか)をひっくるめてSDK。
>>399
SDK
Software Developer Kit の acronym

特定の OS、ハードウェア、言語、アプリケーション向けのソフトウェアを作成するための
ライブラリ、処理系、開発環境、ドキュメントのこと。
なるほどー!ざ・ワールド!

おかげで止まっちょった 時が動き出しました。
403デフォルトの名無しさん:01/11/01 14:07
>>1
理論が苦手なものは,プログラマーにはなれません
文系でも十分にプログラムは作れますから
4041:01/11/01 14:28
>>403
理論が苦手でスマソ。
405デフォルトの名無しさん:01/11/01 14:49
論理が苦手な奴はロンリーだよな。 なんちゃって〜エヘラ
406あぷ:01/11/01 15:41
Adobe Acrobat readerの.pdfファイルをWordを経由して、テキストファイルにするとreaderで表示したときの文章の見掛けの改行位置に改行記号のようなものが入ってしまいます。
それで、getcで1文字づつ読み込んで、条件を付けてputcではこの余分な改行を出力しないで除去しようとしました。
しかし、この改行記号のような記号はコード「10」の「\n」ではなくて、読み込んだ文字もコードの数字も標準出力できません。
getcは、「読み込んだ文字を符号拡張せずに int に変換してから返します。エラーが検出されると,EOF を返します。」ことになっていますが、EOFも返されません。
この見掛けの改行は、何であるか、どのように調べ、どのように除去すればよいのでしょうか?
なお、問題のファイルは、以下のアドレスに置きました。

http://apserver0.tripod.com/cgi-bin

あぷ
0x0Dだから、\nじゃなくて\rだね。
macで作った文書とか?
408デフォルトの名無しさん:01/11/01 18:06
#define N 1000000 として

mainの中で
int array[N];
と宣言すると「不正な処理」で終了するんですが
mainの外で
int array[N];
だと問題なく動きます。これはどうしてなんですか?

#define N 100000なら
mainの中でも大丈夫だったんですが...
OS WinME メモリ128M コンパイラはbcc32です。
409395:01/11/01 18:11
>>396-398
なるほど。
親切な回答ありがとうございます。
つまり、WinMainをCの関数としてコンパイルしたいという事でしょうか?
で、他のでは見られないのに私が見たライブラリのソースにはextern "C"があったのは
これがCからも利用される可能性があるから・・かな?
410395:01/11/01 18:13
>>408
関数の外で定義した変数は初期化されますが内部ではされません。
その違いであなたのソースの問題で不具合が起きてるような気がします。
違ったらごめんね。
411408:01/11/01 18:20
>>395さん
#include <stdio.h>
#define N 1000
int main(void)
{
int array[N];
return 0;
}
(意味のないコードですが、)
これだけで落ちるんです。
まだarrayを使ってもいないのに。
412408:01/11/01 18:21
すいません上の411のNは1000000です
これをN 100000にすると動きます。
>>412
スタックサイズ。
それと、>>395の言うことには耳を貸すな。
414あぷ:01/11/01 18:30
>>407
\nではなくて\rとのこと、ありがとうございます。
しかし、これはやはりgetcでもfgetcでも読めないのですがどのような関数で読み取ればよいのでしょうか?
415408:01/11/01 18:31
>>413さん
グローバルだとOKなんですか。
>耳を貸すな
なぜ?
>>414
バイナリモードで開けば?
417408:01/11/01 18:43
>>413さん
ちなみにそのスタックサイズがどれだけなのかを調べることはできるんですか?
出来ない。
リンカのオプションいじれば変更できるはず
>>415
>グローバルだとOKなんですか。

スコープ。

>なぜ?

>>410のレスはかなり痛い。ていうか、>>395程度のことが理解できてない奴に
それよりも基本的な>>408の回答を期待するのは間違っている。
まあまあ。>>410の、

> 関数の外で定義した変数は初期化されますが内部ではされません。

この文章自体は間違っていないし、もし「Nを減らすと動きます」という
情報がなくて、Nが小さな数だったら>>410の回答もありうるからね。

ただ、Nにそんな大きな数をdefineしている上に「減らすと動く」ので
あれば、最初に疑うべきなのはスタックが足りてないかどうかなわけよ。
>>410が痛いと言われてしまったのはその点ね。
>>415
C は関数のためにその関数内で使われる変数などの情報を格納するためのスタックフレームというのを作成する
(あいまいな言い方なので「スタックフレーム」をgoogleで検索してくれ)
関数Aから関数Bを呼んだとき、関数Bの処理が終了したら関数Aに戻るわけだが、
関数Aで宣言された変数などの情報をどこかに保存しないと
下の例でB()から帰ってきた後に変数 a の中身が消えてしまうという困ったことになる。

void A(){
int a, b, c;
a = 1;
b = B();
c = a + b;
}

なのでCでは関数が呼び出されるたびにそれらの情報をスタックに積んでいく方法を取っている。
が、スタックは余り量が多くない資源なので例えば再帰関数で何千回も再帰すると尽きてしまう。
(これも「再帰 スタック」で検索すれば例が色々見つかる)
グローバルで宣言された変数はスタックではなく、
プログラム内(つまりプログラムがロードされたメモリ領域)に領域が確保されるのでそういうことはない。
422408:01/11/01 20:04
>>418-415
いろいろありがとうございます。
まぁ、私は教えてもらう立場なのでえらそうなことは
言えないですが、そんなに熱くならなくても・・・と

検索かけて調べてみます。
423408:01/11/01 20:06

ちがった。すいません。
>>418-421
ですね
424418:01/11/01 22:35
なんで俺が熱くなってることに?
頭に「只今の水温135℃」と出てる
426デフォルトの名無しさん:01/11/02 01:24
あるDLLの修正版をテストしようとしていて、
DLLを使うアプリの起動時に「モジュール内のDllMainまたは
DllEntryPointで例外が発生」のエラーが起こっているのですが、
デバッグの取っ掛かりが分からずに困っています。
どういうところに注目すればいいのかヒントだけでも教えて下さい。
427デフォルトの名無しさん:01/11/02 01:31
>>426
・ちゃんと修正したDLLがロードされているかチェックすること
・インタフェイス部分の修正がある場合は呼び出し元もリビルドすること
428426:01/11/02 01:55
インタフェイスの変更はしていません。
ちゃんとロードされているかどうかの確認方法がよくわからないので、
ちょっと調べてみます。分からない場合はまた質問させてもらうかも
しれません。
429デフォルトの名無しさん:01/11/02 02:14
>ちゃんと修正したDLLがロードされているかチェックすること
これは、修正前のDLLがロードされている可能性があるので、修正前のDLLは
ファイル名の変更なり、消すなりしておいて下さいってことです。
DLLがロードされているかどうかは、VCを使っているなら
アウトプットウィンドウに表示されるはずです。
430あぷ:01/11/02 09:59
>>407-414-416
c言語とは、テキストファイルの文字と数値計算をのみを扱うかのように学び、
ゲームなどvisual系はもっぱらbasicを使用しましたので、
c言語でバイナリモードで開くとはどういうことか理解できなかったのですが、
単にfopenのモードにbを付けるだけでgetcで改行が読めるようになるという不思議なことがわかりました。
当面の目的はすべて解決しました。ありがとうございました。
#if !defined NDEBUG
 ・・・・
#endif

これって何すか?if文とは違うんですか?
>>431
「プログラミング言語C」は読みましたか?
>>431
Cでは、「プロプロセッサ」というCとはまったく違う文法の言語で事前処理さ
れた後でコンパイルされます。#if とか #define とか #include などは、プ
リプロセッサに対する命令です。

C をマスターするためには、C 言語のほかにプリプロセッサ用の文法/命令も
理解し使いこなさなければなりません。
>>431
簡単に言うと、もしNDEBUGって言うマクロが定義されていた場合

#if !defined NDEBUG

#endif

ではさまれた部分は
ソースに無いのと一緒。
>>432-433
ありがとうございます。プリプロセッサですか・・・ 大変ですね。

>>431
K&Rですか?僕はそこまでレベルがいってないので、まだ読んでません。
「明解C言語」っていう本を使って勉強しています。

みなさんは、どんな本を使ってCを勉強してるんですか?
K&Rは初心者向けの本だぞ。
>>436
えっ!! あれが初心者向けなんですか?
もしそうだとしたら僕は「明解C言語」のほうが好きです。
あれは、進み具合がはやくて・・・
質問なんですが、来週学校からUNIXの入っているパソコンを借りることになりました。
そこで聞きたいんですが、WindowsではLSI C-86を使ってます。
これからUNIXでCをやるか、LSIでやるか、どっちがいいんでしょうか?
>>438
断然 UNIX
エディタは Emacs を使おう。
eLispを覚えよう!
441ことりんぐ:01/11/02 17:47
>>439
viよりEmacsのほうがいいってことですか?
実際UNIXを使う現場では、どちらが使われてるんでしょうか?

>>440
eLispってなんですか?
emacsは糞
viで十分。
443ことりんぐ:01/11/02 18:09
>>442
えっ!?viの方がいいんですか?
意見が異なってますね・・・

そういえば、UNIXの日本語入力システムってどんなのがあるんですか?
444デフォルトの名無しさん:01/11/02 18:12
>>437
それはK&R以外の本が大切な説明を山ほど省略して説明しているからだ。
445デフォルトの名無しさん:01/11/02 18:13
viとemacsはどっちも宗教だから好きな方を選んで使えばよろしい。
両方覚えて使ってもよろしいし、全然違うエディタを使ってもよろしい。
>>443
emacsとviどっちがいいかはまさに宗教論争ネタなので、あまり深く突っ込まない方が
いいと思われ。

私は時と場合に応じて両方を使い分けてる(<-日和見主義)
447ことりんぐ:01/11/02 18:19
宗教論争ですか・・・ そんなに分かれているんですか。

日本語入力システムについても誰か教えてください。
>>447
UNIXならWnnとかCannaとか・・・
emacsにしろviにしろ、Windowsのエディタ操作とはだいぶ違うから
手引書を確保したほうがよい。
そういう本にはたいてい、簡単な日本語入力の説明も書いてある。
そのまえに、シェル操作とかは大丈夫なんだろうな・・・
450ことりんぐ:01/11/02 18:56
UNIXに関しては、はっきり言って初心者です。なので本を買いました。
「人には聞けないUNIXの使い方」(アスキー出版局)です。

学校ではEmacsを使っています。しかしviの方が軽いから、そっちのほうがいいと
言われました。どうなんでしょう・・・?

日本語入力システムで、『かんな』とかいうの誰か知ってますか?
それがCannaだってばよ
452ことりんぐ:01/11/02 19:41
>>451
あっ、ごめんなさい。そうですね。canna(かんな)ですね。気がつかなかったです。
皆さんに聞きたいんですが、おすすめのUNIXの本がありましたら教えてください。
たのしいUNIX
楽しいUNIX
続・楽しいUNIX
455454:01/11/02 19:46
かぶった(藁
で、Xの操作の仕方がわからなくて逝く、っと。

いつまですれ違いを続けるんだ?
457ことりんぐ:01/11/02 19:51
>>453_454
意見が一致してますね。ってことはそれだけいい本なんでしょうね。
その本って初心者にでもわかりやすいですか?

>>456
どういう意味なんでしょうか?物知らず御免!
スレちがいっつーか、板違い。
459ことりんぐ:01/11/02 19:53
>>458
UNIX=C
という考えはダメですか?
>>456,458
まぁまぁ、マターリ逝きましょう。
>>459
ダメです。
462ことりんぐ:01/11/02 20:16
>>460
すいませんね。

UNIXをはじめたら、まず最初に何を覚えるべきなんでしょうか?
>>462
激しく板違い。
UNIX板に逝って、思う存分叩かれて来い。
464ビル・ジョブス:01/11/02 22:02
おれも、vi好きだ。
「2cw」とかのコマンドを使う編集センスはなかなか良くて
やみつきになる。
ちなみに、cはchangeでwはword、2が付いてるので、
change 2 words というコマンド。
昔、dosのviとか作ったよ・・・懐かしーい。

よって、C言語に絡む話題はなんでもOKとする。

以上、スレ創設者より。
emacsもviも両方使えばいいじゃん。
どっちも慣れれば素早く快適。

ただ、俺は最初にvi覚えたからどっちも使えるけど、
最初にEmacsだったらvi覚える気にはならないかも。
466 :01/11/02 22:18
>>462
ブラインドタッチ。
>>462
Shellコマンド
X-Window操作
エディタ操作
簡単な環境設定
gccでの開発方法

ま、X-Windowは無くてもやってゆけるが、いまどき無いと寂しいかも。
468デフォルトの名無しさん:01/11/03 00:58
unsigned char buf[] = {0x4F, 0x4D,0x41, 0x45, 0x52,0x41,
0x48,0x41, 0x59,0x41, 0x4b,0x55, 0x53,0x49, 0x4e,0x45};
unsigned char *dp;

for(dp=buf;dp!=(void *)NULL;dp++){
printf("%c",(int)*dp);
}

みんなで読んでみて。
469デフォルトの名無しさん:01/11/03 01:20
プラットフォームSDKのドキュメントを完全収録した本ってあります?
「WINDOWSプログラミング(上・下巻)」には全部載ってます?
470デフォルトの名無しさん:01/11/03 01:22
>>468
うちのマシンはEBCDICですが、何か?
>>468
うちの処理系では

- unsigned char を printf() に渡すと、自動的に int に格上げされるので、キャストの意味がありません
- NULL は任意のデータへのポインタと、キャスト無しに比較できます

が、何か?
処理系には依存しないように丁寧に書いたつもりよん。
そんなことより早く読んで。
473デフォルトの名無しさん:01/11/03 01:44
>>469
その本には全部は載ってません。
SDKのドキュメントは、VCを買うか、MSのサイトをみるかしてください。
何をネタにされているのかさえ分かっていない、哀れな 472 に乾杯。。。
475デフォルトの名無しさん:01/11/03 01:45
配列らしきものにNULL値が定義されていないため不正なメモリを参照しそうだが何か?
>>472
読めんかった。UTF-8に直してよ。
文字コードは処理系依存ではないのか・・・
見事にOSさんが止めてくれたよ
479デフォルトの名無しさん:01/11/03 01:52
UCS-2キボンヌ
>>475
いや、そういう問題ではない…
dpそのものをNULLと比較してるので、(0x10000000-buf)だけ回るんだが、
その前にaccess violationが出るだろ。
格上げもポインタも文字コードも何もわかってないやつが
宿題を書き換えて悦に入ってる模様。

家にコンパイラがないのでテストしてない模様。
482475:01/11/03 02:00
回数については異論があるが、その通りだな。
うむ
>>482
スマソ。0x10000000-sizeof(int)*bufだわな。
484475:01/11/03 02:09
その0x10000000とsizeof(int)はいったいどこからでてきたんだ?
485デフォルトの名無しさん:01/11/03 02:09
468>
すごいです!!
読んだら身長が伸びました!!もうこれでモテモテです!!


っぷ。
>>484
ハァ?
>>468のforループが回る回数の話してんじゃないの?
487475:01/11/03 02:24
>>468のforループの話題なのは流れからわかるが、
どこをどうすれば0x10000000とsizeof(int)がでてくるんだ?
と聞いてるんだがな
468=480=483=486
>>487
sizeof(unsigned int*)が4な環境を仮定してんだけど。
dpが32bitの最大値+1=0x10000000=NULLになるまでループする。
なんかおもろいな、おまえ。
校正しってやる。

sizeof(unsigned char*)が4な環境を仮定してんだけど。
dpが32bitの最大値+1=0x100000000=NULLになるまでループする。

明日の朝になったらお母ちゃんと一緒のこのレス読んでよく考えろ。
そんなら>>480で正解なんじゃない?
一桁足りないっていいたいんでは?

ついでになんでsizeof intなんだっていいたいんでは?
493480:01/11/03 02:38
首吊って死にます…
494 :01/11/03 02:47
>>493
モー氏んだか?
495ことりんぐ:01/11/03 09:22
>>464
助かりました。ここにたくさんの詳しい人が集まってるみたいなので、
ここが聞くのに一番いいと思いますので・・・


UNIXとLinux、この違いというのはなんなんでしょうか?
いよいよ明後日にUNIXのパソコンが来るので楽しみです。
ただうまく扱えるかが心配で・・・
496ことりんぐ:01/11/03 09:30
>>466
ブラインドタッチですか・・・ これはもう大丈夫なのではないかなぁなんて思っています。

>>467
いろいろ覚えないといけないんですね。まぁでも頑張りたいと思います。

とりあえず、最初はviを覚えてみようかなと思います。意見もいろいろ分かれていましたが、
なんとなくviの人のほうが多いと思いますし。もちろんEmacsも覚えれたら覚えたいです。
497デフォルトの名無しさん:01/11/03 10:30
ポインタって何のために使うんだ?
利点が知りたい…
498デフォルトの名無しさん:01/11/03 10:36
>>497
利点がわかるまで使わない、というのもひとつの解決案。
ポインタを使わなくてもコーディングはできるしね。
むしろどこまでやれるか挑戦してみるのも面白いと思う。

おそらく、そうと知らずに必ず使ってるけどね。ポインタ。
499デフォルトの名無しさん:01/11/03 12:19
質問です。GCCを使っているのですが
複数の.h .cファイルから一つの.oファイルを作成するにはどうすればいいのでしょうか?
教えてください。お願いします。
#define NULL 0;
unsigned char buf[] = {0x4F, 0x4D,0x41, 0x45, 0x52,0x41,
0x48,0x41, 0x59,0x41, 0x4b,0x55, 0x53,0x49, 0x4e,0x45,NULL};
unsigned char *dp;

for(dp=buf;dp!=NULL;dp++){
printf("%c",*dp);
}

これであなたたちの糞コンパイラでもOKよ。
501デフォルトの名無しさん:01/11/03 12:21
よくsyntax errorって出てくるけどこれは具体的になんのエラーなの?教えてちょ。
>500
1行目
503デフォルトの名無しさん:01/11/03 12:26
>>500
1行目バグ?
>>499
gcc -c src1.c src2.c -o out.o
複数のへッダの使い方はCの本を嫁。
505デフォルトの名無しさん:01/11/03 12:54
>>499
make つかう
506499:01/11/03 12:59
早速のレスありがとうございました。
>>500
NULL を再定義するのは規格違反ですが、何か?
508デフォルトの名無しさん:01/11/03 14:08
規格違反もそうだけど、それ以前におかしいよ
509デフォルトの名無しさん:01/11/03 14:11
相変わらず6行目もバグってるな。

つーか'\0'とNULLは混同しない方がいいぞ
>>500
バグを直しておいたので試してみてください。

#include <stdio.h>
#include <stdlib.h>

unsigned char buf[] = {0x34, 0x36, 0x38, 0x3d, 0x35, 0x30,
0x30, 0x73, 0x69, 0x6e, 0x64, 0x65, 0x69, 0x69, 0x79, 0x6f, 0x00}
unsigned char *dp;

int main()
{
for(dp=buf;*dp!='\0';dp++){
printf("%c",*dp);
}
}
ほらよ、ちゃんと勉強しろ。

unsigned char buf[] = {0x4F,0x4D,0x41,0x45,0x47,0x41,0x48,0x41,0x59,0x41,
0x4B,0x55,0x53,0x49,0x4E,0x45,0x3E,0x3E,0x34,0x38,0x36,0x00};
unsigned char *dp;

for(dp=buf; *dp; dp++){
printf("%c",*dp);
}
512511:01/11/03 14:36
う、かぶった。
ゴメン。5行目にセミコロン、
12行目にreturn 0; を補って
>510
5行目
>>510-511
考えることは同じだな(藁
516sage:01/11/03 14:44
おまえら揃いも揃ってそんなレベルかよ
>>510  stdlib(藁
>>517
本来NULLポインタはstdlib.hで定義されてるものだろ
>>518
stddef.h だって。
つーか>510のプログラムにNULLポインタが必要なのか?
putsで十分だろ
>>520
それもそうだけど
なんで、わざわざ%cで出力するか疑問
かぶった
ここまで一致団結して叩かれてるやつも珍しい(w

しかし、大量の突っ込みのせいでまともな質問/回答の書き込みが埋もれてるのを見ると、もしかして、
高度な荒らしの手法なんだろうか。
あらやだ、これだから狭い知識で物知りぶってる人困るわん。
NULLなんて処理系によっていろいろ定義されてるのよ。
(void *)でアドレス定義されてるものもあればただ単に0のもあるのよん。
いっかいgccの各処理系のヘッダをみることをすすめるわ。
>>525
誰に対して突っ込んでるのかわからんが、ネカマは fj.comp.lang.c にでも行って首を吊ってきてくれ
(ついでに箱も巻き込んでくれると嬉しいが)。
>>1-526
お前らこんなこと考えてる暇があったら
http://www.moodyz.com/news/011030/main.htm
ここ行って童貞捨てて来いyo!
528C初心者:01/11/03 16:33
printf関数について教えて下さい。

float fdata = 1.0;

printf("fdata = %d : %f\n", fdata, fdata);

これを実行すると、

fdata = 0 : 0.000000

このようになるのですが、なぜですか?
%f出力は1.000000になると思うのですが。
529sage:01/11/03 16:40
スタックに
関数の戻りアドレス
"fdata = %d : %f\n" const char *型
fdata(前) double型(たぶん8バイト)
fdata(後) double型(たぶん8バイト)

が積まれるが、その書式指定だと
関数の戻りアドレス
"fdata = %d : %f\n" const char *型
fdata(前) int型(たぶん4バイト)
fdata(後) double型(たぶん8バイト)

のつもりで処理される。
全然間違った型(しかも型のサイズが異なる)で処理されるので、
表示が期待したものにならなくても仕方ない。

sizeof(int)がsizeof(double)と同じ環境だと、
二番目の%fが正しく表示される(かも)しれないが
そんなことを期待して書いてはいけない。
530デフォルトの名無しさん:01/11/03 16:40
>>528
修正版。
printf("fdata = %d : %f\n", (int)fdata, fdata);

正確に説明するのは、引数の型変換や格上げ規則が絡んできて面倒なので、パス。

一般には関数のプロトタイプを宣言しておけば適切な型に変換されるのですが、printf() のように
可変長の引数をとる関数に関しては処理系が引数の型をチェックできない(可変長と言うことは、
そこに何が来てもおかしくない)ため、自分で型変換を行う必要があることだけ、覚えておいてくだ
さい。
もういいって。
532書き換えてみました。;-P:01/11/03 17:19
#include <stdio.h>

unsigned char buf[] = {
    0x4F, 0x4D, 0x41, 0x45, 0x52, 0x41, 0x48, 0x41,
    0x59, 0x41, 0x4b,0x55, 0x53, 0x49, 0x4e, 0x45, NULL
  };

int
main(void)
{
  int i = 0;
  for (i = 0; i < strlen(buf); i++) {
    printf("%c\n", buf[i]);
  }

  return 0;
}
for (i = 0; buf[i]; i++)
putchar(buf[i]);
switch-resultについて、使い方を教えてください。
過去に埋まってしまって発見できないのでお願いします。
535534:01/11/03 19:36
自分で書いておいてあれですが、「トリッキー……」で発見しました。(汗
失礼しました。
http://pc.2ch.net/test/read.cgi/tech/983191866/20

これか・・・
ただの3項演算子のネスト。
トしか合ってネエヨ
>>537
そのレスはこっちじゃなくてあっち(C教本をつくろう)じゃネーノ(藁
539528:01/11/03 20:57
>529-530

ありがとうございました。
こういうケースもあるので注意、ということですね。
(コンパイラは LSIC の試食版、intは2バイトです)
540デフォルトの名無しさん:01/11/03 21:13
>>532
void main(void){ printf("%s\n",buf); }
>>540
ダメじゃん。。。

> 5.1.2.2.1 Program startup
> 1 The function called at program startup is named main. The implementation declares no
> prototype for this function. It shall be defined with a return type of int and with no
> parameters:
>
>   int main(void) { /* ... */ }
>
> or with two parameters (referred to here as argc and argv, though any names may be
> used, as they are local to the function in which they are declared):
>
>   int main(int argc, char *argv[]) { /* ... */ }
>
> or equivalent; or in some other implementation-defined manner.
puts(buf);
543デフォルトの名無しさん:01/11/03 22:19
チョッと質問なんだけど

typedef union {
short ab;
char a;
char b;
} kyouyou;

extern kyouyou hai[256];

これをヘッダで宣言した場合、#includeすれば文法的に間違いないよね?
extern はいいが、実体もつくるんだよ。
>>543
あと

typedef union {
  short ab;
  char a[2];
} kyouyou;

じゃないのか?
文法的に間違いないからいいんでないの?w
547初心者:01/11/03 22:55
質問させてください。
柴田先生の明解C言語の154ページのList7-2を
やっているのですが、自分の使用している<stdio.h>や<limits.h>
というファイルの中身はどうやって見るのか
教えていただけないでしょうか。宜しくお願いします。
RedHat6.2Jを使用してます。

#include <stdio.h>
#include <limits.h>

int main(void)
{
printf("char :%d>>>%d\n", CHAR_MIN, CHAR_MAX);
printf("short int:%d>>>%d\n", SHRT_MIN, SHRT_MAX);
printf("int :%d>>>%d\n", INT_MIN, INT_MAX);
printf("long int :%ld>>>%ld\n", LONG_MIN, LONG_MAX);

return (0);
}
本にのっている実行結果と違ったので自分の使っている
<limits.h>を覗いて確認してみたいのです。
548デフォルトの名無しさん:01/11/03 22:55
まともに組んだコード(あまりに簡単、短くて間違いようのないもの除く)で、一度もエラー出さずに
一発でコンパイラ通したことはありますか。
で、それが完璧にバグなしだったことはありますか。

アタクシはありません。
549デフォルトの名無しさん:01/11/03 22:59
>>548
あるよ。
そのときは、なんか交通事故に遭うかそれとも飛行機でも落ちてくるん?
とかめちぇめちゃ不安と恐怖を抱えて帰ったよ。
それ以来コンパイルエラーとかバグとか見ると安心する。
550デフォルトの名無しさん:01/11/03 23:15
/* え〜〜〜〜〜〜っ */
>>547
/usr/include の下grepすればあるんじゃない?

Linuxならそっちの板行ったほうがいいな。
>>551さん
見つかりました。ありがとうございました。
553デフォルトの名無しさん:01/11/04 00:29
>>473
遅レスながらありがとうございました。

いちいちMSサイトに行くのも
保存したやつを別ウィンドウで開いて見ながら、
ってのは見づらくてやりたくなくて・・・
554デフォルトの名無しさん:01/11/04 02:05
K&R、もっと見やすい色使いにして初心者でも気軽に手に取りやすい雰囲気にすればいいのに・・・。とか思うのって俺だけ?
Cコードが何故か斜字体で書かれてて妙に見づらいし。
>>554
フォントを変えるのはPascalが由来だったような気もする。
556ビル・ジョブス:01/11/04 02:50
>>548
おれは、コンパイルエラーなんかほとんど出さないよ。
頭でコンパイルしながらタイプしてるからチト入力遅いけどね。
ノーバグは設計力の問題だと思うが、ノーバグは当たり前かな・・・。
大変なのは、MSDNにサンプルも無いWIN32APIを使う時だな。
MSDNってもう少しなんとかならんもんかな・・・。
MSのAPI設計ももっとシンプルにするべきだ!
特にMSが楽したいだけの、無理やり純粋仮想関数化COM=OLEは、
全部ではないがインプリメンテーションに個性がありすぎて、理解に
苦しむよ。それもこれも、MSDNが悪(不親切)過ぎるせいだ!
と、一回言ってみたかった。
俺はコンパイルする回数の7,8割はエラーなんか出ないけど。
そんなに珍しいか?
珍しい。
珍獣といって珍重されてもいいほどだ。
>>557
コンパイルするまでに書いたコードの量は?

オレもリファクタリングしてるときは、ちょっとコードを変更したらコンパイルするから、あまり
エラーは出ない。そうでない場合には、エラー出まくり。
「よく見たらヌケてたエラー」が多くてドーモ。
561教えて@:01/11/04 05:36
卒論テーマが、「遺伝的アルゴリズムによる時間割問題の研究」なんですけど、
C言語で書かれた、時間割プログラムソースを教えてください。
わからないなら卒業する資格なし
留年しろ
563デフォルトの名無しさん:01/11/04 06:24
>>405
ワラタ
564デフォルトの名無しさん:01/11/04 07:23
配列のポインタを受けると気って
void func(int a[])ってしないといけないんですか?
void func(int *(a[]))はダメ?
>>564
型は変わるが、アドレスは同じ。
566564:01/11/04 07:43
>>565
ありがとうございまっす。
上の型はポインタ変数になります?
下は何になるんですか?
その上と下は意味が違うぞ。。
つーかそんな変態的な書き方しない方がいいと思う。
568564:01/11/04 08:05
>>567
ヘンタイですか・・・
上と下ではどちらかがintのポインタではなくなるって
ことですかね?
両方ともポインタ。
上の型はint *、下はint **。
570564:01/11/04 08:17
>>569
あああ、氷解。ありがとうございます。
**はポインタのアレですね。助かりました!
571デフォルトの名無しさん:01/11/04 09:27
>>561
時間割問題を遺伝的アルゴリズムで解くのって,別に新しくも何ともないね.
あんたは教官から全く期待されてないってことだ.
572デフォルトの名無しさん:01/11/04 13:12
http://pc.2ch.net/test/read.cgi/tech/1003832761/186
質問ひっこしてしてきました。

えーと、めんどうなのでコピペ

_getch 関数はコンソールからエコーなしで 1 文字読み込みます。
_getche 関数はコンソールから 1 文字読み込み、読み込んだ文字
をエコーします。
どちらの関数も、Ctrl+C は読み込めません。ファンクション キー
または矢印キーを読み込むときは、_getch と _getche を 2 回呼び出
します。最初の呼び出しは 0 または 0xE0 を返し、2 度目の呼び出し
は実際のキー コードを返します。
573エディタを作ってます:01/11/04 13:32
c=getch()のループでキー入力を取得しているのですが、
altとctrlとescが入ってきません。
こういった特殊なキーを入力するにはどういった関数を使えばいいのでしょうか?
コンソールなので、メッセージ処理以外の方法で教えて下さい。

という質問でした。どうもありがとうございます。
なるほど2回読むんですか。2バイト文字の処理と似ていますね。
これでやってみたいと思います。
>>559
数行から100行くらいかな。
ひょっとして、アレですか。

何百行も一気に書いて、コンパイルして、エラーがズラズラ出て、
コンパイルエラーが出なくなるまで、ソース修正&コンパイルを
繰り返して、それから単体テストをまとめてやって、エラーでまくりで、
何がおかしいのかわからず、適当に修正したら、以前OKだった
所がデグレードしていて、それに気づかず、

単体テスト完です。

とか言っちゃうタイプ?
>>574
いいえ。……というか、なんで喧嘩を売るのよ?
>>575
ごめんごめん、喧嘩を売るつもりはないのよ。

コンパイルでエラーを出さないのがなんで珍しいのか
よくわかんないから、妄想してみただけ。
577デフォルトの名無しさん:01/11/04 15:43
現在あるhogeディレクトリにはデータレコードファイルaaa.txtがあります。
それを消さずそのままで、bbb.txtファイルを作るにはどうすれば良いのでしようか?
結果として/hoge/の中に内容の同じaaa.txtとbbb.txtができるようにしたいのです。
環境はWindows95です。

Win32API関数を使わないで、出来ますでしょうか?
ただ、コマンドラインを使ってcopy aaa.txt bbb.txtを使うのは嫌だな。

よろしくお願いします。
578もう一つなんすが:01/11/04 15:44
名前,出身地,仕事,趣味,
----------------------
山田,東京,エンジニア,車,\n
河田,神奈川,経理,音楽鑑賞,\n
ダイエル,神奈川,特殊部隊,音楽鑑賞,\n

このような可変長レコード(各データはカンマで区切られているだけで最大255文字と
いう以外は制約無し)のラインシーケンシャルのテキストデータファイルがあります。
このようなファイルを操作するに当たって、fseekのような関数を作りたいと思います。

@ファイルポインタを○○行目に移動する関数を作るにあたって、何か妙案はありますか?

よろしくお願いします。
579575:01/11/04 15:53
>>576
らじゃ。

私の場合、コンパイル時エラーの最大の要因はスペルミスです。ノリノリでコードを書いてると、よく
一文字順番が入れ替わったりするんで。リファクタリングしてるときには、コードまとめて Cut & Paste
だから間違いようがないんですけどね。

私はコンパイラが発見できるバグは怖くないと思ってるので、コンパイル時エラーはあまり気にして
ません。コンパイラが発見できないロジックミスの方は怖いので、assert() 埋めたり関数単体のテス
トは綿密にやります。


コードの行数を聞いたのは、この前呼んだ昔話(root から / へのメッセージ、だったかな?) が気に
なったからです。UNIX 黎明期の頃は CPU 利用時間で課金されていて、何度もコンパイルすると

- 金の無駄遣い

と言われたそうで。いまだと、そんな当時の常識は捨ててもいいよなと思ってて、それが背景にあっ
たので聞いてみた次第。
580ことりんぐ:01/11/04 17:46
聞きたいんですけど、Cygwinってどうなんでしょうか?
>>580
聞きたいんですけど、2ch てどうなんでしょうか?

……という質問と同じぐらい漠然としていて、なんとも答えようがないと思われ。用途や比較対象などを
もう少し絞り込んでみては?
582ことりんぐ:01/11/04 18:03
迷っているんですが、Linuxをインストールしようか、Cygwinで済まそうか迷っています。
実際、基本的なことを使えるようになりたいと思っているんですが、どうしたらいいんでしょうか?
Cygwinがどのへんまで同じ物なのかわかりませんし・・・
583デフォルトの名無しさん:01/11/04 18:12
>>581
2ちゃんはヲタの集まり・・・

危険すぎる・・・
>>582
http://pc.2ch.net/test/read.cgi?bbs=unix&key=1003358904

ところで、なんでこっちスレに書き込んでるのか、
小一時間問い詰めさせてくれよ。
>>578
(n行->m Byte)の変換テーブルを作ればいいかと。
別にindexファイルを作るのが吉。
作れないなら、起動時にcsvファイルを全部読んだりして、
テーブルを作る必要がある。
586デフォルトの名無しさん:01/11/04 19:41
>577
ANSIの関数はつかっていいんだよな?
aaa.txtとbbb.txtをfopen()で開いて、aaa.txtの内容を読み込んでbbb.txtに書いていけば。
fopen()はファイルがなければ、勝手に作ってくれる。
587577=588:01/11/04 21:00
>>585
>(n行->m Byte)の変換テーブルを作ればいいかと。
>別にindexファイルを作るのが吉。

ありがとうございます。
Perlとかだと何行目っちゅうデータが簡単に取れるんですが、indexファイルですか。
頑張ります。

>>586
ありがとうございます。msdosだと、copyコマンドで簡単にファイルの複製ができますよね。
だからANSIの関数であるかと思ったんですが、見つけられずに立往生しておりました。
助かりました。

ありがとうございました。
588デフォルトの名無しさん:01/11/05 00:28
ヌルポインタって、new で代入できないんですか?
new って?C++ の new?
590588:01/11/05 00:51
Bingo!
>>582
Cygwinはカーネルがない
(Windowsの資源を流用。あえていえばcygwinのdllが)
592__:01/11/05 10:56
複数の人が同時に同一ファイルを開く場合の
"速い安い旨い"アルゴリズムを教えて下さい。
593__:01/11/05 10:58
ageeee
cache
595デフォルトの名無しさん:01/11/05 11:53
>>592
それはアルゴリズムの問題じゃないと思う。
596デフォルトの名無しさん:01/11/05 12:17
void foo(void)と
extern void foo(void)ってどう違うの?
またどう使い分けるの?
597デフォルトの名無しさん:01/11/05 12:32
>>596
上は定義か宣言か、それだけじゃ区別つかない。
下は宣言。どこかに実体が定義されている、という宣言。
使い分けは、extern を書いたほうはヘッダにまとめる。くらいかな。
598デフォルトの名無しさん:01/11/05 12:41
毎度っす、素朴(?)な疑問なんですが・・・
char szHostName[256];
とか文字列を格納する変数名の頭に付く『sz』とは何の略なんでしょうか?
String Zero-terminated
だっけ?
>>592
mmap、かなぁ。開くったって、同時に書き込みは出来ないわけだし。

>>598
Zero terminated String がどうこう、って話をその昔
聞いたことがありますが。
>>598
sz:string with zero terminated
'\0'で終了する文字列の略
>>598
「ハンガリアン記法」で検索してみるといいと思うよ。
603598:01/11/05 13:40
>>599 600 601 602
みなさん、レスありがとうございました
604デフォルトの名無しさん:01/11/05 15:10
関数で引数を省略化な関数を作りたいのですが、
宣言とかどうすればよいのでしょう。

教えてください。
605デフォルトの名無しさん:01/11/05 15:17
>>604
C++ だけど、

int func(int n = 0){
return n;
}

とすれば、func() なら 0 が返るし、func(777) なら 777 が返る。
>>604
man stdarg
>>604

void f(int x, ...)

どうにかして引数の数を得なければいけないけど
(printfみたいな書式指定でも、個数を指定してもok)
>>607
man stdarg or varargs.h
609604:01/11/05 15:32
>>605さんの方法で、
ヘッダの宣言のほうで
int func(int n = 0);

ソースのほうは
int func(int n)
{}
でいけました。

ありがとうございました。
610604:01/11/05 15:33
あ、ちなみにC++です。
>>609
....
ガーン、可変引数の話じゃなかった(ウトゥ
613名無しさん:01/11/05 15:56
エクセルで作成したCSVファイルのデータを
入出力したり、演算したデータを書き込む操作をVBAの
他にもC/C++で処理してみたいのですが、参考になる
プログラムまたはサイトはありませんか?
因みにCのコンパイラはBorland社のフリーソフトです。
614sage:01/11/05 15:57
誰か激しく突っ込んでやれよ! >>597
615デフォルトの名無しさん:01/11/05 16:12
自作ヘッダ作りました

クソヘッダが出来ました

ヘッダ作るのヘッダクソやなあ

学校の宿題で「C言語イレギュラーを考えて来い」とのお達し。
これでいきたいと思います。
616デフォルトの名無しさん:01/11/05 16:25
>>613
ググールいって
csv open close #include
で検索するのはどうか
>>596
staticで宣言されてないなら、Cの関数は外部リンケージをもつから
どっちでもいっしょ。お好きなほうをどうぞ。
618デフォルトの名無しさん:01/11/05 17:38

すいません。下のソースをコンパイルするとエラーが出ます。
なんででしょうか。教えて下さい。。。。
#include <stdio.h>

void nfunc(char *s){
char k = *(s);
*(s) = *(s+1);
*(s+1) = k;
return;
}
main()
{
//int i;←ここだとOK。
char x[7] ="tinnpo";
nfunc(x);
int i;//←ここだとだめ。
for (i=0;i<50;i++){
printf("%s",x);
}
}
>>618
変数はブロックの先頭でしか宣言できません。何故かと問われても、そういう決まりですとしか。
620デフォルトの名無しさん:01/11/05 17:44
以下のプログラム実行したとき
たとえば変数aにhogehogeと入力したとき
input:input:input:
とループしてしまいます
これをループしないようにするには
どうしたらよいのでしょうか?
int a;

while(1){
printf("Input:");
a=getchar();
if(a=='1'){
break;
}
}
621デフォルトの名無しさん:01/11/05 17:45
>>619
即レスありがとうございます!
すると変数宣言を全部頭に固めとけってことですね。
622デフォルトの名無しさん:01/11/05 17:51
>>620
while(1){
って条件が常に真で無限ループですよね。
んで"hoge"!=1だから抜けないんじゃ。。。。
>>620
どうしてループするのかわからないならここで訊く前にK&Rを死ぬほど読め。
624デフォルトの名無しさん:01/11/05 17:54
あ、intに文字を代入してるのか。。。?
getchar()は1文字入力専用なので、コンソールに1文字以上の
バッファがたまっていると、バッファを吐き出すまで、コンソール
入力が無くても値を返してきます(自動的に関数が終了してしまう)
多分、>620の関数だと、文字列数+1の「input:」を画面に
出力されるのではないでしょうか?

多分と思われる正解は

#include <stdio.h>
#include <string.h>

main(){
char buf[BUFSIZ];
while(1){
printf("Input:");
gets(buf);
if( strcmp( buf, "end" ) == 0 ){
break;
}
}
}
こうかな?
626620:01/11/05 17:58
>>622,623
レスありがとうございます

質問の仕方がわるかったみたいです
わざとhogeとか入力して
ループするようにしたとき
ループするのが1回ではなくて
input:input:
と複数回ループしてしまうのは
どうしてですか?
627デフォルトの名無しさん:01/11/05 18:00
プログラムを勉強しようと思ってます。
ゼロからなのですが、まずC言語とやらを学ぶのがいいんですか?
教えてください。
628622:01/11/05 18:00
>>625
うげ、わけわからんレスしてすいません。。。逝って来ます。
>>626
なんで1回しかループしないと思うのか。
どうしてループするのかわからないならK&Rを死ぬほど読め。
630デフォルトの名無しさん:01/11/05 19:35
#include <stdio.h>

int main(void)
{
int sintyou;
int taijyuu;
double meter_sintyou;
double bmi;

printf("身長入れてください>");
scanf("%d,&sintyou");

printf("体重を入れてください>");
scanf("%d,&taijyuu");

meter_sintyou=/100.0;
bmi=taijyuu/(meter_sintyou*meter_taijyuu);

printf("あなたのBMI指数は%fです\n",bmi);

printf("判定:")
if(bmi<18.5){
printf("やせすぎだYO\n");
}else if(bmi<25){
printf("標準体重\n");
}else if(bmi<30){
printf("ちょっと肥満\n");
}else{
printf("デブ\n");
}

   return 0;

}

なんか完璧なのにエラーがでるのだけど、どう書き換えたらいいかな?修正してください
scanfを調べなおせ
632デフォルトの名無しさん:01/11/05 19:39
>>631 書きかえてもらえませんか?
meter_sintyou=/100.0;
なんてネタだな。
meter_taijuuって何だよ〜
結果がおかしいとか以前に、これじゃコンパイル通らないぞ。
635デフォルトの名無しさん:01/11/05 19:47
C言語体当たり学習の本を写したんですけどね〜?
指摘された個所と本のソースを読み比べろ。
637デフォルトの名無しさん:01/11/05 20:01
ありがとうございました、とりあえず今からログ保存してきます。
正解も書いてくれませんか?間違えと見比べるので。お願いします
638デフォルトの名無しさん:01/11/05 20:06
>>637
>>1 の "課題丸投げなら別スレにいけ。" の一文がも前には目に入らないのか?
639遭難中:01/11/05 20:19
ちょっと助けてください。

struct bodyStr readbody(int i){
struct bodyStr body;
int t;
scanf("%s%s%s%s%s%s%s%s%s%s%s",
body.size.height,body.size.neck,body.size.arm,body.size.waist,body.size.inseam,
body.color.hair,body.color.eyes,body.color.skin,body.shape,body.age,body.sex);
temp.number=(t+1 ? ++i : 0);
return body ;
}

なんですが、プログラムがここにかかると止まります。
原因はなんでしょうか?
もしかして、ここが原因ではない?
640遭難中:01/11/05 20:23
temp.number=(t+1 ? ++i : 0);
ではなく
body.a=(t+1 ? ++i : 0);
の書き間違えでした。
でもプログラムは止まります。
641デフォルトの名無しさん:01/11/05 20:29
>>639
body.size.heightとか、scanfに渡してる変数は、char*になってるか?
数値型だと、動かんよ。

つか、scanfをこんな使い方したら、正しく動いても、ミスらないで入力
するのは至難のワザ。
(リダイレクトで入力すんのか?)
642デフォルトの名無しさん:01/11/05 20:32
>>639
あと
scanf("%s %s %s %s %s %s %s %s %s %s %s",
%s の間にスペース入れないと、ダメっぽい。
先に>>641で指摘されてしまったので、もいっこ。
関数内に出てくる t が初期化されてないけど大丈夫?
何が入ってるか分からないよ。
644遭難中:01/11/05 20:56
指摘いただいたとこ直したのですが駄目です。

プログラム全部のせて指摘していただきたいのですが、そうしたら、丸投げになってしまうし、
どうすれば〜(泣)
645遭難中:01/11/05 21:00
えっと、すっごい基本的な質問しますけど、body.size.heightってintとかの整数値
ですか?%sはNULLまでを表示する型指定なので、もし数値を表示したいのであれば、
%dで書かなきゃランタイムエラーでますぜ。
647646:01/11/05 21:02
お、ソース上がってるね。チョい確認してくるわ
648遭難中:01/11/05 21:04
お願いします
649643:01/11/05 21:05
ソースをちょっとだけ見てみたよ。
main()の最初でいきなりiが初期化されてないよー。

初期化してない変数は0が入るのだと勘違いしてるのかも知れないけど、
関数内で定義した変数の初期値は「不定」だからね。
0が入ってるかも知れないし-1000かも知れないし256かも知れない。
650遭難中:01/11/05 21:08
指摘ありがとうございます。
しかし結果はかわらず・・・。
651646:01/11/05 21:09
iもnumもだな
現在確認中
652遭難中:01/11/05 21:12
再アップしました。

ちな次のようなプログラムを作れ。
(1)洋服用身体データ構造体を定義する。タグ名をbodyStrとする。
識別番号
サイズ: 身長, 首回り, 腕の長さ, 胴回り, 足の長さ
色 : 髪, 目, 肌
体型 :値を(太め,標準,細め)の3種類とする。
年齢
性別
識別番号以外のデータは文字列に入れる。文字配列のサイズは(データを見て)適当に決
める。
(2)その構造体の配列を用意する。配列のサイズは全部のデータが収容出来るだけとする

(3)データを一人分読む関数readBodyとデータを一人分書くwriteBodyを書く。readBodyは
bodyStr
構造体を戻し,writeBodybodyStr構造体を引数に取るものとする。 みに今回のこの問題は
653643:01/11/05 21:13
main()の最初で定義してるstruct bodyStr *bodyの指してる先がないぞ。

未初期化ポインタをdo {} while()の終了条件の中で参照してるから、
readbodu()から正しく戻ってきてもここで死にますな。
654遭難中:01/11/05 21:13
という、課題なんです。
どうも実行がうまくいかなくて・・・。
655遭難中:01/11/05 21:15
なるほど!ちょっといじってみます。
ありがとうございます。
656遭難中:01/11/05 21:23
struct bodyStr body[20];


do{
body[i]=readbody(num);
}while(body[i++].a);

if(argc-1){
writebody(body[(argv[1])-1]);}
else
for(j=0; j<i-1; j++)
writebody(body[j]);

指摘個所をこのように変えてみました。
dataを破棄しました。これを実行したら、PC自体がフリーズしてしまいました、
657デフォルトの名無しさん:01/11/05 21:27
643は責任もって最後まで教えてやれよ。
658646:01/11/05 21:29
うんと、これの入力はコンソール入力でいいの?
それともファイルとかの外部入力なの?
659遭難中:01/11/05 21:33
リダイレクションです。

それ用のファイルは
http://popup.tok2.com/home/tnao/body.dat.txt
です。
コマンド行に番号が指定されていれば、その識別番号のデータを出力するようにして、
なにも指定がなかったら全部のデータを出力するようにします。
a.out 3 <body.dat
または
a.out <body.dat
と入力するんです。
readbody(num)のnumはループ内のどこで変更されている?
それと readbody 内の t は常に 1 じゃない?
無限ループかつ data[i] によってデータ破壊されてると思われ。
662遭難中:01/11/05 21:45
PCがフリーズしまくる原因はこれなんでしょうか…。
改善策を教えていただきたいのですが…
663遭難中:01/11/05 22:00
どうしたらいいんでしょうか?
読み込み時の終了条件を考えてみ。
body.a=(t+1 ? ++i : 0);
これ、処理を分解して、もっと分かりやすくしようよ。
>>656
>writebody(body[(argv[1])-1]);}
writebody(body[atoi(argv[1])-1]);}

# だんだんlisp化してきてるな...
# > body[i]=readbody(num); は絶対に俺には思いつかん...
もっと素直にかけ・・・
668デフォルトの名無しさん:01/11/05 22:11
C言語でコンソールメールクライアント作ってちょ。
できればLinxu用のシンプルなやつお願いします。
SubjectとBodyがあればそれだけで十分です。
実用性と勉強を兼ねて吟味したいのです。
作ってちょて、アンタ・・・
>>668
UCB Mail とか MH のソース読めよ。

仕事として依頼するなら最低で 0.5 人月要求するが?
遭難中は、プログラムに処理内容を説明するコメントをつけてみたらどうか。
672遭難中:01/11/05 22:20
今頑張ってますが、atoiを入れると、コンパイルがエラーになります。
回避の方法はどうしたらいいんでしょう?
コンパイルエラーだけじゃわからん。
むむっ誰かお創りになった方はいないのですか?
そんなに複雑なものでなくていいのです。
例えば100行のブラウザのような本当に基本的なものでよかったのですが・・・・
とりあえずありがとうございました。おさがわせいたしました。
675デフォルトの名無しさん:01/11/05 22:34
文字列を入力するときは
 gets(s);
なのに、なんで1文字を入力するときは
 s=getchar();
なんですか?
 getchar(s);
ではだめなんですか?
data[i]=readbody(num);
そもそもこれがうまく動かないだろう・・・
関数struct bodyStr readbody(int i)の最後で
return body;
とやっても、関数struct bodyStr readbody(int i)内の
struct bodyStr body;
のアドレスがdata[i]に代入されるだけで、このアドレスの指す
データは関数struct bodyStr readbody(int i)が終了するとともに
消滅してしまうからね
三項演算子禁止!
アンタにはまだ無理だ>>遭難中
678遭難中:01/11/05 22:39
エラー E2342 10-30.c 49: パラメータ '__s' は const signed char * 型として定義されているので int は渡せない(関数 main )
コンパイルエラーはこうです。

data[i]=readbody(num);
のまわりはすべてdataからbodyにしました
679遭難中:01/11/05 22:41
body.a=(t+1 ? ++i : 0);
は消しました
>>674
コンソールメールクライアントなんてもの、Unixでは何十年も前から
沢山作られて使われてて、大抵のはソースも公開されてるよ。
それを読めばいいよって言ってるの。
681遭難中:01/11/05 22:43
頭がパンクしそうです・・・。
まず落ち着くことだな
宿題スレに引っ越して、仕切りなおしてはどうか。
はっきりいって、ここじゃ迷惑だ>>遭難中
684遭難中:01/11/05 22:53
移動します。
あいがとうございました
685646:01/11/05 23:04
ようやくできたぞ、少し修正を加えたがな

http://www2.makani.to/akutoku/upload/dat/1004969013.txt
686646:01/11/05 23:06
↑のURL直リンだめなので、コピペでヨロシク
687646:01/11/05 23:07
とか書き込んでいるうちに終了か、写氏
688デフォルトの名無しさん:01/11/05 23:10
回数指定のループ作りたいときには簡単にforループではイカンのですか。

どーしてもwhileにしたいときには
やはりカウンター作ってそれ見させて制御しますが
こーいうのは効率悪いのですか。
効率は変わんないでしょ、変な書きかたしなけりゃ。
>>688の思っているほど、小手先のテクニックは速度に影響しない。
今時のコンパイラは正しく明快に書かれたコードを最適化ができる。

実際に動かしてみて、もしくは計算量から推測して、遅いと分かったときに
手を下せばよい。
あと、アセンブラコードを出力させて見るっててもあるね。
692デフォルトの名無しさん:01/11/05 23:40
問題なんは、「自分の使う手段以外は全部効率良くない悪手だ!」と叫ぶ輩がいること。
693sage:01/11/05 23:47
兵力は集中して、より効果的なところに集中させればよい。
最適化なんてそんなもんだ。
694遭難中:01/11/06 01:45
今気がつきました、やってもらってるあいだに、居なくなってしまってすみません。
参考にさせてもらいます。
ありがとうございました。
695デフォルトの名無しさん:01/11/06 09:46
jpeglibのドキュメントを和訳した人いますか?
使い方がさっぱりよ!
ディスティネーションの登録周りがさっぱりよ!
696デフォルトの名無しさん:01/11/06 10:57
★8人くらいに、『どうぶつの森』すすめましたよ♪
 こんにちは♪わたしは、岩手に住む11歳の小五です!!
わたしは、『どうぶつの森』をクリスマスに買ってもらいました♪帰ってくるなり、
さっそく、やってみました。
 1日中やってました(^^)
 ともだちに、「新しいゲーム買ったよ〜〜」といったら、
「なになに??」ときかれたので、「どうぶつの森」だよ〜〜」と
いったら、いきなりでんわをきって、数分後、家にきました。
いまでは、8人くらいに、『どうぶつの森』すすめましたよ♪ちなみに、
わたしは、「ももこ」がだ〜〜いすきで、PCの、壁紙も、ももこちゃんです♪

クリスマス。(゚ー゚*)...
>>696
漏れは苦利酢魔酢にQVのネットゲー買ってもらうんだー♪(自分に)
帰ったらすぐやるんだー♪(一人で)
それ用のビデオカードも買ったんだよ♪(通販で)
あぁ〜苦利酢魔酢が楽しみ♪(やる時間はない)
>696
コピペマジウザイ
699こぴぺ:01/11/06 15:20
「Forthと共にあれ!」
700デフォルトの名無しさん:01/11/06 17:41
オッス!、かーにはんで勉強中ッス。
一通りサンプルなんかを打ち込んで、何となく分かった気になってる?のですが
その先に進めないでいるっす、sedやperlの資産(主にテキストファイルの処理)を移植したいと思ってるものの
取り付く島も無い感じです。皆さんはどんなソースを読んで勉強されたんでしょうか
今はread.cgiのソースやstdioを見ているんですが、まだ敷居が高い感じです
スクリプトの時は、本に載ってる内容≒自分のやりたい事、だったんです。
sedやperlのプログラムをCに移植・・・
逆ならともかくねぇ。
>>700
「ソフトウェア作法」読め。お前がまちがっていることがわかる。
703700 :01/11/06 17:57
>>701
よく分かるッス、力不足でGUIは全く分からないんで、こっちの方が入りやすい
かなと思っただけなんです。
先に関数を沢山書かなきゃならないと思うんですが、そのとっかかりが・・・
>>700
http://www.vector.co.jp/soft/dos/prog/se011510.html
みたいな正規表現ライブラリを使うべし。
705デフォルトの名無しさん:01/11/06 18:01
( ´,_ゝ`)プッ
706デフォルトの名無しさん :01/11/06 18:05
( ´,_ゝ`)プッ ( ´,_ゝ`)プッ
707700 :01/11/06 18:23
>>702
えっと、生産性はよろしく無いと言う事ですよね?
良書の紹介どもッス、(本は学割が無いのがツライ。。)
>>704
おお!凄い、早速使ってみる事にします。
>>705、706 スンマソン(´д`;)

取り合えずcpとか易しげなコマンドでもパクって勉強するっす
708デフォルトの名無しさん:01/11/06 19:53
HTMLしか打てないんですが、
Cをそれなりにこなせるようになるには、何ヶ月かかります?
ちなみにHTMLは1ヶ月かかりました
100時間もあれば十分だと思う。
出来る奴は1ヶ月位でコンソールツール位書けるようになる
ダメな奴は一生掛かってもダメ これホント
711デフォルトの名無しさん:01/11/06 19:57
ほんとっすか?
トーシロなので、300時間とみておこう
それうまくいかなかったらこっちつかってちょ
http://www.hi-ho.ne.jp/babaq/bregexp.html
感がいいやつなら、1週間でできると思うけど。
5日で言語のディティールつかんで、
2日でマニュアルの引き方を覚えられそう
714デフォルトの名無しさん:01/11/06 20:24
うちのプログラマーは3ヶ月もありゃはいってこれるから
がんばってよっていうけど、なかなか…
HTMLとは応用のレベルが違うような…
715ゲイ2:01/11/06 20:26
WindowsAPIの

CreateFontIndirect(&lf)
LOGFONT lf;

の使い方教えてください。
「HTML書ける」なんてわざわざ言えないよ。恥ずかしくて。
日本人が「僕日本語しゃべれますよ!」って言いふらして歩いているようで。
>>708-713 not 712 読んどけ

プログラミングを独習するには10年かかる
http://www1.neweb.ne.jp/wa/yamdas/column/technique/21-daysj.html

とりあえず、煽り文句を引用しとく
> それは、何かの役に立つかもしれない。でも、それであなたの人生は変わらないし、
> プログラマーとしての本当の技能総体だってそうだ。24時間や数日や数ヶ月じゃあね。
718デフォルトの名無しさん:01/11/06 21:02
char hoge[] = {'1','0','0','0','\0'};

int foo; // に代入して・・・
if (foo == 1000){printf("変換出来ました!\n");}
どうすれば良いんでしょう (死
atoi
strtol
sscanf
できひん、、できひんでー (´□`)/"" !!
808464433とか言ってるし、、、
sscanfでやってみます、有難う御座いました。
一度に代入しようとしないで、一文字づつ処理したら?
>>718
char hoge[] = "1000";
int foo = atoi(hoge);
if (foo == 1000){printf("変換出来ました!\n");}
>>715
ちと、スレ違いだな。
>723-724
出来ました、せんぱい!!  (・∀・)!謝謝
(const char *nptr) は配列のサイズはいらなかったのかぁ・・
先にリファレンス引けるようにならないと、標準関数も使えないにゃ〜
型無し厨房の苦難は続く・・・・  
727デフォルトの名無しさん:01/11/06 23:31
176 717
何えらそうにいってんだか…(^O^)ぷぷ
728勉強始めます:01/11/07 01:31
始めまして
少しずつC言語を勉強していきたいのですが
何か簡単な問題から出して頂けませんか?
僕のレベルは、これから構造体やらファイル処理やらを
習得しようかというレベルです。
729ビル・ジョブス:01/11/07 01:42
>>715
セミコロンも無く、宣言の順番も変・・・感覚的に気持ち悪いので教えたくない・・・
といいたいがヒントをあげよう・・・MSDN ONLINEへ行く。
そこで理解できなければあきらめろ。
ちなみに、なぜ、CreateFontIndirect()なの?
まさか、今時それしか実装されてないWindowsCE 2.1Xじゃないよね?
CreateFont()は知ってるか?
>>728
K&Rよんで問題やれ
>>728
構造体とファイル処理を利用してOSを作成せよ、
但し関数はmainのみとする。
732ビル・ジョブス:01/11/07 02:25
>>731
おまえは書けるのか?解答教えてくれよ。
>>732
汎用OSのソースだ。くれてやる。
足りないものは自分で追加できるカスタマイズ性が売りだ。

void main(void){
while(1){
/*ユーザータスクはここに追加する*/
task_A();
task_B();
task_C();
task_D();
}}
それがOSなら、誰がmainを実行するんだよ。
ファイル処理を利用、ったって、誰がファイルという抽象化を
サポートすんだよ。
結局テキトーかましただけよ
736名無しさん:01/11/07 10:53
1.下記の (1)〜(5) は一続きの作業である。それぞれどのような作業をして
いるのか答えなさい。(25)

(1) pwd
(2) mkdir word
(3) cp sample.doc word
(4) cd word
(5) ls

すみません、誰か教えてください。UNIXです。
737デフォルトの名無しさん:01/11/07 10:56
所詮この板も腐れ外道の集まりということで下げ
738デフォルトの名無しさん:01/11/07 11:00
main()
{
  char buf[256];
  char res[256];
  int iread;

  printf("-->");
  iread = read(0,buf,256);
  strcpy(res,(char* )crypt("SA",buf));
  printf("crypt passwd:%s\n",buf);
}

というテスト用の深い意味のないプログラムがあります。
ここで問題が生じました。
低水準IOと高水準IOと併用しているからだと思いますが結果が変です。
どうしても低水準と高水準IOと併用したい場合にはどうすればいいのでしょうか?
fflushのような関数を使えばよいのでしょうか?
お願いします。
739デフォルトの名無しさん:01/11/07 11:46
Win98では現在のローカル日時設定出来るのですが、WinNT/200では出来ません
SetLocalTime関数を使用しています
Helpを見るとSE_SYSTEMTIME_NAME 特権を有効にしなければならず、
この特権を割り当てるには、AdjustTokenPrivileges 関数を使いますが、
AdjustTokenPrivilegesのパラメータの意味がまったくわかりません
教えていただくか、別の方法を教えてください
>>738
低水準IOと高水準IOの併用が原因じゃないのでは?
何がやりたいのかわかりませんが。
>>739
スレ違い。まずMSDNを読んでそれでもわからなかったらAPI相談室で訊け。
742デフォルトの名無しさん:01/11/07 12:20
>>739
AdjustTokenPrivilegesで検索かけたら、サンプルコードが
たくさん見つかりました。
そこらへん見て、なんとかならない?
743デフォルトの名無しさん:01/11/07 12:23
>低水準IOと高水準IOの併用が原因じゃないのでは?

それが原因だと思います。では両者を具体的に併用するにはどうしたらいいのでしょうか?
アドバイスよろしくお願いします。
744デフォルトの名無しさん:01/11/07 12:51
>>739
管理者アカウントでログインすれば、普通に時刻変更できると思うよ。要するに一般ユーザーにはシステム時刻を変更する権限がないんでは。
745デフォルトの名無しさん:01/11/07 12:53
>>743
それが原因じゃないと思います。自分のコードを見直してみては。
>>738
標準出力をバッファリングしないようにする。
どーせテストプログラムなんだから速度は気にしてないだろ?

man setbuf, setvbuf
>>738
結果が変というけどどう変なのか書いてないからねえ。
748デフォルトの名無しさん:01/11/07 13:06
>>747
そういうのは業務でバカと組まされたときに良くある話。
そのバカを非難しててもしょうがないのでポワロ並の
推理力を駆使して問題解決に当たらなければね。
>>738
read()で読み込んだデータは最後に'\0'を付けてくれたりしないので、
そのままcrypt()とかprintf()とかに渡したらいかんよ。
cryptのkeyとsaltが逆じゃない?
結果を使ってないので意味がないけど。
>>748
> そういうのは業務でバカと組まされたときに良くある話。
まぁねぇ。

問題を報告しろ、だけだとまともな報告が上がってこないので、私は最低でも次の4点を
箇条書きで出してもらってる。

1. バグの原因となっていると推測しているコード(手で書き写さずに、Cut & Paste すること)
2. 与えた入力
3. あなたは、本来はどのように動作することを想定しているのか?
4. 実際には、どのように動作してしまっているのか?
1. main関数の230〜1400行目。
2. 正しい入力
3. 仕様どうりに動いてくれる事
4. 時々「ピー」ってなって止まります

こんなのが出てこない?
>>752
たまに(苦笑)
はは ご苦労さん
755デフォルトの名無しさん:01/11/07 16:53
「仕様どうり」ってのがなかなか。
756デフォルトの名無しさん:01/11/07 18:05
main文内で関数funcを呼び出すことを繰り返しています。
で、func内である値を保持しておきたいのでfuncで
static double hoge;と書いてhogeを定義してます。

で、
main文を繰り返してfunc内で
func(){
printf("before %f\n",hoge);
{処理}
printf("after %f\n",hoge);
}
としてhogeの値を見てみると、
before 1.1
after 1.1
before 1.1
after 1.1
・・・
と続くのですが、突然
before 1.1
after 1.1
before 1000.11
after 1000.11
みたいな感じで、hogeの値が変わってしまうのです。
こういう値がかわっちゃう現象は起こりうることなんでしょうか。
もしそうならその対処法みたいなものはあるのでしょうか。
757デフォルトの名無しさん:01/11/07 18:07
hogeは別の場所や処理内でも読んだり変えたりしてません。
希望としては値はずっと同じ値であって欲しいのです。
メイン文から、関数を呼び出したら値が変わってた、
って感じなのですが。
どこかにバグがある。
759デフォルトの名無しさん:01/11/07 18:36
>>756
{処理}のところに、突然に値を変えるコードが書かれてるんじゃないの?
760759:01/11/07 18:37
759はミス。よく読んでませんでした。

例えば、配列で、その大きさを超えて書き込んだりすると、関係ない変数が書き換わったりします。
761デフォルトの名無しさん:01/11/07 18:43
{処理}内で変数の領域をはみ出すような書き込みをしてないか?
とりあえず{処理}を見ないことには原因は分からんと思うが。
762761:01/11/07 18:45
あ、遅レスだ。しかも変数→配列変数だった。
763757:01/11/07 18:52
早速のレスありがとうございます。

ええと
main内で
for(i=0;i<30000;i++){
func(i)
}
って感じで繰り返しをしてるのですが、
func内の処理の前後でhogeの値を見ても値は変わっていないのです。
func(){
printf("before %f\n",hoge);
{処理}
printf("after %f\n",hoge);
}
ってやって確認しました。だから処理内でおかしなことが
起きていないと判断しているのですが。

とりあえずですが760さんのおっしゃるように
他の部分で配列の値がおかしくなってないかとか確認してみます。
>>756
質問!
func()内で定義している変数hogeを
どうやってmainでhogeの値を確認してるの?
ちなみに以下のソースはコンパイルできませんでした。
void func(void) { static double hoge = 1.1; }
int main(void) { printf("%lf\n", hoge); return 0; }
>>764
mainの中でhogeを確認するなんてどこにも書いてないのでは?
funcの中の最初と最後でprintfしてるだけじゃん。
766764:01/11/07 20:24
スマン、良く読んでなかった...
しかしそうなると
>>756
> func(){
> printf("before %f\n",hoge);
> {処理}
> printf("after %f\n",hoge);
> }
> としてhogeの値を見てみると、
(中略)
> みたいな感じで、hogeの値が変わってしまうのです。
なのに
>>763
> func内の処理の前後でhogeの値を見ても値は変わっていないのです。
> func(){
> printf("before %f\n",hoge);
> {処理}
> printf("after %f\n",hoge);
> }
> ってやって確認しました。だから処理内でおかしなことが
> 起きていないと判断しているのですが。

756と763で矛盾しているような気がする...
# 良く読んでないからか...
>>766
矛盾してない。
>>763
> func内の処理の前後でhogeの値を見ても値は変わっていないのです。

この処理とは{処理}のこと?それともfunc関数全体の処理?
mainのforループのカウンタも出力して、値が変わる瞬間を特定するとか
してはどうだろ。
デバッガ使うという発想はないのか。
聞くなら聞くで中途半端に{処理}とか書かずに
どこかにソースをあげるとか…
ソースキボンヌ
774デフォルトの名無しさん:01/11/07 22:52
>>768
func関数内の{処理}です

>>770
やってみました。
が、mainのroopのカウンタを出して場所を特定しても
そこで何が行われているのか全くわからないのです。
メイン文のifに入るときとか、そういう瞬間なら
なんとなく原因もつかめそうですが、前のカウントの時と
メイン文の処理も同じなのです。
ちなみにメイン文のi値の値が、hogeに入ってしまっています。
(どうでもいいかもしれませんが)

>>771
ありませんでした。
775757:01/11/07 22:58
>>772
うーん。基本的に聞きたかったことが、
func内のstatic double hogeっていう変数値が
メインの
for(i){
func();
}
ループのi番目に呼んだfuncの最後の部分での値と
i+1番目に呼んだfuncの最初の部分で値が違うけれど
こういうことがあるのか、ということだったのです。
iがいくつになっているか書き出せ
777デフォルトの名無しさん:01/11/07 23:03
(i-1)個しか確保してない配列があるだろ(藁
>>775
もう面倒いから、全ソース出せ
779757:01/11/07 23:15
やりました。>>776

20400 2.047869
20401 2.051167
20402 2.045735
20403 2.045802
20404 2.045622
20405 2040.409722
20406 2040.409265
20407 2040.409731
20408 2040.414136
20409 2040.410585

こんな感じです。
左がメイン文のi 右がhoge
20404をさかいに右の値がどかんと大きくなってるのがダメなとこです。
それ以前のhogeの値がばらばらしているのはぜんぜん問題なしです。

ありません。>>777
780757:01/11/07 23:29
int func(int time_no){
int flug;
double ave_new_interval,new_interval;
static double p_next_os_time,p_last_os_time,p_last_ms_os_time;
if(time_no==0){
hogehoge;
}else{
if(time_s>=p_next_os_time){
new_interval=interval_1(ave_new_interval);
p_next_os_time=p_last_ms_os_time+new_interval;
p_last_os_time=p[time_no];
flug=1;
}else{/*次の発火前なら*/
if(((time_s<start_time)&&(time_s<0.128*5))||((start_time<time_s)&&(time_s<end_time)&&(time_s<t1*5+start_time))||((end_time<time_s)&&(time_s<t1*5+end_time))){
new_interval=interval_2(ave_new_interval);
p_next_os_time=p_last_ms_os_time+new_interval;
flug=0;
if(time_s>=p_next_os_time){
flug=1;
p_last_ms_os_time=time_s;
new_interval=interval3(ave_new_interval);
p_next_os_time=p_last_ms_os_time+new_interval;
p_last_os_time=p[time_no];
  }
}else{
  p_next_os_time=p_next_os_time;

  flug=0;

}

}

}

return(flug);

}


-----------------------
int main(){
hogehoge;
for(time_no=0;time_no<N;time_no++){
time=time_no*0.1;
time_s=time/1000;
alpha[time_no]=flug(time_no);
}
}

こんな感じです。mainとfuncは別のファイルで、
ここで定義してない変数とかは全部定義してあります。
でコンパイルしてとおります。
今すぐ配列pの定義をコピペして見せろ。
ついでに初期化していないave_new_intervalを受け取ったinterval_1()が何を返すのか
言って見せろ。
>>770
自分でやらなくても、問題の変数に対してハードウェアブレークポイントを設定して、変数が変更された
瞬間にデバッガに落とせば良いような気がするが。(プロセッサがサポートしてれば)
784757:01/11/08 00:06
>>781

double p[30000];
double interval1(double aveinterval);
interval2,3も同じです。
785デフォルトの名無しさん:01/11/08 00:31
で、static double hogeって変数はどれなんだろう?
あとmainはfuncを呼んでないように見えるが。
alphaがいくつ確保してあるかも知りたい。
786勉強始めます:01/11/08 00:37
728です。
>>730さん
K&Rって何ですか?
すいません。

>>732さん
ごめんなさい
少し難しそうです・・・・
もう少し簡単な問題からって言うと我侭ですかね・・・
787デフォルトの名無しさん:01/11/08 01:09
>>780
hogehoge;
って、なんだこれ。コンパイル通るのか?これで
788デフォルトの名無しさん:01/11/08 04:17
>>775
>関数内のstatic 定義の変数が、その関数以外の処理で書きかわるか?
バグならありえます。
プログラムは、関数内のstatic 定義の変数をアクセスしているのでは
なく、その前のグローバルアドレスの変数(配列)をアクセスしているが、
あとのデータを上書きする場合があります。
789デフォルトの名無しさん:01/11/08 04:38
>>785
すいません。
static double p_next_os_timeのp_next_os_timeが
hogeです。
flugはfuncの間違いです。
alpha[]は30000個用意しました。

>>787
hogehogeは別に同と言う事は無い部分なので
書きませんでした。
790デフォルトの名無しさん:01/11/08 04:39
>>788
なるほど。そういう場合もあるということですね。
791検索しよう:01/11/08 07:47
>>782 にかいてあるけどinterval_1が変な値返してるだけじゃないの?
それかinterval_3が変な値返してる。
勝手に値が変わってるんじゃなくて、足し算で変わってると考えるのが妥当だよね。
time_sはグローバル変数だよね?
>>780
これ実際書いてるヤツをコピペしたのかな。
だったら変数宣言した所に少しでも注釈入れた方がいいんじゃない?
>>792の通りなら、多分自分でも変数を把握できてないと思うよ。
このスレに出す為というわけじゃなくて、これから先
似たような失敗を避ける為にも。
p_next_os_timeの算出に使ってる変数値を全部表示してみたら?
>>789
どうと言う事は無いと自分が思っている部分にこそバグは潜んでいるものだ
なんで、初期化しないのかな。
time_no == 0 のとき、funcって戻り値は何返すのさ。
797デフォルトの名無しさん:01/11/08 11:26
CSV形式でExcelに格納されているデータを
C/C++で入出力や演算処理したいのですが、参考に
なるプログラムやサイトなどを教えてください。
(例えば、列(A,B,C、・・・)の選択の方法など)
CSVファイルを直接読むの?
Excelを操作したいということ?
799デフォルトの名無しさん:01/11/08 11:34
うにっくすでint86()みたいな関数を使うにはどうすればいいの?
>>799
目的を述べよ
801799:01/11/08 11:42
SVGAのBIOSを呼び出したいというだけです。
うにっくすは初心者です。/devにあるファイルをいじればいいのかなぁ?
直接レジスタをいじったりするにはどうすればいいんですか?
インラインアセンブラって使えるんですか?
インラインアセンブラが使えるかどうかはコンパイラ依存。
…と言っても多分gccだろうけど。asm()が使えるよ。文法はinfo gcc参照。

SVGA BIOSを呼べるかどうかは知らないけど、少なくともインラインアセンブラ
でちょろっとint ほげほげとか書いた程度では済まないのは間違いない。
803デフォルトの名無しさん:01/11/08 14:42
>>798
CSVファイル(但し、Excelで作成されたもの)
に複数の列にわたって大量のデータが格納されており、
これらを処理したいのですが、普通に入出力操作
(fopenなど)をしてもA列しか扱えません。
>>803
普通って、どういうふうにしてみましたか。
>>803
fgets()で一行ずつ取り出して、行の内容を解析し、
目的の列を探して処理するのが普通かな。
ファイルの内容を変更したいのならば、元ファイルを直接更新するのではなくて
一旦別ファイルへ処理結果を書き出して、元ファイルを上書きするなりするのが
一番楽。
806805:01/11/08 14:55
ちなみに、この手のことはCで組むよりPerl等を使った方が楽な
ことも多い。
807デフォルトの名無しさん:01/11/08 15:14
厨房な質問で申し訳ありませんが、
学校の課題でifを使って足し算と引き算ができるモノを作れといわれて作ったのですが、
コンパイルは通りますが、実行すると「構文エラーです」と出てしまいますが、
VC++6上での実行は通ります。
何故にclコマンドでは通らないのか教えていただけませんか?
ちなみに、gccではなく、VC++に付属のvcvars32でclコマンドでコンパイルです。


#include<stdio.h>
main()
{
int a=0;
printf("足し算と引き算をするプログラム\n");
printf("足し算1〜5、引き算6以上\n");
scanf("%d",&a);
if(a<5){
int b=0,c=0,d=0;
printf("足し算を行います\n好きな数字を入力してください\n");
scanf("%d",&b);
printf("先ほど入力した数字に幾つ足しますか?\n");
scanf("%d",&c);
d=b+c;
printf("%d+%d=%d",b,c,d);
}
else{
int e=0,f=0,g=0;
printf("引き算を行います\n好きな数字を入力してください\n");
scanf("%d",&e);
printf("先ほど入力した数字に幾つ足しますか?\n");
scanf("%d",&f);
g=e-f;
printf("%d-%d=%d",e,f,g);
}
}
808   :01/11/08 15:20
>>807
空白いれろや。見づらくてしょうがない。
行の先頭にある半角空白は無効化されるんで、全角ではじめること。
だいたいお前には友達ってものがいないのかよ。こんなとこで
質問しやがってよ。
809デフォルトの名無しさん:01/11/08 15:20
Callback関数ってなんですか?
あとcallback関数をメンバ関数として作りたいのですが
可能ですか?
810   :01/11/08 15:22
>>807
せめて何行目でエラーがでるのかぐらい書け!!
だいたい clコマンド直接使ってる奴なんてお前ぐらいだぞ。
VisualStudioからプロジェクト作ってコンパイルしろよ!
811807:01/11/08 15:28
>>808
今自宅からなので周りに友達が居ません。

>>810
エラーは全く出ません。
コンパイルはちゃんと通ります。
でも、実行すると構文エラーと出てしまいます。
VC++でプロジェクト作って実行すると問題なく通ります。
gccは実行できる環境が現在無いために不明。
>>807
> printf("足し算1〜5、引き算6以上\n");
って書いてあるけど、このソースだと5を入力すると引き算になっちゃうよ。

重箱の隅につきsage
813デフォルトの名無しさん:01/11/08 15:33
>>811
VCなら返り血を明示的に書かなければ勝手にintになるので
多分間違っているだろうが、main()の前にintかvoidと書いてみたらどうだ。
814807:01/11/08 15:35
ご親切に説明を下さった方々ありがとうございます。
どう考えても私にはわかりませんので、
学校にいって教授に聞いてみます。
お騒がせしました。
815  :01/11/08 15:36
>>811
それでだめならフリーのコンパイラ使え。LSIC86とかな。
LSIC86はただのCだから変数宣言を最初になおせよ。
C++使いたいならbolandのやつ使え。
>>801
> SVGAのBIOSを呼び出したいというだけです。
PC-UnixでSVGA BIOSなんて動かんよ。
SVGAlibでも使え。
>>809
その質問の答えは、何のためにcallback関数を作りたいのか
を聞いてからだなー。
なにすんの?
>>811
実行時に構文エラーって良く分からんな。
>>811
> コンパイルはちゃんと通ります。
> でも、実行すると構文エラーと出てしまいます。
エラーメッセージを Copy & Paste しましょう。

手元の VC6 で試してみたけど、コマンドラインからコンパイルできたし、実行もできたぞ。
820デフォルトの名無しさん:01/11/08 16:14
>>805
レスありがとうございます。
例えば以下のように、
    A    B    C
 1 1.0 2.0 3.0

と格納されているとき、fgets()を使って行ごとに読み、
別のテキストファイルに入力すると、
1.0 2.0 3.0
と書き込まれます。この後、例えばB列のデータのみを
取り出すとか、処理した結果を別のExcelファイルのC列
に書き込むなどの方法を教えてください。
>>820
まず「〜などの方法」ではなく、必要な処理をリストアップすべきだな。
ひとつの関数でいろんなことをまとめてやろうとせずに、単純な処理を
行う関数を部品として作成して。それらを組み合わせて最終的な目的が
果たせるようにする。
たとえば、B列のデータを取り出すためには、まず指定した列のデータを
取得する関数を作らなけりゃならない・・・・、

って、この調子で説明したら先が長くなるなぁ・・・

まず最終的に実現したい機能をリストアップ。
それからだ。
822デフォルトの名無しさん:01/11/08 16:46
まぁ落ち着きたまへ。そしてマロにC言語の便利なライブラリを持ってきたまへ。
823821:01/11/08 16:56
う、そうね。
文字列系の標準ライブラリなんて最近つかってなかったんで、はなから
頭に無かった。

配列とポインタとstrstr()が理解できれば、B列取り出すのは難しくないはず。
>>820
まずAWKでやってみて、それで荷が勝ちすぎるようならPerlを使ってみれば。
Cの練習なのでなければ、わざわざCを使って不自由な思いをする必要はない。
検索してみ。C言語のライブラリあるから。
ただあんまり出来はよくなかった気がする。
>>823
sscanfでいいやん。
strtokの使い方が分からないならsscanfつかえ。
828デフォルトの名無しさん:01/11/09 16:06
signed a;
unsigned b;
signed c;
a = -1;
b = a;
c = b;
とやった場合、c==aとなることは保証されてる?
標準ライブラリのソースコードってどうやって見られるの?
830デフォルトの名無しさん:01/11/09 16:42
>>829
VCだったら
\Program Files\Microsoft Visual Studio\VC98\CRT
に入ってるよ。
他の環境は知らん。
>>830
サンクス。
入門書を読み終わった後の段階として、
標準ライブラリのソースコードを読もうかと思って。
>>831
一言逝っとくと、VCのランタイムのソースは汚いよ。
833デフォルトの名無しさん:01/11/09 17:57
Win98では現在のローカル日時設定出来るのですが、WinNT/200では出来ません
SetLocalTime関数を使用しています
Helpを見るとSE_SYSTEMTIME_NAME 特権を有効にしなければならず、
この特権を割り当てるには、AdjustTokenPrivileges 関数を使いますが、
AdjustTokenPrivilegesのパラメータの意味がまったくわかりません
教えていただくか、別の方法を教えてください
Administratorでログイン汁
835744:01/11/09 18:12
>>833
739で同じ質問しただろ。
答えてやってるのに見もせずに同じ質問するな。

仕方ないからもっかい書いてやるけど、
管理者アカウントでログインすれば設定できるはずだ。
要するに一般ユーザーにはシステム時刻を変更する権限がないんだよ。
836744:01/11/09 18:16
>>833
あぁ、それから。
システム時刻変更の特権を割り当てるには云々って書いてるけど、
ユーザーの権限を変更できるのは管理者だけなんで。
一般ユーザーのログインでやっても失敗するから、そこんとこお間違いなく。
誰か教えてください。学校の課題で出たんですが、選択整列法or挿入整列法を
行うプログラムが知りたいです。誰か教えてください。全然わかんないです・・・
まず「選択整列法」「挿入整列法」というものが解かりますか?
解かるなら、試しにここに簡単でいいので書いてみてください。
839ドキュンD1:01/11/09 19:56
どなたか教えて下さい。

main()
{
double a,b,c,d,e;
int i;
scanf("%lf %lf %lf",&a,&b,&c);
d=((a-b)/c)+1.0;
i=d;
printf("%lf %d \n",d,i);
}
このプログラムで
2.0 1.7 0.1 と入力すると4.000000と4が出力されるのですが、
1.9 1.6 0.1 と入力すると4.000000と3 となるのは何故なの?
printfの%lfを%.20fとかに変えてみると分かるけど、
後者の演算の結果は4よりわずかに小さいので、intの変数に代入する際に
切り捨てられて3になります。
正確に4.0にならないのは、浮動小数点の演算誤差のせい。
>>838
ごめんなさい。選択整列法、挿入整列法、どちらもどんなものかわかりません・・・
>>841
じゃああきらめて留年しろ。
>>841
1.宿題で出すのだから授業で説明したか教科書に載っている
2.この板でも一週間に一度は誰かが尋ねるくらい FAQ なことなので、
 google などで検索すれば概念、仕組みからソースコードまで手に入る。
3.宿題は宿題スレで訊ねれ
宿題見てやるよ
http://pc.2ch.net/test/read.cgi/tech/1003838158/
844839:01/11/09 21:37
>840
レスありがとうございます。
845デフォルトの名無しさん :01/11/10 03:41
質問です!
ポインタの理解に苦しんでいるのですが、
char (*(**hoge[0])[1])
せんぱい方はこう言うのも簡単に脳内変換出来ちゃうんでしょうか
それともこんな宣言はあまりしない方がいいですか
846デフォルトの名無しさん:01/11/10 03:53
独学でCを始めて1ヶ月の者です。


#include<stdio.h>
#include<stdlib.h>

int main(int argc, char *argv[])
{

int i;
double d;
long l;

i = atoi(argv[1]);
l = atol(argv[2]);
d = atof(argv[3]);

printf("%d %ld %f",i,l,d);

return 0;
}

上のプログラムは、参考書に載っていたもの
ですが、コンパイルして実行すると強制終了されてしまいます。
本には『コマンドライン上で整数、long型の変数、浮動小数点数
を入力してください。すると、これらの値が画面に再度表示されます』
と、書いてあります。

どのように使うものなのでしょうか?
また、コマンドラインとは何か?といった事が
全然わからないので、それについて分かりやすく
説明されているページをご存知でしたら教えていただきたいです。
847_:01/11/10 04:01
CとJAVA、初めから覚えるならどちらが難しいですか?
848846:01/11/10 04:14
>>846についてですが
いろいろと、いじってみた結果
実行することができました。(と思います…)

MS−DOSプロンプトから実行する際に
スペースで区切って『1 2 3』と入力した上で実行
したらできました。気合と勘なので
まだ、何がなんだか理解していませんが…

でも、なんかわかりそうな気がしてきました。
いろいろやってみます。
849846:01/11/10 04:19
たびたびスイマセン。
別に 1 2 3 じゃなくってもできるんですね。
3つの値をわたさなければいけないということなのかな?
3つ未満の時は強制終了で、3つ以上の時は
実行されるけど反映されるのは最初の3つのみ…

また、こんがらがってきた…
>>846
hoge.exe 1 2 3

としたとき、argv[0]には"hoge.exe"(へのポインタ)が入っていて、
argv[1]には"1"が入ってる。で、コマンドラインの引数が足りないとき、
846ではargv[3]は、メモリ上の変なところを指してるんで
強制終了する(そもそもargv[3]なんてない)。

つーか、こんなサンプルが載ってる本なんて捨てちまえ。
>>846
#include<stdio.h>
int main(int argc, char *argv[])
{
int i;
for(i=0;i<argc;i++) printf("%d:%s\n",i,arg[i]);
return 0;
}

WebでC言語入門とか検索したほうがよいと思われ。
852851:01/11/10 04:45
ミス。訂正。スマソ。

× for(i=0;i<argc;i++) printf("%d:%s\n",i,arg[i]);
○ for(i=0;i<argc;i++) printf("%d:%s\n",i,argv[i]);
853846:01/11/10 04:56
>>850-851

今、C言語入門ページ巡りを
しているところです。

なんか、何か1つわからないことがあって
それがわかれば、今まで疑問に思ってきたことが
理解できそうな…そんな感じです。今。
がんばって勉強します。

ちなみに、現在使用している参考書は『独習C』です。
>>845
>char (*(**hoge[0])[1])
コンパイラ通るの?
855初心:01/11/10 08:06
すいません。>>845の hoge[0] ってのはどうなるんですか?
要素0個の配列?
856855:01/11/10 08:10
あ、ポインタ変数の配列へのポインタ変数配列の先頭要素へのポインタ、
・・・・でいいんですか・・・・?
今更ながらに >676 の解説希望。
構造体のアドレスでなく値を代入していると
思うんだけど私が間違ってるのか?
*でもついていればアドレスという説明はわかるんだけど。
858デフォルトの名無しさん:01/11/10 10:06
>857
676が間違ってる。
>>857
たしかに。受けてる関数の引き血もintだしnumの宣言もint。
んで戻り値は〜構造体型。構造体丸投げは多少問題アリですが・・・
それにしても今更ですな。
ネタだろ?
861デフォルトの名無しさん:01/11/10 12:26
ll これは?
>>861
ハァ?
863はじめの二歩:01/11/11 03:37
Cを趣味で勉強している大学生です。
とりあえず文法レベルは分かったつもりですが、
まだライブラリ等の知識はあまり無い、という段階です。
Cでの不定長文字列についての質問なのですが、文字列を加工して
返すような関数を作る時、普段はどうしていますか?
もちろんプログラムの目的によっても違うでしょうが、日常的
にはどうしているか、という話です。
1. strncat,snprintfのように、バッファのサイズを引数で
指定して、あふれた分は切り捨てる。
2. fgetsのように、バッファに収まらない時は次回の呼び出しの
ときに返す。
3. バッファは呼び出し先の関数でmalloc()で確保し、バッファへの
ポインタを返す。free()は呼び出し元が行う。
p=hoge();
if(p!=NULL){
puts(p);
free(p);
}
という感じで。
4. 専用の文字列ライブラリを使う。
5. GC(聞きかじりですが)を利用。

1.を除けば一番無駄が少ないのは3.だと思いますが、malloc()は
恐いとよく脅されるので、3.のようなプログラムの書き方でも
大丈夫なものなのか、質問してみたかったのです。
もっとも小心者はJavaでも使うのが正しいのかも知れませんが。
速度が要求される場合か、文字列のサイズが予測できる場合は 1
ユーザの手入力とかそういう入力データ系は 3
かな。

2は、プログラムであふれたかどうかを判断して、処理を書かないといけないので
普通はつかいません。

4も、使うところでは使われています(qmailやdjbdnsで有名なdjbの人とかね)

5は、3や4を使う場合の応用編なんだけど、とりあえずは忘れていていいよ。
面倒なんで最近は全部C++でstd::stringを投げ返してる。
いちいち考える必要がなくなるし。

あと、WindowsAPIがらみとか、渡されたバッファが足りないときは
エラーを返す、ってパターンもあるね。
ここはCスレ
867初心者:01/11/11 04:48
JAVAとCどっち簡単で使える?
>>867
日本語すらまともに使えない奴にはどっちも無理。
869デフォルトの名無しさん:01/11/11 04:56
>>867

文字列一回出すためだけにいっぱい書くの嫌ならC。
.exeファイルが作れなくても泣かないのならJava。
870デフォルトの名無しさん:01/11/11 05:33
Cを使うのはMS-DOS以来なので、intがふつー32bitになっただけで
カルチャーショックを受けている漏れなのですが、最近のOSでは
自動変数というかスタックはどのくらい使ってもOKなんでしょうか?

Windows 2000やLinuxで開発する場合の目安(?)が有れば教えてください。
ファイル読み込みのバッファとして1MBぐらい豪気に使ってもいいのか、とか。
1MBを越えないようにしとけばたいがい平気だが
100Kを越えた時点でふつう、馬鹿かと思う。
VCのリンカはデフォルトで1MBのスタックを確保。
873デフォルトの名無しさん:01/11/11 05:45
>>870
古典的なUNIXなら無限、というかユーザーリミットに
あたるまで。物理セグメントのないUNIXマシンが多かった。
freeやreturnで再利用されて合計値が下がるのでむしろ好ましい。
874870:01/11/11 05:48
デフォルトが1MBですか。Linuxのgccも同じぐらいでしょうか?

>871
数十KBぐらいなら、普通の組み方として許されますか?

あと、大きめの構造体を渡す時に参照渡しにするのは、
今でもやりますよね?
875デフォルトの名無しさん:01/11/11 05:50
>>874
Linuxは古典的な配置のはず。
>>870
たぶん例えで言ってると思うんだけどツッコミ。

>ファイル読み込みのバッファとして1MBぐらい豪気に使ってもいいのか、とか。
今日びのOSはファイルをキャッシュするから
わざわざ大きなバッファを使うメリットはほぼゼロだと思う。
877870:01/11/11 07:36
>876
いや、本気で言ってました……。
1byteずつ読んでも一向に構わないんですね?
878876:01/11/11 07:46
>>877
1 byteとかいう極小単位の場合は実装によると思います。
インラインやマクロで関数が実装されていれば実質的に
ポインタ操作と大して変わらないので。

常に非常に高速なアクセスが要求されるとか、作業に必要でないなら
最低限のバッファ(作業場)程度がいいんじゃないでしょうか。
私はそう考えているんですけども、、、。
UNIX系のOSの場合、multi threadにすると使えるstack spaceが減ったり
することがあるので注意。
今時のOSならファイル読み込みはメモリにマップしちゃうのが楽だと思われ。
>>879
マッピングだとワークエリアとして書き込んだときに元データが壊れるから嫌い
いや、俺それで大ミスしたことあるから
881デフォルトの名無しさん:01/11/11 09:47
>863
3は動かなくないはですが、あんまり良くないですね。
malloc()とfree()を別の関数でやると、それぞれの関数の汎用性(独立性)が下がるんで。

realloc()をうまく使えば、もっと方法がありそうですが。
Pascal文字列互換な関数郡ってないのかね?
varOleStr
884デフォルトの名無しさん:01/11/11 13:15
intel C/C++ Compilerって、gccやVC++よりも
ものすごい勢いで最適化したりするの?
しないって。Intelのツールの恩恵を受けやすくなってるだけ
ものすごい勢いじゃないにしてもVCやgccより良くない?
VCとはどっこいどっこい。
いいところもあれば悪いところもある。
ただ、確実にgccよりはいいね。

vector Cとか言うのが最適かすごいらしいが。
888仕様書無しさん:01/11/11 23:41
http://www.pro.or.jp/~fuji/computerbooks/c/c.kernighan.html

この本どうですか?
使用されてた方や知っている方がおられましたら感想聞かせてください。
>>888
ハヤシハルヒコ
>>888
必読

そのあとで林晴彦読むと、ヘタレっぷりがよく分かる
>888-890
ジサクジエン ゴクロウサン(ワラ
892888:01/11/12 00:06
>>889
ハヤシハルヒコを買えということ?

>>890
そうですか。今会社の研修で使ってるのですが、
プログラミングの勉強はじめてなんで、この本で勉強を
したことが私の基礎になりそうで気になっていたので安心しました。
この会社を研修本にしてる私の会社はある程度見所ありそうですかね?
893仕様書無しさん :01/11/12 00:18
つーか蟹飯とK&Rはプルグラマのバイブだぞ  ブルブル(・∀・)
894888:01/11/12 00:18
>>891
ちがうYO!
>>887
ハヤシハルヒコを買え
ある意味必読
895888:01/11/12 00:19
>>891
なんだよ自作自演て。
掲示板をそんな見方しか出来ないのか。
人間が小さいな、ド厨房さん。
896デフォルトの名無しさん:01/11/12 01:56
プログラミングの質問ではないけど、
C言語でプログラムを書くにあたって便利なツールは何がありますか?
>>896
UNIX
>>896
Emacs
cflow
警告メッセージをきちんと読む心がけ
(vim&&screen) || emacs
man2html
grep
find
窓な人なら迷わずcygwin
emacsで日本語表示するとなんかドットが荒いんだけど...
サルガッソーと猿実装って何か似てるよね♪
>>901
少し休むことも必要だぞ?
>>889-890
何でK&Rの感想で林が出て来んだよ
それに10分も後に辻褄ぼろぼろのレスつけてんのも変だしな 自作自演クサクサ
905デフォルトの名無しさん:01/11/13 21:49
データ構造を勉強するのにお勧めの本を教えてください。
できればC言語で学べる本がいいです。お願いします。
906デフォルトの名無しさん:01/11/13 22:01
sleep関数の最大指定秒数はどのくらいですか?
>>906
そもそも sleep() は標準ライブラリ関数ではないので、環境を明記しないと答えられないと
思われ。
>>907
POSIXらしいよ。
909仕様書無しさん:01/11/13 22:49
ちくしょーー悔しいがCは面白い。
病みつきになりそうだぜ。
コンパイラ理論も合わせて勉強すると、さらにおもしろくなるよ。
おまけで、最適化理論も学べるし :->
引数の型がunsigned intだから、最大UINT_MAX秒かな?
>>911
その前に死ぬけどね(笑)。
913デフォルトの名無しさん:01/11/14 00:03
Solaris7上のgccでテストしたら、599184000くらいで0を返したぞ。
914 :01/11/14 00:09
>>905
Cプログラムで学ぶアルゴリズムとデータ構造

学校で買わされたけど開かなかったなぁ。
915失礼いたします。:01/11/14 01:11
無料のborland C++ 5.5 コンパイラで、勉強しております。
訳あって、windows98から、windows2000に、OSを入れ替えましたので、
コンパイラを再インストールし直し、ilink32.cfgと、bcc32.cfgの
環境を設定し直しました。
その際、コマンドプロンプトの、作業フォルダの欄には、

"PATH=インストールしたフォルダの場所; %PATH%"

と、98の時と同じ設定をしたのですが、コンパイルすると、

’コンパイルしようとしたファイル名’は、内部コマンドまたは
外部コマンド、操作可能なプログラムまたはバッチファイルとして認識
いません。

と、表示されてしまいました。何故なのでしょうか。
どなたか、教えて下さい。
916デフォルトの名無しさん:01/11/14 01:58
コンパイラじゃなくてDOSの勉強からやり直せ。
’コンパイルしようとしたファイル名’を直接実行してどうすんだよ。
’コンパイルしようとしたファイル名’の前になにか打ち忘れているだろ?
917がんばれや:01/11/14 02:17
BCBとVC++のどちらかのソフトを
買おうと思ってるんですけど、どっちが
買いでしょうか。
ちなみに私は学生では無いのでアカデミック版は
買うことができません。
もちろんBCBとVC++はプロフェッショナル版という事で。
918915:01/11/14 02:21
すいません。説明不足で。
その、「なにか」の

bcc32 ’コンパイルしようとしたファイル名’を、

入れたのですが、これがどうも・・。
と、言いますか、何もわからない素人で、
他の人に、ちゃんと説明できてるかもあやふやで・・。
勉強し直してきます。
>>917
目的は?
>>917
GUIが少しでも絡むならBCB。これ定説。
921デフォルトの名無しさん:01/11/14 03:19
はじめまして。C初心者です。

int count_sage = 0;
....
char tmp[20]="count_sage";

のようにソース上で記述してあったとして
int型のcount_sageという変数を
char型配列tmpを利用して間接的に
count_sageの内容を書き換えたい
(count_sage=100;と同様の事をしたい)と思っています。
が、やり方が分かりません。。こんなことできるんでしょうか??
ポインタを使ったほうがよいのでしょうか?どなたか教えて下さい。
よろしくお願いします。
>>921
int count_sage = 0;
int *tmp = &count_sage;
*tmp = 100;

変数名を文字列として持っていても C ではなんの意味もないです。
>>922
921はポインタまでまだいってなかったんだよ
924デフォルトの名無しさん:01/11/14 14:38
独学でCでも勉強しようかと本を買ってきたんだけど。それの練習問題で
「5566と24578の最大公約数を求めるプログラムを作れ」
って問題があったのですがどーやっても今の俺にはできないので教えてください。
多分for文とif文を組み合われて作るのかな?って思うんですが…
925デフォルトの名無しさん:01/11/14 14:41
>>924
5566と24578の最大公約数は2だよ.
これでもうプログラム作らなくてもよくなったね.
926デフォルトの名無しさん:01/11/14 14:44
そんなことよりもさあ,情報システム板でみつけてきたんだけど,

while (k > 1) k = k % 2 == 0 ? k / 2 : 3 * k + 1;

が任意のk(正の整数)について停止するのはなぜなんだ?
>>924
「最大公約数 アルゴリズム」で検索してみそ。
928デフォルトの名無しさん:01/11/14 14:50
>>924
とりあえず君くらいのレベルならこのプログラムでいいんじゃない?

/* a と b の最大公約数を求める */
int m, k, gcd;
m = x > y ? y : x;
for (k = 1; k < m; k++)
  if ((a % k == 0) && (b % k == 0)) gcd = k;
/* ここで変数 gcd に a と b の最大公約数が入っている */
929デフォルトの名無しさん:01/11/14 14:52
>>925
まちがい「5539と24634」だった。

一応約数でも出してそれから最大値でも調べるかなって思って
こんなプログラム作ったら何も表示されなかった。

{
int a,b,c;
a=5539;
b=24634;
for(c=2;c<5540;c++){
if(a%c==0){
if(b%c==0){
printf("%d\n",c);
}
  }
}
}
930デフォルトの名無しさん:01/11/14 14:53
ループは逆にした方が効率いいかもな(w
931デフォルトの名無しさん:01/11/14 14:54
つまり互いに素(最大公約数は1)ってことだろ?
>>926
それ、なんとか予想って数学の問題で、まだ証明されてないんじゃない?
933930:01/11/14 14:57
>>930は928に書いたのね。シャレで。

>>929
確かにそれじゃ表示されないよ
934デフォルトの名無しさん:01/11/14 15:12
gcdといえばユークリッドの互除法だよ。
int do_gcd (int x, int y)
{
if (y == 0)
{
return x;
}
else
{
return do_gcd (y, x % y);
}
}

int gcd (int x, int y)
{
return x > y ? do_gcd (x, y) : do_gcd (y, x);
}

こんなかんじでどうでしょう。
937デフォルトの名無しさん:01/11/14 16:38
>>936
最初に x, y の大きさで場合わけする必要はないのでは。
938デフォルトの名無しさん:01/11/14 17:16
質問です。
常にパスを通したいディレクトリを増やしたいのですが
gccの環境変数はどのように設定すればよいのですか?
設定ファイルでもあるのでしょうか?よろしくお願いします。
939デフォルトの名無しさん:01/11/14 17:25
bash等で使われているreadlineライブラリの使い方が載っているホームページありますか?
若しくはどなたか簡単なreadlineのサンプルを見せてください。
940俺は童貞だが、:01/11/14 17:36
マジで分からんば。
int型を、char・string型に変換するのはどうするばよか?
どじゃか、教えてくんさい。
941デフォルトの名無しさん:01/11/14 17:39
(-_-) 「char・string」ッテドンナカタナノ?
(∩∩) sprintfジャダメナノ?
>>938
OSによるし、やり方もいろいろある。
Windowsか? UNIXか?
makeするのに通っていればいいのか? 常に検索対象にしたいのか?
>>940
char*型なのかstring型なのかはっきりせい。
ちなみにCにはstring型はないぞ。
944デフォルトの名無しさん:01/11/14 17:49
>>942
レスありがとうございます。
OSはLinuxです。常に検索対象にしたいです。
よろしくお願いします。
>>939
man readlineは読んだか?
946939:01/11/14 17:53
もちろんreadlineは読んだけど解りません。
>>944
~/に .で始まる環境設定ファイルがあるはず。
ファイル名や構文はshellによって違う。
bashなら .bashrcとかにpath設定する。
まずは入門ページを探す。
>>944
普通Linuxならgccは/usr/binにインストールされるからあらためて追加する必
要はないはずだが。

一般的には~/.profileに
export PATH="$PATH${PATH:+:}/path/want/to/append"
つー感じ。
>>947-948
レスありがとうございました。やってみます。
シャー
951最大公約数の人:01/11/14 18:26
一応こんな感じでいいんですか?答えは191になったのですが・・・。
#include <stdio.h>
#include <stdlib.h>
void main()
{
int k,gcd;

for(k=1;k<5539;k++)
if((5539%k==0)&&(24639%k==0))gcd=k;
printf("%d",gcd);
}

「int m, k, gcd;」を最初に書くとなにやらエラーが出るので「void main()」
にしたんですが、どこかおかしいですか?
952939:01/11/14 18:36
readlineのサンプルソースコードをぉぉ
953デフォルトの名無しさん:01/11/14 18:39
>>951
間違い最後の奴で
「int m, k, gcd;」は「int gcd(int x, int y)」
954デフォルトの名無しさん:01/11/14 18:44
24634じゃなかったのか???
956955:01/11/14 18:50
あ、まちがえた・・・
957公約数のひと:01/11/14 19:21
>>954
間違えた。
「#include <stdlib.h>」もいらないね
はずかしので自ら晒しage
>>951, >>953
void main() を int gcd() にしてたってこと?
ソース中にmainがないと、プログラムをどこからはじめたらいいのか分からないので
エラーで怒られたということね。
959デフォルトの名無しさん:01/11/15 01:30
void func(int a)
{
 int b[]={a,a,a,1};
}
ってCでも出来たっけ?
960デフォルトの名無しさん :01/11/15 01:41
gccてSIFTJISで書けないの?エスケープ出来ないし 
ダサっ! ププププ
すいません真出来ます 
>>959
できる。

ところで<8>は?
963デフォルトの名無しさん:01/11/15 01:57
VC++ってEUCで書ける?
EUCはSJISとちがってまだまともなコードだから大丈夫じゃない?
メッセージは滅茶苦茶になるだろうがコンパイルくらいなら
問題ないだろう。

シフトジスが通らないのはそれだけシフトジスの設計が
滅茶苦茶だってことなんだけどな。
965公約数のモノ:01/11/15 02:13
>>958
その通りです

教えてくれた人ありがとう御座います
>>964
そうとも限らんのじゃないか?
"\xa1\xe0\\" \xa0は0xa0そのままとして
EUCだと"÷\\"と正しい文字列になるが、
SJISだと"。濬\"と閉じていない文字列になってしまう。
>>960 勘違いする人がいると困るからマジレスしとくと、gccでもShift_JIS使
えるよ。configureに--enable-c-mbcharを付けてmakeし、環境変数LANGに
C-SJISを設定しておけばいい。

>>966 VC++でEUCをコンパイルするには、Windowsのロケールを英語等のシング
ルバイト圏にすれば大丈夫だったはず。
でも--enable-c-mbcharってかなりバグってるって話だけど。

うーん、そうか。しかしWindowsのロケールってすぐに変えられるもんだったっけ。
>>968
> でも--enable-c-mbcharってかなりバグってるって話だけど。
wchar_t *ws = L"漢字" みたいなのはあやしいけど、文字列リテラルの中に
"表示" って入れるくらいなら大丈夫。

> うーん、そうか。しかしWindowsのロケールってすぐに変えられるもんだったっけ。
Windows 2000ならコントロールパネル→地域のオプション→全般タブ→ロケール
で変えられるよ。
コマンドプロンプトからchcp 437して実行しても大丈夫かも。
970デフォルトの名無しさん:01/11/15 09:14
みんなはreadline使わないのですか?あんなに便利そうなのに・・・・・
>>969
> Windows 2000ならコントロールパネル→地域のオプション→全般タブ→ロケール
> で変えられるよ。
> コマンドプロンプトからchcp 437して実行しても大丈夫かも。
それでVCって対応する?
972969==967:01/11/15 12:00
>>971 たしか、VC++は大丈夫だったと思うのよ。今手元に環境がないから、
誰か試してみてくれ。記憶違いだったらスマソ。
973デフォルトの名無しさん:01/11/15 16:20
GNUのreadlineは駄目なんですか?興味ないんですか?
974DOKEY:01/11/15 16:54
10万までの素数の表を求めかつ1から100、101から200......
99901から100000それぞれにいくつずつ素数があるか数える
Cプログラムを教えてください
975デフォルトの名無しさん:01/11/15 16:56
宿題丸投げは別スレだバカ
976凡才ハカー:01/11/15 17:05
977DOKEY:01/11/15 17:28
これはどう?
#include <stdio.h>
#define YES 1
#define NO 0
#define MAX 10000
#define BOXNUM 100 /* BOXNUM= MAX/100 */

int isprime(int n);

main()
{
int i, j, k;

int box[BOXNUM];
for (j = 0; j < BOXNUM ; j++) box[j] = 0;

printf("2 "); /* 2 is prime */
box[0] = 1;

for (i = 3; i < MAX; i = i + 2) { /* check only odd numbers */
if (isprime(i) == YES){
printf("%d ", i);
box[i/100]++;
}
}
printf("End.\n");

for (k = 0; k < BOXNUM; k++)
printf("box%d: %d\n", k, box[k]);
}

/* n is prime? */
int isprime(int n)
{
int i;

for (i = 3; i < n; i = i+2){ /* devide n by odd number < n */
if (n % i == 0) return NO;
}
return YES;
}
以下の関数がよくわからないんですが、どういう意味なんでしょうか?
malloc
free
isprint
strcmp
exit
ちょっと多いですが、誰か教えてください。
979Kusakabe Youichi:01/11/29 11:25
>>978: デフォルトの名無しさん wrote:
> 以下の関数がよくわからないんですが、どういう意味なんでしょうか?

マニュアル見ればいいのでは?
どうしてもマニュアル見ちゃいけないというおばあちゃんの遺言とかだったら、
べつの本でもいいけど。

たとえばある入門書では、

> malloc()
178ペイジにでています。

> free()
178 ペイジにでています。

> strcmp()
105 ペイジにでています。

> exit()
66、77ペイジにでています。
980ひよこ名無しさん:01/11/29 11:28
>>978
宿題か?自分で調べろ。
malloc()free():メモリ関連
isprint():文字種別判別関連
exit():標準ライブラリ関数
981:01/11/29 11:31
コマンドラインパラメータとオプションフラグって何?
982ひよこ名無しさん:01/11/29 11:31
>>977さん。最高です。フェイントっぷりがこにくいです。一生付いていきたいです。
983978です:01/11/29 11:34
>>979
その入門書って何の本でしょうか・・・?
984Kusakabe Youichi:01/11/29 12:19
>>981
>981: 犬 wrote:
> コマンドラインパラメータとオプションフラグって何?

コマンドラインパラメーターってのはコマンドラインのパラメーター
コマンドラインってのはたいした意味はなくて、
コマンドをキーボードから打ち込むタイプの環境で
foo abc def ...
みたいに打つ場合、一番最初がコマンド名である場合が多いので、
2つめ以降のがパラメーターだったりするわけです。
で、そのパラメーターのことを「コマンドラインパラメーター」という
とかその程度の意味です。

41ペイジに説明がありますね > コマンドライン

オプションスイッチ、オプションフラグなどは同様に102ペイジに解説が
ありますね。
985デフォルトの名無しさん:01/11/29 12:29
>>983
「作ってわかる
Cプログラミング」
http://dennou.gihyo.co.jp/books/void_c/

宣伝うぜ!
986978です:01/11/29 12:35
>>985
ってことは、その本を見れば>>979の内容がわかるんですね?
見てみようかな・・・?
そもそもC言語の本って多すぎて、どれがいいかわかんない!!
一冊お買い上げ!
988Kusakabe Youichi:01/11/29 12:39
>>986: 978です wrote:
> そもそもC言語の本って多すぎて、どれがいいかわかんない!!

そもそも「C言語」の本を探すより「C」の本を探すほうが
いい本に当たる確率がぐっと高まりますよ。
989986です:01/11/29 12:44
>>988
C言語とCって違うんですか?
990Kusakabe Youichi:01/11/29 12:51
>>989: 986です wrote:
> C言語とCって違うんですか?

同じものを意味するんですが、
言い方がちがうわけです。

Fortran言語とかPascal言語とかC++言語とか書いてある本が
お薦めじゃないのと同じです。
991986です:01/11/29 12:54
>>990
なにか、おすすめの本はありますか?
992Kusakabe Youichi:01/11/29 13:04
>>991: 986です wrote:
> なにか、おすすめの本はありますか?

Cの本で「売れている順」のリストだったら、べつの場所に書いてありましたよ。
993991です:01/11/29 13:12
>>992
そうなんですか。なら見てみようと思います・・・ ってどこになるんでしょう・・・
994デフォルトの名無しさん:01/11/29 13:12
>>991
林晴彦さんの本が評判良いようですよ。
995デフォルトの名無しさん:01/11/29 13:22
目的によって薦める本が違ってきそう。
仕事で使うCなら少なくとも
www.hir-net.com/book/book19/index.html
みたいなANSIの規格書使ってなきゃ、一緒に仕事したくないな。

ところで新たな質問は新スレでした方が良さそうだね。
996@@@:01/11/29 13:26
C言語最強だー。
他にも 色々言語あるけど やっぱりCが最高。
997
sage
早く使い切ろう
1000らうんじゃ:01/11/29 14:03
失礼。
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。