C言語なら、オレに聞け! <2>
■ このスレッドは過去ログ倉庫に格納されています
0001ジョブス2世
NGNGC言語しか知らないがC言語なら誰にも負けない...
C++は勉強中だ!文句あるかゴルァ!
前スレ「C言語なら、オレに聞け! 」
http://piza.2ch.net/test/read.cgi?bbs=tech&key=967985026
また、処理系依存の質問は以下に逝け!
C++Builder相談室
http://piza.2ch.net/test/read.cgi?bbs=tech&key=969458279
VisualC++相談室
http://piza.2ch.net/test/read.cgi?bbs=tech&key=970607517
0002デフォルトの名無しさん
NGNG0003デフォルトの名無しさん
NGNGextern int table1[32][64];
extern int table2[30][60];
a = table1[b][c];
a = table2[b][c];
パフォーマンスの差があるか考察せよ。
0005デフォルトの名無しさん
NGNGもちろん、「一般的には有意な差では無い」が。
理由1
配列要素ののアドレス計算が、
2のシフト演算で行える場合と行えない場合の差。
コンパイラがアドレス計算をシフト演算に最適化し、
乗算とシフト演算に要する時間に差がある場合、差がつく。
理由2
キャッシュのアラインや配列のサイズにより、
差が出る場合がある。
これは、キャッシュのアルゴリズムやアクセスの仕方により異なるので、
どちらが速いかは場合による。
00065
NGNG「構造体の配列」や「配列の配列」にアクセスするコードの
アセンブラ出力を見れば一目瞭然な気が。
00073
NGNGぴんこーん!
でも理由1に関してはx86系のCPUで乗算とシフトのレイテンシーの差、
実行ポートの差、コード依存性によって一概にシフトが速いとは言えないらしいです。
理由2に関してはまぁ、このぐらいの小さいテーブルなら大丈夫でしょう。
アラインは合わせればいいだけだしね。
下手にcharとかにしてテーブルを圧縮してもパーシャルレジスタストールが起こるし。
まっ、どっちにしろアセンブラレベルの話ですね。
0008ジョブス2世
NGNG完敗です、C言語なら誰にも負けないというのは言い過ぎでした...
C言語しか知らんので、アセンブラは知らないっていう言い訳は
見苦しいので言わない事にします
ところで、
extern int table3[32][60];
a = table3[b][c];
の場合、
> 配列要素ののアドレス計算が、2のシフト演算で行える
のでtable1と同等のパフォーマンスが出るっていうことでいいのでしょうか?
00093
NGNGint *table = (int *)table3;
a = table[60*b+c]; // a = table3[b][c]と同値
ですね。アセンブラはともかく、2次元配列のメモリー上での
連続性は分かってないと、ど初心者ですよ。。
0010デフォルトの名無しさん
NGNGそんなにムキになって挑まなくてもいいと思うのだが。
0011ジョブス2世
NGNG# なにを血迷っていたんだろう
訂正します
extern int table4[30][64];
int *table = &table4[0][0];
a = table[(b<<6)+c]; // a = table[64*b+c]と同値
のでtable1と同等のパフォーマンスが出るっていうことでいいのでしょうか?
0013ジョブス2世
NGNG一応Cについては自信があったので挑んでみましたが
結果は惨敗でした。精進したいと思います。
>>12
ええ、盲点でした。勉強になりました。
やはりCしか知らないでC言語で負けないことは難しそうですね。
0014デフォルトの名無しさん
NGNG#define MAX 10000
main(int argc,char *argv[])
{
int i, j, numCol, noMax =0;
char tmp[MAX + 1], strForm[16];
/* Input Check */
if(argc>1){
noMax = atoi(argv[1]);
}
while(noMax < 2 || MAX < noMax){
printf("いくつ以下(但し 2 以上 %d 以下)の素数を求めるのですか?> ",
MAX);
fgets(tmp, MAX, stdin);
tmp[MAX] = 0;
noMax = atoi(tmp);
}
/* MAX って何桁? そんなら、横は何列に? */
sprintf(strForm, "%d", noMax);
i = strlen(strForm);
numCol = 79 / (i + 1);
/* ならば、出力の書式指定フォーマットは次の通り */
sprintf(strForm, " %%%dd", i);
/* 素数探し(表を書いて素数じゃない数を消して行く方法で) */
for(i = 0; i <= MAX; i++) tmp[i]=1;
for(i = 2; i <= MAX; i++){
if(tmp[i] == 1){
j = i << 1; /* j = i * 2 */
while (j <= MAX){
tmp[j] = 0;
j += i;
}
}
}
/* 以下が結果 */
printf ("◆◆◆ %d までの素数一覧 ◆◆◆\n", noMax);
for(i = 2, j = 0; i <= noMax; i++){
if(tmp[i]){
printf(strForm, i);
if(++j % numCol == 0){
putchar('\n');
}
}
}
printf("\n◆◆◆ 全部で %d 個 ◆◆◆\n", j);
}
¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥
fgets(tmp, MAX, stdin);
tmp[MAX] = 0;
noMax = atoi(tmp);
これが何をしているのかがわかりません。
そもそも
素数でないってどの段階でどうやって識別してるのですか?
大学でのこの半年間しかC言語にふれてなくて超初心者です・・・・
0015ジョブス2世
NGNG> fgets(tmp, MAX, stdin);
> tmp[MAX] = 0;
> noMax = atoi(tmp);
> これが何をしているのかがわかりません。
fgetsで標準入力から入力された文字列ををtmpに格納して、
atoiでtmpに格納された文字列を数値に変換し、noMaxに格納しています
# tmp[MAX] = 0;はちょっと何を意図しているかは不明です。
# これが無くても問題ないでしょう。
> そもそも
> 素数でないってどの段階でどうやって識別してるのですか?
以下で行なっています、
# 確か「何とかのふるい」っていうアルゴリズムのはず...
>/* 素数探し(表を書いて素数じゃない数を消して行く方法で) */
>for(i = 0; i <= MAX; i++) tmp[i]=1;
>for(i = 2; i <= MAX; i++){
> if(tmp[i] == 1){
> j = i << 1; /* j = i * 2 */
> while (j <= MAX){
> tmp[j] = 0;
> j += i;
> }
> }
>}
ただ、繰り返しはMAXまで行なう必要があるかどうか疑問です
>for(i = 0; i <= MAX; i++) tmp[i]=1;
>for(i = 2; i <= MAX; i++){
> while (j <= MAX){
はそれぞれ
for(i = 0; i <= noMax; i++) tmp[i]=1;
for(i = 2; i <= noMax; i++){
while (j <= noMax){
で十分のような気がします
001614
NGNG0017名無しさん@お腹いっぱい。
NGNGエラトステネスのふるいですよ。
このスレッドいきなりためになったわ。感動。
3にありがとう
0018デフォルトの名無しさん
NGNGパフォーマンス厨房どもはアルゴリズムとデータ構造の本でも読んでから出直してきなさい。
0019デフォルトの名無しさん
NGNG10年以上前から読んでるけど?何回も読み返してるし。
0020デフォルトの名無しさん
NGNG>>5 >もちろん、「一般的には有意な差では無い」が。
>>12 >どの程度パフォーマンスに差が出るかは分かりませんがね。。
の意味がわからないらしいから。
0021デフォルトの名無しさん
NGNG18の意図すら分からんのか?
3の質問なんてナンセンスだし、考察する価値も無い。
そんなことやってる暇があったら、アルゴリズムとデータ構造
でも勉強せい、っつーことだろ。
俺も同感だね。
002221
NGNG18=21の自作自演とか書こうとしてる、おまえ。
マジ、病院行った方がいいぞ。
0023デフォルトの名無しさん
NGNGなんだあんた。あんたに何で議論の内容決める権利があんだよ。
あんたが勉強中だからって、みんな勉強中だと思うなよ。
002420
NGNG>そんなことやってる暇があったら、アルゴリズムとデータ構造
>でも勉強せい、っつーことだろ。
これには完全に同意するが、おまえも
>>5 >もちろん、「一般的には有意な差では無い」が。
の意味が読めてない。
有意ではない=他にもっと重視すべき事柄があるから、気にするな
と言ってるんだろうが。
>3の質問なんてナンセンスだし、考察する価値も無い。
普通はな。
18は意図を汲み取っていないと思っただけで電波は感じなかったが
>んで、
>18=21の自作自演とか書こうとしてる、おまえ。
>マジ、病院行った方がいいぞ。
これには電波を感じたよ。
00263
NGNG簡単なクイズを出しただけなんだからさぁ。そんな噛み付かなくてもいいじゃん。
簡単なクイズ出してジョブス2世氏に解かせるぐらいやってよ。。ヽ(´Д`)ノ
002720
NGNG> の意味が読めてない。
> 有意ではない=他にもっと重視すべき事柄があるから、気にするな
> と言ってるんだろうが。
言ってないよ。優位は「差」に係る。
つーか、そんなことどうでもよい。俺がいいたいのは、そんなことじゃ
ないのも読めないのか?
002820
NGNG> >んで、
> >18=21の自作自演とか書こうとしてる、おまえ。
> >マジ、病院行った方がいいぞ。
> これには電波を感じたよ。
感じる方の受信機が壊れてるんじゃねーの?
俺がそう書いた意図は分かるだろーが。
002920
NGNG何が言いたいんだ?俺の読解力では理解できない。説明してくれ。
>優位は「差」に係る。
その通りだ。「有意」な「差」はない。したがって、
「実際には差が出ないから重視するな」
と読んだ。もちろん、重視すべきはアルゴリズムとデータ構造だ。
2-17はそんな当たり前の事は前提として、
予備知識だと理解した上で話と、俺は解釈した。
もちろん俺と違ってすばらしい読解力を持つ21なら、
2-17がもっと深遠な意味で話していたという事を
根拠と共に示してくれるよな。
>俺がそう書いた意図は分かるだろーが。
「アルゴリズムとデータ構造のほうがずっとずっと重要だ」か?
それならわかってるさ。その上で
「そんな事は、わざわざ指摘しなくてもみんなわかって話してるんだろ」と
と俺は20と24で書いたつもりだがね。
で、電波君、それ以外に言いたい事とは何だ?
「話をするな」
とでも言いたいのか?
電波なのは、意味も無く「自作自演」とか言い出すからだよ。
よっぽど普段、自作自演の多数多数派工作をやってるんだろうね。
0030名無しさんのレスが読めるのは2chだけ!
NGNG003120
NGNG今度は一応推敲したからね。
・俺の捉えた流れ
3-13
予備知識として、アセンブラレベルの話があった。
「予備知識」の根拠は>>20の通り。
18
「アルゴリズムとデータ構造のほうが重要だ」
20(俺)
「そんな事はみんなわかって話してるんだから、わざわざ指摘するな」
21
「18の意図すらわからんのか」
#ここに書いた以上の意味があるのか、未だ俺にはわからんね。
22
「自作自演だいすき」
24(俺)
「有意差がない=重要ではない=予備知識である」を繰り返した。
27-28
繰り返し。
少なくとも、俺が20に書いた意図は、
>「そんな事はみんなわかって話してるんだから、わざわざ指摘するな」
だ。それに対して、
>18の意図すら分からんのか?
>マジ、病院行った方がいいぞ。
と返す理由がわからないね。
18の意図とは何だ?
そして俺が病院に行ったほうがいい理由は何だ?
>マジ、病院行った方がいいぞ。
こんな言い方をされて「電波だ」と反論するのは当然だろう。
003221
NGNGもーいーじゃん。
003321
NGNG003421
NGNGあがいているだけ。
# 俺も粘着君(藁
003520
NGNG詫びる気は全然ねーんだな。
俺は、18の言い方ににあわせた言い方をしたんだよ。
それをてめーが理解できずに、俺につっかかってきたんだろ。
読解力が足りてねえ、電波なのはてめーなんだよ。
連続して書きこむところなんざ、
他のスレで大暴れしていた奴を思い出すね。
詫びの言葉とかはねーのか?
俺は18が俺の言葉遣いの悪さを指摘したら謝るつもりだがね。
003620
NGNG18の意図と21-22の意図とやらを。
003720
NGNGどこが対立してんだよ。説明してくれよ。
俺は、てめーがつけてきた言いがかりに反論してんだよ。
0038デフォルトの名無しさん
NGNG0039デフォルトの名無しさん
NGNG0040デフォルトの名無しさん
NGNG20と21、両方バカ
0041デフォルトの名無しさん
NGNG004220
NGNG28でageられたからageにしたんだけど、やっぱよくなかった。
というより、相手にした俺が悪かったって反省してます。
もう、この件での書きこみはやめます。
0043デフォルトの名無しさん
NGNG0044初心者
NGNG直して画面に表示するプログラムを作成しなさい。
という、問題かなり簡単らしいんですがCに関しては
まったくの初心者です。誰か教えてくれる人いませんか?
0045デフォルトの名無しさん
NGNGまずは、ヘルプでitoa関数を調べろ。
0046初心者
NGNGさっそく調べてみます。
0047デフォルトの名無しさん
NGNGあれ?なんでitoa??
printfのフォーマットの問題じゃないんですか?(^^;
0048デフォルトの名無しさん
NGNGchar strings[131];
gets( strings );
num = atoi( strings ); // メニュー番号取得
printf( "元=%d 16進=%x 8進=%o\n", num );
004948
NGNG染んで詫びよう・・・。
0050デフォルトの名無しさん
NGNGってゆーか、それってまともに動いてるの?
>printf( "元=%d 16進=%x 8進=%o\n", num );
printf( "元=%d 16進=%x 8進=%o\n", num, num, num );
なら話は分かるが...
0051デフォルトの名無しさん
NGNGint i;
scanf("%d"&i);
printf( "元=%d 16進=%x 8進=%o\n", i );
だけで充分だと思う
もちろん、48のが安全だけどね
005321
NGNG005451
NGNG逝って来ます・・・
0055デフォルトの名無しさん
NGNG#include<stdio.h>
#include<stdlib.h>
int main(){
char s[10];
int i;
printf("\x1b[2J\x1b[3;3HInsert int No : ");
gets(s);
i=atoi(s);
printf("\x1b[4;4H 10 : %d",i);
printf("\x1b[5;4H 16 : %x",i);
printf("\x1b[6;4H 8 : %o",i);
printf("\x1b[10;8HHit Enter. Then Exit.");
gets(s);
printf("\x1b[2J\x1b[1;1H");
return 0;
}
こんな糞プログラムはいいから
Cで作った共有メモリにFortranからアクセス
する方法教えてちょ。
005621
NGNG> 俺は18が俺の言葉遣いの悪さを指摘したら謝るつもりだがね。
ほー、やはり、俺の予想の
> 20は「日本語に不自由しているんだろ。 」と書いた自分を正当化しようと
> あがいているだけ。
は、正解みたいだったな。
# で、何をあやまれって言ってるの?妄想君。
0057初心者
NGNGみなさん本当にありがとうございます。
嬉しいです。(;o;)
0058デフォルトの名無しさん
NGNG質問者の邪魔になるから消えろ。
0059問題の18登場
NGNG俺の一言で随分ともめてた様だな。
それにしても3の言うパフォーマンスって何だろ。
結局こんなのアセンブラ出力と実行結果を確認すりゃおしまい。
それに大方コンパイラやプロセッサの環境依存っぽい。
だいたい2次元配列なんてそうそう使わないしね。
あのコードだけでプログラム組むわけでも無いのに。
まあ、レスも増えてここの1も少し得した気分だろう。
それとも余計なことしたかなあ?
0060続・問題の18登場
NGNGいちおう3に対しての俺の考察結果は、
「環境による」
ね。
ここはVisualC++専用スレってわけじゃないから。
これ以上発展しそうにない話題なのでsage
0061デフォルトの名無しさん
NGNGアセンブラ出力の質にこだわれば生産性は落ちるものですし
質と生産性はなかなか比例しませんから
それぞれの道を信じていけばいいのでは。
0062ななし
NGNGいや、余計な存在であるかと。。
0063デフォルトの名無しさん
NGNGうわっ。あたまわりぃ〜
「なんでこんな事件が起きたのでしょうか?」
「社会が悪いんです」
って受け答えぐらい頭が悪い返答ですねぇ。。
0064デフォルトの名無しさん
NGNG0065ジョブス2世
NGNG> Cで作った共有メモリにFortranからアクセス
> する方法教えてちょ。
すみません。Cか知らないので、私にはわかりません。
誰か知っている人いますか?
0066デフォルトの名無しさん
NGNG最近のプログラマはほとんどがアセンブラをやらないし、
読めない。
また、CPUのアーキテクチャに詳しい奴も少ない。
よって、彼らはお互いに議論できる場を通常持つことが
出来ない。それで、その手の話題が出て来ると、嬉々として
自分の知識をひけらかす。周りはついてこれないし、
興味も無い。
これがウザがられる原因。
006766
NGNGウザがる奴もいないから、いいんではと思うのだが。
0068名無しさん
NGNGhttp://www.ccur.co.jp/external/TechSup/rtu.html#SECTION830
0069デフォルトの名無しさん
NGNG大丈夫なんじゃない?
0070デフォルトの名無しさん
NGNGいや、君みたいな存在が一番うざいと思うぞ。
007166
NGNG0072初心者@2回目
NGNG直して画面に表示するプログラムを作成しなさい。
という、問題で%x、%oを使わないプログラムの書き方
を誰か教えていただきませんか?2回目で大変恐縮なのですが
お願いします。
0073デフォルトの名無しさん
NGNGじゃあ、itoa()の出番です
まず調べてみてください
>>45
申し訳ない、あなたが正解だったようです・・・
0074初心者@2回目
NGNGitoa関数、ヘルプで見てもないんです・・・。
ちなみに私が使っているCはウルトラCです。
では、本で調べてみますね。
0075デフォルトの名無しさん
NGNG何なら自分で同等関数つくってもいいですよ
てか、それが正解なのかも
1番下の桁を取り出して、基数で割る
これを繰り返せば・・・
0076初心者@2回目
NGNGう〜ん・・・教えてくれて嬉しいんですが
やっぱり書き方が解りません。すみません
本当初心者なんです・・・
0077デフォルトの名無しさん
NGNG0078初心者@2回目
NGNGそれは関数ですか?ちょっと解らないです・・。
007955
NGNGありがとうございます。
早速、見に行きます。
0080デフォルトの名無しさん
NGNG今CのプログラムをCGI化しようとしています。
でも、このプログラム(他の人が作成)ってのが5つの.cファイルで
できていてコンパイル(makeコマンド使用)すると実行ファイルが
できるのですが、これをCGIとして動かすにはどうしたらいいのか
わかりません。
ちょっと分野が外れているかもしれないのですが知っていれば
アドバイスいただけるとうれしいです。
0081デフォルトの名無しさん
NGNG>int i,j,k,l,m[100];
>i=(取ってきた整数);
>k=i;
>for(l=1;;l++){
> j=k%16;
> m[l]=j;
> k=(k-j)/16;
> if(k==0)break;
>}
こんなとこじゃないですか?
出力とデバッグは自分でやって下さい。
0082デフォルトの名無しさん
NGNGそこまで出来てるなら板違いと思われる。
CGI板で訊いた方がいいんじゃ?
0083デフォルトの名無しさん
NGNGperlと同じ要領で
chmodでパーミッションを実行許可して、
まずprintfで"Content-type: text/html\n\n"
を出力していけばふつーにできるぞ。
ただし、サーバでコンパイルしないと
機種依存ではねられるので、サーバ側がターミナルを許していて、
かつgcc,cc,g++なんかのコンパイラが使えるようになってないと
だめっすよ。(蛇足でしたね。)
0084デフォルトの名無しさん
NGNG著者が外人さんの名前で2人だったのは覚えているんですが...
どなたか教えてください。それと、C初心者でもこの本は読んでも理解できるのでしょうか?
0085>84
NGNGとか言わなかった?
0086デフォルトの名無しさん
NGNG0087>84
NGNGCプログラマでこの本もってないのはキリスト教の信者が聖書を持っていないのと
同じです。絶対買うべし。
0088デフォルトの名無しさん
NGNGネタでないみたい。
それはさておき、実行時間を測定したいので、CPU時間を計りたいの
ですが、どうやればいいんでしょう?
今は単に経過時間を測定してるだけなんです。
0089デフォルトの名無しさん
NGNGclock()。これはネタですか?
0090デフォルトの名無しさん
NGNGthreadのCPU消費時間のことじゃないかな。
WinならAPIにあったような気がするけど、忘れた。
0091デフォルトの名無しさん
NGNG0092デフォルトの名無しさん
NGNGどの環境でも動くんかな??
今VCでCGI作ろうと思って勉強中なんだけど
UNIX系OSのCコンパイラでコンパイルしても動くかな?
ってか、どんな風にすると他の環境で動かなくなるん?
0093デフォルトの名無しさん
NGNGANSIで定められていないライブラリーの関数を使うとダメだと思う。
0094デフォルトの名無しさん
NGNGchar ってsined charと断定したり
sizeof(int)が4バイトと信じてたりすると
痛い失敗をすることがあるらしい
0095デフォルトの名無しさん
NGNG009796
NGNGビットずらしを書いたらDLになっちまったい。
0098デフォルトの名無しさん
NGNGLは下三角行列で対角成分が全て1
Dは対角成分が全て整数でそれ以外が全て0
となるようにするプログラムです
お願いします
0099初心者@2回目
NGNG>遅れてすいません。
81さんありがとうございました。
これで単位がもらえそうです(^0^)
0100デフォルトの名無しさん
NGNG0101デフォルトの名無しさん
NGNG100バイトずつでもメモリ取って、リストにでもしたらどうかな。
■ このスレッドは過去ログ倉庫に格納されています