C言語なら俺に聞け! Part 108

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。

GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。

エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/

各種リンク、関連スレは>>2-13あたり

C言語なら俺に聞け! Part 107
http://pc8.2ch.net/test/read.cgi/tech/1116340323/
C言語なら俺に聞け! Part 106
http://pc8.2ch.net/test/read.cgi/tech/1113102515/
他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
2デフォルトの名無しさん:2005/06/02(木) 14:38:35
【コンパイラ】
gcc
http://gcc.gnu.org/

【Win32用の開発環境のみ。】
gcc-cygwin
http://www.cygwin.com/
gcc-mingw
http://www.mingw.org
Digital Mars C++
http://www.digitalmars.com/
Open Watcom
http://www.openwatcom.com/
Borland C++ Compiler 5.5.1
http://www.borland.co.jp/cppbuilder/freecompiler/
Visual C++ Developer Center: Microsoft Visual C++ Toolkit 2003
http://msdn.microsoft.com/visualc/vctoolkit2003/

【ライセンスや機能などに問題あり】
Microsoft C/C++ 13.0.9466(VC.NET)
http://www.microsoft.com/japan/msdn/netframework/downloads/
LCC-Win32
http://www.cs.virginia.edu/~lcc-win32/
CINT
http://root.cern.ch/root/Cint.html
めじろ++98
http://www.vector.co.jp/soft/win95/prog/se075910.html
Intel C++ Compiler for Linux
http://developer.intel.com/software/products/compilers/clin/noncom.htm
3前スレ996:2005/06/02(木) 19:41:25
うっかりしてますた
44様:2005/06/02(木) 19:42:43
1-2<<乙
5デフォルトの名無しさん:2005/06/02(木) 19:45:15
C89とか言われたので、規格票を持ってない俺はどうすればいいのかと悩んでた。
よくよく考えればK&Rの第二版がだいたいC89だったなぁ、と思い起こした
あたりで、時間切れですた。
6デフォルトの名無しさん:2005/06/02(木) 20:06:11
質問なのですが、Cプログラム内に「LIB(\)$〜」といったコマンド(LIB(\)$STOP等)が出てきたのですが意味がわかりません。ネットで調べてもよくわかりませんでした。
どなたか解説サイト、ヒント、又は書籍でもいいので教えて下さいm(__)m
7デフォルトの名無しさん:2005/06/02(木) 20:15:02
>>6
Cコンパイラに掛ける前に、なんらかの処理系を通すんだろうねぇ。
取り敢えず聞いたことがあるのはSQLとかGUI処理系だけど違いそうだね。
8デフォルトの名無しさん:2005/06/02(木) 20:22:09
9デフォルトの名無しさん:2005/06/02(木) 20:27:28
VMSかい・・
10デフォルトの名無しさん:2005/06/02(木) 21:30:19
本などでは
char str[10];
strcpy(str, "あいう");
と書いてますが、
char* str;
str = "あいう";
こっちでもできるし、strcpy関数使わなくてすむんじゃないんでしょうか?
後者じゃだめな理由ってなんですか?
11デフォルトの名無しさん:2005/06/02(木) 21:34:53
>>10
全く問題ない。
ただし後者の場合、文字列は書き換えしてはいけないから変数の型をconst char *にするのが望ましい。
12デフォルトの名無しさん:2005/06/02(木) 21:38:12
>>10
やっている事は全く違うという事は理解できてる?
13デフォルトの名無しさん:2005/06/02(木) 21:38:50
>>10
char* str;
str = "あいう";
strcpy(str, "えお");
ってする?
1410:2005/06/02(木) 21:39:39
ありがとうございます、だったら本でも両方教えればいいと思うんですけどね
char* str;
こっちだと、ただのポインタで領域を確保はしてないから他のプログラム等で上書きされる恐れがあるのかな、とか思ってたんですが・・・
15デフォルトの名無しさん:2005/06/02(木) 21:41:53
>>14
"あいう"って文字列はそれ用の領域が用意される。
だからconst char *の変数へ入れても全く問題ない。
1610:2005/06/02(木) 21:43:04
>12
文字列の先頭のポインタの代入と文字列のコピーですよね?

>>13
すいません言ってる意味がわかりません・・・
17デフォルトの名無しさん:2005/06/02(木) 21:46:27
> ただのポインタで領域を確保はしてないから他のプログラム等で上書きされる恐れがあるのかな、とか思ってたんですが・・・

思ってたって、昔は思ってたが今は思わなくなっちまったってことか?
誰だ?ちゃんと責任取れよ。
18デフォルトの名無しさん:2005/06/02(木) 21:49:48
>>10
メモリ上の位置が変わるからじゃないですか?
1913:2005/06/02(木) 22:05:26
やらないなら、いいんじゃない。
2013:2005/06/02(木) 22:05:49
21デフォルトの名無しさん:2005/06/02(木) 22:11:32
C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
22デフォルトの名無しさん:2005/06/02(木) 22:24:01
質問です。
str系、is系を使わずに、
文字列比較をしたいのですが、
どのようにやるのでしょうか?
23デフォルトの名無しさん:2005/06/02(木) 22:32:23
1文字ずつ charで比較する。
char同士なら、<,>,==等使える
24デフォルトの名無しさん:2005/06/02(木) 22:36:17
>>22
ひょっとしてそれは宿題で言っているのか?(AA略)
25デフォルトの名無しさん:2005/06/03(金) 02:00:54
pthreadについて質問です。

メインスレッド
-----------
1-1. socket要求待ち受け
1-2. accept()、recv()
1-3. pthread_attr_init()
1-4. pthread_attr_setdetachstate()でPTHREAD_CREATE_DETACHEDを設定
1-5. pthread_create()
1-6. pthread_attr_destroy()
1-7. pthread_cancel()

子スレッド
-----------
2-1. 1-2の残りをrecv()、send()
2-2. select()で1秒ほど待機
2-3 socket解放
2-4. return 0

こんな感じのコードを書いて動かしたところ、クライアントからの一発目の要求は2-2で
pthread_cancel()が走り、正常に取り消されまた1-1に戻ったんですが、直後に二発目
の要求を出すと、pthread_create()の戻り値は正常なのに2-1の処理が走りません。
スレッドはデタッチ状態で起動するため、pthread_cancel()の後スタックが解放されるから
二発目以降の要求も問題ないと思ったんですが、何が問題なんでしょうか。
ソケットのclose、shutdownをしていないのが問題?

OSはHP-UX11.0、コンパイラはgcc2.95です。
26デフォルトの名無しさん:2005/06/03(金) 02:06:37
>>25
スレ違い。
27デフォルトの名無しさん:2005/06/03(金) 02:07:35
リスト構造の番兵って一体何なんですか?
検索しても、いまいち分からないもので…
28デフォルトの名無しさん:2005/06/03(金) 02:15:01
>>27
リストや配列の終端を表す特殊値のこと
乱暴な話、Cの文字列終端の'\0'も番兵の一種
29デフォルトの名無しさん:2005/06/03(金) 02:21:42
番兵って言うから判りにくいんだよ。
センティナェォって言えば意味が判りやすいんじゃないかな。
3027:2005/06/03(金) 02:24:42
>>28-29
ありがとうございます!
なるほど…\0もセンティナェォの一種なのか…
31データボックス:2005/06/03(金) 06:16:11
http://pc8.2ch.net/test/read.cgi/tech/1116340323/995

do および while(0) は不要でブロックで囲むだけでいいんじゃないか。
32デフォルトの名無しさん:2005/06/03(金) 06:38:04
ちょっとお聞きしたい、ビジュアルスタジオC++のコンソールアプリケーションに関する話なんだけど、
ソース内で、コンソール画面の大きさを変更って出来ますか?
標準のヘッダーでインクルードできる範囲内で教えて欲しい。
昨日から考えてるんだけど全然わかんなくて・・・それともスレ違い?
33デフォルトの名無しさん:2005/06/03(金) 06:54:56
>>32
スレ違いとわかってんなら書き込むな
34デフォルトの名無しさん:2005/06/03(金) 07:08:51
>31

