1 :
デフォルトの名無しさん :
2012/01/13(金) 22:05:06.14
オイ俺のコピペ脳!まで読んだ。
int main() { char* str1[10]; //定義しただけで初期化していない。つまり文字列は格納されていない。 func1( &str ); } void func1( char* str ) { char* inStr; str = "test data"; return ; } 質問なんだが。 なぜ、きちんとstrに文字データが格納されるんだろうか?
タブスペースで書き込んじまった 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を参照しても全く問題ないし、キチンと値が格納されている。 値が参照できるのは、たまたまナノか? この操作は問題ない?
まずはコンパイルが通るか自分で確認してから書き込め
最初のスタックへのアドレスがまずさ迷い人に成って5ではfunc1のリテラルも全く無意味になって更にアナザの返値の先頭バイトまで無意味に成ってる。
>>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";
}
>int main() { > char* str1[10]; //定義しただけで初期化していない。つまり文字列は格納されていない。 > > func1( &str ); >} 変数名ちゃうやん。 >void func1( char* str ) { 型ちゃうやん。(char ** → char *)
>>7 >更にアナザの返値の先頭バイトまで無意味に成ってる
戻り値として、「est」が欲しいのでそうなってる。
str[1]="test"+1;
>>11 anotherFunc の return は、例えば「Content-Type: application/x-javascript」
その中で「application/x-javascript」を取り出したい。
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云々) ここまでなら分かる。
"test"はプログラムをメモリ上に読み込んだ時点で確保されてる。 開放されるのはプログラム終了時。 return (char*)"test"; も char *inStr = "test"; return inStr; も、書き込みをしなければ問題ない。 但し char inStr[] = "test"; return inStr; は駄目。
15 :
o :2012/01/14(土) 12:00:08.37
ところが、
>>8 における inStr はfunc1のスタックに積まれる。
いくら、str[1]にポインタを代入したところで、参照しているのはfunc1のスタック上にあるinStrのアドレスである。
func1がリターンしてしまうと、スタックは破棄( ただ単にゼロクリアしていないだけ)な気がする。
結局うまく言っているように見えるのはスタックが破壊されていないから?かな、と。
16 :
o :2012/01/14(土) 12:05:30.40
>>14 返信ありがと。
str[1]に書き込んでmainで参照するにはどうするのが良い?
ならないよ。 >8 の inStrはいわばメモ書き。 "test"の場所が書かれてるだけ。 str[1]に内容をコピー(1足してるけど)した後に消える。 住所書かれてるメモ紙を捨てたらその住所が消滅するわけじゃあるまい?
18 :
o :2012/01/14(土) 12:10:32.04
あ、 念のため・・・ char* str[10] は、10個の不定長の文字列を格納する10個のポインタです。 最終目的は、sub関数から不定長の文字列を設定したい、と言うことです。
19 :
o :2012/01/14(土) 12:14:47.41
>>17 最終的に聞きたいのは、スタティックなリテラル値ではなく、ダイナミックな変数の値です。
つまり、
inStrの具体的な値を、str[1]に入れ込むためにはどうしたらよいのか?と言うことです。
【話題】女子にイラッとされる「理系男子特有の話し方」9パターン★2 【1】「要するに」と他人の話もまとめてしまう 【2】「違う」と小さな間違いでもいちいち訂正する 【3】「化学反応だから」などロマンチックなことにも根拠を述べる 【4】「仮に」など自分の専門分野でたとえたがる 【5】「具体的には?」と曖昧な表現でなく数字を知りたがる 【6】「データがあるから」と他人の意見を受け入れない 【7】「わかる?」と難しい説明の後で上から目線の確認をする 【8】「ありえない」など決めつけて断言する 【9】「だから?」とオチを先に聞きたがる 要するに馬鹿しか女子とはお話出来ないということだな
1, 2, 7, 8は理系文系関係なく糞爺にも当てはまるw
>19 >8 の >str[1] = inStr + 1 ; でいいんじゃないの?
23 :
o :2012/01/14(土) 12:40:46.42
>>22 うむむ。
分からないのは、
「inStr+1」で指定されたアドレスは、func1がreturnされると開放されるメモリアドレスじゃないですか?
そうすると、そのアドレスを入れ込んだstr[1]の内容(=アドレス)も開放されてしかるべきアドレスじゃないかと?
17を100回読め
25 :
o :2012/01/14(土) 12:43:50.36
コンパイルエラーでできないんだけれども、こんなことをやりたいんだと言うことです。 *( str[1] ) = *( inStr + 1) ;
26 :
o :2012/01/14(土) 12:46:49.28
>>24 20回読みましたデス。足りないかな?
スタティックなリテラル値の話ではなく、自動変数に格納されている値を戻したいと言うことですが・・・
戻すとき、リターン値はエラーコードで使用されていますのでリターンで戻すのは不可です。
なのでfunc1にポインタで渡して、その内容を更新したい、ということです。
もう20回読んでみます。
27 :
o :2012/01/14(土) 12:51:23.74
後だしと言われるのを避けるために、実際のコードの説明をしますが、 実際にはfunc1 には構造体を渡しています。 正確には構造体のアドレスを渡してます。 構造体は typedef struct s{ char* field[MaxHeaderNum]; char* attrib[MaxHeaderNum]; }S;
こうか? str[1] = (char *)malloc(strlen(inStr + 1)+1) ; if(!str[1]){ /*エラー処理*/ } strcpy( str[1] , inStr + 1);
29 :
o :2012/01/14(土) 13:01:30.86
>>28 すんばらしい。
そういうことです。
はじめはそのように書いていたのですが、
非常に頻繁に呼ばれることと、
mainのなかでいつfreeすればよいのかが不定であることや、
関数を変にまたがってしまう、
などなどの複雑な問題により諦めてしまいました。
で、コードをシンプルにする方法でのアプローチでコーディングしなおしてます。
ヒープを使わなければ無利なのでしょうか?
とりあえず char* str[10] をゼロクリアしてから使え。 あとは終了時とmallocする前にNULLで無ければfreeするような処理書いとけばいいんじゃね?
31 :
o :2012/01/14(土) 13:16:46.64
>>30 だんけ
ってことは、
>>8 はたまたまうまく行っているだけってことかな?
長引いてるな…
>スタティックなリテラル値の話ではなく、自動変数に格納されている値を戻したいと言うことですが・・・
自動変数に〜というなら、malloc でヒープに領域を確保して、外部で解放するしかない。
自動で解放して欲しいのなら、C++ に行ってデストラクタなり std::string なりに頼る。
>>8 はスタティックなリテラルのポインタを返してるので、たまたまではなく正常に動作する。ただし貴方の求めているものではない。
メールとかの通信関係の処理か? クラス化の設計とか楽しそうだなぁ。
34 :
o :2012/01/14(土) 16:19:51.99
>>32 ありがと。
参考になります。
>>33 bingo
HTTPだけど。
移植性を考えてて、ANSI-Cベースで書いているところが、またそれはそれで、制限が多いw
>>15 の
> 参照しているのはfunc1のスタック上にあるinStrのアドレスである。
これが間違えていることには気づいているのだろうか
inStrのアドレスは&inStrな。
36 :
o :2012/01/14(土) 16:41:00.07
>>35 宣言が、
char* inStr だけれども?
37 :
デフォルトの名無しさん :2012/01/14(土) 16:44:53.84
反日ネット工作員 朝日新聞社→社員約300人 民主党とその取り巻きの資金が入った反日工作会社→数社約450人 朝日新聞の社員は捕まった49歳の編集者を含め新聞記事を書く合間に2chを荒らしている程度とみられているが 民主党が用意した反日工作会社はほぼ24時間体制で工作を行っている 工作範囲は民主党が予め工作費を流している2ch、ニコニコ動画を中心にyoutube、個人のブログなどである。
>19 >inStrの具体的な値を、str[1]に入れ込むためにはどうしたらよいのか?と言うことです。 「inStrの具体的な値」と言ったらinStrに代入されてる"test"のアドレス値のことだろ。 それが >28 が正解というなら 「inStrのポインタが示す先の文字列をコピーして、str[1]に入れ込むためにはどうしたらよいのか?」 と言うべきだろ。 まぁ、そう言えるぐらい理解できてるなら質問もしてこないだろうが。
sizeof(char *) == sizeof(int) なら void func1(char* str[] ) { int inStr; inStr = (int)anotherFunc() ; str[1] = (char *)(inStr + sizeof(char)) ; return ; } としても同じ結果なんだよ。
intptr_t 使えよ
別名便所の壁の2chがチラシより上とな!?
便所の壁はみんなの目に触れるからな
都内じゃ1500枚ほどチラシが貼られたらしいな。
46 :
o :2012/01/15(日) 07:51:27.88
>>38 >「inStrのポインタが示す先の文字列をコピーして、str[1]に入れ込むためにはどうしたらよいのか?」
コピーして
の部分が全く違う。
コピーしてよいのなら、解決法はいくつでもある。
>46 >28 >strcpy( str[1] , inStr + 1); コピーしてるやん。 違うというなら正しいソース書いてみてよ。
48 :
o :2012/01/15(日) 11:21:44.71
>>47 多分、言いたいことの1/1000も伝わっていないんだと思う。
バッファから下ろしてきたデータは一時的にしかるべき場所に「コピーして」配置される。
俺の言っているのは、
そのしかるべき場所のポインタを渡すだけにしたいんだが、何とかならんのんかの?
という質問だが、
君は「さらに」、コピーしたらええやん、
と言っている。
その「しかるべき場所」はグローバルか何かで確保されてたり消える心配がないのであれば そのポインタを渡すだけでいいじゃん
50 :
o :2012/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あたりできりなおさんとまずくない????? ま、さくっとコピーできるんだったら、謝る
何を何にコピーすることを言ってるのか? 区切り文字が'\'というのは例として挙げただけ?
52 :
o :2012/01/15(日) 11:38:53.01
>>49 コーディング規約により、グローバル宣言ができないんですヨ
・局所的にしか利用されず
・他スレッドからの参照に問題あり
・アクセスコントロールに関与する
・マルチスレッド対応の場合
などなど。
53 :
o :2012/01/15(日) 11:39:23.14
54 :
デフォルトの名無しさん :2012/01/15(日) 12:12:25.05
仕事上のコーディング方法を2chで質問かよwww
みんなすげーな オレには何を言いたいのか全然分からん
この子の関わったソフトが載った製品は買いたくないと思ってしまうな @>何を何にコピーすることを言ってるのか? への回答は? A「しかるべき領域」はスタック上?ヒープ上?それ以外?スタック上ならほぼコピーするしかない B「しかるべき領域」は書き換えてもよい?書き換えたらダメなのであればさらにコピーするしかない
58 :
o :2012/01/15(日) 12:30:27.97
>>54 チートツールなんだが、なぜに仕事だと思うのかなぁwww
59 :
o :2012/01/15(日) 12:34:36.28
>>57 >この子の関わったソフトが載った製品は買いたくないと思ってしまうな
売り出されたら驚いちゃうんちゃう?
>@>何を何にコピーすることを言ってるのか? への回答は?
機種依存文字はどうかと思うけど。
コピーと言われたから、それを使っただけ。
>A「しかるべき領域」はスタック上?ヒープ上?それ以外?スタック上ならほぼコピーするしかない
スタック上。
main関数のスタックに積んでいればOKでしょ?
違うの???
>B「しかるべき領域」は書き換えてもよい?書き換えたらダメなのであればさらにコピーするしかない
書き換えても良いの意味が分からん。
書き換えたらダメってことは、参照もダメってこと???
意味が不明です。
>>59 お前が意味不明だな。
手繰るの面倒だからここでもう一度整理して新規に質問しなおせ。
61 :
o :2012/01/15(日) 12:50:30.70
>>60 君のおかげで整理できたよ。
聞きたい内容は、
呼び出し先の呼び出し先から、大元のスタックにある文字列を直接変更できるか?
ってこったな。
孫関数には、ポインタのポインタなら渡せる、と言う条件でな。
63 :
o :2012/01/15(日) 12:53:35.05
細かい条件を列挙する。 ・データはストリームで落とされる。 ・孫関数にはポインタのポインタが渡される ・文字列の長さは不定長 ・区切り文字がある文字列 ・ストリームは、孫関数で処理される この条件で親のスタックに詰まれた文字列を孫から操作できるかどうか? んだな。
ちゃんと質問できるようになるまで何年もかかりそうだな 義務教育の間何やってたんだか
65 :
o :2012/01/15(日) 12:55:10.92
おっと。 追加があった ・データはストリームで落とされる。 ・孫関数にはポインタのポインタが渡される ・文字列の長さは不定長 ・区切り文字がある文字列 ・ストリームは、孫関数で処理される ・staticは使えない
66 :
o :2012/01/15(日) 12:56:52.04
>>64 まあ、そんなことより、
>>52 が仕事上のタスクだと思う方が驚きだけど。
指示されないと何もできないんかなぁ。
もしくは何でもグローバル宣言すりゃいいと思っているのかなぁ。
普通に個人のコーディング規約に含まれる常識的な内容だと思っていたんだが、これも違うのか?
>>66 >>65 を読む限りお前の考えたものではないだろうし
バカみたいな社内用語?で伝わると思ってるのがおかしい
>>65 わけのわからない条件は関係なく、元のスタック上の文字列のポインタが
わかるなら当然できるだろ。
なんでできないとか思うんだろ。
ちなみに、スタックとかストリームとか、Cには関係ないから。
69 :
o :2012/01/15(日) 13:12:04.29
>>68 ストリームデータは軽く64kを超えるんだが、
mainで
char streamData[131072]
とか宣言しちゃうの?
スマートじゃない気がするけどw
後々func1がスレッドで動くようになるんだし、mainがdllmainになるんだが、
どう見てもそりゃスマートとは言いがたいと思うんだけど、どうだろうか?
70 :
o :2012/01/15(日) 13:13:45.46
>>67 こちとら、素人だし、
チートツールの作成を企業が許可するとも思えんし、
>普通に個人のコーディング規約に含まれる常識的な内容
だと思うんだけど、違うのか?
整理して質問しろと言っただろ。 > 呼び出し先の呼び出し先から、大元のスタックにある文字列を直接変更できるか? できる。 もう一度だけチャンスをやる。 整理して1レスで質問しろ。
>>70 チートツール作るなんてことを言ってるバカに協力しねーよ
74 :
o :2012/01/15(日) 13:19:03.47
どういうことだよ。 お前、頭腐ってるわ。
o君の考えるスタックとは何を指しているのかね?
77 :
o :2012/01/15(日) 13:21:07.96
>>72 f2を実行しないと、str[]の大きさが分からないんだけど、それでも大丈夫ってこと?
少なくとも512byteは確実に超えるんだけど。
ここまで日本語が通じないのも珍しいな。 いや、そうでもないか。
79 :
o :2012/01/15(日) 13:22:30.21
>>79 お前の思い込みなんて人にはわからないんだよ。
だからお前のことを何も知らない普通の人間にわかるように整理して
1レスにまとめて質問してみろよ。
81 :
o :2012/01/15(日) 13:24:59.66
>>76 関数が呼び出されたことにより確保される、SP、ReturnAddressと自動変数のかまたり
スタックのサイズが心配ならスタックを拡張するなりヒープを使うなり すればいいだけだろ。
83 :
o :2012/01/15(日) 13:27:07.83
>>80 あいよ。
聞きたい内容は、
呼び出し先の呼び出し先から、大元のスタックにある文字列を直接変更できるか?
条件は次の通り
・データはストリームで落とされる。
・孫関数にはポインタのポインタが渡される
・文字列の長さは不定長
・区切り文字がある文字列
・ストリームは、孫関数で処理される
・staticは使えない
だから、ストリームて何だよ。 思い込みハゲしいなまったく。
文字列を直接変更できるかどうかに長さや区切り文字は関係ないだろ。
86 :
o :2012/01/15(日) 13:31:05.93
87 :
o :2012/01/15(日) 13:32:15.62
またか。
その512byteのデータと
>>72 がどう関係するんだよ。
89 :
o :2012/01/15(日) 13:36:36.09
>>88 void f2(char* str){
str[500]='\r';
str[501]='\n';
}
ができるんだったら、何も言わんよ
91 :
o :2012/01/15(日) 13:38:41.03
ああ、 void f2(char* str){ str[131070]='\r'; str[131071]='\n'; } ができるんだったら何も言わんよwww
92 :
o :2012/01/15(日) 13:38:58.70
93 :
o :2012/01/15(日) 13:40:11.55
そりゃそうだわな。
str[10] と宣言しているのに、
str[131070]にアクセスしているんだもんね。
>>90 は、そんなことも分からないの?
何も言うなと言ってるだろ。
95 :
o :2012/01/15(日) 13:47:33.40
また、えらく拗らせちゃってるんだね。 スタックのサイズが心配なら512KBをヒープに確保してそれを渡せばいいだけだろ。 まわりの人も大変だろうな。
無能な働き者ってこの質問主の様な奴の事なんだろうな。
>>95 >宣言した数より大きな領域にアクセスさせるのは危険だよ。
常識で分かることは言う必要がない。
99 :
デフォルトの名無しさん :2012/01/15(日) 13:53:40.36
無能な働き者。これは処刑するしかない。
ちょっとよくわからないのが 大元がmainだとして 「大元のスタックにある文字列」って >mainで >char streamData[131072] 以外にどうやって定義するの?
101 :
o :2012/01/15(日) 13:56:56.89
>>96 ヒープに確保する方法は否定していないよ。
>>100 質問もできないくらいのレベルなんだから察してやれ。
104 :
o :2012/01/15(日) 14:04:12.54
どこまでアホ? alloca使ったところでスタックは拡張されない。 って、まぁ釣りだろうけどw
>>95 ストリームとやらの範囲内ならいくらでもアクセスできるでしょ。
例は10だったけど、そのストリームはもっと大きいんでしょ
>>104 allocaってスタックだよ。
ってかヒープを避ける理由がわからない。
char streamData[131072]
でも
char *streamData = (char*)alloca(131072);
でもいいけど、
結局
>>72 で問題なくね?
allocaってのは初めて知ったわ
109 :
o :2012/01/15(日) 14:12:26.25
>>107 直近の問題は、何時freeするのかが不定なことだけど、
本質的には、スレッドで動かしたいから、別スレッドからのアクセスをさせないために自動変数での処理をさせたい
と言うのが本音。
スタックはスレッドで共通だが。
111 :
o :2012/01/15(日) 14:14:14.13
>>108 どこからスレッドとして走らせるかだけど、
スレッドが100走ると末恐ろしい
112 :
o :2012/01/15(日) 14:14:31.03
別スレッドからのアクセス性についてな。
その点ではヒープもスタックも同じ。 普通、mallocもfreeもスレッドセーフだろ。
115 :
o :2012/01/15(日) 14:17:20.97
>>113 だったら、ストリームデータを、他のスレッドが書き換えるって事が可能というか、
別のスレッドがストリームデータを壊すんだよね。
それじゃ、NGじゃね?
116 :
o :2012/01/15(日) 14:17:48.14
最初に立ち戻るんだけど、ストリームは別スレッドから変更されうるんじゃないのかって気がするんだけど。 もしそうならポインタ保持じゃだめだけど、それは大丈夫? で、そのストリームが読み取り専用じゃないかつ、デリミタのような0バイトよりも大きな文字列があるのなら、strtokの要領で対応できないか?
119 :
o :2012/01/15(日) 14:19:40.12
>>114 すまん、間違えた。
ヒープでもスレッドセーフなのか?
ちょいと調べてみる
>>115 ポインタの先が別スレッドが確保したスタック領域ならそこを壊す。
つか、それはバグと言うんだがな。
>>119 お前はスレッドセーフという単語を理解してないに3億ペリカ。
いや、スレッドも理解してないに10億カノッサ。
「ヒープでもスレッドセーフなのか?」 これなんぞ。 根本的な知識が圧倒的に足りないといわざるを得ない。 チートツールの前に初心者としてまっとうに勉強しなさいな。
mallocがスレッドセーフか? というのならそれはライブラリ次第。
124 :
o :2012/01/15(日) 14:26:40.81
>>122 ヒープがスレッドセーフなんて聞いたことがない。
ライブラリが対応してスレッドセーフにしているケースなら知っているけど???
君の知っているのはどんなシステム系なんだ?
だから普通と言ってるだろ。 スレッド使う環境でスレッドセーフじゃない設定をわざわざ使わない限りな。
>>124 関数がリエントラント可能かどうかについてその言葉を使うのであって、スタックやヒープに対して使うもんじゃないよ
128 :
o :2012/01/15(日) 14:29:42.29
どう見ても、
>>122 がダブルパンチ食らっているようにしか見えないけど?
129 :
123 :2012/01/15(日) 14:30:33.99
>>125 まったくそのとおりだ。ちょっと上のスレもよまんで書いてしまった^^;
130 :
デフォルトの名無しさん :2012/01/15(日) 14:30:34.75
すごいなぁ、お前。
なんだこれ。恥ずかしくなって暴れ始めたのか
>>124 もしかして「ヒープ領域からメモリを確保すること」の略として「ヒープ」っていってんの?
…静かになったぞ。何かを調べてんのか?
136 :
o :2012/01/15(日) 14:41:13.91
137 :
o :2012/01/15(日) 14:44:26.42
で、
>>52 って
>普通に個人のコーディング規約に含まれる常識的な内容
だと思うんだけど、違うのか?
138 :
o :2012/01/15(日) 14:45:49.46
>>134 その、
「ヒープ領域からメモリを確保すること」
の意味が分からんけど?
素かよ。もっとやりたいことを具体的に示せ。
大体わかってるつもりでレスをしているんだが、訳わからんほうに話をずらされてる感じがする。
あと、
>>127 は大体あってるけど少し違う。
リエントラント可能であることはスレッドセーフであることを保障するが、逆はそうではない。
>>136 素。
ほんと、日本語も不自由なんだな。
恥ずかしくて素人じゃないって言えないだけじゃないのか?
>>138 それをわからずにヒープだスタックだ、あまつさえ「ヒープでもスレッドセーフなのか?」なんてことを言うのか。
逆に「スタックはスレッドセーフ」だと思っているってことだと思うんだけど、これがどういうことなのか説明してくれ。
>>137 >グローバル宣言ができない
個人の開発で完全に禁止する利点があまりない。
グローバル変数をできるだけしないってのはまあ誰でも考える。
個人でコーディング規約を決めていたとして、
それに違反することを「コーディング規約により・・できない」って言い方をする人はあまりいない。
俺の方針に反するだとか、好みじゃないとか、そのレベルでしょ。
素人じゃないことを隠したい素人さん。
俺も文書がおかしいなw ×グローバル変数をできるだけしない ○グローバル変数をできるだけ使わない
>>142 >>8 と
>>83 でエスパー大会ってことか…
加えて、
>>115 でストリームデータ(mainのstrか?)は別スレッドから変更されうる、と。
ストリームデータを変更されたあとでも使用したいのなら、
strへのアクセス処理を「スレッドセーフ」にして、
別領域(要件を満たせるならスタックでもヒープでも)にコピーするしか方法はないよな。
149 :
o :2012/01/15(日) 14:57:25.09
>>141 スレッドに詰まれたスタックならスレッドセーフだろ。
>>149 すべてのスレッドはメモリ空間を共有する。
基本だ。
「スレッドに詰まれたスタック」って、何?
先にスレッドセーフの国語的な用例を調べて意味を理解してくれ ×スタックはスレッドセーフ ○スレッドセーフな関数、スレッドセーフなコード など
スタック領域がスレッドごとに確保されるってことを言いたいんだと。
154 :
o :2012/01/15(日) 15:01:33.54
>>146 つまり、お前涙目ってことかな。
仕方ないだろ。俺が素人なんだから。
なんか同じような内容を別のところでも書いた気がするw
>>149 意識をあわせてレスをしようとしてみる。
スレッドのスタックにあるポインタの指すアドレスを複数のスレッドが保持している場合、
そのアドレスはスレッドセーフじゃない
(かなりひどい文だが…
>>154 素人を自覚してるならまずその態度を治せ。
157 :
o :2012/01/15(日) 15:02:28.96
で、そのスタック領域はすべてのスレッドが共有するメモリ空間にあるわけだが、 そのあたりを1_も理解してないんだろう。
159 :
o :2012/01/15(日) 15:03:27.27
>>156 回答している人の中に、素人が混じってるから仕方ないと思うよw
>>156 それは大抵の場合、やりたいことを引き出すことよりも難しいよ
161 :
o :2012/01/15(日) 15:04:05.63
>>158 プロセスって言葉を出させたいってこと?
>>161 いや。
お前がスレッドすら1_も理解してないことを自覚させたいだけ。
164 :
o :2012/01/15(日) 15:10:42.02
>>162 スマートな方法じゃないけど、「スタッククラス」で対応するのも手かもよ。
コピーするだけが能じゃない気がするけど???
お前は何を言っているんだ。
C++なの?
その「スタッククラス」ではコピーが必要ないの?初心者の俺にkwsk
まだ「スタックはスレッドセーフ」という妄想に取り付かれてるようだな。
169 :
o :2012/01/15(日) 15:14:43.67
>>166 ANSI-Cベースなので、クラスは使わない方向で行きたいが、
コーディングはCDTでやってる。
>>110 いいえ、スタックとプログラムカウンタはスタックごとに別。
171 :
o :2012/01/15(日) 15:15:31.34
>>168 そのスタックの話をしているわけじゃないのは分かっているよね?
お、QZにちょうどいい相手じゃないか? ちょっとどんな展開になるのか、他の人はだまってみてようよw
>>164 それで実装したコードを挙げてくれ。そうすればもっとスマートな解決方法を出すことができるかもしれない。
174 :
o :2012/01/15(日) 15:17:00.12
QZの意見を聞きたくなる場面なんてあまりないからなw ぜひ回答してやってくださいQZさん
>>172 ああ、うん。珍しくQZの自演暴れじゃないものが見られるかもしれんね
実はo=QZという素晴らしいオチ!
175 名前:あぼ〜ん[NGWord:QZ] 投稿日:あぼ〜ん 176 名前:あぼ〜ん[NGWord:QZ] 投稿日:あぼ〜ん 177 名前:あぼ〜ん[NGWord:QZ] 投稿日:あぼ〜ん
179 :
o :2012/01/15(日) 15:22:27.21
180 :
173 :2012/01/15(日) 15:28:35.84
QZじゃなくてすまんがレスされてしまったので。
>>179 もちろん実装していないことはわかっている。
>>5 がいい方法かどうかがわからなくて困ってたんだろ。
>>164 がいい方法だと思いついたのなら、それで実装すればいい。
これが気に入らないのであればレスしなくていいし、質問はQZあてに頼む。
181 :
o :2012/01/15(日) 15:37:47.56
>>145 いや、そんなことを言っているんじゃなくて、
・局所的にしか利用されず
・他スレッドからの参照に問題あり
・アクセスコントロールに関与する
・マルチスレッド対応の場合
+もろもろ
のような条件があるにもかかわらず、グローバル変数を使おうとする人が世の中にいるのか?
って話。
これだけ条件が整えば、
企業が規制するまでも無く、グローバル変数の利用を控えるんじゃないの???と
182 :
o :2012/01/15(日) 15:40:14.15
解散
>>181 >>49 の段階ではマルチスレッドの話なんて出てきてなかったろ。
自分だけが知っている情報を他人も知っているはずだと考えるのはよくないことだよ。
>>185 ああ、さらにアクセスコントロールもされていたようだ
187 :
o :2012/01/15(日) 15:55:36.98
>>184 条件が出てきた時点で、
「ああ、そうかグローバル変数じゃダメね」
ってレス付くなら分かるが、
>仕事上のコーディング方法を2chで質問かよwww
とレスられた事で
玄人の( というのは間違いで本当は素人 ) の中ではこれだけ条件が付いても
「ああ、そうかグローバル変数じゃダメね」
とは思わないのかなぁ???
という話。
日本語からやり直せ。
189 :
o :2012/01/15(日) 15:57:47.80
やっぱりo=QZか?
質問主アスペ
キチがウヨウヨいると考えたくないしな
言いたいことを簡潔的確に言えるようにならないと開発は無理。 理解力はその前に必要だけど、普通の人なら持っている。
最近はその普通が通じないんだと思うよ。
195 :
o :2012/01/15(日) 16:06:20.21
>>192 そうだよね。
これだけ条件が付いていりゃ、業務命令じゃなくても、グローバル変数は避けるよねぇwww
別にグローバル変数だってスレッドセーフにすればいいだけ。
>>195 そんな話どうでもいいから本題をQZに質問するといいよ
流れとは別の質問なんだけど スタック領域とかヒープ領域とかに対して グローバル変数やstatic変数がある領域って一般的になんていうの? データ領域?
>>198 スレ違いだが、それでいい。
記憶クラスでググれ。
200 :
o :2012/01/15(日) 16:25:18.71
>>196 だね。
そもそも、業務命令とか変な条件の前にグローバル変数は避けるのがデフォだし。
202 :
o :2012/01/15(日) 16:26:33.99
>>200 おっと、途中で送信してしまった。
BSSとかデータ領域とかの話をしてるんじゃね?
204 :
o :2012/01/15(日) 16:27:38.02
>>201 そうなんだよ。
だから
>仕事上のコーディング方法を2chで質問かよwww
と言われると、
本職の方は、そんな考え方もしているのかなぁ、と
206 :
o :2012/01/15(日) 16:29:56.40
なんか、みんな俺に冷たいなぁ。 俺がなんかしたんか?
207 :
o :2012/01/15(日) 16:30:37.06
>>205 傍系の質問だべ。
答えられなきゃ、黙ってりゃ良いのに。
QZ出てこいよ。 ちょっと質問が高度すぎるか? あ、質問というより回答がか。
>>206 質問に答えているのにスルーして続ける
知らない単語をさも知っているように間違って使う
関係ないところにつっかかって引き延ばす
212 :
o :2012/01/15(日) 16:50:08.47
>>210 何言っているのか分からんが、
自己診断テスト得点計算結果
あなたの得点は16点です。
社会的スキル
3点
注意の切り替え
4点
細部への注意
1点
コミュニケーション
5点
想像力
3点
閾値内に収まっています。
213 :
o :2012/01/15(日) 16:52:32.85
>>211 あいや、
スルーしているんなら、レス番号知らせてもらえると助かるよ。
>知らない単語をさも知っているように間違って使う
これは、きちんと指摘してもらえればOK
心は広いから無問題だよ
>関係ないところにつっかかって引き延ばす
新たな質問が出たら、きちんと解決しよう。
普通のことだと思うけど?
これのどこが気に触る内容なのかな?
こういうのは分裂症?
215 :
o :2012/01/15(日) 16:54:20.80
217 :
o :2012/01/15(日) 17:18:10.40
>>216 よく分からんが、選択肢が2つ。
1つは、func1で文字列を保持
もう1つはmallocでmainに引き渡す。
実装してみないと分からないけど、前者かなぁ・・・と。
HTTPだけど、すべてのデータがmainに返さないといけないわけではない。
汎用性がないのが残念だけど、前者の方がよいかなぁ。
汎用性を高めるんなら、mallocかなぁ、と考えてる。
ただ、結合テストで問題が出そうな気がしてならない。
QZ早く出てきてやれよ。
>>217 マルチスレッドらしいから、各スレッドの役割を書いてみて
先が永杉。 やるならスレ立ててそっちでやれ。
>>205 >> グローバル変数やstatic変数がある領域って一般的になんていうの?
> テキストってのはコードのことだ。
市ね or
>>207
「空を自由に飛びたいな」 という夢があったときに パイロットを目指すかパイロットを雇うかの違いがある。
ドラえもんが何とかしてくれると思った
脱原発(笑)
風力発電コスト高、モニュメントに
オホーツク地方で唯一の風力発電施設の北海道興部町風力発電所が、修繕費用難のた
めに昨年11月、完成から約10年で廃止され、風車を固定したモニュメントとして残
されることになった。
東日本大震災を受けた福島第一原子力発電所の事故後、風力発電は再生可能エネルギ
ーとして注目されているが、小規模風力発電施設が直面するコスト高の課題を露呈した
格好だ。
同町の風力発電所は2001年3月に完成。風車は1基で、建設費約1億9000万
円は、経済産業省が所管する独立行政法人の新エネルギー・産業技術総合開発機構(N
EDO)がほぼ半額を負担し、道の補助を除く約5000万円を町が負担した。隣接す
る町の農業研究施設に電力を供給したうえで、余剰分は北海道電力に売電してきた。約
9年半で計6170万円の売電収入があり、6430万円の維持管理費と収支はほぼ均
衡していた。
しかし、10年10月に発電機のベアリングが破損して稼働を停止。欧州製で部品発
注のほか高所作業が必要となるため、修理には約4000万円かかることが判明した。
全額を町が負担しなければならないことから、町は「長期的に見た場合、コスト面で運
転再開は困難」(町企画財政課)と判断、発電所を廃止した。
----------
http://www.yomiuri.co.jp/national/news/20120114-OYT1T00047.htm http://www.yomiuri.co.jp/photo/20120114-463522-1-L.jpg
>>222 自由に「飛びたい」だと、パイロットを雇うのでは微妙に要件を満たさないような気が…
スレが伸びてるなと思ったら、ほとんど罵倒じゃねか。
227 :
o :2012/01/15(日) 19:39:26.42
>「空を自由に飛びたいな」 つ シャブ
>>225 航空法でがっちり縛られるから、パイロットになっても
そんなに自由に飛ばせるわけではない
自分で飛ばすのも雇って指示するのも自由度では大差ないかな
230 :
デフォルトの名無しさん :2012/01/15(日) 23:53:16.84
民主党には朝鮮人など外国人のなりすまし、スパイが約90名在籍している 野田内閣は過半数が帰化人 野田はどうだろうか 韓国人から賄賂を貰い、韓国人の集いに出席している野田は 首になった蓮○はシャブで逮捕歴のある人間と仲が良いな。蓮○自身はやってんの? い-6-1 テレビが言えない民主党のスポンサー=韓国北朝鮮 あとはもうわかるよな
入門編の参考書見ながら勉強中のど素人です #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 :2012/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 :2012/01/16(月) 00:24:34.89
print_bits(set(0,1,32)); ここで1ビット目から、32個のビットに1をセットするようにしているのですが 31個のビットだと正常に011111?と1がセットされるのですが 上記のように32個だと、000000?となり1がセットされません なぜ、11111?な感じで1がセットされないのでしょうか?
>>233 ビット幅以上のシフトは未定義
自分の知ってる処理系では mod ビット幅 だけシフトされる
どうでもいいが、処理系が同じでも、CPUが違うと動作が違ったりもする。 186か286かその辺の時代以前には、律儀に32回シフト(ただしintは16bit)してた。
>>234 レスを元に調べてみたら、ビット演算のWikipediaにそれらしい内容が書かれていました
今回の場合だと
31 mod 32 で31ビットシフトするが
32 mod 32だと0でビットシフトしない
33 mod 32だと1ビットシフトする
というこで理解できました
ありがとうございました
237 :
デフォルトの名無しさん :2012/01/16(月) 01:10:56.78
高速フーリエ変換使って1万桁同士の掛け算を行うプログラムを作れ。 そういう課題が出た。さっさと教えろ。お前ら偉いだろ。
宿題は宿題スレに逝けと言ってるだろ、このタコ。
>>237 作ってやるから20万円よこせ
偉い人の時間は高いぞ
241 :
デフォルトの名無しさん :2012/01/16(月) 14:33:54.35
リスト構造も使い易さを追求して、様々な形態の物が存在する。 使い易さを追求して実現された種々の機能と それを実現しているリスト構造の具体例について 解説せよ。 という問題があるんだが、答えるのにチェイン法とか機能の説明でいいのかな?
>>244 ありがとう
ついでなんだが、オブジェクトのデータと処理とを組み合わせて
合理的に管理するためのプログラミング手法ってなんて言うんだったっけ?
>>244 ありがとう
ついでなんだが、オブジェクトのデータと処理とを組み合わせて
合理的に管理するためのプログラミング手法ってなんて言うんだったっけ?
oops!
oh... 連レスすまない
>>246 OOP, Object Oriented Programming
Object oriented programming style アクネドート: 実用に成るコードを完成させるためには 定義の段階で同じ識別詞、同じ記述が繰り返し繰り返し現れる
関数プロトタイプ宣言について、どのような時に用いるか、なぜ必要なのか教えていただけないでしょうか。 よろしくお願いします。
>>251 その関数を呼び出す前に、その関数を使用する場合
プロトタイプ宣言しといて、実装を後に実装する。
あと、ライブラリを作成するとき、ヘッダに宣言をまとめて
書いといて、実装をコード側に書く。
>>246 「データ」が「ステート(状態)」の事を意図してるなら、OOP。
「データ」一般なら色々あるからCTMCPなどが参考になる。
以下のように 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 :2012/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 :2012/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を使わないと、重複は避けられないのでしょうか?
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 :2012/01/17(火) 14:59:48.07
なるほど、
>>255 でネストするよりわかりやすいです。
多少冗長になっても、メンテを考えればgotoなど使わない方がいいと言うことですね。
ありがとうございます。
//Cの条件はb>=32か?
goto使わなくても大抵コンパイラ後はgoto相当の処理してるんだがな。
goto使ってもいいと思うんだけどな。
あれならこうかな。 bool a32 = (a < 32) bool a224 = (a > 224) if (a32 || a224) { if (a32) { A(); } else { B(); } C(); } D();
>if (a32 || a224) { if (a32 | a224) { の方がいい場合あり。 昔逆アセンブルしてみたら if(a32) goto xxx; if(a224) { xxx: ... } 的な処理してた。 まぁ処理速度必要で、 一秒間に数千、数万回実行される処理でなきゃそこまでする必要は無いと思う。
組み込みとか4kデモとかじゃないかぎり気にせず関数化
266 :
254 :2012/01/17(火) 16:50:41.22
4kではないですが、動画の処理なので、関数呼び出しコストはかなり気になります。 条件判断しないようにすればいいとは、どのように書けばよいのですか?
>>263 ||を|とかかれると?と思ってしまう。
あー、これはほかにもいろいろバグが入ってるんだろうなー、と残念な
気持ちになるんで人が見るコードの場合はやめてくれ。
>>266 一番簡単なのは必要な処理を用意して関数ポインタ使って条件によって切り替える。
一般的に高速化と冗長性の削減は両立しないんだよ。
まぁ、それ以前にOpenVCなり使えるものを使うのがいいと思うけどな。
OpenCVな。
昔アセンブラで計算処理部分で分岐無くすように書いたことあったな。 フラグ取得→ローテーション命令で0か0ffffhに加工→計算過程でANDして加算 速くなったかどうかは知らん。
あぁ、ピクセル処理みたいのならテーブル引きにすればいいよ。
高速化が必要だと思った場合はまずプロファイルを取るのが基本。 1%の処理を100万倍速くしたところで1%も速度は向上しない。
>人が見るコードの場合はやめてくれ。 0=偽 0以外=真 って確証(確信?)ないからやらないよ。
いやいや、それは仕様で決まってるから。 どういうこと?
仕様書見たこと無いってこと。
まぁこのスレの99%はそうだろうからそれは気にしない。
>>255 関数のサイズと関数の呼び出しコストって関係あるの?
各ABCの処理が、簡略化されたからそうなっているのか、実際にそうなのかにもよりそうな話だなぁとおもったり。
もちろん、厳密にはキャッシュの利用が変わってきて速度は変わる。 が、そんなことを気にするのはあと数レベル先の話。
282 :
デフォルトの名無しさん :2012/01/17(火) 18:10:35.59
C言語のテトリスを標準出力で作るのって無理ですか?
283 :
デフォルトの名無しさん :2012/01/17(火) 18:14:32.35
日本語変だな。 テトリスをC言語によって作るのは出来ると思うのですが 標準出力のみで作れますか?
できるよ。
OSや端末を絞れば作れるでしょうしCUIのテトリスはぐぐれば出てくるでしょう
標準のみだと改行しないといけないけど、それ我慢すればできない理由はないね。
Curses使えば普通に楽しめそう。
288 :
デフォルトの名無しさん :2012/01/17(火) 18:23:18.51
>>286 グラフィック関連の低級性ってどうなってんの?
プログラミングだとアセンブラでしょう。
グラフィックは?
何言ってるのか分からん
ニコ動に1時間でWindows版テトリス作るみたいなのがあったからそれでも 見てみたらどうか。
>>288 16ビットのときは、CPUで特定のアドレスに書きこむと画面に反映されてた。
それ以降は知らん。
昔昼休みにUNIXでテトリス対戦してる人がいた。 見た感じCUIだった。
>>291 Windows には専用の API がある。
標準出力って事は、コンソール出力なんだろうから、 エスケープシーケンス使うかすればいいのかな?
295 :
デフォルトの名無しさん :2012/01/17(火) 19:47:18.39
>>290 見たww
>>291 なるほどぉ。
いやもっと低級な事。
インクとかは?どうやって全色出してるのかなと。
すまんが、そのインクとかいうものとC言語の関係を教えてくれないか?
>>295 環境に依存すると思う。どういう環境(OS、処理系)で作りたいかを教えれ
>>266 なんか、遠い記憶にそんな努力をしたことがあるような、無いような。
ポケコン時代だと、
if文ってスゲー遅いんだよな・・・
それを嫌ってForNextで書いてた。
でも、そうするとコードの容量が大きくなるんだよなぁ。
>>266 224と32にとても意味があるのであれば、ビットシフトを駆使する方法もあるかもねぇ。
a >> 8 が0 なのは ABD
a >> 9 が1 なのは ACD
( a >> 8 ) * ( a >> 9 ) が1なのはD
色々考えたソースがコンパイラの最適化に勝てないことも多々…。
比較演算自体内部で分岐命令使ってる気もするがな。
301 :
デフォルトの名無しさん :2012/01/17(火) 20:06:37.72
>>297 1990年くらいのパソコン。
一太郎しか入ってなかった。
パソコンのメーカー名と機種のシリーズ名も言えないんじゃなぁな。
>>301 MS−DOSの頃で、PC9801をターゲットにしてたなら、
テキストVRAM直書きが速かったかも。VRAMに表示文字以外に
確か属性があって、色やブリンクなどをセットできてた。
304 :
デフォルトの名無しさん :2012/01/17(火) 20:16:56.86
>>303 詳しすぎワロタw
C言語に詳しい人って同時にコンピュータ関連詳しすぎw
PC-9801プログラマーズBibleが未だに捨てられない。
>>300 ちゃうちゃう。
サンプルコード書けない理由にもなってるけど、
もしABCDの処理が加算なら、
(加算数A) * ( (~a)
>>8 ) + (加算数B) * (a >> 9 ) + .....
と比較しなくてもできる。
>>299 まあねぇ。
特に最近はHyperThreadingとかキャッシュとかねぇ。コードでは全く見えない高速化があるからねぇ。
>C言語に詳しい人って同時にコンピュータ関連詳しすぎw アセンブラの次にハードを直接いじるのに適してる言語だと思ってるから。
>>295 複合機(レーザー)やってたが、PCで作るのは画像データorスクリプトだけだよ。
後は複合機側でやる。色はCMYKを混ぜると全色でる。
結局はハード屋の奴隷 テレビの画質なんてものはLSIで決まる Cプログラマは上からレジスタ操作してハードウェア様の機能をオンオフするだけ
いやいや メタリックインキや蛍光インキもありますぜ旦那
>>308 CMYKって表現が分かる人、どのくらいいるのかな?
熱転カラーリボン
初期の熱転写はすぐ熱ダレしてたな。
>>303 それが、裏VRAM に書く方法が今でもわからなかったりするのです。
>>313 わかんない。シアンマゼンダイエロー、K‥‥‥K‥‥‥K‥‥‥キンタマか?
>>320 バンク切り替えすればいいだけだろ。
ほんと、程度が低いな、お前。
>>320 遙か彼方の記憶なのだが、どこかのポート出力でバンク切り替えしていたような?
何言ってんだお前。 そんなのPC98使ってた人間なら常識だろ。 知らないのに出てくるとは、よっぽどなんだな。
使ってれば常識なの?PC98で開発してればの間違いではないのだろうか。 PC98つかったことないけど。
そうしてたかのように装ったのはお前だろ、QZ
プラットフォームを選ばない会話。 x86以外ではmipsしか知らない俺には無理。
331 :
254 :2012/01/18(水) 08:29:12.36
>>298 比較演算よりビットシフトを使った条件のが速いというのは聞いたことがあります。
>>306 なるほど、条件×加算数 というふうにすればいいのか。
これを使って、いくつか書き直してみたいと思います。
ありがとうございます。
条件とAとBは例で示したものが多いです。
Cは3〜10行くらいです。
Dはいろいろあって、かなり長いです。
とりあえず、いまどきのプロセッサで速度を気にする場合 まず、メモリアクセスと条件分岐を減らすのが基本。 その上で、ビット演算がどうとかいうのは実際に測定してから。
>>331 自分で書いていてなんなんだが、
× ( (~a)
>>8 )
○ ( (~a)
>>8 ) && 1 //シフトした後1桁目だけを抽出
演算量が増えると、比較した方が早くなる可能性は十分にある。
また、デバッグがしにくい。16進法を脊髄反射で2進法にできるなら問題ないけど。
値の持たせ方も変わってくる(ビット演算しやすいデータ形式で持たせる必要がある)
ポインタを妙に使い出す
フラグを妙に使い出す( int 変数に複数の情報を持たせたくなる )
デバッグ関数( printf で2進法を表示するコードが欲しくなる )
結果としてコードの見通しが悪くなる
なんて特徴もあるからねぇ。注意は必要だけど。
パフォーマンスが気になるなら、
ちょっとばかしアセンブラを勉強して、この資料を見るとよい。
http://download.intel.com/jp/developer/jpdoc/ia32.pdf パフォーマンスが厳しい場合、割り算をしたがらない気持ちがよく分かると思うよ。
MOV( メモリからの読み込みなどで使用) が0.5クロック
CALL(関数の呼び出しでよく使われる)で5クロック
RET( Return ) 8クロック
DIV(割り算)が 56〜70クロック
CMP自身は0.5クロックだけど、If文だとJMPを伴うのでもう少し大きいかな?
ビットシフトは、MOVとシフト命令の1.5かな?
関数を使えば、CALLとRETが必要だから最低13クロック以上掛かることになる。
この辺は詳しくないので、説明はできないけど。
なんかスゲー間違えてる・・・気がする・・・ だれか助けて 関数に引数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 :
デフォルトの名無しさん :2012/01/18(水) 11:53:53.16
ホッケーゲームみたいなのを作ってるんだが バーとボールの当たり判定はどうすればいいんだ?
>>336 バーとボールの座標値を比較。
つーか、どう作っているのか判らんのにどう判定すればいいか分かるわけないだろw
>>335 すげぇ無駄な努力をしていることに気付け。
その高々数十クロックは一体何分の一秒なのか判っているのか?
>>338 映像処理って、1秒に30個とか60個の画像が含まれていて、それぞれの画像は1920*1080ドットあったりして
その各ドットにはRGBの3つの8bit値が存在するんだけど、
1秒の映像を処理するのに何回画素値に対する処理が動くか判っているのか?
画像処理は小さな最適化が大きな効果を及ぼす分野の一つだよねー。 アムダールの法則で言うところのpの値が限りなく1に近い。
まずビデオチップで演算できないかを考える。
速度上げるなら重複増やしてでもループ(分岐)回数減らすのがデフォ。 DOS時代は同じ処理を16回分連続で書いたこともあった。
1920*1080*3*60=約0.4GB。 そりゃぁ、一画素を三回ずつ愚直に計算してたら回数は多いわねぇ。 CPUでそんなことすることを考えているとしたらそのほうが間抜けだ。
>>342 今時のコンパイラなら、ループアンローリングもやってくれるよ。
ついでにベクタ化もしてくれるかもしれない。
>>343 愚直に計算しないためにも、たとえばSSEつかって4画素(4つの32bit整数として)同時にフィルタをかけたりするよね。
>>335 はそういうことにつながる話でもあるんだけど、それも
>>338 みたいに無駄な努力で間抜けな考えだと思うの?
ただいえるのは、スレ違いだということ。
「CPUで」だから、GPUにやらせろっていいたいんだろう だからどうしたのって話だけどねー
少なくとも、今時のCPUはクロック通りに動くわけじゃない。 パイプラインもあればキャッシュミスすればペナルティもある。 クロック数だけ足し算しても屁の突っ張りにもならないな。 前からこのスレでも言われているだろう。所要時間を知りたかったら実測しろと。
少しでも軽くなるように期待してあらかじめ書いているだけだろう?
>>347 所要時間を知りたいわけじゃないでしょ
今問われている箇所がボトルネックになっていることを突き止めたあとかもしれないよ
意外とレベルの高い質問の中くだらない事で恐縮なんだが… int main() { func1(); } void func1() { func2(); } void func2() { func3(); }… ひとつの関数を見やすくするという理由だけで、こんな風に 入れ子になっていく事は、なるべく避けた方がいいのかな?
>>350 ちゃんと名前付けてれば大丈夫だと思うよ。
「見やすくする」という基準がずれてなければ。
>>347 言ってることはあってるが、今言うことじゃないな
>>351 すばやい回答ありがとう!
見やすくしようと思って整理してたら、どんどん関数が増えていって
ちと不安になってきたので質問しました。
>>352 その実測が既に難しくなっているんだけどな。
そのコードがどのくらい掛かるかを調べるために、そのコードを繰り返したら
キャッシュあたりまくりでパフォーマンスが良すぎる値が出てくる。
それはテストが下手だといわざるを得ない
つーか、普段キャッシュにあたらないような状況ならそこを改善する意味がないだろ。
実測は実データまたは実データに近い仮想データで行うんだから
それでキャッシュヒットしまくって全体に対する占有時間が小さくなってるなら
>>356 の言うとおり改善する意味なし。
>350 ヘッダファイル作ってコメント入れときゃ多少マシだろ。
>見やすくするという理由 実際に見やすくなり、再利用が出来るなら、そうして良いんじゃないの?
関数の行数は1画面に収まる程度にするとよいとCodeCompleteに書いてあったぞ 2〜3行しかない処理を関数化するのは逆によろしくないようで。
>>361 意味のある名前をつけられるかどうかを指標にする
同じコードを2回書くならそれを関数かできないか検討する
1画面って何行くらいなんだろ 画面解像度やフォントサイズでかなり違いがでそうだけど
一つ関数を作る度に、膨大な設計書を書かされていた時は、 一つの関数が300行を楽々超えていた。
個人的には、短い関数が多い方が見やすい。
>>365 開発だとそうなりがちだわな。
2000超えてるの見たときは、驚いたけど。
一行の関数とか大量に作るなあ まあ(C++ではなく)C言語なら、多少は自重するが それでも20行以内の関数なんて全然珍しくはない
368 :
デフォルトの名無しさん :2012/01/18(水) 21:16:46.85
>>361 基準が行数って時点で目的意識はどこへやら
いまどき行いくらって稼ぎ方はそうないだろうが
頭脳労働者らしからぬ発言には気をつけろな
亜流だか我流だか、かも試練が、 アルゴリズムが埋もれないように関数化する
>>350 > ひとつの関数を見やすくするという理由だけで、こんな風に
> 入れ子になっていく事は、なるべく避けた方がいいのかな?
必要ないなら、「入れ子 (ネスト)」は少ないほうがいい。
俺なら、こう書くかな。
int main() {
func1();
func2();
func3();
}
void func1() {
...
}
void func2() {
...
}
void func3() {
...
}
>>370 あまりにこの形式になりすぎて
上位のほうの関数が実際に何やってるのか
よくわからんくなってるプロジェクトを最近見た
372 :
デフォルトの名無しさん :2012/01/18(水) 22:21:44.34
>>370 ナンセンス
関数内に隠せないものを関数スコープで宣言とか
おまえは B の時代のヨボヨボジジイか?
>>364 こういう場面で言われる1画面は80*25をさす場合が多い。80文字、25行ね。
最近はメソッドや変数名が長い場合も多く、横方向への基準を緩和していることも多い。
たとえば120文字までにおさめるなど。
縦方向は今も昔もさほど変わっていないと思う。
でもメソッドチェーンなんかで、1かたまりの処理が複数行にわたる場合なんかを考えると、
今となっては25行は厳しいかもしれないね。
なんのことだかさっぱりだが、そこはダイオードじゃなくてトランジスタだろ。
>>370 俺もそれっぽい書き方するわ。
もちろん、そこまで極端ではないけど。
アジャイルなら、ある処理を関数化するかどうか、つまり処理の粒度は「意図によるプログラミング」に従う。
趣味のソースなら再利用する気が無い限り関数化しないな。
>>378 関数化の大きな目的の1つである同一コードを纏めて修正を1回で済ませる、という目的を忘れてる気がする。
どんなコードの書き方でも基本的に構わないけど、
バグの温床になる書き方はどんな書き方でもNGだと思うが
>>372 >>379 ナンセンス以前に、おまえら超能力者かと
mainからみて隠蔽したい内容であるなら、
>>350 だし、
それがアルゴリズムとして重要でmainからみとおせる必要があるなら
>>370 だし。
それが、
>>350 で読み解けてるみたいだから、超能力でもあるんだろう。
「俺のコーディングが最も正しい!!」
コンパイラ通ったの?
コーディングスタイルはそれぞれでも、 1関数は百行以内で頼みたい。
386 :
384 :2012/01/19(木) 08:25:52.23
ソース読み間違えたorz
>>382 ぱっと見、抽象型プログラミングっぽいけど、よく見たらファイル一個につき
selfが一個だな。
あんまり利点を感じない。
いったい検証てなんなんだ? 意味がわからんのだが。
査読してほしいってことぐらいわかろう
何がしたいコードなのかもわからずに査読も何もないだろう。 ぱっと見、OOPを噂で聞いたくらいで何かそういうことを やろうとしたような残念なコードにしか見えないんだが。
ネバーネバーネバーネバーギブアップって、 ! ! ! ! give_up という事で、 give_upがtrueなら ! ! ! ! give_up もtrueという事で ギブアップなんですよね?
give_up || !give_up だよ
>>393 - scanf("%d", menu);
+ scanf("%d", &menu);
396 :
デフォルトの名無しさん :2012/01/19(木) 20:51:59.13
コンパイラが宣言された配列に対して実際に確保するメモリ領域の大きさを決める基準ってなに?
char は1バイト int は4バイト(処理系によりけり) long は8バイト(処理系によりけり) とかを聞きたいんじゃね?
コンパイラの仕様による としか
char a[6]; が8バイト分確保するとか。 コンパイラ依存だろうが。
401 :
396 :2012/01/19(木) 22:24:08.73
すまん、要素数が1の時に1byte、2〜16で16byte、17〜32で32byte、33〜64で64byteっていう実験結果が得られたのを前提に頼む。
>>401 >すまん、要素数が1の時に1byte、2〜16で16byte、17〜32で32byte、33〜64で64byteっていう実験結果が得られたのを前提に頼む。
そんなのじゃなく、実際の宣言部分を見せろ。
405 :
396 :2012/01/19(木) 22:56:02.82
char a[i]; コンパイラはgcc
>>381 俺の超能力をもってしても、お前のレスは意味不明。
>>401 別に普通のことだろ。
何が疑問なんだ?
プラグマとかコンパイルオプションで変えられるっしょ
>>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)
>>405 >char a[i];
要素数が変数になっているのが気になるな。
情報小出しにしないで、>401でどうしてそう判断したのか、
コードを出しな。
411 :
デフォルトの名無しさん :2012/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 :
デフォルトの名無しさん :2012/01/19(木) 23:27:23.14
>要素数が変数
>>405 がやってるのは、なに言語?
どうせワード境界だのなんだのの話だろ?
415 :
デフォルトの名無しさん :2012/01/19(木) 23:28:08.95
アドレス表示してなにがやりたいの?
>>411 環境によって、4の倍数のアドレスがアクセスが速いとか、奇数アドレスにアクセスできないとか
あるから変数とかきっちり敷き詰めて置かれないことのほうが多い。
#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
>>405 配列の添字が変数のトキはとくべつなしょりになるよ
構造体だと #pragma pack(1) みたいな、隙間無く埋めろとか指定できるのもあるな。 こんなの使わないから忘れたけど。
>>417 a,bの順番にかくほされるとはかぎらないよ
構造体は何にもしなくてもアドレス続いてるんじゃなかたけ? 例えば、 struct a{ long n; char c[4]; }; a.nの次のアドレスにa.c[0]が続いてるんじゃないの??
struct a{ char c[3]; long n; }; はどうなってるのかと考える?
いいえ
>>422 char c[3]がlongに合わせられるんでしょ?
ちなみにlongは4バイトでw
何を根拠にそう言ってるんだ?
>>424 >char c[3]がlongに合わせられるんでしょ?
×
なんとw char c[3]の領域破壊したら、その下のlong nも壊れるんじゃないんだ
>>411 それは配列がどう配置されるかで、
>>396 >コンパイラが宣言された配列に対して実際に確保するメモリ領域の大きさを決める基準ってなに?
の、配列に対して確保されるメモリ領域の大きさとは、話が変わってるぞ。
>>409 で示したように、「配列に対して実際に確保するメモリ領域」の大きさは、char a[N];
ならNになっている。
double array[10][20]に対応するキャストってなんでしょうか? よろしくお願いいたします。
ポインタと意味と斟酌すると、 double (*p)[20] = array;
ダブルポインタとかトリプルポインタってどういう時に使うの?
使う時が来るまでほっといていいよ
>>433 とりあえずコマンドライン引数を使おうとすると、早速char **argvが出てくるな。
>>435 コマンドラインで char *argvしか使ったこと無いけどそれ何の意味があるの?
>>436 >コマンドラインで char *argvしか使ったこと無いけどそれ何の意味があるの?
コマンドライン引数はint argc, char **argvしかありえないが、処理系なに使っている?
関数の中で引数の変数にポインタを設定するときとか
引数の char *argv[] が実際には char **argv であることなんて 知らない人のが多いだろう。
あれは字句分解が面倒でのぅ
>>440 引数の場合同じことになるだけで、実際は前者だろ。
[]が配列を渡しているように見えるからイカンのでは
atoi関数の、 ループ(・・・){ n = 10 * n + (s[i] - '0'); ・・・ } return n; この処理って何をやっているのですか>< iPhoneセミコロン打てない><
卓上で手動ステップ実行やってみなさい
2バイト文字のバイナリ化ってどうすれば出来ますか?
1バイトの場合と一緒
>>444 ヒント:
(s[i] - '0') この部分はs[i]の1文字から、数値を得ている
s[i]がcharの'1'だとすると、'1'=0x31
'0'は0x30なので、0x31 - 0x30 から 数値として1を得る
>>444 >iPhoneセミコロン打てない><
「日本語テンキー」を使っている状態だろうから、
左下の地球儀アイコンを押して「English(US)」にすればフルキーが出る。
そこで左下の「123」キーを押せば「;」キーが見える。
450 :
デフォルトの名無しさん :2012/01/20(金) 15:09:21.28
学校の課題で自分でプログラム作れって言われて、 グリコゲーム作ろうと思ったんだけど、うまく動作しないんだ。 助けてくれ。 エンドレスじゃんけん状態から抜け出せない・・・>< ↓みたいなプログラム作ったんだが。
451 :
デフォルトの名無しさん :2012/01/20(金) 15:11:34.14
>>450 です
プログラムです
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(void)
{
int you,cpu,kaidan;
int y_position = 0;
int c_position = 0;
printf("グリコゲーム\n");
printf(“階段の数>>”);
scanf(“ %d\n”,&kaidan);
452 :
デフォルトの名無しさん :2012/01/20(金) 15:12:40.43
>>451 の続きです
srand(time(NULL));
do
{
printf("最初はグー\n");
printf("\nじゃん!けん!\n");
do
{
printf("ポン!\n");
printf("グー:1 チョキ:2 パー:3 >>");
scanf("%d\n",&you);
cpu = rand()%3 + 1;
printf("cpu>>");
if(cpu == 1)
printf("グー\n");
else if(cpu == 2)
printf("チョキ\n");
else
printf("パー\n");
} while(you == cpu);
453 :
デフォルトの名無しさん :2012/01/20(金) 15:13:44.78
>>452 の続きです
if (you == 1 && cpu == 2)
{
printf("you:「グ・リ・コ!」");
y_position = y_position + 3;
printf("you>>%d段目\n",y_position);
printf("cpu>>%d段目\n",c_position);
}
else if (you == 2 && cpu == 3)
{
printf("you:「チ・ア・ガ・ア・ル!」");
y_position = y_position + 5;
printf("you>>%d段目\n",y_position);
printf("cpu>>%d段目\n",c_position);
}
else if (you == 3 && cpu == 1)
{
printf("you:「パ・イ・ナ・ツ・プ・ル!」");
y_position = y_position + 6;
printf("you>>%d段目\n",y_position);
printf("cpu>>%d段目\n",c_position);
}
455 :
デフォルトの名無しさん :2012/01/20(金) 15:15:22.80
>>453 の続きです
else if (cpu == 1 && you == 2)
{
printf("cpu:「グ・リ・コ!」");
c_position = c_position + 3;
printf("you>>%d段目\n",y_position);
printf("cpu>>%d段目\n",c_position);
}
else if (cpu == 2 && you == 3)
{
printf("cpu:「チ・ア・ガ・ア・ル!」");
c_position = c_position + 5;
printf("you>>%d段目\n",y_position);
printf("cpu>>%d段目\n",c_position);
}
else if (cpu == 3 && you == 1)
{
printf("cpu:「パ・イ・ナ・ツ・プ・ル!」");
c_position = c_position + 6;
printf("you>>%d段目\n",y_position);
printf("cpu>>%d段目\n",c_position);
}
}while((y_position < kaidan) && (c_position < kaidan));
>>451 とりあえずscanfに\nが入ってる時点でおかしい
それ以上は宿題スレ行け
457 :
デフォルトの名無しさん :2012/01/20(金) 15:16:48.40
>>454 すみません、2ちゃんねる初めて使うので知らなかったです。
そっちにいってみます
458 :
デフォルトの名無しさん :2012/01/20(金) 15:18:18.73
「チ・ア・ガ・ア・ル!」←なんだよこれ? チ・ヨ・コ・レ・エ・ト!だろ?
460 :
デフォルトの名無しさん :2012/01/20(金) 15:28:08.03
>>459 パイナップルも6文字なので
5文字か4文字の言葉にしようと思いました。
普通はチョコレートですよね
うちの地元ではチ・ン・チ・コ・オ・ル!だったよ
ちょこれいとに1票
ぬるぽに1票
ガッ
チョキは蝶野正洋 パーは橋本真也 グーはグレートムタ
どこまでもうぜえなコイツ
466 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん 468 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん これが正しい対処法
469 名前:あぼ〜ん[レスあぼ〜ん] 投稿日:あぼ〜ん
このスレを開かないのが一番いいと思う。
いや、にちゃんなんか見ないのが・・・…...
死ねばいいと思うよ・
475 :
uy :2012/01/21(土) 13:08:01.48
生まれてきてごめんなさい
あやまる前にやる事があるんじゃないか?
_____ .ni 7 / \ ご冥福をお祈りします l^l | | l ,/) / /・\ /・\ \ .n ', U ! レ' / |  ̄ ̄  ̄ ̄ | l^l.| | /) / 〈 | (_人_) | | U レ'//) ヽっ \ | / ノ / /´ ̄ ̄ ノ \_| \rニ | `ヽ l
文字列を読み込んで判定すんのってどうやるのが1番いいんですか? (厨房にわかるレベルでお願いします)
「判定」について ↓
文字列を読み込んで?
要するにriverと書き込むとmountainと出力されるプログラムが書きたいのです
>>482 strcmp()とか普通の方法じゃご不満なんですかね。
どうご不満とか書かないと、回答もないですよ。
>>482 #include <stdio.h>
#include <string.h>
void main(){
char buf[20],*p;
fgets(buf,20,stdin);
if((p=strchr(buf,'\n'))!=NULL)*p='\0';
if(strcmp("river",buf)==0)puts("mountain");
}
答えられる頭のない奴は黙ってたほうがいいよ
答えられない人はだれも発言してないように見えるけど。
うぉっ、かぶった ... orz
491 :
485 :2012/01/21(土) 18:07:48.60
雑魚共がごちゃごちゃうっせーな 俺はプロだから答えられるに決まってるだろ
じゃあ答えろよ 何をと訊かれても知らないが
494 :
485 :2012/01/21(土) 21:52:58.18
>>482 に俺はプロだから答えられるって言うのもプロっぽくないよな。
ああ成る程、プログラマ未満でプロか。
何でID無いんだよ
QZが自演できるようにだろ。
ID化必要だよな
C言語にsprintfがあることを知った時、感動したな
>>501 昨日の俺だわw
strcatとか使う意味ないわwww
sprintf使えるよな win32apiでMessageBoxで変数の値を出力したいときとかも重宝する
505 :
デフォルトの名無しさん :2012/01/22(日) 16:15:06.90
>>444 です。
n = 10 * n + (s[i] - '0');
これの意味がわかりました。
ヒントを下さった
>>448 さん、ありがとうございました。
これはK&Rに載っているatoi関数、
int atoi(char s[])
{
int i, n;
n = 0;
for (i = 0; s[i] >= '0' && s[i] <= '9'; i++)
n = 10 * n + (s[i] - '0');
return n;
}
の一部分でした。
K&Rに習って、自分でもatoi関数を書いてみました。 #include <stdlib.h> int myatoi(char s[]){ char *p = s; int i, j, n, length, len, sum; int *ptr; length = 0; while (*p++) length++; ptr = calloc(length, sizeof(int)); len = length; i = 0; while (s[i] >= 0x30 && s[i] <= 0x39) { ptr[i] = s[i] - 0x30; n = 1; for (j = 0; j < length - 1; j++) n *= 10; ptr[i] *= n; i++; length--; } sum = 0; for (i = 0; i < len; i++) sum += ptr[i]; free(ptr); return sum; } ------------------------------------------- n = 10 * n + (s[i] - '0'); この式ってすごいうまいことやってるんですね
#include<stdio.h> #define NUMBER 5 int main(void) { int i; int tensu[NUMBER]={0}; int b[NUMBER]={0}; puts("please put an points of your students"); for(i=0;i<NUMBER;i++) { printf("Student No.%d,Student point:",i+1); scanf("%d",tensu[i]); if(tensu[i]>=60) b[i]=tensu[i]; } puts("The success students are....."); for(i=0;i<NUMBER;i++) { printf("student No.%d:%d points.\n",i+1,b[i]); } return 0; } コンパイルできるんですがどうも全て実行できません 16行目がいけないでしょうか?
scanf("%d",&tensu[i]);
\(^o^)/ ありがとうございます 初歩的なミスですね。。。
平方根を求める関数sqrt(double x)は 「math.h」をインクルードすることで使えるようになりますが このヘッダ内を文字列「sqrt」で検索しても、よくわかってないせいもありますが それらしい計算式が見当たりません sqrt関数はどのようにして、平方根を求めてるのでしょうか? 数学的な計算式は理解しています math.h内でどのように処理されてるのか知りたかったので、聞いてみました win7でVC2010を使用しています
プログラム自体はふつう、objやlib、DLLなどにあります ヘッダは宣言のみです
>>ヘッダは宣言のみです 勘違いしてました ありがとうございます
本来は使用する側が、関数が組み込まれているライブラリを指定するように作られてるが 標準関数や基本的な関数ははじめから組み込むようにコンパイラやIDEが指定してくれている。 このオマケのような仕組みのために間違えたんだろう。
516 :
デフォルトの名無しさん :2012/01/23(月) 01:32:34.59
C言語で二点の緯度経度から距離を求めることができますか。
できない理由はありません。
ちゃんと考えると難しいな、高低は別としても
>>516 できるよ
地球の中心を原点として2点の座標のなす角を
内積(内積が0に近いときは外積)から求めて半径を掛ければおk
地球は楕円だから、その分を考慮した やや大仰でめんどくさい式があったはず
どこまでの精度が必要か明確にしないとな
523 :
デフォルトの名無しさん :2012/01/23(月) 01:44:06.59
524 :
デフォルトの名無しさん :2012/01/23(月) 01:45:31.89
>>521 ありがとうございます。
ヒュベニの公式みたいなやつでしょうか。
>>522 制度は一応、mぐらいあれば大丈夫です。
mまで必要ならもっと正確な計算が必要だな その計算じゃ無理だし地形データと海抜情報も必要だろう
緯度経度のほか高さも必要だな。 東京タワー一階と、展望台では移動距離違うしな。直線も。
527 :
デフォルトの名無しさん :2012/01/23(月) 02:18:43.44
>>525 ありがとうございます。
そうですか。
結構複雑な式になるんですかね^^;
>>526 ありがとうございます。
高さもですか。。。
高さは平らとして考えていました。
そもそもの目的を言え。 m精度がいるのに高さ無視とか、どうせ大した意味もないんだろうけど。
529 :
デフォルトの名無しさん :2012/01/23(月) 02:40:10.74
>>528 はい。
2点の距離を図り速さで割って
そこまでにかかる時間を求めたいのです。
だったら道路情報じゃねえか 話にならんわ
531 :
531 :2012/01/23(月) 03:43:29.63
系列データの始点座標(x,y) 移動方向dir ステップ数stepsといった
入力されたデータをテキスト形式でファイルへ保存しないといけないのですが
ファイルには-1076994648 2516192 8 1536358
といったわけの分からない数字が保存されます
どうすればいいでしょうか?
http://codepad.org/T7yR4vHH
x,y,dir,stepsに適切なデータを代入してやればいい
533 :
531 :2012/01/23(月) 04:11:49.03
>>532 すいません具体的にはどういうことでしょうか?
課題説明に記載されている書式なんてわからんから答えようが無い
535 :
531 :2012/01/23(月) 04:36:55.59
めんどくさいからよく読んでないけど save_textfil(int startpos[][2], int movedir[][MAXMOVE + 1], int movesteps[][MAXMOVE + 1]) のように渡してそれらを順次出力するだけでは?
まぁ、宿題スレに行け、と。
宿題スレでは干されていました。
じゃ、諦めろ。
#include<stdio.h> double asd(double dx,int no) { int i; double tmp = 1.0; for(i=1;i<=no;i++) tmp *= dx; return (tmp); } int main(void) { int n; double x=0.0; printf("No.1:"); scanf("%f",&x); printf("No.2:"); scanf("%d",&n); printf("answer=%.2f",asd(x,n)); return 0; } 実行結果が No.1:5.0 No.2:2 answer=inf となります。なぜでしょう?
#include<stdio.h> double asd(double dx,int no) { int i; double tmp = 1.0; for(i=1;i<=no;i++) tmp *= dx; return (tmp); } int main(void) { int n; double x; printf("No.1:"); scanf("%4.1f",&x); printf("No.2:"); scanf("%d",&n); printf("answer=%.2f",asd(x,n)); return 0; } 実行結果が No.1:5.0 No.2:answer=inf となりました\(^o^)/
>>543 lですかぁ
ありがとうございます
本には1とかいてあるようにみえたので・・・
545 :
デフォルトの名無しさん :2012/01/24(火) 20:07:37.80
C言語を知っていれば、なんでもできると思う人います?
そう思うやつはC言語を理解してない。
547 :
デフォルトの名無しさん :2012/01/24(火) 20:32:53.92
結局、基本はC言語だよね
>>545 君の言う「なんでも」というのが「妹を作りたい」とか
「ヨガファイアを身に付けたい」とか云うことなんだとすれば、
そんなことを思う人はキチガイだ。
C言語を始めたいと思ったんだけど、「Borland C++ Compiler 5.5」の設定ができない… ilink32.cfg は拡張子変更できたんだけどbcc32.cfg が .txtファイルのままになってしまう
>>545 Cを知っていれば他の言語は簡単、みたいな意味だったら20年くらい前はよくそんなこと言われてたなって感じ。
「妹を作りたい」、「ヨガファイアを身に付けたい」と言う理由で C言語を学ぼうと思った人がいるかも知れない。
555 :
デフォルトの名無しさん :2012/01/24(火) 21:02:51.91
同一翻訳内で同じ文字列は、 同じ領域に割り当てられると 規格で保証されていますか? char *amanojaku(char *str) { return str == "YES" ? "NO" : "YES"; } char *say(char *str) { printf("%s,", str); return str; } main() { // VCでは期待通り、"YES,NO,YES"と出力された say(amanojaku(say(amanojaku(say(amanojaku("NO")))))); }
>>555 "YES,NO,YES,"になると思うけど
保証されないはず
>>547 違うな。
ゴールに近い言語を使うのが正解。
VBで目的が達成できるものに、Cを敢えて使う理由なんか、無い
559 :
デフォルトの名無しさん :2012/01/24(火) 21:12:47.63
char型の数字を配列にいれたいんですけど どうすればいいんですか? char a[10]=
>>558 大概excelで出来ちゃうので、プログラムくむ必要がなくなる。
>>559 char a[10] = { 1, 2, 3 };
数値じゃなく数字なら char a[10] = { '1'. '2'. '3' };
565 :
デフォルトの名無しさん :2012/01/24(火) 21:22:10.34
a3b4と入力したらaaabbbbと出力するようにしたいんですが できません。 教えてくれませんか?
566 :
555 :2012/01/24(火) 21:24:14.11
>>556 やっぱり保証はされないですか
残念です。
>>561 具体的にこのオプションがあればOKとかあれば
注意書きして、この方法を使ってみたいのですが
>>564 大抵のコンパイラならOKそうな気がするんですけどね
>>565 ab3と入力したら
・abbb
・aaabbb
どっちになるの?
あと0の扱いは?
a01bb2
とかの文字列はどう解釈すんの?
プログラム以前の問題だ
>>555 文字列の比較ならstrcmp()使えよ
>>567 ab3 => abbb
a3b3 => aaabbb
a01bb2 => abbb
>>565 ab0c12d5
こういう入力だと、出力はどうしたい?
571 :
デフォルトの名無しさん :2012/01/24(火) 21:36:16.27
>>567 すみません。
数字の0と1は入力ミス扱い。
連続した数字も入力ミス扱い。
二桁以上も入力ミス扱い。
ab3はabbbとなります。
お願いします。
>>571 念のため聞くけど、
「連続した数字」と「二桁以上(の数字?)」は何か違う全くベツのモノ?
573 :
デフォルトの名無しさん :2012/01/24(火) 22:08:36.77
>>572 同じです;;
二桁以上の数字は入力ミス扱いです
a10やa23など。
>>573 もう少し聞くけど、
もしかしてその文字列は「数字から始まってはいけない」とかいうルールがあったりしない?
575 :
デフォルトの名無しさん :2012/01/24(火) 22:19:19.40
数字から始まってはいけないですね〜 まぁ早く解いて。
正体は社交場かなんかと勘違いしてるお子チャマか
577 :
デフォルトの名無しさん :2012/01/24(火) 22:31:54.75
あー気持ちわりいなお前 明らかにお前の方がなめてただろ こっちがいらつくのはあたり前だろ 早く寝ろおっさんw
ワロタ パターンマッチングの精度半端ねーな
>>565 #include <stdio.h>
#include <string.h>
int mprint(char *str)
{
int i, len, n;
len = strlen(str);
for (i=0; i< len; i++) {
char a = str[i];
if ('0' <= a && a <= '9') return 1;
else{
char b = str[i+1];
if ( b == '0') return 1;
if ('1' <= b && b <= '9') {
n = (b - '0'); i++;
} else n = 1;
while (n-- > 0)putchar(a);
}
}
return 0;
}
int main()
{
char buf[256];
printf("input:");scanf("%s",buf);
mprint(buf);
return 0;
}
>>566 gccで-fwritable-stringつけたら動かないんじゃないの
strings、だったごめん。 manから引用 > -fwritable-strings > 文字列定数を書き込み可能なデータセグメントに配置し、同内容の文字列を 1 つの共有オブジェクトにする処理を行いません。これは、文字定数に書き込むことができることを仮定した昔のプログラムとの互換性をと > るために提供されています。‘-traditional’ オプションも同様の効果を含みます。 > > 文字定数に書き込むという考えは非常によくない考えです。“定数” はまさに定数であり、変化すべきではありません。
>>555 これでいけ
#include <stdio.h>
#include <string.h>
char *amanojaku(char *str)
{
return strcmp(str, "YES") == 0 ? "NO" : "YES";
}
char *say(char *str)
{
printf("%s,", str);
return str;
}
int main()
{
say(amanojaku(say(amanojaku(say(amanojaku("NO"))))));
return 0;
}
確かにstrcmp()で何の問題があるのかとは思うけど
そんな話なのか? それなら単に2つポインタ使えばいいだけじゃねーのか。
単に規格の範囲を疑問に思っただけなのか 「同じ領域に割り当てられると保証されて」いてほしい理由があって聞いたのか どっちでしょうね
保証されている前提で書いた自分のプログラムをなんとか正当なものにしたいんじゃね? 仕事だったらありえねぇ馬鹿だがw
何で攻撃しまくりなんだよw マクロで文字列リテラルが展開されまくったとき、exe サイズ膨れ上がらないかとか さらにそのソースはいろんなコンパイル環境で使いまわすとか 気にしなきゃいけない可能性はいろいろあるだろうに
使いまわすようなコードに 文字リテラルなんて埋め込むなよ
>>587 もしそういう要求があるなら尚のこと、コンパイラ任せにするべきじゃない。
例えば、リテラルへのポインタを返す関数を用意しておけば済むことだ。
それにどうせ、マクロを使ったってリテラルの連結をする場合は別領域だ。
590 :
デフォルトの名無しさん :2012/01/25(水) 12:24:43.54
こういうマクロは規格上許されていますか? VC2008では再帰展開は行われず、aaaがbbb aaaに展開されます。 #define aaa bbb aaa
>>590 Cリファレンスマニュアルによれば、規格上はアリ。ただし古い処理系だと
再帰展開して止まらなくなってしまうケースがあったようだ
assert("hoge" == "hoge");
文字列を表示するときにstdio.hをおまじないで書く覚えました このstdio.hみたいな○○.hっていうので他にもどんなことが事が出来るのか知りたいのですが なんていうキーワードで検索したら出てきますか?
>>594 そのまんま"stdio.h"で検索しても
それなりのものが出ると思うんだが
>>594 赤くなーれ!
標準Cライブラリ - Wikipedia
ja.wikipedia.org/wiki/標準Cライブラリ - キャッシュ
limits.h, 整数型の大きさ. locale.h, 文化圏固有操作. math.h, 数学. setjmp.h, 非局所分岐. signal.h, シグナル操作. stdarg.h, 可変個数の実引数. stdbool.h, 論理型および論理値 (C99より追加). stddef.h, 共通の定義. stdint.h, 整数型 (C99より追加). stdio.h ...
2038年以降のタイムスタンプを取得する方法はないのですか?
ポインタのインクリメントについて質問です。 while (*p++) { ... } このpは、ポインタをインクリメントしているのであって、pの指す*pをインクリメントしているのではないのですよね? そうであれば、これは*pが0x00か比較してからpをインクリメントしているのか、それともpをインクリメントしてから*pが0x00かどうか比較しているのか、どちらなのでしょうか。 演算子の優先順位を見ても、間接演算子*とインクリメント演算子++は優先順位が同じなので、わかりませんでした。
演算順の話じゃない。 後置++の演算値はインクリメント前、したがって*演算子に与えられるアドレスはインクリメント前。
>>599 >while (*p++) {
while (*p) {p++; と見なせる。
見なせません
++*p *++p *p++ (*p)++
>>595-597 ああああああああああああ赤くなっちまったよ!
最後にすいません
これら全部の標準ライブラリを覚えないとやっぱりやっていけないですか?
たかがこのくらいの数でそんな事を言ってる奴には無理
うわwwwじゃあ全部覚えるかw
>>606 別に覚えなくとも、うっすら片隅にいれておけばいいよ
標準ライブラリで提供されてるのに自作するのを避けられる、、けど
>>606 みたいな人は
自作前にこことかで聞くだろうから未然に防がれるのかな。
概要と主要なやつだけ覚えて、残りは使用する度に使い方検索する。
例えば、キーボードのJを押すとKが出力されるような自作のキーカスタマイズプログラムを作りたいのですがうまいこといきません。 矢印キーを押すとマウスカーソルを動かす事に最初に成功したので、 同じようにすればキーも変えられると思ったのですが何故か反応せず。 キー関係はマウスと違い何か必要なのでしょうか? よければサンプルプログラムなどいただけないでしょうか
スレチ
フックしたキーを捨てないとだめじゃないかな
HTMLで画像の上にマウスカーソルを乗せるとツールチップが表示されるじゃないですか Cでツールチップを指定した座標に表示させたいのですがなんて標準ライブラリを使えば実現できますか?
webprog行け
いやwebプログラムの質問してるんじゃなくて ツールチップを表示させたいだけです
そんなものはない
>>614 付箋アプリみたいな?ウィンドウ作ればいい
#include<iostream> #include<string> int main() { std::string name; std::cout<<"hello"<<std::endl; std::cout<<"こんにちは"<<std::endl; std::cin>>name ;std::cout<<name<<std::endl; } 最後から二番目の行のstdの前の「;」にはなんの意味があるの? それ抜きにするとエラーになるんだけど
std::cin>>name
>>619 ;std::cout<<name<<std::endl;
わからない… つまり、std::cin>>nameの結果を表示するために;std::cout<<name<<std;;endl;にしなくちゃいけないことでおk?
あ、もしかしてstd::cin>>name; にしろってこと?
>>622 std::cout<<"hello"<<std::endl
;
std::cout<<"こんにちは"<<std::endl
;
std::cin>>name
;
std::cout<<name<<std::endl
;
}
べつにこうでもいいよ
とりあえず、Cじゃないのはわかってるよな。
素直にスレ違いっていえないのは何で?
627 :
555 :2012/01/25(水) 21:48:50.01
>>581 昔は文字列定数書き換えられたんですね。(確かにconst char *じゃないし)
それならば保証は難しそうですね。ありがとうございました。
>>583 単純にパフォーマンスが理由です。
>>584 文字列が英語にしにくい日本語なので、
変数名で処理を書くと分かり難かったので聞いてみました。
enumに日本語が使えればいいんですけど
static char *const MISONIKOMI = "味噌煮込み";
static char *const MIZUTAKI = "水炊き";
static char *const OYAKODON = "親子丼";
char *kondate(char *yesterday)
{
if (yesterday == MISONIKOMI)
return MIZUTAKI;
else if (yesterday == MIZUTAKI)
return OYAKODON;
else
return MISONIKOMI;
}
char *kondate(char *yesterday)
{
if (yesterday == "味噌煮込み")
return "水炊き";
else if (yesterday == "水炊き")
return "親子丼";
else
return "味噌煮込み";
}
コメントに書けばいいじゃねぇか。
629 :
デフォルトの名無しさん :2012/01/25(水) 22:02:03.95
次のwindowsってC言語でアプリの開発できるのかな? なんだかタッチパネル方式になるって どこかに書いてあったけど。
これでいいかいのう? #include <stdio.h> #define MISONIKOMI "味噌煮込み" #define MIZUTAKI "水炊き" #define OYAKODON "親子丼" #define MISONIKOMI_ 0 #define MIZUTAKI_ 1 #define OYAKODON_ 2 char *menu[] = {MISONIKOMI, MIZUTAKI, OYAKODON, NULL}; char *kondate(char *yesterday) { if (yesterday == menu[MISONIKOMI_]) return menu[MIZUTAKI_]; else if (yesterday == menu[MIZUTAKI_]) return menu[OYAKODON_]; else return menu[MISONIKOMI_]; } int main(void) { int i; char *y, *k; for(i=0;menu[i] != NULL;i++){ y = menu[i]; k = kondate(y); printf("i = %d, kondate(%s) = %s\n", i, y, k); } return 0; }
タッチパネルだったらCで開発できないと思った根拠は何?
>>630 こういうのが30分以内にさらっとかける男になりたいんですが
C言語のおすすめの入門書を教えてください
JavaScriptだとオライリーが有名です
タッチパネルでCのコードを入力できないって言う意味?
>>632 落ち着いて。基本に忠実に書いているだけだよ。
意識してやったことは、
文字列はマクロで定義しておく、
文字列に対応する整数値は 文字列 + _(アンダースコア)
文字列を格納する配列はNULL終端にする。
関数の引数は一度変数に代入したものにする。
# こうすると、debugの時に便利だよね。
私は本をそんなに読んでないけど、
もっている本は、
プログラミング言語C第2版
プログラミング作法
ぐらいだった。
質問です。ランダムで10文字の英字を返す関数を作りたいのですが strcat_sのところでエラーで落ちます。(strcatだと通る) なにがいけないのでしょうか? char* randomWord(void){ static char alphabet[27] = "abcdefghijklmnopqrstuvwxyz"; char word[2]="\0"; static char *words; words = (char *)calloc(26, 1); int i; for(i=0; i<10; i++){ memcpy(word, &alphabet[0]+rand()%26, 1); strcat_s(words, 1, word); } return words; }
637 :
デフォルトの名無しさん :2012/01/25(水) 23:30:50.41
>>636 コイツバカじゃねーの、
&alphabet[0]+rand()%26
なんてアフォなことしなくてもいいじゃん
>>636 どこがって。。。
全体的に悪かったから書き直しておいたよ。
こっち使って。
コメントにしている所を有効にした場合は、alphabet変数はいらなくなります。
char* randomWord(void)
{
#define WORD_LENGTH 10
const char alphabet[27] = "abcdefghijklmnopqrstuvwxyz";
char *words = NULL;
int i, r;
words = (char *)malloc(WORD_LENGTH+1);
if(words == NULL)
return NULL;
for(i=0; i<WORD_LENGTH; i++){
r = rand() % 26;
words[i] = alphabet[r];
// or
// words[i] = 'a' + r;
}
words[WORD_LENGTH] = '\0';
return words;
}
strcat_s(words, word, 1); かな?よく分からんけど
あと、こう書いた方がいいよ const char alphabet[] = "abcdefghijklmnopqrstuvwxyz"; もしくは const char *alphabet = "abcdefghijklmnopqrstuvwxyz";
>>640 ありがとうございます!凄い勉強になります・・
C# から C++(DLL) を呼ぶ処理を作成しています。 typedef struct TEST_SUB { char szName[1000]; } STRUCT_TEST_SUB; typedef struct TEST { char szName[1000]; int iCnt; STRUCT_TEST_SUB *pStructTestSub; } STRUCT_TEST; 構造体をこんな感じで作成して。 # DLL に定義した関数 structMethod(TEST *test) C# 側で構造体に値を詰め込んで渡して、C++ 側で取得したいんですが。 どうしても、TEST_SUB の値をとることができません。 (空の値が取得されます) C# 側の値の設定方法が悪いのでしょうか??
>>629 APIが提供されるはずだからCで問題ないよ
>>642 わかりました
words[i] = 'a' + r;みたいな書き方もできるんですね・・
本当に参考になります。ありがとうございます。
648 :
デフォルトの名無しさん :2012/01/26(木) 01:59:00.64
>>644 ありがとうございます。
挑戦してみたんですが、なかなかうまくいきません。
どのようなプログラムになりますか。
>>648 あーーーウゼーな、
勘違いしたアホがいつくとロクなことがねーよ
プログラムは簡単だよ
あとは数学の問題
その数学部分を理解出来ないのは
お前がアホだから
さっさと出てけ
650 :
デフォルトの名無しさん :2012/01/26(木) 02:21:07.90
>>649 ありがとうございます。
数学はなんとなく理解はできるのですが、
プログラムがかけません。
また、ヒュベニの公式を使って、求めることができるみたいなのですが、
プログラムをどのようにしたらよいのかわかりません。
ちょっと前に同じ質問してた人がいたけど、同じ人?
>>650 適当な計算プログラムつくればいいのに。
数学理解できるなら段階を踏めばいいことぐらいわかるでしょ
プログラムつったって数式に条件分岐と繰り返しとサブルーチン足した程度のものでしょ そのなんちゃらの公式は理解してるんだよね? だったらあとはそれを分解して目的に応じて再構築するだけじゃないの とそのなんちゃらの公式を知らないがいってみるテスト
-lmついてないってやつ?
657 :
デフォルトの名無しさん :2012/01/26(木) 16:57:27.59
VCのコードが全然変わってくる可能性は無い?
は?
>>656 Language: Cを選ぶとそういう状態だね。
どっかオプションとかあるんかな。
ないんじゃないかな 確か前見たときはなかった
これだけレスがあって、やっと言えたのがそれだけか。 コテも大変だな。
>>661 >>636 の初期の目的に沿おうとするなら、こう?
rand() / (RAND_MAX / N + 1) - 1
N + 1 な理由が分からね。
N だけでいいなら - 1 が不必要になるんだが。
664 :
デフォルトの名無しさん :2012/01/26(木) 20:40:52.01
理解力、コミュ力と、数学力ってIT業界入るにはどっちが必要ですか?
C言語のソースコードって全部で何行くらいなんでしょうか?
>>666 ええええ...
どうやって開発者は書いたんだ。
大学のレポート課題です。お願いします。
tiny Cならそんなに行数としては少ないかもね 大学の課題だったら自分で調べるといい
Googleの入試並みの問題だなw さぁどっから推定しようか。人数?会社?機器?PCの台数?
C言語で書かれたプログラムって、世界に何本くらいあるのかな?
>>669 C言語開発者が開発に取り組んだ時の、動機、人事的な背景を考察せよ。
っていう問題。
Cが無いときのソースコードはCじゃないってことはわかるよな。
>>672 直接機械をいじってプログラムを作ってたんだろ?
静電気とか走っただろうな、手袋してたろうけど。
それ、おもしろいことでも言ってるつもりなんか?
>>663 (int)(rand() / (RAND_MAX + 1.0) * 26)
でいいんじゃないですか?
+1.0 するのは RAND_MAX
GCCはGCCでコンパイルします。
世の中のCで書かれたコードの総行数と勘違いしている人がいるね。
>>672 そうなんだけど、それだけじゃ△だな
>>670 の書いた通りわざと書いてるのを勘違いしてるバカがいるな。
曖昧な質問だから、勘違いと言い切るのはどうかと思う。 C言語のソースコードって言っても、どのコンパイラの話かも不明だし。
はいはい。
#include <stdio.h> #define WIDTH 10 #define HEIGHT 20 #define DEPTH 40 double temperature[DEPTH][WIDTH][HEIGHT]; int calc_flag[DEPTH][WIDTH][HEIGHT]; int main(){ int h,w,d; for(h=0;h<=HEIGHT;h++){ for(w=0;w<=WIDTH;w++){ for(d=0;d<=DEPTH;d++){ temperature[d][w][h]=20.0; calc_flag[d][w][h]=1; }}} printf("%f\n",temperature[0][0][0]); fflush(stdin); getchar(); return 0; } 三次元配列の計算がうまくいきません。 上は最も単純な例ですが、このコードを実行しても表示が0.000000となってしまいます。 しかし、calc_flag[d][w][h]=1;の行をコメントアウトした場合は20.000000となり意図した値になります。 もう何が何やらさっぱりわからないのでお助け願います。 環境:Microsoft Visual C++ 2010 Express
>>681 for(h=0;h<HEIGHT;h++){
for(w=0;w<WIDTH;w++){
for(d=0;d<DEPTH;d++){
>>681 a[10]の場合、a[0]〜a[9]しかアクセスしちゃダメよ。
>>682-683 うわああああああ恥ずかしいいいいいい
おかげで問題は解決しました。
説明書を読まない初心者みたいな質問をしてすみませんでした。
685 :
デフォルトの名無しさん :2012/01/26(木) 23:21:19.54
>>665 ある大手メーカーの看板商品でだいたい数百万行(当時20世紀)
ある大手物流センターでは最長不倒関数の競技場で1ソース1万行超えが日常だった
ある半官半民の案件では C なのにグローバルとマジックナンバーの嵐でまるで拷問室
ハード系(C よりアナログやメカが得意)の某社さんのコードは美しさが際立っていた
おめ、gcc のソースの行数数えてみたか? 数えていなければ、それが正解だと思うぞ
分岐の要件が薄っぺらいなら長大な関数でも別にいいと思うし 大量のグローバル変数も整理されてるなら正しい使い方 でもマジックナンバーはヤバイよな
量の多さで競うな。 コード量が少なく開発日数の少ないのが優れてる。 同品質なら。
688 :
デフォルトの名無しさん :2012/01/26(木) 23:51:55.62
690 :
デフォルトの名無しさん :2012/01/27(金) 00:06:52.66
>>689 ありがとうございました。
助かりました。
単位は、メートルですよね?
出ても正しくはないだろ。出すだけならreturn 1;でもいい。 ある程度は正しいかもしれない。
止まった時計でも日に二回正確な時を示すって感じだな
693 :
デフォルトの名無しさん :2012/01/27(金) 00:18:41.80
あとは自分でやれって事だ
696 :
デフォルトの名無しさん :2012/01/27(金) 00:39:39.75
697 :
デフォルトの名無しさん :2012/01/27(金) 00:41:30.39
>>695 地球を真球と考えた結果ということですね。
そして、地球は真球ではなく、楕円となっているため
値が正確ではないということですね。
だからさあ、何につかうんだよ
よりよい近似モデルを使うか、Googleアースのように高度を含めた地球の3Dモデルデータを持っていたら割と正確に出せる。
700 :
デフォルトの名無しさん :2012/01/27(金) 00:52:04.99
>>698 距離を求めて、そこまでの時間を求めたいです。
速さは、GPSから取得します。
>>699 そうですか。
これだけだと正確ではないのですね。。。
最近はここまでのアホも珍しくないからなぁ
直線距離もとめたって意味が無いってわからないのかな いいかげんあきらめろよ
703 :
デフォルトの名無しさん :2012/01/27(金) 01:57:40.67
>>702 陸上では、あまり意味がないかもしれませんが
海上などでは、直線距離で大丈夫ですよね?
>>684 はずかしがるってことは、間違えている内容をちゃんと理解できてるから。
恥ずかしがらなくていいよとはいえないけど、喜んどけ
>>685 最長不倒関数とか懐かしい言葉を出しつつも関数の行数を出さないあたりが渋いよね
wcで関数の行数数えるのも面倒だろ。 つか、ファイルに分けるんだったらその時点で行数わかるし。
「コードの総行数」という定義は、意外と厄介。
1文を複数行に分けて書いたときをどう扱うかにもよる。
コメント行を含めるか、含めないかでも変わる。
結局、元の質問(
>>665 )が、実行数と論理行数(ステップ数)の
どっちが欲しいかによる。
答えは知らないけど・・・。
意味ないけどな。
擬似乱数じゃない本物の乱数(暗号的なんちゃら乱数)を使いたいんですが ライブラリは存在しませんか?
/dev/random openssl, ssh, gmp, crypto
>>714 今はそういうライブラリは存在しない。
そもそも、
・一方向性関数が存在すれば暗号論的擬似乱数生成機が存在する事が知られている。
・現在のところ、一方向性関数の存在性は証明されていない。
・一方向性関数の存在性が示せれば、P≠NP予想が証明できる。
という状況。
凡人にゃあ無理。
あとは、ソフトウェアじゃなくてハードウェアデバイスでなんとかするしかない。
放射性物質の崩壊を検知して、それを0,1で置き換えてくれる装置とか。
だって return 0; だから・・・
え?乱数とreturn 0に何の関係があるんですか? 出力はreturn 0の前ですけども
何で実行するたびにいつも同じ数字が返ってくるんですか? 毎回違う数字は帰れないんですか?
コピペ間違いじゃなければお前の実行環境に問題がある。 Wikipediaの例は標準的な環境で正しく動くはずだ。
VC++2010Express Win32コンソールアプリケーション test.cにコード貼り付けて printfとreturn 0;の間にブレークポイント置いてF5押したら 同じ数字しかでません
>>723 もいっかいやってみろ。さっきとは違う値が出ないか?
>>714 今年出るIvy Bridgeまで待て。AVXにRdRAND命令が追加される。
メモリやHDDの書込速度を測ってその最下位ビットを使え。
>>723 やってみた。VC++のrandomの性能が悪すぎる。
seedの下位ビットはまるっきり無視されてるような感じだ。
srand((unsigned int)(time(0) << 16)));
こんなもんでどうか。
>>717 処理系によっては、1回目の値が前回実行時と大差ないものがあり、RAND_MAXで割ると0.6あたりをウロウロしたりする。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
srand((unsigned int)time(0));
printf("%d¥n", rand());
return 0;
}
上記コードを3回実行してみると、
gcc version 4.2.1 (Apple Inc. build 5664)では
1470289798
1470306605
1470306605
http://codepad.org/ では
121543468
627453109
1744218406
応急回避方法は、0~9が必要なら、rand() % 10
生成速度はよくないが、規則性のないはずの乱数。
#include <stdio.h>
__int64 rdtscval() { __asm { rdtsc } }
void waitfnc(){FILE *fp = fopen("tmp", "wb");fwrite("tmp", 1, 3, fp);fclose(fp);}
unsigned int rand_rdtsc() {
unsigned int n,x=0;
for(n=0; n<32; n++) {
waitfnc();
__int64 val=rdtscval();
x|=((val
>>3 )&1)<<n; }
return x; }
void main() {
for(int n=0; n<100; n++) printf("%d\n",rand_rdtsc());
}
>>730 のウェイトをメモリアクセスにしたら速度は上がるが、ほぼ等速度になってしまい乱数にならない。
ファイルへのアクセスだとOSや他のアプリやサービスなどが働いて等速度でなくなる。
本当wikipediaのコードはksだな
__asmは64bitで使えないからダメ。
>>733 なるべく高精度のタイマーだったらなんでもいい。最低一ビットリターンできれば良い。
>>714 そっちのけで、入門編から飛び出している件
>>733 #include <stdio.h>
#ifdef _WIN32 & !(__GNUC__)
struct timezone { int tz_minuteswest; int tz_dsttime; };
#include <windows.h>
int gettimeofday(struct timeval *tv, struct timezone *tz) {
LARGE_INTEGER t;
QueryPerformanceCounter( &t );
tv->tv_sec = t.HighPart;
tv->tv_usec =t.LowPart;
return 0; }
#else
#include <sys/time.h>
#endif
void waitfnc(){FILE *fp = fopen("tmp", "wb");fwrite("t", 1, 1, fp);fclose(fp);}
unsigned int rand_rdtsc() {
unsigned int n,x=0;
for(n=0; n<32; n++) {
waitfnc();
static struct timeval t;
gettimeofday(&t, NULL);
x|=((t.tv_usec
>>3 )&1)<<n; }
return x; }
void main() { for(int n=0; n<100; n++) printf("%d\n",rand_rdtsc()); }
組織は些細な物事に対して、不釣り合いなほど重点を置く
>>727 下位ビットが無視されるって、何秒かたっても同じ乱数が生成されたってこと?
>>728 世の中の逆を行くコードを書くことになるとは
男なら擬似乱数は許せないのだよ君たち
そのなんとかブリッジっていうのはVC++2010デモ使えるのでしょうか?
疑似乱数なら、Boostでも使うとか。
>>745 なんとかなんとかじゃないひとが使えないんじゃないでしょうか
日本語でおk。
南斗か
ttp://www9.plala.or.jp/sgwr-t/c/sec15-5.html このサイトの、「(3)自己参照構造体を使ったリスト処理」のところで、
/* ポインタのつなぎ換え */
p->next = head; /* 今までの先頭ポインタを次ポインタに */
head = p; /* 新たな領域を先頭ポインタに */
とあるのですが、「p++」などで、次の構造体のアドレス移動していないのにどうして上書きせずに次のアドレスの構造体に保存できるのでしょうか?
用語がうまく使えなくて申し訳ないのですが・・・
リンク先見る気は無いがコメント通りの処理を目指してんならnextて要素名は変じゃね?
>>749 どうしてって言われてもリンクリストだからとしか言いようがない。
セルが配列みたいに連続して並んでたらポインタをインクリメントして次のセルだけど。
図入りでコードがあるんだから、おっかけてください。
リストの先頭に追加してるだけ
mallocで場所を確保するときにpが新しいアドレスに移っているということですね
C言語を勉強しているのですが、if文の中で if(式A||式B||式C||式D) のように複数の式が論理演算子||で並んでいる時に、手持ちのコンパイラですと 実行時に、左側の式から順に(式A、式B、式C、式Dの順で)評価されていて、 かつ、途中の式が真の場合、残りの式は評価されていないみたいです。 ※例えば式Aが真の場合、式B〜Dの中に含まれている関数は実行されない これはC言語に共通する規則でしょうか? それともコンパイラ固有の仕様ですか?
>>754 C言語の規格通り
「短絡評価」といったキーワードで検索してみる
>>753 >pが新しいアドレスに移っているということですね
この表現の意味がわからない。
ポインタといっても通常の変数と変わらない。
mallocの戻り値を保持しているだけだよ。
ついでにリスト構造について、根本的に理解ができていないと思われる。
ポインタpに対してp++すると、pが指しているオブジェクトサイズ分値が増える。
配列の場合はメモリ上に稠密にデータが確保されているため、配列の次の要素を
指すことになる。リストで次の要素を指すためにはp = p->next;とすることになる。
#include <stdio.h> char strput(char *str){ while(*str){ putchar(*str); *str++; } } int main(void){ char str[20]; scanf("%s", str); strput(str); } これは入力した文字を出力するプログラムなのですが、 6行目の「*str++」について疑問があります もちろん、コンパイルすればエラーも出ずに結果も正常なのですが 「*」がない「str++」にしても同様にできました そこで「*」がいるのかいらないのか分かりません つける必要はないんでしょうか?
ない
何のためにつけるか、考えようね
整数は大丈夫だろうけど、 浮動小数点数の演算結果って、 CPUによって違ったりしたりする? i7, i5 と比べて ATOM とか、 FX, A と比べて E, C とか、 後者は演算ユニットが128ビットと64ビットで差があったりするんだが。
>>758 #include <stdio.h> // printfなどの定義
char strput(char *str) // *は、strがポインターであることをコンパイラに指示する
{
while(*str) { // *strは、strが指す位置の文字データ内容
putchar(*str); // 文字を出力
str++; // ポインターの値を+1する。データを書き換えるわけではないので*は不要
}
}
int main(void)
{
char str[20];
scanf("%s", str);
strput(str);
}
763 :
デフォルトの名無しさん :2012/01/29(日) 01:50:14.07
C言語に詳しい人に質問です。 p は構造体へのポインタです。 *((int *)((char *)p - sizeof(int))) だとか *((char *)p - sizeof(int)) といったかんじのコードをみかけるのですが、 これって何を意味しているのですか?
*((char *)p - sizeof(int))の場合。 pには構造体の配置されてるアドレスが入っている。それをたとえば123456番地とする。 sizeof(int)は4バイトとすると 123452=123456-4番地を文字としてみたときの0-255のいずれかの値を表す。
初心者っぽいので。 char p[]="abcxyz";とすると、p+3は文字列"xyz"の先頭アドレスだったり、*(p+3)はxを表したりする。 この操作と同じ。これがわかり無くそうになってだけで同じだ。
766 :
763です :2012/01/29(日) 04:37:03.22
764さん, 765さん ありがとうございます。 構造体の配置されているアドレスであるpからtypeof(int)を 引いたアドレスにはどんな意味があるのでしょうか? ここを参照してintやcharとしての値を取得する目的があるのでは ないかと思うのですが...
>>766 それはその通りだけど、その場所に何が入っているかなんてCでは決まっていない。
環境またはそのプログラムが何かを入れているのだろうとしか言えないな。
768 :
763です :2012/01/29(日) 05:15:59.87
一部しか読んでないけど。 new された配列 char p[N] について。 C++ では new された配列は delete [] p; といったように書く。 delete [] のようにした場合、その配列の要素分だけメモリから開放するわけだが、 その要素数は、p の sizeof(int) 分手前に格納されている。(環境依存のはず)
【中国BBS】2030年に韓国が日本を抜く? 反対意見が多数
中国大手検索サイト百度の掲示板に、「2030年に韓国のGDPは日本を追い越すって本当?」というスレッドが立てられた。
これに対して反対意見が多数寄せられている。
● スレ主:八戒窘6
アジア開発銀行のデータによれば、2030年に韓国のGDPは日本を追い越すらしい。
● せんとう
どんな予測も多少なりとも正確ではない所があるが、今回の話はあり得なさ過ぎる。
● satay醤
本当にデタラメだな。アジア開発銀行によるレポートだって?じゃあバンク・オブ・アメリカや欧州の銀行の結論はどうなのよ?
● 佚名野菜地
アジア開発銀行ってのは、韓国人が開いているのか?
● Joseph19969
俺の妄想では、2100年日本人の1人当たりのGDPは46万ドル、韓国は8万だな!
● o落葉不知秋o
その頃までに韓国という国が残っているかどうかも分からないぞ。
● 梨花陰凉
死んでも信じない。
● MakiのLove
なんか最近、韓国のニュースが多くね?
http://news.searchina.ne.jp/disp.cgi?y=2012&d=0128&f=national_0128_091.shtml
>>768 その記事にも「典型的な実装では」て断って書いてあるだろうが。
>>768 念のため、配列の先頭よりも前をさすような減算を行ったばあいの動作は未定義
あと、配列の最終要素の次をさすまでは合法だけど、内容を取得しようとしたときの動作は未定義
>>759 ,760,762
意味を理解しながら勉強していこうと思います
ありがとうございました
774 :
763です :2012/01/29(日) 11:49:16.47
>>769 ,771,772
ありがとうございます。
オレC言語だけど今日は忙しいのでもう閉店ね。 また明日来て下さい。
776 :
デフォルトの名無しさん :2012/01/31(火) 16:32:48.21
aとbは真偽値を取る変数なんですが、 !(a && b) という式を||の式に変換すると、 (a == 0 || b == 0) という式で合ってますでしょうか? ド・モルガンの法則でぐぐって一応確認しました
あってるけどなんで( !a || !b )にしないんだろう
ありがとうございました !aだとよくわかんないので、 他人のソースを書きなおす作業をしてます
たまにそういうやついるよね。 なんか間抜け。
fuckな話をすれば、 0とか1とかアフォなことは書かず、FALSEとかTRUEとかにしろ
どちらかというと後者の方がアホに見えるけどな。
>>776 わざわざなんちゃらの法則だしたり2ちゃんできかないと答えに自信が持てないような難易度か?
こんな質問で俺様理論を展開するお前らにあきれた
>>781 Cの場合、FALSEは0のみだからいいにしても、TRUEは0以外があてはまるから
そんなことするとわけのわからないバグに悩まされるだけだよ。
>>783 わざわざ出すとか以前に、ド・モルガンの法則なんて基本中の基本だろ。
TRUEが0のばあい FALSEは-1じゃなかったっけ なんかどっかでみたことあるよw
hoge_p() == TRUEとかやってバグったことあるよな。
これがmalloc/free論争と対を成すboolean論争か
C言語ならゼロか非ゼロしかねーよ
#undef TRUE #undef FALSE #define TRUE 0 #define FALSE (!TRUE)
((!!(a=2))==true)が絶対trueに成ればいいんだけど そもそもCに即値trueなんて無いしな
どんどんわけのわからないレスが増えていくなw
なぁ、自信がないならわざわざ発言しなくていいんだぞ?
絶対大丈夫だよ(俺の脳内世界では)
>>792 こいつ殺したくなった。コード見て殺意がわいたのは
↓これ書いた奴についで二人目だ。
#define void int
通報した。
昔はしょうがなかったんだよ voidなんてハイソな予約語なんか無かった
#define TRUE (1==1) #define FALSE !TRUE
正解書いとくか #define TRUE (!0) #define FALSE (!TRUE)
正解なんてないんだよ。 何か型を導入したいならそのルール前提記述するしかない。 ルールを強制するならこれでいい。 typedef enum { false, true } bool;
!aとか!bとか書くことになるなら、a,bに入れるときに真偽値を反転させとくのがよい a=(1==1)だったのならa=(1!=1)にする でそのまま条件式に使えば真偽値の値がなんなのかなんて気にしなくて済む
>>803 普通に整数書いてもコンパイル通るからあんまりありがたくない
!aは別にいいんじゃね 個人てきにはa==0より!aのほうが分かりやすいと思う
>>805 だからCならルールを強制するしかないと言ってるだろ。
defineでも同じだろ。
そして僕はそっとタブを閉じた
そこで私はブラウザのトップ画面をこのスレにしておいた。
a==0の方がわかりやすいが、自分でコードを書くなら!aかな。
!810
論理値で扱うものなら!、そうでなければ==0。 それだけだろ。
そのとおり
C言語の仕事なんてほとんどないってほんと?
組み込み系はガチC全盛なんじゃないか? 他はC++なら聞くがCってのは聞かないな
組み込みでCで仕事してるよ 今のところC以外に移りそうな様子は微塵もないな
ああ、でもCのコードを自動生成する方向には向かうかも
>>816 組み込みって何?
TVだと思いっきりC++だったな。
>>818 組込みってもPICマイコンの電子工作から産業機械の制御まで幅広いからな。。。
組込系おもしろそう。どこで求人してるんだ?ないよ?
組み込み 求人 でググレカス
結局組み込み以外、Cの使い道はないんですね。
2chで世間が判った気になるなよw
>>819 ちょっwww それ2006年の記事じゃんw 古っ
マイコン用にCで書いてるけど、 プロトタイプ無しで呼べるとか 違う型のポインタが暗黙に変換できるとか 負の資産を感じる。 classとかtemplateとか使いたい訳じゃないが CソースもC++コンパイラでコンパイルしたい。
C++じゃなくて純Cの環境だからC++の環境でコンパイルしたいってことだろ 純Cの仕様はかなり緩いところがあるから、ミスを誘発する…と
それじゃあそういうコンパイラをCとかで書けばいいじゃん Cにこだわらなくてもいいな、lispやらperlやらでもかけるぞ
gccで最も厳しいチェックをするようにして凌いでた事もあったが、最新の組み込みは複雑化してるんだろうなあ。
VisualStudio でCのソースをビルドすると、入出力関数を_s付きのセキュアな関数に 置き換えることを検討しろって出るんですけど、標準入出力関数って、あぶないの?
とっても。
文字列用のバッファに起因する脆弱性をついたものとか結構あったじゃないか
(σ・∀・)σゲッツ!!
なんで標準の関数を安全にしないの?
またまたまた ホモキタ━━━━━━(゚∀゚)━━━━━━ !!
標準の関数を安全にしようとすると、今までのコードを変更させなければならなくなる
セキュア関数は脆弱性を減らすだけだから、攻撃への対処はやはり必要。
ナイフをむき出しで売ってて取り扱い注意だったのが 鞘付きのバージョンが用意された、くらいだな。 ちゃんとした使い方しないと危ないことに変わりは無い。
わかったようなこと書くなw
低能のたとえ話は意味不明だな。自分ではうまい事言ったつもりなんだろうな。
841ではないが、意味不明ではないだろ。塚、理解力ないのか?
意味が通じるのはすでにわかってる人だろう すでにわかってるんだから意味が無い
じゃあなんで脆弱な標準関数を放置してるんですか?
C# って、(C++)++ってことなんですか?
ちがうよ ++をくっつけてちょっとおしゃれに斜めに配置しただけじゃないの? もしくは音楽で#は半音上げるだからそこからきてるなかも だとすると++は1上がるけど#は0.5しか上がらないから C<<<<C#<<<<<C++ つまりC++には敵いませんという意味の謙虚なネーミングだな
>>846 脆弱性があるだけで使っちゃダメなわけじゃない
勝手にかえられて勝手に速度が下がるとか勘弁願いたい
g++を移植する、とか
ウィンドウズの旗のイメージね ■■ ■■
854 :
デフォルトの名無しさん :2012/02/01(水) 20:07:54.57
C++-1+2 てとこかな、現状
それはc+2になると思うが、何の話だ。
もう 起動言語C+++ トリプルインクリメント とかいうアニメでも作っちゃえよ
c+2はでねぇよぉ
何の話だ。
>>859 たった1行なのにバグってるとかw
C++なんだから評価後をチェックしないとアカン。
不定?
副作用完了点問題?
バグってないよ
いずれの時点でもc+2と同じ値になることはないが。
CとC++が同じという前提なんか? C == C++
Cの組み込み系はSEの中でもブラック率が高いって聞いたけど本当?
まずは言った奴に聞けば?
言ったやつが、いや嘘。なんて言う確率は相当低いと思うけどな。
「括弧内に書いてあることは嘘です」
何故なのかを、言った奴に聞けって事だろ。
完全新規でCの大規模開発ってもうないんじゃね? Cでやってる=過去の遺産を使ってる=謎設計コードを含んでる=?
俺はゲハとはそういうものだと認識してるから煽りなんてどうでもいいし盛り上がる時もあるからいいだけど 嫌がるやつ多いからな
恥ずかしいやつww
誤爆を謝らない態度、潔し
組み込み系はメーカー常駐だから偽装請負か特定派遣ということになる 結局は使い捨ての奴隷
やめたげてよぉ 興味があっても趣味に留めておくのがいい
アセンって何だw アセンブラのブラ消してたw
組み込み以外でもドナドナIT。
おまえらがそんなだから 大陸や半島に後れを取るんだよ
Cというとご老人がスパゲッティ相手に悪戦苦闘するイメージだな
使う人次第だな
まぁ普通は大丈夫だろうけど、保証はないね。 #pragmaなりオプションなりそのコンパイラ固有のものを使わないと。
同じものを並べてパディング入るケースってあるのか?
>>888 80 ビットの long double とかならありそうじゃないか? 試してないけど
並んでるのが同じものかどうかは関係ない CPUの都合に合わない大きさのものに入る
じゃあ例を出してみなw
MIPS32だとchar a, b, c;は32bitごとになるんじゃないか?
配列は例外なのか?
コンパイラの実装依存だろ どうこういっても意味なし
いや、例外とかじゃなくMIPSはバイトアクセスのペナルティが大きいから オプションによってはそうじゃなかったかなと。
898 :
デフォルトの名無しさん :2012/02/02(木) 21:01:28.93
周りにプログラミングのこと聞ける人がいないので、教えてください。 最近x code4のcommand line toolを使ってC言語を学びはじめました。 今まではrunを押せば、下に色々反応(文字の表示や入力を求める表示)があったの ですが、今日はrunを押すとfinish runningとでるだけで、下にまったく反応がありません。 そこで違うコードを入力したところ今まで通り反応がありました。 色々ネットで原因を探してみたのですが、わかりませんでした。 コードに問題があるんでしょうか? /*postagec*/ #include <stdio.h> void input_data(void); void calculate(void); void output_data(void); int distance,weight,size,postage; int main (void){ void input_data(void); void calculate(void); void output_data(void); return 0;} void input_data(void){ printf("距離[%dkm]重さ[%dg]を入力してください",distance,weight); scanf("%d%d",&distance,&weight); return;} void calculate(void){ if(weight<=100){size=1; }else if(weight<=1000){size=2; }else{size=3;} if(distance<=100){size=size+10; }else if(distance<=1000){size=size+20;}else{size=size+30;} return;} void output_data(void){printf("サイズは%dです\n",size); printf("料金は%d円です\n",postage);return;} どなたか解決方法がわかるかた教えてください。 よろしくお願いします。長文すいません。
素直にあいぽんとか叫んじゃえよ
スペースが全角になってるが?
何も実行されないプログラムになってますしおすし
>>898 このようになおせば動くと思うよ。
int main (void){
input_data(); calculate(); output_data();
return 0;}
> コードに問題があるんでしょうか?
プログラムは書かれた通りに動く。期待通りに動かないのは
キミ自身が期待するコードをキミが書いていないからだ。
903 :
デフォルトの名無しさん :2012/02/02(木) 21:22:53.67
>900 スペースは書き込んだときに改行多すぎというエラーが でたので改行減らすためにコードをいじったためかと・・・ x code上ではno issuesって出てます。
> printf("距離[%dkm]重さ[%dg]を入力してください",distance,weight); ここに問題があるに1000ペリカ
907 :
デフォルトの名無しさん :2012/02/02(木) 21:46:51.24
>>902 902さんのいう通りにしたら動きました。
コードの内容がまだ理解できていないので、なんで動かなかったか
調べてみます。
ありがとうございました。
global変数はだめなんですか?
ニコ動の動画通りにやってたので、プログラマーの常識(?)なんかは
全然知らないので勉強になりました。
ありがとうございました。
C言語の解説動画って需要あるの?
ちょっとどの動画を見たのか教えて欲しい
あと検索単語も
> global変数はだめなんですか?
使わないで書けるなら使わない方が良い。
>>898 のは数十行だからそこまで問題ないけど、
global変数の値の書き換えってどこでもできちゃうから、
数百行や数千行になってくると、
bugの温床となりやすい。
どこか〜〜_init()関数だけでglobal変数の設定をして
他の場所ではglobal変数の参照だけする。
とかならいいんだけど、なかなかうまくいかないんだ。
特に初心者のうちは使わない方が吉。
C言語って初心者向けじゃない気がするんだよな
スレ違いもいい加減にしろよ。
???
>>911 自体が誤爆なんでしょ
高度な技を出しやがって
C/C++の宿題スレの誤爆と思われる
>>910 タブの使用未使用については特に問わないが、
タブは8タブ、インデントは4カラムがいいな。
>>915 私はタブ使わない派です。
インデントは空白4つでやってます。
タブを8空白として使ったことないので、
空白4つ派です。。。
最後に。
タブって昔々KB辺りの単価が高かった頃、
1文字でインデントを表現するために必要だった文字なんだと思います。
今後は廃れてなくなっていくんじゃないかなー?
と思っていたりします。
何をわけのわからないことを言ってるんだお前は。
こういうスレって基本的にageないんですか? そうだとするとなぜですか?
専ブラが自動的にメル欄にsageって入れてくれるから
>>918 はwebブラウザで2chしてるの?
>>916 8空白として使うとかじゃなくて、タブの幅は8文字分を想定してほしいという話だよ。
で、インデントサイズを4とした場合に、1段なら4つの空白、2段分は8個の空白でもタブ1つでもいいよってだけ
>>921 ああ、なーるほど。
変に読んじゃってましたね。失礼しました。
>>922 補足しておくと、viの設定だとこう
set sts=4 sw=4 ts=8
ただ、書かれてるとおり、今はタブを使わないってのが主流かも。
今時viかよ。
viで何が悪いんだよ。 IDEとか使いづらいだろjk。 set expandtab set shiftwidth=4 set ts=4 私はこんな感じ。
>>925 なーんかトゲトゲしいですね。
困ったチャンですね。
もう寝ましょう。
せめてemacs使えよ。
emacs使う人ってやっぱGNUのインデントスタイルに慣れてるの?
いや、おれはstroustrupに設定してるが。
RMSよりスッポスッポの方がすきか
stroustrupスタイルって char* p; も含む?
じゃあ完全にstroustrupの書き方をまねるわけではないんだ。アリガトン
あぁ、主にインデンテーションだからね。 おれの設定はこの程度。 (setq tab-width 4) (setq c-indent-level 4) (setq c-continued-statement-offset 4) (setq c-argdecl-indent 4) (setq c-label-offset -4) (setq indent-tabs-mode nil)
emacs使いじゃないから雰囲気でしか設定見れないけど、ハードタブを4カラムに設定してんのかなぁ
(setq indent-tabs-mode nil) がいわゆるハードタブってのを使わない設定だね。
あぁ、タブコードはtab-widthで4やね。 2/4/8で切り替えられるようにしてるから別にきにしてないけど。
重ね重ねどうもです
急に伸びるから何かと思ったら。。。 下らない
Emacsは何度も挑戦したが どうやってもMetaが押しづらくて挫折する
vim一択
>>943 替えるまでもなくデフォルトでAltにマップされてない?
でも押しづらい
無変換に変えても大差ない
CapsLockってのも抵抗がある
端末上ならEmacsバインドでも構わないけど
エディタとしては出番多すぎてつらすぎ
>>944 親指で押せばそうでもないと思うが、キーボード次第かも
Emacsに限らずviとかもだけど、昔のエディタって
キーボードによって結構能率に差が出る印象がある
因みに俺はMacではvi派、WindowsではEmacs派
Linuxはむしろ使うエディタにキーマップ合わせに行くw
Metaキーは使ったことないな。Escで代用してる。
HHKBとかならまだしも、 Escは押しづらい位置にあることが多い気がする
もちろん日本語KBなら漢字キーてやつと入れ替えてるよ。 CAPS⇔CTRLとESC⇔漢字で、あとはASCII配列に変更して使ってる。 最近は英語キーボードがなかなか手にはいらないので。
お前らいい加減にスレタイ読め
まぁいつものこと。
NICOLA配列だから 左親指に割り当ててる 同時押しいつもやってることだし
Metaキーの位置に悩むそんなあなたにC-[。 問題は結局Ctrlの位置なんだよね。 まあ自分のコンピュータならキーバインドをカスタマイズすればいいんだろうけど、 ちょっと触るだけの環境とかでそういうのを使うわけにもいかず。
プログラミング以外だと生き生きする奴が多いのはデフォ。
viは環境変わっても使えるから、慣れておくといい
955 :
デフォルトの名無しさん :2012/02/03(金) 10:35:36.47
汎用的関数化が他の機能に与える影響ってなに?
>vi 大学で3年間「使いにくいー!!誰だこんな仕様考えたやつは!!」 と思ってたけど会社入っても結局これ一本だった。
俺viになれすぎちゃってみんなが普通に使ってるエディタが使いにくい… 最初に必ずソースにjjjjjjjjjjjjjjjjjとかタイプするのはお約束w
jjjjjjjjjjjjって操作をするのはvi初心者、とツッコミを入れられるのもお約束
jjjjjjjjjjjjjjjjj > @さんにごあいさつにきますた
C言語で小町算のプログラムつくってくれませんか?>< 課題なのに一向にできません;;
総当たりにすればいいだろ。
いくら出すんだ?
>>960 小町算っていってもローカルルールとかいろいろあるからちゃんと定義書いてくれないとこっちも困るよ
perlで文字列でやって それそのままevalしたほうがラクじゃん perlじゃなくても、文字列が評価できるならなんでもいいけどさ cなんて使うかよアフォ