トップページ⇒tech
1001コメント257KB

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

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん2010/01/09(土) 14:20:39
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++対応明記スレへどうぞ
★分からない事をなるべく詳しく書いて下さい。
★ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
0002デフォルトの名無しさん2010/01/09(土) 14:41:28
>>1
otu
0003デフォルトの名無しさん2010/01/09(土) 14:47:24
あおいjぐおあいうといつおいぐおいくおい
0004デフォルトの名無しさん2010/01/09(土) 14:49:32
うgはおいうごいうとう89
0005デフォルトの名無しさん2010/01/09(土) 14:50:19
>>3
何があった落ち着け
0006デフォルトの名無しさん2010/01/09(土) 14:51:00
gじょいあうごいうt98w48
0007デフォルトの名無しさん2010/01/09(土) 14:51:54
事件の匂いがします
0008デフォルトの名無しさん2010/01/09(土) 15:03:51
スレタイ、いいかげん、C言語じゃなくてCにしない?
めっちゃ素人くさいんだけど。
0009デフォルトの名無しさん2010/01/09(土) 15:04:45
>>8
玄人様のいうことはよく分からん
0010デフォルトの名無しさん2010/01/09(土) 15:07:29
C言語でいいよ
0011デフォルトの名無しさん2010/01/09(土) 15:08:07
いおあうごいあういちょあうといqgじゃきじょg
0012デフォルトの名無しさん2010/01/09(土) 15:12:03
プログラミング言語の後ろに言語をつけるのって、すごいダサい。
0013デフォルトの名無しさん2010/01/09(土) 15:12:48
>>12
だから、何?
0014デフォルトの名無しさん2010/01/09(土) 15:16:32
>>13
そのままの意味。
0015デフォルトの名無しさん2010/01/09(土) 15:21:27
頭の悪いレスはやめろよ
0016デフォルトの名無しさん2010/01/09(土) 15:22:12
このスレがどんだけダサいスレか気付いてないやつがいるようだな。名前の問題じゃねーよ
0017デフォルトの名無しさん2010/01/09(土) 15:22:19
CはC言語でないと検索のときに不便なんだよ
0018デフォルトの名無しさん2010/01/09(土) 15:28:44
>>15
>>13のレスって最近よく見るけど、本人は気のきいた返しとか思ってるのかね。
すごい頭悪そうだよな。
0019デフォルトの名無しさん2010/01/09(土) 15:31:32
「C」で思い付くものはいくらでもあるが「C言語」だと1つに特定される。
言葉の選び方で言えば後者のほうが圧倒的に合理的である。
0020デフォルトの名無しさん2010/01/09(土) 15:33:01
ジョイ具あおいうちおあうとい8349う789qちおgkじぇwq
0021デフォルトの名無しさん2010/01/09(土) 15:35:03
>>19
文脈でわかるだろ。
検索云々とかいう話もあるけど、そもそもCとかC言語だけで検索することが
ないから、どうでも話。
0022デフォルトの名無しさん2010/01/09(土) 15:35:31
ぎおぱういとぐあいつくぉ3う809qごいかg
0023あぼーんNGNG
あぼーん
0024デフォルトの名無しさん2010/01/09(土) 15:44:01
>>18
>>12が最高に無意味なレスをしてるって気付かせようとしてるんだけど
馬鹿にはそれが分からないからね。馬鹿にはちゃんと馬鹿って言わないとさ
0025デフォルトの名無しさん2010/01/09(土) 15:44:58
C言語で良いだろ。
0026あぼーんNGNG
あぼーん
0027デフォルトの名無しさん2010/01/09(土) 15:49:13
>>24
>>18は煽ってるだけだから、マジにレスしなくていいよ。
まあ、バカだからわかんないかもしれないけど。
0028あぼーんNGNG
あぼーん
0029デフォルトの名無しさん2010/01/09(土) 15:55:11
>>24
「だからなに?」の一行レスとか、反論を思いつかないから何か
適当に言ってるだけのようにしか見えないよ。
本人の主観だと「無意味なレスをわからせる」効果があるってことになってるのか。
0030あぼーんNGNG
あぼーん
0031デフォルトの名無しさん2010/01/09(土) 16:00:55
おい意味不明なレスしてるクズ
巻き添え規制くらうヤツのこと考えろよバカタレ
0032あぼーんNGNG
あぼーん
0033デフォルトの名無しさん2010/01/09(土) 16:03:48
これどうやってNGすればいいの……
0034あぼーんNGNG
あぼーん
0035あぼーんNGNG
あぼーん
0036デフォルトの名無しさん2010/01/09(土) 16:46:32
突然すみません。
わからない問題があるんですが
この整数を入力し、入力したデータの平均値(小数点以下切り上げ)
に対して”※”と表示するプログラムを作成せよ
・”※”の表示はいくつでも表示できるようにする。
ただし、平均値が0の時はエラーの表示する。
・繰り返し処理としてfor,while,do whileのいずれかを用いる
以上です
0037あぼーんNGNG
あぼーん
0038あぼーんNGNG
あぼーん
0039デフォルトの名無しさん2010/01/09(土) 16:51:31
この整数値×
整数値○
0040デフォルトの名無しさん2010/01/09(土) 16:52:21
本当に”※”なのか?
*←これなんじゃないの?

for,while,do以外の処理のほうが珍しいな
0041あぼーんNGNG
あぼーん
0042デフォルトの名無しさん2010/01/09(土) 16:55:23
>>31
Base64 かもしれない。
0043あぼーんNGNG
あぼーん
0044あぼーんNGNG
あぼーん
0045デフォルトの名無しさん2010/01/09(土) 17:02:26
uuencode/decode もあったなあ
0046デフォルトの名無しさん2010/01/09(土) 17:42:03
ごあjぎおあうちおあうお
0047あぼーんNGNG
あぼーん
0048デフォルトの名無しさん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をつけたのにコンパイル、動作問題なしです。
なぜでしょうか?
0049デフォルトの名無しさん2010/01/09(土) 19:21:55
>>48
warning レベルが低くて、運が良かったから
0050あぼーんNGNG
あぼーん
0051あぼーんNGNG
あぼーん
0052あぼーんNGNG
あぼーん
0053あぼーんNGNG
あぼーん
0054デフォルトの名無しさん2010/01/09(土) 20:12:58
これ何かのSOSだろ
0055あぼーんNGNG
あぼーん
0056あぼーんNGNG
あぼーん
0057デフォルトの名無しさん2010/01/09(土) 20:57:11
おいがいgjgぁじょい
0058sage2010/01/09(土) 22:23:13
暗号文か?
0059デフォルトの名無しさん2010/01/10(日) 05:24:12
>>48
static?
そのソース中にはないようですが???
0060あぼーんNGNG
あぼーん
0061あぼーんNGNG
あぼーん
0062あぼーんNGNG
あぼーん
0063デフォルトの名無しさん2010/01/10(日) 05:54:30
>>59
constに訂正
0064デフォルトの名無しさん2010/01/10(日) 06:35:07
>>63
手元の環境(VC)に入力してみたが、コンパイルが通らなかった。
>>49のレスのとおりじゃないかな。
0065デフォルトの名無しさん2010/01/10(日) 06:36:08
貴方が求めるそこまで優秀なコンパイラが
無償に近い価格で頒布される
わきゃないという説明で許してくれ
0066デフォルトの名無しさん2010/01/10(日) 07:53:31
double d(1<=d<=0xffffffff)の整数部分だけ取り出したいのですが
この場合はfloorでなくてキャストでいいのでしょうか?
0067あぼーんNGNG
あぼーん
0068あぼーんNGNG
あぼーん
0069あぼーんNGNG
あぼーん
0070デフォルトの名無しさん2010/01/10(日) 09:23:33
>>66
実際に試してみたら?
0071デフォルトの名無しさん2010/01/10(日) 09:31:54
>>66
限界値を入れて試せばいいじゃない。
0072デフォルトの名無しさん2010/01/10(日) 12:45:22
マイナスの時どうするかだと思う
0073デフォルトの名無しさん2010/01/10(日) 13:25:31
諦めて枕を濡らす
0074デフォルトの名無しさん2010/01/10(日) 13:35:27
1より大きいマイナスの数ってなんだ?
0075デフォルトの名無しさん2010/01/10(日) 13:46:16
>>74
なんで疑問形
0076722010/01/10(日) 15:04:49
1<=dだったのか

じゃmodf
0077デフォルトの名無しさん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が失敗してエラーになります。
文字コードの問題かなとも思うのですが、良くわかりません。 対処法わかる方教えてください。
0078あぼーんNGNG
あぼーん
0079あぼーんNGNG
あぼーん
0080あぼーんNGNG
あぼーん
0081デフォルトの名無しさん2010/01/11(月) 11:26:50
expected expression before 〜
gccのエラーなんですがどういう意味でしょうか?
ググっても具体的な内容が見つからないので・・・
0082デフォルトの名無しさん2010/01/11(月) 11:31:01
〜前後のソースさらせない?大抵 ; とか } がたりないんだと思うけど。
0083あぼーんNGNG
あぼーん
0084あぼーんNGNG
あぼーん
0085デフォルトの名無しさん2010/01/11(月) 11:36:29
翻訳してみるといいよ
0086772010/01/11(月) 11:40:01
問題は別の所にあったようです。失礼しました。
0087デフォルトの名無しさん2010/01/11(月) 11:43:29
susieプラグインみたいなプラグインってどうやって読み込んで、利用するの?
0088デフォルトの名無しさん2010/01/11(月) 11:58:54
>>82
構文チェックをしましたが;や{}は問題なさそうです
〜には構造体の型名が入っていて、複数行でこのエラーが発生しているので構造体に何か問題があるかもしれないです
0089デフォルトの名無しさん2010/01/11(月) 12:04:37
エラーの起きた行と、エラーメッセージ全部を引用しろよ

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

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

コンパイルエラー解決できない奴って、ウルトラ恥ずかしい超初心者ってわかってる?
0093デフォルトの名無しさん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'

全部構造体がらみのエラー・・・
0094あぼーんNGNG
あぼーん
0095デフォルトの名無しさん2010/01/11(月) 12:32:55
単にparams_speが構造体と認識されてないだけじゃん。
0096あぼーんNGNG
あぼーん
0097デフォルトの名無しさん2010/01/11(月) 12:34:59
エスパーすると typedef struct を調べればいいんジャマイカ?
0098デフォルトの名無しさん2010/01/11(月) 12:48:56
構造体の名前、間違えてるんじゃないの? param_spe とか
0099デフォルトの名無しさん2010/01/11(月) 13:04:26
>>37とか>>96とか、謎の言語にならない書き込みをしているヤツって
なんなの?タダの荒らしなの?
もしそうなら2ch運営から規制か損害賠償になったりしないの?
0100デフォルトの名無しさん2010/01/11(月) 13:12:17
規制には出来るよ
0101デフォルトの名無しさん2010/01/11(月) 13:36:38
ウィルスにひっかかったやつが重要な内容を暗号化して書きこんでるのかと思ったが・・・
0102デフォルトの名無しさん2010/01/11(月) 13:40:20
なわけねえだろ
0103デフォルトの名無しさん2010/01/11(月) 15:10:44
多分目隠し監禁された状態で必死に携帯からSOSを発してるんだよ
0104デフォルトの名無しさん2010/01/11(月) 15:37:34
gets() を叩かれたのが、そんなにプライドに触ったのか。
0105デフォルトの名無しさん2010/01/11(月) 15:44:01
(σ・∀・)σゲッツ!!
0106デフォルトの名無しさん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)
0107デフォルトの名無しさん2010/01/11(月) 16:05:04
>>106
ほんとだ。
なんでだろうね。
wikipって、記述した人に質問できるシステムないのかな?

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

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

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

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

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

