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

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

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

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

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

C言語なら俺に聞け! Part 112
http://pc8.2ch.net/test/read.cgi/tech/1123432321/

他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
2デフォルトの名無しさん:2005/08/27(土) 19:04:11



    人
  ((・e・))
   (ヽ )
     >)

     人
   ((・e・))
    ( , )
    (<
3デフォルトの名無しさん:2005/08/27(土) 19:28:40
C言語で画像や音楽や映像を出すにはどうすればいいですか?
4デフォルトの名無しさん:2005/08/27(土) 19:30:13
ネタなら面白い事書け
5デフォルトの名無しさん:2005/08/27(土) 19:33:01
白馬 白熊 白兎
6デフォルトの名無しさん:2005/08/27(土) 19:36:12
>>3
標準では出来ない。環境依存の方法を使うことになる。
では次の方〜
7デフォルトの名無しさん:2005/08/27(土) 19:38:50
 main()
 {
 int _a1;
   printf("%d"_a1)
   return 0;
 }

>>3
とりあえずこれをコンパイルしてみろ。
8デフォルトの名無しさん:2005/08/27(土) 19:40:01
>>7
コンパイルしましたが実行ファイルができただけでつ
9デフォルトの名無しさん:2005/08/27(土) 19:41:38
>>8
それを実行した結果がお前の人生だ。分かったな。
10デフォルトの名無しさん:2005/08/27(土) 19:57:01
Cを始めたいのですがPCがネット出来る環境にありません
明解C言語と言うのが良いらしいんですが、これにC言語及びコンパイラ等付属しているんですか?
11デフォルトの名無しさん:2005/08/27(土) 20:01:37
>>10
ふつう、OSにコンパイラがあらかじめ入っている。
12デフォルトの名無しさん:2005/08/27(土) 20:04:55
どこのOSだよ
13デフォルトの名無しさん:2005/08/27(土) 20:07:22
ふつうのOSですよ
14デフォルトの名無しさん:2005/08/27(土) 20:08:06
>>10
Linuxインストールすれば開発環境一式そろう。
Fedora Core でも、Debian でも、本の付録で着いてくるからそれでOK。
15デフォルトの名無しさん:2005/08/27(土) 20:13:35
ふつうの初心者はふつうのOSはWindowsだと思っているのがふつうなわけで
いやむしろOSってなんですかてきなやつもふつうにいるわけで
16デフォルトの名無しさん:2005/08/27(土) 20:14:07
>>14
Turbo・・・
17デフォルトの名無しさん:2005/08/27(土) 20:14:23
それはあなたの思い込みですね
18デフォルトの名無しさん:2005/08/27(土) 20:18:02 BE:174731257-##
CDから起動できるLinuxなら、インストールしなくても使えるしね。
19デフォルトの名無しさん:2005/08/27(土) 20:22:07
volatileとasmのコードが解読できません。
20デフォルトの名無しさん:2005/08/27(土) 20:33:38
その人に、パソコン=Windowsの等式が成り立っている以上
OSって何?でしょうね。
21デフォルトの名無しさん:2005/08/27(土) 20:36:41
うちの会社新規プロジェクトはVB.NETだから
Cしか使えない奴全員解雇だってさ。
もう終わったな、C
22デフォルトの名無しさん:2005/08/27(土) 20:39:14
終わってんのはオマエの会社の方じゃねえの?w
23ケンカする人嫌いです・・・あ、いや・・・やめてほしいな:2005/08/27(土) 20:42:20
VIPから来てあげたわよ

いまVIPが、世界が認めてない東海って名前を、
日本海に直してもらう作戦を行ってるのは、当然知ってるわよね?

VIPPERの力で、Googleが東海の単独表記を取り下げたのは有名ね。

でも、いまVIPは大きな問題を抱えてる。
ITスキル、特に鯖関係のものが、圧倒的に足りないのよ。

それでなんだけど・・・んちょっと、、、VIPに協力してほしいのよね。
べ、べつにあんただったから頼みに来たわけじゃないわよ!勘違いしないでよね!

でも、あなたの力があれば、日本海を取り戻すのが近くなるのは・・・確かだわ。
もし・・・協力してくれるんなら、このスレに書き込んでほしい。
http://ex11.2ch.net/test/read.cgi/news4vip/1125074145/

・・・・やっぱり、あなたに協力して・・・ほしいから。
24デフォルトの名無しさん:2005/08/27(土) 20:42:26
VB.NETってそれ..........
25デフォルトの名無しさん:2005/08/27(土) 20:57:52 BE:19969722-##
>>21
まあ、言語一つしかできないようなのはクビでいいだろな。
26デフォルトの名無しさん:2005/08/27(土) 21:16:53
>>21
ワロス
27デフォルトの名無しさん:2005/08/27(土) 21:23:31
猫のページを参考に
BCCでlibファイルを作りたいのですが、"'MYLIB' not found in library"と吐いてしまいます。
一応"MAKE End!!"とは出てるので一連の動作は成功してるようなのですが・・

使ってるIDEはBCC Developerでプロジェクトの設定はライブラリ(TLIB使用)にチェックが入っています。
28デフォルトの名無しさん:2005/08/27(土) 21:25:37
>> http://pc8.2ch.net/test/read.cgi/tech/1123432321/979
簡単な実装としては、前の百分率を保存しといて、
前と同じなら表示しなければいい。
29デフォルトの名無しさん:2005/08/27(土) 22:21:40
30デフォルトの名無しさん:2005/08/27(土) 23:59:04
デバッグをしたいのです。 

実行したときに関数の呼出順の履歴みたいなのを出したくて 
いままでは全部の関数の最初と最後に 

printf("%s IN\n",__func__); 
printf("%s OUT\n",__func__); 

って書いていたんですが、なんかかっこわるいと思うように 
なりますた。 
なんかもっとスマートでクールな方法はないでしょうか。 

31デフォルトの名無しさん:2005/08/28(日) 00:07:41
何だそれ、__func__ というマクロがあるのか。
32デフォルトの名無しさん:2005/08/28(日) 00:07:42
printf(
    "%s IN\n"
    ,__func__); 

printf(
    "%s OUT\n"
    ,__func__); 
33デフォルトの名無しさん:2005/08/28(日) 00:08:53
初心者で悪いんだが、++aとかa++とか意味あるのか?普通に-で演算しても同じ事じゃないの?
34デフォルトの名無しさん:2005/08/28(日) 00:11:00
-だと減るじゃん
35デフォルトの名無しさん:2005/08/28(日) 00:17:17
printf の %f ってどんな時使うんですか?
36デフォルトの名無しさん:2005/08/28(日) 00:18:07
>>33
プログラマのコーディング効率も上がるし、それに演算速度を上げられる可能性があるから。
37デフォルトの名無しさん:2005/08/28(日) 00:18:50
>>35
ネタはもういいからね。
38デフォルトの名無しさん:2005/08/28(日) 00:23:18
>>31
#define ENTER_FUNC printf("%s IN\n", __func__);
#define LEAVE_FUNC printf("%s OUT\n", __func__);


って、いや、デバッガのコールスタックを利用すればいいと思う。
39デフォルトの名無しさん:2005/08/28(日) 00:27:34
他の高級言語を使ってたが、Cを学習してから毎日Cを手放せなくなった。
40デフォルトの名無しさん:2005/08/28(日) 00:31:08
__func__ て処理系で定義されているマクロなのかいな。
41デフォルトの名無しさん:2005/08/28(日) 00:35:28
そうだよ。
42デフォルトの名無しさん:2005/08/28(日) 00:36:22
そうか、そんなのがあるのか。
どんな処理系で使えるのかな。
43デフォルトの名無しさん:2005/08/28(日) 01:00:06
正確に言うとマクロじゃなくて識別子。
C99 で正式に C の仕様に導入された。
44デフォルトの名無しさん:2005/08/28(日) 01:53:19
__func__ ってbcc32だとエラーが出て
CYGWINだとコンパイルできたけど、表示されなかったぞ
45デフォルトの名無しさん:2005/08/28(日) 02:15:03
Cygwin の GCC で表示できるが?
何か間違えてないか?
もしくは、コンパイラがめっさ古いか。

あと、BCC はできんかもしれんね。
46デフォルトの名無しさん:2005/08/28(日) 02:50:44
VC++.NETでは円周率は定義されていないのでしょうか?
47デフォルトの名無しさん:2005/08/28(日) 02:53:16
>>45
できた
でもさっきは表示されなかったのは何故だろ
48デフォルトの名無しさん:2005/08/28(日) 03:03:06
今思ったんだけど
>>8って本当にそれコンパイルできた?
49デフォルトの名無しさん:2005/08/28(日) 03:27:25
>>46
.NET Frameworkでという意味ならSystem.Math.PIというフィールドがあるが、
このスレである以上managed C++ということも考えにくいから…
「C言語に標準で」、という意味ならば、提供されていない。
4 * atan(1.0)で求めよ。
50デフォルトの名無しさん:2005/08/28(日) 03:28:15
3.141592653589793 くらい覚えとけよ。
51デフォルトの名無しさん:2005/08/28(日) 04:07:32
一夜一夜に人見ごろなら・・・
52デフォルトの名無しさん:2005/08/28(日) 04:21:38
ひとよひとよにひーとーみーごろぉー♪
って歌のアニメがあったな。
子供の頃見てたけど、タイトル忘れた。
結構好きだったんだけどすぐに終わってしまったような記憶が…
不人気だったんだろか。
53デフォルトの名無しさん:2005/08/28(日) 04:26:30
人並みにおごれよ
54デフォルトの名無しさん:2005/08/28(日) 04:32:37
>>53
55デフォルトの名無しさん:2005/08/28(日) 04:57:01
>>52
こういうのって、英語圏の人達や、その他の言語の人達は、
どうやって記憶してるんだろうか・・・って思う

円周率16桁は、#define PI 3.141592653589793
を繰り返すうちに自然に数字で覚えてしまったが・・・
56デフォルトの名無しさん:2005/08/28(日) 04:57:35
>>55
ヒント:電話番号
57デフォルトの名無しさん:2005/08/28(日) 04:57:59
英語圏の人は授業で電卓つかうよ
58デフォルトの名無しさん:2005/08/28(日) 05:03:57
フランス語は数を勘定できない言葉ですから国際語として失格している
59デフォルトの名無しさん:2005/08/28(日) 05:11:01
>>55
ヒント:May I tell a story purposing to render clear the ratio circular perimeter breadth, revealing one of the problems most famous in modern days, and the greatest man of science anciently known.
60デフォルトの名無しさん:2005/08/28(日) 05:35:42
>>59
なるほど、すごいな
61デフォルトの名無しさん:2005/08/28(日) 05:42:01
フランスごは数数えるのが大変というけれど
日本語だって負けちゃいないぜ!

アラビア数字が輸入されるまではマジで大変だったよ
でも日本にも優れた数学者は山ほどいるわけで

言語的に数が数えやすいのと、数学が得意な人種というのは
実は 相関関係が無い
62デフォルトの名無しさん:2005/08/28(日) 06:03:21
>>61
あんた何歳?
63デフォルトの名無しさん:2005/08/28(日) 06:46:32
フランス語はホンマに凄い。歴史を感じるが、正直ヤバい。

先ず、16 まで固有語がある。ただ、10+1 〜 10+6 を彷彿させる名前にはなってる。
だというのに、17 から 19 まではより 10+7 〜 10+9 っぽい名前になってる。
両者は似た感じで命名されてるはずなのに、命名規則が違う。
16 進法の A 〜 F もそのまま呼んで違和感ないんじゃないのか。

そして、20 がまた固有語だ。2 * 10 なんかじゃない。全く別の語だ。

そして、69 までは順当に進む。21 は 20 + 1 だし、30 は 3 * 10 だ。
だというのに、70 は何と 60 + 10 だ。ヤバい。まるで 60 進法だ。
それが 79 まで続く。このまま 60 進法で進むのかと思いきや、80 はそうならない。

しかし、安心するのはまだ早い。80 の名前は 8 * 10 じゃなくて、4 * 20 だ。今度は 20 進法かよ。
で、やっぱり 90 は 80 + 10 で、このまま 99 まで 20 進法であるかのように進む。

で、100 が固有語。これは問題ないし、これ以降はようやく普通になる。
といっても、120 は 100 + 20 だし、199 は 100 + 4 * 20 + 10 + 9 なのだが。
64デフォルトの名無しさん:2005/08/28(日) 06:50:03
池澤春菜が姫のコスプレして色々教えてくれたけどすっかり忘れた
65デフォルトの名無しさん:2005/08/28(日) 06:54:36
まあ60までは簡単だ。

フランス語の数体系
http://www.sf.airnet.ne.jp/~ts/language/number/frenchj.html
66デフォルトの名無しさん:2005/08/28(日) 06:56:09
フランス語も知ってるんだ。
ギリシャ生まれというのは聞いているが......。

と思って調べたら、フランス語会話に生徒役で出てたのな。
67デフォルトの名無しさん:2005/08/28(日) 08:12:53
68デフォルトの名無しさん:2005/08/28(日) 10:01:27
時々他の高級言語のやつがその言語の話を割り込んでくるのは何でだろうな。
Pascalだったらまだ許容する。
69デフォルトの名無しさん:2005/08/28(日) 10:09:03
Ruby>>>>>>>>>>>>>>>>>>>>>C
70デフォルトの名無しさん:2005/08/28(日) 10:09:11
池澤春菜ってフランス人だったのか
71デフォルトの名無しさん:2005/08/28(日) 10:12:47
Perl>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Ruby
72デフォルトの名無しさん:2005/08/28(日) 10:17:22
そんな歴史の浅い変てこりんな高級言語を支持してどうするのかね
73デフォルトの名無しさん:2005/08/28(日) 10:20:18
pyhon >>>>>>>>>>>>>>>>>>
74デフォルトの名無しさん:2005/08/28(日) 10:30:23
実行と同時に音楽(mp3)を鳴らしたいのですが、
hMCI=MCIWndCreate(hWnd,hInst,NULL,"D:\\a.mp3");
を使用すると画面上に再生やらストップやらのマークなどが出て相応しくないのです。

またPlaySoundを使うと固まります・・・

誰かいい方法を教えてくださいです
75デフォルトの名無しさん:2005/08/28(日) 10:53:42
カレントディレクトリにソース(a.c)がある場合に
makefile を自動で作成するようなコマンドはある
のでしょうか?
76デフォルトの名無しさん:2005/08/28(日) 10:55:41
autoconf/automakeという糞ツールがあるけど手書きした方が16777216倍まし
77デフォルトの名無しさん:2005/08/28(日) 11:01:15
>>75
その前にmakeの関数は調べたか?
78デフォルトの名無しさん:2005/08/28(日) 11:10:11
wildcard 使った汎用 make ファイルを作っておけば、
同じの使いまわして随分いける。
個別設定は別にできるようにしとけばいい。
79デフォルトの名無しさん:2005/08/28(日) 11:23:50
Makefileってそこそこ汎用的に書くと結構な分量になるんだよな。
提供してる機能がしょぼすぎるんだよ。
(Antは単体でも使えるにしても)Javaに縛られてないMakefile++誰か作れ。
80デフォルトの名無しさん:2005/08/28(日) 11:27:11
>> 77 関数は特にないです。
printf()での”Hello Word "くらいのサンプルです。

>> 78 まずは汎用性のある makeファイルの入手が必要ですね。
81デフォルトの名無しさん:2005/08/28(日) 11:36:57
>>80
>まずは汎用性のある makeファイルの入手が必要ですね。
自分で作るという選択肢はないのかw
82デフォルトの名無しさん:2005/08/28(日) 11:45:44
>>81
もちろん、オリジナルで作成する選択はあると思います。
83デフォルトの名無しさん:2005/08/28(日) 11:47:57
make の仕様くらい目を通しといた方がいいよ。
84デフォルトの名無しさん:2005/08/28(日) 12:09:25 BE:89861663-##
>>55
英語圏じゃないけど、ピーターフランクルは、円周率は約3としか憶えてないって言ってたよ。
日本で「おおよそ3」が非難される、だいぶ前に。
85デフォルトの名無しさん:2005/08/28(日) 12:23:44
彼の生き方ではソレで良いのでしょう。
昔のやり方はすべての分野を教えて、そこから専門分野を取捨選択する方法。
専門外の使用頻度の低い知識が多数生まれる。

一方、今の頭の悪い教育方針は広く浅くを基本とする。
どの分野を取っても知識不足という頭の悪い状況になっている。
86デフォルトの名無しさん:2005/08/28(日) 12:33:10
何この糞な流れ
87デフォルトの名無しさん:2005/08/28(日) 13:12:59
>>80
そうじゃない。
makeには、ソースやディレクトリ指定を楽にするための組み込み関数が用意されている。
widcard や、patsubst といった関数を使てmakefileを書けば、いちいち対象ソース名を記述しなくても、
「あるディレクトリ内のある拡張子のファイル全部」といった指定を一行で記述することができる。
外部ツールに頼る前に、makeのマニュアルや、仕様書をよく読めちゅ−こと。
88デフォルトの名無しさん:2005/08/28(日) 13:15:21
×widcard
○wildcard
89デフォルトの名無しさん:2005/08/28(日) 13:18:36
makeスレ逝け
90デフォルトの名無しさん:2005/08/28(日) 14:31:26
>>85
数学ではπとしか使わないから、具体的な数値なんてどうでもいいのさ。
物理だと概算でいいから、またいい加減でいいんだが。
プログラムだと16桁は欲しい。
91デフォルトの名無しさん:2005/08/28(日) 16:22:20
>>90
π≒3 → 円は、ほぼ6角形として扱われる
float型しか使わなければ6桁でおk
92デフォルトの名無しさん:2005/08/28(日) 16:24:49
2,30桁くらいすぐ憶えられるだろ。

産医師、異国へ向こう、産後厄無く、身に宮代に虫さんざん闇に鳴く
3.141592653589793238462643383279
93デフォルトの名無しさん:2005/08/28(日) 16:25:24
「異国に」だった・・・。
94デフォルトの名無しさん:2005/08/28(日) 16:30:34
>>92
"身に宮代に"だと"323842"と書いてしまいそうだ。
95デフォルトの名無しさん:2005/08/28(日) 17:34:20
約3
Yes.
約3.14
Yes, I have.
約3.1416
Yes, I have a number.

単語の文字数が数値になる。
96デフォルトの名無しさん:2005/08/28(日) 18:28:41
0文字の処理は?
空白二個は読みづらいし、エクスクラメーションやカンマも使いづらい。

それに7文字以上の単語もそうそうない
9796:2005/08/28(日) 18:30:53
7:someone/thought
8:language/
9:something/

ゴメン。考えてみると結構ありそうだね。
9895≠59:2005/08/28(日) 20:05:57
>>97
>>59

偶々0がないらしい。
99デフォルトの名無しさん:2005/08/28(日) 20:07:53
それがCとどういう関係があるんでしょうか?
初心者なのでわかりやすく教えてください。
100デフォルトの名無しさん:2005/08/28(日) 22:34:51
Cする
おっπ
という関係
101デフォルトの名無しさん:2005/08/29(月) 00:14:05
大事なのは桁数の大小ではなく有効桁数
102デフォルトの名無しさん:2005/08/29(月) 02:06:33
>>92
語呂合わせ何かなくても、その程度の桁数ならそのまま覚えられるじゃん。
世界記録の数万とかのは分からんが。

>>98
よく考えたら、初めて 0 が出てくるのって
小数点以下 32 桁目なんだな。
結構出てこないもんだな。

>>99
πは 16 桁(double の精度だとこれ以上は無意味)くらい覚えとけという話。
103デフォルトの名無しさん:2005/08/29(月) 06:59:47
いい加減うぜーよ市ね
104デフォルトの名無しさん:2005/08/29(月) 07:03:47
なら質問カモーン
105デフォルトの名無しさん:2005/08/29(月) 07:29:52
ここの連中レベル低くて質問する気が起きないんだよね。
答えてるのCかじり立ての学生ばっかでしょ。
106デフォルトの名無しさん:2005/08/29(月) 07:33:28
いまどき C なんて使わないしね。
107デフォルトの名無しさん:2005/08/29(月) 09:17:03
1. 質問したければすればいい。
2. 質問したくなければしなければいい。
3. 答えたいならば答えればいい。
4. 答えたくなければ答えなければいい。
5. 2と4に該当するなら無理に書き込まなくていい。
108デフォルトの名無しさん:2005/08/29(月) 09:36:52
新5. 2と4に該当するなら書き込まず黙ってどっかに行く。
109デフォルトの名無しさん:2005/08/29(月) 11:24:56
答えてるとみせかけて大抵茶化してる奴多いからな
110デフォルトの名無しさん:2005/08/29(月) 14:48:29
質問です。
srand()関数の発生系列の限界を知りたいんですけど
どうしたらわかりますか?
111デフォルトの名無しさん:2005/08/29(月) 15:14:34
>>110
質問には答えられないが、この辺が参考になるかも
ttp://www001.upp.so-net.ne.jp/isaku/rand.html
112デフォルトの名無しさん:2005/08/29(月) 15:15:17
たしかrand()自体が0からRAND_MAXまでの一様乱数を返すとしか定義されてないはず。
つまり実装はライブラリ毎に異なるんで自分で調べるしかない。
まぁ大抵は32bitの線形合同法だろうけど。
ちゅうか自分で実装した方がいいよ。
113デフォルトの名無しさん:2005/08/29(月) 15:26:48
MT使っとけ
114110:2005/08/29(月) 15:58:09
僕が聞きたかったこととは違いますが質問に答えていただいてありがとうございます。
僕が聞きたかったことは
プログラムを実行するたびに異なる系列(seedを変える)で擬似乱数を
発生させ続けると同じ擬似乱数が出てくるようになる。そのループする
限界を知りたいんです。
文章がわかりにくかったらスイマセン。
115デフォルトの名無しさん:2005/08/29(月) 16:04:30
ここも人大杉が解除されているぅ♪
116デフォルトの名無しさん:2005/08/29(月) 16:09:29
>>114
自分の環境のドキュメントかソースを読め。
117デフォルトの名無しさん:2005/08/29(月) 16:19:02
普通は何入れても 2^32 だと思うがね。
粗悪なやつ(右シフトしてないやつ)は
% (2^n) すると周期が 2^(32-n) になるが。
118デフォルトの名無しさん:2005/08/29(月) 18:40:11
関数の仮引数で、int **argという*演算子が2つ付いたのを見ますが
これはポインタの配列を引数として受け取るということでしょうか?
いまいち、どういう場合にint **argの形を使えば良いのかわからなくて・・・
119デフォルトの名無しさん:2005/08/29(月) 18:46:49
想像力はたくましいですが、そうではありません。
多重間接参照といってこれはポインタのアドレスを保持します。
int **a, *b, i; と宣言し、b = &i; a = &b; とすることによって整数型ポインタ b のアドレスを保持します。
**a = 100とすることで 間接的に 変数i に対して100を代入することができます。
120デフォルトの名無しさん:2005/08/29(月) 18:47:20
>>118
ポインタのポインタ。
引き数として配列を渡すことはできない。
121デフォルトの名無しさん:2005/08/29(月) 18:50:37
>>119
ポインタのアドレスって……
122デフォルトの名無しさん:2005/08/29(月) 18:53:50
>>119-120
ありがとうございました。おかげですっきりしました
123デフォルトの名無しさん:2005/08/29(月) 19:12:28
バカばっかかよ!
ポインタ変数の配列を引数に取るときでもいいし、
ポインタ変数を直接操作したい場合にも使える。
typedef int* PINT;
として PINT *arg を考えればいい。
124デフォルトの名無しさん:2005/08/29(月) 20:44:56
お前が一番馬鹿だな
125デフォルトの名無しさん:2005/08/29(月) 20:53:51
このスレ読むと
「本当に有能な人間は他者を馬鹿にしない」
という言葉が真実だということが良くわかる。
126デフォルトの名無しさん:2005/08/29(月) 20:54:29
char **argv も使ったことないのか。
127デフォルトの名無しさん:2005/08/29(月) 21:50:51
main( int argc, char *argv[] ) {
int ch;
FILE *fp, *sfp;
int flg = 0;
fp = fopen( argv[1],"r" );// エラー処理省略
sfp = fopen( "aaa.txt", "w" );
while ((ch=fgetc(fp)) != EOF) {
if (ch == '[') flg = 1;
if (flg == 1) { if (ch == '\n') flg = 0; else continue; }
fputc( ch ,sfp );
}
_fcloseall();
}
'[' 以降の行を無視して 出力するようにしたいと思ったのですが、日本語に"ー"があるとそれも'['とみなされ
それ以降の行も削除されてしまいます。
修正したいのですが、fgetwc というのを使うしかないのでしょうか? そもそも日本語をこのように fgetc で
処理するのは間違っていますか? //フラグ乱舞のプログラム失礼します
128デフォルトの名無しさん:2005/08/29(月) 21:59:57
単に日本語を除外したいだけなら、
0x80 以上の値が出てきたら(最上位ビットが 1 なら)
次の文字を無視すればいい。
Shift-JIS でも EUC でもいける。
文字コードの正当性まで知りたいのならこれではだめだが、
そんなのはどうでもいいっしょ? 多分。
129デフォルトの名無しさん:2005/08/29(月) 22:01:06
>>127
うん。fgetwcを使うのが簡単だよ。何か躊躇することでもある?
どうしても嫌なら'['の1文字前が2バイト文字の1バイト目かどうか確かめればいいよ。
130デフォルトの名無しさん:2005/08/29(月) 22:01:56
とか思ったけど、Shift-JIS の半角カナがあると話が変わるんだった。
Shift-JIS なら、0xA0 〜 0x9F だったら次のを除外しないようにする。
EUC なら必要ない。
131デフォルトの名無しさん:2005/08/29(月) 22:32:44
>>128-130
ありがとうございました。日本語コードとかの話になると、つい敬遠しがちでしたが
お陰さまで少し興味がもてましたです。
132デフォルトの名無しさん:2005/08/30(火) 23:30:42
構造体を示す慣用的な表現ってありますか?
typedef struct Argfoo Argfoo;

自分ではArgxxxで構造体を示すと決めていますが、
もし何か慣用的なものがあればそっちに習おうと思いました。
133デフォルトの名無しさん:2005/08/30(火) 23:34:53
なんで構造体にArg?
ていうか、名前に型を示すプレフィックスをつけるとかは今時
流行らんからやめれ。
134デフォルトの名無しさん:2005/08/30(火) 23:35:56
fopenしたものから、ファイルディスクリプタを得る
関数って何でしたっけ??
135デフォルトの名無しさん:2005/08/30(火) 23:38:41
fopen()が返す値がファイルディスクリプタそのもの
136デフォルトの名無しさん:2005/08/30(火) 23:46:13
>>134
そんなこと標準Cの範囲ではないからすれ違い。
137デフォルトの名無しさん:2005/08/30(火) 23:46:44
>>135
あほはしね
>>134
fileno()
138デフォルトの名無しさん:2005/08/30(火) 23:51:17
ストリーム(FILE *)からファイルディスクリプタ(int)
fileno()だた。。

解決しますた。m(__)mどもども
139デフォルトの名無しさん:2005/08/31(水) 00:36:02
データの入力と処理に関する質問です。

2 3 4
1 5 2

の様なスペースで区切られた約40000行のデータファイルがあります。
このデータファイルを読み込んで、各列ごとにヒストグラムにしたいのです。
どのようなCプログラムを作ればいいのでしょうか?
初心者なので具体例を提示していただければありがたいのですがm(__)m
140デフォルトの名無しさん:2005/08/31(水) 00:41:30
宿題は宿題スレにGO
ただしもっと仕様を明確にしてな
141139:2005/08/31(水) 00:43:49
>>140
宿題では無いのですが、宿題スレに行って来ます!
142デフォルトの名無しさん:2005/08/31(水) 00:44:45
>>139
ここはC言語のテクニカルノウハウなどに付いてのスレです。
アルゴリズムスレや初心者スレ、或いは宿題スレなどへどうぞ。
#つーか、情報量が少なすぎて回答しようも。
入力部はfgets()+sscanf()を行数分回せばいいとして、ヒストグラムの仕様が判らないとデータ設計できないし……
143デフォルトの名無しさん:2005/08/31(水) 00:45:44
>>139
各項目は全て整数値?
各項目の値域は?
#・・・Cで書くわけね
144デフォルトの名無しさん:2005/08/31(水) 01:25:57
AWK で書きてー。
145デフォルトの名無しさん:2005/08/31(水) 01:27:54
AWKは書かねぇ
146デフォルトの名無しさん:2005/08/31(水) 10:25:55
下のプログラムは、4つの数字を入力して、+−×の演算を使用し、計算結果が10になる式を出力するものです。
しかし、意味が分かりません。だれか、詳しく教えてくれませんか?お願いします。
#include<stdio.h>
#define C(a,b,c)((c)?(c)-1?(a)*(b):(a)-(b):(a)+(b))
#define E(a,b){for(i=a*b;i<a*b*b;i++)k[i/b][i%b]=k[i/b-a][(i+1)%b];}
int*h,i,j,k[24][4]={{1,2,3},{1,3,2}},m[4],o,p,q,r,s,t,u,v,w;void main(){char*g=
"+-*0\0((%d%c%d)%c%d)%c%d\0(%d%c%d)%c(%d%c%d)";while(i<4)scanf("%d",m+i++);E(2,
3)E(6,4)while(o<648&&!j)j=C(C(w=C(s=m[*(h=k[o++/27])],t=m[h[1]],p=(i=o%27)%3),u
=m[h[2]],q=(i%9)/3),v=m[h[3]],r=i/9)==10?2:C(w,C(u,v,r),q)==10?21:0;printf(g+j+
3,s,g[p],t,g[q],u,g[r],v);}
147デフォルトの名無しさん:2005/08/31(水) 10:30:36
>>146
80列×8行にプログラムを詰め込むという制限をかけた特殊なプログラムなので、
分かりやすいよう整形、リネームするか、
別のプログラムを探すかしよう。
148デフォルトの名無しさん:2005/08/31(水) 10:32:46
>void main()
ここに突っ込んで話を迷走させようぜ
149デフォルトの名無しさん:2005/08/31(水) 11:17:25
短くするためにちょっとズルしてるだけだろ。
150デフォルトの名無しさん:2005/08/31(水) 11:25:43
Cでは不適切だから、スレ違い。
151デフォルトの名無しさん:2005/08/31(水) 11:35:13
短くしたいだけならmain()と書けばよい
152デフォルトの名無しさん:2005/08/31(水) 12:24:43
戻り値がありません。
153デフォルトの名無しさん:2005/08/31(水) 12:49:53
プリプロセッサ通して適当に改行/整形してみたけど、90行にもなったし
かなりトリッキーなので解説するには向かないね。
154デフォルトの名無しさん:2005/08/31(水) 12:57:30
自分で宣言すれば#includeの行は削れそうだな
155デフォルトの名無しさん:2005/08/31(水) 13:06:11
>>145
たかが越前ってか?
156デフォルトの名無しさん:2005/08/31(水) 13:33:20
>>154
Cだから関数宣言はなくてもコンパイル通る。
157デフォルトの名無しさん:2005/08/31(水) 13:34:49
可変長の関数はプロトタイプないとバグるぞ
158デフォルトの名無しさん:2005/08/31(水) 14:29:14
お尋ねしたいのですが、if (test == 1) /* なんかの処理 */;
みたいに単文だからと中括弧を省略していると、おめー中括弧かけよ と決まって注意されます

個人的には省略いらねーだろ と思うのですが、これはやはり宗教的なところですか?
注意を無視しててもようございましょうか?
159デフォルトの名無しさん:2005/08/31(水) 14:33:36
>>158
注意してきた人にもよるだろ。
自分で判断できないのか。
160デフォルトの名無しさん:2005/08/31(水) 14:37:06
>>152
K&Rのhello, worldはmain()で戻り値無しだよ
161デフォルトの名無しさん:2005/08/31(水) 14:43:26
会社やプロジェクトのコーディング規約に載ってるなら、それに従う。

規約がなくとも、省略したがってるのに「個人的には省略いらねーだろ」
なんて不思議な日本語書いてしまううかつさんには、
意識して書いてもらえる方が周囲の人間は安心できる。
162デフォルトの名無しさん:2005/08/31(水) 14:48:22
>>158
中括弧を省略してもいいと思っているのか、
そんな省略なんて必要ないと思ってるのか
はっきりしてくれ。
163デフォルトの名無しさん:2005/08/31(水) 14:50:34
単文で中カッコを付けるかどうかは、
その人のコーディングスタイルによる。
それ以上でもそれ以下でもない。

switch〜caseのインデントとか
ifやforの中カッコを同一行に書くか改行するか、とかも同じ話。
164デフォルトの名無しさん:2005/08/31(水) 14:55:49
俺はmain関数やユーザ関数の中括弧は改行してからで、
ifやforはfor(〜〜){と続けるな
省略は絶対にしない。
165デフォルトの名無しさん:2005/08/31(水) 15:03:51
あまり省略はしないけど、return 1文のときのみはたまに省略するな

if (〜)
 return false;

みたいな
166デフォルトの名無しさん:2005/08/31(水) 15:08:11
スタイルの話はよそでやれよ。
167デフォルトの名無しさん:2005/08/31(水) 15:09:37
>>166
自分がピザだからっていじけるなよ。
168デフォルトの名無しさん:2005/08/31(水) 15:16:15
どっちがいいかはともかく何のメリットがあるのかって話じゃないのか。
俺にはメリットがよくわからん。
169デフォルトの名無しさん:2005/08/31(水) 15:18:17
どちらのメリットかもよくわからん
170デフォルトの名無しさん:2005/08/31(水) 15:18:33
>>168
・無駄なタイプが少なくなる
・ファイルサイズが若干小さくなる
これだけ。
どうせコンパイラが吐くコードは同じだし。
171デフォルトの名無しさん:2005/08/31(水) 15:27:14
括弧つける場合のメリット
・後でそのブロックに行を追加する場合の修正量が少ない(行追加だけで済む)
括弧つけない場合のメリット
・行数が減るのでややコードの一覧性が向上する

ってとこか。特に昔は端末サイズが80x24とかだったりしたので一覧性は
重要だった。K&Rスタイルの右肩と下にブロックの括弧を書くやりかたも、
行数少なめにして一覧性を向上させるためのもんだろう。
172デフォルトの名無しさん:2005/08/31(水) 15:28:36
> どうせコンパイラが吐くコードは同じだし。

こういう極論を吐く奴は他人と一緒に仕事はしないでくれ。
せめてプログラム書法ぐらいは読もうな。
173デフォルトの名無しさん:2005/08/31(水) 15:29:58
「省略」って書いてあるけど。「本来の書き方」と思う人は誰もいないのだね
中括弧が必要なのは複文の時だけである筈だけど
#なんてぇ事を書くと煽られるだろうなw。論理的な反論が欲しいのだけどね
174デフォルトの名無しさん:2005/08/31(水) 15:31:13
>>157
どうバグるんだ?そんなはずないと思っているわけだが。

>>160
K&Rにも間違いはあるし現在ならC99を中心に考えた方がいいぞ
175デフォルトの名無しさん:2005/08/31(水) 15:32:56
単文では括弧を使ってはならない、と規定されているのでなければ、
「本来」というのは大げさな、恣意的な表現だな。
176デフォルトの名無しさん:2005/08/31(水) 15:40:06
>>173
それは「なくてもいい」ってだけだろ
177デフォルトの名無しさん:2005/08/31(水) 15:42:13
>>175
じゃあ中括弧をつけるのは、
「本来不要なものだけど、保守性等の面で推奨される書き方」
という表現も恣意的なわけ?
178デフォルトの名無しさん:2005/08/31(水) 15:45:23
「本来の書き方」「本来不要」なんて、当然そうあるべきルールがあるように書いてるのは君だけ。
「省略」という言い方が気に入らない?なら、他の言い方をどうぞ。

皆、どちらも同じだがそれぞれの流儀で使ってるというのは理解してるだろう。
179デフォルトの名無しさん:2005/08/31(水) 15:53:54
>当然そうあるべきルールがあるように
ルールではありません。文法です。
>「省略」という言い方が気に入らない?なら、他の言い方をどうぞ。
ありがとう。「本来の文法に沿って記述しない」位が適切かな。
>それぞれの流儀で使ってるというのは理解してるだろう。
そうですね。スタイル論議をするつもりは無いのですけど、
「省略」という表現が不適切に感じたからレスしたのみ でしたw
180デフォルトの名無しさん:2005/08/31(水) 15:54:23
>>174
> どうバグるんだ?そんなはずないと思っているわけだが。
>>157ではないし、具体的にどうバグるかはわからんが、
C言語 FAQには次のように書いてある
ttp://www.kouno.jp/home/c_faq/c15.html#0
181デフォルトの名無しさん:2005/08/31(水) 15:54:46
Cスレの半分は無駄話で出来ています
182デフォルトの名無しさん:2005/08/31(水) 15:55:16
おいおい、単文に括弧つけるのは文法違反ときたかw
183デフォルトの名無しさん:2005/08/31(水) 15:56:01
>>182
よく読め
184デフォルトの名無しさん:2005/08/31(水) 15:56:55
> 「本来の文法に沿って記述しない」
どう嫁と
185デフォルトの名無しさん:2005/08/31(水) 15:58:40
本来の文法に沿ってはいないが文法には違反していない、
つまり「文法」と「本来の文法」は別物なんだよ。
186デフォルトの名無しさん:2005/08/31(水) 16:09:27
>>179
単文 : 「;」で終端される<式>。
複文 : 「{}」で複数の単文を括った文。
文 : 単文、複文を含めたもの
ifの文法 : if( <式> ) <文>

if( /*略*/ ) { /*略*/ }
の、どこが文法に沿っていないのだ?
187デフォルトの名無しさん:2005/08/31(水) 16:10:33
>>179は宿題ができなくて暴れてるリア厨だろ。
そんなにいじめるな
188186:2005/08/31(水) 16:10:40
×複文 : 「{}」で複数の単文を括った文。
○複文 : 「{}」で複数の文を括った文。

でつた…orz
189デフォルトの名無しさん:2005/08/31(水) 16:46:05
括弧の話題はのびるな…
ところで、これも単文に入った?
a=1,b=2;
190デフォルトの名無しさん:2005/08/31(水) 16:48:21
191デフォルトの名無しさん:2005/08/31(水) 18:11:43
>>174
実際問題としてはK&RのHello worldの例をコンパイルすることのできない
Cコンパイラって存在しないんじゃない?
192デフォルトの名無しさん:2005/08/31(水) 18:12:47
文法的には{}付けても付けなくとも正しいだろ
何でそのレベルで議論になるんだ
193デフォルトの名無しさん:2005/08/31(水) 18:17:18
>>191
現状での C の正しい仕様としては、
int main の return を省略することはできない。
C++ なら、省略すると return 0; が暗黙に加えられるが。
K&R C の時代のことは知らん。

それを言ったら void main も仕様外だから、
>>146 も、void 削って戻り値無視ってのも、
大して変わらんのだけどね。
194デフォルトの名無しさん:2005/08/31(水) 18:20:15
>>193
C99ではreturnの省略可能。(ISO/IEC 9899:1999 5.1.2.2.3 Program termination -1)
195デフォルトの名無しさん:2005/08/31(水) 18:21:20
>>192
本来の文法に沿った書き方があるから
196デフォルトの名無しさん:2005/08/31(水) 18:24:11
>>194
ああ、そうだった。C99 だとできるようになったんだった。忘れてた。
197デフォルトの名無しさん:2005/08/31(水) 19:00:04
>>189
単文なんて俺用語の用法を聞くなと。
複文以外の文を単文と呼ぶのが普通だと思うが>>186の定義によると「;」で終端される<式>などというCの文法に存在しないものを単文と呼ぶらしい。
a=1,b=2;
は式文という文で式じゃないから186の定義では単文ではない。
{}で囲んでないから複文でもない。
198デフォルトの名無しさん:2005/08/31(水) 19:02:57
,は順次演算子
199デフォルトの名無しさん:2005/08/31(水) 19:06:51
200デフォルトの名無しさん:2005/08/31(水) 19:09:08

「単文」そのものはオレ用語じゃないだろ
201デフォルトの名無しさん:2005/08/31(水) 19:09:15
C FAQの7.21に次のような記述があるんですが、ISO C規格上の根拠についておしえてください。
「解放されたポインターの値は厳密にいえば無効で、それをどう使っても、たとえ間接参照
以外のことに使っても理屈の上ではトラブルの元である。」

free済みのポインタを、prinrf("%p", p); したりするだけでも規格違反(unspecified?)です
か?

C99の7.20.3あたりには特に何も書いていないように思います。
202197:2005/08/31(水) 19:09:55
いや、知ってるがそれが何だ?
203sage:2005/08/31(水) 19:10:03
URLを貼り忘れました
http://www.kouno.jp/home/c_faq/c7.html#21
204デフォルトの名無しさん:2005/08/31(水) 19:10:24
本来の文法、ねぇ……
お笑いと厨は帰れ。終了。
205197:2005/08/31(水) 19:11:18
206デフォルトの名無しさん:2005/08/31(水) 19:19:07
>>200
規格書に載ってないものを俺用語っていうんじゃねーの?
あれ「複文」も載ってないや、複合文だた。
207デフォルトの名無しさん:2005/08/31(水) 19:26:08
というか、自分の説明の中で「単文と呼ぶのが普通だと思うが」とか書いてるし。
208デフォルトの名無しさん:2005/08/31(水) 19:29:29
日本語で用語定義している規格書って、何を参照してるん?
K&Rでは「複文」←→「単一の文」だな。
209デフォルトの名無しさん:2005/08/31(水) 19:30:49
>>208
JISじゃない?
210デフォルトの名無しさん:2005/08/31(水) 19:35:17
>>197
カンマを使うと <式1>,<式2> というのも1つの<式>となるため、
> a=1,b=2;
> は式文という文で式じゃないから186の定義では単文ではない。
というのは間違い。
211デフォルトの名無しさん:2005/08/31(水) 19:36:46
質問させてください。
cccというポインタの配列の0番目を上書きしたいのですが、
どのようにすればいいのでしょうか?
やりたいことは下の様な感じなのですが・・・

struct kouzoutai *ccc;
&(aaa->bbb[0].ccc[0]) = ccc;
212デフォルトの名無しさん:2005/08/31(水) 19:36:48
>>210
; が付いてるからそれは既に式じゃないだろ。
213デフォルトの名無しさん:2005/08/31(水) 19:39:01
>>207
それが正しいとは言ってないだろ?
「普通だと思う」と言ってるだけで。

>>210
a=1,b=2は式だが
a=1,b=2;は式じゃない。
カンマ演算子は関係ない。
214デフォルトの名無しさん:2005/08/31(水) 19:42:43
>>212-213
186の定義が発端じゃないの?
>単文 : 「;」で終端される<式>。
だから、式の後ろにカンマがついてる、のを問題にするのは変では?

つか、>>197で「単文」は「俺用語」で<式>は「存在しない」と書いてるように読めるが、
式もダメなのかい。
215デフォルトの名無しさん:2005/08/31(水) 19:43:24
>>211
それ以前にやりたい事に間違いだらけですが...。
cccもポインタ配列になっていませんし。
216デフォルトの名無しさん:2005/08/31(水) 19:45:41
>>214
><式>は「存在しない」と書いてるように読めるが
ええと、違う

「「;」で終端される<式>」は存在しない。
217デフォルトの名無しさん:2005/08/31(水) 19:47:56
>>214
>単文 : 「;」で終端される<式>。
この日本語だと、「単文は、〜〜〜 な <式> である。」と言う形になっている。
言い換えると、『<式> のうち、「;」で終わってるものを「単文」と呼ぶ』という意味になる。
<式> はどう頑張っても文にはならない。明らかにおかしい。

 単文 : <式> の後ろに「;」を付けた物。

ならいい。
218デフォルトの名無しさん:2005/08/31(水) 19:48:16
>>216
それは読み方が違うんじゃないか、単文(文/単一の文)の定義を書いてるんだろ。
単文→ <式>; ってだけだろ、BNFっぽく書いてるんなら。
219デフォルトの名無しさん:2005/08/31(水) 19:50:11
なんか、曲解、揚げ足鳥合戦でもやってんの?
220デフォルトの名無しさん:2005/08/31(水) 19:52:21
日本語講座をやってます。
221デフォルトの名無しさん:2005/08/31(水) 19:53:33
その論法で逝くと、複文の説明も辺だな。
括弧込みというならブロックとかだろ。
222デフォルトの名無しさん:2005/08/31(水) 19:54:03
だな。低脳厨が脳内文法の変形作業を騒ぐのはスレ違い。でてけ。
223デフォルトの名無しさん:2005/08/31(水) 19:54:23
いや、もういいよ。どっちでもいいって。事の発端はvoid main()だったっけ?
224デフォルトの名無しさん:2005/08/31(水) 19:55:24
>>148
見事に迷走しました
225デフォルトの名無しさん:2005/08/31(水) 19:56:27
式と文は違うということじゃね?
通常のALGOL文法では式と文は大きな違いがある

Lispには式しかないけど
226デフォルトの名無しさん:2005/08/31(水) 19:57:27
>>221
K&Rでは複文=ブロックだし、複文も規格にない用語だから気にすることないんじゃない?

>>218
それはそれで珍しい定義だよな。
227デフォルトの名無しさん:2005/08/31(水) 20:08:36
珍しいのか、式+セミコロン前提でアレコレやってたようだが。
228デフォルトの名無しさん:2005/08/31(水) 20:11:19
>>211
「やりたいこと」というのが良くわからんので
ヒントだけ

kouzoutai ddd;
kouzoutai* ccc = &ddd;
kouzoutai* bbb[10];
bbb[0] = ccc;
kouzoutai** aaa = bbb;

とすると、下のような関係となる
&ddd == ccc == bbb[0] == *bbb == *aaa
ddd == *ccc == *(bbb[0]) == **bbb == **aaa
229デフォルトの名無しさん:2005/08/31(水) 20:11:34
230デフォルトの名無しさん:2005/08/31(水) 20:12:59
制御文ってどういう扱いになるんだ?
単文とか複文とかの概念から外れて、
「制御文」以外の何物でもなくなるわけ?
231デフォルトの名無しさん:2005/08/31(水) 20:30:50
単文だと思うが。

ちなみにCの文法で定義されてる文は
・ラベル付き文
・複合文
・式文
・選択文
・繰返し文
・分岐文
の6つ。K&Rは「複合文」を「複文」と読んでそれ以外を「単一の文」と呼んでいる
232デフォルトの名無しさん:2005/08/31(水) 20:33:25
つーかコーディングの作法について議論したいなら他所でやれ
233デフォルトの名無しさん:2005/08/31(水) 20:35:53
>>232 今の流れが分かってない人発見。
234デフォルトの名無しさん:2005/08/31(水) 20:54:34
スレ的には 232が正しくて他はたわ言に過ぎない。
235デフォルトの名無しさん:2005/08/31(水) 20:56:27
>>228
ありがとうございます!
ヒントを元にポインタの勉強をしてこようと思います。
236デフォルトの名無しさん:2005/08/31(水) 21:00:01
>>234
コーディングスタイルではなく、C言語について語っていると思ったのだが。
237デフォルトの名無しさん:2005/08/31(水) 21:09:59
>>236
はぁあ? >>158 を元にたわ言だけを展開するのを、語ると言ってもよいと?
238デフォルトの名無しさん:2005/08/31(水) 21:24:43
>>237
今は式や文といった用語の定義について話てるんでわ?
少なくともスタイルじゃないだろ。
239デフォルトの名無しさん:2005/08/31(水) 21:36:52
>>231
確かにその定義だと制御文は全部単文になるね。
でも、

 if(...) { ...; ...; ...; } else { ...; ...; }

を「単文」と呼ぶのも気が引けるような。
かといって、上のが複文で

 if(...) ...;

は単文ってのも何か違うような気もするし。
単文って言葉自体が害悪に思えてきた。
C の規格票で「単文」って言葉がないのも分かる気がする。
文法定義を書いてみようと思ってみても、
確かに「単文」なんて項目は作りそうにないね。
240デフォルトの名無しさん:2005/08/31(水) 22:27:03
だからたわ言は終了。
241デフォルトの名無しさん:2005/09/01(木) 00:42:47
ソースに対して期待された結果が出ればそれでよかろう・・・
それにK&Rがさまざまな方言生んじゃったのも事実だし
242デフォルトの名無しさん:2005/09/01(木) 00:47:09
>>241
K&Rは方言を無くすために書かれました
243デフォルトの名無しさん:2005/09/01(木) 00:53:58
今後Cのソースは .cpp で保存しようと思うのですが
244デフォルトの名無しさん:2005/09/01(木) 00:58:17
頭はgoサインを出しているのですが、体は拒否してます。
どうすればいいですか?
245デフォルトの名無しさん:2005/09/01(木) 00:58:35
無くすために書かれても一部曖昧だから方言生んだじゃん
そこでISOとANSIが慎重になって標準化した
246デフォルトの名無しさん:2005/09/01(木) 00:59:24
それは C のソースじゃなく C++ のソースだ。
247デフォルトの名無しさん:2005/09/01(木) 01:01:09
既にあったのなら、生んだってのは
248242:2005/09/01(木) 01:04:49
>>241>>242>>245はすべて真です

私は補足しただけ
>>241へのアンカーが良くなかったですか?
249デフォルトの名無しさん:2005/09/01(木) 01:21:57
方言が嫌な奴にC/C++は適さない
250デフォルトの名無しさん:2005/09/01(木) 02:15:34
LSIっていうフリーのコンパイラをインストールしたんですけど、コンパイルってどうやれば出来ますか?
251デフォルトの名無しさん:2005/09/01(木) 02:30:30
ググれ
252デフォルトの名無しさん:2005/09/01(木) 02:35:14
>>251
教える気が無いなら黙ってろ。
お前が教える気がないだけで、他の人は教えるかも知れないだろ。
253デフォルトの名無しさん:2005/09/01(木) 02:36:42
>>250
lcc ファイル名 [オプション]
254デフォルトの名無しさん:2005/09/01(木) 02:55:56
>>252
スレ違いなんだよドアホ
255デフォルトの名無しさん:2005/09/01(木) 03:09:34
>>252
”Cコンパイラの使い方なら俺に聞け”というスレでも立ててそこでやってくれ。

256デフォルトの名無しさん:2005/09/01(木) 03:55:22
#include<就活.h>
main(){
 int 無職歴;
 for(無職歴=1年目 ; 内定数>=1 ; 無職歴++){
 printf("不採用\n");
 }
}


就職できません('A`)
257デフォルトの名無しさん:2005/09/01(木) 04:05:02
>>256
""で囲んでない
int mainのintを省略できるのはC++、その場合はヘッダ名がC就活になり.hはいらない
258デフォルトの名無しさん:2005/09/01(木) 04:08:04
>>257
>intを省略できるのはC++
関数は省略したらintじゃないか?Cでも。
259デフォルトの名無しさん:2005/09/01(木) 05:02:26
>int mainのintを省略できるのはC++
仕様上はできねーよ。
省略できるのは return 0; の方だけだ。
260デフォルトの名無しさん:2005/09/01(木) 05:08:30
省略するのはvoidな
261デフォルトの名無しさん:2005/09/01(木) 05:53:52
>>241>>245
K&Rの生んだ「方言」ってどういう意味で何を指しているつもりだ?
262デフォルトの名無しさん:2005/09/01(木) 06:20:43
こちらから指定した数字などをランダムに指定した数だけピックアップして表示するにはどのように書けばいいのでしょうか?
たとえば
Aの組
1 3 4 5
Bの組
2 6
Cの組
0 9
を入力したとして、そのプログラムを通すと

Aの組
3 5
Bの組
2
Cの組
0

など、ランダムで選んでくれるプログラムにしたいです。rand()とかsrand()とか使うの?
違う気がするし、聞きに来ました。よろしくお願いします。
263デフォルトの名無しさん:2005/09/01(木) 07:04:33
>>262
激しくスレ違い。>>1読め。
264デフォルトの名無しさん:2005/09/01(木) 10:53:23
>>262
一応答えておくか

ランダムにやるならrand()かそれに相当する処理を使うのがベスト
手順は以下のとおり

1) A、B、Cを配列に格納する
2) 各配列に対し以下の操作を行う
 2-1) インデックスの個数を取得(1〜要素数の間でランダム)
 2-2) インデックスを取得(1〜↑で指定した個数の間でランダム)
   ※この時、既に取得したインデックスと重複しないようにする
 2-3) 取得したインデックスの値を表示
