2 :
デフォルトの名無しさん :2010/08/23(月) 13:30:17
マクロの使い方が下手で真っ黒w
で、結局swapはどうじっそうすればいいのかおしえてくだちぃ
#define swap(type, x, y) do {type t; t=x; x=y; y=t; } while (0) int main(void) { int a=3 , b=6; swap( int , a , b ); return 0; }
type の部分には変数の型を適切に指定すること。
#define GET_MY_TIME(buf,time,index) \ buf[0] = time[index*2];\ buf[1] = time[index*2+1];\ buf[2] = '\0'; この前処理の「\」は何を意味しているんでしょうか? どなたかご助言お願いします。
\(リターン)でリターン、つまり改行を無効にしてる #defineマクロは改行までだから、複数行に分けて書くには\が行末に必要
>>7 見やすくするために「¥」を使ってたんですね。
すばやいご助言どうもありがとうございました。
>>3 #define swap(a, b) (a = a - b, b = a + b, a = b - a)
このくらい直ぐに思いついて欲しいけどね
たま
12 :
デフォルトの名無しさん :2010/08/23(月) 16:02:55
>>10 でたよ、主観でしかものが言えない理解力の無いバカ
お前の顔の方がもっとダサいからw
そしてお前の書くコードは幼稚そのもの
他者批判しか出来ない奴ほど、実は大勢から批判される対象となるくらい
程度の低いバカ、なのは国会の野党を見ても分かることw
14 :
デフォルトの名無しさん :2010/08/23(月) 16:03:33
>>10 「何が」ダサいのか、答えてみ。コードの意味も理解できない池沼w
>>10 稚拙な感想しか言えないんですね、自分の技能も証明できない癖に
他者を上から目線で評価する卑怯者ってwwwwww
それだと&aでやるのと同じ破綻がおこるやん。
>>10 別にあれが格好良いなんて思わないがお前がダサいと思った理由が分からん。
それじゃどんなスタイルが良いんだ???
どの道、コードなんて文字列の見た目じゃない、効率の良い手法、スタイルが重要。
お前みたいな見た目ばかりに気を取られて、内容が薄い冗長なコードこそ
無駄でダッセーからw
自演乙
>>12 主観?
マクロで型を引数として与えるなんて、まともなプログラマなら敬遠するよ。
>>9 の方が全然スマートじゃん。
それがわからないって、センス無さすぎだよ、君!
足し算引き算使える型じゃないと破綻するよね
ついでに違うの参照しててもオーバーフローすることがあるからxorよりタチが悪い
>>10 くせぇくせぇ、夏厨の香りがプンプンすんぜっw
鏡を見ろよ?お前の面の方が100万倍ダッセーし
コードも稚拙だろうからw
>>9 オーバーフローの恐れがある
浮動小数点数型なら誤差評価もめんどい
同様の理由で乗除算を使う方法も却下
>>10 マクロの意味も理解できない厨房必死だなw
で、どこがダサいの?お前の意見を言ってごらん。
どうせ言ったことに対して、相手に理解されなくて
自分こそが批判され孤立するのが怖いんだろ?w
所詮、原則匿名の無責任な発言を平気でする
2ちゃんねらーだもんな、お前もw
26 :
本日の一番稚拙で最低な発言 :2010/08/23(月) 16:14:15
10 名前:デフォルトの名無しさん 投稿日:2010/08/23(月) 15:51:31
>>4 ださい < プッ
お前はマクロスでも見てろ、カッコイイロボットに乗っているよなw
>>19 より問題が多い方選んどいてスマート云々センス云々
君ただの馬鹿じゃん
28 :
デフォルトの名無しさん :2010/08/23(月) 16:16:03
>>10 お前はファッションチェックをするピーコかっ!?
コードはファッションじゃねーのw
お前の理解力のなさはおすぎもビックリだぜ。
もうレス番真っ赤w
29 :
デフォルトの名無しさん :2010/08/23(月) 16:17:29
>>10 コードの意味も分からないガキは黙ってろよ。
別にお前が使わなくても良いから。変数ごとに逐一
入れ替え用の関数でも書いて、長ったらしいコードにしてろやw
自演乙
vcなんて捨ててtypeof使ってこいよ
32 :
デフォルトの名無しさん :2010/08/23(月) 16:21:11
>>10 ダサいと言うならお前が思うかっこいいスタイルで記述してよ?
お前が書いたものの方が冗長で効率も良く無くダサいだろうけどw
で、例のマクロの何がダサいんだよ?お前みたいなブサメンに
ダッセーとか言われたら、イケメソのBohYoh先生も報われないわ。
失礼だろがー。そこまで言うならまずお前が名乗れよ?
今後は、ダサいと言ったお前は必ずそれ以上のコードを書いて意見をすること。
それが出来ないで匿名で陰口叩くだけの雑魚は黙ってろよ。
34 :
デフォルトの名無しさん :2010/08/23(月) 16:27:15
>>10 ここまで集中攻撃を受けているんだ、それをダサいと言った
お前がどんなコードを書くか示してくれないか?
もちろん、誰が見てもお前の方がカッコ(・∀・)イイんだろうな?
ダサかったらプゲラッチョしちゃうよ?
1度だけチャンスをやる。あれと同じかそれ以上に効率の良い動作をする
お前がダサくないと思うマクロを書いてみろ。
書かなかったらお前の負けなw
>>10 どうしました?マクロでここまで叩かれて降参して
マグロになっちゃいましたか?ん?w
ダサいとかダサくないとかじゃないんだよ、コードの意味も
可搬性、汎用性も理解できない青二才の戯けが!
>>33 >ダッセーとか言われたら、イケメソのBohYoh先生も報われないわ。
ださいに加えて、きもい
あれだけ汎用性、可搬性に優れたコードをダサいとか言うなんて 理解力の無い物事を適切に判断できない、偏った価値観を持った 未熟者って言動からして幼稚だよな。だから余計な一言で 周りから批判、非難されて干されて2ちゃんなんかで匿名で こそこそ活動するようになったんだろ。そういう下衆って責任感が無いから 2ちゃんでも言うことが無責任。あのマクロがダサいとかカッコイイとか どうでも良いわ。バラせば所詮、半角英数文字だしw まさか、自分が好きな文字列なら良いの?例えば #define dasai( type , x , y ) do{ }while(0) とか?w もちろんこれでも入れ替えは可能ですよ?コードの中で例えばint型の変数a,bなら dasai( int , a , b ); と書いてごらん。別にマクロではswapという文字列でなくても構わないんだよ。 ただ、マクロで定義した文字列を用いれば良いんだし。
38 :
デフォルトの名無しさん :2010/08/23(月) 16:39:55
では、今後からは格好良いコードを書く現実世界でもイケメソの
>>10 さんに見習って
#define dasai( type , x , y ) do{ type t=x; x=y; y=t; }while(0)
でコードの中では dasai ( 変数の型 , 入れ替える対象の型の変数名1 , 変数名2 );
といった形で書きますか。別に俺はそれでも良いよ。動作は同じだからw
>>20 do-while() で囲むというのはよくきくが、その前に、
http://www.bohyoh.com/CandCPP/FAQ/FAQ00008.html の人はマクロ引数の展開先を () でくるむことはしないんですかね?
#define swap(type, x, y) do {type t; t=x; x=y; y=t; } while (0)
よりも
#define swap(type, x, y) do {type t; t=(x); (x)=(y);(y)=t; } while (0)
のほうをよくみかけるのだが?
柴田望洋氏はきらいではないのであけれども、int main() の件といい、この FAQ 集はつっこみどころが残っているようですね。
40 :
デフォルトの名無しさん :2010/08/23(月) 16:48:50
どうせ xor で a^=b; と書いていた奴の僻みだろ。
>>10 お前の幼稚なクソァーコードの方が邪道でダサいんだよ!
>>10 あぁなんだ、お前がXORの入れ替えを書いた邪道者か?
ダサいのはむしろお前の方。
>>39 いやまて、swapだぞ
なにを渡す気だよwwww
>>10 さんが推奨する格好良いマクロ ( ´,_ゝ`) プププッ
#define swap(pa, pb) ( *(pa) ^= *(pb), *(pb) ^= *(pa), *(pa) ^= *(pb) )
↑を流行らせようとして失敗したんですね?分かりますw
キチガイ怖すぎる
>>42 杓子定規で内容考えずに教わった通りにやろうとしてる人、多いよねw
>>10 ねぇ〜
>>4 ってダサいよねぇ〜やっぱカッコイイマクロスは
#define swap(pa, pb) ( *(pa) ^= *(pb), *(pb) ^= *(pa), *(pa) ^= *(pb) )
ですよね。コード・覚えていますか?
>>10 さん、貴方がカッコイイと思うマクロを教えて ♥
>>39 細かいこと言い始めると、
いろいろ破綻するケースが出てきちゃうので、その辺で妥協するしかないんじゃないかね
副作用が複数起こってる時点で、おそらく既に本来あるべき挙動ではない
型を得るtypeof的なものと、
衝突しない識別名を返す(Lispのgensym的な)ものがあれば
もうちょっと堅牢なswapマクロも書けるかも、とは思う
まあそういう小手先の話よりは、インライン関数があればねw
型を渡すのがダサい理由の一つは、関数で実現するときとで記述が変わることだろうね。
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef unsigned char uc; typedef struct tagC { uc c[4]; int b; } C; static int str2utf8(C* d, uc* s) { uc h=*s; if((h&0x80)==0){d->b=1; memcpy((void*)d->c,(void*)s,d->b);} else { if((h&0x40)==0){return 1;} else { if((h&0x20)==0){d->b=2; memcpy((void*)d->c,(void*)s,d->b);} else { if((h&0x10)==0){d->b=3; memcpy((void*)d->c,(void*)s,d->b);} else {d->b=4; memcpy((void*)d->c,(void*)s,d->b);} } } } return d->b; } static void put_utf8(C* a){int i=a->b; uc* p=a->c; while(i-->0){putchar(*p++);}} static void str2utf8s(C* d, uc* s){do{s+=str2utf8(d++,s);}while(*s!='\0');} static void put_utf8s(C* a){while(*a->c!='\0'){put_utf8(a++);}} static int len_utf8s(C* a){int i=0;while(*a->c!='\0'){a++; i++;} return i;} static void rev_utf8s(C* d, C* s, int l){int i=len_utf8s(s); i=(i>l)?l:i; s+=i-1; while(i-->0){*d++=*s--;}; str2utf8s(d,"のん♪(^_^/\0");} void main(){ char s[0xFFFF]; printf("文字列を入力してくださいのん。(100文字以内のん)\n"); scanf("%s",s); C u[0xFFFF]; str2utf8s(u,s); C iu[0xFFFF]; rev_utf8s(iu, u, 100); put_utf8s(iu); printf("\n"); }
52 :
51 :2010/08/23(月) 17:23:13
うう〜… だめだ〜… どうしても語尾に「のん」って付いちゃうバグが取れないのん… Σ(・_・アっ!! 文字列を入力してくださいのん。(100文字以内のん) aiueokakikukeko okekukikakoeuiaのん♪(^_^/ 文字列を入力してくださいのん。(100文字以内のん) あいうえおかきくけこ こけくきかおえういあのん♪(^_^/ 文字列を入力してくださいのん。(100文字以内のん) ☆まいんちゃん☆lovelove萌へぇ〜〜♪ ♪〜〜ぇへ萌evolevol☆んゃちんいま☆のん♪(^_^/ ちなみにプラットフォームはウブンチュ10.04なのん… Σ(・_・アーーっ!! だからかっ!?
53 :
51 :2010/08/23(月) 17:29:09
あぁぁあぁああ;、自分で足してました〜ヾ(・・;)ォィォィ 自己解決しましたのん♪ おさがわせしたでござるのんのん(=⌒▽⌒=) ニャハハハ♪
>>49 そうですね。
それにしても、たしかにインラインがあるといいのですけどね。C で問答無用にインラインにしてくれる処理系ありませんかね。
55 :
デフォルトの名無しさん :2010/08/23(月) 17:37:57
可搬性、汎用性、簡略化について理解できないバカがダサいとか言うから悪い お前の主観がこの世の全てに通じる訳でもないだろJK
そろそろ #define を使うのはよしておいたほうがいい件について。 java にも c# にも #define はない。c++ でもお利口さんはつかわない。
>>54 けど、今時ほとんどの環境で使えるわけだし、
使える環境なら使えばいいよ。
そういう環境でもマクロでごちょごちょするのは問題あるよ。
このスレに居るような望月を神だと思ってる人は
C++でもスワップが必要なら例のマクロ使うんだろうな。
指導しても有名な先生が書いてるとか言って聞かないんだよねw
>>57 そして a[i] と a[j] の交換で i==j のケース発覚⇒はまりに陥る と
>>57 defineマクロしか使えないことが一番ダサいw
>>57 今調べてみると、C99 なら問答無用でインラインにしてくれるんですね。
それにしても、彼は、規格まで引用して説明したというのに、全然きかないんですよね。
inline関数は展開してくれるかもしれないし、してくれないかもしれない そんな存在だよ
62 :
デフォルトの名無しさん :2010/08/23(月) 18:28:37
>>10 は本当に愚かだ、ダサいとか主観でしか感想を言えない精神レベルの低い
プログラミングの腕も低い未熟者
64 :
デフォルトの名無しさん :2010/08/23(月) 18:52:49
65 :
デフォルトの名無しさん :2010/08/23(月) 18:55:37
> #define swap(type, x, y) do {type t; t=x; x=y; y=t; } while (0) このコードはとっくに、数年前にこの板、多分このスレで使われてたよ。 今さら過ぎて知らない奴は無知だろw
66 :
デフォルトの名無しさん :2010/08/23(月) 18:58:41
よく見たら、望月先生は C++ に対してもこのマクロ推奨してるじゃん。 駄目だこいつ。本書くだけで実務レベルのプログラムとか書けないんだろうな。 教祖が使えない奴だから、当然信者もそれ以下だわな。
>>66 お前がスレを伸ばしてる張本人だろう。
sageることも知らないお馬鹿さんよ。
#include <stdio.h> #include <stdlib.h> #include <string.h> // a と b をいれかえる(どっちも同じサイズと仮定する) // sz には a または b のサイズをかく(どっちも同じサイズという前提) void nandemo_swap(void* a, void* b, const int sz) { char t[sz]; memcpy((void*)t, a, sz); memcpy(a, b, sz); memcpy(b, (void*)t, sz); } void main() { // 数字の入れ替え int a=1; int b=2; printf("%d, %d\n",a,b); nandemo_swap(&a, &b, sizeof(int)); printf("%d, %d\n",a,b); //文字列の入れ替え(ただし、どっちも4文字) char c[]="ABCD"; char d[]="EFGH"; printf("%s, %s\n",c,d); nandemo_swap(c, d, sizeof(char)*(4+1)); printf("%s, %s\n",c,d); // 任意の構造体の入れ替え typedef struct tagA { char x; int y; float z; } A; A e={'1',2,3}; A f={'4',5,6}; printf("[%c, %d, %f], [%c, %d, %f]\n", e.x, e.y, e.z, f.x, f.y, f.z); nandemo_swap(&e, &f, sizeof(A)); printf("[%c, %d, %f], [%c, %d, %f]\n", e.x, e.y, e.z, f.x, f.y, f.z); }
71 :
70 :2010/08/23(月) 19:27:16
スワップの時って、普通は A も B も 交感に使うバッファーも、3つとも同じサイズなのが普通なんじゃないかなぁ? って思った。 あんまり A はイントで、Bはチャーで…みたいなことって珍しくて、ふつうはAもBもイントならイントだし、ちゃーならちゃーなことがおおいようなきがするー。 ので、 じゃぁ、スワップ関数に、交換するデータのサイズを渡してあげれば、具体的に char か? int か? なんてのは無関係でバッファーを定義できるんじゃないかな?って思った。 だから、バッファーが別に char でも int でもなんでもよくて、ただ純粋にバッファーに何バイト必要なのか?って情報さえあれば、型なんてどうでもいいんじゃないかな?って思った。 どんな型でもスワップできる ”何でもスワップ()”を試しに書いてみました。なんか思ったふうに動いてよかった。 1, 2 2, 1 ABCD, EFGH EFGH, ABCD [1, 2, 3.000000], [4, 5, 6.000000] [4, 5, 6.000000], [1, 2, 3.000000]
C99専用って需要あるのかな
その「交換するデータのサイズ」というのが結局は「char か? int か?」で決まるんだから 無意味では?
チャーん!
実は自分の方がダサい、と指摘されつつあり、それをひしひしと感じて
>>10 を繰り返し叩き、精神的バランスをかろうじて保っている
>>64 であった。
どっちも人間性がダサいでFA
>>39 =と;で限られてる部分を()で閉じる必要は全く無いと思うが。
()が必要だと思うなら、
>>39 の場合に()がないと動作がおかしくなる場合を教えてくれないか?
>>77 マクロにはつけておいたほうがいいから統一してるんじゃね?
79 :
デフォルトの名無しさん :2010/08/23(月) 22:56:54
()とは直接関係ないが char a[10], b[20]; swap(char[30], a, b); とかで typedef が必要、なぜ? マクロですからとか、聴いてて耳腐る
日本語でおk
>>79 /' ! ━━┓┃┃
-‐'―ニ二二二二ニ>ヽ、 ┃ ━━━━━━━━
ァ /,,ィ=-;;,,, , ,,_ ト-、 ) ┃ ┃┃┃
' Y ー==j 〈,,二,゙ ! ) 。 ┛
ゝ. {、 - ,. ヾ "^ } } ゚ 。
) ,. ‘-,,' ≦ 三
ゞ, ∧ヾ ゝ'゚ ≦ 三 ゚。 ゚
'=-/ ヽ゚ 。≧ 三 ==-
/ |ヽ \-ァ, ≧=- 。
! \ イレ,、 >三 。゚ ・ ゚
| >≦`Vヾ ヾ ≧
〉 ,く 。゚ /。・イハ 、、 `ミ 。 ゚ 。 ・
>>77 代入演算子より優先度が低いのはコンマ演算子しかないから、() は必要ないでしょうね。
84 :
デフォルトの名無しさん :2010/08/23(月) 23:57:23
ここはプログラム【技術】板 場違いな感想文はよそでやんな
自分に賛同する強力な意見が現れたので、急に息を吹き返した
>>83 であった。
よかったね、いずれの日にか自分の脳みそを使って反論できるようになりましょうね。
// 最初の5文字を入れ替える #include <stdio.h> void s(char* a, char* b){char t=*a; *a=*b; *b=t;} void p(char* a, char* b){printf("%s\n%s\n\n",a,b);} void main(void) { char a[100]="aiueo1234"; char b[100]="ABCDE5678"; p(a,b); int i=5; char *ap=a, *bp=b; while(i-->0){s(ap++, bp++);} p(a,b); } // 結果 aiueo1234 ABCDE5678 ABCDE1234 aiueo5678
// 最初の5文字をいれかえる (マクロ) #include <stdio.h> #define swap(type, x, y) do {type t; t=x; x=y; y=t; } while (0); void p(char* a, char* b){printf("%s\n%s\n\n",a,b);} void main(void) { char a[100]="aiueo1234"; char b[100]="ABCDE5678"; p(a,b); int i=5; char *ap=a, *bp=b; while(i-->0){swap(char, *(ap++), *(bp++));} p(a,b); } //結果 aiueo1234 ABCDE5678 aAuCoE2648 AaCuEo6284
時間を計れよ
>>87 それは副作用がある引数をマクロに渡したためにおこること。
マクロに渡す引数に問題があるためであり、マクロの書きようで解決できる問題ではない。
// 最初の5文字をいれかえる (マクロ) #include <stdio.h> #define _swap(type, _x, _y) do {type* x=_x; type* y=_y; type t; t=*x; *x=*y; *y=t; } while (0); void p(char* a, char* b){printf("%s\n%s\n\n",a,b);} void main(void) { char a[100]="aiueo1234"; char b[100]="ABCDE5678"; p(a,b); int i=5; char *ap=a, *bp=b; while(i-->0){_swap(char, ap++, bp++);} p(a,b); } // 結果 aiueo1234 ABCDE5678 ABCDE1234 aiueo5678
>>91 type が char なのに実際は char * を扱っているのが気に食わん。
>>91 なるほど、マクロに渡す引数が一回しか評価されないようにマクロを組むとは可能なんですね。使いにくいのではありますが。
前言は撤回します。
こうすれば型引数外せるかな? 試してないし、当然規格違反だけど。 #define swap(a, b) \ do { typedef struct { char buf[sizeof(a)]; } T; T t; \ t = *(T *)&(a), (a) = (b), *(T *)&(b) = t; \ } while (0)
// 最初の5文字をいれかえる (もう寝る) #include <stdio.h> typedef union tagV{char c; int i; long l; float f; double d;} V; #define _swap(_x, _y, _sz) do {V* x=(V*)_x; V* y=(V*)_y; V t; int sz=_sz; int i=0;\ while(i<sz){*(((char*)&t)+i)=*(((char*)x)+i); \ *(((char*)x)+i)=*(((char*)y)+i); *(((char*)y)+i)=*(((char*)&t)+i); i++;} } while (0); void p(long* a, long* b, int sz){ int i; i=sz; while(i-->0){ printf("%ld ",*a++); } printf("\n"); i=sz; while(i-->0){ printf("%ld ",*b++); } printf("\n\n"); } void main(void) { long a[100]={0,1,2,3,4,5,6,7,8,9}; long b[100]={9,8,7,6,5,4,3,2,1,0}; p(a,b,10); int i=5; long *ap=a, *bp=b; while(i-->0){_swap(ap++, bp++, sizeof(long));} p(a,b,10); } //結果 0 1 2 3 4 5 6 7 8 9 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 5 6 7 8 9 0 1 2 3 4 4 3 2 1 0
てst
97 :
デフォルトの名無しさん :2010/08/24(火) 12:29:14
スワッ(プ
98 :
デフォルトの名無しさん :2010/08/24(火) 12:32:52
いい加減 糞アッー! のスワッ(プは止めたか?ん?
99 :
デフォルトの名無しさん :2010/08/24(火) 13:44:21
>>94 #define swap(a, b) \
do { typedef struct { char buf[sizeof(a)]; } T; T t; \
t = *(T *)&(a); *(T*)&(a) = *(T*)&(b); *(T *)&(b) = t; \
} while (0)
素直に memcpy 使えって言いたいけど
付き合ってやるとこうかな
# インライン持ってるコンパイラでも拒否されそう
100 :
デフォルトの名無しさん :2010/08/24(火) 13:54:19
XORのスワップがイケてると思った奴、涙目必死wwwww
マクロ厨のうざいことといったら…
↑これって入門の範囲なのですか?
103 :
デフォルトの名無しさん :2010/08/24(火) 15:44:19
#include "stdafx.h" #include <string> #include <iostream> #include <fstream> #include <vector> using namespace std; int main(int argc, char* argv[]) { string fileString; vector<string> vec; char line[15000]; int count = 1; ifstream ifs; ifs.open("test.csv", ios::in); // 読み取り専用で開く while( !ifs.eof() ){ ifs.getline(line, sizeof(line)); printf("[%03d] %s\n", count, line); count++; } ifs.close(); return 0; } 実行すると、コマンドプロンプトにtest,csvが出力されます。 これをテキストなどに出力したい場合はどうすれば良いですか?
いろいろやりかたあるけど、 実行時にリダイレクトするとかprintfをfprintfにするとか ofstream使うのはC++だし、C++の質問は場所移した方がいいかも
105 :
デフォルトの名無しさん :2010/08/24(火) 16:34:34
XORスワップ厨の悪足掻きが痛すぎるw
C++にfreopen()相当の機能が欠けているのが惜しい ただしストリームは継承で出来ているのでif文で簡単に切り分け出来るけど
XORスワップに良い所なんて一つもなかった。
>>102 C99 では inline 関数にすればいいので、もう知らなくてもいいことです。#define は時代遅れ。
何年か前、VCでどのくらい最適化してるか見てみたら、 inline無しのけっこうでかい関数もinline展開されてたな。 いまどきのコンパイラならマクロとかinlineとか無しで、 普通に関数を書いとけばいいんじゃないか?
110 :
デフォルトの名無しさん :2010/08/24(火) 19:39:00
>>101 でたーーー、何かと 厨 と呼ぶバカw
碌に知りもしないのに否定的な意見しかしない 厨 の法がうぜぇんだよ!
ねぇ、XORスワップちゃんw
お前はビット演算子厨って命名してやる
111 :
デフォルトの名無しさん :2010/08/24(火) 19:40:26
マクロで変数の型を自由に指定できる type を用いたマクロなんて 今さら過ぎる・・・知らなかった癖に、自分のXORスワップが優秀でかっこいいと 思っているんだろうか?XORを用いたのがかっこいいと思っていれば良いだろ 欠陥スワップw
発 者 同 . 。_ ____ 争 生 同 .じ . /´ | (ゝ___) い .し 士 .レ .__/'r-┴<ゝi,,ノ ro、 は、 .な で .ベ ∠ゝ (ゝ.//` ./`| }⌒j .い し .ル } ⌒ /`ヽ、_∠l,ノ ・ヽ´ .! ! か の / ´..:.} >、、___, .r、 ソ、`\ / ..:.:.} / |∨ ` ̄ / ..:.:./ | 丶 / _、 ..:.:.:.{ .{.:.:. \ { ..:Y .ゝ、 {.:.:.:.:. ヽ |、 ..:/ 丿 .:〉 >.- ⌒ . ヽ / {. ..:./ ソ ..:./ .( ..:.:.:` ..:} ./..:.:}.:.:./ ヘ、 ..:./ .\ ..:.:r_,ノ、.:.:} ./..:.:/|.:/ {.:./ X.:.:}.} X X /..:.:/ .}.:| }:/ .Y丶ヽ Y.:Y . __/.:/ { } 《.〈、 _,,__>.:》丶 Y.:\ /.:.:.:.:.::/ !.:.:ゝ ゝ.:. ̄ヾ ´:.:.:.:.:.:.:.:.:ヾゝ \.: ̄>
113 :
デフォルトの名無しさん :2010/08/24(火) 19:54:25
XORスワップ厨が必死だなw
Cの最大の欠陥はマクロ厨だからな。レスから察するに、マクロを使った方がカッコいいと思ってんのかな 上で誰かが言ってるように簡単な関数はコンパイラの最適化に頼れよ それともマクロ厨は最適化を切ってるのか?
115 :
デフォルトの名無しさん :2010/08/24(火) 20:10:20
糞ァスワップ厨必死だなw
あーあ、荒らしと化してるよ。はじめからか
117 :
デフォルトの名無しさん :2010/08/24(火) 20:21:58
> XORスワップに良い所なんて一つもなかった。 元ネタを知らないのはわかったから・・・
118 :
デフォルトの名無しさん :2010/08/24(火) 20:24:42
欠陥XORスワップw
>>116 ,
>>119 自分の説が補強されたのをいいことに、かさにかかって罵倒しまくっている、例のいつもの彼ですよ。でも自分の脳みそで考えたことはこれぽっちも書けないようですね。
121 :
デフォルトの名無しさん :2010/08/24(火) 22:06:11
XORスワップがかっこいいと思ってる欠陥に気づかないバカ必死だなw
>>121 たしかに xor スワップなんて使うほうがどうかしているのは事実なんですが、あなたは xor スワップのどこに問題かあるかわかっていますか?
>>111 type をいちいち指定しなければならないのが糞ですねえ。swap マクロなんかやめたほうがいいでしょうね。
目欄が空欄の奴ってなんでいつもこんなに頭悪いの?糞スレを上げてる愉快犯死ねよ
愉快犯じゃない 本当に馬鹿なだけなんだ
こういう手合いは時間をかけてイジクりまわしたあげく、ぐうの音もでないまで叩くのが人としての道かと。
>>124 XORスワップがかっこいい人ですね?分かります
もうかなり前から swap(type,x,y) do{ }while(0); なんて使われていたのに 今さらそれ自体に問題があるだの、ダサいだの、学習能力なさ杉w まぁそんな意見をした奴は明らかに初心者だってバレバレだからw
#define dasai( type , x , y ) do{ type... }while(0) がカッコイイと思いますです、はい!
おっと、スワッ(プッってしたら実も出ちゃったで、これが本場の糞ァースワップゥ〜
マクロで実現することに拘るのが駄目 時代遅れだし、実務では使えな奴の発想なんだよ
ところでxorってなんて読むんでしょうか
>>133 型を渡すことで完璧なマクロで実現できる(多数の本を書いた教授が考案)
だから他の方法を使うのは馬鹿、インラインもアホのすること
>>134 俺はエックスオーアールって読んでるぜ
>>136 >>87 をみればマクロで完璧とはいえないようですよ。
>>91 のようなマクロならOKですが、これって使いやすいと思いますか?
XORスワップ厨の夏厨必死だなw
140 :
デフォルトの名無しさん :2010/08/25(水) 13:11:03
>>130 頭が石化したぼけ老人の典型だな
典型つーより劣化コピーか
石化する前に活躍した老人なら功績があるだけマシだが
石化した状態で誕生した若造にはとりえが何もない
141 :
デフォルトの名無しさん :2010/08/25(水) 13:36:01
>>138 私もこの教授の本持ってるけど、凄いためになるよ
教授が結論出してるんだから、それに従えばいいんだよね
もうこの話題は不毛だから辞めた方いいよ
142 :
デフォルトの名無しさん :2010/08/25(水) 13:36:59
143 :
デフォルトの名無しさん :2010/08/25(水) 13:50:11
boost::format( "%.15g" ) % s.weight; って何をしているのでしょうか? s.weightの値をどうかするんだとは思いますがよく分かりません
>>143 help読まずに他人が書いたライブラリ使おうなんて無茶
つーか間違いなくスレチ
146 :
デフォルトの名無しさん :2010/08/25(水) 14:13:43
XORスワップ厨が激しく必死w
>>143 printf("%.15g", s.weight);
で出力したのと同じ文字列が得られる
#include <stdio.h> // #define swap(a,b) do{int t=a; a=b; b=t;}while(0) #define swap(a,b) ({int t=a; a=b; b=t;}) void main() { int a=1; int b=2; printf("%d, %d\n",a,b); if (a==1) swap(a,b); else printf("else"); printf("%d, %d\n",a,b); } // こレでよくne?
149 :
デフォルトの名無しさん :2010/08/25(水) 14:56:48
void main() 笑 とかもいるからw
visual studio 2010ではまったんですが、 auto変数に参照を渡しても参照と類推されないのは仕様なのでしょうか? 具体的には std::vector<hoge>& gethogeList(void); のような関数があり、 auto hogeList = getHogeList(); std::for_each(hogeList.begin(),hogeList.end(),[](hoge& h)->void { hに対する処理 }); というふうにしても、もとのgethogeListで返すリストのhの値は更新されていませんでした。 さっぱりわからずはまってたのですが、hogeListにマウスカーソルを載せた時に インテリセンスで型がstd::vector<hoge>と類推されていたことがわかり autoをやめて、 std::vector<hoge>& hogeList = getHogeList(); とかくとちゃんと動きました。 これは自分がautoの仕様を勘違いしてたんでしょうか?
あ、C++禁止なんですね。 すいません、今更見ました・・・ 上は見なかったことにしてください。
>>130 昔はそれしか方法がなかったけど、
今は別の方法があるんだからそっちの方が良いって話でしょ。
携帯使わず、ポケベル使ってたら、だっせーってこと。
swapくらいならその場でコードを書けば確実なわけで 結果的に展開されるマクロだの結果的に展開されるかどうかわからないインラインだのばかばかしい
157 :
デフォルトの名無しさん :2010/08/25(水) 18:50:55
基準なんているのか?www
159 :
デフォルトの名無しさん :2010/08/25(水) 19:08:21
俺はいらないという立場から言っている
で?
161 :
デフォルトの名無しさん :2010/08/25(水) 19:10:49
swapくらい、とは何のことだ?
なにがききたいの?きもちわるいwww
>>156 ポケベルも携帯もいらんって発想だな
買っても相手がいないってから、毒づいてるんだよね
君の容姿とか性格が浮かぶわwwww
ポケベルはいらんだろJK 売ってんの?今 そんなもん買ったって相手いないわな
165 :
デフォルトの名無しさん :2010/08/25(水) 19:19:54
>>162 おまえさんが「その場で書く」という凶行に出るスレッショルドを聞いてるんだよ
返答義務はないがリアルでその発言すると気にする人いると思うよ
で?気にする人がいるからなんだってんだ? こちらはお前がキモイと思うくらいなもんだが?
>>164 JKとベル友になりたいわ
まだかろうじて売ってるらしいけど
エリアも関東の一部のみとかかなり狭くなってるようだな
168 :
デフォルトの名無しさん :2010/08/25(水) 19:29:55
>>166 返答義務はないが技術的に話せないなら出てってくんな、板違いだよ
てめーがいらねーって言ってんじゃんwwww
170 :
デフォルトの名無しさん :2010/08/25(水) 19:32:59
>>169 俺の見解じゃなく、おまえさんの見解を聞いてるんだよ
聞いてどうすんの?
172 :
デフォルトの名無しさん :2010/08/25(水) 19:36:56
>>171 俺がどうするかによって、おまえさんの見解が変わるようならくだらねえな
あんたがどうかするの??俺の見解って何? 超キモい
174 :
デフォルトの名無しさん :2010/08/25(水) 19:40:21
発狂しやがった もうええわ
冷静に考えなよ 君が発狂してるからこうなったんだ
176 :
デフォルトの名無しさん :2010/08/25(水) 19:45:29
そもそも発狂させる方にも問題がある
火病は遺伝子が関係してるってにちゃんねるに書いてたよ!
キモイとかダサイとかまるで小学生だよ 繰り返すからこっちもだんだんむかつくんだぞ
しかし事実だし
181 :
デフォルトの名無しさん :2010/08/25(水) 19:51:32
XORスワップ厨が火病を起こしてダサいとか言い出すからw
>>181 すまんな、無視しちゃって
だけどな、XORの話をもりあげたいのかもしれないが、お笑いにはタイミングってものがあってな
中途半端な的外れだと面白く無いんだ
>>177 いや、どんどん発狂させるべきだ。彼もひところに比べるとだいぶ疲れてきたようで、かつての長文攻撃が出なくなってきた。陥落は近い。
陥落させてどうするの? 結婚でも申し込むの?
おれ、こいつを陥落させたらけっこn
これが後の世に伝わるswap100年戦争か
187 :
デフォルトの名無しさん :2010/08/25(水) 21:38:58
swapというか、もはやマクロ戦争になってる。これが本場のマクロス、なんつって
マクロS WAP 俺の主張を聞けー
intやcharの定義は誰がしているんですか glibc or gcc or linux ?
コンパイラの作者を作ったのは誰ですか
どこの小学生だよw
193 :
189 :2010/08/25(水) 22:25:16
>>190 glibcはC言語ライブラリですが、それに定義してあるんじゃないんですか?
やっぱり、gccなのかな
目欄空欄の奴のつまらなさ。
>>195 そんなことを気にしていちいち書き込むお前も十分意味不明で詰まらん、無駄なレスだから。
> 目欄空欄 日本語でおk。意味不明。まともに日本語が使えない奴って やはり・・・いや、はっきり指摘した方が良い。池沼乙。
198 :
デフォルトの名無しさん :2010/08/26(木) 01:17:43
>>124 >>195 目欄なんて他人に通じない、独自の単語を使っているのはお前くらいだよ。
お前こそつまらねぇ。このスレに何しにきてんの?
>>10 でダサいとか言っちゃった池沼でしょ?wwwwww
欠陥糞スワップがカッコイイって思うくらいだから、仕方ないか・・・
今時2chで「目欄」が判らんとは。半年ROMれって奴だな。
わからないふりして自演を偽装してるんじゃないのか?w
203 :
デフォルトの名無しさん :2010/08/26(木) 11:44:12
目欄()笑
205 :
デフォルトの名無しさん :2010/08/26(木) 13:56:33
目欄(笑)
206 :
デフォルトの名無しさん :2010/08/26(木) 13:58:52
質問があります。 ソースファイルにa.cppとaaa.cppの二つが入っているとします。 ヘッダーファイルにb.hとbbb.hの二つが入っているとします。 a.cppには #include "b.h" c_data sa; //c_dataはb.hに入っているクラス string line; sa.reader(line);がプログラムに打ち込まれているとします。 b.hには struct c_data{ void reader(省略); } が打ち込まれているとします。 aaa.cppには #include "b.h" #include "bbb.h" void c_data::reader(省略){ boost::tokenizer< abcde > tok( 省略 ); が打ち込まれているとします。 bbb.hには class abcde{ } のプログラムが打ち込まれているとします。 どのファイルにも実際はもっとプログラムが書かれていますが大事な部分だけ載せました。 この場合ってどれも連携して実行できますか? 初心者なんで間違っているかもしれませんが、a.cppのsa.reader(line);の所で しっかりとaaa.cppのvoid reader(省略);が読み込まれますか?
207 :
デフォルトの名無しさん :2010/08/26(木) 14:01:48
ヤーレン ソーラン ソーラン ソーラン メーラン あーよいよい♪
>>206 >が読み込まれますか?
この意味がわからん。
>>206 もうしわけないが、いってることがよくわからない。
宣言と定義のファイル分けることについて聞いてるような気もするが 結局なんだかよく分からない
釣りだろ
テキストを格納してある行列から、一行ずつ読み込んで、トークンに切り分けたいんでしょ?
なんで、C言語ではstaticな変数/関数をヘッダファイルに書かなくていいんですか?
kwsk
>206 termの使い方がめちゃくちゃなので、エスパーして答えてみる。 なお、C++の話なので、そもそもすれ違いだけど、、。 ちゃんとリンクしてあげれば、a.cppのsa.readerをコールすると、aaa.cppで定義した sa.readerが呼ばれる。
>>214 #includeについて学んでから質問し直してください。
// ---------- aaa.c ---------- #include <stdio.h> void 他のソースファイル上からも使える関数(void) { printf("A");} static void aaa.c上だけで使える関数(voud){printf("B");} // このソース上だけで使うので staticにしておく(これで他のソースから呼べなくなって安全) void aaa.hに名前を書かないけど、staticをつけない関数(void){printf("C");} // aaa.cには名前を書かないのに、staticをつけずに書いてしまう。あぶない // ---------- aaa.h ---------- #ifndef __AAA_H__ #define __AAA_H__ extern void 他のソースファイル上からも使える関数(void) ; // 名前や引数をメモしておくと、aaa.c以外から呼び出して使うときにも、名前とか引数が分かって使いやすい。 #endif //__AAA_H__ // ----------- main.c ---------- #include "aaa.h" void main() { 他のソースファイル上からも使える関数 ( ); // これはOK aaa.c上だけで使える関数 ( ); // これはリンクエラー aaa.hに名前を書かないけど、staticをつけない関数( ); // たしか、これがOKになっちゃう記憶。(staticを付けてないから、ヘッダに名前無くても呼べてしまう。こまる) }
gotoを使うのはなぜいけないんですか? 無秩序に使うのは確かに見づらくなって良くないと思いますが、他の制御文と同じ用を為すように使えば避難されるいわれは無いと思うのですが。
>>219 使うなというのが経験則であるので、それに反論する明確な根拠とかはないよ
だから試しにgoto使いまくってみて後悔してみればいいんじゃないかな
あとはまぁ、エラー処理に関しては使ってもいいんじゃないか派も存在する
>>219 システムの規模が大きくなったり人が増えてくると何がなにやら分からなくなってくるから
>>219 goto は昔からの大論争で、
「少なくとも濫用はよくないらしい。使うとしても必要最小限がよい」
という辺りまでコンセンサスができている
じゃあどの程度まで使っていいのか、あるいは完全に禁止すべきなのかは
何とも言えない所
事実、大半の局面で goto は不要。必要ない部分に goto を適用すれば、
人間にとってもコンパイラにとっても読み取りづらいコードができる
誰も嬉しくない
昔と違って今時のコンパイラはgoto程度で最適化を断念するほどやわじゃないからやってみるといいよ。
>>219 本来は、C++はともかく、Cではgoto文はスマートなコードを書くための一つの手段。
だけど、
>他の制御文と同じ用を為すように使えば
なら、他の制御文使え。こういう用途でgoto文を使うのが一番愚か。
こういう馬鹿がいるから、goto文を使うのが悪いと一律で言われるんだよ。
いいんじゃない?goto文使っても その先に待っているのが、どのような自体だったとしても、自分がよけりゃーいいんじゃね? 他人に見せるソースならその限りじゃないけど、どうせ自分だけでしか見ないんだろ?
goto使いたい奴はBASICでも使ってろよ
>>226 BASICでも使わないよ。
on error goto なら使うけど
228 :
デフォルトの名無しさん :2010/08/27(金) 10:55:30
>>219 そうだね
他の制御文だって機械語の分岐命令でできているわけで
ちなみに、この問題には安定した理論が古くに完成しており
今頃「論争」している奴はかなり痛い勉強不足
「それはそれ」でまた別な理論を構築しようとしている人は別として
>>228 goto は分岐命令でなく、ジャンプ
こういう馬鹿がいるから話がややこしくなる
gotoを使えたらもっと分かりやすくなるのになあと思ったことがないなあ
231 :
デフォルトの名無しさん :2010/08/27(金) 13:37:12
# ひとりでややこしくしてもがいてるアホはスルー
>>230 malloc 複数回は?
break のような隠れ goto や
exit のような goto 以上のワルを使うだろ
>>231 >break のような隠れ goto や
>exit のような goto 以上のワルを使うだろ
だから、他の手段があるのに goto を使うなという話だよ。
本当に理解力ないな。
233 :
デフォルトの名無しさん :2010/08/27(金) 13:59:34
>>232 理解力って…
隠れ goto つってんのに
>>231 >malloc 複数回は?
goto など使わない。
>break のような隠れ goto や
break はループを一段抜ける機能しかない。
goto と同等だと思うのが間違い。
>exit のような goto 以上のワルを使うだろ
exit はプログラムを終了する場合に限定されてるし、そもそも goto では実現できない。
goto と同等だと思うところが馬鹿。
235 :
デフォルトの名無しさん :2010/08/27(金) 14:15:30
>>234 1段であろうがループを途中で抜けるのは GO TO 有害説が否定するパターンだよ
段数にこだわる症状はジーオーティーオーという綴りに対する過敏反応の典型で
本質がわかってない証拠
goto 以上のワルを goto で実現できるわけないだろ
馬鹿をそのままお返しする
>>235 >GO TO 有害説が否定するパターンだよ
これはお前が勝手に想定してるだけだろ。
goto を否定する人の一部の人がそう考える話であって、
ここで goto を否定した人に勝手に当てはめるな。
break や exit は否定していない。goto が駄目だとしか言ってないだろ。
「goto を使わず他で代用できるときには goto を使うな」だよ。
goto 使わず、break を使えという意味だとどうしてわからないんだ?
>goto 以上のワルを goto で実現できるわけないだろ
exit が悪いというのはお前の主観だろ。
そもそも goto と関係ない機能なら、exit の話をするな。
>>235 一段のループを抜けるのにbreak使わずgotoで書いても同等?
流石にこれはないよw
238 :
デフォルトの名無しさん :2010/08/27(金) 14:30:25
>>236 > これはお前が勝手に想定してるだけだろ。
いーや違う
おまえが知らないだけだ
> break や exit は否定していない。
これこそおまえが勝手に想定しているだけ
> 「goto を使わず他で代用できるときには goto を使うな」だよ。
ここでいう「他」とは何かを知らないことに
おまえが持つ欠陥が集約されそうに見受ける
> exit が悪いというのはお前の主観だろ。
客観なんだが exit の話はしちゃいけないんだよな
239 :
デフォルトの名無しさん :2010/08/27(金) 14:31:02
>>231 >malloc 複数回は?
これでgoto使うのは君が低能なプログラマだからだよw
>>238 わけの分からんことを言うな!
俺自身が、
「goto を使わず他で代用できるときには goto を使うな」
と言ってるだから、知るとか知らないとかないだろ。これが全てだ。
それをお前が勝手に break や exit を否定して思い込んでるだけだろ。
だから勝手な想定すんな!と言ってるんだよ。
どこまで理解力ないの?
242 :
デフォルトの名無しさん :2010/08/27(金) 14:37:48
>>240 だっておまえ break を使うんだろ?
低脳とか自虐ショーはおもしろすぎるからやめれ
>>239 動作が同じだけで、ソースの可読性が全然違う。
だから goto を使うなという話。
君は動けばいいと思ってるのか?
それなら話しても無駄だわ。
244 :
デフォルトの名無しさん :2010/08/27(金) 14:39:56
>>241 > 俺自身が、
> 「goto を使わず他で代用できるときには goto を使うな」
> と言ってるだから、知るとか知らないとかないだろ。これが全てだ。
ははは、確かにそうだね
「俺」が言ってることに「俺」が知らないことは含まれないだろうな
245 :
デフォルトの名無しさん :2010/08/27(金) 14:40:23
>>242 だから break と goto が同じだと思うのが低能なの。
お前が勝手にそう思ってるだけ。
けど、お前はそういうコード書いてるんだよね?
そりゃ前には理解できない話だなwwwwwwwwwwwww
247 :
デフォルトの名無しさん :2010/08/27(金) 14:44:44
>>246 同じネタじゃつまらん
笑いを取りたければ新ネタを出せ、よそで
248 :
デフォルトの名無しさん :2010/08/27(金) 14:56:24
おやつの時間だ、落ちるぞ
gotoはスコープ外だろうが関数外だろうがどこにでも飛べる。 ゆえに、読む人にそういう使い方してるんじゃないか?という疑念を与える。 使うなとは言わんがコメント必須である。
まだgotoの話やってたのかよwww gotoは実質禁止されてるだろ馬鹿だなあ
252 :
デフォルトの名無しさん :2010/08/27(金) 19:38:34
後藤さんは駄目ですか? ><;
#include <stdio.h> // putchar()に依存
static void print_int(int a) {
if(a<0){a=-a; putchar('-');} int s[0x20]; int* p=s; int l=0; do{ *p++=a%10+'0'; a/=10; l++; }while(a!=0);
p--; while(l-->0){putchar(*p--);}
}
static void print_double(double d) { // IEEE754の64bitで決め打ち
char s[0x20]; char* p=s; int e=15, n, j; if(d<0.0){*p++ = '-'; d = -d;} //else{p++ = '+';}
long long q=(( *((long long*)&d)
>>52 )&0x7FF) - 1023; double o=5e-15, b=10, ib=0.1;
int l=0; while(d>=b){d*=ib; l++;}l++; j=0; while(j<l&&j<e){ n=(int)(d+o); *p++=n+'0'; d=(d-n)*b; o*=b; j++;}
while(j<l){*p++='0';j++;} if(d!=0&&q<52){ *p++='.'; while(d<1){d*=b; o*=b; *p++='0';}
o=(q>=0)?o:5e-15; while(j>0&&d>o){n=(int)(d+o); *p++=n+'0'; d=(d-n)*b; o*=b; }
} *p=0; p=s; while(*p!=0){putchar(*p++);}
}
void vpp_de_printf(char* s, void** a) {
while (*s!=0) {
if (*s=='%') {
s++; switch(*s++){
case 'd': print_int( *((int*)(*a++)) ); break;
case 'f': print_double( *((double*)(*a++)) ); break;
case 's': {char* p=(char*)(*a++); while(*p!=0){putchar(*p++);}} break;
default: return;
}
}
else if(*s=='\\'){s++; switch(*s++){case 'n': putchar('\n'); break; case 't': putchar('\t'); break;}} putchar(*s++);
}
}
void main() {
int i=-123; double d=-3.14159265358979; char s[]="aiueo";
vpp_de_printf( "vpp_de_printf\n\tint\t= [%d]\n\tdouble\t= [%f]\n\tstr\t= [%s]\n\n", (void*[]){&i, &d, &(s[0]), 0} );
}
254 :
253 :2010/08/27(金) 20:54:42
va_arg()を使わずにプリントエフ的な仕組みの関数を作れるだろうか? って思いついたので簡単なおもちゃ書いてじっけんしてみた。 引数を (フォーマット文字列、ボイドポインタの配列)って形式で受け取ります。(対応は %d %f %s のみ) vpp_de_printf( "%d %f %s", (void*[]){&i, &d, &(s[0]), 0} ); 「ぜったい通らないだろうな」と思いつつ、試しに 関数の引数を書くところに f( (void*[]){} )って宣言と代入をまるごと書いたら コンパイルが通ってしまったんで驚きました(笑)(gcc4.5.1) ただ、この方式で可変長引数すると、各データにアドレス固定の実体が無いといけないので、 引数に直接3とかの定数を直接指定することができないので、そこが不便だと思いました。 vpp_de_printf( "%d %f %s", (void*[]){ &((const int)3), &d, &(s[0]), 0} ); //これエラー(通りそうなのに
>>254 その引き数の渡し方はgcc拡張だからご用心。
それはさて、整数定数を渡すのなら環境依存を承知でキャストしちゃえばいいじゃん。
void * foo = (void *) 3;
for(a=0;a<10;a++){ test[0]=a; for(b=0;b<10;b++){ test[1]=b; for(c=0;c<10;c++){ test[2]=c; for… のようなforループを簡素化する方法はないでしょうか?
for(int i=0; i<?; i++){ test[i] = 9; }
すごいループだ・・・
>>256 質問を簡略化したつもりなんだろうが
それだとどういうループのこと言ってんのか訳がわからない
// ここより以前は変更なし // ---------- built_in_variable.h ---------- typedef union BuiltInVariable { char c; int i; long l; long long ll; float f; double d; unsigned char uc; unsigned int ui; unsigned long ul; unsigned long long ull; void* vp; char* cp; int* ip; long* lp; long long* llp; float* fp; double* dp; unsigned char* ucp; unsigned int* uip; unsigned long* ulp; unsigned long long* ullp; } BIV; // ---------- END ---------- void biv_de_printf(char* s, union BuiltInVariable* a) { while (*s!=0) { if (*s=='%') { s++; switch(*s++){ case 'd': print_int(a->i); a++; break; case 'f': print_double(a->d); a++; break; case 's': {char* p=(char*)(a->cp); a++; while(*p!=0){putchar(*p++);}} break; default: return; } } else if(*s=='\\'){s++; switch(*s++){case 'n': putchar('\n'); break; case 't': putchar('\t'); break;}} putchar(*s++); } } void main() { int i=-123; double d=-3.14159265358979; char s[]="aiueo"; biv_de_printf( "vpp_de_printf\n\tint\t= [%d]\n\tdouble\t= [%f]\n\tstr\t= [%s]\n\n", (BIV[]){(BIV)3, (BIV)d, (BIV)s, 0} ); } // こうすれば定数の3も引数として直接渡せるようになるけど、これだと使用時の記法がグチャグチョで難解すぎ。(手軽にしようとして、逆に複雑化してる)
エスパーとかの範囲超えてるだろ
262 :
256 :2010/08/28(土) 16:39:22
わかりにくくてすみません
ttp://codepad.org/eByt7bdH 入門書を読みながら効率無視で数独の全パターンを書き出す物を作ろうと思ったのですが
上記のところまで書いたところでforの部分を簡素化する方法があるのではないかと思いお聞きしました。
あれか、世界一難しい数独w 見た目なら関数作ればいけると思うけど、速度ってのは無理なんじゃね。
>>262 全部で何パターンあるか知ってるのか?
ループ以前にそのやり方(総当り)じゃ丸1ヶ月動かしても終わらないよ
includeの概念がよく分かりません 特に環境をいじらなくてもstdio.hを使うときは #include <stdio.h> で済むのに対し、外部のライブラリをこのように利用するにはどうすればいいのでしょうか?
>>262 プログラム自体の簡素化はできない
悪いことは言わないから、ちゃんとアルゴリズムを考えてからまた作った方がいい
268 :
256 :2010/08/28(土) 18:27:01
やはり総当たりでは無理ですか 『アルゴリズムの絵本』を買ってきたのでこれを読みながら考え直してみます 有難うございました
>>262 速度が遅いのは効率無視と書いているのだからいいんだよね?
問題は見た目の話(ネストが深くなりすぎる)だけなら、その方法だけ知りたいと
言わないとココの人バカだから通じないみたいだよ。
270 :
256 :2010/08/28(土) 18:34:55
>>269 一年間無休で動かしている機体があるのでそれを使って計算しようと思ったのですが
コードを書いてるうちに何が何だかわからなくなってきたので簡素化の方法を聞かせていただきました
とりあえずアルゴリズムについて学んでみることにします
272 :
269 :2010/08/28(土) 18:53:20
>>271 へ?
>>266 は再起でもなんでも見た目すら回避できないと言ってるのかい?
そりゃたまげたね
見た目の回避なら関数つかえととっくに言われてるだろ・・・・・・・
275 :
269 :2010/08/28(土) 19:38:48
>>273 まさか君できないの?
>>274 その説明で分かる人はあんなコード書かないだろ
みんな冷たすぎだから動かしてなくて間違ってるかもしれんコードで良ければ置いとくよ。
#include <stdio.h>
void sub(int nest, int sudocu[][9]){
int i, m, n, x, y;
if (nest>3*9) {
if(sudocu[0][0]+sudocu[0][1]+sudocu[0][2]+sudocu[0][3]+sudocu[0][4]+sudocu[0][5]+sudocu[0][6]+sudocu[0][7]+sudocu[0][8]==45)
if(sudocu[1][0]+sudocu[1][1]+sudocu[1][2]+sudocu[1][3]+sudocu[1][4]+sudocu[1][5]+sudocu[1][6]+sudocu[1][7]+sudocu[1][8]==45)
if(sudocu[2][0]+sudocu[2][1]+sudocu[2][2]+sudocu[2][3]+sudocu[2][4]+sudocu[2][5]+sudocu[2][6]+sudocu[2][7]+sudocu[2][8]==45)
if(sudocu[0][0]+sudocu[0][1]+sudocu[0][2]+sudocu[1][0]+sudocu[1][1]+sudocu[1][2]+sudocu[2][0]+sudocu[2][1]+sudocu[2][2]==45)
if(sudocu[0][3]+sudocu[0][4]+sudocu[0][5]+sudocu[1][3]+sudocu[1][4]+sudocu[1][5]+sudocu[2][3]+sudocu[2][4]+sudocu[2][5]==45)
if(sudocu[0][6]+sudocu[0][7]+sudocu[0][8]+sudocu[1][6]+sudocu[1][7]+sudocu[1][8]+sudocu[2][6]+sudocu[2][7]+sudocu[2][8]==44){
printf("\n");
for(n=0;n<3;n++){
printf("\n");
for(m=0;m<9;m++) printf("%d",sudocu[n][m]);
}
}
} else {
y = nest / 9; x = nest % 9;
for(i=1;i<10;i++){
sudocu[y][x] = i;
sub(nest + 1, sudocu);
}
}
}
int main(){
int sudocu[9][9]={};
sub(0,sudocu);
return 0;
}
数独のルール 横行が9マスで、中の数字はそれぞれ1〜9の数字。しかも同じ数字が重複してはならない。 縦列が9マスで、中の数字はそれぞれ1〜9の数字。しかも同じ数字が重複してはならない。 全体のマス9x9を、3x3のグループごとに3x3で並んでる状態で、各グループ内で使われる数字は1〜9の数字。しかも同じ数字が重複してはならない。 1 2 3 4 5 6 3x3のグループ 7 8 9 A B C D E F 3x3のグループが3x3 G H I この、グループで1〜9つかわないと、って条件が、やっかいだなぁ〜って思いますた(w
たぶんもっとも単純な組み合わせの作り方(うえから下にやってく) ぐるぷA ぐるぷB ぐるぷC 1 2 3 4 5 6 7 8 9 行A:1〜9を順番にかく 4 5 6 7 8 9 1 2 3 行B:行Aの数字を、グルプB、C、Aの順序にならべる 7 8 9 1 2 3 4 5 6 行C:行Aの数字を、グルプC、A、Bの順序にならべる 2 3 4 5 6 7 8 9 1 行D:行Aの数字を、1個ずらした順序でかく(2〜9、1の順番) 5 6 7 8 9 1 2 3 4 行E:行Dの数字を、グルプB、C、Aの順序にならべる 8 9 1 2 3 4 5 6 7 行F:行Dの数字を、グルプC、A、Bの順序にならべる 3 4 5 6 7 8 9 1 2 行G:行Aの数字を、2個ずらした順序でかく(3〜9、1、2の順番) 6 7 8 9 1 2 3 4 5 行H:行Gの数字を、グルプB、C、Aの順序にならべる 9 1 2 3 4 5 6 7 8 行I:行Gの数字を、グルプC、A、Bの順序にならべる 感性♪(^_^/
1から9までのループを81個入れ子にして条件を満たしてるかどうか調べればいいんだよ
1行決まれば、ほとんど絞れる。
123 456 789 決めたから絞って
俺のティムポミルクを絞ってからからだ
283 :
265 :2010/08/29(日) 00:25:08
>>267 宣言くらいはわかりますけど、どのようにして環境を整えればいいのかが聞きたいんです
プロジェクトに関連ファイルを全部ぶち込まないとダメなんでしょうか?
>>283 アプリの使い方は該当アプリのスレへどうぞ。
そもそもCにはプロジェクトなんて概念ない死ね。
286 :
265 :2010/08/29(日) 10:37:02
失礼しました、聞き方を変えます ヘッダファイルを読み出すプログラムと同じディレクトリにヘッダファイルを置けば使えるんでしょうか?
288 :
265 :2010/08/29(日) 11:11:17
お前らひどいなwwwww 答えてやれよwwwwwwwww
>>286 外部ライブラリを使うにはlibファイルをリンクしないと使えない。
libファイルをリンクするのは環境によって方法が違う。
VisualStudioならプロジェクトのプロパティで、リンカの入力設定に追加の依存ファイルとしてlibファイルを記述する。
gccなんかを使う場合はオプション-Lでlibファイルのディレクトリを指定し、オプション-lでライブラリを指定する。
libファイルがリンクできるようになれば、ライブラリと一緒に配布されているヘッダファイルが使えるようになる。
ヘッダファイルはコピーして自分のプロジェクトディレクトリに入れて置くのが手っ取り早い。
後は
>>267 が書いているように#includeすれば外部ライブラリの機能が利用できるようになる。
>>288 釣られてやったぞ、感謝しろ。
無駄に配布ライブラリのインクルードファイルをコピーする馬鹿がいると聞いて
外部ライブラリもコピーして自分のプロジェクトディレクトリに入れて置くのが手っ取り早い んですよね?
解らない場合はその方が手っ取り早い。 でも普通はヘッダもライブラリもプロジェクトにコピーしたりしないけどな。
外部ライブラリなんて使わないのが一番手っ取り早いな
脳足りんは一生車輪の再発明してろ。
ほんとに釣りなんだねぇ
>265>286 とりあえず、ヘッダファイルと、ライブラリは別。 コンパイルのためにヘッダファイルが必要で、(正確にはプリプロセスのために必要) リンク時にライブラリが必要になる。 コンパイラはインクルードパスから、該当するヘッダファイルを探す。指定のやりかたは コンパイラによる。gccなら-Iオプションでインクルードパスを指定する。 ライブラリの場合は-Lオプションで指定するけど、静的リンク、動的リンクでも変わる。
C言語を勉強するメリットはなんですか?
ない。どっか池
>>297 初心者に、最初のCをやれって勧めるおっさんがおおいけどマにうけないようにな。
300 :
デフォルトの名無しさん :2010/08/29(日) 17:57:19
Windows & Visual C++のsignal(XXX,test);のことでご質問が あります。 taskkillやシャットダウンや閉じるボタン(X)の割り込みを 検知するにはXXXは何を入れたらよいのでしょうか よろしくお願いします。
Windowsのシステムコールにsignalってあったのか。 UNIX系独特のもんかと思ってた。ちなみにUNIXならSIGKILLでよかったよな。
つーか、CやらないでC#とかJavaなんかやってたら いつまでもプログラム言語がどういうものかっていう根本的な 問題は解決できないよね。 最初のころは、C#やJavaでパズルやってりゃいいけど。
303 :
デフォルトの名無しさん :2010/08/29(日) 18:23:37
WindowsはPosix準拠だからね。
>>302 そういうお勉強ならアセンブラでいいんじゃね?
パソコン1台しか持ってなくて試せないんで聞きたいんですけど あるマシン上でコンパイルしたバイナリファイルって違うCPUが乗ってるマシンでも動くんですか?(OSは同じとします) 例えばアラインメントはCPUごとに違うことがあるらしいんで、アロケーターを書いてるときとかに 遅くなったり動かなくなったりするんじゃないかなとすごい不安なんですが・・・
ビルドしたときに指定したターゲットに互換性のない環境では動作しない 遅くなったりとかはどこに移動してもあるだろ
>>305 CPUが互換性あれば動くし、互換性なかったら動かないってしかいいようがない。
308 :
デフォルトの名無しさん :2010/08/29(日) 18:48:22
>301 回答ありがとうございます。VC++2005 CLRだと 'SIGKILL' : 定義されていない識別子です。 とおこられました。
309 :
301 :2010/08/29(日) 18:50:17
あっそ、残念だったなw
310 :
デフォルトの名無しさん :2010/08/29(日) 19:00:48
>>309 なにかよい方法ないものでしょうか
アドバイスをお願いします。
312 :
デフォルトの名無しさん :2010/08/29(日) 19:35:30
>>305 その心配は仮に PC を2台持ってても解決できないよ
ひたすら互換互換であたかも CPU が違わないように見せかけてあるからね
秋月や CQ あたりのマイコンキットを「2台目」として使ってみれば
CPU が違うと何が起きるのかをガン見できる(数千円の授業料は格安)
OS は同じとします、とあるが CPU が違えば同じ OS は動かないのが基本だよ
ベンダが同じとか流れをくむとかで近縁であることをアピールするために
似た名前を名乗る OS ならあるけどね
どーしてもハード関係はイヤというなら(おすすめはしないが)、
LSI-C86 のように PC の 16bit モード用のコンパイラを使ってみたり
VC++ の 64bit 版を使ってみる手もある
たいして違わなくて拍子抜けするだろうけどね
313 :
265 :2010/08/29(日) 21:24:47
>>289 ,296
ありがとうございました
それと今度から質問するときは酉付けることにします
そもそも、その程度の知識も無いのにアロケータを書くってのが無謀 x86も深く知ってるとは思えないが、x86限定にしとくのが吉
315 :
デフォルトの名無しさん :2010/08/29(日) 22:33:35
>>302 ←自分の住んでる世界が全てだと思ってる典型例
316 :
Perl忍者 ◆M5ZWRnXOj6 :2010/08/30(月) 08:02:14
典型的という言葉は個性オタに大ダメージを与えられる 特別だと思ってるから 典型的という言葉を使って 相手の個性を踏みにじる
317 :
デフォルトの名無しさん :2010/08/30(月) 10:34:34
DCASを簡単にする方法無い?
DCASって何ですか? Cと何か関連性があるのですか?
a&&bのaが偽だったらbは評価スルーされる件って仕様ではスルーしないといけない、スルーしてもいい、どっちですか?
>>319 スルーしないといけない
詳しくは短絡評価でぐぐれ
>>320 ありがとうございます
if(p && p->x == 1) { ・・・
とかは安全ということですね
323 :
デフォルトの名無しさん :2010/08/30(月) 14:12:59
boost::tokenizer< escaped_list_separator_sjis > tok( csvLine ); for(boost::tokenizer<escaped_list_separator_sjis >::iterator p=tok.begin(); p!=tok.end();++p){ cout << *p + "\t"; } cout << endl; これを出力すると a e d q d r r u t になります これをタブ区切りでtsvファイルに出力したいのですがどうすればよいでしょうか?
>>323 cでないソースを張っての質問はご遠慮願います。
325 :
デフォルトの名無しさん :2010/08/30(月) 14:22:43
326 :
デフォルトの名無しさん :2010/08/30(月) 14:32:56
323に書き込んだものです。C++で質問したいと思います。 申し訳ありませんでした。
329 :
デフォルトの名無しさん :2010/08/30(月) 18:34:20
釣り堀だな 確信犯を相手に(キリッとかかっこわるいから・・・
↑これも釣り
331 :
デフォルトの名無しさん :2010/08/30(月) 22:40:52
@#define TEST (unsigned char)(0xA5) A#define TEST (unsigned char)0xA5 上記の@とAでコンパイル結果(HEX)に違いはあるのでしょうか?
丸文字を使うプログラマは信用できない
>>331 あえてさらに#defineを使うって変なことすると違いはある
でも普通はないだろう
1234567890
変数を空にするときは $a = undef でいい?
いいですよ
typedef double *Vector; #define N 3 void fanc(Vector x, double (*f[N])(Vector), double (*f_[N][N])(Vector)) 上記関数の引数のNを省略する書き方はありますでしょうか。 void fanc(Vector x, double (*(*f))(Vector), double (*f_[N][N])(Vector)) 第2引数は上記のように書けたのですが 第3引数を(*(*(*f_)))(Vector)と書くとmainの呼び出し側でうまくいかないようで、 コンパイルエラーでポインタのタイプが違うとなります。 mainでは以下のように関数fancを呼びます。 Vector x; double (*f[N])(Vector x) = {f1, f2}; double (*f_[N][N])(Vector x) = { {f1_x1, f1_x2}, {f2_x1, f2_x2} }; fanc(x, f, f_);
>>337 第2引数は、(*f[N]) (*f[]) (**f)のどれも同じ。(*(*f))でもいいけど括弧が冗長。
第3引数は、(*f_[N][N]) (*f_[][N]) (*(*f_)[N])のどれも同じだけど、これ以上のNは省略できない。
あと関数(function)ならfuncな
>>338 ありがとうございます。
第3引数についてですが、
double (***f_)(Vector))
としてもこの段階でコンパイルエラーが出ないので、
もしかしてmainでのこの関数を呼び出し方を変えれば
正しく動作したりしますか?
関数名は、本当はNewton_methodで
長くなってしまうので省略したのですが間違えてしまいました;
>>339 だったらmainではこうだね。
double (*f1[N])(Vector x) = {f1_x1, f1_x2};
double (*f2[N])(Vector x) = {f2_x1, f2_x2};
double (**f_[N])(Vector x) = {f1, f2};
func(x, f, f_);
>>340 できました!ありがとうございます!!
#define N 2
double (*f1[N])(Vector x) = {f1_x1, f1_x2};
double (*f2[N])(Vector x) = {f2_x1, f2_x2};
double (**f_[N])(Vector x) = {f1, f2};
コンパイラに怒られるので仕様でできないとは思うのですが、
Nをローカル変数nで置き換えられないでしょうか?
>341 Cでは配列宣言時の要素数は定数式でなければならない。 よってローカル変数nに置き換えることはできない。 C++ならconstを付ければOK.
scanfについて教えてください scanf("%d",&a); こうすると,aの値は十進数ですが、aを11hu2のように文字を混ぜて使いたいのですが、 ()の中は何を入力すればいいのでしょうか?
>>344 char s[256];
scanf("%s", s);
何故初心者にはscanfが大人気なのか
>>346 専門学校のテキストとかことごとくscanf()だから。
348 :
デフォルトの名無しさん :2010/09/01(水) 22:14:01
>>346 ファイル構造体へのポインタと char 配列と string.h を
hello world の次にいっぺんに出して残れる人は2種類しかいないんだよ
・「呪文」の暗記が得意な人 →教わったことしかできない木偶の坊
・質問なんかしない人 →初心者にカウントされない
石をたたいて信号を拾うことから始める人たちには
明らかに初心者を卒業してるのに scanf ってつおい?な人もいるね
いずれにせよ互いに「あっちの世界」を知らないわけだが
scanf()にしたって、どうせ呪文的に覚えるだけだろ。 なんか深遠な理由があってscanf()教えてるわけじゃない。
scanfって具体的になにが問題か知ってるの? wiki見ないで箇条書きしてみな
>>350 ほかの入力関数とくらべて挙動がどくとくて初心者はだいたい引っかかる。
挙動に精通しても実践でつかうことはほとんどない。
おぼえるだけ時間の無駄。
352 :
デフォルトの名無しさん :2010/09/01(水) 22:46:56
>>349 「呪文」が苦手な人といっても「呪文」が一切ダメな人とはまた違うね
深遠な理由って
暗記でなく独自に考察したことがある人なら
入力に関する色んな問題に気付いているはずなんだが
>>350 printf の逆と言われたときに、無理だろって直感できるかどうかは大事だね
scanf("%d", &d); を呪文的に覚えて使うほうが fgets()を呪文的に覚えるより、学習でいい点があるってこと? 「stdinはあとで説明するから、とりあえず書きなさい」って言われると 混乱して進めなくなるようなのは、&d とかもダメだろ。
354 :
デフォルトの名無しさん :2010/09/01(水) 23:08:33
>>353 fgets だけで %d の代わりはできないだろうがよ
ctrl+d またはエラーまで繰り返す while 文にどれだけの要素が出てくると思う・・・てか知らないのか?
>>354 atoi()使えばよくね?
二行目が意味不明。
無限ループってscanf()のほうだろ?
やっぱscanf()で教えるのって「いっぱつで文字入力と変換できてちょー便利」程度の話か。
357 :
デフォルトの名無しさん :2010/09/01(水) 23:27:35
ちょー便利なアセンブラだしね
atoi(argv[1])で充分。
文字認識ってどうやってやるのが一般的なんですか
OCRのことか?
猫でもわかるC言語プログラミング第二版の話で申し訳ないですが、 第八章の問4の解答に以下の代入式の解釈の仕方(優先順位・結合規則)がわからないので 教えてください。 (対象の式) *str++ = *p; (変数str、p共に文字列を格納するchar型のポインタ変数) 特に、左辺「*str++」の解釈がイミフというかよくわかりません。 自分で()つけたりして検証してみたりして得た解釈としては、 1.優先順位は++と*は同じ。なので、結合規則で評価順位が決まる。結合規則は、両方とも右から左である。 2.結合規則により、まずstr++が評価される。これにより、インクリメントの対象が*strではなく、strになる。 3.次に*strが評価される。これにより、代入される対象が*strになる。 (ただし、代入演算子の対象が何故*strになるかという疑問もある) 4.*pの値が*strの指すアドレスに代入される 5.インクリメントの対象が*strでなくstrなので、str+1されてstrの指す「アドレスが」インクリメントされる 6.よって、上の式は分解して書くと以下のように書き直せると考えられる *str = *p; str += 1; と、なると思うのですがこれでおkでしょうか? ソースを全部載せていいか迷ったので、わからん部分だけ取り出しました。 問題なければうpりますが・・・。
> 1.優先順位は++と*は同じ。 違うぞ?
364 :
361 :2010/09/02(木) 17:19:10
>>362-363 解答ありがとうございます、
解釈了解です!
>> 1.優先順位は++と*は同じ。
>違うぞ?
すみません、見直してみたら前置のインクリメント演算子(つまり、++str)と勘違いでした。
後置、つまりstr++なら間接参照の*より++の方が優先順位は上でした。
なので、解釈そのものは大きく変わらないけど
結合規則による理由ではなく優先順位によるもの、ということになりそうですね。
365 :
デフォルトの名無しさん :2010/09/02(木) 17:33:22
>>365 整数部(つまり 配列index が 0 の値)が桁上がりするような演算を想定していない
演算パッケージなんじゃないの?
367 :
デフォルトの名無しさん :2010/09/02(木) 20:25:30
#defineで定数を定義する時に定数の内容を文字列でなく 変数の要素にしたいのですが何か方法はありませんか?
*str++=*p; と次のコードは等価 do{ char c,*q; c=*p; q=str; str++; *q=c; }while(0);
369 :
デフォルトの名無しさん :2010/09/02(木) 21:31:40
warning: old-fashioned operator
>>368 入門編にふさわしいかどうか微妙だけど… 副作用完了点の話で
str++ の位置は q = str; 以降であって 必ずしも *q = c; より前じゃないんでは?
渡した引数だけループさせたいのですが、うまくいきませんどこがいけないのでしょうか。 #include <stdio.h> int main(int a){ int b; for(b=1;b<=a;b++){ printf("hello world! %d\n",b); } return 0; }
>>371 int main(int a){
ふざけんな
>>368 等価なわけがない
str は w_char* の可能性もあるよ
他にも色々。。。
まぁたまたま同じ結果になることがあると言った程度だろうね
#include <stdlib.h> #include <stdio.h> int main(int a, char ** c){ int b; a = atoi(c[0]); for(b=1;b<=a;b++){ printf("hello world! %d\n",b); } return 0; } これでなんとか
>>375 >a = atoi(c[0]);
これは
if (a) a = atoi(c[0]);
でしょ。
377 :
デフォルトの名無しさん :2010/09/03(金) 10:27:12
>>376 a が 0 なんて事は無いよ、第一引数には実行系のパスが入るからね
直すなら
if( a > 2 ) a = atoi( c[1] );
else a = 0;
かな
間違った if( a > 1 ) だ
>>377 なら
if (--a) a = atoi(c[0]);
だね
だから c[0] は実行形のパスだって
>>379 なら
if (--a) a = atoi(*++c);
だね
そういう書き方を嫌う現場も有るから改めた方が良いよ
>>361 >猫でもわかるC言語プログラミング第二版
プログラミングを始めた時に読んだ本がこれっだったが
普通に難しいと思ったな〜
だから、違う本の方がいいかも
猫は、合う人とそうでない人がいるだろうね まあ猫に限らないけど
385 :
253 :2010/09/04(土) 19:46:02
*++x なんて書き方はボクは嫌いだなぁ… 個人的に。 だって意味わかんねぇじゃん…むずかC(^_^;なんちて、ちてちて… いや、C言語ハカセ(笑)ならわかるんだろうけど…www でも、個人的に *x++ って書き方だけは、よみずらいけど好き。 個人的にはすごく読みやすいので。 strcpyみたいな動きするときは、たぶんこれで書かれるケースが多いと思う。慣れると読みやすい♪ (カーニハン・アンド・リッチーのC言語の本だと「これ読みずらいよね〜 でも慣れると読みやすいよ♪」みたいな紹介のされ方してた記憶〜) だって、 for(i=0;i100;i++){ a[i] = b[i]; } とかするとき i=100; while(i-->0){ *a++ = *b++; } って簡単に書けたら簡単だし〜ラク… って、2つ見比べてみたら、あんまり簡単になってないね…w(orz やっぱ簡単に誰でも読めるような感じに簡単に書くのがいちばんだと思う〜。だって半年後の自分って、ほとんど他人じゃないですかwww あんまり、かっこいい、難しいっ”ぽい”(笑)書き方ばっかしてると、たぶん、未来の自分がしんどいとおもうwww
消えろ
char buf[256]; fgets(buf, 256, FP); よくbufとかで、配列を宣言している人がいますが この配列の長さは、ファイルの読み書きの時間に影響するんですか?
読み取るデータ量が大きけりゃそれだけ長くなる という当然のことを除けば用意するバッファ量は影響しない
>>387 DOSの時代のころ、setvbufでバッファのサイズを大きくしたら
かなり読み込みが速くなったけど、windows98くらいのころに同じような
実験をしたら、ぜんぜんかわらなかった。
今の時代OSレベルでバッファリングしてるから、数十キロ程度、まとめて
読み書きしてもあんまりかわないみたい。
setvbuf()で設定したバッファサイズって数十キロ程度だから、数メガ
数十メガ単位ならちがうかもしれんけど、いまIOを速くしようと思うなら
メモリマップドIOとか、非同期IOとか、バッファを広げる以外の
方法を考えたほうがいいだろうね。
fgetsのbufと、setvbufは直接関係しない
>>387 の疑問は、bufのサイズって大きいとなにかデメリットあるの?
ってことじゃないかと思う。そうなら、デメリットはファイルアクセスの時間というより
メモリがムダに確保されること、とか。
391 :
デフォルトの名無しさん :2010/09/04(土) 21:23:12
> メモリマップドIOとか、 誰か突っ込めよw > 非同期IOとか、 ボトルネックの解消にはつながりにくいね
>>390 > fgetsのbufと、setvbufは直接関係しない
ようは、ちょっとずつ読み込むか、がばっと読み込むかでどうちがうかって質問でしょ。
バッファのサイズでどうちがってくるかって一般化して答えてもぜんぜん問題ない。
>>391 いつでも通用するってわけじゃないけど、問題の質によってはゆうこうな方法。
こういう方法も検討したらいいってアドバイス。
>>390 > bufのサイズって大きいとなにかデメリットあるの?
たとえばデータのサイズが100バイト単位だったら、100バイト
ごとに読み込むのが素直でコードが書きやすいよな。
setvbuf()とか使わないで自前で大きなバッファをとってバッファリング
して、読み込み速度に差がなかったら、コードが複雑になるので、
それがデメリット。
395 :
387 :2010/09/04(土) 23:56:11
char buf[256]; これは、メモリを大量に使うだけであって 全然バッファリングと関係ないんだね お前ら、ありがとうよ
7年ぐらい新人教育やってるけど 一番良い結果を出せるのは自作テキストな気がする。 よほどやる気の無い奴以外は、自分で本を買って家でも勉強するんだよ。 良い本を与えてしまうと、その本だけど済ませようとする奴がたくさん出てくる。
すまん完全に誤爆だ
>>387 ファイルIOを早くしたいなら、セクタサイズとかセクタ境界を意識する必要はあるけどな。
とくにリムーバブルメディアへの書き込みなんかだと影響が大きい。
てす
400 :
デフォルトの名無しさん :2010/09/05(日) 16:46:56
大量のデータを読むならバッファは大きいほうが有利だろうな read() 内部でのコストは大して変わらんけど read() のコール回数は減るわけだから
構造体内の二次元配列を宣言時に初期化したいです。 通常の配列は int array[2][2]={{10,11},{21,22}}; のように宣言時に初期化できるのですが、構造体だと上手くいきません。 検索して調べてみましたが、構造体のメンバの多次元配列の初期化方法はわかりませんでした。 下記のソースはループで初期化していますが、宣言時に初期化する方法を知りたいです。 よろしくお願いします。 #include<stdio.h> #define XN 3 #define YN 3 typedef struct{ int bord[XN][YN]; }CONS; void main(void){ CONS data; int x,y; for(y=0; y<YN; y++){ for(x=0; x<XN; x++){ printf("%2d",data.bord[x][y] = 0); } printf("\n"); } return; }
試してないが、これじゃダメかね? typedef struct{ int bord[3][3]; }CONS; CONS data = { { {0,0,0}, {0,0,0}, {0,0,0} } }; ところで最初に構造体変数のビットを全部ゼロに初期化するなら data = {0,}; ({{0,}}かも)にするか、 あるいはmemsetとか使う手もあるよ。
403 :
401 :2010/09/06(月) 10:32:54
>>402 ありがとうございます。下記のソースで無事に初期化できました。
任意の数値で初期化したかったので助かります。長レス失礼しました。
#include<stdio.h>
typedef struct{
int bord[3][3];
}CONS;
void main(void){
CONS data={
{
{0,0,0},
{0,0,0},
{0,0,0}
}
};
int x,y;
for(y=0; y<3; y++){
for(x=0; x<3; x++){
printf("[%d]",data.bord[x][y]);
}
printf("\n");
}
return;
}
data = {0,0,0,0,0,0,0,0,0}; でも通る。 data = {{0,0,0},{0,0,0},{0,0,0}}; だと通らない。
その理由は説明できないんだろうな
だから、、ゼロ初期化なら data = {0}; でいいって書いてあるだろ。
408 :
デフォルトの名無しさん :2010/09/06(月) 11:44:45
テスト
>>407 >>401 の通常の配列の初期化を見れば、0初期化だけを知りたいわけじゃないと思うのが普通。
C言語やってるとchinchinが伸びるよね C++ならどんだけ伸びるんだか
標準ライブラリの定数の値は規格で定められていますか? EOFが-1など・・・
>>413 ヘッダーで定義されているけど規格ではないと思う
規格に書いてるかどうかは規格を見ればいいじゃないか
手元のK&R 2nd editionみると、「EOFの値は典型的には-1」とあるけど −1でなければならないわけじゃないみたい 他の規格は知らない
>>413 Cリファレンスマニュアル P390
「伝統的処理系において-1であるが、
規格Cはint型の負の整数定数式であることを要求しているだけである」
※ 規格CってのはC89のこと
もちろん、値が具体的に定められている定数マクロもある
例えばC99のtrueマクロは1
418 :
デフォルトの名無しさん :2010/09/07(火) 14:48:23
分割コンパイルの勉強中なんですが 共有ヘッダファイル内で int hoge[]={ 2, 4, 6, 8, 10, 11, 13 } のように値を決めた配列を定義したいのですが、 そうするとコンパイル時に二重定義だとエラーが帰ってきます。 ヘッダファイル内で"extern int hoge[];"として値をソースファイルで定義すればエラーは消えますが、 そうすると配列の値を各ソース内でそれぞれ定義しなければならず、あまり意味がありません。 ヘッダファイルの中で値を確定させる方法はないものでしょうか?
static const int hoge[]={ 2, 4, 6, 8, 10, 11, 13 } にすれば? 変更する代物ならヘッダには宣言だけ書いて 定義は別にする方法を取る必要がある
訂正しますこうでしたごめんなさい static int hoge[]={ 2, 4, 6, 8, 10, 11, 13 } にすれば? ソースファイル間で共有して変更する代物ならヘッダには宣言だけ書いて 定義は別にする方法を取る必要がある
>ヘッダファイル内で"extern int hoge[];"として値をソースファイルで定義すればエラーは消えますが、 >そうすると配列の値を各ソース内でそれぞれ定義しなければならず、あまり意味がありません。 意味がないですか?
>>418 >ヘッダファイル内で"extern int hoge[];"として値をソースファイルで定義
普通そうやる。
>そうすると配列の値を各ソース内でそれぞれ定義しなければならず、あまり意味がありません。
定義は一箇所だけ。ソースそれぞれでやったらヘッダでやるのと同じ。
#include "foo.h"ってのは、この1行をfoo.hの中身で置き換えるだけだよ。
425 :
418 :2010/09/07(火) 15:47:10
レスdです この大域配列は実際にはもっとサイズ大きくて、プログラム内では値は書き変えませんが 実験の為自分で値を色々変えながらコンパイルし直すのです その度に全ソースの値書きなおしになり、ひとつのソースファイルで修正忘れ、などを防ぐために ヘッダファイル内で一括で定義できないかと思ったのですが。 #if使うのはいいかもしれないです。
stdio.hが何回インクルードされても 実質的にコンパイラが解釈するのは ただ一回 このトリックを使うんじゃ?
>>425 グローバル変数なんだし実体としての器はプログラムで唯一だと思うけど?
(static 変数なら、ファイル毎に実体は個別になるから、そういう話になるけどね)
ヘッダは extern int hoge[];
グローバル変数の本体(任意の 1ファイル: 仮にA.c)に
int hoge[] = { ...................... };
これだと実体の修正は A.c のみだよ
>>429 は間違いです
>>427 さんありがとうございます
確かにその通りなのですが、実行ファイルも複数作っているのです
つまり同じ大域配列を利用した、複数の実行プログラムがあり、
それぞれで値を定義しなければいけないとこういう訳です
変数用のソースファイル用意すればいいんじゃね?
432 :
デフォルトの名無しさん :2010/09/07(火) 16:43:35
> 複数の実行プログラム だったらファイルでしょ
433 :
432 :2010/09/07(火) 16:44:14
データファイルのことね
>>430 複数の異なるプログラムで共通の値の集団を取り扱いたい
+プログラム内部では値を書き換えずに定数的に使う と
俺は定数の定義をファイルから読み込んで埋める って機構を考えるかな
実行ファイル内にリテラルが埋め込まれている必要性があるなら別だけどね。
簡易な方法としては
>>431 のように 変数用のソースを唯一にしてしまう。
A.exe - A.c + その他(
B.exe - A.c + その他
C.exe - A.c + その他
A.c は同じソースを指すように make なりプロジェクトなりを構築する
cmn/A.c
cmn/ProgA/A.exe に関係するソース(A.c 以外)
cmn/ProgB/B.exe に関係するソース(A.c 以外)
cmn/ProgC/C.exe に関係するソース(A.c 以外)
こういう管理の仕方
ライブラリをつくればいいと思う。
!! 変数用のソースを作ればいいというのは思いつきませんでした それは名案かも。ありがとうございます 丁寧な回答ありがとうございます
依存性注入? 違うか。
int型の変数に0から3までの値をランダムに格納したいのですがどうすればできますか?
・int 型変数 a に乱数(0〜3) を代入 ・int 型配列の 0〜3番目の要素(乱数で決定)に値を代入 ・int 型配列の各要素に乱数(0〜3) を代入 1度登場した値を2度以上使ってよいのか? ・代入操作をする・しないの決定をランダムに行う 日本語難しいぞー
>>438 int a = rand() % 3;
>>440 int a = rand() % 4;
だ、失礼!
C99ならそれでもおkだな
444 :
デフォルトの名無しさん :2010/09/07(火) 18:45:03
釣り堀
入門編だしそれでいいんでないの、 議論してるとそのうち完全な乱数でない云々とかに発展しそうな気がするw
どうせ教えるならついでに教えといて損は無い
現在のrand()は下位ビットも十分ランダムだから剰余を使ってもいいと思う
「アラインメントは2のべき乗である」って本当ですか?
2のべき以外のアラインメントなんか使う理由がないから、まぁそうなりますね
>>447 どっかのゲームは自作乱数ルーチン作って自爆してたしな。
素直に%でいいな。
>>447 その、今の rand() とは、いったいどんなアルゴリズムを使っているのですかね?
乱数を得る手段として
アルゴリズム解法で メルセンヌツイスタ や
ホワイトノイズ→AD変換からというデバイス由来という手法が
実在しているのは知っている
標準関数である rand() の現在の実装がどうなんてるのか知らない
>>443 C99 だと実装推奨の手法が規定されてる?
>>452 いやそれ、80年代に書かれたやつでしょ。
下位ビットの周期が極端に短い処理系なんて90年代の前半ごろには
絶滅してる。
qsort()はデキがわるいことがあるから気をつけろみたいなアドバイス
する人はすっかり見なくなったのに、rand()のほうはいまだにそう
言う人が多いのってなんでだろうね。
>>451 VisualStuio2010のrand()みてみたら線形合同法。
下位ビットでも周期が数万だから、ゲームとか初心者が
練習に使う分には十分だね。
線形合同法って下位ビットのランダム性が低いアルゴリズムじゃなかったっけ VSだとある程度切り捨ててたはずだけど
>>456 内部は32ビットで計算して、上位16ビットを乱数として返してるね。
だから下位ビットではない。
ま、その16ビットからさらに上位ビットを使えば周期は長くなるけど、
rand()ですむような用途なら%Nでもほとんど大丈夫でしょ。
>>454 下位ビットの周期性の話ではないが、
実験で gcc の rand() を使ったことがあったが結構偏りがあったので、wichmann-hill を代替に使用したことがある。
rand() を信用しないほうがよいのでは。線形合同法ならばなおさら。
>>455 だとまるで線形合同法だから十分って感じに見えたから
下位16ビットを捨ててるから十分って説明なら問題ないです
>>454 qsortは遅いだけでソートされるけど、
ランダムを期待して周期的だと致命的だからじゃね?
ちなみに90年代後半のFreeBSD2.2.xのgccは、rand()%4すると
1、2、3、4が繰り返されるクソrand()だった。
時期が引っ掛かっただけて、大筋否定する気ないけど、
知識として知っておくのは悪くないと思うね。
地雷に当たって知らんと死ねる。
>>458 rand()の下位をとるか上位をとるかって話なら、
そんなん気にしないでrand()%Nで十分でしょって話。
rand()が使えないような用途なら、上位から取るとかって話じゃ
なくて使わないって話になる。
当たり前だけど。
>>460 Solarisでもそんな話し合ったな。
unix系はしょうがねえな。
%N (N が 2の累乗数) という特殊性もあるし 度数分布とれば偏りは見つかりそうだけど 周期性があるかどうかの検証もいやらしいな サンプル数を多くとって、自己相関算出してみるぐらいなのかね?
オブジェクトファイルが1個以上集まって、実行ファイルができる?と思っているのですが おk? そして、実行ファイルを解凍みたいな処理をすると、オブジェクトファイルを取り出す事が出きるのですか?
M$の次期EXE形式、RE形式(Removable Executable Foirmat)なら 出来るかも
どこがC言語だ
>>465 ポインタください。どうもみつからなくて。
PSPで rand()%2 をぐるぐる回したら 0101010101010101010 ってなりました。これはダメな処理系ですか?
>>468 速度優先・大量のデータを吐くための rand() だったということで。
http://codepad.org/t0gqqFYx gcc -O2 なら通るのですが、-O3以上では Error: symbol `_sse_memcpy128_L1' is already defined となります。
インラインアセンブラでのラベルのバッティングを防止する良い記法を教えてください。(gccなら方言でもかまいません)
1: (中略) loop 1b にするのかな
>rand() マトモな擬似乱数が欲しければrand()なぞ使うな、ということじゃないかな。 >470 インラインじゃなきゃダメなの? sse_memcpy128.sを別に作ってgccに食わせてもいい気がするんだけど。
結局乱数生成はrand()%Nでおkなの?
質を問わないならおk
十分ランダムである必要がある場合は?
その場合、乱数の性質について何の保証もないrandは使用不可
あとで差し替えられるようにしてrand使っとけばいいんじゃね?
MTは遅いからXorShiftお勧め
480 :
デフォルトの名無しさん :2010/09/08(水) 12:51:57
どんなに頑張ってもしょせん疑似乱数 ケチつけたい奴を黙らせることは不可能なので 使う者にとって気の済むものを作って使えばいい
ここで聞いていいのだろうか…。 問題なく動かせたプログラムの構造体 #define NUM_OF_NODE 100 struct node_data { int x; int y; int neighbor[NUM_OF_NODE]; }; に、二次元配列のメンバ int neighbor_2hop[NUM_OF_NODE][NUM_OF_NODE]; を新しく付け加えて(その他何も変えず)、とりあえずコンパイルして実行したらエラー終了… 一次元配列のメンバ int nbr_2h[NUM_OF_NODE]; だと付け加える前の結果と変わらないのに。 二次元はダメってどういうことなんでしょう/(^o^)\ グーグル先生に聞いてもいまいち何が悪いのかわからんちん
サイズが多すぎるんじゃね
エラーの内容は?
サイズが多すぎるんじゃね mallocで確保するかグローバル変数にしたらいいんじゃね
もっと状況を詳しく。エラーって?
環境とか処理系とかエラー内容とか、エラーが出るソースがわからんと・・・ いくつか理由は考えられるが、みんなが言ってるサイズの可能性は高いかな。 16ビットのコンパイラか、この構造体の大きな配列をローカル変数で取ってるとか無い?
なんという回答速度
回答の意味すらまともに理解できないレベルなのですみません。
エラー内容はよくわからず。
とりあえずmallocで確保するの試してみます。
>>486 ローカル変数で取ってました
コンパイラ何よ? LSI-C86試食版とか
エラーメッセージが出るなら、それをそのままコピペしてくれればいい 分かる奴には分かる……かもしれない
>>490 学校のPCに入ってたvs2008使ってます
>>491 言い方がまずかったよう。途中で停止するだけでエラーメッセージは無です
IDEの誤操作によりブレークポイント入れてしまったとか ありがちw
コンパイル時エラー無し で 実行時に落ちる プリコンパイルヘッダの対象になってた とか? うまく依存関係手繰れてなくて、再コンパイルが必要なソースのコンパイルがなされていない可能性 リビルドしてみて
ある意味言えるかも 「C/C++の場合いきなりの初心者はIDE使うな」
496 :
デフォルトの名無しさん :2010/09/08(水) 17:48:03
コードの修正をミスって、変なところにアクセスしてるとか。
>>492 再現性100%なら、デバッガをつかって問題がおきてる箇所を
特定するのは難しくないと思うけど。
せっかくそんないい環境使ってんだから ググるまえにステップ実行でもしてみようぜ
malloc使ったら普通にいけました。 使ったことなかったものでorz 宣言したら確保してくれるのに、mallocって何に使うんだろうレベルでした。生きててすみません。 お騒がせしました。回答ありがとうございました。
>>495 C/C++の場合は言えてるがJavaとかC#とかだったら
IDEから入ったほうがいいと思う。C/C++は例外的に
IDEと相性が悪い
500 :
488 :2010/09/08(水) 17:55:00
>>487 >malloc使ったら普通にいけました。
わしの正解やないか、どないしてくれんねやおのれはいてまうぞこら
高々40KBのデータでスタックが溢れるなんて普通ないよね 大きな配列でも取ってたのかな
再帰深すぎでスタックあふれる という実行時じゃないと不明なケースはおいといて 変数定義の段階でスタックあふれるのも リンカの設定次第だからコンパイル時には分からないのか… スタックオーバー落ちって何らかのヒント出さなかったっけ? (VS2008 環境)
503 :
488 :2010/09/08(水) 18:04:20
>>487 >malloc使ったら普通にいけました。
おいどんの予想があたっとろうが。どうしてくれるとかきさんはくらすぞ
潜在してたバグが配置変わったせいで出てきてたのかもしれんぞ 試しにスタックあふれのコード実行したらデバッグなら 0xC00000FD: Stack overflow で止まったけど、デバッグ無しだと停止しました、のダイアログだけだな・・・
ソースあぷれや
>>498 念の為言うけど、mallocしたらfreeは忘れないようにね
↓以下NT系なら解放いらない〜とかめんどいからRAIIに〜とか禁止
今の開発環境でもスタックサイズはせいぜい1MBくらいだろ そこに変数だけで1KB以上の領域を使おうと思う方がどうかしてる スタックはオート変数のみに徹底しておけ ただでさえ関数呼び出しのたびに消費されるんだから
509 :
デフォルトの名無しさん :2010/09/08(水) 18:50:54
>>509 そこがおまえの巣か
出てくんなよド低脳w
低脳であるということは自覚ないんだ?
513 :
デフォルトの名無しさん :2010/09/08(水) 20:17:47
Windows7 Borland C++ 5.5.1環境で、 特定のホストにPingを打ち、正常なら処理を終了 以上なら数分後に再度Pingというプログラムが欲しいのですが、どう実装していいのかわかりません。 Linuxのコードはあるようですが、Windowsでどうしたらいいか、教えてください。
ボーランド大人気だな。
>>513 while (system("ping -n 1 127.0.0.1") != 0) {
Sleep(60000);
}
>>513 先ずは何「以上」なのか説明してもらおうか。
ffmpegの使い方調べたいんだけど、 参考になりそうなffmpegを使ったオープンソースのメディアプレイヤーってある? できるだけシンプルな奴がいいんだけど。。
コマンドのffmpeg
コンパイラについてなんですが MinGWをC:\MinGWに再インストールして(mingw-get-inst-20100831.exe) C:\MinGW\bin\test.cに※のソースを書いて gcc test.c でコンパイルしたところ gcc: CreateProcess: No such file or directory と出てコンパイル出来ませんでした 再インストールする前は Info: resolving __fmode by linking to __imp___fmode (auto-import) Info: resolving __fpreset by linking to __imp___fpreset (auto-import) と出てコンパイル出来ませんでした(その下にも色々出ましたが) 最初の一回だけはコンパイル出来たのですが、どんな原因が考えられますか? OSはWindows 7です ※のソース↓ #include <stdio.h> int main(void){ printf("HELLO WORLD\n"); return 0; }
gcc: CreateProcess: No such file or directory でググるといろいろわかるみたいだぞ。 binにソースを置いてるようじゃ、この先も苦労しそうだな。
>>520 カレントディレクトリとか聞いたことないか?
諦めてVC++でも入れろカス
>>521 binにソースを置いたのは、binでコンパイルして成功したら環境変数を設定しようと思ってたからです
ググッたんですけど、あんまりわかりませんでした・・・
>>522 もちろん、C:\MinGW\で実行しましたよ
今までbcc32でコンパイルしてたので、やり方が同じなら間違わないと思います
VC++、試してみます
Linuxがいいよ。最初から全部開発環境入ってるよ。cygwinでもいいよ
>>523 やっぱ間違ってんじゃねーかwwwwwww
gcc からプリプロセッサやらコンパイラの実体とか呼び出すんで それらの環境がおかしいPATH通ってないかファイル名が違うと CreateProcess: No such file or directory が出るみたいよ。まあ他も試せるならそっち使った方がいいな
ああ gcc内部で CreateProcess 使ってて(fork の代用?) その段での呼び出しエラーを報告してるのか
>>523 ソースをMinGW\binに置いてカレントがMinGWなら
gcc bin\test.c
だろ
530 :
デフォルトの名無しさん :2010/09/09(木) 18:50:48
この段階の子に MinGW は手に余るだろ 2つの OS の癖を同時に憶えるのは過負荷だよ これは cygwin でも基本同じこと どうしても gcc にこだわるなら Linux 専用機を用意した方がいい VM でなく実機で
インスコでつまずく罠
インストーラ起動してcoreパッケージとCパッケージ入れてパス通したら終わりだろ どこに躓く要素があんだよ
CoreパッケージとかCパッケージとか何の話? MinGW?
Turbo C 2.01 使えよ。
コンパイルしたバイナリをテキストエディタで開くと、 コード上の文字列が読めるんだけど、見えなくする方法ないの?
開くな 見るな 覗くな 暗号化 気にするな
>>535 zipexe とか upx とかなら頭をひねらなくても大丈夫w
もしかしてデバッグビルドの埋め込み情報のこと言ってたりして。
てs
10個の3文字英単語をアルファベット順に並び変えるプログラムを作成しているのですがwarningが出て困っています。 以下がwarningで tes.c: In function ‘main’: tes.c:16: warning: passing argument 1 of ‘sorting’ from incompatible pointer type tes.c: In function ‘sorting’: tes.c:30: warning: passing argument 1 of ‘strcmp’ makes pointer from integer without a cast tes.c:30: warning: passing argument 2 of ‘strcmp’ makes pointer from integer without a cast tes.c:31: warning: passing argument 1 of ‘swap’ makes pointer from integer without a cast tes.c:31: warning: passing argument 2 of ‘swap’ makes pointer from integer without a cast ここからが私が作成したプログラミングです。 #include<stdio.h> #include<stdlib.h> #include<string.h> void sorting(char wd[10][4]); void swap(char *x,char *y); main(){ FILE *fp; char *s1,*s2,*s3; s1=(char *)malloc(10); fp=fopen("word.dat","r"); while(fgets(s2,10,fp)!=NULL){ sorting(&s2); strcpy(s1,s2); } free(s1); fclose(fp); printf("%s \n",s1); }
長すぎるようなので分割しました。 先ほどの続きとなります。 void sorting(char wd[10][4]){ int i; for(i=0;i<10;i++){ if(strcmp(wd[i][4],wd[i+1][4])<0) swap(wd[i][4],wd[i+1][4]); } } void swap(char *x,char *y){ char *tmp; strcpy(tmp,x); strcpy(x,y); strcpy(y,tmp); } 以上です。警告文の解決策ともし間違っている部分があればご指摘お願い致します。
設計からやり直したほうが良いよ。
>>540 >10個の3文字英単語をアルファベット順に並び変える
これはどういうことがしたいの?
bad cow ank def don...
これ↑を、
1:ank bad cow def don...
こうしたいのか、
2:abd cow akn def dno...
こうしたいのか、どっち?
ポインターも配列も正しく使えてないな。 1度に色々なことをやろうとせずに、単純化して1つずつやっていった方がいいよ。 とりあえず、3文字の単語じゃなく、1文字だけのをソートしてみたら?
>>545 ポインタも配列も正しく扱えてないですか・・・
1文字ずつですか・・・上でやってみましたが結果は同じでした・・・
どこがおかしいか全く見当もつきません・・・
tes.c:30: warning: passing argument 1 of ‘strcmp’ makes pointer from integer without a cast tes.c:30: warning: passing argument 2 of ‘strcmp’ makes pointer from integer without a cast tes.c:31: warning: passing argument 1 of ‘swap’ makes pointer from integer without a cast tes.c:31: warning: passing argument 2 of ‘swap’ makes pointer from integer without a cast の警告文は自己解決しました。 if(strcmp(&wd[i],wd[i+1])) swap(&wd[i],&wd[i+1]) で解決しました。
エラーが全部解決したかと思ったらセグメンテーション違反になりました・・・
すみません、全く違うことしてました・・・。
どこから突っ込んだら良いのか分からんけど malloc使わんとダメなの? 全部配列にしたら?
とりあえず、設計云々前にエラーを指摘しとく
>>547 の修正後の話
・char *s2にfgetsで10バイト読み込んでるけどメモリ確保していない
・sortting関数で受け取ってるwdは[10][4]の40バイトなのに渡されてるのは10バイトのデータ
・データコピーによる交換かポインタのポインタで交換かによって違ってくるけど、
>>547 のswap(&wd[i]〜はポインタのポインタで交換しようとしてる
なんで char s1[10][4],s2[10][4]; なにに s1[10]にアクセスしてんだよ死ね
>>553 生きててすみません。でも、真理にたどり着いてから死にたい。
>>552 本当に一度初心者用の教本からやり直した方がいいんじゃないかってぐらい
あちこちおかしい
確保してないただの未初期化のポインタに書き込もうとしたり
配列を渡すときもめちゃくちゃだし
557 :
デフォルトの名無しさん :2010/09/10(金) 08:31:08
>>557 そういうことであってます・・・。お手数掛けて申し訳ありません。
再度、参考書等を読み直して1から自分で作ってみようと思います。
ぐちゃぐちゃなプログラムをお見せして申し訳ありませんでした。
また、質問に回答してくださった方々、ありがとうございました。
精進します・・・。
ぐちゃぐちゃでも良いんじゃないかな、添削する分には面白いしw
多くの失敗を繰り返しながら上達して行くんだから問題ないよ 失敗しているってことは、実践しているってことなんだからね 頑張って
コンパイルする時にちゃんとワーニング全部出す設定にすべし
ウォーニングな
いやwarningだろ
いやVC++の/Wallは常用できない
565 :
デフォルトの名無しさん :2010/09/10(金) 17:12:37
口数が多いくせに大事な一言がないか頓珍漢というのはお約束だね
いずれ
>>558 がおまえらをぶっちぎりで追い抜くよw
?
ヨーロッパ人は英語由来のコンピュータ用語でも平気で 自国語の読みをしてるよ。 日本人ならローマ字読みでワーニングだろ。 英語に近いほうがかっこいいとか、植民地根性すぎる。
569 :
デフォルトの名無しさん :2010/09/10(金) 21:46:03
フランスを知らんな?あちらはマウスでさえ自国の呼び名があるんだぜ?
570 :
568 :2010/09/10(金) 21:51:49
>>569 まあ、実は、ヨーロッパのことなんか何にも知らなくて適当に
思いつきで言ってるだけなんだけどな。
>>568 なんで「警告」って言わないの? もう占領軍はいないんだよ。
?とかも欧州の言語から取り入れたものだろう warningも日本語の一部として取り入れられたんじゃないか?
いちいちウォーニングとか訂正いれてる連中だって、 mainはメインなのにmailはメールとか、それ以外のカタカナは ぜんぜん不統一なんだろ。
メーンエベント
アイロンとかな けど多くは他の国の読み由来のなのかもしれない ウィルスとか
医学関係はドイツ
ヴァイラスって書いているなぁ。 でも、メイラーと書く割にはつい、メールと書いている事実。 某所で「チェインメイル」「鎖帷子か?」の遣り取りが頻発した所為かも知らん。
578 :
デフォルトの名無しさん :2010/09/10(金) 23:22:50
どーでもいーわ コードの質とは全然関係ない
ここはどこ?わたしはだれ?
我々はボーグだ
ワーニングとか言ってるやつ、コードの質が低そう。
俺はウォァーニングみたいなどっちにもとれるような発音してる
584 :
デフォルトの名無しさん :2010/09/11(土) 00:02:11
>>581 低【そう】ってどういうこと?
断言できない奴こそどこを見てものを言ってるのか疑問だぜ
自分のコード見てんだろ
ワーニングとか言ってる連中は例外なく質の低いコードを書く。 「低そう」とか言って断言できないって、観察力無さ杉。 ってことか。 なるほど。
観察力が高い方が例外も発見できる訳で、 断言できない方が観察力低いとは言い切れないだろう サンプル数がいくら多くてもたった1つの例外を見つけてしまうと断言できなくなってしまうわけだから
588 :
デフォルトの名無しさん :2010/09/11(土) 00:47:21
>>585 ご愛敬ってとこでいいかな
>>586 なるほど、ワーニングという発音を見てものを言っているのか、よくわかった
>>587 まあどんなに周りがよくてもたった1つのバグで評価は最低にされちまったりするが
「高い観察力」を持つといいながら具体的な指摘/対策をしない(できない)奴はダウトだろ
まあでも、会話してて相手が「ワーニング」とか言ったら、うゎって思うよな。
590 :
デフォルトの名無しさん :2010/09/11(土) 01:09:34
ハードディスクをメモリと呼ぶ人とか、ページングとスワッピングを混同しているメーカーのSEとか、 【固体】識別番号とおっしゃるごにょごにょとか色々いるわけで 海千山千相手のお仕事で言葉尻に留意するのはともかく、過敏反応で墓穴を掘ったらそいつら以上の赤っ恥を晒すことになる
ハードディスクはメモリの一種だし
592 :
デフォルトの名無しさん :2010/09/11(土) 01:43:42
warningを日本語に翻訳すると「ワーニング」「ウォーニング」という言葉になるってだけだよ。グジャグジャ言うことじゃない。 dogなら「いぬ」「〜けん」というのと同じ。言語が違えば違う音になるし、単語同士が1対1に対応するわけでもない。
>>590 ページングとスワッピングか‥‥。調べてみるとはっきりとは区別してなかったな。勉強になった。
わーにんぐ、はやっぱり恥ずかしいなあ。 でも、めーんてなんす、も昔は恥ずかしかったけれども、最近はそうでもなくなったなあ。
〜∞ 彡川川川三三三ミ〜 プーン 川|川\ /|〜 ‖|‖ ◎---◎|〜 川川‖ 3 ヽ〜 / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 川川 ∴)〆(∴)〜 < ウォーニング 川川 〜 /〜 | 川川‖ 〜 /‖〜 \______________ 川川川川 (⌒)川‖〜 ヴィシッ! //::::::::|-、 ,-/::::::ノ ~.レ-r┐ / /:::::::::::| /:::::ノ__ | .| ト、 | /:::::::::::::::| 〈 ̄ `-Lλ_レ′
596 :
デフォルトの名無しさん :2010/09/11(土) 02:13:27
ウァーキング!
597 :
デフォルトの名無しさん :2010/09/11(土) 03:23:12
プログラム系の会社でアルバイトしようと思ってるんだが どの程度プログラム書ければ良いんだ…ワカンネ… 募集かけてるくせに、そういうことをあまり記載してないのってどうなの…
んじゃ問題 10チーム(T1,T2,...,T8)でトーナメントを行う 時の勝敗樹状図をすべて書き出すプログラム
T1,T2,...,T8,T9,T10ね
600 :
デフォルトの名無しさん :2010/09/11(土) 03:38:26
for(i=1;i<=10;i++) { if(i>i-1) { } oh...ごめんなさい、バイトすら無理ですた
601 :
デフォルトの名無しさん :2010/09/11(土) 03:45:30
悲しくなってきたわ
この問題に対しては、 先ず「勝敗樹状図」と「すべて」の定義を聞くことが正解だろうな。 理解できずに(そもそも十分な情報が与えられていない要求に対して)いきなりプログラムを書き始めるのは明らかに間違い。
勝敗じゅじょうぢゅってなに
再帰で分割してくだけで解けるだろ
10チームの順位が与えられたとして 起こりえる、試合のセットを列挙するって 方針はどう? 1位T1 2位T2 3位T3 4位T4 (T1,T4) (T2 T3) (T1 T2) (T3 T4)
>>602 の意味が理解出来ない知障がドヤ顔でレスしてるのか
終わってるなこのスレ
プログラマたるもの、もう少しプログラムを「生き物」のように 扱いたいものですな。完全な理解と完璧な要求定義がないと 何も書けないというのはプログラマじゃなくて単なるコード屋 という誹謗も耳にすることがあります。
コーダはコーディングだけしてれば良いんだよ
ライブラリ内にあるa()の関数内のbの変数をどうにかして変更したいんですが どうすれば良いですか? javaとかのsetbメソッドみたいにしたいです void a() { static int b; }
関数a変更しないでやれと言われれば 全く保証がないが、static変数はデータ領域に配置されてるので 他のデータ領域にある変数のアドレスがえられるならそれをずらせばアクセス出来るよ
そういう回答を期待したレベルの質問には思えない…。
ではやりたい事をなるべく考慮してみようとすると 変数は構造体にまとめて その構造体名_set_変数名の関数用意するとかすればいいんじゃないの? よりクラスっぽくするキモいテクニックもあったような気がするけど つか関数に置いた変数にアクセサってひょっとしてJavaじゃなくてjavascriptだったりするのか?
Cのルール内では不可能だな。当たり前だが。
>>597 データ構造は配列。
アルゴリズムはリニアサーチ。
この二つだけ知っていれば業界は渡っていける。
渡ってはいけるだろうが...メンヘル板の住人になる確率も大
その手の資格持ってればいいだろ
C言語で平均50行以内で書ける程度のプログラムが作れること SQLがわかり、少しはかけること HTMLも少しは出来ること 一般教養試験(SPI)で行う程度の数学が出来ること あとは面接での心理検査で適正を見る こんなところか?
10チームだとどこをシードにして何試合パスさせるとかも考えないといけない 某漫画みたいなすごい偏ったトーナメントもありだと微妙に面倒だよね この辺はっきりさせないと問題として不十分でしょ
Web系だろうからCが全然ありがたくない件
最初からJavaScriptやJavaが妙に出来る新人も なんだか信用したくない件
ま、いざというときのためにapacheのモジュールくらい書けないとな。
すげえな
問題を単純に1、2、3、4の4チームの場合で考えてみる。 もしも、各チームの強さが(チーム1=最強、2=かなり強い、3=まあまぁ強い、4弱い)って関係だったらどうだろうなぁ〜って考えると、 トーナメント表の組み合わせが ”チーム1対チーム2、 チーム3対チーム4”だとすると、チーム2は初戦でチーム1に必ず負けるので、チーム2はかなり強いのに最終順位はチーム3よりも下になってしまう。 (優勝・チーム1、 準優勝・チーム3、 銅メダル・チーム2、 まけ・チーム4) トーナメント表の組み合わせが ”チーム1対チーム3、 チーム2対チーム4”だとすると、チーム2は初戦を制して準優勝できる。 (優勝・チーム1、 準優勝・チーム2、 銅メダル・チーム3、 まけ・チーム4) とすると、必ずしもチームの強さと、トーナメンート表でのポヂショーンの良さとが、かならずしも一致しない所がおもしろいなぁ〜〜っておもいました。 各チームの強さ関係の、全ての組み合わせが4の階乗で24とおりかもしれないとしたら、 それらの強さ関係の各場合毎に、トーナメントでの全ての組み合わせも24とおりだとすると、ありうる組み合わせは24x24なので、すごいいっぱいひょうじしなくちゃいけなくてたいへんだとおもった。 (でも、かさなってるのもあったら、ちょっとはヘルのかもしれないなぁ〜っておもったけど、かさなるのだろうか〜はて??わかんない) それはさておき 10チームもあったら、すごいいっぱいでけいさんがたいへんだぁ〜うわ〜〜ん(・_;/ってなるとおもった。ぱそこーんが
いった
ぱそこーんにスパコン並の事をさせようとしたらすぱこーんと逝ったわけか
ポッディスッツッヨーンな
スペーエアコンパユーテェーな
優勝チームは10通りしかない プロセスなんて無視
Cで簡単なゲームをいろいろ作りたいと思っています コンソール画面のみを使って遊べるゲームのアイディアを下さいm(__)m たとえば ・じゃんけん ・hi&row ・タイピングゲーム みたいなものです
倉庫番
・○×ゲーム(3目並べ) ・暗算ゲーム ・Hangman(単語当てゲーム)
>>631-632 ありがとうございます!
参考にさせていただきます
他の方も是非よろしくお願いしますm(__)m
>>630 ハイ-ローならこの前私が作ったな
カードを表す配列の中身を何回もランダムに入れ替えることでシャッフル
これを順番に出して、高いか低いか当てさせる
一人でやるからあんまり面白く無いが・・・
時々Cのコードで見かけるのですが、 sp<IMediaPlayer> mPlayer; のsp<>は何を意味しているのでしょうか?
>>635 それはCではなく、C++。
"C++ テンプレート"でググってみなされ。
>>630 ,636
コンソール制御がありなら、nethackまで行かなくても
ターン制インベーダぐらいでそれなりに面白かった。
敵が横移動しなくて、出て来る位置がランダム。
あとはスレッドまで入れて、テトリスとか作れる。
どこら辺までが簡単なゲームなんだろ。
テトリスなんかはルールは簡単だけど、
実装はレベルがちょっと上がる。
昔、MS-DOS汎用テトリスってのがあったな。 エスケープシーケンスを使ったキャラクターベースで。 PC-9801、AT互換機、TOWNS、なぜかDOS互換OSの動いていた汎用機なんかで動作確認した。
640 :
デフォルトの名無しさん :2010/09/12(日) 14:11:23
> DOS互換OSの動いていた汎用機 ローカルってオチじゃねえだろうな
641 :
デフォルトの名無しさん :2010/09/12(日) 14:22:08
ローカルって何?
nlithか、懐かしいな
643 :
デフォルトの名無しさん :2010/09/12(日) 14:33:43
リモートの反対 # 公然の秘密でも立場上あまりしゃべれないのでここまで
なんでテトリスでスレッドの話が出てくるんだよ? どんなクソ設計したんだ?w
設計能力が低くてスレッド分けないと作れないんだろ。 時々いるんだよな、何でもかんでもすぐ別スレッド立てようとする奴。
646 :
デフォルトの名無しさん :2010/09/12(日) 16:35:32
C言語を勉強して1ヶ月のものです。 1ヶ月もしていて配列?なんて突っ込まないでくださいね? Visual Studio 2010 Expressを使ってます。 配列について質問なんですが、 main関数より上で宣言した(グローバル変数?)配列の値を変えたいです。 #include<stdio.h> int a[2]={0,1}; int main(){ a[2]={2,1}; return 0; } こんな感じ?に書いたのですが【Error:]式が必要です】と言われます。 配列の値の変更はどのようにしたらいいのでしょうか? 配列の中の値を変えたいのですが・・・ 日本語読みづらいですがおねがいします。
int main() { a[0] = 2; a[1] = 1; return 0; }
648 :
デフォルトの名無しさん :2010/09/12(日) 16:50:55
>>647 ははは・・・まさか・・・ね?
1個1個入れていかないといけなかったのか?!
ありがとうございました。
初心者なのにご教授いただき光栄です
>>648 別に配列もってて、それコピーしてもいい。
まあ最初はなんでそんな機能すら無いんだと思うかもしれんけど、別にいらんからな
>>646 main関数の中に書いてる
a[2]
ってのは、配列aの2番目(1から数え始めるなら3番目)を指してるんだ
だから、そこに{2,1}なんて値を入れることは出来ない
そもそも
int a[2]=ry;
で宣言しててa[2]が無いから
普通の整数を入れても何らかののエラーもしくは不具合が出るだろうけどね
これなら配列aを丸ごと書き換えられるけど・・・あんまり意味は無いかな
#include <stdio.h>
int a[2]={0,1};
int main(void){
int b[2]={2,3};
*a=*b;
printf("%d,%d\n",a[0],a[1]);
return 0;
}
Cを初めて一年くらいの私には、これしか思いつかない
652 :
デフォルトの名無しさん :2010/09/12(日) 17:11:24
>>651 ありがとうございます!
なるほど。。。そういう事だったのか・・・
int b[2]={2,3};
*a=*b;
勉強させていただきます^^
そんな機能は無えぞ。 構造体と間違るてんじゃねのか?
初期化と代入の違いを認識せよ
656 :
651 :2010/09/12(日) 17:53:02
これでエラーも警告も出ずコンパイルできて、実行も出来たけど 使ってるのはBorland C++
*a = *b
a[0] は b[0] の値になっても a[1] は b[1] の値にならない
元質問者の
>>646 は配列の一括代入を意図してた
その配列を構造体で包むとできちゃうんだよなw
659 :
651 :2010/09/12(日) 18:30:17
ほんとだ、a[1]の値が変わってない・・・ ありがとう
コンパイル・リンクが通ったからといって 滞りなく動く(青バックやコア吐き、鼻から悪魔) 意図したとおりに動く という保証にはならない
実を言うとどうでもいい・・・
662 :
651 :2010/09/12(日) 20:16:30
間違えた・・・ 実を言うとどうでもいい・・・
>>654 これはたしかGCC拡張であったとおもいますよ。
これはたしか、両方の配列のサイズが同じであるのが前提条件だったような記憶。ボーランードのコンパーラーでも動くんだったんですね。しらなかったです。
>>663 C99 だかの初期化ではなく、代入時にも { } でまとめられるほうの拡張?
*a = *b ただし、共に配列で型と大きさが同じ場合には一括代入するほう?
665 :
デフォルトの名無しさん :2010/09/12(日) 21:29:02
ぼけばっかりか、657 以外のマトモな人はニヨニヨしてるのか
それなら “*” は付けないだろ。 * を付けたら既存の文法でも意味が付いちまーからな。 int a[2]={0,1}; int b[2]={2,3}; a = b; こういう表記になるはずだろ。
static File f; こんな感じで宣言した、グローバル変数はどうすれば初期化できますか?
それはグローバルじゃないからグローバルとして初期化するのは論理的に無理。
669 :
667 :2010/09/12(日) 21:47:51
>>668 static File f;
オブジェクト指向言語だとprivateだけど、いまいちわからないからグローバル変数って書いてみた
とにかく、自動で初期化できればokなんです
>>667 いずれにしても静的変数だから、何もしなくても全メンバに0が設定されることは、標準Cでは保証されている。
初期値を与えたいなら、初期化子を与えればよい。
こんなやつ
static File f={0, 1.0, "hoge"};
671 :
667 :2010/09/12(日) 22:02:03
>>670 なるほど、javaのstaticブロックみたいに便利な機能は無いのですか
ありがとうございます
static File f; のの static何を意味するですか? でどれに掛かるんですか? fなら File static f; ってできるんですか?
674 :
667 :2010/09/12(日) 22:44:40
>>672 それならば、そこら辺をkwsk教えてください
あ、もしかして
>>672 は解ってないっぽいかも。
「こいつバカ」「ゆとりか」「このスレばかばっか」の一言レス系のやつに 詳しい説明を求めても、説明できたためしがないんで本人も説明できないんでしょう。
>>675 staticが付いたらグローバル変数じゃないっておかしいだろーが
ファイル分割できない人なんだろ
>673 Cのイヤなところなんだけど、staticは使う場所によって2通りの意味がある。 すべての関数定義の外で使用すれば、内部リンケージを意味する。 そのファイルの外から直接アクセスできなくなる。 プログラムがそのファイルだけからなるのであれば、staticがついても グローバル変数と呼んでもいいかもしれない。 なおauto変数ではないので、静的変数である。 複文で宣言されている変数に、staticをつけると静的変数となる。
そいつを「グローバル」と呼ぶのなら、 本来グローバルと呼ばれていたものは「ユニバーサル」とでも呼ぶべきだな。
>>679 2通りってことでもないだろ。
単にスコープの違いってだけの話だよ。
まあ、読み方の問題だな。
void func(void) { static bool flag = false; if(!flag){ flag = true; do_something(); } } int main(void)
>>682 だな。
基本は外に書くタイプの方だ。
それをスコープ区切るために内側に書くというだけのことだ。
for(int i=0; i<10; i++){ static int val = 0; printf("%d\n", val++); } この結果がどうなると思ってるの
誰に何を問いたいんだよ?w
687 :
685 :2010/09/13(月) 00:10:43
>単にスコープの違いってだけの話だよ。
#include って、必要なヘッダは hoge.hに全部書いて、hoge.cはhoge.hのみをincludeすべき? 巷のコード見てるとhoge.cとhoge.hで同じヘッダincludeしてたりもするんだけど、 その辺の切り分けってどうすればよいの?
必要ないヘッダは極力includeしないようにすべき
>>685-687 A:
func(){
for(int i=0; i<10; i++){
static int val = 0;
printf("%d\n",val++);
}
}
B:
static int val = 0;
func(){
for(int i=0; i<10; i++){
printf("%d\n",val++);
}
}
スコープしか変わらんだろ。
ただ include するだけの .h ファイルなんか作るなよ欝陶しい。
staticの意味が2通りあると言いたいだけなんだけどもういいや
694 :
デフォルトの名無しさん :2010/09/13(月) 00:42:45
____ / \ /\ キリッ . / (ー) (ー)\ <「staticの意味が2通りある」 / ⌒(__人__)⌒ \ | |r┬-| | \ `ー’´ / ノ \ /´ ヽ | l \ ヽ -一””””~~``’ー?、 -一”””’ー-、. ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒)) ____ /_ノ ヽ、_\ ミ ミ ミ o゚((●)) ((●))゚o ミ ミ ミ <だっておwww /⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\ /⌒)⌒)⌒) | / / / |r┬-| | (⌒)/ / / // | :::::::::::(⌒) | | | / ゝ :::::::::::/ | ノ | | | \ / ) / ヽ / `ー’´ ヽ / / | | l||l 从人 l||l l||l 从人 l||l バンバン ヽ -一””””~~``’ー?、 -一”””’ー-、 ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒))
・関数定義の外で使用すれば、内部リンケージを意味する ・複文で宣言されている変数に、staticをつけると静的変数となる static の有無で意味が変わるじゃん。既に書いてるのに。
単に、staticと宣言された変数は、内部リンケージを持ち静的変数になるってだけだろ。 staticの有無の話はしてないし。
697 :
デフォルトの名無しさん :2010/09/13(月) 01:00:08
禿も髭もちょっと冷静さを失った発言が見られるようだが、よく見れば2つの決まりでしかなく、 それが使用された場面によって導かれる結果が変わっていくというだけのこと 髭の言ってた決まりが1つでないことが気持ち悪いという点には同意だな あとは3つであろうが4つであろうが本質的には変わらない
これは要するにね、例えば、 int *a; と書いてあるのを見て、 *a が int 型である、と読むのか、 a が int* 型である、と読むかの違いみたいなものなんだよ。 ただ基準としてる観点が違ってるだけであって、 どちらが正しいとか間違ってるとか、そういうんじゃないんだよ。
>>699 それは前者が正しいだろ。
C++ 厨は何故か後者の読み方して書式までキモく変形させるけどな。
>>699 君は十分に頑張ったよwww
もう楽になってもいいんだよwww
結論 関数定義の外であろうと内であろうと、staticを付けた変数は内部リンケージを持つ。 複文で宣言されていようとなかろうと、staticを付けた変数は静的変数となる。 故に、staticを付けた変数は、内部リンケージを持ち、静的変数となる。意味は一つ。
703 :
デフォルトの名無しさん :2010/09/13(月) 01:25:56
static の説明に静的変数が出てきたら世話ないだろ
関数内でstatic付きで宣言された変数は内部リンケージじゃねぇよ。
705 :
デフォルトの名無しさん :2010/09/13(月) 01:52:50
あ゙??
>>703 それはどうだろ。
他に言いよう無いんじゃね?
静的な記憶域がうんたら的な表現の違いはあるかもだが。
>>702 ×内部リンケージを持つ
↓
○リンカーに知らされない
同じstaticというキーワードなのに使う場所によって違う意味になる グローバルスコープ(関数外)の関数か変数 →関数や変数は内部リンケージとなる(=ファイルスコープ) ローカルスコープ(関数内)の変数のみ →静的変数となる(リンケージは無関係) C言語の曖昧さの1つだよ
>>700 int *&a; は *&a が int 型である!!
>>708 静的変数になるって・・・
よくわかってないのに説明すんな
>>630 最近のコンソール画面は昔のように80文字x25行の制限があるわけじゃない。
モニターさえ広ければ640x240のVGA解像度ぐらいの文字数にする事も出来る。
流麗なグラフィックを売りにするようなゲームは流石に無理だと思うけど、
シューティングだろうが、アクションだろうが、アドベンチャーだろうが
RPGだろうが大抵のゲームは作れるはずだ。
色数の制限は厳しいが高速なハードウェアなら、文字の色を短時間で
切り替える事により疑似フルカラー表示したり、GPGPUを使って3DCG
を表示することだって出来るだろう。
唯一問題があるとしたら文章の表示ぐらいだ。アプリケーション側で
フォントデータを持つにしても、解像度が低いので漢字の表示は
あきらめるしかないかもしれない。
お前さんはそれをC言語習いたてのぺーぺーに書けと?
>>709 それ、スレ違いですから。
>>708 ローカル変数にstaticをつけた場合も内部リンケージであることには違いはないでしょ。
>>708 static キーワードはファイルスコープと静的の2つの意味を持つ
・関数外:元々静的なのでファイルスコープの機能しか評価されない
・関数内:元々ファイルスコープ(もっと狭いけど)なので静的機能しか評価されない
別に曖昧だとは思わないな、まぁ暗黒面とは呼ばれているけど
>>710 どうした低脳w
お前の誤った知識を晒してみるか?
>>714 1つのキーワードに複数の意味を持たせることが曖昧そのもの
基本ファイルスコープにして外部リンケージのみ別のキーワードを用いる等対処法があったはずだ
もちろんC設計当時の話だから今さらだけどな
>>713 違うっつってんだろーが
リンケージという言葉はグローバルスコープに存在するオブジェクトに対してしか使わないんだよ
局所変数にリンケージなんて存在しないの何故ならリンクする必要がないから
読点の多すぎる文章も馬鹿丸出しだけど、句読点の全くない文章も間抜けに見えるな。
C++ではその辺を教訓に、staticはやめて無名namespace にするようにって言ってるね。 Cなら仕組み的には1つ、意味的には2つあるってのを ちゃんと理解しないといけないのが入門的には難しい気がする。
namespace を使って役割を整理するのは構わないが、 従来のC言語の仕様でも困るほどのことはない。 困るというのは単にプログラマとして未熟なだけだよ。
こんなところかな。 someFunc() { Type val; // ローカル変数 static Type val; // ローカル静的変数 } Type val; // グローバル変数 static Type val; // ファイルスコープ静的変数 extern Type val; // 外部のグローバル変数(定義ではexternは無意味) Type func(...); // グローバル関数(宣言においては外部リンケージ) static Type func(...); // 静的関数 extern Type func(...); // 外部のグローバル関数(定義ではexternは無意味) んでもって、ややこしいのは関数外で無修飾で外部リンケージを持つ点だから、 無修飾ではファイルスコープしか持たないことにして 外部リンケージを持たせるためのglobalみたいなキーワードを用意したとする。 関数内変数は同じことだから省略して、 Type val; // ファイルスコープ変数 static Type val; // 静的なファイルスコープ変数(前者との区別はどうしようw) global Type val; // 外部リンケージを持つ所謂グローバル変数 global static Type val; // グローバルで静的な変数(これも意味がよく判らんw) 結局のところ、「静的」とは何かが巧く定義できてないのが諸悪の根源かw
>>720 グローバルスコープにあるオブジェクトは無条件で静的領域に確保されるよ
>>721 それだったら話は簡単だ。
staticは関数内部用に限定して、関数外部用にlocalというキーワードに置き換え。
現在省略している外部リンケージ用にglobalというキーワードを追加。
折りを見てlocalを省略化に。
これで世の中平和になるw
>>722 うん
だからC言語の設計時にそうしてればね、って話よ
>>720 extern のことを書くなよ。今の仕様で語っても無意味。
けど無意味化された理由ぐらい考えろよ。そんなんで色々考えても無駄。
>んでもって、ややこしいのは関数外で無修飾で外部リンケージを持つ点だから、
これは当然のこと。何の問題もない。
>無修飾ではファイルスコープしか持たないことにして
こんなふざけた仕様はありえない。
>>722 酷過ぎる、、、昔の extern の方がよほどマシだわ
static Type val; // ファイルスコープ静的変数 static Type func(...); // 静的関数 これらをいちいち静的と呼ぶ必要あんのか? 動的なのがあるというなら区別する価値はあるが。
>>726 ない
autoの局所変数以外(関数、大域/static変数、定数)は無条件で静的
つーかそもそもメモリモデルとスコープは別物
だよな!
>>727 その別物の要素をstaticという1つのキーワードで扱ってるから混乱を招く
>>729 どう混乱してるんだ?
グローバルな時点で、静的か動的かを意識する必要はないんだから、それでいいだろ。
それともグローバルな動的変数が必要ってことか?
余計に意味がわかんねーよ。
今の仕様が良くないというだけじゃなくて、 具体的にどう変えれば良いかを提示すればいいのに
ポインタとして宣言するときのアスタリスクと、 それをデリファレンスするときのアスタリスクに、 入門当時の俺は混乱させられた。 別の役割をひとつの記号が担ってる、 の思考に行き着くまで時間がかかった。 今では宣言時の type *p を、*pがtypeとなる、 の案も受け入れられる。
>>731 頭わりーなさっきから言ってんだろw
どうして内部リンケージと静的局所変数を同じstaticという単語で修飾するんだよ?
理由を言ってみろよ
仕様策定にかかわりたいのか 別の言語がいいよって言いたいのか
>>734 それで事足りるからだろ。
それで足りない事例があるのか?
どっちが頭悪いんだか。
別の単語の方がよかったけど、同じであってもちゃんと区別つくし困らないだろ
そもそも extern があるのに、更に global とか余計にややこしくなるわ
>>736 予想通りだが全く理由になってないw
同じ言葉を使う合理的な理由を説明しろよ
>>737 そう
誰が考えても違う意味なら違う言葉を使うのが合理的と考える
それを怠った故に誤解を生じたのはこのスレが証明している
現に区別の付いてないヤツがちらほら見受けられる
>>740 > それを怠った故に誤解を生じたのはこのスレが証明している
C++になって無名namespaceが出てきたってこともあるな。
# マ板でおじゃばさまってコテがこの件で失態晒してたなw
>>740 >予想通りだが全く理由になってないw
>同じ言葉を使う合理的な理由を説明しろよ
は?
static の効用はキーワードは有りと無しで変わる。
その効用が必要であれば付けるし、必要なければ付けない。
それで困ることがあったけではない。
→困る事例を挙げてない
それを二つの機能したいという発想だろ。
二つのキーワードってことは4通りになるってことだよ。
その仕様の説明もなしに、そっちが良いとかいう方がおかしい。
→具体的な仕様は出せない
妄想と言われてもしかたないね
>>742 更にexternの有り無しも組み合わせて示してほしいな。
それをやろうとすればそれが愚かなことだと気付く。
>>742 その効用が場所によって変わるから現に初心者が混乱してるっつってんだろーが
いい加減にしろよお前日本語読めないのか?
それと最初に言ったけどこれは「今さら」な話だ
オレが今困ってるわけじゃないしどうこうしようとも思ってない
ただお前のような輩が理由無くC言語の孕む問題点を擁護するのが気に食わん
完全無欠な言語じゃないんだから問題点を挙げておくのは初心者のためになるだろう
使い方によって2種類の意味があるから初心者は気をつけましょう、で済む話なのに なんでそんなに熱くなってんだよw
>>744 だから、どう変えるかも示さないで、そっちの方が良いとか言うのがおかしい、
と言ってるんだよ?混乱がなくなるというのは君の妄想だろ。
初心者はポインタで混乱するから、ポインタなんかなくせっていうのと大してかわらんよ。
>>745 お前は同じ言葉を使った理由を説明できるのか?
>>746 「そっちの方」ってなんだよw
オレはただ現状の曖昧な点を挙げてるだけだっつーのに
staticなくせなんて一言も言ってないし
お前が勝手に代替案求めてるだけじゃねーか
まあとりあえず代替案は
>>722 ということでいいよ
まず
>>722 の問題点を挙げろ
予約語増やしたくなかったんじゃね
だな。
それはつまり設計を怠ったということだな
>>745 まず変数に対しても関数に対しても
staticの指定は「こいつの存在をリンカに知らせない」という意味があって
さらに変数の場合は、静的生存期間を持つ、という整理が必要かと
変数の可視性と生存期間は明らかに別概念ではあるんだが、
その辺の指定を柔軟に操作できる言語はほとんど無い
たぶん実装上の都合もあろうし、実用上は特に誰も嬉しくないんだろう
まだ静的生存期間とか言ってるし
>>748 C発明当時(1970年代前半)の処理系に与える影響が
どの程度のものなのかは興味がある
字句解析器の負担が大きくなるのかなあ?
ちゅーか当時のコンピュータ事情がまるで想像できない
DFAやNFAは発明されていたけど、KMP法やBM法が無いってさ……
無いってさ……
ふむ
>>747 >staticは関数内部用に限定して、関数外部用にlocalというキーワードに置き換え。
>現在省略している外部リンケージ用にglobalというキーワードを追加。
>折りを見てlocalを省略化に。
>これで世の中平和になるw
関数宣言で修飾子がついてないときに、現状の static が付いた状態に仕様変更するということだね。
それで global は必要に応じて付けろってことか。
C言語においては、関数や変数は隠蔽しない限り公開が原則なんだよ。言語思想。
それを変えるという話だから、もはやキーワードの問題じゃないだろ。
これで混乱が解消されるというなら、それは思想の問題だよ。
次に、関数の外で、変数を定義したときにはどうすんだよ?
global と static の有り無しで4通りあるだろ。
global な変数の初期化はどうすんの?
関数もプロトタイプ宣言はどうすんの?
おれは extern をどうするつもりなのかを聞きたいw 現状でも extern は省略できるだけで、その機能自体は生きてる。 この辺を理解しているのか非常に怪しい。
関数の外での変数宣言だが int a; と static int a; ではスコープ以外にも違いがある。 前者は extern int a; という意味で、変数の実体の宣言ではない。 どこかで定義されている変数を使用しますということで、 関数のプロトタイプ宣言と同じ。 仮に int a = 3; と書けばその時点で実体の定義が行われたことになる。 後者は常に変数の実体定義。= 以降があってもなくても同じ。 従って static とは別に global や local のキーワードが必要というなら、 上記の違いを示す為の新たなキーワードを用意してそれと併用する必要がでてくる。 global や local はスコープの制御だというんだからね。 extern は関数宣言に対しては機能が一致しないので、 static が駄目だと言うんだから駄目ということになるだろうし。
単に省略されてるだけということに気付けよ。 int a; static int b; func(){ static int c; // b をスコープ限定しただけ。根本的には同じ。 auto int d; int e; // d の省略であり、結果として表記は a と同じだが根本的に違う。 extern int f; } 書く位置はスコープの問題でしかなく、 static の意味が変わるわけではない。
global,localなんてただの思いつきなのに、 そんな真面目に反論されても困るわ。 論理的な人は周りから嫌われるから気をつけた方がいいよw
>>760 自分はこうしたい、という仕様を書いてるの?
>>763 混乱の回避を目的として、
global とか local を導入するのが愚かな発想というこということでしょうね。
ようするにglobalやlocalキーワード新設しても、 staticやexternを組み合わせて使わないといけないということ? externとか意味分かんないし、よけいややこしくなるよ。初心者的には絶対そうだよ。
つーかグローバルスコープでstaticって必要なの? どんなときに使うわけ? extern int hoge; で定義しといて1つだけ宣言で int hoge = 123; とどう違うの?
クマー
>>767 static付けるとそのソース内でしか参照出来ない。
無しだと、他のソースでも参照出来る、
んで他のソースでextern付けて参照する。
基本的に省略時が常に最小のスコープということなら、 //main.c extern global void hoge(); //グローバル global int aaa; //グローバル int bbb; //ファイル int main(void) //ファイル { int bbb = 456; int ccc; //ローカル static int ddd; //ローカル hoge(); return 0; } //sub.c extern global int aaa; //グローバル void fuga(void) //ファイル { } global void hoge(void) //グローバル { aaa = 123; fuga(void); } みたいになるが、別に問題ないんじゃね? むしろ表に出すものがglobalで明示されるからセキュリティは向上するね。
グローバルスコープでstatic int aaa;としたときに、 1. スコープがファイルに制限される 2. 初期値の有無を問わずプログラム開始時に領域が確保される ということだけど、とりあえず1.はおいといて、 2.の目的のみでstatic付けることってあるの?どんなケース?
ん?、グローバルスコープは静的ちゃうんけ?
>>760 記憶違いなら悪いが、既定がexternなだけで、
省略したらexternな訳じゃ無かったと思う。
関数の外での宣言は、初期値無かったら = 0と同じ
イイナハシダナー(;∀; ).
776 :
773 :2010/09/13(月) 17:38:32
すまん。
確認して来たら、
>>773 は大嘘だった。
何かもっとヘンテコリンな謎仕様だった。
現行で問題ねーんだよ。 変と言ってる奴は、ソイツの読み方が変なんだよ。 読み方が変なままで通したいなら C++ に行けばいい。 あれはその変な奴らが寄り集まって考えた書式だからな。
extern は、実体はよそにあるからそれを使え! っていう指定だな
extern void func(void); static void func(void);
>>770 #define global
#define extern
の2行を先頭に加えれば、おまえさんの望みどおりの動作になるぜwww
例えが悪すぎんだよ
>むしろ表に出すものがglobalで明示されるからセキュリティは向上するね。
発想が、アホすぎるw
return 0;
つまり 現行で問題があるという奴は、そもそも現行の仕様すら理解できてない。 それに尽きる
>>776 ここで言われているような global や local を導入したら、
もっとヘンテコリンな仕様になるぞ
>>767 プログラムを複数のcソースで記述するときに効いてきます。
>>782 確かに現行の仕様で困ることはないですからね。
まぁ現状を理解する能力のない奴が改良案だしてもアレってことだな
static int val; // private int val; // public static void func(void); // private extern void func(void); // public
788 :
デフォルトの名無しさん :2010/09/13(月) 18:47:47
C言語の static を曖昧とか言ったら C++ のクラス内 static なんてどうすんだ あれにはローカルスコープなんて意味は無いし、静的って意味でも少し違うよな
だから C++ はもともとおかしいんだってば。
>>788 >静的って意味でも少し違うよな
元の言葉の意味で考えるからおかしくなるだけだろ。
こんなこと言い出したら、キーワードの多くが元の英単語の意味からは逸脱してるわ。
static は言語で採用されたキーワードなんだから、
その意味はその言語で規定された物で十分なんだよ。
>>787 プロタイプをstaticにする意味がわからん
えっ
>>791 現状のCだとプロタイプの場合は extern 、static ともに何の意味ないね。
昔のCだと extern には意味があった。static にはなかった。
その前はプロトタイプ宣言自体ができなかったw
>>787 これ何が言いたのか全くわからん。
多分なんか勘違いしてるんだろうけど。
=== a.h === static void func_a(void); //extern void func_a(void); === a.c === #include "a.h" static void func_a(void) { } /* extern void func_a(void) { } */ === main.c === #include "a.h" int main(void) { func_a(); return 0; }
>>795 >=== a.h ===
>static void func_a(void);
プロトタイプを static にする意味がわからん。
関数は全部publicにするの?
>>796 何が言いたいかわからんのに答えようがない
とりあえず extern は他所で定義されているという意味で、
public / private とは意味が違う。
他所というの同一ファイル内である場合もある。
つまり static で宣言された変数も extern により参照できる。
他所というの同一ファイル内である場合もある。 →他所というのは同一ファイル内である場合もある。
=== a.h === extern int val; === a.c === static int val = 100; === main.c === #include "a.h" int main(void) { printf("%d\n", val); return 0; } >つまり static で宣言された変数も extern により参照できる
>>797 プロトタイプと実体は揃えた方がwarningが正しく機能するのでは?
static や extern を global/local、public/private という概念で理解しようするのが間違い。 違う物なんだから、単純に置き換えれるわけがない。 どしても置き換えるのであれば、足りない部分を表現する別の概念(キーワード)も用意して、 それと組み合わせることが必要になるんだよ。 static は sitaic だし、extern は extern であって、全然違う概念。 他の概念に置き換える前に、現状の static や extern を理解すればいいのに。
static / extern を理解してないのはお前だろw
>>795 が実行できると思ってんの?
>>801 何が言いたのかわからんのよ。それでエラーになるって言いたいの?
「同一ファイル」と書いてあるでしょ。例えば、
=== main.c ===
extern int val;
int main(void)
{
printf("%d\n", val);
return 0;
}
static int val = 100
という書き方は正規なの。もちろん最初の extern を外せばエラーになるよ。
extern とはそういう意味。この部分を勘違いしてる人が多いんだよ。
は?
>>804 誰へのレスかわからんが、当然ビルドエラーでしょ。
>>806 extern は private な変数に対しても使えるってことだよ
extern == public というおかしな考えは通用しないという実例
>>805 extern int val;の記述に何の意味があるの
>>809 後方で宣言されているから、それより前で参照する場合は extern 宣言する必要がある。
この場合 extern を付けないとエラーになる。
でっていう
俺も、でっていう
extern は実体の定義が他所でされている物を、仮に宣言して使用する為の宣言。 スコープが変化することはない。 スコープに影響を与えるのは static 宣言の機能であり、 static 宣言されるとそのファイル内に制限される。 (もちろん他の機能もある) extern と static は別の概念だから、global/local のように対になるものでないし、 そもそも extern や static を global/local という概念で考えようとするのが無意味。 このスレで global/local、public/private を持ち出した奴はこの辺のことが理解できていない。
static void func(void); // private extern void func(void); // public
そもそも
>>787 にはextern int valとは書かれてない
>>813 せっかくだから俺も揚げ足を取ると
extern int X = 10;
のように定義と宣言をまとめて行えるよね?
exern付いてるよね?他所じゃないよね?
この使えない豆知識の披露宴はどこまで続くのかな。
だんだん実の有る展開になってきてwktk。
>>814 の迷走っぷりが少しだけ心配。
変数についてはexternが付くとpublicになるなんて誰も言ってないんだが
820 :
デフォルトの名無しさん :2010/09/13(月) 20:48:13
externとstaticなんかで盛り上がれるなんてこのスレ、スゲーなw やっぱり知識の限界ギリギリの会話してるとアドレナリンが出るんだろうなww
変数についてはexternが付くとpublicになるなんて誰も言ってないんだが
個人的にこんな風におもってます。まちがってたらごめんなさいです(^_^/
cソースファイルの中で、一番外側の場所で変数を作ると、大域変数って言って、どこからでも読み書きできる変数になると思ってます。 個人的に。
#include <stdio.h>
char a = 'A';
void main() { putchar(a); }
a は、このcソースファイルのどこからでも読み書きできてべんり。
ほかのcソースファイルからも a を読めるよ。その時は、
「aは他のソースファイルで作ってあるよ」ってのをコンパイラに伝えるために、a を読み書きしたいcソースファイルの中に extern char a; って
書けば、ほかのcソースファイルからも a を読み書きできるようになるみたい。 よくヘッダーファイルにこれをまとめて書いてるの見かけるよね。 extern ... っていっぱい。
でも、もしも a がもともと、 static char a = 'A'; って風に static として宣言されてたら、
「この a は、ここのcソースファイルでは大域変数として使いたい〜〜 でも、他のcソースファイルからは読めないようにしたい〜〜」って意味で書いてます。ボクの場合。
これなら、たとえ、他のcソースファイルに extern char a; とか書いても、他のソースファイルからは a を読めないと思うんです〜〜。 たぶん。
>>805 の場合は、変に難しくしないで素直に
static int val = 100;
void main() { printf("%d\n", val); }
って最初に作るようにすればいいんじゃないかなぁ〜…って個人的におもいました。 なま言ってごめんなさい(^_^/ぺこり
ソースファイル中での大域変数の、有効範囲を、細かく調整しないと上手く動かないのであれば、それは、たぶん、根本的に、モジュール分けとかの設計に問題があるような気が〜〜(・_;ぐすん
823 :
デフォルトの名無しさん :2010/09/13(月) 21:04:27
>>793 >昔のCだと extern には意味があった。static にはなかった。
extern が省略不可だったのか?なんか記憶にないけど
>>816 >extern int X = 10;
それできたっけ?複数のソースで異なる値が代入されたらどうなるんだ?
昨日ちょっとコメントしたら、異常な盛り上がりでびっくり。 しかし、なんでここまで盛り上がっておきながら、K&Rが出てこないのだろう。 K&R付録A 参照マニュアルの該当箇所をあげておく。規格書持っている人はよろしく。 A8.1 略 static指定子は宣言されたオブジェクトに静的な記憶クラスを与えるためのもので、 関数の内側でも外側でも使ってよい。関数の中では、この指定子でメモリが割り当てられ、 定義の役目が果たされる。外側についてはA11.2 でA11.2をみると 略 識別子に対する最初の外部宣言は、static指定子が使われていれば内部リンケージを、 そうでなければ外部リンケージをその識別子に与える。
さっき見たばかりなのにかなり忘れたが。 関数の外部で定義でない変数の宣言において。 staticが指定された場合、内部結合。 externが指定された場合、それ以前に、可視である同一の識別子が、 内部結合として宣言されている場合、内部結合。 そうでないなら外部結合。 どちらも指定されない場合、外部結合だったか無結合だったか忘れた。 関数の宣言において。 指定されない場合はexternと同様。 他については変数宣言と同様。 変数の外部定義において。 細かいこたぁ忘れた。 externが指定された場合、外部結合だったような。 関数の定義は、もう見てねーよ!! で外部結合と内部結合がカチあったら未定義。 長すぎた。
つまり /* OKで内部結合 */ static int i; extern int i; /* NG */ extern int i; static int i; /* NG */ static int i; int i; /* NG */ static int i; extern int i = 0; のはずだが自信無い。 フォローよろしく。 PC起動んのめんどい。
>>682 >>684 今までこの視点は無かったけど、そういう見方をすれば、確かに矛盾してないね。
そっか、外部宣言が基本で、スコープを区切っているだけか。
ローカル変数を静的変数にするために、staticをつけると思ってたよ。
K&Rの書き方もそうだったし。
何で今まで気がつかなかったんだろう。
気持悪がられるけど 自動変数だってスコープ割って制限しちゃうこともできるしね void foo() { int a, b; { int i,j; /* この中だけ i,j を使う */ /*.....*/ } { int c,d; /* この中だけ c,d を使う */ /*.....*/ } } 意味があるなら関数化で小分けしちゃうけど、意味の切りわけが見つからない時は 迷ってしまうわ (小分けの関数名付けにも…)
>>823 宣言と定義を同時にしてるだけだぞ?
自ずと分かるだろ?
多重定義で怒られるに決まってんだろ
>>829 if () や for() , do などのブロックが来て当然の部位では当たり前の事象
(とういうか、それすら禁じられると辛い
そういう文にからまず
唐突に1段スコープを深くして変数宣言から という例は気味悪がられるね (俺の周囲の話
832 :
デフォルトの名無しさん :2010/09/13(月) 21:37:03
気味悪がる理由も筋がとおってればいいんだけど 100% 純粋にただの拒否反応だからな
for (int i=0; i<n; i++) { printf("%d ",i); } これだけはキモすぎて許せない。マジキモすぎる。
for(int i=0;i<10;++i) for(int j=0;j<10;++j) if(i==0) { printf("100\n"); } これもやめて
835 :
デフォルトの名無しさん :2010/09/13(月) 21:40:35
>>833 をつついても「キモすぎて許せない」と言うほどの理由は出てこない予感。
たいした理由もねぇのにうだうだ言う奴。
ここまで、誰も C Common の話をしていないのはどういうわけだ? === a.c === int a; === b.c === int a; は、両方を extern int a; にするのとも違うし、 両方を int a = 0; にするのとも違う。(どちらもリンク時にエラー)
両方extern intにしたら実体が無いし、 両方intなら名前が被る
どっちも外部結合だから、リンカが1つにして終わり。 だと思うんだが、C Commonてなんぞ?
>>824 K&Rに「staticは複数の機能があるよ」って書いてあるじゃん
どう読んだら関数内部と外部で同じ機能に見えるんだ?
>>837 個人的には、それを避けるために、基本的に大域変数や関数はstaticで宣言するようにしてます。
それの良い解決方法になる記法があるならぜひ知りたいです。
>>824 ソースファイルの一番外側で変数を作ると、大域変数ってのになって、どこからでも読み書きできます。
これは、どこからでも読み書きできるってことは、ずっと生きてるってことだと思います。
関数の中のstatic 変数は、関数が終わって、もう一回関数呼んだときも、前の状態を保持してて、これは、ずっと生きてたってことだと思います。
どっちも、ずっと生きてるけど、関数の中でstatic int aとしたら、それは関数以下でしか読めなくて、一方、関数の外でstatic int aとしたら、それは外以下でしか読めなくて、
けっきょく、どちらも、読める権限の位置が違うだけで、ずっと生きてる点では同じなので、似てるように見える、同じに見える、って意味での”同じ”って言ってるんだろうなぁ〜・・・って思いました。レスよんで。ボクは。個人的に。
もしちがってたらごめんなさい(ぺこり
843 :
842 :2010/09/13(月) 22:17:51
>>836 括弧の外に書いてんのに何故かスコープが括弧の中。
>>835 {int i;
for (i=0; i<n; i++) {
printf("%d ",i);
}}
while の()の中でも変数宣言できたらよかったのに。
>>840 読解力が足りてねえな。
もっと熟読してみろよ。
int ch; while ((ch = getchar()) != EOF) { } とか、ループの中でしかchを使わなかったら、スコープを中だけに限定したい。
VC++6.0 だとちゃんと外に出てるよな。
括弧の外に書いてんのに?? スレ違い? Cも最近の規格じゃ書けるのか? C++でもfor() {}とwhile() {}の時しか書けないんじゃねえの? カッコの中で変数宣言できる例なんてあるか?
えっ
関数のときのカッコはどうなんだよ。 あれの仮引数のスコープはどうすべきなんだよ。
例外のある言語で、tryの中で使ってたリソースをcatchとかfinallyで、 後始末をしたいときに、変数をtryの外に出さなきゃならないのも なんかとかならんのかね。 あのたりはスコープ共通でいいんじゃね?
854 :
デフォルトの名無しさん :2010/09/13(月) 23:51:08
>>830 extern int a;
は実態の宣言ではなくリンクみたいなもんだろ
そこに代入できたっけ?って話だ
extern int a = 10;
が可能なら、別ソースで
extern int a = 11;
って書いても多重定義にはならないだろ、実態は別に一個あるだけなんだから
そも、代入じゃなく初期化だろ。
extern使ったことない。 利点あるの?
使う理由は利点じゃなくて必要性だと思うんだ 無いね
858 :
デフォルトの名無しさん :2010/09/14(火) 00:09:33
>>855 たいして変わんないだろ 代入 ⊃ 初期化
>>856 複数のソースからプログラムを生成する時にグローバル変数が必要なら必須だ
グローバル変数を使わないなら必要ないけど、仕事でグローバル変数を使わないのは見た事無いな
みんながグローバル変数を直接参照してるの?
定数を代入しかできなくね? > 初期化
カプセル化(笑)
別ファイルで定義されているint aを使うときは extern int a; としないと、aがないぽってエラー・警告でるの?
864 :
デフォルトの名無しさん :2010/09/14(火) 00:28:51
>>859 定数みたいなモンは普通にグローバルで使うよ
構造体にまとめたりはするけどインスタンスはグローバルである事が多いな
main() で定義/生成してポインタを引きずり回せば使わなくても良いんだけど、
ほとんどの関数に引数が1つ増えるのは嫌だからね
865 :
デフォルトの名無しさん :2010/09/14(火) 00:31:05
行儀のいいコード書きたきゃJavaでも使ってろ
Cでも行儀のいいコード書けよアホ
5流は黙ってろ
ちゃんと整理されたグローバル・オブジェクトを使用する事は行儀の悪いコードではないよ 現場を知らない奴はグローバル=悪みたいに考えがちだけど
何かごたごたがあったみたいだから、蒸し返す。
>>751 > まず変数に対しても関数に対しても
> staticの指定は「こいつの存在をリンカに知らせない」という意味があって
リンカは static 変数/関数の存在を知ってるよ。
実装の一例だけど、プログラムの実行時 static 変数は BSS に配置しなきゃいけないし、
static 関数は実行可能領域に配置しなきゃいけない。
それを行うのが OS で、それを指示するのがコンパイラ、それを伝えるのがリンカ。
だから、リンカは static 変数/関数の存在を知っていなければいけない。
ついでに関数内 static 変数だけど、これも BSS に配置しなきゃいけないので、リンカ
はこれを処理して OS に伝える。
つまり、関数内 static 変数はグローバル static 変数同様、内部リンケージを持つ。
まとめると、static の付いた変数は、そのスコープにかかわらず内部リンケージを持ち、
かつ BSS に配置される (静的変数となる)。
「かつ」 の前後で区切るなら 「static の意味は 2 種類ある」 と言えなくもないけど、書く
場所によって意味が変わる、という事は無い。
まあ実際のところ、内部リンケージって言うけど、実はユニークになるであろう複雑な
リンケージ名がコンパイラによって割り当てるだけで、リンカにとっては外部リンケージ
と内部リンケージの差はない。
> 関数内 static 変数は(略)、内部リンケージを持つ。 無リンケージだよ。
871 :
デフォルトの名無しさん :2010/09/14(火) 07:27:27
Cの仕様に不満があるなら、マクロなりプリプロセッサなりを駆使して自分なりに納得のいくものにすればいいじゃん^^
873 :
デフォルトの名無しさん :2010/09/14(火) 09:10:51
何その、自国の法律に不満があるなら政治家になって独裁でも良いから 自分にとって都合の良いものに変えてしまえ、みたいなモノポリーかっけぇ〜
>>873 なければ作る
それだけのこと
どうやったら政治家が出てくるの?
875 :
デフォルトの名無しさん :2010/09/14(火) 12:19:48
876 :
デフォルトの名無しさん :2010/09/14(火) 12:21:11
Photoshopやillustratorって何の言語で開発されているのでしゅか
878 :
デフォルトの名無しさん :2010/09/14(火) 12:41:57
#! /usr/bin/misa ごっ、ごぉおっ、ご〜きげんよおぉおおぉおほっ。ほおぉおぉおっ。 「ごきげん☆みゃぁああ”あ”ぁ”ぁああ〜っ」 さわやかな朝の☆ご挨拶! お挨拶がっ。 澄みきった青空にこだましちゃうぉ〜ああぉおおおぉん。 「は、はひっ、はろおぉっ☆わぁるどおおぉっぉ〜っ」 こ、この文章は☆おサンプル! おおぉおぉおおサンプルプログラム!! どんなおプログラム言語でも基本のご挨拶させていただくのぉぉおッ! 「ぽうっ」 長々と書くのがこ、ここでの〜、ここでのぉおおぉおぉぉおたしなみぃぃいぃ。 「長いぃ。長すぎましゅう。ご挨拶にこんなプログラム長すぎまひゅぅうぅ☆ んおおぉぉ、ばかになる、おばかになっちゃいましゅ〜ッ」 長いのがっ、バッファの奥まで入ってきましゅたぁあぁあっ! ばっふぁ☆溢れちゃいまひゅぅ〜。あみゃぁあ”あ”ぁ”ぁああ”あ”ぁぁ。 「で、出ます☆ んおおぉぉおおっ、エラー出ちゃいまひゅっ」 ほひぃ☆! え、えらーっ、んお”お”ぉお”お”ぉおぉおおぉっっ。 「出た☆ 出た出た出た出たぁぁあっ えらあぴゅるーっって出たあぁっ」 はしたない☆! ぉおおぉはしたないっ! おはしたない言語ですっっっっっっっ! おほっほおぉっっっほおぉっっっっっっっっっ
return 1;
このスレは
>>869 みたいな知ったか大嘘つきが多いんですか?
煽りのほうがずっと多いけど
unsigned int x = (大きなint)*(大きなint); って書いてオーバーフローしそうな場合 ・intで掛け算してからunsigned intにキャスト ・unsigned intにキャストしてから掛け算 ・決まってない どれが正しいんでしょうか?
> ・intで掛け算してからunsigned intにキャスト > ・unsigned intにキャストしてから掛け算 符号無しにしたところでたかだか2倍なんで、 オーバーフローするって問題はどっちも持ってる。 思い付いた力業w for (i = 0; i < a; ++i) { assert((int)pow(2, sizeof(unsigned int) * 8) - sum >= b); sum += b; }
884 :
デフォルトの名無しさん :2010/09/14(火) 16:06:02
int構文がPHP言語からしか引用でき無いのですがどうしたら良いですか?
>>882 1. スケーリングできないかを考える (例えば1,000,000,000は1000Mもしくは1Gと表現可能)
2. long long intを使う (ただしC99以降もしくは処理系独自拡張)
3. BCDに整形する
>>882 どっちもダメ、浮動小数点か long long でも使え
>>883 (int)pow(2, sizeof(unsigned int) * 8) は 0 になるんじゃないの?
static int func(void) この識別子funcがリンカによって無視される仕様は規格書のどこに記載? 別のモジュールがfunc(void)をstatic指定無しで定義していた 場合リンク可能になる?(としたらこれも規格書準拠の仕様?)
888 :
883 :2010/09/14(火) 16:43:42
ごめん、こうね (unsigned int)pow(2, sizeof(unsigned int) * 8 - 1)
889 :
883 :2010/09/14(火) 16:44:42
ちげえ・・・ (unsigned int)pow(2, sizeof(unsigned int) * 8) - 1 です
890 :
883 :2010/09/14(火) 16:50:10
さらにちげえ (unsigned int)(pow(2, sizeof(unsigned int) * 8) - 1)
fuck()
#include <stdio.h> void fuck(void); int main(){ fuck(); return 0; } void fuck(){ while(1){ printf("FUCK!\n"); } }
普通無限ループにはスリープを入れるものだろう
つーか無限ループなんて使うなよ 以前引き継いだ前任者のコードで無限ループが使われてて アラートが無限に鳴り響いてオペレータ連中にさんざん文句言われたよ 前任者の低脳ぶりに生まれて初めて殺意を抱いた
895 :
デフォルトの名無しさん :2010/09/14(火) 17:59:41
それは無限かどうかって問題じゃないね 有限でもブラクラみたいなメッセージボックスに殺意を覚えることはよくあるし
確実に抜けるようになってれば無限ループは別に良いと思うけど
897 :
デフォルトの名無しさん :2010/09/14(火) 18:09:26
>>874 >Cの仕様に不満があるなら、
仕様や基本構造まで作り変えたら、それがC言語と言えるものになるんだろうか?w
もはや言語の設計者。作れば良いって、その言語を使う以上その言語で
出来る範囲内、あるいはその仕様に基づいてってことだから、その国家で通用する
法律の範囲内で自由に活動するくらいしか出来ませんよ。
きみら甘いよ 無限じゃなければいずれ鳴り止むんだから深夜にタクシーで出社しなくても翌朝対処でよかった 想定内の分岐なら確実に抜けると思って作られていても外的要因の想定外のデータ不整合などには対処できない そもそも無限ループを使うのは明らかに確実に手抜きでしかない
>>892 void _3pu(void)
{
int i=0;
while (i<100000000) { i++; }
}
>>898 だからそれはループが無限か有限かって問題じゃない
>>898 それは無限ループが悪いんじゃなくて、
翌朝やればいいような内容でアラートを鳴らすのがわるいんじゃね
for(;;)やwhile(1)のことを無限ループと呼ぶんじゃないの
例えばJavaでもC++でも独自のライブラリは定義できるが その定義や中身(コードの記述、スタイルなど)はやはり その言語の仕様(ルール)に基づく。変数の定義など。 演算子といった共通して使えるものもあるが、ライブラリみたいな 各自で自由に作れるものは、別に違反していなければ 特別に法の番人に許可を得るような手続きは必要はない。 必要最低限のことに従えば良いんだし。 規定の範囲内なら自由に家を建てられるだろ?移動できるだろ? そういうことさ。
どこの誤爆だ?
906 :
デフォルトの名無しさん :2010/09/14(火) 18:57:44
>>887 別のモジュールが定義していたっていうのはプロトタイプ宣言の事?だったらリンク不可
>>898 サーバープログラムを無限ループ無しで書けるものなのか?
イベントドリブンも無限ループ無しで書く事は不可能だと思うんだが
>>900 無限ループが問題だったんだよ
何故ならオレは鳴り止まないアラートを止めに行ったんだからw
>>901 それは単なる結果論
正常時以外はアラートを出すのが運用
調べてみたらさっき書いたとおり外的要因だった
でもそれは1回アラート上げて終了すれば済む話
どっちが結果論なんだか
910 :
デフォルトの名無しさん :2010/09/14(火) 19:13:26
>>908 有限なら【いつ】鳴り止むはずだったんだ?
>>908 その運用なら正常以外は深夜出社するのも止むを得ないんじゃね
つーかおまえらマ板でやれようざいから
問題が起きたからアラート出たんだろ。 放置して済むようなものじゃなかったらどうする? 一回鳴っただけのアラートで、気付かれなかったらどうする?
>>910 修正後はエラー時は1回アラート上げて終了するようにしたよ
ようするに問題だったのはエラー内容じゃなくて、いらん所で無限ループ使ってたことだよ
915 :
デフォルトの名無しさん :2010/09/14(火) 19:38:47
無限ループ使ってたのが問題じゃなくて、 アラート後に終了しなかったのが問題なんじゃね?
アラート鳴らして人呼んで復旧できるのならいいが、 そうでもないなら黙ってエラーログ吐いてオチとけw
プログラム止める事くらい誰でもできると思うんだが、その程度の人材を常駐させられない運用に最大の問題が....
919 :
デフォルトの名無しさん :2010/09/14(火) 20:21:30
もはやループの問題ではなかろうと問うてみたが返事がないな
#include <stdio.h> #include <stdlib.h> void fuck(void); int main(){ fuck(); return 0; } void fuck(){ int i; FILE *log; for(i=0;i<100;i++){ printf("\aFUCK!\n"); log=fopen("log.txt","a"); fprintf(log,"FUCK!\n"); fclose(log); sleep(1); if(i==99){ i=0; } }
921 :
デフォルトの名無しさん :2010/09/14(火) 20:33:24
俺思うんだけどさ このスレってなんだかんだで勉強になるよね
>>918 問題なのは知識じゃなくて責任の所在だよ。
おまえには解らんのかも知れないがな。
コールバックって結局ポーリングなの? while(1) { if(...){ 関数ポインタに設定された関数を実行() } sleep(1); } こんな?
>>923 アプリケーションから見る限りは違う
OSからみればポーリングかも
925 :
デフォルトの名無しさん :2010/09/14(火) 20:51:50
>>922 オペレータキャンセルができるって前提に同意しないのはわかったよ
だがここで問うているのはそんなことではなく、ループがどうであるべきかだ
タクシーがどうとかみたいのはマ板でやってくれ
926 :
デフォルトの名無しさん :2010/09/14(火) 20:55:28
for (;;){ if (hoge) break; } こういうことするやつアホ過ぎるだろ。 結局は条件があるなら最初から入れとけよ。 while (!hoge){ } アホの書くコードは読みたくないわ。
>>927 コンピュータ好きで、そんなクソみたいなプログラミングする人いるの?
職業プログラマーにはアホみたいに沢山いるけど
>>928 たくさんいるんだよw
そしてそいつが知らないところで他人に迷惑かけてんだ
pythonにはdo-whileが無いからそんな感じだけど
while((???)|| (???)|| (???)|| (???)|| (???)){ if(???) break; } これなら見たことある。
breakの前後に処理がある場合にはループの途中で抜けるだろ
抜ける条件が複数ある場合for(;;)みたいにするけど for(;;){ 何かの処理 if(....) continue; else if(....){ break; } 何かの処理 if(....){ break; } }
ムリにwhile使うと小括弧の中が数十行に成る場合もあるからね
>>929 コンピュータ好きでもない奴がプログラマーになると、本当にすごいコードを書くよな
「まぁ〜これでいいんだ」とか言ってる時点で終わっている
>>933 関数に切り出してreturnでいいんじゃない?
お前ら普段どんなすごいソフト作ってるの?
941 :
937 :2010/09/14(火) 21:26:34
関数を作るほどもない小さな処理の場合933みたいなる char *の文字列操作だったり
>>939 2chでよく見かけるのは、「お前らが普段必ず使ってるはずのもの」とかいう曖昧な答えだな
943 :
941 :2010/09/14(火) 21:28:02
間違えた 941の名前が937になってる 941です
>>944 >>933 ==941==943ね
941の名前を間違えて937にしてしまった
だめぽorz
静的グローバル変数をNULL or 0で初期化することは、 バカな事ですか?
>>947 NULL とか 0 であることに意味があるなら初期化するべき
>>947 バカなやつが見ても文句を言われないようにする
>>939 おまえらが生きてるこの世界がそれだよ。
0になるのは保障されてるけど、 NULLになるかは保障されてなくね?
956 :
947 :2010/09/14(火) 22:00:06
>>948 ,
>>950 設定ファイルをどこに保存するかを、変数に入れておきたいのですが
静的グローバル変数をどうやったら、初期化できるのかわからないので
>>956 ローカル変数と同じじゃない?
char path[] = "…";
>>927 いやね。気がつくと
for(;;) [
ぐちゃぐちゃ
if (hoge) break;
むにゅむにゅ
}
と書いてしまうことが多々あって‥‥やっぱだめですかね?
ループ抜ける条件が複数あって逐次変化する場合はbreakで抜けていいだろ
break多用するやつはたいてい構造を整理できてない 理由としてはgoto多用するのと何ら変わらん
極論を吐く奴だな
breakで処理が複雑化して困ったことなんて無いんだけど
breakやcontinueがgotoと同じって理解してるやつのほうが分かってないよな。
968 :
デフォルトの名無しさん :2010/09/14(火) 22:52:53
>>967 おまえこそ、なぜ continue を例に挙げた?
969 :
960 :2010/09/14(火) 22:53:03
>>962 ループとして
while, do-while
が準備されていても、それらにあわせるように書くのがめんどくさくって、
for(;;) { むにゅむにゅ if () break; ぐちゃぐちゃ } と最近は書き下ろしてしまうんですよ。まずいな、とはおもいつつ。
たとえば、EOF。
EOF って一回よみこんでみないとわからない。
for (;;) {
f1.get(c)
if (f.eof())
break;
f2.put(c)
}
eof() を while や do-while でうまくつかえないものか?
>>968 breakとcontinueをgotoと同一視してるやつを何度となく見てるから。
971 :
デフォルトの名無しさん :2010/09/14(火) 22:54:54
>>970 おまえ自身がそこから continue は別問題と仕分けることはしなかった(できなかった)のだな?
いきなりどうでもいい部分を攻撃し出したぞこいつ。
>>971 なんで別問題なの?
どちらもgotoとはちがう制御をgotoと同一視してるって同じカテゴリだけど。
ループ処理で追跡が困難なバグに直面した経験がないので 別にbreakつかおうがなんでもよくね、趣味の問題だろ
break使ってダメな理由が思いつかない
>>969 構造体に関数ポインタが設定されてんだよな?!
試してないが、これでイケるはず。(間違ってたらすまね)
while (f1.get(c), !f.eof()) {
f2.put(c)
}
f1.get(c)がvoidじゃないなら、カンマ演算子じゃなくて
&&かとかでも出来るかもだがケースバイケース。
>>976 コピペしたら;がなかった・・・・orz
for(;/*ここや*/;/*ここ*/)が空やカウンタだけならいいけど外部に影響与える式入ってたらヤバいじゃん 分かってて使う筈だけど思考ブレーキ無しにbreakつかうお人も居るかも知れんし
それはbreakが問題なんじゃなくて ループ処理自体とそうじゃない処理をごっちゃごちゃにしてるのが問題
いや普通にforでいいんじゃね。 ぱっとみ格好悪いか? for(f1.get(c);!f.eof();f1.get(c)){ f2.put(c); } 最後の一文字の扱いが気になる。
古典的イディオムがあるだろ
パッと見の問題じゃねーよ
for(;;) { if (f1.eof()) break; f1.get(c); f2.put(c); } これじゃなぜいかん
>>976 この書き方、最近疑問におもうようになったんですよ。
while( ) の括弧の中を、カンマ演算子や論理積でつないでいくものです。
while() のなかに書ききれなかったらどうするのか?
while() のなかに押し込むくらいなら、
for(;;) { ぐちゃぐちゃ if() break; むにゅむにゅ }
の方が自然ではないのか?
最近は
if ((fp = fopen()) == NULL)
という書き方もあまりしないようですし。
一行に式をいくつも書くfor文自体が美しくない
>>880 嘘だと思うならそう思ってればいいよ。
>>869 は VC の実装に基づいた事実だから。
>>983 ファイルをオープンした直後は eof() の値は 0 である、という決め事に依存しているからですよ。
ファイルの読み込みや eof の問題ならまだしも、ハードウェアを叩いていると、
「何かの操作をしないと、状態がわからない」という場合にわりあいに頻繁に直面するんです。
そういったとき
for(;;) { ぐにゅぐにゅ if () break; むちゃむちゃ}
が便利、というか自然、というか、ああやっぱり疲れているんだなあ。
eof() が必要なのってノンリニアなアクセスする場合だけだろ。 そもそもレアケースだし。
>>980 f1.get(c) を二度かかないといけないのがいやじゃないですか?
f1.get(c) にあたる部分がボリュームのあるものだと、特に。
for (;;) {
f1.get(c)
if (f1.eof()) break;
f2.putc(c)
}
だったら、f1.get(c) (とかそれにあたる部分)を一度かくだけですむでしょう?
なぜ可読性落としてまでforの条件式に色々押しみたがるのか謎
例のコードがbreak云々以前にキモい件。Cの畑の書き方じゃないだろ。
>>990 おまえは本質的に問題がわかってないだろ。
forの中はカウンタかイテレータぐらいしか書かないぞ普通 アルゴリズムの部分に具体処理かくなんてなんか逆行しとる
findfirst, findnext みたいな形に作らないのが悪い。
あえて選ぶなら
>>976 を支持。
ただ、こんなザマになった時点で既に設計ミスだろ。
処理と条件をごっちゃにして良い事なんてなんもないし
>>995 設計ミスもなにも、単純な fstream でもこんなざまになってしまうのですから、世の中の大概のものはこんなパターンになってしまうのでは?
で、while() のなかにカンマ演算子で押し込むくらいなら(以下略)
f1.get(c) が EOF 返すようにすればいいだけじゃん。
いや、設計ミスだろ。 イテレータみたいな使い方したいんだったら、そういう抽象を提供しろ。 実装の詳細に依存したループ処理を書かせないようにしなきょ。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。