というのを

str[1] = 0;

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

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




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

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

2.3 標準入力からのデータの読込み
http://www.math.meiji.ac.jp/~mk/labo/java/intro-java/node10.html
0146デフォルトの名無しさん2010/01/12(火) 16:12:56
>>143
おめでとう! Cプログラマなら誰もが一度は通るミスだw
0147デフォルトの名無しさん2010/01/12(火) 16:15:01
そうか?
Perlとかphpから来たならやりそうだが・・・
0148デフォルトの名無しさん2010/01/12(火) 16:16:22
scanfがうんこ過ぎるだけ。
0149デフォルトの名無しさん2010/01/12(火) 16:18:50
>>147
うはw
>>143を流し読みして、>>144-145を見ただけでレスしちまったw
int a;scanf("%d", a);のパターンかと思ったんだ。
0150デフォルトの名無しさん2010/01/12(火) 16:52:52
高度に抽象化すると143みたいな考え方になるんだろうか
0151デフォルトの名無しさん2010/01/12(火) 18:41:48
printfのフォーマットも負けず劣らず、うんこだぞ。
0152デフォルトの名無しさん2010/01/12(火) 18:49:10
>>144
>>145
ありがとう
0153デフォルトの名無しさん2010/01/12(火) 18:55:08
C言語です
2つ以上の文字列を一つにまとめるのってどうやるんですか?
例えば
char data[40],data1[20],data2[20];
で
data1="hato"
data2="poppo"
のときに
data="hato poppo"
ってしたいんですけど
0154デフォルトの名無しさん2010/01/12(火) 18:57:24
>>153
sprintf
0155デフォルトの名無しさん2010/01/12(火) 18:59:00
strcpyとstrcat組み合わせてもいいけどスペース入れたりするなら
sprintfでいいんじゃない?バッファの長さチェックとか適時やるとして、
sprintf(data, "%s %s", data1, data2);
とか
0156デフォルトの名無しさん2010/01/12(火) 19:00:10
>>154
>>155
ありがとん
ちょっと考えてみます
0157デフォルトの名無しさん2010/01/12(火) 19:04:46
解決しました!
ってか>>155のまんまでした
sprintfめっちゃ便利ですね
ありがとうございました〜
0158デフォルトの名無しさん2010/01/12(火) 19:06:58
ローカルスコープを使うためだけにcppとしてコンパイルしたら
それはC言語で作ったものと呼べるの?
0159デフォルトの名無しさん2010/01/12(火) 20:44:44
>>158
Cでもブロックの先頭で宣言できる
0160デフォルトの名無しさん2010/01/12(火) 21:56:09
VC++でもC99対応してないしなあ
0161デフォルトの名無しさん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;}

よろしくお願いします。


0162デフォルトの名無しさん2010/01/12(火) 22:27:08
y=5-1*!!(x&~0x1f)-1*!!(x&~0xf)-1*!!(x&~0x7)-1*!!(x&~0x3);
0163デフォルトの名無しさん2010/01/12(火) 22:30:20
y = 1 + (x >= 0x3) + (x>=0x7) + (x>=0xf) + (x>=0x1f);
01641232010/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 を検出しました。
0165デフォルトの名無しさん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
0166デフォルトの名無しさん2010/01/13(水) 00:19:36
メモ帳で作ったBOM付きにするとか。
メモ帳でShift JISに変換するとか。
01671232010/01/13(水) 00:36:16
保存オプションでBOM無しを設定出来るので大丈夫だと思ったんですが、ビルドは現状無理なんですね
とりあえずBOM付きで管理することにします
皆様どうも有り難う御座いました
0168デフォルトの名無しさん2010/01/13(水) 00:36:55
>>161
テーブルを作っておいて
y = hoge_table[x];

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

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

コーディングトラブルの約70%はif文などでの{}省略
http://pc12.2ch.net/test/read.cgi/tech/1173416521/
0177デフォルトの名無しさん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で書いてます
0178デフォルトの名無しさん2010/01/13(水) 03:01:55
>>176
それって言語の問題じゃなく単純に不注意だよね
0179デフォルトの名無しさん2010/01/13(水) 03:03:30
>>177
計算途中にも型があるから
2 を 2.0 と書いたり N を (double)N と書いたりするといいよ
0180デフォルトの名無しさん2010/01/13(水) 03:05:54
>>178
不注意には違いないんだけど
後で式を追加したりするときにやっちゃう人がよくいるんだよ
インデントされてるからぱっと見ではわかりにくかったり
0181デフォルトの名無しさん2010/01/13(水) 03:07:16
そういう宗教問題は堂々巡りで決着つかないよ。
0182デフォルトの名無しさん2010/01/13(水) 03:08:10
else if (x < 0x7) y = 2;
こうでなく

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

int is_zorome (char * n);

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

こんちわ世界から先が見えませんw
0201デフォルトの名無しさん2010/01/13(水) 23:59:04
>>200
勉強する方法を身につける
0202デフォルトの名無しさん2010/01/13(水) 23:59:41
Win32APIで用意されている構造体や関数を使います
0203デフォルトの名無しさん2010/01/14(木) 00:02:51
puts/getsに相当する音声関数を見つけます。
0204デフォルトの名無しさん2010/01/14(木) 00:08:45
ALSAでぐぐれ
0205デフォルトの名無しさん2010/01/14(木) 03:06:04
ttp://www.google.co.jp/search?q=API+録音
0206デフォルトの名無しさん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();
}
0207デフォルトの名無しさん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バイトになってしまいます

どうしたらよいのでしょうか?
02082072010/01/14(木) 13:05:18
すみません
自己解決しました
0209デフォルトの名無しさん2010/01/14(木) 16:50:30
>>208
解決方法を書けや
0210デフォルトの名無しさん2010/01/14(木) 16:54:06
コンパイルオプションとかalignとかあるよね
0211デフォルトの名無しさん2010/01/14(木) 22:19:11
ifとかで{}付けないことがあるようだけど
どこからどこまでが範囲なの?
0212デフォルトの名無しさん2010/01/14(木) 22:21:40
>>211
セミコロンまで
0213デフォルトの名無しさん2010/01/14(木) 22:23:34
ありがとう
0214デフォルトの名無しさん2010/01/14(木) 22:43:49
>>211
正確には次の文が終了するまでだお。
0215デフォルトの名無しさん2010/01/14(木) 23:38:23
曖昧になったな
0216デフォルトの名無しさん2010/01/14(木) 23:39:27
どこが?
0217デフォルトの名無しさん2010/01/14(木) 23:41:29
うん、まあ、ここらへん。
0218デフォルトの名無しさん2010/01/14(木) 23:42:36
理解できないなら出てくんなよバカが
0219デフォルトの名無しさん2010/01/14(木) 23:50:10
文の終了はセミコロンで示すんじゃないの
0220デフォルトの名無しさん2010/01/14(木) 23:53:22
大体そんな感じ
0221デフォルトの名無しさん2010/01/14(木) 23:54:49
逆じゃね
0222デフォルトの名無しさん2010/01/14(木) 23:55:34
int x; //宣言
x=10;//x=10が式、x=10;は文;
02232142010/01/14(木) 23:59:58
>>215
>>219
とりあえずお前ら2者は
文を理解すべきだと思うんだお
できないならただのでしゃばりバカ
0224デフォルトの名無しさん2010/01/15(金) 00:05:19
質問してるのに出しゃばりバカとか言われた…なんだこのスレ
0225デフォルトの名無しさん2010/01/15(金) 00:06:26
教え方が下手な奴の典型。自分だけ分かればそれでいい、と勘違いしてるが
あまつさえ自分でもよく分かってないんだよ。許してやれ
0226あぼーんNGNG
あぼーん
0227デフォルトの名無しさん2010/01/15(金) 00:08:37
仕様書読め、の一言で終わるような話はこうなっちゃうよね
0228あぼーんNGNG
あぼーん
0229あぼーんNGNG
あぼーん
0230デフォルトの名無しさん2010/01/15(金) 00:10:12
仕様書をいちいち読んでる奴が2chなんて見るかよ
0231あぼーんNGNG
あぼーん
0232あぼーんNGNG
あぼーん
0233あぼーんNGNG
あぼーん
0234デフォルトの名無しさん2010/01/15(金) 00:18:28
>>233
いや、ちょっと違う。
酢は入れないし箸を使う。
0235デフォルトの名無しさん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
0236デフォルトの名無しさん2010/01/15(金) 00:39:02
>>235
でしょ。
それでも合うと思うよ。
0237デフォルトの名無しさん2010/01/15(金) 00:39:44
if(a!=b)(typeof(a) c=a;a=b;b=c;});
0238デフォルトの名無しさん2010/01/15(金) 00:40:30
>>236
なるほど。ありがとうございました。
0239デフォルトの名無しさん2010/01/15(金) 01:48:26
int a[50];
int b;
b=a[-1];

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

ポインタのなら実際に見たことがある
配列のはない
0243デフォルトの名無しさん2010/01/15(金) 11:15:45
>>239
Cには、書けるけどそのような書き方をしてはいけない、というものがなぜかたくさんあります
「C言語 未定義」でぐぐってみてください
0244デフォルトの名無しさん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]]なのかと思いつつも、何分ド素人のため正否の判断が付かず
これで合ってるというのなら理解できるまで読み返してきます。。。
0245デフォルトの名無しさん2010/01/15(金) 16:46:21
iだな
pも初期化してないような気がするが・・・
あと、それはバブルソートではなくて、選択ソートではないでしょうか
0246デフォルトの名無しさん2010/01/15(金) 17:14:08
>>245
やはりiですか、ありがとうございます
バブルソートではなく直接選択法で行うって書いてありました。しかも書き込みミスで2行目はint p[6];ですorz
0247デフォルトの名無しさん2010/01/15(金) 17:24:27
>>246
int p[] = { 0, 1, 2, 3, 4, 5 }; とかじゃね?
0248デフォルトの名無しさん2010/01/15(金) 17:36:18
>>247
for (i=0;i<N;i++) {p[i]=i};
この行付け忘れてましたorz
なんかもうgdgdですいません吊ってきま。。。
0249デフォルトの名無しさん2010/01/15(金) 18:56:40
atexitてコンソール画面の×押した時は飛ばないの?
0250デフォルトの名無しさん2010/01/15(金) 19:29:43
飛ばない
atexitはプログラムが正常終了したときだけ
0251デフォルトの名無しさん2010/01/15(金) 20:14:05
int aa;
int bb;
volatile int cc;

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

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

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

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

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