終端の;を強制できるし、if(a) swapf(b,c); else swapf(d,e);みたいな
コードでエラーを出さずにすむ。はっきり言うなら、マクロの定石。
35デフォルトの名無しさん:2005/06/03(金) 07:22:09
まあこんな変なマクロ書くくらいなら関数にするけどな
36デフォルトの名無しさん:2005/06/03(金) 07:32:53
>>35
そうか?ループ中など、関数によるオーバーヘッドが大きい時はこういう事もありと思うがな
一個や二個だったら手書きで書くけど。
37デフォルトの名無しさん:2005/06/03(金) 09:46:10
inline ・・・ ってここはCスレか。
38デフォルトの名無しさん:2005/06/03(金) 09:52:03
C99(ボソッ
39デフォルトの名無しさん:2005/06/03(金) 10:37:25
srand(time(null)%100);
ってどういう意味ですか?
40デフォルトの名無しさん:2005/06/03(金) 10:40:25
適当に乱数の種をまく
4139:2005/06/03(金) 13:26:15
nullはここではどういう意味(使われ方)ですか?%100はどういう意味ですか?
42デフォルトの名無しさん:2005/06/03(金) 14:10:20
time関数は戻り値でも時間を持ってこれるから
null以外で指定した場合はそこに時間を格納してくれる
%は除余演算子

つまり、時間を100で割ったあまりをsrandの引数(乱数種)としているわけです
43デフォルトの名無しさん:2005/06/03(金) 14:40:39
nullじゃなくてNULLだな。
それにしても、種の種類が100しかないのか。
44デフォルトの名無しさん:2005/06/03(金) 14:42:40
>>43
馬鹿はカエレ(・∀・)
45デフォルトの名無しさん:2005/06/03(金) 15:05:43
>>41
いちご
46デフォルトの名無しさん:2005/06/03(金) 15:06:48
>>32
できるけど多分オマエには無理。
47デフォルトの名無しさん:2005/06/03(金) 15:45:37
int tes[2];
tes[0] = 0x0A;
tes[1] = 0xBC;

上のtes[0]とtes[1]をくっつけて0x0ABCという風にしたいんですが
やり方がわかりません。。。
48デフォルトの名無しさん:2005/06/03(金) 15:54:39
>>47
(tes[0] << 8) | tes[1]
とか。符号が気になるけど
4932:2005/06/03(金) 16:18:20
>>33,46
答えてくれてありがと、できるならがんばってみる。スレ違いごめん
5047:2005/06/03(金) 16:31:52
ありがとうございます 参考にします。
51デフォルトの名無しさん:2005/06/03(金) 18:49:45
VC++で_msize()にmalloc()で確保したポインタを渡せば、そのメモリブロックサイズを返してくれますが、gccでmalloc()で確保したポインタを元に、メモリブロックサイズを取得するのってどうやるんでしょうか?
宜しくお願いします。
52デフォルトの名無しさん:2005/06/03(金) 18:56:54
環境依存だ。
スレ遣い。
53デフォルトの名無しさん:2005/06/03(金) 18:57:01
>>51
標準Cでは、malloc()で確保した領域のサイズは自分で管理しなければならない。
54デフォルトの名無しさん:2005/06/03(金) 19:43:20
>>52
スレ違いになるんですね(汗
すみません。

>>53
そうなんですか!(汗
C++のstringのような動的配列もどきを作ろうかと思ったのですが、
mallocやreallocの返すポインタからサイズが取得できないとなると、
返り値のポインタと一緒に確保したサイズを保存しておくリスト構造の
ような領域が別途必要になるってことですね…。
ありがとうございました。
55デフォルトの名無しさん:2005/06/03(金) 21:11:42
> リスト構造のような
???
56デフォルトの名無しさん:2005/06/03(金) 21:51:27
さて、そろそろビットシフトでも召喚するとするか。
57デフォルトの名無しさん:2005/06/03(金) 21:53:45
>>56
たのむからやめてくれ
58デフォルトの名無しさん:2005/06/03(金) 23:12:31
>>47 に先に答えがw
59デフォルトの名無しさん:2005/06/03(金) 23:19:17
>>54
こんなんじゃだめ? (offsetofは標準じゃなかったはずだが、同等のマクロがどっかにあるはず)
typedef struct {
 size_t size;
 char buffer[1];
} string_t;
string_t *string_new(size_t size) {
 string_t *s;
 if ((s = malloc(offsetof(string_t, buffer) + size)) == NULL) {
   return NULL;
 }
 s->size = size;
 return s;
}
60デフォルトの名無しさん:2005/06/03(金) 23:23:16
sizeof(size_t) じゃダメなのか?
6159:2005/06/03(金) 23:29:38
>>60
>>59だけだったら結果的には問題はでないだろうけど、bufferの手前にいろいろメタデータ持たせたらハマる要因にならん?
あと、string的なものを実装するなら、sizeに1足して、最後に\0入れといた方がいいね。
62デフォルトの名無しさん:2005/06/03(金) 23:30:48
それを言うなら sizeof(string_t)
じゃないか
\0の分の領域は必要だしな。sizeof(string_t) + sizeで、
ちょうどsize分の長さの文字列を格納するのに具合のいいサイズになる。

でも俺なら

struct vec {
  T *data;
  size_t length;  // データ長
  size_t capacity; // 確保済みの領域長
};

みたいにするけどな。
63デフォルトの名無しさん:2005/06/03(金) 23:31:28
あ、>>62>>60へのレスな。
64デフォルトの名無しさん:2005/06/03(金) 23:35:18
>>59
offsetofは標準。<stddef.h>

あと俺ならこうする、どうでもいいけど。
string_t *s = malloc(offsetof(string_t, buffer) + size);
if (s == NULL)
6559:2005/06/03(金) 23:35:44
でも実はそーゆーのを必死で実装するより、aprとか使った方が生産性が良さげな罠orz
66デフォルトの名無しさん:2005/06/03(金) 23:38:32
ていうか素直にC++使えと
67デフォルトの名無しさん:2005/06/04(土) 02:49:29
幼稚な質問すみません(><)


int型の変数を3つ用意して数値を
それぞれの変数に格納するんだけど



※(enter)はエンターキーを打つ。

A
----------------------------
数値を入力して下さい。       
10(enter)                 ←コマンドプロンプト画面   
11(enter)
12(enter)
----------------------------

B
----------------------------
数値を入力して下さい。
10(enter) 11(enter) 12(enter)

----------------------------


AじゃなくてBみたいな感じにしたいけど分かりません(><)
どーしたらいいか教えて下さいm(_ _)m
68デフォルトの名無しさん:2005/06/04(土) 02:56:10
なんだそりゃ。ユーザがenter押しても改行しないで欲しいの?

端末の通常の動作では、ユーザのキー入力はそのまま端末にエコーバックされる
(表示される)から、それを変えないとダメだ。で、そのやり方は
完全に処理系依存だ。
69デフォルトの名無しさん:2005/06/04(土) 03:13:00
>>68
早い返答ありがとうございますm(_ _)m

環境はwinXP,でコンパイラはBorland C++ Compiler 5.5なんですが・・・
あとは自分で調べます。ありがとうございました。
70デフォルトの名無しさん:2005/06/04(土) 03:35:31
>int型の変数を3つ用意して数値を
>それぞれの変数に格納するんだけど

scanf("%d,%d,%d",&a,&b,&c);


10,20,30(enter)
ではいかんのか?
71デフォルトの名無しさん:2005/06/04(土) 03:49:57
うん。駄目。
72デフォルトの名無しさん:2005/06/04(土) 04:28:30
WindowsならコンソールAPI調べろ。
UNIX/Mac OS X/Cygwinなら端末制御だ。
どっちにしろ、素人にはお勧めしかねるが。
73デフォルトの名無しさん:2005/06/04(土) 04:43:26
>>72
スレ違いなのに親切にありがとうです。
74デフォルトの名無しさん:2005/06/04(土) 04:59:29
C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?
75デフォルトの名無しさん:2005/06/04(土) 05:22:04
>>56
お前のせいで
76デフォルトの名無しさん:2005/06/04(土) 05:36:11
ひーとびとーのひっとびっと〜
77デフォルトの名無しさん:2005/06/04(土) 08:22:36
>>74
ステッピングモータを駆動するために存在します
78デフォルトの名無しさん:2005/06/04(土) 09:10:57
>>
ビットシフトしたい時に使う。
パリティビットの計算とか、ビット単位で処理を行いたい時とかあるだろ。
79デフォルトの名無しさん:2005/06/04(土) 09:14:37
新たにマジレスする人が後を絶たないな
80デフォルトの名無しさん:2005/06/04(土) 09:42:10
  「ビットシフトなんて実際使わないよ」

なんてことを まるで 自分は知識人? 常識人である風に 言うヤツには
正面から 向かって 目を見て 言ってやれ

  俺が使うんだ  私がビットシフトするんだ

みんなビットシフト使おうよ
でかい、でかいビットシフターになれ!
81デフォルトの名無しさん:2005/06/04(土) 10:46:58
「でかいビット」って何?
82デフォルトの名無しさん:2005/06/04(土) 11:13:35
ちんこのこと?
83デフォルトの名無しさん:2005/06/04(土) 14:34:02
ビットシフトで行なう処理の大半は、データ構造から考え直せば別の処理でもできる。
ビットシフトにする利点は、処理が早い事とコード量が少なくて済む事。
人間の側から機械に歩み寄ってやれば、機械は楽になるって事だ。
最近の流行とは逆方向だけどな。
84デフォルトの名無しさん:2005/06/04(土) 15:19:52
>>83
氏ねばいいのに
85デフォルトの名無しさん:2005/06/04(土) 15:32:59
横レス。


マジレスする親切な人も
ネタレスする寒い人も
似たり寄ったり目糞鼻糞。
86デフォルトの名無しさん:2005/06/04(土) 15:51:23
printf と sanf と 繰り返し(for文)と if文
すべてを使って自分でプログラムを作成しろって課題がでてるのですが
何にするかマッタク思いつかない…。何かいいのありませんでしょうか?
よろしくお願いします。
87デフォルトの名無しさん:2005/06/04(土) 15:56:19
>>86
for(;;)
printf("sanf\n");
88デフォルトの名無しさん:2005/06/04(土) 16:00:29
>>86
char typo[]="scanf";
if(strcmp(typo,"sanf"))
exit(0);
89デフォルトの名無しさん:2005/06/04(土) 20:29:12
>>86
宿題スレへどうぞ。
90デフォルトの名無しさん:2005/06/04(土) 20:31:14
>>86
無限ループ使って、二つの数字を入力したら
その積を出力せよ。
なお、0が入力されたらループ終了。
91デフォルトの名無しさん:2005/06/04(土) 23:36:37
>86
与えられた文字列に対し、
**************
* こんな感じで *
**************
飾りをつけて出力するプログラム(某書籍のサンプルのパクリ)。
92デフォルトの名無しさん:2005/06/05(日) 00:24:49
>printf と sanf と 繰り返し(for文)と if文
あと、せめて乱数が使えれば...
93デフォルトの名無しさん:2005/06/05(日) 00:53:57
電卓
94デフォルトの名無しさん:2005/06/05(日) 01:21:27
while ではなく for と言うところに着目しなければ駄目だゾ。
95デフォルトの名無しさん:2005/06/05(日) 01:55:13
おにいちゃんC言語おしえて
96デフォルトの名無しさん:2005/06/05(日) 01:57:57
このスレには、おじいちゃんしか居ません。
97デフォルトの名無しさん:2005/06/05(日) 02:23:23
音声データを読み込んで波形を表示するプログラムなのですが、
p = (double)600 / SIZE;
の部分が何を表しているのか解りません。
解る方がいましたら、解説お願いします。

ソース
ttp://www.uplo.net/www/vip13050.txt
音声データ
ttp://www.uplo.net/www/vip13051.txt
98デフォルトの名無しさん:2005/06/05(日) 02:29:58
600をdoubleに変換して10100で割ってる。
p = 0.059405940594059405940594059405941
99デフォルトの名無しさん:2005/06/05(日) 02:30:08
>>92
初期化してない自動変数の値読んだら駄目?>乱数
100デフォルトの名無しさん:2005/06/05(日) 02:32:22
>99
結構同じ値っぽい希ガス...試してみる価値はあるかな?
10197:2005/06/05(日) 02:32:50
>>98
はい、それは解るのですが、何を表しているのかが解りません…
10298:2005/06/05(日) 02:36:41
gw_line関数のパラメータ作ってる。
10397:2005/06/05(日) 02:37:28
質問の仕方が悪いです。

そのプログラムで、どういう役割を果たしてるのか?です。
10498:2005/06/05(日) 02:40:08
しらんがな。

gw_line関数の仕様か、もしくは関数の中を読まな。
105デフォルトの名無しさん:2005/06/05(日) 02:44:20
>100
試したがいつも同じ
106デフォルトの名無しさん:2005/06/05(日) 03:44:45
>>97
p = (double) 300 / SIZE;
とかに変えて、表示がどう変わるか試してみそ。
たぶん役割が判ると思うよ。
107デフォルトの名無しさん:2005/06/05(日) 04:00:06

    曰   \  もう、わかんないんです….            /
     | |      \      ∧_∧        ∧_∧      ./
    ノ__丶 ∧_∧\ ハァ...( ><) ≡3    (>< )うう… /__|
     ||鬼||( ><)  \  |  ⊃ヽC      C/⊂  |.     /|||||
  _ ||殺||./   [¢、)  \  、_( ))     ( ( )_ノ..    / | ̄| ∧ ウウ・・・
  \ ||し||∪ ̄ ̄. ̄ ̄\ \      ∧∧∧∧∧.   ... ./  |  |<)
  ||\.`~~´ ((二゚。◎彡) \ \   < の   わ >   /.  |  |⊂ | わかんないんです…
  ||\|| ̄ ̄ ̄ ̄ ̄ ̄ ̄|| ̄   \  <     か > ...../   |  | ∪
   .  || ̄ ̄ ̄ ̄ ̄ ̄ ̄||      \< 予   ん > /
 わかんないんです…        <       な > /
―――――――――――――――<  感   い >―――――――――――――――――
      ∧              ∧ <      ん >
     / ;わかんないんです / <.  !!!   で >
    /   ';          /   .<      す >       ∧_∧∩ / ̄ ̄
   /    ;______/    ;/∨∨∨∨∨\       ( >< ノ<わかんないんです
  /                    /         .\  __/ノ   /   \__
 /  ┯━┯         ┯━┯ ./            \\   ̄ ̄ ̄ ̄ ̄ ̄\
.|   ..)   ) _____  )   )/    /      ヽ   .\||\          \
|   ...(   (  ;,      / (   (/.    /        ヽ   ..\ || ̄ ̄ ̄ ̄ ̄ ̄ ̄||
108デフォルトの名無しさん:2005/06/05(日) 05:03:48
急速に(ry
109デフォルトの名無しさん:2005/06/05(日) 09:58:16
>>97
描画される幅が全部で600ピクセルってことでしょ。
pは1データあたりの描画幅の増加量。

ただ、gw_line()にdouble型を使ったり、
SIZEは定義しているのに600は定義してなかったり、
あまりいいプログラムではないと思うね。
110デフォルトの名無しさん:2005/06/05(日) 10:00:48
関数strlenの使い方がよくわかりません。どなたかご教授よろしくお願い
します。
#include <stdio.h>
#include <string.h>

main()
{
char A[500];

printf("INPUT>>>");
gets(A);

strlen(A);

printf("%d\n",A);
}

文字列を入力してその長さを出力するプログラムです。これではダメでした。
111デフォルトの名無しさん:2005/06/05(日) 10:02:37
#include <stdio.h>
#include <string.h>

main()
{
char A[500];
int B;

printf("INPUT>>>");
gets(A);

B = strlen(A);

printf("%d\n",B);
}
112デフォルトの名無しさん:2005/06/05(日) 10:09:10
ものすんごく、初歩的な質問かもしれませんが、
visual C++の環境で普通のC言語を用いてプログラムを書くことは可能なのでしょうか?
スレ違いな質問でしたら、大変申し訳ございません・・。
113110:2005/06/05(日) 10:12:52
わかりました。ありがとうございました。
>111
114デフォルトの名無しさん:2005/06/05(日) 10:16:01
>>112
余裕でできる。
完璧にできるかは知らないけど。
115112:2005/06/05(日) 10:19:05
>114
分かりました!!
早速のご回答、ありがとうございます!!
116110:2005/06/05(日) 10:27:19
もう一つ質問なのですが、度々すみません。

visual C++ 6.0 を使って、C言語で以下のようなプログラムを書いたのですが↓

#include <stdio.h>
#include <math.h>

main(){
double pi;

pi=3.1415;

printf("%d",pi);
}

ビルドして実行しますと何故か↓
-1065151889Press any key continue

って出力されます。
どうしてなのでしょうか?
どうか、よろしくお願いします。
117デフォルトの名無しさん:2005/06/05(日) 10:29:20
printf("%f",pi);
かな?
118110:2005/06/05(日) 10:37:53
>>117
ほ、ほ、ほホントだ!!
printf("%f",pi);
に変えただけで、出力が3.141500になりました!!
ありがとうございます★
119デフォルトの名無しさん:2005/06/05(日) 11:21:24
標準ライブラリに時間を計るためのタイマ関数ってありますか?
12097:2005/06/05(日) 11:28:59
皆さん有難うございます。
何となく解ってきました。
121デフォルトの名無しさん:2005/06/05(日) 11:33:35
>>119
<time.h>
の中に、clock()って関数があるようですが、
それでいいん?
122デフォルトの名無しさん:2005/06/05(日) 12:25:45
二つの文字列ptnとstrを引数とし、ptnがstrの一部分として現れていれば、先頭から何文字目から現れて
いるかを返し、もしptnがstrの一部分として現れなければ0を返す
関数を作成せよ。ただしptnがstrの二ヵ所以上に現れていれば、最後に現れるものの
先頭の位置を返すことにする。
例、str=abdacabcd ptn=abcならばptnは先頭から六文字目と十文字目に現れているが
後に現れる10を返す
#include <stdio.h>
#define N 80
int match(char str[],char ptn[]);
int main(void)
{ char string[N],pattern[N];
gets(string);
gets(pattern);
if(match(string,pattern)!=0)
printf("先頭から%d番目です\n",match(string,pattern));
else
printf("%dです。ありません\n",match(string,pattern));
return 0;}
int match(char str[],char ptn[])
{ int k,m;
for(k=0;str[k]!='\0';k++){
for(m=0;str[k+m]==ptn[m]&&ptn[m]!='\0';m++){;}
if(ptn[m]=='\0')
return k+1;}
return 0;}
と書いたのですが、先頭の値を返してしまいます。
どなたかヒントをください。(*/□\*)うわぁ〜ん
123デフォルトの名無しさん:2005/06/05(日) 12:27:29
>>122
>>1
>ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。
124デフォルトの名無しさん:2005/06/05(日) 12:35:25
あい・・・
(゜дÅ)ホロリ
125デフォルトの名無しさん:2005/06/05(日) 14:06:59
何げにgetsがわらわら出てくるのが激しく気になる。どんなテキスト使ってんだ……。
十数年前ですら「getsなんざ一律使用禁止」とゆー意見に特に異論は出てなかったと思うんだが。
126デフォルトの名無しさん:2005/06/05(日) 14:49:29
あるプログラムの途中なのですが、
if(key ==4 && )
とありますが、==と&& がどうしてでてくるかわかりません。意味もわかりません。
127デフォルトの名無しさん:2005/06/05(日) 15:00:30
ほんとに途中だろそれ
&&で終わってないよな?
128デフォルトの名無しさん:2005/06/05(日) 15:08:38
>122
ぢゃヒントだけでも

if(match(string,pattern)!=0)
printf("先頭から%d番目です\n",match(string,pattern));
else
printf("%dです。ありません\n",match(string,pattern));

ここをループして
129デフォルトの名無しさん:2005/06/05(日) 15:49:09
int match(char *str,char *ptn){
int num1 = 0,
num2;
int rtn = 0;

for(num2 = 0; str[num2] != '\0'; num2++){
if(ptn[num1] == str[num2]){
num1++;
if(ptn[num1] == '\0'){
rtn = num2 - num1 + 2;
num1 = 0;
}
} else {
num1 = 0;
}
}

return rtn;
}
130デフォルトの名無しさん:2005/06/05(日) 17:53:03
せっかくなので
strlen
strncmp
の把握に役立てよう
/* 最後に現れるものの 先頭の位置を返す */
int match(char str[],char ptn[])
{
int i,k,m;
for(k=0; str[k]; ++k); /* k=strlen(str); */
for(m=0; ptn[m]; ++m); /* m=strlen(ptn); */
for(k-=m; k>=0; --k){
/* if(strncmp(&str[k],ptn,m)==0) return k+1; */
for(i=0; i<m && str[k+i]==ptn[i]; ++i);
if(i==m) return k+1;
}
return 0;
}
131デフォルトの名無しさん:2005/06/05(日) 18:16:42
>>130
w
132デフォルトの名無しさん:2005/06/05(日) 18:17:12
UNIXよりの質問になろうかと思いますが
FストリームはUNIXでも使えるインクルードですか?
さらにstat関数でファイル情報を取得するプログラムを
作りたいのですがWinAPI関数となるFindFirst FindNextに変わる
UNIXで使用できるステートメントがあれば御教授いただきたい
133デフォルトの名無しさん:2005/06/05(日) 18:22:44
日本語で
134デフォルトの名無しさん:2005/06/05(日) 18:23:45
かいてね
135132:2005/06/05(日) 18:38:14
十分に日本語であろうかと思いますが
どこか伝わらなかった点がございますでしょうか?
136デフォルトの名無しさん:2005/06/05(日) 18:42:15
137デフォルトの名無しさん:2005/06/05(日) 18:43:42
だな
138デフォルトの名無しさん:2005/06/05(日) 19:13:57
直接C言語の質問ではないのですが、
Pro*Cを実行させる環境にランタイムは必要になるでしょうか?

つまり、開発環境でプリコンパイル、コンパイルした実行物を
別の実行環境(ただのCの実行環境)で使用することは可能でしょうか?

どこか参考になるサイト込みで教えていただけると幸いです。
よろしくお願いいたします。
139デフォルトの名無しさん:2005/06/05(日) 19:31:22
なんで「C言語の質問ではない」とわかっているのに
「C言語のスレ」で質問するんだろう。
140デフォルトの名無しさん:2005/06/05(日) 19:32:35
過去ログでおせっかいなくらい親切な人を確認したから。
141デフォルトの名無しさん:2005/06/05(日) 20:11:31
>>135
本気? 「Fストリーム」って何? 「インクルード」って何? 「ステートメント」って何? 専門用語使うなら正しく使いましょう。理解が怪しいなら無理に使わない。
142デフォルトの名無しさん:2005/06/05(日) 20:13:42
ポインタの指し示す先が動的に作られたものか、
変数として宣言されたものかを判断する方法は無いでしょうか?
143デフォルトの名無しさん:2005/06/05(日) 20:32:51
一般的にはない。
環境依存なら、あるかもしれない。

解決策は、自分でalloc,freeを包む関数を作ること。
144デフォルトの名無しさん:2005/06/05(日) 20:39:15
>>142
そんなことを意識しなければならないこと自体があんまりないような…
145デフォルトの名無しさん:2005/06/05(日) 20:39:41
>>142
ソース見ればわかるよ。

>>143
環境依存の質問じゃないだろ。
146デフォルトの名無しさん:2005/06/05(日) 20:40:51
>>132
もしやFストリームとはC++のヘッダのfstreamのことか?
147デフォルトの名無しさん:2005/06/05(日) 20:43:37
>>145
ソースがないとか。
148デフォルトの名無しさん:2005/06/05(日) 21:45:58
本に載ってるプログラムを聞きたいのだがそのまま書き込んでよい?
149デフォルトの名無しさん:2005/06/05(日) 21:55:39
Aというプログラム中でBというプログラムを
起動したいと思っています。

execl()という関数で試してみたのですが、Bを起動する
とAのメモリ上に展開されるため、Bが処理を終了すると
必然的に、Aも終了してしまいます。

Aを生かしつつ、Bというプログラムを実行する
関数ってありますでしょうか?
(スレッドとかではなく、実行ファイルを実行する関数が
あれば、ご教授ください。)
150デフォルトの名無しさん:2005/06/05(日) 22:00:58
system.
execlはfork前提だからなぁ。
151デフォルトの名無しさん:2005/06/05(日) 22:15:59
>>141
ファイルストリームご存知ないようですね
インクルードはヘッダで定義するファイルの事ですよ
ステートメントは知っての通り関数群です。
152デフォルトの名無しさん:2005/06/05(日) 22:25:46
釣人あらわれますた
153デフォルトの名無しさん:2005/06/05(日) 22:30:37
>>150

おお!
ご教授ありがとう御座います。

実は、Cのソースコード中でBashファイルを
実行使用としていたのです。(Linux環境)

今からテストしてみます。
感謝!!
154デフォルトの名無しさん:2005/06/05(日) 23:45:08
>>143
関数を包むって、たとえば#define alloc myalloc とかいう類いのこと?
開放忘れ探しに(デバッガが貧弱なら)、、、assertを参考に作ったよ。
bccだと__FUNC__ __LINE__ __FILE__もつかった。

で、__FILE__使うと絶対パスが入るらしく、後方から数えてn個目の\以
降のみの文字列を取得、、で力尽きた。おやすみねむ
155デフォルトの名無しさん:2005/06/06(月) 00:22:46
>>154
そんなことをしちゃいかーん

常に標準関数を呼ぶだけのラッパー関数を用意して使うようにしなさい。
で、何かあったらラッパー関数で処理の付け足しをするようにしなさい。
156デフォルトの名無しさん:2005/06/06(月) 01:54:55
C言語をはじめたばかりであまりわからないのですが、
gets()はなんの役に立つのでしょうか?
157デフォルトの名無しさん:2005/06/06(月) 01:58:11
>>156
過去との互換性のため「だけ」に残されてる
つかっちゃいけない関数の筆頭
158デフォルトの名無しさん:2005/06/06(月) 01:58:29
オマエのチソコと同じ。
オ○ニーには使えるが
実践では役に立たない。
159デフォルトの名無しさん:2005/06/06(月) 03:53:57
しまった、俺釣られたのか……。orz
160デフォルトの名無しさん:2005/06/06(月) 09:41:50
しかし泌尿機器としては超一流
161デフォルトの名無しさん:2005/06/06(月) 10:37:42
struct KOU{
long a;
long b;
};

KOU *kou = new KOU [100];

こういう感じで構造体を宣言したものを
0埋めの初期化処理ってどうやったらいいんでしょうか?
delete[];で一旦消すしか無理ですか?
162デフォルトの名無しさん:2005/06/06(月) 10:48:13
C++? structにもコンストラクタ書けるんじゃなかったっけ?
163デフォルトの名無しさん:2005/06/06(月) 10:49:56
>>158
実践て排尿の事だろ
十二分に使えているよ
164デフォルトの名無しさん:2005/06/06(月) 11:47:13
>>161
memset()でも、forループでも好きに使えばいいと思うよ
165デフォルトの名無しさん:2005/06/06(月) 12:24:41
>>164
memset(&kou,0,sizeof(kou));とやると落ちてしまいます。
どこかおかしいですか?
166デフォルトの名無しさん:2005/06/06(月) 12:53:33
>>165
それはポインタkouを0クリアしてるだけ。
memset(kou, 0, sizeof(KOU) * 100); じゃないかな。

あと、delete[]で消すことに何の意味が…
167デフォルトの名無しさん:2005/06/06(月) 13:00:47
>>166
なるほど!
ありがとうございます!
delte[]でどうこうしようと思ったのは、
一旦削除して生成し直したらいけるかなーと思ったので。
168デフォルトの名無しさん:2005/06/06(月) 13:17:19
乱数を使ってアルファベットと数字をいりまぜたパスワードを自動生成するプログラムってどう作ればいいですか?
コンパイラはborlandです。
169デフォルトの名無しさん:2005/06/06(月) 13:18:10
>>167
newの意味もdeleteの意味も勘違いしている。
そもそも、newの時点でスレ違い。
170デフォルトの名無しさん:2005/06/06(月) 13:19:39
>>168
設計して製造して試験すれば出来るよ。
171デフォルトの名無しさん:2005/06/06(月) 13:43:00
>>168
    char s[16],p[63]="0123456789AB…YZab…yz";
        for(i=0;i<15;i++)
            s[i]=p[(rand()%62)];
        s[15]=0;
        printf("%s\n",s);

この程度でよければ
172デフォルトの名無しさん:2005/06/06(月) 14:39:50
>>168
宿題スレでも見たな。イパーイ解答もらえて幸せ者だな。
173デフォルトの名無しさん:2005/06/06(月) 15:40:44
抽象的で分かりずらいかもしれませんが、
表○ 裏● の2通りがあって例えば、

○○○○○ なら赤色
○○○○● なら青色
○○○●○ なら黄色
○○○●● なら緑色
○○●○○ なら紫色
○○●○● なら茶色
○○●●○ なら水色
  ・
  ・
  ・

と並べた時に、全パターンを調べるには
どのようにループ文を使えば効率的に分かるのでしょうか?
174デフォルトの名無しさん:2005/06/06(月) 15:48:53
!
175デフォルトの名無しさん:2005/06/06(月) 16:05:09
>>173
「調べる」とは具体的に何をしたいの?
176デフォルトの名無しさん:2005/06/06(月) 16:07:32
効率的と入れた以上そうなる罠
じゃなきゃ>>174
177デフォルトの名無しさん:2005/06/06(月) 16:11:43
ん?しまった>>174じゃない
2の5乗でいいじゃん
178デフォルトの名無しさん:2005/06/06(月) 16:16:40
unsigned long int next =1;
int rand(void)
{
next=next *1130351524+12345;
return(unsigned int )(next \65536)%32768;
}
void srand (unsigned int seed)
{
next=seed;
}
これをつかって100個の疑似乱数を作成ってどうやるんですか>?
179デフォルトの名無しさん:2005/06/06(月) 16:45:21
>>178
randを100回呼び出す。
180デフォルトの名無しさん:2005/06/06(月) 19:07:05
C言語勉強中の者ですが、kbhit()とrand()についていまいち分かりません
参考にしている本の練習問題の一部ですが

while(!kbhit())rand();
i = rand()%2 ? printf("表"):printf("裏");

とは、どのような内容なのでしょうか?
何かキーを押すまで、プログラムは↑のrand()で乱数を作りどこにも代入していないので、
作った乱数を捨て、また作り捨て、作り捨て、をひたすら繰り返し
何かキーが押されると↓のrand()で今まで作った乱数とは全く関係ない乱数を作り
その乱数を2で割った余りが1なら表、0なら裏と表示する
っという内容で合ってますか?
181180:2005/06/06(月) 19:10:10
i =
は書き間違いです、すいません
182デフォルトの名無しさん:2005/06/06(月) 19:43:42
その解釈であってるんじゃないかな。
ただ、乱数って、srand()しなきゃいつも同じ順番で回ってくると思うから、
何回も無駄に回す事によって、そのときでる順番も
変えてるのかな?
うーん。

たぶん次の章で、乱数の初期化のしかたでも出るんじゃない?
183デフォルトの名無しさん:2005/06/06(月) 19:46:56
http://www.hakusi.com/up/src/up0101.jpg
この問題なんだけど、この答えあってる?
pの値は01だと思うんだけど・・・
184デフォルトの名無しさん:2005/06/06(月) 19:49:27
> while(!kbhit())rand();

これ思いっきりビジーループだな。
kbhit()使ってるあたりから見ても、その教科書MS-DOS時代のやつ
じゃないのか?
もっとマシな本に変えたほうがいいぞ。
185デフォルトの名無しさん:2005/06/06(月) 19:50:14
p = 03 で、*p = 01 かな。
たぶん。間違ってたらごめんね。
186デフォルトの名無しさん:2005/06/06(月) 19:53:20
てゆか、答え書いてあるじゃんか orz
p を直で表示しようとすると、メモリの番号が表示されるよん。
p の中身は、 *p ってやんなきゃ出ないよ。
187183:2005/06/06(月) 19:55:49
サンクス!
俺はp=01で*p=08かなーと思ってこの答えに納得いかなかったんだけど
これで合ってるのか
どもども
188デフォルトの名無しさん:2005/06/06(月) 19:55:59
エンディアンはどうなってるの?
pの型はデフォルトでcharでいいの?
sizeof(long)が、8である処理系の存在を、規格は妨げていなかったはずだけど、どうなの?
アラインメントが揃わないとバスエラーが起こる処理系はどうするの?
189デフォルトの名無しさん:2005/06/06(月) 19:57:50
ポインタ変数pが3番地に割り当てられている、を
char *p = 3; と読むか、
extern char *p; (&p = 3)と読むかだな。
190183:2005/06/06(月) 19:58:18
>>188
俺の問題?
ごめん、わかんない。
問題にこれしか書いてなかった。
191デフォルトの名無しさん:2005/06/06(月) 20:16:01
いま、ビット列の圧縮プログラムを作ろうとしてるんだけど
同じビットの出現の度に置き換えようとしてる。
でも、効率よく同じビット列が探せない。
どうしたらいい?
192デフォルトの名無しさん:2005/06/06(月) 21:09:22
ビット列の圧縮?
頻度テーブルでも作りたいんだろうか
固定(8とか)で探せば楽だろうけど
可変長だと難しそう
193デフォルトの名無しさん:2005/06/06(月) 21:16:53
>>192
可変長。
10000000000000011000000000000001
これで、1000000000000001が2回連続してるってことをヒットすれば
かなりの圧縮になると思うんだが。
194デフォルトの名無しさん:2005/06/06(月) 21:49:15
UTF-8 <-> EUC 変換の仕方が分かりませヌ。。。orz
195デフォルトの名無しさん:2005/06/06(月) 21:52:50
>>194
テーブルが必要。
196デフォルトの名無しさん:2005/06/06(月) 21:56:55
質問の仕方が分からないけど書いてみる。

int* num と int *num

って違うの?
197デフォルトの名無しさん:2005/06/06(月) 22:00:04
>> 196
同じっぱい
198デフォルトの名無しさん:2005/06/06(月) 22:04:28
>>194
iconv使え。あと、Windowsもからむなら、JIS標準UnicodeとMicrosoft Unicodeとの違いにも注意。
199デフォルトの名無しさん:2005/06/06(月) 22:06:34
>>195

ぐぐって、ここ見たけど、┐(´ー`)┌フッ

ttp://homepage1.nifty.com/nomenclator/unicode/ucs_utf.htm

まずは、Unicodeに変換する必要ありなのかな。。。

あ、Solarisで。
200デフォルトの名無しさん:2005/06/06(月) 22:07:12
>>196
int と * と num がそれぞれトークンだから
int*num でもおk
201デフォルトの名無しさん:2005/06/06(月) 22:08:28
>>193
試行錯誤するしかない気が
202デフォルトの名無しさん:2005/06/06(月) 22:09:18
>>197
>>200

感謝m(_ _)m
203デフォルトの名無しさん:2005/06/06(月) 22:12:48
>>198

すみません。
使い方がサッパリです。。

簡単なサンプルを。。。
204デフォルトの名無しさん:2005/06/06(月) 22:28:07
>>198
「JIS標準Unicode」ってなに?
205デフォルトの名無しさん:2005/06/06(月) 22:52:27
sqrtってなんて読むの?
エスキュート?
206デフォルトの名無しさん:2005/06/06(月) 23:04:10
>>204
「〜」=「WAVE DASH」になるのがJIS標準。
「〜」=「FULLWIDTH TILDE」になるのがMicrosoft。
(他にもいくつかある)
困ったことに完全に100% Pure Unicode環境で固めてもこの問題からは逃れられない……。
207デフォルトの名無しさん:2005/06/06(月) 23:07:12
long型が1個とchar型4個の構造体で共用体を作って、
long型で読み込んだ値をchar型4個の構造体の方で
1バイトずつ参照してるプログラムがあったのだが、
これって、大丈夫なの?
構造体や共用体って、型を並べた順番にその型のサイズで隙間なく
埋まるようにメモリ上に確保されることが保障されるの?
208デフォルトの名無しさん:2005/06/06(月) 23:09:02
>>207
ビッグ・リトル問題に直面すると思われ。
209その1:2005/06/06(月) 23:10:39
>>203
ほれ。
#include <stdio.h>
#include <errno.h>
#include <iconv.h>
#define BUF_SIZE 1024
int
main(void)
{
  iconv_t cd;
  char ibuf[BUF_SIZE];
  char obuf[BUF_SIZE * 2];
  /* ASCII以外は1文字3バイトになるので適当に大きく */
  if ((cd = iconv_open("UTF-8", "EUC-JP")) == NULL)
    return 1;
  while (fgets(ibuf, BUF_SIZE, stdin)) {
    const char *ip;
    char *op;
    size_t ileft, oleft, result;
    ip = ibuf;
    op = obuf;
    ileft = sizeof(ibuf);
    oleft = sizeof(obuf);
210その2:2005/06/06(月) 23:11:03
    /* 変換された分だけipとopが進み、ileftとoleftが減る */
    switch (result = iconv(cd, &ip, &ileft, &op, &oleft)) {
    case E2BIG:
      /* 出力バッファが足りない */
      break;
    case EILSEQ:
      /* 入力が正しくない */
      break;
    case EINVAL:
      /* マルチバイト文字が途中で終わってる */
      break;
    default:
      break;
    }
    fputs(obuf, stdout);
  }
  iconv_close(cd);
  return 0;
}
必要に応じてlibiconvをリンクすれ。
あとエラーチェックとそのリカバリは全部さぼってるから気を付けろ。
211デフォルトの名無しさん:2005/06/06(月) 23:20:26
環境がリトルエンディアンかビッグエンディアンか
確かめる方法を知りたいのですが。
212デフォルトの名無しさん:2005/06/06(月) 23:23:28
>>211
FAQ>>1
213デフォルトの名無しさん:2005/06/06(月) 23:29:11
>>209,210

ありがとうございます。

ただ、iconv_open()でEINVALに。。orz
214デフォルトの名無しさん:2005/06/06(月) 23:29:14
215デフォルトの名無しさん:2005/06/06(月) 23:41:57
>>213
Solarisだっけ?
http://docs.sun.com/app/docs/doc/816-5175/6mbba7f14?a=view
あー、EUC-JPじゃなくてeucJPかも。
(おれはcygwin(==GNU iconv?)で確認したからなぁ)
216デフォルトの名無しさん:2005/06/06(月) 23:48:17
エンディアンって、何がEndなのですか
217デフォルトの名無しさん:2005/06/06(月) 23:54:38
218デフォルトの名無しさん:2005/06/07(火) 00:03:35
>>215

重ね重ねありがとうございます。
iconv_open("UTF-8", "eucJP")
でokでした!

ですが、今度はiconvで-1っぽいです。。_| ̄|○

でも大体見えてきたので、こちらで頑張ってみます。
お手数かけました。
219デフォルトの名無しさん:2005/06/07(火) 00:04:38
マウスの座標がミッキーとか、妙な言葉の作り方止めて欲しいと思った
220デフォルトの名無しさん:2005/06/07(火) 00:26:24
>>218
がんがれ。ここも参照な。
http://docs.sun.com/app/docs/doc/819-1213/6n3ja05bb?q=iconv_open&a=view
下の方にサンプルコードもある。(最初気付かなかったけど)
221デフォルトの名無しさん:2005/06/07(火) 01:00:30
>>205
「スクウェアルート」と呼んでいる
反論されたことはない
222デフォルトの名無しさん:2005/06/07(火) 13:33:16
ちょっと双方向リストでも書こうと思うんだけど

struct list_a {
  void *data;
  struct list_a *next;
  struct list_a *prev;
};

struct list_b {
  struct list_b *next;
  struct list_b *prev;
  void *data;
};

どっちが良いですか?


今までずっとlist_bだったんだけど、
list_aの方が一般的っぽい(glibとか)から
今回から変えようかと思うんだけど
223デフォルトの名無しさん:2005/06/07(火) 13:36:02
好きなほうで書け。
224デフォルトの名無しさん:2005/06/07(火) 15:06:26
数値のある部分を取り出すことはできますか?
int a=20050607
2005だけを取り出す
225デフォルトの名無しさん:2005/06/07(火) 15:12:26
>>224
a / 10000
226デフォルトの名無しさん:2005/06/07(火) 17:04:20
struct list_b {
  struct list_b *prev;
  void *data;
  struct list_b *next;
};
227デフォルトの名無しさん:2005/06/07(火) 17:23:55
複利計算のプログラムを作っていて壁にブチ当たったのですが、
切捨てというのはどうやって行えば良いのでしょうか?
228デフォルトの名無しさん:2005/06/07(火) 17:36:39
int x = 1.5; /* x==1になる */
229デフォルトの名無しさん:2005/06/07(火) 17:46:36
小数点以下も表示、計算させたいときは10で割ってから>>228して
また10かけたりすんですか?
230デフォルトの名無しさん:2005/06/07(火) 17:47:35
逆でした
小数点以下も表示、計算させたいときは
xを10や100かけてから>>228して
また10や100でわったりしなければいけませんか?

231デフォルトの名無しさん:2005/06/07(火) 18:14:02
>>230
floor()
232デフォルトの名無しさん:2005/06/07(火) 19:15:28
小数点第n位で切り捨て、みたいな処理をしたいのか?
なら割って切り捨ててかけて、で問題ない。
あと、>228の書き方を丸呑みにすると変な書き方しそうなので、キャストとか型変換でぐぐって調べれ。
floatやdoubleをintに型変換すると小数点以下は切り捨てられる。
>228は暗黙の型変換を行なってるわけだ。

蛇足だが、切捨ては表示する段階でだけ適用しないと誤差が膨れまくるぞ。
233デフォルトの名無しさん:2005/06/07(火) 19:31:25
複利計算のプログラムを作っていて壁にブチ当たったのですが、
ビットシフトはなんの役に立つのでしょうか?
234デフォルトの名無しさん:2005/06/07(火) 19:36:56
ビットシフトご登場 ('A`)
235デフォルトの名無しさん:2005/06/07(火) 19:59:26
malloc() 関数の戻り値をキャストしているプログラムを見つけたのですが、
このキャストはいったい何の役に立つのでしょうか?
236デフォルトの名無しさん:2005/06/07(火) 20:29:33
>>235
C++ コンパイラでエラーにならないようにするため。
237358:2005/06/07(火) 20:41:36
EOFってキーボード上でどのように操作したら実行できるのですか?
238デフォルトの名無しさん:2005/06/07(火) 20:46:03
Ctrl+DとかCtrl+Zとか。
239237:2005/06/07(火) 20:47:12
追記です。EOFなんですが、WindowsXPでコンパイラはBorlandです。
Unixではシフト+Dでできたようなのですが・・。
240237:2005/06/07(火) 20:49:32
あ、Ctrlでしたか。
でもそれでもできませんでした。
他に方法があるのでしょうか・・
241デフォルトの名無しさん:2005/06/07(火) 20:58:14
>>237
「行頭で」 Ctrl+Z
242デフォルトの名無しさん:2005/06/07(火) 20:58:16
243デフォルトの名無しさん:2005/06/07(火) 21:22:05
そろそろ独習CというC言語入門書を勉強し終わり次にC++やAPIを勉強しようとしているC初心者です
2つ質問させてください

1・mallocで確保したメモリに変数や配列を入れ、freeでメモリを開放すると
その変数や配列は開放後には使えなくなるのでしょうか?
開放後同じ名前の変数・配列を宣言しても平気でしょうか?

2・WindowsAPIを直接用いないMFCではなく、SDKベースでプログラムを
組めるようになりたいのですが、お勧めの本等ありませんか?
また、現在は無料BORLANDコンパイラを使っているのですが、VC++を購入しようか
迷っております、SDKベースでプログラムしようとしてもVC++は便利でしょうか?
244243:2005/06/07(火) 21:30:04
もう2つ質問追加です

3・WINXPか2000等色々なOSでプログラムを作りたい場合等
テスト用に Virtual PC 2004 を購入しようか迷っております、使い勝手等はいいのでしょうか?
また、Virtual PC 2004 は色々なOSでの動作が試せるけど、各OSのライセンスが
ないとダメなのかも不安です

4・プログラムを作る環境(WINのOSバージョンやCPU)とプログラムを動作させる
環境は同じだったりしないと駄目なのでしょうか?
主に2000とXPを使っており、片方でしか使えないとなると厳しいのです・・
プログラミングやC勉強の際や関係ソフト購入の際等注意する点あったら
教えていただきたいです

長々となりましたが 宜しくお願いします
245デフォルトの名無しさん:2005/06/07(火) 21:41:42
unsigned int toggle=0;
int val[2];
while(1){
 hoge(val[toggle]);
 toggle=!toggle;
}
というコードを時々見かけるんですが
!0は1になる事は規格で保証されているんでしょうか
!0は非0かと思ってますた
246デフォルトの名無しさん:2005/06/07(火) 21:45:51
>>245
保証されてる
!0  → 1
!1  → 0
!-1 → 0
247デフォルトの名無しさん:2005/06/07(火) 21:48:00
>>243
>変数や配列は開放後には使えなくなるのでしょうか?
同一ブロックで
void* hoge = malloc(hogehoge);
free(hoge):
hoge = malloc(hogehoge2);
free(hoge):
できるかってこと? ならできる。

>開放後同じ名前の変数・配列を宣言しても平気?
俺なら異なる名前空間なら同名変数宣言してもOKという場合もある。
同じ関数内ではやらね。
同一ブロックじゃ無理っていうかそれくらいなら試したりテキスト読めばわかる。

>お勧めの本等ありませんか?
URLなら猫でもわかるプログラミングていうかググればいくらでも解説ページあると思う。

>SDKベースでプログラムしようとしてもVC++は便利でしょうか?
DirectX、デバッガ目的で買った。使いこなすにはそれなりの労力は必要だろう。
今は買って満足している。買うならpro以上。
248デフォルトの名無しさん:2005/06/07(火) 21:53:05
>>243-244
1. 意味不明。例となるコードを見せろ。
2. 俺も最初BCCを使っていたがVCを手に入れてよかったと思っている。
3. VirtualPCの中で動かすOSにもそれぞれ当然ライセンスが必要。
4. そんなことはありえない。市販ソフト・フリーソフトやコンパイラ自体も動作条件Win XX以上って具合だろ。
249245:2005/06/07(火) 22:00:14
>>246
ありがとうです
!0→1
!非0→0
っつう認識でいいんですね
250デフォルトの名無しさん:2005/06/07(火) 22:29:16
>>243
1.解放後にも使えることは使えるけど、開放したらポインタが指すものが
無いわけだから不定値とか意味の無い値になる。変数が解放後も同じスコープに
あるなら同じ変数をそのまま使える。もし、同じ変数名で宣言したら
再宣言されているとかエラーになる。この辺は普通のローカル変数の宣言と同じだね。
2.SDKベースならペゾルド?の本かな。あとAdvanced Windows。コンパイラだけでなく、
エディタを含めた開発環境が一式手に入るからVC++は便利だよ。入力補完機能とか、
変数の引数の表示とか出来るしね。



251デフォルトの名無しさん:2005/06/07(火) 22:35:44
3.Virtual PCでもそこにインストールするのは本物のOSだから、ちゃんと
ライセンスを持っていないと駄目です。使い勝手は悪くないですが、出来るだけ
高速なCPUとハードディスクで運用して下さい。間違っても1GHz以下のCPUでは使用しないように。
4.同じの方が色々使っている時の不具合とか使用感とか分かるから望ましいですが、
駄目ならデュアルブート出来るようにしておいて、開発がある程度終わったら
切り替えて動作検証するとかですね。CPUはMMXとかの拡張命令に依存するのでなければ
あまり気にしなくても良いと思います。

まとめると、MSDN Pro以上に入会するとVirtual PCやVC++とかの開発環境も
格安で全部揃ってウマーです。
252デフォルトの名無しさん:2005/06/08(水) 04:45:39
1.0 を 1.0f と書けば double から float 型に変られるように、
1.0e-6 といった数字も double から float に書けませんでしょうか?
1.0fe-6 とかはムリでしたし、(float)1.0e-6とキャストするのは汚くて面倒です…
253デフォルトの名無しさん:2005/06/08(水) 09:13:49
>>252
そもそも、わざわざfloatに直す意味が見いだせない。
254デフォルトの名無しさん:2005/06/08(水) 09:16:42
極めてエレメンタルで不可欠な記述を汚いと判断すべきではないよ
必要で無いから汚いんだ、このレスのように
255デフォルトの名無しさん:2005/06/08(水) 10:28:46
>>253
お前が見いだす必要なんかなかろうに
256デフォルトの名無しさん:2005/06/08(水) 11:53:18
実際、floatをわざわざ使う意味はほとんどの場合無いけどな
使うのは、名前にだまされてる初心者だけ
257デフォルトの名無しさん:2005/06/08(水) 12:14:14
>>256
アホ?
258デフォルトの名無しさん:2005/06/08(水) 12:20:18
名前にだまされてる初心者だけとか断言してる奴が一番ボケ
259デフォルトの名無しさん:2005/06/08(水) 12:33:49
>>252
1.0e-6f
接尾語なんだから最後に付けないと駄目だろ。
260デフォルトの名無しさん:2005/06/08(水) 12:48:50
じゃあなんでdoubleを使わずにfloatを使おうとするの?
261デフォルトの名無しさん:2005/06/08(水) 17:08:52
>>260
聞きたい事はそれなんだな?
262デフォルトの名無しさん:2005/06/08(水) 17:20:34
たしかDirect3Dなんかは全部floatじゃなかったっけ
263デフォルトの名無しさん:2005/06/08(水) 19:45:47
3D 系はだいたい float だな
264デフォルトの名無しさん:2005/06/08(水) 21:07:53
hoge, 1, 10
piyo, 3, 8
fuga, 5, 16
...
みたいな入力に対して第三列目だけを取りたいんですが,どうするのがエレガントですか?
今は char dummy[1024] とか作っておいて sscanf(input, "%s, %s, %d", dummy, dummy, &data);
とやってるんですが,わざわざ dummy を作らないでやる方法があれば教えてください.
265デフォルトの名無しさん:2005/06/08(水) 21:11:50
sscanf(input, "%*s, %*s, %d", &data);
266264:2005/06/08(水) 21:14:28
うあ,* なんてあったんですか.知りませんでした.多謝!
267デフォルトの名無しさん:2005/06/08(水) 21:53:52
突然すみませんが、以下のコードを実行するとアプリケーションエラーが出てしまいます。
デバッガではハンドルされてない例外は test.exeにあります。
と出て、非常に困っております。
どこが間違っているのか、教えていただけませんか。
268デフォルトの名無しさん:2005/06/08(水) 21:54:25
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
int data[10],table[10];
int i,j,temp;

srand((unsigned int)time(NULL));
for (i = 0; i < 10; i++); {
table[i] = i;

data[i] = rand() % 100;
}
269デフォルトの名無しさん:2005/06/08(水) 21:54:37

for (i = 0; i < 10; i++); {
printf("data[%d]:%4d\t\ttable[%d]:%4d\n", i, data[i], i, table[i]);
}

for (i = 9; i > 0; i--); {
for (j = 0; j < i; j++) {
if (data[j] > data[j+1]) {
temp = data[j];
data[j] = data[j+1];
data[j+1] = temp;
}
}
}

for (i = 0; i< 10; i++); {
printf("data[table[%d]}:%4d", i, data[table[i]]);
}
return 0;
}
270デフォルトの名無しさん:2005/06/08(水) 22:04:10
>>267-269
デバッガがあるならステップ実行してみろよ……。
271デフォルトの名無しさん:2005/06/08(水) 22:05:42
あう……何故かステップ実行が出来ないんです。
そう書いたつもりですが、全然書いてませんでした。すいません。
272デフォルトの名無しさん:2005/06/08(水) 22:11:52
俺がデバッグしてやろうと思ったら何箇所かforの直後にセミコロンが付いているじゃないか。
まずそこを直せ。
273デフォルトの名無しさん:2005/06/08(水) 22:20:32
フォー!?
VC++6.0は馬鹿だ!! 気づかなかった俺もっと馬鹿だ!!
直したら正常に動作しました、どうもお騒がせして申し訳ございません。
274デフォルトの名無しさん:2005/06/08(水) 22:53:29
えっと更に図々しくてすいません。
さっきの↑のプログラムで、配列dataのところのバブルソートを
dataの順番は弄らずに配列tableだけをソートしたいのですが、dataの部分を
tableに変えても上手くいきません。
具体的には

data[0]:32 table[0]:0
data[1]:15 table[1]:1
data[2]:18 table[2]:2
data[3]:06 table[3]:3



data[0]:32 table[0]:3
data[1]:15 table[1]:1
data[2]:18 table[2]:2
data[3]:06 table[3]:0

のようにtable[x]の要素を順番に抜き出せばソート出来る。
という表示にしたいのですが、考え方が分からず煮詰まってます。
とっかかりでも教えていただけませんか?
275デフォルトの名無しさん:2005/06/08(水) 23:49:25
はじめまして。質問いいでしょうか?

File出力に関する質問なんですが、演算結果を
いくつものファイルに出力しようと思ってます。

そこでfpirintで出力するファイル名をfor等でループさせて
出したいんですが、可能でしょうか?
fopen("---", "w")の---の部分を変数にして、ループ出力
させるイメージなんですが…。

ファイル名を変化させて自動で出力できればどんな方法でもいいんで
よろしくお願いします。
276デフォルトの名無しさん:2005/06/08(水) 23:55:32
>>275
struct F { char *name, FILE *fp };

main()
{
  F[] = {{"a.txt",0},{"b.txt",0},{"c.txt",0},{0,0}};
  int i;
  for (i = 0; F[i].name; ++i)
    F[i].fp = fopen(F[i].name, "w");

  for (i = 0; F[i].name; ++i) {
    fprintf(F[i].fp, "%s\n", F[i].name);
    fprintf(F[i].fp, ...);
  }
}
277デフォルトの名無しさん:2005/06/08(水) 23:59:20
>>180-181
みたいな3項演算子の使い方って
許される?
278デフォルトの名無しさん:2005/06/08(水) 23:59:24
>>275
void hoge(void){
  int i;
  char filename[32];
  for(i=0;i<10;i++){
    FILE *fp;
    sprintf(filename,"%d.dat",i); /*ファイル名生成*/
    fp= fopen(filename,"w");
    fprintf(fp,"it's data #%d\n", i);
    fclose(fp);
  }
}
279デフォルトの名無しさん:2005/06/09(木) 00:14:36
>277
: の両側の型が同じ(と見なせる)なら問題ない。
9899:1999 だと両方が void でも OK となっている。
280デフォルトの名無しさん:2005/06/09(木) 00:16:28
>279
printf() 自体は戻り値の型が int なんで。void ですら OK という意味ね。一応補足。
281デフォルトの名無しさん:2005/06/09(木) 00:33:55
>>277
printf(rand() % 2 ? "表" : "裏");
とかでもいいよ
282デフォルトの名無しさん:2005/06/09(木) 00:46:46
整数値を入力して、その値が積となる2つの整数の組を0〜19のまでの範囲であるだけ
求めて出力するプログラムなのですが、積と一致しても「一致しません」が最後にでてしまいます。
どうすれば、出ないようになるでしょうか?ご教授お願いします。

#include <stdio.h>

int main(void)
{
int data[20][20];
int a, i, j, k;

for(i = 0; i < 20; i++)
for(j = 0; j < 20; j++)
data[i][j] = i * j;

printf("1つの整数を入力してください(k)\n");
scanf("%d", &k);

for(i = 0; i < 20; i++)
for(j = 0; j < 20; j++)
if(k == data[i][j])
printf("(%d,%d)\n", i, j);
else if(k != data[i][j]);
printf("一致しません\n");

return 0;
}
283デフォルトの名無しさん:2005/06/09(木) 00:52:28
else ifの後のセミコロン。
284デフォルトの名無しさん:2005/06/09(木) 00:58:06
Cのオススメの本教えろや
285デフォルトの名無しさん:2005/06/09(木) 00:58:33
>>283
ありがとうございます
これはお礼です
http://www.happy-page.jp/omosiroflash/100.swf
286デフォルトの名無しさん:2005/06/09(木) 01:21:06
>>282
私へのレスかな…
確かにそこはおかしいですね。
そこを直したら、出力がさらにおかしくなってしまいましたorz
287282:2005/06/09(木) 01:21:32
286は282です
288デフォルトの名無しさん:2005/06/09(木) 01:33:58
>>284
CプログラミングFAQ―Cプログラミングのよく尋ねられる質問 新紀元社情報工学シリーズ
スティーブ サミット (著), Steve Summit (原著), 北野 欽一 (翻訳)
289283:2005/06/09(木) 01:36:49
確認したが、正常に動作するぞ@Cygwin+GCC。
どうおかしいのか教えて欲しい。
一応言っておくが、「一致しません」が300個以上表示されるのは正しい動作だ。
290デフォルトの名無しさん:2005/06/09(木) 01:38:29
>>282
int flag=0;

 〜〜
for(i = 0; i < 20; i++)
for(j = 0; j < 20; j++)
if(k == data[i][j]){
flag=1;
printf("(%d,%d)\n", i, j);
}
if(flag==0)
printf("一致しません\n");
291デフォルトの名無しさん:2005/06/09(木) 01:49:29
>>290
それでうまく動作しました。
有難うございました。
292デフォルトの名無しさん:2005/06/09(木) 01:59:14
>>275です

>>276
>>278 レスありがとうございます。

278を参考に作ってみようと思います。
初心者なので286は少々難しいです。イメージと
してはわかるのですがどうもエラーが出てしまいます。
あと試してみればわかるとは思うのですが、アドレスで
指定するとfopenのファイル名に""(ダブルクォート)はいらないの
でしょうか?
293282:2005/06/09(木) 02:13:40
>>290
度々すいません。
変数?flagについて調べようと思い手持ちの参考書を調べても載ってなくて、
検索してみたのですがいいページが見つかりませんでした。

もしよろしければ、簡単に説明をお願いします。
294デフォルトの名無しさん:2005/06/09(木) 02:29:22
ネタくさいな
295デフォルトの名無しさん:2005/06/09(木) 04:10:05
>>293
int doraemon=0;

 〜〜
for(i = 0; i < 20; i++)
for(j = 0; j < 20; j++)
if(k == data[i][j]){
doraemon=1;
printf("(%d,%d)\n", i, j);
}
if(doraemon==0)
printf("一致しません\n");
296293:2005/06/09(木) 09:13:02
ネタじゃないので、お願いします。。。
297デフォルトの名無しさん:2005/06/09(木) 10:05:21
>290と>293を見て、尚>296と抜かすか。
298デフォルトの名無しさん:2005/06/09(木) 12:41:15
二冊ぐらいC言語の入門書よんでも、分割コンパイルがよくわからんーー。
誰か教えてください。
299デフォルトの名無しさん:2005/06/09(木) 12:54:01
>>298
a.c b.cなどと別々のファイルから1つの実行ファイルを作るのが分割コンパイル。

他のファイルに存在する関数を使いたいときには、ヘッダファイルを作ってその中にその関数の宣言を書いておき、
それを関数を使いたいファイルと、実際に関数の中身があるファイルの双方がincludeする。
グローバル変数も同様。
300デフォルトの名無しさん:2005/06/09(木) 12:56:24
>>298
概念がわかっててやり方がわからないなら、本をよむよりは実際に試し
てみて覚えたほうがいいよ。試しててわからないことがあれば、具体例
でここで聞くべし。

301:2005/06/09(木) 13:30:36
↓開発者は「以前」C言語の達人だった。。。

http://www.at21.net/
302288:2005/06/09(木) 13:31:13
298-299 親切にどうもでした。
303デフォルトの名無しさん:2005/06/09(木) 16:27:05
スレ違いだったらスマソ

C言語の変数宣言をBNFで定義せよ。
ただし、下記はすでに定義されているものとする。
また、データ型に関するキーワードは以下のものだけとする。
int,double,struct,long,short,static

よろしくお願いします。
304デフォルトの名無しさん:2005/06/09(木) 17:30:57
円周率を求めようとして以下のようなプログラムを書きました。コンパイルは問題ないのですが、うまく動きません。
printf("dx = ");scanf("%f", &dx);を書かずにdx = 0.0001;とするとうまくいくのですが。教えてください。レス違ったらすみません。




#include <stdio.h>
#include <math.h>

main(){
double dx, a, b = 0, k, pai;

printf("dx = ");
scanf("%f", &dx);

for(k = 0;k < 10;k += dx){
a = -1*k*k;
b += dx*exp(a);
}

pai = 4*b*b;
printf("pai = %f", pai);
return 0;
}
305デフォルトの名無しさん:2005/06/09(木) 17:37:31
>>304
scanf("%lf", &dx);
306デフォルトの名無しさん:2005/06/09(木) 17:52:24
ありがとうございました。
307デフォルトの名無しさん:2005/06/09(木) 19:45:52
ヒープソートの構造は、
        8                      
              
     7     5          
            
   6   2 4   3      
                
 1   5            
こんな感じだと思うのですが、これをそのままprintfで出力する方法はないでしょうか?
これをそのまま出力するのではなくて、たとえばこの図の値の数は9個で4段ですが、値の数によって段数も変わるようにしたいです。
宜しくお願いします。
308デフォルトの名無しさん:2005/06/09(木) 20:29:01
>>307
「ヒープソートの構造」ってなんだかしらんが、
>307のようなツリー構造はデータ構造を舐めながら地道に書いていけばよろしい。
309デフォルトの名無しさん:2005/06/09(木) 20:32:58
>>307
「ヒープの構造」な
310デフォルトの名無しさん:2005/06/09(木) 20:34:35
再帰はこのためにあるようなもんだな
311デフォルトの名無しさん:2005/06/09(木) 20:39:01
>>290のflagのところはどういう仕組みになっているのでしょうか?
少し勘違いしてましたが、本当に何方かご教授お願いします。
312デフォルトの名無しさん:2005/06/09(木) 20:49:50
>>282==311
else if(k != data[i][j]); ←ここ注目
printf("一致しません\n");

return 0;
}
313307:2005/06/09(木) 21:11:36
かなり悩んでいるのですがが難しいですね・・。
ちなみに再帰は関係ないと思います。
314デフォルトの名無しさん:2005/06/09(木) 21:20:16
>>313
ツリーを書くプログラムを何回か書いたが
再帰が一番楽だった
315307:2005/06/09(木) 21:34:47
そもそも値はランダムなんだし再帰のしようがないと思うのですが。
316デフォルトの名無しさん:2005/06/09(木) 21:42:02
初心者なんですけど、forかwhile使って2-100までの数字の中で素数だけを表示するプログラム教えて下さい。
317デフォルトの名無しさん:2005/06/09(木) 21:44:54
>>316
なんか大学や専門学校の宿題で出そうな問題だな
318デフォルトの名無しさん:2005/06/09(木) 21:44:55
え?順序木じゃないの?
319デフォルトの名無しさん:2005/06/09(木) 21:46:39
>>317
いや、ただ単に自分で思っただけだよ。
バカなもんでわからない
320デフォルトの名無しさん:2005/06/09(木) 22:01:22
321デフォルトの名無しさん:2005/06/09(木) 22:04:23
この板はアフォばっかだから質問しても無駄だな
322デフォルトの名無しさん:2005/06/09(木) 22:10:07
>>321
そう怒るなw
難しい問題にでも答えてくれる人はそうそういないよ。
323デフォルトの名無しさん:2005/06/09(木) 22:31:32
>>307
こんなので良いか? 桁数とかハードコードだから適当に直してくれ。