265262:2005/09/01(木) 11:54:49
>>263
勉強して出直します。

>>264
回答サンクスです。学校で常に赤点だった男なんでちんぷんかんぷんですが、なんとか頑張ってみます。
266264:2005/09/01(木) 16:17:12
ちょっと間違ってたので訂正

2-2)
 誤) インデックスを取得(1〜↑で指定した個数の間でランダム)
 正) ↑で指定した個数分だけ、配列のインデックスを取得(1〜要素数の間でランダム)
267デフォルトの名無しさん:2005/09/01(木) 22:29:59
>>253
>>252のような奴には一切教えないようにしよう。
268デフォルトの名無しさん:2005/09/02(金) 03:42:20
↑253乙
269デフォルトの名無しさん:2005/09/02(金) 11:05:22
そろそろ学校でC言語を習うのですが、出来るだけ予習しておきたいです
C言語の知識は全くありません。そんな僕にオススメの本やサイトはありますか?
270デフォルトの名無しさん:2005/09/02(金) 11:09:23
学校の教科書読め。
余力があったら、実際にプログラム書いてみればいい。
271デフォルトの名無しさん:2005/09/02(金) 11:09:57
学校のお勉強なら、授業で使う教科書を予習
272デフォルトの名無しさん:2005/09/02(金) 11:12:33
学校の授業受けてれば習得できるなんて甘い考えは捨てとけよ。
独学が基本だ。
273デフォルトの名無しさん:2005/09/02(金) 11:13:04
学校ってこずかい稼ぎ書いたような教授の糞なテキスト買わされることがあるけどな。
推薦図書スレ逝って来い。
274デフォルトの名無しさん:2005/09/02(金) 11:17:25
こんな教科書かもしれないから、
教科書聞いてからにしようぜ、「教科書嫁」は。