char s[] = "This is a pen. That is a pencil. He is tall.";
0266デフォルトの名無しさん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]++;
0267デフォルトの名無しさん2010/01/16(土) 14:23:12
Cにはハッシュテーブルってなかったっけ?
0268デフォルトの名無しさん2010/01/16(土) 15:01:40
>>266
それって無限ループにはならないの?
0269デフォルトの名無しさん2010/01/16(土) 15:11:25
ポーペンでperl呼ぶのがベスト
0270デフォルトの名無しさん2010/01/16(土) 18:26:37
>>262
�d
Cでは難しいんすね。
0271デフォルトの名無しさん2010/01/16(土) 20:56:47
falseってNULLみたいに必ず定義されているものじゃないの?
gccでもbccでもコンパイルの時未定義扱いなるんだが
0272デフォルトの名無しさん2010/01/16(土) 20:57:59
C言語にはtrueもfalseもない
0273デフォルトの名無しさん2010/01/16(土) 20:58:38
Cだろ?trueもfalseもねーよ。
0274デフォルトの名無しさん2010/01/16(土) 20:59:14
マクロで
0275デフォルトの名無しさん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); }
これは何を判定してるんでしょうか??
0276デフォルトの名無しさん2010/01/17(日) 01:10:20
偶奇
0277デフォルトの名無しさん2010/01/17(日) 01:12:30
>>276
�d
ありがとうございます!
0278デフォルトの名無しさん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;
}
0279デフォルトの名無しさん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;
}
0280デフォルトの名無しさん2010/01/17(日) 16:53:13
カンマが後ではなく前に付いていると考えればいい。
0281デフォルトの名無しさん2010/01/17(日) 17:26:19
>>279-280
�d
0282デフォルトの名無しさん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]);
}
0283デフォルトの名無しさん2010/01/17(日) 17:43:43
>>282
unsigned char にすればおk
0284デフォルトの名無しさん2010/01/17(日) 17:46:01
>>278-281
まぁスマートな方法なんて無いわな。

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

仕事で書くなら>>279的な書き方するけど、
残念ながらバグってる。
0285デフォルトの名無しさん2010/01/17(日) 17:47:42
>>282
符合拡張ってやつだ
マイナスの値をビット数増やしても、マイナスのままにしようとするから
0286デフォルトの名無しさん2010/01/17(日) 17:47:56
>>283
ありがとうございます。
うまくいきました。
0287デフォルトの名無しさん2010/01/17(日) 17:48:40
をっと、符号拡張ね
0288デフォルトの名無しさん2010/01/17(日) 17:51:13
>>285、>>287
なるほど。
ありがとうございます。
0289デフォルトの名無しさん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数値を計算するプログラムを作っていたのですが
計算結果がうまくいきません
どこが間違ってるのでしょうか?
0290デフォルトの名無しさん2010/01/17(日) 18:39:55
>>289
printf("height=%f weight=%f\n", height, weight);
を追加してみる
0291デフォルトの名無しさん2010/01/17(日) 18:46:30
scanf("%lf"
0292デフォルトの名無しさん2010/01/17(日) 19:19:10
>>284
その3項演算子はダサい。3項演算子の魔術師と呼ばれた俺様が教授してやろう。
for(i=0; i < sizeof n / sizeof *n; i++)
printf(i ? ", %d" : "%d", n[i]);
0293デフォルトの名無しさん2010/01/17(日) 19:53:05
printfの魔術師ならこうだな。
printf( "%.*s%d", !!i, ",", n[i] );
02942932010/01/17(日) 19:55:32
つかこれで良かったか
printf( ",%d"+!i, n[i] );
0295デフォルトの名無しさん2010/01/17(日) 19:56:02
printf("%s%d", ","+!i, n[i]);
0296デフォルトの名無しさん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相当にすれば条件分岐にはならないがもっと汚くなる)
0297デフォルトの名無しさん2010/01/17(日) 20:33:48
IOCCC目指すの?
0298デフォルトの名無しさん2010/01/17(日) 20:34:18
printf("%d", n[0]);
for(i=1; i < sizeof n / sizeof *n; i++) printf(",%d", n[i]);
0299デフォルトの名無しさん2010/01/18(月) 05:15:49
失礼します。

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

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

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

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

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

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

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

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

if (c == '0')
 break;

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

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

int x=100;
int *p=x;

こういうのもできる。
C++だと319のエラーが出てくる。
0325デフォルトの名無しさん2010/01/18(月) 21:12:00
Cでもふつーウォーニングぐらい出るだろー。
0326デフォルトの名無しさん2010/01/18(月) 21:45:10
警告は「ふつー」出ないんだよ
0327デフォルトの名無しさん2010/01/18(月) 21:51:38
int*にintを代入はできない
アドレスを示す変数に○バイト整数の代入だからな
0328デフォルトの名無しさん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;
}

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

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

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

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

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

軽く答えちゃっててなんだけど
言語差の問題ではなくアルゴリズムの問題なので
相応のスレで質問し直した方がいいと思うよ。
0341デフォルトの名無しさん2010/01/19(火) 05:36:15
>>336は面白いな、失業中でニートしているから今日作ってみるかw
0342デフォルトの名無しさん2010/01/19(火) 05:40:38
棒人間でパラパラマンガでも描いて見れば一発な気もすんだが。
0343デフォルトの名無しさん2010/01/19(火) 06:00:46
もっと深いところで悩んでるのかも
前もって用意して当てはめるならどーとでもないが
生年月日、血液型、食生活、私生活、スタミナ、季節、ボイド時間他もろもろ
腕の振りもその都度変わって来るわけだから
それら全てのパラメーターを受けた上で
その数式を模索してるのかもしれない
0344デフォルトの名無しさん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 */
}
0345デフォルトの名無しさん2010/01/19(火) 09:40:07
http://pc12.2ch.net/test/read.cgi/tech/1260532772/984
をよろしく
0346デフォルトの名無しさん2010/01/19(火) 09:45:45
>>344
intだから
0347デフォルトの名無しさん2010/01/19(火) 09:53:51
>>344
Cではint
(C++ではchar)
0348デフォルトの名無しさん2010/01/19(火) 10:07:18
>>346-347
thx

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

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

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

char s[] = "abc";

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

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

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

どんな値になる?
0363デフォルトの名無しさん2010/01/19(火) 11:36:08
定数に型はないって言った直後に、整数定数ってどういうことだw
03643532010/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は上のどのポンタにアサインできるの?
0365デフォルトの名無しさん2010/01/19(火) 15:52:11
ローカルで宣言したchar a[] = "abc"は
アセンブリ出してみるとわかるが、

char a[4] = {'a', 'b', 'c', '\0'};
もしくは
char a[4];
strcpy(a, "abc");
相当のことが行われている
0366デフォルトの名無しさん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.│
                 └─┘
0367デフォルトの名無しさん2010/01/19(火) 17:21:21
そんな感じ
0368デフォルトの名無しさん2010/01/19(火) 17:24:25
>>367
�d
0369デフォルトの名無しさん2010/01/19(火) 17:25:34
s[]="abc";の場合にはコピー元があるわけじゃないだろ
0370デフォルトの名無しさん2010/01/19(火) 17:37:30
実装依存でしょ
0371デフォルトの名無しさん2010/01/19(火) 18:41:09
>>369
魔法じゃないんだから、あるに決まってるだろ
0372デフォルトの名無しさん2010/01/19(火) 19:00:42
4バイト程度なら、即値命令で代入してるかも知れんし
そこらへんはコンパイラ次第。
0373デフォルトの名無しさん2010/01/19(火) 20:40:39
>>366
上と下では大違いだよね。
a[0]を書き換えられるか(上)、書き換え禁止か(下)。
0374デフォルトの名無しさん2010/01/19(火) 20:47:11
char *s は「禁止」してねえじゃんw
0375デフォルトの名無しさん2010/01/19(火) 21:18:43
鼻から鼻毛が出るんだっけ
0376デフォルトの名無しさん2010/01/19(火) 21:25:52
>>375
出るかもしれんな。未定義の動作だから。
0377デフォルトの名無しさん2010/01/19(火) 21:30:23
"abc"は定数だからメモリではプログラム領域に置かれる。関数の置き場所と一緒。
ならばコピー元は"ある"ことになる。
0378デフォルトの名無しさん2010/01/19(火) 21:50:26
おっといけね
俺未定義の動作してたわ
0379デフォルトの名無しさん2010/01/19(火) 22:08:48
本当に未定義なんですか?
char *s = "abc";
に対して、さらに
*(s + 0) = 'x';
*(s + 1) = 'y';
*(s + 2) = 'z';
とすればアウトなんですが。
未定義、未定義と知らない言葉をふりまわしているのでは?
0380デフォルトの名無しさん2010/01/19(火) 22:11:54
馬鹿か釣りか知らんがお前は消えろ
0381デフォルトの名無しさん2010/01/19(火) 22:21:25
>char *s = "abc";
C勉強し始めたばかりでよくわからないんですけど
これって先にメモリを確保しないといけないような気がするのですが、どうなんでしょうか
0382デフォルトの名無しさん2010/01/19(火) 22:24:00
確保しないといけないなんて事はありません
0383デフォルトの名無しさん2010/01/19(火) 22:24:21
>>380
アンカーつけろ馬鹿
0384デフォルトの名無しさん2010/01/19(火) 22:24:40
>>381
実行してみてください。
#include <stdio.h>

int main()
{
char *s = "abc";
printf("%s\n", s);
return 0;
}
0385デフォルトの名無しさん2010/01/19(火) 22:36:53
>>384
abc
0386デフォルトの名無しさん2010/01/19(火) 22:42:05
うるせえ馬鹿
0387デフォルトの名無しさん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;
}
0388デフォルトの名無しさん2010/01/19(火) 23:26:51
abc
sex
0389デフォルトの名無しさん2010/01/19(火) 23:32:24
oops
0390デフォルトの名無しさん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;
}
0391384,3872010/01/20(水) 03:33:26
>>390
つまりそういうこと。
0392デフォルトの名無しさん2010/01/20(水) 07:06:10
つまりどういうこと
0393デフォルトの名無しさん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.│
└─┘  └─┘
03943932010/01/20(水) 08:01:15
スマソ

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