void printheap(int *data, int size){
int i,j,k,spc;

for(i=1,j=0; j<size;i++) j+=i;
spc=(i-1)*2;

for(i=0,j=0,k=0; i<size; i++){
if(j++==0){
printf("%*c",spc,' ');
k++;
spc-=2;
}
printf("%4d",data[i]);
if(j==k || i==size-1){
printf("\n");
j=0;
}
}
}
324デフォルトの名無しさん:2005/06/09(木) 22:48:32
>>316
#include<stdio.h>
int main(void){int i,j,f;for(i=2;i<101;++i){for(j=f=2;j<i;j++)if(i/j*j==i){f=0;
break;}if(f)printf("%d\r",i);}return 1;}
325デフォルトの名無しさん:2005/06/09(木) 23:02:55
#include<stdio.h>

int main()
{
int x;
double y;

for(x = 0, y = 0.0; x < 10; x++, y += 0.1){
printf("%d %lf\n", x, y);
}

for(x = 0, y = 0.0; y < 1.0; x++, y += 0.1){
printf("%d %lf\n", x, y);
}

return 0;
}

二つ目のfor文のカウンタの更新のところで、
y += 0.1となっているんです。
これをコンパイルして、実行してみると、
一つ目のfor文の方は0〜9までしか表示されないのに対し、
二つ目は0〜10まで表示されてしまうんです。
繰り返しの条件かどこかに何かを付け加えれば良いと聞いたのですが、
教えてください。
326デフォルトの名無しさん:2005/06/09(木) 23:06:45
>>325
原因は浮動小数点数の誤差。
327デフォルトの名無しさん:2005/06/09(木) 23:07:03
>>324
ありがとうございます
328311:2005/06/09(木) 23:07:39
自分なりに解釈してみたのですが、
入力した値が積と一致した時はflagの値を1として
一致しなかった時はflagの値を0としている
という意味で合ってますでしょうか?
329デフォルトの名無しさん:2005/06/09(木) 23:07:50
>>326
やっぱり、yが小数のままではまずいですか?
330デフォルトの名無しさん:2005/06/09(木) 23:11:24
>>325
for (x = 0, y = 0.0; y < 1.0 - DBL_EPSILON; x++, y += 0.1)
ならいけるんじゃないかな。
DBL_EPSILONはfloat.hに定義されてる
くわしくはぐぐってみてね。
331デフォルトの名無しさん:2005/06/09(木) 23:12:32
>>329
↓を実行してみて。
#include<stdio.h>
int main(void){
  printf("%.30f\n", 0.1);
  return(0);
}
332デフォルトの名無しさん:2005/06/09(木) 23:13:13
>>330
分かりました。
ありがとうございました。

重ねて申し訳ないんですが、
「%○○」とかはやっぱり関係無いんでしょうか?
333デフォルトの名無しさん:2005/06/09(木) 23:13:39
>>328
一致しなかった時はflagは0のまま
                  ~~~~
334329:2005/06/09(木) 23:16:15
>>331
ありがとうございます。
今は出来ないので、明日やってみます。
335325:2005/06/09(木) 23:21:56
とりあえず、皆様に教えて頂いた事を元に、
やってみます。
ありがとうございました。
336328:2005/06/09(木) 23:36:05
>>333
解りました。
有難うございました。
337デフォルトの名無しさん:2005/06/09(木) 23:56:17
>332
関係ない。つーか>326の解答が必要かつ充分。
0.1+0.1は0.2ではなく、0.199999999999998とか2.000000000000001になるって話。(桁数は適当)
だから、floatやdoubleを==で比較してはいけない。まず一致することは無いからな。
比較したいときは誤差の存在を考慮に入れた比較をする必要がある。

%dとか%lfはprintfやscanfなどで使える書式指定用の文字。
ぐぐれば解説してるページがあるはず。
書式を指定するだけなので、変数はいじらない=動作には影響は無い。
338デフォルトの名無しさん:2005/06/10(金) 01:22:29
幅が違う場合動作に影響するだろ
339337:2005/06/10(金) 01:31:54
確かに。最悪core吐いて強制終了する場合もあるな。
ちょっと誤解を招く表現だった。
他の部分に影響は無い、という事。
340デフォルトの名無しさん:2005/06/10(金) 03:15:18
つまらない質問かもですが、atoi の a って何ですか?たぶん "a" to int だと思うんですけど、a は何者なんでしょうか?
それから atoi をアトイって発音してもいいですか?
341デフォルトの名無しさん:2005/06/10(金) 03:19:10
チョビはシベリアンアスキー
342デフォルトの名無しさん:2005/06/10(金) 03:33:58
>>340
ASCII と見せかけて実は Adept
343デフォルトの名無しさん:2005/06/10(金) 03:43:18
110 :sage:2005/06/09(木) 21:03:38
宿題じゃないんだけど Cで
「配列の型にかかわらず、全要素の平均値をdouble型で返す関数」
って作ることできますか? void *とか使ったんだけどうまくいかなかった...。
できたとしても、一般的にそーいう作り方はしないの?

Cの基本は理解できた気がするけど
実際に作るとなるとどーしていいのか分らないこと多すぎ...。


116 :110:2005/06/09(木) 21:32:35
>>112
ありがとうございます!

で、実際にこのような関数が必要になった場合どうします?
関数をint用とdouble用に作ると、型が違うだけなのに同じ処理をする関数が
あって気持ち悪い。けど、他の人が使うときは分り易いと思う。
逆に1つにまとめるとコード的にはスマートだけど、他の人が使うときに
datatype があることが不親切な気がすると考えてしまうんですけど。

こーいうプログラミングの
「文法的な意味じゃない"書き方"」
っていうーのを解説してる本を見たことないので...。
344デフォルトの名無しさん:2005/06/10(金) 04:20:35
MFCを使わずにPOSTを送るにはどうしたらいいでしょうか・・?
ATL Serverを調べたのですが受信のことばかりで
送信の仕方が外語文献を見てもなくて・・・
345デフォルトの名無しさん:2005/06/10(金) 04:25:16
#include <stdio.h>