http://www.pro.or.jp/~fuji/computerbooks/c/c.modula2.html
275デフォルトの名無しさん:2005/09/02(金) 11:19:43
いちいち密度の低いスレだな
276デフォルトの名無しさん:2005/09/02(金) 11:20:26
すいません、他のスレでも聞いたのですが、回答が得られなかったので。
参考書に下記のプログラムが書いてあったのですが、
「文字列から文字の探索プログラム」

char *str_chr(const char *s,int c){
c = (char)c;
while(*s !=c){
if(*s == '\0')
retuern(NULL);
s++;
}
return((char *)s);
}

int main(void){
char *ptr;
char ch[2];
char letter[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ"

printf("英大文字を入力してください");
scanf("%s",ch);
if((ptr = str_chr(letter,ch[0])) ==NULL)
printf("%cは大文字ではありません。\n",ch[0]);
else
printf("%cから後のアルファベットは%sです。 \n",ch[0],ptr);
return(0); }
 ここで、関数 *str_chrの第二引数はint型としてあるのに、
main関数で char型のch[0]を受け取っています。
なのに、このコードはエラーが起きず、正常に動作します。
これはどうしてですか? おねがいします。
277デフォルトの名無しさん:2005/09/02(金) 11:28:02
暗黙の型変換
278デフォルトの名無しさん:2005/09/02(金) 11:35:10
眠い
279デフォルトの名無しさん:2005/09/02(金) 11:35:58
>>272-274
習得が目的じゃなく、授業への備えじゃないの、コイツは。
280デフォルトの名無しさん:2005/09/02(金) 15:49:50
俺が勉強に使ったのは「入門ソフトウェアシリーズ@ C言語」ってやつだったな
281デフォルトの名無しさん:2005/09/02(金) 16:22:26
>>280
あの糞本か・・・
よく頑張った。
282デフォルトの名無しさん:2005/09/02(金) 16:29:25
河西本って昔のワープロの説明書みたいな感じだよね。
283デフォルトの名無しさん:2005/09/02(金) 16:32:54
やはり「作ってわかるCプログラミング」を選ぶべきですね :)
284デフォルトの名無しさん:2005/09/02(金) 16:35:32
スレ違いだっつうの
285デフォルトの名無しさん:2005/09/02(金) 16:36:38
スレ違いということに…、いやスマン
286デフォルトの名無しさん:2005/09/02(金) 16:46:19
>>280
うはっwww俺の学校もそれだ
正直分かりにくかった記憶しかない
287デフォルトの名無しさん:2005/09/02(金) 17:38:09
>>274
凄いんだけど、それ。
何かを履き違えている気がする。
288デフォルトの名無しさん:2005/09/02(金) 21:17:45
C言語始めたんですが意味わからない・・・。
これはどこから始めればいいんでしょうか?
定義を覚える以前に・・・自分がなにやってるんだが分からない・・・orz
289デフォルトの名無しさん:2005/09/02(金) 21:42:07
memcpyとmemmoveの違いってコピー元とコピー先の領域が重なったときの動作の可否だけなんですか?
290デフォルトの名無しさん:2005/09/02(金) 21:46:01
>>288
Hello World!
291デフォルトの名無しさん:2005/09/02(金) 21:56:02
>>289
そう。
292デフォルトの名無しさん:2005/09/02(金) 22:14:50
>>289
それが原因で速度に変化が出る場合もある。
293デフォルトの名無しさん:2005/09/02(金) 22:51:15
俺、スゴイことを発見した。

C言語でプログラム書くとき、
できるかぎり一行でカッコとか使わず処理を書いたり、
ポインタをいっぱい使ったり、
複雑で分かり難い長い宣言を書いたりすると、
ほめられる、ってことに・・・

