C言語なら俺に聞け(入門編)Part 59

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
C言語の*入門者*向け解説スレッドです。
★前スレ
C言語なら俺に聞け(入門編)Part 58
http://pc12.2ch.net/test/read.cgi/tech/1260888175/
★過去スレ
http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
★初心者、初級者の方は他の質問スレのほうが良いかもしれません。
例えば
【初心者歓迎】C/C++室 Ver.70【環境依存OK】
http://pc12.2ch.net/test/read.cgi/tech/1258873470/
とか
★教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 133代目
http://pc12.2ch.net/test/read.cgi/tech/1260532772/
★C++言語についてはなるべく聞かないでください。C++対応明記スレへどうぞ
★分からない事をなるべく詳しく書いて下さい。
★ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
2デフォルトの名無しさん:2010/01/09(土) 14:41:28
>>1
otu
3デフォルトの名無しさん:2010/01/09(土) 14:47:24
あおいjぐおあいうといつおいぐおいくおい
4デフォルトの名無しさん:2010/01/09(土) 14:49:32
うgはおいうごいうとう89
5デフォルトの名無しさん:2010/01/09(土) 14:50:19
>>3
何があった落ち着け
6デフォルトの名無しさん:2010/01/09(土) 14:51:00
gじょいあうごいうt98w48
7デフォルトの名無しさん:2010/01/09(土) 14:51:54
事件の匂いがします
8デフォルトの名無しさん:2010/01/09(土) 15:03:51
スレタイ、いいかげん、C言語じゃなくてCにしない?
めっちゃ素人くさいんだけど。
9デフォルトの名無しさん:2010/01/09(土) 15:04:45
>>8
玄人様のいうことはよく分からん
10デフォルトの名無しさん:2010/01/09(土) 15:07:29
C言語でいいよ
11デフォルトの名無しさん:2010/01/09(土) 15:08:07
いおあうごいあういちょあうといqgじゃきじょg
12デフォルトの名無しさん:2010/01/09(土) 15:12:03
プログラミング言語の後ろに言語をつけるのって、すごいダサい。
13デフォルトの名無しさん:2010/01/09(土) 15:12:48
>>12
だから、何?
14デフォルトの名無しさん:2010/01/09(土) 15:16:32
>>13
そのままの意味。
15デフォルトの名無しさん:2010/01/09(土) 15:21:27
頭の悪いレスはやめろよ
16デフォルトの名無しさん:2010/01/09(土) 15:22:12
このスレがどんだけダサいスレか気付いてないやつがいるようだな。名前の問題じゃねーよ
17デフォルトの名無しさん:2010/01/09(土) 15:22:19
CはC言語でないと検索のときに不便なんだよ
18デフォルトの名無しさん:2010/01/09(土) 15:28:44
>>15
>>13のレスって最近よく見るけど、本人は気のきいた返しとか思ってるのかね。
すごい頭悪そうだよな。
19デフォルトの名無しさん:2010/01/09(土) 15:31:32
「C」で思い付くものはいくらでもあるが「C言語」だと1つに特定される。
言葉の選び方で言えば後者のほうが圧倒的に合理的である。
20デフォルトの名無しさん:2010/01/09(土) 15:33:01
ジョイ具あおいうちおあうとい8349う789qちおgkじぇwq
21デフォルトの名無しさん:2010/01/09(土) 15:35:03
>>19
文脈でわかるだろ。
検索云々とかいう話もあるけど、そもそもCとかC言語だけで検索することが
ないから、どうでも話。
22デフォルトの名無しさん:2010/01/09(土) 15:35:31
ぎおぱういとぐあいつくぉ3う809qごいかg
23あぼーん:あぼーん
あぼーん
24デフォルトの名無しさん:2010/01/09(土) 15:44:01
>>18
>>12が最高に無意味なレスをしてるって気付かせようとしてるんだけど
馬鹿にはそれが分からないからね。馬鹿にはちゃんと馬鹿って言わないとさ
25デフォルトの名無しさん:2010/01/09(土) 15:44:58
C言語で良いだろ。
26あぼーん:あぼーん
あぼーん
27デフォルトの名無しさん:2010/01/09(土) 15:49:13
>>24
>>18は煽ってるだけだから、マジにレスしなくていいよ。
まあ、バカだからわかんないかもしれないけど。
28あぼーん:あぼーん
あぼーん
29デフォルトの名無しさん:2010/01/09(土) 15:55:11
>>24
「だからなに?」の一行レスとか、反論を思いつかないから何か
適当に言ってるだけのようにしか見えないよ。
本人の主観だと「無意味なレスをわからせる」効果があるってことになってるのか。
30あぼーん:あぼーん
あぼーん
31デフォルトの名無しさん:2010/01/09(土) 16:00:55
おい意味不明なレスしてるクズ
巻き添え規制くらうヤツのこと考えろよバカタレ
32あぼーん:あぼーん
あぼーん
33デフォルトの名無しさん:2010/01/09(土) 16:03:48
これどうやってNGすればいいの……
34あぼーん:あぼーん
あぼーん
35あぼーん:あぼーん
あぼーん
36デフォルトの名無しさん:2010/01/09(土) 16:46:32
突然すみません。
わからない問題があるんですが
この整数を入力し、入力したデータの平均値(小数点以下切り上げ)
に対して”※”と表示するプログラムを作成せよ
・”※”の表示はいくつでも表示できるようにする。
ただし、平均値が0の時はエラーの表示する。
・繰り返し処理としてfor,while,do whileのいずれかを用いる
以上です
37あぼーん:あぼーん
あぼーん
38あぼーん:あぼーん
あぼーん
39デフォルトの名無しさん:2010/01/09(土) 16:51:31
この整数値×
整数値○
40デフォルトの名無しさん:2010/01/09(土) 16:52:21
本当に”※”なのか?
*←これなんじゃないの?

for,while,do以外の処理のほうが珍しいな
41あぼーん:あぼーん
あぼーん
42デフォルトの名無しさん:2010/01/09(土) 16:55:23
>>31
Base64 かもしれない。
43あぼーん:あぼーん
あぼーん
44あぼーん:あぼーん
あぼーん
45デフォルトの名無しさん:2010/01/09(土) 17:02:26
uuencode/decode もあったなあ
46デフォルトの名無しさん:2010/01/09(土) 17:42:03
ごあjぎおあうちおあうお
47あぼーん:あぼーん
あぼーん
48デフォルトの名無しさん:2010/01/09(土) 19:20:01
質問なのですが、

const char *g_str1 = "global string";
main(){

char *str = "test string";
str = g_str1;
str[6] = '-';
puts(str);
}

staticをつけたのにコンパイル、動作問題なしです。
なぜでしょうか?
49デフォルトの名無しさん:2010/01/09(土) 19:21:55
>>48
warning レベルが低くて、運が良かったから
50あぼーん:あぼーん
あぼーん
51あぼーん:あぼーん
あぼーん
52あぼーん:あぼーん
あぼーん
53あぼーん:あぼーん
あぼーん
54デフォルトの名無しさん:2010/01/09(土) 20:12:58
これ何かのSOSだろ
55あぼーん:あぼーん
あぼーん
56あぼーん:あぼーん
あぼーん
57デフォルトの名無しさん:2010/01/09(土) 20:57:11
おいがいgjgぁじょい
58sage:2010/01/09(土) 22:23:13
暗号文か?
59デフォルトの名無しさん:2010/01/10(日) 05:24:12
>>48
static?
そのソース中にはないようですが???
60あぼーん:あぼーん
あぼーん
61あぼーん:あぼーん
あぼーん
62あぼーん:あぼーん
あぼーん
63デフォルトの名無しさん:2010/01/10(日) 05:54:30
>>59
constに訂正
64デフォルトの名無しさん:2010/01/10(日) 06:35:07
>>63
手元の環境(VC)に入力してみたが、コンパイルが通らなかった。
>>49のレスのとおりじゃないかな。
65デフォルトの名無しさん:2010/01/10(日) 06:36:08
貴方が求めるそこまで優秀なコンパイラが
無償に近い価格で頒布される
わきゃないという説明で許してくれ
66デフォルトの名無しさん:2010/01/10(日) 07:53:31
double d(1<=d<=0xffffffff)の整数部分だけ取り出したいのですが
この場合はfloorでなくてキャストでいいのでしょうか?
67あぼーん:あぼーん
あぼーん
68あぼーん:あぼーん
あぼーん
69あぼーん:あぼーん
あぼーん
70デフォルトの名無しさん:2010/01/10(日) 09:23:33
>>66
実際に試してみたら?
71デフォルトの名無しさん:2010/01/10(日) 09:31:54
>>66
限界値を入れて試せばいいじゃない。
72デフォルトの名無しさん:2010/01/10(日) 12:45:22
マイナスの時どうするかだと思う
73デフォルトの名無しさん:2010/01/10(日) 13:25:31
諦めて枕を濡らす
74デフォルトの名無しさん:2010/01/10(日) 13:35:27
1より大きいマイナスの数ってなんだ?
75デフォルトの名無しさん:2010/01/10(日) 13:46:16
>>74
なんで疑問形
7672:2010/01/10(日) 15:04:49
1<=dだったのか

じゃmodf
77デフォルトの名無しさん:2010/01/11(月) 11:18:21
WITH 12 プロセス WITH 7 金融制裁協議 WITH 7 金融 WITH 7 制裁 WITH 7 協議 WITH 6 金融制裁 WITH 2 米朝 WITH 2 米 WITH 2 朝 WITH 1 長い WITH 1 に WITH 1 が WITH 1 「 WITH 1 」

という「WITH スコア 語」からなる文字列があって、"WITH " や " " をstrstrで探しながらスコア、語の
組みを拾っていますが、'「'の後あたりで' 'を探すstrstrが失敗してエラーになります。
文字コードの問題かなとも思うのですが、良くわかりません。 対処法わかる方教えてください。
78あぼーん:あぼーん
あぼーん
79あぼーん:あぼーん
あぼーん
80あぼーん:あぼーん
あぼーん
81デフォルトの名無しさん:2010/01/11(月) 11:26:50
expected expression before 〜
gccのエラーなんですがどういう意味でしょうか?
ググっても具体的な内容が見つからないので・・・
82デフォルトの名無しさん:2010/01/11(月) 11:31:01
〜前後のソースさらせない?大抵 ; とか } がたりないんだと思うけど。
83あぼーん:あぼーん
あぼーん
84あぼーん:あぼーん
あぼーん
85デフォルトの名無しさん:2010/01/11(月) 11:36:29
翻訳してみるといいよ
8677:2010/01/11(月) 11:40:01
問題は別の所にあったようです。失礼しました。
87デフォルトの名無しさん:2010/01/11(月) 11:43:29
susieプラグインみたいなプラグインってどうやって読み込んで、利用するの?
88デフォルトの名無しさん:2010/01/11(月) 11:58:54
>>82
構文チェックをしましたが;や{}は問題なさそうです
〜には構造体の型名が入っていて、複数行でこのエラーが発生しているので構造体に何か問題があるかもしれないです
89デフォルトの名無しさん:2010/01/11(月) 12:04:37
エラーの起きた行と、エラーメッセージ全部を引用しろよ

なんでわざわざ人を試すようなことをするんだ?
90デフォルトの名無しさん:2010/01/11(月) 12:13:14
>>89
今書いてるものが一応C言語ではあるけどでも厳密にいえばC言語じゃないんであんまり詳しく尋ねるのもどうかと思って・・・
expected expression before 〜が何か特定のエラーを指すものだったら意味がわかればなんとかいけるかも、と・・・
91デフォルトの名無しさん:2010/01/11(月) 12:13:33
>>88
とりあえず最初のエラーメッセージうpしる
92デフォルトの名無しさん:2010/01/11(月) 12:20:21
> 構文チェックをしましたが;や{}は問題なさそうです
問題なければ、コンパイラはエラーを出さない。

> expected expression before 〜が何か特定のエラーを指すものだったら意味がわかればなんとかいけるかも、と・・・
エラーメッセージに書いてある通り。
〜の前に式が期待されているのに、式で無い。

コンパイルエラー解決できない奴って、ウルトラ恥ずかしい超初心者ってわかってる?
93デフォルトの名無しさん:2010/01/11(月) 12:29:21
47: error: expected expression before 'params_spe'
57: error: expected expression before 'params_spe'
58: error: expected expression before 'params_spe'
70: error: expected identifier or '(' before '.' token
76: error: expected expression before 'params_spe'
92: error: expected expression before 'params_spe'

全部構造体がらみのエラー・・・
94あぼーん:あぼーん
あぼーん
95デフォルトの名無しさん:2010/01/11(月) 12:32:55
単にparams_speが構造体と認識されてないだけじゃん。
96あぼーん:あぼーん
あぼーん
97デフォルトの名無しさん:2010/01/11(月) 12:34:59
エスパーすると typedef struct を調べればいいんジャマイカ?
98デフォルトの名無しさん:2010/01/11(月) 12:48:56
構造体の名前、間違えてるんじゃないの? param_spe とか
99デフォルトの名無しさん:2010/01/11(月) 13:04:26
>>37とか>>96とか、謎の言語にならない書き込みをしているヤツって
なんなの?タダの荒らしなの?
もしそうなら2ch運営から規制か損害賠償になったりしないの?
100デフォルトの名無しさん:2010/01/11(月) 13:12:17
規制には出来るよ
101デフォルトの名無しさん:2010/01/11(月) 13:36:38
ウィルスにひっかかったやつが重要な内容を暗号化して書きこんでるのかと思ったが・・・
102デフォルトの名無しさん:2010/01/11(月) 13:40:20
なわけねえだろ
103デフォルトの名無しさん:2010/01/11(月) 15:10:44
多分目隠し監禁された状態で必死に携帯からSOSを発してるんだよ
104デフォルトの名無しさん:2010/01/11(月) 15:37:34
gets() を叩かれたのが、そんなにプライドに触ったのか。
105デフォルトの名無しさん:2010/01/11(月) 15:44:01
(σ・∀・)σゲッツ!!
106デフォルトの名無しさん:2010/01/11(月) 15:45:58
ウィキペディアのfgetsのページで、

http://ja.wikipedia.org/wiki/Fgets#.E6.9C.80.E5.A4.A7.E6.96.87.E5.AD.97.E6.95.B0.E3.82.92.E8.B6.85.E3.81.88.E3.81.9F.E5.85.A5.E5.8A.9B.E3.81.AB.E5.AF.BE.E3.81.99.E3.82.8B.E5.AF.BE.E5.87.A6

/* 入力ストリームをクリアする */
while(getchar() != '\r');

とあるのですが、何故、'\r'と記述されているのでしょうか?
自分の環境では、'\n'にしないとうまく動作しなかったです。
(WinXP、Microsoft 32-bit C/C++ Optimizing Compiler Version 13.10.3077)
107デフォルトの名無しさん:2010/01/11(月) 16:05:04
>>106
ほんとだ。
なんでだろうね。
wikipって、記述した人に質問できるシステムないのかな?

あと、バッファクリアしないとgets()と同じ動作にならないって書いてあるけど
バッファクリアしても、おんなじ動作ではないわな。
108デフォルトの名無しさん:2010/01/11(月) 16:05:43
ウィキペディアはド素人でも書くことができるから気にしない方が良いよ。
109デフォルトの名無しさん:2010/01/11(月) 16:14:23
\rも改行じゃなかったっけ
110デフォルトの名無しさん:2010/01/11(月) 16:16:58
>>109
復帰だよ
111デフォルトの名無しさん:2010/01/11(月) 16:17:28
>>107
ノートにかいときました。
112デフォルトの名無しさん:2010/01/11(月) 16:19:56
ウィキペディアはわしが育てた
113デフォルトの名無しさん:2010/01/11(月) 16:44:14
error: expected declaration or statement at end of input
の意味がわからんのだが、誰か教えてくれ
114デフォルトの名無しさん:2010/01/11(月) 16:45:05
>>113
閉じ括弧が足りない
115デフォルトの名無しさん:2010/01/11(月) 16:46:13
114>>
さんくす
116デフォルトの名無しさん:2010/01/11(月) 16:55:58
error: ‘for’ loop initial declaration used outside C99 mode

ってエラーが出たんだが、
その行がload_set( file, &datafile );

なんだが?
117デフォルトの名無しさん:2010/01/11(月) 17:19:28
エスパーじゃねえんだから、ソースはれや
118デフォルトの名無しさん:2010/01/11(月) 17:20:08
まあだいたいわかるけど、うっかり答えると延々続きそうだしなw
119デフォルトの名無しさん:2010/01/11(月) 18:16:23
a=a+b
a+=a+b

これの違いがわかりません。誰かたすけてくだしあ
120デフォルトの名無しさん:2010/01/11(月) 18:19:09
>>119
計算後の a の値が違う
121デフォルトの名無しさん:2010/01/11(月) 18:23:26
どう違うのでぃすか!!
122デフォルトの名無しさん:2010/01/11(月) 18:38:09
a+=b → a=a+b
a+=a+b → a=a+a+b
123デフォルトの名無しさん:2010/01/11(月) 18:43:10
UTF-8で書かれたソースファイルをビルドするにはどうすれば良いのでしょうか
124デフォルトの名無しさん:2010/01/11(月) 18:57:23
1) UTF-8で書かれたソースファイルが通るコンパイラを使ってビルドする
2) コンパイラが受け付けるエンコーディングに変換してからビルドする
125デフォルトの名無しさん:2010/01/11(月) 18:57:30
utf8で書かれたソースを許容するコンパイラでコンパイルする。
126123:2010/01/11(月) 20:28:17
有り難う御座います
UTF-8に対応したフリーのコンパイラはありますか?
127デフォルトの名無しさん:2010/01/11(月) 22:02:11
VC++
128デフォルトの名無しさん:2010/01/11(月) 23:29:31
>87
拡張子 spi だけど単なる DLL だから LoadLibrary して GetProcAddress して使う。
129デフォルトの名無しさん:2010/01/11(月) 23:35:56
C++じゃなくてCのコンパイラってないよね
130デフォルトの名無しさん:2010/01/11(月) 23:37:21
>>129
gcc とかコンパイルオプションとか
131デフォルトの名無しさん:2010/01/12(火) 00:18:01
132デフォルトの名無しさん:2010/01/12(火) 07:52:04
'\0'と0は同じでしょうか?
同じなら、よくある

int str[] = "abc";
str[1] = '\0';

というのを

str[1] = 0;

としてもいいのでしょうか?
133デフォルトの名無しさん:2010/01/12(火) 07:58:51
>int str[] = "abc";
これコンパイル通らないだろ
134デフォルトの名無しさん:2010/01/12(火) 08:03:11
>>133
すみません、以下の間違いでした。

char str[] = "abc";
135デフォルトの名無しさん:2010/01/12(火) 08:07:19
値としては'\0'と0は同じ。
だからstr[1] = 0;ってしても問題はない。
ただ、'\0'が文字列の終端を意味することを考えたら、0にするのはお勧めできない。
136デフォルトの名無しさん:2010/01/12(火) 08:18:31
>>135
d
137デフォルトの名無しさん:2010/01/12(火) 11:27:48
はじめまして。
C言語でジャンケンの後出しプログラムを作成したいのですが、
どのような風にすれば作れるのでしょうか?
相手のプログラムは状態遷移を使ってくる強敵です。
よろしくお願いします。
ジャンケン回数は10000回です。
138デフォルトの名無しさん:2010/01/12(火) 11:42:56
>>137
後出しでいいのなら、相手が出した手を読み取って勝ちの手を出せばいいんじゃねーの?
139デフォルトの名無しさん:2010/01/12(火) 11:51:39
それを今調べているのですが、なかなか見つかりません。
どうすれば良いですか?
140デフォルトの名無しさん:2010/01/12(火) 12:37:09
http://oshiete1.goo.ne.jp/qa3287734.html
> (3)コンピュータ:3つの状態を乱数で決める
ここの computer に入れる値を
human の値に勝つものにして
出力時に sleep(1) で一秒遅く表示させりゃいいじゃん。
141デフォルトの名無しさん:2010/01/12(火) 12:44:01
10000回もするなら
usleep(50)くらいにしないと駄目だわ
142デフォルトの名無しさん:2010/01/12(火) 15:51:49
>>137
貴方が今つかっているじゃんけんの枠組みについて説明しなければ答えようがありません。
貴方の言う「じゃんけん」とは一体なんですか?
「相手のプログラム」とは一体なに?
じゃんけんの出す手を決めるアルゴリズムを競わせる枠組みのようなものがあるんじゃないですか?
143デフォルトの名無しさん:2010/01/12(火) 15:57:56
#include<stdio.h>
int main(void){
float a,b,wa,sa,seki,syou ;

printf("2つの数値の入力してくれださい。\n") ;
scanf("%f %f,&a,&b") ;
wa=a+b ;
sa=a-b ;
seki=a*b ;
syou=a/b ;
printf("2数の和は%f,差は%f,積は%f,商は%fです。\n",a,b,wa,sa,seki,syou) ;
return 0 ;
}




↑を入力して実行してみてコマンドプロントで数字を入力したら

問題が発生したため終了します。ご不便をおかけして申し訳ありません。
と出たのですが、どうしてでしょうか?
144デフォルトの名無しさん:2010/01/12(火) 16:00:47
>>143
scanfの引数がおかしい
145デフォルトの名無しさん:2010/01/12(火) 16:06:57
>>143
scanfの引数が変
ちゃんと読み直せよ

2.3 標準入力からのデータの読込み
http://www.math.meiji.ac.jp/~mk/labo/java/intro-java/node10.html
146デフォルトの名無しさん:2010/01/12(火) 16:12:56
>>143
おめでとう! Cプログラマなら誰もが一度は通るミスだw
147デフォルトの名無しさん:2010/01/12(火) 16:15:01
そうか?
Perlとかphpから来たならやりそうだが・・・
148デフォルトの名無しさん:2010/01/12(火) 16:16:22
scanfがうんこ過ぎるだけ。
149デフォルトの名無しさん:2010/01/12(火) 16:18:50
>>147
うはw
>>143を流し読みして、>>144-145を見ただけでレスしちまったw
int a;scanf("%d", a);のパターンかと思ったんだ。
150デフォルトの名無しさん:2010/01/12(火) 16:52:52
高度に抽象化すると143みたいな考え方になるんだろうか
151デフォルトの名無しさん:2010/01/12(火) 18:41:48
printfのフォーマットも負けず劣らず、うんこだぞ。
152デフォルトの名無しさん:2010/01/12(火) 18:49:10
>>144
>>145
ありがとう
153デフォルトの名無しさん:2010/01/12(火) 18:55:08
C言語です
2つ以上の文字列を一つにまとめるのってどうやるんですか?
例えば
char data[40],data1[20],data2[20];

data1="hato"
data2="poppo"
のときに
data="hato poppo"
ってしたいんですけど
154デフォルトの名無しさん:2010/01/12(火) 18:57:24
>>153
sprintf
155デフォルトの名無しさん:2010/01/12(火) 18:59:00
strcpyとstrcat組み合わせてもいいけどスペース入れたりするなら
sprintfでいいんじゃない?バッファの長さチェックとか適時やるとして、
sprintf(data, "%s %s", data1, data2);
とか
156デフォルトの名無しさん:2010/01/12(火) 19:00:10
>>154
>>155
ありがとん
ちょっと考えてみます
157デフォルトの名無しさん:2010/01/12(火) 19:04:46
解決しました!
ってか>>155のまんまでした
sprintfめっちゃ便利ですね
ありがとうございました〜
158デフォルトの名無しさん:2010/01/12(火) 19:06:58
ローカルスコープを使うためだけにcppとしてコンパイルしたら
それはC言語で作ったものと呼べるの?
159デフォルトの名無しさん:2010/01/12(火) 20:44:44
>>158
Cでもブロックの先頭で宣言できる
160デフォルトの名無しさん:2010/01/12(火) 21:56:09
VC++でもC99対応してないしなあ
161デフォルトの名無しさん:2010/01/12(火) 22:20:33
以下のif-elseif-else文を、switch文or条件分岐を使わない形に変更するには
どうすれば良いでしょうか

int x,y;
x = a-b;

if (x < 0x3){y = 1;}
else if (x < 0x7){y = 2;}
else if (x < 0xf){y = 3;}
else if (x < 0x1f){y = 4;}
else {y = 5;}

よろしくお願いします。