が許されない実装って具体的には何なんですか?
0396デフォルトの名無しさん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;
}
0397デフォルトの名無しさん2010/01/20(水) 10:28:00
>>381
リテラルはプログラム開始時に読み取り専用メモリに配置されるので動的なメモリ確保は必要ありません。
int i = 10 + 20;
「10」も「20」もメモリ確保してませんよね?
これと同じことです。
それからリテラルの値を変更したときの動作は未定義ですが、読み取り専用メモリなのでアクセス違反を起こすと思います。
0398デフォルトの名無しさん2010/01/20(水) 10:53:13
> リテラルはプログラム開始時に読み取り専用メモリに配置される
嘘です。信用してはいけません。
0399デフォルトの名無しさん2010/01/20(水) 11:00:51
int *x=100;
これはなぜ通らないんですか?
0400デフォルトの名無しさん2010/01/20(水) 11:12:37
>>398
では正しい解説をどうぞ
0401デフォルトの名無しさん2010/01/20(水) 11:16:50
K&Rが買ってきたのですが難しくて読めません。
K&Rを売って他の本を買おうと思うのですがお勧めはありますか?
0402デフォルトの名無しさん2010/01/20(水) 11:17:34
>>398
否定するなら詳細を頼む。
できればそれが確認できるURLも。

>>399
型が異なるので代入できません。
char *s = "abc";
これがエラーにならないのは暗黙的にリテラル文字列の先頭アドレスが代入されるからです。
詳しくは↓を見て下さい。
http://www7b.biglobe.ne.jp/robe/cpphtml/html01/cpp01077.html
0403デフォルトの名無しさん2010/01/20(水) 11:33:05
int *x=(const int*)&100;
と出来ない理由は?
0404デフォルトの名無しさん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
04054012010/01/20(水) 11:55:26
>>404
ありがとうございます。
リンクしてくださった解説サイトを参考に勉強することにします。
入門書のほうはCの絵本がよさそうですね。
0406R2010/01/20(水) 13:46:05
はじめまして今年の4月から情報系の大学に行くので大学に入る前に独自でC言語を勉強しようと思って最低限はいろいろなサイトで勉強しました。
そこでモンテカルロ法で円周率を求めるプログラムを作ろうと思ってプログラムを書いた時点で選択した乱数の数で円周率を出すことは出来たのですが
これを相手方のユーザーもしくはコンソール上にうってもらった数値から円周率を出すように変更したいのですが以下のプログラムのXXXを
相手方のユーザーもしくはコンソール上にうってもらった数値をいれるように変更したいのですがどのように変更すればいいでしょうか?

a_max…乱数の発生回数
n…円の中に入った乱数の数
pa…円周率
プログラムは↓
0407R2010/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;
}
0408デフォルトの名無しさん2010/01/20(水) 13:54:46
なんで高校生がモンテカルロ法なんて言葉平気で使うんだ?
0409デフォルトの名無しさん2010/01/20(水) 14:15:16
>>406
scanf("%f", &a_max); // 乱数の発生回数を入力させる
0410デフォルトの名無しさん2010/01/20(水) 14:19:38
>>408
プログラミングやってたらリア中でも知ってておかしくない
0411デフォルトの名無しさん2010/01/20(水) 14:47:54
scanf では double は %lf
04124092010/01/20(水) 14:58:59
ゴメン、うっかりした。
scanf("%lf", &a_max);
0413デフォルトの名無しさん2010/01/20(水) 15:07:12
知っていることと正しく使えることとは違うだろ
0414デフォルトの名無しさん2010/01/20(水) 15:08:33
変な絡み方w
0415デフォルトの名無しさん2010/01/20(水) 15:10:41
乱×法
0416デフォルトの名無しさん2010/01/20(水) 17:56:25
>>402
>否定するなら詳細を頼む。
未定義だつってんだろが阿呆。

因みに、Microsoft は VC++ 6.0 までは .data セグメント、
それ以降は .rdata セグメントに置かれる。
で、多くのコンパイラではオプションで指定できる。
0417デフォルトの名無しさん2010/01/20(水) 18:22:46
なんで
char *a="hogehoge";
はaを文字列定数へのポインタとして解釈してくれるのに
int *x=12345;
は整数定数12345へのポインタとして解釈してくれないの?
趣味の問題?
0418デフォルトの名無しさん2010/01/20(水) 18:25:03
xに12345が入ってるなら正しいのでは?
0419デフォルトの名無しさん2010/01/20(水) 18:26:58
比較する相手がおかしい
int *x=12345;
と対応するのは
char *a='A';
じゃないのか
"hogehoge"に対応する整数配列定数のようなものはC99にしかない
0420デフォルトの名無しさん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]);
と解釈される。これは慣習であるとしかいいようが
ない。因習というほどのものでもないとオモ
0421デフォルトの名無しさん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' } の略記法だと思えばいいんダ!
0422デフォルトの名無しさん2010/01/20(水) 18:50:26
文字列リテラルの特別扱いは、文字列型がないcにおける僅かばかりの文字列サポート。


>>420
リテラルとは、ソース上の定数のこと。
int *x=(int*)12345;の「12345」やchar *s=(const char*)&'A';の「'A'」もリテラル。
0423デフォルトの名無しさん2010/01/20(水) 18:50:47
文字列リテラルは定数ではない
文字列リテラルは静的記憶期間の配列として保持される
0424デフォルトの名無しさん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;

解説をお願いします
0425デフォルトの名無しさん2010/01/20(水) 19:34:38
>>423
    char arr[] = "abc";
が
    mov dword ptr arr, 00636261H
とコンパイルされたとしても
規格上何の問題ないわけだが。
0426デフォルトの名無しさん2010/01/20(水) 19:39:24
で
c=arr[2]
mov ebx,00636261h
mov al, byte ptr [ebx+2]
とやったところでセグメンテーションエラーとw
0427デフォルトの名無しさん2010/01/20(水) 20:19:09
>>425
char配列初期化のための簡易記法である""形式の書き方も
文字列リテラルって言うんだっけ?

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

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


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

>>427
>文字列リテラルって言うんだっけ?
言うけど?
0440デフォルトの名無しさん2010/01/20(水) 21:17:41
http://web.archive.org/web/20060205065722/ge3-store.biz/product_info.php?cPath=23_31&products_id=43
0441デフォルトの名無しさん2010/01/20(水) 21:44:17
>>420
> char *s=(const char*)&("const char"[0]);

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

0450デフォルトの名無しさん2010/01/20(水) 23:12:39
>>449
C言語とC++は「別の言語」です。
スレタイ読んだらさっさと巣にお戻りください。
0451デフォルトの名無しさん2010/01/20(水) 23:32:14
括弧省略はプログラマの職業上の知恵という奴ではなく、
既に犯罪の一種と認定されてるし...
0452デフォルトの名無しさん2010/01/20(水) 23:33:49
よくあるイディオム以外は括弧つけて欲しいな
0453デフォルトの名無しさん2010/01/20(水) 23:35:29
>>450
知ってるよ。
だからといって、・・・まあめんどくせえからいっか。
0454デフォルトの名無しさん2010/01/20(水) 23:40:58
多くの引数値からあるフォーマットのファイルを出力するプログラムを組んでいるのですが、
入力値が8個から10個ぐらいになります。
main 関数の argv で全部渡すようなコマンドを作ったのですが、多くの引数を渡すもっとスマートな方法
ないでしょうか?
0455デフォルトの名無しさん2010/01/20(水) 23:45:27
>>454
URLエンコードして渡す
0456デフォルトの名無しさん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は配列の変数です
0457デフォルトの名無しさん2010/01/21(木) 00:04:17
while(fscanf(fpi,"%d %lf %lf %lf", &i, a, b, c) != EOF){
の書き間違いです
0458sage2010/01/21(木) 00:09:25
&
0459デフォルトの名無しさん2010/01/21(木) 00:11:43
>>456
http://codepad.org/
にソース晒したほうが早いと思うけど
0460デフォルトの名無しさん2010/01/21(木) 00:11:53
&入れてもできないんですよ

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

教科書は誤植ですかね
0464デフォルトの名無しさん2010/01/21(木) 02:30:58
本来分数で計算するもの(シンプレックス法)を無理やりfloat型で計算しているのですが
出力で-0.0000と出るのですがこれはどういった意味でしょうか?
0465デフォルトの名無しさん2010/01/21(木) 02:39:51
計算機が出す数字は信用出来ない という意味
それは半分本当として、数字を奇麗にそろえて
出力する場合絶対値が小さい負の数、例えば-0.00000000000001
とかは前半の部分しか出さないってことはするだろ?
0466デフォルトの名無しさん2010/01/21(木) 03:31:43
ありがとうございます
問題がわかりました
0467デフォルトの名無しさん2010/01/21(木) 03:41:49
シンプレックス法の場合最初はfloatで、最適値に近い
制約条件が絞られてからは有理数でやらなければならない
場合もあるかも知れないがまぁ基本的にはfloatじゃね?
0468デフォルトの名無しさん2010/01/21(木) 04:04:49
for文内でstringの配列作るじゃん?
そのstringからfloatの値を取るじゃん?
floatの値が小さい順から並び変えるじゃん?
そのfloatに対応したstringの変数を順に選択していくのってどうするんじゃん?
0469デフォルトの名無しさん2010/01/21(木) 04:22:01
じゃんじゃん構造体作ると破滅するじゃん
0470デフォルトの名無しさん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");
}

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

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

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

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

void func(int arr[3])

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

void func(int arr[])
void func(int *arr)
0481デフォルトの名無しさん2010/01/21(木) 10:22:12
みたことないし、書いたこともないな
0482デフォルトの名無しさん2010/01/21(木) 10:22:52
つかthreadという概念が出来た背景を知ってほしいような...
0483デフォルトの名無しさん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.
0484デフォルトの名無しさん2010/01/21(木) 10:37:30
>>480
一緒
ただし人間が見たときに、ここは長さ3の配列を渡すんだな、と信じ込ませる効果があります
0485デフォルトの名無しさん2010/01/21(木) 10:41:23
>>484
なるほど。
サンクス。
0486デフォルトの名無しさん2010/01/21(木) 10:44:28
>>484
信じ込ませる、っていうのがタチ悪いなw
0487デフォルトの名無しさん2010/01/21(木) 10:51:39
最近勉強を始めて現在は配列、自作関数の作り方程度まで理解していると思います。
入門書を読んでもポインタがいまいちわかりずらいので今の自分にあった課題を何か出してください。
なるべくポインタを理解する手助けになるようにお願いします。
0488デフォルトの名無しさん2010/01/21(木) 10:52:59
文字列操作のstrcpyとかを自作してみるとか
0489デフォルトの名無しさん2010/01/21(木) 10:57:57
malloc, free, 構造体。作って指して使って消す。
0490デフォルトの名無しさん2010/01/21(木) 11:06:46
最初から余り深く考えず、失敗を恐れず時間をかけて
慣れ親しんでいくことが大切。英語の勉強と一緒。
0491デフォルトの名無しさん2010/01/21(木) 12:24:36
>>487
つ宿題スレ
0492デフォルトの名無しさん2010/01/21(木) 13:22:03
>>483
ありがとうございます。
static __thread char *buf;
のように書き直しました。ただ、サポートされていないとエラーが出るのですが・・・
環境のせいですかね??みんなは普通に出来るんですか?