void foo(void){
printf("foo\n");
}

int main(int argc, char **argv){
char *ptr;
ptr = argc > 1 ? "ok" : (foo(), NULL);
return 0;
}

このプログラム、GCCでコンパイルしたときに、32ビットの処理系だと何も
警告が出ないのに、64ビットの処理系だと。
warning: pointer/integer type mismatch in conditional expression
という警告がでてしまいます。C言語としては問題ないような気がするのですが、
なぜこのような警告が出るのでしょうか。
346デフォルトの名無しさん:2005/06/10(金) 08:53:31
>>344
スレ違い。寧ろ鼬害。
347デフォルトの名無しさん:2005/06/10(金) 12:52:56
Cの宿題スレってどこにあるんですか?
348デフォルトの名無しさん:2005/06/10(金) 13:22:07
フルスクラッチってどーゆ意味でしょうか?
webでいろいろ漁っていたら見かけた言葉なのですが,もし御存じの方いましたら
教えてください。
349デフォルトの名無しさん:2005/06/10(金) 13:30:43
スレ違いだっつの。…故意犯か?>>347-348
350デフォルトの名無しさん:2005/06/10(金) 13:32:28
348 誘導お願いします。
351デフォルトの名無しさん:2005/06/10(金) 13:36:12
いえ誘導はありません、検索ぐらいしろです
352デフォルトの名無しさん:2005/06/10(金) 13:37:51
353デフォルトの名無しさん:2005/06/10(金) 13:38:00
348 ぬぅ
354デフォルトの名無しさん:2005/06/10(金) 13:38:12
0から書くこと
355デフォルトの名無しさん:2005/06/10(金) 13:38:23
>>348
「フルスクラッチ」ってのは「ぜんぶ自分で作る」という意味。
和製英語ではないらしいんだが、英語では普通 full scratch とは言わ
ないで from scratch と言う。

プログラミング的には、ライブラリなど既存のパーツを使わないで、ぜ
んぶ自分で書くという意味ではないだろーか。
356デフォルトの名無しさん:2005/06/10(金) 13:40:03
つまりフルスクラッチ≒ジサクジエンですね
357デフォルトの名無しさん:2005/06/10(金) 15:14:43
フルスクラッチって、模型用語だと思ってた。
358デフォルトの名無しさん:2005/06/10(金) 15:15:55
スレ違いの質問に答えんなよ。夏休みにはまだ早いぞ。
359デフォルトの名無しさん:2005/06/10(金) 18:01:57
>>355
フルカスタムは言うことがある。
360デフォルトの名無しさん:2005/06/10(金) 18:17:27
>>395
フルカスタムだと、「全てがカスタマイズ可能」みたいに聞こえる(w
361デフォルトの名無しさん:2005/06/10(金) 19:14:30
>>360
やる人はいないと思うけど、可能ではある。
362デフォルトの名無しさん:2005/06/10(金) 19:31:52
__STDC_VERSION__ってC99対応ならいくつになるの?
gcc3.3.3(cygwin special)で199901になったけど
これ以外の値になることはないんですか?
363デフォルトの名無しさん:2005/06/10(金) 19:32:22
ググればいくらでも出てくるだろ
364デフォルトの名無しさん:2005/06/10(金) 20:33:22
外部変数と静的変数って結局どっちがいいの?
365デフォルトの名無しさん:2005/06/10(金) 20:44:28
一つの関数内でしか使わないのなら静的変数。多数の関数から利用するなら外部変数。
目的によって使い分けるもので「どっちがいいか?」というものではない。
366デフォルトの名無しさん:2005/06/10(金) 21:56:15
#include<stdio.h>

void main(void)
{
printf("\x1b[0;36m");
printf("うんこばすたー");

return ;
}

これをBCCでコンパイルしても「[0;36mうんこばすたー」と表示されて
うまく水色にならない・・。機種の問題ですか?
367デフォルトの名無しさん:2005/06/10(金) 21:58:23
プロジェクトメンバーの一人のC言語厨が、
どうしてもコーディング規約を守ってくれません。
俺の部下だけど先輩なんだよなぁ・・・。
どうしたらコーディング規約を守ってくれるようになりますか?
368デフォルトの名無しさん:2005/06/10(金) 22:09:06
>>367
そいつにどーしても守る気がないなら排除すれ。と、XPやアジャイルの本には書いてありますた。(まじ)
369デフォルトの名無しさん:2005/06/10(金) 22:32:50
>>366
32BitEXEの場合はWin9xでしかできない。
代わりにWin32APIの中にコンソールの色を変更する関数がある。(9xでも使える)
370デフォルトの名無しさん:2005/06/10(金) 22:46:51
fclose()を使用したら、この関数から戻ってきた時点で
ディスクに書き込みは完了したと思っていいんですか?
それとも関数から戻って来てもディスクに書き込みを続けている
可能性はありますか?
371370:2005/06/10(金) 22:48:33
すみません、解決しました。
372デフォルトの名無しさん:2005/06/10(金) 22:48:53
>>370
ある。
373デフォルトの名無しさん:2005/06/11(土) 00:54:01
>>370
もはやCの範疇ではない
HDD が write back cache を持っている可能性をどうやって否定するんだ?
書き込み先がネット越しの仮想ドライブだったら??
374デフォルトの名無しさん:2005/06/11(土) 01:11:43
画像ファイル(BMPなど)を読み込んで、OpenGLで表示するにはどうすればいいですか?
375デフォルトの名無しさん:2005/06/11(土) 01:22:15
>>370
そもそもディスクとは限らない。
テープかも知れないし、USBメモリかも知れない。
376デフォルトの名無しさん:2005/06/11(土) 01:49:46
ぁぃ、「もしも〜」を「まさか〜ないだろう」で考えてとんでもない事をした事がありますw
377デフォルトの名無しさん:2005/06/11(土) 01:53:50
もしもし?
まさかりかついだきんたろう
378デフォルトの名無しさん:2005/06/11(土) 01:54:47
まさかりかついだきんたろうはいないだろう
379デフォルトの名無しさん:2005/06/11(土) 02:03:38
まさかユーザが format C
とかしないだろう
という前提でプログラム作ってます
380デフォルトの名無しさん:2005/06/11(土) 02:07:35
>>364
どっちもあまり多用すべきものではない。そうしたものの全部が
有害というわけでもないが。

名前空間を汚染しないという意味ではファイルスコープまたは関数スコープの
static変数のが害が少ないが、もともと有害なそうした変数の存在が
目立たなくなるという欠陥もある。
381デフォルトの名無しさん:2005/06/11(土) 02:27:30
>>379
あ、そのプログラム商用じゃなきゃ貰ってformatしてみたい♪

昔シェルスクリプトであっさりc:/を殺したうんこです
戯言スマンス
382('A`):2005/06/11(土) 02:33:02
C言語さえ出来れば、出来ないことはないって友人に聞いたのですが本当ですか。
383デフォルトの名無しさん:2005/06/11(土) 02:36:12
>>382
本当です
なまじプログラムができる為に…
他の就職先があるのに…
虚弱体質なのに…(以下略
ぼろぼろになって幻をみて入院して
退院直後に3日間完徹してまたぶっ倒れて点滴打ってまた徹夜できます
トリップできますから
384デフォルトの名無しさん:2005/06/11(土) 02:37:31
>>382
ものによっては不便とか面倒とか非現実的とかそういうことを度外視すればまぁ本当。
385デフォルトの名無しさん:2005/06/11(土) 03:03:07
>>285
なぜ冒頭でエスパー君は怒っているのですか?
386デフォルトの名無しさん:2005/06/11(土) 03:05:05
>>385
たばこだろう
387デフォルトの名無しさん:2005/06/11(土) 03:14:45
>382
自分に自信が持てなかった僕もC言語を始めてからみるみる成績アップ。
身長も10cm伸び近視も解消、一日10分のプログラミングで見違えるようなたくましい体に。
阿修羅級の功徳兵器により豪運が唸り爆運が炸裂、万札風呂に女の子二人と共に入浴とかも出来ます。
388デフォルトの名無しさん:2005/06/11(土) 03:17:10
>>382
インラインアセンブラを使わなきゃレジスタとかはいじれないよ
389デフォルトの名無しさん:2005/06/11(土) 03:17:48
>>345
式を分解してみたら?
390デフォルトの名無しさん:2005/06/11(土) 03:20:23
>>388
シーとニーを間違えたのではないだろうか?
いやデズニ─ラソドの話だけど
391('A`):2005/06/11(土) 04:32:24
レスありがとうございます、

2chもC言語で出来てるって言うし
C言語をがんばってみます
392デフォルトの名無しさん:2005/06/11(土) 05:51:25
Cはおおよそマスターしたと思うのですが(C++は×)、いまだに、関数ポインタの記述法がよくわかりません。

1. まず、
int (* MyFunc)(int);
などと書いて関数アドレスを入れる変数を定義するようですが、この書き方がよくわからない。
(* MyFunc)の部分をどう考えたらいいのでしょうか?
int (__cdecl *) MyFunc(int);
とかだったら納得いくような気がするんですが・・・

2. そして、
int (* MyFunc)(int);
のMyFuncを使ってパラメータの数などを変更したいのですが、この場合のキャストがどのように書くのかわからない。
x = (int (* MyFunc))(int, double)(1, 2);
などとやってもダメ。どう書くといいのでしょうか?
393デフォルトの名無しさん:2005/06/11(土) 06:21:45
C言語勉強中の者です、いくつか分からない事あり、教えて頂けると助かります

1・scanf・getchar・getche・getch で入力を求めた時、ただENTERを押した場合
何が返るか、バッファに何が入るか 、が良く分かりません
scanfは何もなし、getcharは\n、getcheは\r で宜しいでしょうか?

2・型の拡張の関係ですが、 short型 * unsigned long型 はunsigned long型になると
本には書いてあるのですが、shortが負の数の場合でもunsigned long型なのでしょうか?
他の型になるのでしょうか?

3・以下のプログラムは1から10までの値を0.1づつ表示するプログラムです
コンパイルして実行すると、2.8と表示されるべき所が2.799だったり誤差が出ます
float f; ではなく double f; と宣言すると誤差が出ません。 なぜでしょうか?
#include <stdio.h>
int main(void){
float f;
for(f=1.0; (int) f<=9; f=f + 0.1)
printf("%f \n", f);
return 0;}

宜しくお願いします
394デフォルトの名無しさん:2005/06/11(土) 06:27:43
>>392
1. ばらして考えれば分かりやすいかと。

1) 識別子 MyFunc を宣言する。              -> MyFunc
2) MyFunc はポインタだ。                -> *MyFunc
3) なんのポインタかというと、関数へのポインタだ。    -> *MyFunc()
4) その関数の引数はintだ。               -> *MyFunc(int)
5) その関数の戻り値はintだ。              -> int *MyFunc(int)
6) intへのポインタを返す関数の宣言のできあがり。あれ?

3')ポインタの'*'より、関数の'()'の方が優先順位が高いので、
  ()で括ってポインタの優先順位を上げてやる。      -> (*MyFunc)()
4')その関数の引数はintだ。               -> (*MyFunc)(int)
5')その関数の戻り値はintだ。              -> int (*MyFunc)(int)
6')intを返す関数のポインタのできあがり。

2.
x = ((int (*)(int, double))MyFunc)(1, 2);
395デフォルトの名無しさん:2005/06/11(土) 07:17:24
>>380
名前空間の汚染が理由なら関数化もできない
ちなみに俺は関数内 static に関しては先だって検討する手段が腐るほどある
例えば親側の auto にしてアドレス渡しなど
強いて言うなら定数の配列くらいか? これも extern が頭にちらつくけどね
396デフォルトの名無しさん:2005/06/11(土) 08:00:27
>>393
1. scanfでも%cとかでは\nを受け取れる。
2. 負の場合でもunsigned longにされる。まずlongにしてからULONG_MAX + 1を加えた値になる。
3. そりゃfloatの方がdoubleより精度が悪いから。doubleもfloatも内部は2進法を使っていて、
  0.1は2進法では無限小数になってしまう。だからdoubleでも誤差が出ることはある。
397デフォルトの名無しさん:2005/06/11(土) 08:12:23
>>393
1. printf 等で確認すればいい、scanf は戻った後の値が有効性を返却値で示す
2. 変換後の型で元の値を表現できない場合、結果は未定義
3. 0.1 が出てきてる人に説明は不用と思量する
398デフォルトの名無しさん:2005/06/11(土) 08:14:26
>>397
s/値が/値の/