162デフォルトの名無しさん:2010/01/12(火) 22:27:08
y=5-1*!!(x&~0x1f)-1*!!(x&~0xf)-1*!!(x&~0x7)-1*!!(x&~0x3);
163デフォルトの名無しさん:2010/01/12(火) 22:30:20
y = 1 + (x >= 0x3) + (x>=0x7) + (x>=0xf) + (x>=0x1f);
164123:2010/01/12(火) 23:21:24
>>127
有り難う御座います
PCにVisual Studio 2008が入っています
Shift_JISでは問題なくビルド出来る文章が、UTF-8(BOM無し)だと以下のエラーが出ます
これは何か設定が悪いのでしょうか

警告   warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください。
エラー error C2001: 定数が 2 行目に続いています。
エラー fatal error C1057: マクロ展開中に予期せぬ EOF を検出しました。
165デフォルトの名無しさん:2010/01/13(水) 00:18:47
VCに限らず、Windows系ではUTF-8にBOMを付けるのが無難。
その中の警告から、ファイルがShift_JIS (CP932)として扱われていることが分かる。

VC自体は、将来的にBOMなしUTF-8に対応できるようにするという話もあるけど。
ttps://connect.microsoft.com/VisualStudioJapan/feedback/ViewFeedback.aspx?FeedbackID=478438
166デフォルトの名無しさん:2010/01/13(水) 00:19:36
メモ帳で作ったBOM付きにするとか。
メモ帳でShift JISに変換するとか。
167123:2010/01/13(水) 00:36:16
保存オプションでBOM無しを設定出来るので大丈夫だと思ったんですが、ビルドは現状無理なんですね
とりあえずBOM付きで管理することにします
皆様どうも有り難う御座いました
168デフォルトの名無しさん:2010/01/13(水) 00:36:55
>>161
テーブルを作っておいて
y = hoge_table[x];

gccだったら
y = 31 - __builtin_clz((x+1)|2&0x1f);
かなあ。

169デフォルトの名無しさん:2010/01/13(水) 00:59:23
でも x の値について何も書いてないから INT_MAX まで考えると
かなり大きいテーブルがいるね
170デフォルトの名無しさん:2010/01/13(水) 01:21:08
【IT】人気プログラミング言語ランキング…PHPがC++を抜く 1位はJava [10/01/12]
http://anchorage.2ch.net/test/read.cgi/bizplus/1263298235/
171デフォルトの名無しさん:2010/01/13(水) 02:26:25
>>162
>>163
>>168
ありがとうございます。
大変参考になりました。
172デフォルトの名無しさん:2010/01/13(水) 02:28:03
普通に161の書き方の方がいいと思うけどね
173デフォルトの名無しさん:2010/01/13(水) 02:28:50
161の { } って付ける?
174デフォルトの名無しさん:2010/01/13(水) 02:42:39
ここでアンケートされても
175デフォルトの名無しさん:2010/01/13(水) 02:45:54
スレタイ読めんのかカス!
176デフォルトの名無しさん:2010/01/13(水) 02:46:31
下記のスレを最初から読んで自分で決めたらいいよ

コーディングトラブルの約70%はif文などでの{}省略
http://pc12.2ch.net/test/read.cgi/tech/1173416521/
177デフォルトの名無しさん:2010/01/13(水) 03:00:30
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10357.txt
このプログラムでsrの近似値を求めたいのですが、値が4.00か0.00にしかならないので
平方根の部分の計算が怪しいと思い出力してみたら、乱数の値によっては「-1.#J」と
表示されるみたいです
これってなんですか?正しく動かすにはどうすればいいでしょうか
Visual Studio 2008で書いてます
178デフォルトの名無しさん:2010/01/13(水) 03:01:55
>>176
それって言語の問題じゃなく単純に不注意だよね
179デフォルトの名無しさん:2010/01/13(水) 03:03:30
>>177
計算途中にも型があるから
2 を 2.0 と書いたり N を (double)N と書いたりするといいよ
180デフォルトの名無しさん:2010/01/13(水) 03:05:54
>>178
不注意には違いないんだけど
後で式を追加したりするときにやっちゃう人がよくいるんだよ
インデントされてるからぱっと見ではわかりにくかったり
181デフォルトの名無しさん:2010/01/13(水) 03:07:16
そういう宗教問題は堂々巡りで決着つかないよ。
182デフォルトの名無しさん:2010/01/13(水) 03:08:10
else if (x < 0x7) y = 2;
こうでなく

else if (x < 0x7)
    y = 2;
こうする人がいるの?
183デフォルトの名無しさん:2010/01/13(水) 03:20:09
>>182
y = 2; が長くなって画面の横幅はみだしたらそうしてる
もう一括して{}付けるようにしようかなとも思ってる
184177:2010/01/13(水) 03:26:06
>>179
期待してた値が出ました
ありがとうございます!
185デフォルトの名無しさん:2010/01/13(水) 14:12:25
任意長の文字列が与えられて数字のゾロ目がどうかを判断する関数を教えてください。

int is_zorome (char * n);

is_zorome("334"); /* false */
is_zorome("aaaa"); /* false */
is_zorome("2222"); /* true*/
186デフォルトの名無しさん:2010/01/13(水) 14:16:19
int is_zorome(char *n) {
char *p = n + 1;
if(*n<'0' || '9' < *n) return 0;

while(*p) if(*p++!=*n) return 0;

return 1;
}
187デフォルトの名無しさん:2010/01/13(水) 14:32:16
>>186
ありがd
188デフォルトの名無しさん:2010/01/13(水) 15:10:08
http://codepad.org/x1wtrOuW
これってなぜエラーが出ちゃうんでしょうか
189デフォルトの名無しさん:2010/01/13(水) 15:13:12
scanf("%d",&p[i].math);
だろう
190デフォルトの名無しさん:2010/01/13(水) 15:15:09
>>189
ありがとうございます
質問を小出しにしてしまってすみませんが
scanf("%s",p[i].s);は&いらないのに
scanf("%d",&p[i].&math);はなぜ必要なのでしょうか
191デフォルトの名無しさん:2010/01/13(水) 15:26:06
構造体じゃないときと同じだよ
sはchar s[100]だからsへのアドレスは &s[0]であり、sと同じ
mathはintだからmathへのアドレスは&math
192デフォルトの名無しさん:2010/01/13(水) 15:43:32
>>191
thx
193デフォルトの名無しさん:2010/01/13(水) 16:01:18
文字列が浮動小数点の形式を取っているかを調べる関数とかありますでしょうか?
194デフォルトの名無しさん:2010/01/13(水) 16:24:37
>>193
sscanf()
195デフォルトの名無しさん:2010/01/13(水) 16:43:13
>>194
ありがとうございます。
厳密ではないけれど、変換しきれない文字列はわかりますね。
196デフォルトの名無しさん:2010/01/13(水) 20:16:25
郷に入れば郷に従えで
C++ なら STL のソースを読んだり
JS なら prototype.js のソースを読んだりすると学習しやすいのですが
C言語にはそういったものは Linux Kernel 以外にありませんか?
197デフォルトの名無しさん:2010/01/13(水) 20:33:06
多くの人の強烈な個性の苦肉の策の張り合わせと、
専ら政治力学が支配的な分業ソフトウェア開発で
書かれた巨大プログラムソースくらい学習に適
していないものはない。
Linux-Kernelも然り。
portotype.jsも然り。
STLも然り。
198デフォルトの名無しさん:2010/01/13(水) 20:57:29
>>197
いや私が読みたいのは
その「苦肉の策で練り上げられた強烈な個性があるもの」ですので
巨大かどうかは全くどうでもいいんです。
Matzの言う落下傘方式で興味のある要点から読んでいきますし。
199sage:2010/01/13(水) 21:27:31
あ、そ。
200デフォルトの名無しさん:2010/01/13(水) 23:52:20
録音するツールって作ってみたいのですが
どこから手をつければいいんでしょうか?

こんちわ世界から先が見えませんw
201デフォルトの名無しさん:2010/01/13(水) 23:59:04
>>200
勉強する方法を身につける
202デフォルトの名無しさん:2010/01/13(水) 23:59:41
Win32APIで用意されている構造体や関数を使います
203デフォルトの名無しさん:2010/01/14(木) 00:02:51
puts/getsに相当する音声関数を見つけます。
204デフォルトの名無しさん:2010/01/14(木) 00:08:45
ALSAでぐぐれ
205デフォルトの名無しさん:2010/01/14(木) 03:06:04
206デフォルトの名無しさん:2010/01/14(木) 05:46:13
#include <windows.h>
#include <mmsystem.h>
#pragma comment(lib,"winmm")

int main(argc,argv)int argc;char *argv[];{
static MCI_OPEN_PARMS BGM;
static MCI_PLAY_PARMS BGM2;
int HIT;
BGM.lpstrElementName="C:\\WINDOWS\\system32\\oobe\\images\\title.wma";
HIT=mciSendCommand(0,MCI_OPEN,MCI_OPEN_ELEMENT,(DWORD_PTR)&BGM),
mciSendCommand(BGM.wDeviceID,MCI_PLAY,MCI_NOTIFY,(DWORD_PTR)&BGM2);
getchar();
}
207デフォルトの名無しさん:2010/01/14(木) 13:03:08
typedef struct spethread_params_t {
  unsigned long long int count;
  char get[11];
} params;
この構造体のサイズを32バイトにしたいのだけれど
typedef struct spethread_params_t {
  unsigned long long int count;
  char get[11];
  char pad[13];
} params;
だと40バイトになってしまいます