thread-local storage not supported for this target
0493デフォルトの名無しさん2010/01/21(木) 13:40:43
pthread_getspecific/pthread_setspecificなら使えるんじゃない
0494デフォルトの名無しさん2010/01/21(木) 19:52:32
while文が抜け出すときに、未入力で改行だけ押すとループ終了にしたいんですが、条件式にはどう書けばいいですか?
0495デフォルトの名無しさん2010/01/21(木) 20:18:12
while(!未入力で改行だけ)
0496デフォルトの名無しさん2010/01/21(木) 20:18:51
入力の読み取り方はどうしてるんだよ
0497デフォルトの名無しさん2010/01/21(木) 20:34:39
while(?){
fgets(a[i],sizeof(add),stdin);
i++;
}
こんな感じです。
0498デフォルトの名無しさん2010/01/21(木) 20:36:43
fgets(add[i],sizeof(add),stdin);でした
0499デフォルトの名無しさん2010/01/21(木) 20:37:23
>>497
if(a[0]=='\n')break;
とか
if(strlen(a)==1)break;
0500デフォルトの名無しさん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
0501デフォルトの名無しさん2010/01/21(木) 23:31:02
char ptr ="ABC";
char array[];
int len = 0;

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

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

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

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

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

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

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

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

メタルの僕をいかにこき使うかにあたっての
サディズムが明暗を分ける
0516デフォルトの名無しさん2010/01/22(金) 00:44:05
思い通りに動かせた時に喜べるかどうか?かな。
05175002010/01/22(金) 00:48:36
>>510-511
数値ぴったりですね!
標準偏差以外の部分にも手を入れて頂いたようで、大変見やすくなりました
本当に助かりました ありがとうございました
0518age2010/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

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

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

ptr1 ="ABC";

strcat(ptr2,ptr1);
なんでできない?
0521デフォルトの名無しさん2010/01/22(金) 01:24:18
>>519
がんばる必要は無い
今の時点で差がついてるのなら、なにをやっても無駄
センスはどうやっても埋められないんだよ
むしろ、中途半端なウデでプログラム関係の会社に入ってもらっても、クソ以下の価値しかありません
0522デフォルトの名無しさん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]);

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

俺はいま追われる立場でつらいが、敵ながらあっぱれな若いの見てるとうれしくなる
0524デフォルトの名無しさん2010/01/22(金) 03:50:48
>>520
C言語では文字列は特殊です。初期化はできても代入はできません。
0525デフォルトの名無しさん2010/01/22(金) 06:25:09
switchで||って使える?
case 1 || 2:みたいな感じで
0526デフォルトの名無しさん2010/01/22(金) 06:37:57
>>525
breakしないじゃダメなの?
0527デフォルトの名無しさん2010/01/22(金) 06:51:20
>>525
実際にやってみればいいじゃん
0528デフォルトの名無しさん2010/01/22(金) 08:06:19
>>525
ダメ。
case 1:
case 2:
と複数書く。
case 1: case 2:
一行に並べても良い
0529デフォルトの名無しさん2010/01/22(金) 10:56:29
C言語って文字列を扱いにくいウンコ言語なのかぁ
0530デフォルトの名無しさん2010/01/22(金) 10:59:24
文字列に限らず動的にサイズが変わるものはたいがい苦手
苦手っていうか糞面倒
熟練PGでも気を抜くとすぐバッファオーバーフローやらかすしな
0531デフォルトの名無しさん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"};

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

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

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

どなたかできる方教えてください
0541デフォルトの名無しさん2010/01/22(金) 19:19:25
 | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|
 | つぎでボケて!   |
 |_________|
    ∧∧ ||
    ( ゚д゚) ||
    / づΦ
0542デフォルトの名無しさん2010/01/22(金) 19:20:22
>>540
ここで具体的な質問すると宿題スレ池って言われるのがオチ
0543デフォルトの名無しさん2010/01/22(金) 19:42:50
具体的な質問というよりこの場合 「問題文は、」 とか書いてあるからだな
宿題スレ池
0544デフォルトの名無しさん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
(ここから進まない)

なぜでしょうか?
0545デフォルトの名無しさん2010/01/22(金) 20:17:38
>>544
なんつーか、まず構造を整理したほうがいいよ。
月による日数の種類は29日、30日、31日の3通りしかないんだから、条件分岐は3通りにできるはず。
0546デフォルトの名無しさん2010/01/22(金) 20:20:17
乱数で出した4点の全部のルートの総距離を計算して
最短ルートを求めたいんですが、
図示してみると明らかに違っています。
どうすればよいのでしょうか?
http://www.dotup.org/uploda/www.dotup.org583815.c.html
0547デフォルトの名無しさん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;
}
0548デフォルトの名無しさん2010/01/22(金) 20:29:49
>>547
分かりました
やってみます
0549デフォルトの名無しさん2010/01/22(金) 20:33:37
今年の2月は何日までだよ
0550sumimasen2010/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
0551超低脳ぷ2010/01/22(金) 23:12:25
ねぇねぇ
#if 0
A
#else
B
#endif
のAはどんな場合に有効なの?
何が0の時?
0552デフォルトの名無しさん2010/01/22(金) 23:16:12
条件が0つまり偽なんだから常にelse部分が有効になる
主にデバッグしてる時に手早く0とか1に書き変えてコードを切り替えるのに使われる
0553超低脳ぷ2010/01/22(金) 23:37:11
>>552
どもども、そうなんですか
なんか低脳っぽいやりかた
0554デフォルトの名無しさん2010/01/22(金) 23:42:52
しねよ
0555デフォルトの名無しさん2010/01/22(金) 23:52:38
こういうやつはきっとコメントアウト使ってバグに悩む
0556デフォルトの名無しさん2010/01/23(土) 00:00:30
> が大なりなら < が小なりで、
そんな感じのプログラムです。
よろしくお願いします。
0557デフォルトの名無しさん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

となってしまいました・・・何が起きているんでしょうか?
0558デフォルトの名無しさん2010/01/23(土) 00:28:58
>>557
fprintf で出力されたのではないでしょうか?
0559デフォルトの名無しさん2010/01/23(土) 00:33:35
あと、エッフェル塔のプログラムもお願いします。
05605572010/01/23(土) 00:33:45
>>558
ありがとうがごいます
どうすれば入力した値どおりになりますかね?
0561デフォルトの名無しさん2010/01/23(土) 00:42:02
>>560
a, b, heikin[j], saikou[j], saitei[j]
これらの型や値、OS、コンパイラ、バージョンなどは秘密なの?
05625572010/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]);
}
です
0563デフォルトの名無しさん2010/01/23(土) 01:42:10
voidポインタの使いどころがわかりません。

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

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

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

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

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

俺も初心者なので詳しいことは教えられないが
興味があったら本買ってみて読んでごらんよ。楽しいよ。
0584デフォルトの名無しさん2010/01/23(土) 10:50:44
glibcのmallocは、ここが詳しい
http://www.valinux.co.jp/contents/tech/techlib/eos/malloc/malloc_001.html
0585デフォルトの名無しさん2010/01/23(土) 10:56:46
>>583
なるほど。もっと効率のいいやり方なんですね。
まぁ。それはそうだわなー。

>>584
おぉ。なんかわかりやすそうです。サンクス。
じっくり読みます。
0586デフォルトの名無しさん2010/01/23(土) 11:22:48
>>584
ほとんどの実装がこうなっているならばあの忌まわしいmalloc/free論争に
ピリオドが打てるんだけどな
0587デフォルトの名無しさん2010/01/23(土) 11:27:24
数値計算の自作プログラムの実行スピードが遅くて困ってるんだけど簡単に早くする方法って無い?
ちなみに並列化はすでに完了。
変数の名前短くするとかは無駄かな?
何でもいいのでアイデアくれ。
0588デフォルトの名無しさん2010/01/23(土) 11:28:55
utf8の文字列に対してstrstrとか、strchrって有効でしょうか?
0589デフォルトの名無しさん2010/01/23(土) 11:30:50
ソースさらさないと曖昧論しか出てこないぞ
プロファイルとってアセンブラリスト見てチューニング、SIMD、GPGPU、クラスタリング、マシンのリプレース
0590デフォルトの名無しさん2010/01/23(土) 11:35:39
>>588
できる。
0591デフォルトの名無しさん2010/01/23(土) 11:38:52
曖昧論で良いから教えて欲しいのよ。
0592デフォルトの名無しさん2010/01/23(土) 11:41:36
>>590
ありがとうございます。
0593デフォルトの名無しさん2010/01/23(土) 11:52:45
>>591
優秀な人に作り直してもらう、とか
0594デフォルトの名無しさん2010/01/23(土) 12:25:50
>>587
> 変数の名前短くするとか
Cで、こんなこと言ってるあたりからすると、君には無理。
0595デフォルトの名無しさん2010/01/23(土) 12:29:08
なにそのBASICw
0596デフォルトの名無しさん2010/01/23(土) 12:38:33
>>587
巨大な行列の掛け算なら先に転置行列を作ってから計算すれば倍速くらいにはなる
0597デフォルトの名無しさん2010/01/23(土) 14:20:23
ifの条件式を
1< i <10
1 <j <10
にしたいのですが
if(i>=1 || j>=1 || i<=10 || j<=10)
上ではだめでした
どうすればうまくできますか?
0598デフォルトの名無しさん2010/01/23(土) 14:23:40
1< i <10と1 <j <10の関係は
ORとANDのどっち?
0599デフォルトの名無しさん2010/01/23(土) 14:25:06
if(i>1 && i<10 &&(または||) j>1 && j<10)
0600デフォルトの名無しさん2010/01/23(土) 14:27:10
>>598
ANDです。
説明不足ですみません
0601デフォルトの名無しさん2010/01/23(土) 14:29:35
>>600
>>599
0602デフォルトの名無しさん2010/01/23(土) 14:29:35
>>599
ありがとうございます
0603デフォルトの名無しさん2010/01/23(土) 16:22:17
どういたしまして
0604デフォルトの名無しさん2010/01/23(土) 16:59:40
情報系の大学生って4年間で何コマ分くらいプログラムの勉強するのですか?
0605デフォルトの名無しさん2010/01/23(土) 17:03:25
2コマ
0606デフォルトの名無しさん2010/01/23(土) 17:03:37
>>604
スレ違いだとは思わないのかね。
0607デフォルトの名無しさん2010/01/23(土) 17:04:43
マジレスすると意味不明な講義ばっかりでプログラミングは専門学校以下
実装より理論重視
0608デフォルトの名無しさん2010/01/23(土) 17:07:03
すみません、ありがとうございます。
0609デフォルトの名無しさん2010/01/23(土) 19:51:40
理論も大事だぞ
むろんプログラムを組めなきゃどうにもならないが、
そんなのはPCさえあれば自分でできることだし、
講義聞いたからって身に付くもんでもないからな
0610デフォルトの名無しさん2010/01/23(土) 20:05:39
いや、理論こそが最も大事。
米国ではコンピュータサイエンス(情報科学)を学ぶ。だから合理的な構造やアルゴリズムが生まれる。
0611デフォルトの名無しさん2010/01/23(土) 21:02:34
Information Scienceはコンピュータサイエンスと同義じゃないぞ
日本の大学でもやるけどね、人間行動学とか、そういう糞退屈なのを含む
工学部では特に、どうすれば効率よく金儲け出来るか。端的にいえばそんな話だね
0612デフォルトの名無しさん2010/01/23(土) 21:04:30
スレタイを読む日本語力が求められる
0613デフォルトの名無しさん2010/01/23(土) 23:06:35
>>612
お前には「流れ」を読むチカラが求められる
0614デフォルトの名無しさん2010/01/23(土) 23:17:28
ある任意の自然数が奇数か偶数かの判断をするのには
もっとも高速となる手段としてはどのようなものが考えられますか
やはりビットを用いたほうがよろしいのでしょうか
0615デフォルトの名無しさん2010/01/23(土) 23:31:11
速度が知りたければ実測する以外に無い
0616デフォルトの名無しさん2010/01/23(土) 23:53:04
>>615
だれも速度が知りたいなんて話はしていないが馬鹿なの?
もしかして馬鹿なの?
0617デフォルトの名無しさん2010/01/23(土) 23:58:20
O(1)だからどうでもいい
0618デフォルトの名無しさん2010/01/24(日) 00:00:02
>>616
どんなアルゴリズムでやろうと結果は実測でしか知り得ないって話じゃないの?
0619デフォルトの名無しさん2010/01/24(日) 00:01:20
仮説を立て実証するのが物理学
0620デフォルトの名無しさん2010/01/24(日) 00:02:22
高速となる手段なのに速度はどうでもいいという・・・
0621デフォルトの名無しさん2010/01/24(日) 00:06:04
2の補数表現でさえあれば最下位ビットを見ればいいが
アーキテクチャによっては専用のフラグを持っているかも知れず
結局実測に勝るものなし。
0622デフォルトの名無しさん2010/01/24(日) 00:14:46
>>620
高速化する方法と速度を知りたいって全然違う質問だよね?
どの程度高速化できたかは実測するしかないが、
高速化する方法が実測するしかないなんて馬鹿としか思えん。
流れ理解しろよ。
0623デフォルトの名無しさん2010/01/24(日) 00:17:39
if (number & 1) {
printf("奇数");
} else {
printf("偶数");
}
0624デフォルトの名無しさん2010/01/24(日) 00:23:39
>>623
>>621
0625デフォルトの名無しさん2010/01/24(日) 00:44:02
ほんとお前らの盛り上げ力には脱帽だぜ
0626デフォルトの名無しさん2010/01/24(日) 05:10:09
multimapの最も登録されている数が多いキーを知るいい方法があればご教授ください!!
0627デフォルトの名無しさん2010/01/24(日) 05:24:50
ここはC言語か、スレを間違えました。取り下げです。
0628デフォルトの名無しさん2010/01/24(日) 10:52:24
int is_odd(int n) {
  return n - ((n>>1) << 1);
}
>>614 には「そうだ。」
0629デフォルトの名無しさん2010/01/24(日) 11:04:16
選挙に行こう
0630デフォルトの名無しさん2010/01/24(日) 13:09:35
せーんきょーせんきょーあかるいせんきょー♪
0631デフォルトの名無しさん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;
}