3. 0.1 が double 型であることはよろしいか?
399デフォルトの名無しさん:2005/06/11(土) 08:45:38
>>397
整数同士の変換に未定義の物は存在しない。
処理系依存の場合はあるが、signed→unsignedでは396のようになり処理系依存ではない。
400デフォルトの名無しさん:2005/06/11(土) 11:21:03
C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?
401デフォルトの名無しさん:2005/06/11(土) 11:25:42
忘れたころにワロタ
402デフォルトの名無しさん:2005/06/11(土) 11:33:15
ウェブ C言語をはじめたばかりであまりわからないのですが、 ビットシフトはなんの役に立つのでしょうか? の検索結果 8 件中 1 - 8 件目 (0.23 秒)
403デフォルトの名無しさん:2005/06/11(土) 12:20:02
>>400
あー、最初は不思議だよね。
用法は多岐にわたるが、
あんま気にしないで、次に進めばいいと思うよ。
色んなサンプルを見てるうちに、気づくことがあるだろうから。
404デフォルトの名無しさん:2005/06/11(土) 12:37:45
>>403
氏ねや
405:2005/06/11(土) 12:41:10
406デフォルトの名無しさん:2005/06/11(土) 12:42:37
>>400
意味どおりにビットがずれると考えるか
2のn乗を手際よく計算する方法と考えるか
そんなところかね
後者は今のコンパイラなら使える場合はシフトを使うように勝手にオプティマイズしてくれるが、
シフトの知識があれば掛け算を使うにしても意識して組めるかもね
407デフォルトの名無しさん:2005/06/11(土) 12:48:25
      _______                     __
    // ̄~`i ゝ                    `l |
    / /        ,______   ,_____    ________  | |  ____ TM
   | |     ___ // ̄ヽヽ // ̄ヽヽ (( ̄))   | | // ̄_>>
   \ヽ、   |l | |    | | | |    | |  ``( (.  .| | | | ~~
      `、二===-'  ` ===' '  ` ===' '  // ̄ヽヽ |__ゝ ヽ二=''
                         ヽヽ___//   日本
  _____ _____  ______  _______
  |  ウェブ  | | イメージ | | グループ | | ディレクトリ |
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
       ._________________
      |                         │・検索オプション
      └────────────────┘・表示設定
         | Google検索 | I'm Feeling Lucky |  ・言語ツール
          ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
       ○ウェブ全体から検索 ◎日本語のページを検索
408デフォルトの名無しさん:2005/06/11(土) 12:48:30
>>406
氏ねや
409:2005/06/11(土) 12:54:09
410デフォルトの名無しさん:2005/06/11(土) 16:12:10
ズットシフトしてろ。
411デフォルトの名無しさん:2005/06/11(土) 17:09:47
ループの頭ごとに2次元配列の全要素をを0で初期化したい
のですが、どうすればよいでしょうか?以下のようにstaticで
宣言しなおしているのですが出来ません。

#define A ---
#define B ---

main(){
for(;;){

static double X[A][B] = { 0 } ;

for(;;){ --- X[ ][ ] ---- };
}
}
412デフォルトの名無しさん:2005/06/11(土) 17:14:27
>>403 >>406
おまいら大丈夫か?特別な救急車呼ぼうか?
413デフォルトの名無しさん:2005/06/11(土) 17:16:06
>>411
>static double X[A][B] = { 0 } ;
プログラム開始時に 0 になるだけ。
>ループの頭ごとに2次元配列の全要素をを0で初期化したい
なら、その都度自分でクリアしないと。
414デフォルトの名無しさん:2005/06/11(土) 17:23:39
>>383
良く、点滴打って頑張ってると聞きますが、
何処行けば点滴打ってくれるの?

病院って待ち時間が長いイメージが有って、
415デフォルトの名無しさん:2005/06/11(土) 17:29:12
>>414
切実な人ですか?
416デフォルトの名無しさん:2005/06/11(土) 17:33:21
>>411
int a_nArray[5][10];
int i, j;

for (i = 0; i < 5; i++)
for (j = 0; j = 10; j++)
a_nArray[i][j] = 0;


もしや、こういうこと?違ったらすまん。
417デフォルトの名無しさん:2005/06/11(土) 17:42:19
memset使えよ
418デフォルトの名無しさん:2005/06/11(土) 17:58:45
>>417
doubleでmemset()は駄目だろ。
4191/3:2005/06/11(土) 18:29:36
シフト演算子の挙動について質問があります。
i386互換CPUにおいて、CL 6.0/7.0/7.1/8.0とgcc 3.3.3(cugwin)を用いての結果です

#include <stdio.h>

int main(void)
{
  int j;

  for( j = 0; j < 100; j++ )
  {
    printf( "%d\t%d\n", j, 1 >> j );
  }

  return 0;
}

以上のコードを実行すると、32の倍数で1、それ以外で0が表示されます。
ビット長以上のシフト命令はマスクがかけられたような結果になっています。
4202/3:2005/06/11(土) 18:29:59
そこで、このような結果が正しいのかを検証するために
ISO/IEC 9899:1999 (E)の6.5.7 Bitwise shift operatorsの5を参照したところ、

The result of E1 >> E2 is E1 right-shifted E2 bit positions. If E1 has an unsigned type
or if E1 has a signed type and a nonnegative value, the value of the result is the integral
part of the quotient of E1 / 2^E2. If E1 has a signed type and a negative value, the
resulting value is implementation-defined.

となり、E2がE1のビット長より大きい場合の定義はどこにも見当たらないため、
E1 / 2^E2の解釈より、0が返されるものと推測できます。
4213/3:2005/06/11(土) 18:30:20
そこで、該当部分、printf( "%d\t%d\n", j, 1 >> j );の機械語の出力を見ると(CL7.1)
mov eax,1
mov ecx,dword ptr [j]
sar eax,cl
push eax
mov ecx,dword ptr [j]
push ecx
push offset string "%d\t%d\n" (42401Ch)
call @ILT+1170(_printf) (411497h)
add esp,0Ch

ここの、「sar eax,cl」がShift Alothmeric Rightで右シフトをしている部分と思われます。
機械語には詳しくないので、このsar命令のclが32以上の時の挙動が詳しく分かりません。
また、この命令は16bitや64bitのCPUでは挙動が変化するのでしょうか?

長くなってしまったのでまとめます。
・i386互換プラットフォーム上のCLとgccにおいて、1>>32が1となってしまうのは定義されていない動作でよろしいでしょうか?
・すれ違いかもしれませんが、問題となっているsar命令の挙動を教えてくれますでしょうか?
422デフォルトの名無しさん:2005/06/11(土) 18:36:02
>>411
static付けずに宣言すれば良いんでない?
423デフォルトの名無しさん:2005/06/11(土) 18:36:44
>>421
i386系CPUのシフト命令は下位5ビットしか見ない仕様だったと思う。
424デフォルトの名無しさん:2005/06/11(土) 18:38:14
>>422
何をトンチキなことを言うておるのだ
このイカレポンチめ
425デフォルトの名無しさん:2005/06/11(土) 18:43:15
>>424
詳しく
426デフォルトの名無しさん:2005/06/11(土) 18:45:47
ごめん酔ってた
427デフォルトの名無しさん:2005/06/11(土) 18:52:07
memset 使ったら移植性にかけるっていうけど何でごすか?
428デフォルトの名無しさん:2005/06/11(土) 18:59:59
double型の0の内部表現は処理系に依存するから。
全ビットを0にしても値0になるとは限らない。
殆どの環境で大丈夫だけど。
429411:2005/06/11(土) 19:05:39
回答ありがとうございます。
とりあえずメモリ開放でOKのようなのですが、
memset()ではやはり0で初期化できないのでしょうか?

出来ればExternで宣言してポインタなしで使用したいと
考えてるので。
430411:2005/06/11(土) 19:06:42
>>428

0は近似でいいんで大丈夫だと思います。
431411:2005/06/11(土) 19:08:23
>>428>>419へのレスでした…orz
432デフォルトの名無しさん:2005/06/11(土) 19:19:05
>>421
ビット幅以上のシフトは未定義だとその近所に書いて有ったと思うが。
記憶違いか?
433428は427へのレス:2005/06/11(土) 19:21:18
>>430
近似値になるとも限らないんだけど。

だからさ、

#define A ---
#define B ---

main(){
for(;;){

double X[A][B] = { 0 } ; // staticを外す

for(;;){ --- X[ ][ ] ---- };
}
}

じゃだめなの?
434デフォルトの名無しさん:2005/06/11(土) 19:22:57
>>432
X3010には確かにそう書いてある。
435デフォルトの名無しさん:2005/06/11(土) 19:35:00
やはりな。
どこにも見当たらないって言った>421は 6.5.7 #1〜4も嫁。
たぶん#3だろ。 #4は<<の説明だろうからな。
436411:2005/06/11(土) 19:58:39
>>433

まだ試してないんですが、それで0セット可能なんでしたら
無問題です。

出来れば初期化以外の方法での0セットも出来ると助かるのですが…。
437デフォルトの名無しさん:2005/06/11(土) 20:05:10
>出来れば初期化以外の方法での0セットも出来ると助かるのですが…。
>>416

一気にやりたいならゼロで埋めた配列を用意しておいて memcpyを使ってコピーすればいい。
438デフォルトの名無しさん:2005/06/11(土) 20:38:45
点滴の打ち方おしえれー。
439419:2005/06/11(土) 22:12:21
>>432 >>435
あ…#3にしっかりと書いてありました。
The integer promotions are performed on each of the operands. The type of the result is
that of the promoted left operand. If the value of the right operand is negative or is
greater than or equal to the width of the promoted left operand, the behavior is undefined.
情報ありがとうございました。

しっかし、こうしてみるとビットシフトは未定義だらけですね。
440デフォルトの名無しさん:2005/06/11(土) 22:25:53
CPUの命令に落としたときに、余計な処理が必要にならないようにだろうね
441デフォルトの名無しさん:2005/06/11(土) 22:28:19
>>438 覚醒剤いクナイ
442デフォルトの名無しさん:2005/06/11(土) 23:02:34
点滴でか? 致死量超えないようにするとほとんど水だぞ
443カバクラ坊:2005/06/11(土) 23:24:22
質問です。

あるヘッダファイルSの中で、別のヘッダファイルMをインクルードすると、
そのヘッダSをインクルードしたファイルはMファイルのシンボルも見えてしまうじゃないですか。
これを防ぐことは出来ないのでしょうか?
ご教授お願いします。
444デフォルトの名無しさん:2005/06/11(土) 23:26:03
includeしない
445デフォルトの名無しさん:2005/06/11(土) 23:26:45
>>443
防げないしそれで困ることも大してない。
446カバクラ坊:2005/06/11(土) 23:28:50
そうなんですか・・・
どうも有り難うございました。C言語の素晴らしさを改めて実感させてもらいました。
447デフォルトの名無しさん:2005/06/11(土) 23:34:21
>>446
まあ、隠蔽したいならライブラリにしちまえってこった。
448デフォルトの名無しさん:2005/06/12(日) 00:15:39
自分でinclude しといて見えて困るってどういう量見だ?
449デフォルトの名無しさん:2005/06/12(日) 00:19:46
ヘッダにソース書いちゃうとかってオチじゃないよな。
450デフォルトの名無しさん:2005/06/12(日) 00:25:08
>>446
モジュールAのヘッダでBのヘッダを#includeする必要があるってことは、
AのインタフェースにBのインタフェースが現れているってことだから、
ユーザに見えるのはしょーがない

BがAのインタフェースではなく実装(*.c)にしか現れていないのなら
AのヘッダでBのヘッダを#includeする必要はなく、実装でBのヘッダを
インクルードすればよい
この場合は、ユーザに隠すことが可能だな
451デフォルトの名無しさん:2005/06/12(日) 00:56:47
>>443
> Mファイルのシンボルも見えてしまうじゃないですか。

見るためにincludeするものだ。
見えては困るものはヘッダに書くな。
452デフォルトの名無しさん:2005/06/12(日) 01:05:33
static
453デフォルトの名無しさん:2005/06/12(日) 01:18:03
static関係なくね?
454カバクラ坊:2005/06/12(日) 01:24:43
いまいち説明が漠然とし過ぎていた為、
状況が伝わらなかったみたいですね。すみません。

例えば、ヘッダQ内のシンボルの宣言が、
別のヘッダTに依存している場合はどうでしょう。
この場合はQでインクルードせざるを得ませんよね。

ヘッダQは折角Tをラップして使いやすくしたのに、Tのシンボルが
名前空間を汚してしまうのはなんとなく嫌だな、という話です。

上記の状況でも、殆どの場合はキャスト等で回避することが可能なのですが、
現在それが出来ない状況でありまして。(非常に特殊なケースなのですが)
455デフォルトの名無しさん:2005/06/12(日) 01:41:53
>>454
いやだから、徹底して隠したいんなら、Tのシンボルを隠さなきゃダメだろ
それが「出来ない状況」ならあきらめろってこった
456デフォルトの名無しさん:2005/06/12(日) 01:43:42
>>453
なんで? 隠蔽するならリンク時に衝突が起こらないことを保証する必要があるぞ
457カバ:2005/06/12(日) 01:45:02
そうですね。
ああ、あと >>446 で既に諦めておりますので。
これ以上はスレ汚ししてしまうのは悪いので、ここで立ち去らせて頂きます。

皆様どうも有難う御座いました。
458 :2005/06/12(日) 03:03:07
cで書かれたオープンソースで簡単なソフトってないでしょうか
日本製で参考になるような
459デフォルトの名無しさん:2005/06/12(日) 03:16:08
>>458
sourceforgeにたくさんあるだろ。
460デフォルトの名無しさん:2005/06/12(日) 03:20:56
>>454 は、何か勘違いしてそうだな。
461デフォルトの名無しさん:2005/06/12(日) 05:04:55
>>457=カバ
こんな感じか?
--foo.c
static int foo;
--bar.c
static int bar;
--baz.c
#include "foo.c"
#include "bar.c"
int baz = foo+bar;

foo.c bar.c をコンパイルせずに、
$ cc baz.c
製品でやると顰蹙ものだけど、個人的なアプリならやっても良いんじゃねえか。
462デフォルトの名無しさん:2005/06/12(日) 05:36:41
蛇足、
既に foo.h bar.h baz.h を作っていて、
.c ファイルを #include するのが嫌なら、
foo.c bar.c baz.c を全部あわせた大きな hoge.c を作るのが良いんじゃないかな。
463デフォルトの名無しさん:2005/06/12(日) 05:50:03
下のようなカウントダウンループでunsigned intを使用するとiが0に達した後の
i--でオーバーフローして無限ループ?

for(unsigned i=10;i>=0;i--)
printf("%u\n",i);
464デフォルトの名無しさん:2005/06/12(日) 06:03:46
する。
素直にintにしろ。
465デフォルトの名無しさん:2005/06/12(日) 06:16:52
>>463
こういうのってオーバーフローって言う?
466 ◆bk1IKp1NkI :2005/06/12(日) 11:21:38 BE:25356522-#
初心者です。
C言語について、わかりやすく書かれたサイトはどこでしょう?
猫でもわかる の他にはありませんか?
僕は小学生なので、わかりやすく書かれたサイトがいいです。
467デフォルトの名無しさん:2005/06/12(日) 11:22:39
>>463
アンダーフローの間違いだろ
468デフォルトの名無しさん:2005/06/12(日) 11:27:26
>>466
藻前にとっての「わかりやすい」なんて、
誰にもわからねぇよ。
469デフォルトの名無しさん:2005/06/12(日) 11:29:22
>>454
具体的なソースを晒した方がいいジャマイカ?
470 ◆bk1IKp1NkI :2005/06/12(日) 11:29:49 BE:88747027-#
初心者が最初に見る、Cの解説ページを教えて欲しいんです。
471デフォルトの名無しさん:2005/06/12(日) 11:34:02
>>470
> 初心者が最初に見る、Cの解説ページ

そんなものはない。
どこを見ようがその人の勝手だ。
好きなサイト見れや
472デフォルトの名無しさん:2005/06/12(日) 11:34:53
>>466
小学生って言っても1年生か6年生かでやりようが違いすぎるよね
それから個人差もすっごく出る

ちなみに俺は4年生の頃に高校の化学Tを読んでたり同級生にアンプ作ってる子がいたよ
473デフォルトの名無しさん:2005/06/12(日) 11:34:58
あと、あんま2ちゃんで小学生とか書かないほうがいいな。
ナメられたり、やっかみに会ったりするから。
474 ◆bk1IKp1NkI :2005/06/12(日) 11:37:49 BE:152136364-#
>>472
6年です 少し学校の勉強を予習している程度です。
初心者向けでC言語講座などがあるサイトを教えてください。
475デフォルトの名無しさん:2005/06/12(日) 11:42:45
>>474
いい加減、回線切って首吊れよ。
476 ◆bk1IKp1NkI :2005/06/12(日) 11:43:52 BE:38034623-#
ただ僕は初心者にお勧めのサイトを皆さんに聞きたいだけなんですが・・・
477デフォルトの名無しさん:2005/06/12(日) 11:45:12
>>476
スレ違い
478デフォルトの名無しさん:2005/06/12(日) 11:46:33
>>474 下にイって「初心者 C言語」等で検索
しろ。そして気に入った所で学べ。自分で調べる
習慣が必要だぞ。
http://www.google.com/intl/ja/
479 ◆bk1IKp1NkI :2005/06/12(日) 11:46:38 BE:399357397-#
>>477
どのスレで質問すればいいんですか?
質問ばかりですみません・・・。
480 ◆bk1IKp1NkI :2005/06/12(日) 11:48:08 BE:152136364-#
>>478
ありがとうございます。色々なサイトを見てみます。
481デフォルトの名無しさん:2005/06/12(日) 11:48:23
482 ◆bk1IKp1NkI :2005/06/12(日) 11:49:59 BE:114103229-#
>>481
ありがとうございます。わかりやすくて気に入りました。
483デフォルトの名無しさん:2005/06/12(日) 12:38:35
1分36秒でわかりやすいと判断したのか。
末恐ろしい小六生だな・・・。
484デフォルトの名無しさん:2005/06/12(日) 13:11:26
小学生が使った社交辞令を額面どおりとる奴がいるスレはここですか?
485デフォルトの名無しさん:2005/06/12(日) 13:16:59
おまいら大人げないよな・・・。
486デフォルトの名無しさん:2005/06/12(日) 16:34:12
配列でのポインタ用法について勉強しているんですが
float balance[10][5] という配列の balance[3][1] にポインタでアクセスしたい場合

float *p;
p=(float*)balance;
printf("%d",*(p+(3*5)+1));

のように書きますが、何故p+(3*5)+1なのかいまいち理解できません。
*pがbalance[0][0]として、順番に並べると、
[0][0],[0][1],[0][2],[0][3],[0][4],[0][5],[1][0],[1][1],[1][2],[1][3],
[1][4],[1][5],[2][0],[2][1],[2][2],[2][3],[2][4],[2][5],[3][0],[3][1]
と、p+(3*6)+1 だと思うのですが・・
配列の際[〜][5]の5のような最後の場所は、
float balance[10][5]と宣言してもメモリ上にも作られないのでしょうか?

初歩的 かつ 分かりにくい質問ですいません。
どなたか教えて頂けると助かります、宜しくお願いします
487キャバ坊:2005/06/12(日) 16:44:14
>>469
setjmp.hなのですが。
setjmpは関数の実装で隠蔽出来ませんよね…
returnしたらそこで終わりになってしまいますから。
機能拡張するならどうしてもマクロを使うしかない。

あ、一つずつ#undefしてく…ってのは無しですよw
488デフォルトの名無しさん:2005/06/12(日) 16:45:35
>>486
違うぞ。
[0][0],[0][1],[0][2],[0][3],[0][4],
[1][0],[1][1],[1][2],[1][3],[1][4],
[2][0],[2][1],[2][2],[2][3],[2][4],
[3][0],[3][1] 
だ。

宣言のところの角括弧の中身は個数を表し、
使用するときは角括弧の中身は0から始まるインデックスを表す。
だからbalance[0][5]はありえない。(同様にbalance[10][0]もない)

ガンガレ!
489デフォルトの名無しさん:2005/06/12(日) 16:50:12
宣言時に指定するのはサイズ。
実行に指定するのはインデクス(オフセット)。
そしてインデクスは0から始まる。
490デフォルトの名無しさん:2005/06/12(日) 16:59:43
>>486
printf("%f"
だべ

あと、Cでの二次元配列のレイアウトがそうなってるから
それでも動くけど、正しくはbalanceを指すポインタの型は
float (*)[5]
でしょ。
491デフォルトの名無しさん:2005/06/12(日) 17:19:44
>>487
シンボルひとつにつきインクルードファイルをひとつずつ
作っていけばいかがですか
492486:2005/06/12(日) 17:47:20
レスありがとうございます
int i[2]と宣言しても int[0]〜[2]まで3つの要素が入る訳ではなかったんですね
大目に配列のサイズを指定しておく癖になってて今までさっぱり気付きませんでした;;
とても助かりました、ありがとうございます!

もう一つ質問なのですが
多重間接参照(ポインタのポインタ)についてです

#include <stdio.h>
int main(void){
char *p, **mp, str[80];
p = str;
mp = &p;
printf("名前を入力してください: ");
gets(*mp);
printf("今日は %s さん", *mp);
return 0;
}

のgets(*mp); と printf("今日は %s さん", *mp); の*mpがどうして*mpになるのか
どうしても分かりません・・・ **mpのように書いてある他の例題もあるし、
*でも**でもどっちでもいいんじゃと思って変えてみてコンパイルしてみてもエラーでますし
色々WEBサイトで検索してみたのですがさっぱりです><
私的には、ややこしくて、こんがらがってる文字列定数がらみかな?とも思うのですが
どなたか猿にでも分かるように解説していただけませんか?
宜しくお願いしますm(_ _)m
493デフォルトの名無しさん:2005/06/12(日) 17:51:03
同じデータを扱っていて **mpになることはありえないが。
494デフォルトの名無しさん:2005/06/12(日) 17:54:03
>>492
pはpointer to strで、mpはpointer to pになる。
よってmpはpointer to pointer to strになる。
mpをdereferenceするとpointer to strとなる。
つまりtypeof(*mp) == char*となる。
495494:2005/06/12(日) 17:59:04
間違った。
pはpointer to str[0]で、mpはpointer to pになる。
よってmpはpointer to pointer to str[0]になる。
mpをdereferenceするとpointer to str[0]となる。
つまりtypeof(*mp) == pointer to str[0]になる。
str[]に対してstrは&str[0](pointer to str[0])と同じなので、
*mpはstrと同じになる。
496デフォルトの名無しさん:2005/06/12(日) 19:14:54
2ヶ月ほど前からCを学び始め、ずっと気になってたことがあり、
それが今になってさらに無性に気になってきたので聞かせてください

1つ目は関数の前の int や void の意味
2つ目は return の意味

return を使う場合は int main() とか、関数の前に int をつけなければ
使えないみたいなんですが、よく例のソースコードについている return 0; を
つけなくてもエラーは出ませんし、ちゃんとプログラムは動きますし

大変初歩的なことは承知なのですが御教授お願いします
497デフォルトの名無しさん:2005/06/12(日) 19:17:03
> 関数の前のintやvoidの意味
関数がreturnする値の型。
> returnの意味
値を返す。

ちなみに、main()では何も値を返さずに末尾に達した場合には
return 0;したのと同義であることが規格で定められている。
498デフォルトの名無しさん:2005/06/12(日) 19:21:03
>>497
スピーディーな回答ありがとうございます

main 以外の関数では必ず return を記述する必要がある、ということでしょうか

return する値の型を色々変えてみて試してみようと思います
499デフォルトの名無しさん:2005/06/12(日) 19:40:44
printfみたいな引数が可変な関数って、どうやって作るの?
俺が読んだ入門書には載ってなかった。
正直、printf系の関数以外で引数が可変の関数を知らない・・・
500デフォルトの名無しさん:2005/06/12(日) 19:45:48
たとえば、こうつくる

#include <stdio.h>
#include <stdarg.h>

void func(int count, ...) {
 int i, num;
 va_list ap;

 va_start(ap, args);
 for (i=0; i<count; i++) {
  num = va_arg(ap, int);
  printf("%d\n", num);
 }
 va_end(ap);
}
501デフォルトの名無しさん:2005/06/12(日) 19:47:16
間違えた、こう

#include <stdio.h>
#include <stdarg.h>

void func(int count, ...) {
 int i, num;
 va_list ap;

 va_start(ap, count);
 for (i=0; i<count; i++) {
  num = va_arg(ap, int);
  printf("%d\n", num);
 }
 va_end(ap);
}

func(3, 1, 2, 3);
と呼ぶと
1
2
3
と出力する
502デフォルトの名無しさん:2005/06/12(日) 21:18:29
ファイルポインタを勉強しはじめたのですが、
fopen("C:\Documents and Settings\Dai\My Documents\C\test\test.txt","w")
としてもfopenに失敗してしまいます
パスの指定方法がおかしいと思うのですが、正しいパスの書き方を教えてください
503デフォルトの名無しさん:2005/06/12(日) 21:20:06
>>502
\はエスケープ文字だから、\自体を表すには\\と書かなければならない。
504デフォルトの名無しさん:2005/06/12(日) 21:27:25
>>503
できました!
ありがとうございます
505デフォルトの名無しさん:2005/06/12(日) 21:36:35
>>499
学校の課題を2ちゃんで聞くのはやめましょう
506デフォルトの名無しさん:2005/06/12(日) 21:38:47
宿題は宿題スレへ
507デフォルトの名無しさん:2005/06/12(日) 21:41:22
入門書調べるくせに、検索はかけないのな
printf 可変 なんかでググればいくらでも出てくるのに・・・
508デフォルトの名無しさん:2005/06/12(日) 21:51:12
そして教えてもらったお礼もなし、と
これだから最近の馬鹿学生は
509デフォルトの名無しさん:2005/06/12(日) 21:53:32
池沼相手に大人げないな
510デフォルトの名無しさん:2005/06/12(日) 22:03:47
文字列配列 char str[80]; と宣言して
その後添え字をつけず、str と表記すると
str[0]のアドレスの事を意味するのか、str文字列の内容全てを意味するのか
混乱しております。 教えていただけませんか?
511デフォルトの名無しさん:2005/06/12(日) 22:14:06
両方の意味がある。どちらになるかは文脈によって決まる。
512デフォルトの名無しさん:2005/06/12(日) 22:22:35
>>510
原則前者だが例外的に配列全体(文字列全体ではない)を意味することがある。
まずsizeof strと書くと配列の要素数80を返す。
&strと書くとstrへのポインタ、つまり(char *)[80]型になる。
strと書いた場合はstr[0]のアドレスだからchar *型。Cでは文字列を(const )char *などで扱うからこれを文字列全体を表すと言えなくもない。
513デフォルトの名無しさん:2005/06/12(日) 22:42:49
C言語を今から始めようと思っています。>>2のコンパイラの中から
選ぼうと思っていますがどれを使おうか迷ってます。
みなさんのおすすめを教えていただけませんか?
514デフォルトの名無しさん:2005/06/12(日) 22:43:39
超基本的な問題なんですけど、以下のプログラムを実行しても
税率が計算されずにそのまま出てきます。
nedanはグローバル変数にしているのですが…。

#include <stdio.h>

int keisan(int, int, int);
int nedan;

int main()
{
int kingaku, zeiritsu;
printf("金額を入力して下さい=");
scanf("%d", &kingaku);
printf("\n消費税率を入力して下さい(%%)= ");
scanf("%d", &zeiritsu);
keisan(kingaku, zeiritsu, nedan);
printf("%dに%d%の消費税を加えると%d円になる\n", kingaku, zeiritsu, nedan);
return 0;
}

int keisan(int kingaku, int zeiritsu, int)
{
nedan = kingaku * (1 + zeiritsu / 100);
return 0;
}
515デフォルトの名無しさん:2005/06/12(日) 22:44:55
516デフォルトの名無しさん:2005/06/12(日) 22:50:22
>>513
学生ならVisual Studio the Spokeを買え。
517デフォルトの名無しさん:2005/06/12(日) 22:53:59
>>514
税率の出し方がおかしい。
return kingaku * (100 + zeiritsu) / 100;

あと、関数定義時に仮引数名を省略できるのはC++。
518513:2005/06/12(日) 22:57:53
すみません。書き忘れましたがフリーでお願いします。
WindowsXPです。
519デフォルトの名無しさん:2005/06/12(日) 23:01:05
>>517
なるほど、そういうことでしたか。ありがとうございます。
520デフォルトの名無しさん:2005/06/12(日) 23:02:12
>>514

voidkeisan(int kingaku, int zeiritsu)
{
nedan = kingaku * (1 + zeiritsu / 100.0);
}


zeiritsu / 100 だとint / int 答えもintになる
zeiritsuが5だとすると 5 / 100 で 0
521デフォルトの名無しさん:2005/06/12(日) 23:03:29
>>497
>main()では何も値を返さずに末尾に達した場合には
>return 0;したのと同義である

それC++じゃね?
手元の cygwin なら

#include <stdio.h>
int main(void)
{
printf("hello\n");
}

% ./a.exe
hello
% echo $?
6

522デフォルトの名無しさん:2005/06/12(日) 23:22:28
523デフォルトの名無しさん:2005/06/12(日) 23:27:42
>>513
なぜgcc-cygwinがリストの一番上にあるのかを考えろ
524513:2005/06/12(日) 23:30:57
>>523
gcc-cygwinにします。ありがとうございました。
525デフォルトの名無しさん:2005/06/12(日) 23:41:45
なんで入門用がシミュなんだよ、頭元気か?
規格合致性なんて後から憶えればいいんだよ
どんな処理系でもそいつのフルパワーの出し方が肝心要だろうが
目的より手段の本末転倒には反吐が出るね
526デフォルトの名無しさん:2005/06/12(日) 23:57:21
質問です。
int ary[3][3] = {
1 , 5 , 10 ,
50 , 100 , 500 ,
1000 , 5000 , 10000
};

「初期化の一部だけにカッコがついている」
とか警告が出るのですが問題なしですか?
527デフォルトの名無しさん:2005/06/13(月) 00:02:17
>>521
ISO/IEC 9899:1999 5.1.2.2.3 Program termination -1より
reaching the } that terminates the main function returns a value of 0.
528デフォルトの名無しさん:2005/06/13(月) 00:14:09
>>526
int ary[3][3] = {
   { 1 , 5 , 10 }
  ,{ 50 , 100 , 500 }
  ,{ 1000 , 5000 , 10000 }
};
529デフォルトの名無しさん:2005/06/13(月) 00:15:15
>>527

            ,. -‐ ''"  ̄ ̄ ``丶、
           i:::::::::::::::::::::::::::::::::::::::::::i      |
         カ ヽ:::_; ‐--、、 、---、 ;;_:|      |
         チ   `!;{   |トNヽ  }.:.:.:|    |ヽ'  要
        カ     lf へ、| 、,. へ、ヽ;|      |    チ
        チ    ,.-!. <(')'   '(')>  '=、    |    ェ
       カ    .{{〉,|  '" , , `   ム }〉 、   |     ッ
       チ    /ヾ‐l   ,.---、 u i、..イ  ``'|   ク
      カ ,.ィ_"   |`''i、 〈ヨ ̄´,〉 / /     |   や
      チ/,ノr:}   ヽ ヽ `'三'"/  /    ム    !!
      / /,.⊥L_   \l! ` -‐' / /     /|
    / /  ─‐〈    `ヽ、一r''"         ! |/ ̄ !ヽ
  r''" .ノ 'ー─〈 __ -─‐=ニ二二)    l /   |
  /  (  、 二.フ |-ニ ̄ -──-   |    |     i
530デフォルトの名無しさん:2005/06/13(月) 00:20:10
>>528
そのカンマの打ち方…

SQLerか?
531デフォルトの名無しさん:2005/06/13(月) 00:29:39
p = &(*p)->right
の両辺に*をほどこすと、
*p = (*p)->right
になりますが、
この2つの違いを教えてくだちい
532デフォルトの名無しさん:2005/06/13(月) 00:32:21
main(){
char c_test1[9], c_test2[9];
scanf("%s/%s", &c_test1, &c_test2);
printf("test1:%s test2:%s\n", c_test1, c_test2);}

上のプログラムを実行してmo/naと入力すると、
test1:mo/na test2:
と出力されてしまいます。
test1:mo test2:na
と出力させたいのですが、どのへんがいけないのでしょうか?
533デフォルトの名無しさん:2005/06/13(月) 00:38:55
>>531
p = &(*p)->right 
p.rightのアドレスをポインタpに代入
 
*p = (*p)->right 
p.rightの中身をpが指すアドレスに代入

int *a, b;
a = &b;   // bのアドレスをaに代入
*a = b;   // bの中身を*aに代入
これととよく見比べて
534デフォルトの名無しさん:2005/06/13(月) 01:17:48
freestandingだと
main()の戻り値とかも実装定義のようだ
でもOSの機能をつかうと反則らしい。
535526:2005/06/13(月) 08:43:46
>528
dクス
536デフォルトの名無しさん:2005/06/13(月) 14:01:24
効率のいいキューファイルの作り方教えてください

行単位で管理したいんだけど
追加時は最終行に追加するとして
取り出し時は先頭行から取り出したい
でもこういう構成にすると、結局メモリ上に
ファイルの内容を全部持たなきゃならなくなるんだけど
ファイルはキューへの追加・削除時に毎回保存したい
なんか、効率悪くて遅い
537デフォルトの名無しさん:2005/06/13(月) 14:34:08
>>536
行長が固定できるならリングバッファにするとか。
538536:2005/06/13(月) 14:45:07
>>537
固定できればリングにしてランダムアクセスにしたいんですけど
可変長なので・・・
DBの利用も考えたのですがガンガン追加→ガンガン削除という
ログっぽいデータでDB使うと良くないので 見合わせています
539デフォルトの名無しさん:2005/06/13(月) 15:05:19
#include <stdio.h>
int main(void)
{
char ch;
do {
ch = getchar();
putchar('.');
} while(ch != 'l');
return 0;
}

例えば、このようなプログラムで aaalbbbと入力した場合、bbbがバッファに
残り、もしこれがもっと長いプログラムだった場合エラーの原因となりそうなので
while(getchar()!='\n'); と空のループを作り、getcharを一回使うたびに使おうかと
考えております、考えすぎ とか 他にもっといい方法があるとかありますか?
540デフォルトの名無しさん:2005/06/13(月) 15:28:25
>>539
scanf("%*[^\n]%*c");と書けば改行までの読み捨てができる。
541デフォルトの名無しさん:2005/06/13(月) 15:39:32
scanfって正規表現使えるんだ
便利だな
542デフォルトの名無しさん:2005/06/13(月) 15:42:10
>>539
オレには何をやりたいのか?すらわからない… orz
543デフォルトの名無しさん:2005/06/13(月) 15:46:03
>>541
scanf系の書式は正規表現とは言えない。
544デフォルトの名無しさん:2005/06/13(月) 16:05:15
>>540
漏れも初めて知った。dクス!
もしかして正規表現ってもともとscanf系の書式を誰かが拡張させたものなんじゃ、と想像してみる。
とりあえずscanfを少し見直した。
545デフォルトの名無しさん:2005/06/13(月) 16:11:29
scanfって正規表現のようなもの使えるんだ
便利だな
546デフォルトの名無しさん:2005/06/13(月) 16:15:24
>>545
言い直すなよw
547デフォルトの名無しさん:2005/06/13(月) 16:22:47
scanfでは[]系しか使えない。これだけで正規表現だというのはいかがなものか。
548デフォルトの名無しさん:2005/06/13(月) 16:27:36
あくまで対象は1文字だけということか
549デフォルトの名無しさん:2005/06/13(月) 16:33:09
1文字?
550デフォルトの名無しさん:2005/06/13(月) 16:44:11
scanfって正規表現とはお世辞にも言えないがそれっぽい表記使えるんだ
便利だな
551デフォルトの名無しさん:2005/06/13(月) 16:50:28
scanfって便利だな
552539:2005/06/13(月) 16:51:54
レスありがとうございます
scanfでやればよかったんですね

もう一つ質問です

#include <stdio.h>
int main(void){
int i, j;
char op;
printf("演算を入力してください: ");
scanf("%d%c%d", &i, &op, &j);
switch(op) {
case '+': printf("%d", i+j);
break;
case '-': printf("%d", i-j);
break;
case '/': if(j) printf("%d", i/j);
break;
case '*': printf("%d", i*j);
}
return 0;
}

のプログラムで、演算ができますが 計算式を入力する際、「1+1」では成功でも
「1 +1」のようにスペースを入れると失敗します
"%d%c%d"を"%d %c%d"に書き直すと「1 +1」でも、「1+ 1」でも、「1 + 1」でも、
「1 + 1」でも成功します
ですが、何故成功するようになるのかが理解できません。
教えていただけませんか?
553デフォルトの名無しさん:2005/06/13(月) 16:56:21
>>552
scanf類の書式文字列で空白類文字を書くと0個以上の空白類文字を読み捨てるという意味になるから。
554539:2005/06/13(月) 17:05:40
553様レスありがとうございます
書式文字列で空白を書く場所はどのように決まっているのでしょうか?
"%d %c%d"ではなく "%d%c %d" や " %d%c%d"や "%d%c%d "と書くと失敗するもので;;
555デフォルトの名無しさん:2005/06/13(月) 17:09:56
>>554
"%d %c%d"なら「1 +1」は成功する。
"%d%c %d"なら「1+ 1」は成功する。
556539:2005/06/13(月) 17:18:04
自分でも試してみたところ、私の環境では
"%d %c%d"なら 「1 +1」でも「1+ 1」でも「1  +     1」でも、
計算式のどこにスペースを入れても成功し
"%d%c %d"では、「1+ 1」や「1+    1」の時と「1+1」の時だけ成功です

実はPCやコンパイラによっても違いがあるのでしょうか?
セレロン600のWINXPの無料BCC++コンパイラを使用しております
557554:2005/06/13(月) 17:20:59
>>556
554は勘違いだ。スマソ

正しくはこうだったはず。
%cは空白文字も入力として受け付ける。
%dは空白文字を受け付けないから読み飛ばす。
558 ◆bk1IKp1NkI :2005/06/13(月) 17:27:29 BE:342306869-#
前質問させてもらった小学生の者です。
あるHPに
printf("\x1b[2J")
と書くと画面が消える、と書いていたのですが、実際には変な記号のようなものが表示されるだけで、消去できません。
どうすれば画面消去できるのでしょうか?
ちなみにXPを使っています。
559デフォルトの名無しさん:2005/06/13(月) 17:30:43
>>558
スレ違い。環境依存スレへどうぞ。
#つーか激しく既出だがね。
560 ◆bk1IKp1NkI :2005/06/13(月) 17:32:51 BE:456408498-#
そんなスレあるんですか?
すみませんが既出でも教えてください。過去ログ見れないので・・・。
561デフォルトの名無しさん:2005/06/13(月) 17:38:27
>>560
このスレにもある。
562 ◆bk1IKp1NkI :2005/06/13(月) 17:40:15 BE:76068443-#
>>561
ありがとうございます。今から探してみます。
563デフォルトの名無しさん:2005/06/13(月) 17:47:22
telnet経由で見れば消えるはず
564 ◆bk1IKp1NkI :2005/06/13(月) 17:51:37 BE:63390252-#
すみません、一応このスレを全部見たんですが、色の変え方しかのっていませんでした。
僕の見落としだったらすみません。
過去ログも検索しましたが、XPでは使えないということだけで、方法がのっていませんでした。
すみませんが、消す方法を教えてくれませんか?
565デフォルトの名無しさん:2005/06/13(月) 17:58:59
566 ◆bk1IKp1NkI :2005/06/13(月) 18:00:36 BE:177492274-#
>>565
ありがとうございます。これからはそのスレで質問すればいいんですね。
567デフォルトの名無しさん:2005/06/13(月) 18:00:48
>>564
教えたいのは山々だが、ここのスレではスレ違いだから教えられない。
568デフォルトの名無しさん:2005/06/13(月) 18:08:07
やさしいなお前等。
569デフォルトの名無しさん:2005/06/13(月) 18:13:07
質問です。

YesかNoで答えられる質問を出して、
ユーザが入力するまでの時間を計りたいんだがどうするのが一番いいのかな。
コンマ秒単位で計りたいのでdifftimeでは荒すぎるし、
clockが計るのはシステム時間だから0になっちゃうしで困りますた。
570デフォルトの名無しさん:2005/06/13(月) 18:20:05
環境依存じゃね?
571 ◆bk1IKp1NkI :2005/06/13(月) 18:20:10 BE:228204094-#
C言語とは違いますが、このスレって質問をするスレではないのですか?
572デフォルトの名無しさん:2005/06/13(月) 18:26:39
>571
スレタイになんと書いてある?
573デフォルトの名無しさん:2005/06/13(月) 18:27:45
>>571
環境非依存の内容を質問するなら構わない。
574デフォルトの名無しさん:2005/06/13(月) 18:28:12
>>569
環境依存
575デフォルトの名無しさん:2005/06/13(月) 18:30:18
環境依存別にいいじゃん。
なんでそんなにめくじら立てるの?
576デフォルトの名無しさん:2005/06/13(月) 18:32:06
>>575
・鬱陶しいから。
・他に適当なスレがあるから。
・環境を聞き出して回答するのが面倒だから。
577デフォルトの名無しさん:2005/06/13(月) 18:32:31
システムコール使うのだってCでできることなんだし、Win32APIだってCで使えるんだからいいじゃない。
printfだってライブラリを使っているに過ぎないわけだし、内部ではシステムコールだって呼んでいるわけだし。
578デフォルトの名無しさん:2005/06/13(月) 18:32:31
>>575
>>1
> 標準Cではできない事の質問は使用している開発環境のスレへGo!
579デフォルトの名無しさん:2005/06/13(月) 18:33:22
>>576
・鬱陶しいから。
・他に適当なスレがあるから。
・環境を聞き出して回答するのが面倒だから。

それってお前の主観的な感想でしかないよな。
580デフォルトの名無しさん:2005/06/13(月) 18:34:03
それに、他に適当なスレがあるっていうのは理由にならないよ。
ここはCのスレで、他のスレと連動しているわけではないんだから。
581デフォルトの名無しさん:2005/06/13(月) 18:34:36
>575
そう思うなら、「環境依存上等!1が全部答えます」スレでも
建てれば?
582デフォルトの名無しさん:2005/06/13(月) 18:35:27
>>581
別に1が教えなくてもいいんじゃない?
お前が仕切るなよ。
583デフォルトの名無しさん:2005/06/13(月) 18:36:01
質問するだけの消防池沼はぐだぐだ言わんととっとと去ね。
584デフォルトの名無しさん:2005/06/13(月) 18:36:35
あるファイルには数字とアルファベットが入っていて、
ファイルからデータを読み込んで出力する時に数字だけ読み込んで出力する、次に
アルファベットだけ読み込んで出力するにはどうしたら良いのでしょうか?
ファイルの形式
1   a
2   b
3 c
.
.
.
26 z
585デフォルトの名無しさん:2005/06/13(月) 18:36:49
>>583
それも主観的な感想に過ぎないね。
感想なんか聞きたくないよ。
586デフォルトの名無しさん:2005/06/13(月) 18:38:19
>582
おまえはこのスレの1を知らないな。

>C言語なら、オレに聞け!
>1 名前:ビル・ジョブス 投稿日:2000/09/03(日) 21:43
> おれは25才、3年間プログラムを一生懸命作ってきた。
> C言語しか知らないがC言語なら誰にも負けない...
587デフォルトの名無しさん:2005/06/13(月) 18:39:51
>>586
放置した方がいいと思ったけど、丁寧に返答しとくね。

去ね
588デフォルトの名無しさん:2005/06/13(月) 18:40:47
>>584
どう出力したいのか詳しく。

>>585
>583は感想ではなく命令だろ。
589584:2005/06/13(月) 18:44:16
数字だけ読み込んでそのまま1 2 3 ... 26と表示させたいです。
アルファベットだけ読み込んでそのままa b c ... zと表示させたいです。
590デフォルトの名無しさん:2005/06/13(月) 18:46:27
>>588
命令なんてありえない。
だとすれば、その意図は感想だよ。
591デフォルトの名無しさん:2005/06/13(月) 18:48:29
>>589
char buf[BUFFER_SIZE];
FILE * fp = fopen(dataFile, "r");
while (fgets(buf, sizeof(buf), fp)) {
printf("%d\n", atoi(buf));
}
rewind(fp);
while (fgets(buf, sizeof(buf), fp)) {
char alphabet[BUFFER_SIZE];
sscanf(buf, "%*d%s", alphabet);
printf("%s\n", alphabet);
}
fclose(fp);

これだけ部品を用意しておけば後は適当に加工できるっしょ。
592デフォルトの名無しさん:2005/06/13(月) 18:49:42
「αは主観的な感想にすぎない」というβについて、
βもやはり主観的な感想なんじゃねーの。
593584:2005/06/13(月) 18:50:24
>>591
感謝、感謝。土下座、土下座。神降臨。
594デフォルトの名無しさん:2005/06/13(月) 19:12:41
>>592
いいや、客観的な感想だ。
595デフォルトの名無しさん:2005/06/13(月) 19:14:36
感想だと否応に主観的だから、感想では無いな。

客観的事実。
596デフォルトの名無しさん:2005/06/13(月) 21:33:32
>>580
適切なスレを選択できない
あなたの頭の悪さの言い訳にもなりませんね。
597デフォルトの名無しさん:2005/06/13(月) 22:14:05
スレ違いと指摘する者が「適当なスレ」を考えずに発言するのもどうかしてるよ
答えのない問いをつきつけて困惑する様を楽しんでいる悪趣味が見え見え
598デフォルトの名無しさん:2005/06/13(月) 22:22:35
なんのために

http://pc8.2ch.net/test/read.cgi/tech/1114329636/
があると思ってるんだ
599デフォルトの名無しさん:2005/06/13(月) 22:56:00
あんたはそれを言わなかった
600デフォルトの名無しさん:2005/06/13(月) 23:08:07
>>597
甘えすぎだっつの。ガキかお前。
601デフォルトの名無しさん:2005/06/13(月) 23:26:35
>>600
甘えてるのはそっち
自分の主張を定義しそびれた/持たずに発言した己の愚行を
人の落ち度に便乗して誤魔化そうとしているだけ
602デフォルトの名無しさん:2005/06/13(月) 23:32:42
これがゆとり世代クォリティ
603デフォルトの名無しさん:2005/06/13(月) 23:44:11
主張に対する責任範囲も3とか教えられていそうだな
604デフォルトの名無しさん:2005/06/14(火) 00:00:06
今までcygwin使ってて、そろそろC++もやってみたいなって思い出したんだが、まず何をダウソすればいいんだ?
605デフォルトの名無しさん:2005/06/14(火) 00:04:58
>>604 g++
606デフォルトの名無しさん:2005/06/14(火) 01:32:54
砂糖っていつごろから日本に入って来たんですか?
何百年も続く伝統的な和菓子なんていうものもあるくらいだから
相当昔ではないかと思うんですが、砂糖なんてとれるのは沖縄あたり
でサトウキビくらいなもんですよね?中国ですか?
607デフォルトの名無しさん:2005/06/14(火) 01:34:06
すみません。誤爆しました。
608デフォルトの名無しさん:2005/06/14(火) 01:35:16
いや、合ってる
609デフォルトの名無しさん:2005/06/14(火) 09:40:05
>>601
適切なスレを選択するのは、
質問者・見る人の義務だろう。

このスレは、標準Cの範疇に関する質問スレだ、
>>1に書いているのに、考えもなしに質問する方が怠慢だ。
610デフォルトの名無しさん:2005/06/14(火) 09:47:28
ものすごい誤爆っぷりだなw
8世紀に唐僧鑑真が来日した際に黒砂糖500斤をもたらしたという説があるから
そのときじゃね?
611デフォルトの名無しさん:2005/06/14(火) 11:34:21
構文糖っていつごろから(ry
612デフォルトの名無しさん:2005/06/14(火) 18:08:42
>>611
syntax sugarの直訳だから、これが日本に入ってきてすぐじゃないか?
613デフォルトの名無しさん:2005/06/14(火) 18:51:37
すいません、以下のプログラムで変数nに代入された数値がlong型の範囲を
超えている場合にif文で警告を出すには、どうすればいいのですか?

#include <stdio.h>

int main(void)
{
long n;
long *p;

scanf("%d", &n);
p = &n;
614デフォルトの名無しさん:2005/06/14(火) 18:56:08
「構文糖」って訳にしてるのは近藤嘉雪さんだけという説あり。
「糖衣構文」のほうが意味もわかりやすいしー

615デフォルトの名無しさん:2005/06/14(火) 19:06:14
>>613
無理。
616デフォルトの名無しさん:2005/06/14(火) 19:19:54
>>613
そのプログラムでは、longの範囲を超える値は入りません。
617デフォルトの名無しさん:2005/06/14(火) 19:38:31
#include <stdio.h>

int main()
{
printf("\x1b[4;31m");
printf("色が変わってアンダーラインが付く\n");
printf("\x1b[7;32m");
printf("今度は反転です。 \n");
putchar(0x1b);
printf("[0;36m");
printf("今度は水色です\n");
printf("%c%s今度は緑\n", 0x1b, "[32m");
printf("%c%s%s\n", 0x1b, "[1;35m","こんな書き方もあります\n");
printf("\x1b[0m");

return 0;
}

WINDOWS XPではエスケープシーケンスは使えないのでしょうか?
猫でもわかるプログラミングというサイトを見ていてそれが出てきたのですが
実行しても色が変わりません。
ttp://www.kumei.ne.jp/c_lang/intro/no_26.htm
これなのですが…
618デフォルトの名無しさん:2005/06/14(火) 19:44:21
>>617
XPにエスケープシーケンス自体はある
つか、一通り目を通してから聞けよ
619デフォルトの名無しさん:2005/06/14(火) 19:46:55
>>617
無断で転載するなって書いてあるだろうがゴルァ!
スレ違いだし。
620デフォルトの名無しさん:2005/06/14(火) 19:51:12
>>617
NT系では16ビットプログラムでしかエスケープシーケンスは使えない。
58章からWindowsでの代替の方法が載っている。

>>619
これはただの引用だろ。
621デフォルトの名無しさん:2005/06/14(火) 19:55:14
XPでエスケープシーケンスがつかえない、というのは、正当な引用とは言い難くね?
主と従の構成になってないし。
622デフォルトの名無しさん:2005/06/14(火) 19:56:14
>>618
ひとつずつ理解しているので先読みしてないんですよ…。
とりあえず全部の章に目を通してみるべきですか?
>>619
URLだけ記述したほうがよかったですね、すみません。
>>620
わかりました、そちらの章を読み始めてみます。
623デフォルトの名無しさん:2005/06/14(火) 19:56:22
>>620
URL書けばいいだけの物を、転載する事も無いだろう。
禁じますとかかれてある物を何故わざわざ?
624デフォルトの名無しさん:2005/06/14(火) 19:57:18
XPでエスケープシーケンスに対応したシェルとか作ったら
こういううざい連中とおさらばできるかな?
625デフォルトの名無しさん:2005/06/14(火) 20:06:51
>>609

>>569 のような質問をする人が、それが標準の範疇かどうか知っていると思うか?
あなたが規格票を熟読精通してからこのスレに来ていて、それを他の人にも義務づけたいと言うなら
賛同はしないものの言っている意味はわかるが
626デフォルトの名無しさん:2005/06/14(火) 21:19:14
急速にスレの質が低下してまいりました
627デフォルトの名無しさん:2005/06/14(火) 21:22:08
>>625
そう思うんなら、あんたはそういう姿勢で質問者に答えるんだね。
どうぞご勝手に。

でも、>>1を読めば分かるとおり、実装系依存の問題はスレの趣旨から外れる以上、
それを他の回答者に強要することはできんよ。
628613:2005/06/14(火) 21:35:41
うほ、無理ですか……よかった提出せんで。
それなら、long型で宣言した変数に、ユーザーが任意の数値を入力するとして
その数値がlong型の範囲内であるかどうかチェックする処理はどうすれば
出来ますか?
元々この問題で考えていたサンプルプログラムが上のだったもんで……
他にshort型で同じ問題があって、どちらも指定した型以外大きさで
宣言はしてはならないということなんですが。
629デフォルトの名無しさん:2005/06/14(火) 21:47:21
>>628
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

main()
{
    char buff[1024];
    char *endp;
    long value;

    while (fgets(buff, sizeof buff, stdin)) {
        if (endp = strchr(buff, '\n'))
            *endp = '\0';
        
        errno = 0;
        value = strtol(buff, &endp, 10);
        if (endp == buff)
            puts("ぜんぜん変換できねーYO!!");
        else if (errno == ERANGE)
            puts("オーバーフローっす");
        else if (*endp != '\0')
            puts("なんかケツに数字じゃない文字があるよ");
        else
            printf("おめでとう!: %ld\n", value);
    }
}
630デフォルトの名無しさん:2005/06/14(火) 21:49:56
>>628
fgetsはいい?
631デフォルトの名無しさん:2005/06/14(火) 22:01:19
CPUのフラグをみればいいんじゃね?
632デフォルトの名無しさん:2005/06/14(火) 22:06:42
>>625
標準の範疇かわからないなら、
まずは、自分の環境に合ったスレを探して、
そのスレに行くべきじゃないのか?

わざわざ「標準の範疇内のみ」と銘打っているスレに来る理由がわからない。
633デフォルトの名無しさん:2005/06/14(火) 22:09:47
cygwinってCもC++もコンパイルできる?
634デフォルトの名無しさん:2005/06/14(火) 22:11:10
できる。gccとかで
つうかcygwinはコンパイラじゃないぞ
635デフォルトの名無しさん:2005/06/14(火) 22:33:25
てーかコンパイラって何?
636デフォルトの名無しさん:2005/06/14(火) 23:23:31
ググれ
637デフォルトの名無しさん:2005/06/14(火) 23:30:49
638デフォルトの名無しさん:2005/06/15(水) 00:28:05
何だよデバックって…
しかもアセンブラちょっちキモいぞ。
639デフォルトの名無しさん:2005/06/15(水) 01:00:04
640デフォルトの名無しさん:2005/06/15(水) 01:07:16
cygwinがコンパイラと聞いて実践占星術板から来ますた
641デフォルトの名無しさん:2005/06/15(水) 01:31:19
そんな板、無いじゃねぇかよ…
642デフォルトの名無しさん:2005/06/15(水) 01:35:08
だってコンパイラじゃないじゃん( ´・ω・`)
643デフォルトの名無しさん:2005/06/15(水) 01:54:49
セグウェイのことなら俺に聞け!
644デフォルトの名無しさん:2005/06/15(水) 02:03:11
>>643
バッテリーだか油だかしらんけど一回の充電(給油)でフツーの下町(江東区)でどのくらい走れる?
千代田区まで通勤できる?
645デフォルトの名無しさん:2005/06/15(水) 02:21:05
関西人の>>643です
神戸在住
646デフォルトの名無しさん:2005/06/15(水) 02:27:39
>>645
あぁ、スマン
神戸って何かカコイイ

retern 0:
}
647デフォルトの名無しさん:2005/06/15(水) 02:27:54
u!!!!!!!
648デフォルトの名無しさん:2005/06/15(水) 03:45:14
環境依存には厳しくても
>>643-646 みないたのはOKなんだなw
649デフォルトの名無しさん:2005/06/15(水) 03:47:34
>>648
ルールが変わったんだよ!
650デフォルトの名無しさん:2005/06/15(水) 04:35:19
>644
その質問は環境依存。
江東区から千代田区までの距離を地図で測って「〜km走れる?」と聞け。
651デフォルトの名無しさん:2005/06/15(水) 08:41:15
距離だけじゃないんだなぁ
信号〜信号までの距離でのエンジンのオンオフとか直線とカーブの割合とか
652デフォルトの名無しさん:2005/06/15(水) 08:54:21
他スレに誘導されても質問を繰り返す(自称)糞餓鬼よりは、
スレ違いネタの方が未だましだと思うのだが。
653デフォルトの名無しさん:2005/06/15(水) 10:37:56
セグウェイって新しいコンパイラ?
654デフォルトの名無しさん:2005/06/15(水) 10:57:16
落ち着け
segwayとcygwinってあんま似て無いぞ('A`)
655デフォルトの名無しさん:2005/06/15(水) 12:47:35

   -=  ∧_∧
  -=≡ ( ・∀・)
    -=( つ┯つ
   -=≡/  / //∧    ガッ
  -=≡(__)/ )< >__∧∩
   -= (◎) ̄)) ∨`Д´)/
               /
656デフォルトの名無しさん:2005/06/15(水) 12:51:21
>>655
それはジンジャーだろ
657デフォルトの名無しさん:2005/06/15(水) 12:55:17
知らんでも煽る事じゃないんだが
セグウェイ=ジンジャー
658デフォルトの名無しさん:2005/06/15(水) 17:49:07
ジンジャーワショーイ
659デフォルトの名無しさん:2005/06/15(水) 20:25:40
ジンジャーは開発コードでセグウェイは製品名。
660デフォルトの名無しさん:2005/06/15(水) 23:54:47
へ〜〜〜。
661デフォルトの名無しさん:2005/06/16(木) 16:29:23
int hoge[]={1,1,1,1,1};
で、 hogeの配列はいくつセットされたかはどうやって調べればいいのでしょうか?
662デフォルトの名無しさん:2005/06/16(木) 16:32:44
>>661
sizeof(hoge)/sizeof(hoge[0])
663デフォルトの名無しさん:2005/06/16(木) 18:46:27
sizeof(hoge)/sizeof(*hoge)
664デフォルトの名無しさん:2005/06/16(木) 19:22:47
結合順序を知らない童貞
665デフォルトの名無しさん:2005/06/16(木) 20:50:54
>>664
いやまて順序ってつまり先に後使うとうんこ付いちゃうとかそうゆう(ry
666デフォルトの名無しさん:2005/06/16(木) 21:27:20
すみません、一つ質問なんですが
int型の数値から文字列に変換する関数で、戻り値に変換された文字列の先頭のポインタを返す場合
呼び出し先の関数ではstatic宣言をした配列にしないと戻り先の関数から参照できませんよね。
ですがその場合だと、呼び出し元の関数が二回連続して同じ関数を呼び出すと当然の事ながら結果は上書き
されてしまいます。
そこでこの状態に対する対処法はなにかありますか?


char *ItoA(int);

char *p1;
char *p2;

p1 = ItoA(1234);
p2 = ItoA(-1234);

printf("%d\n", p1);
printf("%d", p2);

の場合、呼び出し先の配列がstatic宣言されていると

-1234
-1234

と表示されてしまうのを回避したい。

お願いします。
667デフォルトの名無しさん:2005/06/16(木) 21:30:33
>すみません、一つ質問なんですが
一つにしぼって
668デフォルトの名無しさん:2005/06/16(木) 21:34:10
>>666
C++
669デフォルトの名無しさん:2005/06/16(木) 21:34:37
そんなもん、書き込み先を引数でもらうか、mallocして返すか、
staticなリングバッファで返すかしかないだろう。
670デフォルトの名無しさん:2005/06/16(木) 21:37:02
>>666
1番よいのはchar *へのポインタを引数に取り、そこへ結果を書き出すようにすること。
あまりお勧めしないがItoA内部でmallocを読んでその目盛りへのポインタを返す方法もある。
ほかにもものすごく小さなプログラムなら戻り値をstrcpyでコピーするようにとコメントを書いておくという手もある。
671デフォルトの名無しさん:2005/06/16(木) 22:48:17
>>666
char p1[64] = { '\0' };
char p2[64] = { '\0' };

sprintf( p1, "%d", 1234 );
sprintf( p2, "%d", -1234 );

printf("%d\n", p1);
printf("%d", p2);
672デフォルトの名無しさん:2005/06/16(木) 23:36:36
SuffixArrayのインデックスを作成する関数ご存じないですか?
ググって見ても、プログラムの一部だったりして使えません・・・。
アルゴリズムは何でもいいのですが・・・。

良ければ、引数が文字列(とその長さも?)とインデックスを格納する配列へのポインタなら
助かりますが、そうでなくても頑張ります。
673デフォルトの名無しさん:2005/06/17(金) 00:36:31
>>666

char p1[40];

strcpy(p1, ItoA(1234))

674デフォルトの名無しさん:2005/06/17(金) 01:37:48
>672 c++ でいいならすぐ書けるんだけどなあ

vector<int> make_suffixarray(const string& str) {
 vector< pair<string, int> > v;
 for (int i = 0; i < str.size(); ++i)
  v.push_back(pair<string, int>(str.substr(i), i));
 sort(v.begin(), v.end()); // sort by first elements

 vector<int> suffixarray;
 for (int i = 0; i < v.size(); ++i)
  suffixarray.push_back(v[i].second);
 return suffixarray;
}
675デフォルトの名無しさん:2005/06/17(金) 02:24:41
C++厨は他所にいけ
676デフォルトの名無しさん:2005/06/17(金) 02:30:12
良く無いだろwwwwwwwwワロ
677デフォルトの名無しさん:2005/06/17(金) 04:49:13
strcpy が文字列を先頭からコピーすることは規格で決められているんですか?
678デフォルトの名無しさん:2005/06/17(金) 06:45:26
>>677
質問の意味が判らん。
尻尾から頭に向かってコピーしていく変態な実装が許されてるかどうかってことか?
679デフォルトの名無しさん:2005/06/17(金) 06:53:22
>>678
質問が下手ですいません…
その通りの意味です
680デフォルトの名無しさん:2005/06/17(金) 06:57:52
文字列が連続してメモリにあるともかぎらないし、若いアドレス順に
格納されているともかぎらないし。
681デフォルトの名無しさん:2005/06/17(金) 07:09:17
>>680
うはw
682デフォルトの名無しさん:2005/06/17(金) 08:35:07
>>680
ま、これでも読んどけ
ttp://www.bohyoh.com/CandCPP/FAQ/FAQ00041.html
683デフォルトの名無しさん:2005/06/17(金) 09:00:56
>>682
わかってねーな
684デフォルトの名無しさん:2005/06/17(金) 09:17:28
>>679
SSE2を使った実装は(まだ)無いと思うが、使えば、
36バイトいっぺんにコピーされるので、順番と言う
概念が崩壊するね。

で、Cの規格では、それをやっても構わないことになってる。
685デフォルトの名無しさん:2005/06/17(金) 11:05:43
特定のメモリアドレスの文字列を取得したいのですが
memcpy(str, 0x????????, n)
のようにアドレス指定ってできないのでしょうか?
VBだと
CopyMemory VarPtr(strBuf(0)), &H????????, cstrLen
とAPIでは指定できるのですが、Cだと他の方法があるのでしょうか?
ご教授願います。

686デフォルトの名無しさん:2005/06/17(金) 11:44:29
>>685
できると思うが、ここでは環境に依存した内容は扱えないので詳細はWindowsProgrammingに関したスレへ。
687デフォルトの名無しさん:2005/06/17(金) 12:35:41
Cは標準ではスレッドを扱うための機構は用意されてないのでしょうか?
688デフォルトの名無しさん:2005/06/17(金) 12:36:14
はい、用意されていません。
689687:2005/06/17(金) 12:37:03
文法ミス。Cは、ではなくCには、です。
690デフォルトの名無しさん:2005/06/17(金) 12:43:30
include<stdio.h>
int main(void)
{

char buf[80];
char SS[80]


printf("string=");
gets(buf);
while (strcmp(ss,"") != 0){
puts(buf);
printf("%s\n",buf);
printf("%s\n",buf);
}

return 0;

}



上記の例題で実行したら
string=
と表示されて、=の横にC languageと入力したら、
C language
C language
C language
C language
と表示されますが、C languageを10行以上表示させる方法ってありますか?
691デフォルトの名無しさん:2005/06/17(金) 12:55:39
>>688
有り難うございました。
692デフォルトの名無しさん:2005/06/17(金) 12:57:52
>>690
何をしたいのかよく判らんが、strcmp(ss, "")はssが初期化されていないので動作未定義になる。
で、一体何がしたいの?
693デフォルトの名無しさん:2005/06/17(金) 13:01:23
すみません、ちょっとわからない事があったので教えてください。

memset ((char *)&me),0,sizeof(me);

memset関数を利用する時に第一引数の意味がわからないんですけど。
よろしくお願いします。
694デフォルトの名無しさん:2005/06/17(金) 13:13:53
>>693
memset()の第一引き数がchar *だった頃の名残ジャマイカ。
void *memset( void *dest, int c, size_t count );
だから素直にmemset(& me, 0, sizeof(me));でいいはず。
尚、(char *) はchar * へのキャスト。
695デフォルトの名無しさん:2005/06/17(金) 13:16:33
>>694
わかりました。ありがとうございます!!
696デフォルトの名無しさん:2005/06/17(金) 18:54:06
>>692
初期化出来ていませんでしたか…どうやるのでしたっけ…?

どうしても4行しか表示されなくて…
10行以上表示できると聞いて試したいのですがやり方がわからないのです。
697デフォルトの名無しさん:2005/06/17(金) 19:17:20
>>696
10行以上出すだけなら
puts(buf);
を10回以上書けばいいだろ。
何がしたいんだ、何が。
698デフォルトの名無しさん:2005/06/17(金) 20:47:16
>>685
#include <stdlib.h>
memcpy(str, (void *)0x????????, n);

or

#include <windows.h>
CopyMemory(str, (void *)0x?????????, n);
699696:2005/06/17(金) 21:28:59
他には何か方法がありますでしょうか?
700デフォルトの名無しさん:2005/06/17(金) 21:32:33
んなもんループを使うなりすればいいだろ
701デフォルトの名無しさん:2005/06/17(金) 21:32:44
>>699
include<stdio.h>
int main(void)
{
&bnsp; char buf[80];
&bnsp; int i;
&bnsp; printf("string=");
&bnsp; fgets(buf, sizeof buf, stdin);
&bnsp; for (i = 0; i < 10; i++) {
&bnsp; &bnsp; printf("%s", buf);
&bnsp; }
&bnsp; return 0;
}
702デフォルトの名無しさん:2005/06/17(金) 21:32:55
○| ̄|_
703デフォルトの名無しさん:2005/06/17(金) 21:42:11
int bnsp;書いとけば問題ないw
704デフォルトの名無しさん:2005/06/17(金) 21:59:59
>>685
出来ますよ。
705699:2005/06/17(金) 22:24:34
ループ…?えっと…どう入力するんでしょうか?
706699:2005/06/17(金) 22:25:05
ループ…?えっと…どう入力するんでしたっけ?
707デフォルトの名無しさん:2005/06/17(金) 22:34:01
>>705-706
その調子
708デフォルトの名無しさん:2005/06/17(金) 22:35:42
スペースを含んだ文字列をスペースを削除して表示するプログラムを作っていますが、
#include <stdio.h>
#include <ctype.h>

int main(void)
{
char str[100],tmp[100];
int i,strl=0;
scanf("%s",str);
for(i=0;str[i]!='\0';i++){
while(isspace(str[i])!=0)
i++;
tmp[strl]=str[i];
strl++;
}
printf("%s",tmp);
}
こうやると、スペースの前で文字列が終了していることになっているようです。
709デフォルトの名無しさん:2005/06/17(金) 22:39:43
すいません、字下げがなくなって見づらくなってますねorz
#include <stdio.h>
#include <ctype.h>
#include <string.h>

int main(void)
{
 char str[100],tmp[100];
 int i,strl=0;
 scanf("%s",str);
 for(i=0;str[i]!='\0';i++){
  while(isspace(str[i])!=0)
   i++;
  tmp[strl]=str[i];
  strl++;
 }
 printf("%s",tmp);
}
710デフォルトの名無しさん:2005/06/17(金) 22:42:10
>>705-707 おもろい
もえ
711デフォルトの名無しさん:2005/06/17(金) 22:45:50
>>709
scanf("%s",str) → gets(str)
あとループ出たらtmp[strl] = '\0'
712デフォルトの名無しさん:2005/06/17(金) 22:47:34
getsは安全じゃないとか言って荒らしていいですか
713デフォルトの名無しさん:2005/06/17(金) 22:49:23
>>711
ありがとうございました、助かりました
714デフォルトの名無しさん:2005/06/17(金) 22:54:15
>>708
#include <stdio.h>
#include <ctype.h>
int main(void) {
    int c;
    while ((c = getchar()) != EOF) if (!isspace(c)) putchar(c);
    return 0;
}
これで十分ジャマイカ?
715デフォルトの名無しさん:2005/06/17(金) 23:07:42
え?タブとか改行とか殺していいの?
716デフォルトの名無しさん:2005/06/17(金) 23:08:25
>>714
仕様と違うし
717デフォルトの名無しさん:2005/06/17(金) 23:21:53
>>714
ドソマイ
718714:2005/06/17(金) 23:26:36
>>715-717
こんな俺にレスを… ヽ(`Д´)ノウワァァン!!
719デフォルトの名無しさん:2005/06/18(土) 00:40:12
これで十分ジャマイカ?
#include<stdio.h>
int main(void){int c;while((c=getchar())-EOF)if(!((c-' ')*(c-'\t')))putchar(c);
return 0;}
720デフォルトの名無しさん:2005/06/18(土) 01:06:25
普通にisspaceの方が速そうだが
721デフォルトの名無しさん:2005/06/18(土) 01:09:02
>>720
isspaceは改行とかも非0を返すわけだが。
722デフォルトの名無しさん:2005/06/18(土) 01:14:31
>>719
仕様と違うし
723デフォルトの名無しさん:2005/06/18(土) 02:06:01
□うるさいでちゅね
724デフォルトの名無しさん:2005/06/18(土) 02:15:24
defineで定義された値がどこで使われているかログを取りたいので
ファイルに出力したいのですが、そのまま出力するとマジックナンバーになってしまいます
defineで定義された名前(と値)を記録したいのですがなにか良いテクは無いでしょうか

