1 #include <stdio.h> 2 static int foo( 3 int (*say)(char const*), 4 char const*message 5 ) { 6 return say(message); 7 } 8 static int bar( 9 int say(char const*), 10 char const*message) { 11 return say(message); 12 } 13 14 static int baz(char const*message) { 15 return puts(message); 16 } 17 int main(void) { 18 foo(baz, "hello"); 19 bar(baz, "world"); 20 return 0; 21 } 9行目のsayは、C言語の規格としてはなんと呼ばれていますか 規格のセクションを引用して答えてください 一応、環境とか cc -Wall -std=c89 -pedantic-errors -c foo.c cc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-48)
int (*say)(char const*) じゃないの? 第一引数は関数のポインタです って使い方っぽいのだが
4 :
デフォルトの名無しさん :2010/06/13(日) 02:24:39
関数ポインタの必要性が分かりません。 ポインタ使わずに関数そのものをコールすれば済むことじゃないですか???
配列に入れたときに力を発揮する。 switch(state) { case TITLE: titile(); break; case MENU: menu(); break; case PLAY: play(); break; (延々つづく) } ================================ state = TITLE; func[state];
func[state]();の間違い
7 :
デフォルトの名無しさん :2010/06/13(日) 02:34:44
>>5 たとえば
titile()とmenu()の関数の型が
int titile(void)
double menu(int)
とかになっていても
state = TITLE;
func[state];
これで実行させることができるの?
さすがに関数の型を合わさないといけないような気がしますが
合わさないとダメだね
そういうことやりたがるやつはむしろ素人だね。 使う利点なんて無いよ。
昔は有効な書き方だったんだよ 今はコンパイラが勝手にテーブルにしたり、そこまで速度を気にしなくてもよくなったり
じゃあ延々と条件分岐書いて無駄に残業してろ
12 :
デフォルトの名無しさん :2010/06/13(日) 02:55:04
最初は5のようなコード組んでたが、あとで仕様変更が起こって 一部の関数の型を変えないといけなくなった。そうなったときに こうなったとき修正がめっちゃやばそうなが気がします
今でも究極のパフォーマンスを狙う用途では 速度を極力落とさずに分岐する手段として使うけどね。
無いな。
コールバック関数を使う利点はないと?
とりあえず qsort 使ってみようぜ
どうしてもstatic変数を排除出来ない式に成ったとき関数ポインタ使って回避する。
>>13 今のCPUのようにパイプライン段数が深くなったCPUでは、関数ポインタの
呼び出しの時に一度パイプラインをフラッシュして投機実行も破棄してしま
うのでパフォーマンスは落ちる
C++の仮想関数も同じ仕組みを使っているから、パフォーマンスを最大限に
追求する場面では仮想関数はあまり使わない
http://gigo.retrogames.com/t_lab/chapter2.html でも上記のようなURLを見るとあまり関係ないようである
実際Cのqsort()とC++のsort()ではsort()の方が速いが、それは関数ポインタ
による物ではなく、主にデータのコピー方法によるものである
qsort()はバイト単位でコピーするが、sort()はtemplateを使っているので
それぞれのデータ型に最も適した方法でコピーするから速いのである
結局関数ポインタが遅いのは一度目の呼び出しでL2キャッシュに 乗る前がものすごく遅いだけで、一度L2キャッシュにテーブルが乗って しまえば、以降の呼び出しは同じラインによって上書きされない限り それほど気になるコストは掛からないと言える
20 :
デフォルトの名無しさん :2010/06/13(日) 09:23:26
23 :
デフォルトの名無しさん :2010/06/13(日) 11:03:22
不完全型へのポインタの一種でしかないんだが 見た目のグロさに過剰反応してしまう奴が後を絶たない
早くC++まで勉強して競馬ゲー作りたいわ
お前じゃ無理だろw
>>25 それ言うためだけに書き込むのか・・・・・
うん
>>27 それ言うためだけに書き込むのか・・・・・
>>29 それ言うためだけに書き込むのか・・・・・
>>25 みたいなカスのせいでスレが荒れるとか。煽りたいだけの中学生とか放っとけよ
ってか本当いつもいつも一言多いヤツが何か居座ってるよなこのスレ。 マジで一言多いから自重してほしい
それは違うな 煽るだけで何もできない奴と 余計な一言付ける奴とがいる
ああ、確かに。
アドバイスはちゃんとしてるのに余計なこと付け加えるヤツと、
>>25 みたいなのが居るよな
>>26 そのソースでない所にある、configpad.◯◯[1]に代入してる所でミスってるんじゃないかな
if(player_flag==0){return pad_2.key[Handle}
else if(player_flag==1){return pad_2.key[Handle}
どっちもpad_2.key返してるけど、ここも気になる
間に26がいなかったら25からにしたかったのにw
>>35 1pが動くときは
if(player_flag==0){return pad.key[Handle}
else if(player_flag==1){return pad_2.key[Handle}
こうなってます。確認のため一時的にpad_2にしましたすいません。
>そのソースでない所にある、configpad.◯◯[1]に代入してる所でミスってるんじゃないかな
その通りでした。
5時間くらいずっと悩んでましたがおかげさまでうまくいきました。
以下を書き足したらすんなりと・・・。
configpad.down[1]=0;
configpad.left[1]=1;
configpad.right[1]=2;
configpad.up[1]=3;
configpad.bom[1]=4;
configpad.shot[1]=5;
configpad.slow[1]=11;
configpad.start[1]=13;
configpad.change[1]=6;
ありがとうございました。
>>24-25 ,27-34,36-41,42
お前ら(ry
馬鹿すぎw
でかいのがでた
俺がどっか行くぜ!
いやいや俺が
どうぞどうぞ
51 :
デフォルトの名無しさん :2010/06/13(日) 16:23:17
ダチョウ切りしてすんません、ニコニコのこれなんだが
http://www.nicovideo.jp/watch/nm6415611 自分でやったんだけど何故か除算が表示されないんです。↓
#include<stdio.h>
double tasizan(double x, double y);
double hikizan(double x, double y);
double kakezan(double x, double y);
double warizan(double x, double y);
int main(void){double a,b;scanf("%lf&lf",&a,&b);
printf("加算:%f\n",tasizan(a,b));printf("減算:%f\n",hikizan(a,b));
printf("乗算:%f\n",kakezan(a,b));printf("除算:%f\n",warizan(a,b));return 0;}
double tasizan(double x,double y){
double answer;
answer=x+y;
return answer;}
double hikizan(double x,double y){
double answer;
answer=x-y;
return answer;}
double kakezan(double x,double y){
double answer;
answer=x*y;
return answer;}
double warizan(double x,double y){
double answer;
if(y==0){
printf("ゼロ除算エラー\n");
answer=0.0;}else{answer=x/y;}return answer;}
何処が間違ってるか教えて下さい!!
52 :
51 :2010/06/13(日) 16:24:41
うpした人のと全く同じにしたツモリなんだが・・・ 見辛くてすいませんがどうかヨロシクお願いします!
死ね
とりあえず #include<math.h> つけてみろカス
warota
56 :
51 :2010/06/13(日) 16:37:30
かー ハズレの時に来ちゃったか ありがとうございましたー
scanf()の引数を良く見るんだ warizan()のif(y==0)も怪しい
はちゅねみくなのー
for(x = 0;x < 10;x++) scanf("%c",a[x]); みたいに使えないんだけど
なんだその態度は
しらねーよ
>>51 6行目のscanfの %記号
scanf("%lf&lf",&a,&b);
↓
scanf("%lf%lf",&a,&b);
もう初心者に scanf 教えるのやめろよ。 全部 gets でやらせろ。
そんな事したら質問数うなぎ登りだぞ
65 :
デフォルトの名無しさん :2010/06/13(日) 20:22:39
scanf に文句ぬかす奴がハードわかんねえとか、もうアボカド
gets言ってる時点でネタだからな
|= で足してる(?)値って、引く事ってできますか?
ああ間違えた、すまん &= ~たしてる値
できるはず a |= b; a &= ~b;
71 :
デフォルトの名無しさん :2010/06/13(日) 21:30:16
scanfもgetsも引数がポインタだからダメ。 何も知らない初心者にいきなりポインタ教えるのは酷というもの。
でも、いつのまにか当たり前のように理解してるもんだよ
>>71 gets()がダメな理由が、引数がポインタだからってことだったら、fgets()とかなにもかもダメだろ。
getchar()で一文字ずつ読めってことか
LOWモードでな。
RAW だろ。
77 :
デフォルトの名無しさん :2010/06/13(日) 23:08:36
getcharってchar型のデータを取り出すのに、戻り値がintになってるよ。 getintとすべきでは?
>>77 1. 戻り値としてEOFの可能性がある。
2. 昔はchar型を戻り値とすることができなかった。
glibみたいくlistやhashのあるライブラリってないですか?
80 :
デフォルトの名無しさん :2010/06/13(日) 23:17:37
78 いわれてみれば戻り値がcharの標準関数ってみたことないな。
81 :
デフォルトの名無しさん :2010/06/13(日) 23:23:00
なぜか void はあるんだが
へえ
83 :
51 :2010/06/14(月) 04:15:55
>>57 さん
>>62 さん
わ 本当だ!
わざわざすんませんです(;^^)
イージーミス減らせる様頑張ります!
ありがとうございました!
>>70 a=1;
b=1;
a|=b; // a == 1;
a&=~b; // a == 0;
足したのを引いたつもりがずいぶん引かれてしまったように見える。
質問があいまいだからこれでもよかったのかもしれないし、違った(足す前の状態に戻したかった)のかもしれない。
ビットフラグを何だと思ってるんだろう 前のに戻したいなら前のを覚えとけ
floatの絶対値をビット演算で求めたいんだけど float a = -1.5; long* t = (long*)&a; t &= 0x7FFFFFFF; // これで a=1.5 になる これは問題ある? 互換性とか
89 :
88 :2010/06/14(月) 08:37:18
ごめん 誤)t &= 0x7FFFFFFF; 正)*t &= 0x7FFFFFFF;
>>88 IEEE754ならそれでいいけど、他の浮動小数点フォーマットの場合も
多々あるので互換性はない
>>88 x86みたいに実数演算プロセッサが別にある場合、一旦メインメモリに転送しないといけなくなるので無駄に遅くなる恐れがある。
そうでなくても、fabs()自体が高速に実行できるように実装されているはずだから特にメリットはない。
glibの標準関数のソースみたときはフラグ用ビットいじる仕様だったな
96 :
デフォルトの名無しさん :2010/06/14(月) 17:39:08
どうしてもポインタの意味がわからん。 これ使わなかったらどうなるの?関数を多用する時にとりあえず *つけとけばいいんですか?
とりあえず語尾に「にゃ」を付けておけばいいよ
どうしてもポインタの意味がわからないにゃ。 これ使わなかったらどうなるにゃ?関数を多用する時にとりあえず *つけとけばいいのかにゃ?
きもい
/l、 (゚、 。`フ _ _」、 "∨ └じl_r' ,)
>>96 例えば、printf("Hello!\n");と書いたとき、あんたは既にポインタを使っている。
102 :
デフォルトの名無しさん :2010/06/14(月) 18:32:04
>>95 与えたビットを 強制的に立てるのが or
与えたビット以外を 強制的に落すのが and
与えたビットを 反転するのは xor
足すとか引くとかの意の取り扱いが難しい
# 論理数学的には 加算法 って xor が一番近いんだっけか?
>>103 1ビットの足し算はxorだよ。繰り上がりはandね。
>>102 文字列リテラルはそれ自体がchar *と言う型のポインタ値として扱われる。
つまり、printf("Hello\n");と書いただけで、printf()関数にcharへのポインタを渡すと言うプログラムになっているわけだ。
自分で関数作った方が速い。配列の参照渡しを
関数内で、わたされた引数を書き換えたうえで、呼び出し側に書き換え結果を反映したい場合 配列を渡す場合 FILE みたいに、ものすごくカプセル化したい場合
配列は渡せない。渡せるのはポインタだけ。
だからそう言ってるだろw
>>105 文字列リテラルの型は配列だ
そして配列からポインタへの暗黙の変換が規定されているだけだ
>>110 文字列リテラルは文字列リテラルであって配列じゃないだろう
113 :
デフォルトの名無しさん :2010/06/14(月) 19:03:16
>>113 配列は内容が同じであっても必ず別々に確保されるぞ
こまけえこたあいいんだよ
>>116 人をアホ呼ばわりするだけで根拠を示せないの?どっちが…
初期化するときにもリテラルは使えるが配列は使えないよね
もういいから。見てられないよ。
別々に確保されるという規格はないぞw "ABC" と "ABC" のような全く同じ文字列どころか、 "DEF" と "ABCDEF" のように最後だけ同じ文字列を 1つにまとめるとかいう最適化だって許されてるくらいだのに
規格では、文字列リテラルは書き換えてはならない配列であると規定されている ここで「書き換えてはならない」という持って回った言い方にしたのは、 書き換えてはならないにも関わらず、 昔との互換性のためにchar*への変換が許されているから こういう特殊な扱いがあるという意味では確かに普通の配列とは異なるが、 型としては確かに配列型だ
半加算器とか懐かしいなw
いまはそういうとこすっ飛ばして直接言語から始めるからな
bitの足し算とか意味不明なことを供述してるけど 整数の足し算が xor と and で出来るって言いたいんだろう まあ幼稚園児でも知ってることだけど
ビットって単に2進数の桁のことだぜ 1桁の足し算は、と言ってるだけだ
それが俺のジャスティス
>>120 「char *への変換が許されてる」っていうけど、そうじゃなく
配列のまま使うなんてことあるの?
"hello"[2]
こういう感じ?
sizeof "hogehogehoge" == 13
char* array = "hello"; printf("%c\n", array[1]);
>>135 おいおい
ポインタでもできることだろう・・・
>>120 一行目、なんか気になる。
そんな規定あったっけ?
入門スレだから?
大昔は書き換え可だったけど(char*に変換できるのはその名残)、今は不可 書き換え不可だと、同じ文字列をまとめたりする最適化ができるからね
できるね
>>140 そうだっけか?こりゃ失礼。
未定義なだけかと思ってた。
もっかい読み直してくるわ。
ああ、書き換えた時の動作は未定義だと思う
1つのソース内で同じ文字列リテラルが何度も出て来るケースって希だと思う それだけのために最適化とか考える物なのかな
"\n" とか "%d" みたいな短い文字列は、大量にあってもおかしくないんじゃない もしくは、マクロ中に含めてたりしたらいつのまにか爆散してるかもしれない
その程度だとメリットよりデメリットのが多くなりそうな気もする
ふー
文字列に限らずに リテラルは1か所に集められるだろ。 int a=100, b=100, c; c = a + b + 100 + 100; if(printf("%d",100)==100); これだけあっても 100 は1つだけで良い。
>c = a + b + 100 + 100; ここは200になるだろw
整数値ならソースに埋め込んだ方が処理速度はずっと速くないか? add ax, [label1] よりも add ax, 0064H のがどう考えても効率がいい。使用メモリも少ない。
C言語にはBSS領域というものがあってだな・・・ 初期化データはここに入れられる
data領域が初期値を持つ静的データ、BSS領域は0だった
そりゃ C の仕様と関係ないだろ。
いや、Cの歴史的経緯と深い関係がある
155 :
デフォルトの名無しさん :2010/06/15(火) 08:41:35
F
c = a + b * 100 + 100 ならよかったのに
はあ…
.netsdk2.0にwindows.hが入って無かったです 首吊ってきていいですか?
#include <stdio.h> #define N 20 int main (void) { int j; int f[N + 1]; f[0] = 1; f[1] = 1; f[j] = f[j - 2] + f[j - 1]; for (j = 0; j <= N; j++) printf("f%d:%d\n",j,f[j]); return (0); } 上のプログラムを書きました。 f0:1 f1:1 f2:2 f3:3 f4:5 f5:8 以科略 という結果が欲しいです。 どこが間違えていてどこをどのように直せばいいのか教えてもらえませんか? よろしくお願いします。
>>159 j に適切な値を代入して繰り返すべき
f[j] = f[j - 2] + f[j - 1];
#include <stdio.h> #define N 20 int main (void) { int j; int f[N + 3]; f[0] = 1; f[1] = 1; for (j = 0; j <= N; j++){ f[j + 2] = f[j + 1] + f[j]; printf("f%d:%d\n",j,f[j]); } return (0); } 無理矢理
162 :
159 :2010/06/15(火) 21:10:30
ありがとうございます。
>>160 そのようにしたいのですが、どうすればいいのかわからないのです
自分の書いたものではどこが間違っているのですか?
>>161 f[j + 2] = f[j + 1] + f[j]をfor文のループに入れてしまうんですね
自分のように上に書いておくとどうおかしいのかよかったら教えてください
自宅のパソコンにgnome端末が無いのでいまはできないのですが、明日
>>161 さんのを見せてもらいますね
>>162 元のだと、f[2]以降は定義されてないから、それを表示させようとしてもうまくいかない。
別にprintfのループに入れる必要はないが、繰り返し文が増えるが先に↓を書くとか
for (j = 2; j <= N; j++)
f[j] = f[j - 2] + f[j - 1];
↓環境がないなら例えばここを使おう
http://codepad.org/
ループに入れないのに、なんでf[j]って書いたのか理解できない
つーか j を初期化しろよ
166 :
159 :2010/06/15(火) 22:07:23
>>163 なるほど!解決しました
これは便利ですね、丁寧な説明ありがとうございました
>>164 まだ配列だとか繰り返しだとかよくわからないのです
動作上問題がないのに必ず一言ケチを付けるアホがいるよな
初歩的な質問です (1) int hoge1[10] = {0,1,2,3,4,5,6,7,8,9}; (2) static int hoge2[10] = {0,1,2,3,4,5,6,7,8,9}; (3) static const int hoge3[10] = {0,1,2,3,4,5,6,7,8,9}; プログラムを実行すると(1)と(2)はRAMメモリ上のどこかに確保されますよね (3)もRAMメモリ上のどこかに確保されるんでしょうか?
>>169 環境が具体的に示してないので何とも言えないが、組み込み用の
Cコンパイラでは(3)の場合オプションを付ける事でROM上に置くような
環境も存在する
>>169 その他、通常(1)はスタックに確保されてその宣言に到達するたびに初期化される。
(2)は静的領域に確保されて起動時に一度だけ初期化される。
(3)は(2)とは別の静的領域に確保されて初期化される。また、更新できない。
それはさて、初期値を全て列挙するなら要素数は省略した方が意図が判りやすいかと。
ありがとうございます。 組み込みコンピューターの開発でsinとcosの計算結果を予め360*2個分 static constで定義しておいて利用するのが目的です 実行時にRAMに再び確保されるのはなんかメモリの無駄だなーと思いまして 質問させて頂きました
>sinとcosの計算結果を予め360*2個分 なんと無駄なことを。
>>172 要求するスピードや、RAM、ROM容量にもよるけど、最低45°分あれば可能。
助言ありがとうございます 45度分用意すればいいのは知っているのですが、今回は速度最優先なので fn_sin(angle)という関数より sin[angle] で処理することにしました 余談ですが、始め0.1度づつ3600個*2のデーター用意したら 「そこまで精度はいらん」と怒られちゃいました(汗
速度最優先ならsinのテーブルじゃなくて、sinを使った式の結果をテーブルにした方がよくないか? メモリはたくさん使っていいみたいだし。
>>172 >組み込みコンピューターの開発で
その開発環境の説明書見たほうが良いよー
何処に配置するかの説明が必ずあるハズ
(or 上司に聞く 明示的にROMに配置させるには どう記述するれば良い? って
178 :
デフォルトの名無しさん :2010/06/16(水) 21:09:17
11
179 :
デフォルトの名無しさん :2010/06/16(水) 21:13:10
巨人ファンです
180 :
デフォルトの名無しさん :2010/06/16(水) 21:26:52
楽天
>>175 速度最優先なら内臓RAMに展開を考慮
内臓Flashへのアクセスがノーウェイトで出来るなら良いが
CPU動作クロックが高い場合はウェイトが入っている可能性が高い
× 内臓 ○ 内蔵
そもそもターゲットCPUが浮動小数点演算苦手な可能性があるから 整数を固定小数点数として扱って計算したほうがいいかも知れない
>>183 FPUがないCPUで速度最優先なのに浮動小数点演算するって低脳だろ
必然と固定小数点数にして整数演算することになる
ここの人たちで、だれが一番高速なsin関数を書けるか競争してみたら? ターゲットCPUはもっとも一般的なcore2で
精度や使用メモリなどの制限をつけないと意味なくね?
CPUにCore2使うような環境ならメモリは十分あるだろうからテーブル引くのが一番速い
てか内部的にテーブル持ってたりしないの?
ないな
そなんだ。 毎回計算してるとかライブラリさんも大変なんだなぁ
FSIN命令はFPU内部にテーブル持ってる 精度に問題がない限り、ライブラリはその結果を必要に応じて丸めてるだけ
printf()が何を表示してるか、順を追って考えてみれば?
printf の format をそのまま引数にも使ってるあたりがミソかと
なるほど、最初のsの%c%s%cは展開されるけど・・・ってことか。納得。
「#pragma ○○○」って、 プリプロセサーはどのように認識するの? コメントとして?
>>197 その言語によるだろ
プリプロセッサーが機能する物もあるしそうでない物もある
言語はCに決まってんだろw スレタイ読めよw
コンパイラによる
>>199 そのC言語に色々な種類があるということなんだよ
そもそもコンパイラ固有の指定を行う手段だと規定されているんだから
コンパイラ固有の指定を行う為にはプリプロセッサはpragmaをスルーするしかないだろう
>>202 プリプロセッサーを含めたコンパイラということ
プリプロセッサとコンパイラが一体化してるのもあるし
>>201 それはC言語の種類じゃなくて、処理系の種類だよ。
C言語の種類といったら、K&RとかANSIとかC89とかC99のような言語仕様の違いを言うんだよ。
ループしてブルースクリーン起こさせるソースください
>>205 君が言ってるのは、自分で書いてる通り「言語仕様」の種類だろ
もちろんそれを指すこともあるが、開発メーカーやそのバージョンによる違い、
処理系の違い、その他諸々を含めて色んな種類があるということ。
>207 素人はすっこんでろ
209 :
デフォルトの名無しさん :2010/06/18(金) 10:35:01
50
>>207 つまりVC8とVC9は別の言語であると。
正解
>>210 #pragma の仕様なんてバージョンごとに変わる
素人でも常識だわ
>>210 対応度違うからね、厳密には違うとみていい
別の言語とはどういうことだ
東京市の山手言葉と下町言葉は別言語なのか
大阪民国弁と帝都弁はは別言語なのか
>>212 #pragmaの仕様は特に変わってないとおもったけど、なんかかわったの?c99とか?
>>214 だから言語の種類によって変わる
どういう仕様かはそのコンパイラの仕様書やマニュアル見ないとわからん
コンパイル時に機能するとは限らず、
プリプロセスで機能するものから、リンクの動作を制御するのまで様々
そもそも #pragma 自体を認識せずエラーとなるコンパイラだって存在する(した)
昔のgccは#pragmaを極端に嫌って、pragmaが検出されるとコンパイル中に Rogueというゲームを立ち上げて強制的にプレイさせるようになっていた #pragmaが完全に処理系依存だという事を逆手に取ったジョークだ
>>215 「#pragma」自体が言語仕様では定められておらず、ベンダの個別実装であるということか。
>>217 #pragma自体は言語仕様にあるよ
#pragmaを認識しないコンパイラってのは、関数でint型しか返せないコンパイラみたいなもんだよ
>>218 >関数でint型しか返せないコンパイラみたいなもんだよ
さすがにそれはないな、#pragma が使えるようになったのはもっと最近だよ
つか、だからプリプロセッスで扱うわけでもないのに、 "#" で表記してるんだろ。 対応してない処理系でも最初に消えるようにな。
プロセッス プロセッサ プロセス プロセサ まあ個人的にはプロセサーだな。
222 :
↓ブックマーク推奨 :2010/06/18(金) 17:43:26
コンパイラの違いを言語の違いと表現する阿呆がいるからこんなことになるんだよ
ああ君のことね
undeclared first use in this function このエラーはどういう意味ですか?
書いてある通りだろw
つ[英和辞書]
知らないなら黙っててください
おい馬鹿教えるなよ
>>233 関数・変数などの全ての識別子は、そのソースファイルにおいて最初に*使われる*までに
宣言されている必要がある。
例えば、以下のソースをコンパイルすると、そのメッセージがでる。
---ここから---
void foo() { x = 5; }
int x;
int main(void) { return 0; }
---ここまで---
1: error: ‘x’ undeclared (first use in this function)
これは1行めで変数xが*使われて*いるにも関わらず、この時点ではxの宣言がなされていないことを
意味する。
2行めのxの宣言を1行めより先に書けばエラーにならない。
---ここから---
int x;
void foo() { x = 5; }
int main(void) { return 0; }
---ここまで---
この場合は、xは同じファイルで定義されているが、別のファイルで定義されている場合も
宣言は必要。そのときは、以下のように書く。
extern int x;
意味がわからない 他の人説明してくれませんか?
使う前に宣言してください。
>>235 ソースコードとerror: ‘hoge’ undeclared (first use in this function)のhogeを晒せや
>>237 ソースコードさらしたら別にエラー内容なんていらんだろ
ふつうソースコードなんて晒せないだろ 家にソースを持って帰ったり会社で2chにアクセスできたりするクソ会社じゃあるまいし
>>235 が業務用のプログラムをいじってるなら怖いな
エラーの内容から判断してこいつは学生だってわかるだろ 変数の宣言忘れてエラーの意味もわからないプロがいたら怖いわ
>>240 どう考えても仕事絡みの質問じゃないだろ
学生とは限らんだろ
そうだな趣味かもしれないしな
n/mが複数回出てくるけどこういうのはコンパイラが取り計らってくれるのだろうか。
こんなスレで質問するって職業プログラマじゃないだろ 普通、職業プログラマなら職場のよくわかっている奴に聞くだろ
意外に聞かないわ
職場によくわかってない奴がいっぱいいるから?
>>247 なんでここまで遅くできるのかわからんw
普通に約数の和を関数化して戻り値と引数を比較すればいいのに
職業プログラマじゃないと質問してはいけないんですか?
n/mの結果を一度変数に入れてその変数を使い回したらって、ことじゃ
#include <stdio.h> int divsum(int n) { int sum = 1, i; for(i = 2; i * i < n; i++) if(n % i == 0) sum += i + n / i; return i * i == n ? sum + i : sum; } int main(void) { int i, j, c = 0; for(i = 220; i < 1000000; i++) { if((j = divsum(i)) <= i) continue; if(i == divsum(j)) { printf("%d %d\n", i, j); c++; } } printf("%d\n", c); return 0; }
友愛数を配列に保存して比較するのは意味がなくて無駄
作り変えちゃったか。仕方のないことかもな。
>>257 凄いですね・・・。
以前に作った事がありますか?
>>258 自分の作ったプログラムだと、
それが無いと同じペアを2回表示する事になるので・・・。
>>260 多分自分でそこまで作るのにあれこれ苦労したと思うんだけど、その苦労が経験となり、身につく。
おつかれさま。
>>260 if(n < s) があるから、同じの2回表示されないと思うけど。
>>260 もう少し高速化
#include<stdio.h>
long calc_yuai(long value){
long i, j, yuai=1, tmp, sum, value_org;
value_org=value;
for(i=2;value/i>=i;i++){
sum=1;
tmp=1;
for(j=0;value%i==0;j++){
value/=i;
tmp*=i;
sum+=tmp;
}
yuai*=sum;
}
if(value>1) yuai*=(value+1);
return yuai-value_org;
}
int main(void){
long i, yuai;
for(i=2;i<1000000;i++){
yuai=calc_yuai(i);
if(i<yuai && calc_yuai(yuai)==i){
printf("%ld %ld\n", i, yuai);
}
}
return 0;
}
一応プロだけど同僚よりGoogleとMSDNに聞いた方が速くて確実だわ
ふーん
自演乙
横からだけど、アルゴリズムの出典があったらおながいします。 ぐぐったけど互除法の変形とも違うし何やってるんだ、これ?
(1 + a + a^2 + ... + a^m) * (1 + b + b^2 + ... + b^n) = 1 + a + ... + a^m + a * b + a^2 *b + ... + a^m * b + .... + a^m * b + ... a^m + b^n
= 1 + a + ... + a^m + b + a * b + a^2 *b + ... + a^m * b + .... + b^n + a * b^n + ... a^m + b^n だった
また違った。 最後はa^m * b^nだ。
>>269 アルゴリズム名は知らないけど、例えば220の約数は1,2,4,5,10,11,20,22,44,55,110。
1を無視して、両端から数字をひとつづつ取って掛け合わせると、以下のように220になる。
2*100=220
4*55=220
5*44=220
10*22=220
11*20=220
約数の和sumを得るためには、a=2,3,4,5,6,...で割ってみるが、
割りきれたらsum=sum+a+220/a
a<=220/aの間、aをカウントアップして割りきれるか試す。
それ以上続けても、既に見つけた約数しかないので、無駄になるから計算しない。
>>273 X:2*100=220
○:2*110=220
275 :
269 :2010/06/19(土) 10:36:30
アホだw
だから、
>>273 関係ないじゃんwってことなんだけど
俺がアホだwと煽られるのは結構だけど、
>>273 が叩かれる筋合いはないのでは?
>>273 の説明のおかげで
>>264 のiのforループも理解し易くなると思うんだが。
素因数分解したときに 1210=2^1*5^1*11^2 であるとき 全ての約数の和は (2^0+2^1)*(5^0+5^1)*(11^0+11^1+11^2)=2394 ここから元の数を引けば 2394-1210=1184 となる
関係ない説明すれば、煽られても仕方ないだろ
数学的な解方をそのままプログラムに置き換えると効率が悪いから、 コンピューターの性質を踏まえた上でもう一工夫するんだよ
285 :
デフォルトの名無しさん :2010/06/19(土) 12:18:58
今の女子って、正直、生理的に汚いよね。
はい
度々世話になります #define RAKKA_SPEED 8.0 #define BLOCK_TATE 32.00 (略) double rakka_calc=BLOCK_TATE/RAKKA_SPEED; (略) board[i][j][2][player_flag]+=double(rakka_calc*rakka_flag[player_flag]+shot_calc*shot_flag[player_flag]); で計算が上手くいかないというか、 rakka_calkの値の小数点以下が計算されてないみたいで、 どうすれば小数点以下を反映できますか? board[][][][]をdouble宣言ってのはなしの方向で。
なしの方向なら答えもなし
>>287 ですが解決しました、ありがとうございました
290 :
デフォルトの名無しさん :2010/06/19(土) 14:45:17
いまどき、C言語のコンソールアプリの求人ってあるの?
ない
293 :
292 :2010/06/19(土) 17:08:18
すいません。掘られていないのは穴ではなくて、壁でした//
そこで穴があったら入りたいとか言っとけよ
アッー!
穴があったら入れたい
穴があったら塞ぎたい
>>264 前後もコードもちゃんとみてないんで、
何するコードか分からんのだけど、
jをインクリメントしてんの、何で?
jを使って等比級数の公式利用して for(j = 1; value % i == 0; j++, value /= i); yuai *= (pow(i, j) - 1) / (i - 1); とか書くと笑えるくらい遅くなるなw
for(i = 2; i * i <= n; i++) { for(j = 1; n % i == 0; j = j * i + 1) n /= i; yuai *= j; } これなら計算回数変わらずに変数節約できる
プロプライエタリなライブラリを一部で呼び出してるソースコードを、GPLとして公開することは合法ですか? 具体的にはフォトショップSDKで書いたプラグインです。
303 :
302 :2010/06/20(日) 01:48:44
BSDとして公開することは合法ですか?
GPLは無理だったような BSDは別にいいんじゃないかな
GPL違反ではあるけど、法的にはグレーじゃないっけ? まぁあえて危ない橋渡る人が居ないだろうけど。
307 :
292 :2010/06/20(日) 10:56:53
>>306 ですね。
デバッグするっていうのはなかなか難しいです。
ありがとうございました。
>>307 たいしたこと教えてないからお礼はいらないよ
>>308 お礼?ふざけんな
2chでちょっと投稿したからと言って何かもらえるという考えは甘い
回答者でもないのに毎回お礼に反応する頭のおかしい人が常駐してるからなw
VC++ 2008です いったんプログラムを止めて エンターキーを1回押して再開させたいのですが fprintf(stdout,"Push Enter\n"); getchar(); と書いたらエンターキーを2回押さないと再開しません 仕方ないのでしょうか?
getch()の結果が\nか判定
315 :
312 :2010/06/20(日) 23:50:26
while(getch()!=10); でいいのでしょうか? これにするとエンターを何回押しても進みません。 エンター1回で進むようにする方法はないのでしょうか?
#include <stdio.h> #include <conio.h> int main(void) { puts("before"); while(getch() != '\r'){ } puts("after"); return 0; }
>>312 俺の環境だと、その書き方でenter一回押したら再開されるんだが。
318 :
312 :2010/06/21(月) 01:32:11
できました。 2回押さなければ進まなかった原因は 他の関数で入力待ちしている部分があったためでした。 ありがとうございました。
int a = ( int )( 3 * 1.0f ); aは3であることが保証されるのでしょうか?? 浮動小数点数は誤差とか怖いので気になりました・・・
普通の浮動小数点数なら整数は(表現可能精度内でなら)誤差なしに表現できるので、 一旦循環小数や精度オーバーを経由して 整数に戻ってくるような演算でない限り、誤差は発生しない (Cの規格で保証されているわけではないが)
0.5足しとけばいいじゃん
326 :
320 :2010/06/21(月) 23:46:34
みなさん、ありがとうございます。
>>320 のケースは大丈夫なようですが、大事をとって0.5f足してからの丸め(四捨五入)をする方針でいくように
したいと思います。
3次元の実数ベクトルを、要素がfloat型で要素数3の配列を用いて表すものとする。 二つの3次元ベクトルに対して、それらの和を求める関数を定義する。 和を計算する関数はaddvec関数定義の頭部は void addvec(const float x[3], const float y[3], float z[3])とする。 プログラムの動作は、二つの3次元ベクトルaとbの各成分を順次に入力して、それらの和を求めて出力する。 というものをつくりたいです、そこで #include <stdio.h> void addvec(const float x[3], const float y[3], float z[3]) { int i; for(i = 0; i < 3; i++) z[i] = x[i] + y[i]; } これに続くmain関数を作りたいのですがどうすればいいのかわからないので教えてください。 int main (void) { float x1,y1,z1,x2,y2,z2; puts("各成分を入力してください."); printf("ベクトルa:"); scanf("(%d,%d,%d)", &x1, &y1, &z1); printf("ベクトルb:"); scanf("(%d,%d,%d)", &x2, &y2, &z2); printf("和%d \n", addvec(わからない)); return (0); } 上のように作ろうとしたのですが、どうも的外れな気がして…
#include<stdio.h> void addvec(const float a[3], const float b[3], float c[3]) { int i; for(i = 0; i < 3; i++) c[i] = a[i] + b[i]; } int main (void) { float a[3], b[3], c[3];//x,y,z成分 puts("各成分を入力してください."); printf("ベクトルa:"); scanf("%f %f %f", &a[0], &a[1], &a[2]); printf("ベクトルb:"); scanf("%f %f %f", &b[0], &b[1], &b[2]); addvec(a, b, c); printf("a+b:%f, %f, %f\n",c[0], c[1], c[2]); return (0); }
あ、コメントは配列の要素がx,y,z成分てこと
>>332 ありがとうございます、凄く助かりました!
今更だけど
>>301 にするだけでも
>>264 の 1.8 倍速
これだと
>>264 の 2.5〜3 倍速になる
除算は遅いから書き直せるものは書き直したほうがいいね
long calc_yuai(long value){
long i, j, yuai, value_org;
if(value<=1) return 0;
value_org=value;
for(i=0;(value&1)==0;i++) value>>=1;
yuai=(2<<i)-1;
for(i=3;i*i<=value;i+=2){
for(j=1;value%i==0;j=j*i+1){
value/=i;
}
if(j>1) yuai*=j;
}
if(value>1) yuai*=(value+1);
return yuai-value_org;
}
>>334 なるほど。書き方によってスピードがずいぶん違うね。
ところで、スピードアップしたいときには試行錯誤で、
早そうな書き方をいくつか試してるんだが、定石パターンってあるんだろうか?
処理系によっても、この演算は遅いor早い、とかあると思うんだが。
実数より整数のが速い 掛け算は遅いから可能ならビットシフトに置き換える 割り算はもっと遅いからできるだけ使わないように工夫する 条件分岐は足を引っ張る ループの中で使う変数が増えると、ある時点でスピードががたっと落ちる コードサイズが大きくなると不利 基本はCPUやパソコンの構造をよく理解すること 小手先の工夫をするよりアルゴリズムをよく練ること
スピードだけをとことん追求するとスパゲッティになる
そうかなあ
巧妙にビット演算とか使いまくって、作った自分があとから見ても何やってんのかわからなくなることは珍しくない ちゃんとコメントは書いとこうね
前時代的な最適化だな 今どき乗除算も遅くないから 無理にシフト使って命令数増やすより1命令で済ませる方がいい
こういうくだらん高速化より、コードの保守性を上げる方が遥かに大切。 コードを汚くして.0001秒速くするなど、正に愚の骨頂。 そして演算時間が問題となり本当に高速化が必要なところでは、 こんな小学生的な発想のレベルの最適化など殆ど役に立たん。
はいはい、すごいすごい
組み込みやゲームだったら、0.001秒早くするほうが普通だけど
この程度の高速化なら、逆にコードがすっきりして見やすくなると思うんだが。
>>341 コードの保守性が高いかどうかはユーザに関係ないよ
なぜこの処理は遅いのですか?と質問されたら、保守性を下げない為です、と回答するの?
それともこれより速く出来ませんと回答するの?
具体的なことには何一つ答えられないアホが、 抽象論で他人を叩いて優越感に浸りたいだけ まともに相手する必要なないと思う
>>340 データシート見てこい
SALは0.33クロック、IMULは0.5クロックに対してIDIVはmax36クロック
つまり100倍遅い
>>345 一万ぽ譲って関係ないとして、ユーザに関係ないなら無視して良いの?
>>348 速度が問題なのであればそれを改善するのは当然。
それによって保守性が下がると思うのであれば、同等のコード、または
普段よりも注意深く詳しいコメントを記述する
ってなんでこんな学生相手に話すような展開になってんだ?普通だろこれ。
>>347 ふおお。0.5がでてきたときもびっくりしたけど、いまや3命令が同時に行えるようになっているのか
>>349 でも遅い遅いとユーザから不満が出てる一般的なアプリケーションはビット演算なんて使ってないんだろうね
ん?
>>334 のコードの保守性が低いと言ってるんだよ。醜いということ。
で、こういうコードを書いた理由がこっちの方が速いだろ。
それに対して、その部分が速いといっても全体から見れば極々一部のコードなんだし、
そこが何倍になろうとも全体が速くなるわけではない。と言ったまで。
高速化というのは、その必要性が生じたときに、
ボトルネックとなっている部分を調べて、
その部分を対象に行うものだよ。
そもそも 334 は単に自分のスキルを自慢したいだけだんだろ?
当然ながらこういうコードは、以下略
ちなみにマシン言レベルで比較する程の高速化が必要な状況なら その部分はアセンブリで書くのが普通。 C言語で書いておいて、シフト演算使ったから速いとか、 そのプログラマーのマスタベーションでしかありえない。 どうして究極の速度が要求されるような状況でC言語で開発してんだ? そこまでの要求がないからだろ。
コンパイラさんのほうが優秀だから
>>334 の高速化なんて2で先に割り切っておいて、
ループ変数を+=2にして高速化してるだけじゃんw
この程度で保守性低いとか、スキル自慢とか、やばすぎだろw
やべー、おまえやべー
>>334 >これだと
>>264 の 2.5〜3 倍速になる
>除算は遅いから書き直せるものは書き直したほうがいいね
流石にこれはないなw
そもそも
>>352 は根底からおかしいからな。
どこがボトルネックだと考えているのか教えてほしいわ。
>>360 高速化を考えるんだったら、そのマシンや環境がどうかで大きく変わるし、
それ以前に最大桁が幾らかでも手法は色々考えられる。
例えばその辺のWindowsPCとかなら、そこそこメモリも使えるから、
#include <stdio.h>
#define N 1000000
int main(void)
{
static long table[N];
long i, j;
for (i = 1; i < N; i++)
for (j = i+i; j < N; j += i)
table[j] += i;
for (i = 0; i < N; i++) {
j = table[i];
if (j <= N && i < j && table[j] == i)
printf("%ld %ld\n", i, j);
}
return 0;
}
>>361 え、一般論だと思うけど。それがコードチューニングってやつだよ
どこがボトルネックか教えろって、なに言ってるの?
>>365 ボトルネックの部分をチューニングしてるわけだけど、そこをチューニングするなといっているように見える
>>362 なんで動いてるのかが分からない!かっけー
と思ったけど理解できた! 逆転の発想スゴス
>>366 ボトルネックというのは、プログラムの実行時間の大半を占める部分だよ
>>369 そんで、今回の友愛数を求めるプログラムのボトルネックはどこなの?
誰が友愛数を求めるプログラムの実行速度を要求してるの? 速くしたいのなら、いくらでもすればいいんじゃないでしょうか 保守なんていらないよ、そんなパーツには
>>371 Nの大きさに対する演算回数の多さじゃないの?
演算回数を減らす工夫が効果的ってことでしょ。
N*N だったものを 2*N にするとかはよくある話じゃないの。
だから、コンパイラが充分賢いなら小手先の最適化は慎んだ方がいいね。 >336の挙げた項目を整理すると、 ・実数より整数の方が速いが、型変換は遅いから要注意。 ・CPUによってはビットシフトは必ずしも速くない。 ・条件分岐はできるだけループの外に。 ・「ループの中で使う変数」だと意味不明だが、一次変数を利用してループ内の演算量を減らすのは有効。 ・どうせ今時のコンパイラはstatic関数のインライン展開くらいしてくれるから、関数は機能ごとに分割すべき。 となるかな。
>>372 実行速度の要求もないのに、
自分の趣味で速くしたくてシフト演算使って高速化するの?
それで保守のことなど知ったことはないと開き直るの?
うちの会社なら即クビだ。
377 :
320 :2010/06/22(火) 20:44:43
>>327 ありがとございます。
残念ながら、VC++はC99に対応していないので、roundが使えないです・・・
>>328 あ、たしかに一律0.5f足すだと、負の四捨五入がおかしくなりますね・・・
調べてみたところ、次のようなやり方で絶対値的四捨五入ができると分かりました。
float a = -4.6f;
float b = ( a > 0 ) ? floor( a + 0.5f ) : ceil( a - 0.5f );
最終的に求めたいのはint型なので、以下のようなカタチでも良いと思うのですが、どうでしょう??
int b = ( int )( ( a > 0 ) ? ( a + 0.5f ) : ( a - 0.5f ) )
>>377 足して切り捨てしてるならおk。足して四捨五入ってところを心配したのだろうと思う。
割る数が2のべき乗の定数だと勝手に割り算をシフトに置き換えてくれるコンパイラもあるよ。 最近はその程度の最適化はやってくれる。 ただ、特定の乗除算とビットシフトが等価だって知らない人とは一緒に仕事したくない。 そんなの2進数の基本的な性質じゃん。 その程度のことで保守性が下がるとか、何寝言言ってんのって感じ。
>>375 ええと、あなたの会社のコーディング規約ではシフト演算が禁止、ただし要求速度を満たせない
場合を除くとなっているのですか?
どこからが複雑だから禁止になり、どこまでが許容される記述なのか、そのガイドラインを
社内で作成し、周知徹底されていますか?
また、速度に関する要件がない場合、速度はどれだけ遅くとも問題ないのですか?
職業プログラマが保守性とかって、お笑い
マ板に行けよ土方は
384 :
320 :2010/06/22(火) 21:29:26
>>379 あ、そういうことでしたか。
了解です。
こんなところでまで会社に縛られてるなんて大変だね
386 :
デフォルトの名無しさん :2010/06/23(水) 00:23:48
scanfの引数に&をつける理由を大学の教授に尋ねたのですが、 「今は気にしなくていい。scanf使うときは&をつけるように」 といい加減な回答が返ってきました。 お金払ってるんだからちゃんと説明しろよ
その段階でポインタの説明始めたら一向に進まなくなるぞ
大学生だろ? 自分で調べられる程度の範囲は自分で調べろよ 小中学生じゃないんだから
389 :
デフォルトの名無しさん :2010/06/23(水) 00:40:32
>>388 俺が言いたいのは教授の教え方がいい加減だっていってるんだ。
他にもソースファイルの先頭に書くinclude文についてもそう。
教授は「プログラムを動かすためのおまじないだと思ってください」
とか抜かしやがる。
大抵の参考書もそう言ってるぞ。 物事には学ぶための順序ってもんがある。
>>389 何も分かってない人に教える場合はそれが普通
>>389 それが定番になってるけど、俺もどうかと思う。ガキに教えるんじゃないんだから
393 :
デフォルトの名無しさん :2010/06/23(水) 00:45:51
>>391 残念ながら最初に聞いたときぽかーんだったよ。
そもそも「おまじない」って何だよって?w
さすがに調べて分かったが。俺とおんなじこと考えてた人きっといるはず
includeやポインタくらいはちゃんと意味を教えたほうが良いのでは・・・ 前者は至極分かり易いと思うぞ。
会社に入ってからも「おまじない」という単語はよく使うけどな。 「テスト済みの処理構造をブラックボックスとして使う」という意味で。 あとで暇な時にそのおなじないの内容を理解しておくことは必須
話が違いますが
なるほどね。
大まかには「お決まりの処理」という理解で、さらには「なぜその処理が必要か」という理解に踏み込んでいくという、
二段階の理解ステップとなるわけだ。
経験上、こういうのはけっこうあるね。
何となしにやっていたことの意味が徐々に明らかになっていくのは、成長を実感できてうれしいものだ。
>>386 も是非この楽しさを知ってほしい。
調べる能力も大切って事を教授が教えてくれたんですね。
399 :
デフォルトの名無しさん :2010/06/23(水) 00:59:49
>何となしにやっていたことの意味が徐々に明らかになっていくのは できれば本当の意味にすぐに気づきたい。時間はそんなに待ってくれないぞ
includeをおまじないと言っても、stdio.h以外を使う時点で この関数を使うときはこれをインクルードと言っちゃうんだから 初めからprintfや標準入出力関数を使うためにこうすると言えばいいだろ、馬鹿らしい
>>399 printfの使い方とか、要所を抑えておけばあとは適当な理解でいいようなことは結構あるよ
>>393 は言葉尻とらえてケチつけてるだけでなんの意味もない話だったな
慣行となってる教え方に問題があるって話だろ。意味を見い出せない馬鹿
Aを理解するには、Bを教えなければならない Bを(ry 人に教えるならどこかで堺をつけないといけない 調べてわかるレベルならなおさら教えない おしえてクンをその道に育てるのは自殺行為
全部調べて分かるだろ
406 :
デフォルトの名無しさん :2010/06/23(水) 01:11:40
調べて分かることならちゃんと説明できるだろう。 それを遠回しな表現で学生を撹乱させて時間稼ごうだってそうはいかない お金払ってるんだから教授はちゃんと仕事しろってんだ
while(!関数名)ってあったんですけどこれってどういう意味なんでしょうか? もし関数が0を返したらwhile(!0)になると思うんですがこれは真なんでしょうか? よろしくお願いします。
408 :
デフォルトの名無しさん :2010/06/23(水) 01:13:00
人に聞く=調べる 金払ってんだ、質問した事に答えろよ。
えっ?
初心者にものを教える時に最初から1〜10まで全て説明する馬鹿はいないだろ。順序を考えろ。
>>393 >>400 >>403 みたいな馬鹿学生が山ほど潜んでるんだから教える方も大変だよ
誰が最初から1〜10まですべて説明しろと言ったんだ? 順序を考えればおまじないなんて馬鹿なことを言わずに済むだろ
だよな。 「おまじない」とかふざけすぎ。 まず最初は printf を使わずに教えるべき。 C は、入出力は言語機能自体には含まれていない、と教えるべき。 苦C とかいうサイトはそういう始め方だったから好感が持てた。
>>411 #include で別のファイルを読み込みます
↓
中を見てみましょう
↓
???
これじゃ先に進みそうにないから
おまじないっていうんだよ
>>413 「おまじない」が「おまじない」じゃなくなる時点でもヘッダファイルの中身なんて見てないだろ
関数の概念だけ教えれば済む話。高校以上なら簡単なに受け入れられる
それが正しい順序? 初心者にはまず目に見える結果が出る部分を教えないと。 自分の覚えたことの結果が出ないと正しいのか間違ってるのかの判断も付かない。 だからprintfを最初に教えるのは理にかなっている。 printfを使うためにはインクルードがどうたらこうたらやり始めるのか?アホクセー
せめて printf は後にしろよ。 puts とか putchar が先だろ。
417 :
デフォルトの名無しさん :2010/06/23(水) 01:27:03
疑問があるから質問したんだろ。 授業とは違うんだよ、生徒の質問に答えろって話。
教えるのは後回しでもいいけど、「おまじない」って言葉を使うのはダメだと思う。
Java の System.Console.○○○ は最初から使えるのは何で?
単なる言葉の言い回しの是非をグダグダいうのも実に馬鹿らしいな
422 :
デフォルトの名無しさん :2010/06/23(水) 01:31:48
>>421 「これからC言語のプログラムを書きます」の合図でいいんじゃないです?
プリントフ
>>419 それC#。JavaはSystem.out.println()な。Java.langパッケージは宣言なしで使えるから。
>>426 そう。どっちもまるで必須みたいで的外れ。printfを使いたいがために書いてるんだからそう言えばいいだけ
じゃあなんて言うんだよ! お前も同レベルの事言うんだろ?言ってみろや
ここはCの教え方についてのスレになってるので
>>407 は取り消しますw
質問スレは別にあるし
>>427 それおまじないとどう違うの?
printfを使うためのおまじないじゃん
>>431 「おまじない」と「printfを使うためのおまじない」とには大きな差があるんだが
Q 「おまじない」ってなんですか? A 「printfを使うためのおまじない」だよ すげえ、大きな差だ レベルたけえwwwwww
両方とも何も説明してないから同じだな
馬鹿学生は意味が知りたかったんだよな? それを「printfを使うためのおまじない」と答えて大きな差だと言う。
もっと言えばスタンダードアイオー、標準入出力関数だよ。そう言えば良い おまじないと言うより百倍良いだろう
馬鹿学生は意味が知りたかったんだよな? それを「スタンダードアイオー、標準入出力関数だよ。」と答えて大きな差だと言う。
>>432 printf を使うためってのを理解させるには関数について教えなきゃいかんだろ
最初は #include も main も printf も return もおまじない
最初からprintfのポインタの説明から入って分かる訳ないじゃん。文字列リテラルとかの説明をいきなり教えるの?
>>436 それなんも教えてないよ。関数って何?ってなるだけだろ。
>>432 で大きな差があると言ったら、それが答えみたいにとられてうざいんだが
>>438 俺は初めから関数について教えればいいと言ってるだろ
おまじない、に対しての答えが、関数を教える?
いきなり関数の説明から入るのかよ。ハードル高い授業だぜ。
int main()とかvoid main(void)とか書かれて混乱する入門者も多い 引数も戻り値も分かってないから当然だわな。関数を教えて、mainが特殊な関数だと教えればいいだろう
それって「おまじない」とどう違う?
意味が分かる
>>414 みるだろ。
printfってどうなってんの^^と気軽にのぞいて凹むステップは必要。
なんの意味だ
意味論の意味だよ
結局おまじないじゃねえか
>>447 それには同意。用意されてるソートとかな
>>451 それはお前がやってるプログラミングが今もおまじないだからだろ
おっと罵倒きました!
>>453 話をすりかえるな
馬鹿学生の話をしてんだよ?
そもそもHello world.をprintfで出力することがおかしいとは考えないのか? printfを用いるとしても、printf("%s\n", "Hello world.");と記述させるべきなのではないか?
そりゃ馬鹿文系学生のための一般教養のプログラミング入門ならおまじないでいいよ
おまじないで済ますなって話してんだよボケが!!!
おまじないが気にくわない→なぜそれが必要なのかの説明がないから気にくわない ここまでいっておきながら、 なぜprintfでなければならないのかの説明がない というところに進めないところに馬鹿の壁を見た。
>>459 なぜHello Worldでなければならないのかと同義だろ
おまえはどこに進んでんだwwww
おまじないって実生活ではただの気休めで効果があるのかないのかもわからないだろ。 プログラムにはそんな曖昧な要素が入り込む余地はないから、 おまじないって言葉を使うのはふさわしくない。
で、なんという言葉ならいいんだ?
願いを込めて、インクルード
質問に答えてください
説明すれば良いと言ってるのに、おまじないに代わる言葉を探してる時点でカス
>>460 文字列をコンソールに出力しましょう。文字列は別に何でも良いですが、Hello world.と出力しましょう。
これで十分理由に値する。
しかし、なぜprintfを用いるのかについては理由が明らかになっていない。
まるでリテラルを出力するためにはprintfでなければならないと思い込んでいるかのようだ。
scanfにはなぜアドレスを渡さなければならないのか。これについての疑問が解けた直後、
なぜ可変個の引数が渡せるのかという疑問を持つべきである。
>>461 もちろん、明日に向かって進んでいる。その延長には明後日がある。
>>462 実生活でも説明するのが面倒なときはおまじないって言うだろ
とくに子供に対して、前提となる知識や経験が不足している場合はとくに
プログラミングでも同様だよ
きちんと説明するには手間がかかりすぎるからおまじないって言われた、
つまり言われた側はまだまだレベルが低いってこと
>>467 なんでもいいが、Hello worldと出力しましょう。なんでもいいが、printfを使いましょう
結局、満場一致で おまじないでいい という認識でいいのか? 教授は正しかったんだよな?
おまじない(笑)どんな低レベルな大学なんだよ、哀れ
>>470 ばかだなぁ。
高校出た時点で知識レベルをそろえる必要なんてなくなるんだから
おまじないで済ませてよい学生と、済ませてはならない学生が出てくるのは確か。
しかし、教授にその説明を求めるのもまた間違いだろうな。
金さえ払えばなんでもできるなんて甘えは捨てないと。
しかし、誰もおまじない以上の説明を書かないという。
同レベル
え、もしかしておまじないどまりの人?
>>475 ごめんね。後段はあなたへのレスじゃなかったんです。ツイート()なんです
>>474 じゃあお前は今もおまじないと思ってるわけ?ちゃんと分かってるなら、そう説明すればいいだろ
俺、教授じゃねえよ?
>>479 なんかずれてんぞ。
この場で説明してあげるべきだと考えてるなら説明すればいいだろ、じゃないのか?
>>474 プリプロセッサから解説しないといけないし
おまじないでいいと思うけどな。最初は不要な知識だし
結局物事には順序がある。 初心者にいきなり関数の説明とかポインタの説明したってわかる訳がない。 順序立てて学習して行くことでいままでおまじないだった事が理解できるようになる。scanfに何で&を付けるのかもわかるようになる。それで良いじゃないか
興味があって大学来てんだから、最初のプログラミングの講義受ける時点で半分以上はもうおまじないなんかじゃないんだよ そこでおまじないとか言って二極化を促進させる教授パネェよ
485 :
デフォルトの名無しさん :2010/06/23(水) 02:12:05
ある変数(10桁)の 1の位: 10の位: 100の位: 1000の位: ・ ・ ・ ってな感じで出力する簡単な計算式教えてください
今の時代、大学なんて義務教育なんだよ
>>462 おまじないには自己暗示効果があるから、信じて実行すれば効果があるよ。
少しでも疑ったら魔法は消える。
おかげでレベルが下がった ちゃんと試験でバカは落とせよ
あれもこれもインクルードして、いっぱいおまじないすればいいね
「プロセッサ」とか言ってるやつって何なの? プロセスを「プロセッス」とか言うわけ? 「キッス」とか旧世代の言葉を使う人?w
>>484 マジレスすると大学のプログラミング講義でおまじないレベルからやるのって興味ない人向けの授業だよ
興味のある人は入門なんか飛ばして次の講義を受けるべき
>>489 あれもこれもインクルードするぐらいになったらもうおまじないじゃなくなってるだろ
おまじないはある種のパターナリズムなんだよ。 『お前には分からんかもしれんけど俺が正しいから従え』というのを言い換えただけ。
>>491 マジレスすると入門向けの講義受ければ休みまくっても余裕でいい成績が取れる
>>488 さがんないよ。授業余裕なら単位取れる最低限の行動だけして残った時間を有意義に過ごせばいい。
それが大学だろ。
プログラマになりたいのだったら小中学生のころにC言語くらいできるようになってんだろ お前らもそうだったよな?
まさかFラン大学じゃないだろうな 質の高い教育はそれなりの場所へ行かなきゃ受けられないんだよ 授業料さえ払えばなんでも教えてもらえると思うのが大間違い これが格差というもの
おまいら明日どうすんの?
小学生で既にLisperだった
>>496 中学の頃はPC-8001にカセットテープの時代だったのでCコンパイラが動く環境がありませんでした
>>500 サボりまくっても2chにこんだけおまじないの人がいるんだから気になるよ
くたばれジジイ
てか、そもそもその授業の単位を取得した時点で#include<stdio.h>がなんであるかの 具体的な説明をする予定がないんじゃないの?
>>485 while(n) {
printf("%d\n", n % 10);
n /= 10;
}
なんかマルチしまくってんのがいるなw
507 :
デフォルトの名無しさん :2010/06/23(水) 02:38:27
数学が(好き|得意)な奴には、「おまじない」が嫌いな奴が多い。
数学には「おまじない」など存在しない。
数学においては、新出の語句や定理は、必ずそれ以前に学習した定義・定理から導き出せる。
>>386 の言い分もわからんでもない。
むしろ、「おまじない」になんの疑問も抱かない奴よりは見込みある。
教授にはぐらかされても放置せず、自分で調べようとしているならば、だが。
導き出せはしないだろ。 決めごとなんだから。
>>508 その定義・定理を自分で調べようともせず教授に教えろと言ってんだよ
どこに見込みがあるってんだ
>>511 ちゃんと今までの話を読んだか?
最後の行はまるで的外れ。
513 :
デフォルトの名無しさん :2010/06/23(水) 04:30:08
詭弁の特徴のガイドライン 1:事実に対して仮定を持ち出す 2:ごくまれな反例をとりあげる 3:自分に有利な将来像を予想する 4:主観で決め付ける 5:資料を示さず自論が支持されていると思わせる 6:一見関係ありそうで関係ない話を始める 7:陰謀であると力説する 8:知能障害を起こす 9:自分の見解を述べずに人格批判をする 10:ありえない解決策を図る 11:レッテル貼りをする 12:決着した話を経緯を無視して蒸し返す 13:勝利宣言をする 14:細かい部分のミスを指摘し相手を無知と認識させる 15:新しい概念が全て正しいのだとミスリードする
>>512 もうすこし読解力をあげましょう。
または、もうすこし落ち着きましょう。
または、良い睡眠をとりましょう。
>>514 まさに詭弁だな。
おまえのことだよ、わかってるか?
金払って受講してるんだから教授は辞書と同じ、質問しないと損だ。 授業でおまじないと言うのはいいが教えを乞いにきた学生に詳しく教えないのはおかしい。 ある講義で質問しに行ったら聞いてないことまで長々と話す教授もいた。 その教授はハズレ。
質問の良し悪しもあるが、せっかく質問したのに拍子抜けな答えしか返ってこない教授はつまらんからな 教授からすれば、馬鹿な質問はするなってことなんだろうけど。学生からすれば馬鹿な回答なんだよ
講義中にチラっと聞いただけなんじゃねーの?
質問者のレベルに合わせたんだよ
uzai
うざい
523 :
デフォルトの名無しさん :2010/06/23(水) 15:43:47
メイン文で宣言した変数に分割した別のファイルでその変数に代入して メイン文でも反映されてるようにしたいんだけどいまいちポインタの使い方がわからない・・・ だれか教えてくれ
525 :
デフォルトの名無しさん :2010/06/23(水) 19:56:22
おまじないより魔法のほうがしっくりくるよな。
526 :
デフォルトの名無しさん :2010/06/23(水) 20:08:49
マジックコード
枕詞だろ。
>>524 Cには参照渡しはねーんだよ
全部値渡し
それは「アドレス」を値で渡しているだけ
530 :
デフォルトの名無しさん :2010/06/23(水) 22:17:53
あるよバーカ
質問者の意図が参照渡しに該当してたからな まあ言いたいことは分かるが、言い方がなんかダサいよ。なんで喧嘩腰というか、キレてんの?
>>529 の言わんとするところは分かるが、怒らなくてもよくね。
ポインタの値渡しってのもなんか回りくどいしさ。
534 :
デフォルトの名無しさん :2010/06/23(水) 22:28:54
void main(void) { int *GetX(void) { return &x; } int *pGetX; pGetX = GetX(); pGetX += 10;
535 :
デフォルトの名無しさん :2010/06/23(水) 22:32:32
ドンマイ
537 :
デフォルトの名無しさん :2010/06/23(水) 22:47:09
>>532 キレてるようには見えないなぁ。
馬鹿にしてるようには見えるけど。
馬鹿にしてるようには見えない
〃
人工無能に詳しい人いる? 居たら何で勉強したのか教えてくれ それとオススメの本とかあったらそれも
人工無能は勉強しすぎると味わいが無くなる気がする
まあいいおてんき
ふーん
名無しさんはどんな仕事してるの?
農家
わぁ!カッコよさそうな仕事ですね^^
別に
神
550 :
名無し :2010/06/24(木) 07:56:44
ポインタとメモリアドレスの違いなんだけどさ
同じ表現と考えていいのか?
105 :デフォルトの名無しさん:2010/06/14(月) 18:40:33
>>102 文字列リテラルはそれ自体がchar *と言う型のポインタ値として扱われる。
つまり、printf("Hello\n");と書いただけで、printf()関数にcharへのポインタを渡すと言うプログラムになっているわけだ。
これあるじゃん?
char *だからさ "aiueo"だとしたら まずaiueoをメモリ上に確保して a,i,u,e,o,\0みたいな16進数だけど そして確保したら その先頭のアドレスaの場所のアドレスを返すんだろ?
aの場所が100番地だったら100をchar *へ渡すみたいな?
っで気になるのが ポインタを返す と アドレスを返すって同じ意味でとらえていいのか?
これは先頭のアドレスを返してるよな? char *に先頭のアドレスを渡している
ポインタを返す と アドレスを返す これって同じ意味なのか?
ポインタ変数を返すなら違うが ポインタとは で検索したら e-wordではアドレスを保持する変数とあるが
それならポインタ変数=ポインタだよな?どうなんだ?
ポインタを返す を アドレスを返す 検索しても ポインタを返す関数 アドレスを返す関数とあるが
だれか教えてくれー
文字列リテラルは配列な。
>>550 メモリアドレス→メモリ上の住所を示す「定数」
ポインタ→任意のメモリアドレスを示すことができる「変数」
char *a; sizeof a と sizeof "aiueo" は違う
俺の感覚 アドレス = 型情報は含まない。 "単なる住所" ポインタ = アドレスと共に型情報も含む 加減算や指し先の参照等で、与えられた型に応じて評価してくれる "どういう住人が住んでいるかを示している住所"
555 :
名無し :2010/06/24(木) 10:21:07
よくわからないが "aiueo"はchar p[10]="aiueo"; ポインタを返すとは 先頭アドレスのpを返すこと? 配列の場合は&をつけなくていいんだよな先頭は char *a; a=p; アドレスを返す場合は&p[0]などでいいんだよな? 文字リテラルは配列になるので &をつけなくても先頭のアドレスをポインタというのか?
556 :
名無し :2010/06/24(木) 10:37:49
char *p="abc"; があるとすると >>この "abc" という式を評価すると、先頭の文字 'a' が格納されたメモリ領域を示すポインタが返ってきます! と書いてあるのだが、100番地から始まったとして a b c \0 100番地,101番地,102番地,103番地 この領域をひっくるめてポインタというであっているのか 100番地とかはアドレスであり ポインタを返すという表現は 100~103番地全体を返すということ?
557 :
名無し :2010/06/24(木) 10:39:31
100~103全体がポインタで 100や101それぞれはアドレスでおk?
ポインタはアドレスを抽象化したもの。
名前:ピッコロ アドレス:ナメック星一番地 ポインタ:住所はナメック星一番地、俺はピッコロだぁああああ
まぁビットから
561 :
デフォルトの名無しさん :2010/06/24(木) 12:26:09
>>556 通りすがりの元プログラマーです
ポインタは「アドレス用の変数」と思っておけばOKです
例えばアドレスが16ビットの環境なら
char *a;
int *b;
long *c;
printf("%d %d %d",sizeof(a),sizeof(b),sizeof(c));
↑16ビットなので全て2になる…はず(今、手元にCの環境が無いので確認できないw)
ポインタの型は
*c、← cにはアドレスが入ってるので、その位置にLong型があると解釈される
b++ ← int型ポインタなので、アドレスに(16ビット環境なら)+2される
などの時に必要になります
そんな決まりあったっけ?
563 :
デフォルトの名無しさん :2010/06/24(木) 12:29:35
ありますよ 調べてみてください
いまどき16ビット環境で語っちゃう人って……
まぁ揚げ足取りになるけど ポインタ全部が同じ大きさであるような言い方は良くない
というか、ポインタのサイズを得々と語ってるけど たからどうしたとしか思えない
ですね
そもそも返さねぇよ。ファンクシャンじゃねぇんだから。
>>554 にある型情報の型ってどんな情報?
で型はどのように決められるの?
570 :
質問 :2010/06/24(木) 17:13:52
>>570 ここはエスパーを召還するスレか?
うまくいかなかったソースを貼れよ
ポインタ=アドレス値 と考えていいよ
>>557 >100~103全体がポインタ
仮にC言語に文字列型があれば、その例では、全体は(文字列型)
仮の話はいりません。C言語に文字列型はありません。
574 :
554 :2010/06/24(木) 17:36:17
>>569 俺の感覚の話なので、イメージで
宣言時に * の前に型指定してるじゃん(ex int * 等) それを指して型情報を持っている と捉えてる。
void * 中の void も 型無し という型指示されている という意識ね
int a[3]
int *p = a;
int *q = a + 2;
void *hoge = a;
q-p は合法で sizeof(int) に関係無く 2 を返すし hoge - p は非合法。
アドレスは、ただの整数値 という意識
> sizeof(int) に関係無く 2 を返すし ヴォケ
>>575 ポインタ - ポインタ の値だぞ? アドレスの距離を返さずに、要素差返すんだけど?
煽る前に確認しろってことだな
>>576 ポインタの差を出すことは合法だろ
専用の型まであんのに
>>570 #include <stdio.h>
main()
{
int kokugo,shakai,rika;
int goukei,heikin;
printf("国語の点数=");
scanf("%d",&kokugo);
printf("社会の点数=");
scanf("%d",&shakai);
printf("理科の点数=");
scanf("%d",&rika);
goukei = kokugo + shakai + rika;
heikin = goukei / 3;
printf("合計=%d 平均=%d \n",goukei,heikin);
return 0;
}
580 :
デフォルトの名無しさん :2010/06/24(木) 18:27:59
いやintじゃねぇだろって言いたかったんだ レスも安価も間違っちゃってるが
>>570 >>579 正常に動作している。
cygwin 1.7/gcc 4.3.4/Windows XP SP3
cygwin()笑い
583 :
名無し :2010/06/24(木) 19:13:26
ポインタのことだが char *p="ABC"; ポインタを返すという表現をのせてるサイトがあったが abcを確保して 先頭のアドレスを返すって意味と同じだったらしい ポインタを返すって書くんじゃなくて abcが保存されてる場所の先頭アドレスを返すっていみ すっきりしたよ
const char* p = "ABC"; なのに char *p="ABC"; でOKなの?
規格で保証されている 内容書き換えちゃだめだけど
>>584 C言語/C++03以前では非constポインタへの暗黙変換が許される
つかC言語では文字列リテラルを評価した時の型はchar*と違ったか? 確認して書いたわけじゃないんで記憶違いならすまん。
>>587 sizeof は char* とは異なる
>>586 C++03でも許されてるはずだけど
「以前」ってのは含むのか含まないのか
>>587 文字列リテラルは array of const char で、当然 const char* に暗黙変換可能
ただし、例外的に char* に暗黙変換可能
>>589 一般ピーポーじゃあるまいし含むのが普通だろう
void f(char const x); // f(char)でも呼べるのに template<typename T>class A; void f(A<char const>x); // void f(A<char>); で呼べないのは不便だとおもう。
593 :
名無し :2010/06/24(木) 22:06:51
一般ピーナッツだろ ねえ、int a; &a=0xbffff978;とか代入できないんだが何故? アドレスを直接いれるってのは無理なの?
キャストしる 0は特別扱い
595 :
デフォルトの名無しさん :2010/06/24(木) 22:11:03
1+2=5; と同じ
596 :
594 :2010/06/24(木) 22:13:34
いや、ちげえ なんだそれ
>>593 int a;
*(&a)=0xbffff978;
>>593 int *a = (int*)0xbffff978;
*a = 0;
メモリマップドI/Oならvolatileつけた方が良い
いやそれ只のa =
そのアドレスがすでに使われてたりしないの
なんでアドレスとポインタの区別がつかないんだ? アドレスは定数だっつーのに代入しようとすんなよ
603 :
名無し :2010/06/24(木) 22:31:53
>>597 ,598
もやっと解消してくれてありがとう^w^b
アドレスを直でいれられたとは初めてしったお
>>601 むしろシステム他に使われてるからこそ、そこを指したいだろ
ああ、任意の場所を確保しようとしてるわけじゃないのか 配列と混同した
606 :
デフォルトの名無しさん :2010/06/25(金) 00:43:54
本棚には入門者の本で埋め尽くされています。 いい加減入門レベルから卒業したいんですがどういうプログラムがかけるようになれば 中級、上級者になれるのですか。 私は、他の人が作成したプログラムにけちをつけるくらいの力は持っています
自分が作りたいプログラムがすぐに作れるようになったら
>>606 入門編としてマスターマインドを作ってみる
コンパイラをゼロから書けるようになったら「入門」だろ。
>>609 どこに入門するんだよ
ハードルたけぇよ
まーた口だけプログラマーかよ gccレベルのもん書いてから偉そうなこと言えっつーの
OSとコンパイラなら、どっちが先かえ?
比較するようなもんじゃない
規格に書いてある内容が一通り理解出来るまでが入門。
ある一つの処理系について何処が処理系依存がどう動くか、
その処理系の独自拡張や使えるライブラリ群に精通するぐらいが中級。
世にある代表的な多くの処理系について中級レベルに
分かるようになると上級。
実際に複雑なプログラムを作るには、Cの技術力より
設計やテストの技術、そして作りたい物の分野に対する
知識の方が重要です。
つまり
>>606 はスレ違い。
強いて言えば、コンパイラ作れて中級の入口じゃね?
構文解析手法やら機械語やらCそのものとは
あまり関係ない知識もたらふく要るけど。
>>616 あなたの書いた「gccレベルのもん」を拝見させていただこうか
gccレベルという意味がわからん。 何と比べて、どの部分がどう高いんだ??? CでなくC++という意味か? Unix系のOSが扱えるということ?
gccそのものを書けるぐらいのレベルって話だろw
gccって、あれ一人で作ってんのか?
gccを書いて偉そうな事を言ってる人もいるが あれはあれで聞く気になれないよなw
>>621 そんな偉そうなことを言えるほどお前は有能なのか
身の程を知れよ
有能な
>>622 がgccをつくってくれるそうですよ
624 :
デフォルトの名無しさん :2010/06/25(金) 17:10:12
> コンパイラをゼロから書ける と言われて gcc くらいしか発想にない頭の不自由な方イタすぎ
16進表記のテキストをバイナリ保存しなおすだけでもコンパイラと呼んでいい?
>>624 大学1年だろ、プログラミングを始めてまだ半年も経っていないから…
コンパイラのデザインと実装の講義・実験があったのは2回生のときだったなぁ。 今でもgccレベルのものなんて容易には作れないが。
628 :
デフォルトの名無しさん :2010/06/25(金) 19:38:49
人の作成したプログラムが読めるようになれば中級レベルだな。 そして人の作成したプログラムの欠陥部分が見つけられるようになれば上級。
自分で書いたプログラムの欠陥も見つけられないのは何級ですか?
630 :
デフォルトの名無しさん :2010/06/25(金) 19:48:19
>>629 中級だな。少なくとも何を書こうとしてるか本人が一番よくわかってるはず。
俺の書いたものには欠陥が存在しないから、欠陥を見つけるのは不可能。
木を隠すには森か
633 :
デフォルトの名無しさん :2010/06/25(金) 22:06:23
>>631 簡単でいいからプログラム見せなさい。
関数の復帰値チェックしてなかったらアウトだよ
int main(){ return 0; }
exit(0); の方がいいだろ。
処理系に欠陥があるかもしれない
>>631 何か作って公開し、バグを見つけたらお金あげる^^
というクヌース先生の2番煎じをやるといいよ
ASCII ってさ、なんで引用符を片方ずつしか用意しなかったんだろうな。 せめて「 ”」と「“ 」は分けてほしかった。 " だけではねえ。
>>639 判別しにくい? どういうこと?
括弧とか片方だけだと不便だろ?
クォーテーションだって開始と終了があったほうが便利じゃん。
641 :
デフォルトの名無しさん :2010/06/26(土) 10:21:07
struct A{ int a; int b; int* c; }; typedef struct A A; void func(const A* reference){ reference->c[3] = 7; } int main(void) { A tmp; int array[10] = {0}; tmp.c = array; func(&tmp); return 0; } 以上のように、func内でreference->cが指す値を書き換えられるのは 理解しているのですが、cが指す値もread-onlyにする方法はないでしょうか。 cはintへの配列にはわけあって出来ません。
初級なのでint* const c;な別名構造体にキャストするとかくらいしか思いつきません
const int* c; にすりゃいいじゃん
>>642 それ、c 自体が const になるだけで
c が指す先は const にならない
constの発音は「こんすと」でいいの?
>>643 別名構造体はconst A*の代わりに、const B*のように使用します
646 :
デフォルトの名無しさん :2010/06/26(土) 12:36:15
if elseってelseの処理の方が早いんですか? オシロでデューティ比を50%にしようとif elseを使ったのですが50%にはならず・・・ 原因はそこにあるのかなぁと
生成されたコードを元にプロセッサの分岐予測/パイプライン/キャッシュ、メモリなどの デバイスに繋がるバスを考慮して妥当な時間差かどうか自分で判断するしかないんじゃ…
648 :
デフォルトの名無しさん :2010/06/26(土) 12:52:46
簡単に言うと、ifで0を出力、elseで1を出力で このif elseをwhileで無限ループさせているだけです この場合ifとelseの出力時間は等しくなると思うのですが 結果としてはどちらかの出力時間が長かったのです
>>644 「こんすたんちのーぶる」
650 :
デフォルトの名無しさん :2010/06/26(土) 12:55:42
条件は(i%2==0)で、単なる奇数か偶数かの分岐です if else処理後にi++も入れてます
>>648 分岐予測でずれんじゃないかな
分からんけど
まず、どうコンパイルされたのかアセンブラを見せてくれ
653 :
デフォルトの名無しさん :2010/06/26(土) 13:09:21
main() { int x,i; while(1) { if(i%2==0) { call(0x0110,(void*)0); } else { call(0x0100,(void*)0); } i++; } }
654 :
デフォルトの名無しさん :2010/06/26(土) 13:18:05
iの初期値0が抜けました
655 :
641 :2010/06/26(土) 13:18:25
>>643 この場合は const int* c; にすればよいですね。
でも実際に扱っているソースでは、
func1(const A*);
func2(A*);
というように複数あり、func2では値を変えたいのです。
そういう理由ならAをどうにかするんじゃなくて cを const int * hoge;に代入して取り回せばいいだろ
657 :
647 :2010/06/26(土) 13:25:07
>>653 生成されたコード→コンパイル/リンクした結果のアセンブラコード
プロセッサ→CPUのこと
普通計測された時間があって、その理由を推測するならソフト的には処理を
分割してより細かく計測していって原因追求するんだけど、もうそのレンジに
ないのでアセンブラコードとCPUやその他のペリフェラルの特性を元に
自分で推測するしかないよ。
658 :
デフォルトの名無しさん :2010/06/26(土) 13:27:01
659 :
641 :2010/06/26(土) 14:10:12
>>656 それでは構造体メンバをすべて別々に引数にして渡す必要がありますね。
でも仕方なさそうですね。
660 :
641 :2010/06/26(土) 14:39:55
struct A{ int a; int b; int* c; }; と、 struct B{ int a; int b; const int* c; }; を宣言しておいて、 func1(const B*); func2(A*) 引数で渡すときに、(const B*)A* とキャストすれば大丈夫なことが分かりました。 こんなことしてるソースコードは見たことないのが不安ですが……
すいませんこれって何て読めばいいんですか?→ stdio.h ストゥディオ?エスティディオ?
「すたっどあいおー」に1票
スタンダードIO ドット エッチ
すたんだーどあいおーへっだ
スタンダードの略なんですね。ありがとうございます。
>>665 スタンダード インプット アウトプット だよ
スタヂオとか、猛烈に馬鹿な読み方してる奴いるよな。生きてて恥ずかしくないのかね
ストゥーディオゥだよな
エスティーディーアイオードットエッチに決まってるじゃないか
セックスアンドザエッチ
時間的に等間隔でxが増減する(例えば0,1,2,3,2,1,0,1,2,3、のように5fps毎に変化する)ような 関数なり記述方法はありませんか? よろしくお願いします。 可能ならば1fps毎に1ずつ増えるカウント cntを使用して
int Cnt(){ return cnt; }
>>671 int foo[]={0,1,2,3,2,1};
return foo[cnt%(sizeof(foo)/sizeof(foo[0]))];
>>673 なるほど絶対値でやればできますね、即レスありがとうございました。
いえいえ
678 :
デフォルトの名無しさん :2010/06/27(日) 10:29:14
ポインタをローカル変数のように扱う方法を記述する 要は実体を確保すればいい int main(void) { int *p; p = &p; //ポインタ自身が持つアドレスを渡す。これでpは通常のローカル変数のように扱える。 }
で?
>>678 ポインタをローカル変数として扱う方法を教えてあげるよ
int main(void)
{
int *p;
}
681 :
678 :2010/06/27(日) 10:43:40
#include <stdio.h> int main(void) { int *p; p = &p; //ポインタ自身が持つアドレスを渡す。これでpは通常のローカル変数のように扱える。 *p = 3; printf("%d\n",*p); return 0; } コンパイルかけた結果、警告メッセージだけですんだ。どうやら問題ないらしい mm.c: In function `main': mm.c:7: warning: assignment from incompatible pointer type $ ./a.exe 15805 [main] a 3244 _cygtls::handle_exceptions: Error while dumping state (probably corrupted stack)Segmentation fault (core dumped)
682 :
678 :2010/06/27(日) 10:47:02
ちゃんとアドレス渡してるのになぜ失敗するのか分かりません。
>>682 *p = 3; が未定義動作だからじゃないか?
副作用居完了点をまたがずに参照と代入を行ってるから
#include <stdio.h> int main(void) { int *p; p = &p; //ポインタ自身が持つアドレスを渡す。これでpは通常のローカル変数のように扱える。 *p = 3; printf("%d\n", (int)p); return 0; } こうすれば理解できるか?
p に p のアドレスが入ってるから *p = 3; は p = (int*)3; と同じ動作になる p には既に p のアドレスが入ってないどころか 単なる 3 という数値しか入ってないので *p が変な所を指して死ぬ
あーん、アドレス0x00000003が変なところとでも?
組み込みなら意味があるかもしれないけど メモリ保護のあるOSならゼロアドレスを含むページは 読み書き禁止にするのが普通だ
// pの場所をメモリ番地 0x123 と仮定して考えてみよう int* p; // メモリ番地 0x123 の値は不定 p = &p // メモリ番地 0x123 の値は 0x123 *p // "メモリ番地 0x123 に書いてあるメモリ番地 0x123" の内容を読んだり書いたりする命令 *p = 3 // この場合は、メモリ番地 0x123 に書いてあるメモリ番地 0x123 の場所に、数字の 3 を記録する // この時点で、 メモリ番地 0x123 に書いてある数字は 0x123 ではなく 3 になっている。 //次に、*p として参照すると *p // これはメモリ番地0x123 に書いてあるメモリ番地 3 を参照する命令となる。 // もちろんメモリ番地 3 には、まだ何もデータを書き込んでない。(それどころか、そこが使えるかどうかも不明) だから何らかのメモリエラーが予想されますし、案の定、エラーでで止まりませんか?
690 :
デフォルトの名無しさん :2010/06/27(日) 14:31:56
>>689 わかりやすい解説どうもありがとうございました
おまいら、イイやつだな。
>>690 答え甲斐のある質問どうもありがとうございました
知識0からCを始めて2ヶ月 早くもCUIの連続で挫折しそうです 昨日Pythonの入門書を注文してしまいました 自分は駄目な人間なのでしょうか
>>697 だめなのかはともかく
どのみちPythonでも最初はCUIですよ
というより、基礎構文の使い方やら基本的なことを習得する過程はどの言語でもそう変わりません
Cのほうがエラーがやたら不親切だったり、ポインタとかあったり大変でしょうけど
とはいえPythonなら標準でもGUIライブラリが付いていたり、容易に追加ライブラリを扱えたりと
かなりお手軽ですが
699 :
デフォルトの名無しさん :2010/06/28(月) 23:54:25
#include <stdio.h> int main(void) { char no [] ={"0011"}; printf("%s\n",no); char name [] ="Yamada"; printf("%s\n",name); return 0; }
で?
でっていう
702 :
デフォルトの名無しさん :2010/06/29(火) 02:23:53
生まれて初めて自分の力だけでプログラム組めた・・・けどなんか最後に変なバグが発生します。 Run-Time Check Failure #2 - Stack around the variable 'c' was corrupted. (どこか回りっぱなしになってる?) どこがまちがっているんでしょうか? #include<stdio.h> #include<iostream> #include<conio.h>/*while(kbhit()){}で一時停止させる為*/ int main() /*整数値のみを使った電卓*/ { int a,b,d; char c; printf("数字を入力してください\n"); scanf("%d",&a); printf("%dが代入されました",a); printf("aは+\n" "bは-\n" "cは*\n" "dは/です\n"); scanf("%s",&c);/*%dは10進法整数、%sは文字列*/ printf("次の数字を入力してください\n"); scanf("%d",&b);
703 :
デフォルトの名無しさん :2010/06/29(火) 02:24:34
/*続き*/
switch(c){
case 'a':
printf("%d+%d=%d\n",a,b,a+b);
break;
case 'b':
printf("%d-%d=%d\n",a,b,a-b);
break;
case 'c':
printf("%d*%d=%d\n",a,b,a*b);
break;
case 'd':
printf("%d/%d=%f\n",a,b,(double)a/b);/*キャスト*/
break;
default:
printf("エラーです\n");
break; }
while(!kbhit()){}/*
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1242481837*/ return 0; }
>scanf("%s",&c);/*%dは10進法整数、%sは文字列*/ %cじゃないとまずいんじゃないですかね
705 :
デフォルトの名無しさん :2010/06/29(火) 02:47:55
最初は%cで書いたのですが、なぜか処理が printf("次の数字を入力してください\n"); まで飛んでしまうバグが発生したので調べて %sに修正しました。 Run-Time Check Failure #2 - Stack around the variable 'c' was corrupted. というエラーが発生するのはswitch以降みたいです
そこを%cにするだけじゃまずいんじゃないですかね
スタックの変数c近辺壊れちゃってるんだけど!とのことで。 %sにしたいならそれを格納する先はchar配列、それなりのメモリを確保したポインタにしましょう。
scanf(" %c", &c);
710 :
デフォルトの名無しさん :2010/06/29(火) 02:59:25
なぜcが壊れたのかが理解できないです。。。 とりまポインタというところまで勉強を進めれば理解できるってことですか? 今やっと制御文まで本を読み進めたところです。
1リットルしか入らない容器に2リットル入れようとしたから壊れたんだよ
>>710 char型は文字ひとつだけ入る
一文字に見える文字列は、その文字と、終端文字(見えない)の二文字から成り立つ
cにはその文字が入り、cの隣、変数じゃないところに終端文字をねじ込んでしまった。
それと、cは壊れてないよ。cの周辺がおかしいよ、と書いてるでしょ
713 :
デフォルトの名無しさん :2010/06/29(火) 03:20:28
scanf('%c',&c);にしてみました。(最初はこれでswitchまで行かない謎の処理をしたのに今は動く不思議) やっぱり同じエラーが出ます。 これでcharに対応させて、文字もa,b,c,dのいづれか一つの文字しか入れてないはず・・・ でもエラー増えてる;ω; 3 IntelliSense: 型 "int" の引数は型 "const char *" のパラメーターと互換性がありません c:\users\shintarou\documents\visual studio 2010\projects\calc\calc\calc.cpp 20 エラー 2 error C2664: 'scanf' : 1 番目の引数を 'int' から 'const char *' に変換できません。(新しい機能 ; ヘルプを参照) c:\users\shintarou\documents\visual studio 2010\projects\calc\calc\calc.cpp 20 いつint c;なんて入れたんだよ・・・俺はcharだって言ってるじゃないか・・・
714 :
デフォルトの名無しさん :2010/06/29(火) 03:21:48
>>712 読み飛ばしてました。
ちょっと修正しまあす
scanf("%c", &c); だと改行文字を読んじゃう。 scanf(" %c", &c); で改行文字を読み飛ばす。
716 :
デフォルトの名無しさん :2010/06/29(火) 03:43:56
なんとか完成しました嗚呼嗚呼あああああああああああああああああ すっごくうれしいです!! やっぱオリジナルが完成すると嬉しいっすね。 バグは自分のミスだってわかってるけど、イライラしてしょうがなかったです
717 :
デフォルトの名無しさん :2010/06/29(火) 03:44:55
/*完成版*/ #include<stdio.h> #include<iostream> #include<conio.h>/*while(kbhit()){}で一時停止させる為*/ /*整数値のみを使った電卓*/ int main() { int a=0,b=0; char c; printf("数字を入力してください\n"); scanf("%d",&a); printf("%dが代入されました",a); printf("どうするか入力してください\n""aは+\n" "bは-\n" "cは*\n" "dは/です\n"); scanf(" %c",&c);/*%dは10進法整数、%sは文字列%cは文字一つ(勝手に二つになる場合アリ)*/ /*scanf("%c",&c)だと、改行文字("dは/です\n")を読み込んでしまう scanf(" %c",&c);で空白をいれるとOk */ printf("次の数字を入力してください\n"); scanf("%d",&b);
718 :
デフォルトの名無しさん :2010/06/29(火) 03:46:53
switch(c){ case 'a': printf("%d+%d=%d\n",a,b,a+b); break; case 'b': printf("%d-%d=%d\n",a,b,a-b); break; case 'c': printf("%d*%d=%d\n",a,b,a*b); break; case 'd': printf("%d/%d=%f\n",a,b,(double)a/b);/*キャスト*/ break; default: printf("エラーです\n"); break; } while(!kbhit()){}/*勝手に終了させない処理*/ return 0; }
719 :
デフォルトの名無しさん :2010/06/29(火) 03:48:59
皆様、お世話になりました。 今猫でも分かるC(二版)で勉強中です。 次質問する時は、そのポインタって所を読み終えてからにします
720 :
デフォルトの名無しさん :2010/06/29(火) 04:01:23
今読み終えたのですがポインタって何でしょうか?
変数
722 :
デフォルトの名無しさん :2010/06/29(火) 04:55:49
指し示す者と書いてポインタ そばに立つと書いてスタンド
>>713 int c;が入ってるなんて言ってない。
落ち着いて読むんだシンタロウ。1番目の引数だ。
シンタロウw
C言語ってオヤジの言語だよね。なんでいまさらCなんかやろうとするのか意味不明。 せめてC++だろう。それでも不十分だけど。
逆にC++のポジションがわからん Cは組み込み、Javaはエンプラ、中小相手だとVBだと思うんだが C++ってゲームぐらいしか使い道ないんじゃないか?
何使ってもできない人にはできない ほどほどにできる人は道具次第 できる人は何使ってもできる
>>728 >Cは組み込み、Javaはエンプラ、中小相手だとVBだと思うんだが
世間知らずにも程があるぞwwwww
逆にjavaとかObjective-Cとかとっつきにくいと言われてる言語の話をなぜしないかね。 できる人はなに使ってもできるんでしょ。いまさら利用環境の少なくなってきたCでもないでしょ。 携帯だってCでプログラムしてる人はもうほとんどいないでしょ。
ここはCスレです 関係ない言語の話はその言語のスレでしてください
古臭いものにこだわる人間って、そうやって人の話に耳を傾けないんだよな。
>>733 ここは古臭いものにこだわる人間の隔離スレですよ
C++厨がスレタイも空気も読めないのはいつものこと
736 :
デフォルトの名無しさん :2010/06/29(火) 18:03:16
VBAでプログラマ気取りのゆとりだよ
ビジネス系の主流はVBだろ、VBAではないが
C言語から色んな言語勉強したら良いだろ。
VBはVB6と共に死にました。 .Netに移行するよりはJavaに移行した企業の方が多かったみたいだね。 それでCの存在価値が失われるわけじゃないけど。
PCの性能上がって便利なのは多くなりそうだけどCは面白いからありだね。
C愛好家のおじいさん達って・・・
743 :
デフォルトの名無しさん :2010/06/30(水) 11:14:23
744 :
デフォルトの名無しさん :2010/06/30(水) 12:48:17
取り合う範囲に厳格なポリシーを持つのが C のよいところ
C言語美化月間ですか?
Cに代わりはないからな
747 :
デフォルトの名無しさん :2010/06/30(水) 14:16:36
C言語は、あらゆるプログラム言語の基礎となる言語だ。 C言語が使いこなせられるようになれば、仕事でjavaとかC++を使わざるをえなくなっても 考え方はCと似ているからすんなりうけいれられるんちゃう?
748 :
デフォルトの名無しさん :2010/06/30(水) 15:00:52
JavaがあるからCは要らなくなる、って言ってる新人見たときは点目だった。 あと、”言語”って呼び名から来る誤解もあるんじゃないか? C言語を駆使してOSとか他言語(Java,Ruby,Pythonとか)を構成できるけど、 人間の言語だと、例えば日本語を使って英語を創り上げる、なんて出来ない。 Programming Languageの、Languageの意味は本来、”表記”だったんだが、 いつのまにか”言語”で定着しちゃったしな。
>Programming Languageの、Languageの意味は本来、”表記”だったんだが、
>>748 エスペラント語とかクリンゴン語は人間の言葉が作り出したように思うが
OSが提供するAPIやシステムコールのインターフェースが Cスタイルが多いから Cが生き残ってるだけかと そのレベルの機能を直接利用せずに 言語の範囲内でやりたいことを記述できるなら 別言語へいってもさしさわりはないだろうね。
大学の卒業研究で自動車の自律分散制御についてやることになりました。 現在のところスーパービギナーレベルのC言語知識しかありませんが どうにか車両の群れのシミュレーションをしたいのですが。 何からどう手をつけてよいのかわかりません。 どなたかBoidアルゴリズム等のプログラミング経験ある方いたら 助言をいただけませんか?
わざわざプログラム作らなくてもいいんでないの、と思うけどな。
>>753 そのアルゴリズムを構築するのがお前の研究じゃないの?
>>753 既にモデルができてるかどうかによって難易度が変わるね
自動車が得ることのできる情報を列挙する
方角
速度
前方の信号
前車までの距離 等
自動車が起こす事のできるアクションを列挙する
加減速
右左折 等
それぞれの自動車に与える目的地の設定とか
さらに目的地までのルート予測とか大変そうだw
碁盤の目じゃないとムリぽ
757 :
デフォルトの名無しさん :2010/06/30(水) 20:12:40
>>752 インターフェースって自分で言ってて C スタイルが多いって何?
システムコールが C 関数のように見えた時代は後にも先にも特殊だったんだが
>>757 > システムコールが C 関数のように見えた時代は後にも先にも特殊だったんだが
kwsk
>>753 専門的に研究してる方なのですし、どうせ全部想定済みなんでしょうけど…
各車は当然個別に目的地をもってるわけで、状況に応じてルートを変化させる個体もあるわけで…それの計算が結構重くて大変かもしれませんよ。
単純にルート変更と言っても、(最適とまではいかなくても)まぁまぁ妥当なルートを選び出す作業を各車が行うわけで、カーナビ有り・無し、習慣優先・勘優先、いろいろな個体があります。
それだけでも専門家ですら泡吹くような厄介なプログラムになると思います…
これらが相互に影響しあうわけで、数千台レベルで動かしたら、ちょっとしたレイトレーシング並の重さになるかもしれません。
ましてや、自動車の中身は魚じゃなくて人間ですから、コンビニとかにも平気で寄りますし、事故も起こしますし、気も変わります。カオスです。…意味もなく峠をぐるぐる走りつづける個体とかw
…完成したモノを想像すると、すごく楽しそうですが、
おそらく、自動車の性能や交通ルール回りはもちろん、社会学やら心理学やら、様々な分野の要素を考慮しないと意味のあるシミュレーション結果にはならないと思いますし、
また計算量も、たとえば各車は近くの他車の状況に応じてルートを変えたり変えなかったり、また、無意味に峠をぐるぐるする個体があらわれたり、かなりカオスでおもしろそうですが
計算量も膨大になりそうな予感です。
専門家じゃないのでわかりませんが、個々の個体はそれぞれ似てるようで、実際はそれぞれ微妙に異なった振る舞いをする、これら集合をあつかう問題にこそ、オブジェクト指向が向いてるような気がします。
CよりもC++で書いた方が頓挫する可能性が低く安全かもしれません。(当初は想定外だった要素を、あとから必要になってあるグループに追加するケースが出てくるでしょうし。その場合、おそらくC++の方がマシです)
>>759 アルゴリズム屋さんだね。
プログラミング言語をツールとして扱えると幅が広がるよ。
C++でオブジェクト指向設計して組めればかなり強い。
博士持っててアルゴリズム考えるのは立派だけど、それを実際に動かす力が乏しい人間を知ってる。
一方、実装力はあるが、アルゴリズムを考えるのは苦手な人もいる。
両方できると楽しいぞ。
762 :
デフォルトの名無しさん :2010/06/30(水) 23:09:44
テンプレートはともかく、オブジェクト指向に C++ が必要って C の能力なさすぎだろ 禿でさえ virtual の創設をためらったんだぞ
禿が自信を持っている箇所って結局どこなんだろ、と、たまに思う
卒研なら一直線の道と信号でのシミュレーションでよさそうだ 交差点では適当に入ってくる車と出て行く車を確率密度に沿った乱数で決定 信号のタイミング 信号の青黄赤の点灯時間や矢印信号 車線の数 進行方向毎の自動車の出現確率 右折時のパラメータ 運転者のクセ(車間距離、アクセルブレーキタイミング) これだけ弄るものがあったら好きなだけグラフが作れる ってか卒論でこれだけできたらすごいと思うよ
卒論って高校の時憧れてたほどレベルが高くない…
それは大学による
生徒?
与えられた数値が +だったら−にして −だったら+にして返す関数を作りたいのですが fanc(int i) { int a; a=-(-1*i)/i a=a*i; return a; } この方法以外にありますか?
func (int i) { return -i;}
int fanc(int i) { return -i; } ってはなしではなく?
なんていうか。 せっかくなので違う例を書いてみると int fanc(int i) { return -1 * i; }
int fanc(int i) { return ~((unsigned int)i-1); }
>773は何をしたいのだろう。 それにしても、fanc()って辺りが余りに情けない。
775 :
デフォルトの名無しさん :2010/07/01(木) 09:35:55
fackyu!!
777 :
774 :2010/07/01(木) 09:57:09
>>775 あぁ、二行目は>769宛てね。
ついでに>769にはなんであんな「方法」になったのか聞いてみたい。
778 :
デフォルトの名無しさん :2010/07/01(木) 10:42:10
>>769 int f(int i){return 0-i;}
いい加減まじめに int f(int i){return -i;} って言ってやれよwwwwww
お前ら根本的に勘違いしてるぞ、
>>769 の関数の戻り値は引数と同じなんだよ。
どうして符号を反転して返す関数を作ってるの?
ソース読めないの?馬鹿のなの?
必要とされるのは符号を一旦変えてまた元に戻す関数なんだよ。
>>781 >769のfanc()の実装を見たんじゃね?
>>781 >この方法以外にありますか?
とあるので、同じ動作をする別の方法という意味だろうね。
>>769 そもそも前半の説明と
後半のソースに整合性がないんだよな
つまり・・・・・どういうことだってばよ・・・・・
>>784 だったら、答える前にそれを突っ込むのが筋
何という筋ですか?
>>780 いったん変えて元に戻す?馬鹿ですか?a=1;a=a*i;のどこを見ればそう解釈できるの?
ばかばっか
ぱっぱかぱっぱか
亀になりましたが
>>753 です。
いや、本当に行きづまっていたので、とても参考になりました。
専門家でないのに専門家のようなレベルのアドバイスもらえて涙目です。
とりあえずマルチエージェントシステム的な考えを基に、直線や碁盤の目のような
比較的単純なモデルを想定して進めてみようかと思います。
できるだけ自分で考えてやってみたい気持ち一心もあって、
「こいつ何勘違いしてんだ」的な部分多くあったかと思いますが。。。
とにかくありがとうございました
>>793 別の言語使えばいいじゃんっていう皮肉?
みんな lisp をつかえってことでは?
全部手作りで合理化を考えてないところは、これから苦しくなるな。 趣味なら好きにすればいいが。
C言語はなんで整数のサイズとかビット長、chraの符号みたいな基礎的な部分すら統一しないんですか? 移植させる気まったくないですよねこいつ
えっ むしろ固定してたら移植できないだろ。
799 :
デフォルトの名無しさん :2010/07/02(金) 08:37:55
>>797 ハードの制約とか、意味論的に統一困難なもの以外で、不統一って例えば?
800 :
デフォルトの名無しさん :2010/07/02(金) 12:24:41
配列[定数]がEOFの場合、とはプログラムで表すとどうなりますか。 初歩的ですみません。どうしてもうまくいかないので。
801 :
デフォルトの名無しさん :2010/07/02(金) 12:30:52
配列は EOF (end of file) にならない
>>800 if (配列[定数] == EOF) …
803 :
デフォルトの名無しさん :2010/07/02(金) 12:48:08
>>801 やはりscanfでないとダメですか。
>>802 ありがとうございます。しかし上手くいかないようです。
わけわかめ
>>803 長くないなら、プログラムをここにコピペしてみたらどうかな
何らかの理由で、配列[定数]の中身が-1(EOF)じゃないだろうから
806 :
デフォルトの名無しさん :2010/07/02(金) 21:22:32
807 :
806 :2010/07/02(金) 21:23:39
test
csvファイルを読込んでソートとかしている間に プログレスバーを表示させたいんだが、以下のやり方では プログレスバーが表示された状態で処理が止まってしまう。 ファイルの処理をしながらダイアログを更新するにはスレッド処理はダメ? main { // プログレスバー表示スレッド作成 A = (HANDLE)_beginthreadex(NULL,0,ProgressBarThread,hFrame,0,0); // csvファイル読込みスレッド作成 B = (HANDLE)_beginthreadex(NULL,0,FileOpenThread,hFrame,0,0); } ProgressBarThread { // プログレスバー表示イベントの作成 CreateEvent(); // プログレスバーダイアログ作成 DialogBoxParam(); ←ここで止まってしまう。。。 } FileOpenThread { // ファイル読込み、ソートの間にプログレスバーダイアログをUpdateWindowする UpdateWindow(hProgress); }
>>809 モーダルじゃなくてモードレスダイアログ作れ
>>800 最初の質問については
>配列[定数]がEOFの場合
>scanf("%f",&kaz[n])!=EOF
1.プログラム中でkaz[n] = EOF;とするか、もしくはコマンドプロンプトで-1を代入するしか方法はない
2.コマンドプロンプトで、Ctrl+Z 若しくは EOFタイプ後、Enterキーを押下するとscanfの返り値
として-1(EOF)が返されるが、この場合kaz[n]に値が代入されるわけではない
よって
>>802 は1.の場合で有効
>>806 プログラムの最後の動作が、どのようになればよいか教えてもらえれば
そのように変更しますよ。
300個すべてとあるが、float kaz[301]; なのでkaz[0]〜kaz[300]は、計301個ある
また、299+EOFとは具体的にどういった操作ですか?
例)こんな感じで教えてください
1.n=299の時に、コマンドプロンプト上で数字を入力しEnterキー押下
2.n=300の時に、コマンドプロンプト上でEOFを入力しEnterキー押下
>>812 そうです。確認しました。申し訳ございません。
今作っている本プログラムとは数値等を変えているので。
301個すべて数値→OK(n=301)
n(n<300)+EOF→nに入力回数が反映
300+EOF→n=301となります。
ですから、2に該当するかと。
私としては、いかなる場合(300+EOF)でも、nが「入力回数」になってもらえれば良いのですが。
よろしくお願いします。
>>811 最初にEOFに相当する何かを定めないといけないのですね。
参考にさせていただきます。
>>813 if(n==300){s+=kaz[300];n++;}←これを消して、whileの中身を↓に変える
while(n<301 && scanf("%f",&kaz[n])!=EOF )
815 :
デフォルトの名無しさん :2010/07/03(土) 13:09:52
俺はなんて不幸な時代に生まれたんだろう。 クズみたいな教育機関しか日本にはない。 海外に行けばいいとか、全く見当違いだね。 人間は環境の中で育つものだ。 クズみたいな教育機関しかない日本では周りにクズしかいないんだよ。 クズの中で育った俺もクズなのさ。 したがって大学に上がろうという段階では既にクズが決定しているから海外なんて行けるはずも無いわけさ。
#include <stdio.h> int main(void) { int n; char *a[]={"クズ","ホモ","ゆとり","@ピザ","イケメン"}; printf("1〜5までで好きな数字を入れてください。:"); scanf("%d",&n); if (n<1 || n>5){printf("最初からやり直してください。\n");return 0;} printf("俺はなんて不幸な時代に生まれたんだろう。\n" "%sみたいな教育機関しか日本にはない。\n" "海外に行けばいいとか、全く見当違いだね。\n" "人間は環境の中で育つものだ。\n" "%sみたいな教育機関しかない日本では周りに%sしかいないんだよ。\n" "%sの中で育った俺も%sなのさ。\n" "したがって大学に上がろうという段階では既に%sが決定しているから海外なんて行けるはずも無いわけさ。" "\n",a[n-1],a[n-1],a[n-1],a[n-1],a[n-1],a[n-1]); return 0; }
不幸な時代、クズな教育機関、 周りにクズしか居ないというのには同意だが、 残念ながら俺はクズではない。 なぜなら、俺だからだ。
早寝早起き
>>814 解決しました。
本当にありがとうございました。
>>816 どう見ても精子です。
本当にありがとうございました。
そいえば、誰かが掛け算より割り算が遅いって言ってたけど、 n / 2とするより、 n * 0.5とする方が速いんですかね?
ありがとうございました
>>824 元々が浮動小数点数なら *0.5 の方が早いけど
整数だと実測してみたほうがいい
〉)827 ふと疑問に思ったんです。
>>824 nが浮動小数だとすると、速さ変わらないと思う
それに割り算が遅い、というのは昔の(16ビットとかの)CPUの話
お前の頭はそこで止まっているだけだろ
1バイトが8ビットなのは変わってないんだから 当時の16ビットCPUも今の64ビットCPUも、実質は8ビットCPUだろ。 たまには1バイト12ビットくらいのCPU作れよ。 オクタル4桁でキリが良いから表記しやすいし。 ファイルパーミションも1バイトに納まるから便利だしな。
>>832 アセンブラでプログラミングした経験ある?
ネイティブアプリをバイナリエディタでハックしたことある?
プッ
>>834 8bitCPUと64bitCPUは全く同じように扱えましたか?
同じなわけないじゃんw Z80 と 6502 でも全然違うしw
6809 を忘れないでください (; ;)
16ビット以降のインテルCPUなら今の64ビットCPUでもまったく同じに扱えるよな。
ARMって実質的には1バイト32ビットだよな。 アドレスの振り方もそのように変えちゃったらいいのにな。
C言語スレです
とりあえず832がバカであることは伝わった。
なんだその遠吠えw
間違いを指摘されたのがそんなに悔しかったのかよw 悪かったよ。謝るから、もうこの話題は終わりにしようぜw
ざまあwwwwwwwwww
>>830 CPUの仕様見てみろ
割り算はレイテンシもスループットも桁が違う
掛け算は解く過程で並列化できるけど、割り算は解く過程で並列化が難しい気がする(素直な方法の場合) 掛け算は回路を工夫すれば2、3クロックで解くことも可能そうな気がするけど、 割り算は、どうがんばっても2進桁数+2、3クロック程度は掛かりそうな気がする。 パイプラインで流せば、結果的に1割り算1クロックとみなしても妥当…って言い方は可能でしょうけど、 単体で、1個だけを、割り算したときと、掛け算したときとでくらべたら、どうかんがえても掛け算並みのクロックで割り算するのは、 そんなアルゴリズム、ちょっとありえないと思う。もしあるなら教えてください。煽りではなく純粋に知りたいです興味あります。
除算以外は加算で表現できるからな
それがなにか?
最近のCPUはすごいんだから気にするなよ、というのは初心者の素朴な疑問を潰す常套句
だったらCなんか使わず新しい言語使うんですけどね
ですね
Pen4とかじゃ整数除算は内部的には浮動小数で処理してから丸め補正してたような
ここまで実測なし
だからね・・・C言語スレですってば・・・
質問どぞ!
お金持ちになる方法を教えてください
まずお金を用意します。
フイタw
もっとよくふけよ
>>855 プログラム問題サイトとかで速度を競う際に、
割り算は確実に速度に響くぜ
配列インデックスを格納するための変数にdoubleを使うなんてありなんでしか?
>>864 ふつうは無い。実行時パフォーマンスも悪くなりそうだし。
866 :
デフォルトの名無しさん :2010/07/07(水) 22:46:06
sqrtなしで平方根の計算できないかな?
できますん
868 :
デフォルトの名無しさん :2010/07/07(水) 22:56:20
1/2 乗するとか。
逆に考えるんだ。世界の全てを2乗してしまえばもはやsqrtを求める必要はなくなる。
ちょっとやってみた #include<stdio.h> #include<math.h> int main(void){ double x,y; x=sqrt(5); y=5^(1/2); printf("x=%f,y=%f\n",x,y); getchar(); return 0; } 結果 x=2.236068,y=5,000000 ならなかったけど、やり方間違えてるかな
ワロタ
簡単なのだと二分法とかニュートン法とかあるだろ
^^;
え? 排他的理論和?
え?え?
878 :
デフォルトの名無しさん :2010/07/07(水) 23:33:36
聞いたのにご覧のあり様だよ
いいえ、排他的論理和です。
だよね
881 :
デフォルトの名無しさん :2010/07/07(水) 23:39:19
乗算もできない奴がいたとは・・・
( ^ω^)おっおっおっ
>>871 インクルードしてるmath.hの中身を確認して来いよ
ネタはいいよ…
(゚∀゚)アヒャ
886 :
デフォルトの名無しさん :2010/07/07(水) 23:45:35
>>866 はsqrtなしってことはmath.hを使いたくないってことだよな
無理じゃね?
情報系の大学卒業後、IT業界に就職するも、転職して異業種やってる者です。 今、プログラミング言語の世界では、仕事において、何が主流ですか? C言語は人気ありますか?
「(´・ω・`)言語」が人気有りますよ
好きなの使えよ。
ニュートン法 引数に負数とか0付近の数値を渡しちゃダメ 数値誤差の範囲が狭いから大きすぎる値もダメ #include<stdio.h> double mysqrt(double y) { double d, d_abs, x=1.0; while(1) { d=y-x*x; d_abs=(d>0)?d:-d; if(d_abs<=1.0e-10) break; x+=d/(2*x); } return x; } int main(void) { printf("%f\n", mysqrt(5)); return 0; }
変数iによって動かすvoid関数を変える方法を教えてください。 理想としては配列のように関数をまとめたいです。
関数ポインタの配列作ったら?
>>893 #include<stdio.h>
void hoge(void){
printf("hoge\n");
}
void huga(void){
printf("huga\n");
}
void moga(void){
printf("moga\n");
}
int main(void){
void (*foo[])(void)={hoge, huga, moga};
int i;
for(i=0;i<3;i++) foo[i]();
return 0;
}
関数ポインタの宣言わかりにくすぎ
(´・ω・`)オッサンもう寝ろよ
素早いレスありがとうございます。 なるほど、関数にもポインタがあるんですね。 C++も並行して勉強中なのでそちらでも聞いてみます。 ありがとうございました。
899 :
デフォルトの名無しさん :2010/07/08(木) 00:37:37
いえいえ
どういたしまして。
902 :
デフォルトの名無しさん :2010/07/08(木) 01:11:43
おれまだ全然初心者なんだが
>>890 なのってパッと思いつくもんなの?
王道アルゴリズムだろ ぐぐればすぐ出るんじゃないか
(´・ω・`)オッサンもう寝ろよ
>>902 アルゴリズムの本一冊読んだら大体出てくるんじゃね
全然初心者とは?
>>902 単に知っているか知っていないか、
自分の道具箱に入っているかどうかの問題
ニュートン法は有名な手法だから、知っている人も多い
独力でこの手のアルゴリズムをひねり出すのは、
無理ではないと思うが、骨が折れる
興味があるなら数値計算の本をかじっておけばいい
>>887 主流:javascript, php, java, Cなど
910 :
デフォルトの名無しさん :2010/07/08(木) 02:28:36
0xFFFF は、signed int にすると−何になるのでしょうか? ちなみにsinged int が2byteだとしてでお願いします。
-の-FFFF
912 :
910 :2010/07/08(木) 02:37:02
10進数に直すと値は何になるのでしょうか?
お前のパソコンには電卓ついてないのか?
お前のwindowsには電卓は付いてないのか
お前の頭には電卓は付いてないのか。
printf("0x%hx=%hd", 0xffff, 0xffff);
>>910 1 バイトのビット数も指定しないと確定しないだろ。
あと、負の数の表現方法もだな。
1 の補数なのか 2 の補数なのか。
自演
919 :
デフォルトの名無しさん :2010/07/08(木) 10:50:00
>>887 投資と考えるなら、マスターにかかる年数と、その後の数年間は自分で活用できるものかどうかを予測したほうがいい。
2の補数表現
1の補数なら?
>>870 無理
無限小数は無限にあるので、それら全ての集合もまた無限にある
ヒント 内部形式で扱える桁数は有限 もうちょっとメモリが安くなったら平方根や三角関数あたりは全データをテーブル化するようになるだろうな
>>926 全データってw
どのくらいになるか試算してみた?
PHPやっとけ
>>927 8byte の double なら 4G 通りしか無いから、
32GB のメモリがあれば良いことになる。
2^32 = 4G だろ
テーブル作るのに時間かかりそうだな 計算するにしてもファイルから読むにしても
ROM にしとけばいい。
>932 どこから4bytesのfloatの話になったの?
2の補数表現
1の補数なら?
HSPやっとけ
C++のIDEのおすすめ教えてください
>>945 検索サイトで検索すれば教えてくれますよ
>>945 フリーならeclipse、有料ならvisual studio
で?
951 :
TreeBoa :2010/07/08(木) 21:35:25
アポー信者w
Xcodeとか正気か?
いいえ
それは腐ったりんごです
JPなんかで送るからだ
あなたの実家に腐ったイカを送りましたよ!
ありがとうですよ
>>959 ターボ、ボーランド以外でお願いします。
バカなんとか
じれったいのでもう結構です。
(整数入力→13) 1,2,3!?4,5,6!?7,8,9!?10,11,12,13!? オモロー! こんなプログラムはどうやって作ればいいんですか?古くてごめんなさい。
965 :
964 :2010/07/09(金) 22:29:53
修正、12も12!?でした
宿題は宿題スレへ
967 :
デフォルトの名無しさん :2010/07/09(金) 23:43:15
規制くらってるので携帯から。言葉足らずでしたらすいません。 ポインタ変数int *paと配列int a[5]ってのを宣言した時、 pa = a; printf("%d",*pa); と記述したら、%dにa[0]の値が出るのは分かりました。 でもポインタ変数int *pbと多次元配列b[3][4]の場合、 pb = b; って記述しようとするとエラーになります。 何故でしょうか? 最終的にpb+1で4バイトずつアドレスをずらして多次元配列がどういった順序で記録されているか知るプログラムを作りたいです。
&a[0][0]
969 :
デフォルトの名無しさん :2010/07/10(土) 00:10:00
なんで俺はそんな単純な事に気づかなかったの? 馬鹿なの?死ぬの? と、30秒くらい自問自答しましたが、 新しい技術を使おうとしたからしょうがないと結論づけました。 感謝です。 まだ何かがおかしいけど もうしばらく自力でやってみます。
&a[0][0]でできるのはわかるんだけど、pb=b;でエラーになるのはなんで?
エラーになるからだよ
int main(void) { int* pa; int a[3][4] = {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}}; pa = *a; printf("a:%p, *a:%p, pa:%p, *pa:%d\n", a, *a, pa, *pa); return 0; } $ ./a.exe a:0x22cd00, *a:0x22cd00, pa:0x22cd00, *pa:1 なんか分かんなくなってきたぞ
んぼぼ
975 :
名無しさん@そうだ選挙に行こう :2010/07/10(土) 08:11:00
最近初めて400行ぐらいのプログラムを書いたんだが、 できるだけ一つの関数の長さを短くしようとしたら関数の数がけっこう増えてしまった上に 複雑な感じ(main関数のための関数のための関数のための関数など)になってしまったんだが。 今後のために聴きたいんだが、一つの関数のプログラムの理想の長さってどれくらい? ちなみに今回書いたのは400行のプログラムに対して15の関数を使ってるんだが・・・
>>975 基本的にスクロール無しで一画面で表示しきれる程度が最大行数の目安らしいよ
あくまで目安だから分かりにくくしてまで無理してわける必要は無い
977 :
名無しさん@そうだ選挙に行こう :2010/07/10(土) 08:39:20
>>976 ありがとです
今回のは大体スクロールなしでおさまってるから安心した。
一応今回は関数は必要な部分だけ分けたつもりだから、まぁ大丈夫でしょう・・
978 :
TreeBoa :2010/07/10(土) 08:55:15
君たちC言語なんてやってないで Objective-Cでもやれば?^^b C言語wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww (笑)
PCのアプリケーションしか作って無いやつには分かるまい。
そこで全てを手に入れたD言語ですよ
>>978 基本を知らないプログラマーなんて存在そのものが恥ずかしいだけだぜ?
いいなれば、何かを組み立てるのに木材を自分で適当な形に加工できる職人と
加工された木材をただネジなどで組み立てるだけの違いはある。
まぁ標準ライブラリも充実して、扱いも楽なプログラミングでもして満足してなさいってこった。
自分で適当に数式も組み立てられないようじゃ、ねぇ。
数学を学ぶ事も重要さ。
Objective-Cってマッキントッシュ以外に開発環境あるの? あったらやりたいんだが
983 :
TreeBoa :2010/07/10(土) 09:48:51
Mac技術者の戦闘力=Windows技術者10人分 ^^b
C#>>Java>>>>>>>>>>>>>>>Objective-C くらいなもんだよ
Mac技術者の戦闘力=リンゴ10個分 ^^b
>>975 基本的に関数は
・ほとんど同じことを2度以上書かない(再利用目的)
・データと処理が完全に分離できる場合(保守性アップ目的)
を念頭に置いとけば自然と1画面に収まるくらいになるよ
関数の行数を減らすことのみを目的として新たな関数を作る
改行を消すんですね分かります
一画面に収まる程度って、パソコン通信の一画面が20行くらいの時代から 言ってる人がいるけど、本当にそんな基準でやってたのかね。 「適当に50行くらい」とか言っとけばいいのに、スクロールしないで見られる からバグが少なくなるとか理由付けするとうさんくなる。
コードコンプリートにサブルーチンの行数とエラー(バグ)の関係を 調査した結果がいくつか掲載されてるけど、行数がすくないほど バグが少ないってのは否定されてるね。 ただ200行をこえるとやばいって書いてある。 よくネットなんかで言われる行数よりだいぶ大きい。
長いとか短いとかそういうこと考えても仕方なくないかね
200行だと確認しにくいからだろ
次は?
終了の方向で。
とうとうか。胸が熱くなるな
次スレたてます
return C言語なら俺に聞け(入門編)Part 67;
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。