関数を作るのが良くわかりません
出来ればわかりやすく教えてください
0632デフォルトの名無しさん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;
}

どこが分からんの?
0633デフォルトの名無しさん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;
の組み合わせがなぜそうなるのか分からないです
0634デフォルトの名無しさん2010/01/24(日) 13:49:18
意味が分からないのは俺だけか。
0635デフォルトの名無しさん2010/01/24(日) 13:50:11
>>634がわからないのは、>>633の質問だよな?
そうだったら仲間だ
0636デフォルトの名無しさん2010/01/24(日) 13:51:45
引数と戻り値って言葉の意味分かる?
それとも、tasizan(a, b)とtasizan(x, y)で
なんでaとbからxとyになっとんねんって疑問?
0637デフォルトの名無しさん2010/01/24(日) 14:02:32
戻り値は知らないです
0638デフォルトの名無しさん2010/01/24(日) 14:08:42
「やさしいC」「猫でもわかる」とかそこら辺の入門書を読むことを勧める
0639デフォルトの名無しさん2010/01/24(日) 14:15:24
猫でも分かるは俺にはわからない
0640デフォルトの名無しさん2010/01/24(日) 14:19:37
「猫でもわかる」ならば「人間にもわかる」が成り立つかどうかはさておき、実際には、猫に読ませても猫は理解できない。
さらには、猫が理解できたかどうかを僕たちが知る手段すらない。
0641デフォルトの名無しさん2010/01/24(日) 14:21:27
ネタにマジレス
0642デフォルトの名無しさん2010/01/24(日) 14:24:40
ニャー
0643デフォルトの名無しさん2010/01/24(日) 14:26:58
>>639
それを不等式で表すとどうなる?
0644デフォルトの名無しさん2010/01/24(日) 14:29:48
冗談はさておき、
関数とポインタでつまずくと、今後習うことが一切理解できなくなるから
本気で勉強しろよ
0645デフォルトの名無しさん2010/01/24(日) 14:31:35
ネコはああ見えて賢い動物だからな
もっと下等な動物にあわせた入門書が必要なのかもしれない
0646デフォルトの名無しさん2010/01/24(日) 14:31:45
戻り値知らんならもう関数の型はvoidにして参照渡しでいいじゃん
0647デフォルトの名無しさん2010/01/24(日) 14:34:35
>>644
ポインタはともかく
関数で躓くとか、
優秀な小学生に負けるレベルだろ
0648デフォルトの名無しさん2010/01/24(日) 14:35:56
小学生馬鹿にすんな
0649デフォルトの名無しさん2010/01/24(日) 14:36:41
え?小学生じゃないの?
0650デフォルトの名無しさん2010/01/24(日) 14:37:16
>>647
関数ポインタとかつまずく奴結構多いぞ
0651デフォルトの名無しさん2010/01/24(日) 14:37:56
関数ポインタはポインタの一部
関数で躓くのはどうかなあ・・・
0652デフォルトの名無しさん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); // 関数の宣言
は書かなくていい。ひとまず必要は無い。

ただ、流儀として使う関数全部を、いつも先に宣言しておく、という人々は居る。
0653デフォルトの名無しさん2010/01/24(日) 14:44:56
中高の数学でy=x^2とf(x)=x^2の違いが分からないまま卒業した人
0654デフォルトの名無しさん2010/01/24(日) 14:59:13
>>653
俺ヤベェ
わかんないわ
0655デフォルトの名無しさん2010/01/24(日) 15:00:01
関数ポインタって実際に使ったことがないんだけど
どういった便利さとかがあるのかよくわからないれす(^q^)
0656デフォルトの名無しさん2010/01/24(日) 15:04:08
関数の宣言はヘッダファイルに書こうね(はあと)
0657デフォルトの名無しさん2010/01/24(日) 15:04:27
普通に勉強してて最初にさわるのはqsort()あたりじゃないかなあ
0658デフォルトの名無しさん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;}
ってことかな?
0659デフォルトの名無しさん2010/01/24(日) 15:08:14
>>655
ライブラリなんかのイベント処理を行うための
コールバック関数を記述するための
インタフェースとして使われることがよくある
0660デフォルトの名無しさん2010/01/24(日) 15:10:38
どうでもいいけど、「関数」に反応して毎回、数学の定義上の「関数」出すのやめて。
0661デフォルトの名無しさん2010/01/24(日) 15:16:09
>>660
でも同じ名前なんだからしょうがないじゃん。だろ?
0662デフォルトの名無しさん2010/01/24(日) 15:29:41
>>655
テーブルジャンプ
0663デフォルトの名無しさん2010/01/24(日) 15:32:09
>>662
名前がカッコよすぎて濡れたわ
0664デフォルトの名無しさん2010/01/24(日) 15:32:52
テールスープ
0665デフォルトの名無しさん2010/01/24(日) 18:10:04
>>655
関数ポインタはウインドウズならウインドウプロシージャ
0666デフォルトの名無しさん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;
}
0667デフォルトの名無しさん2010/01/24(日) 22:45:53
>>655
おまえさんが使ってるテキスト、相当に問題ありそうだな
有用性を示すサンプルが見あたらないってことだろ

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

つまり

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

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

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

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

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

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

いや「『こんにちは、世界』ってどういう意味だろう」ということにすら
疑問を持つ初心者もいるかもしれない(悪いことではないが...)
0690デフォルトの名無しさん2010/01/25(月) 23:07:28
ハローワーク
0691デフォルトの名無しさん2010/01/26(火) 00:19:15
>>689
世界初の原潜が処女航海で打電したメッセージだとか。
0692デフォルトの名無しさん2010/01/26(火) 00:21:41
最初は関数の説明からすればいいのに
0693デフォルトの名無しさん2010/01/26(火) 00:24:12
いやまずは「こんぴゅーたーのしくみ」からだろ。わりとマジで。
0694デフォルトの名無しさん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);
 }

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

0695デフォルトの名無しさん2010/01/26(火) 00:25:24
まずそれから
#include "HelloWorld.c"
が最初のプログラムで良くね?
0696デフォルトの名無しさん2010/01/26(火) 00:29:10
手元にPCが無ければくよくよ悩まないほうがいい
コンパイラの気まぐれな警告を潰していけば
コンパイラと意思疎通が出来ていないだけだという
ことがわかる。(要するに*pは1文字を表すので
p==NULLと*p==NULLは意味が違うというだけ
なんだが )
0697デフォルトの名無しさん2010/01/26(火) 00:29:11
すいません
ageます
0698デフォルトの名無しさん2010/01/26(火) 00:30:54
>>694
if( *p != NULL ){
0699デフォルトの名無しさん2010/01/26(火) 00:35:23
http://pc12.2ch.net/test/read.cgi/tech/1206447234/
マルチかよ
0700デフォルトの名無しさん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を見ちゃってる
0701デフォルトの名無しさん2010/01/26(火) 00:42:14
>>696
かなりデバッグに苦しんでて悩まずにはいられないんです・・・
>>696,698
直します。
ありがとうございます。


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

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


0704デフォルトの名無しさん2010/01/26(火) 01:00:28
>>702
投稿時間からしてマルチだろ
0705デフォルトの名無しさん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 */
}
0706デフォルトの名無しさん2010/01/26(火) 12:33:40
>>705
int printf(const char *format,...);
の定義に立ち返れ。
a,b,cをコンパイラはどう解釈してどのように渡しているか?
0707デフォルトの名無しさん2010/01/26(火) 12:37:02
関数の定義によく出てくる「...」はどういう意味ですか?
0708デフォルトの名無しさん2010/01/26(火) 12:54:09
可変引数
暗黙の格上げを行って引数を詰む
char, short → int へ
float → double へ
可変引数を持つ関数は 上記の格上げを考慮して、詰まれた値を抜き出し適宜操作

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