今のところ
・define名と値をペアにした静的なテーブルを用意
・値をキーとして名前を取得
・名前をファイルに書く
としてるんですが、コンパイル時に決まっているものを
実行時にわざわざサーチして取得してるのは無駄な気がします

※defineの値に重複は無いです

725デフォルトの名無しさん:2005/06/18(土) 02:44:55
gccでなら何かかっこいいテクがあった気がする
H8 gcc でググると
726デフォルトの名無しさん:2005/06/18(土) 05:03:23
http://www.libspf2.org/spf/libspf2-1.2.5.tar.gz で SPF_config_t という
構造体を定義している場所を探しているのですが、うまくみつけられません。
教えてエロい人!
727デフォルトの名無しさん:2005/06/18(土) 05:30:48
>>726
定義されてないよ。
728デフォルトの名無しさん:2005/06/18(土) 05:46:13
>>727
ありがとうございます。libspf2-1.2.5/src/libspf2/spf_config.c にある、
SPF_config_t は何なのでしょうか。てっきり、SPF_create_config が返す型で、
int とかではないから構造体かと思ったのですが…。

57 SPF_config_t SPF_create_config()
58 {
59 SPF_iconfig_t *spfic;
60
61 spfic = calloc( 1, sizeof(*spfic) );
62 if ( spfic )
63 SPF_reset_config( SPF_spfic2cid(spfic) );
64
65 return SPF_spfic2cid(spfic);
66 }
729デフォルトの名無しさん:2005/06/18(土) 06:02:33
>>728
過去使ってたけど、今のバージョンでは使われてないから定義されてないのでは?
SPF_config_tが登場するところは全部#if 0と#endifに囲まれてて、
コンパイルされないしね。
730デフォルトの名無しさん:2005/06/18(土) 06:22:09
>>729
わー、ありがとうございます。#if 0 をみのがしていました。どうもです。
731デフォルトの名無しさん:2005/06/18(土) 14:34:38
>>725
情報ありがとうございます
ググるとH8というマイコンを扱ったページがヒットします
H8用のgccで何かかっこいいテクを使ってるんでしょうか