どうしたらよいのでしょうか?
208207:2010/01/14(木) 13:05:18
すみません
自己解決しました
209デフォルトの名無しさん:2010/01/14(木) 16:50:30
>>208
解決方法を書けや
210デフォルトの名無しさん:2010/01/14(木) 16:54:06
コンパイルオプションとかalignとかあるよね
211デフォルトの名無しさん:2010/01/14(木) 22:19:11
ifとかで{}付けないことがあるようだけど
どこからどこまでが範囲なの?
212デフォルトの名無しさん:2010/01/14(木) 22:21:40
>>211
セミコロンまで
213デフォルトの名無しさん:2010/01/14(木) 22:23:34
ありがとう
214デフォルトの名無しさん:2010/01/14(木) 22:43:49
>>211
正確には次の文が終了するまでだお。
215デフォルトの名無しさん:2010/01/14(木) 23:38:23
曖昧になったな
216デフォルトの名無しさん:2010/01/14(木) 23:39:27
どこが?
217デフォルトの名無しさん:2010/01/14(木) 23:41:29
うん、まあ、ここらへん。
218デフォルトの名無しさん:2010/01/14(木) 23:42:36
理解できないなら出てくんなよバカが
219デフォルトの名無しさん:2010/01/14(木) 23:50:10
文の終了はセミコロンで示すんじゃないの
220デフォルトの名無しさん:2010/01/14(木) 23:53:22
大体そんな感じ
221デフォルトの名無しさん:2010/01/14(木) 23:54:49
逆じゃね
222デフォルトの名無しさん:2010/01/14(木) 23:55:34
int x; //宣言
x=10;//x=10が式、x=10;は文;
223214:2010/01/14(木) 23:59:58
>>215
>>219
とりあえずお前ら2者は
文を理解すべきだと思うんだお
できないならただのでしゃばりバカ
224デフォルトの名無しさん:2010/01/15(金) 00:05:19
質問してるのに出しゃばりバカとか言われた…なんだこのスレ
225デフォルトの名無しさん:2010/01/15(金) 00:06:26
教え方が下手な奴の典型。自分だけ分かればそれでいい、と勘違いしてるが
あまつさえ自分でもよく分かってないんだよ。許してやれ
226あぼーん:あぼーん
あぼーん
227デフォルトの名無しさん:2010/01/15(金) 00:08:37
仕様書読め、の一言で終わるような話はこうなっちゃうよね
228あぼーん:あぼーん
あぼーん
229あぼーん:あぼーん
あぼーん
230デフォルトの名無しさん:2010/01/15(金) 00:10:12
仕様書をいちいち読んでる奴が2chなんて見るかよ
231あぼーん:あぼーん
あぼーん
232あぼーん:あぼーん
あぼーん
233あぼーん:あぼーん
あぼーん
234デフォルトの名無しさん:2010/01/15(金) 00:18:28
>>233
いや、ちょっと違う。
酢は入れないし箸を使う。
235デフォルトの名無しさん:2010/01/15(金) 00:22:39
>>234
  __           i`:.          __   ウィエッホッホッホッホwwwwww
  (__.`ー-::...    ,rt': : :\      ,::-'",...)   ッホッホッホッホッホホーホwwww
  ,..::ア - ::::::)-:'':':'(|i(゚):(゚)テ):-:-:-::、イ:::  `┬-っ オホーホwww
 (,.::'",::' / ,....: : : : r'" ・・' く/i!: : : : :!、,:::::,<` `ニつ オーホホホホホーwwwww
  `-(_λ_/: : : : : ( トェェェイ )/: : : : : : : : : ;,.,`::`つ イェッホーwwwww
      `-;;;;;;;:/i\二二_/" : /\;,;,;,;,;/ `'"  ウッホホwwww
           \:.:.:.:/ `i , :く.          アオーwwwwwww
             `i: :i : : !": : : )         ウッヒャッホーオwwwwwww
            r: :i DK:!-┬"         ウッホッホッホッホwww
            r--`:、 /000          ウッホッホwww
            000O"             ウーホホホホホーwwwwww
236デフォルトの名無しさん:2010/01/15(金) 00:39:02
>>235
でしょ。
それでも合うと思うよ。
237デフォルトの名無しさん:2010/01/15(金) 00:39:44
if(a!=b)(typeof(a) c=a;a=b;b=c;});
238デフォルトの名無しさん:2010/01/15(金) 00:40:30
>>236
なるほど。ありがとうございました。
239デフォルトの名無しさん:2010/01/15(金) 01:48:26
int a[50];
int b;
b=a[-1];

こんなコードを書いても、コンパイラはエラーを出さなかったのですが
明確にエラーだと言えない理由があるのでしょうか?
例えば本当にこんな使い方をする場面があるとか・・・
240デフォルトの名無しさん:2010/01/15(金) 01:52:59
エラーじゃないからエラーは出さんよ
241デフォルトの名無しさん:2010/01/15(金) 02:11:52
「配列 添え字 マイナス」でググる
242デフォルトの名無しさん:2010/01/15(金) 02:12:32
int* a;
...
b=a[-1];

ポインタのなら実際に見たことがある
配列のはない
243デフォルトの名無しさん:2010/01/15(金) 11:15:45
>>239
Cには、書けるけどそのような書き方をしてはいけない、というものがなぜかたくさんあります
「C言語 未定義」でぐぐってみてください
244デフォルトの名無しさん:2010/01/15(金) 16:29:44
参考書を見て勉強してるのですが、?な所があるので教えていただきたいです
配列を使ったバブルソートで、小さい順に並び替えるのですが
int a[] = {70,51,30,80,50,56};
int p[];
int i,j,t,min,s,N=6;
for (i=0;i<N;i++){
min = a[p[j]]; ←この部分
s = i;
for (j=0;j<N-1;j++){if (a[p[j]] < min) min=a[p[j]]; s = j;}}
t=p[i]; p[i]=p[s]; p[s] = t;}
for (i=0;i<N;i++) printf("%d ",a[p[i]]);
初期化していない変数jを使用しているのと、minが何週しても動かずに終わるだけなんじゃね?と考えた次第で
a[p[i]]なのかと思いつつも、何分ド素人のため正否の判断が付かず
これで合ってるというのなら理解できるまで読み返してきます。。。
245デフォルトの名無しさん:2010/01/15(金) 16:46:21
iだな
pも初期化してないような気がするが・・・
あと、それはバブルソートではなくて、選択ソートではないでしょうか
246デフォルトの名無しさん:2010/01/15(金) 17:14:08
>>245
やはりiですか、ありがとうございます
バブルソートではなく直接選択法で行うって書いてありました。しかも書き込みミスで2行目はint p[6];ですorz
247デフォルトの名無しさん:2010/01/15(金) 17:24:27
>>246
int p[] = { 0, 1, 2, 3, 4, 5 }; とかじゃね?
248デフォルトの名無しさん:2010/01/15(金) 17:36:18
>>247
for (i=0;i<N;i++) {p[i]=i};
この行付け忘れてましたorz
なんかもうgdgdですいません吊ってきま。。。
249デフォルトの名無しさん:2010/01/15(金) 18:56:40
atexitてコンソール画面の×押した時は飛ばないの?
250デフォルトの名無しさん:2010/01/15(金) 19:29:43
飛ばない
atexitはプログラムが正常終了したときだけ
251デフォルトの名無しさん:2010/01/15(金) 20:14:05
int aa;
int bb;
volatile int cc;

a(){};
b(){a();};
c(){};

main(){
 b();
 aa = 3;
}

というソースを解析して
使っていないc, bbを削除してくれるツールないですか?
252デフォルトの名無しさん:2010/01/15(金) 20:28:03
lint
253デフォルトの名無しさん:2010/01/15(金) 20:47:24
グローバル変数は他のソースからexternで参照されているかもしれないから、
リンクする全ソースを見ないとわからないな
コンパイラによってはコンパイルオプション次第で
未使用変数をリンクしないようにしてくれるものもある
254デフォルトの名無しさん:2010/01/15(金) 21:38:32
>>251
ソースコード上から消してほしいってこと?
255デフォルトの名無しさん:2010/01/15(金) 22:57:33
>>254
そういうことです。リリースビルドで使っていない無駄なデータやコードを削って
バイナリのサイズを小さくできるツールです。
256デフォルトの名無しさん:2010/01/15(金) 23:00:50
それってC言語に関係あんの?コンパイラの話?エディタのマクロ?
257デフォルトの名無しさん:2010/01/15(金) 23:02:28
>>255
しこしこ手でやるのが一番じゃない。
258デフォルトの名無しさん:2010/01/16(土) 03:18:04
オプティマイザを完全に切らない限り大抵の場合自動で削られると思うが?
259デフォルトの名無しさん:2010/01/16(土) 03:30:46
>>258
本当に?
260デフォルトの名無しさん:2010/01/16(土) 09:10:01
英文が与えられて、単語の頻度をカウントするのはどうするのでしょうか?

char s[] = "This is a pen. That is a pencil. He is tall.";
261デフォルトの名無しさん:2010/01/16(土) 10:32:34
>>255
>>254はソースファイルのサイズを減らしたいのかどうかを聞いたのだけど・・・
コンパイラにもよるけど普通は最適化で自動削除されると思う。
ソースファイル上から削除するのはリファクタリングツールを使えばできるかも。
262デフォルトの名無しさん:2010/01/16(土) 11:02:57
>>260
単語の分割は strtok() あたりでいいと思う
単語のカウントは連想配列みたいなのを使えばいいけど
Cの標準には無いので、自分で作る必要がありそう。

C++のmapを使えばこんな感じ
http://codepad.org/xvM1MuBy
263デフォルトの名無しさん:2010/01/16(土) 11:50:49
>>260
空白の数を数えればいい。
264デフォルトの名無しさん:2010/01/16(土) 12:03:03
>>263
単語の数を数えるのならそれで良いけど
"頻度"だから
265263:2010/01/16(土) 12:59:50
英文が与えられて、文字の頻度をカウントするのはどうするのでしょうか?

char s[] = "This is a pen. That is a pencil. He is tall.";
266デフォルトの名無しさん:2010/01/16(土) 14:17:15
>>265
char s[] = "This is a pen. That is a pencil. He is tall.";
char* p = s;
int count[256];
memset(count, 0, sizeof(count));
while (*p != '\0')  count[*p]++;
267デフォルトの名無しさん:2010/01/16(土) 14:23:12
Cにはハッシュテーブルってなかったっけ?
268デフォルトの名無しさん:2010/01/16(土) 15:01:40
>>266
それって無限ループにはならないの?
269デフォルトの名無しさん:2010/01/16(土) 15:11:25
ポーペンでperl呼ぶのがベスト
270デフォルトの名無しさん:2010/01/16(土) 18:26:37
>>262
d
Cでは難しいんすね。
271デフォルトの名無しさん:2010/01/16(土) 20:56:47
falseってNULLみたいに必ず定義されているものじゃないの?
gccでもbccでもコンパイルの時未定義扱いなるんだが
272デフォルトの名無しさん:2010/01/16(土) 20:57:59
C言語にはtrueもfalseもない
273デフォルトの名無しさん:2010/01/16(土) 20:58:38
Cだろ?trueもfalseもねーよ。
274デフォルトの名無しさん:2010/01/16(土) 20:59:14
マクロで
275デフォルトの名無しさん:2010/01/17(日) 01:08:01
#include<stdio.h> int main(void){ int x; scanf("%d",&x); if(x%2==0){ printf("%d is an even number.\n",x); } else{ printf("%d is an odd number.\n",x); } return(0); }
これは何を判定してるんでしょうか??
276デフォルトの名無しさん:2010/01/17(日) 01:10:20
偶奇
277デフォルトの名無しさん:2010/01/17(日) 01:12:30
>>276
d
ありがとうございます!
278デフォルトの名無しさん:2010/01/17(日) 16:49:29
配列をカンマ区切りで出力するとき、以下のコードだと、

0, 1, 2, 3,

と、最後にカンマがあって醜いですよね。
これを、

0, 1, 2, 3

というふうに出力するスマートな方法ってないですかね?


#include <stdio.h>

int main() {
int i;
int n[] = {0, 1, 2, 3};

for(i=0; i < sizeof n / sizeof *n; i++)
printf("%d, ", n[i]);

return 0;
}
279デフォルトの名無しさん:2010/01/17(日) 16:53:06
#include <stdio.h>

int main() {
int i;
int n[] = {0, 1, 2, 3};

for(i=0; i < sizeof n / sizeof *n; i++)
if (i) putc(',');
printf("%d", n[i]);

return 0;
}
280デフォルトの名無しさん:2010/01/17(日) 16:53:13
カンマが後ではなく前に付いていると考えればいい。
281デフォルトの名無しさん:2010/01/17(日) 17:26:19
282デフォルトの名無しさん:2010/01/17(日) 17:40:40
以下のコードを実行すると、

ffffff82 ffffffa0

と表示されます。
何故、頭にffffffが付くのでしょうか?

82 a0

と出力する方法はありますでしょうか?

Windows XP
Borland C++ 5.5.1 for Win32
ソースはShift-JISで保存

void main() {
int i;
char *s = "あ";

for(i=0; i<2; i++)
printf("%x ", s[i]);
}
283デフォルトの名無しさん:2010/01/17(日) 17:43:43
>>282
unsigned char にすればおk
284デフォルトの名無しさん:2010/01/17(日) 17:46:01
>>278-281
まぁスマートな方法なんて無いわな。

for(i=0; i < sizeof n / sizeof *n; i++)
printf("%s%d",i?" ,":"", n[i]);

仕事で書くなら>>279的な書き方するけど、
残念ながらバグってる。
285デフォルトの名無しさん:2010/01/17(日) 17:47:42
>>282
符合拡張ってやつだ
マイナスの値をビット数増やしても、マイナスのままにしようとするから
286デフォルトの名無しさん:2010/01/17(日) 17:47:56
>>283
ありがとうございます。
うまくいきました。
287デフォルトの名無しさん:2010/01/17(日) 17:48:40
をっと、符号拡張ね
288デフォルトの名無しさん:2010/01/17(日) 17:51:13
>>285>>287
なるほど。
ありがとうございます。
289デフォルトの名無しさん:2010/01/17(日) 18:38:04
//bmi
#include<stdio.h>
int main(void){
double height,weight,BMI;
printf("身長(m)");
scanf("%f",&height);
printf("体重(kg)");
scanf("%f",&weight);
BMI=weight/height/height;
printf("BMIは%fです。\n",BMI);
if(BMI>=25){
printf("肥満です\n");
}
else if(BMI<18.5){
printf("低体重です\n");
}else{
printf("標準です\n");

}
return 0;
}




↑BMI数値を計算するプログラムを作っていたのですが
計算結果がうまくいきません
どこが間違ってるのでしょうか?
290デフォルトの名無しさん:2010/01/17(日) 18:39:55
>>289
printf("height=%f weight=%f\n", height, weight);
を追加してみる
291デフォルトの名無しさん:2010/01/17(日) 18:46:30
scanf("%lf"
292デフォルトの名無しさん:2010/01/17(日) 19:19:10
>>284
その3項演算子はダサい。3項演算子の魔術師と呼ばれた俺様が教授してやろう。
for(i=0; i < sizeof n / sizeof *n; i++)
printf(i ? ", %d" : "%d", n[i]);
293デフォルトの名無しさん:2010/01/17(日) 19:53:05
printfの魔術師ならこうだな。
printf( "%.*s%d", !!i, ",", n[i] );
294293:2010/01/17(日) 19:55:32
つかこれで良かったか
printf( ",%d"+!i, n[i] );
295デフォルトの名無しさん:2010/01/17(日) 19:56:02
printf("%s%d", ","+!i, n[i]);
296デフォルトの名無しさん:2010/01/17(日) 20:29:58
全然エレガントじゃないが、流れとしてはこうなんだよな
i = 0;
while (1) {
 printf("%d", n[i]);
 if (++i == sizeof(n)/sizeof(n[0]))
  break;
 printf(","); 
}

ということは、
こんな感じにも出来るか?
do {
 printf("%d", n[i]);
} while (++i == sizeof(...) && printf(","));
要素0をifで弾いたり、&&以下を評価しなきゃいけないのが美しくないが。
(後者は,演算子を使ってtrue相当にすれば条件分岐にはならないがもっと汚くなる)
297デフォルトの名無しさん:2010/01/17(日) 20:33:48
IOCCC目指すの?
298デフォルトの名無しさん:2010/01/17(日) 20:34:18
printf("%d", n[0]);
for(i=1; i < sizeof n / sizeof *n; i++) printf(",%d", n[i]);
299デフォルトの名無しさん:2010/01/18(月) 05:15:49
失礼します。

とある(任意の)通貨体系、例えば361、147、75、1円玉なんていう無茶な通貨だとして、
お釣りの値を入力したら最小の枚数で切り抜けるプログラムを考えます。

この場合例えばお釣りが150円だったら、147×1、1×3で計4枚でなく、75×2で計2枚となるのが正解です。

通貨体系もお釣りも任意に与えられるので、それぞれがどんな値であっても最小の枚数を出すプログラムなんですが、これを考えるとき、どんなアルゴリズムが考えられますか?

申し訳ないのですがお早めに答えて頂けると助かりますm(_ _)m
300デフォルトの名無しさん:2010/01/18(月) 05:26:03
C言語と関係ねえじゃん
301デフォルトの名無しさん:2010/01/18(月) 05:54:38
>>299

C/C++の宿題片付けます 133代目
http://pc12.2ch.net/test/read.cgi/tech/1260532772/606
302デフォルトの名無しさん:2010/01/18(月) 06:38:33
>>299
再帰使って総当りでいいだろ
303デフォルトの名無しさん:2010/01/18(月) 06:53:31
C言語はアルゴリズムを考えなければならないので関連はあると思ったんですが…
部類が違ったみたいですねすみません。

>>301
ありがとうございます。
ただ少しだけ欲しいものと違ったようです。ありがとうございました。
304デフォルトの名無しさん:2010/01/18(月) 06:55:44
305デフォルトの名無しさん:2010/01/18(月) 12:40:15
これからプロクラミングを学ぼうと思います。
まず最初の目的はwebブラウザを作成したいと思っています。
そこで質問なのですが、C言語ではwebブラウザを作成することはできますか?
またプログラム初学者が学びながらwebブラウザを作成するのに適した言語があれば教えてください。
306デフォルトの名無しさん:2010/01/18(月) 12:44:56
>>305
ブラウザをゼロから作るのは相当難しい
上級者でもかなり機能制限しない限り無理

単にIEコンポーネントを使うだけならC++でおk
307デフォルトの名無しさん:2010/01/18(月) 12:49:28
ひと昔前だったらDelphiだったけど今はC#一択
C/C++なんて論外
308デフォルトの名無しさん:2010/01/18(月) 12:50:33
適材適所
IEコンポーネントでブラウザ作るならC#最強伝説
309デフォルトの名無しさん:2010/01/18(月) 13:11:57
HTMLメッセージを直接表示する程度のものだったら
勉強にはなるよね。
310デフォルトの名無しさん:2010/01/18(月) 13:14:09
>>305
Java, C++&Qtとかなら、最初からHTMLを表示するためのコンポーネントがあったりするので便利。
311デフォルトの名無しさん:2010/01/18(月) 13:24:09
大量の人と金と時間を使っても未だに文句言われるwebブラウザを作ってる会社もあるしな
312デフォルトの名無しさん:2010/01/18(月) 17:47:28
for (;;) {
 c == '0' && break;
 putchar(c);
}

と書いたら error: expected expression before ‘break’ ってどういうこと?
他の言語でもイディオムとしてよく使われるよねこれ。

if (c == '0')
 break;

って書かないとダメなの?マンドクセ
313デフォルトの名無しさん:2010/01/18(月) 18:30:46
じゃあ他の言語でやればいいじゃない。
314312:2010/01/18(月) 18:34:04
>>313
ガキ?
315デフォルトの名無しさん:2010/01/18(月) 18:51:33
>>312
諦めてくれ。breakは式ではなく、独立した文として使うしかない決まりなんだ。
316312:2010/01/18(月) 18:53:43
>>315
わかった。
僕も男の子ですから、潔く諦めるよ。
317デフォルトの名無しさん:2010/01/18(月) 19:00:14
初心者がC++使うなんてないわ。それこそ上級者でもバグ量産なのに
318デフォルトの名無しさん:2010/01/18(月) 19:01:10
バグ量産言語だからな。
319デフォルトの名無しさん:2010/01/18(月) 19:37:52
assignment makes pointer from integer without a cast

というエラーの意味はなに??
320デフォルトの名無しさん:2010/01/18(月) 19:38:50
C言語のほうがC++よりバグ量産言語
321デフォルトの名無しさん:2010/01/18(月) 19:43:22
>>320
お前が何も知らないことは分かった
322デフォルトの名無しさん:2010/01/18(月) 19:49:03
>>319
そのまんまの意味だと思うが、何がわからない?
323デフォルトの名無しさん:2010/01/18(月) 19:49:47
>>319
キャストせずに整数からポインタへ代入している
それくらいの英語は読む努力しようよ
324デフォルトの名無しさん:2010/01/18(月) 19:53:25
C言語はそういうエラーでないだろ

int x=100;
int *p=x;

こういうのもできる。
C++だと319のエラーが出てくる。
325デフォルトの名無しさん:2010/01/18(月) 21:12:00
Cでもふつーウォーニングぐらい出るだろー。
326デフォルトの名無しさん:2010/01/18(月) 21:45:10
警告は「ふつー」出ないんだよ
327デフォルトの名無しさん:2010/01/18(月) 21:51:38
int*にintを代入はできない
アドレスを示す変数に○バイト整数の代入だからな
328デフォルトの名無しさん:2010/01/18(月) 22:01:42
#include <stdio.h>

// buffer overflowは無視している文字列置き換え関数
void
replace(char *buf, char *pre, char *aft)
{
  char *p;
  p = strstr(buf, pre);
  if (p){
    char *p_2 = p + strlen(pre);
    replace(p_2, pre, aft);
    memmove(p + strlen(aft), p_2, strlen(p_2)+1);
    memcpy(p, aft, strlen(aft));
  }
}

int
main(void)
{
  char buf[1024] = "C:\\programfile\\LOG";
  replace(buf, "LOG", "RESULT");
  printf("%s\n", buf);
  return 0;
}

というソースを以前見たんですがバッファオーバーフローはどうすれば避けられますか?
329デフォルトの名無しさん:2010/01/18(月) 22:20:41
>>328
自分でバッファオーバーフローが起こらないようにいつも注意しとけば
避けられます
330デフォルトの名無しさん:2010/01/18(月) 22:31:44
>>329
すいません、自己解決しました
331299:2010/01/18(月) 23:05:14
今さらですがすみません。別スレに移動させていただきました。
332デフォルトの名無しさん:2010/01/18(月) 23:06:43
了解です
333デフォルトの名無しさん:2010/01/18(月) 23:52:34
すみません

while((n < 1) || (n >= MAX))

この「||」というのはどういう条件の事なんでしょうか?

早急に返答をもらえると助かります(__)
334デフォルトの名無しさん:2010/01/18(月) 23:54:29
or
335デフォルトの名無しさん:2010/01/19(火) 00:02:06
>>334
ありがとうございます。
おかげで解決しました。
336デフォルトの名無しさん:2010/01/19(火) 01:54:25
棒人間が歩くプログラムをつくりたいのですが
頭と胴体を動かすのは簡単なのですが
足と手の動きをどうすればいいのかまったくわかりません;
なにかヒントか教えてくれませんか><?
337デフォルトの名無しさん:2010/01/19(火) 03:14:12
>>336
キャラクターの状態(向き、徒歩、ダッシュ、停止、生死)に応じた
肩、肘、手首、股関節、膝、足首
それぞれの座標をすべて配列に入れとけばいいんじゃないかな
肩位置固定、肘関節無し、右向き徒歩の手首の座標を考えてみると
,,◎  ◎   ◎    ◎   ◎   ◎    ◎   ◎
 |   \    ̄   \   |   /    ̄   /
このような動きになり規則性が見えてくるね
この場合は1サイクル8コマの繰り返しなので
要素8の配列を用意すればいい
2dなら必要な情報はX,Yの座標なので
CならPoint構造体でも作って
Point migitekubi[state][frame].x
とかでアクセスすればいんじゃないかな
338デフォルトの名無しさん:2010/01/19(火) 04:23:03
>>337
説明ありがとうございます
自分が未熟なためいまいちわからないです><
もう少し簡単なほうほうはないでしょうか?
lineで足を書いて、座標をずらしてやっているのですが
いまいち思っているような動きになりません・・・
もう少しヒントをいただけたらありがたいです
339デフォルトの名無しさん:2010/01/19(火) 04:52:10
実際にハリガネで作ってみろよ
340デフォルトの名無しさん:2010/01/19(火) 05:33:24
>>338
> もう少し簡単なほうほうはないでしょうか?
ない。
前もって画像を用意しちゃう方法があるけど
それは趣旨と異なるし、結局手法は同じなので難易度的には大差ないね。

> lineで足を書いて、座標をずらしてやっているのですが
> いまいち思っているような動きになりません・・・
それはインプットした数値に問題があるだけ。
コマ数増やしたり座標詰めるしかないよ。

軽く答えちゃっててなんだけど
言語差の問題ではなくアルゴリズムの問題なので
相応のスレで質問し直した方がいいと思うよ。
341デフォルトの名無しさん:2010/01/19(火) 05:36:15
>>336は面白いな、失業中でニートしているから今日作ってみるかw
342デフォルトの名無しさん:2010/01/19(火) 05:40:38
棒人間でパラパラマンガでも描いて見れば一発な気もすんだが。
343デフォルトの名無しさん:2010/01/19(火) 06:00:46
もっと深いところで悩んでるのかも
前もって用意して当てはめるならどーとでもないが
生年月日、血液型、食生活、私生活、スタミナ、季節、ボイド時間他もろもろ
腕の振りもその都度変わって来るわけだから
それら全てのパラメーターを受けた上で
その数式を模索してるのかもしれない
344デフォルトの名無しさん:2010/01/19(火) 09:39:07
シングルクオテーションはchar型だと思ってたら、以下のコードで4が返ってきました。
自分の環境だけでしょうか?(BCC 5.5)

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1019592375

#include <stdio.h>

void main() {
printf("%d", sizeof '\0'); /* => 4 */
}
345デフォルトの名無しさん:2010/01/19(火) 09:40:07
346デフォルトの名無しさん:2010/01/19(火) 09:45:45
>>344
intだから
347デフォルトの名無しさん:2010/01/19(火) 09:53:51
>>344
Cではint
(C++ではchar)
348デフォルトの名無しさん:2010/01/19(火) 10:07:18
>>346-347
thx

>>344のYahoo!知恵袋の回答には

NULL ← void* 型
0 ← int 型
'\0' ← char 型

と書いてありましたが、間違いなんですね。
349デフォルトの名無しさん:2010/01/19(火) 10:10:33
間違い
sizeof演算子がchar型に対してsizeof(int)を
返す処理系だから。
sizeof は処理系依存 環境依存。
350デフォルトの名無しさん:2010/01/19(火) 10:13:57
sizeofでchar型に対して1を返さない処理系ってなんだよw
351デフォルトの名無しさん:2010/01/19(火) 10:27:17
sizeof(char) は常に1、sizeof('c') は sizeof(int) に等しいはずで
そうでない非標準コンパイラなど…まあ、使わされてる人は可哀想ではある。
352デフォルトの名無しさん:2010/01/19(火) 10:28:26
349が何もわかってないのに出鱈目かいたアホってだけのことじゃね?
353デフォルトの名無しさん:2010/01/19(火) 10:44:42
これ↓と

char s[] = "abc";

これ↓の違いは何ですか?

char *s = "abc";
354デフォルトの名無しさん:2010/01/19(火) 10:47:33
>>353
配列とポインタの差
355デフォルトの名無しさん:2010/01/19(火) 10:51:14
>>354
どっちを使うかは好みの問題なのでしょうか?
356デフォルトの名無しさん:2010/01/19(火) 10:57:28
>>355
文字列の一部の書き換えを行うかどうか
書き換える→配列
書き換えない→ポインタ
357デフォルトの名無しさん:2010/01/19(火) 11:00:28
定数にはそもそも型など内
' 'は整数定数32
sizeof ' 'が何を返すかは処理系依存 0でも
文句言えない。
358デフォルトの名無しさん:2010/01/19(火) 11:05:50
>>356
なるほど、そういう使い分けをするんですね。
d
359デフォルトの名無しさん:2010/01/19(火) 11:14:26
>>357
バカは消えろよw
360デフォルトの名無しさん:2010/01/19(火) 11:14:37
>>357
規格書100回音読の刑
361デフォルトの名無しさん:2010/01/19(火) 11:16:20
>>353
char s[] = "abc";
s += 1; <= エラー

char *s = "abc";
s += 1; <= OK
362デフォルトの名無しさん:2010/01/19(火) 11:27:37
printf("%d¥n",sizeof 32L);
printf("%d¥n",sizeof 32LL);

どんな値になる?
363デフォルトの名無しさん:2010/01/19(火) 11:36:08
定数に型はないって言った直後に、整数定数ってどういうことだw
364353:2010/01/19(火) 15:11:52
#include <stdio.h>
#define ZERO 0
int main() {
printf("%u\n", sizeof '\0');
printf("%u\n", sizeof ZERO);
printf("%u\n", sizeof( (char)'\0'));
printf("%u\n", sizeof '0' );
}
%dなんて使うなよ

"abc"はどれが正しいの?
const char* const ccs = "abc";
const char* cs = "abc";
char* s = "abc";
で 
char a[] = "abc"
のaは上のどのポンタにアサインできるの?
365デフォルトの名無しさん:2010/01/19(火) 15:52:11
ローカルで宣言したchar a[] = "abc"は
アセンブリ出してみるとわかるが、

char a[4] = {'a', 'b', 'c', '\0'};
もしくは
char a[4];
strcpy(a, "abc");
相当のことが行われている
366デフォルトの名無しさん:2010/01/19(火) 17:07:45
図示するとこんな感じですか?


         全部コピー
       ┌──────┐
       ↓         .│
     char s[]        │
アドレス.┌─┐ アドレス┌┴┐
   200 │ a.│←─ 100.│ a.│
     ├─┤      ├─┤
   201 │ b.│←─ 101.│ b.│
     ├─┤      ├─┤
   202 │ c.│←─ 102,│ c.│
     ├─┤      ├─┤
   203 │ 0.│←─ 103.│ 0.│
     └─┘      └─┘


先頭アドレス値のみコピーされる

      char *s
アドレス.┌──┐ .アドレス┌─┐
   200 │ 100.│←─ 100│ a.│
     └──┘    .^^^├─┤
                101│ b.│
                 ├─┤
                102│ c.│
                 ├─┤
                103│ 0.│
                 └─┘
367デフォルトの名無しさん:2010/01/19(火) 17:21:21
そんな感じ
368デフォルトの名無しさん:2010/01/19(火) 17:24:25
>>367
d
369デフォルトの名無しさん:2010/01/19(火) 17:25:34
s[]="abc";の場合にはコピー元があるわけじゃないだろ
370デフォルトの名無しさん:2010/01/19(火) 17:37:30
実装依存でしょ
371デフォルトの名無しさん:2010/01/19(火) 18:41:09
>>369
魔法じゃないんだから、あるに決まってるだろ
372デフォルトの名無しさん:2010/01/19(火) 19:00:42
4バイト程度なら、即値命令で代入してるかも知れんし
そこらへんはコンパイラ次第。
373デフォルトの名無しさん:2010/01/19(火) 20:40:39
>>366
上と下では大違いだよね。
a[0]を書き換えられるか(上)、書き換え禁止か(下)。
374デフォルトの名無しさん:2010/01/19(火) 20:47:11
char *s は「禁止」してねえじゃんw
375デフォルトの名無しさん:2010/01/19(火) 21:18:43
鼻から鼻毛が出るんだっけ
376デフォルトの名無しさん:2010/01/19(火) 21:25:52
>>375
出るかもしれんな。未定義の動作だから。
377デフォルトの名無しさん:2010/01/19(火) 21:30:23
"abc"は定数だからメモリではプログラム領域に置かれる。関数の置き場所と一緒。
ならばコピー元は"ある"ことになる。
378デフォルトの名無しさん:2010/01/19(火) 21:50:26
おっといけね
俺未定義の動作してたわ
379デフォルトの名無しさん:2010/01/19(火) 22:08:48
本当に未定義なんですか?
char *s = "abc";
に対して、さらに
*(s + 0) = 'x';
*(s + 1) = 'y';
*(s + 2) = 'z';
とすればアウトなんですが。
未定義、未定義と知らない言葉をふりまわしているのでは?
380デフォルトの名無しさん:2010/01/19(火) 22:11:54
馬鹿か釣りか知らんがお前は消えろ
381デフォルトの名無しさん:2010/01/19(火) 22:21:25
>char *s = "abc";
C勉強し始めたばかりでよくわからないんですけど
これって先にメモリを確保しないといけないような気がするのですが、どうなんでしょうか
382デフォルトの名無しさん:2010/01/19(火) 22:24:00
確保しないといけないなんて事はありません
383デフォルトの名無しさん:2010/01/19(火) 22:24:21
>>380
アンカーつけろ馬鹿
384デフォルトの名無しさん:2010/01/19(火) 22:24:40
>>381
実行してみてください。
#include <stdio.h>

int main()
{
char *s = "abc";
printf("%s\n", s);
return 0;
}
385デフォルトの名無しさん:2010/01/19(火) 22:36:53
>>384
abc
386デフォルトの名無しさん:2010/01/19(火) 22:42:05
うるせえ馬鹿
387デフォルトの名無しさん:2010/01/19(火) 22:48:57
>>385
じゃあ、これも。
#include <stdio.h>

int main()
{
char *s = "abc";
printf("%s\n", s);
*s = 'x';
printf("%s\n", s);
return 0;
}
388デフォルトの名無しさん:2010/01/19(火) 23:26:51
abc
sex
389デフォルトの名無しさん:2010/01/19(火) 23:32:24
oops
390デフォルトの名無しさん:2010/01/20(水) 01:22:22
これでxだけにできた

#include <stdio.h>

int main()
{
char *s = "abc";
printf("%s\n", s);
s = "x";
printf("%s\n", s);
return 0;
}
391384,387:2010/01/20(水) 03:33:26
>>390
つまりそういうこと。
392デフォルトの名無しさん:2010/01/20(水) 07:06:10
つまりどういうこと
393デフォルトの名無しさん:2010/01/20(水) 07:58:19
*s = 'x';
┌─┐  ┌─┐
│ x.│←│ a.│
├─┤  ├─┤
│ b.│  │ b.│
├─┤  ├─┤
│ c.│  │ c.│
├─┤  ├─┤
│ 0.│  │ 0.│
└─┘  └─┘

s = "x";
┌─┐  ┌─┐
│ x.│←│ a.│
├─┤  ├─┤
│ 0.│←│ b.│
├─┤  ├─┤
│ c.│  │ c.│
├─┤  ├─┤
│ 0.│  │ 0.│
└─┘  └─┘
394393:2010/01/20(水) 08:01:15
スマソ

s="x"は別アドレスだから間違ってるね orz
395デフォルトの名無しさん:2010/01/20(水) 09:08:08
char *s = "abc";
*s = 'x';

が許されない実装って具体的には何なんですか?
396デフォルトの名無しさん:2010/01/20(水) 09:37:45
>>395
#include <stdio.h>

int main()
{
char s[] = "abc";
printf("%s\n", s);
s = "x";
printf("%s\n", s);
return 0;
}
397デフォルトの名無しさん:2010/01/20(水) 10:28:00
>>381
リテラルはプログラム開始時に読み取り専用メモリに配置されるので動的なメモリ確保は必要ありません。
int i = 10 + 20;
「10」も「20」もメモリ確保してませんよね?
これと同じことです。
それからリテラルの値を変更したときの動作は未定義ですが、読み取り専用メモリなのでアクセス違反を起こすと思います。
398デフォルトの名無しさん:2010/01/20(水) 10:53:13
> リテラルはプログラム開始時に読み取り専用メモリに配置される
嘘です。信用してはいけません。
399デフォルトの名無しさん:2010/01/20(水) 11:00:51
int *x=100;
これはなぜ通らないんですか?
400デフォルトの名無しさん:2010/01/20(水) 11:12:37
>>398
では正しい解説をどうぞ
401デフォルトの名無しさん:2010/01/20(水) 11:16:50
K&Rが買ってきたのですが難しくて読めません。
K&Rを売って他の本を買おうと思うのですがお勧めはありますか?
402デフォルトの名無しさん:2010/01/20(水) 11:17:34
>>398
否定するなら詳細を頼む。
できればそれが確認できるURLも。

>>399
型が異なるので代入できません。
char *s = "abc";
これがエラーにならないのは暗黙的にリテラル文字列の先頭アドレスが代入されるからです。
詳しくは↓を見て下さい。
http://www7b.biglobe.ne.jp/robe/cpphtml/html01/cpp01077.html
403デフォルトの名無しさん:2010/01/20(水) 11:33:05
int *x=(const int*)&100;
と出来ない理由は?
404デフォルトの名無しさん:2010/01/20(水) 11:43:14
>>401
易しい入門書なら↓がお勧め。
ただし、内容は非常に薄いので人によってはかなり微妙かも。
http://www3.ank.co.jp/books/2002/c_ehon.html
http://www.seshop.com/Detail.asp?pid=11007

C言語の解説サイトはいっぱいあるのでまずはこっちで勉強してみては?
http://www9.plala.or.jp/sgwr-t/
http://www.geocities.jp/ky_webid/ProgrammingPlacePlus/c/index.html
http://homepage3.nifty.com/mmgames/c_guide/
http://homepage2.nifty.com/c_lang/
http://www5c.biglobe.ne.jp/~ecb/c/c00.html
405401:2010/01/20(水) 11:55:26
>>404
ありがとうございます。
リンクしてくださった解説サイトを参考に勉強することにします。
入門書のほうはCの絵本がよさそうですね。
406:2010/01/20(水) 13:46:05
はじめまして今年の4月から情報系の大学に行くので大学に入る前に独自でC言語を勉強しようと思って最低限はいろいろなサイトで勉強しました。
そこでモンテカルロ法で円周率を求めるプログラムを作ろうと思ってプログラムを書いた時点で選択した乱数の数で円周率を出すことは出来たのですが
これを相手方のユーザーもしくはコンソール上にうってもらった数値から円周率を出すように変更したいのですが以下のプログラムのXXXを
相手方のユーザーもしくはコンソール上にうってもらった数値をいれるように変更したいのですがどのように変更すればいいでしょうか?

a_max…乱数の発生回数
n…円の中に入った乱数の数
pa…円周率
プログラムは↓
407:2010/01/20(水) 13:47:48
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
double a,a_max,n;
double x,y,pa;

n=0.0;
a_max=XXXXX.0; // 乱数の発生回数

for(a=0;a<=a_max;a++) {
/*0〜1の乱数を生成*/
x=rand()/(RAND_MAX+1.0);
y=rand()/(RAND_MAX+1.0);

/*0<=x,y<=1の範囲にある中心原点半径1の
円の中に乱数による点が入ったらカウントする*/
if((x*x+y*y)<1.0) {
n+=1.0;
}
}

pa=n/a_max*4.0; //半径1の円の面積すなわち円周率

printf("%f\n",pa);

return 0;
}
408デフォルトの名無しさん:2010/01/20(水) 13:54:46
なんで高校生がモンテカルロ法なんて言葉平気で使うんだ?
409デフォルトの名無しさん:2010/01/20(水) 14:15:16
>>406
scanf("%f", &a_max); // 乱数の発生回数を入力させる
410デフォルトの名無しさん:2010/01/20(水) 14:19:38
>>408
プログラミングやってたらリア中でも知ってておかしくない
411デフォルトの名無しさん:2010/01/20(水) 14:47:54
scanf では double は %lf
412409:2010/01/20(水) 14:58:59
ゴメン、うっかりした。
scanf("%lf", &a_max);
413デフォルトの名無しさん:2010/01/20(水) 15:07:12
知っていることと正しく使えることとは違うだろ
414デフォルトの名無しさん:2010/01/20(水) 15:08:33
変な絡み方w
415デフォルトの名無しさん:2010/01/20(水) 15:10:41
乱×法
416デフォルトの名無しさん:2010/01/20(水) 17:56:25
>>402
>否定するなら詳細を頼む。
未定義だつってんだろが阿呆。

因みに、Microsoft は VC++ 6.0 までは .data セグメント、
それ以降は .rdata セグメントに置かれる。
で、多くのコンパイラではオプションで指定できる。
417デフォルトの名無しさん:2010/01/20(水) 18:22:46
なんで
char *a="hogehoge";
はaを文字列定数へのポインタとして解釈してくれるのに
int *x=12345;
は整数定数12345へのポインタとして解釈してくれないの?
趣味の問題?
418デフォルトの名無しさん:2010/01/20(水) 18:25:03
xに12345が入ってるなら正しいのでは?
419デフォルトの名無しさん:2010/01/20(水) 18:26:58
比較する相手がおかしい
int *x=12345;
と対応するのは
char *a='A';
じゃないのか
"hogehoge"に対応する整数配列定数のようなものはC99にしかない
420デフォルトの名無しさん:2010/01/20(水) 18:29:48
int *x=(int*)12345;
ね。ただし
int *x= (const int*)&12345;
は通らないね。
同様に
char *s=(const char*)&'A';
もNG.
リテラルだけは特別で暗黙的に
char *s=(const char*)&("const char"[0]);
と解釈される。これは慣習であるとしかいいようが
ない。因習というほどのものでもないとオモ
421デフォルトの名無しさん:2010/01/20(水) 18:46:04
C99を導入して

char *a = (char[]){ 'h', 'o', 'g', 'e', 'h', 'o', 'g', 'e', '\0' };
int *x = (int[]){ 12345 };

と書けばいいYO!
"hogehoge" は (char[]){ 'h', 'o', 'g', 'e', 'h', 'o', 'g', 'e', '\0' } の略記法だと思えばいいんダ!
422デフォルトの名無しさん:2010/01/20(水) 18:50:26
文字列リテラルの特別扱いは、文字列型がないcにおける僅かばかりの文字列サポート。


>>420
リテラルとは、ソース上の定数のこと。
int *x=(int*)12345;の「12345」やchar *s=(const char*)&'A';の「'A'」もリテラル。
423デフォルトの名無しさん:2010/01/20(水) 18:50:47
文字列リテラルは定数ではない
文字列リテラルは静的記憶期間の配列として保持される
424デフォルトの名無しさん:2010/01/20(水) 18:56:43
main() {
extrn putchar, n, v;
auto i, c, col, a;

i = col = 0;
while(i<n)
v[i++] = 1;
while(col<2*n) {
a = n+1 ;
c = i = 0;
while (i<n) {
c =+ v[i] *10;
v[i++] = c%a;
c =/ a--;
}

putchar(c+'0');
if(!(++col%5))
putchar(col%50?' ': '*n');
}
putchar('*n*n');
}

v[2000];
n 2000;

解説をお願いします
425デフォルトの名無しさん:2010/01/20(水) 19:34:38
>>423
    char arr[] = "abc";

    mov dword ptr arr, 00636261H
とコンパイルされたとしても
規格上何の問題ないわけだが。
426デフォルトの名無しさん:2010/01/20(水) 19:39:24

c=arr[2]
mov ebx,00636261h
mov al, byte ptr [ebx+2]
とやったところでセグメンテーションエラーとw
427デフォルトの名無しさん:2010/01/20(水) 20:19:09
>>425
char配列初期化のための簡易記法である""形式の書き方も
文字列リテラルって言うんだっけ?

少なくとも、
例えばprintfに渡す時に直接書く場合のフォーマット文字列なんかは
文字列リテラルと言い切れると思うけど。
(もちろんprintfにはリテラル以外も渡せる)
428デフォルトの名無しさん:2010/01/20(水) 20:19:48
>>395
MS-DOS はOKだった。
cygwin-gcc ではだめだった。
429デフォルトの名無しさん:2010/01/20(水) 20:21:47
で、普通に文字列リテラル "abc" を考えると
どこかに4byteの領域が確保されていると言い切れるはず。

だけど
static char x[3] = "abc";
の場合は、3byte分しか確保されていないわけだ。
(staticだから、auto変数と違ってコピーは起こらない)
430デフォルトの名無しさん:2010/01/20(水) 20:23:59
>>408
>>406 にとっては最高の賛辞
431デフォルトの名無しさん:2010/01/20(水) 20:25:23
>>429
static をもちだしてくるとは、今の文脈ではちょっと微妙。
432デフォルトの名無しさん:2010/01/20(水) 20:26:27
>>405
K&R は売っぱらわないで積読することをおすすめします。
433デフォルトの名無しさん:2010/01/20(水) 20:27:43
このスレ95%くらいがごみレスで構成されているよね
434デフォルトの名無しさん:2010/01/20(水) 20:28:13
Cの絵本の到達点低すぎだぞ
435デフォルトの名無しさん:2010/01/20(水) 20:31:50
>>428
MSCとBCCはOKだった(MS-DOSってこれのことかな?)。
gcc系はダメなんか。
436デフォルトの名無しさん:2010/01/20(水) 20:41:31
>>431
staticだと文字列リテラルとは呼ばないけど、autoだと文字列リテラルと呼ぶ、って?
437デフォルトの名無しさん:2010/01/20(水) 20:46:31
ていうか、配列の初期化に使うものであっても
""で囲まれた文字は「文字列リテラル」と呼ぶのか。
だとすると、「必ず確保される云々」は厳密には正確じゃないのかもね。


ちなみに、sizeof等に使った「実際にはどこからも指されてない文字列リテラル」の領域を
確保してしまうコンパイラもある。
規格でどうなっているかは知らない。
例えば memcpy(dst, src, sizeof("abcde"));
なんていうコードがあると、使われていない"abcde\0"の領域が用意されたり。
438デフォルトの名無しさん:2010/01/20(水) 20:56:02
>>402
処理系依存。全てのメモリが書き込み可能な環境など腐るほどある。
例: DOS
439デフォルトの名無しさん:2010/01/20(水) 21:08:30
>>426
お前の脳内コンパイラは酷いバグを抱えてるな。

>>427
>文字列リテラルって言うんだっけ?
言うけど?
440デフォルトの名無しさん:2010/01/20(水) 21:17:41
441デフォルトの名無しさん:2010/01/20(水) 21:44:17
>>420
> char *s=(const char*)&("const char"[0]);

不要な括弧に、型が変化しないキャスト・・・死ぬの?
442デフォルトの名無しさん:2010/01/20(水) 21:54:50
型は変化してるぞ
C++に毒されすぎ
443デフォルトの名無しさん:2010/01/20(水) 22:00:17
演算子の優先順位など変化する可能性があるんで
括弧を付けないのは.....  死ぬの?
444デフォルトの名無しさん:2010/01/20(水) 22:10:15
>>442
文字列リテラルの型ってなんだっけ?
445デフォルトの名無しさん:2010/01/20(水) 22:10:45
括弧がどうしてもカッコワルクて性に合わんと思うのなら
マクロでも使え
446デフォルトの名無しさん:2010/01/20(水) 22:18:49
>>443
ねーよw
447デフォルトの名無しさん:2010/01/20(水) 22:21:42
C++の次の規格では演算子の優先順位の変更が可能になるかもな
448デフォルトの名無しさん:2010/01/20(水) 22:49:55
これだからC++厨は
449デフォルトの名無しさん:2010/01/20(水) 23:05:53
>>448
おい、俺もC++厨だけど、十把一絡げに否定するなよ。

450デフォルトの名無しさん:2010/01/20(水) 23:12:39
>>449
C言語とC++は「別の言語」です。
スレタイ読んだらさっさと巣にお戻りください。
451デフォルトの名無しさん:2010/01/20(水) 23:32:14
括弧省略はプログラマの職業上の知恵という奴ではなく、
既に犯罪の一種と認定されてるし...
452デフォルトの名無しさん:2010/01/20(水) 23:33:49
よくあるイディオム以外は括弧つけて欲しいな
453デフォルトの名無しさん:2010/01/20(水) 23:35:29
>>450
知ってるよ。
だからといって、・・・まあめんどくせえからいっか。
454デフォルトの名無しさん:2010/01/20(水) 23:40:58
多くの引数値からあるフォーマットのファイルを出力するプログラムを組んでいるのですが、
入力値が8個から10個ぐらいになります。
main 関数の argv で全部渡すようなコマンドを作ったのですが、多くの引数を渡すもっとスマートな方法
ないでしょうか?
455デフォルトの名無しさん:2010/01/20(水) 23:45:27
>>454
URLエンコードして渡す
456デフォルトの名無しさん:2010/01/21(木) 00:02:58
ファイルの入出力を習ったのですが出力に困っています

例えば
1 1.000000 1.000000 1.000000
2 1.000000 1.000000 1.000000
という内容のtxtファイルがあり、
それぞれの数字を変数に入れて出力したいのですが、

while(fscanf(fpi,"%d %lf %lf %lf", &i, heikin2, saikou2, saitei2) != EOF){
printf("%d %f %f %f\n", i, a, b, c);
}
とすると

1 0.000000 0.000000 1.#QNAN0
2 0.000000 0.000000 1.#QNAN0
と出ます、どうしてでしょうか?
a,b,cは配列の変数です
457デフォルトの名無しさん:2010/01/21(木) 00:04:17
while(fscanf(fpi,"%d %lf %lf %lf", &i, a, b, c) != EOF){
の書き間違いです
458sage:2010/01/21(木) 00:09:25
&
459デフォルトの名無しさん:2010/01/21(木) 00:11:43
>>456
http://codepad.org/
にソース晒したほうが早いと思うけど
460デフォルトの名無しさん:2010/01/21(木) 00:11:53
&入れてもできないんですよ

ってか教科書も&無いんですよね
それも分かりません
461デフォルトの名無しさん:2010/01/21(木) 00:13:48
>>454
環境変数
コマンドラインの欠点は、引数順序がデリケート
hogehoge=parameter
とか構文っぽいパラメータを渡す方法もあるが
コーディングは面倒な割に無益で疲労する。
環境変数ならまぁ一種のperlの連想配列みたいに
扱えるんで引数が多い場合は格段にラク。
シェルスクリプトとか組みあせてやってみそ
462デフォルトの名無しさん:2010/01/21(木) 00:59:17
>>460
a b cは配列ならa[0]のようにオフセットを指定しないと。
さらにfscanf()に渡すなら&が必要。つまり&a[0]のようにする。
463デフォルトの名無しさん:2010/01/21(木) 01:00:32
>>462
ありがとうございます、できました

教科書は誤植ですかね
464デフォルトの名無しさん:2010/01/21(木) 02:30:58
本来分数で計算するもの(シンプレックス法)を無理やりfloat型で計算しているのですが
出力で-0.0000と出るのですがこれはどういった意味でしょうか?
465デフォルトの名無しさん:2010/01/21(木) 02:39:51
計算機が出す数字は信用出来ない という意味
それは半分本当として、数字を奇麗にそろえて
出力する場合絶対値が小さい負の数、例えば-0.00000000000001
とかは前半の部分しか出さないってことはするだろ?
466デフォルトの名無しさん:2010/01/21(木) 03:31:43
ありがとうございます
問題がわかりました
467デフォルトの名無しさん:2010/01/21(木) 03:41:49
シンプレックス法の場合最初はfloatで、最適値に近い
制約条件が絞られてからは有理数でやらなければならない
場合もあるかも知れないがまぁ基本的にはfloatじゃね?
468デフォルトの名無しさん:2010/01/21(木) 04:04:49
for文内でstringの配列作るじゃん?
そのstringからfloatの値を取るじゃん?
floatの値が小さい順から並び変えるじゃん?
そのfloatに対応したstringの変数を順に選択していくのってどうするんじゃん?
469デフォルトの名無しさん:2010/01/21(木) 04:22:01
じゃんじゃん構造体作ると破滅するじゃん
470デフォルトの名無しさん:2010/01/21(木) 04:39:09
C言語で構造体を返り値として返す関数を作っているのですが、
その関数内で何か処理を失敗したときは、NULLを返したいと思っています。
しかし、return NULL;とすると、関数の定義と違う型の返り値だと怒られてしまいます。
どうすればいいのでしょうか?イメージとしては下のような感じのものを作っています。

typedef struct mypoint{
int x, y;
} POINT;

POINT getPoint(int i, int j)
{
  POINT p;

  if(i<0 || j<0) return NULL;
  else
  {
    p.x = i;
    p.j = j;
  }
  return p;
}

if( pt = getPoint(i, j) ){
  printf("ポイントは〜〜\n");
}else{
  printf("不正値\n");
}

ほんとはポイントとかじゃないですけど、やりたい事はこんな感じです。
471デフォルトの名無しさん:2010/01/21(木) 04:44:02
>>468
stringが使えるならvector使っちゃえばいいじゃん
472デフォルトの名無しさん:2010/01/21(木) 05:02:43
>>470
>構造体を返り値として返す
値返しなんだから
>return NULL;とすると
ポインタで返そうとするとエラーなのは当然であって、
ここは
1. ポインタで返す。  ← 関数内でmallocする。呼び出し元がfreeし忘れると悲惨。
2. 呼び出し元で戻り先の構造体を用意し、そのポインタを引数で渡す。
3. 「内容が正しいかどうか」を示すフラグを構造体内に用意する。
のどれか。
473デフォルトの名無しさん:2010/01/21(木) 06:55:22
>>472
ありがとうございます。2の方法で無事解決しました。

あと、スレッド局所変数というか、修飾子の__delspec(thread)のlinuxバージョンってないでしょうか?
474デフォルトの名無しさん:2010/01/21(木) 07:01:18
__threadあたりが臭いんですけど、コンパイルが通らないです・・・
475デフォルトの名無しさん:2010/01/21(木) 07:40:19
エラーメッセージによる。これじょうしキ
476デフォルトの名無しさん:2010/01/21(木) 07:51:45
宣言は
__thread static char *buf;
エラーメッセージは
'__thread' before 'static'
です。

あともう一つ質問があるのですが・・・。
linuxでpthread_createで作ったスレッドを呼び出した親から殺したいんです。
仕様上、作ったスレッドで長い時間Sleepを使ってるのですが、それでちょっと色々不便してまして。。
親から自由なタイミングで子スレッドを殺すにはどうすればいいのでしょうか?
子スレッドの方ではmallocとか自分でメモリ確保してないのでいつ殺しても問題ない状態です。
477401:2010/01/21(木) 07:59:03
物騒な流れになったきたな
478デフォルトの名無しさん:2010/01/21(木) 08:03:58
すみません、pthread_cancelというのを見つけたのでこっちは解決しました。
30分くらい探してたのに、質問した瞬間見つかってしまった・・・。

__threadはまだよく分からないので、どなたかわかる方お願いしますm(_ _)m
479デフォルトの名無しさん:2010/01/21(木) 08:09:54
環境書くのを忘れてました、たびたび申し訳ないです。
MaxOSX 10.5.8と、Xcode3.1.4で、C言語です。
480デフォルトの名無しさん:2010/01/21(木) 10:16:23
引数で以下のように配列の大きさを指定したものを見るのですが、

void func(int arr[3])

以下との違いはあるのでしょうか?

void func(int arr[])
void func(int *arr)
481デフォルトの名無しさん:2010/01/21(木) 10:22:12
みたことないし、書いたこともないな
482デフォルトの名無しさん:2010/01/21(木) 10:22:52
つかthreadという概念が出来た背景を知ってほしいような...
483デフォルトの名無しさん:2010/01/21(木) 10:26:17
>>476
The __thread specifier may be used alone, with the extern or static specifiers, but with no other storage class specifier. When used with extern or static, __thread must appear immediately after the other storage class specifier.
484デフォルトの名無しさん:2010/01/21(木) 10:37:30
>>480
一緒
ただし人間が見たときに、ここは長さ3の配列を渡すんだな、と信じ込ませる効果があります
485デフォルトの名無しさん:2010/01/21(木) 10:41:23
>>484
なるほど。
サンクス。
486デフォルトの名無しさん:2010/01/21(木) 10:44:28
>>484
信じ込ませる、っていうのがタチ悪いなw
487デフォルトの名無しさん:2010/01/21(木) 10:51:39
最近勉強を始めて現在は配列、自作関数の作り方程度まで理解していると思います。
入門書を読んでもポインタがいまいちわかりずらいので今の自分にあった課題を何か出してください。
なるべくポインタを理解する手助けになるようにお願いします。
488デフォルトの名無しさん:2010/01/21(木) 10:52:59
文字列操作のstrcpyとかを自作してみるとか
489デフォルトの名無しさん:2010/01/21(木) 10:57:57
malloc, free, 構造体。作って指して使って消す。
490デフォルトの名無しさん:2010/01/21(木) 11:06:46
最初から余り深く考えず、失敗を恐れず時間をかけて
慣れ親しんでいくことが大切。英語の勉強と一緒。
491デフォルトの名無しさん:2010/01/21(木) 12:24:36
>>487
つ宿題スレ
492デフォルトの名無しさん:2010/01/21(木) 13:22:03
>>483
ありがとうございます。
static __thread char *buf;
のように書き直しました。ただ、サポートされていないとエラーが出るのですが・・・
環境のせいですかね??みんなは普通に出来るんですか?

thread-local storage not supported for this target
493デフォルトの名無しさん:2010/01/21(木) 13:40:43
pthread_getspecific/pthread_setspecificなら使えるんじゃない
494デフォルトの名無しさん:2010/01/21(木) 19:52:32
while文が抜け出すときに、未入力で改行だけ押すとループ終了にしたいんですが、条件式にはどう書けばいいですか?
495デフォルトの名無しさん:2010/01/21(木) 20:18:12
while(!未入力で改行だけ)
496デフォルトの名無しさん:2010/01/21(木) 20:18:51
入力の読み取り方はどうしてるんだよ
497デフォルトの名無しさん:2010/01/21(木) 20:34:39
while(?){
fgets(a[i],sizeof(add),stdin);
i++;
}
こんな感じです。
498デフォルトの名無しさん:2010/01/21(木) 20:36:43
fgets(add[i],sizeof(add),stdin);でした
499デフォルトの名無しさん:2010/01/21(木) 20:37:23
>>497
if(a[0]=='\n')break;
とか
if(strlen(a)==1)break;
500デフォルトの名無しさん:2010/01/21(木) 23:12:29
いつもお世話になってます
レポート課題のプログラムを組んだところ、標準偏差が正確に出力されずorz
excelで確認してみると 23.74 19.23 22.68 41.89 になるようなのですが…
よろしくお願いします
http://www.dotup.org/uploda/www.dotup.org581347.zip.html
501デフォルトの名無しさん:2010/01/21(木) 23:31:02
char ptr ="ABC";
char array[];
int len = 0;

while ( isprint( ptr ) ) {
array[len++] = ptr - 'A'
ptr++;
}

これってarrayには何をいれてる?
arrayにはいってるものを使いたいんだが、どうやってコピーすれば?
502デフォルトの名無しさん:2010/01/21(木) 23:35:24
ありもしないものをコピーしようとしてもな
503デフォルトの名無しさん:2010/01/21(木) 23:38:00
>>500
doubleの前にstaticを入れる
504デフォルトの名無しさん:2010/01/21(木) 23:58:56
>>500
標準偏差の計算式合ってるの?

sqrt(((各人の点数-平均)^2)の合計, 2.0)

じゃなくて?
505デフォルトの名無しさん:2010/01/22(金) 00:15:23
>>501
気持ちはわかってやれるが
悲しいほど適性のないコードだな

初心者ゆえの技量の低さとは異質な
不真面目さが箸にも棒にもかからない
506デフォルトの名無しさん:2010/01/22(金) 00:15:23
>>503
変化無しでした…

>>504
おかしいですか?
猫でもわかるプログラミングを参考に組んだのですが…
直してみますー
507デフォルトの名無しさん:2010/01/22(金) 00:15:36
C言語って文字列の結合ってできない?
char a[]= "abc";
char b[]= "def";
char *c;

cにabcdefっていれるみたいな
508デフォルトの名無しさん:2010/01/22(金) 00:17:37
できますよ
509デフォルトの名無しさん:2010/01/22(金) 00:19:47
strcat(strcpy(c, a), b)
510デフォルトの名無しさん:2010/01/22(金) 00:28:05
511デフォルトの名無しさん:2010/01/22(金) 00:32:57
>>500
1 total_xxxが初期化されていない。
2 標準偏差の求め方が間違っている。
512デフォルトの名無しさん:2010/01/22(金) 00:37:28
プログラムが出来る人と出来ない人の違いってなに?
大学でC言語やってるんだけど周りとの差に落胆するんだが
513デフォルトの名無しさん:2010/01/22(金) 00:38:19
>>512
「興味」と、「センス」かな。。。
うん。

514デフォルトの名無しさん:2010/01/22(金) 00:41:03
アニメに興味が無い人にアニメを覚えさせたり
車に(ry のようなもので
ふつうの人はC言語なんてどうでもいいんだよ
515デフォルトの名無しさん:2010/01/22(金) 00:42:57
>>512
C といっても、所詮は機械
車やカメラが得意な者と苦手な者は残酷なほど分かれる

メタルの僕をいかにこき使うかにあたっての
サディズムが明暗を分ける
516デフォルトの名無しさん:2010/01/22(金) 00:44:05
思い通りに動かせた時に喜べるかどうか?かな。
517500:2010/01/22(金) 00:48:36
>>510-511
数値ぴったりですね!
標準偏差以外の部分にも手を入れて頂いたようで、大変見やすくなりました
本当に助かりました ありがとうございました
518age:2010/01/22(金) 01:04:52
Harrisオペレータの実行についての質問です。

http://www.img.tutkie.tut.ac.jp/programs/index.html

このページの
6.特徴点が集中しないように改良した Harris オペレータ (Improved Harris 同梱)
のファイルをダウンロードしてtest-CHarrisを実行したのですが
コマンド入力の仕方がわかりません
ターミナルでmakeを実行して
./test-CHarris 5 1 0.04 0.0001 200 8 none stderr input.ppm

と入力したのですがエラーがでます

お願いします。
519512:2010/01/22(金) 01:04:52
一応興味もって大学に入ったんだけどね…
もうちょっと頑張ってみます
520デフォルトの名無しさん:2010/01/22(金) 01:18:14
char ptr1[10];
char ptr2[10];

ptr1 ="ABC";

strcat(ptr2,ptr1);
なんでできない?
521デフォルトの名無しさん:2010/01/22(金) 01:24:18
>>519
がんばる必要は無い
今の時点で差がついてるのなら、なにをやっても無駄
センスはどうやっても埋められないんだよ
むしろ、中途半端なウデでプログラム関係の会社に入ってもらっても、クソ以下の価値しかありません
522デフォルトの名無しさん:2010/01/22(金) 01:32:44
>>520
出来る事もあるよ。
char ptr1[10];
char ptr2[10];
int i;
for(i=0;i<10;i++)printf("%02X ",ptr2[i]);

とかして確認してみよう。
523デフォルトの名無しさん:2010/01/22(金) 01:32:44
>>519
この業界で一番の金持ちが言ってたが、
勝てそうにないとき、そのルールで戦わないで、ルールを変えてしまえってね
あんたに得意なところで勝負すれば良く、「同じ土俵に立つ」ことはない
没個性するとお決まりのベルトコンベアで処理施設に逝かされるだけだ
そりゃもったいない! この業界はまだ戦国時代で下克上してなんぼやねん

俺はいま追われる立場でつらいが、敵ながらあっぱれな若いの見てるとうれしくなる
524デフォルトの名無しさん:2010/01/22(金) 03:50:48
>>520
C言語では文字列は特殊です。初期化はできても代入はできません。
525デフォルトの名無しさん:2010/01/22(金) 06:25:09
switchで||って使える?
case 1 || 2:みたいな感じで
526デフォルトの名無しさん:2010/01/22(金) 06:37:57
>>525
breakしないじゃダメなの?
527デフォルトの名無しさん:2010/01/22(金) 06:51:20
>>525
実際にやってみればいいじゃん
528デフォルトの名無しさん:2010/01/22(金) 08:06:19
>>525
ダメ。
case 1:
case 2:
と複数書く。
case 1: case 2:
一行に並べても良い
529デフォルトの名無しさん:2010/01/22(金) 10:56:29
C言語って文字列を扱いにくいウンコ言語なのかぁ
530デフォルトの名無しさん:2010/01/22(金) 10:59:24
文字列に限らず動的にサイズが変わるものはたいがい苦手
苦手っていうか糞面倒
熟練PGでも気を抜くとすぐバッファオーバーフローやらかすしな
531デフォルトの名無しさん:2010/01/22(金) 11:45:26
wchar_t *test[]={L"test1",L"test2",L"test3",L"test4",L"test5"};
wchar_t test[][5]={L"test1",L"test2",L"test3",L"test4",L"test5"};

前者はメモリが確保されていないポインタに代入しているように見えるのですが
後者のように自動的に確保されているということで良いのでしょうか
532デフォルトの名無しさん:2010/01/22(金) 11:51:23
L"test1" のような文字列リテラルのためのメモリは、自動的に確保されています

後者は
wchar_t test[][6]={略};
だよな?
[][5] だと L'\0' が付かないよ (それで問題ない用途もあるだろうけれど)
533531:2010/01/22(金) 11:55:26
>>532
なるほど、どうも有り難う御座います
後者の添え字を間違えました。すみません
534デフォルトの名無しさん:2010/01/22(金) 12:17:39
expected declaration or statement at end of input
このコンパイルエラーの意味が分かりません
main文での最後のreturn 0;の後の}の行にエラーが出たんですけど
535デフォルトの名無しさん:2010/01/22(金) 12:21:43
>>534
開き括弧と閉じ括弧の数が合ってない
536デフォルトの名無しさん:2010/01/22(金) 15:15:47
今日、ステップ数という言葉を久しぶりに聞いた。
537デフォルトの名無しさん:2010/01/22(金) 15:22:36
>>528
文法上では合法じゃね? やりたい意図と動作が異なるけど。

case 1 || 2: は
定数論理式 1|| 2 の結果が 1 になるから case 1: と記述したのと同じ動作なだけ
538デフォルトの名無しさん:2010/01/22(金) 15:43:18
バカは黙ってていいから
539デフォルトの名無しさん:2010/01/22(金) 16:16:02
caseは単なるラベル
540無能:2010/01/22(金) 19:12:50
k-means法をC言語でやれる方教えてください。
問題文は、
・方法
 1、初期値として、クラスタ数および初期のデータ分割を与える。
 2、データ分割に基づき各分割の重心を求める。
   さらに、重心と各事例データとの距離を求める
 3、各事例を最も近いクラスタに割り当てる。
 4、上記の割り当てが前回と同じであれば終了。
   更新があれば2に戻る

どなたかできる方教えてください
541デフォルトの名無しさん:2010/01/22(金) 19:19:25
 | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|
 | つぎでボケて!   |
 |_________|
    ∧∧ ||
    ( ゚д゚) ||
    / づΦ
542デフォルトの名無しさん:2010/01/22(金) 19:20:22
>>540
ここで具体的な質問すると宿題スレ池って言われるのがオチ
543デフォルトの名無しさん:2010/01/22(金) 19:42:50
具体的な質問というよりこの場合 「問題文は、」 とか書いてあるからだな
宿題スレ池
544デフォルトの名無しさん:2010/01/22(金) 20:04:49
http://codepad.org/OL5uG9np

このコードで
gatu2>gatuの時にniti>niti2となる値を打つと実行画面が途中で止まってしまいます


2011年何月何日のデータを入力しますか?
月>>>>>>3
日>>>>>>31
2011年3月31日から何月何日までのデータを入力しますか?(2011年12月31日まで)
月>>>>>>4
日>>>>>>1
(ここから進まない)

なぜでしょうか?
545デフォルトの名無しさん:2010/01/22(金) 20:17:38
>>544
なんつーか、まず構造を整理したほうがいいよ。
月による日数の種類は29日、30日、31日の3通りしかないんだから、条件分岐は3通りにできるはず。
546デフォルトの名無しさん:2010/01/22(金) 20:20:17
乱数で出した4点の全部のルートの総距離を計算して
最短ルートを求めたいんですが、
図示してみると明らかに違っています。
どうすればよいのでしょうか?
http://www.dotup.org/uploda/www.dotup.org583815.c.html
547デフォルトの名無しさん:2010/01/22(金) 20:24:06
>>545
途中で送信しちまったw

だから、月を入力させたらその中でswitch文で3分岐にするといい。
switch (gatu) {
  case 2:
    //29日
    break;
  case 4:
  case 6:
  case 9:
  case 11:
    //30日
    break;
  default:
    //31日
    break;
}
548デフォルトの名無しさん:2010/01/22(金) 20:29:49
>>547
分かりました
やってみます
549デフォルトの名無しさん:2010/01/22(金) 20:33:37
今年の2月は何日までだよ
550sumimasen:2010/01/22(金) 20:45:13
#if 0
   }while(
   (((niti2<=niti)||(niti2>31))&&
   ((gatu2==1)||(gatu2==3)||(gatu2==5)||(gatu2==7)||(gatu2==8)||(gatu2==10)||(gatu2==12)))||
   (((niti2<=niti)||(niti2>30))&&
   ((gatu2==4)||(gatu2==6)||(gatu2==9)||(gatu2==11)))||
   (((niti2<=niti)||(niti2>28))&&
   (gatu2==2)));
#else
   }while(
   (((gatu2<=gatu)||(niti2>31))&&
   ((gatu2==1)||(gatu2==3)||(gatu2==5)||(gatu2==7)||(gatu2==8)||(gatu2==10)||(gatu2==12)))||
   (((gatu2<=gatu)||(niti2>30))&&
   ((gatu2==4)||(gatu2==6)||(gatu2==9)||(gatu2==11)))||
   (((gatu2<=gatu)||(niti2>28))&&
   (gatu2==2)));
#endif
551超低脳ぷ:2010/01/22(金) 23:12:25
ねぇねぇ
#if 0
A
#else
B
#endif
のAはどんな場合に有効なの?
何が0の時?
552デフォルトの名無しさん:2010/01/22(金) 23:16:12
条件が0つまり偽なんだから常にelse部分が有効になる
主にデバッグしてる時に手早く0とか1に書き変えてコードを切り替えるのに使われる
553超低脳ぷ:2010/01/22(金) 23:37:11
>>552
どもども、そうなんですか
なんか低脳っぽいやりかた
554デフォルトの名無しさん:2010/01/22(金) 23:42:52
しねよ
555デフォルトの名無しさん:2010/01/22(金) 23:52:38
こういうやつはきっとコメントアウト使ってバグに悩む
556デフォルトの名無しさん:2010/01/23(土) 00:00:30
> が大なりなら < が小なりで、
そんな感じのプログラムです。
よろしくお願いします。
557デフォルトの名無しさん:2010/01/23(土) 00:19:52
fprintf(fpo,"%d %d %f %f %f\n",a, b, heikin[j], saikou[j], saitei[j]);
このようにファイルに書き込めるようにしたら、ファイルの中身が

1 2 -92559631349317831000000000000000000000000000000000000000000000.000000 -92559631349317831000000000000000000000000000000000000000000000.000000 -92559631349317831000000000000000000000000000000000000000000000.000000

となってしまいました・・・何が起きているんでしょうか?
558デフォルトの名無しさん:2010/01/23(土) 00:28:58
>>557
fprintf で出力されたのではないでしょうか?
559デフォルトの名無しさん:2010/01/23(土) 00:33:35
あと、エッフェル塔のプログラムもお願いします。
560557:2010/01/23(土) 00:33:45
>>558
ありがとうがごいます
どうすれば入力した値どおりになりますかね?
561デフォルトの名無しさん:2010/01/23(土) 00:42:02
>>560
a, b, heikin[j], saikou[j], saitei[j]
これらの型や値、OS、コンパイラ、バージョンなどは秘密なの?
562557:2010/01/23(土) 01:12:17
a,b,jがint型で後ろのはdouble型です
OSはVISTAでvisual c++ 2008 express edition使ってます

プログラムは
for(b=niti;b<=niti2;b++)
{
   printf("%d月%d日の気温データの入力\n",a,b);
   printf("平均気温は>>>");
   scanf("%lf",&heikin[j]);
   printf("最高気温は>>>");
   scanf("%lf",&saikou[j]);
   printf("最低気温は>>>");
   scanf("%lf",&saitei[j]);
   j++;
   fprintf(fpo,"%d %d %f %f %f\n",a, b, heikin[j], saikou[j], saitei[j]);
}
です
563デフォルトの名無しさん:2010/01/23(土) 01:42:10
voidポインタの使いどころがわかりません。

どんな型にでもキャストして使えるので便利そうですが、
例えば関数の引数にすると、意図しない型を入れても
コンパイルエラーにならないので危険な気がしています。

関数の引数にvoidポインタを指定するのは例えばどういう
場面なのでしょうか?

どういう型の引数がくるかわからないとき?
わからなかったらそもそもどうキャストして
使えばいいのかもわからない気がするのですが??
564デフォルトの名無しさん:2010/01/23(土) 01:45:21
>>562
> j++;
> fprintf(fpo,"%d %d %f %f %f\n",a, b, heikin[j], saikou[j], saitei[j]);
ここの行は上下逆では?
565557:2010/01/23(土) 01:53:25
>>564
そのとおりでした
ありがとうございました
566デフォルトの名無しさん:2010/01/23(土) 02:12:43
>>563
例えば
コールバック関数の引数で使えば
好きな形でデータを渡せるようになる
567デフォルトの名無しさん:2010/01/23(土) 02:19:15
>>566
すみません、イマイチわかりません。
好きな形で渡しても結局渡された側はキャストするのですよね?
だったらそもそもvoid*ではなくそのキャストする型を引数にすれば
よいと思うのですが?
568デフォルトの名無しさん:2010/01/23(土) 02:28:21
>>567
型ごとに関数用意するのか?
569デフォルトの名無しさん:2010/01/23(土) 02:36:21
>>568
いや、ある型でキャストするなら型ごとに関数用意するのと同じかと・・・
どういう型でキャストするのかの情報を別の引数で用意するってことかな。
570デフォルトの名無しさん:2010/01/23(土) 02:55:04
>>569
無限通りある関数すべて用意するの?
571デフォルトの名無しさん:2010/01/23(土) 03:00:38
それじゃわかってる人にしかわからねーよw
572デフォルトの名無しさん:2010/01/23(土) 03:00:54
>>569
APIを作る人と関数を作る人は違う

標準ライブラリ関数qsortは
ソートする際の大小関係を
int func(void* void*)の比較関数を作って与えないといけない

基本型ならまだしも、構造体だったどうする気だ
573デフォルトの名無しさん:2010/01/23(土) 04:19:48
>>567
qsort() を調べてみてください。
574デフォルトの名無しさん:2010/01/23(土) 06:41:28
>>563
realloc, free
575デフォルトの名無しさん:2010/01/23(土) 08:10:23
>>563
memcpyの引数もvoid*だよ
どんな型の変数にも使えるでしょ?
576デフォルトの名無しさん:2010/01/23(土) 09:33:12
じゃあもう全部 void* でいいじゃん。
char * とかいらねーよな。
577デフォルトの名無しさん:2010/01/23(土) 09:42:04
printf の %s は char* 型を期待しているから
いちいちキャストしないとwarning出て面倒だよ。。
578デフォルトの名無しさん:2010/01/23(土) 09:51:04
free()ってヒープにとった領域を解放するとおもうんですけど
その領域って誰が管理してるんですか?
解放するにはポインタとバイト数が必要だと思うんですが
free()にはポインタしか渡さないので心配です。
579デフォルトの名無しさん:2010/01/23(土) 09:59:24
malloc/freeを含むメモリマネージャが管理している。
mallocで返る、freeに渡す領域の少し前の部分に色んなデータがしこまれていて
そこにサイズなんかも記述されてる。
580デフォルトの名無しさん:2010/01/23(土) 10:10:36
>>579
なるほどありがとうございます。
その辺、もう少し詳しく知りたいのですが
解説してるサイトとかないでしょうか?
私が見たサイトはただ解放されるとしか書いてなく
実際のところがよくわかりませんでした。
581sage:2010/01/23(土) 10:14:31
「Cプログラマのためのアルゴリズムとデータ構造」にメモリ管理の話があったような希ガス。
char[SIZE] の領域を自分で管理して、malloc/free もどきを実装したような。
582デフォルトの名無しさん:2010/01/23(土) 10:20:36
>>581
自分で管理するとするとmallocで確保した領域のポインタとサイズを
スタックに配列かなんかで持っておいてfreeされたときにスタックの配列
からポインタをキーに検索してサイズをゲットして解放する感じでしょうか。
Cコンパイラがこのような処理を自動で実行ファイルに埋め込んでくれている
ということなのでしょうか。
それならなんとなく納得できます。
583sage:2010/01/23(土) 10:26:37
なんつーか、割り当てるブロックの先頭にヘッダを付けたような希ガス。
ヘッダには、ブロックが使用中であることを示すフラグとか、
次のブロックへのポインタとかあったような希ガス。

俺も初心者なので詳しいことは教えられないが
興味があったら本買ってみて読んでごらんよ。楽しいよ。
584デフォルトの名無しさん:2010/01/23(土) 10:50:44
585デフォルトの名無しさん:2010/01/23(土) 10:56:46
>>583
なるほど。もっと効率のいいやり方なんですね。
まぁ。それはそうだわなー。

>>584
おぉ。なんかわかりやすそうです。サンクス。
じっくり読みます。
586デフォルトの名無しさん:2010/01/23(土) 11:22:48
>>584
ほとんどの実装がこうなっているならばあの忌まわしいmalloc/free論争に
ピリオドが打てるんだけどな
587デフォルトの名無しさん:2010/01/23(土) 11:27:24
数値計算の自作プログラムの実行スピードが遅くて困ってるんだけど簡単に早くする方法って無い?
ちなみに並列化はすでに完了。
変数の名前短くするとかは無駄かな?
何でもいいのでアイデアくれ。
588デフォルトの名無しさん:2010/01/23(土) 11:28:55
utf8の文字列に対してstrstrとか、strchrって有効でしょうか?
589デフォルトの名無しさん:2010/01/23(土) 11:30:50
ソースさらさないと曖昧論しか出てこないぞ
プロファイルとってアセンブラリスト見てチューニング、SIMD、GPGPU、クラスタリング、マシンのリプレース
590デフォルトの名無しさん:2010/01/23(土) 11:35:39
>>588
できる。
591デフォルトの名無しさん:2010/01/23(土) 11:38:52
曖昧論で良いから教えて欲しいのよ。
592デフォルトの名無しさん:2010/01/23(土) 11:41:36
>>590
ありがとうございます。
593デフォルトの名無しさん:2010/01/23(土) 11:52:45
>>591
優秀な人に作り直してもらう、とか
594デフォルトの名無しさん:2010/01/23(土) 12:25:50
>>587
> 変数の名前短くするとか
Cで、こんなこと言ってるあたりからすると、君には無理。
595デフォルトの名無しさん:2010/01/23(土) 12:29:08
なにそのBASICw
596デフォルトの名無しさん:2010/01/23(土) 12:38:33
>>587
巨大な行列の掛け算なら先に転置行列を作ってから計算すれば倍速くらいにはなる
597デフォルトの名無しさん:2010/01/23(土) 14:20:23
ifの条件式を
1< i <10
1 <j <10
にしたいのですが
if(i>=1 || j>=1 || i<=10 || j<=10)
上ではだめでした
どうすればうまくできますか?
598デフォルトの名無しさん:2010/01/23(土) 14:23:40
1< i <10と1 <j <10の関係は
ORとANDのどっち?
599デフォルトの名無しさん:2010/01/23(土) 14:25:06
if(i>1 && i<10 &&(または||) j>1 && j<10)
600デフォルトの名無しさん:2010/01/23(土) 14:27:10
>>598
ANDです。
説明不足ですみません
601デフォルトの名無しさん:2010/01/23(土) 14:29:35
602デフォルトの名無しさん:2010/01/23(土) 14:29:35
>>599
ありがとうございます
603デフォルトの名無しさん:2010/01/23(土) 16:22:17
どういたしまして
604デフォルトの名無しさん:2010/01/23(土) 16:59:40
情報系の大学生って4年間で何コマ分くらいプログラムの勉強するのですか?
605デフォルトの名無しさん:2010/01/23(土) 17:03:25
2コマ
606デフォルトの名無しさん:2010/01/23(土) 17:03:37
>>604
スレ違いだとは思わないのかね。
607デフォルトの名無しさん:2010/01/23(土) 17:04:43
マジレスすると意味不明な講義ばっかりでプログラミングは専門学校以下
実装より理論重視
608デフォルトの名無しさん:2010/01/23(土) 17:07:03
すみません、ありがとうございます。
609デフォルトの名無しさん:2010/01/23(土) 19:51:40
理論も大事だぞ
むろんプログラムを組めなきゃどうにもならないが、
そんなのはPCさえあれば自分でできることだし、
講義聞いたからって身に付くもんでもないからな
610デフォルトの名無しさん:2010/01/23(土) 20:05:39
いや、理論こそが最も大事。
米国ではコンピュータサイエンス(情報科学)を学ぶ。だから合理的な構造やアルゴリズムが生まれる。
611デフォルトの名無しさん:2010/01/23(土) 21:02:34
Information Scienceはコンピュータサイエンスと同義じゃないぞ
日本の大学でもやるけどね、人間行動学とか、そういう糞退屈なのを含む
工学部では特に、どうすれば効率よく金儲け出来るか。端的にいえばそんな話だね
612デフォルトの名無しさん:2010/01/23(土) 21:04:30
スレタイを読む日本語力が求められる
613デフォルトの名無しさん:2010/01/23(土) 23:06:35
>>612
お前には「流れ」を読むチカラが求められる
614デフォルトの名無しさん:2010/01/23(土) 23:17:28
ある任意の自然数が奇数か偶数かの判断をするのには
もっとも高速となる手段としてはどのようなものが考えられますか
やはりビットを用いたほうがよろしいのでしょうか
615デフォルトの名無しさん:2010/01/23(土) 23:31:11
速度が知りたければ実測する以外に無い
616デフォルトの名無しさん:2010/01/23(土) 23:53:04
>>615
だれも速度が知りたいなんて話はしていないが馬鹿なの?
もしかして馬鹿なの?
617デフォルトの名無しさん:2010/01/23(土) 23:58:20
O(1)だからどうでもいい
618デフォルトの名無しさん:2010/01/24(日) 00:00:02
>>616
どんなアルゴリズムでやろうと結果は実測でしか知り得ないって話じゃないの?
619デフォルトの名無しさん:2010/01/24(日) 00:01:20
仮説を立て実証するのが物理学
620デフォルトの名無しさん:2010/01/24(日) 00:02:22
高速となる手段なのに速度はどうでもいいという・・・
621デフォルトの名無しさん:2010/01/24(日) 00:06:04
2の補数表現でさえあれば最下位ビットを見ればいいが
アーキテクチャによっては専用のフラグを持っているかも知れず
結局実測に勝るものなし。
622デフォルトの名無しさん:2010/01/24(日) 00:14:46
>>620
高速化する方法と速度を知りたいって全然違う質問だよね?
どの程度高速化できたかは実測するしかないが、
高速化する方法が実測するしかないなんて馬鹿としか思えん。
流れ理解しろよ。
623デフォルトの名無しさん:2010/01/24(日) 00:17:39
if (number & 1) {
printf("奇数");
} else {
printf("偶数");
}
624デフォルトの名無しさん:2010/01/24(日) 00:23:39
625デフォルトの名無しさん:2010/01/24(日) 00:44:02
ほんとお前らの盛り上げ力には脱帽だぜ
626デフォルトの名無しさん:2010/01/24(日) 05:10:09
multimapの最も登録されている数が多いキーを知るいい方法があればご教授ください!!
627デフォルトの名無しさん:2010/01/24(日) 05:24:50
ここはC言語か、スレを間違えました。取り下げです。
628デフォルトの名無しさん:2010/01/24(日) 10:52:24
int is_odd(int n) {
  return n - ((n>>1) << 1);
}
>>614 には「そうだ。」
629デフォルトの名無しさん:2010/01/24(日) 11:04:16
選挙に行こう
630デフォルトの名無しさん:2010/01/24(日) 13:09:35
せーんきょーせんきょーあかるいせんきょー♪
631デフォルトの名無しさん:2010/01/24(日) 13:11:22
//tasizan
#include<stdio.h>
int tasizan(int x,int y);
int main(void){
int a,b,add;
scanf("%d%d",&a,&b);
add=tasizan(a,b);
printf("0add=%d\n",add);;
return
}
int tasizan(int x,int y){
int answer
answer=x+y;
return answer;
}


関数を作るのが良くわかりません
出来ればわかりやすく教えてください
632デフォルトの名無しさん:2010/01/24(日) 13:24:54
//tasizan
#include<stdio.h>
int tasizan(int, int);
int main(){
int a, b;
scanf("%d%d",&a, &b);
printf("add = %d\n", tasizan(a, b));
return 0;
}
int tasizan(int x, int y){
return x + y;
}

どこが分からんの?
633デフォルトの名無しさん:2010/01/24(日) 13:40:36
int tasizan(int x,int y);

add=tasizan(a,b);

printf("add = %d\n", tasizan(a, b);

int tasizan(int x,int y){
int answer
answer=x+y;
return answer;
の組み合わせがなぜそうなるのか分からないです
634デフォルトの名無しさん:2010/01/24(日) 13:49:18
意味が分からないのは俺だけか。
635デフォルトの名無しさん:2010/01/24(日) 13:50:11
>>634がわからないのは、>>633の質問だよな?
そうだったら仲間だ
636デフォルトの名無しさん:2010/01/24(日) 13:51:45
引数と戻り値って言葉の意味分かる?
それとも、tasizan(a, b)とtasizan(x, y)で
なんでaとbからxとyになっとんねんって疑問?
637デフォルトの名無しさん:2010/01/24(日) 14:02:32
戻り値は知らないです
638デフォルトの名無しさん:2010/01/24(日) 14:08:42
「やさしいC」「猫でもわかる」とかそこら辺の入門書を読むことを勧める
639デフォルトの名無しさん:2010/01/24(日) 14:15:24
猫でも分かるは俺にはわからない
640デフォルトの名無しさん:2010/01/24(日) 14:19:37
「猫でもわかる」ならば「人間にもわかる」が成り立つかどうかはさておき、実際には、猫に読ませても猫は理解できない。
さらには、猫が理解できたかどうかを僕たちが知る手段すらない。
641デフォルトの名無しさん:2010/01/24(日) 14:21:27
ネタにマジレス
642デフォルトの名無しさん:2010/01/24(日) 14:24:40
ニャー
643デフォルトの名無しさん:2010/01/24(日) 14:26:58
>>639
それを不等式で表すとどうなる?
644デフォルトの名無しさん:2010/01/24(日) 14:29:48
冗談はさておき、
関数とポインタでつまずくと、今後習うことが一切理解できなくなるから
本気で勉強しろよ
645デフォルトの名無しさん:2010/01/24(日) 14:31:35
ネコはああ見えて賢い動物だからな
もっと下等な動物にあわせた入門書が必要なのかもしれない
646デフォルトの名無しさん:2010/01/24(日) 14:31:45
戻り値知らんならもう関数の型はvoidにして参照渡しでいいじゃん
647デフォルトの名無しさん:2010/01/24(日) 14:34:35
>>644
ポインタはともかく
関数で躓くとか、
優秀な小学生に負けるレベルだろ
648デフォルトの名無しさん:2010/01/24(日) 14:35:56
小学生馬鹿にすんな
649デフォルトの名無しさん:2010/01/24(日) 14:36:41
え?小学生じゃないの?
650デフォルトの名無しさん:2010/01/24(日) 14:37:16
>>647
関数ポインタとかつまずく奴結構多いぞ
651デフォルトの名無しさん:2010/01/24(日) 14:37:56
関数ポインタはポインタの一部
関数で躓くのはどうかなあ・・・
652デフォルトの名無しさん:2010/01/24(日) 14:44:51
>>633
int tasizan(int, int); // 関数の宣言
int main(){
int a, b;
scanf("%d%d",&a, &b);
printf("add = %d\n", tasizan(a, b)); // ※1
return 0;
}
int tasizan(int x, int y){ // 関数の定義
return x + y;
}

※1で関数を呼ぶためには、その関数がどんなものなのか、
コンパイラが分かってなきゃいけない。
けど、それが出てくるのはmainの後。
それでは間に合わないので、先にコンパイラに教えてるのが上の宣言。

もし、
int tasizan(int x, int y){ // 関数の定義
return x + y;
}
int main(){
int a, b;
scanf("%d%d",&a, &b);
printf("add = %d\n", tasizan(a, b)); // ※1
return 0;
}
という順番であったのなら、
int tasizan(int, int); // 関数の宣言
は書かなくていい。ひとまず必要は無い。

ただ、流儀として使う関数全部を、いつも先に宣言しておく、という人々は居る。
653デフォルトの名無しさん:2010/01/24(日) 14:44:56
中高の数学でy=x^2とf(x)=x^2の違いが分からないまま卒業した人
654デフォルトの名無しさん:2010/01/24(日) 14:59:13
>>653
俺ヤベェ
わかんないわ
655デフォルトの名無しさん:2010/01/24(日) 15:00:01
関数ポインタって実際に使ったことがないんだけど
どういった便利さとかがあるのかよくわからないれす(^q^)
656デフォルトの名無しさん:2010/01/24(日) 15:04:08
関数の宣言はヘッダファイルに書こうね(はあと)
657デフォルトの名無しさん:2010/01/24(日) 15:04:27
普通に勉強してて最初にさわるのはqsort()あたりじゃないかなあ
658デフォルトの名無しさん:2010/01/24(日) 15:05:47
>>654
大丈夫、数学系に行かない限りつかわないから。

強いて言うなら
y=x^2

double y = x^2;
で、
f(x)=x^2

double f(double x){return x^2;}
ってことかな?
659デフォルトの名無しさん:2010/01/24(日) 15:08:14
>>655
ライブラリなんかのイベント処理を行うための
コールバック関数を記述するための
インタフェースとして使われることがよくある
660デフォルトの名無しさん:2010/01/24(日) 15:10:38
どうでもいいけど、「関数」に反応して毎回、数学の定義上の「関数」出すのやめて。
661デフォルトの名無しさん:2010/01/24(日) 15:16:09
>>660
でも同じ名前なんだからしょうがないじゃん。だろ?
662デフォルトの名無しさん:2010/01/24(日) 15:29:41
>>655
テーブルジャンプ
663デフォルトの名無しさん:2010/01/24(日) 15:32:09
>>662
名前がカッコよすぎて濡れたわ
664デフォルトの名無しさん:2010/01/24(日) 15:32:52
テールスープ
665デフォルトの名無しさん:2010/01/24(日) 18:10:04
>>655
関数ポインタはウインドウズならウインドウプロシージャ
666デフォルトの名無しさん:2010/01/24(日) 18:53:40
void func(int *x) {
char buffer[20];
fgets(buffer, 20, stdin);
*x = atoi(buffer);
}

int main(void) {
int num;
func(&num);
fprintf(stdout, "%d\n", num);
return 0;
}
667デフォルトの名無しさん:2010/01/24(日) 22:45:53
>>655
おまえさんが使ってるテキスト、相当に問題ありそうだな
有用性を示すサンプルが見あたらないってことだろ

# もう1つ考えられる事態については言及を避ける
668デフォルトの名無しさん:2010/01/25(月) 00:10:53
まあ、そう言わずに最後まで書いちゃいなヨ!
669デフォルトの名無しさん:2010/01/25(月) 00:33:05
俺がエスパーすると

つまり

 テキストすら使ってない!

ってことだろ!
670デフォルトの名無しさん:2010/01/25(月) 00:34:36
これぞホントの独習ってやつか
671デフォルトの名無しさん:2010/01/25(月) 04:31:56
char型の変数の初期値を「あ」にして
プログラムでその変数に「い」を追加して
「あい」にするにはどうすればいいですか?

イメージとしては、
char a='あ'
a=a+'い';

aの中身
a='あい'
672デフォルトの名無しさん:2010/01/25(月) 04:39:53
char型は1バイト。
日本語とかは2バイト。
だからchar型では不可能。

配列にするか、ポインタでやるか。

char a[5]="あ";
strcat(a, "い");
673デフォルトの名無しさん:2010/01/25(月) 10:17:44
UTF-8だと5じゃ足りない
674デフォルトの名無しさん:2010/01/25(月) 10:18:51
>>673
それはBOM含んでね?
675デフォルトの名無しさん:2010/01/25(月) 10:22:16
UTF-8だと平仮名は3バイト
676デフォルトの名無しさん:2010/01/25(月) 10:33:23
>>675
なるほど
677デフォルトの名無しさん:2010/01/25(月) 11:52:06
>>655
クイックソートではないソート法で 標準の qsort と同じ引数をとるようなソート関数を実装するとき
678デフォルトの名無しさん:2010/01/25(月) 12:02:50
>>655
使いこなすには高度な発想が必要になる
679デフォルトの名無しさん:2010/01/25(月) 19:57:00
>>678
んー、それほど高度という気はしませんが。
Windows API をやれば、いやというほどでてきます。まあ慣れでしょうけど。
680デフォルトの名無しさん:2010/01/25(月) 22:01:50
わかる人にはわかるけど、
わからない人にはおまじないみたいな処理に見えるのかもしれない
681デフォルトの名無しさん:2010/01/25(月) 22:22:22
C言語の入門書で
#includeやscanfの&をおまじないと書く入門書はゴミ。
682デフォルトの名無しさん:2010/01/25(月) 22:26:08
なるほど。やっぱりそうなのか
683デフォルトの名無しさん:2010/01/25(月) 22:28:22
>>681
そういう入門書って、文字列操作の部分が糞だな
684デフォルトの名無しさん:2010/01/25(月) 22:31:15
代案を示せ。
ポインタを理解するまで、ry
685デフォルトの名無しさん:2010/01/25(月) 22:33:36
気に入らないならK&Rでもよんどきゃいいよ
686デフォルトの名無しさん:2010/01/25(月) 22:39:32
>>681
そんな入門書あるのか?
687デフォルトの名無しさん:2010/01/25(月) 22:45:02
彼らは古き悪しきMSのように、デイファクトスタンダードづくりに余念がない
688デフォルトの名無しさん:2010/01/25(月) 22:45:57
まあ最初からプリプロセッサだのアドレス演算子だの言われても意味不明だろ。
689デフォルトの名無しさん:2010/01/25(月) 23:04:45
うん、最初の最初で「Hello Work」をprintするときに
#include の説明してたら躓くだろうな。

いや「『こんにちは、世界』ってどういう意味だろう」ということにすら
疑問を持つ初心者もいるかもしれない(悪いことではないが...)
690デフォルトの名無しさん:2010/01/25(月) 23:07:28
ハローワーク
691デフォルトの名無しさん:2010/01/26(火) 00:19:15
>>689
世界初の原潜が処女航海で打電したメッセージだとか。
692デフォルトの名無しさん:2010/01/26(火) 00:21:41
最初は関数の説明からすればいいのに
693デフォルトの名無しさん:2010/01/26(火) 00:24:12
いやまずは「こんぴゅーたーのしくみ」からだろ。わりとマジで。
694デフォルトの名無しさん:2010/01/26(火) 00:24:31
temp_buf[TEMP_BUF_SIZE], temp_buf2[TEMP_BUF_SIZE]は'\0'で初期化されてます。
文字列がtem_bufに格納され、その中から"search"を探索し、文字列が見つかれば
そのsearchのs以降の文字をtemp_buf2にコピーしようとしています。
が、実行すると暴走してしまいます。
*pの使い方がおかしいような気もするんですが、
原因が分かりません。
環境はgccですが手元にpcが無いので詳細は分かりません。
もし必要でしたら調べてきます。ごめんなさい。

char com[] = "search";
char *p = strstr(temp_buf,com);
if( *p != NULL ){
if( sizeof(temp_buf2) - &(temp_buf[TEMP_BUF_SIZE-1])-&(*p)+1 < 0){
fprintf( stderr, " buffer overflow 1\n" );
exit(-1);
}
strcat( temp_buf2, p );
printf("%s",temp_buf2);
 }

よろしくお願い致します。

695デフォルトの名無しさん:2010/01/26(火) 00:25:24
まずそれから
#include "HelloWorld.c"
が最初のプログラムで良くね?
696デフォルトの名無しさん:2010/01/26(火) 00:29:10
手元にPCが無ければくよくよ悩まないほうがいい
コンパイラの気まぐれな警告を潰していけば
コンパイラと意思疎通が出来ていないだけだという
ことがわかる。(要するに*pは1文字を表すので
p==NULLと*p==NULLは意味が違うというだけ
なんだが )
697デフォルトの名無しさん:2010/01/26(火) 00:29:11
すいません
ageます
698デフォルトの名無しさん:2010/01/26(火) 00:30:54
>>694
if( *p != NULL ){
699デフォルトの名無しさん:2010/01/26(火) 00:35:23
700デフォルトの名無しさん:2010/01/26(火) 00:41:21
>temp_buf[TEMP_BUF_SIZE], temp_buf2[TEMP_BUF_SIZE]は'\0'で初期化されてます。

>文字列がtem_bufに格納され
なのに
>char *p = strstr(temp_buf,com);
>if( *p != NULL ){
だからじゃないかな?
文字列を入れたtem_bufでなく'\0'で初期化したtemp_bufを見ちゃってる
701デフォルトの名無しさん:2010/01/26(火) 00:42:14
>>696
かなりデバッグに苦しんでて悩まずにはいられないんです・・・
>>696,698
直します。
ありがとうございます。


702デフォルトの名無しさん:2010/01/26(火) 00:50:21
>>699
アホ?それとも盲?
703デフォルトの名無しさん:2010/01/26(火) 00:50:36
>>699
そのスレで、
>スレチですね
>失礼します
って書いてるように自分としてはこちらに移動してきたつもりなんですが・・・
分かり難くてすみません。

>>700
確認してみます。ありがとうございます。


704デフォルトの名無しさん:2010/01/26(火) 01:00:28
>>702
投稿時間からしてマルチだろ
705デフォルトの名無しさん:2010/01/26(火) 12:28:11
下記コードでprintfに渡す情報は、%dだけで引数の型情報を与えていないのに、異なるバイト数の
引数をきちんと処理できているのは何故でしょうか?

#include <stdio.h>

int main() {
char a = 1;
short b = 2;
int c = 3;

printf("%d %d %d", a, b ,c); /*=> 1, 2, 3 */
}
706デフォルトの名無しさん:2010/01/26(火) 12:33:40
>>705
int printf(const char *format,...);
の定義に立ち返れ。
a,b,cをコンパイラはどう解釈してどのように渡しているか?
707デフォルトの名無しさん:2010/01/26(火) 12:37:02
関数の定義によく出てくる「...」はどういう意味ですか?
708デフォルトの名無しさん:2010/01/26(火) 12:54:09
可変引数
暗黙の格上げを行って引数を詰む
char, short → int へ
float → double へ
可変引数を持つ関数は 上記の格上げを考慮して、詰まれた値を抜き出し適宜操作

sizeof(int) != sizeof(void*) な環境で ポインタとして NULL をきっちり渡す場合
0 とは渡さずに (void*)0 と明示的にキャストすることもある
# 0 と渡すと int で詰まれるから
709デフォルトの名無しさん:2010/01/26(火) 13:27:37
>>708
なるほど、そういうことですか
d
710デフォルトの名無しさん:2010/01/26(火) 13:27:48
実引数拡張
711デフォルトの名無しさん:2010/01/26(火) 13:43:54
改行だけをしたいときは、どれがいいのですか?

printf("\n");
putchar('\n');
puts("");
712デフォルトの名無しさん:2010/01/26(火) 13:45:24
その場限りの非公開匿名共用体配列に突っ込んでその共用体の
アドレスだけを渡してから呼ぶことのほうが多いだろ
値型が増えそうなので、暗黙のキャストは色々と問題が多いと
いうことで、最近はしないようになってきている。
(ポインタ<->int 程度のことしかしない)
713デフォルトの名無しさん:2010/01/26(火) 15:59:43
お前だけ
714デフォルトの名無しさん:2010/01/26(火) 16:09:21
>>712
警告が出ない暗黙のキャストは安全だから、不必要なキャストはしないほうがいい。
> ポインタ<->int 
これは、危険だから、暗黙のキャストはしない。
715デフォルトの名無しさん:2010/01/26(火) 16:38:41
>>711
好きなように。
俺ならprintf、ただprintfは通常大きなコードを吐き出しから条件によっては谷逃げる。
716デフォルトの名無しさん:2010/01/26(火) 16:38:54
コンパイラに警告を出させない為だけという意味では
警告が出ないキャストの記述は省略したほうが良い。
コード記述量とバグ潜入率は相関があるから。
ポインタとintの相互変換をキャスト無しで行っている
コードをノーチェックで通してしまうようなコンパイラは
使わない方がよい
717デフォルトの名無しさん:2010/01/26(火) 17:09:18
>>712
昔出てきたが execl() は 可変の終端を示すのに ヌルポを要求してる。
そこで安易に 0 とやっても コンパイラは警告のしようが無いので(可変部の型は確定しようがない) 危ないよ
って例
718デフォルトの名無しさん:2010/01/26(火) 17:11:15
あ NULL がどう定義されているか自信が無い場合ね。
719デフォルトの名無しさん:2010/01/26(火) 17:14:04
NULLがコンパイラ付属のライブラリレベルでユニークじゃ
ないような処理系ってある?
720デフォルトの名無しさん:2010/01/26(火) 17:18:15
くりかえしになるけど sizeof(int) != sizeof(void*)
char a[1];
int* p = NULL;
a[0] = NULL; /* 個人的に、この記述は嫌 */

両方整合できる NULL 定義できてるかな?

--------------------------
#define NULL (0)
#define NULL ((void*)0)
721デフォルトの名無しさん:2010/01/26(火) 17:19:32
>>719
ある。8086。0ですらない場合がある。
722デフォルトの名無しさん:2010/01/26(火) 17:19:40
>>720
char c = '\0'; // ヌル文字、ナル文字
723デフォルトの名無しさん:2010/01/26(火) 17:23:31
>>722
うん 俺はそう記述するか char c = 0; ってリテラルの 0 渡しちゃってる。
724デフォルトの名無しさん:2010/01/26(火) 17:27:57
リテラルレベルでの暗黙のキャストと、コンパイラが作り出す(だろう)変数シンボルテーブル上のTYPE項目の一時的書き換え処理
のキャストは似ていてかなり違います。後者は明示的に指示しない
と処理を単純化する為のオプティマイザの力から、おかしな
コードを出す場合があります。特にコードの高速性を誇るコンパイラ
の場合はその傾向が大です。リテラルレベルのキャストは省略可能
です。厳密にはこれはキャストとは言わないからです。
725デフォルトの名無しさん:2010/01/26(火) 18:20:42
>>705
いわゆる promotion (暗黙の型変換)により、関数の引数は int に符号拡張されるからです。
例にあげたコードは、どれも int に格上げされて printf()に渡ります。
int とサイズの違う long では %ld としなければならないことになります。
726デフォルトの名無しさん:2010/01/26(火) 18:21:51
>>717
そうそう、だから昔は (char *)0 としていました。
727デフォルトの名無しさん:2010/01/26(火) 18:23:04
今でも (char *)0 としてください。
728デフォルトの名無しさん:2010/01/26(火) 18:31:29
構造体のアライメント関係です。
ぐぐってみたのですが、いまいち理解できません。

struct {
 long l;
 short s;
 char c;
}ST1;

struct {
 short s;
 long l;
 char c;
}ST2;

ST1のshort、charは偶数バイトに丸められたのかな〜くらいで納得(?)したのですが
ST2がサッパリ!
なぜcharが4バイト扱いになってるの?

OSはWindowsでコンパイラはVC。設定項目のアライメントサイズは8。
sizeof(short)は2 sizeof(long)は4になる環境です。
729728:2010/01/26(火) 18:33:04
肝心な事が抜けていた。

sizeof出みると、ST1は8になって、ST2は12になります。
この違いを理解したいのです。
730デフォルトの名無しさん:2010/01/26(火) 18:45:02
>なぜcharが4バイト扱いになってるの?
「構造体全体のバイト数」が4の倍数でないと
配列にしたときにlongのアライメントがずれるから。
731デフォルトの名無しさん:2010/01/26(火) 18:47:15
>>728
配列を作ったときに、longのメンバが必ず4バイト境界に配置されるようにするためです
ST1では、longが4バイト、shortが2バイト、charが1バイトで、素直に合計すると7バイトですが、
配列として使う場合、各要素が7バイトですと、次の要素の先頭のlongが4バイト境界に配置されませんので、
空白を1バイト入れて全体を8バイトにします
ST2では、shortが2バイトでその次にlongがありますが、素直に並べるとlongが4バイト境界に配置されませんので
2バイト空けて4バイト境界に配置されるようにします
short2バイト、空白2バイト、long4バイト、char1バイトで合計9バイトですが、ST1の場合と同様、
配列として使う場合にlongが4バイト境界に配置されるように、3バイトの空白を入れて12バイトにします
732デフォルトの名無しさん:2010/01/26(火) 18:50:59
>>728
幅が四センチしかない短冊に、
上から順に詰めてシール張っていくような動作。
次のがはみ出るときは下に張り、
次のものがはみ出なければ続けて貼る。

printf("long %d\n", sizeof (long));
printf("short %d\n", sizeof (short));
printf("char %d\n", sizeof (char));
printf("%2d lsc %p %p %p\n", sizeof ST1, &ST1.l, &ST1.s, &ST1.c);
printf("%2d slc %p %p %p\n", sizeof ST2, &ST2.s, &ST2.l, &ST2.c);

long 4
short 2
char 1
8 lsc 0x403030 0x403034 0x403036
12 slc 0x403020 0x403024 0x403028
733デフォルトの名無しさん:2010/01/26(火) 18:53:42
#pragma pack(4) ならそうなんだろうけど
#pragma pack(8) で >>732 の詰めかたなんだよね

ヘルプの pack([n]) の説明がややこしー
734デフォルトの名無しさん:2010/01/26(火) 19:01:39
pack(8)でも8バイトアラインメントを要求するメンバ(doubleとか)がなければ一緒では
735デフォルトの名無しさん:2010/01/26(火) 19:09:58
>>728
大体説明され尽くしたけど、ここも参考になる。
http://www5d.biglobe.ne.jp/~noocyte/Programming/Alignment.html

ちなみに、VCの8バイトアライメントの設定は、ここでは影響しなかった。
char/short/longの標準のアライメントのサイズはそれぞれ1/2/4バイトで、
いずれも8より小さいためそちらが優先されるため。
http://msdn.microsoft.com/en-us/library/83ythb65.aspx
> Unless overridden with __declspec(align(#)), the alignment of a scalar structure member is the minimum of its size and the current packing.
> Unless overridden with __declspec(align(#)), the alignment of a structure is the maximum of the individual alignments of its member(s).

そう書いているうちに、>>734に先越されたけど。
736デフォルトの名無しさん:2010/01/26(火) 19:49:55
カラーの画像からの相関係数を求めようとしてるのですが、RGBの指定をどうすればいいのかお願いします
グレイスケール(PGM)での相関係数は出せました
737デフォルトの名無しさん:2010/01/27(水) 00:19:33
doubleで0から1mでの乱数を作るにはどうすればいいですか?
738737:2010/01/27(水) 00:22:01
すみません0から1までです。
739デフォルトの名無しさん:2010/01/27(水) 00:27:18
0〜10まで乱数作って1/10じゃダメなの?
740デフォルトの名無しさん:2010/01/27(水) 00:31:35
>>737
drand48()じゃだめなの?
741デフォルトの名無しさん:2010/01/27(水) 12:42:45
関数のsscanf,fscanfの先頭についてるsとfって何の略か教えてください
調べてもわかりませんでした
742デフォルトの名無しさん:2010/01/27(水) 12:47:16
sscanfは第一引数char *strから入力をもらうって事だからs
fscanfは第一引数FILE *streamから入力をもらうって事だからf
後者はfgetsとかでいろいろ使われてるな
743741:2010/01/27(水) 12:51:25
sがstringでfがfileっぽいですね・・・
無駄な書き込みすみませんでした
744デフォルトの名無しさん:2010/01/27(水) 17:50:56
char name[3][10]={"Aさん","Bさん","Cさん"}; のような名前リストを作る時

これを関数で参照渡ししたい場合は

void func(char *name[]);  という形ではダメなのでしょうか?違う場合どこが悪いのか
 または(char *name)    書き直していただけるとありがたいです。

また上記の関数内で、名前リストの、例えば Bさん を表示したい場合は
仮引数を利用して、どうやってBさんの要素を示せばよいのでしょうか?
わかりにくい説明で申し訳ありませんが、どなたかよろしければ指導お願いします。

745デフォルトの名無しさん:2010/01/27(水) 17:58:08
>>737
((double)rand() / ((double)RAND_MAX + 1))
746デフォルトの名無しさん:2010/01/27(水) 18:00:26
execv(2) を使いたいのですが、
execv(char *path, char **argv)
の第二引数を malloc() で作ってしまうと、execv() を実行したまま、戻ってこないため、free() できません。
こういうときは、malloc() しっぱなしですましてしまうものでしょうか?
747デフォルトの名無しさん:2010/01/27(水) 18:00:36
>>744
void func(char (*name)[10])
とか?
748デフォルトの名無しさん:2010/01/27(水) 18:36:46
>>744
以下のいずれか
void func(char (*name)[10])
void func(char name[][10])
void func(char name[3][10])

Bさんを表示したければ
printf("%s", name[1]);

もし void func(char *name[]) という形の関数に渡したいのなら
char *name[3]={"Aさん","Bさん","Cさん"};
とすればよい
749デフォルトの名無しさん:2010/01/27(水) 18:37:03
#include <stdio.h>
void func1(char name[3][10],int n){
int i;
for(i=0;i<n;i++)printf("%s\n",name[i]);
}
void func2(char (*name)[10],int n){
int i;
for(i=0;i<n;i++)printf("%s\n",*(name++));
}
void func3(char name[][10]){
int i=0;
while(name[i][0])printf("%s\n",name[i++]);
}
void func4(char (*name)[10]){
while(*name[0])printf("%s\n",*(name++));
}
int main(){
char name1[3][10]={"Aさん","Bさん","Cさん"};
char name2[4][10]={"Aさん","Bさん","Cさん",NULL};
func1(name1,3);
func2(name1,3);
func3(name2);
func4(name2);
return 0;
}

他にもあればよろしくです。
750デフォルトの名無しさん:2010/01/27(水) 19:00:15
>>746
細かいことは気にすんな。
少なくとも Windows, Linux, MacOS ではfreeしなくても問題は起きない。
751デフォルトの名無しさん:2010/01/27(水) 19:01:06
> for(i=0;i<n;i++)printf("%s\n",*(name++));

ばかにもわかるしーげんご?
752デフォルトの名無しさん:2010/01/27(水) 19:06:11
>>746
その場合はfreeする必要はないとおも。
forkした親プロセスは注意した方がいいけど。
753デフォルトの名無しさん:2010/01/27(水) 19:21:06
malloc -> fork -> exec の順なら、親プロセスはfreeしなくちゃならないけど、
fork -> malloc -> exec なら、気にしなくても良い。
vfork -> malloc -> exec だとめんどくさいけど、
今どきは vfork じゃなくて fork を使うべきだよね?
754デフォルトの名無しさん:2010/01/27(水) 19:25:55
char *name[] = {"Aさん","Bさん","Cさん"};

とすれば、関数側は

void func(char **name) {}

でもよい。
755デフォルトの名無しさん:2010/01/27(水) 19:57:51
>>754
関数側から要素数を調べる方法あります?
756デフォルトの名無しさん:2010/01/27(水) 20:01:16
>>755
ムリ。何らかの方法で渡す必要がある。
757744:2010/01/27(水) 20:05:49
返答してくださった方ありがとうございます。
提示された方法色々試してみます。
758デフォルトの名無しさん:2010/01/27(水) 20:07:00
>>756
thx
759746:2010/01/27(水) 20:23:19
>>750
>>752
>>753
感謝です。
760デフォルトの名無しさん:2010/01/27(水) 21:29:34
BOOL Huruhon( char*name )
{
if( !name )return FALSE;
if( !open( name ) )return FALSE;
if( !read(1) )return FALSE;
if( !read(2) )return FALSE;
close();
return TRUE;
}

上記のような場合open()の失敗まではreturn FALSE;でいいですが、
read()で失敗した場合close()してreturnしなければいけません。
ですが、いちいちif( !read() ){close();return FALSE;}
と、書くのは面倒ですよね。

かといってgoto使うのも、多段でif使うのもイマイチ。そこで下記のような書き方はどうなんでしょうか?

while( 1 ){
if( !name )return FALSE;
if( !open( name ) )return FALSE;
if( !read(1) )break;
if( !read(2) )break;
close();
return TRUE;
}
close();
return FALSE;
761デフォルトの名無しさん:2010/01/27(水) 21:32:00
>>760
その場合は do{ 〜 }while(0); を使う
762デフォルトの名無しさん:2010/01/27(水) 21:33:23
素直にフラグかgoto使えよ
763デフォルトの名無しさん:2010/01/27(水) 21:46:55
>>761
do - whileは全く使わないので忘れてました。
return入れ忘れてクルクル回る事がないし
そっちの方が良いですね。

>>762
フラグは値を保持するときなどの理由があるときならいいですけど必要なかったもので。
gotoはなるべく使わない方向ですね。

thx
764デフォルトの名無しさん:2010/01/27(水) 21:48:18
C言語で連想配列ってどうやるの?
不可変でおk
765デフォルトの名無しさん:2010/01/27(水) 21:54:20
文字列の配列のうち、インデックスとして指定された文字列が何番目にあるか検索。
真面目に実装するとツリーなりハッシュなりで高速化しないといけないが。
766デフォルトの名無しさん:2010/01/27(水) 21:55:34
そんなもんねーよ。
767デフォルトの名無しさん:2010/01/27(水) 22:08:23
if (!open(name)) return FALSE;
if (!read(1) || !read(2)) close();return FALSE;
close();
return TRUE;

ループ使わんでも↑だけでいいんじゃないの?
open()の仕様がわからんけど、name自体の判定せんでもopen()の成否で十分と勝手に想像。
768デフォルトの名無しさん:2010/01/27(水) 22:22:47
なんで goto ダメなんだろ?
フリーソフトウェアのソースとか読んでいると、例外処理で goto fail みたいなのをよく見るけどなぁ。

で、dだ先でclose()とかfree()してたり。
769デフォルトの名無しさん:2010/01/27(水) 22:25:38
初心者な質問で申し訳ないですが、
「独習C」で勉強してるのですが練習問題9.6の2について、
巻末の解答のプログラムはちゃんと動きますか?
770デフォルトの名無しさん:2010/01/27(水) 22:33:59
771760:2010/01/27(水) 22:37:22
>>767
>>760は改行多すぎるって怒られたんでシンプルに書きました。
結果をまとめるのもいいですね。
まとめることができない事の方が多いですけど。

>>768
ダメではないと思う。
でも、do - while見やすくて良い気がします。
成功はdoの中でreturn、失敗はbreak。
772デフォルトの名無しさん:2010/01/27(水) 22:42:35
Cでgotoだめという考えはもう古いよ。
773769:2010/01/27(水) 22:46:33
>>770
そこは見たのですがまだうまく動かなくて
コンパイルの時にエラーは出ないのですが、
目的の機能が備わってないと思うんです。
解答のコードで「if(ch==val)」の部分がダメなのかなと思ってますが、
独習C(第4版)を持っていて、誰か詳しい方はいませんか。
774デフォルトの名無しさん:2010/01/27(水) 22:48:06
>>768
gotoダメよってのは初心者向けの方便
でも、それを方便と見抜けない人たちに絡まれるのも面倒だから
使わないほうが吉。
775デフォルトの名無しさん:2010/01/27(水) 22:48:27
わけのわからない拘りが多すぎるよ

BOOL ret = FALSE;
if(name && open(name))
{
  if(read(1) && read(2))
    ret = TRUE;
  close();
}
return ret;
776760:2010/01/27(水) 23:11:27
>>775
いろいろ考えてくれてありがとう。
でも求めてた答えにシンプルで一番近いのが>>761なんだよね。
自分の中でdo - while( 0 )が流行りそうだ・・。
777デフォルトの名無しさん:2010/01/27(水) 23:18:22
do { } while(0);
は神が与えた構文。
778デフォルトの名無しさん:2010/01/27(水) 23:19:55
>>776
ちょ!
落ち着け!

詳しくは流れを追ってないので知らないが、
お前のセンスはなにかがおかしい。

人様には見られないところに書くソースならともかく
そうでないならやめとこうぜ。
779デフォルトの名無しさん:2010/01/27(水) 23:20:02
>>777
単に goto 禁止規約に対する対策
780デフォルトの名無しさん:2010/01/27(水) 23:21:38
>>776
> while( 1 ){
> if( !name )return FALSE;
> if( !open( name ) )return FALSE;
> if( !read(1) )break;
> if( !read(2) )break;
> close();
> return TRUE;
> }
> close();
> return FALSE;

ワロタw
781760:2010/01/27(水) 23:28:44
>>778
なにかまずい?
breakだらけになること以外にw
782デフォルトの名無しさん:2010/01/27(水) 23:49:27
>>781
do {} while (0); を嫌う人は一定数いる。
「ループするわけでもないのに do/while を使うな」だっけか<理由
783デフォルトの名無しさん:2010/01/27(水) 23:57:22
構造体って言うとクラスも知らない田舎者に思われますか?
784760:2010/01/28(木) 00:01:30
>>782
理由がそれのみなら使っても全然オッケーな気が。
何か問題があるなら使わないけど。

do{ // while( 0 )

ってコメント書いておこうか。
785デフォルトの名無しさん:2010/01/28(木) 00:10:41
漏れが昔、喜多見の国○学校のすぐ隣に住んでたから。

夕方、下校時間になるとJK達のガヤガヤ声がよく聞こえ、
あとからあとから湧きあがるほどのJK大群を目にしてた。
反対方向に道歩いてると肩がぶつかるほど
(それじゃ鰯だよ)

でも、今はどうか知らないが、
制服がイマイチ可愛くなかった気がする。

和泉多摩川は、
多摩川まで遊びに行った帰り(行きは歩いて帰りは疲れて小田急)
にしか利用したことないので女高見たことないし・・
(休日しか利用した事ないからか・・)
786760:2010/01/28(木) 00:14:52
PHPについて書いたサイトだけど、Cでのdo-while(0)について一言書いてあったので載せておきます。
ttp://www.k-sky.biz/php/control-structures.do.while.html

あがとうございました。
787デフォルトの名無しさん:2010/01/28(木) 00:26:04
do{}while(0)なんてマクロ中では使うけど
コード中に嬉しがって使うようなもんでもないだろ。
788デフォルトの名無しさん:2010/01/28(木) 00:29:38
この手の文法の穴をついたテクニックは業務では
嫌われる。同様に蛇蝎のように嫌われるのはマクロ。
コード保全を重視する業務現場ではコーディング
規約でdo while(0)や定数以外のマクロの使用や定義
が禁止が明文化されているところも多いね。
789デフォルトの名無しさん:2010/01/28(木) 00:30:24
emacsが
switch () {
case x:
{
}
}
だと、ちゃんとインデントしてくれないのだ。
do {
} while();
だと、インデントしてくれるのだ。
emacsの設定に時間をかけたくないから、これでいいのだ。
790デフォルトの名無しさん:2010/01/28(木) 00:34:12
case XXX:の後に{}を付けることがアブノーマル
で多分Cでは出来ない。C++なら可能。
caseはラベルに過ぎず(但しgotoで何故か飛べない)
switch内のコードは同一インデントレベルでシーケンス
を為している。
791デフォルトの名無しさん:2010/01/28(木) 00:52:15
文を書けるところにブロックを書く事は文法上正しい。
変数のスコープを限定するために使用する。
792デフォルトの名無しさん:2010/01/28(木) 01:49:42
にも関わらずCでは禁止されているので
このスレ的には、変数のスコープを細かく
制御する目的で{ } を乱立することを許す
文法は邪道であるという立場になるか...
793デフォルトの名無しさん:2010/01/28(木) 01:56:34
mallocでええやん
main(){
int sexsex;
{
int sex;
}
}
こんなんなら
#define length(x) sizeof(x)
main(){
int* sex, sexsex;

sex=malloc(length(sex));

free(sex);
}
の方が読みやすい
794デフォルトの名無しさん:2010/01/28(木) 02:55:41
sexよりmankoの方がやる気が出る
795デフォルトの名無しさん:2010/01/28(木) 03:45:16
>>792
switch の中のブロック文は禁止されてた?
gcc しか使ってないから知らないんだが、
どのコンパイラだとダメとか分かれば教えて欲しい
796デフォルトの名無しさん:2010/01/28(木) 07:45:33
ものすごく初歩的なことなんですが、疑問に思ったので質問させてください

C言語でint *p;と宣言したあとpに何も代入せずに
scanf("%d", p);などとしてpを使っていいのでしょうか?
それともint a;と宣言してp = &a;としてからではないといけないのでしょうか?
797デフォルトの名無しさん:2010/01/28(木) 07:54:15
>>792
いや、禁止されていない。 {} は好きなところで使える。
798デフォルトの名無しさん:2010/01/28(木) 08:32:42
>>796
pの指した場所がどうなっているか考えたら答えは出る。
799デフォルトの名無しさん:2010/01/28(木) 08:32:46
>>796
だめだお
初期化してないpはどこを指してるか不定だから
800デフォルトの名無しさん:2010/01/28(木) 09:04:06
>>792
そんな規約どこに書いてある?
801デフォルトの名無しさん:2010/01/28(木) 09:24:45
do - while (0) は、ループの中で例外が発生したり、switch で例外条件を判定する場合には使えないんだよな。
if をあとで switch に変えたいときに困る。
802デフォルトの名無しさん:2010/01/28(木) 11:11:13
>>797
使えるとしても意味はない。使えるとして...
if( contditional ) {{{{{
........
}}}}}

と書くのは趣味の問題ということになる。
803デフォルトの名無しさん:2010/01/28(木) 12:16:22
>>802
つまり、規約で禁止されていないのに

>>792
> にも関わらずCでは禁止されているので
といってたわけ?
804デフォルトの名無しさん:2010/01/28(木) 13:14:08
Cでは禁止されていないし、そのような書き方を普通にするのに、Emacsのマクロがうまくインデントしてくれないってことだろ。
805デフォルトの名無しさん:2010/01/28(木) 13:21:24
switch(xxxx){

case CASE1:{

}
case CASE2:{

}
}
という書き方はしないだろ
見た目と挙動の間にズレが出るから。
806デフォルトの名無しさん:2010/01/28(木) 13:23:56
初心者なら質問の体裁を整えてからレスしてください。
807デフォルトの名無しさん:2010/01/28(木) 13:29:40
>>805
俺は特にズレないんだが、見た目でどうなると思い、どう挙動したかを教えてくれないか
808デフォルトの名無しさん:2010/01/28(木) 13:30:09
http://pastebin.com/d1e037fc9
5,7行目は我慢するとして、8行目と12行目のインデントが
異なるのがどうしてもイヤだ。
809デフォルトの名無しさん:2010/01/28(木) 14:04:27
PASCAL(Dlephi)だと例えば
var i:integer;
case i of
1:begin ..... end;
2:begin .... end;
else begin ... end;
end;
ラベルから後ろのbegin ... endが{ }に対応だが
一つのbegin ... end;が実行されたら他は実行されないことが
保証される点でCとは異なる。
Cの{ }は配列初期化子などに用いられるケースもあるけど大体において
排他的実行される処理を意味してて、switch文のように
必ずしも排他的とは言えない処理に使用するのは何だかな〜って感じ
810デフォルトの名無しさん:2010/01/28(木) 14:06:36
0か1を出力する乱数を作るにはどうすればいいですか?
811デフォルトの名無しさん:2010/01/28(木) 14:07:44
またか
812デフォルトの名無しさん:2010/01/28(木) 14:13:12
rand()%2
813デフォルトの名無しさん:2010/01/28(木) 14:23:47
ありがとう
814デフォルトの名無しさん:2010/01/28(木) 15:12:29
こうしなさいって宿題スレで教わった

rand() / (RAND_MAX / 2 + 1)
815デフォルトの名無しさん:2010/01/28(木) 15:13:15
>>808
http://pastebin.com/m288a246a
うちのエディタに整形させるとこうなった
816デフォルトの名無しさん:2010/01/28(木) 15:43:10
>>805の書き方、case内に宣言した変数でコンパイルエラーになるのを避けるために俺はちょくちょくやってるな
817デフォルトの名無しさん:2010/01/28(木) 16:24:48
>>816
実はおれもそうしてる。
818デフォルトの名無しさん:2010/01/28(木) 17:56:02
#include <stdio.h>
int main(void){
int i=1;
{
int i=i+1;
printf("%d¥n",i);
}
return 0;
}
今日試験で出た問題です。
この出力結果を教えて下さい。
携帯で打ち込みました。
PCを持っていません。
819デフォルトの名無しさん:2010/01/28(木) 17:59:22
>>818
2
実行させてみては無いけど。
820デフォルトの名無しさん:2010/01/28(木) 18:03:20
>>812
多分うまくいかない。正解は >>814
821デフォルトの名無しさん:2010/01/28(木) 18:06:41
そんな問題出るわけないだろ。未定義。
822デフォルトの名無しさん:2010/01/28(木) 18:10:13
良質な乱数が欲しかったら素直にMT使った方がいい
823デフォルトの名無しさん:2010/01/28(木) 18:16:01
>>818
うちで実行したら 2281481 だったよ
824819:2010/01/28(木) 18:21:46
>>818
ごめん、そういうことか。
gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
でコンパイルして実行させたら、
1628447137
になった。
825デフォルトの名無しさん:2010/01/28(木) 18:23:06
826デフォルトの名無しさん:2010/01/28(木) 18:29:57
C++は兎も角
Cでは構文にぶら下がってない{ }はまだしも
その中で変数が宣言できるという甘言には
うかつに乗らないほうがいいような気がしてきた
827デフォルトの名無しさん:2010/01/28(木) 18:30:53
>>818
bcc32で実行したら2だった
printf("%d\n",i);
printf("%d\n",i);
と2行続けると
2147348481
2147348481
になった
828デフォルトの名無しさん:2010/01/28(木) 18:32:05
>>826
いやいや、好きな場所で { } を使っても大丈夫。昔からそうです。>>818 は定義と初期化を一緒にするから危ういのであって、昔の C の流儀に従えば間違いありません。
829デフォルトの名無しさん:2010/01/28(木) 18:34:40
>>818が問題なのは初期化されていない変数の値を使ってることでしょ。
#include <stdio.h>
int main(void){
int i=i+1;
printf("%d\n",i);
return 0;
}
問題の質はこれと一緒。
830デフォルトの名無しさん:2010/01/28(木) 18:38:20
>>829
少しでもまともなコンパイラならコンパイルエラーまたは
重大な警告を出すだろ。そのコードは。
>>818のコードの場合、状況からして意味的には外側のブロックの
iを指しているとしか解釈しようがないがどうしても
内側のi自身であるとしたい向きもあるようだ。
831デフォルトの名無しさん:2010/01/28(木) 18:40:58
> 少しでもまともなコンパイラならコンパイルエラーまたは
> 重大な警告を出すだろ。そのコードは。

そうなんw 見てみたいね。
gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
でオプション無しでコンパイルした限りは、
それはそれは静かなものだった。
832デフォルトの名無しさん:2010/01/28(木) 18:46:09
コンパイラの実装のバグだろといいたくなるような挙動だな
正しく動くかエラーではじくかどっちかにしろよ
833デフォルトの名無しさん:2010/01/28(木) 18:49:01
gccのオプション無しはわりと静か
-Wall -Wextra -pedantic を付けよう
-Werror も付ければ警告もエラー扱いになって実行ファイルが生成されなくなる
834デフォルトの名無しさん:2010/01/28(木) 18:51:56
GCCは良心的で非常に優れているがオプソという制約から
レアな細かい部分の対応には自然に限界があるだろ。
(対応するとコード量が爆発して誰も手がつけられなくなる)
835デフォルトの名無しさん:2010/01/28(木) 18:52:49
>>833
gcc -Wall -Wextra -pedantic -Werror 59-829.c
でもやっぱり何のエラーも、警告も無しのまま。
836デフォルトの名無しさん:2010/01/28(木) 18:58:34
>>835
いま info gcc を読んだところによれば、-O も付けないと警告してくれないらしい
837デフォルトの名無しさん:2010/01/28(木) 19:01:24
>>836
情報サンクス! 出ました!

$ gcc -O -Wall -Wextra -pedantic -Werror 59-829.c
59-829.c: In function `main':
59-829.c:3: warning: 'i' might be used uninitialized in this function
838818:2010/01/28(木) 19:46:41
みなさまありがとうございました
結論は殆どのコンパイラでまともに対応していない
ということですね。了解しました。
839デフォルトの名無しさん:2010/01/28(木) 20:15:35
ちげーよ。
文法上は正しいので、エラーにならずコンパイル出来る事には問題ない。
動作は未定義。
840デフォルトの名無しさん:2010/01/28(木) 20:17:04
int i = i + 1;

int i;
i = i + 1;
と昔風に書けばおかしいことはすぐわかると思うんですけれどもね。
規格ではどうなっているのでしょうかね。
841デフォルトの名無しさん:2010/01/28(木) 20:25:50
>>820
rand() % 2
がうまくいかない理由を教えて
842デフォルトの名無しさん:2010/01/28(木) 20:30:07
843デフォルトの名無しさん:2010/01/28(木) 20:48:07
変数宣言:変数型 変数名 初期化子;

初期化子:=その時点で「見える」同一型の変数、定数で構成される式
あとは略

文法上正しくエラーとはしてはならないのが>>818のコード
結果も2出力でなければおかしい。
そもそも
main(){
int i=i+1;
...
がコンパイルが通ることがおかしい。
844デフォルトの名無しさん:2010/01/28(木) 20:51:22
>>843
>その時点で「見える」
の意味合いにかかっているといえますね。
規格ではどうなっているのでしょうかね。
845デフォルトの名無しさん:2010/01/28(木) 20:52:17
おかしい? だが俺はgccを信じるねw
846デフォルトの名無しさん:2010/01/28(木) 20:53:05
>>840
H&Sを読み解くに……宣言子が終わった時点で、その識別子が有効になる
その後、初期化子が続くが、
初期化子の中でたった今宣言した宣言子を使うことは許される

つまり
int i =i+1;
  ^
この時点で内側のブロックの変数 i が有効になり、
外側の i はシャドウされて見えなくなる
その後の初期化子の i は内側の i だから、不定値に1を足した値が i となる
847デフォルトの名無しさん:2010/01/28(木) 20:53:20
848デフォルトの名無しさん:2010/01/28(木) 20:54:25
×初期化子の中でたった今宣言した宣言子を使うことは許される
○初期化子の中でたった今宣言した識別子を使うことは許される
849デフォルトの名無しさん:2010/01/28(木) 20:57:21
確認したいが、
>>846
> その後の初期化子の i は内側の i だから、不定値に1を足した値が i となる
このケースでは、
不定の値ではあるが、
それを利用して演算をしてしまったがために
未定義の動作だよね?
850デフォルトの名無しさん:2010/01/28(木) 21:01:42
>>842
ありがと。
質のいい乱数が欲しい場合は、rand() % 2 は回避したほうがいいんだね。
質のいい乱数とはどんな乱数なのか?は理解できなかったけどw
851デフォルトの名無しさん:2010/01/28(木) 21:03:20
>>850
rand() % 0の場合は010101の規則的なパターンしかでないとか聞いたことが…。
規則的な乱数は、質の悪い乱数の一例かと。
852デフォルトの名無しさん:2010/01/28(木) 21:04:07
おっとrand() % 2ね。
853デフォルトの名無しさん:2010/01/28(木) 21:06:00
rand()%N派だが一度も困ったことはない
はい論破完了
854デフォルトの名無しさん:2010/01/28(木) 21:08:01
>>849
>> その後の初期化子の i は内側の i
かどうかにかかっており、これが、規格にどう書かれているのでしょうかね。私も gcc のインプリメントが正しそうな気が。
855デフォルトの名無しさん:2010/01/28(木) 21:09:30
>>853
あなたのお使いの rand() が運良く優れているものだったか、それとも rand() % N の質の悪さに気がつかなかったかのどちらか。
C FAQ の権威をご存知ないのでしょうか?
856デフォルトの名無しさん:2010/01/28(木) 21:13:58
>>855
自分の使ってるコンパイラで rand()%2 の出力を調べてみた?
857デフォルトの名無しさん:2010/01/28(木) 21:15:35
>初期化子の中でたった今宣言した識別子を使うことは許される
これってそもそもバグじゃね?W
858855:2010/01/28(木) 21:20:21
>>856
シミュレーションの際、rand() % N, あるいは rand() そのものの性質が悪く、別の擬似乱数器をインプリメントしたことがあります。
859846:2010/01/28(木) 21:24:00
>>849
あ〜そうだったかも
正直よく覚えてなかった。不適切な記述で申し訳ない
860デフォルトの名無しさん:2010/01/28(木) 21:30:59
>>857
初期化子には式を書くことが出来る。
iは宣言済みなので式に使用する事が出来る。問題ない。

int i = sizeof(i);
861デフォルトの名無しさん:2010/01/28(木) 21:32:19
(i)
862デフォルトの名無しさん:2010/01/28(木) 21:34:03
sizeofは不当に優先順位が高いので、常に()を使う事にしているのだ。
863デフォルトの名無しさん:2010/01/28(木) 21:36:02
>>860によると
int *omnk=(int*)&omnk[123456];
これも正しくコンパイル出来るみたい
864デフォルトの名無しさん:2010/01/28(木) 21:38:32
auto な変数に初期化子を置くこと自体、ちょっと抵抗を感じてしまうのは、単に私が古いせい?
865デフォルトの名無しさん:2010/01/28(木) 21:48:04
>>860
これは良い例え。
866デフォルトの名無しさん:2010/01/28(木) 21:50:26
>>864
うむ。
昔の時代のプログラミングだとか一人プロジェクトだとかならさておき、
そうでないなら基本的に「現代の方針」に従わないって
訳にはいくまい。

あれだ、歯の磨き方と同じ。
867デフォルトの名無しさん:2010/01/28(木) 22:49:22
>>864
うん。
最近は初期化抜けを防止するために、初期化必須にする場合もある。
「デバッグビルドで動くけど、リリースビルドだと動かない。コン
パイラがおかしい」などという戯言を低減させる効果がある
868デフォルトの名無しさん:2010/01/28(木) 22:51:17
int input[3]={0};
input[3]=1,1,1};

とはできないんですか?
869デフォルトの名無しさん:2010/01/28(木) 22:59:49
出来ない。
870デフォルトの名無しさん:2010/01/28(木) 23:03:08
>>869
ありがとうございます
input[3]={0};

input [3]={1,1,1};
にしたいときはどうすればできますか?
871デフォルトの名無しさん:2010/01/28(木) 23:33:38
int input[3] = {1,1,1};
↑これは出来る。

int input[3] = {0};
input[3] = {1,1,1};
↑これは出来ない。
872デフォルトの名無しさん:2010/01/28(木) 23:42:12
int input[3]={0};
int _input[3]={1,1,1};
input=_input;

これはおk?
873デフォルトの名無しさん:2010/01/28(木) 23:44:39
なぜ試さない
874デフォルトの名無しさん:2010/01/28(木) 23:47:37
なぜ試す
875デフォルトの名無しさん:2010/01/28(木) 23:47:56
流れ予想。
なぜ試さない→手元に環境がありません→codepad で試せ
876デフォルトの名無しさん:2010/01/29(金) 00:02:39
>>875
codepad ってどこですか→ggrks
877デフォルトの名無しさん:2010/01/29(金) 00:03:38
> 9899:1999 6.2.1p7
> (前略) Any other identifier has scope that begins just after
> the completion of its declarator.
って書いてあって構文上 declarator と initializer が別れてるんで(T declarator = initializer の形)、
initializer の中でその直前の名前が見える、で良さそう。
878デフォルトの名無しさん:2010/01/29(金) 00:14:53
>>872
試すまでもなく無理。
memcpy(input, _input, sizeof input);
しとけ。

そういや C99 だと
memcpy(input, (int[]){1, 1, 1}, sizeof input);
とかできるんだっけ?
879超低脳ぷ:2010/01/29(金) 00:15:09
あのね、
ネットで送られてくるビッグエンディアンのunsigned long(32bit) データ(データ名big_ulong)が
構造体のメンバのunsigned short(16bit)配列、unsigned short ulong_data[2]に
格納されているんです
どう、格納されているかと言うと
memcpy( kouzotai.ulong_data, &big_ulong, 4); てな感じ
kouzotai.ulong_dataを、処理CPUのエンディアンのunsigned long(32bit)に変換するコードって
どう書くの? 戻り値はリトルCPUならリトル、ビッグCPUならビッグのunsigned long

unsigned long UlongHenkan( unsigned short ulong_data[2] ) {
?????
return xxxxx;
}
880デフォルトの名無しさん:2010/01/29(金) 00:16:46
数値計算のプログラム組んでるんだけど
マルチスレッド対応させるにはどうすれば?
CygwinでGCCなんだけど商用のコンパイラ買わないといけないの?
881デフォルトの名無しさん:2010/01/29(金) 00:24:16
>>879
(unsigned long)ntohl(ulong_data[0] << 16 | ulong_data[1])
882デフォルトの名無しさん:2010/01/29(金) 00:56:32
>>880
とりあえずOpenMPでも使えばいいと思うよ。
883超低脳ぷ:2010/01/29(金) 00:57:29
>>881
ntohlがない見たいなの
ntohlやntohsの実装ソースコードください、できればhtons,htonlも
お願いします、ペコリ
884デフォルトの名無しさん:2010/01/29(金) 17:16:52
二次元配列の動的確保の話なんだが
連続性を保ったままa[i][j]の構文でアクセスできるような方法はない?
885デフォルトの名無しさん:2010/01/29(金) 17:27:08
連続性を保ったまま ってのは (大きさを NxM として)
 &a[i][M] == &a[i+1][0]
これだけじゃなくて

 (void *)a == (void *)&a[0][0]

これも必要両方なの?
886デフォルトの名無しさん:2010/01/29(金) 17:55:05
そうです
887デフォルトの名無しさん:2010/01/29(金) 18:25:19
fortran使え
888デフォルトの名無しさん:2010/01/29(金) 18:27:11
fortranの配列はクールですよね
889デフォルトの名無しさん:2010/01/29(金) 18:28:53
>>884
http://www.kouno.jp/home/c_faq/c6.html#16
これをみる限り無いと思う。
890デフォルトの名無しさん:2010/01/29(金) 18:51:30
>>884
二次元配列じゃなくて、マクロを使うのではダメなの?
891デフォルトの名無しさん:2010/01/29(金) 19:21:38
>>889 に載ってる配列へのポインタじゃだめなの?
892デフォルトの名無しさん:2010/01/29(金) 22:30:20
処理Aが正常終了しないと処理Bを処理してはいけないという場合に

if(処理A == 成功)
{
    if(処理B == 成功)
    {
         正常処理;
    }
    else
    {
         エラー処理;
    }
}
else
{
     エラー処理;
}

上のコードのエラー処理が同じなのでひとつにまとめたいんですが、どうすればいいでしょうか?
893デフォルトの名無しさん:2010/01/29(金) 22:33:10
&&
894デフォルトの名無しさん:2010/01/29(金) 22:36:30
goto
895デフォルトの名無しさん:2010/01/29(金) 22:43:27
setjmp, longjmp
896デフォルトの名無しさん:2010/01/29(金) 22:50:14
エラー処理を関数にする
897デフォルトの名無しさん:2010/01/29(金) 22:58:14
>>892

処理A、処理Bが成功時に0を返す‥という前提なら

int ret;

ret = 処理A;

if(ret == 0)

  ret = 処理B;
}

