1 :
v(^o^i)d :
03/08/05 21:18
2 :
デフォルトの名無しさん :03/08/05 21:19
>1 もつカレ□
11 :
ビル・ジョブス :03/08/06 02:18
>965 char c, t; c = (t = rand()) % 25 + (t & 1 ? 'A': 'a'); じゃダメかな?
ひどいな
これはひどい
>>11 問い1 算術+のオペランドの評価順序を述べよ。
問い2 代入式の副作用完了点を示せ。
(sin(a))^2 + (cos(a))^2 の計算をさせたいんだが 浮動小数点の不正な使用と言われてコンパイルできない なんで? #include<math.h>はやってるし、double a もしてるのに(´・ω・`)ショボーン
(sin(a))^2 + (cos(a))^2 の代わりに 1.0 と書くといいよ
(sin(a))*(sin(a)) + (cos(a))*(cos(a)) にしたらできますた ^ って使えないんか?
18 :
デフォルトの名無しさん :03/08/06 09:12
使えない奴だな
20 :
デフォルトの名無しさん :03/08/06 09:20
>>17 それはシフト演算になっちゃうから無理なんじゃ?
うそ教えちゃいかんよ
& ビットごとの AND | ビットごとの OR ^ ビットごとの XOR ~ ビットごとの反転(1 の補数) << 左シフト >> 右シフト
レスがいっぱい!みんな叱咤激励ありがとう ^= a^=b; aとbの排他的論理和をaに代入する a=a^b ^ a=b^c; bとcの各ビット毎の排他的論理和をとり、その結果をaに代入する ということらしいですな よーわからんがw TeX感覚でついやってしまいますた
>>11 問い3 アルファベットの文字数を答えよ。
>>15 pow(sin(a),2)+pow(cos(a),2);
これではダメぽですか??
>>11 問い4 (t = rand()) % 25 の値域を示せ。
ギリシャ語は24文字
>11 問い5 c=='b'となる確率は幾らか。
>>29 まさかとは思うが、
0
という答えを期待しているわけじゃないよね?
ああ、アルファベットだから、%26に自動補正してたよ。%25か。
>>15 どうでもいいけど、常に1.0になるの関数呼ぶのか?
このようなやり方でaをbに コピーしようとしてるんだけどデキマヘン。 どうしたらよかですか・・? #include<stdio.h> void cpy(char *x,char *y); /* プロトタイプ */ int main(void) { char *a,b[30]; a="aiueo"; cpy(a,b); /* cpy関数呼び出し */ printf(b); return 0; } void cpy(char *x,char *y) { while(*x++ = *y++); /* ポインタを使ってaをbにコピー */ }
釣り? cpy(b,a)
35 :
デフォルトの名無しさん :03/08/06 13:08
釣り? while(*y++ = *x++);
36 :
デフォルトの名無しさん :03/08/06 13:11
printfの第一引数は定数にするのが鉄則だよん。。。
>>35 このように変化いたしました。
while((*x = *y)!='\0'{
x++;
y++;
}
↓
while((*x++ = *y++)!='\0');
↓
while(*x++ = *y++);
一番上のかっこが抜けました。 while((*x = *y)!='0'){ x++; y++; }
40 :
デフォルトの名無しさん :03/08/06 13:33
あ、ほんとだ・・。。 失敬いたしますたああああぁぁ、消。
うを!出来た・・。 ありがとんございましたm_m
38がどう直したかわからないが、 ほぼ同じことをする関数 char *strcpy(char *destination, const char *source); と、引数の順序をあわせておいたほうがいいよ。
>>43 >>33 の下から2行目の
while(*x++ = *y++); を
while(*y++ = *x++); という風にしただけでごんす。
&情報ありがとんです。
45 :
デフォルトの名無しさん :03/08/06 14:28
/* Practice3.c */ #include <stdio.h> int main(void) { int a; a = 90; printf("%dmin = %dh%dm\n", a, (a\60), (a%60)); return 0; } 90min = 1h30mって表示したいんですができません どうしたらいいか教えてください
47 :
デフォルトの名無しさん :03/08/06 14:32
48 :
デフォルトの名無しさん :03/08/06 14:34
>>47 (a\60)本に書いてありました。
(a\60)←なんなんですか?
a/60=1
>>48 一部のbasicの整数除算記号と勘違いしているのでは?
この場合は単純に a / 60 でOK。
キーボードで、スラッシュとバックスラッシュを打ち間違えたと見た。(・A・)
52 :
デフォルトの名無しさん :03/08/06 14:40
>>50 のやりかたでできた! 協力してくれたしと
ありがとう!
/|_ ┏━━━━━━━━━━━━━━━━━━━━━━━━━┓ / __/ ┃ ∧ ∧___ 今 日 は ┃( ( ̄ ┃ /(*゚ー゚)♪/\ ┃/) ∧ ∧ ∫ /| ̄∪∪ ̄|\/ こ こ ま で 学習し ま し た C<ニン (. *゚)━* .| |./ ┃ ∧∧ ∧∧ / ! ┃  ̄ ̄ ̄ ̄ 2ちゃんねる ┃ (,,゚ー゚) (゚ー゚*) ,,(_,,ノ ┗━━━━━━━━━━━━━━━━━━━━━━━━━┛〜(_,,ノ .(_,,)〜
system("dir"); 等で画面に表示された文字をファイルに書きこんだりchar型配列にコピーするには如何すれば良いんでしょうか?
>>54 環境によっては
popen()/pclose()、_popen()/_pclose()
が使えるかもしれない。
それ以上はスレ違いなので自分で調べられたし。
system("dir > filename.txt");としてから filename.txtを開く
57 :
デフォルトの名無しさん :03/08/06 18:28
/|_ ┏━━━━━━━━━━━━━━━━━━━━━━━━━┓ / __/ ┃ ∧ ∧___ 今 日 は ┃( ( ̄ ┃ /(*゚ー゚)♪/\ ┃/) ∧ ∧ ∫ /| ̄∪∪ ̄|\/ こ こ ま で 学習し ま し た C<ニン (. *゚)━* .| |./ ┃ ∧∧ ∧∧ / ! ┃  ̄ ̄ ̄ ̄ 2ちゃんねる ┃ (,,゚ー゚) (゚ー゚*) ,,(_,,ノ ┗━━━━━━━━━━━━━━━━━━━━━━━━━┛〜(_,,ノ .(_,,)〜
遅れてスマソ レスありがと
徹夜でやってたから寝ちまった...
>>26 (σ´∀`)σソレダ!!
関数で累乗の計算するんだね
>>32 昔書いたbasicのソースを移植させて勉強してる状況なんで
試しにやってるんです
ここの住人は優しいジェントルマンばかりですね
59 :
デフォルトの名無しさん :03/08/06 22:57
ボタンをクリックすると名前解決を行うプログラムで 最初だけ名前解決に失敗して2回目からはちゃんと 成功するのですが なじぇ?(゚▽゚; struct hostent *hoste = gethostbyname("w3.monar.net"); if(hoste == NULL){ Memo1->Lines->Add("ほすと名の解決失敗(゚▽゚;"); }
60 :
デフォルトの名無しさん :03/08/06 23:00
61 :
デフォルトの名無しさん :03/08/06 23:05
>>60 ここはどこ?(゚▽゚;
そしてどこへ行けばいい?(゚▽゚;
62 :
デフォルトの名無しさん :03/08/06 23:07
前スレ埋め立て完了。1000ゲット
>>63 (・∀・)イイ!!戦いだった・・次は勝つ
MinGWスレでも質問しているのですが はやっていなさそうなのでここにも質問させてください。 MinGW-2.0.0-3の全ソースをダウンロードしたいのですが、 どこにありますか?
誰かまじめに答えてください。
69 :
デフォルトの名無しさん :03/08/07 12:56
strcpy(a,"%d",i); みたいなことをやりたいんですけど どうしたらいいですか?
70 :
デフォルトの名無しさん :03/08/07 13:01
sprintf
71 :
デフォルトの名無しさん :03/08/07 13:07
73 :
デフォルトの名無しさん :03/08/07 15:22
42bitのデータ(4兆くらい)を 扱いたいのですが sizeof(long)が4でした どうしたらいいでしょうか?
・2つセットでつかう。 ・sizeofが8を返す型をみつける
アセンブラを使わないC++による多倍長計算 嫁。 もしくは、多倍長で検索してみれ。
>72 Currentでsrcとあるもの全部。
>>76 その中にあるgccはWindows用ですか?
>>78 ほんとにまじめなんです。
CurrentにあるgccのsrcがあるのですがWindows用のコンパイルでも通りますか?
これが最後の質問ですから誰か答えてください。
> 898 :デフォルトの名無しさん :03/08/04 20:50 > MinGWのソースってダウンロードできるの?
double型でわからないところがあります。 double d1; d1 = 5 / 2; printf ("d1 = %f", d1) これを実行するとd1が2.500000ではなく2.000000となるのは、 5にも2にも小数点とゼロが付いていないからそのまま処理された ということでよいのでしょうか?
>>82 いいけど、整数同士で計算するからと理解した方がよい。
以下はレコードの削除をするコードなんですが、 どうしても理解出来ないため、どなたかご教授願います。 (某Cの参考書に載っているものです) fseek(fp, RECSIZE * (delNo + 1), SEEK_SET); while (fread(&rec, RECSIZE, 1, fp) == 1) { fseek(fp, -2 * RECSIZE, SEEK_CUR); fwrite(&rec, RECSIZE, 1, fp); } RECSIZEは読み書きする構造体のバイト数で、 recは構造体。delNoは、削除するレコードの数え番号です。 これで正しく該当レコードを削除出来ますか? (削除レコードから後を1つ前の位置にずらして書き込んでいく方法だそうです)
ex)delNo==1 fseek(delNo+1) 1)AB[C]DE while(fread(1)) 2)ABC[D]E rec==C fseek(-2) 3)A[B]CDE fwrite(1) 4)AC[C]DE while(fread(1)) 5)ACC[D]E rec==C fseek(-2) 6)A[C]CDE fwrite(1) →4へ戻る
>>86 おお、ありがとうございます!
矢張り”一応”該当箇所の削除は出来るものの、挙動がおかしいですね…。
正誤表も無く、困っていました。
重ね重ねありがとうございました。
88 :
デフォルトの名無しさん :03/08/08 00:20
>>87 > 削除レコードから後を1つ前の位置にずらして書き込んでいく
ということはひとつのレコードを消した場合はファイルサイズはRECSIZE分小さくなると考えていいのか?
>>88 すいません。よく分かりません…。
ただ、本当に正しい挙動をする「レコードを削除するコード」であれば、
ファイルサイズはRECSIZE分小さくならなければおかしいですよね。
↑のコードだと、仮にループに陥らなかったとしても、
ファイルサイズはRECSIZE分小さくならないと思います。
それは、一番最後のレコードを読み込むだけで放置することになるからだと思うんですが…。
(的外れなことを書いていたらすみません…)
ちなみに、この某Cの参考書というのは、
「C言語 文字列操作+ファイル入出力 完全制覇」です。(一応)
>>89 うん。なるはずない。
必要なものだけ読みとって改めて"w"でfopenしたファイルに書き込むか、
>>85 のあとになんらかの方法で切り詰め(例えばUNIXならtruncate)ないとね。
>>90 なるほど!とても参考になります。
ありがとうございました。
92 :
デフォルトの名無しさん :03/08/08 07:30
プログラムの勉強を始めようと思っているのですが CとC++どっちから始めようか悩んでまつ・・・。 どっちから始めたほうがよいですかね?
先ずは日本語の勉強をしろ。
94 :
デフォルトの名無しさん :03/08/08 08:43
悪質な業者にご注意下さい!!
>>74 2つセットで使った後
表示を10進数にするための方法がわかりません
>>75 多倍長で検索してみました
出てきたものは大体入力の時点でBCD等に変換して
数値を扱ってます
すでにあるデータは42bitで
表示のみ10進にしたいのですがどうすればよいでしょうか?
97 :
デフォルトの名無しさん :03/08/08 10:38
42bit以上の型くらいありそうだけど。 C99に準拠していればlong long intが使えるし。
98 :
デフォルトの名無しさん :03/08/08 10:49
>>97 double型は8バイトありましたが
double da=1;
da=da<<1;
とかやると
エラー E2060 test.c 6: 浮動小数点の不正な使用(関数 main )
long long int ia;
とかやると
エラー E2176 test.c 5: 宣言に型が多すぎる(関数 main )
ってでますBCC5.51です
65536*(上位桁)+(下位16bit)
>>98 double は整数ではないからシフト演算子は使えない。
long long int は必ずしも使えるとは限らない。
long int 2つを使って42bit整数を表すには、
下位32と上位10などビットで分ける方法のほかに、
10^8などで割った商と余りに分ける方法もある。
シフト演算などのビット演算をしたいなら前者の方が楽だが、
表示するのは後者の方がずっと楽。
私の同僚が実装した他倍長クラスは、両方のタイプを
交換して使えるようになっていたがそこまでは必要ないだろう。
101 :
デフォルトの名無しさん :03/08/08 11:25
>>100 上位10bitのそれぞれに10^8で分けたlongを持っておいて
(あらかじめ計算済みのlong配列を20持っておいて)
bitがたつごとに足し合わせて表示するってことでしょうか?
>>98 具体的に何がしたいんだ?
>>73 を見る限りでは double 使えばいいように感じるが
103 :
デフォルトの名無しさん :03/08/08 11:33
>>102 すでにある42bit(連続でない)のデータを10進表示したいのです
その、既にある42ビットのデータとやらはどうやって保持してるんだ?
もしかしたら、printf("%15f", doubleValue);ってだけの話か?
107 :
デフォルトの名無しさん :03/08/08 12:15
>>104 33+9です
なんでとかは聞かないでください
僕が決めたんじゃないんで
109 :
デフォルトの名無しさん :03/08/08 17:26
すみません。
マズワ日本語ノ勉強ヲシレクラサイ デカクルトキワワシュレズニ
∧ ∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ (* ゚Д゚)< #include <hosh.h> 〜( UUノ \__________
114 :
デフォルトの名無しさん :03/08/09 13:29
__cdeclを関数の前につけると、C の名前付け規約が適用されるということでよろしいですか?
よろしくありません
>>114 >__cdeclを関数の前につけると、C の名前
何か勘違いしてると思われ。
関数呼び出し規約はC本来のやり方でやれと明示することになるけども、 名前付け規約はちっとも関係ないよね C型呼び出し規約 ・パラメータは後ろ(右のもの)から順番にスタックに積まれる ・パラメータの後片付けは呼び出し側が行う Cなんだからこんなの明示する必要ねえじゃんて思うかもしらんが、 たとえばwindowsのAPIはいわゆるPascal型の呼び出し規約だからね。 明示できたほうがよいのだ。 Pascal型呼び出し規約 ・パラメータは前(左のもの)から順番にスタックに積まれる ・パラメータの後片付けは呼ばれた側が行う x86は関数からのリターン(スタックに積まれたアドレスへジャンプ)と スタックポインタ(SPレジスタ)の調整(パラメータの後片付け)が 一命令でできるからPascal型の呼び出し規約のほうが少し速かったりする。 windows APIがPascal型規約なのはこのあたりで少しでも性能を稼ごうとした からじゃないかなと考えてる。 その代わり呼ばれた側がパラメータの数などについて完全に把握できなければならないので、 たとえばprintfなどのパラメータが不定な関数が実現できなくなる。
118 :
デフォルトの名無しさん :03/08/09 16:45
>>117 >たとえばwindowsのAPIはいわゆるPascal型の呼び出し規約だからね。
今更Win16の話されてもこまるんだけどな・・・。
119 :
デフォルトの名無しさん :03/08/09 16:47
120 :
デフォルトの名無しさん :03/08/09 16:47
>>118 ああ、すまなかった__cdeclの存在価値を示すために古いの出しちまったw
122 :
デフォルトの名無しさん :03/08/09 16:55
threchigai
123 :
デフォルトの名無しさん :03/08/09 17:06
関数へのポインタは int (*func)() ポインタを返す関数は int *func() と表すけど、 ポインタを返す関数へのポインタはどうやって書くのでしょうか?
124 :
デフォルトの名無しさん :03/08/09 17:07
int *(*p)(double,char *);
その二つを合成すれば得られるだろ
126 :
デフォルトの名無しさん :03/08/09 17:08
全角と半角を区別したいんですけど分かりません 教えてください
ttp://www.catnet.ne.jp/kouno/c_faq/c13.html#16 上記に rand() % N よりも (int)((double)rand() / ((double)RAND_MAX + 1) * N) の方がよりよい方法とあるが間違いではないのか? 以上終了。
そうですね。
rand() % N には致命的な欠陥があるが、終了しているようなので書くのは控えよう。
RAND_MAX>>N のときは致命的でもなくは無くない?
「致命的」とは大げさな。 そんなことは自分で検定して用途に応じて判断すればいい
136 :
デフォルトの名無しさん :03/08/10 09:44
全然致命的じゃねぇよ。 rand()%Nで十分。 rand()%Nの乱数性に不満があるような奴がrand()使ってるとも思えん。
rand() % N の方が有利な面もあるのに、一律ダメだと言う表現がいかんのではと。 ・速度 ・(rand() % N) == N/2 ←この判定方法は簡単で便利
10で割った余りが5かどうかって 0かどうかでも確率的には同じだな
>139 違いますよ。
>139 ごめん10の場合は同じか・・・ RAMD_MAXによるけど。
>135
つまり、randは下位bitがあまりランダムではない、ということ?
そんなの実装依存の話だろ。(VCは32bitの線形合同法で手に入れた
値を
>>16 して返している)
129は当然読んだ。提示されたURLを受けて、なお「致命的」と 言い張るからには、てっきり別の話だと思ったんだが。 たとえば、randの返す範囲が(0,1,2)のとき、%2とすると、 出現確率が、0:66%、1:33%になる、とか。
>143 (int)((double)rand() / ((double)RAND_MAX + 1) * N) でも同じこと。
実装依存に変わりないがNが大きけりゃ乱数の周期がもろにでてきて、rand()自体が役に立たないと思う。
処理速度重視の字句解析プログラムを作成したいのですが、 regexとflex、どちらの方が良いのでしょうか?
C言語を今から始めようと思う初心者なんだがまず何すればいい? GCCとかいうのDLしてみたんだが解凍中にエラーが出る。 いきなり挫折の予感。
全角英数をやめる
あの拡張子はなんなんだ人をおちょくってるとしか思えん拡張子の分際で なにがtar.gzだおめでてーな。 +Lhacaに放り込んだら解凍処理じゃなくて圧縮処理が始まったよ(´A`)
>>150 Lhaplas使おうぜ。綴り間違えてるかな?
落としたGCCはソースで、鶏と卵の関係に悩む予感。
つかcygwinとかも入れてるんだろうな?
>>152 gccはアセンブラとlexでどうにかなるんじゃなかったっけか?
ラプラスで解凍は出来た。順調だな。 cygwinは説明読んでみたがわけわからん。 ウィンドウズで使えるようにする為の物らしいが、 UNIXとかAPIとか書かれてもわけわからんな。 つーか解凍したフォルダの何処見てもexeファイルが無いんだが どれクリックすりゃ動くんだ糞がどこか分かり難い所に隠されてるのか。 cygwinってのを使わないと使えないのか。どうなんだ。そうなのか。
ザコイ
>>156 最近の中学校ではそんな言葉が流行ってんのか。
(゚Д゚)ハァ?
>>158 うん?もしかして高校生だったか?そらすまんかった。
変なおやじ。
ざこいなんて初めて聞いた
ザコい 〔ざこ(雑魚)の形容詞化〕 (形) 主に若者語で,弱い。弱々しい。取るに足らない。ざこいとも。「―・いヤツだ」
やるな。goo。
>>163 IMIDASの男子高生用語コーナーじゃん。
そういうコーナー読むのって、やっぱおやじ?
なるほど
ってゆーかもう10年以上前から使ってるぞ
>>167 暴走族かなんかで?
つぅか10年も使うなよ・・・。
いい具合にスレ違いだな
いい具合に濡れてるな
linux,gccで自作プログラムをコンパイル→実行したら、 停止してしまいます。 ctrl + alt + delete で、システム自体の停止はできるんですが、 プログラムだけを停止する方法がわかりません。 どうしたらいいか教えて下さい?
C言語って、何故Cなんでしょうか? Algol...>B..>Cって事なんでしょうか? 一つヨロシコ。
175 :
デフォルトの名無しさん :03/08/10 15:18
>>174 B>BCPL>C>Delphi
だったと思われ。
177 :
デフォルトの名無しさん :03/08/10 15:20
俺のC言語ライフはここまでなのか?
>>175 実行すると、プログラムが停止します。
ctrl + deleteで、シェルに戻るとか
そういうの無いんでしょうか?
>>176 ,177
レスサンクス。
BCPLって初耳、検索して期末。
ってCの次はDelphiすか
当然、D言語来るだろって思ってた。
混じれすするとC++・・・
gccって総合開発環境なの?コンパイラだけ? Borlandの方が楽なのかな。
187 :
デフォルトの名無しさん :03/08/10 15:45
これくしょん
部分的にはC++ですが許してください。 //URLデコーディング string CQuery::decode(const string &s) { string t; for(string::const_iterator p = s.begin(); p != s.end(); ++p){ if (*p == '%') { if(++p == s.end()) break; int d = *p; if(++p == s.end()) break; int e = *p; d = (d >= 'A') ? (d & 0xdf) - 'A' + 10 : d - '0'; e = (e >= 'A') ? (e & 0xdf) - 'A' + 10 : e - '0'; if (0 <= d && d < 16 && 0 <= e && e < 16) t += char(16 * d + e); } else if(*p == '+'){ t += ' '; } else{ t += *p; } } return t; } というコードがありますが、 d = (d >= 'A') ? (d & 0xdf) - 'A' + 10 : d - '0'; の中の (d & 0xdf) - 'A' + 10 が何をやっているのかわかりません。どういうことなんでしょうか。
>>191 dって言う変数と11011111のAND取って・・・何がしたいんだろう?
16進文字を整数に直してるんでしょ。 0xDFと&を取れば小文字を大文字に出来る。
>>193 なるほど。そういうことだったんですか。
これは文字コードに無関係なんですか?
>>195 もちろんASCIIコードオンリーかと。
>>195 ASCII限定。
このコードはURLだから無問題。
>>193 アルファベットの大文字小文字の間に記号がマッピングされてるのは、
この演算を想定しての事なんですか?
疑問が氷解しました。
プログラムが動作しているOSがWindowsかUnixかで処理を分けたいんですが、何かいい方法はありますでしょうか
扱う文字セットがASCII限定なら、 '%'、'A'、'0'も0x25、0x41、0x30にしておかないといけないのでは?
>>203 レスがつかなくなるので変なところと結び付けないでほすぃ
ふつうは、#ifdefとか使うけど。
>>205 #ifdefをどのように使うんでしょうか。もう少し具体的に教えてもらえると嬉しい
同じバイナリで、WINDOWS,UNIX両方で動かしたい、という奇天烈な質問ではなかろう。 Win32のexeを作れるコンパイラは、WINDOWSとか、WIN32とかがdefineされているといえる。 #ifdef WINDOWS LockFileEx(...); #else /*面倒だから、Win以外はUNIXと仮定する。本気になったら、autoconfとか使う(w*/ flock(...); #endif と処理を分ければよろしい。
やっぱりマルチっていわれたλ........
>>208 WINDOWSかWIN32で判定すればいいんですね。っていうかファイルのロック処理じゃなくてディレクトリの処理なんですが・・・まぁ、なんというか。
>>209 cygwinでコンパイルすればってことですか?cygwin使ったことがないのでよくわかりませんが。
>っていうかファイルのロック処理じゃなくてディレクトリの処理なんですが ならはじめからそう書けよ。
>>211 あわわ、ごめんなさい。
今ふと思いつきましたが208さんは「マルチかよ。まぁしかたないから答えてやるか」とか思ってたんでしょうか。なんて心の広い方だ。ありがとうございます。
>>208 > Win32のexeを作れるコンパイラは、WINDOWSとか、WIN32とかがdefineされているといえる。
_WIN32ってのが多い。
214 :
デフォルトの名無しさん :03/08/10 22:17
関数のプロトタイプ宣言は例えば int foo(int, int, double); (関数名は例です) のように書けと参考書に(明解 C言語入門, 柴田望洋)書いてあるのですが、 /usr/include/*.hなどを除くと int foo(int mode, int level, double score); のように引数の変数名も書いてあります.でgcc 3.2ではどちらも通ります. どちらがよりよい書き方だとされているのでしょうか?
どっちでもいい。 うまい引数名を使えばそれだけ分かりやすくはなるから、 外部に公開するようなものなら付けた方がいいと思うけど。
>>215 ありがとう!
とりあえず付ける流儀で行きたいと思います.
少し調べてみたらOSのinclude/の下の.hはほとんど引数名が
書いてあった.tcp wrapperは引数の型名だけだった.
両方使われているようです.
原則として、引数の名前も書いておく方がわかりやすくていいのだが、 ごくまれに困ることがある。 たとえば #define score 20 と定義したあとで、 int foo(int mode, int level, double score); が書かれたファイルをincludeするとコンパイルエラーになる。
基本的な使い方が解ったあとは何をすれば良いのでしょうか?
>>218 なんでも自分の好きなもの作りなさい
作りたいものが無いならプログラムやめなさい
>>217 なるほど... 引数名をつけるにしてもかぶらない
名前を付けるようにせよ、ということですね.
ところでこれもヘッダファイルの書き方の"流儀"の問題
なのですが、stdio.hを2回defineしないようにする時などの
#ifndef FOO
#include <stdio.h>
#define FOO
#endif /* FOO */
でFOOの命名規則に何かデファクトスタンダードはあるので
しょうか.例えばstdio.h -> _STDIO_H (大文字にして.を_に、
先頭に_をつける)とか.
221 :
デフォルトの名無しさん :03/08/10 23:15
>>220 1 グローバル スコープを持ち、_で始まる名前
2 _で始まり、その次が大文字の名前
3 __で始まる名前(C), __を含む名前(C++)
は処理系のために予約されてる。
222 :
214, 210 :03/08/10 23:35
>>221 なるほど、こんな規則あったのか. ありがとう.
INCLUDED_STDIOとか色々やってるみたいですね.
_を付けるって言うのは真似しちゃいけないということですね.
適当に命名規則を付けることにします.GNUとかで推奨
規則ないのなかなあ.
223 :
デフォルトの名無しさん :03/08/10 23:40
224 :
214, 210, 222 :03/08/10 23:53
>>223 分かってます.書き忘れました.
_を先頭に付けるって言うのは規則上真似しちゃいけないということ
ですね.その他の部分では「きっとGCCとか書いている人はCの超上級
者」->「その人たちのCの書き方を真似る」ということでOKですよね?
>>224 コーディングスタイルで調べてみれ。
gccの書き方が最良って訳でもない。
>>224 インクルードファイルのリエントラント防止が目的なら、
インクルードファイルの名前を利用するのがよい。
たとえば、foo.hならこんな感じ。
#ifndef FOO_H
#define FOO_H
/* 諸々の宣言 */
#endif
>>217 一般的に、そういう名前をdefineするのがよくない、というのが妥当な回答。
定数は大文字にすることで、一般的な引き数とは被らなくなる。
>>226 妥当というか問題を先送りしただけのような気もする。
整定数はenumにしようぜ。 ところで > インクルードファイルのリエントラント これ普通に使う言い方?
enum { mon, tue, wed, thu, fri, sat, sun }; 昔これがコンパイルエラーになる環境があったな。
>>228 この#ifndefの使い方は、インクルードガードなどと呼ばれてる。
>>228 インクルードファイルの再入可能性
違和感ないけど。
232 :
デフォルトの名無しさん :03/08/11 11:41
関数の作り方について質問したいんですけど いろんなサイト回ったり本みたりしてるんですが わからないんで、ちょっとお願いします。 構文的にはこうじゃないですか 戻り値 関数の名前(引数) ここのところの戻り値ってどうやって決めるんですか? int,void,charなどなどたくさんありますけど、どんな基準で決めるんですか? 引数のところは大体わかってきたんですけど・・・戻り値が・・ それとたまに関数作って最後の return のところで return -1; や、以前に定義してあったとして return y; などありますがどうしてこうなるかがわからなくて・・・ 自分的には正常に終了するときの return 0; しかわからないので なにかとCの初心者なのでお願いします。
整数nに1足して返す関数なら戻り値も整数だろ int add1(int n){return n+1;}
返り値が-1の場合 int abc(int a){ if (a==1) return 0; return -1;} aが1なら返り値は0、それ以外は-1を返り値とするとき !abc(2) は0 !abc(1)は非0になるのでif文に通すのに利用できる void 型というのは返り値がないのでいいと思う(不勉強ですみません) こんな使い方もできる(と思う)。if,whileループで本当に通過したかのチェックに void omoemana(int i){/*今回 int iは無関係*/ printf("ここを通過しますた\n");} とか、元々関数の返り値は1つの値なのでポインタなど計算に対して 正常に処理されたかどうでもイイ場合もvoidとすることも可能(おすすめはしない)。 もし、おかしなところがあればツッコミ希望
>>232 標準ライブラリの関数がどのようになっているか
見ていってみたら?
>>234 > !abc(2) は0 !abc(1)は非0になるのでif文に通すのに利用できる
!0の結果は1
C 言語でスペースを含んだ文字列の扱いで、便利な関数ってありますか? ファイルから word1 word2before\ word2after word3 みたいな行を読み込んで、 "word1" と "word2before\ word2after" と "word3" の 3つに分けたいのです。 読み込むファイルのほうでは、スペースを含む単語は \ を使って書いてあります。 また、行ごとに単語数が変わります。 fscanf で %s で読み込んで、strlen と strcmp 使って、最後が \ だったら、 strcat で次の単語とつなげるって方法と、 fgetc で一文字ずつ読み込んで \ と スペース で判定する方法は思い浮かんだのですが、 どちらも効率が悪いような気がして。 なにか便利な関数があったら教えてください。
241 :
デフォルトの名無しさん :03/08/11 17:43
>>241 レスありがとうございました。
調べて使ってみます。
あぼーん
>>241 確か状態を保持するから再入不可能じゃなかったっけ?その関数。
247 :
デフォルトの名無しさん :03/08/11 19:57
先生 コンテキストって何ですか?
248 :
デフォルトの名無しさん :03/08/11 19:59
249 :
220, 222, 224 :03/08/11 20:02
250 :
デフォルトの名無しさん :03/08/11 21:57
1000/4
「俺が処理系だ」と十回唱えれば先頭に_を使ってもよい
gccとcygwinのDLとインストールはしたのですが、 ここから何をすれば良いのでしょうか? メモ帳とかでソース書いて.cにしてコンパイルして.exeにする(?)と書いてあったのですが、 コンパイルってどうやるんですか? cygwinを起動して出てくるウィンドウで何かを入力するのでしょうか? 以前はHSPを使っていたので、あの使いやすさに慣れたせいか C言語を前に早くも苦戦中です。 どなたか詳しく教えてください。おねがいします。
移植性を考えなくてよいなら、識別子をアンダースコアで初めてもよい。 コンパイラのバージョンが上がってコンパイルできなくなっても泣かない。
>252 gcc ファイル名
>252 初心者なら MinGW の方がいいかもね。
インクルードガードのdefineはランダムな文字列を含ませるのが鉄則、でもない
>>232 戻り値 hoge(int x){x=x+100; return x;} って関数があったとする。
実際に関数を使うときには、hoge(a) とか書く。
a=1 だとして hoge(a) だと、a+100=1+100=101 だから、
hoge(a) って文字は、101 って文字に置き換えられる。
int b; b=hoge(a)+100; ってあったら、b=101+100; になる。
この場合 hoge(a) は 整数として扱うべき値だから、
int hoge(int x){x=x+100; return x;} って宣言しておく。
もし hoge が char hoge(...){.....} で宣言されてたら、
b=hoge(a)+100; は、 b= ひゃくいち + 100; みたいになって計算できない。
逆に、fprintf(stdout,"%c\n",hoge(a)); って使おうとしてるとする。
ここでは、hoge(a) は %c で指定してあるから、文字じゃないとだめ。
hoge(...){....}が char じゃなくて int で宣言してあったりすると、おかしくなる。
そんな感じで、その関数を使う場所に応じた戻り値の型で宣言する。
よく int main(){ ..... retunr 0;} ってなってるのは、
アプリが、正常に終了したら 0 、異常終了したら 1 やそれ以外の値(エラーコード)を返せみたいな
OS(?) のルールとかがあるから、実行した結果が 0 になるように return 0; ってなってることが多い。
まちがってたら、突っ込みよろしく。
>>257 > hoge(a) って文字は、101 って文字に置き換えられる。
釣?
>>258 インライン関数のことを言いたいんじゃないかな(なわけねえ)
>>252 コマンドとかがわからないなら、
cygwin のアイコンで起動して、出てきたウィンドウ(bash) で
mkdir C
cd C
start .
って入力。たぶん、エクスプローラーかなにかが C ってフォルダー開いてくれるから、
そこに、 hogehoge.c ってのをメモ帳とかそのほかのエディターで作る。
つくったら、cygwin の bash で、gcc hogehoge.c ってやる。
bash で ./a.exe で実行。
exit で cygwin の bash を終了。
次回からは、同じフォルダーに hoge2.c とか作って、
bash 起動して、 cd C やったあとで、 gcc hoge2.c とかやる。
とりあえず、mkdir と cd くらいの基本的なコマンドの意味を知りましょう。
で、それから gcc -o hoge.exe hoge.c とか gcc の使いかたも調べましょう。
>>261 UNIXの部屋と言うページにコマンド(?)の一覧が載っていて、
そこを見て大体のコマンドの意味は分かりました。
しかし、言われた通りにcd CとやってみたらPC名などの横に/Cと出てきたのですが、
次にmkdir Cと入れるとcannot create directory `C':File exists
次にstart .と入れても「command not found」
といわれてしまい何もおきません。
何かやり方が間違っているのでしょうか?
使っているPCはXPでgcc-3.3.1です。
gccの-c-g-O-oなどは、cygwinを起動して出てくるウィンドウで入力すれば良いんでしょうか? その際にgccの置かれているフォルダの設定などは必要ですか? hogehoge.cと同じフォルダに置いておくのかな。 C言語の講座ページはいくつか読みましたが、 一番の基礎から解説してくれてるページはなかなか無いですね。 基本的な構造や役割からしていまいち分かってない感じです・・ 使って見たら理解できると思うのですが。
早く夏休み終わらないかなあ。
>>257 ありがとうございました。よくわかりました!
intとかの戻り値の選択のしかたはわかりました。でも、
返り値のいらない void は引数のところは何でもいいんですか?
またまた質問ですみません。
>>262 >何かやり方が間違っているのでしょうか?
ここで訊く事が間違っている、という事に
一刻も早く気付くべし。
ここってC言語の質問スレじゃないんですか?
268 :
デフォルトの名無しさん :03/08/12 12:06
/////// ///////____________ ///////  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄| ̄ ̄ /////// (~) チリンチリン /////// ノ,, /////// ∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄ /////// ( ´∀`)( 厨 ) )) < 夏だなあ〜 /////// (つ へへ つ \______ /////// //△ ヽλ ) ) 旦 ////// l ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄l /////  ̄| .| ̄ ̄ ̄ ̄ ̄ ̄ ̄| .| ̄ //// ^^^ ^^^ 2chの夏。厨房の夏。
>大体のコマンドの意味は分かりました。 わかってねーし(藁
2ch内リンクでもhを抜いている馬鹿
>271 一応 > と >> の効果の違いぐらいはありますが・・・
ああ、リンクは2chに高負荷をかけるとでも思っているのか。
c言語やりたいだけなら わざわざcygwin入れる必要ないべ?
>>275 gccなら要るだろうけど、cygwin要らないコンパイラは色々あるね。
>>274 そんな事すら指摘されないと分からんとは、禿だな
>276 1にこうあるから順番にやってみたんじゃないかな? 【Win32用の開発環境のみ。】 gcc-cygwin gcc-mingw 順番入れ替えたほうが良くねぇかな。 >277 そう思えば > 使ってる香具師全員に指摘して回るんだな。
俺は274にレスしてるんだが、何が言いたい?
>279 おっと流れを勘違いしたようね。これは失礼。
「2chに高負荷をかける」ってのが笑えるな お前らも連呼してみろよ 3回目で吹き出すぞ
顔真っ赤です
鯖
「ミニロトを1500個、ダブりなしで選択する」っての 自分の頭じゃいちいち照合するか、ソートしてから照合するかしか 思いつかないんですが、もっとスマートな方法ってありますか? ちなみに void main(void){ } しか使ったことありません。
↑あ、ミニロトのルールは ・1-31の数字を5つ ・数字のダブりはなし です。
>>285 Cの話じゃない。
ちなみに void main(void){ } は使ったことありません。
#ifdef を使うときに #ifdef A || B || C としてもOKでしょうか。
>>288 そんなときのためにdefined()があるわけですよ。
>>289 なるほど
#ifdef A || B || C
の書式は文法的に間違いってことですね。大人しく #if defined(A) || defined(B) にするのがイイのか
サイズを小さくするか。ならメール欄も空にしろよな。
292 :
ビル・ジョブス :03/08/12 20:58
>>290 ちと話は違うけどプリプロセッサ出力を見ると楽しいよ。(そんなオレは変?)
ちとC言語の勉強になったりもする。
もう15年くらい昔だけどC言語の勉強してた頃「え!こんな書き方許されるのか!」って
よく驚かされたよ。
どっかの人大杉サーバならともかく、過疎板で負荷など気にする必要はない。 こういう奴ってprofとか使わずに闇雲に変な最適化をして 全然可読性のない糞ソースをひねりだすんだろうな。
>>293 うーん…、釣り?
そんなレスしてる漏前様も「こういう奴」に入ると思われ。
何時までもネチネチ粘着してるのは何だろうね 変だね、キモイね、エンガチョだね
どなたか教えていただきたい事があります。 特に変わった事はせずに、ふつうにmallocして、reallocしてという感じ で書いたプログラム(いくつかポインタがあってすべてreallocしたりする わけではない)を書いて、free関数で解放するのですが、なぜかmalloc オアreallocで確保するメモリが多いか少ないときにFreeを使う所で エラーが出てるみたいなんです。(いつもでるわけではない)これは なぜでしょうか?メモリ関係で何か注意しないといけない事を忘れてる とかでしょうか?ご教授ください。 あと、やっぱりプログラムが終わればメモリは勝手に解放されるわけ ではないんですよね?さっきからそのせいでパソコンが落ちまくる(泣)。
>>298 Meなんですけど、解放しないようなんですよね〜
メモリのお掃除屋さんのグラフがどんどん減ってくんですよ。
(そのアプリを起動、終了を繰り返すと)
free()でエラーが出るのは、どっかでミスって二重に開放しようとしてるのでは?
>>300 そう思うんですけど、出る時と出ない時があるのが謎なんですよ。
いつも出るってんならまだ探しようもあるんですが・・・・
Strcpyはアドレス関係ないですよね?
302 :
デフォルトの名無しさん :03/08/13 22:52
>>297 ageろよ。
そのコードを貼ってみて。
303 :
デフォルトの名無しさん :03/08/13 23:22
>>301 アフォ。
「未定義」とは何か、
3600000000000nsほど考えてこい。
コマンドライン引数を与えていないだけだったりして
sizeof(char)って・・・
307 :
デフォルトの名無しさん :03/08/13 23:29
>>304 どういう意味でしょうか?「未定義」ってのググッってみた方がよいのでしょうか?
308 :
デフォルトの名無しさん :03/08/13 23:30
>>303 この問題とは関係ないだろうが、mallocに失敗してもstrcpyしているがいいのか?
規格に従ういかなる処理系においても sizeof(char)==1
>>303 sprintfには%lfなんかない。doubleは%f
sizeof(アチャー)
314 :
デフォルトの名無しさん :03/08/13 23:36
>>311 なるほど、使う意味がないと。こりゃ勉強になりました。一応
やっといた方がいいかなと思ってつけといたんですけど。
いらないんですね。
>いらないんですね。 そうでもない
VBスレでみかけたあれなのかなぁ。スペルミスとかmemmoveを使えばよさそうなところとか似ている。
VC++.NETはsizeof(char)==2だがな
こういうこと if(str1[0] == '-'&&str1[1]=='-'){ for(x=2;x<=strlen(str1);x++){ str1[x-2] = str1[x]; } } if(str2[0] == '-'&&str2[1]=='-'){ for(x=2;x<=strlen(str2);x++){ str2[x-2] = str2[x]; } } ↓ if(str1[0] == '-'&&str1[1]=='-'){ memmove(str1,str1+2,strlen(str1+2)+1); } if(str2[0] == '-'&&str2[1]=='-'){ memmove(str2,str2+2,strlen(str2+2)+1); }
>VC++.NETはsizeof(char)==2だがな その時点で、スレ違いだな
char char キーワードを使用して、次の表に示された範囲の Unicode 文字を宣言します。Unicode 文字は、世界中の文字言語のほとんどを 16 ビット文字で表します。
とりあえず。プログラムに直接の問題は無さそうですか?あと、今思いついた んですけど、中で呼び出しているdoublemultiplyって関数の戻り値を解放 してないってのはなんか関係ありますかね。そっちの関数もreturn文で 動的に領域を確保したポインタ(言葉の使い方がおかしいかも)を返して るんですけど。
>>322 freeで落ちるらしいが、具体的にどのfreeで落ちるの?mainの中のfree?
>>322 それはOK
標準じゃないけどstrdupなんてまさにそういう関数だし。
>>323 いや、関数の中で落ちちゃってるっぽいです。で、freeを全部取り除いてみたら
一応エラーは起こらなくなったみたいなんですけど、それもどうかと思い
freeに渡す値がちゃんとmallocで得た値なのか、 途中で書き換えていないか、二回freeに渡していないかを確認しとけ。
>>326 後者は何度も調べました。前者はつまり動的に確保したのではないアドレスを解放していないか?という事でしょうか?
328 :
デフォルトの名無しさん :03/08/13 23:55
if(str2==NULL||str2==NULL){ ↑これ記述ミスだろ
329 :
デフォルトの名無しさん :03/08/13 23:56
>>327 そういうこと。
たとえp=malloc(4);とやっていてもfreeするまえにp="string";とかやったらダメ。
>>329 strcpy(p,"はなもげらー");
とか
strcpy(p,str1);
とかは大丈夫ですよね?
スルーされとる・・・ ↓これのことなんだけど。scanfしているのもよくわからない。 str1=(char *)malloc((strlen(strone)+5)*sizeof(char)); str2=(char *)malloc((strlen(strtwo)+5)*sizeof(char)); if(str2==NULL||str2==NULL){ printf("メモリが足りません"); scanf("%d",&work); } strcpy(str1,strone); strcpy(str2,strtwo);
334 :
デフォルトの名無しさん :03/08/14 00:01
>>327 一応確認するけど、関数内でmallocで得た値を入れるために、ポインタ変数を引数に渡してないか?
その場合、「ポインタのポインタ」を使うのは知ってるよね?
>>334 申し訳ありません。どういう意味でしょうか?
インデントがめちゃくちゃでブロックの範囲がわからん。
>>332 すいません見逃していました。確保失敗したらプログラムに止まっててもらおうと
Scanfは入れときました。
あと、strcpyは確保されなかった場合は、ストップするので、大丈夫かなと
>>337 なんと!
そういうときはNULLを返して関数を抜けるのがいいよ。
>>338 そうなんですけど、一応まだテスト段階なので、とりあえず、メモリ確保の所で止まってる
か調べるためにScanfを使ってみました。
ちゃんとできたらそうしてみます。
以前、mallocで確保する量を間違えてバッファあふれを起こしたけど、 freeでおちたために原因を突き止めるのに時間がかかったことがある。
>>341 原因は、確保する量が多すぎたって事だったんですか?
345 :
デフォルトの名無しさん :03/08/14 00:23
>>335 こんな書き方をしてたら間違いってことなんだが。
void kakuho(char *s){
s = (char *)malloc(256);
}
int main(){
char *a;
kakuho(a);
/* a をつかう*/
free(a);
}
>>346 よく意味が分らないよ。
その間違いは、していないって意味?
それとも、345は間違っていないって意味?
因みに345は間違いだよ。
349 :
デフォルトの名無しさん :03/08/14 10:07
>>129-145 rand()の結果に周期性があるとしても、乱数なんだから構わないんじゃない?って思うのは素人考え?
N=100ぐらいで各数値の出現頻度が1%ずつになるようなrand()って、むしろランダムじゃないように思えてしまう。
あの、ここでお世話になった者なんですが、VCでのDLLの作り方がよく わからず、困っております。どなたかわかりやすく教えてください。 それか、ソースを晒すのでDLLにしてください。おねがいします。
>>350 >>1 > GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
あの、私は一応VB使いなんですけど、計算を行う部分がVBでは遅過ぎる ので、C言語で書いたプログラムをDLL代わりに呼び出して、結果をファイルを 介して取り込むという手法のプログラムを書いています。 で、呼んでは、消え、呼んでは、消えをものすごい勢いで繰り返してるんですが そうすると、どんどんメモリを食っちゃってるみたいなんです。また、動作が不安定 になって行っているようなんです。 やはり、こういう手法は避けた方が良いのでしょうか?
>>353 C言語側かVBとの通信部分にメモリリークがあるんでしょうな。
&より<<の方が優先順位が高いとφ(..)カキカキ
>>354 コマンドライン引数を与えてshellを使いDOSプロンプトの中でCのプログラム
を走らせて、そして、それは計算結果をファイルに書き込み終了します。
その後、VB側のアプリはファイルの内容を監視してて変更されると読み込んで、
という風にDLLもどきとして利用しています。分かりにくかったのなら申し訳あり
ませんでした。
>>355 通信と言っても、コマンドライン引数を渡す所ぐらいしか実質通信はして
ないんですが・・・どこが原因なんでしょう?
>>358 ちょっと頭使えばいいと思うがC言語側。
みなさん、厨房ですよ。
361 :
デフォルトの名無しさん :03/08/14 20:55
>>359 どう言う事ですか?何か工夫すればメモリリークは避けられるの
でしょうか?
だからスレ違いだって。
Cで書かれたソースコードが置いてある日本語サイトを知りませんか?
366 :
デフォルトの名無しさん :03/08/14 21:26
368 :
デフォルトの名無しさん :03/08/14 22:03
このスレは、ものすご〜〜〜い初心者っていうか 昨日からCの勉強を始めたような人間が質問してもいいスレですか?
370 :
デフォルトの名無しさん :03/08/14 22:05
>>362 トライはしたんですけど、文字を渡して、文字を返してもらう
ってのが異様に難しくて、あきらめてしまった次第なんです。
(数値は結構簡単に行けるのに・・・・・)
ちなみにVCで
>>371 その前にC側のクソコードでバッグしる!
>>372 コードが原因なんでしょうか?アプリを起動すると、それを次に起動
する時のためにメモリに残して置くとか聞いた事があるんですけど、
そういう関係なのでは?と個人的には考えてるんです。
>>373 次回起動される保証がどこにもない。
もしそうだとしても、起動の度にその謎の領域を蓄積させる理由がない。
>>265 返り値のない関数でも、引数が必要なことはある。必要ないこともある。
なんでもいいわけではない。それはどんな関数にするか次第。
返り値の有無にかかわらず、その関数が、どんなものを利用するかとかでかわってきます。
引数がどんなものなのかちゃんと調べたほうがいいです。
スコープとかリンケージとかいった言葉も調べた方がいいのかもしれない。
それと、実際にプログラム書いてコンパイルしてみるのも必要。
3回くらい足し算するだけとかの単純なプログラムでも、
返り値のある関数でつくったり、返り値のない関数でつくったり
なんとおりか作ってみると、
どんな関数をつくって、どんな引数が必要かとかわかる。
前回書き込んでいろいろつっこみがはいったように、
私は、ちゃんとわかってると言えるレベルではないし、
このスレにいつもきてるわけじゃないのであてになりません。(笑)
>>374 じゃあ、やっぱりFREEし忘れとかですかね?でも、アプリが終われば
FREEしてなくても解放されるものと聞きましたが、
うーん、他に思い当たらないしな〜
>>376 どこが悪いのかの切り分けテストしろよ。いいかげん。
int main(){return 0;}
だけのプログラム作って動かすとかさ。
日本語のサイトは無いんですか?
図書館にはその手の本が無いんです。 本も買いたいのですが金銭面からなかなか厳しくて。 何処かありませんか?
ブックオフ メチャメチャ安い
>>375 >>257 はネタじゃなかったのか?
よくわかってないなら、てけとーなこと書くのを止めれ。
384 :
デフォルトの名無しさん :03/08/15 01:37
今がチャンス!「誰も知らない」スーパービジネス
HPを宣伝するだけの誰でもできる簡単なお仕事です。
間接収入もあるので安定した収入が望めます。
2chを見てようがゲームしてようが、ほったらかしで次から次へと入金される
その喜びを是非味わってください。
通帳見るたびにほっぺたを落とさないよう注意!!
詳しくはコチラ
http://www.mahou.tv/muchey/partner.htm
>>377 やはり、ソース側の問題ではないようです。おっしゃっているプログラムの
int main(){return 0;} を
0.5秒ごとに動かしてみましたが、やはり、メモリはどんどん減っていってしま
っています。また、mallocで確保した領域を開放しないという内容にしたところ、
減るペースは増えています。やはり、プログラムが終わっても解放されないで
はないでしょうか?
ついでに質問ですが、DLLが終了する時は、プログラムが終わってメモリが
解放されるのと同じようにFREEしなくても解放されるという事になっている
のでしょうか?それとも、関数扱いだから、解放されないのでしょうか?
いい加減、スレ違いってことに気づかない限り問題は解決しないと思われ。
たしかに、すでにVBの問題だな。
390 :
デフォルトの名無しさん :03/08/15 02:49
VB厨逝ってよしでFA?
391 :
デフォルトの名無しさん :03/08/15 10:10
WindowsXPでGCCって動くんですか?
393 :
デフォルトの名無しさん :03/08/15 10:13
394 :
デフォルトの名無しさん :03/08/15 10:14
うぁぁぁぁぁぁぁあぁああ もうどこをどうクリックすればGCC手に入るんだよ 誰か教えてください
>>383 じゃあ よくわかってるおまえがちゃんとした答え書いてやれ。
答えられるなら。(笑)
アホな答えとそれを書き込んだ奴にたいする罵倒しかレスつかないなら、
このスレ無意味だろ。(笑)
>>396 そうですよ、基本位てめぇで勉強しろと。
>>275 はマジなの?
> b=hoge(a)+100; は、 b= ひゃくいち + 100; みたいになって計算できない。
この辺なんて釣りにしか思えないから、みんな放置してると思ってた。
>>399 VBとかなら・・・でも、charだしなぁ・・・。
char *hoge(...){.....} と書きたかったんだろうか。 それでも警告は出る(intにポインタを代入)けど一応コンパイルは通る。
>>403 まぁ、結局のところint相当だからなぁ。
どうやっても「ひゃくいち」にはならんけれど。
>>232 今更だけど、文字列を加工する関数で特に戻り値を必要とせず、一切エラーも起きない場合は加工後の文字列の先頭アドレスを返すようにしている。
別にvoidにしてもいいんだけど、標準関数にならってね(strcpyとかstrcatとか)。
>>396 > アホな答えとそれを書き込んだ奴にたいする罵倒しかレスつかないなら、
> このスレ無意味だろ。(笑)
そうだよ。
だからアホな答えは書くなよ。
あの〜、ファイルからfscanf(fp1,"%s",str); というように文字列を読む時に、書き込まれている文字が”0”だけの時は 文字列として認識されないのでしょうか?改行コードがどうのとかいう関係?
そんなはずないけど・・・ 空白なら影響があるけど。 ところで、文字列を読み込むならfgetsを使った方がいいよ。
>>408 サンキューです。今試してみた所、0でもちゃんと読み込めていま
した。プログラムのどっかにバグがあるみたいですね。
fgets使ってみます。(σ・ω・)σ Fゲッツ!!
大体質問しておいてちゃんと回答があっても、 まともに感謝もできない香具師ばかりだと回答する気にもならないよね。
ゲッツなんて言われてもどう対応したらいいのかわからんよな。
ここをどこだと思っているんだ。 ましてや夏休みだぞ。
>>412 > 回答する気にもならないよね。
じゃあするなよ。スルーしろ。
(⌒V⌒) │ ^ ^ │<これからも僕を応援して下さいね(^^)。 ⊂| |つ (_)(_) 山崎パン
>>415 同意。恩着せがましいったらありゃしない。
418 :
デフォルトの名無しさん :03/08/15 16:21
質問スレがこんなに下にいちゃいかんだろ。
419 :
デフォルトの名無しさん :03/08/15 18:43
次の質問どぞー
恩着せがましいのもuzeeが 無礼者も同じくらいuzee どっちも氏ね
>257 >405 レスありがとうございます。とりあえず色々な関数作ってみて 試してみます。 レスがないからもうあきらめかけていたが ちゃんと見てくれる人もいるんだ・゚・(ノД`)・゚・ まだ俺はC初心者だから誰が釣りとかわからないけどな・・・ まあ、レスありがとうございます
「ポインタのポインタ」があるんなら、「ポインタのポインタのポインタ」、更には 「ポインタのポインタのポインタのポインタ」とかもあるんかいな。 もしあるのなら、「ポインタのポインタ」が、「実体の参照まで2段階ある」という 言葉を使うとするなら、一体何段階までのポインタがあるんかいな。
>>423 もちろんあります。
ヒープがあふれるか再帰的に参照しているならスタックがあふれるかまでは行けるんじゃないの?
>>424 その前にコンパイルするときの文の文字数制限にひっかかってしまうかも。
VC6 だと 1023 文字くらいだった気がする。
426 :
デフォルトの名無しさん :03/08/16 11:53
こそこそとやってんじゃねーよ。 age!
428 :
デフォルトの名無しさん :03/08/16 12:03
なわけない。
脳内なら或いは
>>430 同意。無限とか言ってる奴はチューリングマシンもってこいと。
432 :
デフォルトの名無しさん :03/08/16 12:21
Theoretically unlimited. Limited by implementation.
infiniteの方が好き
四重以上はやめてね。ループも。
>>434 もしリストを先頭からたどる羽目になったときは
必然ですね。
「何処まで続くか判らないポインタのリンクが必然ですね」、だ。
>>438 たどるのに内部で再帰してたりとかじゃないの?
必然性があれば何重でも
>>440 今まであった?
四重以上のポインタやループが。
「四」重ってどっから出てくんの?ワラ
char c; char* p = &c; char** pp = &p; char*** ppp = &pp; char**** pppp = &pppp; char***** ppppp = &ppppp; *****pppp = 'a'; ループいらないぞ。
*の数があってねえぞ。
むしろpの数が
というか誰がループを必要としていると言った。
448 :
デフォルトの名無しさん :03/08/16 13:47
ヌル型のポインタってどういうときに使うんですか?
449 :
デフォルトの名無しさん :03/08/16 13:48
>>448 char *s="abcdef";
if(strstr(s,"haxa")==NULL)
printf("みつからなかったよ\n");
ヌル「型」じゃないぞ。
ぬる「ぽ」だぞ
( ・∀・) | | ガ「ッ」
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/ ←
>>451 (_フ彡 /
453 :
変な質問者 :03/08/16 14:30
Cして7日目な人(7日前にPC初めて触れた)なんだけど、
>>232 の質問に対する答えって、
どれも検討違いじゃないかな?って思ってしまった。
returnについては、後の人のでいいと思う。
戻り値をどうやって決めるかってのは、関数を実行して、その結果どんな値が欲しいのか。
できまるんちゃうかな?
double型の数値が帰ってくるなら、double 関数名(引数) て形にすればいいだけ。
別になんも返さないですよ〜。ソース見やすくするために関数化しただけですし〜
ってなら、戻り値は何も返さないって示すために、void って書く。
これって合ってる?理解を深めるために何人かの人レスお願いしますm(__)m
/* レスに対して発言はしません。 */
457 :
変な質問者 :03/08/16 14:34
return void;
>>453 なぁ、そのプロシージャ(void hoge())でエラーが発生したときってどうする?
〜日目とか強調するやつよくいるよな。
7日目で2ch(;´Д`)
462 :
変な質問者 :03/08/16 14:41
7日で釣りが大成功 僕って才能あるかも^^;
おまいらまて
>>453 は釣りじゃないか?
みんなレスしすぎだろ(藁
釣りかどうかなんてどうでもいいんだよ。
>>453 糞して氏ね
466 :
デフォルトの名無しさん :03/08/16 14:47
大勢で水をまいて東京の気温を下げようなんて、2ちゃんねらーみたいなことするなよ(;´Д`)
467 :
デフォルトの名無しさん :03/08/16 14:47
誤爆(;´Д`)
void uppercase(char *str) { for (; *str; str++) { if (*str >= 'a' && *str <= 'z') { *str += 32; } } } main(void) { char *str = "rock is dead."; printf("%s¥n", str); uppercase(str); printf("%s¥n", str); } 2回目のprintf()でBus errorって怒られます。 ヨロシコお願いします。
文字列リテラルを書き換えないように。
471 :
デフォルトの名無しさん :03/08/16 15:57
char str[] = "rock is dead.";
>>470 , 471
レス有り難う御座います。
>char str[] = "rock is dead.";
で上手くいきました。
で、ワタクシ間違っておりました。
>*str += 32;
では無く
*str -= 32;
ですた。
文字列定数変更した時の動作はANSI規格では未定義
勉強になりました。
>>470 文字列リテラルの使い方を間違わないように。
474 :
デフォルトの名無しさん :03/08/16 16:47
シーク関数の動作が理解できない。 何でこのプログラムで位置が進むんだろう? char c; for( int i=0; i<4; i++ ) { if( 0==fread( &c, 1, 1, fp ) ) return EOF; fseek( fp, SEEK_SET, 1 ); cout << c << " "; }
>>474 ファイルポインタはファイルの「ここまで読んだ」情報を保持するための物です。
そうなんですか。 5年くらい勘違いしてました。 でも、fseekは何のために存在するんだろう?
477 :
デフォルトの名無しさん :03/08/16 16:57
fseek(fp, 1, SEEK_SET); だろ
> fseek(fp, 1, SEEK_SET); だろ しまった!!!! 気が付かなかった・・・ ようやく光が見えました、ありがとうございます。
SEEK_SET は 0 。 1 は SEEK_CUR 。 だから、fseek( fp, SEEK_SET, 1 ); は fseek( fp, 0, SEEK_CUR ); と同じで、 ファイルポインタを移動しない。
ネタでは真似できない、この天然… 見習わなければ。
プロトタイプ宣言しても型チェックしかできないからねぇ
483 :
デフォルトの名無しさん :03/08/16 22:05
( ・_ゝ・)ツマンネ
485 :
デフォルトの名無しさん :03/08/17 03:59
>>474 進むどころか
ボクのCコンパイラでは、エラーになりました。
>>485 システムによってはSEEK_SETが0で、SEEK_CURが1とは限らないから
エラーになってもおかしくはない。
>>487 > cout << c << " ";
> C言語なら俺に聞け! Part 63
489 :
デフォルトの名無しさん :03/08/17 13:55
ミキティーが放尿するフラッシュを作りたいのですがどうしたらよいのでしょうか。
笑ってしまった
>>489 サブリミナル効果で尿意を催すフラッシュを作って見せる。
ションベンちびるほど恐いのでも可。
492 :
ぽ ◆ebXLcmI5po :03/08/17 16:47
おい 教えろ 漏れのマシンはw2kでcygwin が入っている。 さっきcygwinは最新にアップしたのだが、gccが入っていないんだよ。 どっからかっさらってくればいいんだ? 直リンキボンヌ
494 :
ぽ ◆ebXLcmI5po :03/08/17 17:21
それがわからんのだよ とホホ
package selectのall/devel/gcc
498 :
デフォルトの名無しさん :03/08/17 20:42
>495 やっと判ったよ。ありがと。
デベール! (プださっ
500 :
デフォルトの名無しさん :03/08/17 21:59
I'll be back!!
でんでんデベロン デベロンパ
C言語とはいえませんが、 Print文を使用して、標準出力に”自身を出力したいときはどの様に指定 すればよいでしょうか。 Print ”””や”¥””など色々試しているのですがうまくいきません。
503 :
デフォルトの名無しさん :03/08/17 22:41
>>502 ”はそのままでOKです。
"は\"とします。
>>502 C言語の質問をしてください。
Print文って何?
>>504 Print文ではなくPrint文です。
あなたの目は節穴ですか?
>>502 に【無礼者】の烙印
#define Print printf
#define begin {
のようなデムパコードが将来にわたって自分のところに
回って来る率を低減するめ、コイツは以後100%無視
508 :
デフォルトの名無しさん :03/08/18 00:18
やっとGccが入ったよ。 それでだ、重大な決断をしなくてはいけないわけなんだよ cygwinのgccを使うとして windowsのアプリとするか cygwin上でXfreeで動作するアプリとするか 損得を教えてくれよ
509 :
デフォルトの名無しさん :03/08/18 00:32
多少判った。 MINとかいうのを使うんだな?でSDLとかいうのを使うのだな? それがベストなのか? なんか落とし穴はあるのか?
510 :
デフォルトの名無しさん :03/08/18 00:33
自分で作った関数名の付け方について質問です。 本によって、 CreateDensityArray() のように、単語の頭を大文字にするやり方と、 create_density_array() のように、_で区切るやり方があるようですが、 どちらが良いとか、悪いとか、由来とか、 みなさんはどちらにしているか、など教えて下さい。
512 :
デフォルトの名無しさん :03/08/18 00:53
歴史的な要素もあるよ パスカル系の香具師は単語の頭を大文字にしてたからね。 歴史的なfortran屋になるとその大文字ダケ+数字で常に6文字になる(W そーゆー過去の習慣を引きずっていない香具師は単語をアンダースコアで繋ぐわけだよ。
K&R ってもう古典だし、そのまままねるのは危険な気が。
FAQネタで議論するなと言っている。別スレ池。
517 :
デフォルトの名無しさん :03/08/18 03:05
K&R初犯のころのCは良かったよな。何でもアリでさ。 処理系も小さかったし。
518 :
デフォルトの名無しさん :03/08/18 03:06
懐古厨うざい
自分は以下の感じで書くのですが、 スペース、改行、{}等で一般的な書き方を教えてください。 ,*i,n → , *i , n にするみたいな。 #include <stdio.h> void Sub(int*i,int n) { if((*i==n||*i==100)&&(*i!=n||n==30)) printf("(^^)\n%d %d\n",*i,n); } int main(void) { int i=10,n=20; printf("%d %d\n",i,n); Sub(&i,n); return 0; }
520 :
デフォルトの名無しさん :03/08/18 04:09
美意識の問題だから好きにやれ
2つほどお聞きしたいのですが void main(void) はいけないと入門書に書いてあったんですが何故なんでしょうか? 詳しい理由みたいなのがあれば是非教えてください。 それから、重ねての質問で申し訳ないのですが、gets()はセキュリティー面で弱いとも書いてあったんです。 これについても深い理由を知っている方、いましたらよろしくお願いします。
>>521 main関数は、intとchar *の2つの引数をとり、intを返すことになっているから。
int main(int argc, char *argv[])
とすべし
523 :
デフォルトの名無しさん :03/08/18 05:03
int main(void)でもいいんですが。
>>521 getsは、入力された文字を入れるための領域を用意してそのた領域へのポインタを渡すが、
用意した領域よりも長い文字列が入力された場合、プログラムが誤動作するため。
また、これを防ぐ方法がない。
意図的に長い文字列を入力させて(バッファをあふれさせて)
任意のコードを実行させるクラッキングに利用される可能性もある。
>>524 未定義なだけでプログラムが誤動作するとはかぎらない。
と言われてしまうぜにぃちゃんよぉ。
>>522-524 丁寧な解答ありがとうございます。謎が解けました。
>>524 具体的な対策として、どうすれば良いでしょうか。
fgets()なら問題ないですか…?
皆さんはgets()を使わずにどのように処理しているか参考までに聞かせて頂けると…
>void main(void) >はいけないと入門書に書いてあったんですが何故なんでしょうか? 2chで馬鹿にされるから
528 :
デフォルトの名無しさん :03/08/18 05:23
>>523 鼻毛以外のモノを鼻から出したくない人は、そんなことしません。
>>510 gtk+ でプログラム書いてみようと思ったときに、_ をつかった関数が gtk+ でたくさん用意されてて、
自分で _ をつかって関数定義したらなんかエラーメッセージか警告がでたような気がする。
だいぶ昔の記憶なので、今はどうかわかりません。
私は Create_Density_Array() みたいに _ と 大文字 を両方使う。
関連した小さな関数は _ と 小文字 だけで。
似たような名前の関数が他になければ、
CreateDensityArray() みたいに _ を使わないこともたまにある。
>>519 Linux とかだと、indent ってコマンドがある。cygwin にも入ってたと思う。
indent hoge.c とかやると、改行いれたりスペースの数変えたりしてくれる。
ttp://www.linux.or.jp/JM/html/GNU_indent/man1/indent.1.html indent コマンドの出力はあんまり好きじゃないし、オプションは使ったことがない。
Emacs つかってるので、cc-mode で TAB キー押すだけで勝手に行頭そろえてくれるし。
(()&&()) ってなるときは (() && ()) みたいにスペース入れる。
if 文だと、if って書いた行の最後に { を付ける。} は if の i とそろえる。
一行だけで { } なくてもいい時も { } は付ける。
そのソースだと、int main の中の、int i= の次の行と、Sub の次の行に、
空の行を入れるかもしれない。
>>531 お答えありがとうございました。参考にさせてもらいます。
狙ったように宗教戦争ネタが続くのはネタなんだろうな・・・
534 :
デフォルトの名無しさん :03/08/18 15:01
かつて fortran2 fortran77 c ANSI C c++ pascal modula2 oberon と変化のあった時代と比べれば、動きがないからね。 宗教ネタ以外な URL示されてお終いだし。
535 :
デフォルトの名無しさん :03/08/18 17:38
複文かつ値を返してくれるマクロってどういう風に書くの?
{}を使う。
>>536 値を返せないんじゃ…
式だけでいいなら、
#define nullpo(x) (x += 1, gatu(x))
とかでいいんだろうけど、文となるとどーすんだろね。
わからんのです…
#define hoge(x) 1;((x)+1) a=hoge(x)+5; 完璧
…
マクロは置き換えだから値は返せないでしょ。 関数定義の中身だけマクロで置き換えるとかすれば擬似的には可能じゃないかと。
インライン関数で書く
inlineなんてマクロの足元にも及ばないね。
>>544 型に関して多相的、演算子を引数に取れる、その他一般に悪用ができる。
なるほど、納得。
>>535 マクロというより、Cの構文として破綻してないか?
マクロって、単なる置き換えだろ。置き換える前の文を書いてコンパイルしてみなよ。
それが無理なら、マクロも書けるはずがないと思う。
書けるなら、それをマクロにできると思う。
何かの変数に代入するようなマクロにしてマクロ内部で代入するか、 大人しく関数にすれ。
549 :
デフォルトの名無しさん :03/08/18 20:08
fgetc関数でファイルを読んでるんですが、 if(c == EOF)でEOFを取得できません(涙) 98では同じソースで動いたんですがXPだと落ちます。何が原因でしょうか?
>>549 char で受けてないか?
fgetc の戻り値の型は int だ。
551 :
デフォルトの名無しさん :03/08/18 20:15
>>550 charで受けてます。。。
しかし読み出した文字を返すんじゃないんですか?
あと98ではcharで受けてうまく動いたのはなぜでしょうか?
>551 読み込んだ文字またはEOFを返す。 >あと98ではcharで受けてうまく動いたのはなぜでしょうか? 多分 char が符号付だったから。
>読み込んだ文字またはEOFを返す。 もう少し正確に言うと 0 から 255 または -1 を返す。 これを符号付きの char にしまうと -128 から 127 の値に変換される。 符号なしの char にしまうと 0 から 255 の値に変換される。
>>551 読み出した文字か EOF を返す。
読み出した文字は char の範囲の全ての可能性があって、
それプラス EOF だから char におさまるわけが無い。
>>553 特定の環境に依存した情報だぁな。
1 バイトが 9 ビットの環境とかもあるし、
EOF が -1 かどうかはコンパイラ依存だし、
-127 から 127 しか表現できないマシンもあるのじゃ。
ありがとうございます。 納得しました。
まぁ、どっちみちintで受けろと。
>555 おっしゃるとおりです。
C言語の細かい仕様をちょっと確認させて。 char:8ビット short:8ビットより大きい int:short以上、long以下 long:short以上 で間違ってないよね? floatとdoubleの定義は覚えていないけど
char:1バイト 1バイト:実装依存
shortって16ビット以上じゃなかった?
long double も加えてほしい.
565 :
デフォルトの名無しさん :03/08/19 00:31
long≧intだじょ
>>565 559の定義を満たせばそれは自動的に満たされる、と論理学的に答えるテスト
なんでunsigned intのintを略さないのよ!? long intやshort intのintは略すくせに。 ひとりごとスマソ
じゃーどーして unsigned は書くのに signed は書かないの? と釣られてみた。
569 :
デフォルトの名無しさん :03/08/19 00:48
short>=int>=long でないの?
572 :
デフォルトの名無しさん :03/08/19 01:01
short ⇔ int long ⇔ int が正解のはずだ!!
>>559 >1 バイトが 9 ビットの環境とかもあるし
ビットが 8 つ集まったモノをバイトって言うんだろ?
574 :
デフォルトの名無しさん :03/08/19 01:09
ちうか今時、1バイト=8ビットでない環境なんであるの?
ビットが 8 つ集まったモノをオクテットと言うのです。
よく文法の説明ででてくる「式」って何よ? if(式) ... switch(式)....
>574 俺も知りたい。 PDP-10 のような 36ビットマシンでバイトが9ビットだったのは知ってるけど、 今でも現役のマシンで1バイトが8ビットじゃないのがあるのかなぁ。 Lispマシンとかかなあ。
578 :
デフォルトの名無しさん :03/08/19 01:14
真偽が定まるもの? 文は定まらないもの。文なんてイラネ
1バイトが8bitでない具体例を挙げられる奴いるのか?URLつきで
すまん自分で見つけた
Love Bite 仮に親不知が無いとして32 / 2 = 16です。
>580 教えてくれ。
584 :
デフォルトの名無しさん :03/08/19 01:20
>>576 a = 1 ←代入式
a ==1 ←比較式
a = 1; ←代入文
if(条件式)
>586 現役マシンはどれ? 死滅マシンしか見当たらない。
>>586 にあった某URLの
■問21■次のうち正しいのはどれ
○ 1バイト=6ビット
○ 1バイト=7ビット
○ 1バイト=8ビット
○ 1バイト=9ビット
と言う問題は答えが一つしか選べないのだが(ry
CやC++では;によって式を文に変換するそうです。
593 :
デフォルトの名無しさん :03/08/19 01:36
CHAR_BITって標準の定数じゃないの? C FAQ(だったと思う)にはそれがあれば・・・と書かれているんだけど。 標準に準拠していない処理系のことも考慮しているとか?
>>591 あの程度の問題でパソコンの神になれるのなら、
世の中、パソコンの神ばかりだな。(w
596 :
デフォルトの名無しさん :03/08/19 01:42
>>579 スレ違いだが、
sizeof(bool)はだめでつか?
597 :
デフォルトの名無しさん :03/08/19 01:47
文なんてものがある言語はダメ、らしいな
598 :
デフォルトの名無しさん :03/08/19 01:50
ステートメントは文?式?
599 :
デフォルトの名無しさん :03/08/19 01:52
文でしょ
文 : Statement 式 : Expression
601 :
デフォルトの名無しさん :03/08/19 01:53
>>599 >>600 さんくす。
そうか式はExpressionか。そういえばよくexpと書かれているね。
602 :
デフォルトの名無しさん :03/08/19 01:54
じゃなくてexprだ・・
603 :
デフォルトの名無しさん :03/08/19 01:55
argumentとparameterはどう違うんですか?
605 :
デフォルトの名無しさん :03/08/19 01:58
>>592 >CやC++では;によって式を文に変換するそうです。
ということはC言語のプログラム要素としては
Expression⊆Statement
という考えでいいのでしょうか?
606 :
デフォルトの名無しさん :03/08/19 01:59
↓このtypedefについて、なにか問題はありませんか? typedef int function(int); struct X { function* convert; }; int X_convert(struct X* p, int n) { return (*p->convert)(n); } ↓ならよく見るのですが、こっち(↑)はあまり見ないのでちょっと心配です。 typdef int (*function_pointer)(int);
argument はフォーマルな用語としての引数。 actual argument, dummy argument は、実引数、仮引数。 仮引数のことをparameterと呼ぶこともある。
>604 議論と媒介変数?
611 :
デフォルトの名無しさん :03/08/19 02:01
コンパイルできることは確認しました。 経験値が足りないだけなのかもしれませんが、 関数型をtypedefしてる他の人のソースを見たことが無かったのです。 なので、関数ポインタをtypedefするほうに一般的な利点がある (または、または関数型をtypdefするほうに一般的な欠点がある)かと、心配になったのでした。 コンパイルも通るし、見た目も好みだし、問題ないって言ってもらえたし、 心配がだいぶ収まりました、ありがとうございました。
>614 教科書、参考書、入門書のたぐいにはあまり書いてないので こう書けるのを知らない奴が多いと思う。 規格に則っているので心配する必要はないが、 無知な奴に指摘されるのがうざいので、 最近は一般的な書き方に迎合するようにしている。
確かに見た目も好みだとはおもう。 でも漏れだけの偏見では“関数ポインタ”を typedef してもらうほうが 違和感がなくていいなと。 いや、どちらでも問題ないんだけどね…
こんな夜中にC言語スレ大繁盛ですね
Ciscoのハブは、1byte=11bitじゃなかったのか...
>618 ほほー。しかも奇数か。
VC++.NET 2003のintは5バイト
あっキー押し間違えてる。本当は4バイト(32ビット)
622 :
デフォルトの名無しさん :03/08/19 06:45
質問です。 プログラムの実行中に、関数を動的に書き換えたいと考えています。 そこで、オリジナルの関数を宣言した時、 その関数のポインタを得ることは出来ますが 関数の終端を得るにはどうすればよいでしょうか? (この「終端」はアセンブラ命令でいうretの位置だと捉えてください)
Vector gResult = google("関数ポインタ");
あ、そっかそっか... 単純に先頭のポインタがわかれば pf=関数ポインタの先頭; while((pf++)!=retに該当するコード); じゃだめなの?
・・・すまん、いろいろ問題だらけだった。
>>622 脳内で修正よろしく
自己書き換えコード? やめとけ
いややっぱりやれ。作ったら見せてね 8086以前の遺物だけどな。C言語を併用できる開発環境があるのか知らんが
>>622 昔トリッキースレッドで話題になっていた記憶があるが、
たとえば関数が「JMP xxxxx;RET」となっていて実体が別の場所にある場合に
いったいどのようにするんだ?という問題がある。
またコンパイラは関数ポインタを使う場合に上記の出力をよくやるんだな。
ちなみに、本気でやろうと思った場合は、MAPファイルを出力させてどうこうする必要が出る。
何のためにするのかはわからないけれど、俺ならば外部アセンブリファイルで処理を書き、
それをリソースとしてもちながら、実行時にメモリに動的ロードして実行権限を付加する方法を取る。
>>629 たいていは、くだらない理由、
あるいはもっと単純な解決方法があるにもかかわらず、これしかないと思い込んでしまう初心者。
そもそも動的書き換えの意味がわからんのだが。
関数ポインタじゃなくって?
リアルタイムコンパイル(=インタプリタ)を目指してる・・・わけないよな。
>>622 本当はもっと実用的な方法を知っているが
あくまでここのスレタイに沿って回答する。
Cは命令書き換えを抽象化していない。
例:
void sine(void (*arasi)(void))
{
*arasi = 0xC3; /* error */
}
Cは関数のメモリレイアウトを定義していない。
例:
void osaan(void (*kimowota)(void))
{
sizeof *kimowota; /* error */
kimowota++; /* error */
}
よって質問で述べられている処理を実現するためには
これらをサポートする何らかの言語(例えばアセンブラ)を
使用する必要がある。
632 :
デフォルトの名無しさん :03/08/19 11:45
オブジェクトファイル形式が分っていれば、 別にCの枠内でも、動的なコード生成のプログラムぐらい 書けるんじゃないの?アセンブラでなければならないっていう 理由が分らない。
633 :
デフォルトの名無しさん :03/08/19 13:09
setjump マンセー
setjmpだったような・・
>>632 Cでアセンブラを実装してしまった場合とか考えると
はたしてアセンブラを使ったのか使っていないのか悩める
>>630 動的書き換えが必要な場合つーのはたいていアンチクラッカーなんだけど
636 :
デフォルトの名無しさん :03/08/19 14:28
C言語じゃないんですが、教えてください。 やさしいフォートラン講座に、 C**********消費税の計算*********** WRITE(*,*) '商品の値段?’ READ(*,*) PRICE 以下省略 とありまして、「ではプログラムを実行して、ためしに商品の値段を50円 として、”50”を入力して、Enterキーを押してください。」とありますが、 お笑いください。プログラムの実行の仕方が分かりません。これは、書籍ではあり ません。インターネット上の講座で、その出だしのところです。だれか教えて 下さい。
わはははははははははははは コンパイラ(かインタプリタ)は用意してあるのかい?
639 :
デフォルトの名無しさん :03/08/19 14:33
(*,*)
640 :
デフォルトの名無しさん :03/08/19 14:44
>638 ど、ど、どーもありがとうございます。SafordFTN77 Personal Edition Compilerを先ほどダウンロードしました。よく読み直したらDOSプロンプト を起動して、コンパイルのコマンドを入力する − とありました。 コンパイルのコマンドを教えてください。
>636にとってスレタイは、 // 言語なら俺に聞け! Part 63 という形に見えてしまったに違いない(w
643 :
デフォルトの名無しさん :03/08/19 14:49
cygwinでのgccでつくったa.exeをcygwinやってないW32で動かすにはどうすればいいんだ?
>>640 さすがに個々の事は分からんなあ
マニュアルに書いてあるんじゃないか
>>643 出来ないんじゃない?win32のgccを使えばいいと思われ
(´-`).。oO(なんでここの人たちはこんなに優しいのだろう?)
647 :
デフォルトの名無しさん :03/08/19 14:56
>646 ヒマだから。
648 :
デフォルトの名無しさん :03/08/19 14:57
>646 自作自演だから。
スレ違いが来なくなったのは
>>642 を実行したためではないかと疑ってみるテスト
650 :
デフォルトの名無しさん :03/08/19 14:58
642タイーホ!!!!!!!
>>643 gcc じゃなくて mingwin かなんかでコンパイルすればいいと。
Cygwin にあったと思う。
Cygwin gcc で作った exe は、cygwin1.dll をいっしょにもってけば動くと思う。
他にもなんか必要だったかもしれないけど。
653 :
デフォルトの名無しさん :03/08/19 15:15
>>651 便乗してお尋ねしますが、cygwin1.dll なしで動作する exe を
作るときはどうしたらいいんでしょ?
(多分FAQだと思うけど…)
スレ違いスマソ。
器物損壊
-mno-cygwinオプションで cygwin.dllにリンクしないの作れるんじゃないの?
逮捕かよ、手厳しいな
>>656 ありがとうです。FAQに答えが載ってましたよ。
>>653 そうやって人の優しさに甘えるのが
君の悪い癖だ。
>タイーホ まあここの住人で引っかかる香具師いたら超絶恥ずかしいわけだが それだけにマジ切れのおそれが・・・w
-無能-cygwin
>まあここの住人で引っかかる香具師いたら超絶恥ずかしいわけだが 犯人が必死に言い訳している
なんかネクラなレスだな。
犯人? どの事件の??
667 :
デフォルトの名無しさん :03/08/20 01:58
Main関数開始時刻と関数呼び出し時刻を関数で出力したいのですが、 #include <time.h> #include <stdio.h> void print_called_time(char *s_start){ time_t t_end = time(NULL); struct tm *tp_end = localtime(&t_end); char *s_end = asctime(tp_end); printf("ローカル時間(Main関数開始時刻): %s\n", s_start); printf("ローカル時間(関数呼出時刻): %s\n", s_end); }
でMain関数は int main(void) { time_t t_start = time(NULL); struct tm *tp_start = localtime(&t_start); char *s_start = asctime(tp_start); int loop = 0; int loop_max = 100000000; int dummy_value = 0; for(loop = 0; loop < loop_max; loop++){ dummy_value++; } printf("dummy loop execution completed.\n\n"); print_called_time(s_start); return(0); }
で結果が、 dummy loop execution completed. ローカル時間(Main関数開始時刻): Wed Aug 20 02:00:59 2003 ローカル時間(関数呼出時刻): Wed Aug 20 02:00:59 2003 でいつも(ループ回数を多くしても)同じになってしまいます. 何が悪いんでしょうか...
>>669 多分asctimeのせい。
あれは静的なバッファに文字列を格納し、改めて呼び出すと新しい文字列で上書きされるから。
あらかじめ元のデータをstrcpyで配列にコピーしておこう。
char *s_start = asctime(tp_start); これを char s_start[1024]; strcpy(s_start,asctime(tp_start)); こうするってこと。
出来た! ありがとう
>>671 でも、うーん、そういう物なのか...
$ diff time-test2-old.c time-test2.c
5a6
> #include <string.h>
20c21,22
< char *s_start = asctime(tp_start);
---
> char s_start[1024];
> strcpy(s_start, asctime(tp_start));
>>672 配列にコピーはせず、mainの最初で開始時刻を出力してもいいけどね。
>>673 さん、そうなんですが、実は関数の中で出力ファイルを開いて、
そこに「このプログラムの開始時刻: XXでした、終了時刻: XX」
とか他の実行logを色々と書いて後で読みたいのでこんなことを
したのでした. Thanks!
s_startを渡すより、t_startを渡す方がsmartだと思うのだけど。
scanf等で入力した数値分の配列を確保したいのですが、 「;がtypeのまえに必要です」というエラーがでます。どうしたらいいでしょうか?
sageているし、ネタかなぁ?
ネタでない場合、どうしたらいいですか?
>>676 calloc() 使え。
と釣られてみる。
いや、別にネタじゃないんですけど・・・。
>>679 callocってメモリ確保のやつですよね。使ったことないけどやってみます。
681 :
デフォルトの名無しさん :03/08/20 11:53
あのー、エラトステネスのふるいで素数列挙をするプログラムを組んでる んですけど、まぁだいたい想像つく通り、ある程度までやるとメモリが足りなく なってしまいます。そこで、こういった場合どうやって、その先をやれば いいのでしょうか?自分ではファイルに保存して(すでに見つかった部分を) 、使う時に配列に代入して・・ぐらいの方法しか思いつかないんですが、なん かものすごく遅そう、
682 :
デフォルトの名無しさん :03/08/20 11:54
上の続き、 で、どなたかご教授ねがいます。
>>681 あらかじめ2と3の倍数は除いて配列を作るとか。
それでだいたい全体の1/3くらいになったと思う。
686 :
デフォルトの名無しさん :03/08/20 12:08
>>685 えーと、もうそんな感じではなくて、とりあえず際限なく探せるって
感じにしたいんですよね。3倍とかではちょっと
内部記憶も外部記憶も有限だから「際限なく」は無理
688 :
デフォルトの名無しさん :03/08/20 12:25
>>687 まぁまぁ、そういった野暮な突っ込みはナシで、
ある程度際限なしってことでお願いします。
>>681 いいかげんスレ違い<素数列挙
素数関係のスレを探してみたか?
エラトステネスのふるいなんぞ使わずにひとつひとつ調べる。これ最強。
どの程度だよ(プ
>>692 DJBってこんな古いスタイルで書いていたっけ?
694 :
デフォルトの名無しさん :03/08/20 12:34
695 :
デフォルトの名無しさん :03/08/20 12:42
>まぁまぁ、そういった野暮な突っ込みはナシで、 >ある程度際限なしってことでお願いします。 何個だにょ? そにれよってやり方かわるじゃん
宣伝にひっかかった(鬱
698 :
デフォルトの名無しさん :03/08/20 13:01
>>695 1兆とかそのレベルまではいきたいかなと、
>>689 モチぽん全部読破しました。一応(難しくて20%ぐらいかわかんなかったけど)
でも、最近は全然更新されていないし、単純にプログラムの技術の事なので
こちらで質問させていただきました。
> 単純にプログラムの技術の事なので スレ違いじゃねーか w
一兆ケタって事?それとも、12ケタってこと?
701 :
デフォルトの名無しさん :03/08/20 13:05
djbのやつが15桁できる、って書いてあるやん。
703 :
デフォルトの名無しさん :03/08/20 13:09
>>702 それがどうかしましたか?
私は自分で書きたいのです。
704 :
デフォルトの名無しさん :03/08/20 13:09
705 :
デフォルトの名無しさん :03/08/20 13:13
>>703 こらニセモノ!!、まぁ、言いいたいことは間違ってない
んだけど、もうちょっと丁寧にね
>>705 まじかよ・・・
ソースを公開しているんだから(というかソースでしか配布していない)、参考にしなよ。
自分でやりたいなら、人に聞いてないで自分だけで解決しなー
708 :
デフォルトの名無しさん :03/08/20 13:51
まともな処理系でクリ使えよ
709 :
デフォルトの名無しさん :03/08/20 14:06
で、おまえは今何桁まで求められるの?
暗算で三桁
711 :
デフォルトの名無しさん :03/08/20 14:31
>>709 エラトステネスで1億ちょいぐらいなら、あと、ビットフィールドとかで
1ビットずつ使えば、8倍の8億前後ぐらいかな(試したけど遅いから
採用はしてない)
トムに可愛い娘のジェーンが生まれました。
>>675 レスありがと. しかしそれだとうまく行きませんでした?
time_tへのポインタを使ってアドレス渡ししてやると、
出力結果は、
dummy loop execution completed.
ローカル時間(Main関数開始時刻)(time_tポインタ渡し): Wed Aug 20 14:47:24 2003
ローカル時間(関数呼出時刻): Wed Aug 20 14:47:24 2003
のようになってしまいます.
使ったプログラムは下記に
#include <time.h> #include <stdio.h> #include <string.h> void print_called_time(time_t *ptr_t_start){ struct tm *tp_start = localtime(ptr_t_start); char *s_start = asctime(tp_start); time_t t_end = time(NULL); struct tm *tp_end = localtime(&t_end); char *s_end = asctime(tp_end); printf("ローカル時間(Main関数開始時刻)(time_tポインタ渡し): %s", s_start); printf("ローカル時間(関数呼出時刻): %s", s_end); }
int main(void) { time_t t_start = time(NULL); time_t *ptr_t_start = &t_start; int loop = 0; int loop_max = 100000000; int dummy_value = 0; for(loop = 0; loop < loop_max; loop++){ dummy_value++;} printf("dummy loop execution completed.\n"); print_called_time(ptr_t_start); return(0); }
MAX_ARRAY分ごとの整数区間をふるいにかける
>>715 +
>>716 がプログラムです.また関数へtime_tのアドレス渡しで
なく、time_tを値渡しにしてやっても結果は同じです.
まあ
>>670 >>671 >>672 の方法で出来たので良しとしてもよいのですが
time, localtime, asctimeの動作はまだよく理解できないところが
あるので気持ち悪いです.これらの関数は勝手にグローバル変数
を作ってしまうようなものなのかなあ...?
'\n'を一つ標準出力に出力するときどれが一番イケてますか? fputc('\n', stdout); fputs("\n", stdout); printf("\n"); putc('\n', stdout); putchar('\n'); puts("");
722 :
デフォルトの名無しさん :03/08/20 14:59
素数の方程式はもう見つかっているはずなので 算数板にいきなよ。 ビットが足りなかったら文字列として扱えよ 100桁でも200桁でもいけるし
なぜfprintfがないのだろう。
あ、分かった.
>>670 を良く読んでみたらasctimeを
関数中で呼び出す順番を1つ目の開始時刻のprintfの後に変えて
やればよさそうだと思いつき、
>>715 を下記のように変えました.
#include <time.h>
#include <stdio.h>
#include <string.h>
void print_called_time(time_t *ptr_t_start){
struct tm *tp_start = localtime(ptr_t_start);
char *s_start = asctime(tp_start);
printf("ローカル時間(Main関数開始時刻)(time_tポインタ渡し): %s", s_start);
time_t t_end = time(NULL);
struct tm *tp_end = localtime(&t_end);
char *s_end = asctime(tp_end);
printf("ローカル時間(関数呼出時刻): %s", s_end);
}
725 :
デフォルトの名無しさん :03/08/20 15:03
ctime
すると、
dummy loop execution completed.
ローカル時間(Main関数開始時刻)(time_tポインタ渡し): Wed Aug 20 15:03:12 2003
ローカル時間(関数呼出時刻): Wed Aug 20 15:03:18 2003
でOK!もちろんtime_tへのポインタを渡さないで、time_tを渡してもい
けます. Thanks
>>670 >>675 !!
>726 そういうこと。 まぁ、私ならstrftime()を使うけどね。 それから、>724でいくのならs_startとs_endは同じ領域を指すので 使いまわし可能なんで念のため。
>>725 localtime, asctimeを使わないでもctimeで出来るようですね.
使ってみましたが、asctimeと同じように使い方に癖がありますね.
#include <time.h>
#include <stdio.h>
#include <string.h>
void print_called_time(char *s_start){
printf("ローカル時間(Main関数開始時刻)(charポインタ渡し): %s", s_start);
time_t t_end = time(NULL);
char *s_end = ctime(&t_end);
printf("ローカル時間(関数呼出時刻): %s", s_end);
}
続く
int main(void) { time_t t_start = time(NULL); char *s_start = ctime(&t_start); int loop = 0; int loop_max = 100000000; int dummy_value = 0; for(loop = 0; loop < loop_max; loop++){ dummy_value++;} printf("dummy loop execution completed.\n"); print_called_time(s_start); return(0); }
>>728 でいった癖というのは、
"print_called_time関数(
>>728 )の中で1つめのprintfを関数中の
ctimeの後に持ってくるとやはり開始時刻が終了時刻に上書きされて
しまうと"いう意味です.
(プログラムを全部貼ってるとなんか2chサーバー上の領域を無駄に
しているような気がするなあ...diff結果を書いても読む人が面倒
だろうし.programをUpしてリンクを貼るとそのUpしたサーバーを
自分で管理しなければならないし.どうすべきなのかなあ.)
732 :
デフォルトの名無しさん :03/08/20 15:38
どうしてもいやならコピーすれば?
mainではt_startしか持たない。 void print_called_time(time_t t_start){ printf("ローカル時間(Main関数開始時刻)(charポインタ渡し): %s", ctime(&t_start)); time_t t_end = time(NULL); printf("ローカル時間(関数呼出時刻): %s", ctime(&t_end)); }
>>734 void print_called_time(time_t t_start)
{
time_t t_end = time(NULL);
printf("ローカル時間(Main関数開始時刻): %s", ctime(&t_start));
printf("ローカル時間(関数呼出時刻): %s", ctime(&t_end));
}
じゃないの?
>>727 =
>>675 ありがと.
つまりどうせ同じ領域を指していて上書きされるのだから、
s_startを終了時刻にも使えばs_end分(ポインタ一個分)だけ
関数が消費するメモリが節約できる、ということですね.
strffimeは...なんだこりゃ、引数が沢山ある.
ちょっと後で調べてみます.cftimeとかもあるし.なんで時間を
扱う似たような働きをする関数が沢山あるんだ!統一してよ.
737 :
デフォルトの名無しさん :03/08/20 15:47
TPOに合わせて使う。
740 :
デフォルトの名無しさん :03/08/20 16:40
>>738 板違いと思うよ
素数のどんな性質利用してんの?
それでどこでつまってんの?
ほんで素数の方程式は今のところコンピュータで実装
できないらしいので(たぶん)がんばれ
squrt()使ってるんやったら限界あんのとちゃうの
素数判定は多項式時間で可能
sqrt()
順に割っていけばいいんだから多項式時間じゃない?
順に割ったら多項式時間ではすまない
何の多項式時間?
何のって、計算量知らんのか? 大雑把に言えば入力データ量に対する プログラム停止までにかかる時間のオーダーだよ
747 :
デフォルトの名無しさん :03/08/20 17:46
>742 素数計算での開平は値そのものが問題なのではないってことを理解しているか? 計算自体は多倍長の足し算引き算だけだろ。記憶場所がかなり必要になるってだけだ。 だからまともな処理系で栗をつかってメモリ確保すればその処理系の最大オカレンスサイズまで使い潰して止まる計算だな
n個の数字を判定するのか、数nを判定するのかのどっち?
749 :
デフォルトの名無しさん :03/08/20 17:55
sqrtなんか使うなよ その時点で限界が見えるだろが
751 :
デフォルトの名無しさん :03/08/20 18:49
C言語の入り口で、泣いている諸君、いい本があった。倉薫氏が出した 「C言語(1)はじめてのCプログラミング」なら大丈夫。懇切ていねいとは 倉薫氏の書き方です。CD-ROMがついていて、失敗なしてインストールができるぜ。
多項式とかよくわかんねーよ、難しい用語はやめてくれ とにかく素数列挙の場合過去の素数で除算なんてしないよな? そんで俺の知ってる方法のひとつに平方を使うなんだけど 他の方法はなんだ?
>>753 すいません、レス遅れました。エラトステネスはやめてメルセンヌ素数
を探すことにしました。みなさんご迷惑おかけしてすいませんでした。
>>748 方向転換で数nという方向で
>>752 確率的なアルゴリズムでは、フェルマーテストや、ルビンテストなどがあります。
で、メルセンヌ素数の場合は、ルカステストで比較的容易に判定が可能です。
(2^n-1 n:素数)の形で表されます。
755 :
デフォルトの名無しさん :03/08/20 22:08
今さ、ふとトリビアを見つつ、C言語入門シニア編を読んでいた わけさ、そこでふとポインタも配列にできて、文字列を使う時に いいんだと書いてあってさ、要するに char *a[200]; とか宣言できるわけだ、んでもって配列の中身の文字数が少なく てもその分しかメモリ食わないって言うし、すげぇなと思ったわけよ。 でもさ、あんましみんな使ってるの見た事ないんだけど、なんか不便 なトコとかあんの? memcpy(a,"はなもげピー");とかできないとか、 char *b; b=a;みたいな事ができないとかあんの? どなたか教えてくんろ
上手くトリビアを絡めた質問じゃなきゃ(レスを求めるのは)難しい。
757 :
デフォルトの名無しさん :03/08/20 22:26
ポインタ先の文字列はメモリ管理しないといけないでしょ。
static const char *const hoge[] = { "foo", "bar", "baz", "gooo", }; とかよく使うけどな。
誰もmemcpyの引数リストについてはつっこまないんだな。
インド人だとネタとしか思えない。 ネタじゃないんだろうけど。
インドは代数学発祥の地だぞ
「インド人数学者」って、たまに、とてつもない天才が登場するというイメージがあるなぁ
>>765 インドは、今も昔も、数学先進国ですからね。
cygwinのgccなんですがタイマーイベント起こすようなライブラリ関数はないでしょうか? 例えば、for文でループ回していて1秒おきに内容を表示するなんてのを作りたいのですが。 for (int i=0; i<10000000; i++) { // 1秒おきにiの内容を表示したい }
それ、タイマー必要なのか? time()を使えばいいじゃん
769 :
デフォルトの名無しさん :03/08/21 10:09
わたしは超ビギナーです。通常は画面の最後ににC:\Lsic86>が出ているのに、 操作しているうちに、次の行が_のようなカーソルだけになりなした。 C:\Lsic86>が出るようにするにはどうしたらよいのですか。教えてください。
770 :
デフォルトの名無しさん :03/08/21 10:26
自己申告:exitでよかった。
>>768 time()ですか・・・擬似コードでもよいのでもう少し詳しく教えていただけませんか。
>>768 あっ、できました。
#include <stdio.h>
#include <time.h>
int main() {
int i;
time_t old, current;
time(&old);
for (i=0; i<200000000; i++) {
time(¤t);
if (current - old == 1) {
printf("%d\n", i);
}
old = current;
}
}
こんな感じでしょうか?
× time(?t); if (current - old == 1) { printf("%d\n", i); } old = current; ○ time(¤t); if (current - old >= 1) { printf("%d\n", i); old = current; }
ぬあ、"¤"なんて実体参照があるのか
>> 773 ありがとうございます。
>>774 なんか&currentって書こうとするとなっちゃいます。
でもこの方法だと無駄にwhile文回したりしないとできないんじゃないかと思えてきました。 Windowsだと何msおきにタイマーハンドラを呼び出すようなAPIがありますが、Linuxにはないのでしょうか?
すいません。Linux板いってきます。
(´-`).。oO(cygwinなのかLinuxなのか、どっちなんだろう?)
>>780 さりげなくヒントありがとうございます。
あれ、cygwinとlinuxってapiほとんど同じじゃないですか?
783 :
デフォルトの名無しさん :03/08/21 18:29
前に素数関連で質問をさせていただいた者です。こんにつは! 今、メルセンヌ素数を判定するルカス法の関数を見つけました。 で、この関数を用いて、非常に大きい素数の判定を行うとします。 しかし、大きな素数となると時間がかかる事は予想できている事なので、 当然1回(一度パソコンをつけている間)で判定しきれない場合も出てき ます。←一週間ぐらいつけとけ!!って突っ込まれそう・・・・ なので、この関数の内容のループの部分を少しずつやって、ファイルに どこまでやったかを保存して、みたいな方法を考えています。 でも、具体的にどうすればいいのかさっぱり思い浮かびません。 こんな感じにすればどう?ってアイデアがあればどなたかご教授くだ さい。また、他の方法があれば些細な事でいいので教えてください。 (GIMPSみたいな事をやりたいと考えていただけると分かりやすいと思います)
784 :
デフォルトの名無しさん :03/08/21 18:29
上で言っているコードです。 int lucas(int p){ char *l, *m; char *lp, *mp1, *mp2; int i, j, k; int ca, x; int ret = 1; if (p <= 0) return 0; if (p <= 2) return 1; if ((l = (char *)malloc(p)) == NULL) return -1; if ((m = (char *)malloc(p)) == NULL) { free(l); return -1; }
785 :
デフォルトの名無しさん :03/08/21 18:30
続き for (lp = l + p; lp != l; ) *--lp = 0; *(l+2) = 1; /* L(1) = 4 */ for (i = 2; i < p; i++) { for (lp = l + p, mp1 = m + p; lp != l; ) { *--mp1 = *--lp; *lp = 1; /* 2^p -1 mod 2^p -1 = 0 */ } *(l+1) = 0; /* L(i) = L(i) - 2 */ for (mp1 = m, j = 0; j < p; j++) { if (*mp1++) { /* this bit is 1 */ ca = 0; k = j; for (mp2 = m; mp2 != m + p; ) { /* L(i) * L(i) */ x = *mp2++ + *(l+k) + ca; *(l+k) = x & 1; ca = x >> 1; if (++k == p) k = 0; }
その素数に燃やす熱意がよく分からない
787 :
デフォルトの名無しさん :03/08/21 18:30
if (ca) { while (*(l+k)) { *(l+k) = 0; if (++k == p) k = 0; } *(l+k) = 1; } } } } x = *l; for (lp = l + p; lp != l; ) /* L(p-1) == all 0 or 1 ? */ if (*--lp != x) { ret = 0; break; } free(m); free(l); return ret;
788 :
デフォルトの名無しさん :03/08/21 18:31
>>786 あーコードの間に〜、まぁいいか。
素数・・・・・・・素晴らしいですよね!!
>>788 うざいので今度からはソースは貼らないでください。
>>783 >具体的にどうすればいいのかさっぱり思い浮かびません。
まずは本屋に行って、初心者用のC言語入門でも買いなさい。
791 :
デフォルトの名無しさん :03/08/21 18:44
区切りのいいところで自動的に全て保存するようにすればいい それでプログラムのスタート時に保存されたデータがあるかどうかを見て あれば自動的に読み込む。 OSの機能を使えばもう少し気の利いたこともできるが
書き込み中に殺されても問題ないようにするのを忘れないよう
794 :
デフォルトの名無しさん :03/08/21 19:04
>>792 プログラムの中の変数を全て保存しておくという事でしょうか?
やはり、そうするしかないですよね。(大変そうだ〜鬱)
795 :
デフォルトの名無しさん :03/08/21 19:04
796 :
デフォルトの名無しさん :03/08/21 19:06
798 :
デフォルトの名無しさん :03/08/21 19:09
>>783 リエントリ可能な関数にフラグをつけておき、if (kbhit()) getchar();であるキー
が押されたらそこまでに必要な変数をすべてファイルに保存する。
次回起動時にオプションを付けるかファイル名を指定したらそのファイルから
必要な変数を読み取って試合続行。
799 :
デフォルトの名無しさん :03/08/21 19:14
>>798 非常に参考になります。ですが、リエントリ可能というのは、
どういう事でしょうか?
kbhitはやめとけ
801 :
デフォルトの名無しさん :03/08/21 19:22
for (i = 2; i < p; i++) { ... } ここの部分長い。別関数にすべき。 for (lp = l + p; lp != l; ) *--lp = 0; forにまとめてインクリメントにするのが一般的。 for (lp = l; lp < l + p; lp++) *lp = 0; for (mp1 = m, j = 0; j < p; j++) { ポインタかカウンタかどっちかで、 for (mp1 = m; mp1 < m + p; mp++) j = mp1 - m; for (j = 0; j < p; j++) m[j]をつかう。
802 :
デフォルトの名無しさん :03/08/21 19:32
>>801 これは私が作ったわけではないです(汗)、もちろん私の方がこれ
を書いたであろう人よりレベル低いですよ。こんなスマートな
プログラムはまだ私には書けません。なので、そういったレベルの
高い指摘はうれしいのですが・・・・・・・ちょいと厳しい
803 :
デフォルトの名無しさん :03/08/21 19:34
あんまりレベルの高い指摘じゃないよ。 ロジック見直してないし。
if (*--lp != x) { ret = 0; break; } をfreeしてreturn 0;するようにすればretいらないでしょ。
>>802 どれくらいのレベルか知らないけど、
プログラムの流れが追えなければ、
中間状態の保存なんて無理だぞ。
806 :
デフォルトの名無しさん :03/08/21 20:06
>>805 そこん所はどうにかなりそうです。
for (i = 2; i < p; i++) {
の以降がネストの構造で、(インデントがなくなっていて本当に申し訳
ないんですが)まとまっているので、ここのループ1回の単位で保存して
おけば大丈夫っぽいです。また、内容も*lと*mの中身を配列としてあーだ
こーだしているだけなので、*lと*mを配列として内容を保存、pを保存、
てな感じにすれば大丈夫なはずです。
>インデントがなくなっていて本当に申し訳ないんですが 自分のサイトにでもテキストファイルのまま置いておけば問題ないんだから貼るな。 どうしても貼りたいなら、ちょっとした加工してインデントが見える工夫をしろ。 そもそも自分の書いたソースじゃないなら出展をポイントすれば充分。 そもそもおまえのレベルで長大な素数を(再)発見しようなんてのが無理。
ソーッス(素数、source)ね。 笑ってくれよ。 なぁ、アンタ。
809 :
デフォルトの名無しさん :03/08/21 22:47
>>807 まぁ、そう言われてみればそうなんですけど、挑戦してみたい
んです。
>>806 1桁1bitの多倍長演算しているっぽいから、1桁16bitくらいで処理すれば、
速くなりそうだけど。
812 :
デフォルトの名無しさん :03/08/21 22:55
どなたかFFTで計算ができる関数の置いてあるサイトとか知らない でしょうか?(無謀)
FFTのソースなどどこにでもあるだろう? 「FFTで計算ができる関数の置いてあるサイト」の意味はよく分からないが
814 :
デフォルトの名無しさん :03/08/21 23:03
>>813 そんなにいっぱいありますか?私がググった中ではソースが出てる
のは1つのサイトだけでした。そして、あまりに難しすぎて、利用
しようにも理解する事ができませんでした。(直接、乗算、除算
とかの関数じゃなくて、フーリエ変換を行う関数ならあるんですけど
そこからスタートでは無学な私では理解不能)
だいたいC言語の話じゃねーだろ。
>>814 どうgoogleで探したんだ?
fft source codeでいくらでも出てくるじゃないか
817 :
デフォルトの名無しさん :03/08/21 23:09
818 :
デフォルトの名無しさん :03/08/21 23:10
>>816 すいません。私は英語圏のサイトはちょっと
Webの全サイトの80%は英語と言われているのに 英語恐怖症は痛手だね
820 :
デフォルトの名無しさん :03/08/21 23:20
>>819 本当ですよ。特にプログラミングなんてのは(泣)、簡単な日常英語
みたいなのは分かるんですが、技術文書となるとチョット
>>820 普通、逆なんだがな。技術英語の方が読める。
プログラマの場合。
文系SE?
で、817 の奴、そんな分かりやすいの他にないと思うんだが、
何が分からないんだ?
823 :
デフォルトの名無しさん :03/08/21 23:43
>>822 あの、具体的にあのパッケージはどう使うものなのでしょうか?
MAKEFILEとかもGCC用とかで使えないし(使い方が分からない?)
ためしにコンパイルしても外部参照がどうのというエラーが出てしまうし、
どうにか計算するのに必要な部分だけを抜粋していただけるとあり
がたいです。
>>823 俺、そのソース普通に VC++ で使ってるぞ。
まあ、最小限必要な分は、fftsg.c だけで OK
void rdft(int n, int isgn, double *a, int *ip, double *w);
↑これが実信号のFFT
void cdft(int n, int isgn, double *a, int *ip, double *w);
↑これが複素信号のFFT
詳しくはコメント読め。英語読めないとか言うならもう使うな。
これ以上に分かりやすい奴で日本語コメント入った奴なんてない。
っていうか、プログラマ辞めたほうがいいよ、マジで。
825 :
デフォルトの名無しさん :03/08/21 23:54
>>824 プログラマではないんです。ヘッポコ理系学生なんです。
ちょっと数値計算に必要になったので
827 :
デフォルトの名無しさん :03/08/22 00:02
>>826 見捨てないで下さい〜、回りもバカばっかでそんなヤツいないん
です。
おねがいです。計算をするのに必要な手順を教えて下さい。
例えば、
1、フーリエ変換
2、計算
3、逆変換
↑まったく適当ですが
とか、必要な関数とか手順がさっぱりなんです。
問題がどんなものかわからん。 あと宿題なら宿題スレへ。
829 :
デフォルトの名無しさん :03/08/22 00:11
わかりました。逝ってきます。みなさんマルチとか言わないで下さいね
832 :
デフォルトの名無しさん :03/08/22 15:01
決勝の結果です。 ┏━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┓ ┃ ┃ 1 ┃ 2 ┃ 3 ┃ 4 ┃ 5 ┃ 6 ┃ 7 ┃ 8 ┃ 9 ┃ 計┃ ┣━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━┫ ┃東北┃ 0 ┃ 0 ┃ 1 ┃ 0 ┃ 2 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ 3 ┃ ┣━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━┫ ┃常総┃ 0 ┃ 0 ┃ 2 ┃ 1 ┃ 0 ┃ 0 ┃ 2 ┃ 2 ┃ / ┃ 7 ┃ ┗━━┻━━┻━━┻━━┻━━┻━━┻━━┻━━┻━━┻━━┻━━┛ 本当ですか?
#include<stdio.h> int main(void){ int i; for(i=17;i<=101;i=i+1)if((i%17)==0)printf("%d ",i); return 0; } だと、ちゃんと実行されるのに、 #include<stdio.h> int main(void){ int i; for(i=17;i<=101;i=i++)if((i%17)==0)printf("%d ",i); return 0; } だと無限ループになってしまうのはなぜ?コンパイラのバグですか?
#include<stdio.h> int main(void){ int i; for(i=17;i<=101;i=++i)if((i%17)==0)printf("%d ",i); return 0; } にすればいいのか!(βακα)
835 :
デフォルトの名無しさん :03/08/22 18:27
× i=++i × i=i++ ○ i=i+1 ○ i+=1 ○ i++ ○ ++i
837 :
デフォルトの名無しさん :03/08/22 18:31
838 :
デフォルトの名無しさん :03/08/22 18:39
>>835 インクルリメントの仕組みを理解していなかった。あなたのようにおつむがよくないんで。
> i=i++ > i=++i お馴染みネタな釣りかと思った
840 :
デフォルトの名無しさん :03/08/22 18:44
結果が100bitを超えるような大きな値の累乗や乗算をしたいのですが、 それが出来るような関数やソースってありますか? 一応探してみたんですけど見つかりませんでした...
>>839 やっぱりネタか釣りみたいだぞ。インク「ル」リメントとか言っているし。
>>840 128bit整数型を持っている処理系を使うのが一番。
>>840 どうやって探したんだろう。
googleで「100bit 超える 関数」とかですか?
「多倍長整数」でもう一度探しなおせ
845 :
デフォルトの名無しさん :03/08/22 19:35
846 :
デフォルトの名無しさん :03/08/22 19:44
>>845 840じゃないんだけどさ、ここのサイトのってGccじゃないと使えないの?
VCじゃだめ?
847 :
デフォルトの名無しさん :03/08/22 19:59
i=i++ は Linuxでは正しく動作するのに、FreeBSDでは動かない。FreeBSDは糞だ。
お騒がせしました
>>783 です。
とりあえず、配列や変数をファイルに保持しておくというアイデアで進める
事にしたのですが、プログラムの都合上、保持してあるデータをいじられると
非常に困った事になるので、バイナリで保持しておこうという事にしました。(
サイズの関係もありますが)しかし、バイナリを扱うのは初めてでしてよくわかり
ません。また、VBのようにSplit関数でもあれば、全部一気に読みこんで、
分割してというような方法もとれるのですが、そうもいきません。
そこで、ちょっとした例をソースとして書いていただけると非常に助かる次第
です。お願いばかりですがよろしくおねがいいたしまう。
char *a,*b;
と宣言されていて、メモリを確保後、要素数はA,Bになっているとします。
これをスマートに書き込み、読み込み、配列に代入し直す方法を
おねがいしまふ。
>>849 ↑文字列ではなくて、配列の要素の中に数字が入っています。
>>849 要素数A+Bで一気にfread()して、malloc()した後memcpy()で分割すればいい
じゃん。
852 :
デフォルトの名無しさん :03/08/22 20:58
>>842-847 ありがとうございます。勉強になりました。
「多倍長演算」という言葉は知りませんでした。
構造体の場合 +----------+--------------+----------------+ | | 普通に宣言 | ポインタで宣言 | +----------+--------------+----------------| | アドレス | (*str).mbr | &str->mbr | +----------+--------------+----------------| | 値 | str.mbr | str->mbr | +----------+--------------+----------------+ 変数の場合 +----------+--------------+----------------+ | | 普通に宣言 | ポインタで宣言 | +----------+--------------+----------------| | アドレス | &name | pname | +----------+--------------+----------------| | 値 | name | *pname | +----------+--------------+----------------+ あのう・・・&と*の使い方ってこれであってるんですか? &と*の使い方に一貫性が無くて納得できないんですが・・・
>>853 構造体の場合
普通に宣言 ポインタで宣言
アドレス &str.mbr &str->mbr
値 str.mbr str->mbr
だろ。
>>848 i=i++; の結果はANSI-Cでは「未定義」です。ディスクがフォーマット
されたって文句は言えないのだよ。
857 :
デフォルトの名無しさん :03/08/22 21:32
>>841 ネタじゃないです。でもはやとちりみたいなもんだから迷惑かけたのは事実。
前に++があると先に1を加えて後ろにあると先に代入するんですよね。
頭がこんがらがりそうな話だ。
>>856 knkたんには、それがわからんのです。
ヽ ̄ ゙̄\ \ ヽ \ ヽ ゙! / ̄ ̄ ̄ ̄ ̄ ̄ ̄ / |< 呼んだー? / ,.イ \_______ ∠___/ :|`ヽ.、 ノ '! \-、 _,.=''1 ヽ, `' ヽ'" i| | ! |
>>848 ヽ ̄ ゙̄\
\ ヽ \
ヽ ゙! / ̄ ̄ ̄ ̄ ̄ ̄ ̄
/ |< FreeBSD-users-MLの連中にはそれがわからんのです
/ ,.イ \_____ (⌒;:)
∠___/ :|`ヽ.、 (⌒ :::..ヽ (⌒::;
ノ '! \-、( ⌒Y:: : : :::::..;;:: j
_,.=''1 ヽ, ...;:::/...::: : :⌒ ̄""⌒ヾ
ヽ'" i| : :::.....:: ::: ::/::: ; ": ̄ ::)
! ,,..:;::::;::::::/:'(: : : ;;:;: ⌒ ⌒)
ノ.....:::;::::/;:/:::::::::ノ;;::::::; : ... ....::::ノ
出ると思ったknkタンw
857はすっかり放置されているな
なつかしいな、knk
864 :
デフォルトの名無しさん :03/08/23 08:13
>>851 簡単でいいのでソースをさらしていただけないでしょうか?
また、その方法は読み込みだけのようなので、書き込みの
方も教えていただけるとこれ幸いです。
質問です。 バイナリで、ファイルを閉じるまでに、何度か書き込みを行った場合、データには 自分で何かしない限り区切りって入りませんよね?
何度も質問してすいません。Cでプログラムのあるパスを取得する にはどうすればよいのでしょうか?DOSプロンプトでプログラムを 走らせながら、別の事をユーザーがするかもしれないので、 カレントパスが移動してしまうとまずい事に・・・・・・・ あと、一応使っているのはVC++です。
>>866 コールバックする。ウインドウズアプリケーションなら普通に使うが、
それをコンソールに使用する。
>>867 非常に申し訳ないんですが、コールバックとはどういう事で
しょうか?また、VC++ですが、使えるのはC言語だけな
ので、クラスとかはさっぱりなのですがOkですか?
>>865 バイナリだから当然です。
>>866 最初に一度カレントディレクトリを取得して、
あとは常に絶対パスでアクセスすればよい。
>>869 >バイナリだから当然です。
何を訳の分からんことを。
訳の分からない質問に訳の分からない回答
>>869 そのカレントパスを取得するという所がどうやるのか
わからないのですが
874 :
デフォルトの名無しさん :03/08/23 10:57
GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
>>874 すみません、Xlib使いたいんですけどどこの
開 発 環 境 ス レ
に行けばいいですか?
夏だなぁ。
>>879 同意。関数ポインタを渡す関数に渡される関数はほぼ間違いなくコールバック関数になる。
夏だなぁ。
>>877 親切にありがとうございます。
しかし、VBから呼ぶ、擬似外部関数として作るので、
面倒なのでShellの時に、APP.PATHで取得した
パスを引数で与えてやろうと思います。
大変ご迷惑をおかけいたしました。
883 :
デフォルトの名無しさん :03/08/23 11:54
ふと思ったんだけど、ファイルをOpenして、それがなくて、 NULLが返ってきてた場合って、フィルポインタをCloseする 必要てあるんの?
884 :
デフォルトの名無しさん :03/08/23 11:54
885 :
デフォルトの名無しさん :03/08/23 11:57
886 :
デフォルトの名無しさん :03/08/23 11:59
>>885 マジメなヤツなのか、危ないヤツなのかよくわからんな
char *l, *m; int p FILE *fp1; 書き込み fp1=fopen("CulculateData","wb"); fwrite(&p,1,sizeof p,fp1); fwrite(l,1,p,fp1); fwrite(m,1,p,fp1); close(fp1); 読み込み fp1=fopen("CulculateData","rb"); /*ファイルが存在するかたしかめて存在する場合すべて読み込む*/ if(fp1!=NULL){ fread(work,sizeof p,1,fp1); p=*work; fread(l,sizeof l,1,fp1); fread(l,sizeof l,1,fp1); } ファイルの先頭にIntで要素数をくっつけるようにしました。 こんな感じでOKでしょうか?
>>883 NULLが返ってきた場合、fcloseには何を渡したらいいんだ?
>>887 こらこらfopenの戻り値をcloseに渡してどうする
で、これを警告しないコンパイラだとpにも妙なことが起きても知らんぞ
891 :
デフォルトの名無しさん :03/08/24 02:34
for(i=0; i<100; i++) gikoneko[X] = gikoneko[X] | gikoneko[i]; これをアセンブラで書くとどうなりまつか?
-Sでアセンブラ出力しない?
893 :
デフォルトの名無しさん :03/08/24 02:47
フリーのコンパイラなんで出ないみたいです。
gcc bcc lsicあたりは全部出せるはずだけど 確かめもしないで書いてたら笑い マイナーコンパイラ使ってたら大笑い それでもwatcomやdigitalmarsなんかは出せそうだけど
xor edx, edx mov eax, 100 l1: or edx, _gikoneko[eax*4-4]; dec eax jnz l1 mov eax, _X or _gikoneko[eax*4], edx mov _i, 101
>>891 >>これをアセンブラで書くとどうなりまつか?
微妙な質問だな。
誰かがZ80のコードを提示して、他の誰かがPS2のEEのコード出して
またまた誰かがMMX使用のコードだしてって有り得ない話じゃないぞ。
x86系の事だと思うんだけど…
move r1, 0 move r0, 4 * 100 l0: sub r0, 4 or r1, _gikoneko[r0] test r0 jmp nz, l0 move r0, 4 * _X or _gikoneko[r0], r1 move _i, 101
よく考えたら、iは最後100だな。 どうでもいいが。
反応しろよてめーら
900 :
デフォルトの名無しさん :03/08/24 08:28
900げっと
nt main(int argc,char* argv[]){ ←二個目の引数でパスを渡す char path[20]; strcpy(path,argv[2]); chdir(path) こんな感じでやっているんですが、コンパイルすら通りません。 VCでchdirとか入力すると引数候補とかが表示されるのに、 それは定義されていませんんと出ます。なぜでしょうか? 環境==VC++ (VBスレに誤爆してしまった 笑)
んtね
エラーメッセージ読め
904 :
◆ZtXjKqCmiQ :03/08/24 08:58
>>901 関数が定義されていません?
C++スレに行ってください。
というかVC++スレに。
#include <direct.h>と名前欄に入れたらトリップになっちゃった・・・
イベントビューアをリアルタイムで監視して、新しくイベントが追加された 場合はそのイベントのソースを取得する・・・というのはどうすれば良いでしょうか。
わーっつたよVCすれ行くよ。でも、別にVCとか 関係ねー内容だと思うんだけど〜
とにかくC言語には関係ない。Cではエラーにならない。
しかし、いつも思うけど、 ディレクトリ操作が標準関数にないのは面倒な話だよな。 まぁ、ディレクトリのないファイルシステム(MS-DOS ver 1.0 とかそうだっけ?)もあるし、 分からんでもないんだけど...。
RDBを永続的データ保存形式として採用してるOSがあったとしたら、 Cは標準関数としてデータベース操作関数ってものを持たなくてはいけないわけ? CはOSに必要とされる関数の最小公倍数を提供するものでもないし、 そもそも、C関数の形式はのOSのインタフェイスとして必須なわけでもない。 みんなUNIXの概念に毒されすぎ。
それならストリームを扱う関数は(ry
最近のOSは、どれも階層的なディレクトリ構成を持っている[ように見える]から、 階層ディレクトリを扱う、準標準ライブラリが欲しくなったりする。 POSIXみたいな、実装側からのアプローチでなく、 言語側からのアプローチとして...
>>913 冗談抜きでHosted Environmentの存在意義を疑いたくなることよくあるよ
ぶっちゃけUNIX以外は全てFreestanding Environmentでいいんじゃないか?
ライブラリはライブラリで別の規格があっていいはず、あるべきと言いたい
>>915 言語として、環境ごとに標準ライブラリを定めるのはいいけど、
独立した環境とみなせるものの数って、そんなに多くはないような。
だったらOS標準のAPIさえあればいいってことにならない?
言語側でそういったものを定めること自体、OSベンダとそのユーザに
なんの利益があるのかと。
現行の標準ライブラリが必ずしもいいとは言わないけど、
これをいったん捨てたら、新たなライブラリの規格なんて永遠に定まらないと思う。
定めても誰も守らないSQL99みたいな存在かも。
UNIX/Cの影響力は良くも悪くも偉大だってことなんかなあ。
おまえらなあ時代背景を無視してムチャ言うなと。当時の計算機の機能抽象化は これで十分かつポータブルだったんだよ。ぶっちゃけもうCは骨董言語だからな。
>Cは骨董言語 具体的にどんなところが? GCとか言い出すナンチャッテPGはもう見飽きたよ
オブジェクト指向
じぇねりっく
普通Cはアセンブラ想像しながら書くだろ。
C++ でも想像するけどね。
923 :
デフォルトの名無しさん :03/08/25 09:40
今でも現場で使われている言語を「骨董」と言う917は、まぁアレだ
925 :
デフォルトの名無しさん :03/08/25 09:56
そういうのはさあ、「生きている化石」と呼ぶんだよね。
>>924 は美術館に飾られている昔の芸術作品を
骨董とは言わないのか?
「void型を返す関数へのポインタ」の配列を 指す関数ポインタはどう書けばいいんでしょうか? えっと、つまり char foo[] = "ABCDE\0"; char *boo = src; と変数を作って printf("%c", boo[2]); みたいにポインタを配列のように使うのを関数ポインタでやりたいのです。
>>926 現場で使う=美術館で飾る
なのか、お前の言語感覚では?
929 :
デフォルトの名無しさん :03/08/25 10:19
>>927 void型を返すってのは戻り値なしととっていいのか?
「void型を返す関数へのポインタ」の配列まではOKだが、それをさす「関数」ポインタってのがわからん。 あと、char foo[] = "ABCDE\0"; の\0はいらない。
うん。最後の「指す関数ポインタ」ってのが全く意味不明だよな。 それ以外なら普通にtypedefして配列作ればいいだけだし ポインタにしたいなら*付けて先頭を代入するだけだし それを返す関数も簡単だし。 宿題でtypedef使っちゃダメ、な気配もするけど。
>>930 関数ポインタっていうか、ただのポインタとして宣言してしまうと
引数が取れないじゃないですか。
ポインタ名の最後に"()"が付いてないと、ポインタ越しで関数を呼び出すときに
BCCでは「関数でないものを呼び出している」と怒られます。
「void型を返す関数へのポインタ」の配列を指すポインタを返す(または引数に取る)関数へのポインタか?
typedef void voidfn_t(int arg1, int arg2); voidfn_t *table[] = { fn1, fn2, fn3, }; voidfn_t **p = table; table[0](1, 2); (*p)(1, 2); みたいな
>>933 ん?
typedef void (*func_t)(int,char *);
func_t funcpa[3];
(中略)
funcpa[1](0,NULL);
funcpa[0](80,"string");
こんな風にできるはずだけど?
引数は何を持つんだ?&typedef使っちゃ駄目なのか?
いや、俺は927じゃないんだが
>>939 あ、すまん。935はなんの問題もないわ。
>>936 やりたいことは
>>935 さんの方が近いです。
関数ポインタの配列を作るところまではいいのですが、
それをそのまま参照では都合が悪いのです。
ちょっとコード書いてみたので、分けてカキコします。
>>937 引数はいろいろです。型チェックはできなくてもいいので、
どんな引数でも受け取りたいのです。
typedefは使ってもOKです。
void foo(int n) { printf("%d\n", n); } void boo(char c) { printf("%c\n", c); } void (*FuncArr[])() = { foo, boo, }; ????? ArrPtr; /* 何かしらの文でポインタを宣言 */ ArrPtr = FuncArr; ArrPtr[0](5); ArrPtr[1]('n'); と、いう感じ
文字リテラルってCではcharじゃなくてintだったような。 引数の型をチェックできないから(ry
> 引数はいろいろです。型チェックはできなくてもいいので、 > どんな引数でも受け取りたいのです。 配列への格納時と呼び出し時にキャストしてやらんと駄目になるな
void (**ArrPtr)()=FuncArr;かな。わかんないけど。
>>944 格納時はいらないんじゃない?引数の型のリストを省いているから。
とりあえずtypedefすりゃ簡単になるって。 あと、引数が不明(or可変)なら typedef時のプロトタイプ引数リストをあえて省略すれば。 union使う手もあるけどな。
>>928 芸術作品に展示する以外に使い道があるとでも?
まだやってんおか、そもそも現場で云々に 「げいじゅつさくひん」を持ち出すのがバカタレ
>>945 ああ! それです! 動きました!
でもなんか意外と単純だった...何でこんなのに一晩悩んだんだろ?
鬱だけどせっかく分かったんでこれからプログラミングします。
つまらんことでお騒がせしました。
>>947 これからは typedef を使うようにします。
でも実は typedef void (*func_t)(int,char *) の意味が分かってなかったり...
これで func_t っていう void ???(int, char*) の関数へのポインタの型が
できているのはわかるのですが、なぜそうなるのかが...
typedef unsigned int UINT; とかしか見た事がないので。
>>951 変数の宣言文と同じ風に書いて、頭に typedef を書く、
というのが typedef の文法。
typedef void (*sigh_t)(int); sigh_t signal(int sig,sigh_t func); typedefすればこれだけ見やすくなる。
>>953 なるほど、そう言われれば簡単に理解できそうな...
大抵の本には、「前に書いた型にあとに書いた別名をつける」みたいな事が
書いてありますけど、あれじゃ
>>936 は理解できませんな。
説明thx!
そういえば配列を表す型ってのも typedef int array_t[10]; こうかくな。関数定義の頭にtypedefか。
関数定義じゃなくて変数定義
#include <stdio.h> void (*(*foo3(void (*fp)(void (*)(int))))(void (*)(int)))(int); typedef void (*FP1)(int); typedef void (*FP2)(FP1); typedef FP1 (*FP3)(FP1); void foo0(int n ) { printf("%d\n", n); } FP1 foo1(FP1 fp) { return fp; } void foo2(FP1 fp) { fp(2); } FP3 foo3(FP2 fp) { fp(foo0); return foo1; } int main(void) { foo3(foo2)(foo0)(4); return 0; }
>>955 大抵の本の作者はtypedefをそこまで使い込めてないか、
説明放棄しているか、孫引きしているからだね。
>953みたいに現場で使い込んでいる奴の説明は、
端折っているように見えて実は分かりやすいね。
#参考にさせてもらおう。
あー、疲れた。
そういえば、Linuxの開発MLでも、「C++でカーネル書き直そうよ」 っていう厨房がたまに出没するなあ。
「Cで初めて書かれたプログラム」とか「すごいハカーの作品」とかは、骨董・作品 Cという言語そのものは、美術で言えば、水彩画・油絵といった、道具・手段 プログラムは、年代によって変化する、技術・技法
>>964 ぜんぜんわからん
一体それの何をCのどこに比喩しかったんだ?
# 漏れは16年目のC++屋だが
966 :
デフォルトの名無しさん :03/08/25 22:12
void ClearCanvas(int w, int h, int col, int *cnv){ int *p; int *max = cnv+(w*h); for(p=cnv; p<max; p++){ *p=col; } } colで領域を埋めるんですが、遅いんです。 100倍速にするにはどうすればいいですか?
> 100倍速にするには for(p=cnv; p<max; p+=100) { *p=col; }
>>966 void ClearCanvas(int w, int h, int col, int *cnv)
{
#if UINT_MAX != 0xFFFFFFFFu
#error その CPU/コンパイラ 用のコードに変えてね
#endif
__asm {
mov ecx, w
mov edx, h
imul ecx, edx
mov eax, col
mov edi, cnv
rep stosd
}
}
971 :
デフォルトの名無しさん :03/08/26 00:16
VCインストールしたらcygwinでのコンパイルですべてヘッダファイル参照できなく なりました。どうしたら回避できますか?
972 :
デフォルトの名無しさん :03/08/26 00:28
INCLUDEって環境変数。かもしれない
973 :
デフォルトの名無しさん :03/08/26 00:40
INCLUDE禍しるみたいです。そこでVCのLIBフォルダへのパスを退避させて 試してみたのですが、それでもだめでした・・・ タダ単にcygwinがおかしいみたいです。お門違いですが、gccが参照する ヘッダファイルのパスが書いてある設定ファイルは何かとかどなたか教えてください。
974 :
デフォルトの名無しさん :03/08/26 00:58
/usr/include /usr/local/include あと-Iオプション のような気がします
gcc -v
977 :
デフォルトの名無しさん :03/08/26 01:10
#include "..." search starts here: #include <...> search starts here: /usr/include/w32api /usr/lib/gcc-lib/i686-pc-cygwin/3.2/include /usr/include End of search list. client.c:10:21: stdio.h : No such file or directory client.c:11:22: string.h : No such file or directory client.c:12:25: sys/types.h : No such file or directory client.c:13:26: sys/socket.h : No such file or directory client.c:14:22: sys/un.h : No such file or directory client.c: In function `main': client.c:20: storage size of `addr' isn't known client.c:31: `PF_UNIX' undeclared (first use in this function) client.c:31: (Each undeclared identifier is reported only once client.c:31: for each function it appears in.) client.c:31: `SOCK_STREAM' undeclared (first use in this function) client.c:44: `AF_UNIX' undeclared (first use in this function) client.c:60: `stdin' undeclared (first use in this function) ・・・/usr/includeみてますね・・・・でも見つからないっていいます・・・ 謎だ・・・
979 :
デフォルトの名無しさん :03/08/26 01:34
わしもわからんので ”cygwin + mingwn + gcc 相談室” ってのにいってみたら?
980 :
デフォルトの名無しさん :03/08/26 01:56
1000
>>977 デスティネーション インデックス レジスタ。
movsb とか stosb とかの出力アドレスを指定するのに使えるけど、
普通の 32/16 ビットレジスタとしても使える。
埋め立てしないの?
んじゃ、埋め立てスタート〜
984
985
Intel 9x86 Family?
987 :
デフォルトの名無しさん :03/08/27 11:24
(すまん、埋め立てなのに上げてしまった)
Intel Pentium VII 989GHz
記念カキコ v(^-^*)
(*^o^)ノシ 996だよ
記念カキコ v(^-^*)
記念カキコ v(^-^*)
記念カキコ v(^-^*)
1000 :
デフォルトの名無しさん :03/08/27 12:45
1
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。