printf("\n");
putchar('\n');
puts("");
0712デフォルトの名無しさん2010/01/26(火) 13:45:24
その場限りの非公開匿名共用体配列に突っ込んでその共用体の
アドレスだけを渡してから呼ぶことのほうが多いだろ
値型が増えそうなので、暗黙のキャストは色々と問題が多いと
いうことで、最近はしないようになってきている。
(ポインタ<->int 程度のことしかしない)
0713デフォルトの名無しさん2010/01/26(火) 15:59:43
お前だけ
0714デフォルトの名無しさん2010/01/26(火) 16:09:21
>>712
警告が出ない暗黙のキャストは安全だから、不必要なキャストはしないほうがいい。
> ポインタ<->int 
これは、危険だから、暗黙のキャストはしない。
0715デフォルトの名無しさん2010/01/26(火) 16:38:41
>>711
好きなように。
俺ならprintf、ただprintfは通常大きなコードを吐き出しから条件によっては谷逃げる。
0716デフォルトの名無しさん2010/01/26(火) 16:38:54
コンパイラに警告を出させない為だけという意味では
警告が出ないキャストの記述は省略したほうが良い。
コード記述量とバグ潜入率は相関があるから。
ポインタとintの相互変換をキャスト無しで行っている
コードをノーチェックで通してしまうようなコンパイラは
使わない方がよい
0717デフォルトの名無しさん2010/01/26(火) 17:09:18
>>712
昔出てきたが execl() は 可変の終端を示すのに ヌルポを要求してる。
そこで安易に 0 とやっても コンパイラは警告のしようが無いので(可変部の型は確定しようがない) 危ないよ
って例
0718デフォルトの名無しさん2010/01/26(火) 17:11:15
あ NULL がどう定義されているか自信が無い場合ね。
0719デフォルトの名無しさん2010/01/26(火) 17:14:04
NULLがコンパイラ付属のライブラリレベルでユニークじゃ
ないような処理系ってある?
0720デフォルトの名無しさん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)
0721デフォルトの名無しさん2010/01/26(火) 17:19:32
>>719
ある。8086。0ですらない場合がある。
0722デフォルトの名無しさん2010/01/26(火) 17:19:40
>>720
char c = '\0'; // ヌル文字、ナル文字
0723デフォルトの名無しさん2010/01/26(火) 17:23:31
>>722
うん 俺はそう記述するか char c = 0; ってリテラルの 0 渡しちゃってる。
0724デフォルトの名無しさん2010/01/26(火) 17:27:57
リテラルレベルでの暗黙のキャストと、コンパイラが作り出す(だろう)変数シンボルテーブル上のTYPE項目の一時的書き換え処理
のキャストは似ていてかなり違います。後者は明示的に指示しない
と処理を単純化する為のオプティマイザの力から、おかしな
コードを出す場合があります。特にコードの高速性を誇るコンパイラ
の場合はその傾向が大です。リテラルレベルのキャストは省略可能
です。厳密にはこれはキャストとは言わないからです。
0725デフォルトの名無しさん2010/01/26(火) 18:20:42
>>705
いわゆる promotion (暗黙の型変換)により、関数の引数は int に符号拡張されるからです。
例にあげたコードは、どれも int に格上げされて printf()に渡ります。
int とサイズの違う long では %ld としなければならないことになります。
0726デフォルトの名無しさん2010/01/26(火) 18:21:51
>>717
そうそう、だから昔は (char *)0 としていました。
0727デフォルトの名無しさん2010/01/26(火) 18:23:04
今でも (char *)0 としてください。
0728デフォルトの名無しさん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になる環境です。
07297282010/01/26(火) 18:33:04
肝心な事が抜けていた。

sizeof出みると、ST1は8になって、ST2は12になります。
この違いを理解したいのです。
0730デフォルトの名無しさん2010/01/26(火) 18:45:02
>なぜcharが4バイト扱いになってるの?
「構造体全体のバイト数」が4の倍数でないと
配列にしたときにlongのアライメントがずれるから。
0731デフォルトの名無しさん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バイトにします
0732デフォルトの名無しさん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
0733デフォルトの名無しさん2010/01/26(火) 18:53:42
#pragma pack(4) ならそうなんだろうけど
#pragma pack(8) で >>732 の詰めかたなんだよね

ヘルプの pack([n]) の説明がややこしー
0734デフォルトの名無しさん2010/01/26(火) 19:01:39
pack(8)でも8バイトアラインメントを要求するメンバ(doubleとか)がなければ一緒では
0735デフォルトの名無しさん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に先越されたけど。
0736デフォルトの名無しさん2010/01/26(火) 19:49:55
カラーの画像からの相関係数を求めようとしてるのですが、RGBの指定をどうすればいいのかお願いします
グレイスケール(PGM)での相関係数は出せました
0737デフォルトの名無しさん2010/01/27(水) 00:19:33
doubleで0から1mでの乱数を作るにはどうすればいいですか?
07387372010/01/27(水) 00:22:01
すみません0から1までです。
0739デフォルトの名無しさん2010/01/27(水) 00:27:18
0〜10まで乱数作って1/10じゃダメなの?
0740デフォルトの名無しさん2010/01/27(水) 00:31:35
>>737
drand48()じゃだめなの?
0741デフォルトの名無しさん2010/01/27(水) 12:42:45
関数のsscanf,fscanfの先頭についてるsとfって何の略か教えてください
調べてもわかりませんでした
0742デフォルトの名無しさん2010/01/27(水) 12:47:16
sscanfは第一引数char *strから入力をもらうって事だからs
fscanfは第一引数FILE *streamから入力をもらうって事だからf
後者はfgetsとかでいろいろ使われてるな
07437412010/01/27(水) 12:51:25
sがstringでfがfileっぽいですね・・・
無駄な書き込みすみませんでした
0744デフォルトの名無しさん2010/01/27(水) 17:50:56
char name[3][10]={"Aさん","Bさん","Cさん"}; のような名前リストを作る時

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

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

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

0745デフォルトの名無しさん2010/01/27(水) 17:58:08
>>737
((double)rand() / ((double)RAND_MAX + 1))
0746デフォルトの名無しさん2010/01/27(水) 18:00:26
execv(2) を使いたいのですが、
execv(char *path, char **argv)
の第二引数を malloc() で作ってしまうと、execv() を実行したまま、戻ってこないため、free() できません。
こういうときは、malloc() しっぱなしですましてしまうものでしょうか?
0747デフォルトの名無しさん2010/01/27(水) 18:00:36
>>744
void func(char (*name)[10])
とか?
0748デフォルトの名無しさん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さん"};
とすればよい
0749デフォルトの名無しさん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;
}

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

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

とすれば、関数側は

void func(char **name) {}

でもよい。
0755デフォルトの名無しさん2010/01/27(水) 19:57:51
>>754
関数側から要素数を調べる方法あります?
0756デフォルトの名無しさん2010/01/27(水) 20:01:16
>>755
ムリ。何らかの方法で渡す必要がある。
07577442010/01/27(水) 20:05:49
返答してくださった方ありがとうございます。
提示された方法色々試してみます。
0758デフォルトの名無しさん2010/01/27(水) 20:07:00
>>756
thx
07597462010/01/27(水) 20:23:19
>>750
>>752
>>753
感謝です。
0760デフォルトの名無しさん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;
0761デフォルトの名無しさん2010/01/27(水) 21:32:00
>>760
その場合は do{ 〜 }while(0); を使う
0762デフォルトの名無しさん2010/01/27(水) 21:33:23
素直にフラグかgoto使えよ
0763デフォルトの名無しさん2010/01/27(水) 21:46:55
>>761
do - whileは全く使わないので忘れてました。
return入れ忘れてクルクル回る事がないし
そっちの方が良いですね。

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

thx
0764デフォルトの名無しさん2010/01/27(水) 21:48:18
C言語で連想配列ってどうやるの?
不可変でおk
0765デフォルトの名無しさん2010/01/27(水) 21:54:20
文字列の配列のうち、インデックスとして指定された文字列が何番目にあるか検索。
真面目に実装するとツリーなりハッシュなりで高速化しないといけないが。
0766デフォルトの名無しさん2010/01/27(水) 21:55:34
そんなもんねーよ。
0767デフォルトの名無しさん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()の成否で十分と勝手に想像。
0768デフォルトの名無しさん2010/01/27(水) 22:22:47
なんで goto ダメなんだろ?
フリーソフトウェアのソースとか読んでいると、例外処理で goto fail みたいなのをよく見るけどなぁ。

で、�dだ先でclose()とかfree()してたり。
0769デフォルトの名無しさん2010/01/27(水) 22:25:38
初心者な質問で申し訳ないですが、
「独習C」で勉強してるのですが練習問題9.6の2について、
巻末の解答のプログラムはちゃんと動きますか?
0770デフォルトの名無しさん2010/01/27(水) 22:33:59
>>769
http://www.seshop.com/book/errata/Default.asp?mode=search&keyword=%93%C6%8FKC&Andor=AND&Image1.x=0&Image1.y=0&Image1=%8C%9F%8D%F5
07717602010/01/27(水) 22:37:22
>>767
>>760は改行多すぎるって怒られたんでシンプルに書きました。
結果をまとめるのもいいですね。
まとめることができない事の方が多いですけど。

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

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

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

人様には見られないところに書くソースならともかく
そうでないならやめとこうぜ。
0779デフォルトの名無しさん2010/01/27(水) 23:20:02
>>777
単に goto 禁止規約に対する対策
0780デフォルトの名無しさん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
07817602010/01/27(水) 23:28:44
>>778
なにかまずい?
breakだらけになること以外にw
0782デフォルトの名無しさん2010/01/27(水) 23:49:27
>>781
do {} while (0); を嫌う人は一定数いる。
「ループするわけでもないのに do/while を使うな」だっけか<理由
0783デフォルトの名無しさん2010/01/27(水) 23:57:22
構造体って言うとクラスも知らない田舎者に思われますか?
07847602010/01/28(木) 00:01:30
>>782
理由がそれのみなら使っても全然オッケーな気が。
何か問題があるなら使わないけど。

