C言語なら、俺に聞け! <31>
■ このスレッドは過去ログ倉庫に格納されています
0001SHOW-A息子
NGNGいろいろな言語を極めたが、一番漏れになじんだのはCだった。
Cのことなら父をも超えた。疑問な点があったら漏れに聞け。
便所とメシ食ってる時以外は暇だが、いちいちFAQに載った質問に応えるほど暇じゃない。
課題丸投げなら別スレにいけ。あと、至急父に仕事を与えてやってください。
コンパイラ、過去ログなどのリンクは>>2-5 あたり
0153デフォルトの名無しさん
NGNGtypedef struct{
}c;
だった場合,c.func()ってなるの?
戻り値の型が違ったりしているのも,メンバに含んでもイイのかな?
0154デフォルトの名無しさん
NGNGreturn x * x;
}
typedef struct {
int (*func)(int x);
} crass;
int main(int argc, char **argv) {
crass t;
t.func = calc;
printf("%d\n", t.func(3));
}
こうかな。
0155デフォルトの名無しさん
NGNGこれって、インスタンス毎に初期化するの?
Cだと構造体のメンバをstaticに出来ないんだね、今知ったよ。
0158デフォルトの名無しさん
NGNG小さなコードをDLLにしても、20KB以上の容量になるんで、
バイナリエディタで覗いたらNULLがいっぱい…
このNULL文字の列は何か意味があるんでしょうか?
MFCはスタティックライブラリを使用する設定になっています。
0159デフォルトの名無しさん
NGNGスレ違い
0160デフォルトの名無しさん
NGNG~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
こういう
文字列リテラルの参照渡しっこんな感じでいいんすかね?
つーか、やっていいのかな?
0161160
NGNGはぁ・・・
0162デフォルトの名無しさん
NGNGつまり、
void showA(char **name)
{
*name = "sage";
}
こういうことをやっても問題ないだろうか
ってこと?
そうなら、別に問題ない。
0163160
NGNGえっと、
void showA(char **name);
void showA(chae **name){
printf("%s\n",(*name))
}
void Main(){
char *name="microsystems";
showA(name);
}
みたいな感じです。よさそうっすね。
(゚∀゚)サンクスコ !
0164160
NGNGvoid showA(char* *name,int* age);
void showA(char* *name,int* age){
printf("name:%s\nage:%d",(*name),(*age));
}
int main(){
int age=43;
char *name="microsystems";
showA(&name,&age);
return 0;
}
ちょっと上違ったけど、できました。
これって値渡しより、関数呼び出し時に、新しい変数領域が確保されないので
効率的なんすよね?
0165デフォルトの名無しさん
NGNGとかって、普通に使われてるものなんでしょうか。
素朴な疑問なんですけども。
0166デフォルトの名無しさん
NGNG何ですか?これは?
0167デフォルトの名無しさん
NGNG(ついでに 163 はうっかりミスが2ヶ所あるよ)
> これって値渡しより、関数呼び出し時に、新しい変数領域が確保されないので
> 効率的なんすよね?
渡すのが構造体/共用体ならともかく、整数では
効率が下がることはあっても、上がることは
(通常の処理系では)考えられない。
それどころか、呼び出し側の最適化を邪魔することに
なるので、ほとんどの場合、処理が遅くなってしまうはず。
Cの場合、参照渡しと言うよりも「ポインタの値渡し」なんだから、
引数用の領域(それがスタックであれレジスタであれ)が使われる
ことには変わりない。
0168160
NGNG>164が修正版っす。
やっぱり意味ないのですか〜
処理の負荷は上がって、メモリ効率はよいような気が。
引数の部分で(呼び出し元の変数がコピーされて)無駄に消費
されるのではないかな、と考えたわけですが。
上のようにポインタの値渡しをすれば、
引数用の領域には呼び出し元の変数へのpointerが格納されるのかと。
違うのかなぁ^^;そこら辺はコンパイラの最適化の範疇なんでしょうか。
0169160
NGNG呼び出し先で、呼び出し元の変数の値を変更(同期)したい場合
なんかによく使われるのでは。あ、コーディングスタイルの問題?
0171167
NGNG> 上のようにポインタの値渡しをすれば、
> 引数用の領域には呼び出し元の変数へのpointerが格納されるのかと。
これだけは合ってるよ。
だから、(元の変数の領域とは別の) 引数用の領域に
char** と int* が入るか、
char* と int が入るか
の違いでしかない。
どちらも引数用の領域を必要とすることには変わりない。
その領域のサイズは処理系に依存するが、たとえば
UnixとかWin32なら 前者でも後者でも4*2バイトだね。
> そこら辺はコンパイラの最適化の範疇なんでしょうか。
最適化というより、呼び出し規則が決まってるのが普通。
実際のところ、どんな処理系を使ってるの?
0172160
NGNGLinuxでgcc3.2っす。
0174160
NGNGここらへん見ると、
http://www.google.co.jp/search?q=cache:3suLwvNaZI0C:www.alfasystem.net/dojo/room5/LectureC/c09.htm
+%E5%BC%95%E6%95%B0%E3%80%80%E9%A0%98%E5%9F%9F%E3%80%80C%E8%A8%80%E8%AA%9E%E3%80%80%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E3%81%AE%E5%80%A4%E6%B8%A1%E3%81%97&hl=ja&ie=UTF-8
メモリアクセスで負荷はあがりそうっすね。
>170
参照ならぬ、ポインタの値渡しをしようと思ってのことです。
でも、素直に値渡しでよさげという結論になってきました。
0175160
NGNG1.配列、構造体などのサイズのでかいものを渡す時
2.呼び出し先で引数として受け取った変数を、呼び出し元と
同期させたい時
ということで宜しいのかな。まぁ、細かいとこでは他にもありそうだけど。
0177160
NGNGううY(>_<、)Y 175みれば当たり前なんでハマってました。
他にも巧妙な使い方があるのかと、期待もして書いたわけですが。
0178デフォルトの名無しさん
NGNG0179デフォルトの名無しさん
NGNG関数を追加するのと関数ポインタを追加するのは全然違うじゃない。
素直にできないと言いなよ
0180デフォルトの名無しさん
NGNG言っている事が全然分からんが?
もし、関数の "実体" を構造体内に入れる事が出来たとして、
それが関数のポインタで代用(?)する場合と
実用上どういう風に「全然違う」のか是非説明してくれ。
(もしかして初期化するのが面倒だなんていいたいのか?
本当にそうならば、そんな事する前にその関数を構造体に
入れる "必要性" を教えてくれ)
もしかしてC++のメンバ関数なんかもナイーブに
class 内に "コピー" する事で実現されているなんて
思っちゃってるの? (プ
0181デフォルトの名無しさん
NGNGはいはい、くだらないことをいってるしったか君、ごくろーさま
0182デフォルトの名無しさん
NGNGナンセンスな質問に無理に答えるとこうなる
0183デフォルトの名無しさん
NGNG> もしかしてC++のメンバ関数なんかもナイーブに
> class 内に "コピー" する事で実現されているなんて
> 思っちゃってるの? (プ
そんなことになったら sizeofの結果が恐ろしいな。
0184179
NGNG> もしかしてC++のメンバ関数なんかもナイーブに
> class 内に "コピー" する事で実現されているなんて
> 思っちゃってるの? (プ
そんなこと一言も言っていないが?
もしかして実体をコピーしなければいれることにはならないと思っているのか?
0185184
NGNGC++のクラスの場合はその実体が関数ポインタだとしても言語の仕様上関数を追加できるだろ?
0186デフォルトの名無しさん
NGNG0187デフォルトの名無しさん
NGNG関数へのポインタって変数だよ。分かっている?
0188デフォルトの名無しさん
NGNG>もしかして実体をコピーしなければいれることにはならないと思っているのか?
お前の言う「いれる」の意味を問いたい。問い詰めたい。小1時間問い詰めたい。
お前、ただ "struct{void f(void){}}" って書きたいだけちゃうんかと。
0190179
NGNG0191デフォルトの名無しさん
NGNGスレ違いでスマン。
0192デフォルトの名無しさん
NGNG「大恥 "書く" ぞ」
「C++のクラスの場合はその実体が関数ポインタだ」
なんて言う方がもっと恥をかくと思うが。。。
0193デフォルトの名無しさん
NGNG↑
これはいったい何?
0194デフォルトの名無しさん
NGNG#define _P
なんで括弧が二重なんだ?(^_^;)
0195デフォルトの名無しさん
NGNG0196デフォルトの名無しさん
NGNG0197デフォルトの名無しさん
NGNGなんでですか?
0198デフォルトの名無しさん
NGNGあんたの言ってることも間違っちゃいないさ。
でもな、そういうのを世間一般では
「単なる揚げ足取り」とか「無知」と呼ぶのさ。
Q) Cで文字列を表示するにはどうすればいいですか?
普通のA)
一例としては、stdio.hをincludeして printf を使え。
185のA)
C言語の仕様上の話では、文字列という概念はない。
よって不可能だ。
Cで文字列を扱えるなんて言ったら大恥かくぞ。
0199197
NGNGそう決まっているんだからしかたないですよね。
0200デフォルトの名無しさん
NGNG揚げ足取りならどっちもどっち。
0201デフォルトの名無しさん
NGNG0202デフォルトの名無しさん
NGNGおカネ おカネ おカネ おカネ おカネ おカネ おカネ おカネ
お金さえあれば 何でも手に入る
ドレス イヤリング 真珠の首飾り
マンション 別荘 建て売りマイホーム
車飛行機自家用潜水艦キャビアフォアグラ松茸に数の子
お金さえあれば 幸せになれる 我ら世界お金持ちクラブ
0203デフォルトの名無しさん
NGNGどっちもどっちって、他方は誰のことを指してるの?
185が揚げ足取ってるだけに見えるが。
>>191
全然違うよ。
>>193
古いコンパイラでもコンパイルできるように
プロトタイプ宣言を使い分ける時の方法だね。
前もって
#define __P(x) x
と宣言すれば、
int main (int, char *[]);
と展開され、
#define __P(x)
と宣言すれば、
int main ();
と展開される。
0204デフォルトの名無しさん
NGNGどうすればいいですか?WinMeです。
0206デフォルトの名無しさん
NGNGたった一行を書き換えるためにわざわざマクロを使うの?
コンパイルオプションでマクロを定義して使うの?
0207206
NGNG俺なら#if使うかな。
0208デフォルトの名無しさん
NGNG師匠!
たった1分足らずの時間で
その様な素晴らしいレスを見つけ出す秘術を
是非とも僕に伝授してください。
0209194です
NGNGなるほどねー
だから括弧が二重なんだ。
二重にしないとint main int,char *[];になっちゃうな。
0210デフォルトの名無しさん
NGNGint dummy = 10;
dummy /= 50;
data = (double)dummy
printf("%f\n",data);
としても0が表示されます。なんで?
コンパイラのバグですか?
0211デフォルトの名無しさん
NGNG0212203
NGNGたくさんの関数宣言がある時でないと意味がないね。
それらの宣言をすべて
int func __P((...));
のような形式で記述しておいて、
コンパイルする環境によってマクロだけを切り換える。
普通は、公開ソースで色々なプラットフォームに
対応したい時に使うものだと思う。
zlibなんかもこの方法を使ってるから、見てみるといいかもね。
ttp://www.gzip.org/zlib/
0213デフォルトの名無しさん
NGNG0214デフォルトの名無しさん
NGNGそれ以前に、マクロ __P() の引数の数がおかしいと怒られるから、面倒だけど
二重括弧は必要。
0215デフォルトの名無しさん
NGNG0と表示されたらライブラリのバグ(藁
0.000000と表示されないと(藁
0216デフォルトの名無しさん
NGNGヒープがこまぎれずたずたになっちゃう気がするけど
OSはガーベッジコレクションとかちゃんとやってくれてるのかな?
とりあえずWinとかLinuxとかでの例を教えてほしいかも。
0217デフォルトの名無しさん
NGNGif ( a&0x10 == 0x10 ) printf("a==0x10\n");
としてもa==0x10が表示されてません。なんで?
コンパイラのバグですか?
0218デフォルトの名無しさん
NGNGと言われたんですけど、僕は馬鹿だったんですかね
0219デフォルトの名無しさん
NGNG& より == の方が優先度高いから
if ( a & (0x10 == 0x10 ) )
と同義。キミのバグ。
0220デフォルトの名無しさん
NGNGキミは馬鹿じゃない。
0221デフォルトの名無しさん
NGNG馬鹿じゃなくてむかつくだけ。
人を試すってことだろ?
0222デフォルトの名無しさん
NGNGコンパイラのバグですか?
が今のはやりですか?
昨日の9<a<10とかさ。
0223デフォルトの名無しさん
NGNGint Q = 41;
Q -= 4 * 9 - 4 - 1;
なぜ結果が Q = 10 になるのでしょうか ?
私は今まで Q = Q - 4 * 9 - 4 - 1; と同じだと思っていたのですが ...
0224デフォルトの名無しさん
NGNGQ=Q-(4*9-4-1);だろ?
0225デフォルトの名無しさん
NGNGネタでしょ
>> 223
Q = Q - (4*9-4-1);
0226たけ☆地球の王子♪
NGNG小学校からやり直せや
それとも小学生か?(稿
0227デフォルトの名無しさん
NGNGここで整数除算して桁落ち(0.0〜とかではなく、0としか入らない)、
小数点以下が切り捨てられてデータが残らない。
つまりdummyに0が入ってその後に、別のところでキャストしても0は0(復元不可能)。
0228デフォルトの名無しさん
NGNG小学校じゃ習わないぞ(ワラ
0229たけ☆地球の王子♪
NGNG*から先に計算するって事は小学校で習いますです。はい。
0230デフォルトの名無しさん
NGNG問題はそこじゃない。
a-=bはbを先に計算してからaから引く。
0231デフォルトの名無しさん
NGNGありがとうございました.
まるで気がつきませんでした.
0232223
NGNGなぜ Q = 10 になるのでしょうか ? なんで ?
コンパイラのバグですか ?
0233デフォルトの名無しさん
NGNG0234デフォルトの名無しさん
NGNG0235デフォルトの名無しさん
NGNGfor(i=0;i<10;i++) ;
無限ループになります。なんで?
コンパイラのバグですか?
0236デフォルトの名無しさん
NGNGそれはコンパイラのバグ
そういやIntelのコンパイラで
short i,j;
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
printf("%d%d\n, i,j );
}
}
とやると、外側のループが1回しか実行されないバグがあったな
0237デフォルトの名無しさん
NGNG無限ループならコンパイラのバグです。
もうちょっとマトモなネタキボーン
0238デフォルトの名無しさん
NGNGIntelだめじゃん!
0239デフォルトの名無しさん
NGNGSunのあれとか。
0240デフォルトの名無しさん
NGNGshort で、インクリメントできないってこと?
0241236
NGNGいや、2重ループが実行されない。
int なら平気。
0242デフォルトの名無しさん
NGNG0243デフォルトの名無しさん
NGNGソフト屋の作るソフトも人のことは言えないと思うが...
0244デフォルトの名無しさん
NGNG意味がよくわからんが、
とりあえずFindFirstFileでも使っとけ。
>>216
まずはCランタイムのヒープ管理ルーチンとよく相談しろ。
OS側の話はそれからだ。
0245236
NGNG俺は使ってねーよ。
コーデック系のプログラムだと、作ってんの学者だから
訳わかんねー事やってんのよ。
変数や関数名も数式のまんまだし。
0246デフォルトの名無しさん
NGNG0247246
NGNG面倒な人はtypedefでもするんでしょうが。
0248デフォルトの名無しさん
NGNGかまわん。
俺個人的にはuintでtypedefする方が好みだが。
0249デフォルトの名無しさん
NGNGintぐらい書いたほうがいいと思う。
■ このスレッドは過去ログ倉庫に格納されています