C言語なら俺に聞け(入門編)Part 68

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
C言語の*入門者*向け解説スレッドです。
★前スレ
C言語なら俺に聞け(入門編)Part 67
http://hibari.2ch.net/test/read.cgi/tech/1278759538/
★過去スレ
http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
★初心者、初級者の方は他の質問スレのほうが良いかもしれません。
例えば
【初心者歓迎】C/C++室 Ver.73【環境依存OK】
http://hibari.2ch.net/test/read.cgi/tech/1274395127/

とか
★教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 137代目
http://pc12.2ch.net/test/read.cgi/tech/1276810079/
★C++言語については避けてください。C++対応明記スレへどうぞ
★分からない事をなるべく詳しく書いて下さい。
★ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
2デフォルトの名無しさん:2010/08/23(月) 13:30:17
マクロの使い方が下手で真っ黒w
3デフォルトの名無しさん:2010/08/23(月) 13:31:38
で、結局swapはどうじっそうすればいいのかおしえてくだちぃ
4デフォルトの名無しさん:2010/08/23(月) 13:36:24
#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;
}
5デフォルトの名無しさん:2010/08/23(月) 13:52:34
type の部分には変数の型を適切に指定すること。
6デフォルトの名無しさん:2010/08/23(月) 14:12:55
#define GET_MY_TIME(buf,time,index) \
buf[0] = time[index*2];\
buf[1] = time[index*2+1];\
buf[2] = '\0';

この前処理の「\」は何を意味しているんでしょうか?
どなたかご助言お願いします。
7デフォルトの名無しさん:2010/08/23(月) 14:16:15
\(リターン)でリターン、つまり改行を無効にしてる
#defineマクロは改行までだから、複数行に分けて書くには\が行末に必要
8デフォルトの名無しさん:2010/08/23(月) 14:19:40
>>7

見やすくするために「¥」を使ってたんですね。
すばやいご助言どうもありがとうございました。
9デフォルトの名無しさん:2010/08/23(月) 15:50:44
>>3
#define swap(a, b) (a = a - b, b = a + b, a = b - a)

このくらい直ぐに思いついて欲しいけどね
10デフォルトの名無しさん:2010/08/23(月) 15:51:31
>>4
ださい
11デフォルトの名無しさん:2010/08/23(月) 16:01:13
たま
12デフォルトの名無しさん:2010/08/23(月) 16:02:55
>>10
でたよ、主観でしかものが言えない理解力の無いバカ
お前の顔の方がもっとダサいからw
そしてお前の書くコードは幼稚そのもの
他者批判しか出来ない奴ほど、実は大勢から批判される対象となるくらい
程度の低いバカ、なのは国会の野党を見ても分かることw
13デフォルトの名無しさん:2010/08/23(月) 16:02:57
>>9
xor技法と同じ臭いがする
14デフォルトの名無しさん:2010/08/23(月) 16:03:33
>>10
「何が」ダサいのか、答えてみ。コードの意味も理解できない池沼w
15デフォルトの名無しさん:2010/08/23(月) 16:04:31
>>10
稚拙な感想しか言えないんですね、自分の技能も証明できない癖に
他者を上から目線で評価する卑怯者ってwwwwww
16デフォルトの名無しさん:2010/08/23(月) 16:06:09
それだと&aでやるのと同じ破綻がおこるやん。
17デフォルトの名無しさん:2010/08/23(月) 16:06:15
>>10
別にあれが格好良いなんて思わないがお前がダサいと思った理由が分からん。
それじゃどんなスタイルが良いんだ???
どの道、コードなんて文字列の見た目じゃない、効率の良い手法、スタイルが重要。
お前みたいな見た目ばかりに気を取られて、内容が薄い冗長なコードこそ
無駄でダッセーからw
18デフォルトの名無しさん:2010/08/23(月) 16:07:17
自演乙
19デフォルトの名無しさん:2010/08/23(月) 16:07:36
>>12
主観?
マクロで型を引数として与えるなんて、まともなプログラマなら敬遠するよ。
>>9 の方が全然スマートじゃん。
それがわからないって、センス無さすぎだよ、君!
20デフォルトの名無しさん:2010/08/23(月) 16:09:59
>>10
ttp://www.bohyoh.com/CandCPP/FAQ/FAQ00008.html
ttp://www.bohyoh.com/index.html
そんなこと言えるお前は、誇れるよなカッコイイスタイルのコードが記述された
売れてる本を出版しているんだろうな?別にBohYohを賛美するつもりは無いが
匿名でこそこそ意見するお前みたいな屑が嫌いなだけ。実力も無い癖に
齧った程度の知識で偉そうにしやがって。プログラミングは
ファッションスタイルを審査する分野じゃねーの。効率の良い流れが重要。
それから纏まって見易い、他人が理解しやすいコードも。
21デフォルトの名無しさん:2010/08/23(月) 16:10:27
足し算引き算使える型じゃないと破綻するよね
22デフォルトの名無しさん:2010/08/23(月) 16:10:35
ついでに違うの参照しててもオーバーフローすることがあるからxorよりタチが悪い
23デフォルトの名無しさん:2010/08/23(月) 16:11:14
>>10 くせぇくせぇ、夏厨の香りがプンプンすんぜっw
鏡を見ろよ?お前の面の方が100万倍ダッセーし
コードも稚拙だろうからw
24デフォルトの名無しさん:2010/08/23(月) 16:11:40
>>9
オーバーフローの恐れがある
浮動小数点数型なら誤差評価もめんどい
同様の理由で乗除算を使う方法も却下
25デフォルトの名無しさん:2010/08/23(月) 16:12:44
>>10
マクロの意味も理解できない厨房必死だなw
で、どこがダサいの?お前の意見を言ってごらん。
どうせ言ったことに対して、相手に理解されなくて
自分こそが批判され孤立するのが怖いんだろ?w
所詮、原則匿名の無責任な発言を平気でする
2ちゃんねらーだもんな、お前もw
26本日の一番稚拙で最低な発言:2010/08/23(月) 16:14:15
10 名前:デフォルトの名無しさん 投稿日:2010/08/23(月) 15:51:31
>>4
ださい  < プッ

お前はマクロスでも見てろ、カッコイイロボットに乗っているよなw
27デフォルトの名無しさん:2010/08/23(月) 16:14:25
>>19
より問題が多い方選んどいてスマート云々センス云々
君ただの馬鹿じゃん
28デフォルトの名無しさん:2010/08/23(月) 16:16:03
>>10
お前はファッションチェックをするピーコかっ!?
コードはファッションじゃねーのw
お前の理解力のなさはおすぎもビックリだぜ。
もうレス番真っ赤w
29デフォルトの名無しさん:2010/08/23(月) 16:17:29
>>10 コードの意味も分からないガキは黙ってろよ。
別にお前が使わなくても良いから。変数ごとに逐一
入れ替え用の関数でも書いて、長ったらしいコードにしてろやw
30デフォルトの名無しさん:2010/08/23(月) 16:17:47
自演乙
31デフォルトの名無しさん:2010/08/23(月) 16:19:20
vcなんて捨ててtypeof使ってこいよ
32デフォルトの名無しさん:2010/08/23(月) 16:21:11
ttp://www.bohyoh.com/CandCPP/FAQ/FAQ00008.html
このマクロさえ使いこなせば、変数名や型が違っていても
共有できる利便性があるのに、それが理解できないとは・・・
もはやこいつには何を言っても無駄でしょうね。
態々、その時々でswap用の変数を宣言し、変数名ごとに
サブルーチンを記入したら?それこそマンドクセッしダッセ。
33デフォルトの名無しさん:2010/08/23(月) 16:24:32
>>10
ダサいと言うならお前が思うかっこいいスタイルで記述してよ?
お前が書いたものの方が冗長で効率も良く無くダサいだろうけどw
で、例のマクロの何がダサいんだよ?お前みたいなブサメンに
ダッセーとか言われたら、イケメソのBohYoh先生も報われないわ。
失礼だろがー。そこまで言うならまずお前が名乗れよ?
今後は、ダサいと言ったお前は必ずそれ以上のコードを書いて意見をすること。
それが出来ないで匿名で陰口叩くだけの雑魚は黙ってろよ。
34デフォルトの名無しさん:2010/08/23(月) 16:27:15
>>10
ここまで集中攻撃を受けているんだ、それをダサいと言った
お前がどんなコードを書くか示してくれないか?
もちろん、誰が見てもお前の方がカッコ(・∀・)イイんだろうな?
ダサかったらプゲラッチョしちゃうよ?
1度だけチャンスをやる。あれと同じかそれ以上に効率の良い動作をする
お前がダサくないと思うマクロを書いてみろ。
書かなかったらお前の負けなw
35デフォルトの名無しさん:2010/08/23(月) 16:28:53
>>10
どうしました?マクロでここまで叩かれて降参して
マグロになっちゃいましたか?ん?w
ダサいとかダサくないとかじゃないんだよ、コードの意味も
可搬性、汎用性も理解できない青二才の戯けが!
36デフォルトの名無しさん:2010/08/23(月) 16:34:12
>>33
>ダッセーとか言われたら、イケメソのBohYoh先生も報われないわ。