これで、冬のボーナスは、確実にアップだな
294デフォルトの名無しさん:2005/09/02(金) 23:13:46
こうしてマ板に壊れたPGが流れ込むわけだ
295デフォルトの名無しさん:2005/09/02(金) 23:35:14
>>293
コメントは全て英語で書いて、後から読む奴を寄せ付けるな
こいつすげー・・・こりゃ敵わないや・・・
となる事間違いなし。給料2倍
296デフォルトの名無しさん:2005/09/02(金) 23:36:44
いや、英語ぐらいは読めるだろ
297デフォルトの名無しさん:2005/09/03(土) 00:31:48
読めるけど、読みたくないし、書いてる方が間違ってる可能性大。
298デフォルトの名無しさん:2005/09/03(土) 03:42:26
Japanese Englishなコメント書くくらいなら日本語で書けよ。
299デフォルトの名無しさん:2005/09/03(土) 03:50:14
すみません。詳しい方にお聞きしたいのですが

 switch(9 <= num <= 17){

という意味の式をつくりたいので以下に直したのですが、

 switch((9<=num) && ( num>=17)){

Cの演算子を使う場合、この式であれば合ってますでしょうか?

300デフォルトの名無しさん:2005/09/03(土) 03:52:29
違う
301デフォルトの名無しさん:2005/09/03(土) 03:53:14
詳しいっていうか
入門書の一章読んだら十分分かるだろ
302デフォルトの名無しさん:2005/09/03(土) 03:54:30
>>299
おまいは算数もできんのか。
303デフォルトの名無しさん:2005/09/03(土) 03:54:53
>>299
>switch(9 <= num <= 17){
そもそもこれがありえない
304訂正:2005/09/03(土) 03:55:43
 switch((9<=num) && ( num<=17)){

打ちまちがえました。
305デフォルトの名無しさん:2005/09/03(土) 03:55:53
 switch((9<=num) && ( num>=17)){
これもなんだか・・・
306デフォルトの名無しさん:2005/09/03(土) 03:58:22
switch文で真偽返してどうすんの?
307デフォルトの名無しさん:2005/09/03(土) 03:58:23
>>305
打ちまちがえました。
308デフォルトの名無しさん:2005/09/03(土) 03:59:37
switchを調べろ
309デフォルトの名無しさん:2005/09/03(土) 04:01:29
>>304
それもなんだか・・・
310デフォルトの名無しさん:2005/09/03(土) 04:08:32
switch()の判定文に入れるのは整数値を表す変数。
caseに付けるラベルは整数の固定値。
範囲チェックしたいならif使え。
311デフォルトの名無しさん:2005/09/03(土) 04:08:56
演算子がどうとかいうより、switchの構文理解してないじゃねーか
312デフォルトの名無しさん:2005/09/03(土) 04:19:04
if(num== 310) puts("そうします。レス有難うございます");
else puts("参考書のメモに「複雑な式は使えない」と自分で書いておいたのを見つけました。");

puts("皆さんレスありがとうございました。");
313デフォルトの名無しさん:2005/09/03(土) 04:59:09
>>312
文字化けしてる
314デフォルトの名無しさん:2005/09/03(土) 05:09:11
315デフォルトの名無しさん:2005/09/03(土) 06:56:39
突込みどころしかないからなあ。
>>312,299
・ ((9<=num)&&(num<=17)) は Cの論理式として決して複雑ではない
・ switch文の機能、意味等がまったくわかっていない
・ 「数学で (9 <= num <= 17)」と言いたいだけだろ? C真似て紛らわしい質問。
つか、C入門書のはじめからと論理初歩やり直せ。当分初心者スレ以外に投稿すな。
316デフォルトの名無しさん:2005/09/03(土) 07:09:35
>>315
ざんねん
317デフォルトの名無しさん:2005/09/03(土) 07:12:48
>>315
誰もおまえの意見など聞いちゃいないw
318デフォルトの名無しさん:2005/09/03(土) 07:13:49
でも、無意味な文章をありがとうございます。
319デフォルトの名無しさん:2005/09/03(土) 07:23:11
・ ((9<=num)&&(num<=17)) は Cの論理式として決して複雑ではない

そんなことわかってるよw 複雑じゃないんなら、これでswitch( )書いてよw 

・ 「数学で (9 <= num <= 17)」と言いたいだけだろ? C真似て紛らわしい質問。

自分が読み誤ったのを正当化したいだけでしょう
320デフォルトの名無しさん:2005/09/03(土) 07:27:35
なら無視するか、誘導してもらって。で、よかったのに

何得意げに答えてんの?w

まぁ、他の人には感謝。

あ、アンカー↓
>つか、C入門書のはじめからと論理初歩やり直せ。当分初心者スレ以外に投稿すな。
321デフォルトの名無しさん:2005/09/03(土) 07:28:16
switch ((9<=num)&&(num<=17))
{
case 0:
moge();
break;

case 1:
hoge();
break;
}
322デフォルトの名無しさん:2005/09/03(土) 07:31:00
C言語のswitchには残念ながら範囲を指定する方法はない。
323デフォルトの名無しさん:2005/09/03(土) 07:39:33
箇条書きにしてる部分は>>315の被害妄想でしかないと思うけど、
参考になるスレなので荒れると嫌だから、しばらくロムります
324315:2005/09/03(土) 07:44:42
>>312
>"参考書のメモに「複雑な式は使えない」と自分で書いておいたのを見つけました。"
<<switch()の判定文に入れるのは整数値を表す変数。
<<caseに付けるラベルは整数の固定値。
つ "C入門書のはじめからと論理初歩やり直せ。当分初心者スレ以外に投稿すな。"
>>312並以下のアホだか脳無しまで沸いてるなあ。特に下記は憐れをもよおす。
>>319
>>そんなことわかってるよw 複雑じゃないんなら、これでswitch( )書いてよw 
>>322
>>C言語のswitchには残念ながら範囲を指定する方法はない。
325デフォルトの名無しさん:2005/09/03(土) 07:47:43
被害妄想がひとりいるなw
326デフォルトの名無しさん:2005/09/03(土) 07:51:14
>>315
憐れをもよおす。漏れはおまえに吐き気をもよおすよw
327デフォルトの名無しさん:2005/09/03(土) 07:51:16
if(CHECK_IN_RANGE(num, 9, 17))
{
;
}
328デフォルトの名無しさん:2005/09/03(土) 07:56:39
釣られはせんぞ。釣らせはせんぞ。釣らせはせんぞ。
329デフォルトの名無しさん:2005/09/03(土) 08:09:08
switchの存在意義って見易いこと意外にある?
330デフォルトの名無しさん:2005/09/03(土) 08:14:01
if elseの羅列より高速化される場合がある。
331315:2005/09/03(土) 08:29:39
「w」好きの低脳ってどこで見ても必死な低脳だな。
どう条件分岐したいかもわからずに書けないどうこうの能天気さが天晴れだ。
念の為。>>303は俺じゃない。こういう勘違い因縁づけは303,319ぐらい?
>>325
つ 325
>>326
つ 326
332デフォルトの名無しさん:2005/09/03(土) 08:34:52
ここですか? 315という被害妄想男が、頑張っているスレは
333デフォルトの名無しさん:2005/09/03(土) 09:26:39
他の言語だとcaseに範囲を指定できる
334デフォルトの名無しさん:2005/09/03(土) 09:36:22
/* <= sentence between these two symbols are comments => */
/* There are many aspects of difference between pure mathematics and
actual computation. For example, observe how the sum approaches or does not
to the theoretical value, as you increase N. Try the same thing replacing
"double" by "float" throughout.
("float" means simple precision real number.)
Explain the difference if any.
*/
#include <stdio.h>
#include <math.h>
int main(void){
long i,N; /* declaration of long integer variables to be used below */
double s, sgn; /* declaration of double precision real variables */
printf("Calculation of the series\n"); /* message output */
printf("1-1/2+1/3-+...\n");
printf("Up to which N? ");
scanf("%ld",&N); /* input the number of terms to be added */
s=(double)0; /* initialzation of sum */
sgn=(double)1; /* set the initial sign of the term */
for (i=1;i<=N;i++){ /* main loop for sum */
s=s+sgn/i;
sgn=-sgn; /* change sign for next term */
}
printf("Result : %18.15lf\n",s); /* output the result */
printf("Theoretical value : %18.15lf\n",log((double)2));
return 0;
}
335デフォルトの名無しさん:2005/09/03(土) 09:57:17
9 <= num <= 17 って書きたきゃ、Python やろうぜ。
336デフォルトの名無しさん:2005/09/03(土) 10:02:39
C++でもできるな。
337デフォルトの名無しさん:2005/09/03(土) 10:32:23
Cでもできる。 値は常に1だけどな。
338デフォルトの名無しさん:2005/09/03(土) 10:56:27
C++でも無理
339デフォルトの名無しさん:2005/09/03(土) 11:30:51
>>337
そういうのはできるとは言わない
340デフォルトの名無しさん:2005/09/03(土) 12:06:22
どう考えても釣りだろ?
あんな間違いするヤツは、いない。
341デフォルトの名無しさん:2005/09/03(土) 13:02:29
>>322
できないことはない。
switch ((num < 9) + (num < 17)) {
case 2:
    // 9未満
    break;
case 1:
    // 9以上17未満
    break;
case 0:
    // 17以上
    break;
}

まあ、こんなことする位ならif-else使っとけと。
342デフォルトの名無しさん:2005/09/03(土) 13:07:31
>>329
switch文はlコンパイル時にテーブルとして展開される。
if文は逐次判定処理。

そのため、判定条件が多くなるとswitch文の方が高速化される傾向にある。
しかし、判定条件が多すぎると却ってif文より遅くなる諸刃の剣。
343デフォルトの名無しさん:2005/09/03(土) 13:08:53
>>341
TRUEが1である保証はないから、正常に動作するとは限らない。
344デフォルトの名無しさん:2005/09/03(土) 13:11:42
>>343
これは釣りか?
345デフォルトの名無しさん:2005/09/03(土) 13:17:39
>>343
クマー
つ switch ((num < 9)?1:0 + (num < 17)?1:0)
346デフォルトの名無しさん:2005/09/03(土) 13:22:21
>>343
ハァ? 関係式は1か0しか返しませんが
347デフォルトの名無しさん:2005/09/03(土) 13:24:01
>>343
大漁おめでとう。
348デフォルトの名無しさん:2005/09/03(土) 13:24:06
>>343>>345
本気だとしたら嘆かわしいことだ。
http://www.kouno.jp/home/c_faq/c9.html

>組み込みの演算子によってブール値が産み出されるときは、
>1か0であることが保証されている。
349デフォルトの名無しさん:2005/09/03(土) 13:34:50
こんなのでも釣れてしまうとは嘆かわしいことだ。
350デフォルトの名無しさん:2005/09/03(土) 13:57:24
(勉強になったなんて言えない)
351デフォルトの名無しさん:2005/09/03(土) 13:58:11
m9(^Д^)プギャー
352デフォルトの名無しさん:2005/09/03(土) 14:30:39
>>350
(ぶっちゃけ、勉強になった)
353初心者の日記:2005/09/03(土) 14:33:37
struct a{
 unsigned short i, j, k;
 char str[128];
};

char str[] = "あいうえお,1,2,3";
struct a *test = malloc( sizeof(struct a) );

sscanf(str, "%127[^,],%d,%d,%d", test->str, &test->i, &test->j, &test->k);

とした場合、test->str[0] と test->str[1] にNULL文字が入ってしまうのですが、
構造体の中の変数の順番を、

struct a{
 char str[128];
 unsigned short i, j, k;
};

上のように入れ替えると、ちゃんと文字が入るんです。
unsigned short が3つあるので、2バイトが char に被るのは勉強したような気がしないでもないのですが、
何だか使いにくいような気がしました。

終わり
354デフォルトの名無しさん:2005/09/03(土) 14:35:33
>>345は演算子の優先順位表も見ておくこと。
355デフォルトの名無しさん:2005/09/03(土) 14:38:18
>>353
unsigned shortは%huだろうが
356デフォルトの名無しさん:2005/09/03(土) 14:42:23
>>353
× %d
○ %hd
357デフォルトの名無しさん:2005/09/03(土) 14:44:54
ネタだろうが釣りだろうが、
こうやってちゃんと正しとかないと、
第三者の初心者が勘違いするといけないから困る。
358デフォルトの名無しさん:2005/09/03(土) 14:46:17
こういう見事な例って本当に初心者なのかなとは思うな
sscanfとか普通使わないだろうし
359デフォルトの名無しさん:2005/09/03(土) 14:50:08
>>358
> sscanfとか普通使わないだろうし
ハァ?
360デフォルトの名無しさん:2005/09/03(土) 14:50:31
覚えたての初心者がってこと
361デフォルトの名無しさん:2005/09/03(土) 14:51:28
>>358
むしろ初心者だからこそ行き詰った時にsscanfを連発するのではないかと
362デフォルトの名無しさん:2005/09/03(土) 14:52:45
たいがいの初心者は sscanf の %[文字クラス] は使わないわな。
363デフォルトの名無しさん:2005/09/03(土) 14:55:54
林の糞本にも書いてあることが理解できない奴は初心者ですらないわな。
364デフォルトの名無しさん:2005/09/03(土) 16:48:22
某入門書にHelloを10回繰り返すfor文のサンプルがあったんですが、
それを作ろうとしてコンパイルしたら警告がでたけど、意味不明だから無視して実行したら10回繰り返すどころかHelloが無限ループされてしまいます。
一体どこが問題なんですか?

#include <stdio.h>

int main(void)
{
int i;

for (i=1; 1<=10; i++) {
printf("Hello\n");
}

return 0;
}

コンパイラにはBorland C++を使いました。
365デフォルトの名無しさん:2005/09/03(土) 16:48:40
sscanf(str, "%127[^,],%hd,%hd,%hd", test->str, &test->i, &test->j, &test->k);
%d だと 後半 test->k が4バイトで、[0000 0003 0000 0000]と言う具合に 2バイトオーバー
して上書きするから「あ」が消滅してしまうんですね・・・ 迂闊でした

皆さんご教示ありがとうございました
366デフォルトの名無しさん:2005/09/03(土) 16:51:08
1<=10
1 じゃない i ダ!
おもしろくもなんともないぞhage
367デフォルトの名無しさん:2005/09/03(土) 16:51:51
>>364
釣りだよな?
368デフォルトの名無しさん:2005/09/03(土) 16:57:56
>>365
ま、scanf()だとかprintf()みたいな可変長引数関数の書式指定子は
型チェックできないから気をつけろってこった

gccとかはprintf()を「知って」いるからそこまで見てくれたりするけどな
369デフォルトの名無しさん:2005/09/03(土) 17:18:06
>>365
だから%huだってば
370デフォルトの名無しさん:2005/09/03(土) 17:33:29
>>364
forの条件が常に成り立つようになってる
371デフォルトの名無しさん:2005/09/03(土) 17:43:29
>>364
ちなみに、何てエラーが出たんだ?
372デフォルトの名無しさん:2005/09/03(土) 17:48:20
は?エラー?
373デフォルトの名無しさん:2005/09/03(土) 17:48:53
>>372
すまん。警告だ。
374デフォルトの名無しさん:2005/09/03(土) 18:09:18
警告:
>>364は実はリアルだった
375364:2005/09/03(土) 18:36:05
>>366
あ、ありがとうございます。解決しました。





○| ̄|_
376デフォルトの名無しさん:2005/09/03(土) 18:41:14
警告の意味をよく調べて、
何でその警告が出たのか解析しといた方がいいぞ。
377364:2005/09/03(土) 19:15:17
今度は警告すら出てないのに無限ループするようになった・・・・・orz
378デフォルトの名無しさん:2005/09/03(土) 19:30:49
独り言はやめてくれ
379デフォルトの名無しさん:2005/09/03(土) 19:42:50
警告がでないのは文法上はおかしくないって事だけだろ
内容がどうであれ、コンパイラが緩衝しないのは当り前
380デフォルトの名無しさん:2005/09/03(土) 23:51:49
C言語で、ある画像内の指定ポイント(画素)の輝度を
取得するプログラムを作成することは可能ですか?
381デフォルトの名無しさん:2005/09/03(土) 23:55:02
>>380
可能か不可能かって言えば可能だろ
382デフォルトの名無しさん:2005/09/04(日) 00:13:58
>>380
その画像の該当画素を取り出せたら、0.299R + 0.587G + 0.114B
383デフォルトの名無しさん:2005/09/04(日) 00:19:49
元々輝度値で記録されている可能性もある。
384380:2005/09/04(日) 01:34:14
うーん・・・C言語で画像を扱ったことがないので、さっぱり分からないです。
(画像を入力する方法もわかりません)
もっと勉強してきます。
385デフォルトの名無しさん:2005/09/04(日) 02:10:37
そりゃ全然だめだな。画像形式すら書いてないし。
386デフォルトの名無しさん:2005/09/04(日) 02:30:52
>>380
処理の概要だけ。

画像が未圧縮のDIBだと仮定して、
1) 画像ファイルを開く(fopen)
2) 先頭から1画素ずつ走査し、該当画素を取得(fread)
  ※ファイルヘッダがあるなら読み飛ばす
3) 画素から輝度を取得 (>>382)
4) 処理が終わったらファイルを閉じる(fclose)

ファイル名や画素の位置はコマンドライン引数で指定するなり
ソース中で定義するなりお好きなように。
387デフォルトの名無しさん:2005/09/04(日) 02:46:34
おいおい
お前びっくりするな
388380:2005/09/04(日) 17:33:17
>>386
画像はBMPです。
処理の仕方はDIBと同じですか?
389デフォルトの名無しさん:2005/09/04(日) 19:34:08
BMPとDIBの画像形式に付いて調べろ
390デフォルトの名無しさん:2005/09/04(日) 23:37:43
ブール値ってなんかの論理式の結果だと必ず0か1だけど
if(a) で成り立つけど if(a==1)で成り立たないのって
軽くヤバくない?

a とだけ書いたとき、これってif文から見たらゼロじゃないからTRUEだけど
0以外であって1というわけではないよね
でも、これをaではなく真偽値を返す関数と置き換えて考えてみると
if(a())で成り立つけど if(a()==1) と書きたくならない?

あー、ならないか・・・おれでもこうは書かないな
すまん忘れてくれ
391デフォルトの名無しさん:2005/09/04(日) 23:40:04
>>390
BOOL a(void){
return TRUE;
}

if (a() == TRUE)

じゃ駄目なの?
392デフォルトの名無しさん:2005/09/04(日) 23:44:25
>if(a) で成り立つけど if(a==1)で成り立たないのって
>軽くヤバくない?
成り立たないと困るのに成り立たないとしたらただのバグ。
aに0,1以外を突っ込むのやめればいいだけの話。
393デフォルトの名無しさん:2005/09/04(日) 23:53:01
真偽値を返す関数を書くとき、ついつい
真に0、偽に0以外を設定しちゃうんだよね
偽にはエラー要因
394デフォルトの名無しさん:2005/09/05(月) 00:08:55
>>390
!!を使えば0か1になる
395デフォルトの名無しさん:2005/09/05(月) 00:10:52
頼むから止めてくれ
396デフォルトの名無しさん:2005/09/05(月) 00:15:27
俺くらいの上級ハッカーになると
FALSE:失敗、TRUE:成功、その他:エラーと自由自在に使い分けるんだけどな。
397 ◆i6G.jsz.NY :2005/09/05(月) 00:17:23
俺くらいの士官候補生になると
TRUEあるのみ
398デフォルトの名無しさん:2005/09/05(月) 04:42:54
>>390
>if(a())で成り立つけど if(a()==1) と書きたくならない?
ならない。
「真偽を返す」という定義の関数なんだから、
意味的に言って、その戻り値は if にそのままつっこむべき。
399デフォルトの名無しさん:2005/09/05(月) 07:17:42
typedef int BOOL;

BOOL hoge(int x)
{
return x -10;
}

こういう関数かもしれないしな。
400デフォルトの名無しさん:2005/09/05(月) 10:13:04
まさに is 系関数がそういうやつで、
真でも 1 以外の値が返ってくるのが普通。
絶対に 1 と比較してはならない。
0 との比較ならいいけど、
予めブール値に変換しておくような場合以外ではやる必要がない。
if とかではそのまま ( ) に突っ込んでおけばよし。
401デフォルトの名無しさん:2005/09/05(月) 11:21:49
つか、そんな事は各関数の戻り値の仕様を確認しろとしか
402デフォルトの名無しさん:2005/09/05(月) 11:25:09
Cに言語仕様としての論理値はないんだから(stdboolは後から取ってつけたライブラリ)
あくまで0か非0で考えるべき。
0か1か(それ以外か)はenumだろ。
403デフォルトの名無しさん:2005/09/05(月) 11:47:13
>>401
あんまり細かい仕様は把握してる人も少ないし、
時々処理系側でその仕様が無視されてることすらある。
安全のため、0 か非 0 が返ってくるものとしてプログラムを書くのが良い。
つか、こっちのが処理速い。
404デフォルトの名無しさん:2005/09/05(月) 11:50:32
Don't think, accpept!
405デフォルトの名無しさん:2005/09/05(月) 13:08:40
>>403
1と比較していいのかなんて話題出してるから、言ってる。

> あんまり細かい仕様は把握してる人も少ないし、
> 安全のため、0 か非 0 が返ってくるものとしてプログラムを書くのが良い。

論外、安全とか言う前にドキュメント読み返せ。
406デフォルトの名無しさん:2005/09/05(月) 13:27:14
1 と比較するメリットがないっていってんだよ。
407デフォルトの名無しさん:2005/09/05(月) 13:33:50
1と比較しろなんて言ってない、
仕様の確認もしない人に安全とか逝って欲しくないのだよ。
408デフォルトの名無しさん:2005/09/05(月) 13:34:51
確認しないとは言ってないだろう。
409デフォルトの名無しさん:2005/09/05(月) 13:35:44
あーウンコしたい
410デフォルトの名無しさん:2005/09/05(月) 16:50:29
トイレからカキコ
411デフォルトの名無しさん:2005/09/05(月) 19:43:56
    ラッセーラー ラッセーラ

ヾ(・ω・ )シ
 へ(  )
     >

    ラッセーラー ラッセーラ

ヾ( ・ω・)シ
  (  )へ
  く

  ( ・ω・ ) ウーーーーーーー
   └   ┘
   / ̄~ヽ

 ( ・ω・ )  ファビョ〜ン
゙_/( へ \_"
  <
412デフォルトの名無しさん:2005/09/05(月) 22:46:34
構造体の単方向チェインについて質問があるんですが、ここで聞いても大丈夫ですか?
413デフォルトの名無しさん:2005/09/05(月) 23:51:32
単方向チェインとは何ぞや
414デフォルトの名無しさん:2005/09/06(火) 00:07:55
単方向リストかな
415デフォルトの名無しさん:2005/09/06(火) 00:25:02
>>412
単方向チェイン=単方向のリンクリストのこと?
まあ、とりあえず質問してみ
スレ違いだったら誘導するから。
416デフォルトの名無しさん:2005/09/06(火) 00:30:40
この流れだけでスレ違い確定じゃねぇか。やめれ。
>>1嫁。せめて初心者系か ttp://pc8.2ch.net/test/read.cgi/tech/1123220967/
417デフォルトの名無しさん:2005/09/06(火) 02:44:35
C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?
418デフォルトの名無しさん:2005/09/06(火) 02:45:46
>>417
ここで、ゼナ。
419デフォルトの名無しさん:2005/09/06(火) 03:05:34
>>417
ビットシフト演算をしたい時に役立つ。w

えーと。たとえば非常に遅いCPUのマシンで腐ったCコンパイラを
使っている場合、2を掛ける時に << 1 でやった方が速いとかね。
2で割りたい時に >> 1 でやった方が速いとかね。昔のコンパイラは
最適化が悪かったのでよくやりました。今どきのコンパイラは * 2
と書こうが / 2 と書こうが勝手に一番速く実行するコードを出す
だろうから、読み易い方で書いておいて良いと思います。
420デフォルトの名無しさん:2005/09/06(火) 03:08:26
>>419
一番よく使うのはマスクじゃまいか?
421デフォルトの名無しさん:2005/09/06(火) 03:12:00
ビットシフト久しぶりだな
422デフォルトの名無しさん:2005/09/06(火) 03:35:02
#define BIT(n) (1u << (n)) /* n ビット目が 1 の値を取得 (n は 0 から始まる) */

というように、ビットフラグを作るときによく使う。

掛け算割り算でも、かける値、わる値が変数になってる場合、
ビットシフトにした方が効率がいい。
ただし、2の累乗で・・・って制限のある場合にしか使えないけど。
423デフォルトの名無しさん:2005/09/06(火) 03:57:13
ゲームとか暗号とか通信とかで役立つ>ビット演算
あと趣味
424デフォルトの名無しさん:2005/09/06(火) 04:14:27
ビットフィールドを理解できない厨房がよく使う
425デフォルトの名無しさん:2005/09/06(火) 04:39:54
FLAG flag = { 0 };

flag.a = 1;
flag.b = 1;
flag.e = 1;
flag.j = 1;

hoge(flag);

テラメンドス
426デフォルトの名無しさん:2005/09/06(火) 04:44:12
あそうだ。ビットシフトは2のn乗の計算がサクっとできるという利点があった。
427デフォルトの名無しさん:2005/09/06(火) 08:35:43
コピペにマジレスするのはやめてくれ
428デフォルトの名無しさん:2005/09/06(火) 09:06:52
マジレスしかしないってあの娘と約束したんだ……
429デフォルトの名無しさん:2005/09/06(火) 09:10:27
>>428
氏ねよ
430デフォルトの名無しさん:2005/09/06(火) 09:58:40
 ∧||∧
(  ⌒ ヽ 氏ねだと!? よし、死んでやる。 さきに死ねば、
 ∪  ノ  天上ではこちらが先達だ。 雑用にこき使ってやるから見ておれよ
  ∪∪
431デフォルトの名無しさん:2005/09/06(火) 10:02:52
C++ C#にくらべてCって何か利点あるんですか?
432デフォルトの名無しさん:2005/09/06(火) 10:07:13
>>431
コンパクト
433デフォルトの名無しさん:2005/09/06(火) 12:05:23
・より多くのプラットフォームに対するコンパイラがある。
・脱落する人が比較的少ない。
・C# とは比べるのが面倒になるくらい別物。
434デフォルトの名無しさん:2005/09/06(火) 12:09:30
コンパイラあるならC++使えって感じ
435デフォルトの名無しさん:2005/09/06(火) 12:18:11
Cスレで何を言ってるんだ?
436デフォルトの名無しさん:2005/09/06(火) 12:55:50
レスありがとうです
437デフォルトの名無しさん:2005/09/06(火) 13:45:28
劣悪な(開発・実行)環境にいるならC使えって事だな。
438デフォルトの名無しさん:2005/09/06(火) 14:27:51
>>52

おれは直角 / 小山ゆう
439デフォルトの名無しさん:2005/09/06(火) 14:37:40
>437
ライト環境と受け取りました
440デフォルトの名無しさん:2005/09/06(火) 14:47:52
組み込み
441デフォルトの名無しさん:2005/09/06(火) 14:55:27
返り値を返せと良く言われますが、void の関数でも
返り値を返すべきなの? その場合は、return NULL
にすべきなの? 返さないとどうなるの?
442デフォルトの名無しさん:2005/09/06(火) 15:01:09
voidなら戻り値不要。
return NULL; はNULLポインタを返すって意味だから
return; とだけ書けばいいし、関数の最後ならいちいちreturnする必要はない。
443デフォルトの名無しさん:2005/09/06(火) 15:43:40
>>441
可能ならvoidを使わず成否をちゃんと返せ
444デフォルトの名無しさん:2005/09/06(火) 16:00:29
>>441
やればわかることだと思うが、void の関数で return で値を返そうとすると
普通はコンパイルエラーになってコンパイル不能。
445デフォルトの名無しさん:2005/09/06(火) 16:12:01
>>444
void func(void) {
    return (void)1;
}
446デフォルトの名無しさん:2005/09/06(火) 16:24:46
>>444
んなこたない
447デフォルトの名無しさん:2005/09/06(火) 16:44:02
>>444
エラーじゃなくて警告な。
別に値返しても、使えなくて意味がないだけで、有害なわけじゃないからな。

>>445
それ、警告出るコンパイラと出ないコンパイラがあったと思う。
448デフォルトの名無しさん:2005/09/06(火) 17:07:52
C言語だと思うんで、質問します。よろしくお願いします。

csv形式のファイルがあり、ファイルから一行データを取得しました。
その内容が 整数,実数 であり、整数と実数に分けたいんですけど
どうすればできますか?
例 123,0.123 っていうデータがありました。
123と0.123を分けるにはどうしたらいいんでしょうか?
449デフォルトの名無しさん:2005/09/06(火) 17:09:17
文字列中に . があるかどうか
450デフォルトの名無しさん:2005/09/06(火) 17:09:43
>>448
面白くねえぞ?
451デフォルトの名無しさん:2005/09/06(火) 17:18:58
>>450
いやいやマジ質問ですよ!!
>>449 
もうちょい詳しく教えてください!
452デフォルトの名無しさん:2005/09/06(火) 17:20:00
strtokでいいだろ
sscanfでもできるけど
453デフォルトの名無しさん:2005/09/06(火) 17:21:42
454デフォルトの名無しさん:2005/09/06(火) 17:26:44
>>453
これ俺っす!
455デフォルトの名無しさん:2005/09/06(火) 17:26:57
>>448
int intValue;
double doubleValue;
if (sscanf("123,0.123", "%d,%lg", & intValue, & doubleValue) < 2) {
/* Illegal data? */
}
456デフォルトの名無しさん:2005/09/06(火) 17:27:55
アフォ
457デフォルトの名無しさん:2005/09/06(火) 17:29:54
458デフォルトの名無しさん:2005/09/06(火) 17:58:27
すいません。
バックトラック法について、できるだけ分かりやすく
解説してあるホームページなどありませんか?
よろしく、お願いします。
459デフォルトの名無しさん:2005/09/06(火) 18:03:57
すいません。
言語はCで、お願いします。
460デフォルトの名無しさん:2005/09/06(火) 18:04:14
>>457
2ちゃんねるでクロスポストする方法ありますか?
461デフォルトの名無しさん:2005/09/06(火) 18:15:43
>>448
とりあえず、ここからはでてけ。
(あれだけレスもらって、仕様の確認指摘されてて…)
462デフォルトの名無しさん:2005/09/06(火) 18:25:47
>>458
Google で検索して上から調べていくべし。
すぐ見つかる。
463デフォルトの名無しさん:2005/09/06(火) 18:56:17
>>441
voidの関数から値を返すと未定義動作
だから値を返しちゃいけない
>>444は値を返してるわけじゃないから問題ない
464デフォルトの名無しさん:2005/09/06(火) 23:17:32
コマンドプロンプトで始めにcd c  って打つんですけど指定されたパスが見つかりません
って出ます。何でですか?  ファイル名c です。」
465デフォルトの名無しさん:2005/09/06(火) 23:18:27
ウゼー
466デフォルトの名無しさん:2005/09/06(火) 23:19:13
>>464
100歩譲ってもC言語じゃないぞ
初心者板いけ
467デフォルトの名無しさん:2005/09/06(火) 23:25:44
初心者です。
C言語にはremoveとかunlinkはあるのに、
何故ファイルコピーの関数?は無いんでしょうか?

あと、ファイルコピーにfgets,fgetcを使ってるのは見つけたのですが、
freadは見当たりません。処理速度の問題ですか?


468デフォルトの名無しさん:2005/09/06(火) 23:33:41
>>467
CopyFile

既存のファイルを新しいファイルへコピーします。

CopyFileEx 関数は、2 つの追加機能を提供しています。CopyFileEx は、コピー操作の特定の部分が完了するたびに、指定された 1 個のコールバック関数を呼び出すことができます。さらに、コピー操作の最中にこの関数を中止することもできます。

BOOL CopyFile(
LPCTSTR lpExistingFileName, // 既存のファイルの名前
LPCTSTR lpNewFileName, // 新しいファイルの名前
BOOL bFailIfExists // ファイルが存在する場合の動作
);
469デフォルトの名無しさん:2005/09/06(火) 23:38:14
exitって関数、俺の知らぬ間に勝手に呼ばれるの?
470デフォルトの名無しさん:2005/09/06(火) 23:39:26
>>467
基本はfopen,fread,fwriteの組み合わせでファイルを操作する。
バイナリ、テキストモードを調べろ。ftell fseekも要参照。
他にもあるが後は自分で調べろ。
471デフォルトの名無しさん:2005/09/07(水) 00:11:00
ファイルを読み込む前にそのファイルのデータの入れ物を用意するのに
ファイルのデータサイズが知りたいのですが、どうやったら取得できるのでしょうか?
472デフォルトの名無しさん:2005/09/07(水) 00:11:22
>>468
Win32APIじゃねーか
473デフォルトの名無しさん:2005/09/07(水) 00:32:25
>>449,452,453,455
ありがとうございます!とても助かります!お礼遅くなってすみません。。。
474デフォルトの名無しさん:2005/09/07(水) 01:02:29 BE:99846454-##
>>469
main()からリターンすると、exit()と同等の処理が行われる(と思う)
475デフォルトの名無しさん:2005/09/07(水) 01:20:20
>>467
標準関数では、ファイルシステムに依存するような関数は省かれている。
だから、unlink()も標準ではない。
476デフォルトの名無しさん:2005/09/07(水) 01:30:56
質問です。とあるサイトの論理演算子の説明で次のようなソースが出てきました。

#include <stdio.h>

void main(){
int a;
scanf("%d", &a);

(10 <= a)  && (a <= 20) && printf("%d\n", a);
}

aの値を入力した後、まず10<=aが評価されて真ならば、次にa<=20が評価されて、
これもまた真ならば、最後にprintf("%d\n", a)の持つ値が評価されると思うんですが、
printfという関数のもつ値は常に真なのでしょうか?
477デフォルトの名無しさん:2005/09/07(水) 01:35:49
>>476
その論理演算の結果が使われているわけではないから、printf()の戻り値は考慮する必要がない。
尤も、printf()はきちんと意味のある戻り値を戻しているが、それはmanページでも自分で調べよ。
478デフォルトの名無しさん:2005/09/07(水) 01:37:17
>>477
レスありがとうございます
調べてみます
479デフォルトの名無しさん:2005/09/07(水) 02:15:54
while((c = getchar()) != EOF){
if(isdigit(c)){
ungetc(c,stdin);
scanf("%ld",&x);
push(x);
}else{
switch(c){
case '+':
b=pop();a=pop();
push(a+b);
break;
逆ポーランド記法の式を計算するプログラムの一部です。
この中のungetcが果たしている役割、意味がわかりません。
これが無ければ奇妙な挙動をします。
なぜこのようなものが必要なのか教えてください。
480デフォルトの名無しさん:2005/09/07(水) 02:37:06
>>479
ungetc()自体はMSDNで調べるなり、ググればすぐに見つかるが
指定した入力ストリームに一字押し込む
んで、getcharで取り出したcは演算子の判別に使用してるし
数字はscanfで取り込んだ方が手間が掛からないから、その為に
演算子か数字かの判定用に取って来ちゃったcを押し戻してる
481デフォルトの名無しさん:2005/09/07(水) 02:56:46
>470
有難うございます。

fread使っても良いんですねw

int main(){
FLIE *stream;
char *buffer;
int handle, size;

handle = open("copy元"、_O_RDONLY);
size =_filelength(handle);
close(handle);

stream = fopen("copy元"、"r");
fread(buffer, size, size, stream);
fwrite(buffer, size, size, stream):

close(stream);

return 0;
}

こんな感じでいいんでしょうか?


482デフォルトの名無しさん:2005/09/07(水) 02:57:23
>>480
ungetcは一応調べたのですが、ピンとこなかったので質問させていただきました。
自分でも理解しているかどうかわかりませんが、
getcharにより最初の文字が取り出される、というあたりで
なんとなくわかった気がします。
ありがとうございました。
483デフォルトの名無しさん:2005/09/07(水) 03:19:41
>>482
分かったっぽいが一応

要は入力ストリーム=1文字ずつ入ったコンテナが乗ったベルトコンベアと思えばいい
getcharはそこから最初のコンテナを下ろして中身を取り出す
ungetcはある文字をコンテナに入れてコンベアの先頭に強引に載せる
484デフォルトの名無しさん:2005/09/07(水) 07:37:30
>>481
判っているのか判っていないのか判らないからフォローしておくと、
入力用ストリームは出力できない。つーか、それじゃコピーにならないやん。
それと、filelength()だけのために低水準を使うのは感心しない。
stat()かなにかでサイズを得る方がいいかもしれない。
#ま、その辺は環境依存にもなってくるので詳しくは各環境のスレででも。
485デフォルトの名無しさん:2005/09/07(水) 07:52:57
C言語のシンボルの認識順序って

1 プリプロセッサ
2 予約語
3 関数内のローカル変数(static変数含む)
4 関数内のgotoのラベル
5 関数外のグローバル変数、関数(static変数、関数含む)

上の番号で並べるとどういう順番ですか?

自分は 1→2→3→4→5
という認識ですが、これで合ってますか?
(ラベルの扱いがよくわからない)

486デフォルトの名無しさん:2005/09/07(水) 10:10:14
>>481
あまりにも突込みどころ満載過ぎて誰も突っ込んでないようだが。

初期化されてないポインタのbufferにそのまま書き込んでるぞ。

別にファイル丸ごと読み込んで書き込まなければならない
理由はどこにも無い。それだとデカいサイズのファイルをコピーする
際に無駄にメモリを食うことになる。
適当なバッファサイズ(例えば4096とか8192とか)単位で
読み書きするループをまわす方が穏当だし、これだとファイルサイズ
を調べる必要も無くなる。

fopen()で開いたものはclose()ではなくfclose()で閉じる。
stdioのデフォルトはテキストモードなので、ファイルコピーの
ような場合は、明示的に"b"オプションを指定してバイナリモードに
する必要がある。その区別が存在するのはMS-DOSやWINDOWSなどだが、
区別の存在しないUNIXのようなOSで"b"オプションをつけても
害は無いので、つけておいたほうが良い。

fopen()で開くのなら、fileno()でディスクリプタを取得して
fstat()を使うことは可能で、その場合は最初にわざわざ別途に
open()、close()する必要は無い。これは無論ISO標準の範囲外の
話になるが、まあ大抵の環境では使えるだろう。
ちなみにfilelength()とかいう怪しい関数は(f)stat()と違って
ちっとも移植性が無い。
487481:2005/09/07(水) 10:11:33
>>486
有難うございます。

ただ、レスがちょっと長いので3行くらいにまとめてもらえないでしょうか?
488デフォルトの名無しさん:2005/09/07(水) 10:13:42
>>487
そんだけ突っ込みどころがあるってこと。
バグの指摘と、モアベターな方法のサジェスチョンが混じってはいるが。
489デフォルトの名無しさん:2005/09/07(水) 10:21:32
いやだから、スレ違いのマヌケ(>>1嫁)に
能無しの厨が得得と語るなと……
490デフォルトの名無しさん:2005/09/07(水) 10:28:20
>>485
「1」はコンパイルを行なわれる前に実施される。
コンパイラがソースを先頭から舐めて、これは予約語とかこれはラベルとか認識していると思っているなら間違い。
その質問の回答が来ても「字句解析を行ない、構文木を作成し云々」
という様にコンパイラが何をしているかを知らなければ回答が理解出来ない。
「コンパイラを勉強して再度質問する」「なぜそんな事が知りたいかを説明する」
のどちらかの行動をお勧めする
491デフォルトの名無しさん:2005/09/07(水) 10:30:44
492デフォルトの名無しさん:2005/09/07(水) 11:58:15
>>490
まったく参考になりませんでした。
他の人お願いします。
493デフォルトの名無しさん:2005/09/07(水) 11:58:32
ワロタ
494デフォルトの名無しさん:2005/09/07(水) 12:35:58
>>481
あきらめてsystem()使え
495デフォルトの名無しさん:2005/09/07(水) 16:44:29
>>485
プリプロセッサはコンパイルより前に解析される。
あとは、字句が出てきた時に、それが予約語か識別子(予約語でない)かが判定される。
識別子がどういう意味を持ってるかは、文脈から適宜判断される。
496471:2005/09/07(水) 19:26:31
すみません自己解決しますた

fseek(f,0L,SEEK_END);
size = ftell(f);
fseek(f,0L,SEEK_SET);

でファイルサイズ取得できますた
497デフォルトの名無しさん:2005/09/07(水) 20:40:54
bccを今日始めて入れてhello wordを出す事に成功したのですが
一緒に
hello.tds
hello.obj
と言う変なファイルだ出てきてしまいました。

これはいったい何なのでしょうか?説明お願いします。
498デフォルトの名無しさん:2005/09/07(水) 20:43:17
こんばんわよろしくお願いします
typedef struct _tagMainteRec
{
int nWave;
double dValue;
} MAINTEREC;
MAINTEREC Rec; convert←(値が入ってるとします)
この構造体のメンバに値をいれたいんですけど
どうすればできますでしょうか?

よろしくお願いします。
499デフォルトの名無しさん:2005/09/07(水) 20:50:40
>>497
hello.exeを作るうえでの中間ファイルなんで気にしないでOK
500デフォルトの名無しさん:2005/09/07(水) 20:52:23
>>498
convertは何を意味してる?
それだと型が指定されてないからコンパイルエラーになるぞ。

いまいち質問の意味がわからんが、Recのメンバに値を入れるなら
 Rec.nWave = (整数値);
 Rec.dValue = (実数値);
 Rec = (MAINTEREC型の変数);
501デフォルトの名無しさん:2005/09/07(水) 22:32:03
gccのエラーメッセージ一覧を探してネットをさまようも見つかりません。
過去ログ(8)にはgcc manualに載っているとあったので読んでみましたが、
それらしい記述は見当たりませんでした。載っているのはコマンドラインの
オプションだけ・・・。どなたかご存じないでしょうか?よろしくお願いします。
502デフォルトの名無しさん:2005/09/07(水) 23:00:51
>>499
ありがとうございます。
503デフォルトの名無しさん:2005/09/07(水) 23:50:33
11 40 8F 20 9E 40 40 EA EA CD FF FF FF CD 2E 4D 65 65 7E.......
なんて続くバイト列あるんだけどこれ
u_char *になっててテキトウに80バイトぐらい長さあります。

この中からNバイト目にXが存在するかどうかによってこのデータを保存する処理内容を変えたいのですが
一番速い方法ってどんな方法あるか教えてください。
504デフォルトの名無しさん:2005/09/08(木) 00:00:02
>>503
if (string[N] == X)?
505デフォルトの名無しさん:2005/09/08(木) 00:04:28
>>501
エラーメッセージリストはやっぱりないような気がするけど
gccのマニュアルで役に立つのはmanpageじゃなくて
info gccの方だよ。
506デフォルトの名無しさん:2005/09/08(木) 00:10:05
sprintfについての質問です。
sprintfはbufferに文字列などを格納し、バイト数を返すとありますが

char buffer[200], s[] = "hoge", c = 'w';

j = sprintf( buffer, " %s\n", s );
j += sprintf( buffer + j, " %c\n", c );

prinf("bufferは%s",buffer);
とした時何故、sとcの文字列が出力されるのですか?
jにはバイト数が入っているのに「buffer+j」の部分で何故sの文字列が代入されているのでしょうか?
さっぱりわかりません・・・
507デフォルトの名無しさん:2005/09/08(木) 00:15:53
sprintfの返値は出力したバイト数だっけ?
なるほど、こんな使い方があったのか(←初心者
508デフォルトの名無しさん:2005/09/08(木) 00:16:19
>>506
buffer + j は &buffer[j] と同じ。
509デフォルトの名無しさん:2005/09/08(木) 00:25:52
>>508
&buffer[j]の&にはどういう意味があるんでしょうか?
510デフォルトの名無しさん:2005/09/08(木) 00:30:02
&はもうちょっと勉強すればそのうち出てくる。
buffer + j や &buffer[j] はbufferの j 文字目から、ということになる。
511デフォルトの名無しさん:2005/09/08(木) 00:30:52
アドレス演算子でしょ
512デフォルトの名無しさん:2005/09/08(木) 00:49:39
>>506
>>508も参考に。
bufferと単に書けば「buffer配列の先頭ポインタ」を意味する。
jには上の行でbufferの先頭から格納されたbyte数が入っているので
buffer+j は(ポインタに整数を加算していて奇異に見えるが)
上の行で格納された文字列の次をポイントする
513デフォルトの名無しさん:2005/09/08(木) 00:57:03
みんなはバッファはナニ使ってる?

unsigned char* ? それとも char* ?
変数名も bufだったりbuffだったりbだったりする?
514デフォルトの名無しさん:2005/09/08(木) 01:07:24
uint8_t buffer[100];
515デフォルトの名無しさん:2005/09/08(木) 01:37:46
>>513
俺はchar*
名前はbuf使って、追加で用意するときはbuff
それ以上になったらbuff1, buff2, ...って感じでしてる
516デフォルトの名無しさん:2005/09/08(木) 01:48:46
>>513
俺はchar []型だが
>>513はバッファをヒープに取るのか?
517デフォルトの名無しさん:2005/09/08(木) 01:49:19
>>500
ありがとうさんです!
518デフォルトの名無しさん:2005/09/08(木) 01:50:41
testtest.obj : error LNK2001: 外部シンボル ""bool __cdecl TakeStudy(char)" (?TakeStudy@@YA_ND@Z)" は未解決です
LIBCD.lib(crt0.obj) : error LNK2001: 外部シンボル "_main" は未解決です
Debug/TestTest.exe : fatal error LNK1120: 外部参照 2 が未解決です

どういうエラーでしょうか?よろしくお願いします。
519デフォルトの名無しさん:2005/09/08(木) 02:40:56
>>518
main関数とTakeStudy関数の定義をもう一度見直せ
ライブラリを使ってるなら、パスやヘッダファイルもチェック
520デフォルトの名無しさん:2005/09/08(木) 03:03:25
>>516
大きさによるなぁ
どちらかというとまろやかなmalloc使うことが多いと思う
521デフォルトの名無しさん:2005/09/08(木) 03:10:01
>>506です。&は先頭アドレスを表すことは知っていたのですが
jが引っかかっていて何か別の意味があるのかと考えてしまい
>>509のような質問しましたが、>>510さんの説明で理解できました!
j文字目って事だったんですね、これでぐっすり眠れます。
皆さんありがとう^^
522デフォルトの名無しさん:2005/09/08(木) 16:15:01
>>519
やっと見直せました。自作関数の定義の仕方が間違ってました。。。。アフーーー!!
ありがとうございます!
523デフォルトの名無しさん:2005/09/08(木) 22:25:08
Linuxでメモリ管理を自分で行いたいのですがmallocが遅くてどうにもならないので
自分で管理しないと行けないのですが、参考文献や常套手段などありました教えてください。
 あとsseを使用してmemcpy実装したけど、全然速くないのですがこれって自分がファビョってるだけですよねぇ
524デフォルトの名無しさん:2005/09/08(木) 22:44:54
>>523
馬鹿かお前は
いや、お前は馬鹿だ
525デフォルトの名無しさん:2005/09/08(木) 23:11:13
>>523
はじめにmallocで大量にメモリを確保して
first fitなりを実装汁

>>524
場かはおまえ
526デフォルトの名無しさん:2005/09/08(木) 23:34:32
>>525
おいおい・・・釣りだよな?
527デフォルトの名無しさん:2005/09/08(木) 23:49:18
>>525
mmapで実装すればいいのですか?
それともPosix共有メモリで実装すればいいのですか?
528デフォルトの名無しさん:2005/09/09(金) 00:05:26
>>523
定石としては
・頻繁にメモリ確保/解放をしない
・無駄なコピーをしない
かね。
529デフォルトの名無しさん:2005/09/09(金) 00:08:46
>>528
なるほどそうなのですか
でもどうしても処理しようとすると最低でも6GBぐらいメモリが必要なのですが
これは分割して確保したほうがいいのでしょうか?
今このマシンメモリ16GB積んでいるのでメモリ取っても問題はないはずなのですが
530デフォルトの名無しさん:2005/09/09(金) 00:20:08
>>529
最初にでっかくとっとけ

最近は実際に使い始めるまで実メモリは確保されないんだから
531デフォルトの名無しさん:2005/09/09(金) 00:24:36
初心者です。VirtualAllocを使用し、構造体にメモリを割り当てようをしています。割り当ての成功or失敗は戻り値がNULLかどうかで判定できますが、何バイト割り当てられているのか@で知る方法がわかりません。
下記@の(int)sizeof(*pBmp)では、構造体のバイト数40が返ってくるので実際にアロックされたバイト数がしりたいのですが…。 (他板より誘導されてこちらにきましたが・・・)
/* 定数・変数定義 */
#define MAP_MAXSIZE (50L*1024L*1024L)
BITMAPINFOHEADER *pBmp;
map *pMap;
// メモリ獲得処理
if ((pBmp = (BITMAPINFOHEADER*)VirtualAlloc(NULL, MAP_MAXSIZE, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE)) == NULL) {
return (-1);
} else {/* ----- @ここで割り当てられたバイト数を知りたい ----- */
sprintf(logMsg, "メモリリソース獲得後: pointer = BITMAPINFOHEADER %x / size = %d", pBmp, (int)sizeof(*pBmp));
pMap = (map *)pBmp;
}
/* 構造体定義 */
typedef struct tagBITMAPINFOHEADER{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;
typedef struct tag_map {
BITMAPINFOHEADER biInfo;// Bitmap Info Header
BYTE bData[1];// 実際には約10MB分
} map;
532デフォルトの名無しさん:2005/09/09(金) 00:32:39
>>529
64 ビット機で計算科学でもやってんの?
どうやるにしろメモリは確保しないといけないのだから、
ある程度時間かかるのはしゃーない。
メモリ食わないアルゴリズムを探せるなら探した方がいいけど・・・
ないなら仕方がないね。
533デフォルトの名無しさん:2005/09/09(金) 00:49:02
>>529
6GBって・・・
処理に最適と思われるサイズを1ブロックとする
メモリ管理を実装してもいっちゃね?
どっちにしろ最初に最大のブロック数を確保することに
なると思うが。

534デフォルトの名無しさん:2005/09/09(金) 00:59:44
なるほど、では最大1600000個の要素が入ってくるので
それように最初に頭とケツ押さえて確保してしまいます。
後は、中身を検査して、結合子の入れ替え演算はポインタの付け変えだけで
いいからなんとかなりそうです。ありがとうございます
535デフォルトの名無しさん:2005/09/09(金) 01:11:47
>今このマシンメモリ16GB積んでいるので
これは釣りだよな、絶対。
536デフォルトの名無しさん:2005/09/09(金) 01:14:43
>>534
分かってると思うけど、1ブロックは2の乗数にしてね。
演算はなるべくシフトで。
積み重なったときの速度は全く変わってくるから。

537デフォルトの名無しさん:2005/09/09(金) 01:47:14
>>535
CPU:AMD Opteron
Chipset:AMD 8131/8111
使用してます。メモリだけで時価で1枚2万以上したと思います。
1GBx16枚積んでいます。
538デフォルトの名無しさん:2005/09/09(金) 04:26:38
(゚д゚ )ポカーン 俺のHDDよりでかい
539デフォルトの名無しさん:2005/09/09(金) 06:31:55
>>523
mallocが遅い、というのはどういう計測の結果確認できたのですか?
原則的に、実装の問題だけでなく、使い方(呼び出し回数等)の問題も
小さくは無いなずなので。(つうか、processの大きさ自体にも……)
(いや、自分のmemcpy()との実装比較もうまくやれて無いようなので、
判断の根拠が気になる……)
540デフォルトの名無しさん:2005/09/09(金) 07:17:25
allocした領域をfreeしてもタスクマネージャーで確認できる
メモリ使用量が減らないのですが、メモリ使用量を減らすにはどうすればよいですか。
過去ログによると

http://nssearch.hp.infoseek.co.jp/clang/1072212403.html#x937
多くの実装においてmalloc族で確保したメモリは
プロセスが生きている限りOSに返されることはない。

らしいのですが、きちんとfreeしてあるのに減らないと、重いアプリだと思われますよね。
541デフォルトの名無しさん:2005/09/09(金) 08:00:08
C言語関係ないじゃん
542デフォルトの名無しさん:2005/09/09(金) 09:32:52
malloc遅いってのは、確保する容量大きいので
ひょっとして認識できる程時間かかったりするんだろか
そんな環境使った事ないからわかんね

>>531
Win32APIなら該当スレへ、ここじゃない
543デフォルトの名無しさん:2005/09/09(金) 10:24:55
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

main ( ) {
int i, j, kotae;

srand(time(NULL));

printf("[計算]\n");

i = rand( )%9+1;
j = 4;

printf(" %d + %d =",i,j);
scanf ( "%d ", kotae );
while( getchar( ) != '\n' ) { }

if ( kotae == i + j ) { printf("正解"); }
else{ printf( "不正解"); }

return 0;

    }
おしえてくださいプログラムどこがおかしいんでしょうか
544デフォルトの名無しさん:2005/09/09(金) 10:27:25
↑このプログラムをコンパイルしたのですが
うまく動作しません。どなたか詳しい方
どこがおかしいのかおしえてください。
545デフォルトの名無しさん:2005/09/09(金) 10:36:10
scanf ( "%d ", kotae );

scanf ( "%d ", &kotae );
546デフォルトの名無しさん:2005/09/09(金) 11:48:58
>>523
6GB...もちろんLinuxは64bitOSだよな。
32bitOSだとアドレス空間は2GBまでしか確保できないはず...

> mallocが遅くてどうにもならないので
本当にmallocが遅いのか?実はその次のmemsetでの初期化が遅いとかないか?
prof , gprofを使ってボトルネックを探した方が早い様な気がする。
547デフォルトの名無しさん:2005/09/09(金) 11:54:38
>>544

>>1
>エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。
今度から気をつけてね。
548デフォルトの名無しさん:2005/09/09(金) 11:56:59
大抵ヒープマネージャは差し替えられるようになってるから
アロケートする傾向に合わせて既存のマネージャ探してみたら。
アルゴリズムはCマガかDDJで見たような気がするけど忘れた。

似たようなサイズの確保・開放が激しいなら
struct buff{
size_t size;
void *p;
struct buff *next;
} buff;

struct buff *reusable_buff_list ;

みたいな感じでプールしといて再利用するとか。
549デフォルトの名無しさん:2005/09/09(金) 12:19:41
いや、>>534 なんかみると、単に無駄にちまちま mallocしてるだけで
手際が悪いだけに見えるんだが、まあ、みんな疑問なのは、
本当に mallocのせいか? mallocの実装より単に大きいブロックから
切り分けりゃいいだけじゃね? ほんとに手順上その sizeが必須なのか?
とさまざまな突込みどころが… (memcpy SSE実装とかも…)
そもそもこれが、
>>Linuxでメモリ管理を自分で行いたいのですがmallocが遅くてどうにもならないので
>>自分で管理しないと行けないのですが、
<<Linuxでmallocが遅くてどうにもならないのでメモリ管理を自分で行いたいのですが
じゃないのがとてもワロタ(ひきつった)。でも激しくスレ違い。
550デフォルトの名無しさん:2005/09/09(金) 12:25:25
>>523
548の意見に賛成。
緩衝メモリエリアを設ける方法がいい。
OSの方にも似たような機構があるだろうけどGB単位のバッファは想定外でしょう。
何を計算させるかわからないけど、数値データの初期化だけでもえらく時間がかかりそう
551デフォルトの名無しさん:2005/09/09(金) 12:31:30
memcpy SSEってSSE2のことだよな。

worldのリコンパイルの時コンパイルオプションでアーキテクト指定できるから
すでに対応しているような気がするが。
552デフォルトの名無しさん:2005/09/09(金) 13:05:52
>>548,550
おそらく534だと、ほとんど同じようなcellをリストで使うのだろうから、
空セルのリストの先頭を持てばいいだけだろうな。文字列分の生成とかも
必要だと、その種のプールではほとんど意味無いし。
どのみち profileぐらいとったボトルネック評価もしないでいじっても無意味。
553デフォルトの名無しさん:2005/09/09(金) 13:31:19
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

main ( ) {
int player, suraimu,player_hp,suraimu_hp;
int p_turn = 1
player_hp = 100;
suraimu_hp = 100;

srand(time(NULL));

printf("スライムが現れた!\n");

for( ; ; p_turn = !p_turn) {
if(p_turn){player = rand( )%20+1;
printf("あなたの攻撃!ダメージ%d\n", player);
suraimu_hp -= player;
printf("スライムの残りHP%d\n",suraimu_hp);
if(suraimu_hp <= 0){ break;}
554デフォルトの名無しさん:2005/09/09(金) 13:31:56
}else{
suraimu = 10;
printf("スライムの攻撃! ダメージ%d\n", suraimu);
player_hp -= suraimu;
printf("あなたの残りHP%d\n", player_hp);
if(player_hp <= 0 ) { break; }
}
}

if( p_turn ) { printf( "スライムを倒した!\n"); }
else{ printf ( "あなたは死んだ・・\n");}

return 0;
}
555デフォルトの名無しさん:2005/09/09(金) 13:33:11
553 554をかきこんだものですが、
コンパイルするとどうしても
8行目のところで宣言の構文エラーとでてしまいます
なぜでしょうか 詳しい方おしえてください
おねがいします
556デフォルトの名無しさん:2005/09/09(金) 13:34:18
>>555
自分で考えろ
この程度で書き込むな
557デフォルトの名無しさん:2005/09/09(金) 13:34:25
>>555
> int p_turn = 1
セミコロンが抜けてる。
558デフォルトの名無しさん:2005/09/09(金) 13:35:45
>557
スペシャルありがとうございます。
559デフォルトの名無しさん:2005/09/09(金) 14:03:33
(;´Д`)
560デフォルトの名無しさん:2005/09/09(金) 14:34:09
いつからここはケアレスミスを見つけるスレになったんですか?
561デフォルトの名無しさん:2005/09/09(金) 15:06:46
何この流れ
脱力空笑いな俺がいる
562C勉強中:2005/09/09(金) 16:00:46
#include <stdio.h>

main ( ) {
char *str[ ] ={"hoge"};

printf("%d",str+2);
printf("%c", *(str+2));

return 0;
}
基本的なことですいません。このプログラムだと結果が(アドレス)ヨになってしまいます。
*(str+2)ではgがでてこないのでしょうか。詳しい方おしえてください
おねがいします
563デフォルトの名無しさん:2005/09/09(金) 16:03:41
>>562
変数宣言おかしくないか?
char str[]={"hoge"};でいいだろ
564C勉強中:2005/09/09(金) 16:08:44
>563
ありがとうございます。ポインタをもっと勉強しておきます。
565デフォルトの名無しさん:2005/09/09(金) 16:44:24
>540
メモリファイルシステムにしてmmapでやればぁ〜
566デフォルトの名無しさん:2005/09/09(金) 17:00:01
>>540
いちいち返してると返すたびにオーバーヘッドが発生して重いアプリだと思われるかと
567デフォルトの名無しさん:2005/09/09(金) 17:35:26
if (!RegisterClass(&wc))

これはどういう意味なのでしょうか?
568デフォルトの名無しさん:2005/09/09(金) 17:35:58
char型の文字型配列に
abcdefg
と入っている時、
cde
のみ取り出して、別のchar型文字列に入れるにはどうしたら良いでしょうか?
strcpyなどは「"先頭の"何文字をコピーする」なので使えませんよね。
お願いします。

569デフォルトの名無しさん:2005/09/09(金) 17:38:46
>>567
RegisterClassが失敗した場合分岐

>>568
string + 2をstrncpyに渡せば途中から取れると思うけど
570デフォルトの名無しさん:2005/09/09(金) 17:39:36
>>568
strchrまたはstrstr+strncpy
571デフォルトの名無しさん:2005/09/09(金) 17:44:01
>568

char *s = "abcdefg";
char dst[64];
strncpy( dst, s+2, 3 );
572デフォルトの名無しさん:2005/09/09(金) 17:45:08
>>563
それも可能ではあるけど、
普通は char str[]="hoge"; だな。
573568:2005/09/09(金) 17:50:19
>>569,571
そのような使い方が出来るとは・・・勉強が足りませんでした。

>>570
ポインタ等は理解していないので使いたく無いんです(ので逃げていました)。
これを機会に勉強します。

ありがとうございました。
574デフォルトの名無しさん:2005/09/09(金) 17:53:18
>>568
char * s = "abcdefg";
char dst[4];
sprintf(dst, "%.3s", s + 2);

char * s = "abcdefg";
char dst[4];
sscanf(s, "%*2s%3s", dst);

strtok()版もやろうかとちょっとだけ思った。
575デフォルトの名無しさん:2005/09/09(金) 18:41:35
C言語を勉強できるフリーソフトでオススメなのはありますか?
ちなみに授業ではBCCというのを使ってます。
576デフォルトの名無しさん:2005/09/09(金) 18:50:15
BCC か GCC
577デフォルトの名無しさん:2005/09/09(金) 18:51:31
.NET Framework開発ツールでCコンパイラも落とせる
578デフォルトの名無しさん:2005/09/09(金) 18:52:30
てか、授業で BCC 使うんなら、
BCC 使ったんでええんでないかい?
エラー・警告メッセージも同じだし。
579デフォルトの名無しさん:2005/09/09(金) 18:58:25
BCCっててっきり製品かと思ってたらフリーだったんですね・・・
お騒がせしました。
580デフォルトの名無しさん:2005/09/09(金) 19:00:01
コンパイラだけならね。 >フリー
開発環境込みだと有料。
ただ、フリーの開発環境もある(検索すればすぐ出てくる)。
581デフォルトの名無しさん:2005/09/09(金) 19:04:29
582デフォルトの名無しさん:2005/09/09(金) 19:07:10
まだ入門書の1章とかなんで
とりあえず計算結果を表示できればいいんで
開発環境とかはさっぱりです。がとりあえず>>581
見てみます。ありがとうございました。
583デフォルトの名無しさん:2005/09/09(金) 19:10:14
>>572
気を抜いてたから>>562に釣られて{}つけた
特に反省はしてない
584デフォルトの名無しさん:2005/09/09(金) 19:33:45
>573
Cはポインタが命 逃げ切れないよ
585デフォルトの名無しさん:2005/09/09(金) 19:33:57
>>583
というか、{ } 付きでも通るということに衝撃を受けた。
その間違いは、それはそれで糧になった。

まあ、何かのトリッキーなマクロくらいでしか使えそうにないけど。
586デフォルトの名無しさん:2005/09/09(金) 19:36:34
本格的に学ぶためには次にどんなことを学べばいいでしょうか?
やはりVisual C++などでWindowsのプログラミングを勉強したほうがよろしいでしょうか?
587デフォルトの名無しさん:2005/09/09(金) 19:49:18
>>586
Linuxをインストールして基本的なコマンドのソースを読むんだ
588デフォルトの名無しさん:2005/09/09(金) 19:51:29
>>587
それはダメだ
基本的ではないコマンドのコードを読むべき
lsとか面倒くさい
589デフォルトの名無しさん:2005/09/09(金) 19:53:33
>>586
あるオープンソースプログラムのクローン(ソースを見ずに独力で複製)を作って、
その後にソースを見比べてみる。
590デフォルトの名無しさん:2005/09/09(金) 21:03:44
>>587-589
grepのソース(コードとの違いはわかりません?)を見たんですが、
難しいですね。易きを求めてもキリが無いので、がっつり打ち込んでみます。
ところで何かお勧めのオープンソースプログラムはあるでしょうか?
591デフォルトの名無しさん:2005/09/09(金) 21:15:28
>>571
それは、末尾が\0終端されないという致命的な欠陥がある
592デフォルトの名無しさん:2005/09/09(金) 21:19:18
>>590
grep は正規表現だから、ちと難しいかも。
ワイルドカード程度なら簡単なんだけどね。
それでも頑張ってみるのもいいことだけど。

>ソース(コードとの違いはわかりません?)
コードの方が少し意味が広いけど、
文脈が同じなら、違いはない、筈。
593デフォルトの名無しさん:2005/09/09(金) 21:25:56
>>590
「打ちこむ」わけ?
594デフォルトの名無しさん:2005/09/09(金) 21:32:30
>>592
ついでなのでかじる程度にしか知らない正規表現も勉強したいと思います。

>>593
「Cの学習に打ち込む」の意です。
595デフォルトの名無しさん:2005/09/09(金) 21:33:37
最初はmvとかcpとかの方が取っつきやすいと思うな
596デフォルトの名無しさん:2005/09/09(金) 21:43:25
あるアドレスの中身を直接参照したいのですがどうすればいいですか?
597デフォルトの名無しさん:2005/09/09(金) 21:44:44
char *p = (char *)0xdeadbeaf;
とかそんな感じか?
598デフォルトの名無しさん:2005/09/09(金) 22:07:10
>>596
ありがとうございました
599デフォルトの名無しさん:2005/09/09(金) 22:08:53
>>597
申し訳ない
600540:2005/09/09(金) 22:23:54
いちいちOSに返せないとなると、
このメモリ使用量増加現象は
メモリリークと何か違うのですか?
OSとか他のアプリがメモリを欲しがった場合に回収されて
メモリ使用量は減るんですかね。

PCHAR g_superallocbuf = NULL;

ボタン1押す
if( !g_superallocbuf ){
g_superallocbuf = (PCHAR)calloc( 100000000, sizeof(CHAR) );
memset( g_superallocbuf, 'a', sizeof(CHAR)*100000000 );
}
ボタン2押す
if( g_superallocbuf ){
free( g_superallocbuf );
g_superallocbuf = NULL;
}
という、ボタンに対応してalloc、freeするだけの冶具では、
freeしたときにメモリ使用量がきちんと元に戻ったのでもうわけがわかりません。
601デフォルトの名無しさん:2005/09/09(金) 22:55:48
>>600
OS依存だからよそでやれやボケ
602デフォルトの名無しさん:2005/09/09(金) 23:04:23
メモリをOSに戻すか戻さないかは、malloc や free の実装者次第。

だから、仮に free がOSにメモリを戻さないような
ことがあっても問題なく動くコードを書くようにするのが
C使いの常識。
というか、malloc と free は本来そうやって使うためのもの。

よく世間で見られる malloc の後に free を呼び忘れないことに
血眼になっている奴等は、例えるならば
フェラーリで下町の路地を無理矢理通り抜けようとして
車体に傷がつかないように必死になっているようなもの。

正に馬鹿としかいいようがない。
603デフォルトの名無しさん:2005/09/09(金) 23:06:28
足立区のアパートにとまってたフェラーリ思い出したがな
604デフォルトの名無しさん:2005/09/09(金) 23:06:28
>>602
二段落目と三段落目とのつながりが無いわけだが
605デフォルトの名無しさん:2005/09/09(金) 23:07:08
↓free on exit開始
606デフォルトの名無しさん:2005/09/09(金) 23:10:48
exit(1);
607デフォルトの名無しさん:2005/09/09(金) 23:17:31
プログラムのの書き方ですが、約1000行のプログラムの場合
みなさんはどんな風に分けていますか?
僕の場合はメイン関数は基本的に関数を呼ぶだけで、
メイン関数への戻り値によって処理終了するか続行するかを決める処理なんですけど、
どうでしょうか?
関数内でエラーが発生したらそこから終了させてしまった方が見易いですか?
また、簡単な処理ならメイン関数に書くべきですか?
608デフォルトの名無しさん:2005/09/09(金) 23:21:21
>>607
それはC言語の話題ではない。
つ[プログラム設計方法論]
609デフォルトの名無しさん:2005/09/09(金) 23:29:21
>>604
mallc/freeに頼らずに自分でメモリ管理するべきということでしょ。
610デフォルトの名無しさん:2005/09/09(金) 23:30:39
愚の骨頂
611デフォルトの名無しさん:2005/09/10(土) 00:23:13
そして時代は繰り返される 〜malloc/free〜
612デフォルトの名無しさん:2005/09/10(土) 01:45:55
関数テーブルについて教えてもらいたいです。


typedef (*Matrix)(int ret);

Matrix matrix[] [10]={
{step_cnt, (関数名)..., ..., ..., ..., ..., ..., ..., ..., ...., }.
{other, (関数名..., ..., ..., ..., ..., ..., ..., ..., ..., }
};
のような形を使いたいのですが、調べたのですが全然わかりませんでした。

宣言の仕方、テーブルを呼び出す関数の作り方、渡す先の関数の作り方を
教えてもらいたいです。

613デフォルトの名無しさん:2005/09/10(土) 09:13:46
>>612
宣言はそれでいいはず。
呼び出すときはmatrix[0][0](0)のようにする。
614デフォルトの名無しさん:2005/09/10(土) 10:25:26
開けたら閉める
615デフォルトの名無しさん:2005/09/10(土) 10:38:38
>607
同じコーディングスタイル。
main以外ではexitしない方がいい。
616デフォルトの名無しさん:2005/09/10(土) 10:41:06
必要もないのにエラーを上位に伝播させても無駄なだけ
617デフォルトの名無しさん:2005/09/10(土) 10:47:11
Cならlongjmpという手も
618デフォルトの名無しさん:2005/09/10(土) 10:47:43
終了処理がなければな。
619デフォルトの名無しさん:2005/09/10(土) 10:52:27
>602
アホ
関数などの機能分割する意味が理解できていないのと
リソース解放の必要性が全く分かってない。
初心者が多い場所で602ワールドの常識をC使いの常識などと
吹聴するのはやめていただこうか。
620デフォルトの名無しさん:2005/09/10(土) 11:09:12
>616
必要があるように上位に伝播させているんだよ。
mainまで戻るのは終了させる必要がからじゃないの。
621デフォルトの名無しさん:2005/09/10(土) 11:54:45
エラー報告して終了するタイプのプログラムなら別にどこで終わっても良いと思うが、
途中の経路でリソース開放が重要なら関数が全部エラー返すようにするのが無難。

エラーしても継続して動作するアプリなら、607氏が悩んでる状況にそもそもならないと思う。
622デフォルトの名無しさん:2005/09/10(土) 12:10:31
>>607
void *xmalloc(size_t n)
{
  void *p = malloc(n);
  if (!p) { perror("malloc"); exit(2); }
  return p;
}
みたいなの(要するに呼び出し側に制御を戻すとは限らない関数)を
使うのは珍しいことじゃない。
こういうのが使えるかどうかはプログラムの性質による。
「使える」場合には、当然使ったほうエラー処理が単純になり楽になる。
場合によってはatexit()やsetjmp()、apacheのようなプール管理方式の
使用なども検討しましょう。
623デフォルトの名無しさん:2005/09/10(土) 12:20:24
要するに例外のないCは糞ってことだ
624デフォルトの名無しさん:2005/09/10(土) 12:23:13
いや、例外くらい自分で実装しろって事
625デフォルトの名無しさん:2005/09/10(土) 13:25:19
いっそCよりも制約のゆるいコンパイル言語ってないもんかねえ?

関数外へのジャンプやスタックポインタの明示的な操作もやり放題で。

各CPUへのコンパイラさえあれば、素のマシンコードへ無難に翻訳してくれるような。
626デフォルトの名無しさん:2005/09/10(土) 13:45:05
うるせえボケ
627デフォルトの名無しさん:2005/09/10(土) 14:00:40
C言語をはじめたばかりであまりわからないのですが、 
ピットシフトはなんの役に立つのでしょうか? 
628デフォルトの名無しさん:2005/09/10(土) 14:01:43
デジャヴ?
629デフォルトの名無しさん:2005/09/10(土) 14:21:01
>>628
俺も一瞬そう思ったけど、良く見ると「ピ」ットだぜ
630デフォルトの名無しさん:2005/09/10(土) 14:23:52
627=629=631
631デフォルトの名無しさん:2005/09/10(土) 14:29:24
お、おれ?
632デフォルトの名無しさん:2005/09/10(土) 14:35:31
ワロタ
633デフォルトの名無しさん:2005/09/10(土) 14:40:31
C言語をはじめたばかりであまりわからないのですが、
C言語厨はなんの役に立つのでしょうか?
634デフォルトの名無しさん:2005/09/10(土) 14:42:40
MACにC言語コンパイラってありますか?
635612:2005/09/10(土) 15:40:23
>>613

matrix[y軸][x軸]();
としたいのですが、y軸をグローバル変数で宣言していて、
x軸をパラメータとして、この関数テーブルに渡したいのですが、その時は

void call_matrix(int *rec_info)
{
matrix[グローバル変数][*rec_info]();
}
の形でいいんでしょうか?
また、呼び出した先の関数に値やアドレスを渡さない時には
呼び出す先の関数は
void func(void)

...
}
でいいでしょうか?
636デフォルトの名無しさん:2005/09/10(土) 15:47:52
>>635
matrixにしまうのならMatrix型に合うようにint func(int)にしろ。
637デフォルトの名無しさん:2005/09/10(土) 15:53:44
if( ptr )

で、ptrがぬるぽだったら偽と評価されるの?
638デフォルトの名無しさん:2005/09/10(土) 15:57:04
>>637
そういうこと
639デフォルトの名無しさん:2005/09/10(土) 16:28:45
>>634
OSXならgccが使える。
Appleのサイトで開発環境を無料で入手可能。
640名無しさん@そうだ選挙に行こう:2005/09/10(土) 16:54:18
>>633
厨だと役に立たない
641デフォルトの名無しさん:2005/09/10(土) 16:58:17
>>639
開発環境は OS X についてきてる筈。
ただ、そのままではインストールされず、
Development Tools って CD が付いてきてるから、
それからインストールする。
642名無しさん@そうだ選挙に行こう:2005/09/10(土) 18:37:41
>>640
親切におしえていいただき、ありがたいのですが...
MACOS9なんです。最初にいうべきでしたね...
OS9対応でC言語のコンパイラはありませんか?
643名無しさん@そうだ選挙に行こう:2005/09/10(土) 18:52:37
>>642
MPW
644名無しさん@そうだ選挙に行こう:2005/09/10(土) 18:55:18
旧Macはコマンドラインがないというなかなか学習大変な環境だよな
645名無しさん@そうだ選挙に行こう:2005/09/10(土) 19:44:38
#include <stdio.h>

void moji(char ch);

int main(void)
{
char ch1;

do{
printf("文字を入力してください: ");
scanf("%c", &ch1);
}while(!(('a'<=ch1) && (ch1<='z')));

moji(ch1);

return 0;
}

void moji(char ch)
{
if(ch<='z'){
printf("%c", ch);
moji(++ch);
}
}
を実行し、わざとa〜z以外の文字(Aとか)を入力すると、
「文字を入力してください: 文字を入力してください: 」
となります
なぜ、こうなるのでしょうか?
また、「文字を入力してください: 」のみを表示することは可能でしょうか?
646名無しさん@そうだ選挙に行こう:2005/09/10(土) 19:47:28
>>645
実際は「a〜z 以外の文字」と改行で2文字入力されるから。
期待しない文字だった場合は fflush(stdin) するようにすればいいかな?
647名無しさん@そうだ選挙に行こう:2005/09/10(土) 19:48:14
>>645
改行コードの処理
648名無しさん@そうだ選挙に行こう:2005/09/10(土) 19:48:49
ファイルAとBがあります。
A、Bにはあらかじめ何かしらデータが入っているとします。
AとBの内容から、新たにAを作り直すということをやりたいです。
AにBを追記するのではありません。
AのファイルパスをPathA, BのファイルパスをPathBとします。

FILE *fr, *fr2, fw;
fr = fopen(PathA, "r");
fr2 = fopen(PathB, "r");
fw = fopen(PathA, "w");

---処理

fclose(fw);
fclose(fr2);
fclose(fr);

とやってみたのですが、fw = 〜の行が実行された時点で、ファイルAがデータ無し
の状態にクリアされてしまいます(当然ですが)。
どのような方法を取れば良いでしょうか?
649名無しさん@そうだ選挙に行こう:2005/09/10(土) 19:51:47
>>648
Cを作れば?
650名無しさん@そうだ選挙に行こう:2005/09/10(土) 19:53:02
>>646
>>647
改行も処理されるんですね…orz
fflush(stdin)は便利なので、使っていきたいと思います

どうもありがとうございました
651名無しさん@そうだ選挙に行こう:2005/09/10(土) 19:57:46
>>646,650
入力バッファのフラッシュによる動作は一般に未定義。よって、
fflush(stdin)はあなた方の環境では偶然期待通りに動いているだけ。
ISO/IEC 9899:1999 7.19.5.2 The fflush function -2
652648:2005/09/10(土) 19:57:49
>>649
そ、そうですね。

AをCにコピー
fr = fopen(PathC, "r");
fr2 = fopen(PathB, "r");
fw = fopen(PathA, "w");

とすれば出来ました。お恥ずかしい。
ありがとうございます。
653名無しさん@そうだ選挙に行こう:2005/09/10(土) 20:08:53
>>651
(; Д )       ゚ ゚
654名無しさん@そうだ選挙に行こう:2005/09/10(土) 20:18:39
655646:2005/09/10(土) 20:22:39
>>645、スマソ(;´Д`)
656612:2005/09/10(土) 20:35:05
>>636
ありがとうございます。
おかげで完成出来そうです。
657名無しさん@そうだ選挙に行こう:2005/09/10(土) 20:49:52
アルゴリズムに関する質問なのですが、いちおうC言語で開発していますので、
ここで質問させて頂きたいのですが、(それと、ここだとプログラムの専門家
の方が大勢いらっしゃると思うので)
XY平面上の多角形図形を、直線で分割するCプログラムを作成しているのですが、
凸型の多角形に限定すれば簡単なのですが、凹んでいる多角形なども考慮した
任意の形状の多角形を直線で分割する良いアルゴリズムの開発に苦労しています。
多角形は、以下のような構造体を定義して、リスト構造で表現してみました。
struct Point {
double x;
double y;
struct Point *next;
struct Point *prev;
} ;
例えば、三角形ならば、
(x1,y1) ----(x2,y2)----(x3,y3)----(x1,y1)
のように4つの要素を連結して、表現してみました。
そこでお教えいただきたいのですが、このような問題に対する、お勧めのサイトとか、
アルゴリズムとか、データ構造などに関して、何でも良いので情報をご存知の方
おられましたらアドバイスお願いします。
よろしく。
658名無しさん@そうだ選挙に行こう:2005/09/10(土) 20:55:17
>>657
画像処理スレや宿題スレがあるじゃないか
659名無しさん@そうだ選挙に行こう:2005/09/10(土) 20:56:47
数学を基礎から勉強
まず、そんな効率の悪い方法でやろうとするな
660名無しさん@そうだ選挙に行こう:2005/09/10(土) 21:11:10
初心者です。
独習Cと言う本を買ったけど、コンパイルできなかった。

icrosoft.NET Framework SDKを使用する場合は、コンパイラがコマンドベースなので、
まずメモ帳などのテキストエディタでプログラム用のファイルを作成し保存します。
続いてXPではコマンドプロンプトウィンドウを開いてください。
ソースファイルを保存したディレクトリに移動して、次のコマンドを入力します。
c1 test.c
これでプログラムを実行することができます。次のコマンドを入力してください。
test.exe

と書いてあるんですけど、4行目からわからないです。
c1 test.cコマンドをはどこに入力するんでしょうか。
本当に素人くさい質問ですみません。
661名無しさん@そうだ選挙に行こう:2005/09/10(土) 21:14:29
とっととPC初心者板で揉まれてこい
662名無しさん@そうだ選挙に行こう:2005/09/10(土) 21:19:30
>>660
初心者に質問する権利は(慣例上)無い。
663名無しさん@そうだ選挙に行こう:2005/09/10(土) 21:21:27
>>662
お前、慣例の意味わかってないだろ
664名無しさん@そうだ選挙に行こう:2005/09/10(土) 21:22:43
寒いところ
665名無しさん@そうだ選挙に行こう:2005/09/10(土) 21:26:13
>>660
c1じゃなくてcl(シーエル)
コマンドプロンプトはスタートメニューのプログラムのアクセサリの中にある。
666660:2005/09/10(土) 21:30:14
>>665
助言ありがとうございます。
入力したら「ソースファイルを開けません」と出ました。
どうしたらいいでしょうか。
667名無しさん@そうだ選挙に行こう:2005/09/10(土) 21:31:50
ゆとり教育世代?
668デフォルトの名無しさん:2005/09/10(土) 21:32:42
まぁそういわずに。
669名無しさん@そうだ選挙に行こう:2005/09/10(土) 21:34:03
>>665>>668
責任もって最後まで答えてやれよ
670名無しさん@そうだ選挙に行こう:2005/09/10(土) 21:35:23
間も無く>>665によるwindows講座が始まります。お楽しみに。
671名無しさん@そうだ選挙に行こう:2005/09/10(土) 21:37:38
>>662-664
>>664寒冷前線じゃなくて
672名無しさん@そうだ選挙に行こう:2005/09/10(土) 22:18:00
ところでicrosoft.NETって初耳なんだが、いったいなんだ?
673名無しさん@そうだ選挙に行こう:2005/09/10(土) 22:21:13
こりゃあ完全に釣りだな。
674名無しさん@そうだ選挙に行こう:2005/09/10(土) 22:32:55
>>666
clの前に「cd ソースのあるディレクトリ」
675名無しさん@そうだ選挙に行こう:2005/09/10(土) 22:44:40
すいません。
初心者ですが
デバイスを解放せずにプログラムを終了させると
どうなるんですか?
676名無しさん@そうだ選挙に行こう:2005/09/10(土) 22:47:43
最近の若い者(モン)はDOSも(ry
677675:2005/09/10(土) 22:51:25
次からそのデバイスが使用できなくしまうと
どこかの解説サイトにあったんですが・・・
678名無しさん@そうだ選挙に行こう:2005/09/10(土) 22:53:19
スレタイも読めないバカが多発中
679名無しさん@そうだ選挙に行こう:2005/09/10(土) 22:56:25
文字列を抽出するプログラムを作りたいのですが、
バイナリが4バイトずつ読んでしまうこともあり、わからないです・・・

手順は
1.ファイル読み込み
2.リソース場所へ移動
3.1バイト、1バイト読んでいく
4.規定外の文字なら今まで読んだところを結合
5.それを保存
6.3-5をループ
7.最後まできたら終わる。
このような感じを考えているのですがヒントをいただけないでしょうか?

参考にしたサイトは
ttp://www9.plala.or.jp/sgwr-t/lib/fread.html
ttp://homepage3.nifty.com/mmgames/c_guide/17-02.html
680名無しさん@そうだ選挙に行こう:2005/09/10(土) 23:00:53
>>679
バイトならfread(buf, 1, 1, fp)だよ
681名無しさん@そうだ選挙に行こう:2005/09/10(土) 23:01:12
>>679
お前の書いたコードが悪い。
682名無しさん@そうだ選挙に行こう:2005/09/10(土) 23:04:45
>>680
ありがとうございます。
早速、取り掛かってみます。

>>681
すみませんでした。
できるだけ良いコードを書けるようにがんばります。
683名無しさん@そうだ選挙に行こう:2005/09/11(日) 00:39:41
C言語で作ったライブラリを呼ぶデモを行うため,GUIでデモ用のアプリケーションを作りたいと
思っています.C言語でGUIを作った場合,入力データの受け渡しは簡単だと思うのですが,
GUIを作るのが面倒だと思います.一方,tcl/tkみたいなスクリプトでGUIを作った場合,
GUIは簡単に作れるかわりに,データの受け渡しが面倒だと思います.
開発環境はwindows+cygwinなので,visual studio系は使えません.このような状況で
最も簡単なGUIアプリの作り方はどのような方法が考えられますか?
684名無しさん@そうだ選挙に行こう:2005/09/11(日) 00:43:01
>>683
>>1も読めない文盲か。
685名無しさん@そうだ選挙に行こう:2005/09/11(日) 01:10:17
686名無しさん@そうだ選挙に行こう:2005/09/11(日) 07:36:46
>>680
それは getc(fp) と同じだ。
687名無しさん@そうだ選挙に行こう:2005/09/11(日) 07:52:53
>>683
CGI
688名無しさん@そうだ選挙に行こう:2005/09/11(日) 11:57:07
宿題は専門の別スレあるってかいてあるけどスレ名なんていう名前ですか?
689名無しさん@そうだ選挙に行こう:2005/09/11(日) 12:09:14
atta
690名無しさん@そうだ選挙に行こう:2005/09/11(日) 12:22:23
>688
まず2chブラウザを入れろ
そうしたらスレ一覧から宿題で検索。

おまえの評価はCだ
691名無しさん@そうだ選挙に行こう:2005/09/11(日) 12:35:31
>>686
fgetc
692名無しさん@そうだ選挙に行こう:2005/09/11(日) 13:22:02
int (*pfunc)(void *);
pfunc = NULL;
これって合法?
693名無しさん@そうだ選挙に行こう:2005/09/11(日) 13:30:02
ポインタにNULL入れちゃいけないなんて決まりないでしょ。
そこを参照しちゃ駄目だったと思うけど。
694名無しさん@そうだ選挙に行こう:2005/09/11(日) 13:36:06
カンチガイしてた。ありがと。

やっちゃいかんのは
int func(void *arg) { /* ... */ }
void *pfunc = func;
だな。
695名無しさん@そうだ選挙に行こう:2005/09/11(日) 14:01:38
1:int *pfunc = func;
2:void (*pfunc)() = func;
3:int (*pfunc)() = func;
696名無しさん@そうだ選挙に行こう:2005/09/11(日) 15:15:01
キャストすれば可能だがな。
697名無しさん@そうだ選挙に行こう:2005/09/11(日) 17:00:03
>>692-693
NULLがこう定義されているとアウト。
#define NULL (void *)0
オブジェクトへのポインタを関数へのポインタに変換するのは処理系依存か何か。
698名無しさん@そうだ選挙に行こう:2005/09/11(日) 17:55:16
>>697
>オブジェクトへのポインタを関数へのポインタに変換するのは……
空ポインタの場合はキャストによる型変換が許されている => JISX3010 6.3.2.3
さらに空ポインタ定数の場合は自動的に型変換される => JISX3010 6.5.16.1
それ以外は未定義
699名無しさん@そうだ選挙に行こう:2005/09/11(日) 18:27:16
>>698
C99で改良されていたのね。スマソ
700名無しさん@そうだ選挙に行こう:2005/09/11(日) 20:42:00
>>699
ヌルポインタに対する特例は前からあるよ
701デフォルトの名無しさん:2005/09/11(日) 21:18:08
ポインタのポインタのポインタのポインタ

いやあああああああああああああ
702名無しさん@そうだ選挙に行こう:2005/09/11(日) 21:38:37
>>701
そこまで行くと一度設計を見直したほうがいいような気がする。
703名無しさん@そうだ選挙に行こう:2005/09/11(日) 21:54:41
ヌポポポポポッ
704名無しさん@そうだ選挙に行こう:2005/09/11(日) 21:55:53
ポインタの指す構造体のメンバの
ポインタの指す構造体のメンバの
ポインタの指す構造体のメンバの
ポインタの指す構造体のメンバの
・・・・orz・・・・
705名無しさん@そうだ選挙に行こう:2005/09/11(日) 22:02:02
ツリー構造表現すりゃそうなる罠
別に悪いことじゃない
706名無しさん@そうだ選挙に行こう:2005/09/11(日) 22:49:29
>>702
Cならありえるしtypedefで隠すことだって出来る
まあ設計の見直しは大切だな
707名無しさん@そうだ選挙に行こう:2005/09/11(日) 23:20:01
流石に4重ポインタとなると、
多重配列を動的に確保する時にしか
使いどころがない気がする。
708名無しさん@そうだ選挙に行こう:2005/09/11(日) 23:21:49
ポインタをいっぱい使うとエライ人に褒められるからな
709名無しさん@そうだ選挙に行こう:2005/09/11(日) 23:30:59
>>708
それは「エライ」人だな。

「イタイ」人とも言う。
710デフォルトの名無しさん:2005/09/11(日) 23:57:39
ポインタいっぱい使うようなものなら
最初からC++で書けばいいのに
711デフォルトの名無しさん:2005/09/12(月) 07:06:19
int main(void)
{
int i, no;
int prime[500];
int ptr = 0;
unsigned long counter = 0;

prime[ptr++] = 2;
prime[ptr++] = 3;
for (no = 5; no <= 1000; no += 2) {
int flag = 0;
for (i = 1; counter++, prime[i] * prime[i] <= no; i++) {
counter ++;
if (no % prime[i] == 0) {
flag = 1;
break;
}
}
if (!flag)
prime[ptr++] = no;
}

for (i = 0; i < ptr; i++)
printf("%d\n", prime[i]);

printf("乗除を行った回数:%lu\n", counter);

return (0);
}
素数を求めて乗除を行った回数をもとめるプログラムなのですが、
counter++が2回出てくる理由がわかりません。
御教授ください。
712デフォルトの名無しさん:2005/09/12(月) 07:31:08
>>711
最後のprintfからcounterは乗算・除算を行った回数を計測するようだ。
forの条件式でprime[i] * prime[i]を行っているので、ここで1回。
その次、no % prime[i]も除算なので、ここでも1回。
別におかしくもなんともないな。
713デフォルトの名無しさん:2005/09/12(月) 07:36:11
>>712
理解できました!
ありがとうございます。
714デフォルトの名無しさん:2005/09/12(月) 17:18:43
int var = 12345; として fscanf(fp, "%d", &var);
が失敗(EOFか0が返る?)した場合、var の内容は
12345 のままですか?
715デフォルトの名無しさん:2005/09/12(月) 17:21:51
です
716デフォルトの名無しさん:2005/09/12(月) 17:37:49
関数テーブルを使いたいんですけど
こんなだとコンパイルエラーになります

int hoge(int a){ return a; }
int hage(int a){ return a*2; }

int main(){
int *c[] = {hoge,hage};
printf("%d\n",c[0](3));
printf("%d\n",c[1](3));
}

どう書くのが正しいんでしょうか
717デフォルトの名無しさん:2005/09/12(月) 17:39:22
ありがとうございました。
もう一つ質問なのですが、
int rc = 123 == 123; などのようにした場合、
rc == 1 が真なのはどの環境でも同じですよね?
718デフォルトの名無しさん:2005/09/12(月) 17:39:49
>>716
ひょっとしてそれはギャグでやってるのか!?
関数テーブルについて自分で何も調べないで質問してるとしか思えない!
719デフォルトの名無しさん:2005/09/12(月) 17:40:54
>>717
同じではあるけど、括弧つけといた方が読みやすい。
720デフォルトの名無しさん:2005/09/12(月) 17:50:24
>>719
ありがとうございました。
721デフォルトの名無しさん:2005/09/12(月) 18:07:03
>>716
配列cは関数ポインタの関数でなければならない。
関数ポインタの書き方をもう一度良く調べろ。
722721:2005/09/12(月) 18:08:01
ミスった
×関数ポインタの関数
○関数ポインタの配列
723デフォルトの名無しさん:2005/09/12(月) 18:15:31
int (*manko[])(int) = {unko,tinko};
724デフォルトの名無しさん:2005/09/12(月) 18:45:43
>>721
別にintでも大丈夫だよ
呼び出すときに関数のポインタへキャストすれば
ただしintがポインタを表現できる幅を満たしてないとだめだけど
725デフォルトの名無しさん:2005/09/12(月) 18:48:49
あふぉ
726デフォルトの名無しさん:2005/09/12(月) 19:23:02
せめてvoid* にしとけよ。
727デフォルトの名無しさん:2005/09/12(月) 19:56:40
汎用パラメータとして int に何でもかんでも渡すということはするね。
728デフォルトの名無しさん:2005/09/12(月) 19:57:52
>>727
MS-DOSや64bitマシンでは通用しない技
729デフォルトの名無しさん:2005/09/12(月) 20:04:43
>>723 分かりました、unko と tinko がピンポイントで manko に入っているんですね!
730デフォルトの名無しさん:2005/09/12(月) 20:38:19
int unko(int a){ return a; }
short tinko(int a){ return (short)a; }


int main()
{
 int (*manko[])(int) = {unko,tinko};
 
 …
}


In function main:
 warning : initialization from incompatible pointer type


先生!何故かtinkoがshortで定義されています!
731デフォルトの名無しさん:2005/09/12(月) 20:38:27
>>728
・MS-DOS
 near ポインタになら使えるんじゃ?
 far ポインタも間接的になら渡せなくもないが、
 long にした方がスマートか?

・64ビット機
 32ビット互換モードで動いてたら問題ない。
 あと、int が 64 ビットなら使える(普通は 32 ビットみたいだが)。
 これも long にすればいいか。

というか、普通は typedef だな。
LPARAM とか代表的な利用例。
732デフォルトの名無しさん:2005/09/12(月) 20:56:06
LPARAMとか代表的なアンチパターン
733デフォルトの名無しさん:2005/09/12(月) 21:21:58
win32apiのキチガイじみたtypedef・・・
734デフォルトの名無しさん:2005/09/12(月) 21:33:31
むしろ#defineの方がちょっとおかしいと思う
735デフォルトの名無しさん:2005/09/12(月) 21:39:41
このスレとしてはintptr_tやuintptr_tだろ。
736デフォルトの名無しさん:2005/09/12(月) 21:57:48
#define tinko "houkei"
737デフォルトの名無しさん:2005/09/12(月) 21:58:19
#define ore "yousei"
738デフォルトの名無しさん:2005/09/12(月) 22:00:01
Windows は C 言語のためのものじゃないし。
739デフォルトの名無しさん:2005/09/12(月) 22:31:36
元々Pascalで書かれてたしな。
740デフォルトの名無しさん:2005/09/12(月) 23:00:10
>>739
は?それMacOSとかの話じゃなくて?
741デフォルトの名無しさん:2005/09/12(月) 23:00:57
>>739
ホント?スレ違いなんで誘導かソースキボン
742デフォルトの名無しさん:2005/09/12(月) 23:09:20
739=16bitのstdcallが無い時代に呼び出し形式がpascalだったのを勘違いしてる厨
743デフォルトの名無しさん:2005/09/13(火) 00:49:46
Mac は昔 Pascal だったよな。確か。
744デフォルトの名無しさん:2005/09/13(火) 01:41:29
C言語厨にとっては、Pascalは敵だろ?
確か教祖様が死ぬほど嫌ってたはずだ。
C言語より論理的で美しいから・・・
745デフォルトの名無しさん:2005/09/13(火) 01:45:45
Pascalって教育用にしか使われない言語なんでしょ?
746デフォルトの名無しさん:2005/09/13(火) 01:49:42
最近じゃ、その地位すらなくなりつつあるがな
747デフォルトの名無しさん:2005/09/13(火) 01:58:07
それでも愛用の2chブラウザはDelphi製
748デフォルトの名無しさん:2005/09/13(火) 02:03:11
大学でPascal、独学でCやってるが、Pascalなんて糞
749デフォルトの名無しさん:2005/09/13(火) 03:41:22
あのな…もうそろそろ、どの言語が一番か、なんていうのから卒業しろよ。
PascalもCも細部は違うにしろ、似たような言語だろ。
文法レベルでは大した違いはない。
同じアルゴリズムを書くにしてもそれほど大きな違いはないし、
違いがあるとすればソフトウェア工学的な見地からだろう。
750デフォルトの名無しさん:2005/09/13(火) 04:30:48
>>749
んー、なんていうか、俺にはそういうお前が一番そういう、どの言語が一番かって
いうことにこだわっているように見えるんだよね。

(10代しゃべり場風に)
751デフォルトの名無しさん:2005/09/13(火) 09:08:38
真剣しゃべり場って、議題を定義しないで議論するから答えなんざ
出るわけないんだよな。
前見てびびったのが、「社会で勝ち組みになる事は大切か?」だった
んだけど、「勝ち組み」の定義が為されてないのに、いい歳ぶっこいた
高校生が真面目に話してたこと。おまえらアホかと。
勝ち組み=金を稼ぐこと、勝ち組み=権力を得ること、とでも定義すれ
ば、ゲイツ、ブッシュって答えすぐ出るのにね。
そこをNHKに突っ込まないでモルモットのように話してる厨房は一回
死になさいってこった。
752デフォルトの名無しさん:2005/09/13(火) 09:30:10
このスレでそんな事語ってるお前がアホ
753デフォルトの名無しさん:2005/09/13(火) 12:18:43
ここにいる奴らって大体Cマンセーだろ

俺もだけど
754デフォルトの名無しさん:2005/09/13(火) 13:09:21
違うよ
755デフォルトの名無しさん:2005/09/13(火) 14:03:13
お前はその大体の内に入ってないんだろw
756デフォルトの名無しさん:2005/09/13(火) 14:58:36
マンセーというか、プログラマとしての教養の一つだろ > C
C信者とかっているのか?
757デフォルトの名無しさん:2005/09/13(火) 15:07:59
オブジェクト指向に挫折した人とか
デバドラ/組み込み系でC言語しか使ってない人とか

・・・違うか。
758デフォルトの名無しさん:2005/09/13(火) 15:44:00
http://cruel.org/freeware/hacker.html

もしコンピュータ言語をなにも知らないなら、まず Python から始めることをおすすめします。
設計がきれいだし、ドキュメントもしっかりしているし、初心者にもそこそことっつきやすくできています。

Java もプログラミングを学ぶにはよい言語です。 Python よりはむずかしいですが、できるコードは Python より高速です。
二番目の言語としてはとてもすぐれていると思います

本気でプログラミングをするなら、C を勉強するしかありません。これは Unix の中核となる言語です。
C++ は C と密接な関係にあります。片方を知っていれば、もう片方を学ぶのはそんなにむずかしくありません。
が、どっちも真っ先に勉強しようとするのには向いた代物ではありません。
759デフォルトの名無しさん:2005/09/13(火) 16:06:33
嘘こけ
760デフォルトの名無しさん:2005/09/13(火) 16:20:26
ツッコミどころが多すぎて、ツッコむ気も失せるな。
761デフォルトの名無しさん:2005/09/13(火) 16:41:46
所詮、高級アセンブラだからな...俺もCは初心者には難しいと思う。
762デフォルトの名無しさん:2005/09/13(火) 16:48:03
Cから始めるとC以外全否定厨になっちゃう良い見本
763デフォルトの名無しさん:2005/09/13(火) 16:55:19
卒論で全文検索システムをつくろうとおもっているんですが、参考資料が足りません。。
エーホ・コラシックや特徴ベクトル法のC、C++によるソースがのってる本、ホームページなど、参考になりそうな資料あったら
おしえてくださいm(−−)m 少しスレとずれてるかも(・・;)
764デフォルトの名無しさん:2005/09/13(火) 17:03:26
765デフォルトの名無しさん:2005/09/13(火) 17:12:25
>758
最近またCが見直されてますよね?
本屋ではJavaとCが本棚を圧倒しています。
(Java > C だが…また、コンピュータ言語の棚自体は
エクセルやワードなどに圧倒されてはいるが…)

他はVB、C++、C#がちょろちょろ、Ruby、Perl、Shell
が「ほんの」少しってところでしょうか?
大都市「近郊の」本屋では、の話ですが…
(姶良郡?…)
766デフォルトの名無しさん:2005/09/13(火) 17:14:18
いい加減言語の比較・勧誘はウザいんだが。
767デフォルトの名無しさん:2005/09/13(火) 17:18:03
プロが使ってる言語だから入門者も覚えろ、なんて乱暴な理屈だ
768デフォルトの名無しさん:2005/09/13(火) 17:29:14
C++はバイナリでかいから嫌
769デフォルトの名無しさん:2005/09/13(火) 17:30:44
実装依存
770デフォルトの名無しさん:2005/09/13(火) 17:33:58
STLつかうと一気に実行ファイルサイズが10倍に?!
771デフォルトの名無しさん:2005/09/13(火) 17:36:16
プログラミングより日本語とExcel
マジおすすめ
772デフォルトの名無しさん:2005/09/13(火) 18:21:59
VBA ということか?
773デフォルトの名無しさん:2005/09/13(火) 18:33:43
まぁたしかに一つの選択肢ではあるんだよな。
某マンガ誌のイラストパズル解きたさにVBAで組んだ香具師もいることだし。
尤も、形から入りたい日本人にとっては「プログラムしている」気分がしなくてだめらしいが。
774デフォルトの名無しさん:2005/09/13(火) 18:44:13
スクリプトが流行らない理由はそこか
アメリカはトップダウンだから手段より目的重視だしな
日本人は目的はともかく手段を持ちたがる

ここで一句
  プログラム 覚える頃には ニートかな
775デフォルトの名無しさん:2005/09/13(火) 18:46:18
C言語の話をやれや
776デフォルトの名無しさん:2005/09/13(火) 18:47:18
断る。
777デフォルトの名無しさん:2005/09/13(火) 18:54:18
ならば氏ね
778デフォルトの名無しさん:2005/09/13(火) 19:08:56
切腹!
779デフォルトの名無しさん:2005/09/13(火) 19:25:50
そこでビットシフトの登場ですよ。
780デフォルトの名無しさん:2005/09/13(火) 20:07:32
ビットシフトはもう秋田
781デフォルトの名無しさん:2005/09/13(火) 20:32:49
ならば趣向を変えてビットマスクで。
782デフォルトの名無しさん:2005/09/13(火) 20:35:56
まだ山形かと思ってたが
783デフォルトの名無しさん:2005/09/13(火) 21:21:39
ちょっと質問させてください
fopenをr+で開いたときに
<TABLE WIDTH=9>  を  <TABLE WIDTH=90>  に書き換えたとしよう
すると一文字多くなるので、次の行の最初の1文字が上書きされて消えてしまいます
文字の上に上書きじゃなくインサートさせたいときはどうすればよかか?
784783:2005/09/13(火) 21:24:16
わかり易く書くとこんな感じです

(書き換え前)
<TABLE WIDTH=9>\n
<TD>\n


(書き換え後)
<TABLE WIDTH=90>\n
TD>\n
785デフォルトの名無しさん:2005/09/13(火) 21:27:48
C言語って、文法が小汚い。特に宣言とか・・・
よくこんなのが普及したものだ・・・
786デフォルトの名無しさん:2005/09/13(火) 21:28:32 BE:149769656-##
>>783
ファイルは上書きしかできないよ。
787デフォルトの名無しさん:2005/09/13(火) 21:38:45
>>786
とても正しい答え方ですね。感服しました
788デフォルトの名無しさん:2005/09/13(火) 22:29:03
質問です。

#include <stdio.h>

int main(int argc, char **argv)
{
printf("%p\n", *argv);
printf("%p\n", argv);
printf("%p\n", &argv[0]);
return 0;
}

以上のプログラムを実行したときに最初と後二つのprintfの結果が違うのはなぜでしょうか?
789デフォルトの名無しさん:2005/09/13(火) 22:32:38
>>788
*argvは1つ間接参照している。argv[0]と同じ。
argvと&argv[0]は同じことで、間接参照を全くしていない。
790デフォルトの名無しさん:2005/09/13(火) 22:32:44
*argvはargv[0]といっしょって言えばわかるかなぁ・・・。
791デフォルトの名無しさん:2005/09/13(火) 22:43:34
>>783
9 以降のファイルの内容を全部メモリに読み込んで、
0 以降を全部書き込みなおすか、
別ファイルに 0 込みで書き込んでリネーム。
後者を勧める。
792デフォルトの名無しさん:2005/09/13(火) 22:48:53
>>789-790
printf("%p\n", *argv)はポインタargvに代入されている値(アドレス値)を出力しているということでしょうか?
793デフォルトの名無しさん:2005/09/13(火) 22:59:56
>>792
その文章は正しいが、お前が理解しているようには思えない。
ついでにargvはchar **だからprintf("%s", *argv);は有効。
794デフォルトの名無しさん:2005/09/13(火) 23:01:41
何でそう思うんだろ
*argvって書いてあるんだから *argv に代入されている値に決まってるじゃん
795デフォルトの名無しさん:2005/09/13(火) 23:29:54
すいません、最近C言語始めたのでかなり初心者な質問をします。

2つの整数値(整数Aと整数B)を読み込んで、前者の値が後者の何%であるかを表示する
というプログラムを作成していました。
しかし、どうやっても答えには整数Aの値が出てきてしまいます。
以下が作成したプログラムです。

#include<stdio.h>

int main(void)

{
int na, nb;

puts("二つの整数を入力してください。");

printf("整数A:"); scanf("%d" , &na);
printf("整数B:");   scanf("%d" , &nb);

printf("Aの値はBの値の%dです。\n", na % nb);

return (0);

}

本当に分からないので、どなたかよろしくお願いします。
796デフォルトの名無しさん:2005/09/13(火) 23:32:36
×na % nb
○100*na/nb
797デフォルトの名無しさん:2005/09/13(火) 23:34:22
>>796
あぁっ!本当だ!!
こんなくだらない質問に答えてくれてありがとうございましたm(_ _)m
助かりました。
798デフォルトの名無しさん:2005/09/13(火) 23:39:27
わかってるとは思うけど、演算子の%は剰余算(余りの計算)な。
799デフォルトの名無しさん:2005/09/13(火) 23:50:02
>>793
後半は参照されたポインタの持つアドレス値を先頭とする文字列が出てくるということですね。
>>794
理解不足のためくだらない質問をしてすいません。

もうひとつ質問させてください。
>>792のソースをコンパイルしたプログラムをa.exeとして、
コマンドラインで
>a.exe b c
と実行したとき、"a.exe","b","c"はそれぞれ文字列としてメモリのどこかの配置されるわけですが、
このとき上の3つの文字列の先頭文字のアドレスは、あるchar型ポインタの配列に代入されると説明されていました。
この配列名は何なんでしょうか?
800デフォルトの名無しさん:2005/09/13(火) 23:57:04
>>799
argv
801デフォルトの名無しさん:2005/09/14(水) 00:05:20
>>800
argvはchar型ポインタへのポインタとして宣言されていたのに、
なぜargvが配列名としてつかえるんでしょうか?
802デフォルトの名無しさん:2005/09/14(水) 00:06:17
*argv[]
803デフォルトの名無しさん:2005/09/14(水) 00:09:28
*(argv+1) == argv[1]
804デフォルトの名無しさん:2005/09/14(水) 00:09:39
<アドレス(16進)> <そのアドレスに対応する変数> = <その変数に入ってる値>

0022ef24 argv = 0x611576b0
 |
 └→ 611576b0 argv[0] = 0x611576f8 ――┐
     611576b4 argv[1] = 0x61157710 ―┐|
     611576b8 argv[2] = 0x61157728 ┐||
                          |||
                          ||└→ 611576f8 argv[0][0] = 'a'
                          ||    611576f9 argv[0][1] = '.'
                          ||    611576fa argv[0][2] = 'e'
                          ||    611576fb argv[0][3] = 'x'
                          ||    611576fc argv[0][4] = 'e'
                          ||    611576fd argv[0][5] = '\0'
                          ||
                          |└―→ 61157710 argv[1][0] = 'b'
                          |      61157710 argv[1][1] = '\0'
                          |
                          └――→ 61157728 argv[2][0] = 'c'
                                 61157728 argv[2][1] = '\0'
805デフォルトの名無しさん:2005/09/14(水) 00:13:03
乙!>804
806デフォルトの名無しさん:2005/09/14(水) 00:16:08
アドレスの具体的な値は環境によって変化するので注意。
807デフォルトの名無しさん:2005/09/14(水) 00:42:13
>>802->>803
の2式で何とかわかってきました。

>>804
>>806
図式化までしてくださって、ありがとうございます。
くどいようですが、
a.exe a b
と実行された時点で、a.exe、a、bにがメモリに配置され、
その先頭の文字のアドレス('a'、'b'、'c'のアドレス)が
argv[0]、argv[1]、argv[2]に代入されるということでよろしいでしょうか?
808デフォルトの名無しさん:2005/09/14(水) 00:45:30
べつにargvやargcじゃなくてもいいけどな

int main( int a, char *b[])
とかでもOK
809デフォルトの名無しさん:2005/09/14(水) 00:49:04
>>807
そういうこと。
810デフォルトの名無しさん:2005/09/14(水) 01:02:09
>>808-809
夜遅くまでお付き合いくださってありがとうございました。
811デフォルトの名無しさん:2005/09/14(水) 11:39:30
STLスレに投げたんだけど、レスがつかなかったんでマルチなんだけど
VC6の bitset ってバグ有り?

bitset<32> bsVal(0xFFFFFFFF);

cout << bsVal[0];    // 結果:12FEC4
cout << bsVal.test(0); // 結果:1

Borland C++ 5.5.1 では、問題なし
812デフォルトの名無しさん:2005/09/14(水) 11:59:22
>>811
>>254>>263>>284>>435>>678

こんなもんかな。
813デフォルトの名無しさん:2005/09/14(水) 12:31:03
正直ポインタは便利な配列としてしか理解してない
814デフォルトの名無しさん:2005/09/14(水) 12:37:11
恐ろしい子!
815デフォルトの名無しさん:2005/09/14(水) 15:09:15
>>807
> と実行された時点で、a.exe、a、bにがメモリに配置され、
> その先頭の文字のアドレス('a'、'b'、'c'のアドレス)が
> argv[0]、argv[1]、argv[2]に代入されるということでよろしいでしょうか?
うむ、そこら辺の処理はスタートアップルーチンがやってくれる。
816初心者:2005/09/14(水) 17:48:17
Compatible
って読むときどこで区切ればいいんですか?
教えてください。
817デフォルトの名無しさん:2005/09/14(水) 17:51:46
>>816
くぎらない
818デフォルトの名無しさん:2005/09/14(水) 18:02:28
アホか。辞書見ろ。
819デフォルトの名無しさん:2005/09/14(水) 18:03:19
注意) >>818>>816 に対するレス
820C勉強中:2005/09/14(水) 18:11:16
#include <stdio.h>

void ymd( int *y, int *m, int *d);

main ( ) {
int y, m, d;
printf("生年月日は?");
ymd(&y ,&m ,&d );

return 0;
}

void ymd( int *y, int *m, int *d) {
scanf( "%d", y);
scanf( "%d", m);
scanf("%d", d);
printf( "あなたの生まれた年月日は>%d %d %d",*y, *m, *d );
}
821C勉強中:2005/09/14(水) 18:12:07
↑このプログラムがよくわかりません。ここでつかわれてるポインタの意味は
どういうものなのでしょうか?詳しい方おしえてください
おねがいします。
822 ◆i6G.jsz.NY :2005/09/14(水) 18:16:04
>>821
ymbで変更されたら、mainでもその変更された値を使いたいから
823デフォルトの名無しさん:2005/09/14(水) 18:31:44
変数の型の制約が厳しい言語とかいちいちコンパイルが
必要な言語って気軽にプログラム作れないからつまんない。
824 ◆i6G.jsz.NY :2005/09/14(水) 18:32:41
で?
825デフォルトの名無しさん:2005/09/14(水) 18:34:33
>>823
簡単にコンパイルが通るようなコンパイラは恐くて使えない
826デフォルトの名無しさん:2005/09/14(水) 18:49:39
>>820
#include <stdio.h>

void ymd( int *y, int *m, int *d);

main ( ) {
int y, m, d;
printf("生年月日は?");
ymd(&y ,&m ,&d );
printf( "あなたの生まれた年月日は>%d %d %d",y, m, d );

return 0;
}

void ymd( int *y, int *m, int *d) {
scanf( "%d", y);
scanf( "%d", m);
scanf("%d", d);
}

こうなら多少意味があると思うけど...これは意味が無いような気がする
827デフォルトの名無しさん:2005/09/14(水) 18:51:54
#include <stdio.h>

#define MAX_ARRAY (10000000)

char array[MAX_ARRAY];


int main( void )
{
unsigned long long n, i;

/* 配列を初期化する */
for( i = 0; i < MAX_ARRAY; i++ )
array[i] = 0;

/* 配列をふるいにかける */
for( n = 2; n <= MAX_ARRAY; n++ ) {
if( array[n] == 0 ) {
for( i = 2; i * n < MAX_ARRAY; i++ )
array[i * n] = 1;
}
}

/* ふるいで残った数は素数である */
for( n = 2; n < MAX_ARRAY; n++ ) {
if( array[n] == 0 )
printf( "%qu\n", n );
}
}

エラトステネスのふるいのプログラムなんですけどアルゴリズムってどのような感じになるでしょうか?
828デフォルトの名無しさん:2005/09/14(水) 19:01:56
エラトステネスのふるいでググれ。
829デフォルトの名無しさん:2005/09/14(水) 19:12:18
9月から学校でC言語プログラミングの授業が
始まったのですが難しくてついていけません。
基礎を教えてもらえないでしょうか?
830デフォルトの名無しさん:2005/09/14(水) 19:15:11
>>829
>>1
>まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
                                      ~~~~~
ここは質問スレであって教室スレでも輪講スレでもない。
831デフォルトの名無しさん:2005/09/14(水) 19:22:54
輪姦スレでもない。
832デフォルトの名無しさん:2005/09/14(水) 19:44:46
何か HP でも見つけてみれ。
833デフォルトの名無しさん:2005/09/14(水) 19:54:48
>>831
ウホッ
834デフォルトの名無しさん:2005/09/14(水) 20:55:03
>>833
なんでウホッなんだよ。ここはヒギィッだろ。
835デフォルトの名無しさん:2005/09/14(水) 21:09:59
GETRC(XSetForeground(dsp, gc, fg)); 
CHECK(case BadAlloc: case BadWindow:, "cannot set forecolor."); 
というのがデバッグ時は 
rc = XSetForeground(dsp, gc, fg); 
switch (rc) { 
case BadAlloc: case BadWindow: 
fprintf(stderr, "%s(%d):%s\n", __FILE__, __LINE__, "cannot set forecolor."); 
} /* fprintf のあとに goto つきのやつもあり */ 
リリース時は 
XSetForeground(dsp, gc, fg); 
とだけ展開されるようにして 
GETRC(fd != -1 && close(fd) == -1); 
CHECK(case 1:, "cannot close file."); 
とか延々書いてるようなスタイルをあみだしたんですが、これってうざいですか?
836デフォルトの名無しさん:2005/09/14(水) 21:42:47
何で2つのマクロに分けてるの?
837デフォルトの名無しさん:2005/09/14(水) 21:45:30
ああ、分かった分かった。ごめん。俺が浅はかだった。
別にいいんじゃないかと思うけど、case hoge: はちょっと美しくないかな。
配列を渡すようにして、for で判定するとか。
838デフォルトの名無しさん:2005/09/14(水) 22:07:53
>>830
すいません。
自分でHP探して勉強します・・・
839デフォルトの名無しさん:2005/09/14(水) 22:47:22
>>811
あっちでもスレ違いだっつっただろうが。間抜け。
840デフォルトの名無しさん:2005/09/14(水) 22:51:33
>>835
代入する変数XXごとに、GETXX マクロを作る必要があるのか?
841デフォルトの名無しさん:2005/09/14(水) 22:53:12
なあ、なあ。
上手なデバッグプリント文とかデバッグマクロとかおせーて。
842デフォルトの名無しさん:2005/09/14(水) 23:18:29
>>841
gdb
843デフォルトの名無しさん:2005/09/14(水) 23:28:38
>>842
グッジョブ?
844デフォルトの名無しさん:2005/09/15(木) 00:00:56
>>843
gbx
845デフォルトの名無しさん:2005/09/15(木) 00:31:20
#define HOGE 5

char hoge[HOGE];


hogeと&hoge[0]が等しいのはわかるが

memset( &hoge, 0, sizeof(hoge) );

と書いた場合の挙動(hogeの中身)はどうなります?

コンパイラ gcc3.2くらいかな

846デフォルトの名無しさん:2005/09/15(木) 00:35:07
>>845
{0,0,0,0,0}
847デフォルトの名無しさん:2005/09/15(木) 00:35:26
&hoge 番地のメモリデータを破壊するか、アクセス違反で止まる。
848デフォルトの名無しさん:2005/09/15(木) 00:40:03
>>847
アホか。
849デフォルトの名無しさん:2005/09/15(木) 00:43:28
>>845
アドレスは等しいんだけど、
その2つは厳密には等しくない。
hoge は配列だけど、&hoge[0] は1要素を指すポインタになる。
即ち、hoge の型は char[HOGE] であり、&hoge[0] の型は char* である。
この違いは殆どのところで効いてこないけど、
影響のある場合が2つある。

1つは、sizeof の挙動。
sizeof hoge は配列全体のサイズになり、
sizeof &hoge[0] はポインタのサイズになる。

もう1つは、& の挙動。
&hoge は配列へのポインタ(型は char(*)[HOGE])になり、
&&hoge[0] は右辺値のアドレスを取ろうとしてるのでコンパイルエラーになる。
&hoge と hoge は、型が若干違うだけで、メモリ上の位置としては同じ場所を指す。

従って、memser( &hoge, 0, sizeof(hoge) ); は望むとおりの挙動を示す。
850デフォルトの名無しさん:2005/09/15(木) 00:49:18
細かいこと言うと、配列へのポインタ変数に代入できるかどうかとか、
他にも影響ある点があるがキニシナイ!
今回の話では、この2点が分かってれば十分だ。
851デフォルトの名無しさん:2005/09/15(木) 01:10:33
>841
前スレ655をちょこっと改造。
↓みたいなのは良く使ってる。
-- hoge.h ---------------------------
#define _DEBUG_FLAG

#ifdef _DEBUG_FLAG
extern void _DebugLog( const char *format, ...);
 #define DBG_LOG(...) _DebugLog(__VA_ARGS__)
#else
 #define DBG_LOG(...) ((void)0)
#endif //_DEBUG_FLAG
-- hoge.c ---------------------------
#include "hoge.h"
#ifdef _DEBUG_FLAG
 #include <stdio.h>
 #include <stdarg.h>
 void _DebugLog( const char *format, ...)
 {
  va_list args;
  va_start(args, format);
  vfprintf(stderr, format, args);
  va_end(args);
 }
#endif //_DEBUG_FLAG
852デフォルトの名無しさん:2005/09/15(木) 01:34:32
#ifdef NDEBUG
#define DEBUG if(0)
#define RELEASE if(1)
#else
#define DEBUG if(1)
#define RELEASE if(0)
#endif

DEBUG {
 int i;
 for(i = 0; i < hoge; i++) {
  printf("%d : %d\n", i, foo[i]);
 }
}

とか。
853デフォルトの名無しさん:2005/09/15(木) 03:29:38
C言語でもwindowsは作れますか?
854デフォルトの名無しさん:2005/09/15(木) 03:31:48
C言語で作られています
855デフォルトの名無しさん:2005/09/15(木) 03:33:37
わろたwwwwwwwwwwwww
856デフォルトの名無しさん:2005/09/15(木) 04:38:56
すみません質問です。
おにぎりとおむすびの違いって何ですか?
857デフォルトの名無しさん:2005/09/15(木) 04:45:39
調子に乗るなよ小僧
858デフォルトの名無しさん:2005/09/15(木) 04:50:15
おにぎりは三角、おむすびは俵
859デフォルトの名無しさん:2005/09/15(木) 04:52:31
俵は関西だけ
860デフォルトの名無しさん:2005/09/15(木) 04:54:13
おにぎりは実体の型、おむすびはおにぎりのtypedef
861デフォルトの名無しさん:2005/09/15(木) 04:55:49
おにぎりは握り飯のtypedef
862デフォルトの名無しさん:2005/09/15(木) 06:20:12
昔、小学生のころ、そのときに持ってた辞書を引いたら
おにぎり → おむすび
おむすび → おにぎり
て無限ループになってたな
863デフォルトの名無しさん:2005/09/15(木) 06:25:52
大人って汚いよな
864デフォルトの名無しさん:2005/09/15(木) 06:38:17
辞書によるとどちらも握り飯の意。
おにぎりが女性語とのこと。
865デフォルトの名無しさん:2005/09/15(木) 06:41:23
ふざけんな!
866デフォルトの名無しさん:2005/09/15(木) 06:44:48
>>841
if(TraceLevel() >= TRACE_LEVEL_ERROR) TraceWriteLine("エラーが出たぞ");
みたいな感じにしてTraceLevel()の値はINIファイルから呼び出して
同一バイナリでログ吐いたり吐かなかったりできるようにしてる。
JavaのLog4jとか.NETのTraceあたりを参考にしてみたら。
867デフォルトの名無しさん:2005/09/15(木) 09:34:17
>>839
まぁ、どこのスレがスレ違いじゃないか、間抜けには誘導すらできないだろうけどな
868デフォルトの名無しさん:2005/09/15(木) 09:37:57
自分の使ってる開発環境名で検索もできない人かね?
869デフォルトの名無しさん:2005/09/15(木) 11:55:52
質問なのですが。
int a[34][4] = {
{ 1,1,1,1},
{ 2,2,2,2},
//以下略
     };
初期化子が多すぎるとエラーが出るのですが,こういう場合どう直せばよいでしょうか?
870デフォルトの名無しさん:2005/09/15(木) 11:57:30
ファイルから読むようにすれば?
871デフォルトの名無しさん:2005/09/15(木) 11:59:05
数が合ってないんじゃない?
とりあえずintの前にstaticつけてみれば
872デフォルトの名無しさん:2005/09/15(木) 12:02:13
つか、
>エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。
873デフォルトの名無しさん:2005/09/15(木) 12:02:29
>>870さん
素早いレス、ありがとうございます
その案でちょっとやってみたいと思います。
874デフォルトの名無しさん:2005/09/15(木) 12:22:25
>>873
その案は意味のある解決策ではない。
ちゃんとエラーメッセージを理解できないかぎり何も無駄。
なので >>1 を理解して、勉強しなおすか、初心者スレにでも逝け。
(正確にエラーメッセージを引用する知恵ぐらいつければいいのに。
C言語以前にプログラムの考え方も不足してるのだろうけど…)
(本当に「初期化子が多すぎる」エラーなら、初期化子を適切な数にするか、
配列を必要な数の初期化子を格納できる大きさにするかだろうけど)
>>870,871
あほが無駄なレスつけるなよ…
875デフォルトの名無しさん:2005/09/15(木) 12:40:05
サイズもデータもそのままで、
ファイルから読み込むようにすると、
バッファオーバーランして危険だね。
876デフォルトの名無しさん:2005/09/15(木) 13:00:33
>>869
int a[100][4] = {
{ 1,1,1,1},
{ 2,2,2,2},
//以下略
     };

これに直して通ったら、[34]があってない
877デフォルトの名無しさん:2005/09/15(木) 13:04:02
>>869
int a[][4] = {
{ 1,1,1,1},
{ 2,2,2,2},
//以下略
     };

[34]は、省略できる
878デフォルトの名無しさん:2005/09/15(木) 13:05:00
>>877
俺もそれ書こうと思ったんだが、
34 という数値に大きな意味があれば、
34 と書いておいた方が
サイズチェックしてくれるのでいいと思った。
879デフォルトの名無しさん:2005/09/15(木) 13:06:56
省略せずに書けば解決するのに
880デフォルトの名無しさん:2005/09/15(木) 13:12:25
少なくとも>>874を読んで解決するとは思えないのだが
881デフォルトの名無しさん:2005/09/15(木) 13:17:19
charのstrをchar*のstr_pに入れたいのですが = では駄目なようです
どうすればいいのでしょうか?

char str;
str = 'a';
char* str_p;
str_p = str;//×
882デフォルトの名無しさん:2005/09/15(木) 13:19:45
>>881
頭悪い?
883デフォルトの名無しさん:2005/09/15(木) 13:24:34
>>881
何をしたいのか知らんが、初心者質問スレに行くか日本語の勉強をしてくれ。
884デフォルトの名無しさん:2005/09/15(木) 13:25:56
>>881
とりあえず、入門書のポインタを嫁
885デフォルトの名無しさん:2005/09/15(木) 13:30:52
&str
886デフォルトの名無しさん:2005/09/15(木) 13:32:19
これでいいんじゃね

string str;
str = 'a';
char* str_p;
str_p = &str;
887デフォルトの名無しさん:2005/09/15(木) 13:35:24
入れたところで '\0' 終端がないから、文字列にはならんな。
888デフォルトの名無しさん:2005/09/15(木) 13:37:46
ありがとうございます。>>885で解決することができました
まだポインタの理解が足りていないのでもう少し勉強してみます
889デフォルトの名無しさん:2005/09/15(木) 14:15:52
>>888
全然解決にならないんだが
890デフォルトの名無しさん:2005/09/15(木) 14:53:36
文字列にするんでなければ解決するんだろうけどな。
891デフォルトの名無しさん:2005/09/15(木) 15:08:06
だから、質問の中の問題点さえ気がつかない連中が、
もっともらしく表面的な回答だけするなと。
喋りたきゃ初心者スレでしたり顔が答えて叩かれてろと。
892デフォルトの名無しさん:2005/09/15(木) 15:10:41
答えの精度は質問の精度に依存する
893デフォルトの名無しさん:2005/09/15(木) 15:15:02
表面的な回答をしてる人は、
単なる嫌がらせのようなことをしてるだけ。
たまに天然も居るのかもしれんが。
894デフォルトの名無しさん:2005/09/15(木) 15:21:48
表面的な質問には表面的な回答しかできないと思われ
895デフォルトの名無しさん:2005/09/15(木) 15:24:03
皮肉にしか見えないが。
891は随分素直なんだな。
896デフォルトの名無しさん:2005/09/15(木) 15:31:30
だから、そういう天然まがいのつもりのマヌケは本当にアホなんだから
よそで遊んでろ、と言われてるんだろうに、ずいぶん天然なんだな。
897デフォルトの名無しさん:2005/09/15(木) 15:32:33
言われてるんだろうに、じゃなく、君が言ってるんでしょw
898デフォルトの名無しさん:2005/09/15(木) 15:34:19
初心者スレもネタスレじゃないと思うんだが、そこに誘導してどうする。
899デフォルトの名無しさん:2005/09/15(木) 15:35:13
推理小説かなんかだと思って回答しろよ
限られたヒントの中から問題を推測して正解を導くのは
結構面白いぞ
900デフォルトの名無しさん:2005/09/15(木) 15:38:28
まあ、精度の低い質問しても、こうやって遊ばれるだけだっていう教訓だな。
901デフォルトの名無しさん:2005/09/15(木) 16:09:16
で、「表面的」でない回答の例は無いの?
902デフォルトの名無しさん:2005/09/15(木) 16:11:03
どーでもいいよ、そんなこと。
903デフォルトの名無しさん:2005/09/15(木) 16:11:37
>891がすばらしいレスを付けるから黙って待っていなさい。
904デフォルトの名無しさん:2005/09/15(木) 16:15:41
どーでもいいよ、あんなやつ。
VIP ででも遊んでろ。
905デフォルトの名無しさん:2005/09/15(木) 16:35:59
>>904
そんなこと言ってると奴らが巣から出てくるぞ・・・w
906デフォルトの名無しさん:2005/09/15(木) 16:36:11
>>887
文字列にする方法も教えてください
907デフォルトの名無しさん:2005/09/15(木) 16:39:31
char str[] = "a";
908デフォルトの名無しさん:2005/09/15(木) 16:42:02
>>906
お前こんなところで質問してる場合じゃないぞ。
ともかく先に本一冊通して嫁。
909デフォルトの名無しさん:2005/09/15(木) 16:44:33
読むだけじゃダメだな。
色々テストプログラム組んで、仕様を体で理解しないと。
910デフォルトの名無しさん:2005/09/15(木) 16:47:44
仕様が理解できないの?
しょうがないなぁ
911デフォルトの名無しさん:2005/09/15(木) 16:49:01
華麗にスルー
912C勉強中:2005/09/15(木) 17:08:22
#include <stdio.h>

main ( )
{
char *str[ ] = {"hogebaka"};

printf("%s\n",str);
printf("%c", *(str+4));

return 0;
}
913C勉強中:2005/09/15(木) 17:09:16
↑基本的なことですいません。このプログラムを実行したら、文字化けして
しまいました。どこがおかしいんでしょうか?おしえてください。
おねがいします。
914デフォルトの名無しさん:2005/09/15(木) 17:10:17


       ァ  ∧_∧ ァ,、 
      ,、'` ( ´∀`) ,、'` 
       '`  ( ⊃ ⊂)  '` 

915デフォルトの名無しさん:2005/09/15(木) 17:11:47
>>913
char str[ ] = {"hogebaka"}; 
916デフォルトの名無しさん:2005/09/15(木) 17:14:13
917デフォルトの名無しさん:2005/09/15(木) 17:49:23
約1週間前に指摘したのをもう忘れている池沼なのか
それとも、たまたま同じ名前の別人がたまたま同じ質問をしたのか

918デフォルトの名無しさん:2005/09/15(木) 17:54:10
ネタだろw
919デフォルトの名無しさん:2005/09/15(木) 17:54:42
どう思われるでしょうか?
C言語は人間の思考との距離感が
良いんじゃないでしょうかねぇ?

すぐ目的に達しないところというか
一旦マシーンよりに思考を変換しないと
上手なプログラムが作れないところが
魅力だと考えますが。
920デフォルトの名無しさん:2005/09/15(木) 18:10:15
だからアホ、カス、ネタ未満は逝ってしまえと…
http://pc8.2ch.net/test/read.cgi/tech/1123587908/
921デフォルトの名無しさん:2005/09/15(木) 18:24:04
馬鹿の質問をみて不愉快になる人間は、
この手の質問スレは見ないほうがいいぞw
922デフォルトの名無しさん:2005/09/15(木) 18:51:32
char str[] = "HogeBar";
こう書くヤツむかつく。
char str[] = {"HogeBar"};
こう書くべき。
char *str = "HogeBar";
これならいいけどね。
923デフォルトの名無しさん:2005/09/15(木) 18:54:11
>>922
ツッコむ気も失せるわ、この田吾作がァ!
924デフォルトの名無しさん:2005/09/15(木) 19:21:55
このスレ始めてきたC言語初心者なんだが
プログラミング言語C(通称 K&R)
って本はC言語初心者でも大丈夫なのか?
925デフォルトの名無しさん:2005/09/15(木) 19:22:22
禁断のコーディング論争をしようというのか?

while(1) {} // 無限ループをこう書く奴むかつく
for(;;) {}  // これならいいけどね
926デフォルトの名無しさん:2005/09/15(木) 19:25:08
>>925
一人でやってろ。
927デフォルトの名無しさん:2005/09/15(木) 19:26:10
>>924
多分、こっちで聞いた方がいいと思う。

推薦図書/必読書のためのスレッド PART25
ttp://pc8.2ch.net/test/read.cgi/tech/1119115838/
928デフォルトの名無しさん:2005/09/15(木) 19:35:49
読めないことはないけど、例題とかの回答が出ているわけでもないから
ちょっと試そうとしてもさっぱり分からない、というケースは多いだろう。
中身はしっかり書いてあるけど、まったくの初心者に理解を
求めるのはちょっと酷かもしれない。もっと初心者向きのやさしい
本で勉強してCをマスターしてから読み直すと感銘を受けるだろう。
つまりは、そういう本であるということだ。これからCを続けるつもりなら
買っておいても損はないと思うぞ。今は分からなくても読みこなせるような
力が伴って来たらK&Rから多くのことを学べるだろう。
929デフォルトの名無しさん:2005/09/15(木) 19:36:33
別に感銘なぞ受けないな
930デフォルトの名無しさん:2005/09/15(木) 19:40:28
>924
>プログラミング言語C(通称 K&R)
>って本は

良いよね。ホント。
931デフォルトの名無しさん:2005/09/15(木) 19:43:17
>928
>Cを続けるつもりなら

C以外の言語をやる場合でも、だよね?
932デフォルトの名無しさん:2005/09/15(木) 19:49:11
>>929は単なる馬鹿
933デフォルトの名無しさん:2005/09/15(木) 19:59:05
   い
   と
   し
   の
   強
   は
   お
   っ
934デフォルトの名無しさん:2005/09/15(木) 20:06:02
WEBでC言語の問題集ない?
935デフォルトの名無しさん:2005/09/15(木) 20:08:20
J('ー`)し
936デフォルトの名無しさん:2005/09/15(木) 20:09:24
お勉強で感銘とか受けたくないしw
937デフォルトの名無しさん:2005/09/15(木) 20:22:00
なら藻前は何に感銘受けるんだ?w
938デフォルトの名無しさん:2005/09/15(木) 20:39:27
>>928にかんめーっ☆
939デフォルトの名無しさん:2005/09/15(木) 20:39:53
おまんこ
940デフォルトの名無しさん:2005/09/15(木) 20:41:58
>>937
おまえには、わかんめー
941デフォルトの名無しさん:2005/09/15(木) 20:50:02
香ばしくなってまいりました
942デフォルトの名無しさん:2005/09/15(木) 21:48:14


       ァ  ∧_∧ ァ,、  
      ,、'` ( ´∀`) ,、'`  
       '`  ( ⊃ ⊂)  '`  
943デフォルトの名無しさん:2005/09/15(木) 22:19:45
おまいらのやりとり見てて面白い
944デフォルトの名無しさん:2005/09/15(木) 22:54:26
苦しんで覚えるC言語
ttp://homepage3.nifty.com/mmgames/c_guide/index.html

先ほどこのサイトを読み終えました
次のステップに進みたいので、いいサイトを教えて頂けませんか
945デフォルトの名無しさん:2005/09/15(木) 23:26:45
>>944
次の目標を見つける事が次へのステップだ
946デフォルトの名無しさん:2005/09/15(木) 23:55:03
な、なんだってー!?
947デフォルトの名無しさん:2005/09/16(金) 00:14:10
ちょっとしたテキストのコンバートツールを作成しているのですが、
例えば"100%"という文字列を読み込んでそのまま書き込むと
なぜか'%'だけが書き込まれないという問題が発生しています。
'%%'と続けて書くと'%'が1文字書き込まれることが分かったので、
しかたなくその変換も組み込んだのですが、
これはそういう仕様になっているのでしょうか?
読み込みはfgets関数、書き込みはfprintf関数を使用しています。
948デフォルトの名無しさん:2005/09/16(金) 00:14:37
ちんでください
949947:2005/09/16(金) 00:16:03
すいません、書き込みボタンを押した瞬間に気付きましたが、
fprintf( file, str );
としてました・・・。
fprintf( file, "%s", str );
で無事に書き込めました。orz
950デフォルトの名無しさん:2005/09/16(金) 00:24:02
Cって値渡ししかできないから配列とかを引数として渡したいときもアドレスを使ったりするんでしょうか?
951デフォルトの名無しさん:2005/09/16(金) 00:33:38
配列のみの構造体を使えば値渡しできるが、
はっきり言って無駄なので、普通はそんなことしない。
952デフォルトの名無しさん:2005/09/16(金) 00:41:04
大変申し訳ありませんが、上手くぐぐる事ができず、手元にコンパイラと
デバッガが無いので、教えて下さい。

unsigned long と、unsinged long longの変数は、バイト空間では
どのように格納されるのでしょうか。
なお、PCはIntel系CPU、OSはLinuxの場合です。

以上、よろしくお願いします。
953デフォルトの名無しさん:2005/09/16(金) 01:06:24
インテル系CPUは、リトルエンディアン。
最初のバイトは256^0の位
次のバイトは256^1の位
その次のバイトは256^2の位
・・・
ってな具合。
954デフォルトの名無しさん:2005/09/16(金) 01:09:53
>>953
今やっている仕事で、unsigned long longの場合は、バイト順入れ替えを
行わなくてはいけないといわれていたので、何か特別なフォーマットなのかと
思ってしまっていました。なにか他の理由があるのですね。

どうも有難うございます。
955デフォルトの名無しさん:2005/09/16(金) 01:25:05
>今やっている仕事で、unsigned long longの場合は、バイト順入れ替えを
>行わなくてはいけないといわれていたので、何か特別なフォーマットなのかと
>思ってしまっていました。

こういう情報を先に出さないのは質問下手ですよ。
956952:2005/09/16(金) 01:39:11
>955
それは、どうもすいませんでした。
957デフォルトの名無しさん:2005/09/16(金) 05:21:02
単に話の文脈や条件、説明を勘違いしている可能性のほうが大きそうなんだが。
958デフォルトの名無しさん:2005/09/16(金) 06:39:39
>>954
バイト順を入れ換える必要があるということは通信が絡んでいるんじゃないか?
ネットワークとか、とにかく外にバイナリデータを出す場合は何故かビッグ
エンディアンが標準になっている。(ネットワークバイトオーダーとも言う)。
959デフォルトの名無しさん:2005/09/16(金) 07:00:39
簡単なプログラムだと思うんですが、
なかなかいい方法が浮かばないんで、何かいい方法があれば
教えてください。

二次元配列のデータ
dat[i][j]

という200x200くらいのデータ(モノクロ画像データ)があります。
そのデータに対して、i,j面でスムージングをして、new_dat[i][j]
を作りたいのですが、どうするのが簡単で良い方法でしょうか?
簡単にスムージング(もどき)が出来るアルゴリズムをご存知の方が
居られれば教えてください。
960デフォルトの名無しさん
>アルゴリズムをご存知の方が居られれば教えてください
スレタイ嫁