とりあえずネットの海をクロールしてきます
732デフォルトの名無しさん:2005/06/18(土) 15:09:36
>>724
grepで探せよ
733デフォルトの名無しさん:2005/06/18(土) 15:12:01
??
734デフォルトの名無しさん:2005/06/18(土) 15:18:04
>724
ログ、って何で出力四天王?
文字列じゃねの?
735デフォルトの名無しさん:2005/06/18(土) 15:34:48

#define HOGE 1
str[1]="HOGE";

printf("%02X(%s)\n",HOGE,str[HOGE]);
こういうことをやってると思う。
で、いちいちstrに入れることなく
HOGEを"HOGE"として扱う方法を
彼は探している。
736デフォルトの名無しさん:2005/06/18(土) 15:37:17
>>724
コンパイラからは定数に見えているんだから、無茶
737デフォルトの名無しさん:2005/06/18(土) 15:45:43
>>724
こういうことがしたいのか?

#include <stdio.h>

#define EVAL(x) #x
#define LOG(x) printf("%s: %d: %s: %s\n", __FILE__, __LINE__, #x, EVAL(x))

#define FOO 1
#define BAR 2.0

int main() {
LOG(FOO);
LOG(BAR);
return 0;
}
738デフォルトの名無しさん:2005/06/18(土) 15:49:15
>#x
これ、どの版のCから使えるの?
739デフォルトの名無しさん:2005/06/18(土) 15:50:38
>HOGEを"HOGE"として扱う方法

?単にそうすればええやん
printf("%s","HOGE");
740デフォルトの名無しさん:2005/06/18(土) 15:55:19
>>739
お前は本当にアホだな
741デフォルトの名無しさん:2005/06/18(土) 16:00:56
>>738
C89
742デフォルトの名無しさん:2005/06/18(土) 16:30:10
>741
ほんとだ、thanks
743デフォルトの名無しさん:2005/06/18(土) 17:40:06
ファイルかフォルダかを判別するにはどうすればよろしいですか?
744デフォルトの名無しさん:2005/06/18(土) 17:49:31
>>743
処理系依存

まあstat()が使えるんならstat()で。
745デフォルトの名無しさん:2005/06/18(土) 17:52:51
/A 指定した属性のファイルを表示します.
属性 : D ディレクトリ
746デフォルトの名無しさん:2005/06/18(土) 17:58:37
>>744
環境依存でしたか。 stat ありました。さっそくやってみます。

>>745
そちらのほうは何とかなっとりました。けれども、レスありがとうございまス!
747デフォルトの名無しさん:2005/06/18(土) 21:13:58
&& やら || で、左に来る式が真(偽)ならば、右側は実行しないという
のは保障されていますよね??
748デフォルトの名無しさん:2005/06/18(土) 21:19:47
>>747
はい
749デフォルトの名無しさん:2005/06/18(土) 21:19:55
>>747
yes, sir
750デフォルトの名無しさん:2005/06/18(土) 21:26:44
>>748-749
サンクス
751デフォルトの名無しさん:2005/06/18(土) 21:30:08
c = a(x) + b(x);
実行されるのは aとb どっちが先だっけ
752デフォルトの名無しさん:2005/06/18(土) 21:32:55
>>751
処理系依存だったよーな。最適化の都合で、同一処理系内でも保証されてないかも。
753デフォルトの名無しさん:2005/06/18(土) 21:33:08
>751
それは決まってない
754デフォルトの名無しさん:2005/06/18(土) 21:36:06
>>751
規格ではaが先
755デフォルトの名無しさん:2005/06/18(土) 21:43:09
>規格
うそつくなよw
756デフォルトの名無しさん:2005/06/18(土) 21:49:07
>>752
これって、「必ずどっちかが先に実行される」というのすら
規定はされてないよね?
最適化の都合なら、同時に動くこともあるよね?
757デフォルトの名無しさん:2005/06/18(土) 22:00:54
でも普通、Aやって、Bやって、最後はCだろ?
漏れはまだAもやってないけど。
758デフォルトの名無しさん:2005/06/18(土) 22:02:58
>同時に動くことも
な、なんだって〜!
759デフォルトの名無しさん:2005/06/18(土) 22:03:43
>>751
しつこいが規格では未規定
760デフォルトの名無しさん:2005/06/18(土) 22:13:17
>>758
最近はCPUがたくさんあるのも珍しくないし
「同時」は普通のことだと思うので。
761デフォルトの名無しさん:2005/06/18(土) 22:13:46
>>759
未規定ってなに?不定のこと?未定義のこと?
762デフォルトの名無しさん:2005/06/18(土) 22:27:31
>最近はCPUがたくさんある
それはCの話ではないだろ?
ベーシックだろうが機械語だろうがコボルだろうが
763懐かしの規格厨:2005/06/18(土) 22:28:05
>>761
3.4.4 未規定の動作(unspecified behavior)
 この規格が,二つ以上の可能性を提供し,
 個々の場合にどの可能性を選択するかに関して
 何ら要求を課さない動作。
  例 未規定の動作の例としては,関数の実引数の評価順序がある。
764デフォルトの名無しさん:2005/06/18(土) 23:09:40
>>763
その定義では処理系定義も含んでしまうな
765デフォルトの名無しさん:2005/06/18(土) 23:11:15
学校でCを習ってるんですが、バブルソートがわけわからんですばい
というか全般的にサッパリ・・・
766デフォルトの名無しさん:2005/06/18(土) 23:13:12
バグルソートが分からないんじゃあ…
767デフォルトの名無しさん:2005/06/18(土) 23:13:23
>>765
やめちまえって

そして頭の悪いロボットサラリーマンとして
搾取される側に周るがいいよ
768デフォルトの名無しさん:2005/06/18(土) 23:14:25
769デフォルトの名無しさん:2005/06/18(土) 23:19:00
バブルソートが分からないって香具師はさすがに初めて見ましたな
今後の身の振り方を考えるいい機会なんじゃないの?
770デフォルトの名無しさん:2005/06/18(土) 23:21:44
あーわ あーわー
771デフォルトの名無しさん:2005/06/18(土) 23:23:38
まぁバブルソートわかんなくても、トランプの並べ替えができれば大丈夫

人間的にはバブルソートしないからな
772デフォルトの名無しさん:2005/06/18(土) 23:25:15
多分考えようとしてないだけだろ。

最近は公立中学の技術の教科書にもプログラミングについて載ってるからな。
やりたくもない事やらされたらなんも考えようとしないだろう。
彼はそんな中学生。
773デフォルトの名無しさん:2005/06/18(土) 23:30:20
あぁその公立中学の技術の教科書に載っていたBASICに感銘を
受けてFM-TOWNSでプログラムを始めた頃がナツカス…
774デフォルトの名無しさん:2005/06/18(土) 23:39:47
%演算子っていつから存在しているんですか?
C言語が出来た当初からあったんですか?それとも
適当な時期に導入されたものなんですか?
775デフォルトの名無しさん:2005/06/18(土) 23:41:20
>>773
漏れは親父が買った「マイコン」の説明書に載ってた
サンプルプログラムを打ち込んだのが最初だったな。

当時、まだ消防だった。
776デフォルトの名無しさん:2005/06/18(土) 23:53:49
>>773 >>775
つまりオタク出身プログラマ?もしくは現役オタク?
777デフォルトの名無しさん:2005/06/18(土) 23:56:34
ただのオヤジじゃないかと
778デフォルトの名無しさん:2005/06/18(土) 23:57:48
>>777
何歳以上なら「オヤジ」に分類されるんだ?
779773:2005/06/19(日) 00:01:28
>>776
現役オタクもうすぐお医者さん
780デフォルトの名無しさん:2005/06/19(日) 00:15:35
漏れ的には30越えたらオッサンだな
781デフォルトの名無しさん:2005/06/19(日) 00:27:42
まあ大体30くらいからだろうな。
782デフォルトの名無しさん:2005/06/19(日) 00:34:19
>>780-781
なんかマジレスっぽくてオモロイなw
783デフォルトの名無しさん:2005/06/19(日) 01:06:53
40超えたらおじさんだよ
784775:2005/06/19(日) 01:20:25
40どころか30にもなってないよ… orz
785デフォルトの名無しさん:2005/06/19(日) 01:32:18
両手を使って2倍の速さで、両足も使って4倍の速さで入力
ハッピーバースデーの音楽でケーキに蝋燭が立ってて
スペースを押すと火が消える

そんな感じの漫画だったと思うんですけど、覚えてる人いますか?
786デフォルトの名無しさん:2005/06/19(日) 01:55:34
>>775
そうか、じゃあいいこと教えてやろう。
30前になるとチンゲの色がやや脱色ぎみになる。
30も半ばになるとチンゲに白髪が交じって来る
その後は白髪でいっぱいのチンコの完成だ。
チンコ見てるとどんどん年を食っていくのが良く分かるぞw
787デフォルトの名無しさん:2005/06/19(日) 02:53:13
いや、髪は大分白くなったが下は黒々としているよ。
788デフォルトの名無しさん:2005/06/19(日) 03:14:31
チソゲにもいろいろあるんだな
789デフォルトの名無しさん:2005/06/19(日) 04:07:17
ちんげより、当面の問題はけつげなのだが。

脱毛クリームで全滅させても大丈夫かな?
毛で肛門切れたりして痛いときがあるのだが
790デフォルトの名無しさん:2005/06/19(日) 05:43:50
男は黙って毛抜きで抜く
791デフォルトの名無しさん:2005/06/19(日) 06:16:43
温度高めのシャワーで毛穴を開いておいて一気に抜く
792デフォルトの名無しさん:2005/06/19(日) 06:18:27
あぅっ!イタイッ!! ハァハァ
793デフォルトの名無しさん:2005/06/19(日) 11:33:27
>764
3.4.1 処理系定義の動作(implementation-defined behavior)
未規定の動作のうち、各処理系が選択した動作を文書化するもの。
 例 処理系定義の動作の例としては、符号付き整数を右シフトした場合の最上位ビットの伝播法がある。
794ccc:2005/06/19(日) 21:10:36
教えてもらたい問題がいくつかるんすけどいいっすか?
795デフォルトの名無しさん:2005/06/19(日) 21:12:38
>>794
日本語が怪しい
796デフォルトの名無しさん:2005/06/19(日) 21:18:24
>>794
宿題なら専用スレがあるんで、そちらへどうぞ
http://pc8.2ch.net/test/read.cgi/tech/1118165596/
797ccc:2005/06/19(日) 21:27:10
わかりました・・・
798デフォルトの名無しさん:2005/06/19(日) 22:17:25
C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?
799デフォルトの名無しさん:2005/06/19(日) 22:19:44
偉大なるビットシフターであるわたしが答えようか?
800デフォルトの名無しさん:2005/06/19(日) 22:20:16
ビットをずらす必要があるとき

身も蓋もない答え方なのは仕方がない
本当にそういう場合がビシバシ出てくるから
801デフォルトの名無しさん:2005/06/19(日) 22:23:05
もしかして: 身も蓋もない

20年間間違って覚えてたらしいこの俺様
802デフォルトの名無しさん:2005/06/19(日) 22:25:07
ほんの数年「正しく憶えた」小僧かい?
803デフォルトの名無しさん:2005/06/19(日) 22:26:17
キャリア≠実力
804デフォルトの名無しさん:2005/06/19(日) 22:30:33
ちょと質問です。

unsigned char buf[4];
unsigned int n;
fread(buf, sizeof(char), sizeof(buf), FP);
n = (buf[3]<<24)^(buf[2]<<16)^(buf[1]<<8)^buf[0];
printf("n = %d\n", n);


n が符号付になってしまうんですがこういうものなんでしょうか?
符号なし整数になってほしいんですが、ドコがどういけないのかサッパリで・・
805デフォルトの名無しさん:2005/06/19(日) 22:33:02
%u
806デフォルトの名無しさん:2005/06/19(日) 22:33:20
>>804
%dは符号付整数の指定。符号なしにするには%u。
807804:2005/06/19(日) 22:48:07
なるほど、%uってのがあるんですね。

ということは n は内部で符号付きとして扱われているってことでしょうか?
808デフォルトの名無しさん:2005/06/19(日) 22:49:40
>>807
いいえ、あなたの書いたとおりに解釈します。
809デフォルトの名無しさん:2005/06/19(日) 22:54:01
>>807
いいえ、printfの内部で無理矢理符号付きに解釈されているだけです
ためしにコンパイラに警告オプションをつけてコンパイルしてみなさい
警告されるから
810804:2005/06/19(日) 22:56:16
>808
安心しました。

みなさんありがとでした。
811デフォルトの名無しさん:2005/06/19(日) 22:56:22
ただし符号付整数型とそれに対応する符号無整数型、両者どちらでも表現できる値は内部のビットパターンが同じになっていることが規格で保障されている。
812804:2005/06/19(日) 22:58:15
>809
そういうことでしたか。ガッテンしました。
813デフォルトの名無しさん:2005/06/19(日) 23:44:50
剰余演算子とfmod以外に剰余を求める方法ってないのでしょうか?
814デフォルトの名無しさん:2005/06/19(日) 23:50:10
div
815デフォルトの名無しさん:2005/06/19(日) 23:50:44
減算をループして求めるとか。
816デフォルトの名無しさん:2005/06/19(日) 23:54:38
>>813
m = n != 0 ? hoge - hoge / n * n : 0
とか?
817デフォルトの名無しさん:2005/06/20(月) 00:08:28
scanf( ) や gets( ) などの関数がありますが、
これは商用に適さないので、商用で適する関数を使え。
と言われたのですが、何を使えばいいですか?
初心者にはわからないです…
818デフォルトの名無しさん:2005/06/20(月) 00:10:36
>>817
・scanf()
戦術から練り直す必要があるが、一般的にはfgets()+sscanf()で代用できるだろう。
・gets()
無条件にfgets()に置き換え可能。
819デフォルトの名無しさん:2005/06/20(月) 00:13:52
>>817
s/使え/探せ/
もしくは
s/使え/作れ/

fgets を含むシーケンスをバラで書いているようなセンパイを見かけたら師匠は他を探せ
820デフォルトの名無しさん:2005/06/20(月) 00:22:41
>>819
適材適所
821デフォルトの名無しさん:2005/06/20(月) 01:15:09
マインスイーパーのスコアってどこに記録されてるんですか?改竄とかできちゃう?
822デフォルトの名無しさん:2005/06/20(月) 01:18:34
板違い
ゲイツ板池
823デフォルトの名無しさん:2005/06/20(月) 01:39:14
>>819
> fgets を含むシーケンスをバラで書いている

これの意味がわからないのですが・・・
824デフォルトの名無しさん:2005/06/20(月) 01:42:12
わかんなくていい
failed unit は assy ごと交換
825デフォルトの名無しさん:2005/06/20(月) 01:42:49
最長不倒関数ジェネレータ氏ね
826ビル・ジョブス:2005/06/20(月) 17:24:02
>>798
例えば1BPPのビットマップをnドット右へずらしたい時どうしたらいーと思う?
827デフォルトの名無しさん:2005/06/20(月) 17:29:27
>>826
氏ねボケ
828ビル・ジョブス:2005/06/20(月) 18:02:40
>>827
さすが紳士は言う事が違うな。
829デフォルトの名無しさん:2005/06/20(月) 18:17:12
今俺は、「死んだ筈のゴキブリがまだ生きていた」、みたいな感覚に襲われている。
830デフォルトの名無しさん:2005/06/20(月) 18:20:24
それよりも、くだらんビットマップのコピペに反応するカスが
未だにいたのかと驚いた。
831デフォルトの名無しさん:2005/06/20(月) 18:27:20
ビットマップのコピペに反応するカスに反応するアホは
どうしたもんでしょうか?
832デフォルトの名無しさん:2005/06/20(月) 18:29:53
ビットマップのコピペに反応するカスに反応するアホに反応するマヌケは
どうしたもんでしょうか?
833デフォルトの名無しさん:2005/06/20(月) 18:33:06
僕はビットマップのコピペに反応するカスに反応するアホに反応するマヌケに反応するチンカスです。
834デフォルトの名無しさん:2005/06/20(月) 18:35:45
つか、ビットマップ?

彼は特別な病院から退院したばっかりなんで
最近の流行についていけてないんです。
835デフォルトの名無しさん:2005/06/20(月) 18:44:00
退院なんてできるのか?
836デフォルトの名無しさん:2005/06/20(月) 18:44:49
お前より症状は軽いだろ
837デフォルトの名無しさん:2005/06/20(月) 18:47:40
何の?
838デフォルトの名無しさん:2005/06/20(月) 18:51:28
鎖骨骨折
839デフォルトの名無しさん:2005/06/20(月) 18:53:26
センスの無い奴だ
840デフォルトの名無しさん:2005/06/20(月) 19:06:11
三国無双
841デフォルトの名無しさん:2005/06/20(月) 20:04:26
マクロを詳しく解説してるとこない?
842デフォルトの名無しさん:2005/06/20(月) 20:15:03
何のマクロ?
マクロの作り方?
定義済みマクロ?
843デフォルトの名無しさん:2005/06/20(月) 20:29:06
マクロをつくるなら、lispにしときなさい、ってemacsのえらい人が言ってたよ
844デフォルトの名無しさん:2005/06/20(月) 20:46:41
>>842
#ifdefみたいな
#**ってのがどんなのがあるかとか。
これでおれ様便利に暮らしてますとか。
845デフォルトの名無しさん:2005/06/20(月) 20:57:29
マクロねえ
林なんたらとかいう【作家さん】がペタシーベルト級のトンデモ本書いてたが・・・・
846デフォルトの名無しさん:2005/06/20(月) 20:58:48
>>844
> #ifdefみたいな

#ifdef マクロじゃない。
847デフォルトの名無しさん:2005/06/20(月) 21:13:14
もう真っ黒
848デフォルトの名無しさん:2005/06/20(月) 21:14:32
プリプロセスディレクティブのことか。
#idef
#ifndef
#if
#if defined
#elif
#undef
#include
#define
#error
#pragma