if(ret == 0)

  正常処理;

else

  エラー処理;


とか?
898デフォルトの名無しさん:2010/01/29(金) 23:20:37
俺としてはっちゅー話だけど。
安易にフラグ使うプログラミングは、オススメ出来ないなぁ・・・
899デフォルトの名無しさん:2010/01/29(金) 23:26:45
if(処理A == 成功 && 処理B == 成功)
{
     正常処理;
}
else
{
     エラー処理;
}
900デフォルトの名無しさん:2010/01/29(金) 23:31:50
&&かgotoだな
それか関数にして
sub(){
if(処理A!=成功){
エラー処理;
return 〜;
}
if(処理B!=成功){
エラー処理;
return 〜;
}
return 〜;
}
とか。

大差ないから具体例が欲しいね
901デフォルトの名無しさん:2010/01/30(土) 00:15:55
if(A() && B())

これはA()が偽の場合B()の評価がスキップされることは保障されてるんですか?
保障されてるならそれでいいんですが・・・
902デフォルトの名無しさん:2010/01/30(土) 00:21:55
>>901
アンケート?
903デフォルトの名無しさん:2010/01/30(土) 00:27:53
>>901
されてるよ
904デフォルトの名無しさん:2010/01/30(土) 00:28:48
されてるよ
つーか気になるなら規格票読めよ
905デフォルトの名無しさん:2010/01/30(土) 00:28:53
本当に?最適化を許してるだけじゃなくて?
906デフォルトの名無しさん:2010/01/30(土) 00:32:26
907デフォルトの名無しさん:2010/01/30(土) 01:06:05
ショートサーキットくらい、どんなウンコな入門書でも解説されてるだろ。
908デフォルトの名無しさん:2010/01/30(土) 01:13:09
>>898
フラグよりgoto使った方がいいのでしょうか
909デフォルトの名無しさん:2010/01/30(土) 01:17:07
>>908
大差ないからつまらん事にこだわらない方がいいよ。
大事なのは一貫性を持たせること。
910デフォルトの名無しさん:2010/01/30(土) 01:54:14
行数を文字列リテラルに展開するマクロってないのかな
数値リテラルより文字列のほうが使いやすいよねこれ
911908:2010/01/30(土) 01:56:41
>>909
なるほど。有り難う御座います
912デフォルトの名無しさん:2010/01/30(土) 05:39:07
>>910
boostのBOOST_PP_STRINGIZEあたりを使えば可能。
まぁC++のライブラリだしとりあえず本質部分だけ示すとこんな感じ