ださいに加えて、きもい
37デフォルトの名無しさん:2010/08/23(月) 16:36:27
あれだけ汎用性、可搬性に優れたコードをダサいとか言うなんて
理解力の無い物事を適切に判断できない、偏った価値観を持った
未熟者って言動からして幼稚だよな。だから余計な一言で
周りから批判、非難されて干されて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
39デフォルトの名無しさん:2010/08/23(月) 16:43:14
>>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 お前の幼稚なクソァーコードの方が邪道でダサいんだよ!
41デフォルトの名無しさん:2010/08/23(月) 16:49:58
>>10 あぁなんだ、お前がXORの入れ替えを書いた邪道者か?
ダサいのはむしろお前の方。
42デフォルトの名無しさん:2010/08/23(月) 16:50:08
>>39
いやまて、swapだぞ
なにを渡す気だよwwww
43デフォルトの名無しさん:2010/08/23(月) 16:51:42
>>10 さんが推奨する格好良いマクロ ( ´,_ゝ`) プププッ

#define swap(pa, pb) ( *(pa) ^= *(pb), *(pb) ^= *(pa), *(pa) ^= *(pb) )

↑を流行らせようとして失敗したんですね?分かりますw
44デフォルトの名無しさん:2010/08/23(月) 16:51:55
キチガイ怖すぎる
45デフォルトの名無しさん:2010/08/23(月) 16:52:36
>>42
杓子定規で内容考えずに教わった通りにやろうとしてる人、多いよねw
46デフォルトの名無しさん:2010/08/23(月) 16:52:38
>>20
さらに権威のある C FAQ では
http://www.kouno.jp/home/c_faq/c10.html#3
>一番の万能の解決方法は、マクロを使うことを考えないことだ。ただ し型を渡すために第三の引数を渡すのが面倒でないなら話は別だ。
47デフォルトの名無しさん:2010/08/23(月) 16:53:20
>>10 ねぇ〜 >>4 ってダサいよねぇ〜やっぱカッコイイマクロスは

#define swap(pa, pb) ( *(pa) ^= *(pb), *(pb) ^= *(pa), *(pa) ^= *(pb) )

ですよね。コード・覚えていますか?
48デフォルトの名無しさん:2010/08/23(月) 17:02:42
>>10さん、貴方がカッコイイと思うマクロを教えて ♥
49デフォルトの名無しさん:2010/08/23(月) 17:04:21
>>39
細かいこと言い始めると、
いろいろ破綻するケースが出てきちゃうので、その辺で妥協するしかないんじゃないかね
副作用が複数起こってる時点で、おそらく既に本来あるべき挙動ではない

型を得るtypeof的なものと、
衝突しない識別名を返す(Lispのgensym的な)ものがあれば
もうちょっと堅牢なswapマクロも書けるかも、とは思う

まあそういう小手先の話よりは、インライン関数があればねw
50デフォルトの名無しさん:2010/08/23(月) 17:12:37
型を渡すのがダサい理由の一つは、関数で実現するときとで記述が変わることだろうね。
51デフォルトの名無しさん:2010/08/23(月) 17:21:43
#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");
}
5251:2010/08/23(月) 17:23:13
うう〜…
だめだ〜… どうしても語尾に「のん」って付いちゃうバグが取れないのん… Σ(・_・アっ!!


文字列を入力してくださいのん。(100文字以内のん)
aiueokakikukeko
okekukikakoeuiaのん♪(^_^/


文字列を入力してくださいのん。(100文字以内のん)
あいうえおかきくけこ
こけくきかおえういあのん♪(^_^/


文字列を入力してくださいのん。(100文字以内のん)
☆まいんちゃん☆lovelove萌へぇ〜〜♪
♪〜〜ぇへ萌evolevol☆んゃちんいま☆のん♪(^_^/


ちなみにプラットフォームはウブンチュ10.04なのん… Σ(・_・アーーっ!! だからかっ!?
5351:2010/08/23(月) 17:29:09
あぁぁあぁああ;、自分で足してました〜ヾ(・・;)ォィォィ
自己解決しましたのん♪

おさがわせしたでござるのんのん(=⌒▽⌒=) ニャハハハ♪
54デフォルトの名無しさん:2010/08/23(月) 17:37:40
>>49
そうですね。
それにしても、たしかにインラインがあるといいのですけどね。C で問答無用にインラインにしてくれる処理系ありませんかね。
55デフォルトの名無しさん:2010/08/23(月) 17:37:57
可搬性、汎用性、簡略化について理解できないバカがダサいとか言うから悪い
お前の主観がこの世の全てに通じる訳でもないだろJK
56デフォルトの名無しさん:2010/08/23(月) 17:41:19
そろそろ #define を使うのはよしておいたほうがいい件について。
java にも c# にも #define はない。c++ でもお利口さんはつかわない。
57デフォルトの名無しさん:2010/08/23(月) 17:49:15
>>54
けど、今時ほとんどの環境で使えるわけだし、
使える環境なら使えばいいよ。
そういう環境でもマクロでごちょごちょするのは問題あるよ。

このスレに居るような望月を神だと思ってる人は
C++でもスワップが必要なら例のマクロ使うんだろうな。
指導しても有名な先生が書いてるとか言って聞かないんだよねw
58デフォルトの名無しさん:2010/08/23(月) 17:51:37
>>57
そして a[i] と a[j] の交換で i==j のケース発覚⇒はまりに陥る と
59デフォルトの名無しさん:2010/08/23(月) 17:52:55
>>57
defineマクロしか使えないことが一番ダサいw
60デフォルトの名無しさん:2010/08/23(月) 18:08:10
>>57
今調べてみると、C99 なら問答無用でインラインにしてくれるんですね。

それにしても、彼は、規格まで引用して説明したというのに、全然きかないんですよね。
61デフォルトの名無しさん:2010/08/23(月) 18:14:58
inline関数は展開してくれるかもしれないし、してくれないかもしれない
そんな存在だよ
62デフォルトの名無しさん:2010/08/23(月) 18:28:37
>>10は本当に愚かだ、ダサいとか主観でしか感想を言えない精神レベルの低い
プログラミングの腕も低い未熟者
63デフォルトの名無しさん:2010/08/23(月) 18:39:09
>>62
自己紹介かw
64デフォルトの名無しさん:2010/08/23(月) 18:52:49
>>9 = >>10
お前の方が思いっきりダサい(プ
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
ttp://2chnull.info/r/tech/1264920499/869-968
ttp://mimizun.com/log/2ch/tech/pc11.2ch.net/tech/kako/1233/12339/1233962622.dat
そう古くないログでさえ用いられているのに、今さら過ぎて話しにならん。
頼むから知ったか無知の夏厨は少し黙っていてくれないか?
>>10 とか >>9 とか、無駄にスレが伸びるからうぜぇ
67デフォルトの名無しさん:2010/08/23(月) 19:00:00
>>65
というか C FAQ で述べられ済みですが。http://www.kouno.jp/home/c_faq/c10.html#4
68デフォルトの名無しさん:2010/08/23(月) 19:00:23
よく見たら、望月先生は C++ に対してもこのマクロ推奨してるじゃん。
駄目だこいつ。本書くだけで実務レベルのプログラムとか書けないんだろうな。

教祖が使えない奴だから、当然信者もそれ以下だわな。
69デフォルトの名無しさん:2010/08/23(月) 19:03:10
>>66
お前がスレを伸ばしてる張本人だろう。
sageることも知らないお馬鹿さんよ。
70デフォルトの名無しさん:2010/08/23(月) 19:25:24
#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);
}
7170: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]
72デフォルトの名無しさん:2010/08/23(月) 19:35:12
C99専用って需要あるのかな
73デフォルトの名無しさん:2010/08/23(月) 19:36:41
その「交換するデータのサイズ」というのが結局は「char か? int か?」で決まるんだから
無意味では?
74デフォルトの名無しさん:2010/08/23(月) 22:02:51
チャーん!
75デフォルトの名無しさん:2010/08/23(月) 22:09:12
実は自分の方がダサい、と指摘されつつあり、それをひしひしと感じて >>10 を繰り返し叩き、精神的バランスをかろうじて保っている >>64 であった。
76デフォルトの名無しさん:2010/08/23(月) 22:10:27
どっちも人間性がダサいでFA
77デフォルトの名無しさん:2010/08/23(月) 22:38:54
>>39
=と;で限られてる部分を()で閉じる必要は全く無いと思うが。
()が必要だと思うなら、>>39の場合に()がないと動作がおかしくなる場合を教えてくれないか?
78デフォルトの名無しさん:2010/08/23(月) 22:41:15
>>77
マクロにはつけておいたほうがいいから統一してるんじゃね?
79デフォルトの名無しさん:2010/08/23(月) 22:56:54
()とは直接関係ないが

char a[10], b[20];
swap(char[30], a, b);

とかで typedef が必要、なぜ? マクロですからとか、聴いてて耳腐る
80デフォルトの名無しさん:2010/08/23(月) 23:12:50
日本語でおk
81デフォルトの名無しさん:2010/08/23(月) 23:25:38
>>79
  /'           !   ━━┓┃┃
-‐'―ニ二二二二ニ>ヽ、    ┃   ━━━━━━━━
ァ   /,,ィ=-;;,,, , ,,_ ト-、 )    ┃               ┃┃┃
'   Y  ー==j 〈,,二,゙ !  )    。                  ┛
ゝ.  {、  - ,. ヾ "^ }  } ゚ 。
   )  ,. ‘-,,'   ≦ 三
ゞ, ∧ヾ  ゝ'゚       ≦ 三 ゚。 ゚
'=-/ ヽ゚ 。≧         三 ==-
/ |ヽ  \-ァ,          ≧=- 。
  ! \  イレ,、         >三  。゚ ・ ゚
  |   >≦`Vヾ        ヾ ≧
  〉 ,く 。゚ /。・イハ 、、     `ミ 。 ゚ 。 ・
82デフォルトの名無しさん:2010/08/23(月) 23:36:44
>>77
代入演算子より優先度が低いのはコンマ演算子しかないから、() は必要ないでしょうね。
83デフォルトの名無しさん:2010/08/23(月) 23:49:07
>>39 の疑問に思っていることの方が全く無駄だと気づかないんじゃ
仕方がないよ。動作がおかしいならまだしも、単なる個人的な疑問に過ぎません。
なぜ〜にしないの?そうしたければどうぞ。
お前がそう思うんならそうなんだろう、お前ん中ではな。
ttp://blog.livedoor.jp/goldennews/imgs2/0910/g1001001.jpg

PC、プログラムの中ではそうではないとしても。
84デフォルトの名無しさん:2010/08/23(月) 23:57:23
ここはプログラム【技術】板
場違いな感想文はよそでやんな
85デフォルトの名無しさん:2010/08/23(月) 23:58:10
自分に賛同する強力な意見が現れたので、急に息を吹き返した >>83 であった。
よかったね、いずれの日にか自分の脳みそを使って反論できるようになりましょうね。
86デフォルトの名無しさん:2010/08/24(火) 00:32:29
// 最初の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
87デフォルトの名無しさん:2010/08/24(火) 00:34:54
// 最初の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
88デフォルトの名無しさん:2010/08/24(火) 00:36:58
時間を計れよ
89デフォルトの名無しさん:2010/08/24(火) 00:38:22
>>87
それは副作用がある引数をマクロに渡したためにおこること。
マクロに渡す引数に問題があるためであり、マクロの書きようで解決できる問題ではない。
90デフォルトの名無しさん:2010/08/24(火) 00:55:10
>>89
だから関数にしろという話ではないの?
91デフォルトの名無しさん:2010/08/24(火) 00:58:30
// 最初の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
92デフォルトの名無しさん:2010/08/24(火) 01:10:06
>>91
type が char なのに実際は char * を扱っているのが気に食わん。
93デフォルトの名無しさん:2010/08/24(火) 01:33:08
>>91
なるほど、マクロに渡す引数が一回しか評価されないようにマクロを組むとは可能なんですね。使いにくいのではありますが。
前言は撤回します。
94デフォルトの名無しさん:2010/08/24(火) 01:41:31
こうすれば型引数外せるかな?
試してないし、当然規格違反だけど。

#define swap(a, b) \
 do { typedef struct { char buf[sizeof(a)]; } T; T t; \
  t = *(T *)&(a), (a) = (b), *(T *)&(b) = t; \
 } while (0)
95デフォルトの名無しさん:2010/08/24(火) 01:43:24
// 最初の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
96デフォルトの名無しさん:2010/08/24(火) 11:51:29
て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
101デフォルトの名無しさん:2010/08/24(火) 14:40:14
マクロ厨のうざいことといったら…
102デフォルトの名無しさん:2010/08/24(火) 15:29:21
↑これって入門の範囲なのですか?
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が出力されます。
これをテキストなどに出力したい場合はどうすれば良いですか?
104デフォルトの名無しさん:2010/08/24(火) 15:55:04
いろいろやりかたあるけど、
実行時にリダイレクトするとかprintfをfprintfにするとか
ofstream使うのはC++だし、C++の質問は場所移した方がいいかも
105デフォルトの名無しさん:2010/08/24(火) 16:34:34
XORスワップ厨の悪足掻きが痛すぎるw
106デフォルトの名無しさん:2010/08/24(火) 18:41:48
C++にfreopen()相当の機能が欠けているのが惜しい

ただしストリームは継承で出来ているのでif文で簡単に切り分け出来るけど
107デフォルトの名無しさん:2010/08/24(火) 19:06:35
XORスワップに良い所なんて一つもなかった。
108デフォルトの名無しさん:2010/08/24(火) 19:07:16
>>102
C99 では inline 関数にすればいいので、もう知らなくてもいいことです。#define は時代遅れ。
109デフォルトの名無しさん:2010/08/24(火) 19:29:25
何年か前、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
112デフォルトの名無しさん:2010/08/24(火) 19:45:12
 発 者 同         . 。_   ____           争
 生 同 .じ     .    /´ |  (ゝ___)          い
 .し 士 .レ      .__/'r-┴<ゝi,,ノ   ro、      は、
 .な で .ベ      ∠ゝ (ゝ.//`   ./`|  }⌒j     
 .い し .ル        } ⌒ /`ヽ、_∠l,ノ ・ヽ´
 .! ! か の       /  ´..:.} >、、___,  .r、 ソ、`\
             /   ..:.:.}   /   |∨ ` ̄
            /   ..:.:./    |   丶
           / _、 ..:.:.:.{    .{.:.:.   \
          {   ..:Y  .ゝ、   {.:.:.:.:.    ヽ
          |、  ..:/ 丿 .:〉   >.- ⌒  .  ヽ
          / {. ..:./ ソ ..:./  .(    ..:.:.:`  ..:}
         ./..:.:}.:.:./ ヘ、 ..:./   .\ ..:.:r_,ノ、.:.:}
        ./..:.:/|.:/   {.:./     X.:.:}.}   X X
        /..:.:/ .}.:|    }:/       .Y丶ヽ  Y.:Y
  . __/.:/ { }  《.〈、     _,,__>.:》丶   Y.:\
  /.:.:.:.:.::/   !.:.:ゝ  ゝ.:. ̄ヾ ´:.:.:.:.:.:.:.:.:ヾゝ   \.: ̄>
113デフォルトの名無しさん:2010/08/24(火) 19:54:25
XORスワップ厨が必死だなw
114デフォルトの名無しさん:2010/08/24(火) 20:02:24
Cの最大の欠陥はマクロ厨だからな。レスから察するに、マクロを使った方がカッコいいと思ってんのかな
上で誰かが言ってるように簡単な関数はコンパイラの最適化に頼れよ
それともマクロ厨は最適化を切ってるのか?
115デフォルトの名無しさん:2010/08/24(火) 20:10:20
糞ァスワップ厨必死だなw
116デフォルトの名無しさん:2010/08/24(火) 20:11:46
あーあ、荒らしと化してるよ。はじめからか
117デフォルトの名無しさん:2010/08/24(火) 20:21:58
> XORスワップに良い所なんて一つもなかった。

元ネタを知らないのはわかったから・・・
118デフォルトの名無しさん:2010/08/24(火) 20:24:42
欠陥XORスワップw
119デフォルトの名無しさん:2010/08/24(火) 20:29:26
>>118
どうしたの?
120デフォルトの名無しさん:2010/08/24(火) 20:47:13
>>116, >>119
自分の説が補強されたのをいいことに、かさにかかって罵倒しまくっている、例のいつもの彼ですよ。でも自分の脳みそで考えたことはこれぽっちも書けないようですね。
121デフォルトの名無しさん:2010/08/24(火) 22:06:11
XORスワップがかっこいいと思ってる欠陥に気づかないバカ必死だなw
122デフォルトの名無しさん:2010/08/24(火) 22:58:28
>>121
たしかに xor スワップなんて使うほうがどうかしているのは事実なんですが、あなたは xor スワップのどこに問題かあるかわかっていますか?
123デフォルトの名無しさん:2010/08/24(火) 23:01:12
>>111
type をいちいち指定しなければならないのが糞ですねえ。swap マクロなんかやめたほうがいいでしょうね。
124デフォルトの名無しさん:2010/08/25(水) 01:53:13
目欄が空欄の奴ってなんでいつもこんなに頭悪いの?糞スレを上げてる愉快犯死ねよ
125デフォルトの名無しさん:2010/08/25(水) 01:54:56
愉快犯じゃない
本当に馬鹿なだけなんだ
126デフォルトの名無しさん:2010/08/25(水) 02:20:35
こういう手合いは時間をかけてイジクりまわしたあげく、ぐうの音もでないまで叩くのが人としての道かと。
127デフォルトの名無しさん:2010/08/25(水) 09:45:00
>>124
っNGワード
128デフォルトの名無しさん:2010/08/25(水) 10:50:45
129デフォルトの名無しさん:2010/08/25(水) 11:19:05
>>124
XORスワップがかっこいい人ですね?分かります
130デフォルトの名無しさん:2010/08/25(水) 11:27:29
もうかなり前から swap(type,x,y) do{ }while(0); なんて使われていたのに
今さらそれ自体に問題があるだの、ダサいだの、学習能力なさ杉w
まぁそんな意見をした奴は明らかに初心者だってバレバレだからw
131デフォルトの名無しさん:2010/08/25(水) 11:28:52
#define dasai( type , x , y ) do{ type... }while(0) がカッコイイと思いますです、はい!
132デフォルトの名無しさん:2010/08/25(水) 11:48:26
おっと、スワッ(プッってしたら実も出ちゃったで、これが本場の糞ァースワップゥ〜
133デフォルトの名無しさん:2010/08/25(水) 12:00:59
マクロで実現することに拘るのが駄目
時代遅れだし、実務では使えな奴の発想なんだよ
134デフォルトの名無しさん:2010/08/25(水) 12:02:49
ところでxorってなんて読むんでしょうか
135デフォルトの名無しさん:2010/08/25(水) 12:06:13
>>134
エクスクルーシブオアー
136デフォルトの名無しさん:2010/08/25(水) 12:14:35
>>133
型を渡すことで完璧なマクロで実現できる(多数の本を書いた教授が考案)
だから他の方法を使うのは馬鹿、インラインもアホのすること

>>134
俺はエックスオーアールって読んでるぜ
137デフォルトの名無しさん:2010/08/25(水) 12:18:58
>>136
>>87 をみればマクロで完璧とはいえないようですよ。 >>91 のようなマクロならOKですが、これって使いやすいと思いますか?
138デフォルトの名無しさん:2010/08/25(水) 12:23:58
>>137
こういう汚いコードは読む気にならないね
大学の教授の方が信用できるだろ

ttp://www.bohyoh.com/CandCPP/FAQ/FAQ00008.html
これを読んで、出直してこい!
139デフォルトの名無しさん:2010/08/25(水) 13:09:18
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
>>141
了解、この話題は以下禁止にしようぜ!
143デフォルトの名無しさん:2010/08/25(水) 13:50:11
boost::format( "%.15g" ) % s.weight;
って何をしているのでしょうか?
s.weightの値をどうかするんだとは思いますがよく分かりません
144デフォルトの名無しさん:2010/08/25(水) 13:56:09
>>143
help読まずに他人が書いたライブラリ使おうなんて無茶
145デフォルトの名無しさん:2010/08/25(水) 14:13:00
つーか間違いなくスレチ
146デフォルトの名無しさん:2010/08/25(水) 14:13:43
XORスワップ厨が激しく必死w
147デフォルトの名無しさん:2010/08/25(水) 14:54:56
>>143
printf("%.15g", s.weight);
で出力したのと同じ文字列が得られる
148デフォルトの名無しさん:2010/08/25(水) 14:55:39
#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
150デフォルトの名無しさん:2010/08/25(水) 15:00:46
>>148
わざとやってんのかwwwwww
151デフォルトの名無しさん:2010/08/25(水) 15:10:12
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の仕様を勘違いしてたんでしょうか?
152デフォルトの名無しさん:2010/08/25(水) 15:10:14
>>148
それc言語のつもり?
153デフォルトの名無しさん:2010/08/25(水) 15:12:53
あ、C++禁止なんですね。
すいません、今更見ました・・・

上は見なかったことにしてください。
154デフォルトの名無しさん:2010/08/25(水) 18:13:01
>>130
>swap(type,x,y) do{ }while(0);
最後のセミコロンはつけてはいけない。というか、それが肝心かなめの重要な要素。
ちゃんと理解しているのか?
http://www.kouno.jp/home/c_faq/c10.html#4
155デフォルトの名無しさん:2010/08/25(水) 18:43:23
>>130
昔はそれしか方法がなかったけど、
今は別の方法があるんだからそっちの方が良いって話でしょ。

携帯使わず、ポケベル使ってたら、だっせーってこと。
156デフォルトの名無しさん:2010/08/25(水) 18:48:14
swapくらいならその場でコードを書けば確実なわけで
結果的に展開されるマクロだの結果的に展開されるかどうかわからないインラインだのばかばかしい
157デフォルトの名無しさん:2010/08/25(水) 18:50:55
>>156
「くらいなら」ってどんな基準?
158デフォルトの名無しさん:2010/08/25(水) 19:03:43
基準なんているのか?www
159デフォルトの名無しさん:2010/08/25(水) 19:08:21
俺はいらないという立場から言っている
160デフォルトの名無しさん:2010/08/25(水) 19:09:14
で?
161デフォルトの名無しさん:2010/08/25(水) 19:10:49
swapくらい、とは何のことだ?
162デフォルトの名無しさん:2010/08/25(水) 19:11:52
なにがききたいの?きもちわるいwww
163デフォルトの名無しさん:2010/08/25(水) 19:16:07
>>156
ポケベルも携帯もいらんって発想だな
買っても相手がいないってから、毒づいてるんだよね

君の容姿とか性格が浮かぶわwwww
164デフォルトの名無しさん:2010/08/25(水) 19:17:37
ポケベルはいらんだろJK
売ってんの?今
そんなもん買ったって相手いないわな
165デフォルトの名無しさん:2010/08/25(水) 19:19:54
>>162
おまえさんが「その場で書く」という凶行に出るスレッショルドを聞いてるんだよ
返答義務はないがリアルでその発言すると気にする人いると思うよ
166デフォルトの名無しさん:2010/08/25(水) 19:22:01
で?気にする人がいるからなんだってんだ?
こちらはお前がキモイと思うくらいなもんだが?
167デフォルトの名無しさん:2010/08/25(水) 19:26:10
>>164
JKとベル友になりたいわ
まだかろうじて売ってるらしいけど
エリアも関東の一部のみとかかなり狭くなってるようだな
168デフォルトの名無しさん:2010/08/25(水) 19:29:55
>>166
返答義務はないが技術的に話せないなら出てってくんな、板違いだよ
169デフォルトの名無しさん:2010/08/25(水) 19:31:07
てめーがいらねーって言ってんじゃんwwww
170デフォルトの名無しさん:2010/08/25(水) 19:32:59
>>169
俺の見解じゃなく、おまえさんの見解を聞いてるんだよ
171デフォルトの名無しさん:2010/08/25(水) 19:34:32
聞いてどうすんの?
172デフォルトの名無しさん:2010/08/25(水) 19:36:56
>>171
俺がどうするかによって、おまえさんの見解が変わるようならくだらねえな
173デフォルトの名無しさん:2010/08/25(水) 19:38:51
あんたがどうかするの??俺の見解って何?
超キモい
174デフォルトの名無しさん:2010/08/25(水) 19:40:21
発狂しやがった
もうええわ
175デフォルトの名無しさん:2010/08/25(水) 19:41:48
冷静に考えなよ
君が発狂してるからこうなったんだ
176デフォルトの名無しさん:2010/08/25(水) 19:45:29
>>166
XORのお前が一番キモイw
177デフォルトの名無しさん:2010/08/25(水) 19:46:25
そもそも発狂させる方にも問題がある
178デフォルトの名無しさん:2010/08/25(水) 19:47:20
火病は遺伝子が関係してるってにちゃんねるに書いてたよ!
179デフォルトの名無しさん:2010/08/25(水) 19:47:29
キモイとかダサイとかまるで小学生だよ
繰り返すからこっちもだんだんむかつくんだぞ
180デフォルトの名無しさん:2010/08/25(水) 19:48:59
しかし事実だし
181デフォルトの名無しさん:2010/08/25(水) 19:51:32
XORスワップ厨が火病を起こしてダサいとか言い出すからw
182デフォルトの名無しさん:2010/08/25(水) 19:56:38
>>181
すまんな、無視しちゃって
だけどな、XORの話をもりあげたいのかもしれないが、お笑いにはタイミングってものがあってな
中途半端な的外れだと面白く無いんだ
183デフォルトの名無しさん:2010/08/25(水) 20:06:16
>>177
いや、どんどん発狂させるべきだ。彼もひところに比べるとだいぶ疲れてきたようで、かつての長文攻撃が出なくなってきた。陥落は近い。
184デフォルトの名無しさん:2010/08/25(水) 20:08:59
陥落させてどうするの?
結婚でも申し込むの?
185デフォルトの名無しさん:2010/08/25(水) 20:13:58
おれ、こいつを陥落させたらけっこn
186デフォルトの名無しさん:2010/08/25(水) 21:25:13
これが後の世に伝わるswap100年戦争か
187デフォルトの名無しさん:2010/08/25(水) 21:38:58
swapというか、もはやマクロ戦争になってる。これが本場のマクロス、なんつって
188デフォルトの名無しさん:2010/08/25(水) 21:41:10
マクロS WAP
俺の主張を聞けー
189デフォルトの名無しさん:2010/08/25(水) 22:18:00
intやcharの定義は誰がしているんですか
glibc or gcc or linux ?
190デフォルトの名無しさん:2010/08/25(水) 22:18:27
>>189
コンパイラの作者
191デフォルトの名無しさん:2010/08/25(水) 22:19:21
コンパイラの作者を作ったのは誰ですか
192デフォルトの名無しさん:2010/08/25(水) 22:21:08
どこの小学生だよw
193189:2010/08/25(水) 22:25:16
>>190
glibcはC言語ライブラリですが、それに定義してあるんじゃないんですか?
やっぱり、gccなのかな
194デフォルトの名無しさん:2010/08/25(水) 22:58:59
>>191 人間です、その人の親です。
195デフォルトの名無しさん:2010/08/26(木) 00:41:45
目欄空欄の奴のつまらなさ。
196デフォルトの名無しさん:2010/08/26(木) 01:14:27
>>195
そんなことを気にしていちいち書き込むお前も十分意味不明で詰まらん、無駄なレスだから。
197デフォルトの名無しさん:2010/08/26(木) 01:15:18
> 目欄空欄
日本語でおk。意味不明。まともに日本語が使えない奴って
やはり・・・いや、はっきり指摘した方が良い。池沼乙。
198デフォルトの名無しさん:2010/08/26(木) 01:17:43
>>124 >>195
目欄なんて他人に通じない、独自の単語を使っているのはお前くらいだよ。
お前こそつまらねぇ。このスレに何しにきてんの?
>>10でダサいとか言っちゃった池沼でしょ?wwwwww
欠陥糞スワップがカッコイイって思うくらいだから、仕方ないか・・・
199デフォルトの名無しさん:2010/08/26(木) 01:22:41
>>195
おまい臭い、臭うぞ?厨だろ?
200デフォルトの名無しさん:2010/08/26(木) 04:35:27
>>196-199
ここまでわかりやすい自演は久しぶり見た
201デフォルトの名無しさん:2010/08/26(木) 06:52:43
今時2chで「目欄」が判らんとは。半年ROMれって奴だな。
202デフォルトの名無しさん:2010/08/26(木) 10:20:00
わからないふりして自演を偽装してるんじゃないのか?w
203デフォルトの名無しさん:2010/08/26(木) 11:44:12
目欄()笑
204デフォルトの名無しさん:2010/08/26(木) 12:57:58
>>198
メランコリー氏ね
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
ヤーレン ソーラン ソーラン ソーラン メーラン あーよいよい♪
208デフォルトの名無しさん:2010/08/26(木) 14:05:44
>>206
質問する場所を間違えている
出て行け
209デフォルトの名無しさん:2010/08/26(木) 14:13:11
>>206
>が読み込まれますか?

この意味がわからん。
210デフォルトの名無しさん:2010/08/26(木) 18:49:10
>>206
もうしわけないが、いってることがよくわからない。
211デフォルトの名無しさん:2010/08/26(木) 19:20:55
宣言と定義のファイル分けることについて聞いてるような気もするが
結局なんだかよく分からない
212デフォルトの名無しさん:2010/08/26(木) 19:26:48
釣りだろ
213デフォルトの名無しさん:2010/08/26(木) 21:01:46
テキストを格納してある行列から、一行ずつ読み込んで、トークンに切り分けたいんでしょ?
214デフォルトの名無しさん:2010/08/26(木) 21:15:23
なんで、C言語ではstaticな変数/関数をヘッダファイルに書かなくていいんですか?
215デフォルトの名無しさん:2010/08/26(木) 21:18:54
kwsk
216デフォルトの名無しさん:2010/08/26(木) 21:37:52
>206
termの使い方がめちゃくちゃなので、エスパーして答えてみる。
なお、C++の話なので、そもそもすれ違いだけど、、。

ちゃんとリンクしてあげれば、a.cppのsa.readerをコールすると、aaa.cppで定義した
sa.readerが呼ばれる。
217デフォルトの名無しさん:2010/08/27(金) 01:23:29
>>214
#includeについて学んでから質問し直してください。
218デフォルトの名無しさん:2010/08/27(金) 04:50:15
// ---------- 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を付けてないから、ヘッダに名前無くても呼べてしまう。こまる)
}
219デフォルトの名無しさん:2010/08/27(金) 05:42:42
gotoを使うのはなぜいけないんですか?
無秩序に使うのは確かに見づらくなって良くないと思いますが、他の制御文と同じ用を為すように使えば避難されるいわれは無いと思うのですが。
220デフォルトの名無しさん:2010/08/27(金) 05:50:45
>>219
使うなというのが経験則であるので、それに反論する明確な根拠とかはないよ
だから試しにgoto使いまくってみて後悔してみればいいんじゃないかな

あとはまぁ、エラー処理に関しては使ってもいいんじゃないか派も存在する
221デフォルトの名無しさん:2010/08/27(金) 06:05:53
>>219
システムの規模が大きくなったり人が増えてくると何がなにやら分からなくなってくるから
222デフォルトの名無しさん:2010/08/27(金) 06:06:27
>>219
goto は昔からの大論争で、
「少なくとも濫用はよくないらしい。使うとしても必要最小限がよい」
という辺りまでコンセンサスができている
じゃあどの程度まで使っていいのか、あるいは完全に禁止すべきなのかは
何とも言えない所

事実、大半の局面で goto は不要。必要ない部分に goto を適用すれば、
人間にとってもコンパイラにとっても読み取りづらいコードができる
誰も嬉しくない
223デフォルトの名無しさん:2010/08/27(金) 08:18:06
昔と違って今時のコンパイラはgoto程度で最適化を断念するほどやわじゃないからやってみるといいよ。
224デフォルトの名無しさん:2010/08/27(金) 09:26:55
>>219
本来は、C++はともかく、Cではgoto文はスマートなコードを書くための一つの手段。
だけど、

>他の制御文と同じ用を為すように使えば
なら、他の制御文使え。こういう用途でgoto文を使うのが一番愚か。
こういう馬鹿がいるから、goto文を使うのが悪いと一律で言われるんだよ。
225デフォルトの名無しさん:2010/08/27(金) 09:46:44
いいんじゃない?goto文使っても
その先に待っているのが、どのような自体だったとしても、自分がよけりゃーいいんじゃね?
他人に見せるソースならその限りじゃないけど、どうせ自分だけでしか見ないんだろ?
226デフォルトの名無しさん:2010/08/27(金) 10:21:42
goto使いたい奴はBASICでも使ってろよ
227デフォルトの名無しさん:2010/08/27(金) 10:44:26
>>226
BASICでも使わないよ。
on error goto なら使うけど
228デフォルトの名無しさん:2010/08/27(金) 10:55:30
>>219
そうだね
他の制御文だって機械語の分岐命令でできているわけで

ちなみに、この問題には安定した理論が古くに完成しており
今頃「論争」している奴はかなり痛い勉強不足

「それはそれ」でまた別な理論を構築しようとしている人は別として
229デフォルトの名無しさん:2010/08/27(金) 12:09:28
>>228
goto は分岐命令でなく、ジャンプ

こういう馬鹿がいるから話がややこしくなる
230デフォルトの名無しさん:2010/08/27(金) 13:20:04
gotoを使えたらもっと分かりやすくなるのになあと思ったことがないなあ
231デフォルトの名無しさん:2010/08/27(金) 13:37:12
# ひとりでややこしくしてもがいてるアホはスルー

>>230
malloc 複数回は?
break のような隠れ goto や
exit のような goto 以上のワルを使うだろ
232デフォルトの名無しさん:2010/08/27(金) 13:57:36
>>231
>break のような隠れ goto や
>exit のような goto 以上のワルを使うだろ

だから、他の手段があるのに goto を使うなという話だよ。
本当に理解力ないな。
233デフォルトの名無しさん:2010/08/27(金) 13:59:34
>>232
理解力って…
隠れ goto つってんのに
234デフォルトの名無しさん:2010/08/27(金) 14:09:03
>>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 で実現できるわけないだろ
馬鹿をそのままお返しする
236デフォルトの名無しさん:2010/08/27(金) 14:26:04
>>235
>GO TO 有害説が否定するパターンだよ
これはお前が勝手に想定してるだけだろ。

goto を否定する人の一部の人がそう考える話であって、
ここで goto を否定した人に勝手に当てはめるな。

break や exit は否定していない。goto が駄目だとしか言ってないだろ。
「goto を使わず他で代用できるときには goto を使うな」だよ。
goto 使わず、break を使えという意味だとどうしてわからないんだ?


>goto 以上のワルを goto で実現できるわけないだろ
exit が悪いというのはお前の主観だろ。
そもそも goto と関係ない機能なら、exit の話をするな。
237デフォルトの名無しさん:2010/08/27(金) 14:29:54
>>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
>>237
同じだってば
240デフォルトの名無しさん:2010/08/27(金) 14:31:21
>>231
>malloc 複数回は?
これでgoto使うのは君が低能なプログラマだからだよw
241デフォルトの名無しさん:2010/08/27(金) 14:36:22
>>238
わけの分からんことを言うな!
俺自身が、
「goto を使わず他で代用できるときには goto を使うな」
と言ってるだから、知るとか知らないとかないだろ。これが全てだ。

それをお前が勝手に break や exit を否定して思い込んでるだけだろ。
だから勝手な想定すんな!と言ってるんだよ。
どこまで理解力ないの?
242デフォルトの名無しさん:2010/08/27(金) 14:37:48
>>240
だっておまえ break を使うんだろ?
低脳とか自虐ショーはおもしろすぎるからやめれ
243デフォルトの名無しさん:2010/08/27(金) 14:38:54
>>239
動作が同じだけで、ソースの可読性が全然違う。
だから goto を使うなという話。

君は動けばいいと思ってるのか?
それなら話しても無駄だわ。
244デフォルトの名無しさん:2010/08/27(金) 14:39:56
>>241
> 俺自身が、
> 「goto を使わず他で代用できるときには goto を使うな」
> と言ってるだから、知るとか知らないとかないだろ。これが全てだ。

ははは、確かにそうだね
「俺」が言ってることに「俺」が知らないことは含まれないだろうな
245デフォルトの名無しさん:2010/08/27(金) 14:40:23
>>243
どう違うの?
246デフォルトの名無しさん:2010/08/27(金) 14:42:49
>>242
だから break と goto が同じだと思うのが低能なの。
お前が勝手にそう思ってるだけ。

けど、お前はそういうコード書いてるんだよね?

そりゃ前には理解できない話だなwwwwwwwwwwwww
247デフォルトの名無しさん:2010/08/27(金) 14:44:44
>>246
同じネタじゃつまらん
笑いを取りたければ新ネタを出せ、よそで
248デフォルトの名無しさん:2010/08/27(金) 14:56:24
おやつの時間だ、落ちるぞ
249デフォルトの名無しさん:2010/08/27(金) 18:58:23
gotoはスコープ外だろうが関数外だろうがどこにでも飛べる。
ゆえに、読む人にそういう使い方してるんじゃないか?という疑念を与える。
使うなとは言わんがコメント必須である。
250デフォルトの名無しさん:2010/08/27(金) 19:13:10
>>249
longjump じゃないんだからw
251デフォルトの名無しさん:2010/08/27(金) 19:32:49
まだgotoの話やってたのかよwww
gotoは実質禁止されてるだろ馬鹿だなあ
252デフォルトの名無しさん:2010/08/27(金) 19:38:34
後藤さんは駄目ですか? ><;
253デフォルトの名無しさん:2010/08/27(金) 20:53:29
#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} );
}
254253: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} ); //これエラー(通りそうなのに
255デフォルトの名無しさん:2010/08/27(金) 22:28:23
>>254
その引き数の渡し方はgcc拡張だからご用心。
それはさて、整数定数を渡すのなら環境依存を承知でキャストしちゃえばいいじゃん。
void * foo = (void *) 3;
256デフォルトの名無しさん:2010/08/28(土) 13:57:32
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ループを簡素化する方法はないでしょうか?

257デフォルトの名無しさん:2010/08/28(土) 14:01:22
for(int i=0; i<?; i++){
  test[i] = 9;
}
258デフォルトの名無しさん:2010/08/28(土) 14:04:13
すごいループだ・・・
259デフォルトの名無しさん:2010/08/28(土) 14:27:55
>>256
質問を簡略化したつもりなんだろうが
それだとどういうループのこと言ってんのか訳がわからない
260デフォルトの名無しさん:2010/08/28(土) 14:31:45
// ここより以前は変更なし
// ---------- 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も引数として直接渡せるようになるけど、これだと使用時の記法がグチャグチョで難解すぎ。(手軽にしようとして、逆に複雑化してる)
261デフォルトの名無しさん:2010/08/28(土) 16:22:35
エスパーとかの範囲超えてるだろ
262256:2010/08/28(土) 16:39:22
わかりにくくてすみません
ttp://codepad.org/eByt7bdH
入門書を読みながら効率無視で数独の全パターンを書き出す物を作ろうと思ったのですが
上記のところまで書いたところでforの部分を簡素化する方法があるのではないかと思いお聞きしました。
263デフォルトの名無しさん:2010/08/28(土) 16:44:29
あれか、世界一難しい数独w
見た目なら関数作ればいけると思うけど、速度ってのは無理なんじゃね。
264デフォルトの名無しさん:2010/08/28(土) 17:59:57
>>262
全部で何パターンあるか知ってるのか?
ループ以前にそのやり方(総当り)じゃ丸1ヶ月動かしても終わらないよ
265デフォルトの名無しさん:2010/08/28(土) 18:08:06
includeの概念がよく分かりません
特に環境をいじらなくてもstdio.hを使うときは
#include <stdio.h>
で済むのに対し、外部のライブラリをこのように利用するにはどうすればいいのでしょうか?
266デフォルトの名無しさん:2010/08/28(土) 18:13:41
>>262
プログラム自体の簡素化はできない
悪いことは言わないから、ちゃんとアルゴリズムを考えてからまた作った方がいい
267デフォルトの名無しさん:2010/08/28(土) 18:22:04
>>265
#include "hoge.h"
268256:2010/08/28(土) 18:27:01
やはり総当たりでは無理ですか
『アルゴリズムの絵本』を買ってきたのでこれを読みながら考え直してみます
有難うございました
269デフォルトの名無しさん:2010/08/28(土) 18:30:39
>>262
速度が遅いのは効率無視と書いているのだからいいんだよね?
問題は見た目の話(ネストが深くなりすぎる)だけなら、その方法だけ知りたいと
言わないとココの人バカだから通じないみたいだよ。
270256:2010/08/28(土) 18:34:55
>>269
一年間無休で動かしている機体があるのでそれを使って計算しようと思ったのですが
コードを書いてるうちに何が何だかわからなくなってきたので簡素化の方法を聞かせていただきました

とりあえずアルゴリズムについて学んでみることにします
271デフォルトの名無しさん:2010/08/28(土) 18:47:04
>>269
だから「ない」と>>266が答えてるだろ
272269:2010/08/28(土) 18:53:20
>>271
へ?>>266は再起でもなんでも見た目すら回避できないと言ってるのかい?
そりゃたまげたね
273デフォルトの名無しさん:2010/08/28(土) 18:57:07
>>272
再帰でやってみろよ低脳w
274デフォルトの名無しさん:2010/08/28(土) 19:24:36
見た目の回避なら関数つかえととっくに言われてるだろ・・・・・・・
275269: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;
}
276デフォルトの名無しさん:2010/08/28(土) 19:40:26
>>275
いい加減すぎるだろw
277デフォルトの名無しさん:2010/08/28(土) 20:00:08
数独のルール
横行が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
278デフォルトの名無しさん:2010/08/28(土) 20:11:36
たぶんもっとも単純な組み合わせの作り方(うえから下にやってく)

ぐるぷ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の順序にならべる

感性♪(^_^/
279デフォルトの名無しさん:2010/08/28(土) 22:43:21
1から9までのループを81個入れ子にして条件を満たしてるかどうか調べればいいんだよ
280デフォルトの名無しさん:2010/08/28(土) 23:00:12
1行決まれば、ほとんど絞れる。
281デフォルトの名無しさん:2010/08/28(土) 23:02:27
123 456 789
決めたから絞って
282デフォルトの名無しさん:2010/08/28(土) 23:03:31
俺のティムポミルクを絞ってからからだ
283265:2010/08/29(日) 00:25:08
>>267
宣言くらいはわかりますけど、どのようにして環境を整えればいいのかが聞きたいんです
プロジェクトに関連ファイルを全部ぶち込まないとダメなんでしょうか?
284デフォルトの名無しさん:2010/08/29(日) 00:26:47
>>283
アプリの使い方は該当アプリのスレへどうぞ。
285デフォルトの名無しさん:2010/08/29(日) 00:27:54
そもそもCにはプロジェクトなんて概念ない死ね。
286265:2010/08/29(日) 10:37:02
失礼しました、聞き方を変えます
ヘッダファイルを読み出すプログラムと同じディレクトリにヘッダファイルを置けば使えるんでしょうか?
287デフォルトの名無しさん:2010/08/29(日) 10:42:41
>>286
死ね
288265:2010/08/29(日) 11:11:17
お前らひどいなwwwww
答えてやれよwwwwwwwww
289デフォルトの名無しさん:2010/08/29(日) 11:29:27
>>286
外部ライブラリを使うにはlibファイルをリンクしないと使えない。
libファイルをリンクするのは環境によって方法が違う。
VisualStudioならプロジェクトのプロパティで、リンカの入力設定に追加の依存ファイルとしてlibファイルを記述する。
gccなんかを使う場合はオプション-Lでlibファイルのディレクトリを指定し、オプション-lでライブラリを指定する。

libファイルがリンクできるようになれば、ライブラリと一緒に配布されているヘッダファイルが使えるようになる。
ヘッダファイルはコピーして自分のプロジェクトディレクトリに入れて置くのが手っ取り早い。
後は>>267が書いているように#includeすれば外部ライブラリの機能が利用できるようになる。



>>288 釣られてやったぞ、感謝しろ。
290デフォルトの名無しさん:2010/08/29(日) 12:02:21
無駄に配布ライブラリのインクルードファイルをコピーする馬鹿がいると聞いて
291デフォルトの名無しさん:2010/08/29(日) 12:52:24
外部ライブラリもコピーして自分のプロジェクトディレクトリに入れて置くのが手っ取り早い
んですよね?
292デフォルトの名無しさん:2010/08/29(日) 12:57:07
解らない場合はその方が手っ取り早い。
でも普通はヘッダもライブラリもプロジェクトにコピーしたりしないけどな。
293デフォルトの名無しさん:2010/08/29(日) 12:58:19
外部ライブラリなんて使わないのが一番手っ取り早いな
294デフォルトの名無しさん:2010/08/29(日) 13:00:25
脳足りんは一生車輪の再発明してろ。
295デフォルトの名無しさん:2010/08/29(日) 13:07:19
ほんとに釣りなんだねぇ
296デフォルトの名無しさん:2010/08/29(日) 13:47:39
>265>286
とりあえず、ヘッダファイルと、ライブラリは別。

コンパイルのためにヘッダファイルが必要で、(正確にはプリプロセスのために必要)
リンク時にライブラリが必要になる。

コンパイラはインクルードパスから、該当するヘッダファイルを探す。指定のやりかたは
コンパイラによる。gccなら-Iオプションでインクルードパスを指定する。

ライブラリの場合は-Lオプションで指定するけど、静的リンク、動的リンクでも変わる。
297デフォルトの名無しさん:2010/08/29(日) 17:10:26
C言語を勉強するメリットはなんですか?
298デフォルトの名無しさん:2010/08/29(日) 17:17:08
ない。どっか池
299デフォルトの名無しさん:2010/08/29(日) 17:19:02
>>297
初心者に、最初のCをやれって勧めるおっさんがおおいけどマにうけないようにな。
300デフォルトの名無しさん:2010/08/29(日) 17:57:19
Windows & Visual C++のsignal(XXX,test);のことでご質問が
あります。
taskkillやシャットダウンや閉じるボタン(X)の割り込みを
検知するにはXXXは何を入れたらよいのでしょうか
よろしくお願いします。
301デフォルトの名無しさん:2010/08/29(日) 18:02:09
Windowsのシステムコールにsignalってあったのか。
UNIX系独特のもんかと思ってた。ちなみにUNIXならSIGKILLでよかったよな。
302デフォルトの名無しさん:2010/08/29(日) 18:20:44
つーか、CやらないでC#とかJavaなんかやってたら
いつまでもプログラム言語がどういうものかっていう根本的な
問題は解決できないよね。

最初のころは、C#やJavaでパズルやってりゃいいけど。
303デフォルトの名無しさん:2010/08/29(日) 18:23:37
WindowsはPosix準拠だからね。
304デフォルトの名無しさん:2010/08/29(日) 18:24:50
>>302
そういうお勉強ならアセンブラでいいんじゃね?
305デフォルトの名無しさん:2010/08/29(日) 18:28:24
パソコン1台しか持ってなくて試せないんで聞きたいんですけど
あるマシン上でコンパイルしたバイナリファイルって違うCPUが乗ってるマシンでも動くんですか?(OSは同じとします)
例えばアラインメントはCPUごとに違うことがあるらしいんで、アロケーターを書いてるときとかに
遅くなったり動かなくなったりするんじゃないかなとすごい不安なんですが・・・
306デフォルトの名無しさん:2010/08/29(日) 18:34:28
ビルドしたときに指定したターゲットに互換性のない環境では動作しない
遅くなったりとかはどこに移動してもあるだろ
307デフォルトの名無しさん:2010/08/29(日) 18:35:27
>>305
CPUが互換性あれば動くし、互換性なかったら動かないってしかいいようがない。
308デフォルトの名無しさん:2010/08/29(日) 18:48:22
>301
回答ありがとうございます。VC++2005 CLRだと
'SIGKILL' : 定義されていない識別子です。
とおこられました。
309301:2010/08/29(日) 18:50:17
あっそ、残念だったなw
310デフォルトの名無しさん:2010/08/29(日) 19:00:48
>>309
なにかよい方法ないものでしょうか
アドバイスをお願いします。
311デフォルトの名無しさん:2010/08/29(日) 19:01:55
うるせーよ。
Windowsのsignal()ではSIGINTすらサポートされない。
何がしたいのか知らんが↓で聞け。
Win32API質問箱 Build89
http://hibari.2ch.net/test/read.cgi/tech/1282403810/
312デフォルトの名無しさん:2010/08/29(日) 19:35:30
>>305
その心配は仮に PC を2台持ってても解決できないよ
ひたすら互換互換であたかも CPU が違わないように見せかけてあるからね

秋月や CQ あたりのマイコンキットを「2台目」として使ってみれば
CPU が違うと何が起きるのかをガン見できる(数千円の授業料は格安)

OS は同じとします、とあるが CPU が違えば同じ OS は動かないのが基本だよ
ベンダが同じとか流れをくむとかで近縁であることをアピールするために
似た名前を名乗る OS ならあるけどね

どーしてもハード関係はイヤというなら(おすすめはしないが)、
LSI-C86 のように PC の 16bit モード用のコンパイラを使ってみたり
VC++ の 64bit 版を使ってみる手もある
たいして違わなくて拍子抜けするだろうけどね
313265:2010/08/29(日) 21:24:47
>>289,296
ありがとうございました

それと今度から質問するときは酉付けることにします
314デフォルトの名無しさん:2010/08/29(日) 21:28:38
そもそも、その程度の知識も無いのにアロケータを書くってのが無謀
x86も深く知ってるとは思えないが、x86限定にしとくのが吉
315デフォルトの名無しさん:2010/08/29(日) 22:33:35
>>302 ←自分の住んでる世界が全てだと思ってる典型例
316Perl忍者 ◆M5ZWRnXOj6 :2010/08/30(月) 08:02:14
典型的という言葉は個性オタに大ダメージを与えられる
特別だと思ってるから 典型的という言葉を使って 相手の個性を踏みにじる
317デフォルトの名無しさん:2010/08/30(月) 10:34:34
DCASを簡単にする方法無い?
318デフォルトの名無しさん:2010/08/30(月) 11:06:01
DCASって何ですか? Cと何か関連性があるのですか?
319デフォルトの名無しさん:2010/08/30(月) 12:01:14
a&&bのaが偽だったらbは評価スルーされる件って仕様ではスルーしないといけない、スルーしてもいい、どっちですか?
320デフォルトの名無しさん:2010/08/30(月) 12:08:49
>>319
スルーしないといけない
詳しくは短絡評価でぐぐれ
321デフォルトの名無しさん:2010/08/30(月) 12:15:17
>>320
ありがとうございます
if(p && p->x == 1) { ・・・
とかは安全ということですね
322デフォルトの名無しさん:2010/08/30(月) 13:56:10
>>321
なるほど
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ファイルに出力したいのですがどうすればよいでしょうか?
324デフォルトの名無しさん:2010/08/30(月) 14:18:58
>>323
cでないソースを張っての質問はご遠慮願います。
325デフォルトの名無しさん:2010/08/30(月) 14:22:43
>>311
おめーがうるせーよw
326デフォルトの名無しさん:2010/08/30(月) 14:32:56
323に書き込んだものです。C++で質問したいと思います。
申し訳ありませんでした。
327デフォルトの名無しさん:2010/08/30(月) 14:34:10
>>323
これマルチだろ!ボケがー
328デフォルトの名無しさん:2010/08/30(月) 18:26:09
>>326
っていうかスレ違い。
329デフォルトの名無しさん:2010/08/30(月) 18:34:20
釣り堀だな
確信犯を相手に(キリッとかかっこわるいから・・・
330デフォルトの名無しさん:2010/08/30(月) 21:15:29
↑これも釣り
331デフォルトの名無しさん:2010/08/30(月) 22:40:52
@#define TEST (unsigned char)(0xA5)
A#define TEST (unsigned char)0xA5

上記の@とAでコンパイル結果(HEX)に違いはあるのでしょうか?
332デフォルトの名無しさん:2010/08/30(月) 22:55:39
丸文字を使うプログラマは信用できない
333デフォルトの名無しさん:2010/08/30(月) 22:56:11
>>331
あえてさらに#defineを使うって変なことすると違いはある
でも普通はないだろう
334デフォルトの名無しさん:2010/08/30(月) 22:56:28
1234567890
335デフォルトの名無しさん:2010/08/30(月) 23:01:16
変数を空にするときは $a = undef でいい?
336デフォルトの名無しさん:2010/08/30(月) 23:05:34
いいですよ
337デフォルトの名無しさん:2010/08/31(火) 20:36:58
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_);
338デフォルトの名無しさん:2010/08/31(火) 23:36:23
>>337
第2引数は、(*f[N]) (*f[]) (**f)のどれも同じ。(*(*f))でもいいけど括弧が冗長。
第3引数は、(*f_[N][N]) (*f_[][N]) (*(*f_)[N])のどれも同じだけど、これ以上のNは省略できない。

あと関数(function)ならfuncな
339デフォルトの名無しさん:2010/09/01(水) 00:54:33
>>338
ありがとうございます。

第3引数についてですが、
double (***f_)(Vector))
としてもこの段階でコンパイルエラーが出ないので、
もしかしてmainでのこの関数を呼び出し方を変えれば
正しく動作したりしますか?

関数名は、本当はNewton_methodで
長くなってしまうので省略したのですが間違えてしまいました;
340デフォルトの名無しさん:2010/09/01(水) 07:12:34
>>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_);
341デフォルトの名無しさん:2010/09/01(水) 07:49:24
>>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で置き換えられないでしょうか?
342デフォルトの名無しさん:2010/09/01(水) 20:55:40
>341
Cでは配列宣言時の要素数は定数式でなければならない。
よってローカル変数nに置き換えることはできない。
C++ならconstを付ければOK.
343デフォルトの名無しさん:2010/09/01(水) 21:55:03
>>341
C99ならできるよ

>>342
嘘教えんなクズ野郎
344デフォルトの名無しさん:2010/09/01(水) 21:58:21
scanfについて教えてください

scanf("%d",&a);

こうすると,aの値は十進数ですが、aを11hu2のように文字を混ぜて使いたいのですが、
()の中は何を入力すればいいのでしょうか?
345デフォルトの名無しさん:2010/09/01(水) 21:59:22
>>344
char s[256];
scanf("%s", s);
346デフォルトの名無しさん:2010/09/01(水) 22:00:18
何故初心者にはscanfが大人気なのか
347デフォルトの名無しさん:2010/09/01(水) 22:04:42
>>346
専門学校のテキストとかことごとくscanf()だから。
348デフォルトの名無しさん:2010/09/01(水) 22:14:01
>>346
ファイル構造体へのポインタと char 配列と string.h を
hello world の次にいっぺんに出して残れる人は2種類しかいないんだよ
・「呪文」の暗記が得意な人 →教わったことしかできない木偶の坊
・質問なんかしない人 →初心者にカウントされない

石をたたいて信号を拾うことから始める人たちには
明らかに初心者を卒業してるのに scanf ってつおい?な人もいるね
いずれにせよ互いに「あっちの世界」を知らないわけだが
349デフォルトの名無しさん:2010/09/01(水) 22:29:34
scanf()にしたって、どうせ呪文的に覚えるだけだろ。
なんか深遠な理由があってscanf()教えてるわけじゃない。
350デフォルトの名無しさん:2010/09/01(水) 22:39:15
scanfって具体的になにが問題か知ってるの?
wiki見ないで箇条書きしてみな
351デフォルトの名無しさん:2010/09/01(水) 22:44:41
>>350
ほかの入力関数とくらべて挙動がどくとくて初心者はだいたい引っかかる。
挙動に精通しても実践でつかうことはほとんどない。
おぼえるだけ時間の無駄。
352デフォルトの名無しさん:2010/09/01(水) 22:46:56
>>349
「呪文」が苦手な人といっても「呪文」が一切ダメな人とはまた違うね

深遠な理由って
暗記でなく独自に考察したことがある人なら
入力に関する色んな問題に気付いているはずなんだが

>>350
printf の逆と言われたときに、無理だろって直感できるかどうかは大事だね
353デフォルトの名無しさん:2010/09/01(水) 23:01:52
scanf("%d", &d); を呪文的に覚えて使うほうが
fgets()を呪文的に覚えるより、学習でいい点があるってこと?
「stdinはあとで説明するから、とりあえず書きなさい」って言われると
混乱して進めなくなるようなのは、&d とかもダメだろ。
354デフォルトの名無しさん:2010/09/01(水) 23:08:33
>>353
fgets だけで %d の代わりはできないだろうがよ
ctrl+d またはエラーまで繰り返す while 文にどれだけの要素が出てくると思う・・・てか知らないのか?
355デフォルトの名無しさん:2010/09/01(水) 23:21:36
>>354
atoi()使えばよくね?
二行目が意味不明。
無限ループってscanf()のほうだろ?
356デフォルトの名無しさん:2010/09/01(水) 23:24:23
やっぱscanf()で教えるのって「いっぱつで文字入力と変換できてちょー便利」程度の話か。
357デフォルトの名無しさん:2010/09/01(水) 23:27:35
ちょー便利なアセンブラだしね
358デフォルトの名無しさん:2010/09/01(水) 23:45:09
atoi(argv[1])で充分。
359デフォルトの名無しさん:2010/09/02(木) 02:10:54
文字認識ってどうやってやるのが一般的なんですか
360デフォルトの名無しさん:2010/09/02(木) 02:44:32
OCRのことか?
361デフォルトの名無しさん:2010/09/02(木) 12:41:31
猫でもわかる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りますが・・・。
362デフォルトの名無しさん:2010/09/02(木) 14:24:09
>>361
OKだよ
363デフォルトの名無しさん:2010/09/02(木) 14:26:54
> 1.優先順位は++と*は同じ。

違うぞ?
364361:2010/09/02(木) 17:19:10
>>362-363

解答ありがとうございます、
解釈了解です!

>> 1.優先順位は++と*は同じ。
>違うぞ?

すみません、見直してみたら前置のインクリメント演算子(つまり、++str)と勘違いでした。
後置、つまりstr++なら間接参照の*より++の方が優先順位は上でした。
なので、解釈そのものは大きく変わらないけど
結合規則による理由ではなく優先順位によるもの、ということになりそうですね。
365デフォルトの名無しさん:2010/09/02(木) 17:33:22
C で円周率の計算にトライしようと考えています。

下のページにルチンの公式を使って C で円周率を計算するプログラムが載って
るんですが、この中の足し算の関数 Add() の処理の一部がわかりません。
http://mailsrv.nara-edu.ac.jp/~asait/c_program/sample0/pi.htm

Add() のコメントの 「以下桁上がりの操作」ってとこで、j = i - 1 ってなっ
てるのはなんででしょう?これだと、i が 0 のときに j が -1 になっちゃう
気がするんですが、これで合ってるんでしょうか?
366デフォルトの名無しさん:2010/09/02(木) 17:50:26
>>365
整数部(つまり 配列index が 0 の値)が桁上がりするような演算を想定していない
演算パッケージなんじゃないの?
367デフォルトの名無しさん:2010/09/02(木) 20:25:30
#defineで定数を定義する時に定数の内容を文字列でなく
変数の要素にしたいのですが何か方法はありませんか?
368デフォルトの名無しさん:2010/09/02(木) 21:16:24
*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
370デフォルトの名無しさん:2010/09/02(木) 21:33:57
>>368
入門編にふさわしいかどうか微妙だけど… 副作用完了点の話で
str++ の位置は q = str; 以降であって 必ずしも *q = c; より前じゃないんでは?
371デフォルトの名無しさん:2010/09/03(金) 09:39:49
渡した引数だけループさせたいのですが、うまくいきませんどこがいけないのでしょうか。

#include <stdio.h>

int main(int a){
int b;
for(b=1;b<=a;b++){
printf("hello world! %d\n",b);
}
return 0;
}
372デフォルトの名無しさん:2010/09/03(金) 09:45:42
>>371
どううまくいかないのさ
373デフォルトの名無しさん:2010/09/03(金) 09:46:09
>>371
int main(int a){
ふざけんな
374デフォルトの名無しさん:2010/09/03(金) 09:47:01
>>368
等価なわけがない
str は w_char* の可能性もあるよ
他にも色々。。。

まぁたまたま同じ結果になることがあると言った程度だろうね
375デフォルトの名無しさん:2010/09/03(金) 09:47:50
#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;
}

これでなんとか
376デフォルトの名無しさん:2010/09/03(金) 09:58:14
>>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;
かな
378デフォルトの名無しさん:2010/09/03(金) 10:28:10
間違った
if( a > 1 ) だ
379デフォルトの名無しさん:2010/09/03(金) 10:36:50
>>377
なら
if (--a) a = atoi(c[0]);
だね
380デフォルトの名無しさん:2010/09/03(金) 11:41:37
だから c[0] は実行形のパスだって
381デフォルトの名無しさん:2010/09/03(金) 12:18:14
>>379
なら
if (--a) a = atoi(*++c);
だね
382デフォルトの名無しさん:2010/09/04(土) 08:09:49
そういう書き方を嫌う現場も有るから改めた方が良いよ
383デフォルトの名無しさん:2010/09/04(土) 12:11:46
>>361
>猫でもわかるC言語プログラミング第二版
プログラミングを始めた時に読んだ本がこれっだったが
普通に難しいと思ったな〜

だから、違う本の方がいいかも
384デフォルトの名無しさん:2010/09/04(土) 19:40:47
猫は、合う人とそうでない人がいるだろうね
まあ猫に限らないけど
385253: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
386デフォルトの名無しさん:2010/09/04(土) 20:03:12
消えろ
387デフォルトの名無しさん:2010/09/04(土) 21:01:38
char buf[256];
fgets(buf, 256, FP);

よくbufとかで、配列を宣言している人がいますが
この配列の長さは、ファイルの読み書きの時間に影響するんですか?
388デフォルトの名無しさん:2010/09/04(土) 21:04:46
読み取るデータ量が大きけりゃそれだけ長くなる
という当然のことを除けば用意するバッファ量は影響しない
389デフォルトの名無しさん:2010/09/04(土) 21:09:58
>>387
DOSの時代のころ、setvbufでバッファのサイズを大きくしたら
かなり読み込みが速くなったけど、windows98くらいのころに同じような
実験をしたら、ぜんぜんかわらなかった。
今の時代OSレベルでバッファリングしてるから、数十キロ程度、まとめて
読み書きしてもあんまりかわないみたい。

setvbuf()で設定したバッファサイズって数十キロ程度だから、数メガ
数十メガ単位ならちがうかもしれんけど、いまIOを速くしようと思うなら
メモリマップドIOとか、非同期IOとか、バッファを広げる以外の
方法を考えたほうがいいだろうね。
390デフォルトの名無しさん:2010/09/04(土) 21:21:12
fgetsのbufと、setvbufは直接関係しない

>>387の疑問は、bufのサイズって大きいとなにかデメリットあるの?
ってことじゃないかと思う。そうなら、デメリットはファイルアクセスの時間というより
メモリがムダに確保されること、とか。
391デフォルトの名無しさん:2010/09/04(土) 21:23:12
> メモリマップドIOとか、

誰か突っ込めよw


> 非同期IOとか、

ボトルネックの解消にはつながりにくいね
392デフォルトの名無しさん:2010/09/04(土) 21:28:37
>>390
> fgetsのbufと、setvbufは直接関係しない

ようは、ちょっとずつ読み込むか、がばっと読み込むかでどうちがうかって質問でしょ。
バッファのサイズでどうちがってくるかって一般化して答えてもぜんぜん問題ない。
393デフォルトの名無しさん:2010/09/04(土) 21:30:49
>>391
いつでも通用するってわけじゃないけど、問題の質によってはゆうこうな方法。
こういう方法も検討したらいいってアドバイス。
394デフォルトの名無しさん:2010/09/04(土) 21:34:55
>>390
> bufのサイズって大きいとなにかデメリットあるの?

たとえばデータのサイズが100バイト単位だったら、100バイト
ごとに読み込むのが素直でコードが書きやすいよな。
setvbuf()とか使わないで自前で大きなバッファをとってバッファリング
して、読み込み速度に差がなかったら、コードが複雑になるので、
それがデメリット。
395387:2010/09/04(土) 23:56:11
char buf[256];
これは、メモリを大量に使うだけであって
全然バッファリングと関係ないんだね

お前ら、ありがとうよ
396デフォルトの名無しさん:2010/09/05(日) 01:17:44
7年ぐらい新人教育やってるけど
一番良い結果を出せるのは自作テキストな気がする。
よほどやる気の無い奴以外は、自分で本を買って家でも勉強するんだよ。
良い本を与えてしまうと、その本だけど済ませようとする奴がたくさん出てくる。
397デフォルトの名無しさん:2010/09/05(日) 01:18:06
すまん完全に誤爆だ
398デフォルトの名無しさん:2010/09/05(日) 05:54:19
>>387
ファイルIOを早くしたいなら、セクタサイズとかセクタ境界を意識する必要はあるけどな。
とくにリムーバブルメディアへの書き込みなんかだと影響が大きい。
399デフォルトの名無しさん:2010/09/05(日) 07:49:27
てす
400デフォルトの名無しさん:2010/09/05(日) 16:46:56
大量のデータを読むならバッファは大きいほうが有利だろうな
read() 内部でのコストは大して変わらんけど read() のコール回数は減るわけだから
401デフォルトの名無しさん:2010/09/06(月) 09:29:46
構造体内の二次元配列を宣言時に初期化したいです。
通常の配列は
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;
}
402デフォルトの名無しさん:2010/09/06(月) 09:38:11
試してないが、これじゃダメかね?
typedef struct{
int bord[3][3];
}CONS;
CONS data = {
{
{0,0,0}, {0,0,0}, {0,0,0}
}
};

ところで最初に構造体変数のビットを全部ゼロに初期化するなら
data = {0,}; ({{0,}}かも)にするか、
あるいはmemsetとか使う手もあるよ。
403401: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;
}
404デフォルトの名無しさん:2010/09/06(月) 10:42:52
data = {0,0,0,0,0,0,0,0,0};
でも通る。
data = {{0,0,0},{0,0,0},{0,0,0}};
だと通らない。
405デフォルトの名無しさん:2010/09/06(月) 11:18:50
その理由は説明できないんだろうな
406デフォルトの名無しさん:2010/09/06(月) 11:20:25
>>404
括弧が足りない
407デフォルトの名無しさん:2010/09/06(月) 11:29:23
だから、、ゼロ初期化なら
data = {0};
でいいって書いてあるだろ。
408デフォルトの名無しさん:2010/09/06(月) 11:44:45
テスト
409デフォルトの名無しさん:2010/09/06(月) 11:50:42
>>407
書いてない
410デフォルトの名無しさん:2010/09/06(月) 13:10:00
>>407
>>401の通常の配列の初期化を見れば、0初期化だけを知りたいわけじゃないと思うのが普通。
411デフォルトの名無しさん:2010/09/06(月) 13:34:29
>>407
うざい
412デフォルトの名無しさん:2010/09/06(月) 17:42:13
C言語やってるとchinchinが伸びるよね
C++ならどんだけ伸びるんだか
413デフォルトの名無しさん:2010/09/06(月) 21:53:14
標準ライブラリの定数の値は規格で定められていますか?
EOFが-1など・・・
414デフォルトの名無しさん:2010/09/06(月) 22:49:04
>>413
ヘッダーで定義されているけど規格ではないと思う
415デフォルトの名無しさん:2010/09/06(月) 23:04:14
規格に書いてるかどうかは規格を見ればいいじゃないか
416デフォルトの名無しさん:2010/09/06(月) 23:20:07
手元のK&R 2nd editionみると、「EOFの値は典型的には-1」とあるけど
−1でなければならないわけじゃないみたい

他の規格は知らない
417デフォルトの名無しさん:2010/09/06(月) 23:34:31
>>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[];"として値をソースファイルで定義すればエラーは消えますが、
そうすると配列の値を各ソース内でそれぞれ定義しなければならず、あまり意味がありません。

ヘッダファイルの中で値を確定させる方法はないものでしょうか?
419デフォルトの名無しさん:2010/09/07(火) 14:53:27
static const int hoge[]={
2, 4, 6, 8, 10, 11, 13
}

にすれば?
変更する代物ならヘッダには宣言だけ書いて
定義は別にする方法を取る必要がある
420デフォルトの名無しさん:2010/09/07(火) 14:55:15
訂正しますこうでしたごめんなさい

static int hoge[]={
2, 4, 6, 8, 10, 11, 13
}

にすれば?
ソースファイル間で共有して変更する代物ならヘッダには宣言だけ書いて
定義は別にする方法を取る必要がある
421デフォルトの名無しさん:2010/09/07(火) 15:00:48
>>420
static つけちゃダメだろ
422デフォルトの名無しさん:2010/09/07(火) 15:05:11
>>418
#if 使いなよ
423デフォルトの名無しさん:2010/09/07(火) 15:16:26
>ヘッダファイル内で"extern int hoge[];"として値をソースファイルで定義すればエラーは消えますが、
>そうすると配列の値を各ソース内でそれぞれ定義しなければならず、あまり意味がありません。
意味がないですか?
424デフォルトの名無しさん:2010/09/07(火) 15:36:40
>>418
>ヘッダファイル内で"extern int hoge[];"として値をソースファイルで定義
普通そうやる。

>そうすると配列の値を各ソース内でそれぞれ定義しなければならず、あまり意味がありません。
定義は一箇所だけ。ソースそれぞれでやったらヘッダでやるのと同じ。
#include "foo.h"ってのは、この1行をfoo.hの中身で置き換えるだけだよ。
425418:2010/09/07(火) 15:47:10
レスdです
この大域配列は実際にはもっとサイズ大きくて、プログラム内では値は書き変えませんが
実験の為自分で値を色々変えながらコンパイルし直すのです
その度に全ソースの値書きなおしになり、ひとつのソースファイルで修正忘れ、などを防ぐために
ヘッダファイル内で一括で定義できないかと思ったのですが。
#if使うのはいいかもしれないです。
426デフォルトの名無しさん:2010/09/07(火) 15:51:26
stdio.hが何回インクルードされても
実質的にコンパイラが解釈するのは
ただ一回

このトリックを使うんじゃ?
427デフォルトの名無しさん:2010/09/07(火) 16:09:53
>>425
グローバル変数なんだし実体としての器はプログラムで唯一だと思うけど?
(static 変数なら、ファイル毎に実体は個別になるから、そういう話になるけどね)

ヘッダは extern int hoge[];
グローバル変数の本体(任意の 1ファイル: 仮にA.c)に

int hoge[] = { ...................... };

これだと実体の修正は A.c のみだよ
428デフォルトの名無しさん:2010/09/07(火) 16:19:59
>>426
お前は黙れ低能
429デフォルトの名無しさん:2010/09/07(火) 16:26:00
430デフォルトの名無しさん:2010/09/07(火) 16:29:05
>>429は間違いです
>>427さんありがとうございます
確かにその通りなのですが、実行ファイルも複数作っているのです
つまり同じ大域配列を利用した、複数の実行プログラムがあり、
それぞれで値を定義しなければいけないとこういう訳です
431デフォルトの名無しさん:2010/09/07(火) 16:31:24
変数用のソースファイル用意すればいいんじゃね?
432デフォルトの名無しさん:2010/09/07(火) 16:43:35
> 複数の実行プログラム

だったらファイルでしょ
433432:2010/09/07(火) 16:44:14
データファイルのことね
434デフォルトの名無しさん:2010/09/07(火) 16:45:48
>>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 以外)
こういう管理の仕方
435デフォルトの名無しさん:2010/09/07(火) 16:49:01
ライブラリをつくればいいと思う。
436デフォルトの名無しさん:2010/09/07(火) 16:52:22
!!
変数用のソースを作ればいいというのは思いつきませんでした
それは名案かも。ありがとうございます
丁寧な回答ありがとうございます
437デフォルトの名無しさん:2010/09/07(火) 18:02:35
依存性注入?
違うか。
438デフォルトの名無しさん:2010/09/07(火) 18:08:20
int型の変数に0から3までの値をランダムに格納したいのですがどうすればできますか?
439デフォルトの名無しさん:2010/09/07(火) 18:19:33
・int 型変数 a に乱数(0〜3) を代入

・int 型配列の 0〜3番目の要素(乱数で決定)に値を代入

・int 型配列の各要素に乱数(0〜3) を代入
 1度登場した値を2度以上使ってよいのか?

・代入操作をする・しないの決定をランダムに行う

日本語難しいぞー
440デフォルトの名無しさん:2010/09/07(火) 18:28:31
>>438
int a = rand() % 3;
441デフォルトの名無しさん:2010/09/07(火) 18:29:16
>>440
int a = rand() % 4;
だ、失礼!
442デフォルトの名無しさん:2010/09/07(火) 18:41:04
ある範囲でランダムな変数を rand() から作るのに、剰余演算子 % をつかうのはどうのこうのうんぬん
http://www.kouno.jp/home/c_faq/c13.html#16
443デフォルトの名無しさん:2010/09/07(火) 18:41:49
C99ならそれでもおkだな
444デフォルトの名無しさん:2010/09/07(火) 18:45:03
釣り堀
445デフォルトの名無しさん:2010/09/07(火) 18:59:08
入門編だしそれでいいんでないの、
議論してるとそのうち完全な乱数でない云々とかに発展しそうな気がするw
446デフォルトの名無しさん:2010/09/07(火) 19:03:28
どうせ教えるならついでに教えといて損は無い
447デフォルトの名無しさん:2010/09/07(火) 19:30:19
現在のrand()は下位ビットも十分ランダムだから剰余を使ってもいいと思う
448デフォルトの名無しさん:2010/09/07(火) 19:35:25
「アラインメントは2のべき乗である」って本当ですか?
449デフォルトの名無しさん:2010/09/07(火) 19:37:02
2のべき以外のアラインメントなんか使う理由がないから、まぁそうなりますね
450デフォルトの名無しさん:2010/09/07(火) 19:52:15
>>447
どっかのゲームは自作乱数ルーチン作って自爆してたしな。
素直に%でいいな。
451デフォルトの名無しさん:2010/09/07(火) 20:50:55
>>447
その、今の rand() とは、いったいどんなアルゴリズムを使っているのですかね?
452デフォルトの名無しさん:2010/09/07(火) 20:52:37
>>450
すなおに使うとなきますよ。
http://www.kouno.jp/home/c_faq/c13.html#16
453デフォルトの名無しさん:2010/09/07(火) 20:56:48
乱数を得る手段として
アルゴリズム解法で メルセンヌツイスタ や
ホワイトノイズ→AD変換からというデバイス由来という手法が
実在しているのは知っている

標準関数である rand() の現在の実装がどうなんてるのか知らない

>>443 C99 だと実装推奨の手法が規定されてる?
454デフォルトの名無しさん:2010/09/07(火) 21:00:57
>>452
いやそれ、80年代に書かれたやつでしょ。
下位ビットの周期が極端に短い処理系なんて90年代の前半ごろには
絶滅してる。

qsort()はデキがわるいことがあるから気をつけろみたいなアドバイス
する人はすっかり見なくなったのに、rand()のほうはいまだにそう
言う人が多いのってなんでだろうね。
455デフォルトの名無しさん:2010/09/07(火) 21:04:14
>>451
VisualStuio2010のrand()みてみたら線形合同法。
下位ビットでも周期が数万だから、ゲームとか初心者が
練習に使う分には十分だね。
456デフォルトの名無しさん:2010/09/07(火) 21:12:57
線形合同法って下位ビットのランダム性が低いアルゴリズムじゃなかったっけ
VSだとある程度切り捨ててたはずだけど
457デフォルトの名無しさん:2010/09/07(火) 21:18:42
>>456
内部は32ビットで計算して、上位16ビットを乱数として返してるね。
だから下位ビットではない。
ま、その16ビットからさらに上位ビットを使えば周期は長くなるけど、
rand()ですむような用途なら%Nでもほとんど大丈夫でしょ。
458デフォルトの名無しさん:2010/09/07(火) 21:46:13
>>454
下位ビットの周期性の話ではないが、
実験で gcc の rand() を使ったことがあったが結構偏りがあったので、wichmann-hill を代替に使用したことがある。
rand() を信用しないほうがよいのでは。線形合同法ならばなおさら。
459デフォルトの名無しさん:2010/09/07(火) 21:48:07
>>455だとまるで線形合同法だから十分って感じに見えたから
下位16ビットを捨ててるから十分って説明なら問題ないです
460デフォルトの名無しさん:2010/09/07(火) 21:53:42
>>454
qsortは遅いだけでソートされるけど、
ランダムを期待して周期的だと致命的だからじゃね?

ちなみに90年代後半のFreeBSD2.2.xのgccは、rand()%4すると
1、2、3、4が繰り返されるクソrand()だった。
時期が引っ掛かっただけて、大筋否定する気ないけど、
知識として知っておくのは悪くないと思うね。
地雷に当たって知らんと死ねる。
461デフォルトの名無しさん:2010/09/07(火) 21:54:15
>>458
rand()の下位をとるか上位をとるかって話なら、
そんなん気にしないでrand()%Nで十分でしょって話。

rand()が使えないような用途なら、上位から取るとかって話じゃ
なくて使わないって話になる。
当たり前だけど。
462デフォルトの名無しさん:2010/09/07(火) 21:56:27
>>460
Solarisでもそんな話し合ったな。
unix系はしょうがねえな。
463デフォルトの名無しさん:2010/09/07(火) 22:01:01
%N (N が 2の累乗数) という特殊性もあるし


度数分布とれば偏りは見つかりそうだけど
周期性があるかどうかの検証もいやらしいな
サンプル数を多くとって、自己相関算出してみるぐらいなのかね?
464デフォルトの名無しさん:2010/09/07(火) 22:09:02
オブジェクトファイルが1個以上集まって、実行ファイルができる?と思っているのですが
おk?
そして、実行ファイルを解凍みたいな処理をすると、オブジェクトファイルを取り出す事が出きるのですか?
465デフォルトの名無しさん:2010/09/07(火) 22:14:17
M$の次期EXE形式、RE形式(Removable Executable Foirmat)なら
出来るかも
466デフォルトの名無しさん:2010/09/07(火) 22:17:39
どこがC言語だ
467デフォルトの名無しさん:2010/09/07(火) 22:36:13
>>465
ポインタください。どうもみつからなくて。
468デフォルトの名無しさん:2010/09/07(火) 23:01:32
PSPで
rand()%2
をぐるぐる回したら
0101010101010101010
ってなりました。これはダメな処理系ですか?
469デフォルトの名無しさん:2010/09/07(火) 23:51:07
>>468
速度優先・大量のデータを吐くための rand() だったということで。
470デフォルトの名無しさん:2010/09/08(水) 00:26:53
http://codepad.org/t0gqqFYx
gcc -O2 なら通るのですが、-O3以上では Error: symbol `_sse_memcpy128_L1' is already defined となります。

インラインアセンブラでのラベルのバッティングを防止する良い記法を教えてください。(gccなら方言でもかまいません)
471デフォルトの名無しさん:2010/09/08(水) 00:53:07
1:
(中略)
loop 1b
にするのかな
472デフォルトの名無しさん:2010/09/08(水) 01:54:24
>rand()
マトモな擬似乱数が欲しければrand()なぞ使うな、ということじゃないかな。

>470
インラインじゃなきゃダメなの?
sse_memcpy128.sを別に作ってgccに食わせてもいい気がするんだけど。
473デフォルトの名無しさん:2010/09/08(水) 12:32:20
結局乱数生成はrand()%Nでおkなの?
474デフォルトの名無しさん:2010/09/08(水) 12:33:37
質を問わないならおk
475デフォルトの名無しさん:2010/09/08(水) 12:35:23
十分ランダムである必要がある場合は?
476デフォルトの名無しさん:2010/09/08(水) 12:43:44
その場合、乱数の性質について何の保証もないrandは使用不可
477デフォルトの名無しさん:2010/09/08(水) 12:45:13
あとで差し替えられるようにしてrand使っとけばいいんじゃね?
478デフォルトの名無しさん:2010/09/08(水) 12:46:11
>>475
メルセンヌツイスタおすすめ
479デフォルトの名無しさん:2010/09/08(水) 12:50:08
MTは遅いからXorShiftお勧め
480デフォルトの名無しさん:2010/09/08(水) 12:51:57
どんなに頑張ってもしょせん疑似乱数
ケチつけたい奴を黙らせることは不可能なので
使う者にとって気の済むものを作って使えばいい
481デフォルトの名無しさん:2010/09/08(水) 17:13:31
ここで聞いていいのだろうか…。
問題なく動かせたプログラムの構造体
#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^)\
グーグル先生に聞いてもいまいち何が悪いのかわからんちん
482デフォルトの名無しさん:2010/09/08(水) 17:15:55
サイズが多すぎるんじゃね
483デフォルトの名無しさん:2010/09/08(水) 17:16:20
エラーの内容は?
484デフォルトの名無しさん:2010/09/08(水) 17:16:48
サイズが多すぎるんじゃね
mallocで確保するかグローバル変数にしたらいいんじゃね
485デフォルトの名無しさん:2010/09/08(水) 17:20:25
もっと状況を詳しく。エラーって?
486デフォルトの名無しさん:2010/09/08(水) 17:21:07
環境とか処理系とかエラー内容とか、エラーが出るソースがわからんと・・・
いくつか理由は考えられるが、みんなが言ってるサイズの可能性は高いかな。
16ビットのコンパイラか、この構造体の大きな配列をローカル変数で取ってるとか無い?
487デフォルトの名無しさん:2010/09/08(水) 17:21:25
>>482
>>484
短絡的な思考しかできない奴
488デフォルトの名無しさん:2010/09/08(水) 17:24:04
>>487
お前俺が正解だったら土下座な?
489デフォルトの名無しさん:2010/09/08(水) 17:26:10
なんという回答速度
回答の意味すらまともに理解できないレベルなのですみません。
エラー内容はよくわからず。
とりあえずmallocで確保するの試してみます。

>>486
ローカル変数で取ってました
490デフォルトの名無しさん:2010/09/08(水) 17:30:20
コンパイラ何よ?
LSI-C86試食版とか
491デフォルトの名無しさん:2010/09/08(水) 17:32:52
エラーメッセージが出るなら、それをそのままコピペしてくれればいい
分かる奴には分かる……かもしれない
492デフォルトの名無しさん:2010/09/08(水) 17:35:53
>>490
学校のPCに入ってたvs2008使ってます

>>491
言い方がまずかったよう。途中で停止するだけでエラーメッセージは無です
493デフォルトの名無しさん:2010/09/08(水) 17:38:55
IDEの誤操作によりブレークポイント入れてしまったとか
ありがちw
494デフォルトの名無しさん:2010/09/08(水) 17:44:16
コンパイル時エラー無し で 実行時に落ちる

プリコンパイルヘッダの対象になってた とか?
うまく依存関係手繰れてなくて、再コンパイルが必要なソースのコンパイルがなされていない可能性
リビルドしてみて
495デフォルトの名無しさん:2010/09/08(水) 17:46:54
ある意味言えるかも
「C/C++の場合いきなりの初心者はIDE使うな」
496デフォルトの名無しさん:2010/09/08(水) 17:48:03
コードの修正をミスって、変なところにアクセスしてるとか。
>>492
再現性100%なら、デバッガをつかって問題がおきてる箇所を
特定するのは難しくないと思うけど。
497デフォルトの名無しさん:2010/09/08(水) 17:51:22
せっかくそんないい環境使ってんだから
ググるまえにステップ実行でもしてみようぜ
498デフォルトの名無しさん:2010/09/08(水) 17:51:53
malloc使ったら普通にいけました。
使ったことなかったものでorz
宣言したら確保してくれるのに、mallocって何に使うんだろうレベルでした。生きててすみません。
お騒がせしました。回答ありがとうございました。
499デフォルトの名無しさん:2010/09/08(水) 17:52:06
>>495
C/C++の場合は言えてるがJavaとかC#とかだったら
IDEから入ったほうがいいと思う。C/C++は例外的に
IDEと相性が悪い
500488:2010/09/08(水) 17:55:00
>>487
>malloc使ったら普通にいけました。
わしの正解やないか、どないしてくれんねやおのれはいてまうぞこら
501デフォルトの名無しさん:2010/09/08(水) 17:57:01
高々40KBのデータでスタックが溢れるなんて普通ないよね
大きな配列でも取ってたのかな
502デフォルトの名無しさん:2010/09/08(水) 17:59:12
再帰深すぎでスタックあふれる という実行時じゃないと不明なケースはおいといて
変数定義の段階でスタックあふれるのも リンカの設定次第だからコンパイル時には分からないのか…

スタックオーバー落ちって何らかのヒント出さなかったっけ? (VS2008 環境)
503488:2010/09/08(水) 18:04:20
>>487
>malloc使ったら普通にいけました。
おいどんの予想があたっとろうが。どうしてくれるとかきさんはくらすぞ
504デフォルトの名無しさん:2010/09/08(水) 18:05:07
>>500
ほんと短絡思考しかできない奴だな
505デフォルトの名無しさん:2010/09/08(水) 18:18:17
潜在してたバグが配置変わったせいで出てきてたのかもしれんぞ

試しにスタックあふれのコード実行したらデバッグなら
0xC00000FD: Stack overflow
で止まったけど、デバッグ無しだと停止しました、のダイアログだけだな・・・
506デフォルトの名無しさん:2010/09/08(水) 18:21:12
ソースあぷれや
507デフォルトの名無しさん:2010/09/08(水) 18:23:08
>>498
念の為言うけど、mallocしたらfreeは忘れないようにね


↓以下NT系なら解放いらない〜とかめんどいからRAIIに〜とか禁止
508デフォルトの名無しさん:2010/09/08(水) 18:43:05
今の開発環境でもスタックサイズはせいぜい1MBくらいだろ
そこに変数だけで1KB以上の領域を使おうと思う方がどうかしてる
スタックはオート変数のみに徹底しておけ
ただでさえ関数呼び出しのたびに消費されるんだから
509デフォルトの名無しさん:2010/09/08(水) 18:50:54
510デフォルトの名無しさん:2010/09/08(水) 18:56:39
>>508
4kbのオート変数とか普通に使うよね
511デフォルトの名無しさん:2010/09/08(水) 18:57:34
>>509
そこがおまえの巣か
出てくんなよド低脳w
512デフォルトの名無しさん:2010/09/08(水) 18:59:12
低脳であるということは自覚ないんだ?
513デフォルトの名無しさん:2010/09/08(水) 20:17:47
Windows7  Borland C++ 5.5.1環境で、
特定のホストにPingを打ち、正常なら処理を終了
以上なら数分後に再度Pingというプログラムが欲しいのですが、どう実装していいのかわかりません。
Linuxのコードはあるようですが、Windowsでどうしたらいいか、教えてください。
514デフォルトの名無しさん:2010/09/08(水) 20:23:49
ボーランド大人気だな。
515デフォルトの名無しさん:2010/09/08(水) 20:30:52
>>501
node_dataの配列作ってんだろ
516デフォルトの名無しさん:2010/09/08(水) 20:43:48
>>513
while (system("ping -n 1 127.0.0.1") != 0) {
Sleep(60000);
}
517デフォルトの名無しさん:2010/09/09(木) 02:21:19
>>513
先ずは何「以上」なのか説明してもらおうか。
518デフォルトの名無しさん:2010/09/09(木) 05:55:05
ffmpegの使い方調べたいんだけど、
参考になりそうなffmpegを使ったオープンソースのメディアプレイヤーってある?
できるだけシンプルな奴がいいんだけど。。
519デフォルトの名無しさん:2010/09/09(木) 09:23:53
コマンドのffmpeg
520デフォルトの名無しさん:2010/09/09(木) 16:56:41
コンパイラについてなんですが
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;
}
521デフォルトの名無しさん:2010/09/09(木) 17:01:59
gcc: CreateProcess: No such file or directory
でググるといろいろわかるみたいだぞ。
binにソースを置いてるようじゃ、この先も苦労しそうだな。
522デフォルトの名無しさん:2010/09/09(木) 17:09:00
>>520
カレントディレクトリとか聞いたことないか?
諦めてVC++でも入れろカス
523デフォルトの名無しさん:2010/09/09(木) 17:45:17
>>521
binにソースを置いたのは、binでコンパイルして成功したら環境変数を設定しようと思ってたからです
ググッたんですけど、あんまりわかりませんでした・・・

>>522
もちろん、C:\MinGW\で実行しましたよ
今までbcc32でコンパイルしてたので、やり方が同じなら間違わないと思います
VC++、試してみます
524デフォルトの名無しさん:2010/09/09(木) 17:48:26
Linuxがいいよ。最初から全部開発環境入ってるよ。cygwinでもいいよ
525デフォルトの名無しさん:2010/09/09(木) 17:49:47
>>523
やっぱ間違ってんじゃねーかwwwwwww
526デフォルトの名無しさん:2010/09/09(木) 17:52:20
gcc からプリプロセッサやらコンパイラの実体とか呼び出すんで
それらの環境がおかしいPATH通ってないかファイル名が違うと
CreateProcess: No such file or directory
が出るみたいよ。まあ他も試せるならそっち使った方がいいな
527デフォルトの名無しさん:2010/09/09(木) 18:04:08
ああ
gcc内部で CreateProcess 使ってて(fork の代用?) その段での呼び出しエラーを報告してるのか
528デフォルトの名無しさん:2010/09/09(木) 18:37:03
>>523
ソースをMinGW\binに置いてカレントがMinGWなら
gcc bin\test.c
だろ
529デフォルトの名無しさん:2010/09/09(木) 18:44:26
>>525
>>528
ごめんなさい、c:\mingw\binでgcc test.cです
530デフォルトの名無しさん:2010/09/09(木) 18:50:48
この段階の子に MinGW は手に余るだろ
2つの OS の癖を同時に憶えるのは過負荷だよ
これは cygwin でも基本同じこと

どうしても gcc にこだわるなら Linux 専用機を用意した方がいい
VM でなく実機で
531デフォルトの名無しさん:2010/09/09(木) 18:59:48
インスコでつまずく罠
532デフォルトの名無しさん:2010/09/09(木) 19:13:57
インストーラ起動してcoreパッケージとCパッケージ入れてパス通したら終わりだろ
どこに躓く要素があんだよ
533デフォルトの名無しさん:2010/09/09(木) 19:41:22
CoreパッケージとかCパッケージとか何の話?
MinGW?
534デフォルトの名無しさん:2010/09/09(木) 21:06:49
Turbo C 2.01 使えよ。
535デフォルトの名無しさん:2010/09/10(金) 03:04:33
コンパイルしたバイナリをテキストエディタで開くと、
コード上の文字列が読めるんだけど、見えなくする方法ないの?

536デフォルトの名無しさん:2010/09/10(金) 03:21:25
開くな
見るな
覗くな
暗号化
気にするな
537デフォルトの名無しさん:2010/09/10(金) 03:40:17
>>535
zipexe とか upx とかなら頭をひねらなくても大丈夫w
538デフォルトの名無しさん:2010/09/10(金) 04:43:00
もしかしてデバッグビルドの埋め込み情報のこと言ってたりして。
539デフォルトの名無しさん:2010/09/10(金) 05:51:13
てs
540デフォルトの名無しさん:2010/09/10(金) 06:06:54
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);
}
541デフォルトの名無しさん:2010/09/10(金) 06:08:58
長すぎるようなので分割しました。
先ほどの続きとなります。

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);
}

以上です。警告文の解決策ともし間違っている部分があればご指摘お願い致します。
542デフォルトの名無しさん:2010/09/10(金) 06:16:11
設計からやり直したほうが良いよ。
543デフォルトの名無しさん:2010/09/10(金) 06:37:42
>>540
>10個の3文字英単語をアルファベット順に並び変える

これはどういうことがしたいの?
bad cow ank def don...
これ↑を、
1:ank bad cow def don...
こうしたいのか、
2:abd cow akn def dno...
こうしたいのか、どっち?
544デフォルトの名無しさん:2010/09/10(金) 06:40:46
>>542
設計ですか・・・

>>543
1のほうです
545デフォルトの名無しさん:2010/09/10(金) 06:59:21
ポインターも配列も正しく使えてないな。
1度に色々なことをやろうとせずに、単純化して1つずつやっていった方がいいよ。
とりあえず、3文字の単語じゃなく、1文字だけのをソートしてみたら?
546540-541:2010/09/10(金) 07:13:14
>>545
ポインタも配列も正しく扱えてないですか・・・
1文字ずつですか・・・上でやってみましたが結果は同じでした・・・
どこがおかしいか全く見当もつきません・・・
547540-541:2010/09/10(金) 07:23:52
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])
で解決しました。
548540-541:2010/09/10(金) 07:26:05
エラーが全部解決したかと思ったらセグメンテーション違反になりました・・・
549540-541:2010/09/10(金) 07:37:57
すみません、全く違うことしてました・・・。
550デフォルトの名無しさん:2010/09/10(金) 07:42:06
どこから突っ込んだら良いのか分からんけど
malloc使わんとダメなの?
全部配列にしたら?
551デフォルトの名無しさん:2010/09/10(金) 07:47:17
とりあえず、設計云々前にエラーを指摘しとく
>>547の修正後の話

