1 :
デフォルトの名無しさん :
2005/08/27(土) 18:54:38
人 ((・e・)) (ヽ ) >) 人 ((・e・)) ( , ) (<
3 :
デフォルトの名無しさん :2005/08/27(土) 19:28:40
C言語で画像や音楽や映像を出すにはどうすればいいですか?
ネタなら面白い事書け
5 :
デフォルトの名無しさん :2005/08/27(土) 19:33:01
白馬 白熊 白兎
>>3 標準では出来ない。環境依存の方法を使うことになる。
では次の方〜
7 :
デフォルトの名無しさん :2005/08/27(土) 19:38:50
main()
{
int _a1;
printf("%d"_a1)
return 0;
}
>>3 とりあえずこれをコンパイルしてみろ。
>>7 コンパイルしましたが実行ファイルができただけでつ
9 :
デフォルトの名無しさん :2005/08/27(土) 19:41:38
>>8 それを実行した結果がお前の人生だ。分かったな。
10 :
デフォルトの名無しさん :2005/08/27(土) 19:57:01
Cを始めたいのですがPCがネット出来る環境にありません 明解C言語と言うのが良いらしいんですが、これにC言語及びコンパイラ等付属しているんですか?
>>10 ふつう、OSにコンパイラがあらかじめ入っている。
12 :
デフォルトの名無しさん :2005/08/27(土) 20:04:55
どこのOSだよ
ふつうのOSですよ
>>10 Linuxインストールすれば開発環境一式そろう。
Fedora Core でも、Debian でも、本の付録で着いてくるからそれでOK。
15 :
デフォルトの名無しさん :2005/08/27(土) 20:13:35
ふつうの初心者はふつうのOSはWindowsだと思っているのがふつうなわけで いやむしろOSってなんですかてきなやつもふつうにいるわけで
それはあなたの思い込みですね
CDから起動できるLinuxなら、インストールしなくても使えるしね。
volatileとasmのコードが解読できません。
その人に、パソコン=Windowsの等式が成り立っている以上 OSって何?でしょうね。
うちの会社新規プロジェクトはVB.NETだから Cしか使えない奴全員解雇だってさ。 もう終わったな、C
終わってんのはオマエの会社の方じゃねえの?w
23 :
ケンカする人嫌いです・・・あ、いや・・・やめてほしいな :2005/08/27(土) 20:42:20
VIPから来てあげたわよ
いまVIPが、世界が認めてない東海って名前を、
日本海に直してもらう作戦を行ってるのは、当然知ってるわよね?
VIPPERの力で、Googleが東海の単独表記を取り下げたのは有名ね。
でも、いまVIPは大きな問題を抱えてる。
ITスキル、特に鯖関係のものが、圧倒的に足りないのよ。
それでなんだけど・・・んちょっと、、、VIPに協力してほしいのよね。
べ、べつにあんただったから頼みに来たわけじゃないわよ!勘違いしないでよね!
でも、あなたの力があれば、日本海を取り戻すのが近くなるのは・・・確かだわ。
もし・・・協力してくれるんなら、このスレに書き込んでほしい。
http://ex11.2ch.net/test/read.cgi/news4vip/1125074145/ ・・・・やっぱり、あなたに協力して・・・ほしいから。
VB.NETってそれ..........
>>21 まあ、言語一つしかできないようなのはクビでいいだろな。
猫のページを参考に BCCでlibファイルを作りたいのですが、"'MYLIB' not found in library"と吐いてしまいます。 一応"MAKE End!!"とは出てるので一連の動作は成功してるようなのですが・・ 使ってるIDEはBCC Developerでプロジェクトの設定はライブラリ(TLIB使用)にチェックが入っています。
30 :
デフォルトの名無しさん :2005/08/27(土) 23:59:04
デバッグをしたいのです。 実行したときに関数の呼出順の履歴みたいなのを出したくて いままでは全部の関数の最初と最後に printf("%s IN\n",__func__); printf("%s OUT\n",__func__); って書いていたんですが、なんかかっこわるいと思うように なりますた。 なんかもっとスマートでクールな方法はないでしょうか。
何だそれ、__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++とか意味あるのか?普通に-で演算しても同じ事じゃないの?
-だと減るじゃん
printf の %f ってどんな時使うんですか?
>>33 プログラマのコーディング効率も上がるし、それに演算速度を上げられる可能性があるから。
>>31 #define ENTER_FUNC printf("%s IN\n", __func__);
#define LEAVE_FUNC printf("%s OUT\n", __func__);
って、いや、デバッガのコールスタックを利用すればいいと思う。
他の高級言語を使ってたが、Cを学習してから毎日Cを手放せなくなった。
__func__ て処理系で定義されているマクロなのかいな。
そうだよ。
そうか、そんなのがあるのか。 どんな処理系で使えるのかな。
正確に言うとマクロじゃなくて識別子。 C99 で正式に C の仕様に導入された。
44 :
デフォルトの名無しさん :2005/08/28(日) 01:53:19
__func__ ってbcc32だとエラーが出て CYGWINだとコンパイルできたけど、表示されなかったぞ
Cygwin の GCC で表示できるが? 何か間違えてないか? もしくは、コンパイラがめっさ古いか。 あと、BCC はできんかもしれんね。
VC++.NETでは円周率は定義されていないのでしょうか?
47 :
デフォルトの名無しさん :2005/08/28(日) 02:53:16
>>45 できた
でもさっきは表示されなかったのは何故だろ
48 :
デフォルトの名無しさん :2005/08/28(日) 03:03:06
今思ったんだけど
>>8 って本当にそれコンパイルできた?
>>46 .NET Frameworkでという意味ならSystem.Math.PIというフィールドがあるが、
このスレである以上managed C++ということも考えにくいから…
「C言語に標準で」、という意味ならば、提供されていない。
4 * atan(1.0)で求めよ。
3.141592653589793 くらい覚えとけよ。
一夜一夜に人見ごろなら・・・
ひとよひとよにひーとーみーごろぉー♪ って歌のアニメがあったな。 子供の頃見てたけど、タイトル忘れた。 結構好きだったんだけどすぐに終わってしまったような記憶が… 不人気だったんだろか。
53 :
デフォルトの名無しさん :2005/08/28(日) 04:26:30
人並みにおごれよ
>>52 こういうのって、英語圏の人達や、その他の言語の人達は、
どうやって記憶してるんだろうか・・・って思う
円周率16桁は、#define PI 3.141592653589793
を繰り返すうちに自然に数字で覚えてしまったが・・・
英語圏の人は授業で電卓つかうよ
フランス語は数を勘定できない言葉ですから国際語として失格している
>>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.
フランスごは数数えるのが大変というけれど 日本語だって負けちゃいないぜ! アラビア数字が輸入されるまではマジで大変だったよ でも日本にも優れた数学者は山ほどいるわけで 言語的に数が数えやすいのと、数学が得意な人種というのは 実は 相関関係が無い
フランス語はホンマに凄い。歴史を感じるが、正直ヤバい。 先ず、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 なのだが。
池澤春菜が姫のコスプレして色々教えてくれたけどすっかり忘れた
65 :
デフォルトの名無しさん :2005/08/28(日) 06:54:36
フランス語も知ってるんだ。 ギリシャ生まれというのは聞いているが......。 と思って調べたら、フランス語会話に生徒役で出てたのな。
67 :
デフォルトの名無しさん :2005/08/28(日) 08:12:53
時々他の高級言語のやつがその言語の話を割り込んでくるのは何でだろうな。 Pascalだったらまだ許容する。
69 :
デフォルトの名無しさん :2005/08/28(日) 10:09:03
Ruby>>>>>>>>>>>>>>>>>>>>>C
池澤春菜ってフランス人だったのか
Perl>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Ruby
そんな歴史の浅い変てこりんな高級言語を支持してどうするのかね
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 を自動で作成するようなコマンドはある のでしょうか?
autoconf/automakeという糞ツールがあるけど手書きした方が16777216倍まし
wildcard 使った汎用 make ファイルを作っておけば、 同じの使いまわして随分いける。 個別設定は別にできるようにしとけばいい。
Makefileってそこそこ汎用的に書くと結構な分量になるんだよな。 提供してる機能がしょぼすぎるんだよ。 (Antは単体でも使えるにしても)Javaに縛られてないMakefile++誰か作れ。
80 :
デフォルトの名無しさん :2005/08/28(日) 11:27:11
>> 77 関数は特にないです。 printf()での”Hello Word "くらいのサンプルです。 >> 78 まずは汎用性のある makeファイルの入手が必要ですね。
>>80 >まずは汎用性のある makeファイルの入手が必要ですね。
自分で作るという選択肢はないのかw
82 :
デフォルトの名無しさん :2005/08/28(日) 11:45:44
>>81 もちろん、オリジナルで作成する選択はあると思います。
make の仕様くらい目を通しといた方がいいよ。
>>55 英語圏じゃないけど、ピーターフランクルは、円周率は約3としか憶えてないって言ってたよ。
日本で「おおよそ3」が非難される、だいぶ前に。
彼の生き方ではソレで良いのでしょう。 昔のやり方はすべての分野を教えて、そこから専門分野を取捨選択する方法。 専門外の使用頻度の低い知識が多数生まれる。 一方、今の頭の悪い教育方針は広く浅くを基本とする。 どの分野を取っても知識不足という頭の悪い状況になっている。
何この糞な流れ
>>80 そうじゃない。
makeには、ソースやディレクトリ指定を楽にするための組み込み関数が用意されている。
widcard や、patsubst といった関数を使てmakefileを書けば、いちいち対象ソース名を記述しなくても、
「あるディレクトリ内のある拡張子のファイル全部」といった指定を一行で記述することができる。
外部ツールに頼る前に、makeのマニュアルや、仕様書をよく読めちゅ−こと。
×widcard ○wildcard
makeスレ逝け
>>85 数学ではπとしか使わないから、具体的な数値なんてどうでもいいのさ。
物理だと概算でいいから、またいい加減でいいんだが。
プログラムだと16桁は欲しい。
>>90 π≒3 → 円は、ほぼ6角形として扱われる
float型しか使わなければ6桁でおk
2,30桁くらいすぐ憶えられるだろ。 産医師、異国へ向こう、産後厄無く、身に宮代に虫さんざん闇に鳴く 3.141592653589793238462643383279
「異国に」だった・・・。
>>92 "身に宮代に"だと"323842"と書いてしまいそうだ。
約3 Yes. 約3.14 Yes, I have. 約3.1416 Yes, I have a number. 単語の文字数が数値になる。
0文字の処理は? 空白二個は読みづらいし、エクスクラメーションやカンマも使いづらい。 それに7文字以上の単語もそうそうない
97 :
96 :2005/08/28(日) 18:30:53
7:someone/thought 8:language/ 9:something/ ゴメン。考えてみると結構ありそうだね。
それがCとどういう関係があるんでしょうか? 初心者なのでわかりやすく教えてください。
Cする おっπ という関係
大事なのは桁数の大小ではなく有効桁数
>>92 語呂合わせ何かなくても、その程度の桁数ならそのまま覚えられるじゃん。
世界記録の数万とかのは分からんが。
>>98 よく考えたら、初めて 0 が出てくるのって
小数点以下 32 桁目なんだな。
結構出てこないもんだな。
>>99 πは 16 桁(double の精度だとこれ以上は無意味)くらい覚えとけという話。
いい加減うぜーよ市ね
なら質問カモーン
ここの連中レベル低くて質問する気が起きないんだよね。 答えてるのCかじり立ての学生ばっかでしょ。
いまどき C なんて使わないしね。
1. 質問したければすればいい。 2. 質問したくなければしなければいい。 3. 答えたいならば答えればいい。 4. 答えたくなければ答えなければいい。 5. 2と4に該当するなら無理に書き込まなくていい。
新5. 2と4に該当するなら書き込まず黙ってどっかに行く。
答えてるとみせかけて大抵茶化してる奴多いからな
110 :
デフォルトの名無しさん :2005/08/29(月) 14:48:29
質問です。 srand()関数の発生系列の限界を知りたいんですけど どうしたらわかりますか?
たしかrand()自体が0からRAND_MAXまでの一様乱数を返すとしか定義されてないはず。 つまり実装はライブラリ毎に異なるんで自分で調べるしかない。 まぁ大抵は32bitの線形合同法だろうけど。 ちゅうか自分で実装した方がいいよ。
MT使っとけ
114 :
110 :2005/08/29(月) 15:58:09
僕が聞きたかったこととは違いますが質問に答えていただいてありがとうございます。 僕が聞きたかったことは プログラムを実行するたびに異なる系列(seedを変える)で擬似乱数を 発生させ続けると同じ擬似乱数が出てくるようになる。そのループする 限界を知りたいんです。 文章がわかりにくかったらスイマセン。
115 :
デフォルトの名無しさん :2005/08/29(月) 16:04:30
ここも人大杉が解除されているぅ♪
>>114 自分の環境のドキュメントかソースを読め。
普通は何入れても 2^32 だと思うがね。 粗悪なやつ(右シフトしてないやつ)は % (2^n) すると周期が 2^(32-n) になるが。
関数の仮引数で、int **argという*演算子が2つ付いたのを見ますが これはポインタの配列を引数として受け取るということでしょうか? いまいち、どういう場合にint **argの形を使えば良いのかわからなくて・・・
想像力はたくましいですが、そうではありません。 多重間接参照といってこれはポインタのアドレスを保持します。 int **a, *b, i; と宣言し、b = &i; a = &b; とすることによって整数型ポインタ b のアドレスを保持します。 **a = 100とすることで 間接的に 変数i に対して100を代入することができます。
>>118 ポインタのポインタ。
引き数として配列を渡すことはできない。
バカばっかかよ! ポインタ変数の配列を引数に取るときでもいいし、 ポインタ変数を直接操作したい場合にも使える。 typedef int* PINT; として PINT *arg を考えればいい。
お前が一番馬鹿だな
このスレ読むと 「本当に有能な人間は他者を馬鹿にしない」 という言葉が真実だということが良くわかる。
char **argv も使ったことないのか。
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 で 処理するのは間違っていますか? //フラグ乱舞のプログラム失礼します
単に日本語を除外したいだけなら、 0x80 以上の値が出てきたら(最上位ビットが 1 なら) 次の文字を無視すればいい。 Shift-JIS でも EUC でもいける。 文字コードの正当性まで知りたいのならこれではだめだが、 そんなのはどうでもいいっしょ? 多分。
>>127 うん。fgetwcを使うのが簡単だよ。何か躊躇することでもある?
どうしても嫌なら'['の1文字前が2バイト文字の1バイト目かどうか確かめればいいよ。
とか思ったけど、Shift-JIS の半角カナがあると話が変わるんだった。 Shift-JIS なら、0xA0 〜 0x9F だったら次のを除外しないようにする。 EUC なら必要ない。
>>128-130 ありがとうございました。日本語コードとかの話になると、つい敬遠しがちでしたが
お陰さまで少し興味がもてましたです。
構造体を示す慣用的な表現ってありますか? typedef struct Argfoo Argfoo; 自分ではArgxxxで構造体を示すと決めていますが、 もし何か慣用的なものがあればそっちに習おうと思いました。
なんで構造体にArg? ていうか、名前に型を示すプレフィックスをつけるとかは今時 流行らんからやめれ。
fopenしたものから、ファイルディスクリプタを得る 関数って何でしたっけ??
fopen()が返す値がファイルディスクリプタそのもの
>>134 そんなこと標準Cの範囲ではないからすれ違い。
ストリーム(FILE *)からファイルディスクリプタ(int) fileno()だた。。 解決しますた。m(__)mどもども
139 :
デフォルトの名無しさん :2005/08/31(水) 00:36:02
データの入力と処理に関する質問です。 2 3 4 1 5 2 の様なスペースで区切られた約40000行のデータファイルがあります。 このデータファイルを読み込んで、各列ごとにヒストグラムにしたいのです。 どのようなCプログラムを作ればいいのでしょうか? 初心者なので具体例を提示していただければありがたいのですがm(__)m
宿題は宿題スレにGO ただしもっと仕様を明確にしてな
141 :
139 :2005/08/31(水) 00:43:49
>>140 宿題では無いのですが、宿題スレに行って来ます!
>>139 ここはC言語のテクニカルノウハウなどに付いてのスレです。
アルゴリズムスレや初心者スレ、或いは宿題スレなどへどうぞ。
#つーか、情報量が少なすぎて回答しようも。
入力部はfgets()+sscanf()を行数分回せばいいとして、ヒストグラムの仕様が判らないとデータ設計できないし……
>>139 各項目は全て整数値?
各項目の値域は?
#・・・Cで書くわけね
AWK で書きてー。
AWKは書かねぇ
下のプログラムは、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);}
>>146 80列×8行にプログラムを詰め込むという制限をかけた特殊なプログラムなので、
分かりやすいよう整形、リネームするか、
別のプログラムを探すかしよう。
>void main() ここに突っ込んで話を迷走させようぜ
短くするためにちょっとズルしてるだけだろ。
Cでは不適切だから、スレ違い。
短くしたいだけならmain()と書けばよい
戻り値がありません。
プリプロセッサ通して適当に改行/整形してみたけど、90行にもなったし かなりトリッキーなので解説するには向かないね。
自分で宣言すれば#includeの行は削れそうだな
>>154 Cだから関数宣言はなくてもコンパイル通る。
可変長の関数はプロトタイプないとバグるぞ
お尋ねしたいのですが、if (test == 1) /* なんかの処理 */; みたいに単文だからと中括弧を省略していると、おめー中括弧かけよ と決まって注意されます 個人的には省略いらねーだろ と思うのですが、これはやはり宗教的なところですか? 注意を無視しててもようございましょうか?
>>158 注意してきた人にもよるだろ。
自分で判断できないのか。
>>152 K&Rのhello, worldはmain()で戻り値無しだよ
会社やプロジェクトのコーディング規約に載ってるなら、それに従う。 規約がなくとも、省略したがってるのに「個人的には省略いらねーだろ」 なんて不思議な日本語書いてしまううかつさんには、 意識して書いてもらえる方が周囲の人間は安心できる。
>>158 中括弧を省略してもいいと思っているのか、
そんな省略なんて必要ないと思ってるのか
はっきりしてくれ。
単文で中カッコを付けるかどうかは、 その人のコーディングスタイルによる。 それ以上でもそれ以下でもない。 switch〜caseのインデントとか ifやforの中カッコを同一行に書くか改行するか、とかも同じ話。
俺はmain関数やユーザ関数の中括弧は改行してからで、 ifやforはfor(〜〜){と続けるな 省略は絶対にしない。
あまり省略はしないけど、return 1文のときのみはたまに省略するな if (〜) return false; みたいな
スタイルの話はよそでやれよ。
どっちがいいかはともかく何のメリットがあるのかって話じゃないのか。 俺にはメリットがよくわからん。
どちらのメリットかもよくわからん
>>168 ・無駄なタイプが少なくなる
・ファイルサイズが若干小さくなる
これだけ。
どうせコンパイラが吐くコードは同じだし。
括弧つける場合のメリット ・後でそのブロックに行を追加する場合の修正量が少ない(行追加だけで済む) 括弧つけない場合のメリット ・行数が減るのでややコードの一覧性が向上する ってとこか。特に昔は端末サイズが80x24とかだったりしたので一覧性は 重要だった。K&Rスタイルの右肩と下にブロックの括弧を書くやりかたも、 行数少なめにして一覧性を向上させるためのもんだろう。
> どうせコンパイラが吐くコードは同じだし。 こういう極論を吐く奴は他人と一緒に仕事はしないでくれ。 せめてプログラム書法ぐらいは読もうな。
「省略」って書いてあるけど。「本来の書き方」と思う人は誰もいないのだね 中括弧が必要なのは複文の時だけである筈だけど #なんてぇ事を書くと煽られるだろうなw。論理的な反論が欲しいのだけどね
>>157 どうバグるんだ?そんなはずないと思っているわけだが。
>>160 K&Rにも間違いはあるし現在ならC99を中心に考えた方がいいぞ
単文では括弧を使ってはならない、と規定されているのでなければ、 「本来」というのは大げさな、恣意的な表現だな。
>>175 じゃあ中括弧をつけるのは、
「本来不要なものだけど、保守性等の面で推奨される書き方」
という表現も恣意的なわけ?
「本来の書き方」「本来不要」なんて、当然そうあるべきルールがあるように書いてるのは君だけ。 「省略」という言い方が気に入らない?なら、他の言い方をどうぞ。 皆、どちらも同じだがそれぞれの流儀で使ってるというのは理解してるだろう。
>当然そうあるべきルールがあるように ルールではありません。文法です。 >「省略」という言い方が気に入らない?なら、他の言い方をどうぞ。 ありがとう。「本来の文法に沿って記述しない」位が適切かな。 >それぞれの流儀で使ってるというのは理解してるだろう。 そうですね。スタイル論議をするつもりは無いのですけど、 「省略」という表現が不適切に感じたからレスしたのみ でしたw
Cスレの半分は無駄話で出来ています
182 :
デフォルトの名無しさん :2005/08/31(水) 15:55:16
おいおい、単文に括弧つけるのは文法違反ときたかw
> 「本来の文法に沿って記述しない」 どう嫁と
本来の文法に沿ってはいないが文法には違反していない、 つまり「文法」と「本来の文法」は別物なんだよ。
186 :
デフォルトの名無しさん :2005/08/31(水) 16:09:27
>>179 単文 : 「;」で終端される<式>。
複文 : 「{}」で複数の単文を括った文。
文 : 単文、複文を含めたもの
ifの文法 : if( <式> ) <文>
if( /*略*/ ) { /*略*/ }
の、どこが文法に沿っていないのだ?
>>179 は宿題ができなくて暴れてるリア厨だろ。
そんなにいじめるな
188 :
186 :2005/08/31(水) 16:10:40
×複文 : 「{}」で複数の単文を括った文。 ○複文 : 「{}」で複数の文を括った文。 でつた…orz
括弧の話題はのびるな… ところで、これも単文に入った? a=1,b=2;
>>174 実際問題としてはK&RのHello worldの例をコンパイルすることのできない
Cコンパイラって存在しないんじゃない?
文法的には{}付けても付けなくとも正しいだろ 何でそのレベルで議論になるんだ
>>191 現状での C の正しい仕様としては、
int main の return を省略することはできない。
C++ なら、省略すると return 0; が暗黙に加えられるが。
K&R C の時代のことは知らん。
それを言ったら void main も仕様外だから、
>>146 も、void 削って戻り値無視ってのも、
大して変わらんのだけどね。
>>193 C99ではreturnの省略可能。(ISO/IEC 9899:1999 5.1.2.2.3 Program termination -1)
>>194 ああ、そうだった。C99 だとできるようになったんだった。忘れてた。
>>189 単文なんて俺用語の用法を聞くなと。
複文以外の文を単文と呼ぶのが普通だと思うが
>>186 の定義によると「;」で終端される<式>などというCの文法に存在しないものを単文と呼ぶらしい。
a=1,b=2;
は式文という文で式じゃないから186の定義では単文ではない。
{}で囲んでないから複文でもない。
,は順次演算子
? 「単文」そのものはオレ用語じゃないだろ
201 :
デフォルトの名無しさん :2005/08/31(水) 19:09:15
C FAQの7.21に次のような記述があるんですが、ISO C規格上の根拠についておしえてください。 「解放されたポインターの値は厳密にいえば無効で、それをどう使っても、たとえ間接参照 以外のことに使っても理屈の上ではトラブルの元である。」 free済みのポインタを、prinrf("%p", p); したりするだけでも規格違反(unspecified?)です か? C99の7.20.3あたりには特に何も書いていないように思います。
202 :
197 :2005/08/31(水) 19:09:55
いや、知ってるがそれが何だ?
本来の文法、ねぇ…… お笑いと厨は帰れ。終了。
205 :
197 :2005/08/31(水) 19:11:18
>>200 規格書に載ってないものを俺用語っていうんじゃねーの?
あれ「複文」も載ってないや、複合文だた。
というか、自分の説明の中で「単文と呼ぶのが普通だと思うが」とか書いてるし。
日本語で用語定義している規格書って、何を参照してるん? K&Rでは「複文」←→「単一の文」だな。
>>197 カンマを使うと <式1>,<式2> というのも1つの<式>となるため、
> a=1,b=2;
> は式文という文で式じゃないから186の定義では単文ではない。
というのは間違い。
質問させてください。 cccというポインタの配列の0番目を上書きしたいのですが、 どのようにすればいいのでしょうか? やりたいことは下の様な感じなのですが・・・ struct kouzoutai *ccc; &(aaa->bbb[0].ccc[0]) = ccc;
>>210 ; が付いてるからそれは既に式じゃないだろ。
>>207 それが正しいとは言ってないだろ?
「普通だと思う」と言ってるだけで。
>>210 a=1,b=2は式だが
a=1,b=2;は式じゃない。
カンマ演算子は関係ない。
>>212-213 186の定義が発端じゃないの?
>単文 : 「;」で終端される<式>。
だから、式の後ろにカンマがついてる、のを問題にするのは変では?
つか、
>>197 で「単文」は「俺用語」で<式>は「存在しない」と書いてるように読めるが、
式もダメなのかい。
>>211 それ以前にやりたい事に間違いだらけですが...。
cccもポインタ配列になっていませんし。
>>214 ><式>は「存在しない」と書いてるように読めるが
ええと、違う
「「;」で終端される<式>」は存在しない。
>>214 >単文 : 「;」で終端される<式>。
この日本語だと、「単文は、〜〜〜 な <式> である。」と言う形になっている。
言い換えると、『<式> のうち、「;」で終わってるものを「単文」と呼ぶ』という意味になる。
<式> はどう頑張っても文にはならない。明らかにおかしい。
単文 : <式> の後ろに「;」を付けた物。
ならいい。
>>216 それは読み方が違うんじゃないか、単文(文/単一の文)の定義を書いてるんだろ。
単文→ <式>; ってだけだろ、BNFっぽく書いてるんなら。
なんか、曲解、揚げ足鳥合戦でもやってんの?
日本語講座をやってます。
その論法で逝くと、複文の説明も辺だな。 括弧込みというならブロックとかだろ。
だな。低脳厨が脳内文法の変形作業を騒ぐのはスレ違い。でてけ。
いや、もういいよ。どっちでもいいって。事の発端はvoid main()だったっけ?
式と文は違うということじゃね? 通常のALGOL文法では式と文は大きな違いがある Lispには式しかないけど
>>221 K&Rでは複文=ブロックだし、複文も規格にない用語だから気にすることないんじゃない?
>>218 それはそれで珍しい定義だよな。
珍しいのか、式+セミコロン前提でアレコレやってたようだが。
>>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
制御文ってどういう扱いになるんだ? 単文とか複文とかの概念から外れて、 「制御文」以外の何物でもなくなるわけ?
単文だと思うが。 ちなみにCの文法で定義されてる文は ・ラベル付き文 ・複合文 ・式文 ・選択文 ・繰返し文 ・分岐文 の6つ。K&Rは「複合文」を「複文」と読んでそれ以外を「単一の文」と呼んでいる
つーかコーディングの作法について議論したいなら他所でやれ
スレ的には 232が正しくて他はたわ言に過ぎない。
>>228 ありがとうございます!
ヒントを元にポインタの勉強をしてこようと思います。
>>234 コーディングスタイルではなく、C言語について語っていると思ったのだが。
>>237 今は式や文といった用語の定義について話てるんでわ?
少なくともスタイルじゃないだろ。
>>231 確かにその定義だと制御文は全部単文になるね。
でも、
if(...) { ...; ...; ...; } else { ...; ...; }
を「単文」と呼ぶのも気が引けるような。
かといって、上のが複文で
if(...) ...;
は単文ってのも何か違うような気もするし。
単文って言葉自体が害悪に思えてきた。
C の規格票で「単文」って言葉がないのも分かる気がする。
文法定義を書いてみようと思ってみても、
確かに「単文」なんて項目は作りそうにないね。
だからたわ言は終了。
ソースに対して期待された結果が出ればそれでよかろう・・・ それにK&Rがさまざまな方言生んじゃったのも事実だし
>>241 K&Rは方言を無くすために書かれました
243 :
デフォルトの名無しさん :2005/09/01(木) 00:53:58
今後Cのソースは .cpp で保存しようと思うのですが
244 :
デフォルトの名無しさん :2005/09/01(木) 00:58:17
頭はgoサインを出しているのですが、体は拒否してます。 どうすればいいですか?
無くすために書かれても一部曖昧だから方言生んだじゃん そこでISOとANSIが慎重になって標準化した
それは C のソースじゃなく C++ のソースだ。
既にあったのなら、生んだってのは
248 :
242 :2005/09/01(木) 01:04:49
方言が嫌な奴にC/C++は適さない
250 :
デフォルトの名無しさん :2005/09/01(木) 02:15:34
LSIっていうフリーのコンパイラをインストールしたんですけど、コンパイルってどうやれば出来ますか?
ググれ
252 :
デフォルトの名無しさん :2005/09/01(木) 02:35:14
>>251 教える気が無いなら黙ってろ。
お前が教える気がないだけで、他の人は教えるかも知れないだろ。
>>252 ”Cコンパイラの使い方なら俺に聞け”というスレでも立ててそこでやってくれ。
256 :
デフォルトの名無しさん :2005/09/01(木) 03:55:22
#include<就活.h> main(){ int 無職歴; for(無職歴=1年目 ; 内定数>=1 ; 無職歴++){ printf("不採用\n"); } } 就職できません('A`)
>>256 ""で囲んでない
int mainのintを省略できるのはC++、その場合はヘッダ名がC就活になり.hはいらない
>>257 >intを省略できるのはC++
関数は省略したらintじゃないか?Cでも。
>int mainのintを省略できるのはC++ 仕様上はできねーよ。 省略できるのは return 0; の方だけだ。
省略するのはvoidな
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()とか使うの? 違う気がするし、聞きに来ました。よろしくお願いします。
>>262 一応答えておくか
ランダムにやるならrand()かそれに相当する処理を使うのがベスト
手順は以下のとおり
1) A、B、Cを配列に格納する
2) 各配列に対し以下の操作を行う
2-1) インデックスの個数を取得(1〜要素数の間でランダム)
2-2) インデックスを取得(1〜↑で指定した個数の間でランダム)
※この時、既に取得したインデックスと重複しないようにする
2-3) 取得したインデックスの値を表示
265 :
262 :2005/09/01(木) 11:54:49
>>263 勉強して出直します。
>>264 回答サンクスです。学校で常に赤点だった男なんでちんぷんかんぷんですが、なんとか頑張ってみます。
266 :
264 :2005/09/01(木) 16:17:12
ちょっと間違ってたので訂正 2-2) 誤) インデックスを取得(1〜↑で指定した個数の間でランダム) 正) ↑で指定した個数分だけ、配列のインデックスを取得(1〜要素数の間でランダム)
↑253乙
269 :
デフォルトの名無しさん :2005/09/02(金) 11:05:22
そろそろ学校でC言語を習うのですが、出来るだけ予習しておきたいです C言語の知識は全くありません。そんな僕にオススメの本やサイトはありますか?
学校の教科書読め。 余力があったら、実際にプログラム書いてみればいい。
学校のお勉強なら、授業で使う教科書を予習
学校の授業受けてれば習得できるなんて甘い考えは捨てとけよ。 独学が基本だ。
学校ってこずかい稼ぎ書いたような教授の糞なテキスト買わされることがあるけどな。 推薦図書スレ逝って来い。
いちいち密度の低いスレだな
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]を受け取っています。 なのに、このコードはエラーが起きず、正常に動作します。 これはどうしてですか? おねがいします。
暗黙の型変換
278 :
デフォルトの名無しさん :2005/09/02(金) 11:35:10
眠い
俺が勉強に使ったのは「入門ソフトウェアシリーズ@ C言語」ってやつだったな
河西本って昔のワープロの説明書みたいな感じだよね。
やはり「作ってわかるCプログラミング」を選ぶべきですね :)
スレ違いだっつうの
スレ違いということに…、いやスマン
>>280 うはっwww俺の学校もそれだ
正直分かりにくかった記憶しかない
>>274 凄いんだけど、それ。
何かを履き違えている気がする。
C言語始めたんですが意味わからない・・・。 これはどこから始めればいいんでしょうか? 定義を覚える以前に・・・自分がなにやってるんだが分からない・・・orz
memcpyとmemmoveの違いってコピー元とコピー先の領域が重なったときの動作の可否だけなんですか?
>>289 それが原因で速度に変化が出る場合もある。
俺、スゴイことを発見した。 C言語でプログラム書くとき、 できるかぎり一行でカッコとか使わず処理を書いたり、 ポインタをいっぱい使ったり、 複雑で分かり難い長い宣言を書いたりすると、 ほめられる、ってことに・・・ これで、冬のボーナスは、確実にアップだな
こうしてマ板に壊れたPGが流れ込むわけだ
>>293 コメントは全て英語で書いて、後から読む奴を寄せ付けるな
こいつすげー・・・こりゃ敵わないや・・・
となる事間違いなし。給料2倍
いや、英語ぐらいは読めるだろ
読めるけど、読みたくないし、書いてる方が間違ってる可能性大。
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の演算子を使う場合、この式であれば合ってますでしょうか?
違う
詳しいっていうか 入門書の一章読んだら十分分かるだろ
>>299 >switch(9 <= num <= 17){
そもそもこれがありえない
304 :
訂正 :2005/09/03(土) 03:55:43
switch((9<=num) && ( num<=17)){ 打ちまちがえました。
switch((9<=num) && ( num>=17)){ これもなんだか・・・
switch文で真偽返してどうすんの?
307 :
デフォルトの名無しさん :2005/09/03(土) 03:58:23
switchを調べろ
switch()の判定文に入れるのは整数値を表す変数。 caseに付けるラベルは整数の固定値。 範囲チェックしたいならif使え。
演算子がどうとかいうより、switchの構文理解してないじゃねーか
312 :
デフォルトの名無しさん :2005/09/03(土) 04:19:04
if(num== 310) puts("そうします。レス有難うございます"); else puts("参考書のメモに「複雑な式は使えない」と自分で書いておいたのを見つけました。"); puts("皆さんレスありがとうございました。");
突込みどころしかないからなあ。
>>312 ,299
・ ((9<=num)&&(num<=17)) は Cの論理式として決して複雑ではない
・ switch文の機能、意味等がまったくわかっていない
・ 「数学で (9 <= num <= 17)」と言いたいだけだろ? C真似て紛らわしい質問。
つか、C入門書のはじめからと論理初歩やり直せ。当分初心者スレ以外に投稿すな。
でも、無意味な文章をありがとうございます。
・ ((9<=num)&&(num<=17)) は Cの論理式として決して複雑ではない そんなことわかってるよw 複雑じゃないんなら、これでswitch( )書いてよw ・ 「数学で (9 <= num <= 17)」と言いたいだけだろ? C真似て紛らわしい質問。 自分が読み誤ったのを正当化したいだけでしょう
なら無視するか、誘導してもらって。で、よかったのに 何得意げに答えてんの?w まぁ、他の人には感謝。 あ、アンカー↓ >つか、C入門書のはじめからと論理初歩やり直せ。当分初心者スレ以外に投稿すな。
switch ((9<=num)&&(num<=17)) { case 0: moge(); break; case 1: hoge(); break; }
C言語のswitchには残念ながら範囲を指定する方法はない。
箇条書きにしてる部分は
>>315 の被害妄想でしかないと思うけど、
参考になるスレなので荒れると嫌だから、しばらくロムります
324 :
315 :2005/09/03(土) 07:44:42
>>312 >"参考書のメモに「複雑な式は使えない」と自分で書いておいたのを見つけました。"
<<switch()の判定文に入れるのは整数値を表す変数。
<<caseに付けるラベルは整数の固定値。
つ "C入門書のはじめからと論理初歩やり直せ。当分初心者スレ以外に投稿すな。"
>>312 並以下のアホだか脳無しまで沸いてるなあ。特に下記は憐れをもよおす。
>>319 >>そんなことわかってるよw 複雑じゃないんなら、これでswitch( )書いてよw
>>322 >>C言語のswitchには残念ながら範囲を指定する方法はない。
被害妄想がひとりいるなw
>>315 憐れをもよおす。漏れはおまえに吐き気をもよおすよw
if(CHECK_IN_RANGE(num, 9, 17)) { ; }
釣られはせんぞ。釣らせはせんぞ。釣らせはせんぞ。
switchの存在意義って見易いこと意外にある?
if elseの羅列より高速化される場合がある。
331 :
315 :2005/09/03(土) 08:29:39
「w」好きの低脳ってどこで見ても必死な低脳だな。
どう条件分岐したいかもわからずに書けないどうこうの能天気さが天晴れだ。
念の為。
>>303 は俺じゃない。こういう勘違い因縁づけは303,319ぐらい?
>>325 つ 325
>>326 つ 326
ここですか? 315という被害妄想男が、頑張っているスレは
他の言語だとcaseに範囲を指定できる
/* <= 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; }
9 <= num <= 17 って書きたきゃ、Python やろうぜ。
C++でもできるな。
Cでもできる。 値は常に1だけどな。
C++でも無理
どう考えても釣りだろ? あんな間違いするヤツは、いない。
>>322 できないことはない。
switch ((num < 9) + (num < 17)) {
case 2:
// 9未満
break;
case 1:
// 9以上17未満
break;
case 0:
// 17以上
break;
}
まあ、こんなことする位ならif-else使っとけと。
>>329 switch文はlコンパイル時にテーブルとして展開される。
if文は逐次判定処理。
そのため、判定条件が多くなるとswitch文の方が高速化される傾向にある。
しかし、判定条件が多すぎると却ってif文より遅くなる諸刃の剣。
>>341 TRUEが1である保証はないから、正常に動作するとは限らない。
>>343 クマー
つ switch ((num < 9)?1:0 + (num < 17)?1:0)
>>343 ハァ? 関係式は1か0しか返しませんが
こんなのでも釣れてしまうとは嘆かわしいことだ。
(勉強になったなんて言えない)
m9(^Д^)プギャー
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 に被るのは勉強したような気がしないでもないのですが、 何だか使いにくいような気がしました。 終わり
>>353 unsigned shortは%huだろうが
ネタだろうが釣りだろうが、 こうやってちゃんと正しとかないと、 第三者の初心者が勘違いするといけないから困る。
こういう見事な例って本当に初心者なのかなとは思うな sscanfとか普通使わないだろうし
>>358 > sscanfとか普通使わないだろうし
ハァ?
覚えたての初心者がってこと
>>358 むしろ初心者だからこそ行き詰った時にsscanfを連発するのではないかと
たいがいの初心者は sscanf の %[文字クラス] は使わないわな。
林の糞本にも書いてあることが理解できない奴は初心者ですらないわな。
某入門書に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++を使いました。
sscanf(str, "%127[^,],%hd,%hd,%hd", test->str, &test->i, &test->j, &test->k); %d だと 後半 test->k が4バイトで、[0000 0003 0000 0000]と言う具合に 2バイトオーバー して上書きするから「あ」が消滅してしまうんですね・・・ 迂闊でした 皆さんご教示ありがとうございました
1<=10 1 じゃない i ダ! おもしろくもなんともないぞhage
>>365 ま、scanf()だとかprintf()みたいな可変長引数関数の書式指定子は
型チェックできないから気をつけろってこった
gccとかはprintf()を「知って」いるからそこまで見てくれたりするけどな
>>364 forの条件が常に成り立つようになってる
は?エラー?
375 :
364 :2005/09/03(土) 18:36:05
>>366 あ、ありがとうございます。解決しました。
○| ̄|_
警告の意味をよく調べて、 何でその警告が出たのか解析しといた方がいいぞ。
377 :
364 :2005/09/03(土) 19:15:17
今度は警告すら出てないのに無限ループするようになった・・・・・orz
独り言はやめてくれ
警告がでないのは文法上はおかしくないって事だけだろ 内容がどうであれ、コンパイラが緩衝しないのは当り前
C言語で、ある画像内の指定ポイント(画素)の輝度を 取得するプログラムを作成することは可能ですか?
>>380 その画像の該当画素を取り出せたら、0.299R + 0.587G + 0.114B
元々輝度値で記録されている可能性もある。
384 :
380 :2005/09/04(日) 01:34:14
うーん・・・C言語で画像を扱ったことがないので、さっぱり分からないです。 (画像を入力する方法もわかりません) もっと勉強してきます。
そりゃ全然だめだな。画像形式すら書いてないし。
>>380 処理の概要だけ。
画像が未圧縮のDIBだと仮定して、
1) 画像ファイルを開く(fopen)
2) 先頭から1画素ずつ走査し、該当画素を取得(fread)
※ファイルヘッダがあるなら読み飛ばす
3) 画素から輝度を取得 (
>>382 )
4) 処理が終わったらファイルを閉じる(fclose)
ファイル名や画素の位置はコマンドライン引数で指定するなり
ソース中で定義するなりお好きなように。
おいおい お前びっくりするな
388 :
380 :2005/09/04(日) 17:33:17
>>386 画像はBMPです。
処理の仕方はDIBと同じですか?
BMPとDIBの画像形式に付いて調べろ
ブール値ってなんかの論理式の結果だと必ず0か1だけど if(a) で成り立つけど if(a==1)で成り立たないのって 軽くヤバくない? a とだけ書いたとき、これってif文から見たらゼロじゃないからTRUEだけど 0以外であって1というわけではないよね でも、これをaではなく真偽値を返す関数と置き換えて考えてみると if(a())で成り立つけど if(a()==1) と書きたくならない? あー、ならないか・・・おれでもこうは書かないな すまん忘れてくれ
>>390 BOOL a(void){
return TRUE;
}
if (a() == TRUE)
じゃ駄目なの?
>if(a) で成り立つけど if(a==1)で成り立たないのって >軽くヤバくない? 成り立たないと困るのに成り立たないとしたらただのバグ。 aに0,1以外を突っ込むのやめればいいだけの話。
真偽値を返す関数を書くとき、ついつい 真に0、偽に0以外を設定しちゃうんだよね 偽にはエラー要因
頼むから止めてくれ
俺くらいの上級ハッカーになると FALSE:失敗、TRUE:成功、その他:エラーと自由自在に使い分けるんだけどな。
俺くらいの士官候補生になると TRUEあるのみ
>>390 >if(a())で成り立つけど if(a()==1) と書きたくならない?
ならない。
「真偽を返す」という定義の関数なんだから、
意味的に言って、その戻り値は if にそのままつっこむべき。
typedef int BOOL; BOOL hoge(int x) { return x -10; } こういう関数かもしれないしな。
まさに is 系関数がそういうやつで、 真でも 1 以外の値が返ってくるのが普通。 絶対に 1 と比較してはならない。 0 との比較ならいいけど、 予めブール値に変換しておくような場合以外ではやる必要がない。 if とかではそのまま ( ) に突っ込んでおけばよし。
つか、そんな事は各関数の戻り値の仕様を確認しろとしか
Cに言語仕様としての論理値はないんだから(stdboolは後から取ってつけたライブラリ) あくまで0か非0で考えるべき。 0か1か(それ以外か)はenumだろ。
>>401 あんまり細かい仕様は把握してる人も少ないし、
時々処理系側でその仕様が無視されてることすらある。
安全のため、0 か非 0 が返ってくるものとしてプログラムを書くのが良い。
つか、こっちのが処理速い。
Don't think, accpept!
>>403 1と比較していいのかなんて話題出してるから、言ってる。
> あんまり細かい仕様は把握してる人も少ないし、
> 安全のため、0 か非 0 が返ってくるものとしてプログラムを書くのが良い。
論外、安全とか言う前にドキュメント読み返せ。
1 と比較するメリットがないっていってんだよ。
1と比較しろなんて言ってない、 仕様の確認もしない人に安全とか逝って欲しくないのだよ。
確認しないとは言ってないだろう。
あーウンコしたい
トイレからカキコ
ラッセーラー ラッセーラ ヾ(・ω・ )シ へ( ) > ラッセーラー ラッセーラ ヾ( ・ω・)シ ( )へ く ( ・ω・ ) ウーーーーーーー └ ┘ / ̄~ヽ ( ・ω・ ) ファビョ〜ン ゙_/( へ \_" <
構造体の単方向チェインについて質問があるんですが、ここで聞いても大丈夫ですか?
単方向チェインとは何ぞや
単方向リストかな
>>412 単方向チェイン=単方向のリンクリストのこと?
まあ、とりあえず質問してみ
スレ違いだったら誘導するから。
417 :
デフォルトの名無しさん :2005/09/06(火) 02:44:35
C言語をはじめたばかりであまりわからないのですが、 ビットシフトはなんの役に立つのでしょうか?
419 :
デフォルトの名無しさん :2005/09/06(火) 03:05:34
>>417 ビットシフト演算をしたい時に役立つ。w
えーと。たとえば非常に遅いCPUのマシンで腐ったCコンパイラを
使っている場合、2を掛ける時に << 1 でやった方が速いとかね。
2で割りたい時に >> 1 でやった方が速いとかね。昔のコンパイラは
最適化が悪かったのでよくやりました。今どきのコンパイラは * 2
と書こうが / 2 と書こうが勝手に一番速く実行するコードを出す
だろうから、読み易い方で書いておいて良いと思います。
ビットシフト久しぶりだな
#define BIT(n) (1u << (n)) /* n ビット目が 1 の値を取得 (n は 0 から始まる) */ というように、ビットフラグを作るときによく使う。 掛け算割り算でも、かける値、わる値が変数になってる場合、 ビットシフトにした方が効率がいい。 ただし、2の累乗で・・・って制限のある場合にしか使えないけど。
ゲームとか暗号とか通信とかで役立つ>ビット演算 あと趣味
ビットフィールドを理解できない厨房がよく使う
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乗の計算がサクっとできるという利点があった。
コピペにマジレスするのはやめてくれ
マジレスしかしないってあの娘と約束したんだ……
∧||∧ ( ⌒ ヽ 氏ねだと!? よし、死んでやる。 さきに死ねば、 ∪ ノ 天上ではこちらが先達だ。 雑用にこき使ってやるから見ておれよ ∪∪
431 :
デフォルトの名無しさん :2005/09/06(火) 10:02:52
C++ C#にくらべてCって何か利点あるんですか?
・より多くのプラットフォームに対するコンパイラがある。 ・脱落する人が比較的少ない。 ・C# とは比べるのが面倒になるくらい別物。
コンパイラあるならC++使えって感じ
Cスレで何を言ってるんだ?
436 :
デフォルトの名無しさん :2005/09/06(火) 12:55:50
レスありがとうです
劣悪な(開発・実行)環境にいるならC使えって事だな。
439 :
デフォルトの名無しさん :2005/09/06(火) 14:37:40
>437 ライト環境と受け取りました
組み込み
返り値を返せと良く言われますが、void の関数でも 返り値を返すべきなの? その場合は、return NULL にすべきなの? 返さないとどうなるの?
voidなら戻り値不要。 return NULL; はNULLポインタを返すって意味だから return; とだけ書けばいいし、関数の最後ならいちいちreturnする必要はない。
>>441 可能ならvoidを使わず成否をちゃんと返せ
444 :
デフォルトの名無しさん :2005/09/06(火) 16:00:29
>>441 やればわかることだと思うが、void の関数で return で値を返そうとすると
普通はコンパイルエラーになってコンパイル不能。
>>444 void func(void) {
return (void)1;
}
>>444 エラーじゃなくて警告な。
別に値返しても、使えなくて意味がないだけで、有害なわけじゃないからな。
>>445 それ、警告出るコンパイラと出ないコンパイラがあったと思う。
448 :
デフォルトの名無しさん :2005/09/06(火) 17:07:52
C言語だと思うんで、質問します。よろしくお願いします。 csv形式のファイルがあり、ファイルから一行データを取得しました。 その内容が 整数,実数 であり、整数と実数に分けたいんですけど どうすればできますか? 例 123,0.123 っていうデータがありました。 123と0.123を分けるにはどうしたらいいんでしょうか?
文字列中に . があるかどうか
451 :
デフォルトの名無しさん :2005/09/06(火) 17:18:58
strtokでいいだろ sscanfでもできるけど
454 :
デフォルトの名無しさん :2005/09/06(火) 17:26:44
>>448 int intValue;
double doubleValue;
if (sscanf("123,0.123", "%d,%lg", & intValue, & doubleValue) < 2) {
/* Illegal data? */
}
アフォ
すいません。 バックトラック法について、できるだけ分かりやすく 解説してあるホームページなどありませんか? よろしく、お願いします。
すいません。 言語はCで、お願いします。
>>457 2ちゃんねるでクロスポストする方法ありますか?
>>448 とりあえず、ここからはでてけ。
(あれだけレスもらって、仕様の確認指摘されてて…)
>>458 Google で検索して上から調べていくべし。
すぐ見つかる。
>>441 voidの関数から値を返すと未定義動作
だから値を返しちゃいけない
>>444 は値を返してるわけじゃないから問題ない
464 :
デフォルトの名無しさん :2005/09/06(火) 23:17:32
コマンドプロンプトで始めにcd c って打つんですけど指定されたパスが見つかりません って出ます。何でですか? ファイル名c です。」
ウゼー
>>464 100歩譲ってもC言語じゃないぞ
初心者板いけ
初心者です。 C言語にはremoveとかunlinkはあるのに、 何故ファイルコピーの関数?は無いんでしょうか? あと、ファイルコピーにfgets,fgetcを使ってるのは見つけたのですが、 freadは見当たりません。処理速度の問題ですか?
>>467 CopyFile
既存のファイルを新しいファイルへコピーします。
CopyFileEx 関数は、2 つの追加機能を提供しています。CopyFileEx は、コピー操作の特定の部分が完了するたびに、指定された 1 個のコールバック関数を呼び出すことができます。さらに、コピー操作の最中にこの関数を中止することもできます。
BOOL CopyFile(
LPCTSTR lpExistingFileName, // 既存のファイルの名前
LPCTSTR lpNewFileName, // 新しいファイルの名前
BOOL bFailIfExists // ファイルが存在する場合の動作
);
exitって関数、俺の知らぬ間に勝手に呼ばれるの?
>>467 基本はfopen,fread,fwriteの組み合わせでファイルを操作する。
バイナリ、テキストモードを調べろ。ftell fseekも要参照。
他にもあるが後は自分で調べろ。
471 :
デフォルトの名無しさん :2005/09/07(水) 00:11:00
ファイルを読み込む前にそのファイルのデータの入れ物を用意するのに ファイルのデータサイズが知りたいのですが、どうやったら取得できるのでしょうか?
473 :
デフォルトの名無しさん :2005/09/07(水) 00:32:25
>>449 ,452,453,455
ありがとうございます!とても助かります!お礼遅くなってすみません。。。
>>469 main()からリターンすると、exit()と同等の処理が行われる(と思う)
>>467 標準関数では、ファイルシステムに依存するような関数は省かれている。
だから、unlink()も標準ではない。
質問です。とあるサイトの論理演算子の説明で次のようなソースが出てきました。 #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という関数のもつ値は常に真なのでしょうか?
>>476 その論理演算の結果が使われているわけではないから、printf()の戻り値は考慮する必要がない。
尤も、printf()はきちんと意味のある戻り値を戻しているが、それはmanページでも自分で調べよ。
>>477 レスありがとうございます
調べてみます
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が果たしている役割、意味がわかりません。 これが無ければ奇妙な挙動をします。 なぜこのようなものが必要なのか教えてください。
>>479 ungetc()自体はMSDNで調べるなり、ググればすぐに見つかるが
指定した入力ストリームに一字押し込む
んで、getcharで取り出したcは演算子の判別に使用してるし
数字はscanfで取り込んだ方が手間が掛からないから、その為に
演算子か数字かの判定用に取って来ちゃったcを押し戻してる
>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; } こんな感じでいいんでしょうか?
>>480 ungetcは一応調べたのですが、ピンとこなかったので質問させていただきました。
自分でも理解しているかどうかわかりませんが、
getcharにより最初の文字が取り出される、というあたりで
なんとなくわかった気がします。
ありがとうございました。
>>482 分かったっぽいが一応
要は入力ストリーム=1文字ずつ入ったコンテナが乗ったベルトコンベアと思えばいい
getcharはそこから最初のコンテナを下ろして中身を取り出す
ungetcはある文字をコンテナに入れてコンベアの先頭に強引に載せる
>>481 判っているのか判っていないのか判らないからフォローしておくと、
入力用ストリームは出力できない。つーか、それじゃコピーにならないやん。
それと、filelength()だけのために低水準を使うのは感心しない。
stat()かなにかでサイズを得る方がいいかもしれない。
#ま、その辺は環境依存にもなってくるので詳しくは各環境のスレででも。
485 :
デフォルトの名無しさん :2005/09/07(水) 07:52:57
C言語のシンボルの認識順序って 1 プリプロセッサ 2 予約語 3 関数内のローカル変数(static変数含む) 4 関数内のgotoのラベル 5 関数外のグローバル変数、関数(static変数、関数含む) 上の番号で並べるとどういう順番ですか? 自分は 1→2→3→4→5 という認識ですが、これで合ってますか? (ラベルの扱いがよくわからない)
>>481 あまりにも突込みどころ満載過ぎて誰も突っ込んでないようだが。
初期化されてないポインタのbufferにそのまま書き込んでるぞ。
別にファイル丸ごと読み込んで書き込まなければならない
理由はどこにも無い。それだとデカいサイズのファイルをコピーする
際に無駄にメモリを食うことになる。
適当なバッファサイズ(例えば4096とか8192とか)単位で
読み書きするループをまわす方が穏当だし、これだとファイルサイズ
を調べる必要も無くなる。
fopen()で開いたものはclose()ではなくfclose()で閉じる。
stdioのデフォルトはテキストモードなので、ファイルコピーの
ような場合は、明示的に"b"オプションを指定してバイナリモードに
する必要がある。その区別が存在するのはMS-DOSやWINDOWSなどだが、
区別の存在しないUNIXのようなOSで"b"オプションをつけても
害は無いので、つけておいたほうが良い。
fopen()で開くのなら、fileno()でディスクリプタを取得して
fstat()を使うことは可能で、その場合は最初にわざわざ別途に
open()、close()する必要は無い。これは無論ISO標準の範囲外の
話になるが、まあ大抵の環境では使えるだろう。
ちなみにfilelength()とかいう怪しい関数は(f)stat()と違って
ちっとも移植性が無い。
487 :
481 :2005/09/07(水) 10:11:33
>>486 有難うございます。
ただ、レスがちょっと長いので3行くらいにまとめてもらえないでしょうか?
>>487 そんだけ突っ込みどころがあるってこと。
バグの指摘と、モアベターな方法のサジェスチョンが混じってはいるが。
いやだから、スレ違いのマヌケ(
>>1 嫁)に
能無しの厨が得得と語るなと……
>>485 「1」はコンパイルを行なわれる前に実施される。
コンパイラがソースを先頭から舐めて、これは予約語とかこれはラベルとか認識していると思っているなら間違い。
その質問の回答が来ても「字句解析を行ない、構文木を作成し云々」
という様にコンパイラが何をしているかを知らなければ回答が理解出来ない。
「コンパイラを勉強して再度質問する」「なぜそんな事が知りたいかを説明する」
のどちらかの行動をお勧めする
>>490 まったく参考になりませんでした。
他の人お願いします。
ワロタ
494 :
デフォルトの名無しさん :2005/09/07(水) 12:35:58
>>485 プリプロセッサはコンパイルより前に解析される。
あとは、字句が出てきた時に、それが予約語か識別子(予約語でない)かが判定される。
識別子がどういう意味を持ってるかは、文脈から適宜判断される。
496 :
471 :2005/09/07(水) 19:26:31
すみません自己解決しますた fseek(f,0L,SEEK_END); size = ftell(f); fseek(f,0L,SEEK_SET); でファイルサイズ取得できますた
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←(値が入ってるとします) この構造体のメンバに値をいれたいんですけど どうすればできますでしょうか? よろしくお願いします。
>>497 hello.exeを作るうえでの中間ファイルなんで気にしないでOK
>>498 convertは何を意味してる?
それだと型が指定されてないからコンパイルエラーになるぞ。
いまいち質問の意味がわからんが、Recのメンバに値を入れるなら
Rec.nWave = (整数値);
Rec.dValue = (実数値);
Rec = (MAINTEREC型の変数);
gccのエラーメッセージ一覧を探してネットをさまようも見つかりません。 過去ログ(8)にはgcc manualに載っているとあったので読んでみましたが、 それらしい記述は見当たりませんでした。載っているのはコマンドラインの オプションだけ・・・。どなたかご存じないでしょうか?よろしくお願いします。
11 40 8F 20 9E 40 40 EA EA CD FF FF FF CD 2E 4D 65 65 7E....... なんて続くバイト列あるんだけどこれ u_char *になっててテキトウに80バイトぐらい長さあります。 この中からNバイト目にXが存在するかどうかによってこのデータを保存する処理内容を変えたいのですが 一番速い方法ってどんな方法あるか教えてください。
>>503 if (string[N] == X)?
>>501 エラーメッセージリストはやっぱりないような気がするけど
gccのマニュアルで役に立つのはmanpageじゃなくて
info gccの方だよ。
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の文字列が代入されているのでしょうか? さっぱりわかりません・・・
sprintfの返値は出力したバイト数だっけ? なるほど、こんな使い方があったのか(←初心者
>>506 buffer + j は &buffer[j] と同じ。
>>508 &buffer[j]の&にはどういう意味があるんでしょうか?
&はもうちょっと勉強すればそのうち出てくる。 buffer + j や &buffer[j] はbufferの j 文字目から、ということになる。
アドレス演算子でしょ
>>506 >>508 も参考に。
bufferと単に書けば「buffer配列の先頭ポインタ」を意味する。
jには上の行でbufferの先頭から格納されたbyte数が入っているので
buffer+j は(ポインタに整数を加算していて奇異に見えるが)
上の行で格納された文字列の次をポイントする
みんなはバッファはナニ使ってる? unsigned char* ? それとも char* ? 変数名も bufだったりbuffだったりbだったりする?
uint8_t buffer[100];
>>513 俺はchar*
名前はbuf使って、追加で用意するときはbuff
それ以上になったらbuff1, buff2, ...って感じでしてる
517 :
デフォルトの名無しさん :2005/09/08(木) 01:49:19
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 が未解決です どういうエラーでしょうか?よろしくお願いします。
>>518 main関数とTakeStudy関数の定義をもう一度見直せ
ライブラリを使ってるなら、パスやヘッダファイルもチェック
>>516 大きさによるなぁ
どちらかというとまろやかなmalloc使うことが多いと思う
>>506 です。&は先頭アドレスを表すことは知っていたのですが
jが引っかかっていて何か別の意味があるのかと考えてしまい
>>509 のような質問しましたが、
>>510 さんの説明で理解できました!
j文字目って事だったんですね、これでぐっすり眠れます。
皆さんありがとう^^
522 :
デフォルトの名無しさん :2005/09/08(木) 16:15:01
>>519 やっと見直せました。自作関数の定義の仕方が間違ってました。。。。アフーーー!!
ありがとうございます!
Linuxでメモリ管理を自分で行いたいのですがmallocが遅くてどうにもならないので 自分で管理しないと行けないのですが、参考文献や常套手段などありました教えてください。 あとsseを使用してmemcpy実装したけど、全然速くないのですがこれって自分がファビョってるだけですよねぇ
>>523 はじめにmallocで大量にメモリを確保して
first fitなりを実装汁
>>524 場かはおまえ
>>525 mmapで実装すればいいのですか?
それともPosix共有メモリで実装すればいいのですか?
>>523 定石としては
・頻繁にメモリ確保/解放をしない
・無駄なコピーをしない
かね。
>>528 なるほどそうなのですか
でもどうしても処理しようとすると最低でも6GBぐらいメモリが必要なのですが
これは分割して確保したほうがいいのでしょうか?
今このマシンメモリ16GB積んでいるのでメモリ取っても問題はないはずなのですが
>>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;
>>529 64 ビット機で計算科学でもやってんの?
どうやるにしろメモリは確保しないといけないのだから、
ある程度時間かかるのはしゃーない。
メモリ食わないアルゴリズムを探せるなら探した方がいいけど・・・
ないなら仕方がないね。
>>529 6GBって・・・
処理に最適と思われるサイズを1ブロックとする
メモリ管理を実装してもいっちゃね?
どっちにしろ最初に最大のブロック数を確保することに
なると思うが。
なるほど、では最大1600000個の要素が入ってくるので それように最初に頭とケツ押さえて確保してしまいます。 後は、中身を検査して、結合子の入れ替え演算はポインタの付け変えだけで いいからなんとかなりそうです。ありがとうございます
>今このマシンメモリ16GB積んでいるので これは釣りだよな、絶対。
>>534 分かってると思うけど、1ブロックは2の乗数にしてね。
演算はなるべくシフトで。
積み重なったときの速度は全く変わってくるから。
537 :
デフォルトの名無しさん :2005/09/09(金) 01:47:14
>>535 CPU:AMD Opteron
Chipset:AMD 8131/8111
使用してます。メモリだけで時価で1枚2万以上したと思います。
1GBx16枚積んでいます。
(゚д゚ )ポカーン 俺のHDDよりでかい
>>523 mallocが遅い、というのはどういう計測の結果確認できたのですか?
原則的に、実装の問題だけでなく、使い方(呼び出し回数等)の問題も
小さくは無いなずなので。(つうか、processの大きさ自体にも……)
(いや、自分のmemcpy()との実装比較もうまくやれて無いようなので、
判断の根拠が気になる……)
C言語関係ないじゃん
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
↑このプログラムをコンパイルしたのですが うまく動作しません。どなたか詳しい方 どこがおかしいのかおしえてください。
scanf ( "%d ", kotae ); ↓ scanf ( "%d ", &kotae );
>>523 6GB...もちろんLinuxは64bitOSだよな。
32bitOSだとアドレス空間は2GBまでしか確保できないはず...
> mallocが遅くてどうにもならないので
本当にmallocが遅いのか?実はその次のmemsetでの初期化が遅いとかないか?
prof , gprofを使ってボトルネックを探した方が早い様な気がする。
>>544 >>1 >エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。
今度から気をつけてね。
大抵ヒープマネージャは差し替えられるようになってるから アロケートする傾向に合わせて既存のマネージャ探してみたら。 アルゴリズムはCマガかDDJで見たような気がするけど忘れた。 似たようなサイズの確保・開放が激しいなら struct buff{ size_t size; void *p; struct buff *next; } buff; struct buff *reusable_buff_list ; みたいな感じでプールしといて再利用するとか。
いや、
>>534 なんかみると、単に無駄にちまちま mallocしてるだけで
手際が悪いだけに見えるんだが、まあ、みんな疑問なのは、
本当に mallocのせいか? mallocの実装より単に大きいブロックから
切り分けりゃいいだけじゃね? ほんとに手順上その sizeが必須なのか?
とさまざまな突込みどころが… (memcpy SSE実装とかも…)
そもそもこれが、
>>Linuxでメモリ管理を自分で行いたいのですがmallocが遅くてどうにもならないので
>>自分で管理しないと行けないのですが、
<<Linuxでmallocが遅くてどうにもならないのでメモリ管理を自分で行いたいのですが
じゃないのがとてもワロタ(ひきつった)。でも激しくスレ違い。
>>523 548の意見に賛成。
緩衝メモリエリアを設ける方法がいい。
OSの方にも似たような機構があるだろうけどGB単位のバッファは想定外でしょう。
何を計算させるかわからないけど、数値データの初期化だけでもえらく時間がかかりそう
memcpy SSEってSSE2のことだよな。 worldのリコンパイルの時コンパイルオプションでアーキテクト指定できるから すでに対応しているような気がするが。
>>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行目のところで宣言の構文エラーとでてしまいます なぜでしょうか 詳しい方おしえてください おねがいします
>>555 > int p_turn = 1
セミコロンが抜けてる。
558 :
デフォルトの名無しさん :2005/09/09(金) 13:35:45
>557 スペシャルありがとうございます。
(;´Д`)
いつからここはケアレスミスを見つけるスレになったんですか?
何この流れ 脱力空笑いな俺がいる
562 :
C勉強中 :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がでてこないのでしょうか。詳しい方おしえてください おねがいします
>>562 変数宣言おかしくないか?
char str[]={"hoge"};でいいだろ
564 :
C勉強中 :2005/09/09(金) 16:08:44
>563 ありがとうございます。ポインタをもっと勉強しておきます。
>540 メモリファイルシステムにしてmmapでやればぁ〜
>>540 いちいち返してると返すたびにオーバーヘッドが発生して重いアプリだと思われるかと
if (!RegisterClass(&wc)) これはどういう意味なのでしょうか?
char型の文字型配列に abcdefg と入っている時、 cde のみ取り出して、別のchar型文字列に入れるにはどうしたら良いでしょうか? strcpyなどは「"先頭の"何文字をコピーする」なので使えませんよね。 お願いします。
>>567 RegisterClassが失敗した場合分岐
>>568 string + 2をstrncpyに渡せば途中から取れると思うけど
>>568 strchrまたはstrstr+strncpy
>568 char *s = "abcdefg"; char dst[64]; strncpy( dst, s+2, 3 );
>>563 それも可能ではあるけど、
普通は char str[]="hoge"; だな。
573 :
568 :2005/09/09(金) 17:50:19
>>569 ,571
そのような使い方が出来るとは・・・勉強が足りませんでした。
>>570 ポインタ等は理解していないので使いたく無いんです(ので逃げていました)。
これを機会に勉強します。
ありがとうございました。
>>568 char * s = "abcdefg";
char dst[4];
sprintf(dst, "%.3s", s + 2);
char * s = "abcdefg";
char dst[4];
sscanf(s, "%*2s%3s", dst);
strtok()版もやろうかとちょっとだけ思った。
C言語を勉強できるフリーソフトでオススメなのはありますか? ちなみに授業ではBCCというのを使ってます。
BCC か GCC
.NET Framework開発ツールでCコンパイラも落とせる
てか、授業で BCC 使うんなら、 BCC 使ったんでええんでないかい? エラー・警告メッセージも同じだし。
BCCっててっきり製品かと思ってたらフリーだったんですね・・・ お騒がせしました。
コンパイラだけならね。 >フリー 開発環境込みだと有料。 ただ、フリーの開発環境もある(検索すればすぐ出てくる)。
まだ入門書の1章とかなんで
とりあえず計算結果を表示できればいいんで
開発環境とかはさっぱりです。がとりあえず
>>581 も
見てみます。ありがとうございました。
>573 Cはポインタが命 逃げ切れないよ
>>583 というか、{ } 付きでも通るということに衝撃を受けた。
その間違いは、それはそれで糧になった。
まあ、何かのトリッキーなマクロくらいでしか使えそうにないけど。
本格的に学ぶためには次にどんなことを学べばいいでしょうか? やはりVisual C++などでWindowsのプログラミングを勉強したほうがよろしいでしょうか?
>>586 Linuxをインストールして基本的なコマンドのソースを読むんだ
>>587 それはダメだ
基本的ではないコマンドのコードを読むべき
lsとか面倒くさい
>>586 あるオープンソースプログラムのクローン(ソースを見ずに独力で複製)を作って、
その後にソースを見比べてみる。
>>587-589 grepのソース(コードとの違いはわかりません?)を見たんですが、
難しいですね。易きを求めてもキリが無いので、がっつり打ち込んでみます。
ところで何かお勧めのオープンソースプログラムはあるでしょうか?
>>571 それは、末尾が\0終端されないという致命的な欠陥がある
>>590 grep は正規表現だから、ちと難しいかも。
ワイルドカード程度なら簡単なんだけどね。
それでも頑張ってみるのもいいことだけど。
>ソース(コードとの違いはわかりません?)
コードの方が少し意味が広いけど、
文脈が同じなら、違いはない、筈。
>>592 ついでなのでかじる程度にしか知らない正規表現も勉強したいと思います。
>>593 「Cの学習に打ち込む」の意です。
最初はmvとかcpとかの方が取っつきやすいと思うな
596 :
デフォルトの名無しさん :2005/09/09(金) 21:43:25
あるアドレスの中身を直接参照したいのですがどうすればいいですか?
char *p = (char *)0xdeadbeaf; とかそんな感じか?
598 :
デフォルトの名無しさん :2005/09/09(金) 22:07:10
599 :
デフォルトの名無しさん :2005/09/09(金) 22:08:53
600 :
540 :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したときにメモリ使用量がきちんと元に戻ったのでもうわけがわかりません。
メモリをOSに戻すか戻さないかは、malloc や free の実装者次第。 だから、仮に free がOSにメモリを戻さないような ことがあっても問題なく動くコードを書くようにするのが C使いの常識。 というか、malloc と free は本来そうやって使うためのもの。 よく世間で見られる malloc の後に free を呼び忘れないことに 血眼になっている奴等は、例えるならば フェラーリで下町の路地を無理矢理通り抜けようとして 車体に傷がつかないように必死になっているようなもの。 正に馬鹿としかいいようがない。
足立区のアパートにとまってたフェラーリ思い出したがな
>>602 二段落目と三段落目とのつながりが無いわけだが
↓free on exit開始
exit(1);
607 :
デフォルトの名無しさん :2005/09/09(金) 23:17:31
プログラムのの書き方ですが、約1000行のプログラムの場合 みなさんはどんな風に分けていますか? 僕の場合はメイン関数は基本的に関数を呼ぶだけで、 メイン関数への戻り値によって処理終了するか続行するかを決める処理なんですけど、 どうでしょうか? 関数内でエラーが発生したらそこから終了させてしまった方が見易いですか? また、簡単な処理ならメイン関数に書くべきですか?
>>607 それはC言語の話題ではない。
つ[プログラム設計方法論]
>>604 mallc/freeに頼らずに自分でメモリ管理するべきということでしょ。
愚の骨頂
そして時代は繰り返される 〜malloc/free〜
612 :
デフォルトの名無しさん :2005/09/10(土) 01:45:55
関数テーブルについて教えてもらいたいです。 typedef (*Matrix)(int ret); Matrix matrix[] [10]={ {step_cnt, (関数名)..., ..., ..., ..., ..., ..., ..., ..., ...., }. {other, (関数名..., ..., ..., ..., ..., ..., ..., ..., ..., } }; のような形を使いたいのですが、調べたのですが全然わかりませんでした。 宣言の仕方、テーブルを呼び出す関数の作り方、渡す先の関数の作り方を 教えてもらいたいです。
>>612 宣言はそれでいいはず。
呼び出すときはmatrix[0][0](0)のようにする。
開けたら閉める
>607 同じコーディングスタイル。 main以外ではexitしない方がいい。
必要もないのにエラーを上位に伝播させても無駄なだけ
Cならlongjmpという手も
終了処理がなければな。
>602 アホ 関数などの機能分割する意味が理解できていないのと リソース解放の必要性が全く分かってない。 初心者が多い場所で602ワールドの常識をC使いの常識などと 吹聴するのはやめていただこうか。
>616 必要があるように上位に伝播させているんだよ。 mainまで戻るのは終了させる必要がからじゃないの。
エラー報告して終了するタイプのプログラムなら別にどこで終わっても良いと思うが、 途中の経路でリソース開放が重要なら関数が全部エラー返すようにするのが無難。 エラーしても継続して動作するアプリなら、607氏が悩んでる状況にそもそもならないと思う。
>>607 void *xmalloc(size_t n)
{
void *p = malloc(n);
if (!p) { perror("malloc"); exit(2); }
return p;
}
みたいなの(要するに呼び出し側に制御を戻すとは限らない関数)を
使うのは珍しいことじゃない。
こういうのが使えるかどうかはプログラムの性質による。
「使える」場合には、当然使ったほうエラー処理が単純になり楽になる。
場合によってはatexit()やsetjmp()、apacheのようなプール管理方式の
使用なども検討しましょう。
要するに例外のないCは糞ってことだ
いや、例外くらい自分で実装しろって事
いっそCよりも制約のゆるいコンパイル言語ってないもんかねえ? 関数外へのジャンプやスタックポインタの明示的な操作もやり放題で。 各CPUへのコンパイラさえあれば、素のマシンコードへ無難に翻訳してくれるような。
うるせえボケ
627 :
デフォルトの名無しさん :2005/09/10(土) 14:00:40
C言語をはじめたばかりであまりわからないのですが、 ピットシフトはなんの役に立つのでしょうか?
デジャヴ?
>>628 俺も一瞬そう思ったけど、良く見ると「ピ」ットだぜ
627=629=631
お、おれ?
ワロタ
C言語をはじめたばかりであまりわからないのですが、 C言語厨はなんの役に立つのでしょうか?
634 :
デフォルトの名無しさん :2005/09/10(土) 14:42:40
MACにC言語コンパイラってありますか?
635 :
612 :2005/09/10(土) 15:40:23
>>613 matrix[y軸][x軸]();
としたいのですが、y軸をグローバル変数で宣言していて、
x軸をパラメータとして、この関数テーブルに渡したいのですが、その時は
void call_matrix(int *rec_info)
{
matrix[グローバル変数][*rec_info]();
}
の形でいいんでしょうか?
また、呼び出した先の関数に値やアドレスを渡さない時には
呼び出す先の関数は
void func(void)
{
...
}
でいいでしょうか?
>>635 matrixにしまうのならMatrix型に合うようにint func(int)にしろ。
if( ptr ) で、ptrがぬるぽだったら偽と評価されるの?
>>634 OSXならgccが使える。
Appleのサイトで開発環境を無料で入手可能。
>>639 開発環境は OS X についてきてる筈。
ただ、そのままではインストールされず、
Development Tools って CD が付いてきてるから、
それからインストールする。
642 :
名無しさん@そうだ選挙に行こう :2005/09/10(土) 18:37:41
>>640 親切におしえていいただき、ありがたいのですが...
MACOS9なんです。最初にいうべきでしたね...
OS9対応でC言語のコンパイラはありませんか?
旧Macはコマンドラインがないというなかなか学習大変な環境だよな
#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とか)を入力すると、 「文字を入力してください: 文字を入力してください: 」 となります なぜ、こうなるのでしょうか? また、「文字を入力してください: 」のみを表示することは可能でしょうか?
>>645 実際は「a〜z 以外の文字」と改行で2文字入力されるから。
期待しない文字だった場合は fflush(stdin) するようにすればいいかな?
ファイル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がデータ無し の状態にクリアされてしまいます(当然ですが)。 どのような方法を取れば良いでしょうか?
>>646 >>647 改行も処理されるんですね…orz
fflush(stdin)は便利なので、使っていきたいと思います
どうもありがとうございました
>>646 ,650
入力バッファのフラッシュによる動作は一般に未定義。よって、
fflush(stdin)はあなた方の環境では偶然期待通りに動いているだけ。
ISO/IEC 9899:1999 7.19.5.2 The fflush function -2
652 :
648 :2005/09/10(土) 19:57:49
>>649 そ、そうですね。
AをCにコピー
fr = fopen(PathC, "r");
fr2 = fopen(PathB, "r");
fw = fopen(PathA, "w");
とすれば出来ました。お恥ずかしい。
ありがとうございます。
655 :
646 :2005/09/10(土) 20:22:39
656 :
612 :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つの要素を連結して、表現してみました。 そこでお教えいただきたいのですが、このような問題に対する、お勧めのサイトとか、 アルゴリズムとか、データ構造などに関して、何でも良いので情報をご存知の方 おられましたらアドバイスお願いします。 よろしく。
>>657 画像処理スレや宿題スレがあるじゃないか
数学を基礎から勉強 まず、そんな効率の悪い方法でやろうとするな
初心者です。 独習Cと言う本を買ったけど、コンパイルできなかった。 icrosoft.NET Framework SDKを使用する場合は、コンパイラがコマンドベースなので、 まずメモ帳などのテキストエディタでプログラム用のファイルを作成し保存します。 続いてXPではコマンドプロンプトウィンドウを開いてください。 ソースファイルを保存したディレクトリに移動して、次のコマンドを入力します。 c1 test.c これでプログラムを実行することができます。次のコマンドを入力してください。 test.exe と書いてあるんですけど、4行目からわからないです。 c1 test.cコマンドをはどこに入力するんでしょうか。 本当に素人くさい質問ですみません。
とっととPC初心者板で揉まれてこい
>>660 初心者に質問する権利は(慣例上)無い。
663 :
名無しさん@そうだ選挙に行こう :2005/09/10(土) 21:21:27
寒いところ
>>660 c1じゃなくてcl(シーエル)
コマンドプロンプトはスタートメニューのプログラムのアクセサリの中にある。
666 :
660 :2005/09/10(土) 21:30:14
>>665 助言ありがとうございます。
入力したら「ソースファイルを開けません」と出ました。
どうしたらいいでしょうか。
ゆとり教育世代?
まぁそういわずに。
間も無く
>>665 によるwindows講座が始まります。お楽しみに。
672 :
名無しさん@そうだ選挙に行こう :2005/09/10(土) 22:18:00
ところでicrosoft.NETって初耳なんだが、いったいなんだ?
こりゃあ完全に釣りだな。
>>666 clの前に「cd ソースのあるディレクトリ」
675 :
名無しさん@そうだ選挙に行こう :2005/09/10(土) 22:44:40
すいません。 初心者ですが デバイスを解放せずにプログラムを終了させると どうなるんですか?
最近の若い者(モン)はDOSも(ry
677 :
675 :2005/09/10(土) 22:51:25
次からそのデバイスが使用できなくしまうと どこかの解説サイトにあったんですが・・・
スレタイも読めないバカが多発中
>>679 バイトならfread(buf, 1, 1, fp)だよ
>>680 ありがとうございます。
早速、取り掛かってみます。
>>681 すみませんでした。
できるだけ良いコードを書けるようにがんばります。
C言語で作ったライブラリを呼ぶデモを行うため,GUIでデモ用のアプリケーションを作りたいと 思っています.C言語でGUIを作った場合,入力データの受け渡しは簡単だと思うのですが, GUIを作るのが面倒だと思います.一方,tcl/tkみたいなスクリプトでGUIを作った場合, GUIは簡単に作れるかわりに,データの受け渡しが面倒だと思います. 開発環境はwindows+cygwinなので,visual studio系は使えません.このような状況で 最も簡単なGUIアプリの作り方はどのような方法が考えられますか?
686 :
名無しさん@そうだ選挙に行こう :2005/09/11(日) 07:36:46
688 :
名無しさん@そうだ選挙に行こう :2005/09/11(日) 11:57:07
宿題は専門の別スレあるってかいてあるけどスレ名なんていう名前ですか?
689 :
名無しさん@そうだ選挙に行こう :2005/09/11(日) 12:09:14
atta
>688 まず2chブラウザを入れろ そうしたらスレ一覧から宿題で検索。 おまえの評価はCだ
int (*pfunc)(void *); pfunc = NULL; これって合法?
ポインタにNULL入れちゃいけないなんて決まりないでしょ。 そこを参照しちゃ駄目だったと思うけど。
カンチガイしてた。ありがと。 やっちゃいかんのは int func(void *arg) { /* ... */ } void *pfunc = func; だな。
1:int *pfunc = func; 2:void (*pfunc)() = func; 3:int (*pfunc)() = func;
キャストすれば可能だがな。
>>692-693 NULLがこう定義されているとアウト。
#define NULL (void *)0
オブジェクトへのポインタを関数へのポインタに変換するのは処理系依存か何か。
>>697 >オブジェクトへのポインタを関数へのポインタに変換するのは……
空ポインタの場合はキャストによる型変換が許されている => JISX3010 6.3.2.3
さらに空ポインタ定数の場合は自動的に型変換される => JISX3010 6.5.16.1
それ以外は未定義
>>699 ヌルポインタに対する特例は前からあるよ
ポインタのポインタのポインタのポインタ いやあああああああああああああ
>>701 そこまで行くと一度設計を見直したほうがいいような気がする。
703 :
名無しさん@そうだ選挙に行こう :2005/09/11(日) 21:54:41
ヌポポポポポッ
ポインタの指す構造体のメンバの ポインタの指す構造体のメンバの ポインタの指す構造体のメンバの ポインタの指す構造体のメンバの ・・・・orz・・・・
ツリー構造表現すりゃそうなる罠 別に悪いことじゃない
>>702 Cならありえるしtypedefで隠すことだって出来る
まあ設計の見直しは大切だな
流石に4重ポインタとなると、 多重配列を動的に確保する時にしか 使いどころがない気がする。
ポインタをいっぱい使うとエライ人に褒められるからな
>>708 それは「エライ」人だな。
「イタイ」人とも言う。
ポインタいっぱい使うようなものなら 最初からC++で書けばいいのに
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回出てくる理由がわかりません。 御教授ください。
>>711 最後のprintfからcounterは乗算・除算を行った回数を計測するようだ。
forの条件式でprime[i] * prime[i]を行っているので、ここで1回。
その次、no % prime[i]も除算なので、ここでも1回。
別におかしくもなんともないな。
>>712 理解できました!
ありがとうございます。
714 :
デフォルトの名無しさん :2005/09/12(月) 17:18:43
int var = 12345; として fscanf(fp, "%d", &var); が失敗(EOFか0が返る?)した場合、var の内容は 12345 のままですか?
です
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 が真なのはどの環境でも同じですよね?
>>716 ひょっとしてそれはギャグでやってるのか!?
関数テーブルについて自分で何も調べないで質問してるとしか思えない!
>>717 同じではあるけど、括弧つけといた方が読みやすい。
720 :
デフォルトの名無しさん :2005/09/12(月) 17:50:24
>>716 配列cは関数ポインタの関数でなければならない。
関数ポインタの書き方をもう一度良く調べろ。
722 :
721 :2005/09/12(月) 18:08:01
ミスった ×関数ポインタの関数 ○関数ポインタの配列
int (*manko[])(int) = {unko,tinko};
>>721 別にintでも大丈夫だよ
呼び出すときに関数のポインタへキャストすれば
ただしintがポインタを表現できる幅を満たしてないとだめだけど
あふぉ
せめてvoid* にしとけよ。
汎用パラメータとして int に何でもかんでも渡すということはするね。
>>727 MS-DOSや64bitマシンでは通用しない技
729 :
デフォルトの名無しさん :2005/09/12(月) 20:04:43
>>723 分かりました、unko と tinko がピンポイントで manko に入っているんですね!
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で定義されています!
>>728 ・MS-DOS
near ポインタになら使えるんじゃ?
far ポインタも間接的になら渡せなくもないが、
long にした方がスマートか?
・64ビット機
32ビット互換モードで動いてたら問題ない。
あと、int が 64 ビットなら使える(普通は 32 ビットみたいだが)。
これも long にすればいいか。
というか、普通は typedef だな。
LPARAM とか代表的な利用例。
LPARAMとか代表的なアンチパターン
win32apiのキチガイじみたtypedef・・・
むしろ#defineの方がちょっとおかしいと思う
このスレとしてはintptr_tやuintptr_tだろ。
#define tinko "houkei"
#define ore "yousei"
Windows は C 言語のためのものじゃないし。
元々Pascalで書かれてたしな。
>>739 は?それMacOSとかの話じゃなくて?
>>739 ホント?スレ違いなんで誘導かソースキボン
739=16bitのstdcallが無い時代に呼び出し形式がpascalだったのを勘違いしてる厨
Mac は昔 Pascal だったよな。確か。
C言語厨にとっては、Pascalは敵だろ? 確か教祖様が死ぬほど嫌ってたはずだ。 C言語より論理的で美しいから・・・
Pascalって教育用にしか使われない言語なんでしょ?
最近じゃ、その地位すらなくなりつつあるがな
それでも愛用の2chブラウザはDelphi製
大学でPascal、独学でCやってるが、Pascalなんて糞
あのな…もうそろそろ、どの言語が一番か、なんていうのから卒業しろよ。 PascalもCも細部は違うにしろ、似たような言語だろ。 文法レベルでは大した違いはない。 同じアルゴリズムを書くにしてもそれほど大きな違いはないし、 違いがあるとすればソフトウェア工学的な見地からだろう。
>>749 んー、なんていうか、俺にはそういうお前が一番そういう、どの言語が一番かって
いうことにこだわっているように見えるんだよね。
(10代しゃべり場風に)
真剣しゃべり場って、議題を定義しないで議論するから答えなんざ 出るわけないんだよな。 前見てびびったのが、「社会で勝ち組みになる事は大切か?」だった んだけど、「勝ち組み」の定義が為されてないのに、いい歳ぶっこいた 高校生が真面目に話してたこと。おまえらアホかと。 勝ち組み=金を稼ぐこと、勝ち組み=権力を得ること、とでも定義すれ ば、ゲイツ、ブッシュって答えすぐ出るのにね。 そこをNHKに突っ込まないでモルモットのように話してる厨房は一回 死になさいってこった。
このスレでそんな事語ってるお前がアホ
ここにいる奴らって大体Cマンセーだろ 俺もだけど
違うよ
お前はその大体の内に入ってないんだろw
マンセーというか、プログラマとしての教養の一つだろ > C C信者とかっているのか?
オブジェクト指向に挫折した人とか デバドラ/組み込み系でC言語しか使ってない人とか ・・・違うか。
http://cruel.org/freeware/hacker.html もしコンピュータ言語をなにも知らないなら、まず Python から始めることをおすすめします。
設計がきれいだし、ドキュメントもしっかりしているし、初心者にもそこそことっつきやすくできています。
Java もプログラミングを学ぶにはよい言語です。 Python よりはむずかしいですが、できるコードは Python より高速です。
二番目の言語としてはとてもすぐれていると思います
本気でプログラミングをするなら、C を勉強するしかありません。これは Unix の中核となる言語です。
C++ は C と密接な関係にあります。片方を知っていれば、もう片方を学ぶのはそんなにむずかしくありません。
が、どっちも真っ先に勉強しようとするのには向いた代物ではありません。
嘘こけ
ツッコミどころが多すぎて、ツッコむ気も失せるな。
所詮、高級アセンブラだからな...俺もCは初心者には難しいと思う。
Cから始めるとC以外全否定厨になっちゃう良い見本
763 :
デフォルトの名無しさん :2005/09/13(火) 16:55:19
卒論で全文検索システムをつくろうとおもっているんですが、参考資料が足りません。。 エーホ・コラシックや特徴ベクトル法のC、C++によるソースがのってる本、ホームページなど、参考になりそうな資料あったら おしえてくださいm(−−)m 少しスレとずれてるかも(・・;)
765 :
デフォルトの名無しさん :2005/09/13(火) 17:12:25
>758 最近またCが見直されてますよね? 本屋ではJavaとCが本棚を圧倒しています。 (Java > C だが…また、コンピュータ言語の棚自体は エクセルやワードなどに圧倒されてはいるが…) 他はVB、C++、C#がちょろちょろ、Ruby、Perl、Shell が「ほんの」少しってところでしょうか? 大都市「近郊の」本屋では、の話ですが… (姶良郡?…)
いい加減言語の比較・勧誘はウザいんだが。
プロが使ってる言語だから入門者も覚えろ、なんて乱暴な理屈だ
C++はバイナリでかいから嫌
実装依存
STLつかうと一気に実行ファイルサイズが10倍に?!
プログラミングより日本語とExcel マジおすすめ
VBA ということか?
まぁたしかに一つの選択肢ではあるんだよな。 某マンガ誌のイラストパズル解きたさにVBAで組んだ香具師もいることだし。 尤も、形から入りたい日本人にとっては「プログラムしている」気分がしなくてだめらしいが。
スクリプトが流行らない理由はそこか アメリカはトップダウンだから手段より目的重視だしな 日本人は目的はともかく手段を持ちたがる ここで一句 プログラム 覚える頃には ニートかな
C言語の話をやれや
断る。
ならば氏ね
切腹!
そこでビットシフトの登場ですよ。
ビットシフトはもう秋田
ならば趣向を変えてビットマスクで。
まだ山形かと思ってたが
783 :
デフォルトの名無しさん :2005/09/13(火) 21:21:39
ちょっと質問させてください fopenをr+で開いたときに <TABLE WIDTH=9> を <TABLE WIDTH=90> に書き換えたとしよう すると一文字多くなるので、次の行の最初の1文字が上書きされて消えてしまいます 文字の上に上書きじゃなくインサートさせたいときはどうすればよかか?
784 :
783 :2005/09/13(火) 21:24:16
わかり易く書くとこんな感じです (書き換え前) <TABLE WIDTH=9>\n <TD>\n (書き換え後) <TABLE WIDTH=90>\n TD>\n
C言語って、文法が小汚い。特に宣言とか・・・ よくこんなのが普及したものだ・・・
>>786 とても正しい答え方ですね。感服しました
質問です。 #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の結果が違うのはなぜでしょうか?
>>788 *argvは1つ間接参照している。argv[0]と同じ。
argvと&argv[0]は同じことで、間接参照を全くしていない。
*argvはargv[0]といっしょって言えばわかるかなぁ・・・。
>>783 9 以降のファイルの内容を全部メモリに読み込んで、
0 以降を全部書き込みなおすか、
別ファイルに 0 込みで書き込んでリネーム。
後者を勧める。
>>789-790 printf("%p\n", *argv)はポインタargvに代入されている値(アドレス値)を出力しているということでしょうか?
>>792 その文章は正しいが、お前が理解しているようには思えない。
ついでにargvはchar **だからprintf("%s", *argv);は有効。
何でそう思うんだろ *argvって書いてあるんだから *argv に代入されている値に決まってるじゃん
すいません、最近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); } 本当に分からないので、どなたかよろしくお願いします。
×na % nb ○100*na/nb
>>796 あぁっ!本当だ!!
こんなくだらない質問に答えてくれてありがとうございましたm(_ _)m
助かりました。
わかってるとは思うけど、演算子の%は剰余算(余りの計算)な。
>>793 後半は参照されたポインタの持つアドレス値を先頭とする文字列が出てくるということですね。
>>794 理解不足のためくだらない質問をしてすいません。
もうひとつ質問させてください。
>>792 のソースをコンパイルしたプログラムをa.exeとして、
コマンドラインで
>a.exe b c
と実行したとき、"a.exe","b","c"はそれぞれ文字列としてメモリのどこかの配置されるわけですが、
このとき上の3つの文字列の先頭文字のアドレスは、あるchar型ポインタの配列に代入されると説明されていました。
この配列名は何なんでしょうか?
>>800 argvはchar型ポインタへのポインタとして宣言されていたのに、
なぜargvが配列名としてつかえるんでしょうか?
*argv[]
*(argv+1) == argv[1]
<アドレス(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'
乙!>804
アドレスの具体的な値は環境によって変化するので注意。
>>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
STLスレに投げたんだけど、レスがつかなかったんでマルチなんだけど VC6の bitset ってバグ有り? bitset<32> bsVal(0xFFFFFFFF); cout << bsVal[0]; // 結果:12FEC4 cout << bsVal.test(0); // 結果:1 Borland C++ 5.5.1 では、問題なし
正直ポインタは便利な配列としてしか理解してない
恐ろしい子!
>>807 > と実行された時点で、a.exe、a、bにがメモリに配置され、
> その先頭の文字のアドレス('a'、'b'、'c'のアドレス)が
> argv[0]、argv[1]、argv[2]に代入されるということでよろしいでしょうか?
うむ、そこら辺の処理はスタートアップルーチンがやってくれる。
816 :
初心者 :2005/09/14(水) 17:48:17
Compatible って読むときどこで区切ればいいんですか? 教えてください。
アホか。辞書見ろ。
820 :
C勉強中 :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 ); }
821 :
C勉強中 :2005/09/14(水) 18:12:07
↑このプログラムがよくわかりません。ここでつかわれてるポインタの意味は どういうものなのでしょうか?詳しい方おしえてください おねがいします。
>>821 ymbで変更されたら、mainでもその変更された値を使いたいから
変数の型の制約が厳しい言語とかいちいちコンパイルが 必要な言語って気軽にプログラム作れないからつまんない。
で?
>>823 簡単にコンパイルが通るようなコンパイラは恐くて使えない
>>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);
}
こうなら多少意味があると思うけど...これは意味が無いような気がする
#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 ); } } エラトステネスのふるいのプログラムなんですけどアルゴリズムってどのような感じになるでしょうか?
エラトステネスのふるいでググれ。
829 :
デフォルトの名無しさん :2005/09/14(水) 19:12:18
9月から学校でC言語プログラミングの授業が 始まったのですが難しくてついていけません。 基礎を教えてもらえないでしょうか?
>>829 >>1 >まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
~~~~~
ここは質問スレであって教室スレでも輪講スレでもない。
輪姦スレでもない。
何か HP でも見つけてみれ。
>>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."); とか延々書いてるようなスタイルをあみだしたんですが、これってうざいですか?
何で2つのマクロに分けてるの?
ああ、分かった分かった。ごめん。俺が浅はかだった。 別にいいんじゃないかと思うけど、case hoge: はちょっと美しくないかな。 配列を渡すようにして、for で判定するとか。
838 :
デフォルトの名無しさん :2005/09/14(水) 22:07:53
>>830 すいません。
自分でHP探して勉強します・・・
>>811 あっちでもスレ違いだっつっただろうが。間抜け。
>>835 代入する変数XXごとに、GETXX マクロを作る必要があるのか?
なあ、なあ。 上手なデバッグプリント文とかデバッグマクロとかおせーて。
842 :
デフォルトの名無しさん :2005/09/14(水) 23:18:29
844 :
デフォルトの名無しさん :2005/09/15(木) 00:00:56
#define HOGE 5 char hoge[HOGE]; hogeと&hoge[0]が等しいのはわかるが memset( &hoge, 0, sizeof(hoge) ); と書いた場合の挙動(hogeの中身)はどうなります? コンパイラ gcc3.2くらいかな
&hoge 番地のメモリデータを破壊するか、アクセス違反で止まる。
>>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) ); は望むとおりの挙動を示す。
細かいこと言うと、配列へのポインタ変数に代入できるかどうかとか、 他にも影響ある点があるがキニシナイ! 今回の話では、この2点が分かってれば十分だ。
>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
#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は作れますか?
C言語で作られています
わろたwwwwwwwwwwwww
すみません質問です。 おにぎりとおむすびの違いって何ですか?
調子に乗るなよ小僧
おにぎりは三角、おむすびは俵
俵は関西だけ
おにぎりは実体の型、おむすびはおにぎりのtypedef
おにぎりは握り飯のtypedef
昔、小学生のころ、そのときに持ってた辞書を引いたら おにぎり → おむすび おむすび → おにぎり て無限ループになってたな
大人って汚いよな
辞書によるとどちらも握り飯の意。 おにぎりが女性語とのこと。
ふざけんな!
>>841 if(TraceLevel() >= TRACE_LEVEL_ERROR) TraceWriteLine("エラーが出たぞ");
みたいな感じにしてTraceLevel()の値はINIファイルから呼び出して
同一バイナリでログ吐いたり吐かなかったりできるようにしてる。
JavaのLog4jとか.NETのTraceあたりを参考にしてみたら。
>>839 まぁ、どこのスレがスレ違いじゃないか、間抜けには誘導すらできないだろうけどな
自分の使ってる開発環境名で検索もできない人かね?
869 :
デフォルトの名無しさん :2005/09/15(木) 11:55:52
質問なのですが。 int a[34][4] = { { 1,1,1,1}, { 2,2,2,2}, //以下略 }; 初期化子が多すぎるとエラーが出るのですが,こういう場合どう直せばよいでしょうか?
ファイルから読むようにすれば?
数が合ってないんじゃない? とりあえずintの前にstaticつけてみれば
つか、 >エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。
>>870 さん
素早いレス、ありがとうございます
その案でちょっとやってみたいと思います。
>>873 その案は意味のある解決策ではない。
ちゃんとエラーメッセージを理解できないかぎり何も無駄。
なので
>>1 を理解して、勉強しなおすか、初心者スレにでも逝け。
(正確にエラーメッセージを引用する知恵ぐらいつければいいのに。
C言語以前にプログラムの考え方も不足してるのだろうけど…)
(本当に「初期化子が多すぎる」エラーなら、初期化子を適切な数にするか、
配列を必要な数の初期化子を格納できる大きさにするかだろうけど)
>>870 ,871
あほが無駄なレスつけるなよ…
サイズもデータもそのままで、 ファイルから読み込むようにすると、 バッファオーバーランして危険だね。
>>869 int a[100][4] = {
{ 1,1,1,1},
{ 2,2,2,2},
//以下略
};
これに直して通ったら、[34]があってない
>>869 int a[][4] = {
{ 1,1,1,1},
{ 2,2,2,2},
//以下略
};
[34]は、省略できる
>>877 俺もそれ書こうと思ったんだが、
34 という数値に大きな意味があれば、
34 と書いておいた方が
サイズチェックしてくれるのでいいと思った。
省略せずに書けば解決するのに
少なくとも
>>874 を読んで解決するとは思えないのだが
charのstrをchar*のstr_pに入れたいのですが = では駄目なようです どうすればいいのでしょうか? char str; str = 'a'; char* str_p; str_p = str;//×
>>881 何をしたいのか知らんが、初心者質問スレに行くか日本語の勉強をしてくれ。
&str
これでいいんじゃね string str; str = 'a'; char* str_p; str_p = &str;
入れたところで '\0' 終端がないから、文字列にはならんな。
ありがとうございます。
>>885 で解決することができました
まだポインタの理解が足りていないのでもう少し勉強してみます
文字列にするんでなければ解決するんだろうけどな。
だから、質問の中の問題点さえ気がつかない連中が、 もっともらしく表面的な回答だけするなと。 喋りたきゃ初心者スレでしたり顔が答えて叩かれてろと。
答えの精度は質問の精度に依存する
表面的な回答をしてる人は、 単なる嫌がらせのようなことをしてるだけ。 たまに天然も居るのかもしれんが。
表面的な質問には表面的な回答しかできないと思われ
皮肉にしか見えないが。 891は随分素直なんだな。
だから、そういう天然まがいのつもりのマヌケは本当にアホなんだから よそで遊んでろ、と言われてるんだろうに、ずいぶん天然なんだな。
言われてるんだろうに、じゃなく、君が言ってるんでしょw
初心者スレもネタスレじゃないと思うんだが、そこに誘導してどうする。
推理小説かなんかだと思って回答しろよ 限られたヒントの中から問題を推測して正解を導くのは 結構面白いぞ
まあ、精度の低い質問しても、こうやって遊ばれるだけだっていう教訓だな。
で、「表面的」でない回答の例は無いの?
どーでもいいよ、そんなこと。
>891がすばらしいレスを付けるから黙って待っていなさい。
どーでもいいよ、あんなやつ。 VIP ででも遊んでろ。
>>904 そんなこと言ってると奴らが巣から出てくるぞ・・・w
char str[] = "a";
>>906 お前こんなところで質問してる場合じゃないぞ。
ともかく先に本一冊通して嫁。
読むだけじゃダメだな。 色々テストプログラム組んで、仕様を体で理解しないと。
仕様が理解できないの? しょうがないなぁ
華麗にスルー
912 :
C勉強中 :2005/09/15(木) 17:08:22
#include <stdio.h> main ( ) { char *str[ ] = {"hogebaka"}; printf("%s\n",str); printf("%c", *(str+4)); return 0; }
913 :
C勉強中 :2005/09/15(木) 17:09:16
↑基本的なことですいません。このプログラムを実行したら、文字化けして しまいました。どこがおかしいんでしょうか?おしえてください。 おねがいします。
ァ ∧_∧ ァ,、 ,、'` ( ´∀`) ,、'` '` ( ⊃ ⊂) '`
>>913 char str[ ] = {"hogebaka"};
約1週間前に指摘したのをもう忘れている池沼なのか それとも、たまたま同じ名前の別人がたまたま同じ質問をしたのか
ネタだろw
919 :
デフォルトの名無しさん :2005/09/15(木) 17:54:42
どう思われるでしょうか? C言語は人間の思考との距離感が 良いんじゃないでしょうかねぇ? すぐ目的に達しないところというか 一旦マシーンよりに思考を変換しないと 上手なプログラムが作れないところが 魅力だと考えますが。
馬鹿の質問をみて不愉快になる人間は、 この手の質問スレは見ないほうがいいぞw
char str[] = "HogeBar"; こう書くヤツむかつく。 char str[] = {"HogeBar"}; こう書くべき。 char *str = "HogeBar"; これならいいけどね。
>>922 ツッコむ気も失せるわ、この田吾作がァ!
このスレ始めてきたC言語初心者なんだが プログラミング言語C(通称 K&R) って本はC言語初心者でも大丈夫なのか?
禁断のコーディング論争をしようというのか? while(1) {} // 無限ループをこう書く奴むかつく for(;;) {} // これならいいけどね
読めないことはないけど、例題とかの回答が出ているわけでもないから ちょっと試そうとしてもさっぱり分からない、というケースは多いだろう。 中身はしっかり書いてあるけど、まったくの初心者に理解を 求めるのはちょっと酷かもしれない。もっと初心者向きのやさしい 本で勉強してCをマスターしてから読み直すと感銘を受けるだろう。 つまりは、そういう本であるということだ。これからCを続けるつもりなら 買っておいても損はないと思うぞ。今は分からなくても読みこなせるような 力が伴って来たらK&Rから多くのことを学べるだろう。
別に感銘なぞ受けないな
930 :
デフォルトの名無しさん :2005/09/15(木) 19:40:28
>924 >プログラミング言語C(通称 K&R) >って本は 良いよね。ホント。
931 :
デフォルトの名無しさん :2005/09/15(木) 19:43:17
>928 >Cを続けるつもりなら C以外の言語をやる場合でも、だよね?
い と し の 強 は お っ
WEBでC言語の問題集ない?
J('ー`)し
お勉強で感銘とか受けたくないしw
なら藻前は何に感銘受けるんだ?w
おまんこ
香ばしくなってまいりました
ァ ∧_∧ ァ,、 ,、'` ( ´∀`) ,、'` '` ( ⊃ ⊂) '`
943 :
デフォルトの名無しさん :2005/09/15(木) 22:19:45
おまいらのやりとり見てて面白い
>>944 次の目標を見つける事が次へのステップだ
な、なんだってー!?
ちょっとしたテキストのコンバートツールを作成しているのですが、 例えば"100%"という文字列を読み込んでそのまま書き込むと なぜか'%'だけが書き込まれないという問題が発生しています。 '%%'と続けて書くと'%'が1文字書き込まれることが分かったので、 しかたなくその変換も組み込んだのですが、 これはそういう仕様になっているのでしょうか? 読み込みはfgets関数、書き込みはfprintf関数を使用しています。
ちんでください
949 :
947 :2005/09/16(金) 00:16:03
すいません、書き込みボタンを押した瞬間に気付きましたが、 fprintf( file, str ); としてました・・・。 fprintf( file, "%s", str ); で無事に書き込めました。orz
Cって値渡ししかできないから配列とかを引数として渡したいときもアドレスを使ったりするんでしょうか?
配列のみの構造体を使えば値渡しできるが、 はっきり言って無駄なので、普通はそんなことしない。
大変申し訳ありませんが、上手くぐぐる事ができず、手元にコンパイラと デバッガが無いので、教えて下さい。 unsigned long と、unsinged long longの変数は、バイト空間では どのように格納されるのでしょうか。 なお、PCはIntel系CPU、OSはLinuxの場合です。 以上、よろしくお願いします。
インテル系CPUは、リトルエンディアン。 最初のバイトは256^0の位 次のバイトは256^1の位 その次のバイトは256^2の位 ・・・ ってな具合。
>>953 今やっている仕事で、unsigned long longの場合は、バイト順入れ替えを
行わなくてはいけないといわれていたので、何か特別なフォーマットなのかと
思ってしまっていました。なにか他の理由があるのですね。
どうも有難うございます。
>今やっている仕事で、unsigned long longの場合は、バイト順入れ替えを >行わなくてはいけないといわれていたので、何か特別なフォーマットなのかと >思ってしまっていました。 こういう情報を先に出さないのは質問下手ですよ。
956 :
952 :2005/09/16(金) 01:39:11
>955 それは、どうもすいませんでした。
単に話の文脈や条件、説明を勘違いしている可能性のほうが大きそうなんだが。
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] を作りたいのですが、どうするのが簡単で良い方法でしょうか? 簡単にスムージング(もどき)が出来るアルゴリズムをご存知の方が 居られれば教えてください。
>アルゴリズムをご存知の方が居られれば教えてください スレタイ嫁