#define STRINGIZE_(s) #s
#define STRINGIZE(s) STRINGIZE_(s)
puts( STRINGIZE(__LINE__));
913デフォルトの名無しさん:2010/01/30(土) 06:54:59
つらつら考えてみたけど >>892 のフローてあり得ないんじゃないか
yB()は一体何を始末してるんだ?

if(A()){xA();if(B())xB();else yB();yA();}else yB();

914デフォルトの名無しさん:2010/01/30(土) 09:14:35
>913

別に普通にあるんじゃね。
Aが実行できてないし、Bは実行されていないから
AもBも実行できなかった場合の始末でしょ。
915デフォルトの名無しさん:2010/01/30(土) 09:17:25
いいけど、goto使うに比べてわかりにくい。
916デフォルトの名無しさん:2010/01/30(土) 09:22:22
>884

mallocが確保する領域は、連続していることは保証されている。
↓でやりたいことじゃないの?
int (*p)[N] = malloc(int [M][N]);

C FAQでは下のように書いて、「恐怖感を与える」なんて書いている。
だけど本質は前述と同じ。
int (*array4)[NCOLUMNS] = (int (*)[NCOLUMNS])malloc(nrows * sizeof(*array4));

プロトタイプ宣言を見ればわかるが、malloc自体は型なんて全く気にしていない。
単に引数で与えられたサイズの領域を確保して返してくれるだけ。
その領域にどういうやりかたでアクセスするかは、呼び出し側で決める必要がある。
917デフォルトの名無しさん:2010/01/30(土) 09:25:37
>913 >915