まとめてかいてあるところは知らないけど、検索すればいくらでも出てくるべ。
849デフォルトの名無しさん:2005/06/20(月) 21:20:52
肛門裂傷とかじゃね?
850デフォルトの名無しさん:2005/06/20(月) 21:36:41
851デフォルトの名無しさん:2005/06/20(月) 21:39:53
コンパイラ(できればgcc)とかの標準関数のソースってないんですか??
printfとかmemcmpとかそういうやつです。。
852デフォルトの名無しさん:2005/06/20(月) 21:43:27
>>851
処理系に付属していることが多い。もちろんgccにも付属している。
尤もgccはコンパイラ自身さえ……。
853851:2005/06/20(月) 22:00:02
>>852
検索してみたんですけどどのファイルかわからないんですが…
Vine Linuxの3.1が入ってるんですけどどこかにあるんですか??
もしくはネット上にあるとか…>_<;
854デフォルトの名無しさん:2005/06/20(月) 22:12:16
ダイテル親子の本、全部終わらすのに3年くらいかかりそうだ・・・
解答ってどっかにないの?
855デフォルトの名無しさん:2005/06/20(月) 22:13:04
つfind / -name include
856デフォルトの名無しさん:2005/06/20(月) 22:19:43
ライブラリソースは別にインストールしないとないかもね
857デフォルトの名無しさん:2005/06/20(月) 22:32:08
>>853
glibc のソースを落として来ればいい。
でも、自分が使っているライブラリのソースが見たいとかじゃないなら、
FreeBSD とか NetBSD のソース見るのがお勧め。GNU は読み辛い。
858デフォルトの名無しさん:2005/06/20(月) 22:48:46
でも、肛門が切れると治りが遅いんだよ。
基本的に綺麗なところではないからね。
859デフォルトの名無しさん:2005/06/20(月) 23:47:07
char *a,*b;
if(scanf("%s",a)==scanf("%s",b))
が常に真になるのですがなぜでしょうか?
860デフォルトの名無しさん:2005/06/20(月) 23:49:53
>>859
未定義動作。逝ってよし
ポインタの先に何があるんだよ?
861デフォルトの名無しさん:2005/06/20(月) 23:59:55
>>860
すいません。確かにそうですね。
ということで宣言を
char a[256],b[256],*pa,*pb;
とし、
・if(scanf("%s",a)==scanf("%s",b))
・if((pa=scanf("%s",a))==((pb=scanf("%s",b)))
・if((scanf("%s",a))==(scanf("%s",b)))
の三つの方法を試しても思ったような結果がえられませんでした。
どこが悪いのか教えてください
862861:2005/06/21(火) 00:01:06
すいません。
二つ目の方法は
・if((pa=scanf("%s",a))==(pb=scanf("%s",b)))
です
863デフォルトの名無しさん:2005/06/21(火) 00:02:20
scanf()の実行順序がどっちが先かわからない(っつーか処理系依存)だからだ
864デフォルトの名無しさん:2005/06/21(火) 00:05:40
f() + g() * h()
掛け算は足し算の前に起こるということはわかっているけれど、3つ の関数のうちどの関数が最初に呼ばれるかはわからない。
865デフォルトの名無しさん:2005/06/21(火) 00:05:50
>>861
思ったような結果って何?
866デフォルトの名無しさん:2005/06/21(火) 00:08:15
scanfの戻り値って、成功した変換の個数だが?
867デフォルトの名無しさん:2005/06/21(火) 00:09:35
>>863,864
ありがとうございます。
いろいろ調べて見ます

>>865
if(〜〜〜)
printf("同じ\n");
else
printf("違う\n");
です
868867:2005/06/21(火) 00:13:47
標準関数使ったらめんどくさそうなのでstrcmp使います。
ありがとうございました。
869デフォルトの名無しさん:2005/06/21(火) 00:15:44
(゚Д゚)
870デフォルトの名無しさん:2005/06/21(火) 00:15:51
。。。もまえがやりたかったのは入力文字列が一致したかどうかなのか!
871デフォルトの名無しさん:2005/06/21(火) 00:16:01
strcmpって標準関数じゃないのか。
872867:2005/06/21(火) 00:17:59
>>871
stdio.h内の関数=標準関数だと思ってましたorz
873デフォルトの名無しさん:2005/06/21(火) 00:27:01
>>867
結構やってしまいがちな誤りだが・・・

俺はずっと下のやり方が正しいやり方だと思っていたよ

char idt[101];
char *p=idt;
.......
*(p+99)='\n';
*(p+100)='\0';
fputs(p,fout);
874デフォルトの名無しさん:2005/06/21(火) 00:31:49
??? >873って何がいいたいの?
875デフォルトの名無しさん:2005/06/21(火) 00:39:02
なんだかばかばっか
876デフォルトの名無しさん:2005/06/21(火) 01:09:01
scanfの戻り値を比較して文字列が同一かどうか判断することを
> 結構やってしまいがちな誤りだが・・・
と言ってしまう>>873ってどうよ?
877デフォルトの名無しさん:2005/06/21(火) 01:13:15
おまえらこんな下らない低レベルの話にいつまでも
付き合うなよ
878デフォルトの名無しさん:2005/06/21(火) 02:06:02
おまいら全員「こちらへどうぞ」
879デフォルトの名無しさん:2005/06/21(火) 05:06:47
下のような文字列たちをファイルから読み込み、
PIE - St Petersburg/Clearwater : FL : USA St Petersburg/Clearwater Intl
最初のPIEをchar型配列keyに、St以降をdataに格納したいのだけど
下のじゃだめでした。どうすればいいですか?
while( fgets( string, STRING_SIZE, fp) )
{
sscanf( string, "%s %*s %s", key, data);
}
880デフォルトの名無しさん:2005/06/21(火) 06:26:22
>>879
sscanf(string, "%s - %[^\n]", key, data);
881デフォルトの名無しさん:2005/06/21(火) 12:00:14
[課題Q]3角形の底辺の長さ,高さをキーボードから読込み,その面積を計算するプログラムを作成しなさい.
ただし,底辺の長さ,高さ,面積の値を入れる変数名をそれぞれteihen, takasa,mensekiとし,いずれも実数型(double型)とする.


void main( void )
{
double teihen, takasa, menseki;

printf( "底辺は?\n" ); /* 入力を促すメッセージを表示 */
scanf( "%d", &teihen );

menseki = teihen * takasa / 2;
printf("%f\n",menseki);
}

これ誰か完成させてくれ
882デフォルトの名無しさん:2005/06/21(火) 12:07:55
>>851
コンパイラとライブラリの区別を付けようね。
gccはコンパイラで、printf()とかmemcmp()はライブラリ。

Linuxではglibcでこのへん
http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/?cvsroot=glibc
FreeBSDはこのへん
http://www.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/
NetBSDはこのへん
http://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libc/
883デフォルトの名無しさん:2005/06/21(火) 12:08:09
え、それくらい頑張りなよ
その調子で行けばいけるって
884デフォルトの名無しさん:2005/06/21(火) 12:11:13
>883 もう大学に課題提出しなきゃいけないんですよ。とりあえず答え教えてください
885デフォルトの名無しさん:2005/06/21(火) 12:12:02
>>884
Fuck you.
886デフォルトの名無しさん:2005/06/21(火) 12:17:50
そりゃ酷いよ
だれか教えてあげなよ
887デフォルトの名無しさん:2005/06/21(火) 12:19:30
>>881
スレ違い
888デフォルトの名無しさん:2005/06/21(火) 12:21:17
誰もわからないんですね
こんな糞スレに書き込んだ俺が馬鹿でした
889デフォルトの名無しさん:2005/06/21(火) 12:21:49
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。

GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。

エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。
890デフォルトの名無しさん:2005/06/21(火) 12:24:59
>>888
そう書けば教えてもらえると見ての煽りですね。
薄っぺらい人だ。
891881:2005/06/21(火) 12:26:07
>888 は俺じゃないんだが
892デフォルトの名無しさん:2005/06/21(火) 12:27:45
それが何か?
893デフォルトの名無しさん:2005/06/21(火) 12:31:17
{double teihen,takasa,menseki;printf("底辺?\n");scanf("%lf", &teihen);printf("畳鰯?\n");scanf("%lf",&takasa);menseki=teihen*takasa/2;printf("%lf\n",menseki);}
894デフォルトの名無しさん:2005/06/21(火) 12:32:08
>>893
は?とっくにできたけど?馬鹿?
895881:2005/06/21(火) 12:34:55
なんかもうこのスレいやになってきた・・・・
とりあえず>893ありがとうございます
896デフォルトの名無しさん:2005/06/21(火) 12:36:22
>>895
なんだよ、このスレなりに超歓迎されてるし、すごく馴染んでるぞ
また来てね
897デフォルトの名無しさん:2005/06/21(火) 12:36:41
printf("%lf\n",
↑???
898デフォルトの名無しさん:2005/06/21(火) 12:38:12
>>895
おーい、向こうにもレス来てるぞ。ちゃんと謝ってこいや。
899デフォルトの名無しさん:2005/06/21(火) 12:41:22
>>897
ついだよ、わざとだよ、知ってるよ
900デフォルトの名無しさん:2005/06/21(火) 13:35:34
>>899
だまれ神楽
901デフォルトの名無しさん:2005/06/21(火) 17:41:46
1000001010001001010111111101100001100011100010110001010
このビット列(文字列型で出力)を6bitごとに(余ったものは切り捨て)区分けしたら
100001 101001 100100 011111 110110 000110 001110 001010 000101
って出力されたんだけど
なんで最下位ビットだけおかしいのがあるのかがわからん・・・
902デフォルトの名無しさん:2005/06/21(火) 17:46:08
>>901
独り言なら壁に向かってやってくれ
903デフォルトの名無しさん:2005/06/21(火) 17:52:38
>>902
つ |壁|
904デフォルトの名無しさん:2005/06/21(火) 19:15:17
char str[] = "hello\n";
int i;

・・・

for(i=0; str[i]!='\0'; i++){
printf("%c☆",str[i]);
}

で、printf("%c☆",str[i]);の部分をprintf("%s☆",str[i]);にするとエラーを吐いてしまいます。
なぜでしょうか?
905デフォルトの名無しさん:2005/06/21(火) 19:18:21
型が違うから。
906デフォルトの名無しさん:2005/06/21(火) 19:27:27
なんか今日、このスレが変だわ!
地震でもくるのかしら
907デフォルトの名無しさん:2005/06/21(火) 20:31:23
str[i]は文字列の中の一文字を表しているので%sではいけませんの。
岡さん、よくって?
908デフォルトの名無しさん:2005/06/21(火) 20:34:03
はいっ!お蝶婦人!
909デフォルトの名無しさん:2005/06/21(火) 20:43:48
でもあれでエラー吐くかな・・?
910デフォルトの名無しさん:2005/06/21(火) 21:02:02
core dumpedとか。
gccなら、*printfのフィールドの不一致でエラー吐くな。
911851:2005/06/21(火) 21:51:26
882さん、ありがとうございます^^
ちゃんとブックマークしておきます☆
912デフォルトの名無しさん:2005/06/21(火) 22:18:31
851は女
913デフォルトの名無しさん:2005/06/21(火) 22:20:23
他にもいるのにw
914デフォルトの名無しさん:2005/06/21(火) 22:38:31
906は女
915デフォルトの名無しさん:2005/06/21(火) 22:43:29
漏れは?
916デフォルトの名無しさん:2005/06/21(火) 22:44:53
>>915
コンパイラ
917デフォルトの名無しさん:2005/06/21(火) 22:47:13
804は女
918904:2005/06/21(火) 23:03:12
>>905,907
わかりました。ありがとうございます
919デフォルトの名無しさん:2005/06/21(火) 23:03:46
そして下げ忘れた俺氏ね
920デフォルトの名無しさん:2005/06/21(火) 23:37:10
char *型の変数の後ろにint型の変数をくっつけていきたいんですけど、どうすれば出来ますか?
strcatやsprintfでも試したんですけど、強制終了食らって出来ませんでした
921デフォルトの名無しさん:2005/06/21(火) 23:40:22
腐ってもム板にとてつもなく非科学的な奴がいるな
922デフォルトの名無しさん:2005/06/21(火) 23:41:36
>>920
何をやりたいのかよーわからん
強制終了食らったソース晒すよろし
923デフォルトの名無しさん:2005/06/21(火) 23:44:48
>>920はおそらくこうしてると俺のゴーストがささやいている

char* p="Hello";

int i=100;
strcat(p,(char*)&i);
924デフォルトの名無しさん:2005/06/22(水) 00:12:50
>>920
はどういう結果を期待しているんだろうか?
>>923でいうと、
文字列が"Hello100"となってほしいのか、
それとも"Hello"の後ろに文字コード100番の文字を一文字足したいのか?
925920:2005/06/22(水) 00:20:56
>>922 >>924
Hello100となってほしいです
エラーはメモリがどうこう言うやつでした
926デフォルトの名無しさん:2005/06/22(水) 00:26:57
>>925
char buf[100] = "Hello";
sprintf(strchr(buf, '\0'), "%d", 100);
927デフォルトの名無しさん:2005/06/22(水) 00:41:00
>>920
char buf[256];
sprintf( buf, "%s%d", "Hello", 100 );
928デフォルトの名無しさん:2005/06/22(水) 00:58:44
ちょとまて、
>>920 は 「くっつけていきたい」 っていってるぞ。
>>920 は文字列のメモリへの格納のされ方知らないみたいだし
char buf[100] や [256] で足りるのかw
929デフォルトの名無しさん:2005/06/22(水) 01:26:44
幾つかの処理ごとに関数を用意し、処理を行う関数を読んだら元の位置に戻って
コードを実行するプログラムを書いています。
すると、関数が関数を呼び、再帰的に深い呼び出しになってしまうのですが
これは良くないでしょうか。
これが良くないとすればどのような方法で回避できるでしょうか。
教えてください。


main(){

 test1();

}

test1(){
 /*何か処理*/

 test2(); /*飛ばす*/

}

test2(){

 /*何か処理*/

 test1(); /*戻る*/

}
930デフォルトの名無しさん:2005/06/22(水) 01:28:04
なにがやりたいんだ?
931デフォルトの名無しさん:2005/06/22(水) 01:34:08
>>930
関数の呼び出しが入れ子になってしまうので、それがまず大丈夫なのか。
大丈夫でないならどのような回避方法があるか、という質問でした。

例えばtest1で画面を出してtest2で実際の処理を行う場合
画面を表示する、処理を行う、と言う組み合わせを交互に何度もやりますよね。
932デフォルトの名無しさん:2005/06/22(水) 01:37:43
>>931
直接的な再帰がちゃんと使えている人にとって
間接的な再帰には特に変わったことはないはず
どうしても悩むようなら直接的な再帰に戻って
ウイークポイントがないかチェックすべし
933デフォルトの名無しさん:2005/06/22(水) 01:38:37
>test1で画面を出してtest2で実際の処理を行う場合
ループしたけりゃループ{
test1()
test2()
}
だな、ふつうは
934デフォルトの名無しさん:2005/06/22(水) 01:41:20
再帰が嫌いとか言いながら SendMessage は平気で使う人とか・・・
935929:2005/06/22(水) 01:49:02
分かりづらい説明で申し訳ありません。実際に試しました。

void Test1(void){
 printf("TEST1:%d", ++count);
 Test2();

}


void Test2(void){
 printf("TEST2:%d", ++count);
 Test1();
}

このような形でTest1関数を呼ぶと、数万回でエラーがでますね。
やはり何らかの方法で回避しなければいけないのですが
アルゴリズムを書き換えるか、一定回数以上は終了するなどの例外処理を入れてやるしか無いのでしょうか。
936デフォルトの名無しさん:2005/06/22(水) 01:51:27
本質的に判ってないというか……
ただの馬鹿?
937デフォルトの名無しさん:2005/06/22(水) 01:53:26
いや、だからふつうは
void Test1(void){
 printf("TEST1:%d", ++count);
}
void Test2(void){
 printf("TEST2:%d", ++count);
}

ループ{
Test1();
Test2();
}
だってば
938デフォルトの名無しさん:2005/06/22(水) 01:56:17
>>929
933の方法と君が実現しようとしているやり方の
メリット、デメリットを箇条書きにしてみろ。
939デフォルトの名無しさん:2005/06/22(水) 02:00:08
>>938
この例だと当然ループに2つ関数を書けば良いですが。
実際には互いにもっと大きな機能を受け持っているので、呼ばれるタイミングなども一定ではありません。
ですのでそもそもそういう書き方は出来ないです。
940デフォルトの名無しさん:2005/06/22(水) 02:00:57
void Test1(void){
printf("TEST1:%d", ++count);
条件1
 Test2();
条件2

}

void Test2(void){
printf("TEST2:%d", ++count);
条件1
 Test2();
条件2
Test1();
}
941デフォルトの名無しさん:2005/06/22(水) 02:01:28
>>939
再帰の理解が出来てない。書きかえるのが既知。
942941:2005/06/22(水) 02:01:42
943デフォルトの名無しさん:2005/06/22(水) 02:04:13
>そもそもそういう書き方は出来ないです。
そもそもそういう書き方はしないです。
944940:2005/06/22(水) 02:09:47
途中で書き込みしちまった(汗

void Test1(void){
printf("TEST1:%d", ++count);
if(hoge)
Test2();
}

void Test2(void){
printf("TEST2:%d", ++count);
if(hoge2)
Test1();
}

再帰的呼び出しが必ず
hoge == false || hoge1 == false
になるよう収束させれば
目指そうとしていることができるんじゃないの
945944:2005/06/22(水) 02:10:30
hoge2→hoge1
946デフォルトの名無しさん:2005/06/22(水) 02:16:56
>944
なぜループにしない?

947デフォルトの名無しさん:2005/06/22(水) 02:20:18
>>929
× test1(); /*戻る*/
○ return(); /*戻る*/
948944:2005/06/22(水) 02:21:01
>>946
いや敢えて939のルールにのっとって聞いただけ
実は933派だってのは内緒だ(w
949デフォルトの名無しさん:2005/06/22(水) 02:24:23
ステートマシンみたいなものを作ろうとしてるんだろうか。

state1()
state2()
 :
stateN()

みたいな関数があって、それぞれを遷移していくんだが、
今は直接的に
state1()の中でstate2()とかを呼んでしまっていて、結果的に
無限再帰になっていると。

こういう場合は、たとえばstate1()...stateN()の関数型を
一緒にして、直接それらの中で次状態の関数を呼ぶのではなく、
呼び出し側に次ステートを示すもの(関数ポインタなど)を返し、
ドライバループの中で次の状態に遷移するように書き直せばよい。
こうすると、

StateFunc nextstate = state1;
while (nextstate) nextstate();

のように書ける。
950デフォルトの名無しさん:2005/06/22(水) 02:24:33
(  ̄□ ̄)まぁー 大変ねぇ
951デフォルトの名無しさん:2005/06/22(水) 05:33:43
>>939
あのな、関数ってのは、通常は呼ばれたら必ずそこへ戻ってくるもんなんだ。
解りやすく言うと、
呼ぶときに、戻ってくるための情報を記憶してるわけよ。
呼びっぱなしで戻ってこないってことは、
戻るための情報がどんどんメモリに溜まっていって、
いずれはオーバーフローする。

関数の中で自分をさらに呼び出す(再帰)こと自体はOKだが、
関数内で再帰しない条件なんかをつけて、
最終的には戻さないとダメ。

>呼ばれるタイミングなども一定ではありません
関数のなかで関数よんだところで、一定にはならんよ。

>もっと大きな機能を受け持っているので・・・
こんな初歩的なところでつまずくようなヤツに、
そんな大きなプログラムを扱わせるのかw
952デフォルトの名無しさん:2005/06/22(水) 08:36:10
3文字の文字列keyからハッシュ関数で整数値に変換したいのですが、
printf文を追加してみると、tが妙な数字になってました。なぜですか。
int hash(char *key, int sz)
{
unsigned char *t = key;
int h;
for(h = 0; *t; t++)
{
printf("%d ", t);
h = ( 128 * h + *t ) % sz;
}
return h;
}
953デフォルトの名無しさん:2005/06/22(水) 08:42:51
>>952
何がしたい?
954デフォルトの名無しさん:2005/06/22(水) 08:44:54
煽りじゃなく比較的意味不明
955デフォルトの名無しさん:2005/06/22(水) 09:04:17
ぐはっ 意味不明・・・
例えばkey = "abc"のとき
for文の中でtをインクリメントしたら
t = aの整数値 → bの整数値→ cの整数値
になるんかと。
956デフォルトの名無しさん:2005/06/22(水) 09:04:46
>>952
printf("%p : %c %d 0x%X", t, *t, *t, *t );
957デフォルトの名無しさん:2005/06/22(水) 09:23:40
>>956
サンクス!
・・・じゃなくて問題はfor文の中で一文字ずつ
その整数値を加えて行くことなんです。スマソorz
958956:2005/06/22(水) 10:14:13
>>957
まず、それぞれの値を表示してみろ。
959デフォルトの名無しさん:2005/06/22(水) 10:20:13
>>956
0x%X→%#x
960デフォルトの名無しさん:2005/06/22(水) 10:23:12
>>956
わかっているが、「0x」の「x」まで大文字になってしまうのが、
個人的に嫌なだけなんだ…。 orz

# まあ、趣味の問題な訳だが。
961デフォルトの名無しさん:2005/06/22(水) 10:35:12
gcdのプログラムでifの部分は何をやってるんですか?
962デフォルトの名無しさん:2005/06/22(水) 10:39:35
>>961
条件判定
963デフォルトの名無しさん:2005/06/22(水) 10:55:25
>>962
ありがとうございます。
あと、この部分はなくても正しい答えがでるっぽいんですけど
なんでですか?
964デフォルトの名無しさん:2005/06/22(水) 11:02:12
デフォルトのWindows環境でCrypt関数ってついてないんですか?
965デフォルトの名無しさん:2005/06/22(水) 11:07:58
/usr/lib/crt1.o: In function `_start':
/usr/lib/crt1.o(.text+0x78): undefined reference to `main'
コンパイルしたら↑のが出たんですけど、どこがおかしいのですか?
966デフォルトの名無しさん:2005/06/22(水) 11:21:47
>>952
× printf("%d ", t);
○ printf("%d ", *t);
だと思う。
967デフォルトの名無しさん:2005/06/22(水) 12:03:17
>>963
しらねーよ。
そもそも、どこの部分を言っているのかもわからないし、
Cの質問でもないだろ。
968デフォルトの名無しさん:2005/06/22(水) 12:21:08
>>966
それを気付かせるための>>956だと思われ
969デフォルトの名無しさん:2005/06/22(水) 12:33:59
#include <stdio.h>
#define NMAX 200

int main (void)
{
int i,n;
int tmax=-1;
int tmin=-1;
double data[NMAX];

for( i = 0 ; i < NMAX ; i++ ){
printf( "%d 番目の点数は?\n", i );
scanf( "%lf", &data[i] );
if(data[i]==-1){
break;}
if(tmax < data[i] ){
tmax=data[i];}
if(tmin > data[i]){
tmin=data[i]; }
}
printf("最高点: %d\n",tmax );
printf("最低点: %d\n",tmin );

return(0);
}

上記のプログラムは、テストの点数の最高点、最低点を表示するプログラムです。
最低点がきちんと表示されないのですが、どこをどう修正すればいいか教えてください
970969:2005/06/22(水) 12:35:53
int n,i; ×
int i; ○
971デフォルトの名無しさん:2005/06/22(水) 12:37:24
初期値がすでにありえない最低点。
972デフォルトの名無しさん:2005/06/22(水) 12:41:35
main関数のreturn   は整数とある本にあります。別の本では正常に終了する場合はreturn 0
のように0と書いてあります。どちらが正しいのでしょうか。ここらへのことがよくわかりません。
973969:2005/06/22(水) 12:45:43
>>971
初期値をどう直せばいいですか?
974969:2005/06/22(水) 12:51:06
あ、初期値をdata[0]にすればできました。
ありがとうございました。
975デフォルトの名無しさん:2005/06/22(水) 12:51:12
>>969
入力は浮動小数点数なのに、
最大・最小は汎用整数とはこれ如何に?



とりあえず、「-3」とか入力してみろ。(w
976デフォルトの名無しさん:2005/06/22(水) 13:59:13
>>939
まっとうな末尾再帰をサポートしている言語を使うことをおすすめします
977デフォルトの名無しさん:2005/06/22(水) 15:11:29
#include <windows.h>
#include <stdio.h>

char *tp;

const char* CutItemName(const char* ItemName)
{
char Arg[64];
lstrcpy(Arg,ItemName);
tp = strtok(Arg,"#");
printf("tp = %s / pAddr = %d \n",tp,tp);
tp = strtok( NULL,"#" );
printf("tp = %s / pAddr = %d \n",tp,tp);
return tp;
}

void main() {

printf("CutItemName = %s / %s /\n pAddr = %d / %d \n",CutItemName("78#なは"),CutItemName("12#とぅえるぶ"),CutItemName("11#ワンワン"),CutItemName("37#サンナナ"));
printf("\t tpは = %s / Addr = %d \n",tp,tp);

}

#以降の文字を表示したいのですが、main内のprintfではアドレス値だけ表示されて、文字が表示されません
CutItemName()内では確認できるのですが、何がおかしいのでしょうか・・アドバイスお願いします
978デフォルトの名無しさん:2005/06/22(水) 15:22:19
>>977
関数を抜けた時点で
>char Arg[64];
こいつが破棄されるからじゃね?
979デフォルトの名無しさん:2005/06/22(水) 15:25:28
>>977
Arg[64]のメモリ領域は、ポインタ経由でもCutItemName()の外で参照してはいけない。
980977:2005/06/22(水) 15:26:03
わ、ホントだ・・
アドレスだけ返すから文字列はどうでもいいと踏んでいたのが間違いだったようです。

978サンありがとうございましたー
981デフォルトの名無しさん:2005/06/22(水) 15:33:05
あれなら
static char Arg[64];
にしたらええ
982デフォルトの名無しさん:2005/06/22(水) 15:36:22
(`・ω・´)ゞ すたてぃっくします!

978、979、981氏 ありがとう御座いましたー
983デフォルトの名無しさん:2005/06/22(水) 15:39:40
staticにしても、CutItemName()を呼ぶたびに中身を書き換えられちゃうから、ダメよ。
984972:2005/06/22(水) 16:15:51
質問に誰も答えてくれない。誰か答えて・・・。


985デフォルトの名無しさん:2005/06/22(水) 16:21:50
>>984
両方あってるのがわからないの?
とりあえず「1冊を」「理解するまで」
986デフォルトの名無しさん:2005/06/22(水) 16:26:00
>>984
main() の戻り値の型を int にして、
return 0; 等の様に int 型の値を返していれば間違いない。
とりあえず、そう書いておけ。
987デフォルトの名無しさん
だってパパあの子言っている事が変なんだもの
お話をきちんと聞いてくれるかすらあやしいわ