1 :
デフォルトの名無しさん :
2011/06/26(日) 21:03:13.81
3 :
デフォルトの名無しさん :2011/06/27(月) 00:30:21.91
◆QZaw55cn4c
C言語を最近はじめたものです。 double型の精度について質問させてください。 doubleの有効桁は、調べたところ16桁と書いてありました。 これはつまり、 a=1.0*10^(-15) b=1.0*10^(-14) b-a = 0.9*10^(-14) が正しく表示されるくらいの精度はあるということでしょうか?
いいえ、「正しく」の定義次第ですが。 そもそも、cでは規格では精度について詳細に言及していないので、16桁が保証されている訳ではありません。
その辺の規定は“IEEE 754”で検索すればいいよ。
>>4 以下の説明は10進法で説明してるから例え話のようなものです(実際は2進数です)
1.0*10^(-15)は1.0っていう情報とそれを15桁ずらすっていう情報に分けて保存するの、小数点をずらす感じだから不動小数点と呼ばれる
で、16桁程度の精度ってのは1.0の部分の話なので1.0*10^(-15)はもっと精度がある
どのみちdouble型の誤差を気にするなら気をつけないといけないことがいくつかあるので
他の人が入ってる通り調べたほうがいい
C言語初心者です。現在入力した数字が 5の倍数かどうかを判定するプログラムを作っているのですが ifの後の計算式がどうしてもわかりません… どのように訂正したらいいでしょうか。以下ソースになります。
#include <stdio.h> int main(void) { int a; int b; b = 5; printf("整数を1つ入力せよ\n"); scanf("%d",&a); if(a/b ==5 ) { printf("【 %d 】は5の倍数である\n",a/b); } else { printf("【 %d 】は5の倍数でない\n",a/b); } return 0; }
a/b==5 →
>>13 その式をやってみたのですが、
「50」等を入力しても「5の倍数ではない」と言われてしまいました…
printfのa/bが間違っているからでしょうか?
>>14 すいません、多分初歩とかそんなレベルじゃないですよね
学校の授業について行けず独学で頑張っていますが
数学というか算数が元々苦手なもので…もしスレ違いだったらすみません
a % 5 == 0
float でも 0 で割ったら駄目なの?
>>16 ありがとうございます!プログラムは出来上がりました。
ただ計算式の意味がまだ理解できていません…
aが50だったとして、それを5で割ると10ですよね?
10と0が等しかったら何故5の倍数だと判定できるのでしょう…
うまく説明できないのですが、数式の読み解き方を教えて頂けると嬉しいです…
%は余り
>>19 今少し考えていて、解ったかも知れません。
50を5で割ると割り切れて10で、
余りが出ないから 0と等しくなるという考え方でよいのでしょうか?
算数できない人には向いてないと思うけど、そのうち地獄見ることになりそうな
>>20 だけ読むとゼロという概念で梃子摺ってるようにすら見えるw
問題: 8 * 16 の格子に、色が配置されてます。色は赤・青・黄・緑・オレンジの5色です。 +ー+ー+ー+ー・・・ |赤|緑|赤|黄|・・・ |赤|赤|黄|青|・・・ |橙|赤|黄|青|・・・ 縦横で同じ色の場合はリンクしてると考えて、4つ以上リンクした状態の領域を検索したいです。 検索結果は同じく8*16の格子に TRUE と
25 :
24 :2011/06/27(月) 22:43:20.04
FALSEで書き出した配列的なデータとして得たいです。 8*16の色の配列アドレスを渡して、8*16のtrue/falseの配列を得る関数を作りたいのですが、どうやればいいですか? C言語で可能ですか?
26 :
デフォルトの名無しさん :2011/06/28(火) 00:17:50.93
またその問題か
そりゃ可能だろう 作ってみればいい 落ちゲーでも作るのか
昔つくったLIFEを思い出すゎww
29 :
24 :2011/06/28(火) 00:59:50.69
> {int _;srand(_);} これってどうなの
>>30 int a; srand(a); と同じ。
処理系によっては、繰り返し実行しても a の値が変わらない場合があるから、この場合 srand() したことになっていない。
こういう問題は再帰でやる
はいはい未定義
馬鹿かよ _は変数名だから定義されてる
未初期化、だな。
>>30 C FAQで呼んだ話であって規格のどこに書いてあるのかは知らないんだが
未初期化変数の利用は一応未定義動作らしいな、普通は動くけど
どーでもいいけど、FAQ邦訳のあの独特な上から目線の言い回しがすげー好きだ まぁ目線云々はなくて単に訳を断定口調で統一させてるだけのハナシであるっつーのは分かるんだけど 特にヌルポインターの章とかたまらん
ターミナルエディタの設定ってCプログラム内で反映できる? たとえばターミナルの大きさを変えたらそれに応じて表示する一行の文字数が変わるみたいなことをしたいんだけど
termcap
>>20 0〜4まで等間隔で打たれてる時計の文字盤のようなものを創造してみるんだ
50 だと10回転して 0 の位置を指してる
13 だと2回転して 3 の位置を指してる
# 高度計って一般的じゃないからなぁ…
# % の左側が負の値の時は… とりあえず思考停止だw
負の可能性があるときは%を使うべきじゃないしな
VCのヘルプには x % y で x, y 何れかが負の場合には処理系依存 って書いてあったが C89 でもそうなのかどうかは知らない
割り切れるかどうかの判定には問題ない
>>44 50の倍数か判定するのに問題ある例を挙げよ
48 :
デフォルトの名無しさん :2011/06/28(火) 16:08:10.72
プロトタイプ宣言ってどういうときにするもんなの? いきなり定義書いていったらだめなの?
1ソースで完結するならご自由に 複数ソースであちこちのソースから呼び出されるならヘッダーにプロトタイプ宣言書く
>>46 勝手に割り切れる時の判定の話にされても困る
51 :
デフォルトの名無しさん :2011/06/28(火) 16:21:50.15
>>49 そうなんですか
まだファイル分割するようなレベルまで来ていないので
いまいちピンッときませんが
ありがとうございました
52 :
デフォルトの名無しさん :2011/06/28(火) 16:23:06.42
Cでは負の剰余は処理系依存なだけだから尻から目が出ることはない
>>53 C99だと仕様で決められた
除算は0方向に丸める
Javaもそう
55 :
デフォルトの名無しさん :2011/06/28(火) 16:51:57.71
>>48 たとえばこんなときプロトタイプが欲しくなる
dir(p)
char *p;
{
file((char *)0);
}
file(p)
char *p;
{
dir((char *)0);
}
別になくても詰みはせんが
>>54 yが非0前提で
x/y は整数での割り算のルールに則ったまま
(x/y) * y + (x % y) が 常に x と等しい ってこと? < C99 の仕様
>>55 ああ 式の構文解析なんかは そういうパターンになるね
>11-12 倍数の意味わかってるのかな…
釣りだよ
なんでこのスレ、ID出ないんだろ
>>56 横から。厳密な事を言うと、「x/yが表現可能ならば」という前提がつく
こういうめんどくさい述べ方をするのは、ゼロ除算ともう一つ、2の補数でINT_MIN / (-1)ってケースだと
オーバーフローが生じるから
62 :
デフォルトの名無しさん :2011/06/28(火) 23:58:12.62
if文がもしあるならば必ず、そのif文は吟味されるのでしょうか? if(i==1) if(i==2) ・ ・ ・ とif文が10個あった場合全部吟味されますか?
数値の扱いについて質問です。 unsigned char hoge; hoge = 1000. / (unsigned char)(moge); のようなコードがあるのですが、数値の後に ’.’ があるとどういう扱いになるのでしょうか? 少数の意味なのかなとも思うのですが…
>>64 >>65 ありがとうございます。
ピリオドとかだと上手く検索できなくて困っていました。
1000.0 のようにピリオドの後に数字がなくても大丈夫なんですね。
勉強になりました。
http://codepad.org/NnxwEul5 よくあるforループのパターンで
for(j=0; j<10; j++) {
A:
for(i=0; i<10; i++) {
B:
}
C:
}
2次元配列などにアクセスする場合、度々この2重ループが現れるので、
これを抽象化すれば、コードがよりシンプルになるだろうと思ったのですが上手くいきませんでした。
シンプルどころか、グチャグチャのドロドロでカオスなコードになってしまいました。
(内容は>>29とほぼ同じなのに、どう考えても逆に読み辛くなってる気がする。)
よく上級者が「イテレーターを用いるとコードがシンプルになる」と言ってますが、いまいち実感が沸かないです。
Cでシンプルにイテレーターを実現する例を教えてほしいです。
>>62 コンパイラによっては最適化されることもあり、なんともいえません。
ただ、そういうコンパイラでも最適化を行わないようにコンパイル時に指定することができるのがほとんどですが、
そういうときには、if 文を 10 個かけば、10個とも吟味されるコードを生成すると思います。
>>67 >抽象化すれば、コードがよりシンプルになる
まず「抽象化する」という言葉の内容がなになのか、明確に意図する必要があります。
関数やマクロを使うことなのでしょうか?
>「イテレーターを用いるとコードがシンプルになる」と言ってますが、いまいち実感が沸かないです。
そもそも、すでに「配列にアクセスする」という処理主体で書かれている内容にイテレータを導入しても仕方がないと思います。
あるいは、いわゆる foreach() 文を導入したいのであれば、それについて、shiro さんがなんかしゃべってはったのを記憶しているのですが、ググってもでてきませんね。
>{volatile int _;srand(_);}
残念ながら volatile をつけても意味は変わらず、この文では srand() を意図したとおりには使えていません。
>62 ifの内容見るかぎり1つ目のif通っても2つ目のifで蹴られるだけだろ。 吟味って値チェックするか?ってことだろ mov eax,[i] cmp eax,01h jnz end1 ;i==1でなきゃ終了 cmp eax,02h jnz end1 ;i==2でなきゃ終了 ... {}内処理 end1: ... こんな感じのコード書くんじゃね? 最適化で削除される可能性もあるが。
72 :
デフォルトの名無しさん :2011/06/29(水) 18:53:11.46
>>71 スクリプトでかくなよ・・・
全然わからん。
スクリプトw
数学の範疇なので適したすれあれば誘導お願い。 自然対数loge X をlog関数を使わずに近似等で計算するコードってありますか。 組み込みではlog関数使えないと言われたので別の計算法探してます。
Xは不定なのかい? >組み込みではlog関数使えないと言われたので 誰に言われたのかな? logが使えないということは浮動小数点計算が出来ないってことになるような?
級数って言葉とセットでぐぐれば見つかると思う 口ぶりからしてコードには自力で落としこめるだろうし
77 :
74 :2011/06/29(水) 19:17:59.24
すいません。最近やりはじめたんで浮遊なんちゃら(少数?)わかりません。 Xは、定数ではありません。 logだめ言われたのは上司です…
テーブル引き&ニュートン法2回とかが定番?
>>77 超いい加減な数値でよければ
double damelog(double x)
{
double tmp;
int i;
for(i=0,tmp=x;tmp>=2.0;i++,tmp*=0.5);
if(i==0) for(i=0;tmp<=0.5;i--,tmp*=2.0);
return i*0.3010;
}
>>77 >>79 より格段に精度アップしたよw
double damelog(double x)
{
static double table[]={0.0, 0.0000, 0.3010, 0.4771, 0.6021, 0.6990, 0.7782, 0.8451, 0.9031, 0.9542};
int i;
for(i=0;x>=10.0;i++,x*=0.1);
if(i==0) for(i=0;x<1.0;i--,x*=10.0);
return table[(int)x]+i;
}
自然対数だったか ミスってるな
CとC++って両方覚えるべきですか?
脱初心者の為の本教えてください
>72 wwwww
Linux環境で開発する場合、C,Javaは必須ですか?
>>77 マクローリン展開を使ったもの
劇的に精度が上がったよ
マクローリン展開の収束範囲になるまで 2 で割り続けてる(掛け続けてる)
double damelog(double x)
{
double ret, x_1, x_1_n;
int i;
for(i=0;x>1.0;i++,x*=0.5);
if(i==0) for(i=0;x<0.5;i--,x*=2.0);
ret=i*0.69314718055994530941723212145818;
x_1=x-1;
x_1_n=-1.0;
for(i=1;i<15;i++)
{
x_1_n*=-x_1;
ret+=x_1_n/i;
}
return ret;
}
ハッシュってのが良く分からないんですが・・ 例えばAPPLEみたいなのを12という整数に直すってことですか?
89 :
デフォルトの名無しさん :2011/06/30(木) 00:28:42.56
C言語のスレなのに、コマンドラインで書くスクリプト用のC言語をこのスレで
書いてレスしてる人なんなの?
>>71 さんとか。
エディタでつくるほうのC言語で答えてくれ・・・
何で
>>71 がスクリプトって事になってるの?
>>86 Cは知ってた方が良いけど、後回しでも良いよ
Javaはサーバサイドやりたいなら必須に近い感じ
作りたい物を一番簡単に作れる言語から手を付けるのがお勧め
>>89 あれはアセンブラだよ
ところで、「コマンドラインで書くスクリプト用のC言語」ってなんなの?
>>82 まずは、C を覚えて宿題スレで沢山コードをかいていると、自然に C++ に移行したくなると思います。それからでも遅くはないでしょう。
>>88 そのとおり。
広意には、任意のオブジェクトに対して、それに対応する数値を計算する関数をハッシュ関数といいます。
>>89 i386 のアセンブラでしょう。
C をやる人間は必然的にマシン語レベルまで意識するようになるというものです。
デバッグするにも最適化するにも解析するにもアセンブラの知識があった方が 何かと捗るからね
>89 はコンパイル言語、コンパイラ、アセンブリ言語、アセンブラ、マシン語の用語について調べてみろ。
97 :
デフォルトの名無しさん :2011/06/30(木) 00:44:02.88
>>82 Cだけで良いよ
Cを覚えたら、何か一つLLを習得すると良いと思います
RubyとかPythonとか、日常のスクリプティングに使える言語を知っておくと便利です
あとはJavaScriptかな
C++はどうしても必要になった時以外は無視してオケ
>82 素直にC言語から始めるのを勧める。
>97 次質問するときは礼儀とかマナーとか覚えてから質問してね。
>>83 自分で問題意識を持って技術を磨けるのが脱初心者の状態だと思いますぜ
内部的に二進数じゃなくて十進数とか三進数とか使ってる環境が仮に存在するとして C言語のビット演算は二進数として正常に動作する?しない?
>>102 規格に準拠してるなら正常に動作する
でも規格無視な環境(コンパイラ)もあるので確実ではない
#include <stdio.h> void tes(void *d){ int *b; b=(void *)d; b++; } int main(void){ int k[2]={100,200}; int *a=k; printf("%8d\n",*a); tes(&a); printf("%8d\n",*a); return 0; } int型のポインタaのアドレスを受け取り其のポインタが指しているアドレスを一つ進める関数を作ろうとしたが うまい事いかない。 実行結果が 100 100 に成ってしまう どこに問題が有るのか教えてください
>>104 #include <stdio.h>
void tes(int **d){
*d+=1;
}
int main(void){
int k[2]={100,200};
int *a=k;
printf("%8d\n",*a);
tes(&a);
printf("%8d\n",*a);
return 0;
}
なにこの自演
110 :
デフォルトの名無しさん :2011/06/30(木) 17:33:29.42
malloc関数を1万回呼び出すプログラムと,i=1を1万回繰り返す プログラムだとどっちが遅いですか?
実測しろ
112 :
デフォルトの名無しさん :2011/06/30(木) 17:51:10.79
malloc関数を1万回呼び出すプログラムだろうね i=1がmallocより遅い可能性は実例を見つけてから論ずべきことだ
113 :
デフォルトの名無しさん :2011/06/30(木) 18:14:24.64
ハッシュ便利すぎワロタwwww 実行時間1万分の1になったww ハッシュ値が一緒になる場合はでもどうしたらいいんだろ・・・
114 :
デフォルトの名無しさん :2011/06/30(木) 18:15:19.25
トリプルハッシュ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
115 :
デフォルトの名無しさん :2011/06/30(木) 18:16:39.37
10万個の数字のクイックソート1秒で終わったwww
1秒もかかったのか
117 :
デフォルトの名無しさん :2011/06/30(木) 22:24:53.33
同感 なんだそりゃ
以前ここで100万行のソートについて質問したものですけど そのときに皆様たくさんの方がコードを書いてくださったのを思い出しました
119 :
デフォルトの名無しさん :2011/07/01(金) 00:49:46.39
rand()使ってるんですが、1回の実行で100個の異なる値を 出さねばならんのに全部同じ値がでます・・・ 何故でしょうか?
>1回の実行で100個の異なる値 意味わかんねーよ エスパーに挑戦してみるとsrandもいちいち呼んでるとかかね
奇跡が起こってるからじゃね?
あぁ一回の実行ってプログラム一回の実行か 俺がアホだったなすまん どのみち原因分からんが
123 :
デフォルトの名無しさん :2011/07/01(金) 00:55:35.52
>>120 この範囲内じゃないともっぺんrand()で探すよっていう条件を付け加えると
100個とも全部同じ値になります・・・
単にforループ内でrand()だけだと100個とも違う値なんですが・・・
rand()を1回呼び出すプログラムを100回動かしても全部同じ値! →srandを呼びましょう。その引数は実行のたびに変わる値、例えば現在時刻などにしましょう。
もう一回探すときに同じ値でsrandしちゃってるんでしょ 1度srandしたら基本的にそれ以降はsrandしなくてよい
126 :
デフォルトの名無しさん :2011/07/01(金) 00:58:19.24
>>120 for(100)
{
rand()
}
全部違う値
for(100)
{
while(条件)
{rand()}
}
全部同じ値
>>126 実際にだめだったコードを問題が発生する最小までけずって出してこいハゲ
そんなんで分かるかボケ
129 :
デフォルトの名無しさん :2011/07/01(金) 01:00:21.28
>>125 srandではなくてrandです。
randしか使いません。
131 :
デフォルトの名無しさん :2011/07/01(金) 01:08:59.01
rand()が実行されてないんだろ
randが呼ばれずに前回の値を使ってるとかかな
133 :
デフォルトの名無しさん :2011/07/01(金) 01:13:57.99
>>132 もう一ついいですか・・?
forループの中ではint i;と宣言してもエラーでないのですが
whileループの中ではint i;と宣言するとエラーがでるのですが
何故でしょう?他に問題があるのでしょうか?
135 :
デフォルトの名無しさん :2011/07/01(金) 01:17:05.28
>>134 ガチで真面目にお願いします。頭悪くても結構ですから・・
>>135 真面目にお前の頭だよ
少し前の指摘も見えんのか
可能性としてはint i;がスコープの先頭に無いとかじゃね?
137 :
デフォルトの名無しさん :2011/07/01(金) 01:22:33.56
>>136 動きました。
ありがとうございました。
138 :
◆tWL/wYPcVw :2011/07/01(金) 01:23:12.70
こんな時間まで勉強しているやつが頭悪い可能性は低い
140 :
デフォルトの名無しさん :2011/07/01(金) 01:36:07.08
頭悪いのに真面目という最悪なパターンでは
釣りをしているつもりなんだろう そのままでも十分アレなのに
バカって正しい考え方を知らないから、どんだけ考えても時間の無駄にしかならない
本当に頭のいい奴はとっくにやりたいことを終えて寝てるだろ バカだから終わらなくて頭も働かなくて効率悪くなって悪循環してるんだろ 俺・・・早く寝ろ
>>133 rand() なのに同じ値が云々は、やっぱりソースを晒さないことには、なんとも。
あと、while () の中には変数宣言はできません。
145 :
◆tWL/wYPcVw :2011/07/01(金) 01:48:57.42
>>140 それだけは傷つくから言わないでください・・
>>144 そうなんですか?
whileの中でも変数宣言してもちゃんと動くときもあります・・
int j;
j=0
while(j<100)
{
int i;
i=1;
j++;
}
これだめなんですか?
>>144 馬鹿だと見越してwhile()の括弧の中にねじ込んでる可能性に対してのレスかもしれないが
whileループ中では普通宣言できる
C89であってもね
スコープだから
148 :
◆tWL/wYPcVw :2011/07/01(金) 01:52:07.57
>>146 それは違います。
while(){}の{}の部分です。
while(){}の()のことを言っているのではありません。
動くソースは皆知ってから貼らなくてもいいよ 変数宣言がエラーって言うソースを貼れば間違いを指摘できるよ
150 :
◆tWL/wYPcVw :2011/07/01(金) 01:54:45.95
>>147 そのプログラムシュミレーションサイトってテキストファイル読み込みもできるんですか?
>>150 できねーよ、でもそんなことはどうでもいいだろ
お前のとこで動かはなかった奴をそのままコピペしろよ
■答えが欲しい場合
>>147 のサイトのソースコードを貼る
■どうでもいいから雑談をしていたい場合
ソースコードを貼るなんてとんでもない!
ソース公開をじらされてヤキモキしてるオレらって何なの?遊ばれてるの?
おまえら=金魚
スタック領域とヒープ領域、どちらがメモリの上位に存在するかは環境依存なんですかね?
ふたつのスレッドA,Bがそれぞれ、 ひとつの変数(int s)に代入しまくってるときに みっつめのスレッドCが s を読みだして AやBが代入してもいない変数を読み出すことってある? 仕様的に余裕でありえることは理解してるんだけど どんなCPUだったら起こり得るのかってのが知りたい
>>156 ローカル変数なら当然そうなるんじゃねww
>>156 代入しても居ない変数ってなんだよ
代入しても居ない値って言いたかったのか?
160 :
デフォルトの名無しさん :2011/07/01(金) 09:49:23.07
fscanfでファイルを読み込むとき2行目から読み込む方法がわかりません。 ファイル height 170.5 165.8 とあり、2行目と3行目の和をとり平均をとりたいです。
一行目も読んでやれよ
1行目を読むとnanになってしまいますん
ウゼエなこいつ
windows apiのlinux版は何を使えば良いでしょうか?
きのうからc言語始めたんで全然わからないんでお願いします
C言語でGUIを作るとしたら何のライブラリ?を使うのがお勧めですか? できたらマルチプラットフォームがいいですが、windows用にしてもいいです やはりMFCとかになるんでしょうか?
168 :
デフォルトの名無しさん :2011/07/01(金) 10:21:15.57
Qt
テストコードの書き方を教えてください。 今はよくわからないので、我流で 関数を呼ぶだけのmainを書いて 結果の判定をperlでおこなってるんですが そういう感じでいいんでしょうか。
printfしまくってからperlに食わせてると言うことか? 判定までC言語内でやればいいのに
引数を受け取って戻り値を返す、と言う関数のテストなら、 例えば void test_func1(){ int arg = 入力; int ret;
間違えて途中送信した void test_func1(){ int arg = 入力; int ret; ret = func(arg); /* テスト対象関数 */ assert(ret == 期待値); } みたいなテスト関数を作る printfの出力が結果になるような関数であれば、それをperlで確認というのもまあありだろう
>>160 ・fgets()で一行目を読み捨てる。但し、バッファが必要。
・fgetc()で一行目を読み捨てるループを作る。
・fscanf()で一行目を読み捨てる。
fscanf(fp, "%*[^\n]%*c");
>>155 yes
OS によって違うし、同じ OS でも CPU 毎に違う
それと、「メモリの上位」というより「上位アドレス」と言う方が多いと思う
>>170 たとえばあるフォーマットにのっとったファイル出力をするプログラム
とかをテストするとき、Cで検査コード書くのが面倒だったので
perlで検査してます。
>>172 やはりそういうコードをルート数分書かないとだめなんですね
ありがとうございました。
>>177 なぜデバッガを使わないんだ?複数の入力を検査したいなら、なおさら
種本のminixソース見て、俺には向いてないとおもた
>>180 デバッガでテストが書くんですか?
やり方が想像できないのでちょっと具体的な例をお願いします。
デーモンでよくあるような無限ループの関数って どうやってテストするんだろ
>>173 助かります。fscanfで読み飛ばすやつをもう少し詳しく教えてもらえませんか?
>>183 無限ループ内の機能部分は別関数にしておいて普通にテスト(無限ループはほぼガワだけにする)
デバッガをスクリプトで操作して、ブレークして期待値になってるか確認
長時間稼動させて出力部分(コンソールとかファイルとか?)に異常が出ていないか確認
想像で書いてみたけどこんなんじゃないの?
実際はどうするものなんでしょうね
>>185 >無限ループはほぼガワだけにする
やっぱこれやって無限部分は手確認かねぇ
ブラックボックス・テストをしたいのか、ホワイトボックス・テストをしたいのか
188 :
174 :2011/07/01(金) 12:00:29.84
>>175 型を修正したらちゃんと文字列を読み込んでくれるようになりました
なんっすかそれ
>>184 改行文字を含まない文字列を読み飛ばし、一文字(すなわち改行文字)を読み飛ばす。
>>156 例えば、Aが65536、Bが1を代入していてCが65537を読む出すのは、バスの狭いCPUなら起きるんじゃね。
>>187 基本的にはブラックボックステストをしたいです
ブラックボックステストとして項目を作成して
中身はほぼルートカバーするのが理想だけど
それはまああとのお楽しみとしてとっときます。
194 :
デフォルトの名無しさん :2011/07/01(金) 13:34:47.96
main関数3つ書きたいです
その3つのmain関数にどのように動いてほしいのか? おそらくその希望の動作は別の方法で実現するものだろう
>>195 1つ目のmain関数が終了したら
次のmain関数
こんな奴に相手をするからじゃれてくるんだ
void main(){ main1(); main2(); main3(); } これじゃだめなの?
void main();もしくはint main(); なら好きなだけ書けるよ!
3つまでだったら書けるね。4つは無理だけど。
と思ったけど、結構たくさん書けるな。
だから相手にするなと
207 :
デフォルトの名無しさん :2011/07/01(金) 14:15:50.42
void main()って、今のC言語でもできるのでしょうか?
>>194 できました。次の3つのファイルを作ってコンパイルすればおk
/* main1.c */
static int __attribute__ ((constructor)) main(void);
int main(){ printf("main1\n"); return 0; }
/* main2.c */
int main(){ printf("main2\n"); return 0 }
/* main3.c */
static int __attribute__ ((destructor)) main(void);
int main(){ printf("main3\n"); return 0 }
実行すると
$ ./a.out
main1
main2
main3
gcc限定だけど、これどんどん増やせるから 好きなだけ main() をつくってくだしあ
ありがとうございます
>>203 自分に出来ない要求をする者をキチガイ呼ばわりするのは
あまり良くないと思うんです。
>>208 main1.c と main3.c の2行目は
int main(){ printf("main1\n"); return 0; }
じゃなくて
static int main(){ printf("main1\n"); return 0; }
の間違いだ
gcc 限定ならこんなんもできる 警告出るけど #include <stdio.h> int main(void) { { int main(void){puts("main1");return 0;} main(); } { int main(void){puts("main2");return 0;} main(); } { int main(void){puts("main3");return 0;} main(); } return 0; }
>>212 >>194 によれば main関数を3つ書きたいと書いてある
main1関数はmain関数ではないから仕様は満たされてないよね
>>214 超ずりぃwww でも条件満たしてるwww
いやまて・・・よく見るとmain関数を4つ書いてるぞ・・・ゴゴゴゴゴ
俺はあきらめない!
>>195 の解答で十分じゃないの?
まあ確かにこういうアイデアの出し合いは面白いから好きだけどね
これほんとは
>>194 はこたえ知ってて聞いたんじゃねぇの?
>>214 グローバル変数とローカル変数の名前の衝突時のふるまいと同じ考え方か。
(アプリケーションエントリーポイント) ↓
グローバルスコープの main() 呼び出し ↓
ローカルスコープの main() 呼び出し
ローカルスコープの main() 呼び出し
ローカルスコープの main() 呼び出し
>>208 の機構はさっぱりわからんが、
__attribute__ ((constructor)) ってのが
アプリケーションエントリーポイントから呼ばれる関数の追加?
>>219 十分だと思うのはお前のレベルが低いからだ
>>221 本来はライブラリの初期化ルーチン用の仕組みです
ライブラリをリンクしただけで、起動時に自動的に
管理スレッドを起こしてみたり変数初期化したりといった
ことを実現するためのgcc拡張よ
>>208 のを試してみたが、全部mainって名前だと
コンパイルできても実行すると落ちるな(gcc version 4.3.4 20090804 (release) 1 (GCC))
ちゃんと動くものなのか?
2chのバカ煽り怖いです リアルも怖いのに俺どこにいればいいんでしょうか
226 :
221 :2011/07/01(金) 14:45:23.30
>>223 ありがとー
windows でいう DllMain() みたいなやつなのね。
__attribute__ ((constructor)) が ロード時用
__attribute__ ((destructor)) が アンロード時用 と。 (プロセスなのかスレッドなのか OSの事情次第だろうけど…
>>224 念のため3.3.5と4.3.2と4.4.5で確認したけど、動いた
中身見ずにヘッダーファイルインクルードするの怖くね?
入力した二つの数(a,b)からaのb乗を求めるプログラムの作成が課題として出されて scanfを使って入力された二つの数を変数に格納し、カウンタ用の変数を用意して for文を使って繰り返しaをb回掛け合わせるところまで分かったんですが 肝心のfor文の中の処理が全く分かりません、結果を格納する変数cを用意して aを何度か掛け合わせればできると思ったんですが、どうも上手くいきません(bに3を入れたのに5乗の結果が帰ってくる等) 特別な関数を用いずに累乗を実現する繰り返し構文の解説をお願いしたいです for(i=1; i<=b; i++) { /*ここの処理が分かりません*/ }
>>230 c = 1;
for(i=1; i<=b; i++)
{
c *= a;
}
for (i=1; i<=b; i++) { a *= a; } こうやったんじゃないか? (int ? double) c = 1; for (i=1; i<=b; i++) { c *= a; }
233 :
230 :2011/07/01(金) 16:56:06.11
>>231-232 即レスありがとうございます。
結果の格納用の変数cの初期化を忘れていたようです
{a *= a;}もやってましたw
下らない質問ですいませんでした、精進します
くやしく
237 :
デフォルトの名無しさん :2011/07/01(金) 21:53:14.95
C初心者です。 下のイメージのようにargvで取得した可変引数のうち、 第4引数以降を別の配列(subopt)に格納したいのですが、 必要数分をmalloc出来ません。 間違っている点はどこですか? +++イメージ argv → ./cmd a b c d e subopt → c d e argv → ./cmd 1 2 3 subopt → 3 +++ヘッダ extern char *subopt[]; +++ソース subopt = (char *)malloc(sizeof(char) * (argc-3));
sizeof(char) → sizeof(char *) もちろん、その先も個別に malloc する必要がある
239 :
デフォルトの名無しさん :2011/07/01(金) 23:55:59.60
>237 +++ヘッダ extern char *subopt[]; これだと、どっかでchar *subopt[N];みたいな定義を期待しているからchar **subopt;にすべき (ここに、Nは正数)
>>190 とりあえずうまく行きました。ありがとう。
scanf って、ぶっちゃけ不便だよな。 実用的じゃない。 ちょっと凝ったことやろうとするとすぐ破綻する。 sscanf は便利なのにな。
・初心者にループで繰り返し処理をさせたり、エラーチェックをやらせようと すると必ずハマるわかりにくい仕様 ・ストリームを消費する単位が、行でも文字でも固定長でもなくて しかもエラーが発生したときに消費されないという独特の仕様で、 使いこなせるようになってもほかの入力関数に応用がきかない。 ・入門用のテキストを卒業したらまず使わないから 「使いこなせるようになれ」とか、時間の無駄感がすごい ・scanf("%10s", str) のようにバッファサイズを直で書かなきゃならない ださい仕様 ・数値入力ではオーバーフローを検知できない ・最初scanf()で作っていて、エラーチェックを厳密にする必要がでてきて 途中でfgets()などの関数に切り替えると、ストリームの消費の仕様の違いから 動きの互換性を保つのが難しい。 最初からfgets()で入力を受け付けてatoi()などで処理してるのをstrtol()などに 変更してエラーチェックを厳密にするとしたらそういう問題はない。
243 :
デフォルトの名無しさん :2011/07/02(土) 01:41:36.22
> エラーが発生したときに消費されないという独特の仕様で、 > 使いこなせるようになってもほかの入力関数に応用がきかない。 ダウト 事故状況が保存されていてば修復処理はどうにでも書きようがある
たぶん、
>>242 >ストリームの消費の仕様の違いから
のせいだと思いますが、fscanf() と fgets() とを混在できないのがつらいところ。
fgets() -> sscanf() でいいや、と思ってしまいます。
245 :
デフォルトの名無しさん :2011/07/02(土) 01:45:14.99
scanf と fgets を混ぜる時点で生じる問題が そんなに面倒なら、もっと腕のいい PG やとえばいい 「互換性が保てる」という条件は喜ぶ奴や喜ぶよ どんな連中が PG 廃業しはじめてて、そこにどんなベンチャーがあるか知ってるから
>>243 scanf()のバッドノウハウ的なテクニックを覚えても、ほかの入力関数で
使えないだろって話。
>>245 地の言葉を使いたまえ。君にあわせよう。
248 :
デフォルトの名無しさん :2011/07/02(土) 02:00:31.19
> fscanf() と fgets() とを混在できない そーね、そんなヘボやけんそんな仕事しよーとねw
scanf()に肩入れしてるやつがいるってのがびっくりだ。 scanf()の使いこなしにプライドとかもってるから、馬鹿にされて 暴れるんだろうな。
250 :
デフォルトの名無しさん :2011/07/02(土) 02:12:03.18
俺は scanf のサブセット的な使い方を言っているに過ぎないんだが この程度が「信者」に見えるほどの下郎がいるってことか
scanf系全否定ではなくてscanfとfscanfの否定ってことね。 それならわかる。 sscanfは無いともう生活に困るレベルで使ってるわ。
使えるもんは使う
人間が入力するのか、そうじゃないのかによって異なると思うよ。
>>253 どうだろ。そのへんはあまり意識しないな。
ていうか、「入力は寛容に、出力は厳格に」の原則にのっとって
人間だろうと機械だろうとどちらが入力しても問題ないように
作るのが一番だと思うんだが。
>>249 fgtes()とscanf()をまぜて使えるPGが優秀だって時点でダメ。
256 :
デフォルトの名無しさん :2011/07/02(土) 10:12:32.59
もう全部、printfとscanfでいいんじゃない?
printf じゃなくて、ただの print が欲しいね。 単純でシンプルなの。
ループ文でflagを使った脱出ってあんまりマナー的に良くない?
261 :
デフォルトの名無しさん :2011/07/02(土) 15:55:21.97
絶対にGoto文使うな厨に睨まれるから
(int a&&int b) この意味教えて
単なる誤記だな。
初期化もないのに?
267 :
デフォルトの名無しさん :2011/07/02(土) 19:22:15.44
多次元配列つくりたいのですが moji[100][100] moji[0]="MORITA" moji[1]="TERADA" moji[2]="ISHII" ・ ・ ・ これができません・・・ 何故でしょう?
そういうルールだから
>>267 char *moji[100];
にするといいよ
> moji[100][100] char moji[100]; moji="ABCDEF";
moji[0]="MORITA" ってのは"MORITA"という文字列が格納されている先頭アドレスをmoji[0]に突っ込もうとしてるけど moji[0]はchar型だから型が合わないでコンパイルエラーということ ポインタと配列の違いについて学習されると良かろう
直接的な解決方法はstrcpyの使用だろうな
moji[][0]= moji[][1]= moji[][2]=
276 :
デフォルトの名無しさん :2011/07/02(土) 19:37:29.12
>>272 ポインタと配列の違いについて学ぶ必要があるのはおまえだな
277 :
デフォルトの名無しさん :2011/07/02(土) 19:37:48.82
>>272 moji[0]の0のは行が0番目って意味で
100文字まで入れれるってことじゃないのですか?
0 1 2 3 4 5
0 M O R I T A
1
2
3
4
じゃないんですか?
ここまでレベル低いとは思わなかった
>>276 うむw
char moji[100][100];
でmojiの領域は確保されてて
moji[0] = "MORITA"
ではmoji[0]のアドレスを書き換えることができないからコンパイルエラーになるのの間違い
あうw
281 :
デフォルトの名無しさん :2011/07/02(土) 19:42:54.87
>>280 char moji[100][100]で
101*101=10201の領域の文字列を入れれるんですよね?
この配列の5個の領域にMORITAって入れたいときはどうすればいいんですか?
多次元配列に限ります。char*とかstrcpyは関係ないので無しということで。
>101*101 いきなりアウトすぎる 最初からやり直してこいこの馬鹿は
285 :
デフォルトの名無しさん :2011/07/02(土) 19:45:42.26
5次元からはじめるべき
286 :
デフォルトの名無しさん :2011/07/02(土) 19:48:40.65
>>284 何がアウトなんだよ。
101行、101列だとchar1バイトの要領が10201だろ?
リテラル文字列の返す値はアドレスだからな。 ポインターにしか入れたら駄目だよ。
289 :
デフォルトの名無しさん :2011/07/02(土) 19:51:54.52
>>287 うん、だから設定時は数、実際に単位にわけると添え字は設定数-1とか
そういう細かいことはどうでもいいです・・
ただ単に
moji[0][1]=M
moji[0][2]=R
moji[0][3]=I
・
・
これがしたいだけ、ただそれだけ。
char moji[100][100]; で&(moji[0][0])が1000番地として "MORITA"で"MORITA"が2000番地に確保されたとして moji[0] = "MORIATA" でmoji[0]が2000になったとしたら moji[0][0]の番地が2000になるだろ?
291 :
デフォルトの名無しさん :2011/07/02(土) 19:56:38.19
="〜〜文字列〜〜" では文字は代入できないわけですか? ='文字' だと代入できるんですが・・
292 :
デフォルトの名無しさん :2011/07/02(土) 19:56:45.50
さっさとせいかいおしえろよくずども
293 :
デフォルトの名無しさん :2011/07/02(土) 20:02:38.83
あぁそうだった・・ C言語は文字型がないのか。 文句言っても仕方ないな。 ちょっと別の方法考えますわ。
Cの=演算子は配列を代入することができません 例えば int a[5], b[5]; a = b; のようなことはできません 同様に char c[5]; c = "ABC"; のようなこともできません 文字列文字列と言っていますが、Cでは文字の配列ですので
295 :
デフォルトの名無しさん :2011/07/02(土) 20:08:47.96
>>289 どうでもよくない
致命的な間違いだ
いいか、どうでもよくないぞ、絶対に
実際に長さ 101 の文字列を入れて結果を確認すれば
ことの重大さがわかる
文字数とは別な話、行数を1つ余計に数えるのは何のためだと教わった?
師匠によっては破門を宣告されるほどのことだぞ
296 :
デフォルトの名無しさん :2011/07/02(土) 20:11:53.00
>>294 なるほど・・・・
となると多次元配列で文字列使うときはstrcpyか。
>>281 >この配列の5個の領域にMORITAって入れたいときはどうすればいいんですか?
初期化時点なら下記。
char moji[100][100] = {"MORITA", "MORITA","MORITA","MORITA","MORITA"};
式中ならstrcpyを使う。
>101*101=10201の領域
100*100じゃないの?
>>293 >C言語は文字型がないのか。
charもあるし文字型リテラルもあるけど?
299 :
デフォルトの名無しさん :2011/07/02(土) 20:38:22.39
文字型リテラルなんてねえよ、あれは int だしリテラルとして実装される保証がないからポインタで指せない
リテラルって何ですか?
301 :
デフォルトの名無しさん :2011/07/02(土) 20:45:27.97
>>297 初期化の場合はできて式中ではそれができないってやっぱり不便でしょうか?
何故できないのでしょう?何都合が悪いのでしょうか?
二次元配列使うなら構造体にする。 #typedef struct { char name[100]: } ST_NAME; ST_NAME meibo[100] = {"MORITA", "MORITA","MORITA","MORITA","MORITA"}; printf("%s\n",(char *)meibo[0].name); meibo[0]=meibo[1]; DOSのTurboC++で作ってたときはchar *のキャストもいらんかった。 エラーレベルの設定が低かったからかな?
>302 #typedef × typedef ○
main関数4つ書きたいです
305 :
デフォルトの名無しさん :2011/07/02(土) 20:54:19.65
>>302 とっつぁんよ、いつからキャストがいるようになったんだい?
プリプロセッサ指令はともかくコロンとか、そんな時代なかったぞ
static の件も健忘か、コレステロールは怖いねえ
多少のも違いぐらいスルーしよろ。キモイよこの基地外。
307 :
デフォルトの名無しさん :2011/07/02(土) 21:00:58.42
>>304 おやすいご用で
main() {}
main() {}
main() {}
main() {}
コンパイルや実行がしたいとは言わなかったよな
308 :
デフォルトの名無しさん :2011/07/02(土) 21:03:39.05
>>306 キモくて結構、おまえにモテようとは思ってないさ
メカをキモがるバカ女みてえのは願い下げだ
>>307 なんつうかさ、このスレにいる必要ないよね、おまえ
310 :
デフォルトの名無しさん :2011/07/02(土) 21:14:56.08
>>302 おお!!!!!
その手があったか。
構造体の中って要素が型名+変数名で型名になってややこしくて
(typedef{char KOIRU[100],int REAKOIRU}JIBAKOIRUだと
JIBAKOIRUは型名、int REAKOIRUは変数宣言じゃなくてintとREAKOIRUで
int REAKOIRU型の変数てか単にint型があるよってだけでREAKOIRUとか
変数名っぽく記述するのって約束なのかな?)
であんま考えた事なかったんだよな
>294 上のはGCC拡張でできた気がするが、まぁいいや
312 :
デフォルトの名無しさん :2011/07/02(土) 21:21:25.03
>>302 に対してありがとうすぎる・・・・・
勉強に励むわ・・
313 :
デフォルトの名無しさん :2011/07/02(土) 21:23:49.22
配列は構造体型もいけるのか・・
まじで目から鱗だ。
本当にありがとう
>>302
よく見ると>302は正しくない ST_NAME meibo[100] = {{"MORITA"}, {"MORITA"}, ...以下略 のように、外側は配列のブレース、内側は構造体のブレースが必要 まぁ、もっと言うと{{{"MORITA"}}, ...のようにchar []のブレースも必要だけど文字列での初期化時にはなくてもいい(冗長だから) まぁ、構造体のブレースも要素が一つだから気を利かせてくれているんだろうけど
315 :
デフォルトの名無しさん :2011/07/02(土) 21:28:15.28
直接代入がそんなに有り難いならブビでもやってろ
316 :
デフォルトの名無しさん :2011/07/02(土) 21:46:27.90
317 :
デフォルトの名無しさん :2011/07/02(土) 22:12:17.90
ブレースがなぜ必要か知らずに枝葉末節だけ憶えるのは大変そうだね、まあ頑張れや
318 :
デフォルトの名無しさん :2011/07/02(土) 22:13:58.28
>>317 言ってしまえば終わり、確かにいわれてみればそうかも的なことを
あらゆる事に関して付け加えるのは止めろ。
319 :
デフォルトの名無しさん :2011/07/02(土) 22:21:40.57
>>318 やめねーよハゲ
2chでなに命令してんだ
なんかここも質問しづらくなったな
nnn
>302
サンプルソース作って動作確認。
#include<stdio.h>
typedef struct {
char name[100];
} ST_NAME;
ST_NAME meibo[100]={"TANAKA","SUZUKI","SATO","\0"};
int main(void)
{
int i=0;
while(meibo[i].name[0]) {
printf("%s\n",meibo[i].name);
i++;
}
return 0;
}
結果
ttp://ichigo-up.com/cgi/up/qqq/nm38263.jpg
324 :
デフォルトの名無しさん :2011/07/02(土) 22:56:41.76
> ,"\0" …絶望の壁…
>while(meibo[i].name[0]) { この条件って大丈夫なの? 大丈夫だとしてもなんか怖い
>>325 こういうのはふつうは
for(int i=0;meibo[i].name[0]!=0;i++) {
と書く。
!=0は好みだけどオレは省かない
大丈夫だよ 慣れれば気にしなくなる while(meibo[i].name[0] != '\0'){ と等価だけどこっちのほうがいい?
C99の人か
329 :
デフォルトの名無しさん :2011/07/02(土) 23:28:54.82
もう処理系に依存するとか面倒くさいこというなよな。
最大公約数的なことを教えてくれればそれでいい。
>>321 >>323 はまちがってねーだろうが
処理系に依存するのをめんどくさいと言う奴がめんどくさい 分かってて書いててそれを伝えてるならいいがそうでないなら書くな あ、過去レスが合ってるかとかは見てないから知らん
331 :
デフォルトの名無しさん :2011/07/02(土) 23:35:56.43
処理系に依存したくなければ
>>323 てか? …絶望の壁…
332 :
デフォルトの名無しさん :2011/07/03(日) 00:00:45.12
>>330 処理系依存は原理的なことじゃねーだろ。
基礎概念的なことがまず先にあって処理系だろ。
概念→応用だろ。
>>323 \0入れなくても要素数に大して初期化値数が足らない場合は0埋されるよ。
俺から質問。
"\0"ってした場合、 0が2つ入るってことだよね?
334 :
デフォルトの名無しさん :2011/07/03(日) 00:08:17.05
>>332 じゃ、原理的なことって何だよ? C 以外の言語で話せばご満足か?
E7 6D 26 4A CC 6F 2A 13 00 80 32 14 …
335 :
デフォルトの名無しさん :2011/07/03(日) 00:11:02.73
>>334 最大公約数つっただろ。
そういうな、分かってて、あえて自分の知恵をヒケラカスノやめろ。
参考書にのってる文法的なことがこのスレの場合原理的なことくらい
わかんだろ。
336 :
デフォルトの名無しさん :2011/07/03(日) 00:13:06.20
初心者に優しいスレにしねーと質問者減るだろう。
概念があってたとして、それを実現した処理系依存のコードで説明されても 違う処理系の人はうまく動かなくて混乱するだけだな 処理系依存だって書いてくれれば、意図(概念)を汲み取ろうとできるかも知れんけど
>>335 結局何が言いたいの?
処理系依存のコード書くなってこと?
処理系依存だと言う指摘がいらないってこと?
前者なら賛成 後者なら反対
339 :
デフォルトの名無しさん :2011/07/03(日) 00:20:13.85
>>335 じゃ、最大公約数って何だよ? 知恵がないから聞きに来てる身の者が根拠もなく
処理系依存はイヤよって拒否反応を勝手に作って耳ふさいでるだけだろ
お仕事は職場に依存しなきゃできないんだよ
いやならせいぜいコンビニのバイトでもしてたら? (コンビニのバイトさんに失礼だが)
あそこでも通貨は円だったり色々あるが
>>339 i386系amd64系で動くコードにしときゃだいたい問題ないんだよ
あれ?なんか変なの湧いてる・・
変なのしか沸かないだろここは
343 :
デフォルトの名無しさん :2011/07/03(日) 00:29:42.79
>>340 ふーん、それで TANAKA SUZUKI SATO が出せればいいのか
C は最大公約数でも原理でもねえな
344 :
デフォルトの名無しさん :2011/07/03(日) 00:32:03.67
C++やればすべてが解決
ポインタのときの*っていらなくね? 型のサイズがわかったらいいんだろ?
348 :
デフォルトの名無しさん :2011/07/03(日) 01:30:39.68
**のとき、何のサイズがわかったらいいんだ?
350 :
デフォルトの名無しさん :2011/07/03(日) 01:34:20.64
うん、すっごーく深く考えてるよ 人に丸投げするような下郎とは次元の違うところで
絶望の壁 [単行本] 北村 謙 (著) 商品の説明 内容(「BOOK」データベースより) 弱音を吐くな!―やれば出来るのさ。あなたは死ぬまでに幾つの夢を手にする事が出来るだろうか?絶望という壁を乗り越えて。
メモリ使用量の話なんだけど 配列でn要素取得するのと ポインタ配列をn要素取得した後malloc関数で n要素領域確保して割り当てた場合では 後者のほうがポインタ変数n-1個分多くなる?
>>353 管理領域があるから差はもっと大きくなるよ
なるへそサンクス 管理領域でぐぐってくる
void Func(int m, int n) { if(m < n) { /* do something */ ; return Func(m , n - 1) ; } } こういうコードはループに置き換えられるって本当?
358 :
デフォルトの名無しさん :2011/07/03(日) 20:59:12.19
>>356 returnするということは、もうその関数内でm,nは使われない
ということは変更してしまってもいい
ということで以下のように変換できるし、勝手にコンパイラが最適化してくれる
voidじゃなかったとしても大体同じ感じで書き換えられる
void Func(int m, int n)
{
while(m < n)
{
/* do something */ ;
n = n - 1;
}
}
配列とポインタの関係がよく理解出来ない(´・ω・`)
361 :
デフォルトの名無しさん :2011/07/03(日) 21:24:44.39
>>360 ポインタのポインタや
構造体のポインタをやるといい
もうちょっと具体的に行ってくれないと困るな 隅から隅まで説明することもできないし
363 :
デフォルトの名無しさん :2011/07/03(日) 21:32:35.03
char str[10]; str==&str[0]
×ポインタ ○ポインター
その手の話はよそでやってくれ。
int mi[10]; int *pi=mi; pi+1 == &mi[1] long ml[10]; long *pl=ml; pl+1 == &ml[1]
Rubyバカにしてる子ってさ 変数に$ついてる言語触ってるって事だよね いちいちSHIFT+4キーおして $ 打ちまくってる感触はどう? 土方が何をほざいて
NGに設定っと。
struct VECTOR { float x, y, z, pad; }; struct VECTOR A, B; f() { A = B; } このコードを gcc -S a.c して出力されたアセンブラコードを見たら .file "a.c" .comm A,16,4 .comm B,16,4 .text .globl f .type f, @function f: pushl %ebp movl %esp, %ebp movl B, %eax movl %eax, A movl B+4, %eax movl %eax, A+4 movl B+8, %eax movl %eax, A+8 movl B+12, %eax movl %eax, A+12 popl %ebp ret .size f, .-f .ident "GCC: (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2" .section .note.GNU-stack,"",@progbits
372 :
371 :2011/07/05(火) 00:28:38.03
コンパイルオプションでSSEを指定すれば変わるかと思って gcc -S a.c -O4 -msse3 -march=core2とした場合だと .file "a.c" .text .p2align 4,,15 .globl f .type f, @function f: movl B, %eax pushl %ebp movl %eax, A movl %esp, %ebp movl B+4, %eax movl %eax, A+4 movl B+8, %eax movl %eax, A+8 movl B+12, %eax movl %eax, A+12 leave ret .size f, .-f .comm A,16,4 .comm B,16,4 .ident "GCC: (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2" .section .note.GNU-stack,"",@progbits SSEの128bitレジスターを使った転送をしてくれるかと思ったら、ぜんぜん普通にmovlで32bitづつだった。 (gcc version 4.5.2) 最適化によるSSEのフル活用って、実際はあまり期待できないのかもしれない。 この辺はインラインアセンブラなどで手書きするのが確実なのかもしれない。
インラインテディベア
>>372 SSEの128bitレジスターを使った転送
だとどのくらい早くなるの?
alloca()使い居ます?
>>372 SSEはMMXと違ってOSのサポート云々があるからgccが躊躇してるとか?
代入先のアドレスのアライメントが仕様外の可能性あるからという線は?
// これならgcc4.3.4でmovapsを使うんだけど。 // 構造体だったりローカル変数だったりするとどうも弱いね。 typedef struct {float x, y, z, w;} Foo; static void f(float * A, float * B, int cnt) { for (int ic = 0; ic < cnt; ++ic) A[ic] = B[ic]; } void foo() { static Foo A; static Foo B; f((float *) & A, (float *) & B, sizeof(A) / sizeof(float)); }
そういうのはintelコンパイラの独壇場ってイメージだな
最適化されないコードの話かいな?
clock()って連続で呼び出したら必ず違う値を返す?
No
ポインタってどうゆう場面で使うんですか? 使い道が想像つかない...
ボタンをクリックするとき
>>383 想像つかないうちは使わないほうが良いプログラムをかけるから使わないほうがいいよ
387 :
デフォルトの名無しさん :2011/07/06(水) 13:25:16.52 BE:2145322548-2BP(0)
テキストファイルの文字数と数字と改行をカウントするプログラムなのですが、 うまく実行できず、困ってます #include <stdio.h> #include <stdlib.h> void main (void){ FILE*fp; int ou,co,su,nn,kk; char fn[20]; printf("ファイル名を入力してください \n"); scanf("%s",&fn); fp=fopen(fn,"r"); if(fp==NULL){ printf("ファイルが開けません。\n"); exit(0); } ご指摘お願いいたします。
388 :
デフォルトの名無しさん :2011/07/06(水) 13:28:48.84 BE:4826974289-2BP(0)
while(kk!=EOF){ if((kk>='a')&&(kk<='z')){ co++; } else if((kk>='A')&&(kk<='Z')){ ou++; } else if((kk>='0')&&(kk<='9')){ su++; } else if(kk=='\n'){ nn++; } kk=fgetc(fp); } printf("英大文字は%d文字\n",ou); printf("英小文字は%d文字\n",co); printf("数字は%d\n",su); printf("改行は%d\n",nn); fclose(fp); }
>383 大量のデータを関数に渡すor複数のデータを関数から受け取るとき。 最大データ量が不明のとき。
>383 ファイル読み込むとき、 「このファイルのデータをここ(ポインター指定)に最大nバイト読み込んでください」 って指定をする。 gfetc、fscanfとか例外もあるけど。
>>388 突っ込みどころが多過ぎるが、取り敢えず1レスに収まらないソースはcodepadかideoneに貼れ。
それからコンパイラの警告レベルを引き上げて、警告をきちんと読め。
そうだね。
例えば10進数で15は2進数で1111ですが この1111を1000+100+10+1に分解して 出てきた2のn乗をそれぞれ記録したいんですが 1111を分解するいい方法はありませんか?
ビット演算
397 :
394 :2011/07/06(水) 19:33:58.53
具体例書いてくれたらうれしいです
unsigned int a=15; unsigned int b0=a&1; unsigned int b1=a&2; unsigned int b2=a&4; unsigned int b3=a&8; unsigned int b4=a&16;
int b[10]; int i=0; int n=15; while(n) { b[i]=n%2; n/=2; i++; }
ありがとうございます。やってみます
typedef struct { int b0,b1,b2,b3; } ST_BIT; ST_BIT mBit[16] = { 1,0,0,0, 0,2,0,0, 1,2,0,0, 0,0,4,0, 1,0,4,0, 0,2,4,0, 1,2,4,0, 1,0,0,8, 0,2,0,8, 1,2,0,8, 0,0,4,8, 1,0,4,8, 0,2,4,8, 1,2,4,8} int a=15; printf("%d %d %d %d\n",mBit[a].b0,mBit[a].b1,mBit[a].b2,mBit[a].b3);
Cって呼び出せる場所を制限した関数ってつくれなかったっけ?
スコープの話か?
ああ子どもが砂場で遊ぶとき使うやつね
>>402 関数内関数はCには無いな
手続き型言語で非オブジェクト指向言語だとpascal位かな
407 :
デフォルトの名無しさん :2011/07/06(水) 21:27:43.13
codepadで書いたプログラムって保存される? 今課題で書いてる宿題プログラムがあるんだが パクられたくないから、ネット上に保存されたくない。 codepadってどういう仕組み?
>>407 privateにチェック入れる
あとで削除する
そもそも書いたコードをネットにうpしなければいいんじゃない?
410 :
デフォルトの名無しさん :2011/07/06(水) 21:36:31.24
>>408 privateの横の?あるけど英語分からんかった。
日本語に翻訳してもちょっと理解しにくいんで
翻訳してくれ。
絶対に誰にもばれたくない。
手元に開発環境つくれよ
412 :
デフォルトの名無しさん :2011/07/06(水) 21:40:13.82
>>411 何か簡単なプログラミング環境ないですか?
Cygwinしか入ってないです。
VC++ MinGW/GCC VirtualBox/Ubuntu
>>410 前半は省略して
privateにチェック入れるとRecent Pastesってところにリンクを張らない
検索エンジンにも引っかからない
URLを知っている人しか見られない
415 :
デフォルトの名無しさん :2011/07/06(水) 21:47:09.84
>>413 30分くらいで出来る奴頼む・・・
cygwinは20〜30分くらいで導入出来た。
もちろんパッケージは制限してだよ。
窓の杜とかも見たけど、何かいいのないですか?
>>415 つLSI-C
学習用途ならこれで十分だろ
417 :
デフォルトの名無しさん :2011/07/06(水) 21:51:17.08
>>416 cygwinみたいに実行時の端末もデフォでありますか?
>>417 つcommand.com/cmd.exe
>>415 つーかcygwinの何が不満なの?
インストールが楽なのはVC++だけど、
Cの学習用としてCygwinよりBetterだとは思わない。
今時LSI-Cは有り得ない。intが2バイトなんて学習用途として最悪だ。
ショートファイルネームしか扱えなかったんじゃなかったっけ 今じゃ辛いな
422 :
デフォルトの名無しさん :2011/07/06(水) 22:38:27.09
>>419 二つの環境で動作OKだったら安心だから。
安心チェック!
424 :
デフォルトの名無しさん :2011/07/06(水) 22:42:01.39
>>419 cygwinってやっぱ良いの?
何が具体的に良いの?
メモリを効率よく多く呼び出せるとか?
>>422 んじゃ、gcc系はダブルチェックにならないのでVC++かな。
インストールは簡単。インストーラを起動して、次々、同意、
とかしていればよい。
だが、ネットワークインストールになるので
ダウンロードに時間はかかる。
分かっている人にはなんでもないけど、初めのうちはC++として
コンパイルしがちなので注意。
426 :
デフォルトの名無しさん :2011/07/06(水) 22:45:29.37
VC++って何の略? ビジュアルスタジオのことじゃないよね?
>>424 おっと、回答しているうちにレスが。
期待した答えと違うかもしれないが、cygwinが
優れているわけではない。
gccがコンパイラの定番であり、同時に最前線といえる存在だから、
ということが大きいかな。
>>426 VC++ = Visual C++
c言語で参照範囲にかかわる修飾詞は externのほかになにかありますか?
static
>>428 externは記憶クラス指定子(storage-class-specifier)のひとつ。
同じく記憶クラス指定子に属するのは
auto, register, static, typedef
実際はstaticとexternだけ気にすれば良い。
431 :
デフォルトの名無しさん :2011/07/06(水) 22:56:20.80
>>427 visual studioとvisual C++は一緒?
433 :
デフォルトの名無しさん :2011/07/06(水) 23:00:18.18
>>432 え?でもgoogleでvisual C++で検索かけると
Microsoft visual studio expressってのが一番上にくるんだが・・・
434 :
デフォルトの名無しさん :2011/07/06(水) 23:02:21.88
それとネットワークインストールって何ですか?
435 :
デフォルトの名無しさん :2011/07/06(水) 23:06:48.16
ネットワーク経由じゃないインストールって逆にあるのかw?
>>433 VisualStudioはMSの開発用スイート
MS Officeにワード、エクセル、パワポ・・・が含まれているように
VisualStudioにVB,VC#、VC++…が含まれている。
ネットワークインストールっていうのは、ネットワークを介して
インストールすること。VC++のインストーラは、インストールイメージの
ダウンロードやその実行をしてくれる。レジュームなどの面倒も
見てくれる。
>>435 前は(VS2005とか2007あたりだったとおもうが)インストールイメージを
まるごとダウンロードできた。
インストールイメージは600MB位だったので、
いっぺんに10台とかインストールするときには
ダウンロードしたイメージをCD-Rに焼いてから、実行すると
効率的だった。
438 :
デフォルトの名無しさん :2011/07/06(水) 23:16:32.18
Unix時代ってどうやってプログラム書いてたんですか?CUIですよね? メモ帳とかワードパッドとか、編集用のアプリケーションとかあったんですか?
>>438 定番はその頃からVIとemacs。どちらも元々ターミナル用のエディタだった。
>>439 違和感あるなと思ったら、VIはないな。vi
VSの流れで大文字にしてしまった。
そもそもvi自体がない
442 :
デフォルトの名無しさん :2011/07/06(水) 23:23:30.27
>>437 全然言ってる意味わからんくてワロタww
環境を導入するときってzipファイルとかじゃないんですか?
444 :
デフォルトの名無しさん :2011/07/06(水) 23:31:22.74
イメージファイルって、例えばPCゲームの場合でいうと,ソフトCDを CD-ROMドライブにいれてないのに、それが入ってる状態としてハードディスク が認識している状態のファイルのことですか? 良く分かりません。
445 :
デフォルトの名無しさん :2011/07/06(水) 23:36:40.66
学校の課題で
タイピングゲームで単語の先頭から1 文字ずつ比べて初めてミスタイプした文字をミスタイプ文字とし
て記録し、一番多くミスタイプした文字を表示するようにせよ。というものがでました。途中までは頑張ったのですが
27行目をどうしたらよいか悩んでいます。教えてください。途中まで
http://codepad.org/o56IuzN8 言語:C言語
OS:Linux
コンパイラ;gcc
最近仕事はマンネリ気味・・・ どこかに面白いソースとか転がってないかな?
448 :
デフォルトの名無しさん :2011/07/06(水) 23:56:51.45
>>441 vi、emacs以前はわからない。ラインエディタとかあったのだろうか。
もしかしてパンチングカード?
>>443 catって編集できないぞ。まぁ釣りだろうけど。
>>444 当たっていそう。CD-Rにそのまま焼けたり、deamon Toolでマウント出来たりする。
>>442 >全然言ってる意味わからんくてワロタww
わからんのは、あなたが無知だから。
無知すぎて説明のしようがない。
450 :
デフォルトの名無しさん :2011/07/06(水) 23:58:49.94
>>447 基本的に面白いソースってどういうものをいうの?
プログラムって基本的に計算だよね、面白さはどこに見出すの?
>>449 >catって編集できないぞ。まぁ釣りだろうけど。
Bill Joy cat で検索
454 :
デフォルトの名無しさん :2011/07/07(木) 00:10:59.20
>>452 英語読めってのか?って突っ込まれたいだけだろお前。
IOCCCとか人によっては面白かったりするんじゃない
>>454 英語は読まなくていいよ
そこにある otccn.c と otccelfn.c が面白そうなので紹介しただけ
457 :
449 :2011/07/07(木) 00:14:44.07
>>451 >>449 書いたあとで、ワンライナー位なら行けるか、と思っていたらviですか。
まぁそれは都市伝説にしても、ラインエディタでコーディングとか、
とても想像できない。
>>420 学習用途でバイトの違いって重要か?
変な所にこだわるな。。。
そういや以前マクロを駆使してPascalっぽいコーディングをしていたソースを見たことあるな
460 :
デフォルトの名無しさん :2011/07/07(木) 00:17:27.34
>>449 vi,emacs以前というと。。。edだな
まんまediterの略
>>420 学習用途でバイトの違いって重要か?
しかも独学じゃなく、学校のお授業だぞ?
独学ならwinじゃvcかcygwin+gcc薦めるとこだが
(bccが個人的に一番好きだったが、亡くなったしね)
>>464 こういうマクロの組み方には
有名な元ネタがあるんじゃなかったっけ?
何かで読んだ気がする
467 :
デフォルトの名無しさん :2011/07/07(木) 04:54:05.00 BE:670413825-2BP(0)
どなたか入力された英大文字、英小文字、数字、改行の数を数えるプログラム書いてください。 自分ではなぜかうまくいかないので、参考にしたいのでお願いします。
出納帳の真似事をやってみたと思いねぇ。 intが2バイトじゃ、ちょっと買い物したら覿面にオーバーフローしちまう。 おまけにprintf("%g", price * 1.05)なんてやろうと思った日には、リンクするライブラリにまで気を遣わなくちゃなんねぇ。 それがLSI-Cを使うってこった。
いまどきintが2バイトかもしれないと考えながら教える人も少ないだろ
危ないから int は禁止(goto と同様に) ってバカ避けを増やしていかないといけないってことか バカを取り除くほうが有用な気もするが
それもあってのC99のヘッダ追加だろう
今のご時勢... 入門ならほとんどググッて解決せん? インターネットに繋がらなければ知らんが CのOOPページを紹介してくれ 最近ホットな話題なんで
それこそぐぐれしw
>>474 ホット。。。か?
あんな苦し紛れな事するぐらいなら、C++をベターCとして使った方が良いだろ
漢の浪漫としても2流
CでOOPとかどう考えても苦行だろ
アホだな 苦行の世界だから 未知の価値があるのに C++他なんて出来て当たり前 エンベッティドの世界はOOPはまだまだだよ! てか C++でROMとヒープに納めきられる?
>>476 LSI-C は 32bit Windows 上で動きますが?
CでOOPならGObjectだ で、マクロ書くのメンドクサくなってValaへ移行するんだ
>>480 むしろ、そんな小さいプログラムにOOPが必要有るのかと。。。
OOPって言葉を最近覚えて使ってみたかったんだな。(゚σ ゚)ホジホジ
なんだよ 一辺に答えるのか w
>>475 ほう... デザパタのメディエーターの実装例を見たいんじゃが
>>484 もはや512KROM 64KSRAMも当たり前のチップ世界なんだが 小さいのか?
ただC++ではオーバフローするが...
>>485 残念ながらCでのOOPの導入は済んでる... がデザパタがいまいちしっくりきていない
入門編はOOPの入門編もある このスレの範疇であれば良いが...
>[迷信] 今どき int が 16 ビットの処理系なんて無い ... >では、int 型が 16 ビットの処理系は過去の遺物で、今では極例外的な存在でしかないのでしょうか? >もし、本気でそのように考えているのであれば、井の中の蛙になっていることを疑わなければなりません。 >現在でも、H8 や M16C、PIC など、組込み向けの処理系では int 型が 16 ビットのことは普通にあります。 >それらの処理系は、レガシーなものだといえばそうかもしれませんが、広く普及し、現在でも広く使われているわけですから、 >これらを無視して「今どき int が 16 ビットの処理系なんて無い」という論は成り立ちません。 そもそも「今どき int が 16 ビットの処理系なんて無い」という主張を聞いたこと無いんだけど…。
>>486 良く読め馬鹿野郎
その規模だとオブジェクト指向で作る事自体が無駄だって言ってんだろ
linuxのカーネルの規模でさえc++使ってねーよ
(linusがc++嫌いってのもあるが)
オブジェクト指向が生きるのはメモリがMB単位になってからだ
そもそも「オブジェクト指向が生きるのはメモリがMB単位になってからだ」という主張を聞いたこと無いんだけど…。
>>489 今言った
でも、これなら聞いた事無いか?
オブジェクト指向は規模が小さいと逆にコード量が増える
これは新しい学説ですな。φ(・ω・ )カキカキ
>>491 むしろ昔から言われてるがな。。。
オブジェクト指向は万能薬じゃないんだし
マンセーし過ぎ
HelloWorld書いてみたらわかる
まぁでもコード全域に渡ってオブジェクト指向的にする必要はないと思うけどね。 再利用できそうな部分はうまく分離できるように作ってあれば、なんでもいいんじゃない。
int ttt(){ char *po=malloc(size); ... if(...){ /*ここにあるエラー処理から下のfree(po);へジャンプしたい*/ } ... free(po); /* ← ここに飛びたい*/ return 0; } goto使用以外にジャンプする手段ありますか?
496 :
デフォルトの名無しさん :2011/07/07(木) 22:08:47.35
多動だろ
>>495 malloc と free の間を関数にするか do{}while(0); で囲む
> ... > if(...){ > /*ここにあるエラー処理から下のfree(po);へジャンプしたい*/ > } ... if(...){ /*ここにあるエラー処理から下のfree(po);へジャンプしたい*/ } else { ... } とか。関数にしてreturnさせるとか。
499 :
デフォルトの名無しさん :2011/07/07(木) 22:11:55.80
お願いします [1] 授業単元:C演習 [2] 問題文(含コード&リンク) getopt_longを使ったargv引数解析を行いなさい。 引数: --apple 1 (省略形はなし,ハイフンは2つ,続引数は必ずあり) -peach (省略形はなし,ハイフンは1つ,続引数はなし) -lemon (省略形はありで-l,ハイフンは1つ,続引数はなし) -melon (省略形はなし,ハイフンは1つ,続引数はあってもなくてもよい) ※続引数がある場合はそれを表示しなさい [3] 環境 [3.1] OS:linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 本日中
スレ間違ってるぞ
501 :
デフォルトの名無しさん :2011/07/07(木) 22:16:58.11
はい、申し訳ありません。。気を付けます。
502 :
495 :2011/07/07(木) 22:18:59.26
参考になりました。 どうもありがとうございます。
po=malloc(size); switch (...){ case true: 〜; if (error) btrak; 〜break; case false: 〜} 〜; free(po);
typedef struct s{ char ch[2]; } S; S s[100]; ってやるのと char ch[100][2]; ってやるのではどっちのほうがメモリ節約できますか?
前者 理由はウェブで!
ぐぐってみたがよく分からん 管理領域が関係してるのか
後者だろ。
変わんねーよ 添え字のアクセスはコンパイル時に決定されるから領域使わない
環境によっては alignment の影響を受けるかもね
前者だと sizeof(S) == 4 となる可能性無い?
比較演算を等号の意味で使う馬鹿が後を絶たないのは何でだ?
掲示板で他人を馬鹿呼ばわりする人間が後を絶たない事の方が不思議だわ
理解できるなら使用してもかまわんだろ。
普通の等号だと assignment になっちゃうしな
そもそも、等号というのは比較演算をした結果を返値とする演算子なので。
>>511 は行間が読めないだけだよ
通常はこの文章を
sizeof(S) == 4
が正となる可能性無い?
と読み解く。
C言語のソースでもないのに==を比較演算と捉えるバカが後を絶たないのはなんで?
じゃあ普通に等号書けよ 前者だと sizeof(S) = 4 となる可能性無い? こう書けばいいだろ。
文脈を読めない可哀想な子
いわゆるtouchコマンドをエレガントに実装したいんだけど どうしたら格好いい?
>>520 $ cp `which touch` elegant_touch
>>522 $ cat elegant_touch.c
#include <sys/syslimits.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
if(argc < 2) exit(1);
char buf[ARG_MAX];
snprintf(buf, ARG_MAX, "/usr/bin/touch %s", argv[1]);
system(buf);
}
うん、やっぱりバグってる。 ギャグがすべるのはしょうがないとしても、噛んじゃうのはダサいな。
>>525 そうじゃなくてエレガントな実装をお願いします
コードを書く阿呆と コードを書かない阿呆は どっちが偉いんだろう?
書かなきゃ損損
どんなだろうと阿呆は偉くない
偉い人は自分が阿呆だと知っている
コードを書かされるアホが最低ランクということは確かだ
532 :
デフォルトの名無しさん :2011/07/08(金) 22:15:50.02
能力なくてガチで逃げ回ってるアホにはかなわんだろ 上には上がいる
画像データの1次元配列の、データ格納形式を
元データ : int32 = 0x00FFAA11; // FFは赤、AAは緑、11は青
先データ : char[3] = {R, G, B};
へとコピーしたいです。
たとえば
long src[10] = {
0x00FFAA11, 0x00FFAA11, 0x00FFAA11, 0x00FFAA11, 0x00FFAA11,
0x00FFAA11, 0x00FFAA11, 0x00FFAA11, 0x00FFAA11, 0x00FFAA11
};
char dst[3 * 10];
として、現状は
void convert(char* dst, long* src, int pixel_len)
{
int i;
for(i=0; i < pixel_len; i++) {
dst++ = (src
>>16 ) & 0xFF;
dst++ = (src
>>8 ) & 0xFF;
dst++ = (src
>>0 ) & 0xFF;
src++;
}
}
としてるのですが、これをSSEで置き換えようとしたら、1ピクセルのデータ長さが24bitと32bitで異なることが原因で、
効率的にxmmレジスター上で展開するというパズルが解けなくてこまってます。
convert()を、128bit単位の変数操作を効率的に駆使して行う方法が思いつきません。だれか良い方法を編み出してください。
memcpy(&ch[m], &src[n], 3) で済むようにデータを並び替えろ。 SSEはしらんが。
超基礎でも良いですか?
良いです
ポインタに関してなんですが、授業、教本 に書いてある解説は読むと言っていることは理解出来ます。 ですが、ポインタのメリットが良く分からないのでイマイチ使い所が分かりません。 郵便番号に例えられても、ああそれで?となってしまうので、ポインタのメリットとポインタを使う意義を教えて貰えませんでしょうか?
関数にデータを渡すとき、引数のコピーを渡します。 10Mのデータを渡したとすると、呼び出し元関数、呼び出し先関数両方で合計20Mのメモリを消費し、 呼び出し先関数がさらに別の関数に渡せばさらに消費します。 またデータのコピーするのに時間も消費します。 ポインターを使うと2〜8バイト程度の処理で済みます。
あと、関数の戻り値は1つのデータしか返せません。 ですがポインタを利用することで多数のデータを返すことが可能です。
ありがとうございます。完結で分かりやすい説明でした。メモリの節約、スピードアップに効力を発揮するわけですね。
>>537 ずっと複雑な構成のプログラムになると、ポインタでなければ表現できないものも存在します。
「アルゴリズムとデータ構造」
でググッてみてください。
ポインタの存在そのものが計算機科学にかかせないのです。
横から済みません。ポインタが存在しない言語では実装できないロジックってあるんですか?
質問があります. UnixのプログラムをWindowsに移植しています. initstate(2, rngState, 256) って関数はマイクロソフトのCのライブラリには無いようで 調べてみると乱数と関係する関数の用です. これを移植するにはどんな関数や代替的な処理をすればよいでしょうか?
>>542 ポインタと陽にいっていないだけで、ポインタと同じだったり(Java)、あるいは、ポインタのかわりに参照があったり(Pascal)、
ポインタがなくとも、自分で領域管理をして配列の添え字をもってポインタとしたり、手はいろいろあります。
>>543 ・initstate()を使用している目的を調査する。
・その結果、必要があれば自前で同等の乱数生成器を作る。
・それができないならrand()を何らかの方法で変更し、呼び出す毎に値を保存する。
・そもそも乱数系列がUnixのそれと一致していないといけないのなら、諦める。
要は、乱数をどう利用しているかの調査が必要。
546 :
デフォルトの名無しさん :2011/07/09(土) 10:49:24.52
>>542 言語仕様上はポインターが無くても、チューリング完全であれば、実装は理論的には可能です。(Brainf*ckなど)
ただしアプリケーションの目的によっては、実行パフォーマンスなどが、実用的でない場合も多々あります。
逆に言えば、アプリケーションの分野ごとに最優先事項が異なるため、多数のプログラミング言語が考案された、とも言えます。
547 :
デフォルトの名無しさん :2011/07/09(土) 10:58:04.13
>>516 このバカは、比較演算子が正負を返すとでも思っているのだろうか?
8bit時代のBASICは配列サイズが固定だったから不便だったな。 clearで初期化できるけど全変数消えちゃうし。 まぁ、アロケート出来ないなら出来ないなりの処理を考えるけど。
>547 まだ居たの?粘着キモイよ。
自作関数を作ったんだけど引数は呼び出し側でもらったほうがいいの? それとも関数の中でもらったほうがいいの?
意味不明
552 :
デフォルトの名無しさん :2011/07/09(土) 11:12:13.13
>>549 バカ発見。ねえねえ、比較演算子って正負を返すと本気で思ってたの?
普通は外部ファイルにテキストで書き出して関数の中でテキストを読み直すよ
値は返すだろ
呼び出す前に引数の内容をprintfして関数内でscanfを呼び出して テキスト入力させるのが一般的だよ
Cの場合は真=1、偽=0なので 正となる可能性 真となる可能性 どちらもおんなじ
偽:0 真:0以外
563 :
デフォルトの名無しさん :2011/07/09(土) 11:26:55.87
コンピュータで連続的な量ってどうやって扱うんですか?
数として連続量を扱いたいというのなら原理的に不可能
>>564 アンカー間違えてない?
559=562=俺
>552 バカはお前だ。 549は比較演算子の話しなんかしてねぇよ。お前がキモイってこと以外書いてないだろ。 林先生「まさかとは思いますが、549が「比較演算子って正負を返す」と主張したというのは、 あなたの想像上の出来事にすぎないのではないでしょうか。」
569 :
デフォルトの名無しさん :2011/07/09(土) 11:38:48.64
正となる → 正負を返す どうやら0を認識出来ないようだ
573 :
549 :2011/07/09(土) 11:43:08.11
>569 赤の他人だよ。妄想乙。
そのアナログ量が周期的なものか、そうでないのかによって扱い方がかわる。
周期性があればFFTが使えるかも。
(゚σ ゚)ホジホジ
== たったこの2byteで盛り上がれる素敵なスレ
>563 PCMデータについて色々調べてみたら?
最小の単位を設定するだけだろ。 アナログもクソもない。
A/D変換の問題
量子れべるでかんがえたら、しょせんこのよは、みんなでじたる。
配列から二つの要素を削除したいんですがどうすれば良いですか。
>>584 Cでは出来ません、が正しい答えだけど、どうなれば「削除」したことになると思っている?
とりあえず消したい配列の要素を格納しといて後から詰める方法でやろうと思ってるんだけど消したい要素が2つあると難しい
HDDを思いっきり叩いてみる
588 :
デフォルトの名無しさん :2011/07/09(土) 20:45:24.83
「1つの要素を削除する」という処理を2回やれば済むだろ
for(i = j = 0; i < N; i++) { if(a[i] = b || a[i] == c) continue; a[j++] = a[i]; }
a[i] == b
まず問題が正しく理解できてないな。 質問が曖昧すぎる。
>>588 例えば
a[10]で2と5の要素を詰めようとすると2の要素を詰めることで5の要素でなくなるということじゃまいか
for(i = j = 0; i < N; i++) { if(i == b || i == c) continue; a[j++] = a[i]; }
( ゚д゚)ノ ハイ!シツモーン! Visual Studio コマンドプロンプト(2010)を使っての操作です。 Winのメモ帳で #include <stdio.h> int main(void) { printf("Hello World!!"); return 0; } って書いて、「smp1.c」って保存したんだ。 ここでコマンドプロンプトをつかって、 notepad smp1.c って入力してEnterを押したんだが、 メモ帳 「ファイルsmp1.cが見つかりません。新しく作成しますか?」 ってでてくる。 ちゃんとはじめにメモ帳に保存したのにできんのはなぜなんだあああああああああああああああああ
>>584 void
del(int a[], int n, int p1, int p2){
int i;
if (p1 < p2) {
i = p1;
p1 = p2;
p2 = i;
}
for (i = p1; i < n - 1; i++)
a[i] = a[i + 1];
for (i = p2; i < n - 1; i++)
a[i] = a[i + 1];
}
>>596 cd notepad smp1.c
ってことでふか?
これ入力したけど指定されたパスが」見つかりませんってでるお( ^ω^)
やり方間違えてたら指摘よろ
式Aが真のときある動作をして1を返し、負のとき何もせず0を返す、という関数aを作って、 別の関数bで、関数aが真なら0からカウントアップしていく、という事をさせたいです。 //関数a int a(){ if (A) { 「ある動作」; return 1; } else {return 0;} } //関数b int b(){ int n; n=0; if(関数a()==1){n++;} return n; } 色々省いて概ねこのように組んでるんですが、nが0で帰ってきます。何がおかしいんでしょうか…
すみません、関数bですが、 if(関数a()==1){n++;} はfor文で何度か式を評価させてます。
Aが真になってないだけじゃないの?
しかし「ある動作」はなされているので、真になっているはずなのですが…
>>599 それだと
int b(){ return a(); }
と同じ意味になってしまうけどいいの?
カウントアップするなら
int b(){
static int n = 0; // 最初に呼ばれた時だけnを0に設定する
if(関数a()==1){n++;}
return n;
}
こうすればa()が1を返す毎にnが+1される
604 :
600 :2011/07/10(日) 02:41:28.22
>sudoku_del(s,r1,c,k); >if(sudoku_del(s,r1,c,k)==1){n++;}
>>605 すみません、sudoku_del(s,r1,c,k)の行を消しておくのを忘れていました。
しかしそれでも依然0が返ってきます。よろしくお願いします。
データがおかしいんじゃね? sudoku_t dat = { // cell[0][0]は3で確定してるものとする 0x004, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff }; int main() { int n = sudoku_del_col( &dat, 0, 0); return 0; } これでn=8になるよ。
あと出来るだけシンプルに書いた方がいいよ。頭が混乱するからw たとえばこんな感じ int sudoku_del(struct sudoku_t *s, int r, int c, int k) { int mask = 1 << (k-1); int *cell = &(s->cell[r][c]); if(*cell & ~mask) { *cell &= ~mask; return 1; } return 0; }
610 :
608 :2011/07/10(日) 07:48:26.50
間違えた if(*cell & mask) { だった
612 :
608 :2011/07/10(日) 12:44:45.75
あ?
芸術的字下げってやつか
614 :
608 :2011/07/10(日) 13:11:23.64
>>612 コラコラw
>>611 mainの中だけの変更でできたっぽい
//*** start update ***
// int r0,c0,n0;
int r0,c0,n0 = 1; // n0をちゃんと初期化する
//*** end update ***
for(c0=0;c0<=8;c0++){
//*** start update ***
// sudoku_kill_col(&s,r0,c0);
// sudoku_kill_row(&s,r0,c0);
// sudoku_kill_block(&s,r0,c0);
// いらない
//*** end update ***
n0 = n0 + sudoku_kill_col(.....
<出力>
258|736|941
619|824|357
437|915|268
---+---+---
395|271|486
762|498|135
841|653|729
---+---+---
184|369|572
576|142|893
923|587|614
>>608 ビット反転多用するくらいなら
01の意味を逆にしたほうがよくね?
616 :
608 :2011/07/10(日) 13:42:18.12
>>615 そこまで変えちゃうと質問者が理解出来なくなるんじゃね?
もうちっとシンプルに書けないもんかね
>>617 が画期的なほどにシンプルなソースを公開してくれるそうですよ!
scanfとgetsてどう使い分ければいいの?
int kill(struct sudoku_t *s, int r, int c) { int i, j, k, n = 0, tr, tc; for(k = 1; k <= 9; k++) { i = 0001 << (k - 1); if(s->cell[r][c] == i) { for(j = 0; j < 9; j++) { if(j != r && s->cell[j][c] & i) s->cell[i][c] &= ~i, n++; if(j != c && s->cell[r][j] & i) s->cell[r][c] &= ~i, n++; tr = r / 3 * 3 + j / 3, tc = c / 3 * 3 + j % 3; if((tr != r && tc != c) && s->cell[tr][tc] & i) s->cell[tr][tc] &= ~i, n++; } break; } } return n; }
621 :
デフォルトの名無しさん :2011/07/10(日) 15:35:39.91
関数なんですが 値Xを受け取るとします。 { if(){Xの操作 return X} else if(){Xの操作 return X} } とするのと { if(){Xの操作 } else if(){Xの操作 } return X } とするのでは結果が違います・・・何故でしょうか? Xが決まった段階でreturnするのだから結果は同じだろうと思うのだが・・・
結果は同じ
後者の場合に、最初のifでX操作した結果次のifの条件を満たしたりしてない?
>>621 {
if(){Xの操作 }
else if(){Xの操作 }
else{ }
return X
}
else if
627 :
デフォルトの名無しさん :2011/07/10(日) 15:45:04.25
>>624 else ifってのは先行のifを満たしたらその操作はしないってことでは?
else ifを使わずに
if二連続だと
if(){}
if(){}
となってれば
後者のifが前者の〜ryだと思い諦めがつくんですが。
二つのifをどちらも満たさない場合が違う。
630 :
デフォルトの名無しさん :2011/07/10(日) 16:31:17.71
double normalize(double th) { if(th<=-PI) { while(-PI<th&&th<=0||0<=th&&th<=PI) { th=th+PID; } return th; } else if(th>PI) { while(-PI<th&&th<=0||0<=th&&th<=PI) { th=th-PID; } return th; } else return th; } です。
if内のreturn th;を削っただけで、最後のelseをはずしてないとか?
632 :
デフォルトの名無しさん :2011/07/10(日) 16:43:48.40
633 :
デフォルトの名無しさん :2011/07/10(日) 16:46:36.36
ちなみにこの関数は 角度を-π<x<=πの間に直す関数です。角度=x この間にあれば直す必要ないので、受け取った引数をそのまま返したいのです。 PID=2π PI=π です。
2 * pi は tau だな
635 :
デフォルトの名無しさん :2011/07/10(日) 16:53:26.05
>>634 なんかおかしいでしょうか?
改良してください・・・
ちなみにラジアンです。
ですが分かりにくいので弧土法だと
430°=70°
230°= -130°
1000°= -80°
1200°=120°
という感じです。
実際のプログラムはこれのラジアンです。
3.15だと、PIより大きいですから、3.15-6.28=-3.13ですね。
話ぶった切ると、
>>621 の解決法は「正しく動く方を使え」。
どうせ使わない変更後のコードの話なんかしてたら、時間が幾らあっても(ry
話をつなげると、そもそもwhileでやる事なのかコレ?
>>635 こうだろ
double normalize(double th)
{
if(th<-PI)
{
while(th<-PI)
{
th=th+PID;
}
return th;
}
else if(th>PI)
{
while(th>PI)
{
th=th-PID;
}
return th;
}
else return th;
}
>>630 こうじゃね?
< if (th <= -PI) {
< while ((-PI < th && th <= 0) || (0 <= th && th <= PI)) {
< th = th + PID;
< }
< return th;
< } else if (th > PI) {
< while (-PI < th && th <= 0 || 0 <= th && th <= PI) {
< th = th - PID;
< }
< return th;
< } else
< return th;
---
> while (th <= -PI)
> th += PID;
> while (th > PI)
> th -= PID;
> return th;
>>632 書くならこんなかんじかと。
http://codepad.org/uzTNDg44 よく読んでいないけれども、
>>630 は、0<=th&&th<=PI がおかしいかもしれません。0<=th && PI <= th なら意味が通ります。
>>635 ここの住人はラジアンは大丈夫だと思います。
ちなみに「弧度法」=「ラジアン」であり、0°〜 360°等であらわすのは「度数法」といいます。
>>621 どちらも同じ意味です。
たぶんどちらかがポカミスしていると思います。今後の思考整理のため、この機会に突き詰めて納得しておくことをお勧めします。
double normalize(double th) { th = fmod(fmod(th, PID) + PID, PID); return th <= PI ? th : th - PID; }
642 :
621 :2011/07/10(日) 18:57:40.70
あw そうだそうだww while()の中が抜けないときの条件になってないww 逆だww
643 :
デフォルトの名無しさん :2011/07/10(日) 19:13:59.75
rand()で特定の範囲の値を出したい場合どうしたらいいですか? a≦x≦b c≦y≦dの範囲に出したい場合どうしたら?? x=b*rand()/RAND_MAX; y=d*rand()/RAND_MAX; ですか?
644 :
643 :2011/07/10(日) 19:17:53.37
もちろんa≦x≦b c≦y≦dの範囲に満遍なくランダム値を出したいです・・ どうすればいいでしょう?
0〜(b-a)になるようにして、後でaを足せば?
double r = double(rand()) / RAND_MAX ; double x = r * (b - a) + a; double y = r * (d - c) + c;
do { x = rand() / RAND_MAX; y = rand() / RAND_MAX }while(x<a || b<x || y<c || d <y);
> x=b*rand()/RAND_MAX;
それだと0≦x≦bになってしまうぞい。
x, a, bが整数、かつb-aがRAND_MAXよりも十分小さい場合限定で、
x = rand() % (b - a) + a;
というのはよく使ったなぁ。
あとは、オーソドックスに
x = (b - a) * rand() / RAND_MAX + a;
VC++のRAND_MAXは32767しかないので、精度が欲しい場合は、rand() | (rand() << 15) などとしたほうがいいかも…。
あと所詮は「疑似」乱数に過ぎないので、テストをお忘れなく。
ちゃんと検証しないと、こういうことになるので…
ttp://slashdot.jp/it/article.pl?sid=06/12/06/0155253
650 :
デフォルトの名無しさん :2011/07/10(日) 20:24:08.85
>> x=b*rand()/RAND_MAX; >それだと0≦x≦bになってしまうぞい。 ?
652 :
デフォルトの名無しさん :2011/07/10(日) 20:37:51.09
>>651 それでも条件で範囲に収まらないとはじいてるので大丈夫です。
>>614 ありがとうございました!やはりmain関数のほうで良くない動作してたみたいですね・・・
654 :
デフォルトの名無しさん :2011/07/11(月) 00:23:27.82
Cって何からとったの?
かるしうむ
おいww
それじゃ不十分だな。 ACPLという言語があって、 BCPLという言語があって、 その頭文字をとったBという言語があって、 次に2番目の文字とってCになった。
というのは錯覚
661 :
デフォルトの名無しさん :2011/07/11(月) 21:52:23.00
ちょっとまて、CCPL はどうした?
Window system の“X”も“W”の次だから“X”なんだよな。 そういう文化だったから、ってことなんだろう。
CってALGOLの子供かと思ってた
Zの次どないすんねん
英検1級、2級、みたいにC言語1級、2級みたいのってあるんですか?
あるけどまったくひょうかされない
あらま。
C言語で扱える最も単純なグラフィックシーケンスを教えてください。 テトリスとか作ってみたくなりました。
>>670 環境依存なので実行環境を決めないと無理
環境依存かは作り方次第
Windows7 は知らないけど SetConsole〜 が使えるかも
675 :
デフォルトの名無しさん :2011/07/11(月) 23:27:35.83
昔職場の昼休憩にUNIX(FreeBSD)でテトリス対戦してる人がいた(ネットワーク対戦)。 ずーっとキーボードカタカタ言わせてた。
俺の場合最初はncursesでブロック崩し作って遊んでた これが一般的かどうかは知らない
テトリスは集中力が持つ限り延々と続いてしまう
続いてしまうかは作り方次第
!=0とはなんぞ?
callocやmalloc(sizeof(n) * m)のような形で 取得した領域は free関数で先頭アドレス指定するだけで全領域解放されますか? それとも要素数分free関数を呼ぶ必要がありますか?
え?
callocやmallocを呼んだ回数分でおk
>>682 mallocした全ての分についてfreeする必要がある
それじゃ答えになってない
callocやmallocの戻り値は 一度だけfreeの引数に渡して呼び出して良い
確保した領域サイズに関わらず 一度の確保に対して 一度の開放という認識であってますか?
うん
malloc()の使い方調べるのに4時間以上かかるなら、なにか適当なテキストを 読んだほうがいいと思う。
自分で考えることをやめた人の質問は...
プログラム「allocさん、メモリ貸してください」 alloc「はい、使い終わったらfree課に返しておいてください」 プログラム「free課さん、使い終わったメモリ返しに来ました」 free課「只今担当者が不在のためまた後ほどお越しください」 ... プログラム「あとで返しに来いといわれ、いま来たのですが」 free課「ちょっと処理機の調子が悪くて…また後日に(ry] ... プログラム「今日返しに来いと言われたんですが」 free課「どのメモリか照合しますので少々お待ちください。」 ... free課「お待たせいたしました。このメモリはうちの課ではなく(ry」 プログラム「いい加減にせぇや!ゴルァ!!」 などと脳内コントがorz
ポインタにNULLを入れて何回でもfreeしてやる
おい姉ちゃんお前さんのfree関数ヌルヌルんなっとんでぇ
それはナルや
それアナルや
ああ、なるほど
お前らwww
画像データをメモリに格納する方法で、もっとも高速に読み書きができる方法は何か?で悩んでます。 例えば1ピクセルが32bitの、320*240の画像データを、1次元配列に格納する場合は、 int a[320*240]; として、x=60, y = 30 のピクセルに書き込むには a[(320 * 30) + 60] とするのが常套手段ですが、これだと乗算が一回現れてしまいます。 乗算は遅いので、乗算は避けたいです。そこで int a[240][320]; とした場合、a[30][60] でアクセスできますが、この場合、内部的には乗算が使われるのですか? それとも、a[0]〜a[239]までの定数テーブルが定義されてて、乗算無しでアクセスされるのでしょうか? これは仕様として内部動作の実装方法は規定されてるのでしょうか? いずれにしてもint x[240] の配列を int* y[320]に登録する形にして、 x=60, y = 30 のピクセルに書き込むには、*((y[30])+60)とすれば、乗算を節約できて速くなるような気がするのですが、 これは a[(320*30)+60]や、a[30][60]でよりも高速になりますか? それとも、CPUのパイプラインレベル等、何らかのオーバーヘッドが発生して逆に遅くなりますか? 試したいので誰か速度検証用に実験コード書いて下さい。
x86だとshiftやscaled index addressingに最適化されるだろjk コンパイラによっても違うしそれだけでは何とも言えない
>>699 a[(320*30)+60] と a[30][60] は同じ速度になる可能性が高く
このアドレス演算は1命令で実行されるので早い
*((y[30])+60) にすると最低でも二回アドレス計算するので確実に遅くなる
>>700 コンパイラーはGCC or ヴぃすあlC++を想定してます
そこまで具体的なのになぜ自分で測定しないのか
>>701 いやだからa[240][320]と大きさが固定されてるっしょ?
だからコンパイラはこれをヒントに大幅な最適化が可能なわけです
ポインタ配列はそのデータがL1/L2/L3キャッシュに乗っているかいないかで
大幅に速度が違ってくるので、CPUによっても異なり、なおさら一般的な
事は言えなくなる
>>702 1命令で実行されるとしても、その命令のレイテンシーはどうなのですか?割り算だって1命令ですよ。
>>703 自分の書いたコードがどんな汗吐いてるか見るところからやったら
>>705 y[240]のテーブルを予めprifetchしておけば、これだとどうですか?
>>702 320は定数だけど30と60は変数です。
この場合も1命令で可能なのですか?
>>704 ここで聞けばとっくに誰かが測定コード書いてるだろうと思ったからです
>>713 ここまで基本的な処理の検証だと測定するよりまずアセンブラを読んでみるのが普通だと思う
お前もがんばれ
地味な作業ができん奴はこっち系には向かないよ
大変かもしれませんがどなたかお願いします
有料で引き受けますが
QZなら5000モリタポでやってくれるってよ
C言語スレで申し訳ないがC++で良いならboost::progress_timerが簡単に使えるタイマーでいいぞ ベンチマークに最適
あれとそれとは全く同じコード吐いたよ
ポインタ配列通したらさすがに違うコード吐くだろ
もういいわ、自分でしらべた gcc -O0 a[240*y + x] time seconds seconds calls Ts/call Ts/call name 100.00 4.18 4.18 main a[y][x] time seconds seconds calls Ts/call Ts/call name 100.00 4.18 4.18 main *(Y[y] + x) time seconds seconds calls Ts/call Ts/call name 100.00 4.18 4.18 main z=240*y+x; a[z] time seconds seconds calls Ts/call Ts/call name 100.00 4.18 4.18 main なにこの骨折り損感… だ〜から聞いたんだっつ〜の… ねるわ…orz
>>723 最初のポインタ配列へのアクセスでキャッシュに残りが乗っちゃったようだね
そうなるとメインメモリへのアクセスが以降発生しなくなるからレイテンシがほとんどない
逆にL2/L3キャッシュが小さいCPUだとまた違う結果が出そうだ
しかしO0って最適化無しだろ? 同じコードを吐いている可能性もあるしなあ それで満足するのも・・・・
randの処理に比べたら配列のアクセスと代入ってゴミみたいなもんだったりしないんだろうか
for (int i = 0; i < N; i++) { rand(); rand(); } みたいに最適化されてるかも
gccだと最適化掛けてもほとんど速度が変わらないな ボトルネックは配列アクセスやアドレス生成じゃないだろ やっぱりrand()?
>>699 二次元配列を使おうが、普通に乗算しようが基本的に同じだと思う。
そこまで速度にこだわるなら、画像幅を2の累乗(320なら512)に切り上げて、ビットシフトだけで演算できるようにしたほうが良い。
コンパイラがどういう命令を吐いているかは、VC++なら/Faオプションで調査できる。
最適化レベルによっては、整数倍を勝手にビットシフトに展開することがある。例えば320倍ならば、(x << 8) | (x << 6)などに。
自分でインラインアセンブラで書いて検証するのも一つの手だが、コンパイラの吐いたコードはそれなりにCPUの特性を考慮してくれているので、まずそれを参考にするのがお勧め。
各ラスタの開始アドレスを覚えておく方法は、乗算一個ごときのためならお勧めしかねる。メモリアクセスにだってコストはあるし、キャッシュの無駄。
ところでx86のmul命令って、今でもまだクソ遅いのかな…。ターゲット機によるかも知れんが。
>>732 誤 : (x << 8) | (x << 6)
正 : (x << 8) + (x << 6)
736 :
デフォルトの名無しさん :2011/07/13(水) 09:23:38.03
てか画像関係ってことはフーリエ変換とかの知識いるの? だとしたらこの初心者スレで聞いても住人の数学レベルじゃ ついていけないんじゃね? このスレは高卒もいるだろうし。
高校でてるならフーリエ変換ぐらいわかるだろ
739 :
デフォルトの名無しさん :2011/07/13(水) 09:38:29.54
高卒の人でフーリエ変換わかる奴いる?いたら挙手
>>739 高卒の知識なら説明よめば理解可能だろうって意味だろどう考えても
そりゃそうだ 大学生は普通高校卒業してからなるものだから
厨房だけど フーリエ変換ってなにするもの?
微分方程式が機械的に解ける
745 :
デフォルトの名無しさん :2011/07/13(水) 09:49:33.25
>>741 それは承知だが大学受験しない奴はVCを習ってないんじゃないか?とも思うが。
ラプラス変換じゃないか?
>>745 そういうえばそうだごめんなさい
さすがにそこからだと隔絶大きいな
プログラム上だとどう利用されるの?
749 :
デフォルトの名無しさん :2011/07/13(水) 09:54:13.51
理系学部の入試でも出題範囲がUBまでのところあるんだぜwwwwwwwwww
>>748 画像とか音とかアナログ量をコンピュータ上で扱うのに便利かもね
>>743 一般的にいったら、ベクトル空間の基底変換だろ。
特殊なケースとして、関数空間(ある性質をもった関数全体)がベクトル空間となり
そこでの特殊な基底変換がフーリエ変換。
基底変換はフーリエ変換に限らずいくらでもある。
752 :
デフォルトの名無しさん :2011/07/13(水) 10:01:37.84
>>747 それに受験しないんだから1A2Bの知識だってかなり薄いんじゃね?
フーリエ変換ってのは画像の色の変化を波でとらえること。
数学においては全ての波は正弦波に分解できる。
良くわからないということだけはわかりました ありがとうございました
ローレンツ変換もベクトル空間上の可逆変換。 ローレンツ変換は、2 つの慣性系の間の座標を結びつける線形変換で、 電磁気学と古典力学間の矛盾を回避するために、ジョセフ・ラーモア(1897年)とオランダのヘンドリック・ローレンツ(1899年、1904年)により提案された。 アルベルト・アインシュタインが特殊相対性理論(1905年)を構築したときには、慣性系間に許される変換公式として、理論の基礎を形成した。 幾何学的には、ミンコフスキー空間における 2 点間の世界間隔を不変に保つような、原点を中心にした回転変換を表す。 ローレンツ変換のうち、空間と時間が関与する方向への変換をローレンツブースト (Lorentz boost) と呼ぶ。 特殊相対論が導く、我々の直感に反する事柄のほとんどは、このローレンツブーストからの帰結である。 ローレンツ変換 - Wikipedia
ここにも変換が出てくるが、わかりやすくする、かんたんにするためだ。 サポートベクターマシンは、教師あり学習を用いる識別手法の一つである。多くの手法の中で一番認識性能が優れた学習モデルの一つである。 各データ点との距離が最大となる超平面を求めるマージン最大化という基準で線形入力素子のパラメータを学習する。 線形分離不可能な問題への適用 再生核ヒルベルト空間の理論を取り入れたカーネル関数を用いてパターンを特徴空間へ写像し、 特徴空間上で線形分離を行う手法が 1992年に Vladimir Vapnik らによって提案された。 これにより、非線形分類問題にも優れた性能を発揮することがわかり、近年特に注目を集めている。 サポートベクターマシン - Wikipedia
頭大丈夫か?
フーリエ変換なんて、大学受験してない私でも理解できるよ。 要は、頭の使い方次第。
べつに再発見したってわけでもねぇんだ 習得するだけなら頭使わなくても参考書適当にひきゃ十分だろ
なんで定期的に知ったかちゃんが湧くの?このスレ
>>744 ラプラス変換ではなくて?あと線形微分方程式ね。
>>743 フーリエ級数展開の拡張形という見方もわかりやすい。フーリエ級数展開、なら高校生にも理解できる(証明はべつとして)。
>>759 ポインタ/キーワードを提供していただく、という意味で、好意的に捉えています。
過去の数学者の成果を自分の手柄みたいに語るんだなw
おっぱいの揺れについての 数式はないの?
普通にあったとおもう
フーリエはどちらかというと物理学者 熱伝導の研究からフーリエ解析に発展した 高校教師の時代もあったし考古学の研究をしてたときもあった
768 :
デフォルトの名無しさん :2011/07/13(水) 13:09:08.90
◆QZaw55cn4cは糞
正規直交基底変換の一種のフーリエ変換なんて 2次元グラフなんかを習う時に、直交基底、直交基底関数の概念習うから 中学1年でも解るんじゃないのか
そうだね 何かの面積習うだけで積分の概念思いついちゃう人もいるしな
そうだよな そういうところで低脳と高脳の違いがでるんだろうな
そして俺は低能だった
低能の俺に微分、積分をシンプルに教えてください
彼女の瞳を見つめる。その瞳には君が映っているだろう? で、その映された君の瞳の中には彼女が映って...という具合だ。 突き詰めていくと彼女の心がわかる。それが微分。 反対に君の心がわかるのが積分というわけ。
違います
彼女いないんで、鏡に映した自分の瞳じゃだめですか?
二次元の彼女を作れ。 積分すれば三次元になるぞ!
こぼらーの俺にCOBOLのREDEFINESとCの共用体の事について教えてください 例えばワークで 03 DATE-WK PIC 9(08). 03 FILLER REDEFINES DATE-WK. 05 YEAR-WK PIC 9(04) 05 MONTH-WK PIC 9(02). 05 DAY-WK PIC 9(02). とあって、DATE-WKに20110711が入っていたら MONTH-WKは07、DAY-WKは11という値が入ります。んでCでは共用体っつーのが あって、これと似たような事が行えると聞きましたが、本読んでもぴんと きません^^; この例で日付の変数に20110711が入っていて、月、日を利用する例を示して いただけませんか
781 :
デフォルトの名無しさん :2011/07/13(水) 17:59:08.57
>>780 #include <string.h>
#include <stdio.h>
union shine {
char s[8];
struct {
char year[4];
char month[2];
char date[2];
} unko;
};
int main( void ) {
union shine p;
memmove(p.s, "20110711", 8);
fwrite(p.unko.year, 1, sizeof p.unko.year, stdout);
putchar('\n');
fwrite(p.unko.month, 1, sizeof p.unko.month, stdout);
putchar('\n');
fwrite(p.unko.date, 1, sizeof p.unko.date, stdout);
putchar('\n');
return 0 ;
}
無理矢理やってこんな感じかね
Cではprintf("%s".....)で使えるような文字列は\0終端のchar配列なのでこんな有様になる
>>781 unko の人か
printf("%.4s\n", p.unko.year);
とかもできるよ
>>780 Cは数値はバイナリだし、文字列もあんまり便利にならないから
YYYYMMDDから要素を取り出すのに普通は共用体は使わない。
やりたいなら↑の人みたいにできるけど。
786 :
デフォルトの名無しさん :2011/07/13(水) 18:08:52.16
>>782 そんなのあったなぁ
%s使えないという表現で言いたかったのは
つねにサイズを意識しなきゃいけないからめんどいからやめたほうがいいと言いたかった
printfを挙げたげたのは不適切でしたすいません
788 :
780 :2011/07/13(水) 18:52:21.74
皆さん、ありがとう 回答見て勉強してみます
入力した文字列を逆順に出力するプログラムで for (i = 0; str[i]; i++); while(i--) printf("%c",str[i]); printf("\n"); というソースがあるのですがこれは for (i = 0; str[i]; i++){ while(i--){ printf("%c",str[i]); printf("\n"); } } だと実行出来ないのは何故ですか? またwhile(i--)の意味がよく分からないのですがこれはどういう意味ですか? while(i != 0)のような条件を入れるものだと聞いていたのですがこの場合は違いますよね・・・?
>>789 実行は出来るんじゃないの。
それと元のコードと同様の意味になるのは下記。
for (i = 0; str[i]; i++){
while(i--){
printf("%c",str[i]);
}
printf("\n");
}
while(i--)
だが while (x) と while (x != 0)は同等
>>790 ありがとうございます
書きなおしたのですが実行すると
無限ループ?になってしまうのですが何が原因でしょうか?
以下全文です
#include<stdio.h>
int main( void ) {
char str[256] ;
int i ;
scanf("%s", str) ;
for (i = 0; str[i]; i++){
while(i!=0){
printf("%c",str[i]);
}
printf("\n");
}
return 0 ;
}
>>789 元のコードはfor文で文字列の長さを求めてからwhile文を実行している
下のコードは1文字毎にwhileを実行している
> while(i!=0)
794 :
デフォルトの名無しさん :2011/07/13(水) 21:18:17.83
>>792-793 ありがとうございます
自分の理解力が足りてないみたいなんでもう少し考えてきます
元コードのforの後ろのセミコロンを見逃してはイカン!ってじっちゃが言ってた
797 :
699 :2011/07/13(水) 22:11:24.50
>>723 おつです。
どうやら速度的にはa[y][x]か*(y_table[y] + x)が速いみたいですね。
>>732 のコードも気になるので、
>>723 の横幅を320から512に変更したint a[512 * 240] の配列に対して、
a[(y << 9) + x]でアクセスする場合も、追記おねがいします!
フーリエ変換は知らないけど、jpgの圧縮の原理にも関係してるみたいです。jpgデコーダー組んだこと無いので詳しくは知りませんが、
たとえば、簡単の為に(RGBそれぞれではなく)、1次元の画像データの各ピクセルの明度だけの場合で考えてみると、
たとえば a[8] = {0.45, 0.46, 3.47, 0.48, 0.49, 0.50, 0.51, 0.52};っていう8ピクセル分の明度データがあったとして、
float w = 3.14 / 8;
float f(float* A, int k){
s = 0;
for(i=0; i<8; i++) {
s += A[i] * cos( w * (i+(1/2)) * (k+(1/2)) );
}
return s
}
によって b[0] = f(a, 0); b[1] = f(a, 1); ... b[7] = f(a, 7);とした結果が
b[8] = {2.4, -0.9, 0.5, -0.4, 0.3, -0.29, 0.27, -0.26}; という値になるのですが、
この f() を通した結果は、大抵の画像で、最初ほど数字が大きくて、後ろに行くほど数字が小さいというデータになるので、
後ろの数字ほど、記録に使うビット数(桁数や精度)を少なくできるので、これを利用してデータ圧縮してるそうです。
このb[]を再び a[0] = f(b, 0); a[1] = f(b, 1); ... a[7] = f(b, 7);とすれば、元の明度データ(と似た値)が得られます。
このb[]に記録する際の、精度の落とし具合が、圧縮率と再現度に反比例して影響してるのだと思います。
jpgエンコーダー組んだこと無いのでよく知りませんが。
誰か簡単なjpgエンコーダー書いてくれるとおもしろいです。よろです。(独自フォーマットのなんちゃってjpgや、機能限定的でもいいので)
798 :
699 :2011/07/13(水) 22:13:23.69
>>797 こんな感じでポインタ配列が一番速いですね
CPUはi7か何かなんでしょうね
ポインタ配列がL3に乗ってしまってるんじゃないでしょうか
c言語勉強してみたいんだけど C言語できたら何が作れる? 彼女くらいは作れるの?
3号くらいまでいける
C言語を彼女にすれば宜しい
>>803 お前が教えた言葉を覚えてどんどん会話がうまくなるAI作ればいいよ
対人恐怖症の俺が言葉を教えても 成長せんだろうな
俺も人間相手の商売はムリだと思ってプログラマ選んだのに、 なぜか、いつの間にか後輩の世話をさせられ、顧客との折衝させられ、 ドキュメンテーションと生意気な後輩の成果物のチェック作業ばかり・・・ 3年以上コーディングしてねぇ・・・なんでこうなるんだorz
やあ先輩明日もいろいろ見てもらいますよ 一度確認してもらったらもうあとは先輩の責任ですからね
そんなこといって、先輩先輩と懐いてくる爆乳ツインテの後輩なら文句ないんだろ。
ポインタを使う関数にて。 プロトタイプ宣言のとき引数は省略してもいいらしいですが*も省略していいんですか?
だめです
プログラム書けるバク乳ツインテ美少女なんて3次元に存在するんでしょうか?
ダメです
815 :
デフォルトの名無しさん :2011/07/14(木) 23:01:54.87
今プログラミングしてるんですがわからない事あるので聞いていいですか?
C言語に関することならどうぞ
817 :
デフォルトの名無しさん :2011/07/14(木) 23:09:27.21
int a ; /*回答格納用*/ int b ,c ; /*問題生成用*/ int t=1; int h=2; int k=3; int w=4; int i = t,h,k,w ; char* enzasi=("+","-","*","/"); char t='+'; /*式の+-/*の役目*/ char h='-'; /*同*/ char k='*'; /*同*/ char w='/'; /*同*/ これをコンパイルすると複数宣言でエラーが出るんですがどうやったら治りますか?
t, h, k, w が 2 つあってどっちかわからんくなるからエラー 別の名前に変える
h, k, wは3つだ
w, k, t, k
b, k, t, r
つーかそもそも1文字の変数なんて使うな。 他人はおろか自分でもその内何がどの値を持ってるか混乱するのがオチだ。 そしてちゃんと意味のある単語をそれぞれに付ければ自然と重複も解消する。
ローカルなら1文字で充分。 Unixの文化ってのはそういうものだよ。 むしろ昨今のやたらと長い識別子の方が有害だわ。
int i = 0;
学生時代に情報処理の大会みたいなものに出た事があるんだけど そこでのプログラムが一文字変数のオンパレードで「難しくする所違うだろ!」って突っ込みたくなった
for(loopCounter=0;loopCounter<=loopLimit;loopCounter++) {
>>826 この手の自己満足には付き合ってられないよなw
蟹はんの作法によると 「グローバル変数は分かりやすくした方がいいけど、ローカル変数なら短くてもよくね?」 って書いてある
そのとおりだよな。 なんでも長い名前にしたりする前に、 変数を整理したりスコープを適切にしたり、 そっちに注力しる、と。
短くてもいいけど、iとかの慣例以外で1文字はちょっと気が引けるなあ まあスコープ絞って宣言にコメントつけておけば意味は分かるしいいのか
変数名を長い名前で説明的にすれば、可読性が向上すると言ってる奴は どいつもこいつも大嘘つき野郎だと思う
>>831 だなw 俺も実はかつて陥ったことがあるからわかるw
工夫した変数名でカバーできる? そーいう問題じゃなかった。
可読性を考えないで周囲に迷惑ばかりかけてるバカは
大抵
>>826 のように空白すらロクに使えないからな。
可読性を語ること自体おこがましいレベルの傲慢さ。
だったらコメントも付けるなよ 長い変数名にしてコメントなしで分かる方がマシ
ローカルスコープの変数名は短くして、 コメントにはコードを補足する情報 (例えば、使用するアルゴリズムが載ってる論文とか) を書く俺に死角は無かった
それが普通
>>833 空白入れれば見やすくなるとか そういう次元超えてるだろ
寿命が長い変数にはきっちりした名前をつけるべきだが 1画面以内で役目を終えるような短命な変数には iとかaとかpとか適当につけてるな
仕事でプログラム書いたことってないんだけど やっぱ仕事でってなると 変数名やら関数名、コメントの書き方まで しっかりテンプレみたいなのがあるのか?
先輩の派遣先では数字の直接記述禁止だったと言ってた。 #define 登録しろだってさ。 自分が派遣された先ではデバッガーとして派遣されたからそういうルールは指導されなかった。
テンプレとかいってるところは、どうかと
コーディング規約はあんましローカルなところまで徹底すると損する オーバーヘッドみたいなもんかな
>>839 Cじゃないけど「Google C++スタイルガイド」でググると
仕事で使うような規約が見られるよ
おまえらC言語のハナシしかしないのな
そんならCOBOLの話でもしようか
そんならPrologの話でもしようか
>>840 マジックナンバーなんかあるプロジェクトに出くわしたら、早めに逃げるが勝ち
コードの中に数字がいきなり出てきても、意味がわからない
#define ZERO 0 でいろんなとこでいろんな意味の0として使うのはまったく意味無いよな 後で変えようにも変えられない
852 :
デフォルトの名無しさん :2011/07/15(金) 20:45:59.69
cygwinダウンロードしたんだけど errnoってどんな機能なんですか? ヘッダファイルとして使ってるプログラムあるけど 良く分かりません。
ヘッダファイルってわかってんならヘッダファイル見ろよって突っ込まれるぜ エラー情報を管理するグローバル変数持ってて その他の関数が吐いたエラーに応じて値が変わるから エラー管理が容易になるとかじゃね?
854 :
デフォルトの名無しさん :2011/07/15(金) 21:02:22.66
>>853 見たけど
#ifndef #endifとかってなんですか?
入門書のってないです。
ダメな入門書だなあ
#define ZERO 0 int main(){ return ZERO; }
#define ZERO_NO_TSUKAIMA NEVER_END
struct TT_VECTOR { float x, y, z, pad; } __attribute__((aligned(16))); void tt_inner_cube_vertex( struct TT_VECTOR* dst, struct TT_VECTOR* src, struct TT_VECTOR* min_cube, struct TT_VECTOR* max_cube ) { if(src->x < min_cube->x) {dst->x = min_cube->x;} else {dst->x = src->x;} if(src->y < min_cube->y) {dst->y = min_cube->y;} else {dst->y = src->y;} if(src->z < min_cube->z) {dst->z = min_cube->z;} else {dst->z = src->z;} if(dst->x > max_cube->x) {dst->x = max_cube->x;} if(dst->y > max_cube->y) {dst->y = max_cube->y;} if(dst->z > max_cube->z) {dst->z = max_cube->z;} } 頂点XYZが、キューブのXYZ最小値と最大値の範囲外の場合は、その境界位置までアジャストする関数。 よくあるmin,maxテストのようなもの。それにアジャスト機能を追加したもの。
861 :
860 :2011/07/16(土) 01:31:59.79
ttp://www1.icnet.ne.jp/nsystem/simd_tobira/index.html このページを眺めつつ
SSEに置き換える方法を考えてたら、おもしろいことになった。
#define TT_INNER_CUBE_VERTEX(dst, src, min_cube, max_cube) { \
__asm__ volatile( \
"movaps (%1), %%xmm0;" \
"maxps (%2), %%xmm0;" \
"minps (%3), %%xmm0;" \
"movaps %%xmm0, (%0);" \
: \
:"r"((dst)), "r"((src)), "r"((min_cube)), "r"((max_cube)) \
:"memory" \
); \
}
たった4行で同じ処理が書けた
SSEスゲー!!
#define erono errno
>>861 MMX、SSEって、そーゆーことだったのかwww なんか使いたくなったw
C言語でMacOSXのCocoaみたいなグラフィカルな UI配置とかウインドウとかメニューつけたりするプログラミングできるのってなに? win32っていうやつみたら これ自分で全部ウインドウつくったりメニューコードかいたり すごいめんどくさそうなんだけど xcodeみたいでCocoaみたいでObjective-cみたいな言語はウインドウズにないの?おしえてください
C++Builderで、 for( int i = 0; i < N; i++ ) { for( int i = 0; i < M; i++ ) { B[ i ] = A[ i ] } } って書くと、内側のiが使われるんですが、 これってC++の規格レベルで規定されていることなんでしょうか??
866 :
デフォルトの名無しさん :2011/07/16(土) 13:14:46.85
うそこけ、コンパイルエラーじゃ で、B と A のどちらに外側の i を使って欲しかったんだ? これを見る限り手がかりは全くないが
>>865 お間抜けなボクちゃんには難しいかもしれないが、スレ違いだ。、
870 :
865 :2011/07/16(土) 13:53:34.20
>>866 人様のコードなのですが、意味的にはA、Bのどちらにも内側のiが使われるのが正しいので、大丈夫なのですが、
ちょっと怖い記述だなぁ、と思いまして・・・
やっぱりコンパイル通るのおかしいですよね・・・
セミコロンがないことを除けば当たり前のコードだ。 cでもc++でも問題ない。
スコープが内側のを使うに決まってる
>874 > 8:for(i=0; i<=5; i++) { ソース換わってるやん。
>>875 すまん、良く見てなかった
人様のコードにこんな処理が出てくる事は無いわな
>>865 同名の変数があった場合、内側を優先するのは決まってる
879 :
864 :2011/07/16(土) 14:57:43.22
#pragma endregion private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { } }; } これってC#の言語? C++?どっち? MFCっていうのやろうと思いました xcodeみたいだったしVisucalC++の よくわからない言語が MFCってC使うの?それともC++?それともC#?どれ・・・あいまいにしか乗ってない
>>879 xcodeみたいなのは.netだよ
mfcはコードガリガリ
881 :
864 :2011/07/16(土) 15:03:05.99
>>880 いまVisual C++2010のExpress使ってるんだけど
Xcodeみたいじゃない?
これコードガリガリなの?
なんかちゃんと ボタン配置とかウインドウのサイズをマウスでかえられるけど
.netのまた探すの大変だから
どれやればいい・・・なんか開発ソフトとか使う言語がわかればすぐできる
.netのどれ?.netを使うにはVisualC++2010?
>>881 それが.netだよ。。。
mfcは有料版にしか付いてない
883 :
デフォルトの名無しさん :2011/07/16(土) 15:10:01.23
>>864 win32 程度で「面倒臭そう」なら、おまえ GUI には向いてないよ
自由度が高いほどパラメータ指定が増えるのは必然で
定型的なプログラムならわざわざ C で書く必要性がない
MFC は C++ だが C++ として変則的な使い方をしまくっている
884 :
864 :2011/07/16(土) 15:15:19.71
あ、よくみたら.NETだったおy ありがとう .NETでやってみる うるせーーかす あほか win32どうみてもめんどくせーよ メニューとか全部コードでかくんだろアホくさ
886 :
デフォルトの名無しさん :2011/07/16(土) 15:21:17.86
>>884 は? メニューはリソースで作るんだが、アホなの? 死ぬの?
888 :
864 :2011/07/16(土) 15:47:46.05
PerlのオブジェクトやってたからすんなりC++わかる すごいうれしい
>>886 わああ^^
ね
は?メニューは資源で作るんだが、アホなの?死ぬの?
890 :
デフォルトの名無しさん :2011/07/16(土) 15:49:08.08
>>864 887みたいななやつかわいそう
わかるその気持ち
892 :
864 :2011/07/16(土) 15:50:17.11
ありがとう・・・Perl忍者さん おかげで参考にしっ
893 :
864 :2011/07/16(土) 15:50:32.18
ます
894 :
864 :2011/07/16(土) 15:55:40.83
メニューはコードからも記述できるんです ってことは コード以外でやるほうほうあるの?win32 なんかマウスでウインドウ出したりできないの? >それがメニューはコードからも記述できるのです。 これおしえて メニューはメニュー配置の部品みたいなのドロップするとかあるの?おしえて それは.NETでやるの?
あるに決まってるだろ。少しは自分で調べろカス!
>>894 expressにはリソースエディタ付いてないのか?
C++にはついてない。C#は知らんけどついてるなら流用されちゃうからついてないんだろう。
少なくとも express 2005 辺りにはリソースエディタ付いてないよ 今は知らない。
899 :
864 :2011/07/16(土) 16:06:08.02
ツールボックスならあるよ それでウインドウとかボタンとかドロップできる Xcodeみたいに だけどそれ.NETじゃないの???? win32だとコードかくみたいだけど(SDK) うわああめんどくさい かすみたい C言語
>>890 いやです。いずれモリタポスレに誘導をかけまくりますので、そのときはよろしく。
901 :
864 :2011/07/16(土) 16:16:11.22
確かに誰も行きたがるわけがないよな
リソースも中身は全部コードだろ。
>>904 リソースコンパイラ通してバイナリになるぞ
ちょっと、あんたがた、リソースをなんだと思ってんのさ?
リソースは理想っす
>>906 使いまわせる資源。かな
英語版と日本語版作る時、出来上がったファイルに.res(バイナリにしたリソースファイル)を再リンクさせればおk
909 :
865 :2011/07/16(土) 20:03:38.96
一つ言わせてもらおう。 ここはcスレだ。
チゲーよ なに独占しようとしてんだカス
912 :
デフォルトの名無しさん :2011/07/16(土) 21:12:10.76
「メニューは資源で作る」でいいじゃん バカ1匹が仕事なくすだけだからw
ここまで突き抜けてるとむしろ素晴らしいな
部屋に蜂が侵入してきました ちょっと高いところにとまったので、ティッシュでくるんで外に逃がしてやろうと キャスター付きの椅子に登って捕まえたらバランスを崩し、右腕の肘に近い所を 強打しました 蜂は無事逃がしましたが、痣になってて痛いんですけどどうしたらいいでしょうか?
ワロタw
肘が痔になるってどういう状況だよ
あーざーだからー
>>914 それはBのスレで聞くと良いんじゃないかな
ここはCのスレだからね
>>918 Bee(蜂)か
誰がうまい事言えと(ry
18KB(1要素2Byte)ほどのデータ配列を一つずつ読み出すのと、 まとめて読み出すのでは全然速度が違いました。 具体的には、 ( HDD → 2Byte → エンディアン変換 → メモリ上配列 ) × 要素数 よりも HDD → 18KB → メモリ上配列 → ( エンディアン変換 × 要素数 ) が遥かに速かったです。 これはHDDにアクセスする際、最初のオーバーヘッドが大きいためなんでしょうか??
普通にやるとバッファリングが効くからそう変わらないような気がするんだが 何使って読み込んだんだ
そろそろHDDの容量が無限大になるそうです C標準だけでできる巨大ファイルの扱い方を教えてください
923 :
920 :2011/07/17(日) 13:21:34.38
>>921 win32apiのReadFile関数を使いました。
>>923 ReadFile()を2バイトずつ使ったのならそりゃ遅くて当然。
APIを使う必然性がないなら標準関数を使うのが無難。
>>922 それをまともに扱えるosと処理系があれば、普通に標準関数で充分。
>>924 Windowsの場合、標準関数(freadの事か?)はReadFileを使って実装されてるんじゃないか?
>>927 やってみりゃ分かるんだろうが、面倒だからやらないけど、
ReadFileの2byteずつ読みが遅いとして、その速度改善のアプローチとしてfreadに
するってのはどうなの?
え?別に普通じゃないの? 何か問題ある?
ファイルストリームのバッファって使う価値あんのか? エラーチェックのオーバーヘッドを考えれば、どのみち自前のバッファ用意するハメになると思うんだけど
>>929 freadの方がReadFileよりバッファの使い方がうまいとかで、速くなるのは確定なの?
それとも速度に影響する別のファクターがあって(パラメータの数の違いとか、
APIを呼び出す時のシステムコールが遅いとか)そういう理由?
速くなるわけを教えてくれ
私、幼女だけど もっと(言葉を)優しくしてほしいな・・・///
freadは最終的にReadFileを呼ぶ
ということと
バッファリングしてる
という2つを考えたら、バッファで間に合う範囲では
ReadFileを呼ばずに済むと言うことにならんか?
そして、
>>920 でもReadFileの呼び出し回数が違うだろう
>>930 そうだよ
一番効率がいいのは自前のバッファ
>>923 freadにするだけで速くなるそうだ。
試して結果報告よろしく
I/O回数を確実に減らすなら自前で処理
937 :
920 :2011/07/17(日) 21:07:35.05
みなさん、ありがとうございました。
>>935 環境は会社にあるので、明後日、試して報告します。
巨大ファイルのMD5を出すのに、マルチスレッドを使って本処理と並列してバッファに 読み込むルーチンを作ったことあるな
で?
で?じゃねえよ そんなんで勝ち誇ったつもりになるな
で?で合ってるだろw
>>938 いまどきだとOSが先行して読んでくれるから
あんまり効果ないんじゃない?
りんごで大学のC言語やってるんだが、正直限界だ‥‥ なぜ言う事聞いてくれないんだww馬鹿めw
ワタシハマチガッテイマセン アナタノシジガマチガッテイルノデス
プログラムは思った通りに動かない。書いた通りに動く。
>>944 どんまい。あせらずに何が起こっているかを確実に把握してから、ひとつひとつ潰していくしかないです。
まずは要所に printf() を入れるのが吉。
×どんまい(=気にすんな) ○もあけあふる(=もっと注意しろ)
日本人ってほんと手抜き好きだよな どんとまいんどが、どんまいになるって 手抜き大好きだから、ぽぽぽーんの原発事故やセシウム味付き肉販売起だろな
昔ながらの職人気質はどこにいったのやら コレがない日本人なんて豚以下だわ
ssig33=小池陸
http://twitter.com/ssig33 真性キチガイのRuby使い(rails)
Rubykaigiのトイレで、親指の腐った肉を洗い流すなど血をばらまくなど
衛生害テロをやったキチガイ
奇声をあげるなどキチガイ行為
挙句の果てに、Perl使いのOと大喧嘩して殴りあいになって、警備員に追い出されるざま
Perl使いにパッシング浴びて退場
そのあとツイッターで反省無し
こいつRubykaigi一生立ち入り禁止だってさ
わざわざ英語からパクるのも不思議だが
サラリーマン根性むき出しで何もモノ作りの意欲がなくて会社でネットサーフィンだけして帰る元請社員を全員クビにしろよ 安定だけ求めて何もやりたいことないやつが大事に保護されてるからモノの品質が下がって日本のゲームはつまらなくなったし 家電製品で韓国に負けるんだ。メイドインジャパンの品質が下がったのは全部こいつらの責任 良いものを作りたいなんてこれっぽっちも思ってなくて楽すること他人に面倒を押し付けることしか考えない 大体会社来てソリティアだけして帰る毎日になんのやりがいがあるんだ生きてる意味あるのか そもそも正社員の人件費負担が重過ぎて利益が出せないなら正社員の待遇を下げるのか倒産するのが正解だろ それをやらずに偽装請負特定派遣で若者使い捨てで人件費カットして技術の蓄積を放棄して日本の技術レベルを落として 自分達は組合がうるさいからとか言ってバブル期の待遇を維持したままとか人道的におかしいだろ日本の大手は全部倒産すべき
文句あるなら独立しろ
ポインタの使いどころを教えてくれ下さい
まいけるまだ生きてるのかな
× ポインタ ○ ポインター
>958 >538
962 :
デフォルトの名無しさん :2011/07/18(月) 19:21:27.05
みなさん、関数ポインタって使っています? 関数名で使えることは勉強で知っているのですが、 一度も使ったことがないです。 どんなところで使うんでしょうか。
>>962 ソートとかスレッドとかシグナルとかコールバックとか状態遷移とか、色んな所で必要になるよ
ほんとQはつかえねぇな
968 :
デフォルトの名無しさん :2011/07/18(月) 21:39:56.29
>>962 printf("aho");
↑
これだけでも printf へのポインタを使っている
・・・こう言うとポインタ変数がどうのと言い出すアフォが湧くがそういうことじゃない
969 :
デフォルトの名無しさん :2011/07/18(月) 22:36:59.66
入れた数字の高さ分「*」でピラミッド作るプログラム教えてお兄ちゃん
>>969 main(){
int i,j,max=atoi(argv[1]);
for(i=0;i<max;i++){for(j=max;j>i;j--)printf(" ");for(j=0;j<i*2+1;j++)printf("*");printf("\n");}
}
971 :
デフォルトの名無しさん :2011/07/19(火) 00:43:56.62
#include <stdio.h> #include <time.h> void main(void) { clock_t c1 = clock(); int i; for(i = 0; i < 5000; i++){ printf("\r"); printf("Hello,World%d",i); } printf("%f秒かかりました。",(double)((clock() - c1) / CLOCKS_PER_SEC)); } これでHell,Worldを表示させるのにかかった時間を測りたいのですが、毎回0.000秒になってしまうのですがどうしたらいいですか。
フラッシュしてから測れば?
973 :
938 :2011/07/19(火) 01:02:46.07
>>942-943 処理時間がおよそ 2 分の 1 になったよ
そのままやると HDD のアクセスランプが付いていない時間があったのが、対策後
付きっぱなしになった
まあ Windows XP での結果だから、最新 OS とか SSD ではわからんけど
>>971 整数で割算してからdoubleにキャストしても、小数点以下に0が付くだけだぞ。
そりゃ1秒以上かかってないと0になるよ。
かっこつけるから・・・
976 :
デフォルトの名無しさん :2011/07/19(火) 01:10:21.48
1秒以上かかる処理を教えてください。
CLOCKS_PER_SECをdoubleにキャストすればいいじゃん
978 :
デフォルトの名無しさん :2011/07/19(火) 01:21:41.46
>>977 なるほど。
今はPSPでカキコしてるんで明日やってみます。
980 :
デフォルトの名無しさん :2011/07/19(火) 06:46:12.46
次スレ立てます
Cね
うめ
987 :
デフォルトの名無しさん :2011/07/19(火) 16:53:26.25
>>986 じゃ、ちょっと相手してやろうか
煽れそうなとこ煽ってみな
ウルトラ警備隊の社用車
> printf("aho"); 「使っている」というのは普通「全ての場合で」が省略されていると解される。 ところが、使っていない場合なんか何通りも思いつく。 「使っている場合がある」ならば正しい。
990 :
デフォルトの名無しさん :2011/07/19(火) 17:15:30.02
>>989 いや「全ての場合で」だよ?
何言ってんの、おたく
printf("aho"); は (*printf)("aho"); と同じ意味であり printfへの関数ポインタを使ってる……なんてことだったりして
992 :
デフォルトの名無しさん :2011/07/19(火) 17:18:12.84
>>991 962 で予言したとおりのが湧いてきたw
全ての場合に↓これ含まれてる? #define printf(s)
994 :
デフォルトの名無しさん :2011/07/19(火) 17:20:00.87
>>993 いやー
printf("aho");
が
;
と展開されるマクロはあんまり見かけないな
なんだ、ずいぶん甘い「全ての場合」だね。 ま、アマチュアさんだったらしょうがないか。ww
997 :
デフォルトの名無しさん :2011/07/19(火) 17:23:54.39
>>995 「ポインタを理解できてない」と大きく出たアフォはおまえじゃなかったのか? 違ったら失礼
アマチュアさんwww 底辺開発者くせぇ書き込み止めてもらえますか?www
inline は処理系依存か… inline 宣言されてても、ポインタとして取り扱う文言が出てきた場合 inline 化は抑止される んだっけ?
1000 :
991 :2011/07/19(火) 17:25:11.72
違うよ、全然違うよ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。