gotoの方が読みやすいのは自分もそう思う。
だけど仕事でやってると、goto禁止されているから
そういう書き方になっちゃう。

もうgoto見たとたんに、「書き直せ」なんだよな。
918デフォルトの名無しさん:2010/01/30(土) 09:26:56
>>914
それだと913のyA()の役割が説明されてないよ

(A()&& (xA(),B()&&(xB(),true) )|| yB();
919914:2010/01/30(土) 10:34:11
>918 >913

いやその説明を私に求められても困るんだが。
>918さんが何を問題にしたいか、わからないんだけど。

問題にしているのはyBであって、yAについては
Don't careでしょ。

元ネタの>892にはyAにあたる部分は空白だしね。

A()が真でB()の処理結果にかかわらず、実行する処理
がyA()だけど、聞きたいことはそういうことじゃないよね?
920デフォルトの名無しさん:2010/01/30(土) 11:23:05
すげぇ
goto論争ってまだやってんだw
嫌goto厨って実戦で悪手なgotoの使い方に遭遇したことあるんだろうか。
そういう世代ってそろそろ引退のお年頃って気がするけど。
921デフォルトの名無しさん:2010/01/30(土) 11:29:29
>>920
別に嫌goto論者は現れていないようですが。
922デフォルトの名無しさん:2010/01/30(土) 11:30:59
>>920
gotoに反応してるのはおまいだけのようですが
923デフォルトの名無しさん:2010/01/30(土) 11:36:58
見えない敵と戦っている人がいます。
きっと病気ですから、このスレから立ち去ることをお勧めします。
924デフォルトの名無しさん:2010/01/30(土) 11:37:37
#define goto switch(0){case
925デフォルトの名無しさん:2010/01/30(土) 14:08:17
CはPASCAL系よりはgotoに関しては寛容だとオモ
ラベルは宣言無しに重複しない限り勝手に定義出来るし..
(直後が空文はだめだけど)
PASCAL系の場合はlabel宣言してからじゃないと使えない。
926デフォルトの名無しさん:2010/01/30(土) 14:45:44
>>919
うむ。
BOOL A(){BOOL r=〜;if(r)xA();return r;}; // A()に関わる処理が xA() だけでよいのなら

if(A()&&B())xB();else yB(); // yB()重複の疑問が出てくる理由が無い


yB
xB yA
yB yA // 三態にBOOLなら足りまへんとなるが yA()に先んづる必要のある yB()って何なの?と
927デフォルトの名無しさん:2010/01/30(土) 16:15:56
そんな大層な話じゃなかんべ。
&&がショートサーキットと知らんかっただけじゃ?
928デフォルトの名無しさん:2010/01/30(土) 16:32:39
#include <stdio.h>
#define larger(x, y) (((x) > (y)) ? (x) : (y))
#define smaller(x, y) (((x) < (y)) ? (x) : (y))
int main(void)
{
int x[] = {6, 10, 4, 1, 3, 9, 11, 3, 20, 3, 4, 4, 6, 3, 2};
int n = sizeof x / sizeof x[0];
int i, max, min;
max = min = x[0];
for (i = 1; i < n; i++) {
max = larger(max, x[i]);
min = smaller(min, x[i]);
}
printf("最大値= %d\n", max);
printf("最小値= %d\n", min);
return 0;
}

というプログラムのint n = sizeof x / sizeof x[0];はなにを意味しているのですか?
929デフォルトの名無しさん:2010/01/30(土) 16:34:28
配列の大きさを計算している
930デフォルトの名無しさん:2010/01/30(土) 16:45:34
より正確に言うと配列の要素数な

sizeof x == 配列全体のバイト長
sizeof x[0] == 配列の要素1つ分のバイト長
931デフォルトの名無しさん:2010/01/30(土) 22:34:43
下記コードを実行すると、-79が出力されます。unsignedなのに何故、マイナス値になのでしょうか?

void main() {
unsigned int a = 'ア';

printf("%d", a); /*=> -79 */
}
932931:2010/01/30(土) 22:36:41
BCC5.5での結果です。
933デフォルトの名無しさん:2010/01/30(土) 22:38:32
>>931
%u じゃないから
934デフォルトの名無しさん:2010/01/30(土) 22:52:13
>>933
%uにしたら4294967217というえらいどでかい数値になりました。。。
935デフォルトの名無しさん:2010/01/30(土) 23:02:08
>>934
正数になったから満足だろw
936デフォルトの名無しさん:2010/01/30(土) 23:06:25
4294967217=0xffffffb1
アの文字コード=0xb1

どうして上位が1で埋められるんだろう
937デフォルトの名無しさん:2010/01/30(土) 23:14:01
>>936
-79 だからだろ
938デフォルトの名無しさん:2010/01/30(土) 23:17:36
>>931
printf("%d",a)は
printf( (const char*)"%d",(char*)(int)(signed char)a);
と翻訳されている。
"%u"指定の場合、printf文の中で
(unsigned int)(int)(char*)という型変換が連続的に
行われこのような結果を起こす。
939デフォルトの名無しさん:2010/01/30(土) 23:20:19
>>938
これはひどいバカ
940デフォルトの名無しさん:2010/01/30(土) 23:25:55
ほんとだw
キャストを徹底的に誤解してるw
941デフォルトの名無しさん:2010/01/30(土) 23:36:06
て言うか全部間違えてる
942デフォルトの名無しさん:2010/01/30(土) 23:47:19
符号ありなら最上位ビットがコピーされて符号拡張されるのはわかるけど、符号なしなら
0x0000001bになるんじゃないの?
943デフォルトの名無しさん:2010/01/30(土) 23:56:36
'ア'がchar型だと思ってるやつはいないよな?
944デフォルトの名無しさん:2010/01/30(土) 23:58:00
>>942
#include<stdio.h>

int main(void){
unsigned int x;

x=-79;
printf("%u\n", x);
x=(unsigned char)-79;
printf("%u\n", x);
x=(unsigned short)-79;
printf("%u\n", x);
x=(unsigned int)-79;
printf("%u\n", x);
x=(unsigned long)-79;
printf("%u\n", x);

return 0;
}
945デフォルトの名無しさん:2010/01/30(土) 23:59:42
>>943
コンパイラは char だと思っているかも知れない
946デフォルトの名無しさん:2010/01/31(日) 00:00:55
>>945
規格無視もいいとこの糞処理系だな
947デフォルトの名無しさん:2010/01/31(日) 00:12:26
>>946
Shift-JISなら半角カナはchar。
Windowsは、クソとかいいそ。
948デフォルトの名無しさん:2010/01/31(日) 00:15:54
>>947
C言語の規格を読み直せ
character literalはint型だ
949デフォルトの名無しさん:2010/01/31(日) 00:18:54
おお。すまん。だから、caseに書けるんだったな。
950デフォルトの名無しさん:2010/01/31(日) 00:21:25
半角カナってsizeof(char)*1かつマイナスで、意味がわからなくなったから全部ワイド文字で扱うようにした
951デフォルトの名無しさん:2010/01/31(日) 00:22:05
>>949
???
952デフォルトの名無しさん:2010/01/31(日) 00:22:46
>>948
MinGW だと 'ア' の値が
コンパイルオプションで変化する
sizeof('ア') は 4 だけどね

-fsigned-char
-funsigned-char
953デフォルトの名無しさん:2010/01/31(日) 00:23:04
#if '0xFF' == 0xFF
# error 変なコンパイルオプションつけてんじゃねーよ
#endif
954デフォルトの名無しさん:2010/01/31(日) 00:23:52
#if '\xFF'
だた
955デフォルトの名無しさん:2010/01/31(日) 00:37:35
>>952
それってバグじゃね?
956デフォルトの名無しさん:2010/01/31(日) 00:41:24
'ア'は処理系によって-79になったり177になったりするんですか?
957デフォルトの名無しさん:2010/01/31(日) 00:44:08
>>956
コンパイラにもよるしコンパイルオプションにもよるし文字コードにもよる
958デフォルトの名無しさん:2010/01/31(日) 00:49:03
>>957
d
959デフォルトの名無しさん:2010/01/31(日) 00:57:43
(float)Math.random()-0.5f;
をCに直すとどうなりますか?
960デフォルトの名無しさん:2010/01/31(日) 00:59:35
>>955
VC++なら/J
BCCなら-K
をつけて試してから言え
961デフォルトの名無しさん:2010/01/31(日) 01:02:00
>>959
(float)((double)rand()/RAND_MAX-0.5)
962デフォルトの名無しさん:2010/01/31(日) 01:06:11
>>961
ありがとうございます。
0から0.5までの乱数を作っていると考えていいのですか?
963デフォルトの名無しさん:2010/01/31(日) 01:08:48
>>962
[-0.5 , +0.5] のつもり
964デフォルトの名無しさん:2010/01/31(日) 01:39:03
0から0.5じゃ中途半端すぎるだろ・・・
965デフォルトの名無しさん:2010/01/31(日) 01:41:56
>>964
なんで?
0<=x<0.5を使うことあるだろ
966デフォルトの名無しさん:2010/01/31(日) 01:44:35
>>963
ありがとうございます。
最後に0から9までの整数の乱数を作るときは
((int)rand()/RAND_MAX+10);
であっていますか?
967デフォルトの名無しさん:2010/01/31(日) 01:46:44
>>966
それだとほとんど 10、稀に 11 が出る
968デフォルトの名無しさん:2010/01/31(日) 01:48:13
(int)(rand() / (RAND_MAX + 1.0) * 10);
969デフォルトの名無しさん:2010/01/31(日) 01:50:44
((double)rand()/RAND_MAX)

なんか、↑これで[0.0, 1.0]ということが理解できてなさそうだな
970デフォルトの名無しさん:2010/01/31(日) 01:54:53
>>967-969
ありがとうございます。
((double)rand()/RAND_MAX)
で0-1だからそれを10倍して0-10になるんですね
971デフォルトの名無しさん:2010/01/31(日) 01:59:10
>>970
まず関数のリファレンスに当たった方が良い
972デフォルトの名無しさん:2010/01/31(日) 02:47:08
割り算なんてクソ遅いのに 割り算使うやつはド素人
973デフォルトの名無しさん:2010/01/31(日) 02:49:20
そこは自称プロ(笑)なら除算って書いとこうぜ
974デフォルトの名無しさん:2010/01/31(日) 02:59:57
割り算は/0例外起きるから嫌い
975デフォルトの名無しさん:2010/01/31(日) 03:04:34
[0.0, 1.0]の乱数を求めるのに除算を使わないでどう書くの?
976デフォルトの名無しさん:2010/01/31(日) 03:16:15
>>972
FPUの無いアーキテクチャはかわいそうだね
977デフォルトの名無しさん:2010/01/31(日) 05:01:20
>>972
/2や/4を>>1とか>>2とか書いちゃうかわいそうな人
978デフォルトの名無しさん:2010/01/31(日) 05:24:44
>>977
>>と全角で書けばアンカーと認識されないと思ってるかわいそうな人
979デフォルトの名無しさん:2010/01/31(日) 05:32:09
read.cgiの仕様からして全角はアンカーミスです。デイファクトスタンダードもほどほどに
>>1
>>1
980デフォルトの名無しさん:2010/01/31(日) 05:35:38
>>978
ブラウザ次第じゃん
981デフォルトの名無しさん:2010/01/31(日) 05:40:57
>>と全角で書いてもアンカーと認識されると思ってるかわいそうな人
という突っ込み待ちと見た!
982デフォルトの名無しさん:2010/01/31(日) 05:54:20
全角>>でアンカーにならない専ブラなんてあんの?
983デフォルトの名無しさん:2010/01/31(日) 06:00:18
while(1){
if(n) continue;
hoge();
}

while(1){
if(!n){
hoge();
}
}

これって処理速度に差出るの?
984デフォルトの名無しさん:2010/01/31(日) 06:11:03
>>983
試してみた
大差ないけど気持ち前者の方が速い
985デフォルトの名無しさん:2010/01/31(日) 06:23:42
最適化したら変わんなかったわ


986デフォルトの名無しさん:2010/01/31(日) 09:05:12
rand()/(RAND_MAX/10+1)
[0.0 , 1.0)
987デフォルトの名無しさん:2010/01/31(日) 10:00:52
regex.h使って文字列がURL(とメールアドレス)かチェックする関数作ったんですが
正規表現部分が不安でして、どなたか添削してもらえないでしょうか?

URL
"^http[s]?://[0-9a-zA-Z_.-?:/~#&%=]+$"

メールアドレス
"^[0-9a-zA-Z][0-9a-zA-Z_+-.]+@[0-9a-zA-Z][0-9a-zA-Z_.-]+.[a-zA-Z]+$"

988デフォルトの名無しさん:2010/01/31(日) 10:12:43
>>987
どこまで厳密にマッチさせたいか、にもよるから何とも言えないな。
やっつけ仕事(quick and dirty)ならそれでもいいかもだが、
厳密にマッチさせるとなるとその正規表現では不十分。

# あと http[s]? は https? でおkじゃね?
989デフォルトの名無しさん:2010/01/31(日) 10:22:29
それが仕事のプログラムならばガチガチにチェックしない方がいいと思うぞ
むしろノーチェックでいいくらい
入力を間違っていたらどうせ接続エラーになるだけだから
990デフォルトの名無しさん:2010/01/31(日) 10:25:58
>>987
ハイフンの位置がダメかもしれない
991デフォルトの名無しさん:2010/01/31(日) 10:31:53
>>988
httpとhttpsのURLを"URLじゃない"って誤判定されなければ問題ない感じです。

> # あと http[s]? は https? でおkじゃね?
確かにそうですね。。いろいろ修正しながらやってたら上の表記になりました。
992デフォルトの名無しさん:2010/01/31(日) 10:40:20
>>987
メールアドレスは一筋縄ではいかない。
http://www.din.or.jp/~ohzaki/mail_regex.htm

しかも、厳密にチェックするとドキュモのRFC違反のアドレス通らない。
993デフォルトの名無しさん:2010/01/31(日) 10:44:06
>>992
連続ドットはダメだけど、それに気持ち悪い例外をたくさん用意した
RFCの方が狂ってる。
994デフォルトの名無しさん:2010/01/31(日) 10:47:55
>>989
ガチガチでなくてもおkです。

>>990
実は[]の並び順も重要って気づくのに1時間ぐらい奮闘してましたw
どんな並びがダメなのか理解はしてないんですが、とりあえずハイフン先頭にしておけばおkでしょうか?

>>992
!!
なんかそのページ見たら、上の正規表現でもいいかなって感じがしてきました。。
995デフォルトの名無しさん:2010/01/31(日) 11:10:21
>>987
手抜きで良いらしいので、改良すべき点だけ。

ホスト名には"_"は許されていない。
メールアドレス正規式の.がエスケープされていない。

> どんな並びがダメなのか理解はしてないんですが
先頭の^は否定を表す。
-は文字範囲を表すので、指定する時は先頭(否定の時は^の次)に書く。
996デフォルトの名無しさん:2010/01/31(日) 15:29:40
>>992
> http://www.din.or.jp/~ohzaki/mail_regex.htm

ここまで厳格にマッチさせる必要なんてない。メールアドレスの中にコ
メントを書くなんて見たことないし。
HTML5のスペックでのメールアドレスの定義が現実的な感じ。


>>987 のだと、メールアドレスに使える文字がだいぶ抜けてる。
例えば J-Phone は@の左側に「?」を含んだアドレスを取得できて、
それは規格でも許されている。↑のみたいに厳格にする必要はないけど、
使ってもいい文字ぐらいは規格を参照しましょう。

997デフォルトの名無しさん:2010/01/31(日) 15:46:31
次スレ立ててくる
998デフォルトの名無しさん:2010/01/31(日) 15:50:48
立てた

C言語なら俺に聞け(入門編)Part 60
http://pc12.2ch.net/test/read.cgi/tech/1264920499/
999デフォルトの名無しさん:2010/01/31(日) 15:59:05
俺も立てた

C言語なら俺に聞け(入門編)Part 60
http://pc12.2ch.net/test/read.cgi/tech/1264920499/
1000デフォルトの名無しさん:2010/01/31(日) 16:05:54
>>999
死ね
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。