・char *s2にfgetsで10バイト読み込んでるけどメモリ確保していない
・sortting関数で受け取ってるwdは[10][4]の40バイトなのに渡されてるのは10バイトのデータ
・データコピーによる交換かポインタのポインタで交換かによって違ってくるけど、
>>547のswap(&wd[i]〜はポインタのポインタで交換しようとしてる
552デフォルトの名無しさん:2010/09/10(金) 07:55:52
>>550
http://u8.getuploader.com/vipprog/download/658/tes.c
こんな感じですかね・・・これでセグメンテーション違反ですが・・・
553デフォルトの名無しさん:2010/09/10(金) 07:59:03
なんで char s1[10][4],s2[10][4];
なにに s1[10]にアクセスしてんだよ死ね
554デフォルトの名無しさん:2010/09/10(金) 08:06:10
>>553
すみません・・・・。
555デフォルトの名無しさん:2010/09/10(金) 08:17:40
>>553
生きててすみません。でも、真理にたどり着いてから死にたい。
556デフォルトの名無しさん:2010/09/10(金) 08:25:41
>>552
本当に一度初心者用の教本からやり直した方がいいんじゃないかってぐらい
あちこちおかしい

確保してないただの未初期化のポインタに書き込もうとしたり
配列を渡すときもめちゃくちゃだし
557デフォルトの名無しさん:2010/09/10(金) 08:31:08
ttp://codepad.org/6bNEydYX
こいうことでいいのか?
558デフォルトの名無しさん:2010/09/10(金) 08:40:21
>>557
そういうことであってます・・・。お手数掛けて申し訳ありません。

再度、参考書等を読み直して1から自分で作ってみようと思います。
ぐちゃぐちゃなプログラムをお見せして申し訳ありませんでした。

また、質問に回答してくださった方々、ありがとうございました。
精進します・・・。
559デフォルトの名無しさん:2010/09/10(金) 08:42:50
ぐちゃぐちゃでも良いんじゃないかな、添削する分には面白いしw
560デフォルトの名無しさん:2010/09/10(金) 08:46:54
多くの失敗を繰り返しながら上達して行くんだから問題ないよ
失敗しているってことは、実践しているってことなんだからね
頑張って
561デフォルトの名無しさん:2010/09/10(金) 13:03:12
コンパイルする時にちゃんとワーニング全部出す設定にすべし
562デフォルトの名無しさん:2010/09/10(金) 13:14:18
ウォーニングな
563デフォルトの名無しさん:2010/09/10(金) 13:21:44
いやwarningだろ
564デフォルトの名無しさん:2010/09/10(金) 16:43:18
いやVC++の/Wallは常用できない
565デフォルトの名無しさん:2010/09/10(金) 17:12:37
口数が多いくせに大事な一言がないか頓珍漢というのはお約束だね
566デフォルトの名無しさん:2010/09/10(金) 18:16:21
いずれ>>558がおまえらをぶっちぎりで追い抜くよw
567デフォルトの名無しさん:2010/09/10(金) 18:18:03
568デフォルトの名無しさん:2010/09/10(金) 21:30:28
ヨーロッパ人は英語由来のコンピュータ用語でも平気で
自国語の読みをしてるよ。
日本人ならローマ字読みでワーニングだろ。
英語に近いほうがかっこいいとか、植民地根性すぎる。
569デフォルトの名無しさん:2010/09/10(金) 21:46:03
フランスを知らんな?あちらはマウスでさえ自国の呼び名があるんだぜ?
570568:2010/09/10(金) 21:51:49
>>569
まあ、実は、ヨーロッパのことなんか何にも知らなくて適当に
思いつきで言ってるだけなんだけどな。
571デフォルトの名無しさん:2010/09/10(金) 21:58:25
>>568
なんで「警告」って言わないの? もう占領軍はいないんだよ。
572デフォルトの名無しさん:2010/09/10(金) 22:06:37
?とかも欧州の言語から取り入れたものだろう
warningも日本語の一部として取り入れられたんじゃないか?
573デフォルトの名無しさん:2010/09/10(金) 22:10:01
いちいちウォーニングとか訂正いれてる連中だって、
mainはメインなのにmailはメールとか、それ以外のカタカナは
ぜんぜん不統一なんだろ。
574デフォルトの名無しさん:2010/09/10(金) 22:10:26
メーンエベント
575デフォルトの名無しさん:2010/09/10(金) 22:20:00
アイロンとかな

けど多くは他の国の読み由来のなのかもしれない
ウィルスとか
576デフォルトの名無しさん:2010/09/10(金) 22:28:44
医学関係はドイツ
577デフォルトの名無しさん:2010/09/10(金) 23:00:27
ヴァイラスって書いているなぁ。
でも、メイラーと書く割にはつい、メールと書いている事実。
某所で「チェインメイル」「鎖帷子か?」の遣り取りが頻発した所為かも知らん。
578デフォルトの名無しさん:2010/09/10(金) 23:22:50
どーでもいーわ
コードの質とは全然関係ない
579デフォルトの名無しさん:2010/09/10(金) 23:40:50
ここはどこ?わたしはだれ?
580デフォルトの名無しさん:2010/09/10(金) 23:42:58
我々はボーグだ
581デフォルトの名無しさん:2010/09/10(金) 23:43:01
ワーニングとか言ってるやつ、コードの質が低そう。
582デフォルトの名無しさん:2010/09/10(金) 23:45:30
>>577は黙ってていいからね
583デフォルトの名無しさん:2010/09/11(土) 00:01:56
俺はウォァーニングみたいなどっちにもとれるような発音してる
584デフォルトの名無しさん:2010/09/11(土) 00:02:11
>>581
低【そう】ってどういうこと?
断言できない奴こそどこを見てものを言ってるのか疑問だぜ
585デフォルトの名無しさん:2010/09/11(土) 00:06:41
自分のコード見てんだろ
586デフォルトの名無しさん:2010/09/11(土) 00:11:07
ワーニングとか言ってる連中は例外なく質の低いコードを書く。
「低そう」とか言って断言できないって、観察力無さ杉。

ってことか。
なるほど。
587デフォルトの名無しさん:2010/09/11(土) 00:20:32
観察力が高い方が例外も発見できる訳で、
断言できない方が観察力低いとは言い切れないだろう
サンプル数がいくら多くてもたった1つの例外を見つけてしまうと断言できなくなってしまうわけだから
588デフォルトの名無しさん:2010/09/11(土) 00:47:21
>>585
ご愛敬ってとこでいいかな

>>586
なるほど、ワーニングという発音を見てものを言っているのか、よくわかった

>>587
まあどんなに周りがよくてもたった1つのバグで評価は最低にされちまったりするが
「高い観察力」を持つといいながら具体的な指摘/対策をしない(できない)奴はダウトだろ
589デフォルトの名無しさん:2010/09/11(土) 00:56:28
まあでも、会話してて相手が「ワーニング」とか言ったら、うゎって思うよな。
590デフォルトの名無しさん:2010/09/11(土) 01:09:34
ハードディスクをメモリと呼ぶ人とか、ページングとスワッピングを混同しているメーカーのSEとか、
【固体】識別番号とおっしゃるごにょごにょとか色々いるわけで
海千山千相手のお仕事で言葉尻に留意するのはともかく、過敏反応で墓穴を掘ったらそいつら以上の赤っ恥を晒すことになる
591デフォルトの名無しさん:2010/09/11(土) 01:25:28
ハードディスクはメモリの一種だし
592デフォルトの名無しさん:2010/09/11(土) 01:43:42
warningを日本語に翻訳すると「ワーニング」「ウォーニング」という言葉になるってだけだよ。グジャグジャ言うことじゃない。

dogなら「いぬ」「〜けん」というのと同じ。言語が違えば違う音になるし、単語同士が1対1に対応するわけでもない。
593デフォルトの名無しさん:2010/09/11(土) 01:50:50
>>590
ページングとスワッピングか‥‥。調べてみるとはっきりとは区別してなかったな。勉強になった。
594デフォルトの名無しさん:2010/09/11(土) 01:52:11
わーにんぐ、はやっぱり恥ずかしいなあ。
でも、めーんてなんす、も昔は恥ずかしかったけれども、最近はそうでもなくなったなあ。
595デフォルトの名無しさん:2010/09/11(土) 01:56:51
   〜∞
          彡川川川三三三ミ〜
      プーン  川|川\  /|〜
          ‖|‖ ◎---◎|〜
          川川‖    3  ヽ〜  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
          川川   ∴)〆(∴)〜 <   ウォーニング
          川川      〜 /〜 |
          川川‖    〜 /‖〜  \______________
         川川川川   (⌒)川‖〜 ヴィシッ!
        //::::::::|-、 ,-/::::::ノ ~.レ-r┐
       / /:::::::::::|  /:::::ノ__ | .| ト、
       | /:::::::::::::::| 〈 ̄   `-Lλ_レ′
596デフォルトの名無しさん:2010/09/11(土) 02:13:27
ウァーキング!
597デフォルトの名無しさん:2010/09/11(土) 03:23:12
プログラム系の会社でアルバイトしようと思ってるんだが
どの程度プログラム書ければ良いんだ…ワカンネ…
募集かけてるくせに、そういうことをあまり記載してないのってどうなの…
598デフォルトの名無しさん:2010/09/11(土) 03:30:43
んじゃ問題
10チーム(T1,T2,...,T8)でトーナメントを行う
時の勝敗樹状図をすべて書き出すプログラム
599デフォルトの名無しさん:2010/09/11(土) 03:32:11
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
悲しくなってきたわ
602デフォルトの名無しさん:2010/09/11(土) 03:56:44
この問題に対しては、
先ず「勝敗樹状図」と「すべて」の定義を聞くことが正解だろうな。

理解できずに(そもそも十分な情報が与えられていない要求に対して)いきなりプログラムを書き始めるのは明らかに間違い。
603デフォルトの名無しさん:2010/09/11(土) 04:00:15
勝敗じゅじょうぢゅってなに
604デフォルトの名無しさん:2010/09/11(土) 04:32:59
再帰で分割してくだけで解けるだろ
605デフォルトの名無しさん:2010/09/11(土) 04:45:33
10チームの順位が与えられたとして
起こりえる、試合のセットを列挙するって
方針はどう?
1位T1 2位T2 3位T3 4位T4
(T1,T4) (T2 T3) (T1 T2) (T3 T4)
606デフォルトの名無しさん:2010/09/11(土) 05:01:40
>>602の意味が理解出来ない知障がドヤ顔でレスしてるのか
終わってるなこのスレ
607デフォルトの名無しさん:2010/09/11(土) 05:21:04
プログラマたるもの、もう少しプログラムを「生き物」のように
扱いたいものですな。完全な理解と完璧な要求定義がないと
何も書けないというのはプログラマじゃなくて単なるコード屋
という誹謗も耳にすることがあります。
608デフォルトの名無しさん:2010/09/11(土) 07:09:43
コーダはコーディングだけしてれば良いんだよ
609デフォルトの名無しさん:2010/09/11(土) 07:33:46
ライブラリ内にあるa()の関数内のbの変数をどうにかして変更したいんですが
どうすれば良いですか?
javaとかのsetbメソッドみたいにしたいです

void a() {
 static int b;
}
610デフォルトの名無しさん:2010/09/11(土) 08:27:22
関数a変更しないでやれと言われれば
全く保証がないが、static変数はデータ領域に配置されてるので
他のデータ領域にある変数のアドレスがえられるならそれをずらせばアクセス出来るよ
611デフォルトの名無しさん:2010/09/11(土) 08:38:18
そういう回答を期待したレベルの質問には思えない…。
612デフォルトの名無しさん:2010/09/11(土) 08:45:08
ではやりたい事をなるべく考慮してみようとすると
変数は構造体にまとめて
その構造体名_set_変数名の関数用意するとかすればいいんじゃないの?

よりクラスっぽくするキモいテクニックもあったような気がするけど

つか関数に置いた変数にアクセサってひょっとしてJavaじゃなくてjavascriptだったりするのか?
613デフォルトの名無しさん:2010/09/11(土) 09:05:03
Cのルール内では不可能だな。当たり前だが。
614デフォルトの名無しさん:2010/09/11(土) 10:51:33
>>597
データ構造は配列。
アルゴリズムはリニアサーチ。

この二つだけ知っていれば業界は渡っていける。

615デフォルトの名無しさん:2010/09/11(土) 10:53:36
渡ってはいけるだろうが...メンヘル板の住人になる確率も大
616デフォルトの名無しさん:2010/09/11(土) 11:05:16
その手の資格持ってればいいだろ
617デフォルトの名無しさん:2010/09/11(土) 11:05:48
C言語で平均50行以内で書ける程度のプログラムが作れること
SQLがわかり、少しはかけること
HTMLも少しは出来ること
一般教養試験(SPI)で行う程度の数学が出来ること
あとは面接での心理検査で適正を見る

こんなところか?
618デフォルトの名無しさん:2010/09/11(土) 11:06:48
10チームだとどこをシードにして何試合パスさせるとかも考えないといけない
某漫画みたいなすごい偏ったトーナメントもありだと微妙に面倒だよね
この辺はっきりさせないと問題として不十分でしょ
619デフォルトの名無しさん:2010/09/11(土) 11:10:53
Web系だろうからCが全然ありがたくない件
620デフォルトの名無しさん:2010/09/11(土) 11:13:31
最初からJavaScriptやJavaが妙に出来る新人も
なんだか信用したくない件
621デフォルトの名無しさん:2010/09/11(土) 11:37:51
>>619
CGIで使うかもしれないぞ
622デフォルトの名無しさん:2010/09/11(土) 11:45:00
ま、いざというときのためにapacheのモジュールくらい書けないとな。
623デフォルトの名無しさん:2010/09/11(土) 16:53:38
すげえな
624デフォルトの名無しさん:2010/09/11(土) 20:45:26
問題を単純に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チームもあったら、すごいいっぱいでけいさんがたいへんだぁ〜うわ〜〜ん(・_;/ってなるとおもった。ぱそこーんが
625デフォルトの名無しさん:2010/09/11(土) 21:28:26
いった
626デフォルトの名無しさん:2010/09/11(土) 21:38:57
ぱそこーんにスパコン並の事をさせようとしたらすぱこーんと逝ったわけか
627デフォルトの名無しさん:2010/09/11(土) 21:43:58
ポッディスッツッヨーンな
628デフォルトの名無しさん:2010/09/11(土) 21:47:52
スペーエアコンパユーテェーな
629デフォルトの名無しさん:2010/09/11(土) 23:01:09
優勝チームは10通りしかない
プロセスなんて無視
630デフォルトの名無しさん:2010/09/11(土) 23:49:06
Cで簡単なゲームをいろいろ作りたいと思っています
コンソール画面のみを使って遊べるゲームのアイディアを下さいm(__)m
たとえば
・じゃんけん
・hi&row
・タイピングゲーム
みたいなものです
631デフォルトの名無しさん:2010/09/11(土) 23:51:08
倉庫番
632デフォルトの名無しさん:2010/09/11(土) 23:55:25
・○×ゲーム(3目並べ)
・暗算ゲーム
・Hangman(単語当てゲーム)
633デフォルトの名無しさん:2010/09/12(日) 00:07:13
>>631-632
ありがとうございます!
参考にさせていただきます
他の方も是非よろしくお願いしますm(__)m
634デフォルトの名無しさん:2010/09/12(日) 00:29:35
>>630
ハイ-ローならこの前私が作ったな
カードを表す配列の中身を何回もランダムに入れ替えることでシャッフル
これを順番に出して、高いか低いか当てさせる
一人でやるからあんまり面白く無いが・・・
635デフォルトの名無しさん:2010/09/12(日) 00:34:54
時々Cのコードで見かけるのですが、

sp<IMediaPlayer> mPlayer;

のsp<>は何を意味しているのでしょうか?
636デフォルトの名無しさん:2010/09/12(日) 00:37:01
少々環境依存のコードを入れたくなるが、
NetHackライクなのは時間もかかって楽しめるぞ。
http://ja.wikipedia.org/wiki/NetHack
とりあえずフィールド上でキャラクタを移動できるようになれば上出来。
気が向いたらどんどん進めてもよし。
637デフォルトの名無しさん:2010/09/12(日) 00:38:07
>>635
それはCではなく、C++。
"C++ テンプレート"でググってみなされ。
638デフォルトの名無しさん:2010/09/12(日) 13:54:36
>>630,636
コンソール制御がありなら、nethackまで行かなくても
ターン制インベーダぐらいでそれなりに面白かった。
敵が横移動しなくて、出て来る位置がランダム。

あとはスレッドまで入れて、テトリスとか作れる。

どこら辺までが簡単なゲームなんだろ。
テトリスなんかはルールは簡単だけど、
実装はレベルがちょっと上がる。
639デフォルトの名無しさん:2010/09/12(日) 14:04:47
昔、MS-DOS汎用テトリスってのがあったな。
エスケープシーケンスを使ったキャラクターベースで。
PC-9801、AT互換機、TOWNS、なぜかDOS互換OSの動いていた汎用機なんかで動作確認した。
640デフォルトの名無しさん:2010/09/12(日) 14:11:23
> DOS互換OSの動いていた汎用機

ローカルってオチじゃねえだろうな
641デフォルトの名無しさん:2010/09/12(日) 14:22:08
ローカルって何?
642デフォルトの名無しさん:2010/09/12(日) 14:33:04
nlithか、懐かしいな
643デフォルトの名無しさん:2010/09/12(日) 14:33:43
リモートの反対

# 公然の秘密でも立場上あまりしゃべれないのでここまで
644デフォルトの名無しさん:2010/09/12(日) 15:42:51
なんでテトリスでスレッドの話が出てくるんだよ?
どんなクソ設計したんだ?w
645デフォルトの名無しさん:2010/09/12(日) 16:35:10
設計能力が低くてスレッド分けないと作れないんだろ。
時々いるんだよな、何でもかんでもすぐ別スレッド立てようとする奴。
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:]式が必要です】と言われます。
配列の値の変更はどのようにしたらいいのでしょうか?

配列の中の値を変えたいのですが・・・
日本語読みづらいですがおねがいします。
647デフォルトの名無しさん:2010/09/12(日) 16:43:28
int main()
{
 a[0] = 2;
 a[1] = 1;
 return 0;
}
648デフォルトの名無しさん:2010/09/12(日) 16:50:55
>>647
ははは・・・まさか・・・ね?
1個1個入れていかないといけなかったのか?!

ありがとうございました。
初心者なのにご教授いただき光栄です
649デフォルトの名無しさん:2010/09/12(日) 16:56:00
>>648
別に配列もってて、それコピーしてもいい。
650デフォルトの名無しさん:2010/09/12(日) 17:00:56
まあ最初はなんでそんな機能すら無いんだと思うかもしれんけど、別にいらんからな
651デフォルトの名無しさん:2010/09/12(日) 17:02:21
>>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;

勉強させていただきます^^
653デフォルトの名無しさん:2010/09/12(日) 17:12:34
>>651
なんぞこれ
654デフォルトの名無しさん:2010/09/12(日) 17:19:03
そんな機能は無えぞ。
構造体と間違るてんじゃねのか?
655デフォルトの名無しさん:2010/09/12(日) 17:39:42
初期化と代入の違いを認識せよ
656651:2010/09/12(日) 17:53:02
これでエラーも警告も出ずコンパイルできて、実行も出来たけど
使ってるのはBorland C++
657デフォルトの名無しさん:2010/09/12(日) 18:01:56
*a = *b
a[0] は b[0] の値になっても a[1] は b[1] の値にならない


元質問者の >>646 は配列の一括代入を意図してた
658デフォルトの名無しさん:2010/09/12(日) 18:14:38
その配列を構造体で包むとできちゃうんだよなw
659651:2010/09/12(日) 18:30:17
ほんとだ、a[1]の値が変わってない・・・
ありがとう
660デフォルトの名無しさん:2010/09/12(日) 18:42:40
コンパイル・リンクが通ったからといって
 滞りなく動く(青バックやコア吐き、鼻から悪魔)
 意図したとおりに動く
という保証にはならない
661デフォルトの名無しさん:2010/09/12(日) 20:15:22
実を言うとどうでもいい・・・
662651:2010/09/12(日) 20:16:30
間違えた・・・
実を言うとどうでもいい・・・
663デフォルトの名無しさん:2010/09/12(日) 21:00:10
>>654
これはたしかGCC拡張であったとおもいますよ。
これはたしか、両方の配列のサイズが同じであるのが前提条件だったような記憶。ボーランードのコンパーラーでも動くんだったんですね。しらなかったです。
664デフォルトの名無しさん:2010/09/12(日) 21:12:11
>>663
C99 だかの初期化ではなく、代入時にも { } でまとめられるほうの拡張?
*a = *b ただし、共に配列で型と大きさが同じ場合には一括代入するほう?
665デフォルトの名無しさん:2010/09/12(日) 21:29:02
ぼけばっかりか、657 以外のマトモな人はニヨニヨしてるのか
666デフォルトの名無しさん:2010/09/12(日) 21:36:53
それなら “*” は付けないだろ。
* を付けたら既存の文法でも意味が付いちまーからな。

int a[2]={0,1};
int b[2]={2,3};
a = b;

こういう表記になるはずだろ。
667デフォルトの名無しさん:2010/09/12(日) 21:38:00
static File f;
こんな感じで宣言した、グローバル変数はどうすれば初期化できますか?
668デフォルトの名無しさん:2010/09/12(日) 21:44:12
それはグローバルじゃないからグローバルとして初期化するのは論理的に無理。
669667:2010/09/12(日) 21:47:51
>>668
static File f;
オブジェクト指向言語だとprivateだけど、いまいちわからないからグローバル変数って書いてみた

とにかく、自動で初期化できればokなんです
670デフォルトの名無しさん:2010/09/12(日) 22:00:00
671667:2010/09/12(日) 22:02:03
>>670
なるほど、javaのstaticブロックみたいに便利な機能は無いのですか
ありがとうございます
672デフォルトの名無しさん:2010/09/12(日) 22:33:06
>>668
こいつ最高にアホ

673デフォルトの名無しさん:2010/09/12(日) 22:38:05
static File f; のの
static何を意味するですか?
でどれに掛かるんですか?
fなら File static f; ってできるんですか?
674667:2010/09/12(日) 22:44:40
>>672
それならば、そこら辺をkwsk教えてください
675デフォルトの名無しさん:2010/09/12(日) 23:00:53
あ、もしかして >>672 は解ってないっぽいかも。
676デフォルトの名無しさん:2010/09/12(日) 23:05:34
「こいつバカ」「ゆとりか」「このスレばかばっか」の一言レス系のやつに
詳しい説明を求めても、説明できたためしがないんで本人も説明できないんでしょう。
677デフォルトの名無しさん:2010/09/12(日) 23:07:11
>>675
staticが付いたらグローバル変数じゃないっておかしいだろーが
678デフォルトの名無しさん:2010/09/12(日) 23:11:02
ファイル分割できない人なんだろ
679デフォルトの名無しさん:2010/09/12(日) 23:13:16
>673

Cのイヤなところなんだけど、staticは使う場所によって2通りの意味がある。

すべての関数定義の外で使用すれば、内部リンケージを意味する。
そのファイルの外から直接アクセスできなくなる。
プログラムがそのファイルだけからなるのであれば、staticがついても
グローバル変数と呼んでもいいかもしれない。
なおauto変数ではないので、静的変数である。

複文で宣言されている変数に、staticをつけると静的変数となる。
680デフォルトの名無しさん:2010/09/12(日) 23:15:51
>>679
いや、素直にみとめろよwwwww
681デフォルトの名無しさん:2010/09/12(日) 23:42:01
そいつを「グローバル」と呼ぶのなら、
本来グローバルと呼ばれていたものは「ユニバーサル」とでも呼ぶべきだな。
682デフォルトの名無しさん:2010/09/12(日) 23:46:14
>>679
2通りってことでもないだろ。
単にスコープの違いってだけの話だよ。
まあ、読み方の問題だな。
683デフォルトの名無しさん:2010/09/12(日) 23:52:32
void func(void)
{
  static bool flag = false;
  if(!flag){
    flag = true;
    do_something();
  }
}

int main(void)
684デフォルトの名無しさん:2010/09/12(日) 23:55:25
>>682
だな。
基本は外に書くタイプの方だ。
それをスコープ区切るために内側に書くというだけのことだ。
685デフォルトの名無しさん:2010/09/13(月) 00:05:27
for(int i=0; i<10; i++){
  static int val = 0;
  printf("%d\n", val++);
}
この結果がどうなると思ってるの
686デフォルトの名無しさん:2010/09/13(月) 00:08:48
誰に何を問いたいんだよ?w
687685:2010/09/13(月) 00:10:43
>単にスコープの違いってだけの話だよ。
688デフォルトの名無しさん:2010/09/13(月) 00:17:10
#include って、必要なヘッダは
hoge.hに全部書いて、hoge.cはhoge.hのみをincludeすべき?
巷のコード見てるとhoge.cとhoge.hで同じヘッダincludeしてたりもするんだけど、
その辺の切り分けってどうすればよいの?
689デフォルトの名無しさん:2010/09/13(月) 00:21:03
必要ないヘッダは極力includeしないようにすべき
690デフォルトの名無しさん:2010/09/13(月) 00:23:27
>>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++);
}
}
スコープしか変わらんだろ。
691デフォルトの名無しさん:2010/09/13(月) 00:26:43
ただ include するだけの .h ファイルなんか作るなよ欝陶しい。
692デフォルトの名無しさん:2010/09/13(月) 00:32:42
staticの意味が2通りあると言いたいだけなんだけどもういいや
693デフォルトの名無しさん:2010/09/13(月) 00:38:46
>>692
その二通りを示せばいいのに。
694デフォルトの名無しさん:2010/09/13(月) 00:42:45
          ____
       / \  /\ キリッ
.     / (ー)  (ー)\    <「staticの意味が2通りある」
    /   ⌒(__人__)⌒ \
    |      |r┬-|    |
     \     `ー’´   /
    ノ            \
  /´               ヽ
 |    l              \
 ヽ    -一””””~~``’ー?、   -一”””’ー-、.
  ヽ ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒))

          ____
        /_ノ  ヽ、_\
 ミ ミ ミ  o゚((●)) ((●))゚o      ミ ミ ミ   <だっておwww
/⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\   /⌒)⌒)⌒)   
| / / /     |r┬-|    | (⌒)/ / / //       
| :::::::::::(⌒)    | |  |   /  ゝ  :::::::::::/      
|     ノ     | |  |   \  /  )  /
ヽ    /     `ー’´      ヽ /    /
 |    |   l||l 从人 l||l      l||l 从人 l||l  バンバン
 ヽ    -一””””~~``’ー?、   -一”””’ー-、
  ヽ ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒))
695デフォルトの名無しさん:2010/09/13(月) 00:44:41
・関数定義の外で使用すれば、内部リンケージを意味する
・複文で宣言されている変数に、staticをつけると静的変数となる

static の有無で意味が変わるじゃん。既に書いてるのに。
696デフォルトの名無しさん:2010/09/13(月) 00:54:40
単に、staticと宣言された変数は、内部リンケージを持ち静的変数になるってだけだろ。

staticの有無の話はしてないし。
697デフォルトの名無しさん:2010/09/13(月) 01:00:08
禿も髭もちょっと冷静さを失った発言が見られるようだが、よく見れば2つの決まりでしかなく、
それが使用された場面によって導かれる結果が変わっていくというだけのこと

髭の言ってた決まりが1つでないことが気持ち悪いという点には同意だな
あとは3つであろうが4つであろうが本質的には変わらない
698デフォルトの名無しさん:2010/09/13(月) 01:05:16
>>695が自殺しそう
699デフォルトの名無しさん:2010/09/13(月) 01:10:53
これは要するにね、例えば、
int *a; と書いてあるのを見て、
*a が int 型である、と読むのか、
a が int* 型である、と読むかの違いみたいなものなんだよ。

ただ基準としてる観点が違ってるだけであって、
どちらが正しいとか間違ってるとか、そういうんじゃないんだよ。
700デフォルトの名無しさん:2010/09/13(月) 01:13:16
>>699
それは前者が正しいだろ。
C++ 厨は何故か後者の読み方して書式までキモく変形させるけどな。
701デフォルトの名無しさん:2010/09/13(月) 01:18:44
>>699
君は十分に頑張ったよwww

もう楽になってもいいんだよwww
702デフォルトの名無しさん:2010/09/13(月) 01:23:53
結論

関数定義の外であろうと内であろうと、staticを付けた変数は内部リンケージを持つ。
複文で宣言されていようとなかろうと、staticを付けた変数は静的変数となる。

故に、staticを付けた変数は、内部リンケージを持ち、静的変数となる。意味は一つ。
703デフォルトの名無しさん:2010/09/13(月) 01:25:56
static の説明に静的変数が出てきたら世話ないだろ
704デフォルトの名無しさん:2010/09/13(月) 01:46:36
関数内でstatic付きで宣言された変数は内部リンケージじゃねぇよ。
705デフォルトの名無しさん:2010/09/13(月) 01:52:50
あ゙??
706デフォルトの名無しさん:2010/09/13(月) 02:19:02
>>703
それはどうだろ。
他に言いよう無いんじゃね?
静的な記憶域がうんたら的な表現の違いはあるかもだが。
707デフォルトの名無しさん:2010/09/13(月) 02:27:00
>>702
×内部リンケージを持つ

○リンカーに知らされない
708デフォルトの名無しさん:2010/09/13(月) 04:36:44
同じstaticというキーワードなのに使う場所によって違う意味になる

グローバルスコープ(関数外)の関数か変数
 →関数や変数は内部リンケージとなる(=ファイルスコープ)

ローカルスコープ(関数内)の変数のみ
 →静的変数となる(リンケージは無関係)

C言語の曖昧さの1つだよ
709デフォルトの名無しさん:2010/09/13(月) 07:13:31
>>700
int *&a; は *&a が int 型である!!
710デフォルトの名無しさん:2010/09/13(月) 07:30:13
>>708
静的変数になるって・・・
よくわかってないのに説明すんな
711デフォルトの名無しさん:2010/09/13(月) 07:47:28
>>630
最近のコンソール画面は昔のように80文字x25行の制限があるわけじゃない。
モニターさえ広ければ640x240のVGA解像度ぐらいの文字数にする事も出来る。
流麗なグラフィックを売りにするようなゲームは流石に無理だと思うけど、
シューティングだろうが、アクションだろうが、アドベンチャーだろうが

RPGだろうが大抵のゲームは作れるはずだ。
色数の制限は厳しいが高速なハードウェアなら、文字の色を短時間で
切り替える事により疑似フルカラー表示したり、GPGPUを使って3DCG
を表示することだって出来るだろう。

唯一問題があるとしたら文章の表示ぐらいだ。アプリケーション側で
フォントデータを持つにしても、解像度が低いので漢字の表示は
あきらめるしかないかもしれない。
712デフォルトの名無しさん:2010/09/13(月) 07:50:37
お前さんはそれをC言語習いたてのぺーぺーに書けと?
713デフォルトの名無しさん:2010/09/13(月) 08:32:32
>>709
それ、スレ違いですから。

>>708
ローカル変数にstaticをつけた場合も内部リンケージであることには違いはないでしょ。
714デフォルトの名無しさん:2010/09/13(月) 08:41:25
>>708
static キーワードはファイルスコープと静的の2つの意味を持つ
・関数外:元々静的なのでファイルスコープの機能しか評価されない
・関数内:元々ファイルスコープ(もっと狭いけど)なので静的機能しか評価されない

別に曖昧だとは思わないな、まぁ暗黒面とは呼ばれているけど
715デフォルトの名無しさん:2010/09/13(月) 08:53:37
>>710
どうした低脳w
お前の誤った知識を晒してみるか?

>>714
1つのキーワードに複数の意味を持たせることが曖昧そのもの
基本ファイルスコープにして外部リンケージのみ別のキーワードを用いる等対処法があったはずだ
もちろんC設計当時の話だから今さらだけどな
716デフォルトの名無しさん:2010/09/13(月) 09:03:49
>>713
違うっつってんだろーが
リンケージという言葉はグローバルスコープに存在するオブジェクトに対してしか使わないんだよ
局所変数にリンケージなんて存在しないの何故ならリンクする必要がないから
717デフォルトの名無しさん:2010/09/13(月) 10:15:45
読点の多すぎる文章も馬鹿丸出しだけど、句読点の全くない文章も間抜けに見えるな。
718デフォルトの名無しさん:2010/09/13(月) 10:35:48
C++ではその辺を教訓に、staticはやめて無名namespace
にするようにって言ってるね。

Cなら仕組み的には1つ、意味的には2つあるってのを
ちゃんと理解しないといけないのが入門的には難しい気がする。
719デフォルトの名無しさん:2010/09/13(月) 10:42:31
namespace を使って役割を整理するのは構わないが、
従来のC言語の仕様でも困るほどのことはない。

困るというのは単にプログラマとして未熟なだけだよ。
720デフォルトの名無しさん:2010/09/13(月) 10:52:49
こんなところかな。
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
721デフォルトの名無しさん:2010/09/13(月) 10:57:53
>>720
グローバルスコープにあるオブジェクトは無条件で静的領域に確保されるよ
722デフォルトの名無しさん:2010/09/13(月) 11:05:23
>>721
それだったら話は簡単だ。
staticは関数内部用に限定して、関数外部用にlocalというキーワードに置き換え。
現在省略している外部リンケージ用にglobalというキーワードを追加。
折りを見てlocalを省略化に。
これで世の中平和になるw
723デフォルトの名無しさん:2010/09/13(月) 11:09:36
>>722
うん
だからC言語の設計時にそうしてればね、って話よ
724デフォルトの名無しさん:2010/09/13(月) 11:10:42
>>720
extern のことを書くなよ。今の仕様で語っても無意味。
けど無意味化された理由ぐらい考えろよ。そんなんで色々考えても無駄。

>んでもって、ややこしいのは関数外で無修飾で外部リンケージを持つ点だから、
これは当然のこと。何の問題もない。

>無修飾ではファイルスコープしか持たないことにして
こんなふざけた仕様はありえない。
725デフォルトの名無しさん:2010/09/13(月) 11:11:51
>>722
酷過ぎる、、、昔の extern の方がよほどマシだわ
726デフォルトの名無しさん:2010/09/13(月) 11:16:09
static Type val; // ファイルスコープ静的変数
static Type func(...); // 静的関数

これらをいちいち静的と呼ぶ必要あんのか?
動的なのがあるというなら区別する価値はあるが。
727デフォルトの名無しさん:2010/09/13(月) 11:21:21
>>726
ない
autoの局所変数以外(関数、大域/static変数、定数)は無条件で静的
つーかそもそもメモリモデルとスコープは別物
728デフォルトの名無しさん:2010/09/13(月) 11:22:49
だよな!
729デフォルトの名無しさん:2010/09/13(月) 11:23:43
>>727
その別物の要素をstaticという1つのキーワードで扱ってるから混乱を招く
730デフォルトの名無しさん:2010/09/13(月) 11:28:12
>>724
お前マクロ厨だろw
731デフォルトの名無しさん:2010/09/13(月) 11:28:23
>>729
どう混乱してるんだ?
グローバルな時点で、静的か動的かを意識する必要はないんだから、それでいいだろ。

それともグローバルな動的変数が必要ってことか?
余計に意味がわかんねーよ。
732デフォルトの名無しさん:2010/09/13(月) 11:30:10
今の仕様が良くないというだけじゃなくて、
具体的にどう変えれば良いかを提示すればいいのに
733デフォルトの名無しさん:2010/09/13(月) 11:34:06
ポインタとして宣言するときのアスタリスクと、
それをデリファレンスするときのアスタリスクに、
入門当時の俺は混乱させられた。

別の役割をひとつの記号が担ってる、
の思考に行き着くまで時間がかかった。

今では宣言時の type *p を、*pがtypeとなる、
の案も受け入れられる。
734デフォルトの名無しさん:2010/09/13(月) 11:35:04
>>731
頭わりーなさっきから言ってんだろw
どうして内部リンケージと静的局所変数を同じstaticという単語で修飾するんだよ?
理由を言ってみろよ
735デフォルトの名無しさん:2010/09/13(月) 11:36:44
仕様策定にかかわりたいのか
別の言語がいいよって言いたいのか
736デフォルトの名無しさん:2010/09/13(月) 11:41:51
>>734
それで事足りるからだろ。

それで足りない事例があるのか?
どっちが頭悪いんだか。
737デフォルトの名無しさん:2010/09/13(月) 11:44:04
別の単語の方がよかったけど、同じであってもちゃんと区別つくし困らないだろ
738デフォルトの名無しさん:2010/09/13(月) 11:45:24
>>717
なるほど、言い得て妙だ。
739デフォルトの名無しさん:2010/09/13(月) 11:49:33
そもそも extern があるのに、更に global とか余計にややこしくなるわ
740デフォルトの名無しさん:2010/09/13(月) 11:50:19
>>736
予想通りだが全く理由になってないw
同じ言葉を使う合理的な理由を説明しろよ

>>737
そう
誰が考えても違う意味なら違う言葉を使うのが合理的と考える
それを怠った故に誤解を生じたのはこのスレが証明している
現に区別の付いてないヤツがちらほら見受けられる
741デフォルトの名無しさん:2010/09/13(月) 11:54:15
>>740
> それを怠った故に誤解を生じたのはこのスレが証明している

C++になって無名namespaceが出てきたってこともあるな。

# マ板でおじゃばさまってコテがこの件で失態晒してたなw
742デフォルトの名無しさん:2010/09/13(月) 12:01:52
>>740
>予想通りだが全く理由になってないw
>同じ言葉を使う合理的な理由を説明しろよ

は?
static の効用はキーワードは有りと無しで変わる。
その効用が必要であれば付けるし、必要なければ付けない。
それで困ることがあったけではない。
→困る事例を挙げてない

それを二つの機能したいという発想だろ。
二つのキーワードってことは4通りになるってことだよ。
その仕様の説明もなしに、そっちが良いとかいう方がおかしい。
→具体的な仕様は出せない

妄想と言われてもしかたないね
743デフォルトの名無しさん:2010/09/13(月) 12:08:41
>>742
更にexternの有り無しも組み合わせて示してほしいな。
それをやろうとすればそれが愚かなことだと気付く。
744デフォルトの名無しさん:2010/09/13(月) 12:11:13
>>742
その効用が場所によって変わるから現に初心者が混乱してるっつってんだろーが
いい加減にしろよお前日本語読めないのか?

それと最初に言ったけどこれは「今さら」な話だ
オレが今困ってるわけじゃないしどうこうしようとも思ってない
ただお前のような輩が理由無くC言語の孕む問題点を擁護するのが気に食わん
完全無欠な言語じゃないんだから問題点を挙げておくのは初心者のためになるだろう
745デフォルトの名無しさん:2010/09/13(月) 12:17:34
使い方によって2種類の意味があるから初心者は気をつけましょう、で済む話なのに
なんでそんなに熱くなってんだよw
746デフォルトの名無しさん:2010/09/13(月) 12:18:30
>>744
だから、どう変えるかも示さないで、そっちの方が良いとか言うのがおかしい、
と言ってるんだよ?混乱がなくなるというのは君の妄想だろ。

初心者はポインタで混乱するから、ポインタなんかなくせっていうのと大してかわらんよ。
747デフォルトの名無しさん:2010/09/13(月) 12:28:15
>>745
お前は同じ言葉を使った理由を説明できるのか?

>>746
「そっちの方」ってなんだよw
オレはただ現状の曖昧な点を挙げてるだけだっつーのに
staticなくせなんて一言も言ってないし
お前が勝手に代替案求めてるだけじゃねーか

まあとりあえず代替案は>>722ということでいいよ
まず>>722の問題点を挙げろ
748デフォルトの名無しさん:2010/09/13(月) 12:30:04
予約語増やしたくなかったんじゃね
749デフォルトの名無しさん:2010/09/13(月) 12:31:07
だな。
750デフォルトの名無しさん:2010/09/13(月) 12:32:40
それはつまり設計を怠ったということだな
751デフォルトの名無しさん:2010/09/13(月) 12:39:50
>>745
まず変数に対しても関数に対しても
staticの指定は「こいつの存在をリンカに知らせない」という意味があって
さらに変数の場合は、静的生存期間を持つ、という整理が必要かと

変数の可視性と生存期間は明らかに別概念ではあるんだが、
その辺の指定を柔軟に操作できる言語はほとんど無い
たぶん実装上の都合もあろうし、実用上は特に誰も嬉しくないんだろう
752デフォルトの名無しさん:2010/09/13(月) 12:48:59
>>750
最初から完璧な設計なんて無理じゃね?
753デフォルトの名無しさん:2010/09/13(月) 12:49:04
まだ静的生存期間とか言ってるし
754デフォルトの名無しさん:2010/09/13(月) 13:15:15
>>748
C発明当時(1970年代前半)の処理系に与える影響が
どの程度のものなのかは興味がある
字句解析器の負担が大きくなるのかなあ?

ちゅーか当時のコンピュータ事情がまるで想像できない
DFAやNFAは発明されていたけど、KMP法やBM法が無いってさ……
755デフォルトの名無しさん:2010/09/13(月) 13:32:34
無いってさ……
756デフォルトの名無しさん:2010/09/13(月) 13:33:30
>>753
言ってるね
757デフォルトの名無しさん:2010/09/13(月) 15:02:49
ふむ
758デフォルトの名無しさん:2010/09/13(月) 15:02:55
>>747
>staticは関数内部用に限定して、関数外部用にlocalというキーワードに置き換え。
>現在省略している外部リンケージ用にglobalというキーワードを追加。
>折りを見てlocalを省略化に。
>これで世の中平和になるw

関数宣言で修飾子がついてないときに、現状の static が付いた状態に仕様変更するということだね。
それで global は必要に応じて付けろってことか。

C言語においては、関数や変数は隠蔽しない限り公開が原則なんだよ。言語思想。
それを変えるという話だから、もはやキーワードの問題じゃないだろ。
これで混乱が解消されるというなら、それは思想の問題だよ。

次に、関数の外で、変数を定義したときにはどうすんだよ?
global と static の有り無しで4通りあるだろ。

global な変数の初期化はどうすんの?

関数もプロトタイプ宣言はどうすんの?
759デフォルトの名無しさん:2010/09/13(月) 15:14:07
おれは extern をどうするつもりなのかを聞きたいw

現状でも extern は省略できるだけで、その機能自体は生きてる。
この辺を理解しているのか非常に怪しい。
760デフォルトの名無しさん:2010/09/13(月) 15:40:58
関数の外での変数宣言だが
int a; と static int a; ではスコープ以外にも違いがある。

前者は extern int a; という意味で、変数の実体の宣言ではない。
どこかで定義されている変数を使用しますということで、
関数のプロトタイプ宣言と同じ。
仮に int a = 3; と書けばその時点で実体の定義が行われたことになる。

後者は常に変数の実体定義。= 以降があってもなくても同じ。

従って static とは別に global や local のキーワードが必要というなら、
上記の違いを示す為の新たなキーワードを用意してそれと併用する必要がでてくる。
global や local はスコープの制御だというんだからね。

extern は関数宣言に対しては機能が一致しないので、
static が駄目だと言うんだから駄目ということになるだろうし。
761デフォルトの名無しさん:2010/09/13(月) 15:46:22
単に省略されてるだけということに気付けよ。

int a;
static int b;
func(){
static int c; // b をスコープ限定しただけ。根本的には同じ。
auto int d;
int e; // d の省略であり、結果として表記は a と同じだが根本的に違う。
extern int f;
}

書く位置はスコープの問題でしかなく、
static の意味が変わるわけではない。
762デフォルトの名無しさん:2010/09/13(月) 15:50:25
global,localなんてただの思いつきなのに、
そんな真面目に反論されても困るわ。
論理的な人は周りから嫌われるから気をつけた方がいいよw
763デフォルトの名無しさん:2010/09/13(月) 15:54:31
>>760
自分はこうしたい、という仕様を書いてるの?
764デフォルトの名無しさん:2010/09/13(月) 15:54:47
>>761
それの何が省略されてんの?
765デフォルトの名無しさん:2010/09/13(月) 15:57:00
>>763
混乱の回避を目的として、
global とか local を導入するのが愚かな発想というこということでしょうね。
766デフォルトの名無しさん:2010/09/13(月) 16:01:33
ようするにglobalやlocalキーワード新設しても、
staticやexternを組み合わせて使わないといけないということ?
externとか意味分かんないし、よけいややこしくなるよ。初心者的には絶対そうだよ。
767デフォルトの名無しさん:2010/09/13(月) 16:06:15
つーかグローバルスコープでstaticって必要なの?
どんなときに使うわけ?
extern int hoge;
で定義しといて1つだけ宣言で
int hoge = 123;
とどう違うの?
768デフォルトの名無しさん:2010/09/13(月) 16:24:15
クマー
769デフォルトの名無しさん:2010/09/13(月) 16:38:25
>>767
static付けるとそのソース内でしか参照出来ない。
無しだと、他のソースでも参照出来る、
んで他のソースでextern付けて参照する。
770デフォルトの名無しさん:2010/09/13(月) 16:41:36
基本的に省略時が常に最小のスコープということなら、

//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で明示されるからセキュリティは向上するね。
771デフォルトの名無しさん:2010/09/13(月) 16:48:40
グローバルスコープでstatic int aaa;としたときに、

1. スコープがファイルに制限される
2. 初期値の有無を問わずプログラム開始時に領域が確保される

ということだけど、とりあえず1.はおいといて、
2.の目的のみでstatic付けることってあるの?どんなケース?
772デフォルトの名無しさん:2010/09/13(月) 16:54:57
ん?、グローバルスコープは静的ちゃうんけ?
773デフォルトの名無しさん:2010/09/13(月) 16:55:32
>>760
記憶違いなら悪いが、既定がexternなだけで、
省略したらexternな訳じゃ無かったと思う。
774デフォルトの名無しさん:2010/09/13(月) 17:02:21
関数の外での宣言は、初期値無かったら = 0と同じ
775デフォルトの名無しさん:2010/09/13(月) 17:08:10
イイナハシダナー(;∀; ).
776773:2010/09/13(月) 17:38:32
すまん。
確認して来たら、>>773は大嘘だった。
何かもっとヘンテコリンな謎仕様だった。
777デフォルトの名無しさん:2010/09/13(月) 17:42:41
現行で問題ねーんだよ。
変と言ってる奴は、ソイツの読み方が変なんだよ。
読み方が変なままで通したいなら C++ に行けばいい。
あれはその変な奴らが寄り集まって考えた書式だからな。
778デフォルトの名無しさん:2010/09/13(月) 17:44:50
extern は、実体はよそにあるからそれを使え!
っていう指定だな
779デフォルトの名無しさん:2010/09/13(月) 18:10:13
extern void func(void);
static void func(void);
780デフォルトの名無しさん:2010/09/13(月) 18:27:56
>>770
#define global
#define extern
の2行を先頭に加えれば、おまえさんの望みどおりの動作になるぜwww
例えが悪すぎんだよ

>むしろ表に出すものがglobalで明示されるからセキュリティは向上するね。
発想が、アホすぎるw
781デフォルトの名無しさん:2010/09/13(月) 18:29:09
return 0;
782デフォルトの名無しさん:2010/09/13(月) 18:30:13
つまり

現行で問題があるという奴は、そもそも現行の仕様すら理解できてない。

それに尽きる
783デフォルトの名無しさん:2010/09/13(月) 18:33:09
>>776
ここで言われているような global や local を導入したら、
もっとヘンテコリンな仕様になるぞ
784デフォルトの名無しさん:2010/09/13(月) 18:33:15
>>767
プログラムを複数のcソースで記述するときに効いてきます。
785デフォルトの名無しさん:2010/09/13(月) 18:35:04
>>782
確かに現行の仕様で困ることはないですからね。
786デフォルトの名無しさん:2010/09/13(月) 18:36:17
まぁ現状を理解する能力のない奴が改良案だしてもアレってことだな
787デフォルトの名無しさん:2010/09/13(月) 18:39:41
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 なんてどうすんだ
あれにはローカルスコープなんて意味は無いし、静的って意味でも少し違うよな
789デフォルトの名無しさん:2010/09/13(月) 18:53:17
だから C++ はもともとおかしいんだってば。
790デフォルトの名無しさん:2010/09/13(月) 18:59:53
>>788
>静的って意味でも少し違うよな
元の言葉の意味で考えるからおかしくなるだけだろ。
こんなこと言い出したら、キーワードの多くが元の英単語の意味からは逸脱してるわ。

static は言語で採用されたキーワードなんだから、
その意味はその言語で規定された物で十分なんだよ。
791デフォルトの名無しさん:2010/09/13(月) 19:02:33
>>787
プロタイプをstaticにする意味がわからん
792デフォルトの名無しさん:2010/09/13(月) 19:05:09
えっ
793デフォルトの名無しさん:2010/09/13(月) 19:21:23
>>791
現状のCだとプロタイプの場合は extern 、static ともに何の意味ないね。

昔のCだと extern には意味があった。static にはなかった。

その前はプロトタイプ宣言自体ができなかったw
794デフォルトの名無しさん:2010/09/13(月) 19:25:06
>>787
これ何が言いたのか全くわからん。
多分なんか勘違いしてるんだろうけど。
795デフォルトの名無しさん:2010/09/13(月) 19:31:59
=== 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;
}
796デフォルトの名無しさん:2010/09/13(月) 19:35:55
>>794
kwsk
797デフォルトの名無しさん:2010/09/13(月) 19:37:35
>>795
>=== a.h ===
>static void func_a(void);

プロトタイプを static にする意味がわからん。
798デフォルトの名無しさん:2010/09/13(月) 19:47:57
関数は全部publicにするの?
799デフォルトの名無しさん:2010/09/13(月) 19:48:21
>>796
何が言いたいかわからんのに答えようがない

とりあえず extern は他所で定義されているという意味で、
public / private とは意味が違う。

他所というの同一ファイル内である場合もある。
つまり static で宣言された変数も extern により参照できる。
800デフォルトの名無しさん:2010/09/13(月) 19:49:02
他所というの同一ファイル内である場合もある。
→他所というのは同一ファイル内である場合もある。
801デフォルトの名無しさん:2010/09/13(月) 19:54:34
=== 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 により参照できる
802デフォルトの名無しさん:2010/09/13(月) 19:57:22
>>797
プロトタイプと実体は揃えた方がwarningが正しく機能するのでは?
803デフォルトの名無しさん:2010/09/13(月) 19:58:00
static や extern を global/local、public/private という概念で理解しようするのが間違い。
違う物なんだから、単純に置き換えれるわけがない。
どしても置き換えるのであれば、足りない部分を表現する別の概念(キーワード)も用意して、
それと組み合わせることが必要になるんだよ。

static は sitaic だし、extern は extern であって、全然違う概念。
他の概念に置き換える前に、現状の static や extern を理解すればいいのに。
804デフォルトの名無しさん:2010/09/13(月) 20:01:27
static / extern を理解してないのはお前だろw
>>795が実行できると思ってんの?
805デフォルトの名無しさん:2010/09/13(月) 20:08:55
>>801
何が言いたのかわからんのよ。それでエラーになるって言いたいの?
「同一ファイル」と書いてあるでしょ。例えば、

=== main.c ===
extern int val;

int main(void)
{
  printf("%d\n", val);
  return 0;
}

static int val = 100

という書き方は正規なの。もちろん最初の extern を外せばエラーになるよ。

extern とはそういう意味。この部分を勘違いしてる人が多いんだよ。
806デフォルトの名無しさん:2010/09/13(月) 20:09:38
は?
807デフォルトの名無しさん:2010/09/13(月) 20:11:29
>>804
誰へのレスかわからんが、当然ビルドエラーでしょ。
808デフォルトの名無しさん:2010/09/13(月) 20:14:03
>>806
extern は private な変数に対しても使えるってことだよ

extern == public というおかしな考えは通用しないという実例
809デフォルトの名無しさん:2010/09/13(月) 20:14:04
>>805
extern int val;の記述に何の意味があるの
810デフォルトの名無しさん:2010/09/13(月) 20:17:36
>>809
後方で宣言されているから、それより前で参照する場合は extern 宣言する必要がある。
この場合 extern を付けないとエラーになる。
811デフォルトの名無しさん:2010/09/13(月) 20:22:32
でっていう
812デフォルトの名無しさん:2010/09/13(月) 20:24:02
俺も、でっていう
813デフォルトの名無しさん:2010/09/13(月) 20:28:57
extern は実体の定義が他所でされている物を、仮に宣言して使用する為の宣言。
スコープが変化することはない。

スコープに影響を与えるのは static 宣言の機能であり、
static 宣言されるとそのファイル内に制限される。
(もちろん他の機能もある)

extern と static は別の概念だから、global/local のように対になるものでないし、
そもそも extern や static を global/local という概念で考えようとするのが無意味。

このスレで global/local、public/private を持ち出した奴はこの辺のことが理解できていない。
814デフォルトの名無しさん:2010/09/13(月) 20:34:13
static void func(void); // private
extern void func(void); // public
815デフォルトの名無しさん:2010/09/13(月) 20:36:39
そもそも>>787にはextern int valとは書かれてない
816デフォルトの名無しさん:2010/09/13(月) 20:38:08
>>813
せっかくだから俺も揚げ足を取ると
extern int X = 10;
のように定義と宣言をまとめて行えるよね?
exern付いてるよね?他所じゃないよね?
817デフォルトの名無しさん:2010/09/13(月) 20:39:21
この使えない豆知識の披露宴はどこまで続くのかな。
818デフォルトの名無しさん:2010/09/13(月) 20:40:21
だんだん実の有る展開になってきてwktk。

>>814の迷走っぷりが少しだけ心配。
819デフォルトの名無しさん:2010/09/13(月) 20:47:14
変数についてはexternが付くとpublicになるなんて誰も言ってないんだが
820デフォルトの名無しさん:2010/09/13(月) 20:48:13
externとstaticなんかで盛り上がれるなんてこのスレ、スゲーなw

やっぱり知識の限界ギリギリの会話してるとアドレナリンが出るんだろうなww
821デフォルトの名無しさん:2010/09/13(月) 20:55:26
変数についてはexternが付くとpublicになるなんて誰も言ってないんだが
822デフォルトの名無しさん:2010/09/13(月) 20:57:50
個人的にこんな風におもってます。まちがってたらごめんなさいです(^_^/

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;

それできたっけ?複数のソースで異なる値が代入されたらどうなるんだ?
824デフォルトの名無しさん:2010/09/13(月) 21:09:18
昨日ちょっとコメントしたら、異常な盛り上がりでびっくり。
しかし、なんでここまで盛り上がっておきながら、K&Rが出てこないのだろう。

K&R付録A 参照マニュアルの該当箇所をあげておく。規格書持っている人はよろしく。

A8.1

static指定子は宣言されたオブジェクトに静的な記憶クラスを与えるためのもので、
関数の内側でも外側でも使ってよい。関数の中では、この指定子でメモリが割り当てられ、
定義の役目が果たされる。外側についてはA11.2

でA11.2をみると

識別子に対する最初の外部宣言は、static指定子が使われていれば内部リンケージを、
そうでなければ外部リンケージをその識別子に与える。

825デフォルトの名無しさん:2010/09/13(月) 21:15:40
さっき見たばかりなのにかなり忘れたが。

関数の外部で定義でない変数の宣言において。
staticが指定された場合、内部結合。

externが指定された場合、それ以前に、可視である同一の識別子が、
内部結合として宣言されている場合、内部結合。
そうでないなら外部結合。

どちらも指定されない場合、外部結合だったか無結合だったか忘れた。

関数の宣言において。
指定されない場合はexternと同様。
他については変数宣言と同様。

変数の外部定義において。
細かいこたぁ忘れた。
externが指定された場合、外部結合だったような。

関数の定義は、もう見てねーよ!!

で外部結合と内部結合がカチあったら未定義。

長すぎた。
826デフォルトの名無しさん:2010/09/13(月) 21:16:40
つまり
/* 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起動んのめんどい。
827デフォルトの名無しさん:2010/09/13(月) 21:18:18
>>682>>684

今までこの視点は無かったけど、そういう見方をすれば、確かに矛盾してないね。
そっか、外部宣言が基本で、スコープを区切っているだけか。

ローカル変数を静的変数にするために、staticをつけると思ってたよ。
K&Rの書き方もそうだったし。
何で今まで気がつかなかったんだろう。
828デフォルトの名無しさん:2010/09/13(月) 21:24:42
気持悪がられるけど 自動変数だってスコープ割って制限しちゃうこともできるしね

void foo() {
 int a, b;
 {
  int i,j; /* この中だけ i,j を使う */
  /*.....*/
 }
 
 {
  int c,d; /* この中だけ c,d を使う */
  /*.....*/
 }
}

意味があるなら関数化で小分けしちゃうけど、意味の切りわけが見つからない時は
迷ってしまうわ (小分けの関数名付けにも…)
829デフォルトの名無しさん:2010/09/13(月) 21:26:04
>>828
気味悪くねぇし普通にそれはする。
830デフォルトの名無しさん:2010/09/13(月) 21:29:17
>>823
宣言と定義を同時にしてるだけだぞ?
自ずと分かるだろ?
多重定義で怒られるに決まってんだろ
831デフォルトの名無しさん:2010/09/13(月) 21:30:48
>>829
if () や for() , do などのブロックが来て当然の部位では当たり前の事象
(とういうか、それすら禁じられると辛い

そういう文にからまず
唐突に1段スコープを深くして変数宣言から という例は気味悪がられるね (俺の周囲の話
832デフォルトの名無しさん:2010/09/13(月) 21:37:03
気味悪がる理由も筋がとおってればいいんだけど
100% 純粋にただの拒否反応だからな
833デフォルトの名無しさん:2010/09/13(月) 21:37:36
for (int i=0; i<n; i++) {
printf("%d ",i);
}

これだけはキモすぎて許せない。マジキモすぎる。
834デフォルトの名無しさん:2010/09/13(月) 21:40:34
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 推奨コードをどぞぉー
836デフォルトの名無しさん:2010/09/13(月) 21:42:22
>>833
をつついても「キモすぎて許せない」と言うほどの理由は出てこない予感。
たいした理由もねぇのにうだうだ言う奴。
837デフォルトの名無しさん:2010/09/13(月) 21:46:38
ここまで、誰も C Common の話をしていないのはどういうわけだ?

=== a.c ===
int a;

=== b.c ===
int a;

は、両方を extern int a; にするのとも違うし、
両方を int a = 0; にするのとも違う。(どちらもリンク時にエラー)
838デフォルトの名無しさん:2010/09/13(月) 21:55:45
両方extern intにしたら実体が無いし、
両方intなら名前が被る
839デフォルトの名無しさん:2010/09/13(月) 22:02:47
どっちも外部結合だから、リンカが1つにして終わり。

だと思うんだが、C Commonてなんぞ?
840デフォルトの名無しさん:2010/09/13(月) 22:07:07
>>824
K&Rに「staticは複数の機能があるよ」って書いてあるじゃん
どう読んだら関数内部と外部で同じ機能に見えるんだ?
841デフォルトの名無しさん:2010/09/13(月) 22:07:29
>>837
個人的には、それを避けるために、基本的に大域変数や関数はstaticで宣言するようにしてます。
それの良い解決方法になる記法があるならぜひ知りたいです。
842デフォルトの名無しさん:2010/09/13(月) 22:16:17
>>824
ソースファイルの一番外側で変数を作ると、大域変数ってのになって、どこからでも読み書きできます。
これは、どこからでも読み書きできるってことは、ずっと生きてるってことだと思います。

関数の中のstatic 変数は、関数が終わって、もう一回関数呼んだときも、前の状態を保持してて、これは、ずっと生きてたってことだと思います。

どっちも、ずっと生きてるけど、関数の中でstatic int aとしたら、それは関数以下でしか読めなくて、一方、関数の外でstatic int aとしたら、それは外以下でしか読めなくて、
けっきょく、どちらも、読める権限の位置が違うだけで、ずっと生きてる点では同じなので、似てるように見える、同じに見える、って意味での”同じ”って言ってるんだろうなぁ〜・・・って思いました。レスよんで。ボクは。個人的に。

もしちがってたらごめんなさい(ぺこり
843842:2010/09/13(月) 22:17:51
>>840
でした
844デフォルトの名無しさん:2010/09/13(月) 22:19:48
>>836
括弧の外に書いてんのに何故かスコープが括弧の中。

>>835
{int i;
for (i=0; i<n; i++) {
printf("%d ",i);
}}
845デフォルトの名無しさん:2010/09/13(月) 22:22:44
while の()の中でも変数宣言できたらよかったのに。
846デフォルトの名無しさん:2010/09/13(月) 22:22:51
>>840
読解力が足りてねえな。
もっと熟読してみろよ。
847デフォルトの名無しさん:2010/09/13(月) 22:24:02
>>840
そんなこと書いていない。うそつくな。
848デフォルトの名無しさん:2010/09/13(月) 22:25:29
int ch;

while ((ch = getchar()) != EOF) {
}

とか、ループの中でしかchを使わなかったら、スコープを中だけに限定したい。
849デフォルトの名無しさん:2010/09/13(月) 22:27:16
VC++6.0 だとちゃんと外に出てるよな。
850デフォルトの名無しさん:2010/09/13(月) 22:29:38
括弧の外に書いてんのに??
スレ違い? Cも最近の規格じゃ書けるのか?

C++でもfor() {}とwhile() {}の時しか書けないんじゃねえの?
カッコの中で変数宣言できる例なんてあるか?
851デフォルトの名無しさん:2010/09/13(月) 22:31:45
えっ
852デフォルトの名無しさん:2010/09/13(月) 22:32:56
関数のときのカッコはどうなんだよ。
あれの仮引数のスコープはどうすべきなんだよ。
853デフォルトの名無しさん:2010/09/13(月) 23:11:39
例外のある言語で、tryの中で使ってたリソースをcatchとかfinallyで、
後始末をしたいときに、変数をtryの外に出さなきゃならないのも
なんかとかならんのかね。
あのたりはスコープ共通でいいんじゃね?
854デフォルトの名無しさん:2010/09/13(月) 23:51:08
>>830
extern int a;
は実態の宣言ではなくリンクみたいなもんだろ
そこに代入できたっけ?って話だ
extern int a = 10;
が可能なら、別ソースで
extern int a = 11;
って書いても多重定義にはならないだろ、実態は別に一個あるだけなんだから
855デフォルトの名無しさん:2010/09/13(月) 23:52:04
そも、代入じゃなく初期化だろ。
856デフォルトの名無しさん:2010/09/13(月) 23:52:51
extern使ったことない。
利点あるの?
857デフォルトの名無しさん:2010/09/13(月) 23:57:29
使う理由は利点じゃなくて必要性だと思うんだ


無いね
858デフォルトの名無しさん:2010/09/14(火) 00:09:33
>>855
たいして変わんないだろ 代入 ⊃ 初期化

>>856
複数のソースからプログラムを生成する時にグローバル変数が必要なら必須だ
グローバル変数を使わないなら必要ないけど、仕事でグローバル変数を使わないのは見た事無いな
859デフォルトの名無しさん:2010/09/14(火) 00:12:33
みんながグローバル変数を直接参照してるの?
860デフォルトの名無しさん:2010/09/14(火) 00:13:26
定数を代入しかできなくね? > 初期化
861デフォルトの名無しさん:2010/09/14(火) 00:13:42
カプセル化(笑)
862デフォルトの名無しさん:2010/09/14(火) 00:16:27
>>860
なんか困るか?
863デフォルトの名無しさん:2010/09/14(火) 00:21:05
別ファイルで定義されているint aを使うときは
extern int a;
としないと、aがないぽってエラー・警告でるの?
864デフォルトの名無しさん:2010/09/14(火) 00:28:51
>>859
定数みたいなモンは普通にグローバルで使うよ
構造体にまとめたりはするけどインスタンスはグローバルである事が多いな
main() で定義/生成してポインタを引きずり回せば使わなくても良いんだけど、
ほとんどの関数に引数が1つ増えるのは嫌だからね
865デフォルトの名無しさん:2010/09/14(火) 00:31:05
行儀のいいコード書きたきゃJavaでも使ってろ
866デフォルトの名無しさん:2010/09/14(火) 00:32:50
Cでも行儀のいいコード書けよアホ
867デフォルトの名無しさん:2010/09/14(火) 00:36:56
5流は黙ってろ
868デフォルトの名無しさん:2010/09/14(火) 05:19:28
ちゃんと整理されたグローバル・オブジェクトを使用する事は行儀の悪いコードではないよ
現場を知らない奴はグローバル=悪みたいに考えがちだけど
869デフォルトの名無しさん:2010/09/14(火) 06:12:31
何かごたごたがあったみたいだから、蒸し返す。

>>751
> まず変数に対しても関数に対しても
> staticの指定は「こいつの存在をリンカに知らせない」という意味があって

リンカは static 変数/関数の存在を知ってるよ。

実装の一例だけど、プログラムの実行時 static 変数は BSS に配置しなきゃいけないし、
static 関数は実行可能領域に配置しなきゃいけない。
それを行うのが OS で、それを指示するのがコンパイラ、それを伝えるのがリンカ。
だから、リンカは static 変数/関数の存在を知っていなければいけない。

ついでに関数内 static 変数だけど、これも BSS に配置しなきゃいけないので、リンカ
はこれを処理して OS に伝える。
つまり、関数内 static 変数はグローバル static 変数同様、内部リンケージを持つ。

まとめると、static の付いた変数は、そのスコープにかかわらず内部リンケージを持ち、
かつ BSS に配置される (静的変数となる)。
「かつ」 の前後で区切るなら 「static の意味は 2 種類ある」 と言えなくもないけど、書く
場所によって意味が変わる、という事は無い。

まあ実際のところ、内部リンケージって言うけど、実はユニークになるであろう複雑な
リンケージ名がコンパイラによって割り当てるだけで、リンカにとっては外部リンケージ
と内部リンケージの差はない。
870デフォルトの名無しさん:2010/09/14(火) 07:26:08
> 関数内 static 変数は(略)、内部リンケージを持つ。

無リンケージだよ。
871デフォルトの名無しさん:2010/09/14(火) 07:27:27
>>867 我流も黙ってろよw
872デフォルトの名無しさん:2010/09/14(火) 08:26:24
Cの仕様に不満があるなら、マクロなりプリプロセッサなりを駆使して自分なりに納得のいくものにすればいいじゃん^^
873デフォルトの名無しさん:2010/09/14(火) 09:10:51
何その、自国の法律に不満があるなら政治家になって独裁でも良いから
自分にとって都合の良いものに変えてしまえ、みたいなモノポリーかっけぇ〜
874デフォルトの名無しさん:2010/09/14(火) 12:11:32
>>873
なければ作る
それだけのこと

どうやったら政治家が出てくるの?
875デフォルトの名無しさん:2010/09/14(火) 12:19:48
>>869
OS がない環境もあるわけだが
876デフォルトの名無しさん:2010/09/14(火) 12:21:11
Photoshopやillustratorって何の言語で開発されているのでしゅか
877デフォルトの名無しさん:2010/09/14(火) 12:24:02
ttp://homepage2.nifty.com/kujira_niku/okayu/misa.html
こうですか?、わかりません><
878デフォルトの名無しさん:2010/09/14(火) 12:41:57
#! /usr/bin/misa

ごっ、ごぉおっ、ご〜きげんよおぉおおぉおほっ。ほおぉおぉおっ。

「ごきげん☆みゃぁああ”あ”ぁ”ぁああ〜っ」

さわやかな朝の☆ご挨拶! お挨拶がっ。
澄みきった青空にこだましちゃうぉ〜ああぉおおおぉん。

「は、はひっ、はろおぉっ☆わぁるどおおぉっぉ〜っ」

こ、この文章は☆おサンプル! おおぉおぉおおサンプルプログラム!!
どんなおプログラム言語でも基本のご挨拶させていただくのぉぉおッ!

「ぽうっ」

長々と書くのがこ、ここでの〜、ここでのぉおおぉおぉぉおたしなみぃぃいぃ。

「長いぃ。長すぎましゅう。ご挨拶にこんなプログラム長すぎまひゅぅうぅ☆
 んおおぉぉ、ばかになる、おばかになっちゃいましゅ〜ッ」

長いのがっ、バッファの奥まで入ってきましゅたぁあぁあっ!
ばっふぁ☆溢れちゃいまひゅぅ〜。あみゃぁあ”あ”ぁ”ぁああ”あ”ぁぁ。

「で、出ます☆ んおおぉぉおおっ、エラー出ちゃいまひゅっ」

ほひぃ☆! え、えらーっ、んお”お”ぉお”お”ぉおぉおおぉっっ。

「出た☆ 出た出た出た出たぁぁあっ えらあぴゅるーっって出たあぁっ」

はしたない☆! ぉおおぉはしたないっ! おはしたない言語ですっっっっっっっ!
おほっほおぉっっっほおぉっっっっっっっっっ
879デフォルトの名無しさん:2010/09/14(火) 12:44:14
return 1;
880デフォルトの名無しさん:2010/09/14(火) 14:19:30
このスレは>>869みたいな知ったか大嘘つきが多いんですか?
881デフォルトの名無しさん:2010/09/14(火) 14:21:21
煽りのほうがずっと多いけど
882デフォルトの名無しさん:2010/09/14(火) 15:04:28
unsigned int x = (大きなint)*(大きなint);

って書いてオーバーフローしそうな場合

・intで掛け算してからunsigned intにキャスト
・unsigned intにキャストしてから掛け算
・決まってない

どれが正しいんでしょうか?
883デフォルトの名無しさん:2010/09/14(火) 16:01:27
> ・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言語からしか引用でき無いのですがどうしたら良いですか?
885デフォルトの名無しさん:2010/09/14(火) 16:18:25
>>882
1. スケーリングできないかを考える (例えば1,000,000,000は1000Mもしくは1Gと表現可能)
2. long long intを使う (ただしC99以降もしくは処理系独自拡張)
3. BCDに整形する
886デフォルトの名無しさん:2010/09/14(火) 16:30:45
>>882
どっちもダメ、浮動小数点か long long でも使え

>>883
(int)pow(2, sizeof(unsigned int) * 8) は 0 になるんじゃないの?
887デフォルトの名無しさん:2010/09/14(火) 16:37:34
static int func(void)
この識別子funcがリンカによって無視される仕様は規格書のどこに記載?
別のモジュールがfunc(void)をstatic指定無しで定義していた
場合リンク可能になる?(としたらこれも規格書準拠の仕様?)
888883:2010/09/14(火) 16:43:42
ごめん、こうね
(unsigned int)pow(2, sizeof(unsigned int) * 8 - 1)
889883:2010/09/14(火) 16:44:42
ちげえ・・・
(unsigned int)pow(2, sizeof(unsigned int) * 8) - 1
です
890883:2010/09/14(火) 16:50:10
さらにちげえ
(unsigned int)(pow(2, sizeof(unsigned int) * 8) - 1)
891デフォルトの名無しさん:2010/09/14(火) 17:16:12
fuck()
892デフォルトの名無しさん:2010/09/14(火) 17:27:23
#include <stdio.h>
void fuck(void);

int main(){
fuck();
return 0;
}

void fuck(){
while(1){
printf("FUCK!\n");
}
}
893デフォルトの名無しさん:2010/09/14(火) 17:28:26
普通無限ループにはスリープを入れるものだろう
894デフォルトの名無しさん:2010/09/14(火) 17:57:37
つーか無限ループなんて使うなよ
以前引き継いだ前任者のコードで無限ループが使われてて
アラートが無限に鳴り響いてオペレータ連中にさんざん文句言われたよ
前任者の低脳ぶりに生まれて初めて殺意を抱いた
895デフォルトの名無しさん:2010/09/14(火) 17:59:41
それは無限かどうかって問題じゃないね
有限でもブラクラみたいなメッセージボックスに殺意を覚えることはよくあるし
896デフォルトの名無しさん:2010/09/14(火) 18:00:11
確実に抜けるようになってれば無限ループは別に良いと思うけど
897デフォルトの名無しさん:2010/09/14(火) 18:09:26
>>874
>Cの仕様に不満があるなら、
仕様や基本構造まで作り変えたら、それがC言語と言えるものになるんだろうか?w
もはや言語の設計者。作れば良いって、その言語を使う以上その言語で
出来る範囲内、あるいはその仕様に基づいてってことだから、その国家で通用する
法律の範囲内で自由に活動するくらいしか出来ませんよ。
898デフォルトの名無しさん:2010/09/14(火) 18:15:35
きみら甘いよ

無限じゃなければいずれ鳴り止むんだから深夜にタクシーで出社しなくても翌朝対処でよかった
想定内の分岐なら確実に抜けると思って作られていても外的要因の想定外のデータ不整合などには対処できない
そもそも無限ループを使うのは明らかに確実に手抜きでしかない
899デフォルトの名無しさん:2010/09/14(火) 18:20:10
>>892

void _3pu(void)
{
int i=0;
while (i<100000000) { i++; }
}
900デフォルトの名無しさん:2010/09/14(火) 18:20:47
>>898
だからそれはループが無限か有限かって問題じゃない
901デフォルトの名無しさん:2010/09/14(火) 18:22:40
>>898
それは無限ループが悪いんじゃなくて、
翌朝やればいいような内容でアラートを鳴らすのがわるいんじゃね
902デフォルトの名無しさん:2010/09/14(火) 18:29:12
>>896
それじゃ無限ループじゃねーだろw
903デフォルトの名無しさん:2010/09/14(火) 18:32:13
for(;;)やwhile(1)のことを無限ループと呼ぶんじゃないの
904デフォルトの名無しさん:2010/09/14(火) 18:33:34
例えばJavaでもC++でも独自のライブラリは定義できるが
その定義や中身(コードの記述、スタイルなど)はやはり
その言語の仕様(ルール)に基づく。変数の定義など。
演算子といった共通して使えるものもあるが、ライブラリみたいな
各自で自由に作れるものは、別に違反していなければ
特別に法の番人に許可を得るような手続きは必要はない。
必要最低限のことに従えば良いんだし。
規定の範囲内なら自由に家を建てられるだろ?移動できるだろ?
そういうことさ。
905デフォルトの名無しさん:2010/09/14(火) 18:50:26
どこの誤爆だ?
906デフォルトの名無しさん:2010/09/14(火) 18:57:44
>>887
別のモジュールが定義していたっていうのはプロトタイプ宣言の事?だったらリンク不可
907デフォルトの名無しさん:2010/09/14(火) 19:01:41
>>898
サーバープログラムを無限ループ無しで書けるものなのか?
イベントドリブンも無限ループ無しで書く事は不可能だと思うんだが
908デフォルトの名無しさん:2010/09/14(火) 19:07:49
>>900
無限ループが問題だったんだよ
何故ならオレは鳴り止まないアラートを止めに行ったんだからw

>>901
それは単なる結果論
正常時以外はアラートを出すのが運用
調べてみたらさっき書いたとおり外的要因だった
でもそれは1回アラート上げて終了すれば済む話
909デフォルトの名無しさん:2010/09/14(火) 19:11:08
どっちが結果論なんだか
910デフォルトの名無しさん:2010/09/14(火) 19:13:26
>>908
有限なら【いつ】鳴り止むはずだったんだ?
911デフォルトの名無しさん:2010/09/14(火) 19:14:41
>>908
その運用なら正常以外は深夜出社するのも止むを得ないんじゃね
912デフォルトの名無しさん:2010/09/14(火) 19:28:54
つーかおまえらマ板でやれようざいから
913デフォルトの名無しさん:2010/09/14(火) 19:30:06
問題が起きたからアラート出たんだろ。
放置して済むようなものじゃなかったらどうする?
一回鳴っただけのアラートで、気付かれなかったらどうする?
914デフォルトの名無しさん:2010/09/14(火) 19:34:16
>>910
修正後はエラー時は1回アラート上げて終了するようにしたよ
ようするに問題だったのはエラー内容じゃなくて、いらん所で無限ループ使ってたことだよ
915デフォルトの名無しさん:2010/09/14(火) 19:38:47
>>914
2回ではいけなかったのか?
916デフォルトの名無しさん:2010/09/14(火) 19:39:01
無限ループ使ってたのが問題じゃなくて、
アラート後に終了しなかったのが問題なんじゃね?
917デフォルトの名無しさん:2010/09/14(火) 19:41:08
アラート鳴らして人呼んで復旧できるのならいいが、
そうでもないなら黙ってエラーログ吐いてオチとけw
918デフォルトの名無しさん:2010/09/14(火) 20:19:05
プログラム止める事くらい誰でもできると思うんだが、その程度の人材を常駐させられない運用に最大の問題が....
919デフォルトの名無しさん:2010/09/14(火) 20:21:30
もはやループの問題ではなかろうと問うてみたが返事がないな
920デフォルトの名無しさん:2010/09/14(火) 20:33:15
#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
俺思うんだけどさ
このスレってなんだかんだで勉強になるよね
922デフォルトの名無しさん:2010/09/14(火) 20:46:14
>>918
問題なのは知識じゃなくて責任の所在だよ。
おまえには解らんのかも知れないがな。
923デフォルトの名無しさん:2010/09/14(火) 20:47:29
コールバックって結局ポーリングなの?
while(1)
{
  if(...){
    関数ポインタに設定された関数を実行()
  }
  sleep(1);
}
こんな?
924デフォルトの名無しさん:2010/09/14(火) 20:50:51
>>923
アプリケーションから見る限りは違う
OSからみればポーリングかも
925デフォルトの名無しさん:2010/09/14(火) 20:51:50
>>922
オペレータキャンセルができるって前提に同意しないのはわかったよ
だがここで問うているのはそんなことではなく、ループがどうであるべきかだ

タクシーがどうとかみたいのはマ板でやってくれ
926デフォルトの名無しさん:2010/09/14(火) 20:55:28
>>923
単なるサブルーチンコール
927デフォルトの名無しさん:2010/09/14(火) 21:00:13
for (;;){
if (hoge) break;
}

こういうことするやつアホ過ぎるだろ。
結局は条件があるなら最初から入れとけよ。

while (!hoge){
}

アホの書くコードは読みたくないわ。
928デフォルトの名無しさん:2010/09/14(火) 21:02:49
>>927
コンピュータ好きで、そんなクソみたいなプログラミングする人いるの?

職業プログラマーにはアホみたいに沢山いるけど
929デフォルトの名無しさん:2010/09/14(火) 21:06:52
>>928
たくさんいるんだよw
そしてそいつが知らないところで他人に迷惑かけてんだ
930デフォルトの名無しさん:2010/09/14(火) 21:07:32
pythonにはdo-whileが無いからそんな感じだけど
931デフォルトの名無しさん:2010/09/14(火) 21:09:52
while((???)||
   (???)||
   (???)||
   (???)||
   (???)){

 if(???) break;
}

これなら見たことある。
932デフォルトの名無しさん:2010/09/14(火) 21:11:30
breakの前後に処理がある場合にはループの途中で抜けるだろ
933デフォルトの名無しさん:2010/09/14(火) 21:11:36
抜ける条件が複数ある場合for(;;)みたいにするけど

for(;;){

何かの処理
if(....)
continue;
else if(....){
break;
}

何かの処理
if(....){
break;
}

}
934デフォルトの名無しさん:2010/09/14(火) 21:15:03
>>933
それ微妙じゃない?
935デフォルトの名無しさん:2010/09/14(火) 21:15:05
ムリにwhile使うと小括弧の中が数十行に成る場合もあるからね
936デフォルトの名無しさん:2010/09/14(火) 21:18:36
>>929
コンピュータ好きでもない奴がプログラマーになると、本当にすごいコードを書くよな
「まぁ〜これでいいんだ」とか言ってる時点で終わっている
937デフォルトの名無しさん:2010/09/14(火) 21:22:10
>>933
関数に切り出してreturnでいいんじゃない?
C言語の*入門者*向け解説スレッドです。
★前スレ
C言語なら俺に聞け(入門編)Part 68
http://hibari.2ch.net/test/read.cgi/tech/1282536520/
★過去スレ
http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
★教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 139代目
http://hibari.2ch.net/test/read.cgi/tech/1280653311/
★C++言語については避けてください。C++対応明記スレへどうぞ
★分からない事をなるべく詳しく書いて下さい。
★ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
939デフォルトの名無しさん:2010/09/14(火) 21:24:56
お前ら普段どんなすごいソフト作ってるの?
940デフォルトの名無しさん:2010/09/14(火) 21:25:39
>>933
さっそく一人出てきやがったw
941937:2010/09/14(火) 21:26:34
関数を作るほどもない小さな処理の場合933みたいなる
char *の文字列操作だったり
942デフォルトの名無しさん:2010/09/14(火) 21:27:38
>>939
2chでよく見かけるのは、「お前らが普段必ず使ってるはずのもの」とかいう曖昧な答えだな
943941:2010/09/14(火) 21:28:02
間違えた
941の名前が937になってる
941です
944デフォルトの名無しさん:2010/09/14(火) 21:28:47
>>943
え?
945デフォルトの名無しさん:2010/09/14(火) 21:31:26
>>942
おれは見たこと無いな、そういう答え。
946デフォルトの名無しさん:2010/09/14(火) 21:32:05
>>944
>>933==941==943ね
941の名前を間違えて937にしてしまった
だめぽorz
947デフォルトの名無しさん:2010/09/14(火) 21:34:16
静的グローバル変数をNULL or 0で初期化することは、
バカな事ですか?
948デフォルトの名無しさん:2010/09/14(火) 21:38:32
>>947
NULL とか 0 であることに意味があるなら初期化するべき
949デフォルトの名無しさん:2010/09/14(火) 21:40:05
>>947
バカなやつが見ても文句を言われないようにする
950デフォルトの名無しさん:2010/09/14(火) 21:42:46
>>937
姑息だな。そういう問題じゃねーから。
951デフォルトの名無しさん:2010/09/14(火) 21:44:19
>>947
それだけの条件では判断不可。
952デフォルトの名無しさん:2010/09/14(火) 21:49:37
>>939
おまえらが生きてるこの世界がそれだよ。
953デフォルトの名無しさん:2010/09/14(火) 21:53:22
>>952
バグだらけじゃん。早く修正しろよ
954デフォルトの名無しさん:2010/09/14(火) 21:54:17
>>953
しょうがないね
955デフォルトの名無しさん:2010/09/14(火) 21:58:19
0になるのは保障されてるけど、
NULLになるかは保障されてなくね?
956947:2010/09/14(火) 22:00:06
>>948,>>950
設定ファイルをどこに保存するかを、変数に入れておきたいのですが
静的グローバル変数をどうやったら、初期化できるのかわからないので
957デフォルトの名無しさん:2010/09/14(火) 22:03:00
>>956
ローカル変数と同じじゃない?

char path[] = "…";
958デフォルトの名無しさん:2010/09/14(火) 22:04:07
>>947>>956 がどう繋がるのか解らないのは俺が馬鹿だからですか?
959デフォルトの名無しさん:2010/09/14(火) 22:25:21
>>955
いやいやいやいや
960デフォルトの名無しさん:2010/09/14(火) 22:32:54
>>927
いやね。気がつくと
for(;;) [
ぐちゃぐちゃ
if (hoge) break;
むにゅむにゅ
}
と書いてしまうことが多々あって‥‥やっぱだめですかね?
961デフォルトの名無しさん:2010/09/14(火) 22:36:07
>>955
NULL == 0 だから保障されている。なんだったら NULL なんかは忘れて 0 と書いてしまえば悩むこともない。
http://www.kouno.jp/home/c_faq/c5.html#0
962デフォルトの名無しさん:2010/09/14(火) 22:39:12
ループ抜ける条件が複数あって逐次変化する場合はbreakで抜けていいだろ
963デフォルトの名無しさん:2010/09/14(火) 22:44:35
break多用するやつはたいてい構造を整理できてない
理由としてはgoto多用するのと何ら変わらん
964デフォルトの名無しさん:2010/09/14(火) 22:48:03
極論を吐く奴だな
965デフォルトの名無しさん:2010/09/14(火) 22:49:28
breakで処理が複雑化して困ったことなんて無いんだけど
966デフォルトの名無しさん:2010/09/14(火) 22:49:38
>>961
>>955は、calloc()のような初期化をイメージしてるんじゃないの?

http://www.kouno.jp/home/c_faq/c1.html
1.30のほうにnullで初期化されるって書いてあるけど。
967デフォルトの名無しさん:2010/09/14(火) 22:50:32
breakやcontinueがgotoと同じって理解してるやつのほうが分かってないよな。
968デフォルトの名無しさん:2010/09/14(火) 22:52:53
>>967
おまえこそ、なぜ continue を例に挙げた?
969960: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 でうまくつかえないものか?
970デフォルトの名無しさん:2010/09/14(火) 22:54:00
>>968
breakとcontinueをgotoと同一視してるやつを何度となく見てるから。
971デフォルトの名無しさん:2010/09/14(火) 22:54:54
>>970
おまえ自身がそこから continue は別問題と仕分けることはしなかった(できなかった)のだな?
972デフォルトの名無しさん:2010/09/14(火) 22:58:20
いきなりどうでもいい部分を攻撃し出したぞこいつ。
973デフォルトの名無しさん:2010/09/14(火) 22:59:27
>>971
なんで別問題なの?
どちらもgotoとはちがう制御をgotoと同一視してるって同じカテゴリだけど。
974デフォルトの名無しさん:2010/09/14(火) 23:03:57
ループ処理で追跡が困難なバグに直面した経験がないので
別にbreakつかおうがなんでもよくね、趣味の問題だろ
975デフォルトの名無しさん:2010/09/14(火) 23:05:30
break使ってダメな理由が思いつかない
976デフォルトの名無しさん:2010/09/14(火) 23:05:39
>>969
構造体に関数ポインタが設定されてんだよな?!

試してないが、これでイケるはず。(間違ってたらすまね)

while (f1.get(c), !f.eof()) {
f2.put(c)
}

f1.get(c)がvoidじゃないなら、カンマ演算子じゃなくて
&&かとかでも出来るかもだがケースバイケース。
977デフォルトの名無しさん:2010/09/14(火) 23:08:28
>>976
コピペしたら;がなかった・・・・orz
978デフォルトの名無しさん:2010/09/14(火) 23:13:37
for(;/*ここや*/;/*ここ*/)が空やカウンタだけならいいけど外部に影響与える式入ってたらヤバいじゃん
分かってて使う筈だけど思考ブレーキ無しにbreakつかうお人も居るかも知れんし
979デフォルトの名無しさん:2010/09/14(火) 23:15:17
それはbreakが問題なんじゃなくて
ループ処理自体とそうじゃない処理をごっちゃごちゃにしてるのが問題
980デフォルトの名無しさん:2010/09/14(火) 23:17:42
いや普通にforでいいんじゃね。
ぱっとみ格好悪いか?

for(f1.get(c);!f.eof();f1.get(c)){
f2.put(c);
}

最後の一文字の扱いが気になる。
981デフォルトの名無しさん:2010/09/14(火) 23:20:58
古典的イディオムがあるだろ
982デフォルトの名無しさん:2010/09/14(火) 23:21:43
パッと見の問題じゃねーよ
983デフォルトの名無しさん:2010/09/14(火) 23:24:16
for(;;)
{
 if (f1.eof()) break;
 f1.get(c);
f2.put(c);
}

これじゃなぜいかん
984デフォルトの名無しさん:2010/09/14(火) 23:37:43
>>976
この書き方、最近疑問におもうようになったんですよ。
while( ) の括弧の中を、カンマ演算子や論理積でつないでいくものです。

while() のなかに書ききれなかったらどうするのか?
while() のなかに押し込むくらいなら、
for(;;) { ぐちゃぐちゃ if() break; むにゅむにゅ }
の方が自然ではないのか?

最近は
if ((fp = fopen()) == NULL)
という書き方もあまりしないようですし。
985デフォルトの名無しさん:2010/09/14(火) 23:39:05
一行に式をいくつも書くfor文自体が美しくない
986デフォルトの名無しさん:2010/09/14(火) 23:41:32
>>880
嘘だと思うならそう思ってればいいよ。
>>869 は VC の実装に基づいた事実だから。
987デフォルトの名無しさん:2010/09/14(火) 23:42:06
>>983
ファイルをオープンした直後は eof() の値は 0 である、という決め事に依存しているからですよ。
ファイルの読み込みや eof の問題ならまだしも、ハードウェアを叩いていると、
「何かの操作をしないと、状態がわからない」という場合にわりあいに頻繁に直面するんです。
そういったとき
for(;;) { ぐにゅぐにゅ if () break; むちゃむちゃ}
が便利、というか自然、というか、ああやっぱり疲れているんだなあ。
988デフォルトの名無しさん:2010/09/14(火) 23:51:42
eof() が必要なのってノンリニアなアクセスする場合だけだろ。
そもそもレアケースだし。
989デフォルトの名無しさん:2010/09/14(火) 23:54:38
>>980
f1.get(c) を二度かかないといけないのがいやじゃないですか?
f1.get(c) にあたる部分がボリュームのあるものだと、特に。

for (;;) {
f1.get(c)
if (f1.eof()) break;
f2.putc(c)
}
だったら、f1.get(c) (とかそれにあたる部分)を一度かくだけですむでしょう?
990デフォルトの名無しさん:2010/09/15(水) 00:04:55
なぜ可読性落としてまでforの条件式に色々押しみたがるのか謎
991デフォルトの名無しさん:2010/09/15(水) 00:06:55
例のコードがbreak云々以前にキモい件。Cの畑の書き方じゃないだろ。
992デフォルトの名無しさん:2010/09/15(水) 00:08:22
>>990
おまえは本質的に問題がわかってないだろ。
993デフォルトの名無しさん:2010/09/15(水) 00:10:23
forの中はカウンタかイテレータぐらいしか書かないぞ普通
アルゴリズムの部分に具体処理かくなんてなんか逆行しとる
994デフォルトの名無しさん:2010/09/15(水) 00:10:39
findfirst, findnext みたいな形に作らないのが悪い。
995デフォルトの名無しさん:2010/09/15(水) 00:13:44
あえて選ぶなら >>976 を支持。
ただ、こんなザマになった時点で既に設計ミスだろ。
996デフォルトの名無しさん:2010/09/15(水) 00:19:03
処理と条件をごっちゃにして良い事なんてなんもないし
997デフォルトの名無しさん:2010/09/15(水) 00:21:37
>>995
設計ミスもなにも、単純な fstream でもこんなざまになってしまうのですから、世の中の大概のものはこんなパターンになってしまうのでは?
で、while() のなかにカンマ演算子で押し込むくらいなら(以下略)
998デフォルトの名無しさん:2010/09/15(水) 00:22:01
999デフォルトの名無しさん:2010/09/15(水) 00:24:44
f1.get(c) が EOF 返すようにすればいいだけじゃん。
1000デフォルトの名無しさん:2010/09/15(水) 00:29:29
いや、設計ミスだろ。
イテレータみたいな使い方したいんだったら、そういう抽象を提供しろ。
実装の詳細に依存したループ処理を書かせないようにしなきょ。
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。