12/01/13 23:59:58.19
野田改造内閣に早速疑惑浮上
@aritayoshifu 有田芳生
捜査当局が内偵を続けている農水疑惑。詳細な怪文書まで出回っている。3億円の
行方はどこに?
@minorucchu ジャーナリスト 田中稔
野田改造内閣を揺るがす、農水省3億円スキャンダルの怪文書。二人の議員名が浮上。
34分前 webから
URLリンク(twitter.com)
鹿野と筒井らしい
自公は問責も視野に調査開始だって
3:デフォルトの名無しさん
12/01/14 00:01:34.02
オイ俺のコピペ脳!まで読んだ。
4:デフォルトの名無しさん
12/01/14 10:53:25.48
int main() {
char* str1[10]; //定義しただけで初期化していない。つまり文字列は格納されていない。
func1( &str );
}
void func1( char* str ) {
char* inStr;
str = "test data";
return ;
}
質問なんだが。
なぜ、きちんとstrに文字データが格納されるんだろうか?
5:デフォルトの名無しさん
12/01/14 11:01:18.98
タブスペースで書き込んじまった
int main() {
char* str1[10]; //定義しただけで初期化していない。つまり文字列は格納されていない。
func1( &str );
}
void func1( char* str ) {
char* inStr = "test";
inStr = anotherFunc() ;
str = inStr + 1 ;
return ;
}
質問なんだが。
なぜ、きちんとstrに文字データが格納されるんだろうか?
main 関数でstr のポインタ領域は確保されているが、その参照先の文字列領域は未確保。
func1にとんだ先では、自動変数inStr に文字列が格納されており、そのポインタを渡すことでstrの中身に具体的なポインタが入る。
func1内では、str のポインタの指し示す先は自動変数inStrと同じポインタであり、参照できて当然。
ところが、return すると、自動変数inStr の内容はスタックを戻すことにより開放されている。
return された後にmainにてstrを参照しても全く問題ないし、キチンと値が格納されている。
値が参照できるのは、たまたまナノか?
この操作は問題ない?
6:デフォルトの名無しさん
12/01/14 11:03:11.76
まずはコンパイルが通るか自分で確認してから書き込め
7:デフォルトの名無しさん
12/01/14 11:10:20.15
最初のスタックへのアドレスがまずさ迷い人に成って5ではfunc1のリテラルも全く無意味になって更にアナザの返値の先頭バイトまで無意味に成ってる。
8:デフォルトの名無しさん
12/01/14 11:16:53.05
>>6
あいよ。
int main(){
char* str[10]; //定義しただけで初期化していない。つまり文字列は格納されていない。
func1( str );
}
void func1(char* str[] ) {
char* inStr;
inStr = anotherFunc() ;
str[1] = inStr + 1 ;
return ;
}
char* anotherFunc(){
return (char*)"test";
}
9:デフォルトの名無しさん
12/01/14 11:17:18.80
>int main() {
> char* str1[10]; //定義しただけで初期化していない。つまり文字列は格納されていない。
>
> func1( &str );
>}
変数名ちゃうやん。
>void func1( char* str ) {
型ちゃうやん。(char ** → char *)
10:デフォルトの名無しさん
12/01/14 11:18:37.34
>>7
>更にアナザの返値の先頭バイトまで無意味に成ってる
戻り値として、「est」が欲しいのでそうなってる。
11:デフォルトの名無しさん
12/01/14 11:19:33.12
str[1]="test"+1;
12:デフォルトの名無しさん
12/01/14 11:27:47.89
>>11
anotherFunc の return は、例えば「Content-Type: application/x-javascript」
その中で「application/x-javascript」を取り出したい。
13:デフォルトの名無しさん
12/01/14 11:34:46.94
char* anotherFunc(){
return (char*)"test";
}
がもし、
char* anotherFunc(){
return (const static char*)"test";
}
なら、BSSなり、テキスト領域なりに格納されると思う。
テキスト領域かな?
でも
char* anotherFunc(){
・・・
何がし処理
・・・
return buf ; //bufには「Content-Type: application/x-javascript」文字列が格納
}
であるならコンパイルエラー(local address云々)
ここまでなら分かる。
14:デフォルトの名無しさん
12/01/14 11:59:47.56
"test"はプログラムをメモリ上に読み込んだ時点で確保されてる。
開放されるのはプログラム終了時。
return (char*)"test";
も
char *inStr = "test";
return inStr;
も、書き込みをしなければ問題ない。
但し
char inStr[] = "test";
return inStr;
は駄目。
15:o
12/01/14 12:00:08.37
ところが、>>8 における inStr はfunc1のスタックに積まれる。
いくら、str[1]にポインタを代入したところで、参照しているのはfunc1のスタック上にあるinStrのアドレスである。
func1がリターンしてしまうと、スタックは破棄( ただ単にゼロクリアしていないだけ)な気がする。
結局うまく言っているように見えるのはスタックが破壊されていないから?かな、と。
16:o
12/01/14 12:05:30.40
>>14
返信ありがと。
str[1]に書き込んでmainで参照するにはどうするのが良い?
17:デフォルトの名無しさん
12/01/14 12:08:12.05
ならないよ。
>8 の inStrはいわばメモ書き。
"test"の場所が書かれてるだけ。
str[1]に内容をコピー(1足してるけど)した後に消える。
住所書かれてるメモ紙を捨てたらその住所が消滅するわけじゃあるまい?
18:o
12/01/14 12:10:32.04
あ、
念のため・・・
char* str[10] は、10個の不定長の文字列を格納する10個のポインタです。
最終目的は、sub関数から不定長の文字列を設定したい、と言うことです。
19:o
12/01/14 12:14:47.41
>>17
最終的に聞きたいのは、スタティックなリテラル値ではなく、ダイナミックな変数の値です。
つまり、
inStrの具体的な値を、str[1]に入れ込むためにはどうしたらよいのか?と言うことです。
20:デフォルトの名無しさん
12/01/14 12:14:47.84
【話題】女子にイラッとされる「理系男子特有の話し方」9パターン★2
【1】「要するに」と他人の話もまとめてしまう
【2】「違う」と小さな間違いでもいちいち訂正する
【3】「化学反応だから」などロマンチックなことにも根拠を述べる
【4】「仮に」など自分の専門分野でたとえたがる
【5】「具体的には?」と曖昧な表現でなく数字を知りたがる
【6】「データがあるから」と他人の意見を受け入れない
【7】「わかる?」と難しい説明の後で上から目線の確認をする
【8】「ありえない」など決めつけて断言する
【9】「だから?」とオチを先に聞きたがる
要するに馬鹿しか女子とはお話出来ないということだな
21:デフォルトの名無しさん
12/01/14 12:27:51.39
1, 2, 7, 8は理系文系関係なく糞爺にも当てはまるw
22:デフォルトの名無しさん
12/01/14 12:35:19.42
>19
>8 の
>str[1] = inStr + 1 ;
でいいんじゃないの?
23:o
12/01/14 12:40:46.42
>>22
うむむ。
分からないのは、
「inStr+1」で指定されたアドレスは、func1がreturnされると開放されるメモリアドレスじゃないですか?
そうすると、そのアドレスを入れ込んだstr[1]の内容(=アドレス)も開放されてしかるべきアドレスじゃないかと?
24:デフォルトの名無しさん
12/01/14 12:43:49.29
17を100回読め
25:o
12/01/14 12:43:50.36
コンパイルエラーでできないんだけれども、こんなことをやりたいんだと言うことです。
*( str[1] ) = *( inStr + 1) ;
26:o
12/01/14 12:46:49.28
>>24
20回読みましたデス。足りないかな?
スタティックなリテラル値の話ではなく、自動変数に格納されている値を戻したいと言うことですが・・・
戻すとき、リターン値はエラーコードで使用されていますのでリターンで戻すのは不可です。
なのでfunc1にポインタで渡して、その内容を更新したい、ということです。
もう20回読んでみます。
27:o
12/01/14 12:51:23.74
後だしと言われるのを避けるために、実際のコードの説明をしますが、
実際にはfunc1 には構造体を渡しています。
正確には構造体のアドレスを渡してます。
構造体は
typedef struct s{
char* field[MaxHeaderNum];
char* attrib[MaxHeaderNum];
}S;
28:デフォルトの名無しさん
12/01/14 12:53:18.74
こうか?
str[1] = (char *)malloc(strlen(inStr + 1)+1) ;
if(!str[1]){
/*エラー処理*/
}
strcpy( str[1] , inStr + 1);
29:o
12/01/14 13:01:30.86
>>28
すんばらしい。
そういうことです。
はじめはそのように書いていたのですが、
非常に頻繁に呼ばれることと、
mainのなかでいつfreeすればよいのかが不定であることや、
関数を変にまたがってしまう、
などなどの複雑な問題により諦めてしまいました。
で、コードをシンプルにする方法でのアプローチでコーディングしなおしてます。
ヒープを使わなければ無利なのでしょうか?
30:デフォルトの名無しさん
12/01/14 13:05:33.73
とりあえず
char* str[10]
をゼロクリアしてから使え。
あとは終了時とmallocする前にNULLで無ければfreeするような処理書いとけばいいんじゃね?
31:o
12/01/14 13:16:46.64
>>30
だんけ
ってことは、>>8はたまたまうまく行っているだけってことかな?
32:デフォルトの名無しさん
12/01/14 13:48:33.33
長引いてるな…
>スタティックなリテラル値の話ではなく、自動変数に格納されている値を戻したいと言うことですが・・・
自動変数に~というなら、malloc でヒープに領域を確保して、外部で解放するしかない。
自動で解放して欲しいのなら、C++ に行ってデストラクタなり std::string なりに頼る。
>>8 はスタティックなリテラルのポインタを返してるので、たまたまではなく正常に動作する。ただし貴方の求めているものではない。
33:デフォルトの名無しさん
12/01/14 14:04:28.58
メールとかの通信関係の処理か?
クラス化の設計とか楽しそうだなぁ。
34:o
12/01/14 16:19:51.99
>>32
ありがと。
参考になります。
>>33
bingo
HTTPだけど。
移植性を考えてて、ANSI-Cベースで書いているところが、またそれはそれで、制限が多いw
35:デフォルトの名無しさん
12/01/14 16:39:47.31
>>15の
> 参照しているのはfunc1のスタック上にあるinStrのアドレスである。
これが間違えていることには気づいているのだろうか
inStrのアドレスは&inStrな。
36:o
12/01/14 16:41:00.07
>>35
宣言が、
char* inStr だけれども?
37:デフォルトの名無しさん
12/01/14 16:44:53.84
反日ネット工作員
朝日新聞社→社員約300人
民主党とその取り巻きの資金が入った反日工作会社→数社約450人
朝日新聞の社員は捕まった49歳の編集者を含め新聞記事を書く合間に2chを荒らしている程度とみられているが
民主党が用意した反日工作会社はほぼ24時間体制で工作を行っている
工作範囲は民主党が予め工作費を流している2ch、ニコニコ動画を中心にyoutube、個人のブログなどである。
38:デフォルトの名無しさん
12/01/14 17:33:17.30
>19
>inStrの具体的な値を、str[1]に入れ込むためにはどうしたらよいのか?と言うことです。
「inStrの具体的な値」と言ったらinStrに代入されてる"test"のアドレス値のことだろ。
それが
>28
が正解というなら
「inStrのポインタが示す先の文字列をコピーして、str[1]に入れ込むためにはどうしたらよいのか?」
と言うべきだろ。
まぁ、そう言えるぐらい理解できてるなら質問もしてこないだろうが。
39:デフォルトの名無しさん
12/01/14 17:53:22.36
>>36
だから?
40:デフォルトの名無しさん
12/01/14 18:06:19.42
sizeof(char *) == sizeof(int)
なら
void func1(char* str[] ) {
int inStr;
inStr = (int)anotherFunc() ;
str[1] = (char *)(inStr + sizeof(char)) ;
return ;
}
としても同じ結果なんだよ。
41:デフォルトの名無しさん
12/01/14 18:29:39.07
intptr_t 使えよ
42:デフォルトの名無しさん
12/01/14 18:47:25.84
>>40
日記ならチラシに
43:デフォルトの名無しさん
12/01/14 19:56:46.82
別名便所の壁の2chがチラシより上とな!?
44:デフォルトの名無しさん
12/01/15 00:10:00.07
便所の壁はみんなの目に触れるからな
45:デフォルトの名無しさん
12/01/15 00:33:43.37
都内じゃ1500枚ほどチラシが貼られたらしいな。
46:o
12/01/15 07:51:27.88
>>38
>「inStrのポインタが示す先の文字列をコピーして、str[1]に入れ込むためにはどうしたらよいのか?」
コピーして
の部分が全く違う。
コピーしてよいのなら、解決法はいくつでもある。
47:デフォルトの名無しさん
12/01/15 10:35:38.71
>46
>28
>strcpy( str[1] , inStr + 1);
コピーしてるやん。
違うというなら正しいソース書いてみてよ。
48:o
12/01/15 11:21:44.71
>>47
多分、言いたいことの1/1000も伝わっていないんだと思う。
バッファから下ろしてきたデータは一時的にしかるべき場所に「コピーして」配置される。
俺の言っているのは、
そのしかるべき場所のポインタを渡すだけにしたいんだが、何とかならんのんかの?
という質問だが、
君は「さらに」、コピーしたらええやん、
と言っている。
49:デフォルトの名無しさん
12/01/15 11:29:50.94
その「しかるべき場所」はグローバルか何かで確保されてたり消える心配がないのであれば
そのポインタを渡すだけでいいじゃん
50:o
12/01/15 11:33:02.67
ところで、そもそも、コピーができるのか?という問題も、ある。
構造体は
typedef struct s{
char* field[MaxHeaderNum];
char* attrib[MaxHeaderNum];
}S;
ストリームデータがこのようになっているとき、(¥区切り文字)
aaaaaaa\bbbbbbbbbb\cccc\dd\eeeeeeeeeee\
↑ ↑ ↑ ↑ ↑
attrib[1] attrib[2] attrib[3] attrib[4] attrib[5]
のポインタが入る。
コピーできるん?????
コピーじゃなくて、もう一度strstrあたりできりなおさんとまずくない?????
ま、さくっとコピーできるんだったら、謝る
51:デフォルトの名無しさん
12/01/15 11:35:48.32
何を何にコピーすることを言ってるのか?
区切り文字が'\'というのは例として挙げただけ?
52:o
12/01/15 11:38:53.01
>>49
コーディング規約により、グローバル宣言ができないんですヨ
・局所的にしか利用されず
・他スレッドからの参照に問題あり
・アクセスコントロールに関与する
・マルチスレッド対応の場合
などなど。
53:o
12/01/15 11:39:23.14
>>51
そ。
\r\n = ¥
としただけ
54:デフォルトの名無しさん
12/01/15 12:12:25.05
仕事上のコーディング方法を2chで質問かよwww
55:デフォルトの名無しさん
12/01/15 12:26:55.36
みんなすげーな
オレには何を言いたいのか全然分からん
56:デフォルトの名無しさん
12/01/15 12:28:45.50
民主党が惨敗した参院選直前の政党支持率(2010年7月11日投票)
FNN 2010年7月4日
民主党 29.9% 自民党 16.3%
URLリンク(sankei.jp.msn.com)
URLリンク(www.fnn-news.com)
マスコミに、ダマされるなよ。
57:デフォルトの名無しさん
12/01/15 12:30:22.44
この子の関わったソフトが載った製品は買いたくないと思ってしまうな
①>何を何にコピーすることを言ってるのか? への回答は?
②「しかるべき領域」はスタック上?ヒープ上?それ以外?スタック上ならほぼコピーするしかない
③「しかるべき領域」は書き換えてもよい?書き換えたらダメなのであればさらにコピーするしかない
58:o
12/01/15 12:30:27.97
>>54
チートツールなんだが、なぜに仕事だと思うのかなぁwww
59:o
12/01/15 12:34:36.28
>>57
>この子の関わったソフトが載った製品は買いたくないと思ってしまうな
売り出されたら驚いちゃうんちゃう?
>①>何を何にコピーすることを言ってるのか? への回答は?
機種依存文字はどうかと思うけど。
コピーと言われたから、それを使っただけ。
>②「しかるべき領域」はスタック上?ヒープ上?それ以外?スタック上ならほぼコピーするしかない
スタック上。
main関数のスタックに積んでいればOKでしょ?
違うの???
>③「しかるべき領域」は書き換えてもよい?書き換えたらダメなのであればさらにコピーするしかない
書き換えても良いの意味が分からん。
書き換えたらダメってことは、参照もダメってこと???
意味が不明です。
60:デフォルトの名無しさん
12/01/15 12:35:48.48
>>59
お前が意味不明だな。
手繰るの面倒だからここでもう一度整理して新規に質問しなおせ。
61:o
12/01/15 12:50:30.70
>>60
君のおかげで整理できたよ。
聞きたい内容は、
呼び出し先の呼び出し先から、大元のスタックにある文字列を直接変更できるか?
ってこったな。
孫関数には、ポインタのポインタなら渡せる、と言う条件でな。
62:デフォルトの名無しさん
12/01/15 12:52:31.54
>>61
その質問の答えは、できる、だ。
63:o
12/01/15 12:53:35.05
細かい条件を列挙する。
・データはストリームで落とされる。
・孫関数にはポインタのポインタが渡される
・文字列の長さは不定長
・区切り文字がある文字列
・ストリームは、孫関数で処理される
この条件で親のスタックに詰まれた文字列を孫から操作できるかどうか?
んだな。
64:デフォルトの名無しさん
12/01/15 12:54:05.71
ちゃんと質問できるようになるまで何年もかかりそうだな
義務教育の間何やってたんだか
65:o
12/01/15 12:55:10.92
おっと。
追加があった
・データはストリームで落とされる。
・孫関数にはポインタのポインタが渡される
・文字列の長さは不定長
・区切り文字がある文字列
・ストリームは、孫関数で処理される
・staticは使えない
66:o
12/01/15 12:56:52.04
>>64
まあ、そんなことより、
>>52が仕事上のタスクだと思う方が驚きだけど。
指示されないと何もできないんかなぁ。
もしくは何でもグローバル宣言すりゃいいと思っているのかなぁ。
普通に個人のコーディング規約に含まれる常識的な内容だと思っていたんだが、これも違うのか?
67:デフォルトの名無しさん
12/01/15 13:00:25.15
>>66
>>65 を読む限りお前の考えたものではないだろうし
バカみたいな社内用語?で伝わると思ってるのがおかしい
68:デフォルトの名無しさん
12/01/15 13:00:50.73
>>65
わけのわからない条件は関係なく、元のスタック上の文字列のポインタが
わかるなら当然できるだろ。
なんでできないとか思うんだろ。
ちなみに、スタックとかストリームとか、Cには関係ないから。
69:o
12/01/15 13:12:04.29
>>68
ストリームデータは軽く64kを超えるんだが、
mainで
char streamData[131072]
とか宣言しちゃうの?
スマートじゃない気がするけどw
後々func1がスレッドで動くようになるんだし、mainがdllmainになるんだが、
どう見てもそりゃスマートとは言いがたいと思うんだけど、どうだろうか?
70:o
12/01/15 13:13:45.46
>>67
こちとら、素人だし、
チートツールの作成を企業が許可するとも思えんし、
>普通に個人のコーディング規約に含まれる常識的な内容
だと思うんだけど、違うのか?
71:デフォルトの名無しさん
12/01/15 13:16:07.60
整理して質問しろと言っただろ。
> 呼び出し先の呼び出し先から、大元のスタックにある文字列を直接変更できるか?
できる。
もう一度だけチャンスをやる。
整理して1レスで質問しろ。
72:デフォルトの名無しさん
12/01/15 13:16:59.99
>>61できたよURLリンク(codepad.org)
73:デフォルトの名無しさん
12/01/15 13:18:36.84
>>70
チートツール作るなんてことを言ってるバカに協力しねーよ
74:o
12/01/15 13:19:03.47
>>71
>できる。
こういうことだろ?
>>69
75:デフォルトの名無しさん
12/01/15 13:20:06.56
どういうことだよ。
お前、頭腐ってるわ。
76:デフォルトの名無しさん
12/01/15 13:21:02.62
o君の考えるスタックとは何を指しているのかね?
77:o
12/01/15 13:21:07.96
>>72
f2を実行しないと、str[]の大きさが分からないんだけど、それでも大丈夫ってこと?
少なくとも512byteは確実に超えるんだけど。
78:デフォルトの名無しさん
12/01/15 13:22:09.28
ここまで日本語が通じないのも珍しいな。
いや、そうでもないか。
79:o
12/01/15 13:22:30.21
>>75
>>69以外に方法があるなら、丁重に謝るよ。
80:デフォルトの名無しさん
12/01/15 13:24:14.16
>>79
お前の思い込みなんて人にはわからないんだよ。
だからお前のことを何も知らない普通の人間にわかるように整理して
1レスにまとめて質問してみろよ。
81:o
12/01/15 13:24:59.66
>>76
関数が呼び出されたことにより確保される、SP、ReturnAddressと自動変数のかまたり
82:デフォルトの名無しさん
12/01/15 13:26:10.30
スタックのサイズが心配ならスタックを拡張するなりヒープを使うなり
すればいいだけだろ。
83:o
12/01/15 13:27:07.83
>>80
あいよ。
聞きたい内容は、
呼び出し先の呼び出し先から、大元のスタックにある文字列を直接変更できるか?
条件は次の通り
・データはストリームで落とされる。
・孫関数にはポインタのポインタが渡される
・文字列の長さは不定長
・区切り文字がある文字列
・ストリームは、孫関数で処理される
・staticは使えない
84:デフォルトの名無しさん
12/01/15 13:28:38.77
だから、ストリームて何だよ。
思い込みハゲしいなまったく。
85:デフォルトの名無しさん
12/01/15 13:29:17.88
文字列を直接変更できるかどうかに長さや区切り文字は関係ないだろ。
86:o
12/01/15 13:31:05.93
>>84
不定長のデータ、でよいよ。
87:o
12/01/15 13:32:15.62
>>85
>>72のコードで、512byteのデータをどうやって変更するの?
88:デフォルトの名無しさん
12/01/15 13:33:29.91
またか。
その512byteのデータと>>72がどう関係するんだよ。
89:o
12/01/15 13:36:36.09
>>88
void f2(char* str){
str[500]='\r';
str[501]='\n';
}
ができるんだったら、何も言わんよ
90:デフォルトの名無しさん
12/01/15 13:37:19.50
>>89
じゃぁ何も言うな。
91:o
12/01/15 13:38:41.03
ああ、
void f2(char* str){
str[131070]='\r';
str[131071]='\n';
}
ができるんだったら何も言わんよwww
92:o
12/01/15 13:38:58.70
>>90
エラーが出るんですけどwww
93:o
12/01/15 13:40:11.55
そりゃそうだわな。
str[10] と宣言しているのに、
str[131070]にアクセスしているんだもんね。
>>90は、そんなことも分からないの?
94:デフォルトの名無しさん
12/01/15 13:42:43.17
何も言うなと言ってるだろ。
95:o
12/01/15 13:47:33.40
>>94
君は、回答する前に、こっちを読んで勉強した方が良いと思うよ。
URLリンク(www.kumei.ne.jp)
宣言した数より大きな領域にアクセスさせるのは危険だよ。
書き込みなんかしたら、スタック壊しちゃうからね。
気をつけたほうが良いよ。
96:デフォルトの名無しさん
12/01/15 13:48:48.34
また、えらく拗らせちゃってるんだね。
スタックのサイズが心配なら512KBをヒープに確保してそれを渡せばいいだけだろ。
まわりの人も大変だろうな。
97:デフォルトの名無しさん
12/01/15 13:49:32.86
無能な働き者ってこの質問主の様な奴の事なんだろうな。
98:デフォルトの名無しさん
12/01/15 13:50:59.22
>>95
>宣言した数より大きな領域にアクセスさせるのは危険だよ。
常識で分かることは言う必要がない。
99:デフォルトの名無しさん
12/01/15 13:53:40.36
無能な働き者。これは処刑するしかない。
100:デフォルトの名無しさん
12/01/15 13:56:50.88
ちょっとよくわからないのが
大元がmainだとして
「大元のスタックにある文字列」って
>mainで
>char streamData[131072]
以外にどうやって定義するの?
101:o
12/01/15 13:56:56.89
>>96
ヒープに確保する方法は否定していないよ。
102:デフォルトの名無しさん
12/01/15 13:59:35.77
>>100
質問もできないくらいのレベルなんだから察してやれ。
103:デフォルトの名無しさん
12/01/15 14:00:57.52
>>100
allocaで確保するとかw
104:o
12/01/15 14:04:12.54
>>103
良いね!
105:デフォルトの名無しさん
12/01/15 14:07:11.53
どこまでアホ?
alloca使ったところでスタックは拡張されない。
って、まぁ釣りだろうけどw
106:デフォルトの名無しさん
12/01/15 14:07:51.54
>>95
ストリームとやらの範囲内ならいくらでもアクセスできるでしょ。
例は10だったけど、そのストリームはもっと大きいんでしょ
107:デフォルトの名無しさん
12/01/15 14:08:49.44
>>104
allocaってスタックだよ。
ってかヒープを避ける理由がわからない。
108:デフォルトの名無しさん
12/01/15 14:10:33.82
char streamData[131072]
でも
char *streamData = (char*)alloca(131072);
でもいいけど、
結局>>72で問題なくね?
allocaってのは初めて知ったわ
109:o
12/01/15 14:12:26.25
>>107
直近の問題は、何時freeするのかが不定なことだけど、
本質的には、スレッドで動かしたいから、別スレッドからのアクセスをさせないために自動変数での処理をさせたい
と言うのが本音。
110:デフォルトの名無しさん
12/01/15 14:13:45.65
スタックはスレッドで共通だが。
111:o
12/01/15 14:14:14.13
>>108
どこからスレッドとして走らせるかだけど、
スレッドが100走ると末恐ろしい
112:o
12/01/15 14:14:31.03
>>110
なの????
113:デフォルトの名無しさん
12/01/15 14:14:33.82
別スレッドからのアクセス性についてな。
114:デフォルトの名無しさん
12/01/15 14:16:58.71
その点ではヒープもスタックも同じ。
普通、mallocもfreeもスレッドセーフだろ。
115:o
12/01/15 14:17:20.97
>>113
だったら、ストリームデータを、他のスレッドが書き換えるって事が可能というか、
別のスレッドがストリームデータを壊すんだよね。
それじゃ、NGじゃね?
116:o
12/01/15 14:17:48.14
>>114
だから、自動変数で、と・・・・
117:デフォルトの名無しさん
12/01/15 14:18:24.71
最初に立ち戻るんだけど、ストリームは別スレッドから変更されうるんじゃないのかって気がするんだけど。
もしそうならポインタ保持じゃだめだけど、それは大丈夫?
で、そのストリームが読み取り専用じゃないかつ、デリミタのような0バイトよりも大きな文字列があるのなら、strtokの要領で対応できないか?
118:デフォルトの名無しさん
12/01/15 14:18:55.57
>>116
自動変数=スタックと仮定すると>>114だと言ってるだろ。
119:o
12/01/15 14:19:40.12
>>114
すまん、間違えた。
ヒープでもスレッドセーフなのか?
ちょいと調べてみる
120:デフォルトの名無しさん
12/01/15 14:20:01.08
>>115
ポインタの先が別スレッドが確保したスタック領域ならそこを壊す。
つか、それはバグと言うんだがな。
121:デフォルトの名無しさん
12/01/15 14:20:52.74
>>119
お前はスレッドセーフという単語を理解してないに3億ペリカ。
いや、スレッドも理解してないに10億カノッサ。
122:デフォルトの名無しさん
12/01/15 14:21:39.04
「ヒープでもスレッドセーフなのか?」
これなんぞ。
根本的な知識が圧倒的に足りないといわざるを得ない。
チートツールの前に初心者としてまっとうに勉強しなさいな。
123:デフォルトの名無しさん
12/01/15 14:25:52.76
mallocがスレッドセーフか? というのならそれはライブラリ次第。
124:o
12/01/15 14:26:40.81
>>122
ヒープがスレッドセーフなんて聞いたことがない。
ライブラリが対応してスレッドセーフにしているケースなら知っているけど???
君の知っているのはどんなシステム系なんだ?
125:デフォルトの名無しさん
12/01/15 14:26:48.56
だから普通と言ってるだろ。
スレッド使う環境でスレッドセーフじゃない設定をわざわざ使わない限りな。
126:デフォルトの名無しさん
12/01/15 14:27:16.83
>>125は>>123な。
>>124
3億カノッサよこせ。
127:デフォルトの名無しさん
12/01/15 14:28:51.62
>>124
関数がリエントラント可能かどうかについてその言葉を使うのであって、スタックやヒープに対して使うもんじゃないよ
128:o
12/01/15 14:29:42.29
どう見ても、
>>122がダブルパンチ食らっているようにしか見えないけど?
129:123
12/01/15 14:30:33.99
>>125
まったくそのとおりだ。ちょっと上のスレもよまんで書いてしまった^^;
130:デフォルトの名無しさん
12/01/15 14:30:34.75
すごいなぁ、お前。
131:デフォルトの名無しさん
12/01/15 14:30:53.25
もちろん、>>130は>>128な。
132:デフォルトの名無しさん
12/01/15 14:31:21.48
なんだこれ。恥ずかしくなって暴れ始めたのか
133:デフォルトの名無しさん
12/01/15 14:33:56.98
>>132
いや、多分素だと思うぞ。
134:デフォルトの名無しさん
12/01/15 14:33:59.84
>>124
もしかして「ヒープ領域からメモリを確保すること」の略として「ヒープ」っていってんの?
135:デフォルトの名無しさん
12/01/15 14:39:16.96
…静かになったぞ。何かを調べてんのか?
136:o
12/01/15 14:41:13.91
>>133
素だよ。素人だっちゅってんだろ。
ちなみに、>>135 うんこ位させろよ。
137:o
12/01/15 14:44:26.42
で、
>>52 って
>普通に個人のコーディング規約に含まれる常識的な内容
だと思うんだけど、違うのか?
138:o
12/01/15 14:45:49.46
>>134
その、
「ヒープ領域からメモリを確保すること」
の意味が分からんけど?
139:デフォルトの名無しさん
12/01/15 14:48:24.79
素かよ。もっとやりたいことを具体的に示せ。
大体わかってるつもりでレスをしているんだが、訳わからんほうに話をずらされてる感じがする。
あと、>>127は大体あってるけど少し違う。
リエントラント可能であることはスレッドセーフであることを保障するが、逆はそうではない。
140:デフォルトの名無しさん
12/01/15 14:49:18.43
>>136
素。
ほんと、日本語も不自由なんだな。
恥ずかしくて素人じゃないって言えないだけじゃないのか?
141:デフォルトの名無しさん
12/01/15 14:52:26.93
>>138
それをわからずにヒープだスタックだ、あまつさえ「ヒープでもスレッドセーフなのか?」なんてことを言うのか。
逆に「スタックはスレッドセーフ」だと思っているってことだと思うんだけど、これがどういうことなのか説明してくれ。
142:デフォルトの名無しさん
12/01/15 14:52:32.31
>>139
そう思ってはじめたのが>>80なんだが。
143:デフォルトの名無しさん
12/01/15 14:53:39.55
違うな。>>71だ。
144:デフォルトの名無しさん
12/01/15 14:54:09.40
お?>>60じゃないのか?
145:デフォルトの名無しさん
12/01/15 14:54:17.21
>>137
>グローバル宣言ができない
個人の開発で完全に禁止する利点があまりない。
グローバル変数をできるだけしないってのはまあ誰でも考える。
個人でコーディング規約を決めていたとして、
それに違反することを「コーディング規約により・・できない」って言い方をする人はあまりいない。
俺の方針に反するだとか、好みじゃないとか、そのレベルでしょ。
146:デフォルトの名無しさん
12/01/15 14:55:24.44
素人じゃないことを隠したい素人さん。
147:デフォルトの名無しさん
12/01/15 14:55:33.69
俺も文書がおかしいなw
×グローバル変数をできるだけしない
○グローバル変数をできるだけ使わない
148:デフォルトの名無しさん
12/01/15 14:57:21.78
>>142
>>8と>>83でエスパー大会ってことか…
加えて、>>115でストリームデータ(mainのstrか?)は別スレッドから変更されうる、と。
ストリームデータを変更されたあとでも使用したいのなら、
strへのアクセス処理を「スレッドセーフ」にして、
別領域(要件を満たせるならスタックでもヒープでも)にコピーするしか方法はないよな。
149:o
12/01/15 14:57:25.09
>>141
スレッドに詰まれたスタックならスレッドセーフだろ。
150:デフォルトの名無しさん
12/01/15 14:59:49.89
>>149
すべてのスレッドはメモリ空間を共有する。
基本だ。
151:デフォルトの名無しさん
12/01/15 15:00:31.29
「スレッドに詰まれたスタック」って、何?
152:デフォルトの名無しさん
12/01/15 15:00:48.32
先にスレッドセーフの国語的な用例を調べて意味を理解してくれ
×スタックはスレッドセーフ
○スレッドセーフな関数、スレッドセーフなコード など
153:デフォルトの名無しさん
12/01/15 15:01:26.54
スタック領域がスレッドごとに確保されるってことを言いたいんだと。
154:o
12/01/15 15:01:33.54
>>146
つまり、お前涙目ってことかな。
仕方ないだろ。俺が素人なんだから。
なんか同じような内容を別のところでも書いた気がするw
155:デフォルトの名無しさん
12/01/15 15:01:43.06
>>149
意識をあわせてレスをしようとしてみる。
スレッドのスタックにあるポインタの指すアドレスを複数のスレッドが保持している場合、
そのアドレスはスレッドセーフじゃない
(かなりひどい文だが…
156:デフォルトの名無しさん
12/01/15 15:02:06.27
>>154
素人を自覚してるならまずその態度を治せ。
157:o
12/01/15 15:02:28.96
>>153
あんがと
158:デフォルトの名無しさん
12/01/15 15:03:20.08
で、そのスタック領域はすべてのスレッドが共有するメモリ空間にあるわけだが、
そのあたりを1㍉も理解してないんだろう。
159:o
12/01/15 15:03:27.27
>>156
回答している人の中に、素人が混じってるから仕方ないと思うよw
160:デフォルトの名無しさん
12/01/15 15:03:46.60
>>156
それは大抵の場合、やりたいことを引き出すことよりも難しいよ
161:o
12/01/15 15:04:05.63
>>158
プロセスって言葉を出させたいってこと?
162:デフォルトの名無しさん
12/01/15 15:04:33.23
>>161
そんなことはどうでもいいから>>148
163:デフォルトの名無しさん
12/01/15 15:05:41.01
>>161
いや。
お前がスレッドすら1㍉も理解してないことを自覚させたいだけ。
164:o
12/01/15 15:10:42.02
>>162
スマートな方法じゃないけど、「スタッククラス」で対応するのも手かもよ。
コピーするだけが能じゃない気がするけど???
165:デフォルトの名無しさん
12/01/15 15:11:26.00
お前は何を言っているんだ。
166:デフォルトの名無しさん
12/01/15 15:12:22.49
C++なの?
167:デフォルトの名無しさん
12/01/15 15:13:26.78
その「スタッククラス」ではコピーが必要ないの?初心者の俺にkwsk
168:デフォルトの名無しさん
12/01/15 15:13:44.46
まだ「スタックはスレッドセーフ」という妄想に取り付かれてるようだな。
169:o
12/01/15 15:14:43.67
>>166
ANSI-Cベースなので、クラスは使わない方向で行きたいが、
コーディングはCDTでやってる。
170: ◆QZaw55cn4c
12/01/15 15:15:06.19
>>110
いいえ、スタックとプログラムカウンタはスタックごとに別。
171:o
12/01/15 15:15:31.34
>>168
そのスタックの話をしているわけじゃないのは分かっているよね?
172:デフォルトの名無しさん
12/01/15 15:16:33.51
お、QZにちょうどいい相手じゃないか?
ちょっとどんな展開になるのか、他の人はだまってみてようよw
173:デフォルトの名無しさん
12/01/15 15:16:56.99
>>164
それで実装したコードを挙げてくれ。そうすればもっとスマートな解決方法を出すことができるかもしれない。
174:o
12/01/15 15:17:00.12
>>172
そうだな。
素人が1人減るしねw
175:デフォルトの名無しさん
12/01/15 15:17:27.54
QZの意見を聞きたくなる場面なんてあまりないからなw
ぜひ回答してやってくださいQZさん
176:デフォルトの名無しさん
12/01/15 15:17:43.90
>>172
ああ、うん。珍しくQZの自演暴れじゃないものが見られるかもしれんね
177:デフォルトの名無しさん
12/01/15 15:18:02.46
実はo=QZという素晴らしいオチ!
178:デフォルトの名無しさん
12/01/15 15:21:33.63
175 名前:あぼ~ん[NGWord:QZ] 投稿日:あぼ~ん
176 名前:あぼ~ん[NGWord:QZ] 投稿日:あぼ~ん
177 名前:あぼ~ん[NGWord:QZ] 投稿日:あぼ~ん
179:o
12/01/15 15:22:27.21
>>173
実装なんかしてない。
180:173
12/01/15 15:28:35.84
QZじゃなくてすまんがレスされてしまったので。
>>179
もちろん実装していないことはわかっている。
>>5がいい方法かどうかがわからなくて困ってたんだろ。
>>164がいい方法だと思いついたのなら、それで実装すればいい。
これが気に入らないのであればレスしなくていいし、質問はQZあてに頼む。
181:o
12/01/15 15:37:47.56
>>145
いや、そんなことを言っているんじゃなくて、
・局所的にしか利用されず
・他スレッドからの参照に問題あり
・アクセスコントロールに関与する
・マルチスレッド対応の場合
+もろもろ
のような条件があるにもかかわらず、グローバル変数を使おうとする人が世の中にいるのか?
って話。
これだけ条件が整えば、
企業が規制するまでも無く、グローバル変数の利用を控えるんじゃないの???と
182:o
12/01/15 15:40:14.15
>>163
先回りされて、涙目、だなwww
183:デフォルトの名無しさん
12/01/15 15:44:28.99
解散
184:デフォルトの名無しさん
12/01/15 15:45:28.11
>>181
>>49の段階ではマルチスレッドの話なんて出てきてなかったろ。
自分だけが知っている情報を他人も知っているはずだと考えるのはよくないことだよ。
185:デフォルトの名無しさん
12/01/15 15:47:12.80
>>184
局所に格納してたんだろう
186:デフォルトの名無しさん
12/01/15 15:48:25.92
>>185
ああ、さらにアクセスコントロールもされていたようだ
187:o
12/01/15 15:55:36.98
>>184
条件が出てきた時点で、
「ああ、そうかグローバル変数じゃダメね」
ってレス付くなら分かるが、
>仕事上のコーディング方法を2chで質問かよwww
とレスられた事で
玄人の( というのは間違いで本当は素人 ) の中ではこれだけ条件が付いても
「ああ、そうかグローバル変数じゃダメね」
とは思わないのかなぁ???
という話。
188:デフォルトの名無しさん
12/01/15 15:56:17.70
日本語からやり直せ。
189:o
12/01/15 15:57:47.80
>>188
涙目乙www
190:デフォルトの名無しさん
12/01/15 16:01:12.86
やっぱりo=QZか?
191:デフォルトの名無しさん
12/01/15 16:02:00.04
質問主アスペ
192:デフォルトの名無しさん
12/01/15 16:02:35.15
キチがウヨウヨいると考えたくないしな
193:デフォルトの名無しさん
12/01/15 16:02:58.11
言いたいことを簡潔的確に言えるようにならないと開発は無理。
理解力はその前に必要だけど、普通の人なら持っている。
194:デフォルトの名無しさん
12/01/15 16:05:00.03
最近はその普通が通じないんだと思うよ。
195:o
12/01/15 16:06:20.21
>>192
そうだよね。
これだけ条件が付いていりゃ、業務命令じゃなくても、グローバル変数は避けるよねぇwww
196:デフォルトの名無しさん
12/01/15 16:08:06.61
別にグローバル変数だってスレッドセーフにすればいいだけ。
197:デフォルトの名無しさん
12/01/15 16:13:04.17
>>195
そんな話どうでもいいから本題をQZに質問するといいよ
198:デフォルトの名無しさん
12/01/15 16:18:55.49
流れとは別の質問なんだけど
スタック領域とかヒープ領域とかに対して
グローバル変数やstatic変数がある領域って一般的になんていうの?
データ領域?
199:デフォルトの名無しさん
12/01/15 16:23:22.30
>>198
スレ違いだが、それでいい。
記憶クラスでググれ。
200:o
12/01/15 16:25:18.71
>>198
BSSかテキスト領域
201:デフォルトの名無しさん
12/01/15 16:25:51.54
>>196
だね。
そもそも、業務命令とか変な条件の前にグローバル変数は避けるのがデフォだし。
202:o
12/01/15 16:26:33.99
>>200
おっと、途中で送信してしまった。
BSSとかデータ領域とかの話をしてるんじゃね?
203:デフォルトの名無しさん
12/01/15 16:27:30.80
>>200
> テキスト領域
市ね
204:o
12/01/15 16:27:38.02
>>201
そうなんだよ。
だから
>仕事上のコーディング方法を2chで質問かよwww
と言われると、
本職の方は、そんな考え方もしているのかなぁ、と
205:デフォルトの名無しさん
12/01/15 16:29:16.03
>>203
なんだ?
テキストってのはコードのことだ。
>>204
で、いつまで話ずらすの?
206:o
12/01/15 16:29:56.40
なんか、みんな俺に冷たいなぁ。
俺がなんかしたんか?
207:o
12/01/15 16:30:37.06
>>205
傍系の質問だべ。
答えられなきゃ、黙ってりゃ良いのに。
208:デフォルトの名無しさん
12/01/15 16:30:45.97
>>4から読めば誰でもそうなるんじゃないかな。
209:デフォルトの名無しさん
12/01/15 16:31:36.72
QZ出てこいよ。
ちょっと質問が高度すぎるか?
あ、質問というより回答がか。
210:デフォルトの名無しさん
12/01/15 16:40:35.12
質問主はこれやってみろ。
URLリンク(www.the-fortuneteller.com)
211:デフォルトの名無しさん
12/01/15 16:43:21.52
>>206
質問に答えているのにスルーして続ける
知らない単語をさも知っているように間違って使う
関係ないところにつっかかって引き延ばす
212:o
12/01/15 16:50:08.47
>>210
何言っているのか分からんが、
自己診断テスト得点計算結果
あなたの得点は16点です。
社会的スキル
3点
注意の切り替え
4点
細部への注意
1点
コミュニケーション
5点
想像力
3点
閾値内に収まっています。
213:o
12/01/15 16:52:32.85
>>211
あいや、
スルーしているんなら、レス番号知らせてもらえると助かるよ。
>知らない単語をさも知っているように間違って使う
これは、きちんと指摘してもらえればOK
心は広いから無問題だよ
>関係ないところにつっかかって引き延ばす
新たな質問が出たら、きちんと解決しよう。
普通のことだと思うけど?
これのどこが気に触る内容なのかな?
214:デフォルトの名無しさん
12/01/15 16:53:33.84
こういうのは分裂症?
215:o
12/01/15 16:54:20.80
>>214
それ、なんてクラス?
216:デフォルトの名無しさん
12/01/15 17:00:01.71
>>213ちなみにもう問題は解決してるの?
217:o
12/01/15 17:18:10.40
>>216
よく分からんが、選択肢が2つ。
1つは、func1で文字列を保持
もう1つはmallocでmainに引き渡す。
実装してみないと分からないけど、前者かなぁ・・・と。
HTTPだけど、すべてのデータがmainに返さないといけないわけではない。
汎用性がないのが残念だけど、前者の方がよいかなぁ。
汎用性を高めるんなら、mallocかなぁ、と考えてる。
ただ、結合テストで問題が出そうな気がしてならない。
218:デフォルトの名無しさん
12/01/15 17:22:55.28
QZ早く出てきてやれよ。
219:デフォルトの名無しさん
12/01/15 17:23:54.61
>>217
マルチスレッドらしいから、各スレッドの役割を書いてみて
220:デフォルトの名無しさん
12/01/15 17:27:15.15
先が永杉。
やるならスレ立ててそっちでやれ。
221:デフォルトの名無しさん
12/01/15 17:32:49.04
>>205
>> グローバル変数やstatic変数がある領域って一般的になんていうの?
> テキストってのはコードのことだ。
市ね or >>207
222:デフォルトの名無しさん
12/01/15 18:24:45.54
「空を自由に飛びたいな」 という夢があったときに
パイロットを目指すかパイロットを雇うかの違いがある。
223:デフォルトの名無しさん
12/01/15 18:33:47.92
ドラえもんが何とかしてくれると思った
224:デフォルトの名無しさん
12/01/15 18:43:45.81
脱原発(笑)
風力発電コスト高、モニュメントに
オホーツク地方で唯一の風力発電施設の北海道興部町風力発電所が、修繕費用難のた
めに昨年11月、完成から約10年で廃止され、風車を固定したモニュメントとして残
されることになった。
東日本大震災を受けた福島第一原子力発電所の事故後、風力発電は再生可能エネルギ
ーとして注目されているが、小規模風力発電施設が直面するコスト高の課題を露呈した
格好だ。
同町の風力発電所は2001年3月に完成。風車は1基で、建設費約1億9000万
円は、経済産業省が所管する独立行政法人の新エネルギー・産業技術総合開発機構(N
EDO)がほぼ半額を負担し、道の補助を除く約5000万円を町が負担した。隣接す
る町の農業研究施設に電力を供給したうえで、余剰分は北海道電力に売電してきた。約
9年半で計6170万円の売電収入があり、6430万円の維持管理費と収支はほぼ均
衡していた。
しかし、10年10月に発電機のベアリングが破損して稼働を停止。欧州製で部品発
注のほか高所作業が必要となるため、修理には約4000万円かかることが判明した。
全額を町が負担しなければならないことから、町は「長期的に見た場合、コスト面で運
転再開は困難」(町企画財政課)と判断、発電所を廃止した。
----------
URLリンク(www.yomiuri.co.jp)
URLリンク(www.yomiuri.co.jp)
225:デフォルトの名無しさん
12/01/15 19:03:46.42
>>222
自由に「飛びたい」だと、パイロットを雇うのでは微妙に要件を満たさないような気が…
226:デフォルトの名無しさん
12/01/15 19:11:29.57
スレが伸びてるなと思ったら、ほとんど罵倒じゃねか。
227:o
12/01/15 19:39:26.42
>>226
そやね
228:デフォルトの名無しさん
12/01/15 20:08:53.37
>「空を自由に飛びたいな」
つ シャブ
229:デフォルトの名無しさん
12/01/15 20:47:14.71
>>225
航空法でがっちり縛られるから、パイロットになっても
そんなに自由に飛ばせるわけではない
自分で飛ばすのも雇って指示するのも自由度では大差ないかな
230:デフォルトの名無しさん
12/01/15 23:53:16.84
民主党には朝鮮人など外国人のなりすまし、スパイが約90名在籍している
野田内閣は過半数が帰化人
野田はどうだろうか
韓国人から賄賂を貰い、韓国人の集いに出席している野田は
首になった蓮○はシャブで逮捕歴のある人間と仲が良いな。蓮○自身はやってんの?
い-6-1
テレビが言えない民主党のスポンサー=韓国北朝鮮
あとはもうわかるよな
231:デフォルトの名無しさん
12/01/16 00:19:48.44
入門編の参考書見ながら勉強中のど素人です
#include <stdio.h>
//ビット数をカウント
int count_bits(unsigned int x)
{
int count = 0;
while(x)
{
if(x & 1U)
count++;
x >>= 1;
}
return count;
}
//ビット数を返す
int int_bits(void)
{
return count_bits(~0U);
}
//ビット表示
void print_bits(unsigned int x)
{
int i;
for(i = (int_bits()-1); i >= 0; i--)
{
putchar(((x >> i) & 1U) ? '1' : '0');
}
putchar('\n');
}
232:231
12/01/16 00:20:21.66
//ビットシフト
unsigned int sft1(unsigned int x, int pos)
{
return (x << pos);
}
//posビット目からn個のビットに1をセット
unsigned int set(unsigned int x, int pos, int n)
{
return (x | sft1(~sft1(~0U,n), (pos - 1)));
}
int main(void)
{
print_bits(0);
print_bits(set(0,1,32));
return (0);
}
233:231
12/01/16 00:24:34.89
print_bits(set(0,1,32));
ここで1ビット目から、32個のビットに1をセットするようにしているのですが
31個のビットだと正常に011111?と1がセットされるのですが
上記のように32個だと、000000?となり1がセットされません
なぜ、11111?な感じで1がセットされないのでしょうか?
234:デフォルトの名無しさん
12/01/16 00:29:24.01
>>233
ビット幅以上のシフトは未定義
自分の知ってる処理系では mod ビット幅 だけシフトされる
235:デフォルトの名無しさん
12/01/16 00:51:44.97
どうでもいいが、処理系が同じでも、CPUが違うと動作が違ったりもする。
186か286かその辺の時代以前には、律儀に32回シフト(ただしintは16bit)してた。
236:デフォルトの名無しさん
12/01/16 00:59:25.16
>>234
レスを元に調べてみたら、ビット演算のWikipediaにそれらしい内容が書かれていました
今回の場合だと
31 mod 32 で31ビットシフトするが
32 mod 32だと0でビットシフトしない
33 mod 32だと1ビットシフトする
というこで理解できました
ありがとうございました
237:デフォルトの名無しさん
12/01/16 01:10:56.78
高速フーリエ変換使って1万桁同士の掛け算を行うプログラムを作れ。
そういう課題が出た。さっさと教えろ。お前ら偉いだろ。
238:デフォルトの名無しさん
12/01/16 01:18:08.73
宿題は宿題スレに逝けと言ってるだろ、このタコ。
239: ◆QZaw55cn4c
12/01/16 03:23:46.56
>>65
こんなのでどうですか?
URLリンク(ideone.com)
240:デフォルトの名無しさん
12/01/16 08:25:12.57
>>237
作ってやるから20万円よこせ
偉い人の時間は高いぞ
241:デフォルトの名無しさん
12/01/16 14:33:54.35
ステルスマーケティングまとめ
A URLリンク(www.dotup.org)
B URLリンク(www.dotup.org)
→ ステマの黒幕は ソニー(アニプレックス)、角川
関連キーワード はちま 清水鉄平(はちまの本名) KND 元ソニー会長出井伸之
はちま管理人によるみかじめ料を払わない特定メーカーへの叩き
まとめサイトは企業が運営 コメント欄も社員の煽り(が殆ど)
おまけ
2ch監視が仕事のスクウェア社員w↓
96 名前:番組の途中ですがアフィサイトへの転載は禁止です[sage] 投稿日:2012/01/16(月) 12:41:25.60 ID:X9dFbc830
proxy1.square-enix.co.jp - 2012/01/16 12:38:51 - Japan - Commercial(企業)
IP :61.195.58.8 (不明)
Referer :URLリンク(ipatukouta.altervista.org)
USER-AGENT :Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
【株式会社KND・清水鉄平】はちま起稿が特定され黒い関係が明らかに★78【黒幕を特定せよ】
スレリンク(poverty板)
242:デフォルトの名無しさん
12/01/16 22:36:48.88
リスト構造も使い易さを追求して、様々な形態の物が存在する。
使い易さを追求して実現された種々の機能と それを実現しているリスト構造の具体例について
解説せよ。
という問題があるんだが、答えるのにチェイン法とか機能の説明でいいのかな?
243:デフォルトの名無しさん
12/01/16 23:20:46.73
>>238
244:デフォルトの名無しさん
12/01/16 23:24:32.44
>>242
いいと思う。
245:デフォルトの名無しさん
12/01/16 23:27:06.26
>>244
ありがとう
ついでなんだが、オブジェクトのデータと処理とを組み合わせて
合理的に管理するためのプログラミング手法ってなんて言うんだったっけ?
246:デフォルトの名無しさん
12/01/16 23:27:21.98
>>244
ありがとう
ついでなんだが、オブジェクトのデータと処理とを組み合わせて
合理的に管理するためのプログラミング手法ってなんて言うんだったっけ?
247:デフォルトの名無しさん
12/01/16 23:29:04.14
oops!
248:デフォルトの名無しさん
12/01/16 23:34:49.93
oh...
連レスすまない
249:デフォルトの名無しさん
12/01/16 23:50:08.16
>>246
OOP, Object Oriented Programming
250:デフォルトの名無しさん
12/01/16 23:58:46.59
Object oriented programming style
アクネドート:
実用に成るコードを完成させるためには
定義の段階で同じ識別詞、同じ記述が繰り返し繰り返し現れる
251:デフォルトの名無しさん
12/01/17 00:34:19.57
関数プロトタイプ宣言について、どのような時に用いるか、なぜ必要なのか教えていただけないでしょうか。
よろしくお願いします。
252:デフォルトの名無しさん
12/01/17 01:34:11.86
>>251
その関数を呼び出す前に、その関数を使用する場合
プロトタイプ宣言しといて、実装を後に実装する。
あと、ライブラリを作成するとき、ヘッダに宣言をまとめて
書いといて、実装をコード側に書く。
253:デフォルトの名無しさん
12/01/17 10:04:03.55
>>246
「データ」が「ステート(状態)」の事を意図してるなら、OOP。
「データ」一般なら色々あるからCTMCPなどが参考になる。
254:デフォルトの名無しさん
12/01/17 12:29:37.79
以下のように
aが32未満のときは、AしてからCして、Dする
aが224より大きいときは、BしてからCして、Dする
それ以外のときはAもBもCもせずにDする
というような制御構造を、ソースレベルでも、出力されるアセンブラレベルでも
重複コードがないようにするには、gotoを使うしかないのでしょうか?
if(a < 32){
b = a; //A
}else if(a > 224){
b = 256 - a; //B
}else{
goto HOGE2;
}
HOGE1:
c = b * 100; //C
HOGE2:
//D
255:254
12/01/17 12:30:35.88
d = a < 32;
e = a > 224;
if(d || e){
if(d){
b = a; //A
}else{
b = 256 - a; //B
}
c = b * 100; //C
}
//D
こういうのもifが2つあって、なんだか冗長です。
256:254
12/01/17 12:30:55.20
void hoge(int *pc, int b){
*pc = b * 100; //C
}
---
if(a < 32){
b = a; //A
hoge(&c, b);
}else if(a >> 224){
b = 256 - a; //B
hoge(&c, b);
}
//D
これも関数呼び出しコードが重複してるし
関数呼び出しコストがもったいないです。
inlineにすれば、呼び出しコストはかからないけど
//Cの部分がアセンブラレベルで重複してしまいます。
結局gotoを使わないと、重複は避けられないのでしょうか?
257:デフォルトの名無しさん
12/01/17 13:26:36.03
if( a < 32 ){
//A
}
if ( a > 224 ){
//B
}
if( ( a < 32 || a > 224)){
//C
//D
>>254は、コードが複雑になった場合に追っかけるのが面倒
>>255は、何やってるのかわかりづらい
>>256は、今時のシステムならそのくらいのコスト気にすんな。関数名次第では分かりにくい。
自分は、同じ基準で判定する方がコードが分かりやすい。
このケースの場合、a を基準にするのではなく、
//A、//B、//C、//Dのそれぞれのコードがどういう条件なら実行できるか、
を同じレベルで書いた方が後で見て分かりやすい。
258:254
12/01/17 14:59:48.07
なるほど、>>255でネストするよりわかりやすいです。
多少冗長になっても、メンテを考えればgotoなど使わない方がいいと言うことですね。
ありがとうございます。
259:デフォルトの名無しさん
12/01/17 15:13:29.39
//Cの条件はb>=32か?
260:デフォルトの名無しさん
12/01/17 16:08:24.42
goto使わなくても大抵コンパイラ後はgoto相当の処理してるんだがな。
261:デフォルトの名無しさん
12/01/17 16:14:30.48
goto使ってもいいと思うんだけどな。
262:デフォルトの名無しさん
12/01/17 16:30:33.18
あれならこうかな。
bool a32 = (a < 32)
bool a224 = (a > 224)
if (a32 || a224) {
if (a32) {
A();
} else {
B();
}
C();
}
D();
263:デフォルトの名無しさん
12/01/17 16:38:28.45
>if (a32 || a224) {
if (a32 | a224) {
の方がいい場合あり。
昔逆アセンブルしてみたら
if(a32) goto xxx;
if(a224) {
xxx:
...
}
的な処理してた。
まぁ処理速度必要で、
一秒間に数千、数万回実行される処理でなきゃそこまでする必要は無いと思う。
264:デフォルトの名無しさん
12/01/17 16:40:24.40
組み込みとか4kデモとかじゃないかぎり気にせず関数化
265:デフォルトの名無しさん
12/01/17 16:40:35.91
って、>>262は>>255と同じだったか。
>>263
そこまで速度を必要とするならそもそも条件判断をしないようにすればいい。
266:254
12/01/17 16:50:41.22
4kではないですが、動画の処理なので、関数呼び出しコストはかなり気になります。
条件判断しないようにすればいいとは、どのように書けばよいのですか?
267:デフォルトの名無しさん
12/01/17 16:51:40.47
>>263
||を|とかかれると?と思ってしまう。
あー、これはほかにもいろいろバグが入ってるんだろうなー、と残念な
気持ちになるんで人が見るコードの場合はやめてくれ。
268:デフォルトの名無しさん
12/01/17 16:52:58.71
>>266
一番簡単なのは必要な処理を用意して関数ポインタ使って条件によって切り替える。
一般的に高速化と冗長性の削減は両立しないんだよ。
269:デフォルトの名無しさん
12/01/17 16:53:19.03
まぁ、それ以前にOpenVCなり使えるものを使うのがいいと思うけどな。
270:デフォルトの名無しさん
12/01/17 16:53:41.91
OpenCVな。
271:デフォルトの名無しさん
12/01/17 16:55:25.05
昔アセンブラで計算処理部分で分岐無くすように書いたことあったな。
フラグ取得→ローテーション命令で0か0ffffhに加工→計算過程でANDして加算
速くなったかどうかは知らん。
272:デフォルトの名無しさん
12/01/17 16:55:39.99
あぁ、ピクセル処理みたいのならテーブル引きにすればいいよ。
273:デフォルトの名無しさん
12/01/17 16:57:15.88
高速化が必要だと思った場合はまずプロファイルを取るのが基本。
1%の処理を100万倍速くしたところで1%も速度は向上しない。
274:デフォルトの名無しさん
12/01/17 16:58:51.38
>人が見るコードの場合はやめてくれ。
0=偽 0以外=真 って確証(確信?)ないからやらないよ。
275:デフォルトの名無しさん
12/01/17 17:00:19.16
いやいや、それは仕様で決まってるから。
どういうこと?
276:デフォルトの名無しさん
12/01/17 17:02:44.89
仕様書見たこと無いってこと。
277:デフォルトの名無しさん
12/01/17 17:06:38.13
まぁこのスレの99%はそうだろうからそれは気にしない。
278:デフォルトの名無しさん
12/01/17 17:07:49.12
>>255
関数のサイズと関数の呼び出しコストって関係あるの?
279:デフォルトの名無しさん
12/01/17 17:09:48.50
各ABCの処理が、簡略化されたからそうなっているのか、実際にそうなのかにもよりそうな話だなぁとおもったり。
280:デフォルトの名無しさん
12/01/17 17:12:29.87
>>278
ない。
281:デフォルトの名無しさん
12/01/17 17:13:23.01
もちろん、厳密にはキャッシュの利用が変わってきて速度は変わる。
が、そんなことを気にするのはあと数レベル先の話。
282:デフォルトの名無しさん
12/01/17 18:10:35.59
C言語のテトリスを標準出力で作るのって無理ですか?
283:デフォルトの名無しさん
12/01/17 18:14:32.35
日本語変だな。
テトリスをC言語によって作るのは出来ると思うのですが
標準出力のみで作れますか?
284:デフォルトの名無しさん
12/01/17 18:17:54.16
できるよ。
285:デフォルトの名無しさん
12/01/17 18:17:59.44
OSや端末を絞れば作れるでしょうしCUIのテトリスはぐぐれば出てくるでしょう
286:デフォルトの名無しさん
12/01/17 18:18:39.20
標準のみだと改行しないといけないけど、それ我慢すればできない理由はないね。
287:デフォルトの名無しさん
12/01/17 18:20:30.52
Curses使えば普通に楽しめそう。
288:デフォルトの名無しさん
12/01/17 18:23:18.51
>>286
グラフィック関連の低級性ってどうなってんの?
プログラミングだとアセンブラでしょう。
グラフィックは?
289:デフォルトの名無しさん
12/01/17 18:24:24.40
何言ってるのか分からん
290:デフォルトの名無しさん
12/01/17 18:31:30.36
ニコ動に1時間でWindows版テトリス作るみたいなのがあったからそれでも
見てみたらどうか。
291:デフォルトの名無しさん
12/01/17 18:32:00.50
>>288
16ビットのときは、CPUで特定のアドレスに書きこむと画面に反映されてた。
それ以降は知らん。
292:デフォルトの名無しさん
12/01/17 18:40:41.05
昔昼休みにUNIXでテトリス対戦してる人がいた。
見た感じCUIだった。
293:デフォルトの名無しさん
12/01/17 19:05:11.88
>>291
Windows には専用の API がある。
294:デフォルトの名無しさん
12/01/17 19:23:05.12
標準出力って事は、コンソール出力なんだろうから、
エスケープシーケンス使うかすればいいのかな?
295:デフォルトの名無しさん
12/01/17 19:47:18.39
>>290
見たww
>>291
なるほどぉ。
いやもっと低級な事。
インクとかは?どうやって全色出してるのかなと。
296:デフォルトの名無しさん
12/01/17 19:48:22.99
すまんが、そのインクとかいうものとC言語の関係を教えてくれないか?
297:デフォルトの名無しさん
12/01/17 19:57:22.70
>>295
環境に依存すると思う。どういう環境(OS、処理系)で作りたいかを教えれ
298:デフォルトの名無しさん
12/01/17 19:57:30.73
>>266
なんか、遠い記憶にそんな努力をしたことがあるような、無いような。
ポケコン時代だと、
if文ってスゲー遅いんだよな・・・
それを嫌ってForNextで書いてた。
でも、そうするとコードの容量が大きくなるんだよなぁ。
>>266
224と32にとても意味があるのであれば、ビットシフトを駆使する方法もあるかもねぇ。
a >> 8 が0 なのは ABD
a >> 9 が1 なのは ACD
( a >> 8 ) * ( a >> 9 ) が1なのはD
299:デフォルトの名無しさん
12/01/17 20:04:34.39
色々考えたソースがコンパイラの最適化に勝てないことも多々…。
300:デフォルトの名無しさん
12/01/17 20:06:31.09
比較演算自体内部で分岐命令使ってる気もするがな。
301:デフォルトの名無しさん
12/01/17 20:06:37.72
>>297
1990年くらいのパソコン。
一太郎しか入ってなかった。
302:デフォルトの名無しさん
12/01/17 20:12:01.09
パソコンのメーカー名と機種のシリーズ名も言えないんじゃなぁな。
303:デフォルトの名無しさん
12/01/17 20:14:06.20
>>301
MS-DOSの頃で、PC9801をターゲットにしてたなら、
テキストVRAM直書きが速かったかも。VRAMに表示文字以外に
確か属性があって、色やブリンクなどをセットできてた。
304:デフォルトの名無しさん
12/01/17 20:16:56.86
>>303
詳しすぎワロタw
C言語に詳しい人って同時にコンピュータ関連詳しすぎw
305:デフォルトの名無しさん
12/01/17 20:22:07.27
PC-9801プログラマーズBibleが未だに捨てられない。
306:デフォルトの名無しさん
12/01/17 20:24:02.15
>>300
ちゃうちゃう。
サンプルコード書けない理由にもなってるけど、
もしABCDの処理が加算なら、
(加算数A) * ( (~a) >>8 ) + (加算数B) * (a >> 9 ) + .....
と比較しなくてもできる。
>>299
まあねぇ。
特に最近はHyperThreadingとかキャッシュとかねぇ。コードでは全く見えない高速化があるからねぇ。
307:デフォルトの名無しさん
12/01/17 20:25:57.57
>C言語に詳しい人って同時にコンピュータ関連詳しすぎw
アセンブラの次にハードを直接いじるのに適してる言語だと思ってるから。
308:デフォルトの名無しさん
12/01/17 20:36:08.57
>>295
複合機(レーザー)やってたが、PCで作るのは画像データorスクリプトだけだよ。
後は複合機側でやる。色はCMYKを混ぜると全色でる。
309:デフォルトの名無しさん
12/01/17 20:38:23.26
結局はハード屋の奴隷
テレビの画質なんてものはLSIで決まる
Cプログラマは上からレジスタ操作してハードウェア様の機能をオンオフするだけ
310:デフォルトの名無しさん
12/01/17 20:39:05.47
>>308
VxWorks ?
311:デフォルトの名無しさん
12/01/17 20:40:56.60
>>310
大当たりw
312:デフォルトの名無しさん
12/01/17 20:42:15.01
いやいや
メタリックインキや蛍光インキもありますぜ旦那
313:デフォルトの名無しさん
12/01/17 20:42:46.37
>>308
CMYKって表現が分かる人、どのくらいいるのかな?
314:デフォルトの名無しさん
12/01/17 20:42:59.11
>>311
豊橋じゃないってことやねwww
315:デフォルトの名無しさん
12/01/17 20:43:48.60
熱転カラーリボン
316:デフォルトの名無しさん
12/01/17 20:44:14.16
>>314
違う。
豊橋だ
317:デフォルトの名無しさん
12/01/17 20:44:28.44
初期の熱転写はすぐ熱ダレしてたな。
318:デフォルトの名無しさん
12/01/17 21:37:08.40
>>313
かなりたくさん。
319:デフォルトの名無しさん
12/01/17 21:37:45.43
>>312
プリントゴッコなつかしい
320: ◆QZaw55cn4c
12/01/17 23:11:18.21
>>303
それが、裏VRAM に書く方法が今でもわからなかったりするのです。
321: ◆QZaw55cn4c
12/01/17 23:13:44.36
>>313
わかんない。シアンマゼンダイエロー、K‥‥‥K‥‥‥K‥‥‥キンタマか?
322:デフォルトの名無しさん
12/01/17 23:15:45.85
>>321
ブラック
323:デフォルトの名無しさん
12/01/17 23:26:58.27
>>320
バンク切り替えすればいいだけだろ。
ほんと、程度が低いな、お前。
324:デフォルトの名無しさん
12/01/17 23:27:49.89
>>320
遙か彼方の記憶なのだが、どこかのポート出力でバンク切り替えしていたような?
325: ◆QZaw55cn4c
12/01/18 00:17:49.40
>>323
バンク切り替えはどうやればいいのですか?
>>324
URLリンク(www.webtech.co.jp)
を探してはみたのですが‥‥‥。0A4hか?
326:デフォルトの名無しさん
12/01/18 01:40:51.10
何言ってんだお前。
そんなのPC98使ってた人間なら常識だろ。
知らないのに出てくるとは、よっぽどなんだな。
327:デフォルトの名無しさん
12/01/18 02:18:15.95
使ってれば常識なの?PC98で開発してればの間違いではないのだろうか。
PC98つかったことないけど。
328:デフォルトの名無しさん
12/01/18 02:46:44.23
そうしてたかのように装ったのはお前だろ、QZ
329:デフォルトの名無しさん
12/01/18 02:59:37.35
恋は盲目だな。>>327はQZじゃないよ。
330:デフォルトの名無しさん
12/01/18 03:35:14.00
プラットフォームを選ばない会話。
x86以外ではmipsしか知らない俺には無理。
331:254
12/01/18 08:29:12.36
>>298 比較演算よりビットシフトを使った条件のが速いというのは聞いたことがあります。
>>306 なるほど、条件×加算数 というふうにすればいいのか。
これを使って、いくつか書き直してみたいと思います。
ありがとうございます。
条件とAとBは例で示したものが多いです。
Cは3~10行くらいです。
Dはいろいろあって、かなり長いです。
332:デフォルトの名無しさん
12/01/18 08:40:06.15
とりあえず、いまどきのプロセッサで速度を気にする場合
まず、メモリアクセスと条件分岐を減らすのが基本。
その上で、ビット演算がどうとかいうのは実際に測定してから。
333:デフォルトの名無しさん
12/01/18 09:47:49.57
>>331
自分で書いていてなんなんだが、
× ( (~a) >>8 )
○ ( (~a) >>8 ) && 1 //シフトした後1桁目だけを抽出
演算量が増えると、比較した方が早くなる可能性は十分にある。
また、デバッグがしにくい。16進法を脊髄反射で2進法にできるなら問題ないけど。
値の持たせ方も変わってくる(ビット演算しやすいデータ形式で持たせる必要がある)
ポインタを妙に使い出す
フラグを妙に使い出す( int 変数に複数の情報を持たせたくなる )
デバッグ関数( printf で2進法を表示するコードが欲しくなる )
結果としてコードの見通しが悪くなる
なんて特徴もあるからねぇ。注意は必要だけど。
334:デフォルトの名無しさん
12/01/18 10:05:23.18
パフォーマンスが気になるなら、
ちょっとばかしアセンブラを勉強して、この資料を見るとよい。
URLリンク(download.intel.com)
パフォーマンスが厳しい場合、割り算をしたがらない気持ちがよく分かると思うよ。
MOV( メモリからの読み込みなどで使用) が0.5クロック
CALL(関数の呼び出しでよく使われる)で5クロック
RET( Return ) 8クロック
DIV(割り算)が 56~70クロック
CMP自身は0.5クロックだけど、If文だとJMPを伴うのでもう少し大きいかな?
ビットシフトは、MOVとシフト命令の1.5かな?
関数を使えば、CALLとRETが必要だから最低13クロック以上掛かることになる。
この辺は詳しくないので、説明はできないけど。
335:デフォルトの名無しさん
12/01/18 10:52:06.29
なんかスゲー間違えてる・・・気がする・・・
だれか助けて
関数に引数1つをつけて呼んでリターンした場合
movl $0xa,(%esp) ; 0.5クロック
call 0x4013e1 <func1(int)> ; 5クロック
mov $0x0,%eax ; 0.5クロック
leave ; leaveは実質mov pop movなので、2.5クロック
ret ; 8クロック
なので、最低 16.5クロック+関数内での演算クロック数が必要
ビットシフトは、
sarl $0x2,0x1c(%esp) ; 4クロック
4クロック+演算クロック数
if文
cmpl $0x0,0x18(%esp) ; 0.5クロック
jne 0x4013ee <main()+46> ; 不明:0.5クロック程度?
1クロック+演算クロック数が必要
あれ?
If 文って結構早くね?
てか、ビットシフト遅くね?
If文って分岐予測が当たればさらに高速化するし。
336:デフォルトの名無しさん
12/01/18 11:53:53.16
ホッケーゲームみたいなのを作ってるんだが
バーとボールの当たり判定はどうすればいいんだ?
337:デフォルトの名無しさん
12/01/18 11:57:33.93
>>336
物理演算ライブラリに丸投げ
338:デフォルトの名無しさん
12/01/18 13:39:39.33
>>336
バーとボールの座標値を比較。
つーか、どう作っているのか判らんのにどう判定すればいいか分かるわけないだろw
>>335
すげぇ無駄な努力をしていることに気付け。
その高々数十クロックは一体何分の一秒なのか判っているのか?
339:デフォルトの名無しさん
12/01/18 13:43:27.54
>>338
映像処理って、1秒に30個とか60個の画像が含まれていて、それぞれの画像は1920*1080ドットあったりして
その各ドットにはRGBの3つの8bit値が存在するんだけど、
1秒の映像を処理するのに何回画素値に対する処理が動くか判っているのか?
340:デフォルトの名無しさん
12/01/18 13:57:18.96
画像処理は小さな最適化が大きな効果を及ぼす分野の一つだよねー。
アムダールの法則で言うところのpの値が限りなく1に近い。
341:デフォルトの名無しさん
12/01/18 13:58:12.83
まずビデオチップで演算できないかを考える。
342:デフォルトの名無しさん
12/01/18 14:02:05.12
速度上げるなら重複増やしてでもループ(分岐)回数減らすのがデフォ。
DOS時代は同じ処理を16回分連続で書いたこともあった。
343:デフォルトの名無しさん
12/01/18 14:03:04.33
1920*1080*3*60=約0.4GB。
そりゃぁ、一画素を三回ずつ愚直に計算してたら回数は多いわねぇ。
CPUでそんなことすることを考えているとしたらそのほうが間抜けだ。
344:デフォルトの名無しさん
12/01/18 14:04:12.65
>>342
今時のコンパイラなら、ループアンローリングもやってくれるよ。
ついでにベクタ化もしてくれるかもしれない。
345:デフォルトの名無しさん
12/01/18 14:56:20.00
>>343
愚直に計算しないためにも、たとえばSSEつかって4画素(4つの32bit整数として)同時にフィルタをかけたりするよね。
>>335はそういうことにつながる話でもあるんだけど、それも>>338みたいに無駄な努力で間抜けな考えだと思うの?
ただいえるのは、スレ違いだということ。
346:デフォルトの名無しさん
12/01/18 15:02:35.06
「CPUで」だから、GPUにやらせろっていいたいんだろう
だからどうしたのって話だけどねー
347:デフォルトの名無しさん
12/01/18 15:06:42.41
少なくとも、今時のCPUはクロック通りに動くわけじゃない。
パイプラインもあればキャッシュミスすればペナルティもある。
クロック数だけ足し算しても屁の突っ張りにもならないな。
前からこのスレでも言われているだろう。所要時間を知りたかったら実測しろと。
348:デフォルトの名無しさん
12/01/18 15:16:49.69
少しでも軽くなるように期待してあらかじめ書いているだけだろう?
349:デフォルトの名無しさん
12/01/18 15:21:30.93
>>347
所要時間を知りたいわけじゃないでしょ
今問われている箇所がボトルネックになっていることを突き止めたあとかもしれないよ
350:デフォルトの名無しさん
12/01/18 15:27:36.73
意外とレベルの高い質問の中くだらない事で恐縮なんだが…
int main() {
func1();
}
void func1() {
func2();
}
void func2() {
func3();
}…
ひとつの関数を見やすくするという理由だけで、こんな風に
入れ子になっていく事は、なるべく避けた方がいいのかな?
351:デフォルトの名無しさん
12/01/18 15:30:56.90
>>350
ちゃんと名前付けてれば大丈夫だと思うよ。
「見やすくする」という基準がずれてなければ。
352:デフォルトの名無しさん
12/01/18 15:40:12.61
>>347
言ってることはあってるが、今言うことじゃないな
353:デフォルトの名無しさん
12/01/18 15:52:40.36
>>351
すばやい回答ありがとう!
見やすくしようと思って整理してたら、どんどん関数が増えていって
ちと不安になってきたので質問しました。
354:デフォルトの名無しさん
12/01/18 17:17:24.00
>>352
その実測が既に難しくなっているんだけどな。
そのコードがどのくらい掛かるかを調べるために、そのコードを繰り返したら
キャッシュあたりまくりでパフォーマンスが良すぎる値が出てくる。
355:デフォルトの名無しさん
12/01/18 17:26:20.65
それはテストが下手だといわざるを得ない
356:デフォルトの名無しさん
12/01/18 17:37:23.71
つーか、普段キャッシュにあたらないような状況ならそこを改善する意味がないだろ。
357:デフォルトの名無しさん
12/01/18 17:47:20.87
【C++】高速化手法【SSE】
スレリンク(tech板)
358:デフォルトの名無しさん
12/01/18 17:55:11.41
実測は実データまたは実データに近い仮想データで行うんだから
それでキャッシュヒットしまくって全体に対する占有時間が小さくなってるなら
>>356の言うとおり改善する意味なし。
359:デフォルトの名無しさん
12/01/18 19:59:00.54
>350
ヘッダファイル作ってコメント入れときゃ多少マシだろ。
360:デフォルトの名無しさん
12/01/18 20:04:22.56
>見やすくするという理由
実際に見やすくなり、再利用が出来るなら、そうして良いんじゃないの?
361:デフォルトの名無しさん
12/01/18 20:34:18.83
関数の行数は1画面に収まる程度にするとよいとCodeCompleteに書いてあったぞ
2~3行しかない処理を関数化するのは逆によろしくないようで。
362:デフォルトの名無しさん
12/01/18 20:39:13.90
>>361
意味のある名前をつけられるかどうかを指標にする
同じコードを2回書くならそれを関数かできないか検討する
363: ◆QZaw55cn4c
12/01/18 20:40:12.35
>>350
解決するべき条件をひとつずつ皮をむくようにクリアしながら下位の関数に投げてしまう、というのは私はよくします。
直近では
スレリンク(tech板:339番)
main() は fopen() と fclose() しかしていない。
364:デフォルトの名無しさん
12/01/18 20:41:53.23
1画面って何行くらいなんだろ
画面解像度やフォントサイズでかなり違いがでそうだけど
365:デフォルトの名無しさん
12/01/18 20:44:51.45
一つ関数を作る度に、膨大な設計書を書かされていた時は、
一つの関数が300行を楽々超えていた。
366:デフォルトの名無しさん
12/01/18 20:50:00.46
個人的には、短い関数が多い方が見やすい。
>>365
開発だとそうなりがちだわな。
2000超えてるの見たときは、驚いたけど。
367:デフォルトの名無しさん
12/01/18 21:10:25.39
一行の関数とか大量に作るなあ
まあ(C++ではなく)C言語なら、多少は自重するが
それでも20行以内の関数なんて全然珍しくはない
368:デフォルトの名無しさん
12/01/18 21:16:46.85
>>361
基準が行数って時点で目的意識はどこへやら
いまどき行いくらって稼ぎ方はそうないだろうが
頭脳労働者らしからぬ発言には気をつけろな
369:デフォルトの名無しさん
12/01/18 21:32:50.30
亜流だか我流だか、かも試練が、
アルゴリズムが埋もれないように関数化する
370:デフォルトの名無しさん
12/01/18 21:54:25.28
>>350
> ひとつの関数を見やすくするという理由だけで、こんな風に
> 入れ子になっていく事は、なるべく避けた方がいいのかな?
必要ないなら、「入れ子 (ネスト)」は少ないほうがいい。
俺なら、こう書くかな。
int main() {
func1();
func2();
func3();
}
void func1() {
...
}
void func2() {
...
}
void func3() {
...
}
371:デフォルトの名無しさん
12/01/18 21:58:58.37
>>370
あまりにこの形式になりすぎて
上位のほうの関数が実際に何やってるのか
よくわからんくなってるプロジェクトを最近見た
372:デフォルトの名無しさん
12/01/18 22:21:44.34
>>370
ナンセンス
関数内に隠せないものを関数スコープで宣言とか
おまえは B の時代のヨボヨボジジイか?
373:デフォルトの名無しさん
12/01/18 22:22:28.10
>>364
こういう場面で言われる1画面は80*25をさす場合が多い。80文字、25行ね。
最近はメソッドや変数名が長い場合も多く、横方向への基準を緩和していることも多い。
たとえば120文字までにおさめるなど。
縦方向は今も昔もさほど変わっていないと思う。
でもメソッドチェーンなんかで、1かたまりの処理が複数行にわたる場合なんかを考えると、
今となっては25行は厳しいかもしれないね。
374:デフォルトの名無しさん
12/01/18 22:24:25.63
ステマ相関図画像更新(1/17)
URLリンク(gazo.restspace.jp)
テレビや新聞、大規模なネットサイトで「今流行の」「今話題の~」「女性に人気の~」等と言われるものはほぼ全て
この画像上部、○○堂がコントロールしている。
・世間にどの程度流行らせるか
・流行に乗り遅れる(流行に乗り遅れさせる)人間をどのくらい作るか
・話題に乗り遅れた人間に対してどの程度の疎外感を与えるか
・いつその流行を終わらせるか
2chもステマ会場
URLリンク(www.dotup.org)
ちなみに ハリーポッターと賢者の石の 「石」とはテレビのこと(著者が執筆当時)
ダイオード→半導体→シリコン→石
賢者とはテレビを見る人間でも番組を作る人間でもなく、テレビを操る人間。
375:デフォルトの名無しさん
12/01/18 22:42:55.85
なんのことだかさっぱりだが、そこはダイオードじゃなくてトランジスタだろ。
376:デフォルトの名無しさん
12/01/18 22:47:08.66
>>370
俺もそれっぽい書き方するわ。
もちろん、そこまで極端ではないけど。
377:デフォルトの名無しさん
12/01/18 22:50:22.44
アジャイルなら、ある処理を関数化するかどうか、つまり処理の粒度は「意図によるプログラミング」に従う。
378:デフォルトの名無しさん
12/01/18 22:52:07.61
趣味のソースなら再利用する気が無い限り関数化しないな。
379:デフォルトの名無しさん
12/01/18 23:07:22.27
>>372
意味わからん、あくまでも >>350 の改善案だぞ。
380:デフォルトの名無しさん
12/01/18 23:51:17.96
>>378
関数化の大きな目的の1つである同一コードを纏めて修正を1回で済ませる、という目的を忘れてる気がする。
どんなコードの書き方でも基本的に構わないけど、
バグの温床になる書き方はどんな書き方でもNGだと思うが
381:デフォルトの名無しさん
12/01/18 23:54:29.63
>>372
>>379
ナンセンス以前に、おまえら超能力者かと
mainからみて隠蔽したい内容であるなら、>>350だし、
それがアルゴリズムとして重要でmainからみとおせる必要があるなら>>370だし。
それが、>>350で読み解けてるみたいだから、超能力でもあるんだろう。
382:デフォルトの名無しさん
12/01/19 00:12:29.16
URLリンク(ameblo.jp)
検証お願いします
383:デフォルトの名無しさん
12/01/19 07:30:01.47
「俺のコーディングが最も正しい!!」
384:デフォルトの名無しさん
12/01/19 08:21:13.40
コンパイラ通ったの?
385:デフォルトの名無しさん
12/01/19 08:21:41.81
コーディングスタイルはそれぞれでも、
1関数は百行以内で頼みたい。
386:384
12/01/19 08:25:52.23
ソース読み間違えたorz
387:デフォルトの名無しさん
12/01/19 10:52:47.12
>>382
ぱっと見、抽象型プログラミングっぽいけど、よく見たらファイル一個につき
selfが一個だな。
あんまり利点を感じない。
388:デフォルトの名無しさん
12/01/19 14:07:44.90
いったい検証てなんなんだ?
意味がわからんのだが。
389:デフォルトの名無しさん
12/01/19 15:18:28.05
査読してほしいってことぐらいわかろう
390:デフォルトの名無しさん
12/01/19 15:50:28.51
何がしたいコードなのかもわからずに査読も何もないだろう。
ぱっと見、OOPを噂で聞いたくらいで何かそういうことを
やろうとしたような残念なコードにしか見えないんだが。
391:デフォルトの名無しさん
12/01/19 17:34:27.20
ネバーネバーネバーネバーギブアップって、
! ! ! ! give_up という事で、
give_upがtrueなら
! ! ! ! give_up もtrueという事で
ギブアップなんですよね?
392:デフォルトの名無しさん
12/01/19 17:51:02.21
give_up || !give_up
だよ
393:デフォルトの名無しさん
12/01/19 18:37:49.17
番号を選択し、選択した番号によって処理を変えたいのですが、
[範囲外の数値が入力されました。]としか表示されません
番号通りの処理をさせるにはどうしたらいいのでしょうか
URLリンク(codepad.org)
394:デフォルトの名無しさん
12/01/19 18:44:58.18
>>393
- scanf("%d", menu);
+ scanf("%d", &menu);
395:デフォルトの名無しさん
12/01/19 18:51:32.77
>>394
有難うございます
早速修正します
396:デフォルトの名無しさん
12/01/19 20:51:59.13
コンパイラが宣言された配列に対して実際に確保するメモリ領域の大きさを決める基準ってなに?
397:デフォルトの名無しさん
12/01/19 21:00:03.22
>>396
配列のサイズ以外に何かあるの?
398:デフォルトの名無しさん
12/01/19 21:25:55.65
char は1バイト
int は4バイト(処理系によりけり)
long は8バイト(処理系によりけり)
とかを聞きたいんじゃね?
399:デフォルトの名無しさん
12/01/19 21:44:19.30
コンパイラの仕様による
としか
400:デフォルトの名無しさん
12/01/19 21:48:02.12
char a[6];
が8バイト分確保するとか。
コンパイラ依存だろうが。
401:396
12/01/19 22:24:08.73
すまん、要素数が1の時に1byte、2~16で16byte、17~32で32byte、33~64で64byteっていう実験結果が得られたのを前提に頼む。
402:デフォルトの名無しさん
12/01/19 22:32:17.25
>>401
char配列?
403:デフォルトの名無しさん
12/01/19 22:32:39.53
>>401
>すまん、要素数が1の時に1byte、2~16で16byte、17~32で32byte、33~64で64byteっていう実験結果が得られたのを前提に頼む。
そんなのじゃなく、実際の宣言部分を見せろ。
404:デフォルトの名無しさん
12/01/19 22:37:07.14
>>401
OSやコンパリラとか書かないと
405:396
12/01/19 22:56:02.82
char a[i];
コンパイラはgcc
406:デフォルトの名無しさん
12/01/19 22:57:55.71
>>381
俺の超能力をもってしても、お前のレスは意味不明。
407:デフォルトの名無しさん
12/01/19 23:02:24.89
>>401
別に普通のことだろ。
何が疑問なんだ?
408:デフォルトの名無しさん
12/01/19 23:03:38.25
プラグマとかコンパイルオプションで変えられるっしょ
409:デフォルトの名無しさん
12/01/19 23:05:06.72
>>405
とりあえず↓だと
#include<stdio.h>
int main(int argc, char **argv)
{
char a1[1];
char a2[2];
char a17[17];
char a33[33];
printf("sizeof(a1) = %d\n", sizeof(a1));
printf("sizeof(a2) = %d\n", sizeof(a2));
printf("sizeof(a17) = %d\n", sizeof(a17));
printf("sizeof(a33) = %d\n", sizeof(a33));
return 0;
}
実行結果 こうなる。
sizeof(a1) = 1
sizeof(a2) = 2
sizeof(a17) = 17
sizeof(a33) = 33
gccは
$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/i686-pc-cygwin/4.5.3/lto-wrapper.exe
Target: i686-pc-cygwin
--中略--
Thread model: posix
gcc version 4.5.3 (GCC)
410:デフォルトの名無しさん
12/01/19 23:07:02.20
>>405
>char a[i];
要素数が変数になっているのが気になるな。
情報小出しにしないで、>401でどうしてそう判断したのか、
コードを出しな。
411:デフォルトの名無しさん
12/01/19 23:25:53.81
>>410
#include <stdio.h>
#define i 1
int main(void)
{
char a[i],b[i],c[i];
printf("a:%p\n",a);
printf("b:%p\n",b);
printf("c:%p\n",c);
}
412:デフォルトの名無しさん
12/01/19 23:27:23.14
>要素数が変数
>>405がやってるのは、なに言語?
413:デフォルトの名無しさん
12/01/19 23:27:53.71
>>411
そういう書き方、気持ち悪いと思う
414:デフォルトの名無しさん
12/01/19 23:28:00.33
どうせワード境界だのなんだのの話だろ?
415:デフォルトの名無しさん
12/01/19 23:28:08.95
アドレス表示してなにがやりたいの?
416:デフォルトの名無しさん
12/01/19 23:42:07.25
>>411
環境によって、4の倍数のアドレスがアクセスが速いとか、奇数アドレスにアクセスできないとか
あるから変数とかきっちり敷き詰めて置かれないことのほうが多い。
417:デフォルトの名無しさん
12/01/19 23:43:01.09
#include <stdio.h>
char a[XXX];
char b[1];
int main(){printf("%d ",b-a);return 0;}
for XXX in 1 2 3 4 5 6 7 8 9 10; do gcc -DXXX=$XXX hoge.c; ./a.out; done
結果
1 2 3 4 5 6 7 8 9 10
418:デフォルトの名無しさん
12/01/19 23:44:02.24
>>405
配列の添字が変数のトキはとくべつなしょりになるよ
419:デフォルトの名無しさん
12/01/19 23:44:43.21
構造体だと
#pragma pack(1)
みたいな、隙間無く埋めろとか指定できるのもあるな。
こんなの使わないから忘れたけど。
420:デフォルトの名無しさん
12/01/19 23:45:13.81
>>417
a,bの順番にかくほされるとはかぎらないよ
421:デフォルトの名無しさん
12/01/19 23:53:00.39
構造体は何にもしなくてもアドレス続いてるんじゃなかたけ?
例えば、
struct a{
long n;
char c[4];
};
a.nの次のアドレスにa.c[0]が続いてるんじゃないの??
422:デフォルトの名無しさん
12/01/19 23:54:34.00
struct a{
char c[3];
long n;
};
はどうなってるのかと考える?
423:デフォルトの名無しさん
12/01/19 23:54:42.23
いいえ
424:デフォルトの名無しさん
12/01/19 23:57:17.34
>>422
char c[3]がlongに合わせられるんでしょ?
ちなみにlongは4バイトでw
425:デフォルトの名無しさん
12/01/19 23:58:17.42
何を根拠にそう言ってるんだ?
426:デフォルトの名無しさん
12/01/20 00:00:03.47
>>421
隙間あいてることもあるよ。
427:デフォルトの名無しさん
12/01/20 00:01:02.85
>>424
>char c[3]がlongに合わせられるんでしょ?
×
428:デフォルトの名無しさん
12/01/20 00:03:08.82
なんとw
char c[3]の領域破壊したら、その下のlong nも壊れるんじゃないんだ
429:デフォルトの名無しさん
12/01/20 00:07:56.70
>>411
それは配列がどう配置されるかで、
>>396
>コンパイラが宣言された配列に対して実際に確保するメモリ領域の大きさを決める基準ってなに?
の、配列に対して確保されるメモリ領域の大きさとは、話が変わってるぞ。
>>409で示したように、「配列に対して実際に確保するメモリ領域」の大きさは、char a[N];
ならNになっている。
430:デフォルトの名無しさん
12/01/20 00:17:02.14
構造体のサイズとアライメント
URLリンク(www.g-ishihara.com)
431:デフォルトの名無しさん
12/01/20 00:43:40.33
double array[10][20]に対応するキャストってなんでしょうか?
よろしくお願いいたします。
432:デフォルトの名無しさん
12/01/20 00:46:33.99
ポインタと意味と斟酌すると、
double (*p)[20] = array;