do{ // while( 0 )

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

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

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

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

あがとうございました。
0787デフォルトの名無しさん2010/01/28(木) 00:26:04
do{}while(0)なんてマクロ中では使うけど
コード中に嬉しがって使うようなもんでもないだろ。
0788デフォルトの名無しさん2010/01/28(木) 00:29:38
この手の文法の穴をついたテクニックは業務では
嫌われる。同様に蛇蝎のように嫌われるのはマクロ。
コード保全を重視する業務現場ではコーディング
規約でdo while(0)や定数以外のマクロの使用や定義
が禁止が明文化されているところも多いね。
0789デフォルトの名無しさん2010/01/28(木) 00:30:24
emacsが
switch () {
case x:
{
}
}
だと、ちゃんとインデントしてくれないのだ。
do {
} while();
だと、インデントしてくれるのだ。
emacsの設定に時間をかけたくないから、これでいいのだ。
0790デフォルトの名無しさん2010/01/28(木) 00:34:12
case XXX:の後に{}を付けることがアブノーマル
で多分Cでは出来ない。C++なら可能。
caseはラベルに過ぎず(但しgotoで何故か飛べない)
switch内のコードは同一インデントレベルでシーケンス
を為している。
0791デフォルトの名無しさん2010/01/28(木) 00:52:15
文を書けるところにブロックを書く事は文法上正しい。
変数のスコープを限定するために使用する。
0792デフォルトの名無しさん2010/01/28(木) 01:49:42
にも関わらずCでは禁止されているので
このスレ的には、変数のスコープを細かく
制御する目的で{ } を乱立することを許す
文法は邪道であるという立場になるか...
0793デフォルトの名無しさん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);
}
の方が読みやすい
0794デフォルトの名無しさん2010/01/28(木) 02:55:41
sexよりmankoの方がやる気が出る
0795デフォルトの名無しさん2010/01/28(木) 03:45:16
>>792
switch の中のブロック文は禁止されてた?
gcc しか使ってないから知らないんだが、
どのコンパイラだとダメとか分かれば教えて欲しい
0796デフォルトの名無しさん2010/01/28(木) 07:45:33
ものすごく初歩的なことなんですが、疑問に思ったので質問させてください

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

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

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

case CASE1:{

}
case CASE2:{

}
}
という書き方はしないだろ
見た目と挙動の間にズレが出るから。
0806デフォルトの名無しさん2010/01/28(木) 13:23:56
初心者なら質問の体裁を整えてからレスしてください。
0807デフォルトの名無しさん2010/01/28(木) 13:29:40
>>805
俺は特にズレないんだが、見た目でどうなると思い、どう挙動したかを教えてくれないか
0808デフォルトの名無しさん2010/01/28(木) 13:30:09
http://pastebin.com/d1e037fc9
5,7行目は我慢するとして、8行目と12行目のインデントが
異なるのがどうしてもイヤだ。
0809デフォルトの名無しさん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文のように
必ずしも排他的とは言えない処理に使用するのは何だかな〜って感じ
0810デフォルトの名無しさん2010/01/28(木) 14:06:36
0か1を出力する乱数を作るにはどうすればいいですか?
0811デフォルトの名無しさん2010/01/28(木) 14:07:44
またか
0812デフォルトの名無しさん2010/01/28(木) 14:13:12
rand()%2
0813デフォルトの名無しさん2010/01/28(木) 14:23:47
ありがとう
0814デフォルトの名無しさん2010/01/28(木) 15:12:29
こうしなさいって宿題スレで教わった

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

そうなんw 見てみたいね。
gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
でオプション無しでコンパイルした限りは、
それはそれは静かなものだった。
0832デフォルトの名無しさん2010/01/28(木) 18:46:09
コンパイラの実装のバグだろといいたくなるような挙動だな
正しく動くかエラーではじくかどっちかにしろよ
0833デフォルトの名無しさん2010/01/28(木) 18:49:01
gccのオプション無しはわりと静か
-Wall -Wextra -pedantic を付けよう
-Werror も付ければ警告もエラー扱いになって実行ファイルが生成されなくなる
0834デフォルトの名無しさん2010/01/28(木) 18:51:56
GCCは良心的で非常に優れているがオプソという制約から
レアな細かい部分の対応には自然に限界があるだろ。
(対応するとコード量が爆発して誰も手がつけられなくなる)
0835デフォルトの名無しさん2010/01/28(木) 18:52:49
>>833
gcc -Wall -Wextra -pedantic -Werror 59-829.c
でもやっぱり何のエラーも、警告も無しのまま。
0836デフォルトの名無しさん2010/01/28(木) 18:58:34
>>835
いま info gcc を読んだところによれば、-O も付けないと警告してくれないらしい
0837デフォルトの名無しさん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
08388182010/01/28(木) 19:46:41
みなさまありがとうございました
結論は殆どのコンパイラでまともに対応していない
ということですね。了解しました。
0839デフォルトの名無しさん2010/01/28(木) 20:15:35
ちげーよ。
文法上は正しいので、エラーにならずコンパイル出来る事には問題ない。
動作は未定義。
0840デフォルトの名無しさん2010/01/28(木) 20:17:04
int i = i + 1;
を
int i;
i = i + 1;
と昔風に書けばおかしいことはすぐわかると思うんですけれどもね。
規格ではどうなっているのでしょうかね。
0841デフォルトの名無しさん2010/01/28(木) 20:25:50
>>820
rand() % 2
がうまくいかない理由を教えて
0842デフォルトの名無しさん2010/01/28(木) 20:30:07
http://ja.wikipedia.org/wiki/Rand
0843デフォルトの名無しさん2010/01/28(木) 20:48:07
変数宣言:変数型 変数名 初期化子;

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

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

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

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

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

とはできないんですか?
0869デフォルトの名無しさん2010/01/28(木) 22:59:49
出来ない。
0870デフォルトの名無しさん2010/01/28(木) 23:03:08
>>869
ありがとうございます
input[3]={0};
を
input [3]={1,1,1};
にしたいときはどうすればできますか?
0871デフォルトの名無しさん2010/01/28(木) 23:33:38
int input[3] = {1,1,1};
↑これは出来る。

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

これはおk?
0873デフォルトの名無しさん2010/01/28(木) 23:44:39
なぜ試さない
0874デフォルトの名無しさん2010/01/28(木) 23:47:37
なぜ試す
0875デフォルトの名無しさん2010/01/28(木) 23:47:56
流れ予想。
なぜ試さない→手元に環境がありません→codepad で試せ
0876デフォルトの名無しさん2010/01/29(金) 00:02:39
>>875
codepad ってどこですか→ggrks
0877デフォルトの名無しさん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 の中でその直前の名前が見える、で良さそう。
0878デフォルトの名無しさん2010/01/29(金) 00:14:53
>>872
試すまでもなく無理。
memcpy(input, _input, sizeof input);
しとけ。

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

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

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

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

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

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

int ret;

ret = 処理A;

if(ret == 0)
{
  ret = 処理B;
}

if(ret == 0)
{
  正常処理;
}
else
{
  エラー処理;
}

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

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

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

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

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

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

別に普通にあるんじゃね。
Aが実行できてないし、Bは実行されていないから
AもBも実行できなかった場合の始末でしょ。
0915デフォルトの名無しさん2010/01/30(土) 09:17:25
いいけど、goto使うに比べてわかりにくい。
0916デフォルトの名無しさん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自体は型なんて全く気にしていない。
単に引数で与えられたサイズの領域を確保して返してくれるだけ。
その領域にどういうやりかたでアクセスするかは、呼び出し側で決める必要がある。
0917デフォルトの名無しさん2010/01/30(土) 09:25:37
>913 >915

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

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

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

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

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

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

A()が真でB()の処理結果にかかわらず、実行する処理
がyA()だけど、聞きたいことはそういうことじゃないよね?
0920デフォルトの名無しさん2010/01/30(土) 11:23:05
すげぇ
goto論争ってまだやってんだw
嫌goto厨って実戦で悪手なgotoの使い方に遭遇したことあるんだろうか。
そういう世代ってそろそろ引退のお年頃って気がするけど。
0921デフォルトの名無しさん2010/01/30(土) 11:29:29
>>920
別に嫌goto論者は現れていないようですが。
0922デフォルトの名無しさん2010/01/30(土) 11:30:59
>>920
gotoに反応してるのはおまいだけのようですが
0923デフォルトの名無しさん2010/01/30(土) 11:36:58
見えない敵と戦っている人がいます。
きっと病気ですから、このスレから立ち去ることをお勧めします。
0924デフォルトの名無しさん2010/01/30(土) 11:37:37
#define goto switch(0){case
0925デフォルトの名無しさん2010/01/30(土) 14:08:17
CはPASCAL系よりはgotoに関しては寛容だとオモ
ラベルは宣言無しに重複しない限り勝手に定義出来るし..
(直後が空文はだめだけど)
PASCAL系の場合はlabel宣言してからじゃないと使えない。
0926デフォルトの名無しさん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()って何なの?と
0927デフォルトの名無しさん2010/01/30(土) 16:15:56
そんな大層な話じゃなかんべ。
&&がショートサーキットと知らんかっただけじゃ?
0928デフォルトの名無しさん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];はなにを意味しているのですか?
0929デフォルトの名無しさん2010/01/30(土) 16:34:28
配列の大きさを計算している
0930デフォルトの名無しさん2010/01/30(土) 16:45:34
より正確に言うと配列の要素数な

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

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

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

どうして上位が1で埋められるんだろう
0937デフォルトの名無しさん2010/01/30(土) 23:14:01
>>936
-79 だからだろ
0938デフォルトの名無しさん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*)という型変換が連続的に
行われこのような結果を起こす。
0939デフォルトの名無しさん2010/01/30(土) 23:20:19
>>938
これはひどいバカ
0940デフォルトの名無しさん2010/01/30(土) 23:25:55
ほんとだw
キャストを徹底的に誤解してるw
0941デフォルトの名無しさん2010/01/30(土) 23:36:06
て言うか全部間違えてる
0942デフォルトの名無しさん2010/01/30(土) 23:47:19
符号ありなら最上位ビットがコピーされて符号拡張されるのはわかるけど、符号なしなら
0x0000001bになるんじゃないの?
0943デフォルトの名無しさん2010/01/30(土) 23:56:36
'ア'がchar型だと思ってるやつはいないよな?
0944デフォルトの名無しさん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;
}
0945デフォルトの名無しさん2010/01/30(土) 23:59:42
>>943
コンパイラは char だと思っているかも知れない
0946デフォルトの名無しさん2010/01/31(日) 00:00:55
>>945
規格無視もいいとこの糞処理系だな
0947デフォルトの名無しさん2010/01/31(日) 00:12:26
>>946
Shift-JISなら半角カナはchar。
Windowsは、クソとかいいそ。
0948デフォルトの名無しさん2010/01/31(日) 00:15:54
>>947
C言語の規格を読み直せ
character literalはint型だ
0949デフォルトの名無しさん2010/01/31(日) 00:18:54
おお。すまん。だから、caseに書けるんだったな。
0950デフォルトの名無しさん2010/01/31(日) 00:21:25
半角カナってsizeof(char)*1かつマイナスで、意味がわからなくなったから全部ワイド文字で扱うようにした
0951デフォルトの名無しさん2010/01/31(日) 00:22:05
>>949
???
0952デフォルトの名無しさん2010/01/31(日) 00:22:46
>>948
MinGW だと 'ア' の値が
コンパイルオプションで変化する
sizeof('ア') は 4 だけどね

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

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

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

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


0986デフォルトの名無しさん2010/01/31(日) 09:05:12
rand()/(RAND_MAX/10+1)
[0.0 , 1.0)
0987デフォルトの名無しさん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]+$"

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

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

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

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

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

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

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

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

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


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

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

C言語なら俺に聞け(入門編)Part 60
http://pc12.2ch.net/test/read.cgi/tech/1264920499/
0999デフォルトの名無しさん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
死ね
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。