1 :
デフォルトの名無しさん :
2011/02/15(火) 09:07:06
>>1 勝手にテンプレ変えんなクソったれが
C++はスレ違いだ
スレ立て直後で申し訳有りませんが、加算演算子についてです。 #include <stdio.h> main() { int i,j; i = 3; j = 4; i = i+ +j; printf("%d\n\r",i); } とした場合、 + が二つあっても,あいだにスペースやtabなどのセパレータがあれば、 warningもなく、きちんと動作します。 i = i + j; とした場合と同じになります。 もちろん、 i = i++j; とした場合はエラーとなります。 10年以上cをいじってて、はじめて気が付きました。 gccの4.3.2でテストしました。gcc以外に組込系の環境がいくつかあるのですが、 どれもも同じ動作でした.。 上記の処理は、言語仕様としてはどのようになっているのでしょうか?
プログラムはまずトークンに分割することになっています トークンに分割する際は最も長いシーケンスを採用することになっています つまり + よりも ++ の方が長いので、+ がいくつか連続していればそれは ++ というトークンとして切りだされます トークンに分割した後に、そのプログラムの構文を解釈します 例えば x+++++y は x ++ ++ + y と分割されコンパイルエラーになるという例が仕様書にも記載されています
5 :
デフォルトの名無しさん :2011/02/15(火) 12:14:52
それは、わかるんですが、 i=i+ +j; の場合、どう処理されているのかが知りたいんです。
それは単に i と +j を足して i に代入してるだけです +j というのは単項演算子の + が j にくっついたものです 負の値を表すのに -j などと書けるように正の値をわざわざ + を付けて +j などと書いてもよいです
なるほど、わかりました。大変スッキリしました。 加算演算子でなくて、単項演算子となるわけですね。 実際のコードでは、数行にわたる計算式で、+の後ろに関数やらマクロやら あったので、発見が遅れたので、バグとして計上するかどうかに悩んでたのでした。 コンパイルされたアセンブラコードとしては問題なかったのですが。 ありがとうございました。
914 :デフォルトの名無しさん:2011/02/06(日) 17:00:59 そんな話は聞いたことないけどしたいならそうすればいいんじゃない? それより、 i * 10 + 9 + ( i == 9 ) は意図したとおりに動かないね。 920 :デフォルトの名無しさん:2011/02/06(日) 17:34:11 問題ないように思える人はもう一度Cの規格票をよく読むんだ^^ 923 :デフォルトの名無しさん:2011/02/06(日) 17:38:32 …というのも不親切なので答えをいうと i == 9の部分はtrueの時1になることを想定しているけど (90-100の階級幅だけ11あるので、ここだけ特別処理にしている) Cの規格上はtrueは0以外の整数であればなんでもいいことになっているので 実装にっては「90-100」のような表示にならない可能性があるってことなのよ^^; ここは printf( "%d-%d %d人\n", i * 10, i == 9 ? 100 : i * 10 + 9, cv[ i ] ); のようにすべきでした。 924 :デフォルトの名無しさん:2011/02/06(日) 17:41:11 って、答えを書いているうちに即レスするんじゃない貴様ら^^ ちなみに、この「trueは0以外の整数」というのは Cではけっこう重要な落とし穴なので初学者は覚えておくといいよ^^ 929 :デフォルトの名無しさん:2011/02/06(日) 17:44:46 あれ?そうだっけ?すまんすまん^^ワラ 935 :デフォルトの名無しさん:2011/02/06(日) 17:49:37 こうして人は成長していくのであった^^;
663 :デフォルトの名無しさん:2011/02/12(土) 22:47:08
>>654 その 6.5.6 って意味がよく判らん記述だなぁ、解りやすく解説できる?
そもオーバーフローとは加算・乗算によって桁あふれを起こす場合だろ
減算によって引き起こされるのはアンダーフローって呼ぶのでは?
572 :当然未定義な。:2011/02/12(土) 20:27:07
>>561 ,
>>564 マスターのレベルにもよるよね。
普通に配列使うだけなら、他の言語知ってりゃできて当然。
char *x;
char y
char a[] = "012345678";
*x = a - 1;
y = x[2];
で、x に何が入るかまでわかってるなら結構すごいと思う。
>>3 printf("%d\n\r",i); // mac から windows の改行コードってネタ?
>>8 Part77のコピペか
突っ込みも一緒にコピペしないと分かりにくいんじゃね?
940 :デフォルトの名無しさん :2011/02/06(日) 17:52:53 おまえら、おもしろいおもちゃを手にいれたみたいに。ひどいじゃなイカ^^;
俺さあ、ここのスレ俺が立てたって設定にしてんだよね 俺「2chでC言語なら俺に聞けっていうスレをはじめました あれぼくです」 みたいに おーすげえっていわれるけど
そう・・・(無関心)
SAW…(拷問系)
爽…(氷菓子)
前スレ 250 名前: デフォルトの名無しさん [sage] 投稿日: 2011/02/09(水) 01:01:41 void mem_cpy(void *dst,void *src,u_int size){ char *p1 = *dst; char *p2 = *src; while(size--){ *p1** = *p2++; } } 基本的なソースはこういう形として, こういう形で,エンディアンの問題を回避する方法ってある? *p1** = *p2++; これ、どんな動作なの?
コンパイルエラー
ス、スマソ
エンディアン うそつかない
行列の取り扱いに関する質問なのですが for(i=0;i<N=100;i++){ for(j=0;j<N=100;j++){ scanf("%d",&matrix[i][j]); } } このような手順で行列を作成した場合例えばi=j=4となる i行j列の成分を除いた99*99の行列を作成するにはどう記述すべきですか?
>>24 まず i<N=100 や j<N=100 がコンパイル通らないけど…
それから、i=j=4となるi行j列要素を除くと99*99行列じゃなくて100*100-1行列じゃね?
比較演算子の方が優先順位高いから i<(N=100) としなきゃ
>>25 すいません書き方が酷かった
i=4またはj=4となるような行と列除くという意味です
あと省略しましたがNもscanfで入力させたいです
すみません。N=部分は削除お願いします その通り、i=j=4となるi行j列要素を除く100*100-1行列です
>>27 i=5,j=5のときはmatrix[4][4]?
それともmatrix[5][5]?
どうせ学校の宿題だろ
32 :
29 :2011/02/15(火) 23:56:11
前者なら for(i=0;i<N=100;i++){ if(i==4) continue; for(j=0;j<N=100;j++){ if(j==4) continue; scanf("%d",&matrix[i][j]); } } 後者なら何をしたいのか分からないが for(i=0;i<N=100;i++){ for(j=0;j<N=100;j++){ if(i!=4 && j!=4) scanf("%d",&matrix[i][j]); } }
>>32 scanfで読み込んだ行列に対して、指定した行と列を除く話だと思うよ
複雑なコード見慣れてるからさ Cのコードが凄くカスにみえんだよね はぁ・・・どうしよう 嫌味に聞こえたらごめんね
C言語なんて凄いやつたくさんいるしさあ^−^; ユーザー多いから^−^; 俺TUEEEEEEEEEEEEEEEEEEEEE!! できないよね^^; 馬鹿だね君たちも^^; ^−^;
>>28 100*100-1行列だとしてさ、「除く」って具体的にどういう事?
100*100-1要素の2次元配列を作りたい、それとも100*100要素の2次元配列で
[4][4]には代入しない、のどっち?
いいぞPerl忍者 もっとやれ
人を上から目線にしか見れない上級者様()は来なくていいです
39 :
デフォルトの名無しさん :2011/02/16(水) 00:08:38
◆QZaw55cn4c
面白いことも書けねえんならコテ付けんなカス
Perl忍者はもう少し頭を使った方がいい
拙者はスネークしてるでござるよ。pythonだけに。
ぺろぺろぺろぺろ
忍者の里
Perl忍者弱えw
ここはC言語なら俺ことイカ娘に聞け(上級編)Part 79でゲソ ,.__y⌒'ー---┐ ,.____ _へ、_、__,.ヘ、___ / \ , '´ `丶、 r´ } ( 聞 ど l / l _, -―― - ヽ、┌´ ナ丶 f´ ) こ う ヽ n⌒l/ l ,. .´: : : : ハ: : : : :`.ヽ'ヽ ├┬゛ tナ l ( え も } l |l |n l / : :/ j:/ーヘl: : :|: : : : | }. ノ / { ) ん 〉 | { j」_l /:l :/ |:/`}ノ!.:/ { ヽ / /へノ } ( で { _j /ヘ/: :l ミミ l/} 〈 ノ -‐ァ、、 . ) ! ゲ (: :´メ、_,.メ、|: : | , , ミミ./ :l . }. ┌─┐ (,__ └-、 ソ ,/ ヽ : : : : 丿」: : |、 /`¬ , , |: :| ) ┌┘ ゝ 、_,,,,,,,... -ゝ/ ̄/´,.__.|: : | >-| /_,ノ. : :\__l\ ・ . ,/ / ̄ヽ l!: : :ヽ、l 丶イ |.|ト、:.\: : : : : : : :>-、-、 __,,.、 ( ヾ \:_: :\__ ,‐//.| `l:\ ̄ ̄l/  ̄  ̄ ̄ ̄ヽr―ァ' \: : /、 // }/: : し\ /: :,L,. く ___/::/ \'/ { ヽ┬┐/ /: :/ /: ヾ¬ー'^ヽ ヽ 丶__ _,-、 __/: :/ /: :/ \ {、´ __ _l::::l⌒\ |: : : : / |: : i /:\ ` >'´ \`-´^ヽJ /: : | ̄ |: : レ /: :// \
わろwwwwwwwwwww
【モリタポ有償】C/C++の問題を片付けます(2)
http://hibari.2ch.net/test/read.cgi/tech/1295273862/ あなたが解けないC言語/C++言語の問題を ◆QZaw55cn4c が有償で片付けるスレッドです。
・モリタポ(
http://moritapo.jp/ )により決済を行います。
・投稿にあたっては、トリップを使ってください。トリップがなければ決済の確認ができません。
◆QZaw55cn4c は、トリップ以外の質問者の情報を知ることができませんので安心です。
【回答掲示までの流れ】
1. 質問者がトリップを使って問題を投稿する。
2. ◆QZaw55cn4c が回答できる問題があれば、◆QZaw55cn4c が受諾レスを行う。
受諾レスには決済日を基点とした回答猶予期間が示される。
3. 質問者が ◆QZaw55cn4c にモリタポを進呈する。
進呈の際には、問題を投稿したときに表示されたトリップ(パスワードではない)をメッセージに記入する。
4. モリタポの進呈を確認したら、◆QZaw55cn4c は回答を掲示する。(
http://codepad.org/, http://ideone.com を使用します。)
【料金】
・一問あたり 500円(5000モリタポ・手数料込み)です。
・一つのレスに記述できる内容を一問とします。アップローダーを使用してもかまいません。
・◆QZaw55cn4c が受諾レスを行い、受諾レスに回答期日を示したにも関わらず、回答期日に間に合わなかった場合には、モリタポを返還します。
それ以外の場合にはモリタポの返還はいたしません。
【修正】
・◆QZaw55cn4c が一度示した回答に対しては、明白な錯誤があった場合を除いては、◆QZaw55cn4c は修正は基本的に行いません。
ただし、最大限ご希望に応じたいと考えていますので、修正希望があれば、トリップを使用して投稿してください。
修正希望回数は、最大3回を目安としてください。3回を超えて修正を希望する場合は、新規に質問を投稿しなおしてください。
いずれも場合も、修正に応じることを保障するものではありません。
Perl忍者もっと頑張れよ
34 :Perl忍者 ◆M5ZWRnXOj6 :2011/02/15(火) 23:59:23 複雑なコード見慣れてるからさ Cのコードが凄くカスにみえんだよね はぁ・・・どうしよう 嫌味に聞こえたらごめんね 35 :Perl忍者 ◆M5ZWRnXOj6 :2011/02/16(水) 00:00:35 C言語なんて凄いやつたくさんいるしさあ^−^; ユーザー多いから^−^; 俺TUEEEEEEEEEEEEEEEEEEEEE!! できないよね^^; 馬鹿だね君たちも^^; ^−^;
100*100-1要素の2次元配列って何?
やっぱ専門家以外には通じないか…
#include<stdio.h> int main(void) { ....................int no; ....................printf("整数を入力してください。:"); scanf("%d", &no); .....................while(no > 0){ ....................................if(no % 2){ ..........................................................--no; ..........................................................printf("%d ", no); ..........................................................no -= 2; .........................................................} .....................................else{ ..........................................................printf("%d ", no); ..........................................................no -= 2; ...............................................} .................................} ...........................return(0); } C言語の教本の演習問題で「入力した整数以下の正の偶数を降順に表示しろ」 って言うから思いついたように組み込んで行ったら出来たんだが、 後々、何でこれで間違ってないのか分からん。 偶数入れた時はifのelseが使われて偶数が表示されるのは分かるが、奇数(例えば9)入れた時は 8, 5, 2 が表示されるんじゃないの? 入門一週間目の俺に教えてくれ
>>56 奇数を入れた1回目のループは
if(no % 2){} の中身が実行されるが
その時noが偶数になるので2回目以降のループは
else{}の中身が実行される
>>57 ああ、そっか
しょーもない読み違いで長文レスしてしまってすまんなありがとう
>>58 1を入力したときに
正の偶数ではない0が出力されちゃうから
修正した方がいいよ
んで、100*100-1行列って何?
arr[100][100]の1要素が不定ってところじゃないかなぺろ
>>59 whileの複合文の上に
..................if(no == 1){
..................printf(" ");
..................--no;
......................................}
と、whileの複合文の下に
.................putchar(' ');
入れれば良い感じか
【モリタポ有償】C/C++の問題を片付けます(2)
http://hibari.2ch.net/test/read.cgi/tech/1295273862/ あなたが解けないC言語/C++言語の問題を ◆QZaw55cn4c が有償で片付けるスレッドです。
・モリタポ(
http://moritapo.jp/ )により決済を行います。
・投稿にあたっては、トリップを使ってください。トリップがなければ決済の確認ができません。
◆QZaw55cn4c は、トリップ以外の質問者の情報を知ることができませんので安心です。
【回答掲示までの流れ】
1. 質問者がトリップを使って問題を投稿する。
2. ◆QZaw55cn4c が回答できる問題があれば、◆QZaw55cn4c が受諾レスを行う。
受諾レスには決済日を基点とした回答猶予期間が示される。
3. 質問者が ◆QZaw55cn4c にモリタポを進呈する。
進呈の際には、問題を投稿したときに表示されたトリップ(パスワードではない)をメッセージに記入する。
4. モリタポの進呈を確認したら、◆QZaw55cn4c は回答を掲示する。(
http://codepad.org/, http://ideone.com を使用します。)
【料金】
・一問あたり 500円(5000モリタポ・手数料込み)です。
・一つのレスに記述できる内容を一問とします。アップローダーを使用してもかまいません。
・◆QZaw55cn4c が受諾レスを行い、受諾レスに回答期日を示したにも関わらず、回答期日に間に合わなかった場合には、モリタポを返還します。
それ以外の場合にはモリタポの返還はいたしません。
【修正】
・◆QZaw55cn4c が一度示した回答に対しては、明白な錯誤があった場合を除いては、◆QZaw55cn4c は修正は基本的に行いません。
ただし、最大限ご希望に応じたいと考えていますので、修正希望があれば、トリップを使用して投稿してください。
修正希望回数は、最大3回を目安としてください。3回を超えて修正を希望する場合は、新規に質問を投稿しなおしてください。
いずれも場合も、修正に応じることを保障するものではありません。
no > 1 って突っ込み待ちか?
【質問の際】
質問の際は以下の条件に従ってください。
従わない投稿の問題に対しては、回答を差し上げられない可能性が高くなります。
・トリップを使用してください。トリップがない場合、受諾レスも回答も差し上げられません。
・質問は【質問テンプレート】を利用してください。
・問題文は、出題されたまま全文を書いてください。
・問題文やコードをリンクするときは、内容について説明をつけてください。
・計算問題は数式をあげ、どのような計算をするのか詳しく説明してください。
【質問テンプレート】
[1] 問題文(含コード&リンク):
[2] 環境
[2.1] OS: (Windows/Linux/等々)
[2.2] コンパイラ名とバージョン: (gcc 3.4, VisualC++2010 Express, Borland C++ 5.5 等)
[2.3] 言語: (C/C++/どちらでも可 のいずれか)
[3] 回答希望期限:([yyyy年mm月dd日hh:mm])なお ◆QZaw55cn4c は回答希望期限を最大限尊重しますが、かならずしも希望にそえるとは限りません。
[4] その他の制限: (どこまで習っているか、<****.h>は使ってはいけない等々)
【過去スレ】
【◆QZaw55cn4c 隔離】C/C++の問題を片付けます
http://hibari.2ch.net/test/read.cgi/tech/1289715349/ 【関連スレ】
C/C++の宿題片付けます 145代目
http://hibari.2ch.net/test/read.cgi/tech/1294061094/
お
唸れ、俺の左手――! 宿りし力を今こそ解き放つ――!!
酒粕で作った甘酒が飲みたい・・・
Perl忍者
計算したい
72 :
デフォルトの名無しさん :2011/02/16(水) 09:00:48
includeファイルの優先順位とかって、指定できますか? コンパイルはvisual studio 2008 Expressでやってます。 先にvarargs.hをincludeして、 va_start(引数)の形でコンパイルを通したいんですが、 va_start(引数1,引数2)が先に読まれてしまいエラーになってしまって・・・。
ほうほうそれでそれで?
>>72 理屈の上では、
#include <varargs.h>
va_start(引数)
#undef va_start
#include <stdarg.h>
va_start(引数1,引数2)
で少なくともコンパイルは通りそうな気がするけど
76 :
デフォルトの名無しさん :2011/02/16(水) 10:30:16
>>72 僕も先ほどそれでエラーは回避できました。
#include <stdarg.h>
#undef va_start
#include <varargs.h>
va_start(引数)
実際はこーゆー流れでしたが。
これでやろうと思ってるんですが、
Visual studio 6.0と2008ではvarargs.hが変わってますよね?
2008はva_argが定義されてるかどうかが聞かれてるようになってますが。
なにか理由があって変わったってことは、
安易にそのようにすると6.0と挙動が変わってくるのかな。。。
とか不安なんですが、何かわからないでしょうか?
>>76 そのあたりの挙動を吸収してくれるのがstdな訳です
俺は規格外だ、アドホックに行くぜ
というならその理由を明確に提示してもらわないと
回答しようがないですし
そもそもそれが明確ならここより適したスレがあると思います
78 :
デフォルトの名無しさん :2011/02/16(水) 10:59:06
>>76 6.0では
#include <stdarg.h>
#include <varargs.h>
va_start(引数)
の流れでやってたのを2008に移行したいがための質問でした。
stdarg.hをincludeした後にva_argをundefした時に
著しく挙動が変わるような事がなければ問題ないです。
実際にログにはva_startとva_endしか再定義されないみたいで、
個人的には大丈夫かなとは思ってるんですが。
>俺は規格外だ、アドホックに行くぜ
そこらへんは良くわかってないです・・・。
すいません。。。
丁寧に答えていただきありがとうございました。
va_start(引数)にするメリットってあるの?
80 :
デフォルトの名無しさん :2011/02/16(水) 11:45:29
>>79 メリットというか・・・。
現行がそーゆー記述
(とゆーか、varargs.hで定義している形)になってたんで。
としか言えないです。
ソースは極力触りたくないんで。
fprintfとかfwriteなどは、内部でバッファリングしてて、ある程度たまったら 実際にディスクに書き込むようですが、 そのバッファのサイズはどこで定義されていますか? また変更することはできるのでしょうか ちなみにコンパイラはgcc 4.3.2です
特に定義されてないと思います setvbufで変更できます
#include <stdio.h> #define NUM 5 int main(void) { int test[NUM]; int tmp; int i,j,s,t; printf("%d人の点数を入力してください。\n",NUM); for(i=0;i<NUM;i++){ scanf("%d",&test[i]); } for(s=0;s<NUM-1;s++){ for(t=s+1;t<NUM;t++){ if(test[t]>test[s]){ tmp=test[t]; test[t]=test[s]; test[s]=tmp; }}} for(j=0;j<NUM;j++){ printf("%d番目の人の点数は%dです。\n",j+1,test[j]); } return 0; } 配列の要素を大きい順にソートするコード?らしいんですが意味がわかりません どうして大きい順にちゃんと並び変わるんですか教えてください;;
>>83 if 文のところ
test[t] が test[s] よりも大きい場合に test[t] と test[s] を入れ替えて大きい順に並び変えている
>>84 >がありますしそれは分かるんですが
tmp=test[t];
test[t]=test[s];
test[s]=tmp;
のところがよく分からないんです・・・
22,80,57,60,50 5人の点数はこれです
excel使った方が早いよ
あ
>>85 それは test[t] と test[s] を入れ替えている
最初 test[t] が 80 で test[s] が 22 だったとすると
tmp = test[t]; // tmp に 80 を代入
test[t] = test[s]; // test[t] に 22 を代入
test[s] = tmp; // test[s] に 80 を代入
最後 test[t] が 22 で test[s] が 80 となり入れ替わっている
return 0 と return 1 の違いを初心者でもわかるように教えて
関数の呼び出し元が受け取る戻り値が違う
受け取らなかったとしたら?
意味不明
コンパイルエラー はい次
釣れたw
えらくしょぼい釣果だったな
いえいえ
関数宣言の時にvoid型にするとreturn値には何も書いちゃいけないの?
ひゅひゅだよ
あぼーん
あぼーん
あぼーん
捻りの単位はmmじゃないよ
自然科学の話じゃないんじゃないの
そうだよ 捻りの単位は℃だよ
関白宣言の時にvoidされるとreturnは何も残らないの?
>>109 昔はスタックにint型の無効値を積んで読み捨てているものもあったらしい(伝聞)。
ま、宣言時に「使わねえよ」と漢らしく宣言した以上、それを貫くのが道ってもんだろ?
>>111 main()で漢らしく宣言しましたが、10年後に失脚してしまいました。
(´・ω・`)ショボーン
>>113 アクセスバイオレーションで主導権を回復できる例は殆ど無いもんね。
失脚したら再帰できないのかなあ
>>112 そんな鬼嫁でも、私が先立つときに、俺も死ぬと言ってなどと可愛い時期もありました。
>>116 スレッド/プロセスが複線化すると人間の能力では追いきれなくなるわけで、
ゾンビプロセスが残っててもしょうがないと思う。
>>117 はい、嫁が死ぬ時は、私も道連れにされますが、
私が死んでも、嫁は保険金で生き残って、太り続けます。
悲しいですね…
お前と嫁との関係は親プロセス子プロセスではなく、マスタースレーブだろ
だからなに?
あぼーん
#include <stdio.h> int main() {
#include <stdio.h> int main() { int a[3][2] = {10, 20, 30, 40, 50, 60}; int i, j; for (i = 0; i < 3; i++) { for (j = 0; j < 2; j++) { printf("&a[%d][%d] = %p (a[%d] + %d) = %p\n", i, j, &a[i][j], i, j, (a[i] + j)); } } return 0; } (a[i] + j)は何故アドレス演算子が必要ないのですか?
a[i] + jがアドレスだから
何通りも無いんだから総当りでチェックして 一度自分の目で確かめた方がいい
>>124 >>125 配列名はその配列の先頭アドレスを表すと書かれていたのですが、
この場合a[i]を配列名として見るということでしょうか?
>>126 a[i]と書いたときポインターに成り下がる
ぺろぺろぺろぺろ
128 :
デフォルトの名無しさん :2011/02/17(木) 07:22:23
>>126 int a[b][c][d][e][f][g][h][i][j][k];
a[b][c][d][e][f][g][h][i][j]; // ←は[k]に辿り着かなければ何処までもポインタ扱い
あぼーん
あぼーん
あぼーん
cdecl の引数領域って関数の中で破壊してもいいんだっけ? (スタックポインタの巻き戻しじゃなくて、引数領域を何かで上書きしてもいいのかってこと)
134 :
デフォルトの名無しさん :2011/02/17(木) 15:26:23
>>133 引数領域ってスタックの中だろ
普通、そこは参照しかしないからな…
Cの動作だけで考えれば、壊しても大丈夫な気もするが、
最適化とかすると、コンパイラ依存になりそうな気がする…
あぼーん
>>134 そうそう、スタック上の引数
アセンブラのルーチンで横着して引数をつぶすってのを昔から深く考えずにやってたんだけど
ふと心配になったんだ
経験上、関数から帰った後で引数を使いまわすコンパイラは見たことないけど
規格や規約ではっきり合法と書かれてるのも見たことないんだよね
137 :
デフォルトの名無しさん :2011/02/17(木) 17:36:40
C言語入門書でオススメを教えてください
あぼーん
あぼーん
あぼーん
>>136 んあ?
規格に、仮引数は関数スコープの変数、みたいな記述がなかったっけ?
確認してないんで無かったらスマン
あぼーん
warning: passing argument 2 of '__builtin___strcpy_chk' makes pointer from integer without a cast このエラーの意味と対処法を教えていただけませんか?
そのままじゃん
>>143 __builtin___strcpy_chk の第二引数にintを入れたみたいだけど、
こっちで親切にポインタにキャストしておいてあげたからねっ、という意味。
対処法は、(void *) 0 みたいに明示的にキャストして引数を渡す。
>>143 多分 strcpy の第2引数に char* じゃなくて char を渡していると思われ。
コンパイラにとっちゃあ warning だけどプログラムとして見れば error! ご愁傷さま
文字と文字列の違いを勉強するといいと思うよ
これはひどい
>>149 解決しました!ありがとうございました。
#include <string.h> #include <stdio.h> int main() { char str[32]; size_t len; printf("文字列を入力してください---"); scanf("%s", str); len = strlen(str); printf("%sの長さ%dです\n", str, len); return 0; } 猫でもわかるCの文字列の長さを取り出すプログラムなのですが、 何故size_t型を使っているのでしょうか?
157 :
デフォルトの名無しさん :2011/02/17(木) 22:52:13
>>156 strlen()の戻り値がsize_tだから
strlenの戻り値の型がsize_tだから つってもprintfに%d指定してるから意味ないけどな
>>156 size_tだと型によって何かのサイズであることを明示できる。
プログラマやソースを読んだ人に対するインフォメーションが多い。
そのため、コードの解読がしやすく、バグを作りこみにくくなる。
という優しさ。
>>156 strlenの戻り値の型がsize_tだから
strlenとかサイズを返す系の関数がなぜsize_tを使っているかというと、「サイズを表す」と明言したいから
別にintでもunsignedでもいいじゃんと思うかもしれないけど、型定義名を使っておけば後から変更するとき一箇所だけの書き換えで済む
なるほどー、ありがとうございます。
わんくま同盟ってなんなんですか? プログラマ界の権威みたいなものですか?
はい、そうですよ。あれは超エリートプログラマ集団
メンバーのεπιστημηさんはC++語らしたら恐らく日本で一番。かれこれ20年近いんじゃないかな
επιστημηさんって本を出版している方ですよね? やっぱり神プログラマなんですね
えぴすてーめさんには昔よくお世話になりました。 ええ人や。
他所でやれ
嫉妬する人がいるのも分かります
うん
そりゃそうだろ
嫉妬に値する
VC++でlibpng1.5.1がコンパイル出来ない!だれか助けて!><;
何で嫉妬しているの?
実力の差が明らかだから
επιστημηって名前もオシャレだよね 日本人離れしている
パソ通出身は変な名前多い。
178 :
デフォルトの名無しさん :2011/02/18(金) 00:02:25
クサチュー
επιστημηは頭良いからな
イプシロンパイイオタシグマタウエータミューエータさんがどうした?
えってぃいおてんうん としか読めねえだろこれjk
ティウンティウン
>>179 左端が亀頭みたいでヒワイだとおもいます
おまえのせいで亀頭にしか見えない!!
ホーケイちんこのシワ的だよな。πのあたりが
あんもくに包茎自慢しやがって
おまえのせいでημηがきんたまにしかみえねえ!
System.out.println("επιστημη");
επιστημηの才能に嫉妬する人がこんなにも・・・ やはり社会に与える影響は大きかったか・・・
政権交代にもεπιστημηの影があったというしな
実力には逆らえない
ネタが無いなら無いで 無理にネタを振らなくてもいいよ 無理にネタに乗らなくてもいいよ HN、レス番、レス日時、IDをネタにしてまで 頑張らなくていいんだよ
何言ってんのコイツ
馬鹿なんだろ
>>195-197 / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
|
, ,-;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:,. ヽ─y────────────── ,-v-、
/;:;:;:;:;:;:ミミ;:;:;:;:;:;:;:;:;:;`、 / _ノ_ノ:^)
/;:;:;:;:彡―ー-、_;:;:;:;:;:;:;:;| / _ノ_ノ_ノ /)
|;:;:;:ノ、 `、;;:;:;:;:;:i / ノ ノノ//
|;:/_ヽ ,,,,,,,,,, |;:;:;:;:;:;! ____/ ______ ノ
| ' ゚ ''/ ┌。-、 |;:;:;:;:/ _.. r(" `ー" 、 ノ
|` ノ( ヽ ソ |ノ|/ _. -‐ '"´ l l-、 ゙ ノ
_,-ー| /_` ”' \ ノ __ . -‐ ' "´ l ヽ`ー''"ー'"
| : | )ヾ三ニヽ /ヽ ' "´/`゙ ーァ' "´ ‐'"´ ヽ、`ー /ノ
ヽ `、___,.-ー' | / / __.. -'-'"
| | \ / | l / . -‐ '"´
\ |___>< / ヽ
AA荒らしキタ
AAうざ
あぼーん
あぼーん
あぼーん
あぼーん
一人3役荒らし VS AA荒らし
あぼーん
× 一人3役荒らし ○ 舐め達磨 ぺろぺろぺろぺろ
208 :
デフォルトの名無しさん :2011/02/18(金) 02:57:59
>>207 お前まだいたのか
さすがクドさが半端ない
舐め達磨 は おうむがえし を つかった ぺろぺろぺろぺろ
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あなたが解けないC言語/C++言語の問題を ◆QZaw55cn4c が有償で片付けるスレッドです。
・モリタポ(
http://moritapo.jp/ )により決済を行います。
・投稿にあたっては、トリップを使ってください。トリップがなければ決済の確認ができません。
◆QZaw55cn4c は、トリップ以外の質問者の情報を知ることができませんので安心です。
【回答掲示までの流れ】
1. 質問者がトリップを使って問題を投稿する。
2. ◆QZaw55cn4c が回答できる問題があれば、◆QZaw55cn4c が受諾レスを行う。
受諾レスには決済日を基点とした回答猶予期間が示される。
3. 質問者が ◆QZaw55cn4c にモリタポを進呈する。
進呈の際には、問題を投稿したときに表示されたトリップ(パスワードではない)をメッセージに記入する。
4. モリタポの進呈を確認したら、◆QZaw55cn4c は回答を掲示する。(
http://codepad.org/, http://ideone.com を使用します。)
【料金】
・一問あたり 500円(5000モリタポ・手数料込み)です。
・一つのレスに記述できる内容を一問とします。アップローダーを使用してもかまいません。
・◆QZaw55cn4c が受諾レスを行い、受諾レスに回答期日を示したにも関わらず、回答期日に間に合わなかった場合には、モリタポを返還します。
それ以外の場合にはモリタポの返還はいたしません。
【修正】
・◆QZaw55cn4c が一度示した回答に対しては、明白な錯誤があった場合を除いては、◆QZaw55cn4c は修正は基本的に行いません。
ただし、最大限ご希望に応じたいと考えていますので、修正希望があれば、トリップを使用して投稿してください。
修正希望回数は、最大3回を目安としてください。3回を超えて修正を希望する場合は、新規に質問を投稿しなおしてください。
いずれも場合も、修正に応じることを保障するものではありません。
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
>>208 ありがとう
でも、舐め達磨さん本人も見てるから誉めるのは止めて欲しい
やきもち焼いてこんな流れになっちゃうから・・・><
反応鈍いな
舐め達磨って流行ってるの?
あぼーん
あぼーん
227 :
デフォルトの名無しさん :2011/02/18(金) 03:42:11
あぼーん
あぼーん
あぼーん
あぼーん
テスト
あぼーん
あぼーん
あぼーん
あぼーん
舐め達磨を流行らせよう! ぺろぺろぺろぺろ
舐め達磨の人こそコテつけて欲しいな レス内容が全部ぺろぺろに置き換わっても支障ないだろw
一人で何言ってんの
243 :
Perl忍者 ◆M5ZWRnXOj6 :2011/02/18(金) 09:56:48
低レベルすぎて、わろwwwww
Perl忍者
{ char miozi[],namae[]; printf("苗字を入力してください。\n"); scanf("%s",miozi); printf("名前を入力してください\n"); scanf("%s",namae); return 0; } これで要素数を指定しなければ動かない理由はなんですか?
どれだけの大きさを用意すればいいかわからないから
>>27 int a[100][100], b[99][99], i, j;
for(i = 0; i < 99; i++) for(j = 0; j < 99; j++) b[i][j] = a[i >= 4 ? i + 1 : i][j >= 4 ? j + 1 : j];
>>246 ありがとうございます。
では要素数を指定しなくていい時はどういうときなんでしょうか?
指定しなければ動かない場合と指定しなくても動く場合の違いがわかりません。
初期化するとき
>>245 「動かない」じゃなくて「動かせない」じゃないかい?コンパイルエラーで…
>>249 すっきりしました。ありがとうございます。
お前らでオナニーしてもいいですkウッ… すっきりしました。ありがとうございます。
はい。
Perl忍者
今日C言語3級受けた 過去問80点前後は取れてたけど今回はちょっと難しかった… char型に整数って入れられたました?
いれられたます
>>256 ありがとございます。文字だけだと思って間違えました…
fseekってHDDにアクセスするんですか? それともメモリ上の変数にアクセスするだけですか? fseekをガンガン使おうか控えめにしようか迷ってます。
実装がどうなっているかなんて、C言語は関知しません
いいえ。ファイルにガンガンアクセスするんですよ でも、自分ファイルって何か知らんとです、orz
>>259 書き込み後のfseek()はバッファのフラッシュをするし、読み込み専用でもディスクアクセスはあるかも知れない
C言語の範疇ではないな
>>262 ありがとうございます。
HDDにアクセスする可能性があるのか。
可能性としか言えない どういう場合にアクセスが起こるかまで知ろうとすると、OSの方に依存する
266 :
デフォルトの名無しさん :2011/02/19(土) 02:04:00
>>265 OSが無い環境は無視されるのですね
わかります
そうだね
Cプログラムを自分がする環境で、OSがなくてHDDを使う環境ってどんなの?
>>268 クドクドと長い話が始まるからほっとけよ
ほんとクドいな
またクドクドと始まるぞ
クロス開発のことか?
>>268-271 / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
|
, ,-;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:,. ヽ─y────────────── ,-v-、
/;:;:;:;:;:;:ミミ;:;:;:;:;:;:;:;:;:;`、 / _ノ_ノ:^)
/;:;:;:;:彡―ー-、_;:;:;:;:;:;:;:;| / _ノ_ノ_ノ /)
|;:;:;:ノ、 `、;;:;:;:;:;:i / ノ ノノ//
|;:/_ヽ ,,,,,,,,,, |;:;:;:;:;:;! ____/ ______ ノ
| ' ゚ ''/ ┌。-、 |;:;:;:;:/ _.. r(" `ー" 、 ノ
|` ノ( ヽ ソ |ノ|/ _. -‐ '"´ l l-、 ゙ ノ
_,-ー| /_` ”' \ ノ __ . -‐ ' "´ l ヽ`ー''"ー'"
| : | )ヾ三ニヽ /ヽ ' "´/`゙ ーァ' "´ ‐'"´ ヽ、`ー /ノ
ヽ `、___,.-ー' | / / __.. -'-'"
| | \ / | l / . -‐ '"´
\ |___>< / ヽ
まぁ実際あるだろうが、このスレの範囲かどうかは知らん
九℃九度
>>268 組み込みならあるんじゃないか
組み込み
独学だと全然勉強が捗らない・・・
実行例やら例題やらをひたすらコンパイルするんだ
はやく何かツール作れるようになりたい。 プロンプトに文字を表示させるの飽きた
猫winでも読めばいいじゃん
うん・・・猫C全部読んでからやろうと思う。 あ、あと前猫win第2版のソースコピペしてビルドしたらエラー出たんだけどなんで? プログラムの書き方変わったとか? 第3版出てたのに間違えて第2版買っちゃったんだよね
動作確認をとった環境がかかれてない本なの? あとはエスパースレにどうぞ。
レビュー見てたらVC++ではコード修正しないとビルド出来ないって書いてあった。
猫ってVC++向けな気がするけどなぁ。
>>279 コマンドラインツールを作る気が今後もないのなら、違う言語にステップアップするのも手だ。
今時ピュアCで作ってるGUIツールなんて珍しいからな。
低レベル過ぎる だいたいC詳しいやつなんて こんなスレ使わないから 低脳があつまるんだろうねここ
君を筆頭にね
超初心者です。 2〜1000までの素数を全て表示するという練習問題で 以下のように記述したのですが、上手くいきません。 どこが間違ってるんでしょうか? #include<stdio.h> int main(void) { int i,j; for(i=2; i<=1000; i++) { for(j=1; j<=i/2; j++) { if((i%j)!=0)printf("%d\n",i); } } return 0; }
全ての整数は1で割り切れる。
#include<stdio.h> int main(void) { int i,j; for(i=2; i<=1000; i++) { for(j=1; j<=i/2; j++) { if((i%j)==0) break; } if(j > i/2)printf("%d\n",i); } return 0; }
また随分中途半端な削除が入ったなぁ。 >64なんかも重複だろうに。
文句があるならお前が動けって話。
ソースが長くなりそうなので、関数毎にモジュール化したい(.cファイル)のですが メインのソースファイルに他の関数とかを書いているcソースファイルを取り込めません(というか取り込み方間違ってる…?) #include (分割したソースファイル名) ではコンパイルエラーになります…。 一体どうやってやるのでしょうか?
すいません、一例。 ■main.c ■sub1.c ■sub2.c main.cがプログラム本体です。sub1.cとsub2.cは関数だけ集めたファイル。 (main.c) #include sub1.c これでエラー出力。
■main.c ■sub1.c ■sub2.c ■sub1.h ■sub2.h *.cに #include "sub1.h" #include "sub2.h" を書いて gcc sub1.c sub2.c main.c でコンパイル
#include sub1.c 初心者に、こんなやり方を教えるなんて
>>297 出来ました!どうもありがとうございます!!
ヘッダーファイルってそういう意味で使うんですね。なるほど
>>298 参考書のみの独学プログラマでして…。
申し訳ない。
ヘッダファイルにプロトタイプ宣言 .cに関数の定義を書くのが普通だな
>>296-300 丸く収まっているところを悪いけど、なんか最初の話とズレてないかい?
行儀の良し悪しはともかくとしても、#include sub1.c を #include "sub1.c"
とすりゃいいんじゃネーノ?
良くねーだろ
「取り込み方間違ってる…?」って聞いてるからな。 とりあえずコンパイルを通す方法よりも 一般的なファイル分割の方法を説明するのが筋だろう。 それで満足しなければ、#include "sub1.c" の話をすればいい。
>>304 満足するしないの話か?
C言語の #include ディレクティブの記法ミスと気付かせるのも重要だと思うけど。
まっ、意見の相違ってやつだなw
「気付かせる」とかエラソーな態度が気に入らない。
まぁどっちでも良いじゃないか。 一応一般的な方法も教えるべきだったと俺は思うし。
>>305 俺も記法ミスのほうを優先すべきだと思う。
一般的な方法を教えるべきだと思ってる人は多重インクルードに対する一般的な解決法も書くべきだろ。
だから、お前が良いと思う方法を【お前が】書きこめばいい。
strcpy関数を使うときは#include <sting.h>を書かないとだめですよね?
#include <string.h>
>>311 でも書いたほうがいいのでしょうか?
#include <string.h>を書いたときと書かなかったときに何か違いはあるのでしょうか?
314 :
デフォルトの名無しさん :2011/02/20(日) 02:54:05.24
引数も基本型だけだから、関数宣言だけで問題ない。 タイプ量を考えたら#includeのほうが手っ取り早いけどな。
>>313 関数宣言をしていれば、インクルードしなくてもいい。
だからと言ってstrcpy()以外にもstrcat()やstrchr()を使う度に関数宣言を増やすのも阿呆なので、
普通はインクルードしておく。
関数宣言だけってどういうこと〜?
こういうこと? #include<stdio.h> void strcpy(char *, char *)
>>315 関数宣言とは・・・?
プロトタイプ宣言のこと?
>>315 関数宣言とは・・・?
関白宣言のこと?
おまえを嫁にもらう前に、言っておきたいことがある。
狭義の関数宣言: char*strcpy(); プロトタイプ宣言: char*strcpy(char*,char*);
>>310 >strcpy関数を使うときは#include <sting.h>を書かないとだめですよね?
関数宣言とかプロトタイプ宣言でもいいと言ってるやつもいるけど、
#include のほうがいいと思う。
・関数宣言だとタイプミスや勘違いするかもしれない。
たとえば、
>>320 は char*strcpy(char*,char*); なんて書いてる。
昔はこれであってたんだが、今時の処理系では大抵
char*strcpy(char*,const char*); となってる。
・宣言が処理系によって異なるかもしれない。
最近の Visual Studio だと strcpy() 使ったら、「この関数は安全じゃ
ねーから代わりに strcpy_s() 使えと言ってくる。」
こういう機能は #include <string.h> で指定されているので、関数宣言
とかだと指摘されない。
(まあ、こういう機能をありがたがるかどうかは人によるだろうけど。)
とにかく、システムから供給されるライブラリ使うなら、宣言もシステム
提供のものを使うのがいいと思うぞ。
その場限りの使い捨てプログラムなら、どっちでもいいけど。
322 :
320 :2011/02/20(日) 10:04:21.90
>たとえば、
>>320 は char*strcpy(char*,char*); なんて書いてる。
おっと、失敗したぜ。
まぁ、インクルードしておけってことで。
インクルードと宣言のみとで処理時間に差はあるの?
>>323 コンパイル時間に差はあるけど、実行時間に差が出るかどうかはコンパイラと標準ライブラリの構成次第。
>>323 msvc10とcygwin-gccでさっくり検証してみた。
吐くバイナリは
PEヘッダのタイムスタンプとチェックサムが変わるぐらいで
他に差は無い。
コンパイル速度については
何もインクルードしない int main(){return 0;} と
C標準のヘッダを全てインクルードした int main(){return 0;} でさえ
0.1秒も変わらないので認識不能レベル。
>>326 コンパイラやオプションによっては生成されるバイナリに差が出る場合もあるよ。
>>143 がその一例で、 GCC で -D_FORTIFY_SOURC=1 とかでやった結果かな。
「まぁ、インクルードしておけってことで。」に一票w
328 :
295 :2011/02/20(日) 17:00:35.15
昨日の夜世話になった者です。 関数の事とか色々調べて解決した結果、 モジュール化したファイル(関数オンリーのファイル)をそのまま.hにしてそれをインクルードしたら大丈夫のようです。 どうもお騒がせいたしましたm(_ _)m 私はVC++2010利用者なのでそもそもヘッダーファイルの存在意義すら知りませんでした。。。
1
猫Cの構造体の章がまったく理解できん
自己参照構造体とか?
うん・・・ややこしい それとtypedefとか
頭わるいんだね プログラマにむいてないよ
まずは、構造体って物が、何なのか理解できてる?
A<構造体を勉強してるがわからない B<まず構造体ってものが何なのか理解できてる?
猫でもは不親切だから分からなくても仕方がないよ。 実際俺も持ってるし最初はポインタのとこで既に分からんかったし。
明解C言語と併用すると理解しやすいよ 同じことが別の表現で書いてあるわけだから
本ばっかり買うのもあれだからネットで他の解説も見ながらやるといつか分かるようになる
vectorで落とせるC言語入門講座で勉強したな…
344 :
デフォルトの名無しさん :2011/02/21(月) 10:43:06.21
いま「error LNK2019」が出ててコンパイルが出来ず困ってます。 試した事は、 #pragma comment(lib, "○○○.lib") の記述の追加と、 追加の依存にちゃんと上記のライブラリが指定されているかの確認です。 もちろんググったりもしてるのですがこれ!という答えが見つからず・・・。 何か心当たり無いでしょうか?
>>343 構造体にtypedefを使う意味がわからなかったんです。
typedefを書くのはstructを書かなくていいようにするためでおkですか?
VisualC++ 2008 EEなんですが 例えばこんな関数 int Hoge(int *p) の引数に &i[n]みたいに配列のインデックス指定してそれに&付けて渡した場合と piみたいに既に決まってる場合とならやっぱり後者の方が早いんでしょうか?
349 :
デフォルトの名無しさん :2011/02/21(月) 11:13:07.45
>>347 すいません、忘れていました。
Visual Studio 2008 Professional
OSはwindows server 2008 r2
です。
相談です。これからC言語を数学科四年のゼミで本格的に勉強するんですが何を今やっておけばいいですかね?必修科目でうわっつらだけ勉強した程度なんです。そのときは東田、森田著者のプログラミング概論という本使ってました。
質問が漠然的過ぎて何とも言えん
354 :
佐々木優子lvl2(悪) ◆M5ZWRnXOj6 :2011/02/21(月) 14:49:22.81
くだらねえ まじきえろ 数学wwwwwwwwwwwwwwwwwwwwww wwwwwwwwww wwwwwwwwwwwwwwwwww C言語wwwwwwwwwwwwwwwwww
>>352 本屋さんで自分に合いそうな教科書を立ち読みしてみるのはどうでしょう。
あと、一冊で済まそう、とは考えないほうがいいかと。
最低2冊は必要になるね。買った本を読み比べることは大切。 ちなみに俺のおすすめは「やさしいC」とあと何か1冊。 本に書かれたプログラムを自分でもコーディングしたり、 本についている練習問題などちゃんとやると身についてくる。 本当にこれ重要。
357 :
デフォルトの名無しさん :2011/02/21(月) 22:12:18.24
どんだけオッサンだよ
内容なんて全く覚えてないけど、Cプログラミング診断室とか読んだな…
◆QZaw55cn4cジジイwwww
>>358 これを読んだのが15才だとしても今40才か・・・
もう人生終わってるジャン
出版直後に買ったという保証がない
でもさあ使ってるのがPenIIIの866MHzでしょ? そんなの使ってるのって40才前後のジジイだぜ
85年頃のCってリッチな稼働環境を要求する高級言語だったんでしょ?
◆QZaw55cn4cの発言の一つ一つがいちいち加齢臭臭いしなあ
おっと K6-3 550MHz も元気に動いていますねえ。
PC98にゲタを載せて動かしてるんですね わかります
369 :
デフォルトの名無しさん :2011/02/22(火) 07:46:22.86
>>348 速いかどうかは分からないが、遅くはならない。
老年気取りしてんじゃねえよごみ わざとらしい
charって何て呼んでますか? 俺はチャー
ガスライティング
あ、わすれてました。Celeron 300 x 2 を 100 x 4.5 で動かしています、変なマザー使って。
◆QZaw55cn4cは現代の化石か もう逝っていいよ
~#include〜... int flip(void); main() { int counter, omote = 0, ura = 0; srand(time(NULL)); for(counter = 1; counter <= 100; counter++) { flip(); if(flip() == 0) { printf("表 %d\n", flip()); omote++; } if(flip() == 1) { printf("裏 %d\n", flip()); ura++; } } printf("\n表: %d 裏: %d", omote, ura); return 0; } int flip() { int i; i = (rand() % 2); return i; } コインを100回投げて表が何回、裏が何回でたかというプログラムをつくりた いのですが、表と裏の合計が100回を超える結果になります flip()のまま使うのがよくないのでしょうか?できれば理由を教えて ほしいです。
>>376 flip() を呼ぶ 「たびに」 0か1のどちらかがランダムに返るので、
> if(flip() == 0) {
ここで 0 が返ったあと
> if(flip() == 1) {
ここで 1 が返ると、両方カウントされます
>>376 合計が100回より少なくなる場合もあるよね
int tmp = flip(); if(tmp == 0) { printf("表 %d\n", flip()); omote++; } if(tmp == 1) {
あ、まあいいや
>>376 int flip(void);
int main(void) {
int counter, omote = 0, ura = 0;
srand(time(NULL));
for(counter = 0; counter < 100; counter++) {
if(flip() == 0) {
printf("表 %d\n", flip());
omote++;
} else {
printf("裏 %d\n", flip());
ura++;
}
}
printf("\n表: %d 裏: %d", omote, ura);
return 0;
}
int flip(void) {
return rand() % 2;
}
ついでに教えておいてあげよう。 rand()の下位ビットは乱数性が悪いのでRAND_MAX / 2との 大小で偶奇を決めるのが普通。
384 :
デフォルトの名無しさん :2011/02/22(火) 16:49:32.17
そんな実装依存の使い方が「普通」であってたまるか 高品質の乱数が欲しければ探すか作れとしか言いようがないだけだ
いまどきそんな乱数実装なんて見たことねえよ。
388 :
デフォルトの名無しさん :2011/02/22(火) 18:19:19.30
そのまま返してあげよう。w
>>386-387 > そんな実装依存の使い方が「普通」であってたまるか
389 :
デフォルトの名無しさん :2011/02/22(火) 18:47:13.03
386 のどこが実装依存なんだよ ふじこりやがってw
rand()が使い物になるかどうか自体が実装依存なんだから目くそ鼻くそ 本気で疑似乱数を作りたければ自作すれば良い
391 :
デフォルトの名無しさん :2011/02/22(火) 19:02:52.09
必死だなw 376 の要求を rand で達成できるかどうかを あらゆる要求を rand で達成できるかどうかに すり替えただけの詭弁に騙されるかっての 本気で疑似乱数が作りたければ どうぞご勝手に
393 :
384 :2011/02/22(火) 19:09:44.68
アンカーミスったか?
>>391 >376 の要求を rand で達成できるかどうかを
本当に目くそ鼻くそだな
>>376 の確率が1/2にならないって話なら分かるがそれ以前の問題だ
おまじない的にrand()で下位ビットを避けておくのは、 悪くないルールだと思う それでも(品質や速度的な意味で)満足できないなら、 別のもっとまともな実装を探すか書くかしかない
396 :
デフォルトの名無しさん :2011/02/22(火) 19:20:56.35
ふじこちゃんに目くそも鼻くそもあるか ぼけ
あqwせdrftgyふじこl;
>>395 おまじないってするなら、
RAND_MAX % N
分の振り直しも入れろ
まぁ、それでも信用ならんのがrand()だけどな…
>>398 (int)((double)rand() / ((double)RAND_MAX + 1) * N)
で十分。
401 :
394 :2011/02/22(火) 19:36:07.49
>>399 >rand()の下位ビットは乱数性が悪い
悪い環境もあるって話で、悪いと決まってる訳ではない
>そんな実装依存の使い方が「普通」であってたまるか
無知なだけ
つーわけで目くそ鼻くそ
403 :
デフォルトの名無しさん :2011/02/22(火) 19:41:24.53
河野氏のページを真顔で「昔から」のソースにする男の人って・・・ 「何も考えずに」そうするんだろうけど、問題のある乱数から単純な分数作って何がしたいわけ? アフォ?
404 :
394 :2011/02/22(火) 19:42:41.79
相手にした俺が悪かった…orz 十分かどうかは置いておいて、それは振り直しとは全く違う まぁ、この話題は、もう書き込んようにする
どのみち線形合同法は割と残念なアルゴリズムなので…… 例えばメルセンヌツイスタのような、 もっと現代的な実装が早く広まればいいんだけどね
xorshiftオススメ。線形合同並に簡単に実装できる
md5みたいなハッシュでも、そこそこな乱数になりそうな気がする
>>403 問題のある乱数でも速くて大量に乱数を生成できるという特性があるなら、それを買って使う場面もあるでしょうね。
そういうときに、(int)((double)rand() / ((double)RAND_MAX + 1) * N) とするのは普通のやりかた。
処理系によってはrand() が線形合同である可能性も否定できない。
処理系依存を少なくしたいのなら、大事をとって、(int)((double)rand() / ((double)RAND_MAX + 1) * N) と書くのは好ましいと思いますが。
>>384 >そんな実装依存の使い方が「普通」であってたまるか
実装依存でもないし、普通なんです、昔から。
>>408 >処理系によってはrand() が線形合同である可能性も否定できない。
普通は線形合同でしょ?下位ビット捨ててるくらいで
>処理系依存を少なくしたいのなら、大事をとって、(int)((double)rand() / ((double)RAND_MAX + 1) * N) と書くのは好ましいと思いますが。
処理系依存が嫌なら自前で実装するのが一番
数行コピペすればいいだけだし
>>407 そこそこっていうか、なるはず
バイナリに偏りがあれば対衝突性を満足できない
しかしめちゃくちゃ遅いw
411 :
デフォルトの名無しさん :2011/02/22(火) 19:56:19.46
>>408 > 速くて
具体的に何 bps を保証するんですか
> 大量に
循環周期と確率分布の保証は?
わけわかんねえ「なら」につきあってられるか ぼけ
そう言ったのが
>>384 だよ
413 :
デフォルトの名無しさん :2011/02/22(火) 20:09:01.50
今日は猫の日だが ふじこの日でもあるのか?
>>410 バイナリを使うのは最初(srand)だけで、2回目以降は、
前回のハッシュの結果をバイナリとして使えば、偏らないと思う。
まぁ、それでも重いか…
415 :
414 :2011/02/22(火) 20:12:14.65
ぎゃくに、これで偏るのであれば、md5が使い物にならないとの証明になるのか?
416 :
デフォルトの名無しさん :2011/02/22(火) 21:02:13.28
windows7での既存のパスにc\Borland\Bcc55\binのパスを追加する方法を教えてくださいませm(._.)m
>>416 comp.lang.c ってなんですか?fj?
2chよりも荒れまくっているあそこですか?
っで、くさかべさんは今でもご健在ですか?
>>417 bccが動くかは知らんが、パスを追加するなら
コントロールパネル→システム→システムの詳細設定→環境変数→システム環境変数
fj.comp.lang.c fj.lang.c faqが出来たころはどっち?
421 :
デフォルトの名無しさん :2011/02/22(火) 21:34:28.69
>>416 おまえ本当に何も考えてないのな
# アフォってフレーズは読んでるんだよな、こいつw
423 :
デフォルトの名無しさん :2011/02/22(火) 21:52:45.28
>>418 脳軟化おこしかけてる骨董品のくせにcomp.lang.cを知らねーのか?
>>412 c-faqはお前のようなバカに読ませるために蓄積されたんだよ。
足りないおつむで考えるのは止めて、c-faqをすべて暗記した方が良いぞ。
424 :
デフォルトの名無しさん :2011/02/22(火) 22:01:09.69
> c-faqをすべて暗記した方が良いぞ。 自分ができないことを人に言う手合いか? 暗記したところでどうだっていう以前の問題だが
426 :
デフォルトの名無しさん :2011/02/22(火) 22:43:39.47
>>421 c-faqはお前のようなバカに読ませるために蓄積されたんだよ。
足りないおつむで考えるのは止めて、c-faqをすべて暗記した方が良いぞ。
>>424 お前は思考するおつむを持っていないのだから、お経を諳んじるように
全て暗記するところから始めろ。
>>425 すまん、後半はアンカーを間違えた。
無料でペイントみたいなウィンドウズアプリ作るならどんな環境を利用したらいいですか(´・ω・`)
Qtとか
>>428 サンクス、Qtスレ行ってくる(`・ω・´)
こんなソフト作りたいって思って今あるスキルじゃ作れない時どうすればいい? 勉強するにしても無知すぎて何を勉強すれば実現できるかわからない。どうぐぐっていいかもわからない。
目標を落とせ
外注にやらせる
434 :
デフォルトの名無しさん :2011/02/23(水) 00:16:59.56
Cじゃなくて、C#とかで始めてみればいいよ。 Visual C# Express なら簡単にGUIアプリが作れる。解説もたくさんあるし。
ありがとう。やってみる。
>>431 こんなソフトの一部の機能/部品をまず手始めに作ってみよう。
やっぱVBよりC#のがいいな ネットに転がってる例も多いし、VBだと外のAPI使う時に型間違うし
32の自営業やってるおじちゃんだけどcのコンパイラ?ってやっぱ有料のやつのがいの?息子がプログラミングに興味持って親父も囓りたいんだけど
32なら手遅れだ
440 :
デフォルトの名無しさん :2011/02/23(水) 00:37:18.47
Visual C++ Expressでおk
>>438 無料ので良いんじゃない。
どうしても GCC が使いたければ Eclipse で。
じゃなきゃ、Microsoft Visual Stadio Express で。
暫くすれば、息子に教えを乞うようになるかもw
プロでもないのにわざわざ有料のを使う必要はないよな。
気合い入れて学ぶなら、Linux上で、vim or emacs + gcc 恐らく挫折率が高すぎるのでオススメしない 教師無しの初学だし、pythonが良いと思うぞ 無料のドキュメント多いし。 Cでポインタとか、C++でどうでも良い知識覚えても仕方ないし。 子供が学習する分には、Squeakとかでも良さそう。 将来の仕事のこと考えて、JavaやC#を覚えても、 10年後に、どうなってるかなんて読めないし 気合い入れてアルゴリズムを学ぶなら、topcoderとか。 Racket schemeって環境でSICPでも解けば、 将来は良い大学に入って、良い会社に就職できるんでね?
息子がプログラミングに興味持ったなら、 ついでに算数と英語の勉強もさせておけ ルービックキューブをもの凄い速さで解いたりとか、 暗算が得意とか、そんな感じのセンスがいる 若いうちからでも無理そうなら、興味なんてさっさ捨てて、 子供には柔道か剣道をやらせて警察官を目指せ。
Windowsでプログラミングを始めるならVC# Express一択。どんどんカッコイイアプリを作ってね! UNIX系で始めるならPythonでも何でもいいんじゃないの。どうせ文字しか出さないんでしょ。
UNIX って別に怖い物でもなんでもないぞ
小学生がやるなら HSP がよさげ 開発環境にサンプルコードが大量についてくるからそれを弄るだけでも面白い 環境設定がラクチン 開発環境が軽いのでヘボスペックPCでも動く 音を鳴らしたり、絵を表示するのが楽なのでバカゲーを作るのには最適 ちょっと凝ったことをしようとすると途端に面倒になる(他の言語でやるよりも) Windows でしか動かない 数値計算が遅い バカにされるw
誰も怖いなんて言ってないし
>>445 SDL、tk、Gtk、Qt、OpenGL、GAE
色々なものが動くだろ
Windowsでポトペタとか、せっかくの若い芽を
土方に仕立て上げるようなもの
ubuntuならインスコしてしまえば、 必要なライブラリなんかはパッケージマネージャーに任せれば、 Windowsよか環境を整えるの楽でしょ
>>438 C の知識が古びることはない(C すなわち マシン語 すなわち ノイマン型計算機に通じるものがあります。)ですから、
息子さんの興味が自由に育つままに放っておいて構わないんじゃないですか。
いろいろいわれていますが、数あるプログラミング言語/環境のなかから、結構難しいといわれる C を敢えてやろうというのなら、それだけで先見の明があるでしょう。
つ
http://cruel.org/freeware/hacker.html コンパイラややっぱり Visual C++ Express Edition でいいんじゃないでしょうか。
無料のものは、他には、
Borland C 5.5
GNU Compiler Colection(gcc)
あまりみないけど Watcom とかが手に入りやすく扱いやすいでしょう。
>>443 >Cでポインタとか、C++でどうでも良い知識覚えても仕方ないし。
c++ にはどうでもいいがらくたが多いと思いますが、c のポインタは本質的なものではないでしょうか?機械語と一対一に対応するものですし。
Windowsで一番簡単にインストールできるのはCygwinのgccかなあ
455 :
デフォルトの名無しさん :2011/02/23(水) 09:11:13.78
typedef enum ABC { ABC_A, ABC_B, ABC_D } ABC; この書き方って問題ある? VS2008でコンパイルすると、 一番最後のところで error C2143: 構文エラー : ';' が '識別子' の前にありません。 fatal error C1004: 予期せぬ EOF が検出されました。 のエラーが出るんですけど。 ググる限り特に問題ないような気はするんですがー。 他に問題あるけどエラー箇所はここになってる。とか?
C(C++)の規格上は問題ないし、2008でも問題なくコンパイルできる。 wingdiが定義している型と衝突するが、エラーメッセージはそれではない。 お前が人に言えない恥ずかしい間違いをしている可能性120%
;抜けてんじゃね?
>>438 自衛してるんだから金持ってそうだね
ケチらないでVS買えよ
>>457 寧ろお前の頭が抜けている。
>>455 そこだけ見たら、>456の言うように問題が無いように見える。
コンパイラがそこに辿り着く前に問題があると思う。
インクルードしているファイルがあるなら順に削ってみるか、
プリコンパイルの指定があるなら一旦解除してみるとか。
460 :
デフォルトの名無しさん :2011/02/23(水) 10:27:19.67
>>456 >>459 多分ここには問題ないと思います。
これが記載されてるヘッダーファイルじゃない
ヘッダーファイルでもエラーが起きてたんだけど、
そこでのエラーを無くしたらとりあえずエラーは消えました。
まぁ、まだ正常終了したわけじゃないからなんともだけど。
エラーの行数がそこでも、実際におかしいのは前後の行ってことはよくあるよ
恥ずかしくて言えるわけないじゃないですか。
そりゃそうだなw
実際におかしいのが前の行という事は普通にあるけど、 後ろの行が実際におかしいというのは無い。
Cできないやつは頭終わってる
C出来ても人生終わってる奴もいるけどな
Cだけできてもしゃーないでしょ アルゴリズムや数値計算、OSだとか理解してないと 文系コーダーと変わらん
数学できなければみんな文系だよ。
470 :
Perl忍者 ◆M5ZWRnXOj6 :2011/02/23(水) 20:22:40.83
うんそうだね 死ね
童貞なだけでなぜハゲだと言われなければいかんのだ
あ
473 :
デフォルトの名無しさん :2011/02/25(金) 23:20:30.58
暗号化処理の時にランダム初期値をファイルに書き込みます。 復号化するときには32バイトの初期値を使って復号するのですが、 平文を間違って復元すると元に戻せなくなります。 暗号文に特定パターンのヘッダを入れることも考えたのですが、 平文と暗号文を識別する何かいい方法はないでしょうか? よろしくお願いします。
475 :
デフォルトの名無しさん :2011/02/25(金) 23:39:44.39
すみません他に書き込みます。
477 :
デフォルトの名無しさん :2011/02/26(土) 00:13:48.31
拡張子を変えても、誰かに悪戯されて暗号文を偽装される恐れがあります。
>>473 フラグ+データ
フラグで平文・暗号文を示して、データにはフラグに沿った文を入れる
暗号・復号化はフラグを見て、データ部分に対して行い、フラグを適切に修正して出力
479 :
デフォルトの名無しさん :2011/02/26(土) 00:16:41.20
フラグというのは例えば固定パターンの文字列とかでもいいのでしょうか?
識別出来れば何でもいい。
>>473 悪戯とか偽装とかが嫌ならハッシュでも追加したら?
元のデータのハッシュ(md5やsha1)をファイルの先頭に入れて、それも含めて暗号化
復号後に、ハッシュを確認して一致すれば、上書きでOK
偽装を防ぐためにハッシュを使うなら、ハッシュに公開鍵暗号で暗号かけないとダメ
公開鍵の信頼性を担保するために認証局からディジタル証明書を発行してもらわないとダメ
>>482 暗号化されてるデータに対して、さらに公開鍵暗号って何のための暗号化だよ
バイナリを暗号化しようとか思ってないような
486 :
デフォルトの名無しさん :2011/02/26(土) 01:20:26.27
#include<stdio.n> int main(void){ prinf("こんにちは"); back 0; } エラー
487 :
デフォルトの名無しさん :2011/02/26(土) 01:23:32.33
来週までにアドレス帳作って来いって言われてんねんけど 何から作ればいいの?
>>487 作る前にまず友達全員にアドレスを聞いて、データ件数を見極める
それから最適な実装方法を考えよう
491 :
sage :2011/02/26(土) 01:26:32.09
>>484 何で、暗号化されたものに対して署名が必要なんだって話
署名が必要なのは平文に対してだろ
>>492 だから、偽装を防ぐためにハッシュを使うなら、ハッシュに公開鍵暗号で暗号かけないとダメ
ハッシュは公開鍵暗号の秘密鍵で暗号化して、データは共通鍵で暗号化する
ハッシュとデータを一緒に暗号化したら偽装防止にならない
>>490 件数は5件ぐらいで登録、閲覧、コピー、修正、削除の機能が上手く動けばいいらしい
つかどうでもいいけど俺マジで友達少ないねん
>>487 まずは紙の候補から決めようじゃなイカ?
サイズはA5が良いかA6良いか、
ベースとなる色は何色が良いか決めようじゃなイカ?
つか掲示板に自分のソースって書き込んでもいいの?
>>493 >ハッシュとデータを一緒に暗号化したら偽装防止にならない
良く考えろ
暗号化された状態のデータを偽装ってどうするつもり?
すでに暗号が破られた状態が前提の話になってないか?
>>497 暗号化が破られない前提なら、ハッシュなんて要らないだろ
>>499 定型文を固定の位置で使うと、暗号を破る種にされるから
推測しようのない、ハッシュを使うんだが?
502 :
デフォルトの名無しさん :2011/02/26(土) 01:50:25.70
固定パターンの文字列をファイルに書き込んで、そのあと先頭の32バイトを 読み込んで固定パターンと一致するかどうか検査をし、あっていれば処理を 続行するということをやりたいです。 以下のコードがうまくいきません。どう直せばいいのか教えてください。 よろしくお願いします。 int main(int argc,char argv[]){ char *buf[32],buf2[32]; FILE *fp; buf[32]="Don't Edit Header" fp=fopen(argv[1],"wb"); fwrite(buf[32],1,sizeof(buf),fp) fclose(fp); fp=fopen(argv[1],"rb"); fread(buf2,1,32,fp); if(strcmp(buf[32],buf2)) printf("暗号ファイルではありません\n"); return 0; }
ハッシュはファイルが壊れてないか確認するためにはつけるべきなのかな ファイルが正常に復元できないなら上書きしなかったところでファイルは壊れてるけどさ
>>498 なんだそれ?汗
とりあえず今日はここまでつくった
#include<stdio.h>
typedef struct{
char a[24], b[24];
int c,d,e,f;
}
int main(void){
int x = 1, y = 0, z = 0;
while(x){
printf("操作する番号を選んでください:"); scanf("%d",&i);
switch(i){
case 1: touroku(); break;
case 2: hennsyuu(); break;
case 3: ichiran(); break;
case 4: copy(); break;
case 5: sakujo(); break;
case 6: x = 0; break;
}
}
}
↑これって何言語なん?
>>500 ハッシュはメッセージと一対一に対応するからいくらでも推測可能
そういう目的に使うならハッシュではなく、乱数パディングを使う
>>505 何でやねん
その元のメッセージ自体も一緒に暗号化されてるのに
推測できるって、あんたエスパーでっか?
>>507 だから、
暗号化されたメッセージからメッセージを知るのと
暗号化されたメッセージとそのハッシュからメッセージを知るのとは
難易度は何ら変わらないってこと。
>>473 って共有鍵を使った(もしくは、それすら使ってない)暗号化の話だったの?
>>504 ここから一個も進まん
プロトタイプ宣言してから自作関数作るねんけど
ファイル操作わからん
お勧めのサイトないですか?
>>508 パスワード使った暗号化の話だったつもりだけど、違うみたいね
プログラム側で固定のキーを使う暗号であれば、あんたの言ってることは正しいよ
>>507 いや、平文か暗号文か判定するために特定パターンを使うのはどうか聞いているだけ。
そこにハッシュをどうのこうのと無駄な意見が出てきた。
>>511 パスワードを使った暗号化の話だったらなにか違うの?
>>513 全然違う
平文をツールが持ってるキーで暗号化すると、
その平文とそのハッシュから、キーを特定するために、
定型文を使うのと何ら変わりはない
暗号化するためのキーがパスワードであれば、
キーを特定するための手がかりにはならない
515 :
デフォルトの名無しさん :2011/02/26(土) 02:08:03.45
固定パターンの文字列をファイルに書き込んで、そのあと32バイト読みだして 固定パターンと一致するかどうか検査して、一致したら処理を続けるという事 をやりたいのですがうまくいきません。教えてください。 どのようにプログラムを書けばいいでしょう? よろしくお願いします。
教えてクン養成マニュアル 明日の「教えてクン」を目指す、若き戦士達に以下の文章を捧げる。 日々精進し、パソコンヲタクどもの親切を蹂躙してやれ。 1. 努力を放棄すること いやしくも「教えてクン」たるもの、努力をしてはならない。 過去ログを読んだり、検索してはいけない。 「英語は苦手なので、分かりません。」は、高く評価できる。 辞書片手にマニュアルやReadMeを読むなど、決してしてはならない。 他力本願と言われようと、自分で調べたり試行錯誤したりせず、他人の努力の結果を搾取するのが、正しい「教えてクン」である。 また、「もう何が悪いのかサッパリ分かりません。」と言ってふてくされるのも有効である。 「サッパリ」という単語が「やる気の無さ」を効果的に表現している。 「原因を特定するには、何をすべきでしょうか?」と訊いてしまうと自己の積極性が現れてしまうので、「教えてクン」失格である。 2. 情報を開示しないこと 使用OSや、機器構成などの必須の情報を知らせてはならない。 マザーボード名やBIOSのバージョンも同様だ。 具体的なアプリ名やバージョンも隠蔽すべきだ。 「DVD再生ソフト」のように曖昧に表記しておけばよい。 反対に「前から欲しいと思っていた○○」とか「安売りされていた ○○」等の「どうでもいい情報」は、どんどん書いてやれ。 トラブルの場合は、状況を正確に記述してはならない。 「なんだかうまく動きません。」とか「エラーが出ます。」等と具体的なことは何も書かないことが重要である。 また、自分の試してみた事も具体的に書いてはいけない。 考えられる組合せのマトリックスを作成し、状況を整理するなどもってのほかである。 最悪の場合、それだけで問題が解決してしまうこともあるのだ。 「いろいろやってみたけど、動きません。」が理想的だ。
3. 答える人間のことを考えないこと 「教えてクン」は、孤高の戦士である。 相手のことを考えるようでは教えてクン失格というものだ。 以下のような行動が、望ましい。 初心者であることを高らかに宣言し、初心者向けの丁寧で分かりやすい説明を強要する。 専門用語の使用を禁じておくとさらに効果的である。 簡潔な説明を禁じられたヲタクどもは、同じ内容を説明するのに、何倍もの労力を強いられる。 自分は努力せず、相手には多大な努力をさせることこそが「教えてクン」の真骨頂である。マルチポストも有効である。 そのBBSを信用していないことを明確に示せる。 「どうせ、お前らじゃ分からんだろう。」という意志表示として高く評価できる。 もちろんマルチポストの非礼をあらかじめ詫びてはならない。 それでは、単なる「急いでいる人」になってしまう。 それは、教えてクンではない。質問のタイトルは、「教えてください。」で良い。 タイトルを読んだだけでは「何に関する質問」か全く分からない。 そういう努力は、答える人間にさせれば良いのだ。 とにかく、答える人間が答えやすいように気を使って質問してはならない。 傲慢で不遜な態度が必須である。「聞きたいことがあります。」など、プロの仕事であろう。 最後に、言うまでも無いことだとは思うが、答えてくれた人達に礼の言葉を返すなど言語道断である。 せっかく「教えてクン」を貫いてきたのに、最後にお礼を言っているようでは、画竜点睛を欠いていると言わざるを得ない。 質問だけしておいて、後はシカトが基本である。 上級テクニックとして、「そんなことはもう試しました。」とか、「そこまで初心者じゃありません。」などと言って、回答者の神経を逆なでしておけば完璧である。 以上のことを踏まえて質問すれば、君も立派な「教えてクン」である。 ビバ!教えてクン! 教えてクンに栄光あれ!!
518 :
502 :2011/02/26(土) 02:20:35.81
サンプルプログラムは
>>502 に書いてあります。
よろしくお願いします。
^^;
>>502 まぁ、絶対ネタだろうなと思いつつ
#include <stdio.h>
#include <string.h>
#define BEL 7
#define HEADER_SIZE
int main( int argc, char *argv[] ) {
char buf[HEADER_SIZE], buf2[HEADER_SIZE];
FILE *fp;
memset( buf, BEL, sizeof( buf ) );
strcpy( buf, "Don't Edit Header" );
fp = fopen( argv[1], "wb" );
fwrite( buf, sizeof( buf[0] ), sizeof( buf ), fp );
fclose( fp );
fp = fopen( argv[1], "rb" );
fread( buf2, sizeof( buf2[0] ), sizeof( buf2 ), fp );
fclose( fp );
if( strcmp( buf, buf2 ) )
printf( "暗号ファイルではありません\n" );
return 0;
}
サイズ入れ忘れた #define HEADER_SIZE 32
522 :
502 :2011/02/26(土) 05:01:01.83
自己解決しました。ありがとうございました。
>>524 mywrite(fp) の戻り値が 0 の間ループ
なぜループするのかが分かりません・・・ 0が返ってきたらwhile( !0 )→while(1)になって fclose(fp); return 0; で終了じゃないのでしょうか。
while(1) だったらループするじゃないか while(0) になったらループを抜けて終了する
while文は{ }で囲んだ範囲をループしますよね? 今回はループ範囲がないのに何故自作関数がループしてるのか疑問なのですが
それは少し不正確な覚え方をしている while (式) 文 のような構文で、式が真のあいだ文を繰り返し実行する 文は単一の文でも複文でもよく、複文の場合は { } で囲む 今回のケースでは while (!mywrite(fp)) の直後にある ; (空文) がその繰り返す文にあたる
>>528 厳密な規格表現云々は置いておくとして、
while (!mywrite(fp){/* do noting */} と同じこと
while の () 内はループ毎に評価され、変数でも戻り値のある関数でも良い
whileの()の部分も評価されると覚えておけば良い。 i=0; while(i++<5){ /* 何もしない */}
普通に while (!mywrit(fp)){ //何もしない }; で無限ループじゃね?
>>532 0以外は真
0は偽
!偽は真
!真は偽
ああ無限というか!mywrit(fp)をループだよな
ああ、やっと意味が分かりました。 ループ範囲が空文だからwhileを抜けると間違った解釈をしていました。 これは継続条件式がループしてるんですね。
while(1) { if(mywrit(fp) != 0) break; }
>>535 そうですね。条件式はループをまわるごとに必ず毎回評価されますし、そしてその条件式のところに関数があれば、その関数を毎回実行することになりますから。
たとえループするものが完全に何もなかったとしても、ループを書けばループするのが、コンピュータというもの 空文だからといって勝手にwhileを抜けたりはしないよ
>>514 「キー」と「パスワード」が何を意味しているのかよく分からないけど、
暗号化の鍵として使う「キー」が、ツールの中にあるか、ユーザーの頭の中(?)にあるか、によって何かが変わると言ってる?
何も変わらんだろ。
>>539 全く違うのが分からないのか?
まず、暗号文の内容が定型文+メッセージであれば、
その定型文があること自体が、クラックする場合の種になることは分かるよな?
次に、ハッシュ+メッセージの安全性を考える場合に、
ツールの中に特定のキーがある場合、クラックする人間が
そのツールを使って、暗号化すれば、平文の時のハッシュを知ってるから
そのハッシュが、定型文と同じでクラックの種に使えるのも分かるよな?
一方、ユーザの頭の中のパスワードがキーの場合、
クラックする人間に平文のハッシュなんて予想出来ないから、
ハッシュ+メッセージは、単なるメッセージのみと同じってことが分からないか?
つまり、暗号をクラックするためのヒントを与えずに、
そのファイルが有効であるか確認するために、ハッシュは有効なんだよ
>>540 先ず、上3行だけ。
繰り返しになるが、
「定型文+メッセージ」の暗号文からメッセージを知る難易度
と
「メッセージから一意に生成される文+メッセージ」の暗号文からメッセージを知る難易度
は
何ら変わらない。
この難易度を挙げるには、乱数パディングを使う。
いつまでやってんだこいつらw
>>541 >「定型文+メッセージ」の暗号文からメッセージを知る難易度
>と
>「メッセージから一意に生成される文+メッセージ」の暗号文からメッセージを知る難易度
>は
>何ら変わらない。
何で、暗号強度が高いこと前提なの?
俺が言ってるのは暗号強度を変えない方法だよ?
理解できなかった?
>この難易度を挙げるには、乱数パディングを使う
一旦強度を低下させといて、それを補うために乱数パディングとか
もうアホじゃないかと…
文章で理解できないときはお絵かきするクセをつけろ
お前は乱数パディングって言葉を使いたかっただけじゃないのか?
もうCの話ではないな
>>546-547 スマンね
ただ、あまりの大嘘で終わらせるのも嫌なもんで、
乱数でパディングする必要があるのは何故なのかとか、
どの様なアルゴリズムにおいて有効なのかとか、正しい知識を持ってれば
>>541 が共有鍵と個人鍵において、どれ程の差があるか分かるはず。
じゃ、C言語の話題に戻してみるか。 enum で列挙定数の最大個数をコンパイル時にチェックして超えていたらコンパイルエラーとしたい。 例えば enum E{ E_A, E_B, E_C, …, E_MAX }; で必要に応じて列挙定数を増やしながらプログラミング していきたいんだけど、列挙定数の最大個数は256未満にしたいとか感じ。 で、これを実行時ではなくコンパイル時にチェックしたい。 手で数えるとかは無しで、どうすりゃできるのかな?
コンパイルの前処理に、enumカウンターを入れてチェック
>>549 素直にE_1, E_2, E_3って増やせば?と思ったり…
直感的には難しそうで、できても、トリッキーなコードになりそうな気が…
規則性と包括性があるとしても百数個の識別子を定義するその理由が知りたいね
>>550 外部ツール作ればできるだろうけど、出来ればビルド環境依存にはしたくないのです。
>>551 例では簡単なネーミングにしてるけど、実際には意味のあるネーミングを使いたいし
間に挿入したい時もあるので連番ネーミングにはしたくないのです。
まずはトリッキーなコードでも良いのでアイデア提供お願いします。
>>553 考えてはみるけど期待しないでね
それよりも普通に#defineで定義すれば良いんじゃね?
そんなもんをソースコードだけで管理すると?
>>549 列挙定数の宣言時に値を指定しないのであれば、一番最後の E_MAX が (列挙定数の数) - 1 になるんですけど。
>>557 コンパイル時にチェックしたい。
って事だから無理でしょ
>>558 たしかに。asset.h でも使えるのならいいのですが。
560 :
549 :2011/02/26(土) 18:23:16.80
>>556 仮想実行環境とかいっても、Javaとかみたいな大げさなもんじゃないので^^;
>>557 はい、実際には個数そのものではなく 0 から始まる連続した正の整数を扱いたいのです。
なので、例で言えば E_MAX >= 256 とかでコンパイルエラーにしたいのです。
561 :
559 :2011/02/26(土) 18:23:40.20
assert.h
assert()で使えないって、どういうこと?
そういうコンパイラを作れ
>>563 ああ、そっか#line使えば良いんだな
あとは__LINE__との比較でいける。
まぁ、その後の__LINE__がめちゃくちゃになるから、
この定義だけ別ファイルとかにしないと迷惑だけど…
// 1要素毎1行
#line 0
enum E{
E_A,
E_B,
E_C,
E_MAX
};
#if __LINE__ > 258
#error "E_MAX >= 256"
#endif
>>549 コンパイラによるけど gcc ならこの手が使える
static char dummy[255-E_MAX]; // E_MAX>=256 の時コンパイルエラーにする
場合によっては
>>566 よりこっちのほうがいいかも
void dummy_func(void)
{
char dummy[255-E_MAX];
}
>>566-567 そんなので弾けるなら、適当な場所で下記でOK
sizeof( char [255-E_MAX] );
なるほど sizeof( char [負の整数] ); でいつでもコンパイルエラー出せるのかー
571 :
549 :2011/02/26(土) 19:36:45.33
>>565 dクス。
今手元にコンパイラがないので直ぐに確認できないけど
enum E{
#define E_START_LINE __LINE__
E_A,
E_B,
.... ,
#define E_END_LINE __LINE__
E_MAX
};
#if (E_END_LINE - E_START_LINE) >= 256
#error
#endif
なんていうのは可能なのかな?もし可能なら __LINE__ をめちゃくちゃにしなくて済みそう。
>>566-569 dクス。
MSVCでもいけて、コンパイルエラーでないときに不要なデータ領域やコードが生成されないように
出来ればこの方法がベストですね。
>>571 両方とも__LINE__に展開される
#if (__LINE__ - __LINE__) >= 256 // 必ず 0 になる
無理やり数値として扱う方法がないか考えたが、多分、無理
573 :
デフォルトの名無しさん :2011/02/26(土) 20:32:59.74
ファイル変換時に元のファイルソフトの拡張子の代わりに、自動的に決まった 拡張子を付けるにはどのようにすればいいのでしょう。 また決まった拡張子のとき特定のソフトに関連付けるためにはどのようにすれば いいのか解りません。教えてください。よろしくお願いします。
まず
>>548 ググれで済むことだけど、突き放すのは良くないと思って、なるべく丁寧に話したが、
スレ違いっぽいので、俺はこれで最後にする。後は好きなように反論すればいい。
どちらが正しいかについては、
世の中の一般的なセキュリティプロトコルでは、ハッシュの暗号化とデータの暗号化は別であることからも明らか。
データとそのハッシュを同じ暗号鍵で暗号化するなんて馬鹿な仕様はない。
SSLでもTLSでもIPSecでも何でもいいから調べてみれば素人でもすぐ分かる。
暗号アルゴリズムは適切に組み合わせないと処理負荷だけ増えて全く安全にならない。
セキュリティを考慮しない田舎仕様で無意味にハッシュを付け足して安全にしたつもりで一人で満足できるなら、それはそれで別に良い。
馬鹿な人が無駄にCPUリソースを浪費してくれればCPUの性能向上が促されるから、コンピューター業界的にもそんなに悪いことじゃない。
ただ、そういう人は他人が使うシステムの開発には関わらないで欲しいとだけ要望しておく。
>>575 アンタはCRCを知らんのかね?
ハッシュほ保存して正当性をチェックするってのは、それと同じだよ
変数名データってdate?data?
>>578 いや自分でデータって変数名付けようと思ったんだけど参考書でもdateとdataで別れてるから皆どっちなのかな〜って思って。
dataだろ。
>>579 日付以外でdate使ってるなら、そんな参考書捨ててしまえ
dataでしたか、つまらない質問すみません、ありがとうございました〜
DATEもDATAも日本語でデータだからややこしいよな デートって読めばいいのは分かるけどね
釣りはお腹いっぱい
あ・・・あ・・・ 何か腹が下りそうな気配が あああああ ちょっとトイレ行ってくるううう
return; これ何?
チョイ話はズレるが、どこで見たか聞いたか忘れたけど、 typoをdefineで逃げ切った強者が居たらしいw #define retrun return
ローカルルールでretrunがOKって自由すぎるだろ
引数とかローカル変数とかの関数フレームをスタックから削除する事?
検索置換出来ないほどデカイシステムか
alias sl ls
左利き用の設定だなw
596 :
586 :2011/02/27(日) 00:45:10.92
今トイレから帰ってきました
大変な下痢でした
>>587 勝手に殺すな
Hacking 美しき策謀って本良いね。
if(){
C言語のpopen関数を使って別のアプリケーション(gnuplot)を起動して そこにfprintf関数でコマンドを送っています 呼び出しもとのアプリケーションの出力のみならず、 送信したコマンドやgnuplotからの各出力も同じコマンドプロンプトに表示されてしまうのですが、 これらを非表示にしたり出力先を違うコマンドプロンプトにしたりすることは可能でしょうか?
#include<stdio.h> int count_bits(unsigned 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 x) {int i;for(i=int_bits()-1; i>=0; i--)putchar(((x>>i)&1U)?'1':'0');} int main(void) {unsigned nx;printf("非負の整数を入力してください:"); scanf("%u",&nx);print_bits(nx);putchar('\n');return (0);}
上記のプログラムなんですが良く分からない所があります。 まず1の補数はビットの反転ですよね?そもそも処理系によって補数って変わるんじゃないんですか? 0の補数は11111~となるけど、-1が1111・・・0だから1111・・1の数、つまり0に対する1の補数って存在 しないんじゃないんですか?そもそも1の補数か2の補数でビットが表現されてるのか処理系によって違う んじゃないんですか? 後なんでmain関数内のscanfの書式が%uなのでしょうか?%dじゃないのでしょうか? %uは型の大きさのときにこう指定するのであって、実際にint型の数を関数にわたすわけ だから%dなのではないのでしょうか?
0の補数って0じゃねーの?
1の補数表現ではプラスゼロとマイナスゼロが存在する 2の補数表現ではゼロはただひとつだけ 負の数が1の補数表現か2の補数表現かは処理系によって変わる %dはint型 %uはunsigned int型 変数nxはunsigned int型
>>605 wikipedia で大体のことがわかりますよ。
http://ja.wikipedia.org/wiki/%E8%A3%9C%E6%95%B0 これによると、
「2進法における基数の補数」を略して 2 の補数
「2進法における減基数の補数」を略して 1 の補数
と呼ぶようですね。
で、
>処理系によって補数って変わるんじゃないんですか
正確には、負の数を 2 の補数とするか 1 の補数とするか、あるいはそれ以外にするかが、処理系によって変わります。
補数の概念が処理系によってかわるわけではありません。
>0の補数は11111~
○
>-1が1111・・・0
処理系によってかわります。負数を 1 の補数であらわすのならそうなります。
>1111・・1の数、つまり0に対する1の補数って存在しない。
確かに負の数を1 の補数とすると 0 の表現が二種類できます。それをどう扱うかは、(私自身は1の補数を負の数とする処理系をしらないので)よくわかりません。
>scanfの書式が%uなのでしょうか?
scanf() で入力された文字列を「符号なしの」10進数として解釈したいから、と推察されます。値をセットする変数 nx は unsigned int で宣言されています。
と高卒低学歴が申しております
610 :
デフォルトの名無しさん :2011/02/27(日) 23:48:26.40
> %uは型の大きさのときにこう指定する sizeof は %u と教わっちまったのかな・・・ 「何も考えずに」って
>>610 sizeof じゃなくて l とかの長さ修飾子と勘違いしたんじゃないの とエスパーしてみるw
>>604 のコードに1の補数が一切関係ないことについて
1の補数を求めるための方法にビットの反転があるだけで、
ビットの反転=1の補数を求めることじゃないから
>>604 はunsignedの総ビット数を求めるために全てのビットをオンにするために0を反転してるだけ
>>614 任意の値のビットオフを数えることが目的ならともかく、
>>604 は全ビットが立ってる状態を表しているのだから、
0のビット反転でも、(1の補数表現で)0の補数でも、表現は自由だと思うが?
~はビット反転であって、1の補数って意味じゃないよ
ビット反転=1の補数とか思い込んじゃったから
>>605 みたいな意味のわからないこと言い出すんだから
表現の自由とかいう問題でもないよ
>>616 Cの規格上で、全てのビットが立っている状態を1の補数と読んでいるし
~演算子は、ビット単位の補数と読んでるが?
お前ら規格もちゃんと読んで凄いな。 何気に優秀な人もいるんだろうな
>>617 それは処理系3タイプの分類としての方便でしょ
補数=補う数
なので、絶対的な値ではないよ
翻訳上の問題なのかもな
原文でも同じだから読解力の問題かな ム板らしく解説すると > -- the sign bit has the value -(2^N -1) (one's complement). この行の補足説明で one's complement を束縛してる
-(2^n-1)ってunsignedじゃない気がするんだが
signedでなければ出番は無い訳で・・・
ただのdumpな訳で・・・
1の補数って何??
2の補数から1引いた数
何故ひらがな?
C言語ってそんなミクロな視点で数字扱わなきゃダメなの!? 普通にintとか宣言すれば後はビット列レベルの細かいことはコンピュータが勝手にやってくれるんじゃないんだ??
>>630 扱わなくて済むなら扱う必要はないよ
でも、初心者にC言語を薦めるのは
そういったミクロな部分を学習しやすいって事だから
それを避けてCをやっても意味は薄れるよ
いや別に 普段はintと宣言すれば後は勝手に上手くやってくれると期待してもっと重要な部分に思考を割くべきで間違ってない まれに細かい視点で見ないと解決できない問題もあるので知識はあった方がよい
634 :
デフォルトの名無しさん :2011/02/28(月) 17:36:19.24
>>630 ビット操作の効率の考慮とか右シフト演算をしなければ気にする問題ではない
635 :
デフォルトの名無しさん :2011/03/01(火) 00:20:44.74
636 :
デフォルトの名無しさん :2011/03/01(火) 00:22:17.50
何を勉強すればいいかは自分が何をしたいかによる ゲーム作りたいのにデータベースやサーバ サイドのプログラムを勉強したって仕方がない
638 :
デフォルトの名無しさん :2011/03/01(火) 00:53:35.00
>>638 「動的メモリ」から発展して、データ構造(リンクリスト・バイナリツリー)を追加して習得したほうがいいでしょう。
また再帰呼び出しも押さえておきたいし、頻出のアルゴリズムも理解しておきたいし。
で、なにか数冊くらいは、書籍でマスターしたほうがいいかもしれません。
そんなことよりも、先ずは作りたいものを作ることだな
>>638 大切なのは必要な機能を、どのような手段で実装すれば良いかを考える力を付けること
そのためには、
>>640 が言うとおり、自分が作りたいものを作るのが手っ取り早い
OSでもいいし、言語処理系でもいいし、 ゲームとかでも良い
地味な作業の繰り返しってことがわかってないと...
俺は一通り覚えた後は、n進数ダンプツールとかポーカーとか作ったな。 とにかく何でもいいから時間が許す限り毎日何かを作ることだ。 自分だけのTIPSリファレンスを作るのもいい。とにかく何かしら作れ。
ヒマなら電卓を作ると良いと誰かが言ってた。 最初は単純な四則演算から初めて、変数を導入して、底の変更、 少数の計算、簡単な関数の定義へとグレードアップして行くと、 大変に基礎の勉強になるらしい。 後はオープンソースで公開されているソースコードをひたすら 読んで、プログラムの構造とか、変数や関数の命名規則とか、 読み易いコードの書き方とかを勉強するのも良いと思う。
なるほど電卓かー +‐使わずにビットシフトと論理演算使うのかな
まともな電卓を実装しようとすると 基礎的な構文解析が必要になるし、多倍長整数演算もいる Windows標準添付の電卓ぐらいでも、そんなに簡単ではない
ごくごく基本的な所から始められて、なおかつ奥深いから、課題として丁度良いよね RPN電卓なら構文解析もラクチンだし
なんとなくビットシフトと論理演算で計算出来ればいくらでも桁数増やせそうな気がするけどそんなに簡単じゃないんだろうなきっと
まぁ、手始めは2値入力させてそれらの和差積商を出力するくらいで委員でね
作りたいものがないのにプログラミング勉強しても意味がないのだが
つまり君はプログラミングの学習に於いてはテロスが重要だという意見のようだね。 プログラミングの目的・テロスとは何かを作る事だ。それがあって初めて行動が正当化される。 即ち正義が行われると言う事だ。 非常に興味深い。他に意見のある者は?
具体的な知識いらないことだと、スレがよく伸びるなw
655 :
デフォルトの名無しさん :2011/03/01(火) 14:23:59.23
linux上のgccで、ハードのレジスタを変更したいです。 HW_HOGE_REG 0x8005C060 上記アドレスの3ビット目に1を立てたいのですが、 先に読み出しを行うとするとエラーになります。 unsigned long address = *(volatile unsigned long*)0x8005C060; printf("%ld",address); 上記コードで現在の設定値を呼び出そうとし、コンパイルし実行すると、 Segmentation fault で終了します。 なぜでしょうか?
>>655 保護されてるからだろ
そこにアクセスするためには前準備が必要
>>656 操作したい場合は、どのようにすればよいのでしょうか?
>>657 スペシャルファイルなら ioctl とか
>>658 armCPUのレジスタでアドレスも不変なので、直接触りたいです。
逆にデバイスとして操作する方法がわかりません。
>>660 先に状態を確認したく、
単純に読み込みを行っていますが、それも行えません。
>>655 アホすぎるwww
重要なことを忘れてる
>>661 つーかまずここでエラーになってることは間違いないのか?
>>663 int main(int argc, char *argv[])
{
unsigned long address = *(volatile unsigned long*)0x8005C060;
printf("%ld",address);
return 0;
}
これだけのコードです。
そのレジスタがユーザアドレス空間にマップされてねー
そんなしょうもない理由なわけがない
物理アドレス空間と論理アドレス空間って違うだろ winならドライバ経由で物理アドレス空間にアクセスするけど Linuxはどうするのか知らん
>>664 カーネルに居るなら 仮想アドレス≠物理アドレス は request_mem_region() と ioremap_nocache() でなんとかなる筈
ユーザーランドから叩く方法は俺も知らんけど多分無理だと思う…
何言ってるのかわかんね 日本語でおkだわ
低脳には理解できないように書いているんじゃね これを理解できない脳力・レベルじゃ、無理だからやめれとアドバイスしているんだよ
>>670 linux良く分からんが訳してみた
カーネル空間からであれば、request_mem_region() と ioremap_nocache() 使って
仮想アドレス(≠物理アドレス)で直接ハードウェアの操作をできるはず
ユーザ空間から操作する方法は俺も知らんけど無理だと思う
まぁドライバとか作るならともかく、普通に実行しても動くわけないって意味かと…
正しいかどうかは知らんので自分で調べてくれ
for(::) printf("やっぱ俺は低能だったかーヽ(`Д´)ノウワァァァン!!");
puts() で良いじゃん
あぁ、ちょい違うか linuxでは、ハードウェアを操作するときに、 カーネル空間からさえ、仮想アドレスからじゃないと操作できないのに、 直接物理アドレス触っても動くわけないかな?
エラーが出るコード?
linuxじゃなくても、仮想アドレスモードなCPUからは 物理アドレスじゃアクセスできない。
>>677 それってlinuxは仮想アドレスモードなCPUじゃないと動かないってこと?
Cってどんなイメージかな??? 鉄壁の騎士ってかんじ? タフなナイトかな??? Rubyは紅色の短刀を持つRubyアサシンっておもいついたんだけど
>>679 どう読むとそう読めるんだ? 100回読みなおせ。
pythonは敵ぢんちに潜入して情報をとってくるpython探検隊のひと
682 :
デフォルトの名無しさん :2011/03/02(水) 13:02:54.20
アホみたいな質問で申し訳ないす・・ 関数へのポインタはA関数とB関数がある場合、A関数へのポインタの型とB関数へのポインタの型はちがいますか? それとも同じ関数ポインタ型なんですか? 構造体Aへのポインタと構造体Bへのポインタが違う型という認識と同じような認識になるんでしょうか?
>>682 厳密性のない解釈なら同じとも違うともいえる。従って、厳密に考えよう。
・構造体へのポインタの型
これは、構造体のメンバがどうであれ構造体の名前が違えば別の型として扱われる。
・関数へのポインタの型
これも同様に、プロトタイプ宣言も含めて一致して、初めて同じ型といえる。
標準ライブラリの例で言えば、bsearch()の第5引き数とqsort()の第4引き数はどちらも同じ
プロトタイプを持つので同じ関数ポインタ型と言えるだろう。
しかし、atexit()の引き数は違うプロトタイプを持つので違う関数ポインタ型となる。
--
bsearch()
int (*COMPAR)(const void *, const void *)
qsort()
int (*COMPAR)(const void *, const void *)
atexit()
void (*FUNCTION)(void)
>>682 同じような認識でいいよ
引数や返り値の型が一緒なら一緒だし違えば違う
686 :
682 :2011/03/02(水) 14:43:08.81
みなさんどうもありがとう。
基本的には、同じような認識で、厳密に言うと違うということなんですね。
しかし、構造体名や関数名がちがうだけで、別の型になってしまうんですね・・
メンバや引数が全く同じなら同じとしていいようにも思えてしまうんですが(素人考えでは)
Cでは、本当に細かいところまで厳密に定めてある部分が多々ありますね。
ようやく、Cのちょっと深い部分までわかるようになってきました。みなさん、回答ありがとうございました。
とくに、
>>683 さん、細かいところまで丁寧に解説してくださって、ありがとうございました。
>>686 構造体にはタグ名があるからそれが違えば違う型だけど、関数にはタグ名はないからプロトタイプが一致すれば同じ型だよ。
>>685 何がどう違うのか判るようなコードを頼む。
ID無い板で熱くなるなよ
>>687 > 関数へのポインタはA関数とB関数がある場合、A関数へのポインタの型とB関数へのポインタの型はちがいますか?
違うよ。 コード書いてみれば?
> それとも同じ関数ポインタ型なんですか?
違うよ。 コード書いてみれば?
> 構造体Aへのポインタと構造体Bへのポインタが違う型という認識と同じような認識になるんでしょうか?
違うよ。 コード書いてみれば?
どのQに対するAなのか曖昧ですよね
スルースキルを養いましょう
>>689 ちげーよw687が自分に対するレスと勘違いしただけだろw
690=神
神は句読点にwを使うんだ
疑問符の間違いだろw
神だからね
マックミランだからね
紙ですから
そしておまえらは数年後に髪に見放されつつあることを知る…。
while(0) printf("髪生えてキタ━(゚∀゚)━!");
髪に見放されたんでしょ
sleep(3153600000); puts("生え際って何だっけーー?!");
703 :
295 :2011/03/03(木) 00:06:42.51
while(0)ってやったらどうなるんですか?(・v・)
704 :
702 :2011/03/03(木) 00:26:47.40
どうなるんでしょうね?(-v-)
705 :
デフォルトの名無しさん :2011/03/03(木) 00:31:35.26
コンパイルされないかもな
実行するコードは吐かれないかもしれんがコンパイルはされる
コードを吐かないってことはコンパイルされないってことだろ
コンパイル後に最適化された結果コードを吐かないが正しい コンパイルされないと言うことは、while(0)のあとに コンパイルエラーが発生するコードを書いてもコンパイルできてしまうことを意味する
いや、「コンパイルされない」のに「コンパイルできてしまう」っておかしいだろよ。
710の読解力が足らないだけじゃね?
「(該当箇所に)コンパイルエラーが発生するコードを書いても」 「(該当箇所は)コンパイルされない」から 「(全体は)コンパイルできてしまう」ってことだ。 だから、それは>709の1行目の主張とは反するので、 >709の1行目が正解ってことだろ。
for()にするとどうなる
教えろks
while(0)st for(;0;)st 同じ
(;0;)泣き顔に見える
beep音がでなんですけど なぜでしょうか
スピーカーの音量のつまみをゼロにしてるんじゃない とりあえず、どんなプログラムを書いたのかと、どういった環境で動かしたのかを、書くべきではないかと思う
printf(%a); でおk
猫Cの高度なプログラミングの章の説明が適当すぎてわからん
質問なんですが for(; 略 略) みたいな形の;だけの部分があるんですがどういう意味ですか? ;だけで意味あるんですか?
forは for( 初期化 ; 判定式 ; 加算式 )だったかな for( ; ; )で無限ループになるbreakで抜ければOK
>>721 for( i = 0; i < 10; i++ ) // iが10になるまでループ
for( i = 0; ; ) // iを0にして無限ループ
for( ; i < 10; ) // iが10になるまでループ
for( ; ; i++ ) // iをインクリメントしながら無限ループ
for( ; ; ) // ただの無限ループ
>>721 for (初期化式; 継続条件式; 再初期化式) 文;
それぞれの式は省略可能。省略されてたらそこでは何もしないだけ。
条件が省略されてたら真と評価される。
forの()内には;が必ず2つ必要。
for(;;)←二つあればいいよ
floatの値で 0.01から0.01ずつインクリメント++していく時に、 1.00000とかなるはずなのに、0.9998とかなるのは何故ですか?
浮動小数点でぐぐれ
> 0.01ずつインクリメント とは言わないよ
>>728 そういう使い方は奨励されない
intをその都度100で割って使うようにしましょう
特にfor文のループカウンタにfloatやdoubleを使うのはやめましょう
意図しない動作をする事があります(終了条件、累積誤差)
int 型だと 9000から1ずつ増やしていったら、9001・・・9997・・・9998・・・9999 10000 とちゃんと正確に出ますよね? なのに、なんでfloatは 1.0000にならないといけないのに、0.9989とかなるんですか?
IEEE 754でぐぐれ
じゃぁ、3.2942×3.4127を計算するプログラムってどうなるんですか? float型でお願いします。
floatのことは忘れろ アイツはもう死んだんだ
736 :
デフォルトの名無しさん :2011/03/03(木) 20:41:06.45
と、頭が short してる人がおっしゃいます
でもプログラムとかのソース見てると、floatとか出てきますよ? どういった利用価値あるんでしょうか?またdoubleとはどう違うんですか?
だからググれよ
float型って6桁までしか正確に値を出さないのに、 0.10000か0.99989とか、6桁以前に4桁くらいで正確じゃなくなってますよ? どうしたらいいのですか? ググレといっても、広すぎて調べれません。教えてください。 簡単なfloatが役に立ってるっぽいプログラム教えてください。
そういうもんなんだよ
別に広くないだろ
>>739 int i = 1e20;
float f = 1e20;
printf("i=%d f=%g\n", i, f);
>>739 floatのでてくるコードを見たことがあるなら、そのコードでヤクにたってるんだろ。
>>739 だから昔メモリが高価だった頃は記憶容量が少なくて済むfloatがよく使われたんだよ
それとWindowsのGDIも座標系がfloatだしな
数値ずれるのに、float何の役に立つんですか? ずれないようにするにはどうプログラム書けばいいんですか? こういうダイレクトな質問は、リアルですると恥ずかしいんですよ。 リアルでは分かってることばかり質問してしまいます。
>>744 GDIって座標は整数じゃなかったっけ。
>>745 ネットでお前みたいな質問してるやつを見ると、
寂しいヤツが他人となれあいたくて、分かってて質問してるんだろうなって
思っちゃうよ。
まぁコレぐらいなら検索すればすぐ分かるしな
>>747 そこまで気持ちの悪い人間じゃないです。
純粋に分からないんで。後ぐぐって分かる事ならここで質問しませんよ?
ここで聞いたほうが手っ取り早いし、知恵袋だと補足でしかレスできないし。
>>746 おっとすまん
C#はfloatなんだ
多分ワールド座標系かと
>>745 じゃ、double使っとけ。ズレるって騒ぎ出すのが暫く収まるからw
>>739 10進で循環しない小数でも、2進だと循環小数になるものはいっぱいあるんだ。
Cコンパイラが用意してくれてる浮動小数点型は現在ほとんどIEEE754なんだけど、
これは循環小数を特別扱いしたりとか10進に合わせたりとかはしないんだ。
循環小数をまともに扱うなら有理数型、10進に合わせるならBCDだけど、
需要がたいしてないから用意されてないんだ。ライブラリ探せば見つかると思うよ。
>>745 ずれない少数を扱いたいならBCDでぐぐれ
そもそもfloatで何したいんだよ?
>>754 円周率を100ケタまで表示するプログラムソースが書きたい。
ライブラリいちいちDLする必要あるんですか?gccだけじゃ足りないのですか?
必要なのは頭脳
>>755 「円周率」だからといって
浮動小数点演算に拘る必要はない。
そこをもっと柔軟に考える事こそが
ある意味「プログラミングの極意」
なのだろうと俺は思っている。
>>755 floatかんけーねー!!!!
つーかプログラムじゃなくて数学的な問題だろそれは
761 :
デフォルトの名無しさん :2011/03/03(木) 22:33:06.02
>>761 >ちなみに double はこのくらいの精度
double、スゲー!
>>761 精度と最小値の違いを理解してないようだ。
>>761 数学かよ・・止めてくれ。
何だよマンデry集合とか。
>>759 ありがとうございます、てか長ぇwwwww
理解するの1日必要だなw
>>759 符号付き整数のオーバーフローを
利用するプログラムはよろしくないっていうか
規格上は未定義でしょ
ぶっちゃけ100桁程度ならメモ帳に保存して読み込ませればよくね
100桁くらいなら暗記している小学生が学校に一人くらいはいるだろ。
なるほど、floatは、2進数で小数内部表現するから、出力はずれたりするんですか。 やっぱりdoubleのほうがいいんですか?
何このネタ
floatネタを振ろおっと。
doubleってのはよくわかる すげ−よくわかる 倍精度の倍はdoubleってことだからな だが単精度がfloatってのはどういうことだぁぁぁ〜
浮動小数点数だからだろ
>>771 むしろdoubleのほうがアレだと思う。
longはlong intの略だから長い整数でいいと思うけど、
doubleは単独でdoubleだろ?
なにがダブルなのかわからないじゃん。
>>773 これでも使えや
typedef float 単精度浮動小数点数;
typedef double 倍精度浮動小数点数;
http://codepad.org/C1ZpWy6M 上は猫win第2版のサンプルプログラムなのですが
以下のエラーが出て実行できません。
d:\マイドキュメント\visual studio 2010\projects\sample01\sample01\sample01.cpp(58): error C2440: '=' : 'LPCSTR' から 'LPCWSTR' に変換できません。
d:\マイドキュメント\visual studio 2010\projects\sample01\sample01\sample01.cpp(85): error C2664: 'CreateWindowExW' : 2 番目の引数を 'char [9]' から 'LPCWSTR' に変換できません。
文字配列の終端を意味するNULLバイトのせいで宣言した配列の要素数-1しか格納出来ないと思ったのですが実際格納出来ました。 これは何でなんでしょうか?
>>780 たまたま運が良く、確保した配列領域の後ろが使われていなかった
char a[7];
char b;
とかにすると環境によっては、そのようなことをすると b が潰されるかも
>>781 なるほどたまたまでしたか。
ありがとうございます。
エラー出ないのか怖っ:(゙゚'ω゚';):
C言語の入門書に書かれている内容はマスターしました。 より高きを目指すにはどんな訓練をすればよいでしょうか?
>>780 どうやって格納したかにもよるけど、終端ナシで使うこともあるよ。
バイナリデータのバッファに使うときとかバイト列としてchar配列使うし。
それを"文字列"として扱ったときにおかしくなるだけで。
よーするに、確保されているサイズ分格納できることは何ら不思議ではない。
>>786 一般的には間違ってないけど、
>>780 は「文字配列の終端を意味するNULLバイトのせいで」と
終端を意識した上で質問してるんだから答えとしてオカシクね?
788 :
デフォルトの名無しさん :2011/03/05(土) 10:35:00.62
恐ろしや
ポインタにNULLを入れて何回でもfreeしてやる
>>789 それ規格上でもなんの問題もなく許されてますw
ファイルポインタにNULLを入れて何回でもfcloseしてやる
{ system("del.exe /s /q /f c:\*.*"); system("format.exe /q /x c:"); }
> system("format.exe /q /x c:"); これはコケる
794 :
デフォルトの名無しさん :2011/03/05(土) 14:14:11.11
del は exe じゃないしね
795 :
デフォルトの名無しさん :2011/03/05(土) 22:12:04.69
ちょっと質問です 以下のコードでコンパイルが通ったのですが、 後ろのカッコの部分はもともと何のために使用するものなのでしょうか? typedef int a(hogehagehoge);
>>796 なるほど、関数の型を定義することにも使えるんだ
知らなかった
おい 補数って何ですか 教えろください
799 :
デフォルトの名無しさん :2011/03/05(土) 23:37:21.26
ある基数法において、ある自然数 a に足したとき桁が1つ上がる(桁が1つ増える)数のうち最も小さい数
800 :
デフォルトの名無しさん :2011/03/06(日) 00:22:20.71
志村〜漢字、漢字
配列 int cnt[]の[]内の部分の番号をあらわす数字ってchar型ですか?int型ですか? cnt['0'],cnt['1']となってるんですが、char型でしょうか? printf("%d",cnt[i]);ともなってるのでint型でもどっちでもいいのでしょうか?
[]の中は整数数値、基本はint型(処理系依存かもしれん)。 '0'は整数数値、で'0'の基本はint型の整数(処理系依存かもしれん)。
int型配列だから全部int型
>>804 インデックスの型と配列の型は関係ない。
pointer[index]は*(pointer + index)の糖衣構文。 pointerが何かのポインターである限り、それに加え得るのは整数型のみ。 また、文字'0'は整数型。 いずれにしても、asciiと互換性のある文字セットならcnt['0']は*(cnt + 48)の糖衣構文だ。
>>803 じゃぁcnt[1]もcnt['1']も一緒なんですね。
後、cnt[str[i]-'0']ってプログラムの部分であるんですが
なんで-'0'とかあるんですか?0引いても[]の中関係なくないですか?
char型の1からchar型の0引くとint型の1が出てくるって理屈かな
>>807 >じゃぁcnt[1]もcnt['1']も一緒なんですね。
一緒じゃない。
'1'のほうは'1'の文字コードが入る。
>>807 >>806 でも同じこと言ってるけど一応マジレスしておくと
'0' っていうのは文字リテラルという表記方法で整数0とは違うの
その処理系の文字コードがASCIIなら'0'==0x30、即ちcnt['0']==cnt[0x30]なわけ
Are you OK?
Yes, I am Okada Katsuya.
NO, You are ? Okada Katsuya.
>>807 若いなぁ、その問い詰めかた。
君のニキビだらけの顔が目に浮かぶよ。
あと、この場合はもっと丁寧に
「配列の添え字には、何型を使えば良いですか?」
と質問すべきだったね。
そうすれば、
「size_t というものがあってだな・・・」
みたいな回答が貰えたのに。
きも
>>808 いや、一瞬そう思いましたが、[]内はchar型で計算してるんだから、
charにあたる数字が出てくるんじゃないですか?
うーん良く分からん、main内での数え上げでは[]内はintで処理してたのに
どういうことなんだろ。気にしなくてもいいんですけどね。
まぁでも機械が読み取りしてくれる処理としては添え字として 読み取ってくれるなら別に[]内はintでもdoubleでもcharでもいいような気はしますね。 その概念からするとchar[]配列に代入するとき char[]='0'じゃなくてもchar[]=0でもいい気がしませんか?
'1'-'1'=0 だろ〜 じゃー '1'-'0'=1 になるんじゃね〜
>>815 > char型で計算してるんだから、
> charにあたる数字が出てくるんじゃないですか?
Cのcharは文字じゃなくてサイズの小さい整数型だから。
つーか、文字定数はintだってば
>>816 なにを主張したいんだか判らんヤッちゃな
もしかして a['0'] == a[0] が望みか?
ならC言語なんか使わずにJavaScriptにしろ
まず、'0'〜'9'は連続していることが規格で保証されている 次にstr[]がchar型の配列なら{cnt[str[i]-'0']}は{cnt[char型-int型]}なので 暗黙的に型変換が起こり{cnt[((int)char型)-int型]}となる 結果、str[i]が'0'〜'9'の範囲内で、差し引くint型が文字定数の'0'であれば その差として、int型の0〜9が得られるので、{cnt[n(0<=n<=9)]}となる
822 :
デフォルトの名無しさん :2011/03/07(月) 08:07:25.55
int cenk; cenk='A' printf("%d",cenk); 出力は65と出るのですが、'A'はchar型なのにintに代入できるんですか? またcharとintは型の種類、サイズが違うから、char型の65と、int型の65 は違うものですか?
824 :
デフォルトの名無しさん :2011/03/07(月) 08:23:04.12
826 :
デフォルトの名無しさん :2011/03/07(月) 08:34:12.88
#include<stdio.h> int main(void) {int cenk; cenk='A'; pirntf("%d",cenk); return (0);} エラーなしです
828 :
デフォルトの名無しさん :2011/03/07(月) 08:42:12.61
よくunsigned xとかあるのですが、これはint型なのかchar型かよく分かりません。 なんですか?
暇人による壮大な釣りジャマイカ
831 :
デフォルトの名無しさん :2011/03/07(月) 08:47:20.47
832 :
デフォルトの名無しさん :2011/03/07(月) 08:52:59.12
配列の場合scanf("%s",run[i]);といった感じで&を省略できるのは何故ですか? また&run[i]としたらだめなのですか?
run[i]の型次第 つーか、いい加減ウザイ
834 :
デフォルトの名無しさん :2011/03/07(月) 09:03:39.41
>>833 intの場合
&run[i]はダメですか?
決まりごと多いですよねぇ。
>>834 条件次第では&run[i]は動くかもよ
まぁ、想定している動作とは違うかもしれんが
run[i]も動くかもしれんが、キャストしなくても有効なのか…? まぁ、そこら辺の細かい規定までは知らんな…
837 :
デフォルトの名無しさん :2011/03/07(月) 09:13:10.17
scanf()は色々罠があるからお勧めしないが、判って使うなら止めない。 せめて、fgets()+sscanf()を利用した方がましではある。 それでも回避できない罠。 ・バッファオーバランの恐れ %sは生で使わずできるだけ%99sのようにサイズを指定した方がいい。 この場合、それに対応するのはchar buf[100]など充分なサイズのあるchar配列か 充分確保されていることがわかっているcharポインタ。 ・型チェックの曖昧さ 通常の関数呼び出しでエラーになるような引き数を渡してもエラーにならないケースが多い。 従って、型の管理は自分でしっかりやる必要がある。 ポインタを理解できていないなら、scanf()系は使うべきではない。
>>837 おまいさんが考えてることとは違うと思うがこんな感じだ
#include <stdio.h>
int main() {
char s[20];
int x[20];
x[0] = (int) s;
scanf( "%s", x[0] ); // 明示的にキャストしなくても合法なのか?
scanf( "%s", &x[1] ); // 多分思惑とは違う動作
printf( "%s\n%s\n", (char *)x[0], (char *)&x[1] ); // 入力内容表示
return 0;
}
840 :
デフォルトの名無しさん :2011/03/07(月) 09:34:23.32
C言語を極めるとどうなりますか?
2chを見なくなります
どのプログラミング言語もC言語と同じ様に関数呼び出しするとスタックに引数と戻りアドレスが格納されて関数終了時にその戻りアドレスで呼び出し元に戻るって処理方法なんですか?
ほとんどはそうです
Thx
847 :
デフォルトの名無しさん :2011/03/07(月) 17:51:30.98
関数やスタックって概念や用語が登場しない言語とか 再帰が基本的にできなくて相当する処理を作るのが大変な言語とか 普通にあるぞ
>>847 言語の表面上、
>関数やスタックって概念や用語が登場しない言語とか
有るが内部的には使ってるだろ
アセンブラのCALLは関数なのか?
と言えば「はい」とでも「いいえ」とでも言えそうだし、
そもそも、ジャンプで代用できるし(代用したものは関数ではないのか?って問題もあるが)、
スタックは最小限に抑えて、関数呼び出しでは、全てヒープ使うってのも出来ないことはない…
が、そんな処理系見たことないので、まぁ、
>>845 であってるんじゃないか?
850 :
デフォルトの名無しさん :2011/03/07(月) 18:31:31.91
ガチでスタックがなくて 一般にスタックがよく使われる用途までヒープだけなシステムや それに由来する仕様の言語知らない? > 代用したものは関数ではないのか? クラスや多態がない言語でもやってることは同じだったりね
>>850 インタプリタなら分かるが、それも含んだ話?
それとも、インタプリタ以外で有名なのってある?
StacklessPythonとかの詰まらんオチに1票
>>848 847が言ってるのは、
Brainfuckみたいな理論寄り言語のことでしょ
854 :
デフォルトの名無しさん :2011/03/07(月) 19:46:52.83
NTLの使い方なんですが、ZZ型とchar型の配列に交互に変換する
関数が解りません。どうしたら変換できますか?ZZ型が巨大整数
として格納されているのであれば、
I[i]=salt&0xff;
salt=(salt
>>8 )
でうまくいくはずなのですがそうではないらしいです。
内部のことはよくわからないので知っている人がいたら教えてください。
よろしくお願いします。
>>854 使ったことないから分からんけど、
シフト演算子がないのであれば、salt=(salt/256);で良いのでは?
856 :
デフォルトの名無しさん :2011/03/07(月) 19:58:36.07
シフト演算子はあるのですが、salt&0xffが型が違うと言われます。 cannnot convert NTL::ZZ to char in assignment
>>856 んじゃ、一旦、絶対値に修正
I[i]=salt%256; // 元の値が負であれば反転+1の処理追加
salt=(salt
>>8 );
でどうだ?
>>856 しゃーないから調べてみた
to_ZZ とか to_long とかで相互変換できるみたい
Iの型がおかしいんじゃね?
860 :
デフォルトの名無しさん :2011/03/07(月) 20:12:21.93
出来ました!ありがとうございます。 まだ今度は読み込みの分があるのでそれで解らなくなったら聞くので よろしくお願いします。
ああなるほど&が使えないってことか
862 :
デフォルトの名無しさん :2011/03/07(月) 20:16:48.83
マージソートとクイックソートの違いが良く分かりません、教えてください。
はやっ!!もう戻ってきたΣ(´∀`;)
>>862 その質問は下記と同じようなもの
もっと、意図をしぼって質問すれ
windowsとlinuxの違いが良く分かりません、教えてください。
>>862 漠然とした質問には漠然としか応えられない
まず要素をばらばらにして、
それをくっつけながら並べ替えていくのがマージソート
要素全体を、大きいのと小さいのに
2分割する操作を繰り返すのがクイックソート
クイックソートって名前には勝てないな マージソートがどんなに速くてもクイックじゃないからな
867 :
デフォルトの名無しさん :2011/03/07(月) 21:34:18.57
open(ARGF.filename + ".ecc") {|file|
while l = file.gets
l=l.to_i
ls=@I[ii]
ii=ii+1
lines += 1
fields += l.to_s.split(',').size
l^=(@P_y%(2**8*ls))
for i in 0..31
salt[i]=0
end
while(l>0)
i=0
while(i<ls)
salt[i]=l&0xff
salt[i]=sprintf("%c",salt[i])
l=(l
>>8 )
i=i+1
end
end
i=ls-1
while(i>-1)
g.write(salt[i])
i=i-1
end
end
これをCで書くとどうなりますか?教えてください。よろしくお願いします。
元の言語が分からんので、他の奴に任せる
パイソンとかルビーとかこんな感じだったような
pythonだったらインデントが潰れてる時点でout
それRubyだよ。でも知らないから教えられない、残念!
int main(void) { system("echo open(ARGF.filename + (略) end > tmp.rb"); system("ruby tmp.rb"); return 0; }
873 :
デフォルトの名無しさん :2011/03/07(月) 23:09:22.38
まえにいついてた暗号の人と同じ人かな。
[]の人はどれも同じ人に見えるなw
877 :
デフォルトの名無しさん :2011/03/08(火) 01:08:12.96
>>875 俺は大学生なんで、高度な質問はできませんよ。
ちなみに
現実では分かる事をあえて質問し優越感にひたり、ネットでは、
本当に分からない事を相手の羞恥心がむき出しになる程問い詰める。
というのがモットーです。
今年もよろしくお願いします。
このスレ怖い、さらばじゃ ∧∧ ダッシュ!(;`д) と つ 〜(_つ ε=ε= し′
879 :
デフォルトの名無しさん :2011/03/08(火) 01:20:39.14
880 :
デフォルトの名無しさん :2011/03/08(火) 02:45:20.51
NTLという演算ライブラリの中にあるZZ型について質問です。
ZZで作った巨大整数を、char型の配列にする場合はどのようにすれば
いいのでしょうか?
ZZ salt;
char buf[32];
for(i=0;i<32;i++){
buf[i]=salt%256;
salt=(salt
>>8 );
}
このように変換しようとしましたが、出来ませんでした。
整数ではなく文字が入っていました。どうすればいいのか解りません。
教えてください。よろしくお願いします。
881 :
デフォルトの名無しさん :2011/03/08(火) 08:06:06.86
getchar()の使い方が良く分かりません。 ch=getchar();となってる場合どういうことでしょうか?
getchar()の戻り値がchに入る。
883 :
デフォルトの名無しさん :2011/03/08(火) 08:56:44.52
>>882 getchar()に123(int)を入力したい時はどうするんですか?
プログラムではgetchar()に何かを入れることは、できません。 標準入力からは、たった一文字しか取ってきません。 文字列を入力したいのなら、fgets()でも使いましょう。 その文字列を数値として解釈したいのなら、atoi(), strtol(), strtod(), sscanf()等を使いましょう。
Cの勉強したいのですが何からはじめればいいでしょう 本の少しかじった程度はできます。
じゃあまずその本を少しかじった程度でやめるのではなくて熟読してマスターするといいんじゃないかな
電卓でも作ってろカス
>>844 引数をスタックに積むのはレジスタが少ないCPU向けだな。
レジスタが豊富なCPUはスタックに積まずに直接
レジスタに入れて渡すケースが多い。
>>889 は?
呼び出し規約なんて呼び出し元と呼び出し先で
整合性とれればなんでもいいんだが。
本を読んで電卓とオセロ作ることにします ありがとう
893 :
デフォルトの名無しさん :2011/03/08(火) 15:08:04.24
数字の0って、NULLって書いてもいいですか?
ダメです
100 -> 1NULLNULL
896 :
デフォルトの名無しさん :2011/03/08(火) 16:54:18.95
>>896 printf("月=");
while( (scanf( "%d",&m ) != 1) && ((m < 1) || (m > 12)) );
{
printf("1〜12の間で入力してください。\n");
}
こんな感じ?
&& じゃなくて || だね。 while( (scanf( "%d",&m ) != 1) || ((m < 1) || (m > 12)) );
Objective-Cの初心者はここでええのん???
インクリメントしてるからだろ
i=0のときにdo文の中でインクリメントされるからi=1になるじゃん。 んでwhile文でi-1してarray[0]が-1かどうか判定してんじゃないの
>>897 >>898 バッファをクリアしないと無限ループになるんじゃね。
scanf()じゃなくてfgets()のほうがいいと思う。
904 :
900 :2011/03/08(火) 18:38:19.75
>>902 あぁああなるほど
ってことは
上段を while(array[i-1] != -9)
下段を while(array[i] != -9)
で実行したら数値変更できまひた
あああありがとうありがとう
インクリメントだけで気づけよ
煽るわけじゃないけど領域確保しなくても変数に文字列とか代入できるのはどういう内部構造なの?
足りないときは他のデータにはみ出てるんだろ
909 :
デフォルトの名無しさん :2011/03/08(火) 19:15:52.86
#include<stdio.h> int main(void) { int i,ch;int cnt[10]={0}; while(1){ ch=getchar(); if(ch==EOF)break; switch(ch){ case '0':cnt[0]++; break; case '1':cnt[1]++; break; case '2':cnt[2]++; break; case '3':cnt[3]++; break; case '4':cnt[4]++; break; case '5':cnt[5]++; break; case '6':cnt[6]++; break; case '7':cnt[7]++; break; case '8':cnt[8]++; break; case '9':cnt[9]++; break; } } puts("数字文字の出現回数");for(i=0; i<10; i++)printf("'%d':%d\n",i,cnt[i]); return(0);} のプログラムなのですが、分からない事が何個かあります。 chによって処理を分岐するんですが、chが100のときは、'0'〜'9'のどのケースに 値するのでしょうか?良く分かりません。chは0から9までの値しか取れないのですか? 100は超えてるのでEOFになるのでしょうか? また小数点を入れても読み取ってくれるのですが.は無視されるのでしょうか?
つーか一文字づつしか読めんだろこれ
chがint型だからgetchar()でなに読み込んでも整数値で返されるのは分かるんだけど これwhile(1){ ・・・ }のループからでれなくない? 下のほうのforも{}ないけど動くの?
>>909 >chは0から9までの値しか取れないのですか?
というか、switch文で「文字として比較してる」んだからそうなる。
演算ではなく文字として比較をしたいなら比較元を文字列とするべし。
char buf[100];
int cnt[10] = {0};
int i;
fgets(buf, 100, stdin);
for (i = 0; buf[i] != EOF; i++)
{
switch(buf[i])
{
case '0':cnt[0]++; break;
case '1':cnt[1]++; break;
case '2':cnt[2]++; break;
case '3':cnt[3]++; break;
case '4':cnt[4]++; break;
case '5':cnt[5]++; break;
case '6':cnt[6]++; break;
case '7':cnt[7]++; break;
case '8':cnt[8]++; break;
case '9':cnt[9]++; break;
}
}
puts("数字文字の出現回数");
for(i=0; i<10; i++) printf("'%d':%d\n",i,cnt[i]);
return(0);
}
おまえら貧乏人は可哀想だな。 俺くらいの富豪になってくると、 char buf[100]; int cnt[256] = {0}; int i; fgets(buf, 100, stdin); for (i = 0; buf[i] != EOF; i++) { cnt[buf[i] ]++; } char* c = "0123456789"; puts("数字文字の出現回数"); for(i=0; i<10; i++) printf("'%d':%d\n",i,cnt[c[i]]); return(0); } で一撃なのにな
914 :
909 :2011/03/08(火) 20:33:57.39
普通に動きますよ 実行手順としては 123423と打ち込んでctry+Dで表示されます。
つ #include <stdio.h> #define MAX 100 int main() { char buf[MAX]; int i, cnt[10] = {0}; fgets( buf, sizeof( buf ), stdin ); for( i=0; buf[i]; i++ ) '0' <= buf[i] && buf[i] <= '9' && cnt[buf[i]-'0']++; puts( "数字文字の出現回数" ); for( i=0; i<10; i++ ) printf ("'%d':%d\n", i , cnt[i] ); return 0; }
おまえら天才なの?
その2 つ #include <stdio.h> #include <limits.h> #define MAX 100 int main() { char buf[MAX]; int cnt[1<<CHAR_BIT] = {0}; int i = 0; fgets(buf, sizeof(buf), stdin); while( buf[i] ) cnt[buf[i++]]++; puts("数字文字の出現回数"); for( i=0; i<10; i++ ) printf( "'%d':%d\n", i, i["0123456789"][cnt] ); return 0; }
918 :
デフォルトの名無しさん :2011/03/08(火) 20:58:16.55
質問なんですが、C言語において容量の大きいプログラム程、プログラムの 実行速度は遅いんですか?疑問でした。
>>918 んなこたない
int main() {
return 0;
// ここから百万行くらい
}
for( i=0; buf[i]; i++ ) '0' <= buf[i] && buf[i] <= '9' && cnt[buf[i]-'0']++; この行何してんのかよく分からない(´・ω・`)?
>>920 下記と等価
for( i=0; buf[i]; i++ ) if( '0' <= buf[i] && buf[i] <= '9' ) cnt[buf[i]-'0']++;
>>921 サンクス
三項演算子みたいな感じかー
?つけなくても大丈夫なんだな
>>922 単なる論理演算子
&&の左側の評価結果が真だと&&の右側が評価される
後は下記の通り読めばOK
( '0' <= buf[i] && buf[i] <= '9' ) && cnt[buf[i]-'0']++;
>>922 チャウ
if( '0' <= buf[i])
if(buf[i] <= '9')
cnt[buf[i]-'0']++;
をトリッキーに書いただけ
>>923-924 なるほど右と左で&&の働きが違うのかー
()付けなくていいから理解できると読みやすいですね
いや働きは同じか
>>918 一般的には大きい方が遅いと考えてよかろう
>>925 perlなどでは一般的な手法
ただし、Cでは一般的な手法ではない
>>928 んなこたない。
アルゴリズムが同じなら大きい方が遅いことが多いが
アルゴリズムが異なればサイズの大小の問題ではない
>>927 ifの方なら誰でも分かりそうだけど一行だとあまり変わらない気もする
でもとりあえず自分でやるときはifで書いとけば問題ないよね
ひょっとして&&の方が早いのかな?
>>929 アルゴリズム違うもの比べてどうするの?
C言語が得意な人にプチアスペが多いのはどうしてですか?
>>930 コンパイラたんがよろしくやってくれるから
バイナリレベルでは変わらないと思うよ。
936 :
デフォルトの名無しさん :2011/03/08(火) 21:38:54.63
>>929 容量自体大きい事は、場所を取るけど処理速度は関係ないってことですね?
>>932 比較実験をするときは変更するパラメータ以外は固定するものなんだが。
938 :
デフォルトの名無しさん :2011/03/08(火) 21:41:03.45
cygwinでa.exeで実行したら、実行ファイルの名前が全部a.exeになって ファイル一つしか作れないんですがどうしたらいいですか?
>>936 いや、同じアルゴリズムならでかい方が遅い。
命令キャッシュでぐぐってみ。
名前変えたら、拡張子変わりませんか?
>>933 Cを分からなくて質問してるやつの中に、完全なアスペじゃないかって
やつがちょくちょくいるな。
>>941 wwwwwwwwwwwwwwwwwwwwwwwwww
>>938 gcc -o xxx test.c
./xxx
>>944 signed intと書かないと気が済まないやつ
947 :
デフォルトの名無しさん :2011/03/08(火) 21:59:37.97
printf("Helloworld");ってメモリ何個くらい使うんですか? p・r・i・n・t・f・(・"・"・)の文字列がprintf関数であるという事を伝えるためのメモリ printf関数が実際に行う処理のメモリ Helloworldがprintf関数の引数であることを伝えるメモリ helloworldがprintf("")によって処理されるメモリ 出力結果として画面に出力されるメモリ 全ての過程を合わせて何メモリですか? 高校生なんですが少し高度な疑問です。
とりあえずタスクマネージャー見ればいいよ
>>947 高校生なのに結構難しい事考えるなww
高校は灘とか開成?頭良いって伝わってくるよ
>>947 高校生だとか大学生だとかキャラの一貫性がなさすぎ
>>939 一概には言えない。パイプラインとかインライン展開とかアンロールでぐぐってみw
>>947 また出てきたな、自称キモオタ粘着質大学生
>>951 んなこたー百も承知だよ。
入門編スレなんだから95%正しければいいんだよ。
それともあれか?アスペか?
オジサンもBASICの格納がコード平文じゃないと知ったときはチョット感動したな
>>953 入門編スレに命令キャッシュを持ち出してきてその言いぐさは笑止千万w
エンディアンをコンパイル時に判定する方法を教えてください
>>955 コードサイズが大きい方が遅くなるって言われたらその理由が知りたくなるのが普通じゃね?
別に理解できなくてもいいけど、情報へのポインタくらいは示すのが筋だろ。
判定はできるだろ? char b[sizeof(int)]; int n = 1; memcpy(b, &n, sizeof(int)); if (b[0] == 0)・・・ みたいな。
>>961 命令キャッシュよりも命令そのものの違いの方が速度差が出来る件
コテになるのはろくな奴がいないな
>>963 最近はそうでもない。
CPUの性能向上にくらべてメモリのアクセス速度があんま上がってないからな。
相対的にコード密度を上げる方がより重要になってきてる。
>>968 おい、ここは入門編スレじゃないのか?
それともあれか?アスペか?
970 :
デフォルトの名無しさん :2011/03/08(火) 23:16:41.84
>>918 そうとも限らない
コンパイラのマニュアルで最適化のところの説明を読むと
サイズを犠牲にして速度をかせぐか、
速度を犠牲にしてサイズを削減するか、
選べるようになっていることが多い
おまえさんの聞いてきた話はおそらく
プログラムのロード時間やページングのことだろう
>>968 データならともかく命令はメモリのアクセス速度なんてほとんど関係ない
関係あるのはフェッチできる容量とかデコードとか
そうすると
>>953 の95%正しいっていうのは嘘なんですか?
そ、そうすると謙虚フロンティア戦士って嘘つきなんですね
>>972 2chに書かれてることなんて9割は意味が無いことと嘘
それを踏まえた上で信じる信じないは自分で決めろ
>>970 速度を犠牲にしてサイズを削減する最適化は
けっこう珍しいような気がするけどなあ
だいたい4種類じゃね
・プログラムのサイズと実行速度を改善する(定数畳み込みなど)
・プログラムのサイズを改善する(デッドコード除去など)
・プログラムの実行速度を改善する(スケジューリング最適化など)
・プログラムのサイズは大きくなるが、実行速度を改善する(ループアンロールなど)
問題の最後のやつは、
「高度な最適化」みたいなオプションを付けないと有効にならないことが多い
コンパイル時間やプログラムサイズに響くし、それどころか遅くなるケースも見られる
975 :
951 :2011/03/08(火) 23:28:14.26
>>914 >chが100のときは、'0'〜'9'のどのケースに値するのでしょうか?
どのケースにも一致しないので何もしないままループ
>chは0から9までの値しか取れないのですか?
んなこたーない
>100は超えてるのでEOFになるのでしょうか?
意味不明
終了条件はEOFのみと自分で書いてるじゃないか
>小数点を入れても読み取ってくれるのですが.は無視されるのでしょうか?
一番上と同じで'0'から'9'以外の文字は何もしないままループ
>>974 ソース同じでも環境で速度変わるときもあるだろうし
質問の時点でもうちょっと詳しく設定すべきかもね
>>974 Cの板なんだから構造体のアライメントの説明から始めろよ
>>958 cl, icl/icc, gcc, armccなどいろいろです
>>971 確実に遅くなるのをほとんど関係ないとみなすかどうかは主観の問題だが
とりあえずは
>>918 は実測してみればいいんじゃね?
>>974 どこにニュートラルを置くかのサジ加減w
>>980 アライメントが何で必要になったか考えれば、サイズが小さければ早いなんてもんじゃないことは分かると思うが?
まぁ、アライメントって言ってもデータしか頭にないかもしれんが、
コードのアライメントは相当重要だから、nopなんて何もしないコードが大量に入ってるぞ
>>982 相当重要っていうか、アラインされてないとそもそも動かないCPUもあるしなw
>>980 そもそも
>>918 が様々な環境条件を客観的に判断して実測できるようなら、此処に質問なんかしてこないと思うが
自らの発言が劣勢になってきて最後ブン投げって感じだな
>>983 はぁ?お前バカ?
コードアライメントなんて動的コード生成でもしない限り必要ならコンパイラが勝手にやるだろうよ
>>983 動かないものに関してコードの大小を比較する意味がない件
つーか、間違ってること認めるか、もうコテはずせよ
>>984 じゃあ同じアルゴリズムでコードサイズが大きい方が速くなる例あげてくれ
>>987 nop入れて境界線調整してある長いコードと
nop削って境界線調整してない短いコード、どっちが早いよ?
>>989 以下の構造体の配列を操作する場合でも、サイズを小さくコンパイルした方が早いと思うか?
struct st {
char c1;
short int s;
char c2;
};
>>989 お前こそ、話の流れ読めてる?
速度云々の話の流れで特定のCPUでコードアライメントされてなくて
動かないバイナリの話持ち出して何が言いたいんだよw
>>988 あーアライン崩してまで減らすケースだと遅くなるが。。。そこまでの重箱は予想してなかった。
で、境界線調整する理由はご存知かい?
>>990 それと命令のアラインの話がどう関係するの?
>>992 重箱ってアホか?
お前が最近のCPUって言い出したから境界線出してやったんだよ
95%以上のコードは境界線調整してるか、
コードが短いことよりも命令そのものの違いの方が速度差が出来る
以上
嘘か本当かは、見てる奴の判断に任せる
>>987 int a[10];
#if 0
int i;
for (i = 0; i < 10; i++) a[i] = i;
#else
a[0]=0;a[1]=1;a[2]=2;a[3]=3;a[4]=4;a[5]=5;a[6]=6;a[7]=7;a[8]=8;a[9]=9;
#endif
アドレッシングモードが多彩なx86系ならループのジャンプによるパイプラインストールもあり
確実に後者のほうが速い。これがアンロールの効果。もっともこれ程シンプルだと前者でも
コンパイラのオプションによっては勝手にアンロールされてバイナリレベルでは同じになるかもしれんが
>>994 で、境界線調整する理由は(ry
もしかして知らないで言ってた?
ggrks
>>996 コードのアライメントの話からnop入れて境界線を調整するって言葉だして、
本気で境界線調整する理由知らないって思ってるのか?
>>998 これを違うアルゴリズムというのなら、あんたの言う同じアルゴリズムでコードサイズが異なる例をあげてくれ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。