スレ立て規制厳しすぎ
と、あるマルチスレッドプログラムなんだが、 ロック処理もない。スレッドアンセーフティな関数を狙ったように使っている。スレッド間の通信で遠慮なくポインタでメモリコピーしている。 どうしたらよい?
http://hibari.2ch.net/test/read.cgi/tech/1304304298/937-948n 100110111011101011 / 101001 =
100110111011101011 - (159467)
101001000000000000 = ... 0
010100100000000000 = ... 1 (83968)
010010011011101011 - (75499)
001010010000000000 = ... 1 (41984)
001000001011101011 - (33515)
000101001000000000 = ... 1 (20992)
000011000011101011 - (12523)
000010100100000000 = ... 1 (10496)
000000011111101011 - (2027)
000001010010000000 = ... 0
000000101001000000 = ... 0
000000010100100000 = ... 1 (1312)
000000001011001011 - (715)
000000001010010000 = ... 1 (656)
000000000000111011 - (59)
000000000101001000 = ... 0
000000000010100100 = ... 0
000000000001010010 = ... 0
000000000000101001 = ... 1 (41)
000000000000010010 (18)
100110111011101011 / 101001 = 0111100110001 ... 10010
159467 / 41 = 3889 ... 18
◆/91kCCQXBoってどのスレで見ても意味不明な書き込みしてるけど共有トリップかなにか?
>>7 >いまどきレジスタは節約しなくていいものになってるのか
32bit コードにすればレジスタの節約になるとでも?
64ビットレジスタの下半分だけを使っても 残りの上半分を別のことに使えるわけじゃないしな
それに AMD64/Intel64 ならばレジスタが増えたし。
AH、ALみたいに上位と下位を別々にアクセスできれば
13 :
デフォルトの名無しさん :2011/05/13(金) 16:01:40.01
14 :
デフォルトの名無しさん :2011/05/13(金) 16:21:57.18
CDとかDVDじゃなくて プログラム自体にコピーガードってつけれるの? ってかコピーガードってどーゆー仕組みよ?
小数点以下50桁程度の計算をC言語で行いたいのですが, visual studio2010 でコンパイル可能な お勧めの多倍長演算の方法を教えていただけないでしょうか?
多倍長整数2つ使って分数計算するっていうのはどう
ポインタで変数名に*を付けないといけない理由がわからない
*p が気に入らないなら p[0] にすればw
わかる必要があるとも思えない そういうものだって覚えればいいだけ
別に、付けないといけないことはないだろ。 付けたくなきゃ付けなきゃいい。
C++の << >> ってかわいいよね
誤爆した
グローバル変数と静的変数の使い分けができません 静的変数だけで済んでしまうんですが
必要ないならグローバル変数使わなくてもいいでしょ
errno とか使わない人は使わないよな。
>>4 サンスコ、自分捨てたほうが早いから辞めるわ。踏ん切りついた。
グローバル変数も静的変数もなるべくやめるべき
>>29 ローバル変数って、プログラムの実行環境で一旦セットしたら後は参照だけとか、
編集バッファのように、一時的に利用するものだと、使い回せて便利かなって思う
>>12 AMD64/Intel 64 ではそれができない
>>31 そのプログラムは使いまわせて楽かもしれんが、他のプログラムが使えなくなるからヤメテw
でも無理にローカル変数化してるのも却って見にくいよね
ローカル変数にできるならしたほうがいいと思うが、 無理にローカル変数化ってどんなの?
「ローカル」はスコープの問題であって動的静的とは関係ない。
多次元配列とポインターに関する質問です #include<stdio.h> #include<stdlib.h> int main(void){ double test[5][5]= {1,0,0,0,0, 0,1,0,0,0, 0,0,1,0,0, 0,0,0,1,0, 1,0,0,0,1 }; double** x; x = test; printf("ad1=%d\n",*(x)); printf("ad2=%d\n",*test); return0; } とすると、 >ad1=0 >ad2=2358912 のような結果が返ってきます 両方とも、配列test[0]の先頭アドレスを表示させる意図なのですが、 どうしてad1=0となってしまうのでしょうか?
「グローバル」がスコープの問題だからじゃないの
>>38 「二次元配列」と「ポインタのポインタ」が全然違うから
double (*test)[5] でやってごらん
>>38 printf("ad1=%X\n",x);
printf("ad2=%X\n",*test);
>>40 うまく行きました!
二次元配列はポインタのポインタ的なデータ構造ではなかったのですね
ところで、それで宣言されたtestには何が入ってるのでしょうか?
testには最初の一次元配列の先頭アドレスが入ってると思ったのですが、調べてみたら、
最初の一次元配列の先頭の要素が入ってるようなのです。printf("%X",test);で調べてみると・・・
では、二次元配列の任意の要素をtestから参照するにはどうしたら良いのでしょうか?
>>42 test[1][2]とか出来るっしょ
testはdouble [5]への配列へのポインタだから最初のtest[1]でそのオフセットが
自動的に計算される
>42 testは配列だから、何が入っているかといえば、初期化子で与えた値が入っている。 testを評価した結果が何になるかといえば&test[0]と同等。 ※&, sizeofの被演算子になる場合は例外
>>43 #include<stdio.h>
#include<stdlib.h>
int main(void){
double (*test)[5]= {1,1,1,1,1,
0,1,0,0,0,
0,1,1,0,1,
1,0,1,1,0,
1,1,0,0,1
};
printf("12=%f\n",test[1][2]);
return0;
}
で試してみると、プログラムが止まってエラーが出てしまいます・・・
>>45 それじゃだめだよ
#include<stdio.h>
#include<stdlib.h>
int main(void){
double test[5][5]= {1,0,0,0,0,
0,1,0,0,0,
0,0,1,0,0,
0,0,0,1,0,
1,0,0,0,1
};
double (*x)[5] = test;
printf("ad1=%d\n",*x);
printf("ad2=%d\n",test);
printf("12=%f\n",x[1][2]);
return0;
}
>45 2次元配列の正しい初期化は double (*test)[5]= {{1,1,1,1,1} , {0,1,0,0,0} , {0,1,1,0,1} ,{1,0,1,1,0} ,{1,1,0,0,1} }; それと45のコードでtestはポインタで、有効なメモリ領域を指していない。
48 :
デフォルトの名無しさん :2011/05/14(土) 00:55:42.53
キャスト演算子について質問です。 たとえば char a; int b; b = (int)a * 5; ・・・@ b = a; ・・・A とした場合、@で変数aは一時的にint型のように扱われると思いますが Aの処理時は変数aは再キャストしなくてもchar型に戻っていますか?
カマを先頭に付けるのキメエ。
>>46 うまくいきました!
ところでdouble (*x)[5];←これは何を意味してるのでしょうか?
double型の変数のポインターを5個格納する配列を作ったという事ですか?
それとも、アドレス演算に関して、番地を然るべきだけ、つまり五個ずつ飛ばしてくれる、
つまり、x+1でdouble型の値の入った番地の五個先を示してくれるという事ですか?
それが配列のデータ構造という事ですか?
>>48 戻るって言うか別に変化してない
@ではaから取り出した値を計算したり代入したりするときにint型として扱うイメージでどうぞ
>>50 逆
double型を5個格納する配列へのポインタを宣言してる
(int)a 式 a の返り値をintにしてるだけだから 変数としてのa自体は関係ない。 あくまで式な。
>>52 double *test1[5]; //a
double (*test2)[5]; //b
double *(test3[5]); //c
のうちaとcは何を表しているのか?
>>52 なるほど・・・
少し分かって来ました
・・・ところで、自分は二次元配列を引数とする関数を作ろうと思ってたのですが、
任意の配列のサイズに対応出来る関数というのは難しいですか?
プロトタイプは
void func(double (*x)[]);
とすべきですか、それとも
void func(double x[][]);
とすべきですか?
プロトタイプにマジックナンバーは使用したくないのですが、
どうも値を入れないとうまくコンパイルが通らないのです。
何かうまい方法はありませんかね・・・
>>55 二次元配列を大きさ一切指定なし渡すのはCの仕様上無理だから諦めろあきらめろ
gcc拡張でいいならできないこともないが
メモリ上連続してることを利用してdouble * 型にキャストして渡すという方法とかあるよ
できるでそ
C99だとできるのか・・・・・・・・・・・・・・
>>56 配列というのは、二次元だろうが三次元だろうが一直線に並んでるもんなのですか?
int i,j;
for(i=0;i<5;i++){
for(j=0;j<5;j++){
printf("%X\n",&x[i][j]);
}
}
で調べてみたら、値がちょうど8ずつ飛んでるのですが、
例えばsizeof(double)で、アドレス演算をint型で、強制的に(配列サイズ)*sizeof(double)で足してやれば、
配列アクセスを実現できますかね?
つまり、こういうやり方は、マシンに依存したりしてやらない方がいいとかありますかね?
>>55 二次元配列では難しいが、ポインタのポインタなら割と簡単に出来る
配列のアクセスも x[1][2] と同じ形に書ける
やっている事は違うし少し速度も落ちるが・・・・
それにポインタのポインタは行へのポインタ配列をmalloc()などで割り
付けて、さらにそれぞれに行の領域をmalloc()等で割り付けなければ
ならない
お行儀のよいプログラムにしたいのならプログラム終了前に逆順で
free()
freeして終了してもメモリ解放されていません><仕様ですか><
>>60 機械に依存しない形でも書けるけど速度は保証されないぞ
2^Nのサイズのデータをアクセスする時は大抵CPUのシフト命令を
うまく使って高速化している(x86ならスケールドアドレッシング)。
それを式で書くと定数ならばシフトに直してくれる可能性もあるが、
変数にsizeof()を代入しておく形にするとコンパイラは予めサイズを
知る術がないのでMUL命令を呼び出す事になるだろう
それならポインタのポインタの方がいいと思う
最初から一次元配列で用意してアクセス用の関数用意する方法もあるよな
>>60 その技法をやるときは[i * M + j] みたいなアクセスするだけでいいんじゃないかな
それ以前にポインタにint型で1足すとそのサイズ(doubleなら8とか)分進むんだよ
勘違いしてないか
その辺
>>64 の指摘もおかしいような
66 :
60 :2011/05/14(土) 01:49:59.84
一応行けたっぽいんですけど、配列が絶対に、要素のデータサイズごとにアドレスを飛ばしつつ、
一直線に並んでるって保証があれば、これ
>>60 でいきたいと思います。
今回は5×5=25だから、たまたま配列要素が一直線に並んでうまくいったとか、そういう事じゃないですよ・・・ね?
>>62 どうしても無理ならそっちで行きたいと思います
>>64 アドレス演算をintでやると効率が悪いという事ですか?
>>65 だからそれ遅いって
ベンチマーク取ってみれ
できればデバッグ情報付けてコンパイラがどんなコード吐いているか見てみれ
>>65 アドレスを(int)pでキャスト変換して、それに、SIZEを一次元の配列のサイズとして
p+i*sizeof(double)*SIZE+sizeof(double)*j
みたいな感じで考えてます。
>>66 違う
2^Nの演算は2進数を基本としているコンピュータではもの凄く速い
しかしMUL、つまりかけ算命令はどんな数を掛けるか分からないので
大抵はマイクロコードかSRT法で作られているので遅い
逆に言えばsizeof()が2^Nになりそうにない構造体などの多次元配列
を使うならベンチマークを取って見るべきだろう
要素数にもよるがポインタの配列なら2次キャッシュに載るだろうが、
ポインタ配列が指すポインタ配列(3次元配列もどき)だとメモリアクセスが
2回になってL2キャッシュからあふれる可能性が出てくる
何をやらせようとしているのか頭の中でイメージが描けなければこの辺りは
難しいかも
>>67 いや、速度の話じゃなくて
sizeof(double) どこに使う必要あるんだよwwwwっていう話なんだが
と思ったらアドレスをint型に変換してるのか・・・・・・
普通はdouble *型じゃね?
>>69 SRT法は除算だろ
掛け算は筆算+シフトで行うしかない
>>68 int型への変換は変換すること自体が非常にまずい
pはdouble *型に変換して
*(p + i * SIZE + j)とかp[i * SIZE + j]でいいよ
>>69 まるほど・・・つまり、巨大な配列の場合、各要素にアクセスする時に、
配列の各要素のサイズが2^nの形である事を予めコンピュータが知ってる
(通常のアドレス演算の時はもちろん知ってる)でないと、うまく速度が出ないという事ですか?
自分は、せいぜい100×100程度の二次元配列を想定してるのですが、何度もこれにアクセスするとなると
コンピューターに目に見えて負担がかかったり遅くなったりするって事ですか?
>>70 intだと、桁あぶれしちゃうかもって事ですか?
アドレスは離散的な値なのでintにしたんですが・・・
>>72 なるほど、double*型だと、1足すだけで、アドレスを一個進められますね
そっちでいきたいと思います
>>73 目に見えて遅くなるかどうかはCPUのL1/L2/L3キャッシュの容量にもより
何とも言えない
メモリアクセスを減らしたいなら
>>68 みたいにsizeof()で決め打ちすれば
コンパイル時に定数になるからかなりコンパイラが最適化してくれる可能性
が出てくる
それに二次元配列なら目的のアドレスを得るのに掛かるメモリアクセスは
たかだか1回なのでそんなに問題にならないだろう
俺がポインタのポインタを勧めるのは、C++が vector<vector<double> > と
いう形でコンテナで実現している方法が似ているからだ
ただしコンテナはmalloc()/free()は一切必要ないしメモリリークの危険性もない
ポインタのポインタのほうが目に見えて速いサンプルコードを頼む
■va_listを作成する方法を教えてください <例> va_list arg; argの第1引数 = 1; ★ここが知りたい argの第2引数 = 2; ★ argの第3引数 = 3; ★ vsprintf( "第1:%d 第2:%d 第3:%d" , arg ); 出力 ⇒ 第1:1 第2:2 第3:3
⇛ ⇢ ⇨ →
>>78 だね、初心者スレでアドレス演算の速度云々とか、バカとしか思えない。
無視して、まずな
>>65 みたいな素直を書きかたするべき ⇒
>>55 >>77 まず va_list 使って何をしたいか書いてくれない?
>>81 va_list に関係ないが myprintf("%"); ってやられるとだめじゃね?
83 :
82 :2011/05/14(土) 08:22:58.05
◆QZaw55cn4cって糞だよなぁ
86 :
77 :2011/05/14(土) 10:58:51.66
すいません、私の質問の仕方が悪かったです。 質問を変えます。 下記myprintf関数でva_startにて引数情報(argp)を取得した後、 例えばargpの引数情報が 第1引数: 10 (int型) 第2引数: 20 (int型) 第3引数: 30 (int型) だとして、第1引数と第2引数の間に引数を追加したりする事は可能でしょうか? va_listそのものを加工する事ができるかが知りたいです。 第1引数: 10 (int型) 第2引数: 50 (int型) ★この要素をリストに追加 第3引数: 20 (int型) 第4引数: 30 (int型) int myprintf(char const *form, ...) { int n; va_list argp; va_start(argp, form); // ←argp取得 n = myvfprintf(stdout, form, argp); va_end(argp); return n; }
>>86 直感として va_list を加工するのは無理なんじゃないかなぁ…
(おおよそ、呼び出し側の引数スタックの積み方を変えて操作することになるような気配
>>86 スタックを直接弄るのは無理
自分で積み直して呼ぶのがいいよ
>>86 移植性がない感じ
それにスタックはアドレス上位に向かって伸びて行くので、データスタックとリターンスタックが
同じスタックを使っているアーキテクチャでは無理に挿入すると暴走するような気が
90 :
77 :2011/05/14(土) 11:36:21.26
>>87 , 88 , 89
基本的な事を忘れてました。
引数はスタックなのですね。
いじれるわけないですね。
ありがとうございました。
#include<stdio.h> int main(void) { printf("%f\n %f\n %f\n %f\n %f\n",0-4, 3.14*2, 5/3, 30%%7, (7+32)/5); return 0; } ビルドエラーが起きました 間違いの指摘をお願いします
30%%7→30%7
93 :
91 :2011/05/14(土) 12:09:57.17
>>92 回答ありがとうございます
変更したらビルドエラーは起きませんでしたが、実行結果はおかしくなりました
printfの文字列中では変換仕様に%を使うので%自体を入力するときには%%と記述するのではないでしょうか
それは第一引数の文字列リテラルの中の話でしょ
だからprintfから教えるのやめろつってんのに。 putsからにしろ。
>>93 printf("%f\n %f\n %f\n %d\n %f\n",0-4.0, 3.14*2, 5.0/3, 30%7, (7+32)/5.0);
小数形式で出力指定してるのに整数を引数にしてるからだろ。
>>88 「自分で積み直して」ってどうやるの?それってC言語だけでできるの?
できるに決まってんだろアホか
100 :
91 :2011/05/14(土) 12:41:17.30
>>96 ありがとうございます、できました
なぜ%%と書かないで%と書くのでしょうか、
>>94 さんの言っている第一引数がわかりません
ググってみましたがピンと来なかったので説明お願いします
>>100 printf書式文字列 = 第一引数 = 文字列リテラル = "%f\n %f\n %f\n %d\n %f\n" の中の話
>>101 ということは、%%と書くということではないのでしょうか
103 :
91 :2011/05/14(土) 12:50:16.83
あ、すみません理解しました 文字を出力するときに%%と書くのですね ご協力ありがとうございました
%% なんて演算子はない ここにくるより入門書からやり直せ
>>105 積み直し専用関数を作り、va_listからsprintf()で積まれたリストを取り出す
それをもう一度myprintf2()などを作ってそこで挿入したい引数を入れると良い
引数に応じてatoi()などが必須になるのは当然なので
>>106 format で要求している引数数 と 実際に引数に詰まれた数が異なるので、その手法は使えないんじゃね?
myprintf("%d %d %d", 1 2);
こう呼び出しといて、出力結果が 1 100 2 となるようなのを望んでいるように見受けられるが
× myprintf("%d %d %d", 1 2); ○ myprintf("%d %d %d", 1, 2);
暫定案としてこういうのはどうだろう? myprintf("%d %%d %d %%d", 1, 2); /* 2番目, 4番目に注目 */ void myprintf(const char* form, ...) { char buf[でっかく]; va_list argp; va_start(argp, form); vsprintf(buf, form. argp); /* この段階で buf[] は "1 %d 2" */ va_end(argp); /* 以下挿入していく項目を詰む */ printf(buf, 100, 200); }
>>110 ああなるほどvsprintf()を使ってva_listを引数に取る方法があったか
× vsprintf(buf, form. argp); /* この段階で buf[] は "1 %d 2" */ ○ vsprintf(buf, form. argp); /* この段階で buf[] は "1 %d 2 %d" */ ちゃんと推敲しろよ俺orz
>>106 それって書式文字列を自前パーズするってことだよね?
だとしたら、分解して複数回に別けてprintfするだろうから
積み直しっていう言葉からは遠いような希ガス
ビット演算子って処理系によって結果が違ってくる場合があるの?
仕様上はある 負の値のビットシフトは未定義とか 俺は今までそんな変な動作をする処理系に出会ったことはないけれど
>>115 どうも
今後は気をつけて使うようにする
デタラメ垂れてんじゃねーよ
unionってどう使うの? なんであんなに面倒なの
>>118 どう使うって
union {
int a;
char b[4];
} hoge;
hoge.b[0] = 'a'; hoge.b[1] = 'b'; hoge.b[2] = 'c'; hoge.b[3] = 'c';
printf("%d\n", hoge.a);
みたいにするだけだろ。
何のために必要とか言うなら、必要になるまで知らなくてもいい機能だから
無視しとけ。
structじゃダメなんですか><
>>120 例えば、固定長レコードでファイルに入出力する処理があるとするじゃない?
各固定長レコードは、いろんなデータがそれぞれのフォーマットで格納されてて、
実際に読んでみないと、その内容が分からないとする。
そしたら、例えば先頭1バイトにその書式情報を入れておいて、
残りはそれぞれのデータごとに格納すればいい。
先頭1バイトと残りの領域を定義するstructを設計し、
その残りの領域を、unionを使って、好きに割り当てて使えばいい。
どのフォーマットかは、先頭の1バイトで判断すればいいよね。
>>119 そんな使い方するためのものじゃねーよ。
どんだけ低能だな。
えっ? 全面否定するほどの回答では無い様がするが。 後は、例えば union HOGE { double d; unsined int n[2]; } hoge; みたいにして浮動小数点IEEE754形式を直接操りたい時とか
if文の条件式でnが1か3か7ならtrueって簡単にかける?
Pascalならn in [1,3,7]と書けるけどCでは書けない あまり複雑ならswitch caseにしちゃうのもあり
>>123 soket の INET_ADDR_IN はそういう実装してるような気がした
>>124 奇数という条件なら
if (n%2)
と簡単にかけるんだけどな
if(n == 1 || n == 3 || n == 7) のどこが簡単じゃないんだ
これだから童貞は
>>128 直感的には
n == 1 || 3 || 7
と書きたい
>>123 ,126
unsined → unsigned
soket → socket
けど、この手はコンパイラが見つけてくれるので気にしないw
case 1: case 3: case 7: って並べちゃおうw
>>132 それもイイけど、元の質問者は if 文でと前提条件付けてんだからw
if ((n & (n + 1)) == 0)
Perlならこんな感じ if( $n ~~ [1, 3, 7] )
>>134 n = 0 と 15, 31, 63 で true になるぞ。
if (!(n-7)*(n-3)*(n-1)))
>>138 面白いと思って一生懸命考えたんだよ、察してやれよ。
3次式にしてみて
>>136 if (n&!((n- (n+10)%10)|(n&(n+1))))
>>134 (
>>136 じゃなくて)
if ( n>0 && n<10 && !(n&(n+1)) )
>>144 俺の部下がこんなコード書いてきたら、速攻で没にする。
簡単じゃないという理由以前に、10 なんてわけわからない
直値が入ってるから。
そりゃあ俺だってボツにするが、ちょっとした遊びみたいなものなんだから別にいいじゃんw
そんなん言ったら、俺なら
>>128 以外は没にするよ。
if ((0x8a >> n) & 1) ただし n=0..31 に限る
いやいや遊びだからこそ、遊び以外のところはきちんと書かないと (w
NULLポインタの解釈はこれであってますか? NULLポインタは規格上ではどこも指していないポインタで、実装上はアドレスの0番地を指すポインタ これはソフトウェア上で0番地を指すようにしてるだけで、ハードウェア上の0番地とは関係ない
誰かが演算子作ってくれるよ
>>150 言えるのは、NULLの入ってるポインタが0とは限らない。
NULLがアドレスの0以外の処理系でも、
p = NULL;
if (p == 0) … は真となる。
ということ。
勝手に変な解釈したやつが誤解してるだけであって NULLは0だよ普通に。 余計なこと考える必要はない。
NULLは0だと決まっていなかったような
>>156 いや、NULL と書くべきところを全部 0 にしても全く問題ない。
コンパイラは賢いから、null ポインタと解釈すべきところを、基本、心得ている。
ただし。
・プロトタイプ宣言してね。前方参照は苦手なの。
・可変長引数に null ポインタを書くときは、キャストしてね。
0じゃなくても問題ない
普通に0だっつの。 それ以外の何物でもない。
a) ソースコード上の表記 b) 実行コードのアドレス どっちなのかはっきりしろよ。 a) は 0 で、b) は処理系定義で実際 0 でない処理系も普通にある。
言語の上で単に一つ基準になるものを決めてるだけだっつの。 だから何の変哲もなく、ただの0に過ぎない。 EOF が -1 なのと一緒。 値に意味があるわけじゃなくてただの決めごと。
>>161 EOFが-1とNULLが0はちょっと違う。
何が違うのか言ってみろよw どっちもそうだと決めただけのものだろ。
NULLが0って決まってたの?
>>163 NULL (正確にはヌルポインタ) は、ソース上は 0 であることが、言語仕様で
決まっている。また、実際の値が 0 であるかどうかは処理系ごとに違う。
EOF は、単に主要なライブラリがそう決めてるだけ。
>>164 たとえばヌルが0xFF00の処理系があったとして、
p = 0;
と書けば0xff00がpに入る。
そういう意味では0はNULLと決まってる。
EOFは単純に-1
その実際の値が0だよ。 変な誤解はやめとめ。
>>167 つ MS-DOS/i8086
メモリモデルによっては、null ポインタは 0 ではなく、容易にオフセット 0 を書き換えてしまうことが可能であった。
それ別の話じゃね?
#ifって使ってる?
関数作ってmain関数で呼び出すのとmain関数に直接書く場合って 後者の方が実行速度はやくなる?
>>173 その環境で実測しないと分からないけど、普通は後者のほうが速い。
数ナノ秒くらいは速くなるかもね
>>171 一番使うのは #if 0 〜 #endif、/* 〜 */ にするとネストするときがあるから
後は #if defined(foo) || defined(boo) みたいな感じで
>>173 わからない。
関数呼び出しのコストが削減できるので早くなるかもしれないし、
同じ関数を複数回呼び出していたのをインラインに展開することで、
キャッシュに入らなくなって遅くなるかもしれない。
まずはそんなこと考えずに、普通に書いて測定によって関数呼び出し
がネックになっていたら書き換えればいい。
>>173 厳密にいえば差はある。
その差を重要視するか、それとも記述性・表現性・ドキュメント性の方を重視するか、の判断はおまかせする。
NULLはゼロじゃない場合も結構あるよ。 Visual Studio2010は確か、4か7だった気がする
bakademotyondemowwwwwwww
181 :
uy :2011/05/15(日) 02:12:10.57
C言語関連って、知ったかぶり多いよね 173とか正直に「 わからない 」といえば?w まず、コンパイラごとの最適化の様子を見ないとわからない そのコンパイラにとっては、関数分けしたほうが速いコード出すかもしれないし 直接かいたほうが速いかもしれない 結局そこまで気にするならアセンブラで直に書くしかない
「かわらない」でいいんじゃ
暇なので
>>38-76 のプログラム例を作ってみた
連立一次方程式をガウスジョルダン消去法で解く
26行目のconst int N=300; を適当に変えて実験してみてくれ
なおWin32専用
俺の環境では配列の方がポインタのポインタより3倍ほど速い
ポインタからポインタをたどる時に外部メモリへのアクセスが生じて
パイプラインがストールするからだと考えられる
その影響はFMULより大きいわけだ
http://codepad.org/CugYeECJ Core i7 のようなメモリバンド幅が広いシステムならこの差は縮まるはず
184 :
デフォルトの名無しさん :2011/05/15(日) 04:03:31.99
jj=(log(64)/log(2));で jj=5になります。 jj=6のはずなのに何故なんですか?
>>184 jjの型が整数型なら、実数から整数への変換の際に切り捨てが発生してしまっています。
誤差をフォローするから、実数に頼らない演算にするしかありません。
>>183 うちのi7 3.5GHzでは
配列: 23934
ポインタ: 26539
>>183 std::srand std::rand を srand rand に変更した@VS2008
それに、掛け算がどうとかいう話が出てた気がするので、単ポインタ版のtest3を追加。
http://codepad.org/MFRpvUlm /Od (差は明確)
test1 : 2d array
Time Counter = 146366
test2 : pointer to pointer array
Time Counter = 210979
test3 : pointer
Time Counter = 171837
/O2 (誤差程度)
test1 : 2d array
Time Counter = 23299
test2 : pointer to pointer array
Time Counter = 23787
test3 : pointer
Time Counter = 23627
188 :
187 :2011/05/15(日) 08:49:30.90
CPU書いてなかった。i7 860 2.8GHz
内部表現とかないから。 0は0だから。
fopenのモードの"b"が付いてるのと付いてないのとで何が違うんですか 今まで"b"を付けていたfopenの処理を"b"を外すことで何か不具合が起こることってありますか
srand()してからrand()で擬似乱数を取得できますが このテーブル?を複数同時進行させることはできますか? srand(10)のrand()取得したら、次はsrand(5)のrand()取得みたいな感じで 毎回srand()呼ぶとrand()が一緒になってしまうのです 何度呼び出したか記憶するという方法はできそうですが それ以外ありますか?
まだ言ってんのか
#include <stdlib.h> #include <time.h> srand(time(0));
>>192 代替品を自分で作るかどっかからパクってくる
疑似乱数でぐぐればいくらでも見つかるだろう
>>190 通常は、システム毎に改行コードが違うのを吸収するための仕組みがあるんだが、
それを b 付けると解除するようになるだけ。
>>192 まず、それはできません。
あと、擬似乱数が十分に乱数に近いものであれば、それは意味がありません。
普通に rand() で順番に取り出せば十分です。
それで結果が思わしくないようであれば、メルセンヌツイスタ(日本発)などの高性能なアルゴリズムを使えばいいと思います。
srand は毎回使うんじゃなくて最初の一回だけでよい。 もしかして、再現性のある乱数のラインが二本ほしいってことかな?
200 :
198 :2011/05/15(日) 13:50:20.10
>>199 「再現性のある」か、なるほど。
であれば、使う分だけ乱数をあらかじめ取り出してプールしておくしかないでしょうか。
202 :
192 :2011/05/15(日) 13:50:27.09
返信ありがとうございます 単純にランダム系列?がunsigned int では少ないと感じたことと 得られる結果をリプレイのように再生したいというのがあります
rand()の最大値は RAND_MAX だから。 int ほど大きくもないよ。
>>186 >>187 おおさすがトリプルチャンネル&L2キャッシュ巨大
Nの大きさを大きくしてL2キャッシュからはみ出すようなテストをすると
差が出てくるかも
>>187 BCCを使っていたらポインタのポインタ版は配列の3倍ほどになりましたが
VS2010を使ってReleaseでビルドしたらほとんど差が出ませんね
不思議だ・・・
つーかむしろ最後の1次元配列版が一番速くなる・・・
207 :
デフォルトの名無しさん :2011/05/15(日) 15:15:01.44
>>185 jj=(log(64)/log(2));
は6*(log(2)/log(2))=6とCはやってくらいということですか。
分かりました。
208 :
デフォルトの名無しさん :2011/05/15(日) 16:22:36.48
Javascriptでは配列のBox=[]などように空宣言出来ますが CではBox[]とするとエラーが出ます。 なにか空宣言する方法ないのですか?または空宣言できないのですか?
209 :
187 :2011/05/15(日) 16:34:19.71
>>204 300*300*4/1024 = 351KiB
Core i7 860はL2キャッシュ256KB/コア、デュアルチャンネルだよ
>>206 最後が一番速いってのが誤差の範囲じゃないなら不思議だね
>>209 俺のはAthlon64 X2 3800+だけど512KBL2×2かな?
でもdoubleなら300×300×8=702KiBでL2からはみ出ますよね
BCCではまともにポインタのポインタでメモリアクセスするのに対し
VS2010だと差が出ない
吐いたコードを見て見ようかな
>>208 Cの配列はサイズを後から変えられないので空の配列なんか作れても何も入れられないし役に立たないし無意味です
今はサイズ0の配列って駄目なんだな
Cなら配列ではなくてポインタにしといて後からrealloc()で拡げろよ
216 :
デフォルトの名無しさん :2011/05/15(日) 18:17:46.19
const struct HOGE *hoge_ptrにmallocされた領域へのポインタが 入っているのですが、これを解放したいのでfree(hoge_ptr);とすると warning C4090: '関数' : 異なる 'const' 修飾子です。 と怒られます。怒られないようにするにはどうすればよいでしょうか?
>.215 スレタイ読める?
vector.co.jp ってことだろ。
vector.co.jpと空宣言とどういう関係があるの?
221 :
デフォルトの名無しさん :2011/05/15(日) 18:36:58.24
>>220 警告音出て固まります。音だけで何か表示はないですが……。
dbgheap.cの
!CheckBytes(pbData(pHead) + pHead->nDataSize, _bNoMansLandFill, nNoMansLandSize)
に引っかかって
_RPT3(_CRT_ERROR, "HEAP CORRUPTION DETECTED: after %hs block (#%d) at 0x%p.\n"
"CRT detected that the application wrote to memory after end of heap buffer.\n",
szBlockUseName[_BLOCK_TYPE(pHead->nBlockUse)],
pHead->lRequest,
(BYTE *) pbData(pHead));
で逝ってるみたいです。
Windows7(Enterprise)64bit、VisualStudio2008(Professional)です
>>221 出てる通りのことを君のプログラムがしているんだよ、free() 以前の問題
>const struct HOGE *hoge_ptrにmallocされた領域へのポインタが >入っている これってどうやるの?
原因はmalloc(sizeof(struct HOGE *))でした。 お騒がせしました。 // 二徹休出するとアホがポロポロ出てくる……orz
便乗で済まぬが、一般的に malloc(sizeof(struct HOGE)) と malloc(sizeof(*hoge_ptr)) のどっちがいいのかな?
const変数の初期化に関数の戻り値なんてできたのか なんとなく定数しかできないものだと思ってた
多数決で決めよう オレは前者をとる
>>226 圧倒的に後者
前者とか言ってるのはアホ
232 :
226 :2011/05/15(日) 19:36:30.77
確かによく見かけるのは前者なんだけど、双方の良し悪しの理由が判らんのよ 知ってたら教えて
>>232 後者なら、変数の型を変更したときでもそのままで動く
>>232 1. hoge = malloc(sizeof(*hoge)) の方が
hoge = malloc(sizeof(struct HOGE)) より間違いに気づきやすい。
2. hoge の型を struct HOGE から struct HAGE に変更した時に、
ここのコードを変更せずに済む。
あくまでも俺の考え方だが。
被った...
hoge = malloc(sizeof(struct HOGE *)) と間違えることはめったにないけど hoge = malloc(sizeof(hoge)) と間違えることは結構ありそうと思うのは俺だけ? どっちもコンパイラが警告できないのが嫌らしいけどね
書き直して使い回すにしても、大して手間ではないし、色んな方法で一括変換できるし。 sizeofの中に書かれてるものを見てサイズがイメージできる方がオレは好きだ。
hoge = malloc(sizeof(hoge)) は見た瞬間「ん?」ってなる 個人差はあるけど、ぱっと見でオカシさに気付く人は多いだろう
>>237 > hoge = malloc(sizeof(struct HOGE *)) と間違えることはめったにないけど
じゃなくて
struct HOGE {...} *hoge;
struct HAGE {...} *hage;
hoge = malloc(sizeof(struct HAGE))
のケース。
まあ、確かに
> hoge = malloc(sizeof(hoge)) と間違えることは結構ありそうと思うのは俺だけ?
のケースもあるから、微妙ではあるが...。
どうでもいいけどカッコ付けんな ボケ
>>241 int a;
sizeof a + 1
とかってやってたまに間違えるからつい習慣でw
"hoge"の"ってどんな演算子なの?
あと'のほうも それとchar型で宣言しているのに'が必要なわけとか
>>241 括弧をつけないのがかっこいいと思ってるど素人さんですか?
初心者なら、初心者らしくしましょうね。
必要ないところに括弧つけたら欝陶しいだけだろ。 prindf(("%s\n"),("Fack.","Hello, World."));
248 :
デフォルトの名無しさん :2011/05/15(日) 21:54:49.81
ブロックの最初で宣言するってブロックって何?最初ってどこ?
int i = 0; for (;i<9;i++) と int i; for (i=0;i<9;i++) って違いあるの?
>>250 int i;
for (i=9;i--;)
mallocの件は sizeof(*hoge) に賛成なんだけど、
たまーに、ヌルポインタ参照してる!と言いがかりをつけられることが。
文脈的にも、「ある型のサイズ分確保したい」より「欲しいもののサイズ分確保したい」という方が素直な気がする。
配列として確保する場合はchar *arr = malloc(sizeof(arr[0]) * N); としたこともあったと思う。
>>244 'が必要ないとした場合を考えると
char c = a; /* a という文字で初期化 */
char c2 = c; /* c という文字で初期化なのか、変数 c の内容で初期かなのか判断できない */
char c = ; /* 構文エラーなのか、空白で初期化なのか判断できない */
などなどの弊害がたくさん。
>>250 int i;
for (i=0;9-i;i++)
>>250 > int i = 0;
> for (;i<9;i++)
キモチワルくない?
callocのcってclear? mallocのmは想像がつくんだが
256 :
デフォルトの名無しさん :2011/05/15(日) 22:19:39.01
>>255 新ANSI C言語辞典って本に標準関数の名前がなんの略かって書かれてるけど
今手元にない。
>>256 int i;
for (i=-1;8-i++;)
>>255 Cell/Clear ALLOCateだそう
C言語辞典引っ張り出したの久しぶり。
K&Rは特に何も書いてなかった
260 :
デフォルトの名無しさん :2011/05/15(日) 23:17:17.60
\aってなんですか? printf("\a"); ってやっても何も出ないんですが?
うん
これの優劣は? int a[10]; 1.size = sizeof a / sizeof a[0]; 2.size = sizeof a / sizeof *a;
>>264 個人的には2を見たことがないので1の一択
精度50桁という意味ならできません ぱっとみた感じそのライブラリは指数の範囲を拡大するだけで精度は拡大しません
>>267 ありがとうございます
指数の精度を高めるのにおすすめのライブラリをおしえていただけませんか?
任意精度演算 c言語 ライブラリで検索
>>268 「指数部の精度」なんて概念はないぞ。大人しくポピュラーなものを使ったらどうだ?
つーか、そもそも目的が判らんとアドバイスの仕様もないな。
いずれにしても、このスレだとCの言語入門だからスレ違いだ。
数字の後のfてなんのため?ちょっと思い出せないので質問しました。J
float 何も付けなければdouble
あ!、ありがと
274 :
デフォルトの名無しさん :2011/05/16(月) 19:35:33.94
できる人もいるだろうけど、 そんなもの暗算しても意味がない。 標準の calc.exe でも変換できるし。 0h〜Fh(0〜15) まで暗記すりゃ充分。
便乗ですみません 16進数で00+FFはFFですが、FF+FFは何故FFなんでしょうか?
>>276 そりゃ論理和なんじゃねーの?
OR ってやつな。
0 OR 0 → 0
0 OR 1 → 1
1 OR 0 → 1
1 OR 1 → 1
FFh+FFh なら 1FEh だよな。
280 :
デフォルトの名無しさん :2011/05/16(月) 21:10:01.55
C言語をはじめたばかりであまりわからないのですが、 ビットシフトはなんの役に立つのでしょうか?
>>280 僕もC言語をはじめたばかりでわからないのですが
ビットシフトでどのようなことが起こるのですか?
ビットシフト知っていること事態が凄いですよ
>>280 2進数で1ビットシフトする事は、2を描けたり2で割ったりする事に等しい
うーん、なんの役にたつか、といわれると、困りますね。 その昔、マシン語のプログラムを作っていた頃はよく使いました。単純な 2^n 倍とか、CRC の計算とか、割り算掛け算の実装とか。 でも C でわざわざビットシフトを使わないといけない、という局面はそんなにない。(マスクパターンを作成するときくらいか。) C はマシン語を置き換えてきた、という経緯から考えて、その昔、言語開発者が、努めてマシン語にある命令を C にも持ち込んできたのではないでしょうか。
>>280 巨大なメルセンヌ素数みつけようぜwwwwwww
例えばFPUを使わずに実数演算をするルーチンを作る時に シフト演算は大いに役立つ あとC言語の最適化によく使われる
暗号処理、文字コード変換、画像音声コーデックとか もう少しプリミティブなところだとエンディアン変換とか
そうそう、その基礎となる FFT の実装でもビットシフトが活躍していますね。 高速化の定石なのかもしれません<ビットシフト
…まじかよ
釣れたw
2の倍数で割る除算よりシフト演算の方が速い…とかいう話か? 最近のコンパイラなら勝手に最適化して置き換えてるんじゃね
ニワカばっかだな
>>294 先生〜、ニカワじゃない、ニワカものばかりの僕達に的確かつ正確な回答をお願いしますよ
298 :
デフォルトの名無しさん :2011/05/16(月) 23:37:07.54
機械語を知れば、理解される。 答えだ
fft/インプレイス演算でビット逆転カウンタを実装する際に、ビットシフトを活用した記憶がありましたが、 単に 2 で割るだけでよかったのかもしれません。失礼しました。
10年ちかく前からあるコピペだけどまだまだ通用するんだな
◆QZaw55cn4cの臭いがする
303 :
デフォルトの名無しさん :2011/05/17(火) 00:17:05.33
mallocつかうにはどれをインクルードすればいいの?
>303 stdlib.h
◆QZaw55cn4cは糞
リテラル文字列で改行ってこのこと? "hogehoge foo" なら "hogehoge" "foo" でいいよ
"foo\ bar" とかやるの?
禁止されたら"??/n"でなく"\n"にする。 向かってる方向が逆というオチ
リテラル文字列のエスケープ文字はバックスラッシュ(半角の‘\’)だぞ? JIS 7 単位符号には存在しない文字だ。 "??/" が使えなかったらどうすんだよ?
どうしよう…
もしもし もし"??/" が使えなかったらどうすんだよ??
printf("Hello.%c", 10);
ソースコード書くのにシフトJISじゃなくてUTF-8とか使えばいいんじゃね? UTF-8なら半角バックスラッシュあるだろ。
ソースコードに非 ASCII を使う男の人って……
会社で??/使うの禁止されてたら、JIS7単位符号で\の使えるキーボードを買ってもら???
319 :
よろしければ..... :2011/05/17(火) 17:23:40.78
スレ違いですが、もしよろしければ作成してもらえないでしょうか? 期限まで日数がないので..... [1]授業単元:プログラミング [2]問題文 二次元配列に保存された10組の計測データ x 23 34 45 21 34 56 68 78 89 45 y 22 28 55 17 42 56 60 87 91 39 に対して最小二乗法により直線近似した場合
320 :
319の続きです。 :2011/05/17(火) 17:26:07.78
の傾きと定数項を求めるプログラミングを作成しなさい。 ※二つの変数の相関係数を求めて出力しなさい。 [3]環境 [3,1] OS:恐らくWindows7 [3,2] コンパイラ名とバージョン:すいません、わかりません。 [3,3] 言語:C [4]期限:2011年5月18日10時00分まで コマンドプロンプトと秀丸を使っています。
出力をテキストファイルにするコマンドって何でしたっけ? program.cの計算結果をstdout.txtに出力したい場合どうすればいいですか?
このスレは捻くれ者ばかりだから 質問は正確にしないと捻くれた回答が来るよ。
>>320 >コマンドプロンプトと秀丸を使っています。
こんな変な環境を指定してくる奴って何なんだろうな。
Turbo C 2.01 とかを使えば、統合開発環境などもそのまま使えるのに。
>>323 すいません。
1+2
3×4
5÷1
4-2の
結果をstdout.txtに出力したいです。
>>325 #include <stdio.h>
#define FILENAME "stdout.txt"
int main() {
FILE *fp;
if ((fp = fopen(FILENAME, "w")) != NULL) {
fprintf(fp, "%d\n", 1 + 2);
fprintf(fp, "%d\n", 3 * 4);
fprintf(fp, "%d\n", 5 / 1);
fprintf(fp, "%d\n", 4 - 2);
fclose(fp);
}
return 0;
}
/* end */
327 :
895の続きです。 :2011/05/17(火) 23:15:43.51
>>324 大学で今年から習い始めたばっかで、教師にこれを使うように言われてるんで!
リダイレクトのこと訊きたいんじゃねーの?
だな program.exe > stdout.txt
そもそもどうやって出力しているんだか。これでguiだったら大笑いだな
そうだね(大爆笑)
mallocしたあとfreeしますが ちゃんと開放できたか確認する方法はありますか?
>>333 環境が判らんので具体的に回答できないから、「メモリリーク 検出」とかでぐぐってみるといいかも
>>334 ありがとうございます
よさげなサイトがヒットしました
>>336 #include <stdio.h>
int main(int argc, char ** argv)
{
switch (argc) case 1: printf("%d\n", argc);
switch (argc) while (*++argv) {
printf("%s\n", *argv);
continue;
case 1:
printf("--\n");
}
return 0;
}
// 意味があるかは知らん
-- switch (argc) while (*++argv) { == switch (argc) default: while (*++argv) { ++
以下の等式は常に成り立つものなのでしょうか? (char*)( p + 1 ) - (char*)p == sizeof *p
>>339 >337を見ても判るけど、ブロック化しても書けるのだから素直にブロック化した方がいい。
do whileもそうだね。
>>341 どのような状況ならば成り立たないのでしょうか?
例えばpの型が整数型ならエラーだな。
pの型が少なくとも何かのポインタなら成立する? (配列はエラー:左辺第1項の p+1 で)
ごめん 配列でもセーフだ p++ が許されないのが配列だた
(int*) なら +1 すると sizeof (int) だけ増加するぞ。
っ void*
常にというならオーバーフローの可能性も考えないとな!
糞
不動小数点数ってループしますか? double d = 1.0; whle (1) d+=1.0; これで元の数に帰ってきますか?
C言語で「ポインタがわかる」って具体的にどんなプログラムが組めることをいいますか? 単方向のリストは何も見ずに作れるようになったんですけれど、使いこなせているとは思えません。 自分のレベルが今どれくらいなのかや今後どのような練習をしていけばいいのかがいまいちわかりません。 今会社のほうで研修をやっているのですが、大学時代にCを勉強したこともありほとんどわかってる内容だったので。
>>357 argvの引数文字列が自在に扱える、なんてのはどお?
んなこと気にせず必要なもの作っていけばいいんだよ。 必要なものが必要な通りに作れれば、わかってるとか、わかってないとか そんなものどうでもいいだろ。
>>357 とりあえず巷で見かけるアルゴリズムは一通り自作してみたかい?
構造体ポインタは?コールバック関数(関数ポインタ)は?
このあたりまでできればもう覚える段階じゃない。いかに組み合わせて構想を実現するかだ。
>>353 元の数に帰ってきた ^^;
double d = 1.0;
whle (1) *(char*)&d+=1.0;
コンパイルできなかった ^^;;;
実行時に動的リンクされるプログラムでの、mainの位置についての質問です。 以下のソースがあったとします。 // a.c void a(void) {putchar('a');} // b.c extern void a(void); void b(void) {a();} main() {b();} この場合、通常は a.c を動的ライブラリーにし、main()が含まれるb.cを本体とするのが通常ですが、 反対に、b.cを動的ライブラリーにし、a.cを本体としてコンパイルすることは可能でしょうか? a.cを本体、b.cを動的ライブラリーとした場合のコンパイル結果 c.out があったとします。 c.outを実行した場合、まずb.c内のmain()が実行され、a.c内のa()が呼び出される、という動作を想定してます。 つまり動的リンクされるライブラリー内にmain()を置くということは可能ですか? linux,windowsの場合において。
スレタイ読め
>364 話の筋がよくわからないので、逆に質問。 >a.cを本体、b.cを動的ライブラリーとした場合のコンパイル結果 c.out があったとします。 c.outの話をしているってことは、コンパイルだけではなくリンクもしていると読めます。 しかし、a.cが本体(本体ってなんだ?と思うけど、実行ファイルと思っておきます。) b.cが動的ライブラリってとは a.c→a.out bc→b.so となるのではないかな? いま動作確認できる環境がないけど、実行ファイルを作るにはctt0とmainが 必要になるので、言っているようなことはできないと思う。 もしかしたら、mainを含むライブラリは出来るかもしれないが、実行ファイルと リンクできないのでは、実質使いものにならない。 しかしc.outがどこから出てきているのか不明なので、的はずれなことを言っているかも。
367 :
デフォルトの名無しさん :2011/05/18(水) 22:17:41.89
なぜ関数の宣言と定義を分けて別々のところに書く必要があるんですか?
>>367 現時点で必要と思えないなら、知る必要もない
自然数nに最も近い素数を求めるアルゴリズムを考えてくれ
>>366 a.c->a.out
b.c->b.so
でいいです。
a.out は b.soを利用して動作します。
そうですか、やはり無理ですか…
元々、静的リンク前提で作られてるライブラリーなので、静的リンクでは当然mainも実行バイナリーに含まれるので問題無かったのですが、
.aではなく .so でやろうとしたら、上手く行かなくてこまってました。ありがとうござました。
a.c側にmain()を持ってくる大改造は避けたかったのですが、他に方法が無いようなのでがんばります。
372 :
デフォルトの名無しさん :2011/05/18(水) 22:30:49.18
>>367 「ソースレベル・リンク・システム」おすすめ。
>371 そりゃライブラリの設計がおかしいよ。 ライブラリは再利用ができるモジュールであるはず。 それがmainを持っているっていうのは、ファイルとして分かれているだけで ライブラリとしての再利用性は無いに等しいじゃん。 >a.c側にmain()を持ってくる大改造は避けたかったのですが、他に方法が無いようなのでがんばります。 メインを移すだけでいいならそんな大改造でも無いと思うが。 ファイルスコープ変数が大量にあって、mainで見えるように穴をあけるのが大変、というのなら、 ライブラリの意味ないから、一本の実行ファイルにしてしまえばいいじゃん。
>>371 美しさ云々はさておき最小の改造で済ませるなら、
b.c の main を mymain に改名して、a.c に mymain を呼ぶ main を作る
じゃダメ?
>>375 >>ライブラリの設計がおかしい
そんなこと言われてもこまります。
自分はlinuxに移植するだけで、もともとの設計者は別人ですので…
動的ライブラリーにしたいのは、ライセンスの絡みが理由です。
移植の際にgtk+2というライブラリーを使うので、これはLGPLというライセンスなので、
非GPLと静的リンクしてしまうと、非GPLとして発表することでライセンス違反になってしまうのですが、動的リンクなら違反にならないので。
分ける理由はそういう政治的な理由です…orz
>>376 過去のソースも無改造で同様に動作する。という縛りがあるので、
たとえば a.c は、まったく同じソースコードのままでなければならない(一字一句同じ) という縛りがあります。
なので、a.cに直接mainを追加で書いたりはできないんです。
#includeされるライブラリーヘッダー内に、なんとかa.cソース内にmain()を追加する仕掛けを書いて対応しようかと思ってます…orz
>>377 なんか言ってること矛盾してない?後出し満載なので、これ以上は付き合わないけどね、おやすみ
> a.c側にmain()を持ってくる大改造は避けたかったのですが、他に方法が無いようなのでがんばります。
> たとえば a.c は、まったく同じソースコードのままでなければならない(一字一句同じ) という縛りがあります。
>>377 b.cを動的リンクにしたいという動機はそのライセンスのせい?にしても筋が通らないように見えるけども。
エントリポイント変えてc.cにエントリポイント書いて、b.cのmain呼べば?
>>379 それが簡単でいいかも。
b.c中のmain部分だけをc.cに移動してc.aとして静的ライブラリーにし、b.cはgtk+2を使う部分だけにしてb.soにし、
gcc a.c c.a -Lb.so で使えるようにすれば、mainのエントリーポイントがa.outに来るし。c.aは非GPLにできるし。
fgetsをfopen、fread、fcloseの3つで代用するにはどうすればいいのでしょうか。
HAHAHAww
fgetsは改行コードで読み込みをとめる。 違う文字で止めてほしかったから実装例が知りたいんです。
キーボードの入力の改行までっていうのはドライバーの仕様だから それを変えたいなら raw モードにするといいよ。 Win 環境なら getche() を使うといいかな。
char*str str="YAMDA"; としてmallocで新たに取得した領域にYAMADAが確保されるにはどうしたらいいですか? 正しstrcpyなど文字列コピー関数は使わない事。 char*ptr ptr=mallocです。
>>386 マジな質問なら、strcpy()を使えない理由を頼む。
宿題か何かなら、一文字ずつコピー。
パズルなら、構造体の代入を利用。
1) 二つの整数int a, int bをa≦bとなるように並び替える処理 A)#include<stdio.h> int void(&a,&b) int main(void){ scanf("%d %d",&a,&b); printf( "%d %d\n", ) } int void(&a,&b) { int tmp; if (b < a){ tmp = a; a = b; b = tmp; } } 値が並び変わらないのですが なぜなのかおしえてくださいmm
なんの冗談だよw
つ int a, b; void ooikiku(int &a, int &b); void ooikiku(int &a, int &b) { ... }
scanf("%d %d",&a,&b); call( 関数 ); 関数を呼び出すcallを作れば良いよ
つーかコンパイラエラーだろ
int &a; って表記はムカつくよな。 &a が int にならないし。 こういうクソ仕様決めるようなアホが int* a; なんて書き方して喜んでるんだろうな。
>394 C++の話はC++のスレで。
ローカル変数へのポインタを返しちゃダメって言うのは分かるんだけど、 これもやっぱりダメですか? int * hoge_test(int *v) { if (*v == 0) { return NULL; } else { retun v; } } int main() { int v=50; int *p; p = hoge_test(&v); if ( p == NULL) printf("error\n"); }
ダメじゃない
>>398 やってること自体は問題ない
だが
>ローカル変数へのポインタ
この意味を全く理解はできていないな
お前が返してるのはローカル変数の値だ
あ、確かにそうですね! 納得しました。 返すのがポインタなのでちょっとびくびくしてました・・・
しかし、ポインタで遣り取りする理由の判らんI/F仕様だな。
「通」まで読み込むとWEOFが返ってしまいます どうしてなのか教えて下さい text.txtの内容 保存形式は名前を付けて保存の所で「Unicode Big Endian」を指定 ----ココカラ testテスト test通るtest ----ココマデ void test(void) { int i = 0; FILE *fr; wint_t tch = 0; _tfopen_s(&fr, _T("test.txt"), _T("r")); fseek(fr, 2, SEEK_SET); //BOMスキップ while((tch = _fgettc(fr)) != WEOF) { i++; printf("%d %d %c\n", i, tch, tch); } fclose(fr); }
TとWを混ぜるんじゃねーよバカ。
スレ投稿用に関数化しただけだろうし別によくね wint_t → _TINT WEOF → _TEOF こうしても無理だろ
クソきめえコードだな。 最初から書きなおせよ。
やってみたけどバイナリで読むしかないんじゃないか? #include<stdio.h> void main(void) { int i = 0; char ch = 0; FILE *fr; fr = fopen("test.txt", "r"); fseek(fr, 2, SEEK_SET); //BOMスキップ while((ch = fgetc(fr)) != EOF) { i++; printf("%d %d %c \n", i, ch, ch); } fclose(fr); i++; printf("%d %d %c\n", i, ch, ch); }
>void main(void) > char ch = 0; > while((ch = fgetc(fr)) != EOF) {
>void main(void) main を void 型にしないこと。 > char ch = 0; 無意味な初期化はしないこと。 > while((ch = fgetc(fr)) != EOF) { fgetc の返り値を char 型で受けとらないこと。
直しても無理だな UnicodeとUTF-8は"r, ccs=UNICODE"と"r, ccs=UTF-8"でやってるんだろうか
何回も使う関数の中で、一回関数が呼び出されるたび一回だけ 使用する配列はどう定義したらいいですか?
特に大きいわけじゃないなら普通に自動変数で
>>403 通でEOF(エラーではなくファイル終了)が返るな
やっぱバイナリじゃないだろうか
>>403 Windwsだよね?
fopenはUTF-8かUTF-16LEのBOMしか判定しないから
UTF-16BEはバイナリモードで開いて自力で処理するしかないよ
415 :
デフォルトの名無しさん :2011/05/20(金) 20:58:56.26
if (a==1) if (1==a) どう違うんですか?下のを使うように注意されたんですが? さらに if (!(a-1)) はどうなんですか?
文字と文字のスペースをあけるって何ていうんだけ?改行じゃなくて・・ まぁ tablenoteじゃなくて tabel noteとしたいです。同じ行です。 どうしたらいいですか? 改行の場合は\nでしたよね。
>>415 if( a = 1 ) って書き間違えたときに if( 1 = a ) ならエラーにしてくれるから癖にしておくといいよってことだろ
if( a == b ) とかの場合だと入れ替えても意味がないけど。
>>418 それ凄いよな
emacs立ちあがったとき感動したw
>>415 >if (1==a)
悪しき習慣だ。「1がaに等しかったら」なんて普通の思考じゃない。
思考過程をなぞって「aが1に等しかったら」つまり、a == 1 とするべきだ。
これを強要されるような環境だと、形式主義に陥りがちだから他にも変な習慣があるに違いない。
>if (!(a-1))
判り難い上に定数前置のような微かなメリットもない。従って、スタイルとしては論外。
>>416 何がしたいんだ? 文字列リテラル中に空白を置きたいだけならそのまま書けばいい。
だな if( a = 1 ) とした(間違った)ときにワーニングが出るようにして、注意深く精査すべき
>>415 まちがえて
==
ではなく
=
って書いちゃったときに、コンパイルエラーが出るから安全(?)って理由が主でしょ。
たとえば
if(a = 1)
ならコンパイル通るけど
if(1 = a)
ならエラー(定数への代入でエラー)になるから、いろいろ捗るってことだと思う。
426 :
デフォルトの名無しさん :2011/05/20(金) 21:25:26.71
windows.hってどこで手に入れたらいいん?
自分で作れ
>>426 VC++かMinGW
MinGWのはどこまで互換性があるか知らんけど
間違えて = にして痛い思いをすると、二度としなくなる。
if( a = 1 ) これがコンパイルできないようにするのがよりよい
Cの規格に何一つ違反してないものをコンパイルできなくするとかw
432 :
403 :2011/05/20(金) 21:50:25.79
こんなにもレスがつくとは・・・ ファイルの先頭が 0xFFFEなら"r, ccs=UNICODE" 0xFEFFなら"r" 0xEFBBBFなら"r,ccs=UTF-8" それ以外なら"r" で開いて i=0 ファイルの終わりまで { // {1 1バイト読む TCHAR szBuff[i]に入れる Unicode big endianなら { // {2 2バイトずつ前後入れ替え (Unicodeにする) 例 szBuff[i-1] = 0x00 szBuff[i] = 0x0Aから szBuff[i-1] = 0x0A00にする } //2} 改行が来たらTCHARをWideCharToMultiByte();して別テキストに"a"で書き込み(ANSIになる) } //1} こんな感じで処理していました ccs=<Encode>が無いと「通」に限らずUnicodeで言う「0x1A」をANSIで言う制御文字「SUB」として認識されるため って言うことでした お騒がせしました
訳も分からないままTCHAR使うのはやめたほうがいいね
>>431 俺バカなんでバカよけ仕込んどかないとだめなんよ
俺も
>>429 と違ってバカだから今まで何回同じミスしたことか・・・
>>435 いつも使ってるコンパイルスイッチ教えて
ちゃんとしたコンパイラなら警告出るでしょ。
>>436 俺と同じくらいバカなら Wall Werrorは最低限やっとくといいよ。なんど救われたかわからん。
>>436 えてして痛みって時間経過で消えてしまうんだよな
そのたびに、新鮮な気持ちで間違えるw
>>431 ,435は素人さんなんじゃないかな。
もしくはほんとにミスをしない人。
でも後者ならこんなとこでくだまいてないから……ね。
VCだと警告出るけどgccだと出ないよね
へぇ
>>441 つまり自称玄人はコンパイラの出す警告なんて無視するってことかなw
gcc -Wall -Wextra これで出なきゃ諦めろw
コンパイラのご機嫌伺いなんて素人のすること プロにとってコンパイルエラーはコンパイラのバグ
double型で精度を良くしたい場合どうしたらいいでしょうか?
>>444 なんで警告無視することになってんの?
>>442 gccは -Wparentheses で。(-Wallに含まれる)
VCもスイッチなしなら警告でない。
かといってWallつけるとstdio.hの中で警告が出る問題を抱えてる
> stdio.hの中で警告が出る問題 そうなんだ そうなんだ
プロにとってシンタックスエラーはパーサのバグ
そんなに=にするミス頻発するならマクロで #define EQ(A, B) ((A) == (B)) でも定義しろよw
QZは糞って書いてる人か
Wno-system-headers じゃダメか?
入門編スレでそんな事どうでもいい
そんなマクロ書くとかどうかしてる
>>453 伝わりにくくてすまん。clだと警告が出る。
>>454 入門者こそ警告が沢山でる設定にすべきだと思わない?
定数左に書かなきゃいけないほど==と=を取り違える人間が、 変数同士のときは==と=取り違えないとは思えない
>>456 >入門者こそ警告が沢山でる設定にすべきだと思わない?
同意。出された警告の意味をちゃんと分かって欲しいよね
>>447 ・可能な限り誤差を抑えられるよう工夫して計算方法を変える
・double型をあきらめて他の方法を考える
>>459 %eの後ろに付ける桁数調整の記号とかは何の役割なんですか?
>>460 doubleが記憶している本物の値のうち何桁まで表示するかを指定する
>>460 %eの後ろに付けれるものなんかあったっけ?
元々の演算結果が解析解と一致しているかどうかは関係なしに (文字列化の際の)表示桁の調整してるだけ。 精度・誤差 ≒ 解析解との違い
>>461 桁数調整記号つけないとどうなるんですか?
またつけるときの例を教えてください。
465 :
デフォルトの名無しさん :2011/05/20(金) 23:38:05.56
じゃぁ処理系によってdoubleの掛け算の結果を同じ桁で表示させても 違ってくるんですか?
表示桁にもよるが十分にありえる話
>>466 double型って何桁まで表示できるんですか?
型が表示してるわけじゃない
さあ? どこまで出せるか試したことないし 整数部が1で少数部の4桁目〜5桁目で食い違った系は経験したことがある
>>469 e--
以下の部分が全然違う事があるんですが。
>>467 2進数で53ビットだから、10進で9007199254740992なので15~16桁が有効桁数かな
その15~16桁ってのは 小数点以下のことですか?
>>472 「浮動」小数点の意味がわかってないのか?
>>471 素朴な疑問
double が IEEE754 基数2 として実装されてて、
保持されてるそれが 10進の値で循環小数になるようなのは
printf やそれに類する文字列化関数でいくらでも文字を並べることが可能なのだろうか?
むり
>>475 確か256バイト制限かなにかがあったんじゃなかったかな?
異常値が来ると怖いから、%fはそのままでは殆ど使わなくなったから用ないけど。
たとえば、
void func(double val)
{
char buf[100];
sprintf(buf, "%f", val);
}
なんて関数があったとして、func(1e100)なんてした日には。
>>474 ある数字の適当なところに小数点をつけて表現するから浮動
有効桁数が8けただとすると、12345678は表現できるけど、123456789は表現できない
で、12345678の適当なところに小数点をつけて表現できるので
0.000012345678 も 1234.5678 も 1234567800000000.0も表現できる
けど、1234567800000000.0 に 1.0を足そうとしても、有効桁数の範囲で収まらないので、消える
>>475 2進数から10進数への変換は常に有限
循環小数にはならない
>>479 ありゃ 俺の勘違いなのかな。
基数2での可数部の値の表現を確認してみるー
2^0 = 1 2^-1 = 0.5 2^-2 = 0.25 2^-2 = 0.125 2^-3 = 0.0625 2^-4 = 0.03125 2^-5 = 0.015625 2^-6 = 0.0078125 2で割るたびに桁が増えていくだけで無限にはならない
循環したような気がして思い出してみたが 思い出したのは0.1(10進)が2進では循環することだった
ゼロからソースを書いてオリジナルOSを作ってみたいんだけど、どれくらいのC言語の実力があればいいと思う? 一応、縦シューティングなんかはよく作るんだが
>>484 ブートとかでアセンブラの知識がいるだろう
そのほかの部分でもレジスタ直接たたいたりする低級なところの知識が要る
Cの知識はプログラム書ければ問題ない
>>484 こんなところで聞いてる時点でお前の実力じゃ無理。
>>484 作り始めの時点でC言語知識無しの
ひげぽんが作れたからやる気の問題だろ
C言語で座標上の点を考えて図形の面積を考察するという問題があるのですが この場合doubleかfloatどっちが有効ですか?
489 :
デフォルトの名無しさん :2011/05/21(土) 14:01:33.29
許容誤差による long double でさえダメな可能性あり
>>489 精度がいいほうがいいです。
long double とdoubleだと
long doubleを使うにこしたことないんですか?
typedefとdefineでは書き順が逆なのはなぜですか? typedef int INT define INT int
どなたか教えて下さい。 行列のサイズを2または3を選択させ、その行列を表示しその行列式を計算するプログラムを作れって問題です。 どなたかお願いします。
>>492 宿題スレへでも。
>>491 目的が違うから構文が違うのも無辺なるかな。
>>490 long doubleを使うべきならその通りだが、大抵の用途ではdoubleで充分かlong doubleでも不充分だろう。
用途をはっきりさせたまえ。
無辺なるかなw
>>493 単に学校の演習です。
精度が良ければいいにこしたことないけど、大規模な事をするわけでも
ありません。
浮動小数は精度のための規格じゃないよ。
ちょっと何言ってるかわかりません
有効桁数のことをいってるんだよ
>>495 精度が良いと言っても、人によって受け止め方がまちまち。
「こういう事をしたいから、最低小数点以下何桁まで正確に計算したい」とか
「課題として、何桁の出力を求められてる」みたいに、
具体的に言わないと伝わらない。
500 :
デフォルトの名無しさん :2011/05/21(土) 16:53:31.54
>>495 特に理由がなければ「通常は」 double
501 :
デフォルトの名無しさん :2011/05/21(土) 17:51:56.72
int i; i=0; として while(1){ 略 break; ↑ 〜略〜 ↓ i++; } if(i==1)printf("t"); という関数があるのですが、break文によってwhileを抜けたのにも 関わらずtが出力されます。何故ですか?i++;に到達するまでにbreak; を起こしているのに・・
>>501 % cat foo.c
int main() {
int i = 0;
while(1) { break; i++; };
if(i == 1) puts("t");
else puts("f");
}
% gcc foo.c
% ./a.out
f
略のところで1にしちゃってるんだろ。
sinやtanなどの三角関数はラジアンで入力、出力されるのですか? 自分の電卓では弧度法なんですよ。
自分で調べればわかる範囲は自分でやれよ
変換すりゃいいだろが。 ちょっと掛け算するだけだろ。
三角関数はラジアンで「出力」とか言っちゃってる奴はスルーしなよ
大人だったら善意に解釈して逆三角関数も含めてあげなきゃ
助けて下さい・・・2年連続で単位落としてるんです。 3年連続で単位は落としたくないです。 昨日のdoublenの質問をしたものですが、座標上の値をdoubleで表現すると 1.23200e-16 みたいになってしまいます・・・ 僕的には0,323みたいに このeみたいなのがつかない表示がしたいです。 どうしたらいいですか? もう頭がおかしくなりそうです。
511 :
509 :2011/05/21(土) 20:30:43.53
>>510 fはfloat型じゃないのでしょうか?
eはdouble型でしょう?
助けて下さい・・
3年の時点で単位30個です・・・
ほとんど留年決定してますが。
プログラミングの授業が出来なくて、簡単なほかの授業のテスト勉強も
ままならず単位落としてしまってる状況です。
%f %e %g は全部 double printf に渡すとき float は自動的に double に格上げされるので float の変換指定子は無い
>>511 具体的な問題を先入観抜きでアップせよ。
よけいなバイアスがかかっていてこちらには伝わってこない。
※ %e は、浮動小数点式の表示方法、%f は固定小数点式の表示方法を指定する
※ %e や %f の表示対象は浮動小数点数、つまり double か float
※ %f は double でも float でも OK。printf() は可変長引数だから、結局は double に変換される。
※ float と double の違いは、変数のサイズ。その結果が精度や表現可能な数の範囲にも反映される。
514 :
509 :2011/05/21(土) 20:54:37.38
>>513 ありがとうございます・・
floatとdoubleの違いが全く分かりません
どうせだから3年連続で落としておけよ。
516 :
デフォルトの名無しさん :2011/05/21(土) 21:25:59.87
30桁の整数の積を表示するにはどうしたらいいですか
517 :
デフォルトの名無しさん :2011/05/21(土) 21:29:31.45
暗算
その前にどうやって計算させたんだ? 計算ができてりゃ表示なんて簡単だろ
>>516 積を文字列として入力してもらい、printf()などで表示。
522 :
513 :2011/05/21(土) 22:04:50.24
>>514 float は(環境にもよるが普通) 4バイトで実数を表現する。
double は 8バイトで実数を表現する。
おのずと、double のほうが表現できる範囲が広くかつきめ細かく表現できる。
そのかわり float のほうが、サイズが小さい分、限られたサイズのなかでは多くの実数を格納でき、(一般的には)演算が速い。
要は用途にあわせて一長一短になるといってよい。
演習レベルでは double にしておくのが無難である。 C の関数によっては float を double に変換して処理するものがある。
例:printf()
524 :
509 :2011/05/21(土) 22:56:23.18
>>522 ありがとうございます。
多くの実数を格納できるという意味がよくわかりません。
どういうことですか?
>>509 卒業まであと何年掛かるのか?
卒業してどういう仕事に付きたいのか?
今やっていることは仕事に直結させたいのか?
おそらく決定的に向いていないと思うので、
さっさと学校辞めて高卒資格の公務員にでもなった方がいいよ。
高卒程度の公務員は20歳までの年齢制限です
>>526 じゃあもうアウトなんだなw
>>509 は派遣労働者確定ですかwww
色々渡り歩いて仕事が辛くない&正社員登用している工場探した方がいいな。
大手だと残業夜勤で中小の大卒よりもいい思いできるからな。
一生フリーターより断然いい。
528 :
509 :2011/05/21(土) 23:50:47.23
>>527 黙ってろ。どうせアドバイスするつもりもねーんだろ。
>>522 とりあえずdouble使ってみます。
floatだと小数点表示がわかりやすい気がするのですが・・
529 :
509 :2011/05/21(土) 23:55:11.34
すいません、言い過ぎました。 ただ煽らないでください。そういったら煽るんでしょうけど。
>>524 単に、同一サイズの領域の中に変数を詰め込む場合、float の方が double の倍詰め込むことができる、位の意味です。
実用的には、float の方が演算が速い、というのが大きいようです。(cuda とか。まだやったことないけどいずれは‥‥)
>>531 相変わらず見当違いのレス乙。
floatが速いなんて、それなりの知識がないと応用できないようなこと初心者に言うな。
自分自身だって判ってないじゃないか。
それと、printf()がfloatをdoubleに変換するわけじゃない。
つーか、いい加減既にないスレのリンクなんか書いてないで布団被って寝ろ。
公務員はもうオワコン。 これからはブラジルで農業がアツい。
>>532 >floatが速いなんて、それなりの知識がないと応用できないようなこと初心者に言うな。
それは
>>530 で私自身も認めていることであるし、あらためて言われてもねえ。
>それと、printf()がfloatをdoubleに変換するわけじゃない。
それも
>>513 できちんと書いておきました。なんなら IEC/ISO 9899:1999 の該当場所でも引用しますか?
最終的に
>>522 で 私自身の意見として double を勧めていますが、それでもご不満?
なんであれほどの頭の悪さで、他人の質問に答えられるとか思うんだろう
俺に言わせりゃ
>>532 も目くそ鼻くそを笑うだなw
>>536 ほう、では
>>529 に対してさぞかしすばらしい、いや妥当な回答をかけるというわけですね。期待しています。
また◆QZaw55cn4cが荒してんのか
>>534 >実用的には、float の方が演算が速い
そもそも、それ自体が一般的ではない。
>可変長引数だから、結局は double に変換される
だから、それはprintf()が行なうのではない。
やっぱり判ってないじゃないか。
◆QZaw55cn4cは糞
CPUに載っているかいないか、どういう実装なのかだけの話なのに 何キリキリしてんだよ。
C言語使い==キチガイだからね
そういう用途で "==" を使う馬鹿って後を断たないよな。 これ、 1 == 0 と書いたって別に間違いじゃないんだぞ? 意味解ってやってんのか?
◆QZaw55cn4cは糞
545 ていうのは、いつどのスレでQZにいじめられたんだ?
547 :
デフォルトの名無しさん :2011/05/22(日) 09:44:49.80
それを言うなら "C言語使い"=="キチガイ" だが常に偽だなw
>>547 ◆QZaw55cn4c == キチガイ は常に真
自作ヘッダ内で例えば、int tokubetu;と宣言されていたら あるプログラムファイル上でそのヘッダをインクルードする場合 main関数内でint tokubetu;と宣言するのはだめなのでしょうか?
インクルードしているのを自前で展開してみるとわかる。 #include "b.h" int tokubetu; main() は、 int tokubetu; int tokubetu; main() と、二回定義しているので、以下のようにする。 [b.h]は、 extern int tokubetu; [main.c]は、 #include "b.h" main() [b.c]は、 #include "b.h" int tokubetu;
問題ない。 int a; int main(){ int a; { int a; {int a;} } return a; } いくつでも書ける。
ヘッダファイル内で宣言されたint型の変数などは 外部変数と呼ばれるんですか?呼ばれないのでしょうか?
それも、インクルードしているのを自前で展開してみるとわかる。
556 :
デフォルトの名無しさん :2011/05/22(日) 13:19:56.93
終了しないことが前提の関数のテストになにを使っていますか?
while(1)の中でbreak;を使ってもいいですか?
>>559 何故でしょうか?
while(1)から抜ける条件としてはbreak;以外にありますか?
goto
longjmp
exit()
>>561 何故やったらいけないのですか?
while(1)
{
break;
}
だめですか?
>>557 無限ループで戻らない関数をテストするのに便利な
テストツールはありますか?
568 :
デフォルトの名無しさん :2011/05/22(日) 14:14:42.46
>>566 while(1)
{
if~~
break;
}
みたいな形見た事ないからです。
>>560 無限ループは抜けないのが前提なんだから抜けるのはおかしい。
抜けるなら while(1) を使うのはおかしい。
>>556 >>567 関数の中で、ログをテキストファイルに吐き出しながら、別プロセスの tail.exe で監視なら。
テキストファイルのオープンとクローズはその関数を呼び出す前に。
>>572 それってテストの自動化面倒くさくないですか?
//test.c int main(void) { unsigned char data[1]; unsigned char buffer[64]; unsigned char dummy[20]; while (fgets(buffer, 64, stdin) != NULL) { if (buffer[0] == '/') continue; sscanf(buffer, "%10s,%d", dummy, &data[0]); } //dummyは読み捨て、dataで色々する return 0; } //test.txt //こめんと あああああ,10 いいいいい,20 ううううう,30 mingw gcc3.45でコンパイル後、 test.exe < test.txt と実行すると不正終了するんだが、何でかな?bcc5.5でコンパイルしたらちゃんと動いたんだが。 sscanf()で暗黙の型変換した値をそのまま代入しようとしてる?gccのバグ?
>>576 別に宿題じゃないよ。要素数1の配列でいろいろ試してるだけ。
バグかどうか切り分けたいからあんたの環境で実行してみてよ。
%dにはintのポインタを渡さなければ結果は未定義
抜ける条件があるならwhile(1)なんて使うなよアホか
途中で抜けたい場合もあるだろ
じゃあ loop: goto loop;
%dがおかしい
printf("%f\n",a);
>>579 スピンロックってそういう構造だと思うけど
>>415 コンパイラがどう解釈してるのかは知らないけど、
左辺に定数置くと条件判定が速くなるとか誰かが言ってた。詳しい人教えてくれ。
ならねーよ
>>415 それは古豪がよく使っており賛否両論。
if (a == 1)
を間違って
if (a = 1)
と書いてしまっても昔のコンパイラは警告はださなかった。
こんな間違いをするか!と思うだろうが1万ステップに1回くらいはやらかしても不思議はないし、そしてなによりも
この手のバグは見つけにくい。
if (1 == a)
と書くように習慣づけておれば、間違って
if (1 = a)
と書いたとして、当時のコンパイラも左辺値云々のエラーを出してくれたらしい。
コンパイラの出すエラーや警告と相談して好きにしていいと思う。
>>588 さすがにそれはないと思う。
俺は騙されてたのか(´・ω・`)
未だに1 == aがいいのかa == 1がいいのかわからない。 ミスを少なくするなら前者だとは思うんだけど。 うちの仕様書でも明確に決まってないし。
まともにデバッグできれば、すぐわかることを...
苦cのプログラムなんだが、 #include <stdio.h> int main(void) { char str[32]; scanf("%32s",str); printf("%s\n",str); return 0; } これで32字以上入力したらEOSを入れる場所が無い気がする ・EOSが入らない ・配列の最終要素のさらに次のメモリ領域を破壊して無理矢理EOSが追加される ・俺の勘違い どれ?
char str[32+1];
等号一つの箇所を、エディタの検索使ってチェックすれば済むだけだと思う
fgets(buf, sizeof(buf), stdin); sscanf(buf, "%d %d", &x, &y); 改行をバッファに残さないためには、 これがスタンダードなのかい?
599 :
デフォルトの名無しさん :2011/05/22(日) 20:46:23.44
>>592 決められるわけないでしょ
両側が変数になっただけで破綻する論理だし
カッコ付けんなボケ って言われるよ。
>>597 バグの原因が等号ひとつのせいとわかっておれば、の話ですが。
症状があって有象無象の原因が考えられる最中に、実際そんなことできます?
>>593 そういいきってしまえば、それでおしまい。
>>592 いまのコンパイラは if / while (int a = func()) {
で警告を出してくれるし、可読性を優先させてもいいんじゃないですか?
>>601 稼働している場合は、アプローチも変わると思うな。
現象や症状から、どこかを特定しながらやるだろうけど。
エディタの検索の話は、製造段階でのセルフチェックだと思う。
これは一度バグ作って痛い思いをすれば、黙ってでもする(ヨネ?)
>>601 Cの流行り始めに口先男の常套句を今時見るとは思わんかった
>>601 は◆QZaw55cn4c臭い文章だな
見てすぐにわかる
条件式中の=は正規表現で抽出してシンタックスハイライトみたいに強調するようにしてる 本当に=を使いたいときには多少邪魔だが、見逃すよりはいい
すんません、教えてください。
入門書読んでソースを実行して確認してるところなんです
環境 XPPro コンパイラ BCC
内容はcsvを読んで二次元配列に格納し、それを画面で確認するというものです。
ソース
http://codepad.org/1MlNzXPB (データファイルの中身は最下行のコメント部分です)
でコンパイル後実行しても表示されないのでprintf入れてみると
dat[0][0] : 85 dat[0][1] : 60 dat[0][2] : 70 dat[0][3] : 82
dat[0][0] : 62 dat[0][1] : 78 dat[0][2] : 95 dat[0][3] : 80
dat[0][0] : 70 dat[0][1] : 95 dat[0][2] : 100 dat[0][3] : 63
dat[0][0] : 75 dat[0][1] : 80 dat[0][2] : 69 dat[0][3] : 92
dat[0][0] : 100 dat[0][1] : 72 dat[0][2] : 90 dat[0][3] : 90
nがインクリメントされてないのは何故なんでしょう?
for (i = 0; i < 0; i++)
609 :
デフォルトの名無しさん :2011/05/22(日) 21:37:22.11
>>606 おまえ alias で sl とか作ってない?
>>607 ×printf(" dat[%d][%d] : %3d",i,j,dat[n][j]);
○printf(" dat[%d][%d] : %3d",n,j,dat[n][j]);
あと最後の for (i = ....) の終了条件が変。 i < n とかでは?
612 :
デフォルトの名無しさん :2011/05/22(日) 22:05:22.24
なんでポインタでローカルのファイルにアクセスできるんだよwwwwww
613 :
607 :2011/05/22(日) 22:24:54.91
>>611 見落としていました。
dat[0][0] : 0 dat[0][1] : 60 dat[0][2] : 70 dat[0][3] : 82
dat[1][0] : 0 dat[1][1] : 78 dat[1][2] : 95 dat[1][3] : 80
dat[2][0] : 0 dat[2][1] : 95 dat[2][2] : 100 dat[2][3] : 63
dat[3][0] : 0 dat[3][1] : 80 dat[3][2] : 69 dat[3][3] : 92
dat[4][0] : 0 dat[4][1] : 72 dat[4][2] : 90 dat[4][3] : 90
85 60 70 82
62 78 95 80
70 95 100 63
75 80 69 92
100 72 90 90
dat[n][0]の表示が?ですが格納と表示そのものは出来たみたいです。
dat[n][0]の表示についてはまた勉強してみます。
ありがとうございました。
>>592 警告レベルを最大にして警告が出ないように書くって基本的なことをする
だけで防げるミスを 1 == a とか変な書き方するのって技巧に走りすぎてる。
>>603 チェックしないで、コンパイルできないようにする
普通ソースレビュー位すると思ってたが、○菱の件で、何も見てない会社もある事を知った。
ガチでコードレビューするとこって今少ないんじゃないのかなぁ。
人命にかかわるものだったら確実にやってるが そうでなきゃ正直やるか微妙
オレのプロジェクトチームは全員コードレビューするよ。 メンバーは全部オレで、レビュワーもオレだけど。
>>614 可読性もよくないし、ご意見には全く同意です。
ただし私は知らないけれど、昔のコンパイラは警告に関しては酷かったみたいですよ。
プロトタイプ宣言もないし、引数チェックもない。
int f(a, b)
int a, b
{
return (0);
lint なんていうものがあるくらいだから。
K&R時代ひっぱりださなくてもいいと思うが。 lintが有効な時代だったころはlintかけて警告全部潰すのが当たり前だったね。 んで、昔のコードをメンテしてたら1 == aなんて懐かしい記述がでてきたという話じゃなくて、 今の時代で、1 == aと書くかどうかなんでしょ。昔話をしたいわけじゃない。 今の時代に、そのような昔のコンパイラを使うことは論外だと思わない?QZさん。
ちなみにQZがansi pedantic Wall Werrorでコンパイルできるコードを書いてることは知ってる。 意図してるかどうかはわからんが、少なくとも最初のアップロードするコードに関してはそうなってる場合が多い。 修正しだすとその辺がぐだぐだになることも多い。
>>623 それにしてはC99でしかコンパイル出来ないソースを上げたりポカをやるけどな
抜けているとしか言いようがない
◆QZaw55cn4cって糞だよなぁ
webプログラム板のPHPスレ住民だけど 俺らは正直ここの連中を見下してますよ
2ちゃんねるはperlだけどな
パフォーマンス出ないから生Cじゃなかったか? < read.cgi の本体
変数名に全角使えるの? 教えて
遅レスだがwhile(1)で盛り上がってたな... それでdo { } while(0)が出なかったのは不思議だ... 便利だぞ! 関数でのタイムアウトエラーからの脱出なんか... breakで出れるんでスッキリする gotoは使いたくないからのう w マクロサンドウィッチ? ああ あれは定番なんで...
ついでに質問なんだが typedef struct _CINHERIT{ COBJ obj; CANCESTOR ancestor; . . } _CINHERIT; なんてOOPホリモーフィズムの定番構図なんだが objやancestorの先頭からの相対アドレスが問題になる処理系ってある? 継承したクラスでobjをアクセスしようとしたら吹っ飛ぶとか.... もちろんobjインスタンスは生成されているとして... あちきは今のところ無いんだが...
>>631 どう見ても入門向けじゃないのでスレ違い。
処理系の有る無しは入門の範囲外だが、 言語仕様についていえば保証されてる
悩む理由がわからない 上級者は大変なんだなぁ
\xE3\x83\xAD\xE3 ↑ この文字列を読みたいのですが何で変換したらよいのでしょうか?
>>630 脱出する手段としては綺麗かもだけど、結局呼び出し元とかに通達しない? <タイムアウトエラー
そうなると エラーコード積んで return でも ということに…
呼び出し前の事前処理・呼び出し後の後始末で
きちんと挟まれてないとまずいケースもあるから 一概に即 return で良いじゃんとは言わないヨ
>>637 おっ 今日は休みなんで... w しかし 暇だなぁ 仕事も薄くなってきた orz 仕事くれ〜!
説明が足らんかった ワルッ のし
関数内でタイムアウトを処理し 戻り値で処理する場合だな これのメリットは...
例えばZigBeeなんかでコマンドのやり取りをする場合に
コマンド関数内でタイムアウトをモニターする現場的な関数の作り方は多い...
エラーはDelphiIO並みにIOResultとして処理する方式として
戻り値にエラーを返すスタイルではdo {} while(0)はスッキリする
俺の場合 ほとんどARMやらAVR32やらマイコンベースなんでちょっとわかりずらいかもな...
fwrite()でのテキストファイルへの追記出力に関して、 ファイルサイズを制限、または行数を制限したいと考えています。 具体的には、超過が確認された場合、古い行(先頭から)を削除していこうというものです。 しかし、ファイルサイズの取得は簡単にできるのですが、超過が確認された際の処理が思い浮かびません。 _chsize()で切り詰めは可能ですが、これでは新しい行が捨てられてしまいます。 新規ファイルに、必要な行のみ書き出すことも考えたのですが、不要行の判定の仕方がこれまた思い浮かびません。 どなたかご教授お願いします。
>>639 複数のファイルに分割してみたらどうかな?
それぞれ分割値の最大を超えたら、次のファイルに書き出すようにして、
合計値が所定の値を超えたら、古いファイルから順に削除、とか?
>>639 古くて新しい問題だな。
一行のサイズを固定にできてリングバッファ状になっていいなら、一定行数に達した後は既存行を上書きする形でできるけどね。
要は、要件定義をしっかり確認するのが先だろうな。
>>622 でも、それをやると
(void)printf("foo");
とかやらないといけなかったんではなかったでしょうか、手元のキーゥイ本だとたしか。
まあ、全面的に同意します。
643 :
デフォルトの名無しさん :2011/05/23(月) 21:46:41.52
lint に振り回されて不本意なコードを書く本末転倒が流行ったのは黒歴史だが まだ目が醒めてない間抜けが後を絶たない
放置してバグを量産するより振り回された方が100倍マシだというだけだ
>>643 まだこういうこと言うやつがいるの?
びっくりだわ・・・
おまえプログラマー辞めろ。ほんと。
itoaの実装ってコレか再帰のタイプしか見付からなかったんだけど、ビット演算とかで高速には出来ないものなの? 俺はビット演算とかよく分からないので教えてください偉い人 int main (int argc, char *argv[]) { int num = 2011; char buf[10]; int x = num, pt; while (x /= 10) pt++; buf[pt+1] = '\0'; do buf[pt--] = num%10 + '0'; while(num /= 10); printf("%s\n", buf); return 0; }
>>623 癖というか、多分、ソースコードとバイナリとができるだけ対応しているのがいい、というブレーキが微妙に働いているのかもしれません。
実際には、 symdeb / gdb を使うまでに追い込まれたことは数えるほどしかないのですが。
それとも頻繁に使って慣れておいたほうがいいものなのでしょうか?お聞かせいただけるとうれしいです。
普通の掛け算割り算で書いとけば最適化でビット演算にしてくれるだろ。
なんぼ賢いコンパイラでも /10 とか *10 は無理じゃね?
定数で書いてあるなら割とやってくれそうな気がしてる(根拠なし)
653 :
648 :2011/05/23(月) 23:58:36.68
>>646 まじめに答えると、
そもそも割り算という演算操作一回で、商と余りとの両方が手に入るはずなのに、
% や / だと、その片一方しか得られないのがもったいない、という感じがします。その辺からアプローチすると、どうなるか‥‥‥。
確かにアセンブラだと両方手に入ってるだけどね… Cだと浮動小数点でその手の標準関数があるだけじゃないかな
655 :
デフォルトの名無しさん :2011/05/24(火) 00:35:18.66
CのコードですよってなっていながらC++での書き方をしているくそサイト滅べ
>>651 一度最適化コンパイルしたアセンブリを読んでみるといいよ
>>656 >>651 じゃないけど、/10 をビット演算に直す最適化コンパイラがあるの?!
それ何てコンパイラ?
なるほど a*10 は a*8+a*2 か a/10はどうやんだ?
みんなアセンブラとかすごいな・・・僕にはちょっと難しいです
定数除算は乗算に置換可能。今時のコンパイラは当たり前のように置換する。 除算の剰余と商の両方を演算に利用しているなら、一回の除算で済ませる最適化も普通に行なわれる。 だから、下手にあれこれ考えずにコンパイラに任せるのが一番。
>>647 わかってたと思うけどトリつけた。
gdbに慣れたほうがいいと思うけど、底辺マらしくprintデバッグですませてる。
gdb使ってもスタックトレース見るのに使うぐらい。
なもんで参考にならないと思うよ。ソースコードとバイナリの対応とかも全然考えてない。
×複雑なコードでもデバッガを使えば追えるよ
○複雑なコードはとっととリファクタリングしちゃえばいいよ
という方針。賛否あると思うけども。
除算が乗算で書けるの知らなかった
665 :
657 :2011/05/24(火) 08:27:17.66
>>663 んー、最適化されるかどうかじゃなくてビット演算に直されるかどうかだから、
>>661 は話が微妙に違うよね
GCC は IMUL してから SAR してるんだけど、これをビット演算に直したと言って良いのかな?
>>661 いや、逆に定数除算をどのように乗算に置き換えるのか検討もつかない。
よろしければポインタをば。
乗算をコンボリューションとみなしてdft/idft する話くらいしか‥‥‥。
ビット演算とは言わないね。そういう意味では>658もビット演算じゃないし。 それに、そもそもビット演算にすれば速くなるというわけでもないから>650は頓珍漢。
>底辺マらしくprintデバッグですませてる。 魔じゃない系はprintfデバッグすら使いこなせません。
a*10=a*8+a*2=(a<<3)+(a<<1) ってビット演算じゃないの?
>>666 マジで知らない?
基本的な考え方は、逆数を掛けるだけ。
面倒だから、16ビット整数を3で割る場合の例を。
numerator / 3
= numerator * (1 / 3)
= numerator * (65536 / 3) // 16ビット整数を仮定しているので65536を掛けても結果は変わらない
= numerator * 21846 / 65536 // 商を繰り上げるのは、65536で割って切り捨てるために必要になるため
>>669 だから、今時のCPUはそんな最適化の必要がない。
実際、x86ならmov eax, [eax + eax * 4]
add eax, eax
のように計算できてしまう。
最早、ビットシフトの出番は殆ど残されていない。
えw こいつ馬鹿なの?
知らなくて悔しかったからビット演算じゃないことや元ネタ云々で悪あがき
なんでそのスレ以前から常識だって考えないんだろう
みんな、誰と戦っているの?
常識という魔女?
えええーえーえー
「知らなかったありがとう」 たった1行だけで済むやり取りなのに、何故無駄に張り合うバカが後を絶たないのか? 知らなかったふりして自分の中で取捨選択するのが一番賢いのに。
ビット演算じゃない演算なんて今のPCでできるの?
今迄のPCはビット演算だけで計算してたのか。
CPU演算回路にNAND回路とNOR回路以外の回路が使われてのるかって話?
686 :
デフォルトの名無しさん :2011/05/24(火) 15:20:12.51
大学の課題で、 砂時計みたいに、三角形が二つくっついてる図形作りたいんだけど どうすればいいですか??(cygwin)
画像を読み込む
GIMPはCソースで出力してくれるよ
>>688 あれはじめてみるとインパクトあるよな
どんな基地外機能だと思ったもんだ
水道局水道使用料・下水道使用料などの払込取扱票に OCR-Bでかかれている数字のチェックディジット(CDは11, 41 )の 計算方法わかるかい。 110123467890200000010000223567011600000 --> CDは11 41000123456789002090153880000000000000000000 --> CDは41
>>691 110123467890200000010000223567011600000のチェックディジットは11
データ部は11を除いた
012346789020000001000022356701160000です
41000123456789002090153880000000000000000000のチェックディジットは41
データ部は41を除いた
000123456789002090153880000000000000000000です
下記質問での、
strchr() の第2引数はなぜ int 型なのでしょうか(2/2) | OKWave
http://okwave.jp/qa/q4151525_2.html 回答No.4にて、
>実引数の型と仮引数の型が矛盾する場合の動作は未定義です
と書いてありますので、char型の実引数をint型の仮引数に渡す場合、厳密には以下のようにキャストが必要ということでしょうか?
char *s = "abcd";
char c = s[1];
strchr(s, (int)c);
同じ理由で、sqrt関数に渡すときもキャストが必要という認識でOKでしょうか?
int n = 10;
sqrt( (dobule)n );
OKじゃない
OKです
>>693 ***プロトタイプ宣言されている***関数を呼び出す限り、キャストは必要ない。暗黙の型変換(あるいはプロモーション)に頼ってよい。
むしろ、情報の一部が失われる暗黙のキャストに対しては、最近のコンパイラは警告を出してくれるのにもかかわらず、
明示的にキャストすることによって、コンパイラの警告機能がキャンセルされてしまう弊害がでる。
繰り返す。キャストはしなくてもいい。問題があればコンパイラが警告する。
ただし、可変長引数のキャストは必要な場合がある。unix なら exec*() の (char *)NULL あたりとか。
>>671 ARMもその今時のCPUの仲間に入れてやってくれよ
Windows8のターゲットにもなったことだしさ
mov r3, r0, asl #3
mov r0, r0, asl #1
add r0, r0, r3
>>697 ビットシフト単体のニモニックじゃないんだから、内部がどうあれx86のleaと同じことじゃん。
>>696 >むしろ、情報の一部が失われる暗黙のキャストに対しては、
「暗黙のキャスト」とは?
>ただし、可変長引数のキャストは必要な場合がある。unix なら exec*() の (char *)NULL あたりとか。
標準関数で問題が出るケースはないと思ってよろし?
700 :
uy :2011/05/24(火) 22:12:46.71
>>696 は?
キャストしろよ
何言ってんだこいつ
暗黙のキャストに任せるって何いってんだこいつwwwwww
C言語だぞ
スクリプト言語じゃねーんだぞ
C++すら触ったことなさそうだな
701 :
デフォルトの名無しさん :2011/05/24(火) 22:12:50.77
なんで構造体の宣言を}の後ろに書くの?
なんで◆QZaw55cn4cがいるの?
民主党ですか?
なんで構造体の宣言を}の後ろに書くの?
>>706 変数宣言は型の後に変数名を書く。
構造体もまた然り。
708 :
デフォルトの名無しさん :2011/05/24(火) 23:55:34.38
流れ切って申し訳ないけど質問です。
http://codepad.org/qeXhAizm の74行目のコメントアウトを外して、
ポインタ配列*gの内容を構造体*amのポインタ配列*genoに代入させるという動作をしたいのですが、
どのようにしてmallocで領域を確保していいのかが分かりません。
create_automaton関数内で領域を確保しなければいけないのは分かっているのですが、
*amに対して領域を確保すればよいのか、*genoに対して確保すればいいのか、
どちらでもなく全く別の領域を確保すればいいのかの見当が立てられません。
どなたかどのようにすれば良いかの指摘や手直しなどをお願いします。
>>708 先ず第一に、混乱が見られるから配列としてアクセスしているところはポインタ逆参照演算子を使うのを止めよう。
つまり、(*(g+i))なんて書かずにg[i]と書いた方が判りやすいだろうと言うこと。
最初からそう書いていたら、scanf()に渡すのも(&(*g)+i)なんておかしなものでなく& g[i]でいいと判るだろう。
次にメモリ確保だが、上のことからwhileループを見るとam.nstateの2倍の領域がam.genoの先に必要だと判る。
これは、am.geno = calloc(sizeof(* am.geno), am.nstate * 2);とすればいいだろう。
何故だか理由は知らんが、一時的にgの先にも同じだけ必要だ。
従って、set_table()の先頭でint ns = am->nstate; int * g = calloc(sizeof(* g), ns * 2);として最後にfree(g);としておく。
実はもう一つ問題があって、main()のamは初期化されていないまま参照されている。
つまり、やりたいことはAutomaton * am = create_automaton();ではないだろうか。
その場合、create_automaton()でreturn & am;としなければならない。
全体的にポインタの取り扱いに慣れていないようだが、そのレベルでオートマトンなんて大丈夫か?
2年生かなー。後期にはコンパイラの授業が出てくるんじゃないかな。 そんぐらいのペースだったような気がする。
>>709 ありがとうございます。
修正してみます。
高専の電気系学科から大学の情報系学科に編入したのですが正直情報系をナメてました。
Cは数年振りの上に基礎しかやってないのでポインタとかも完全に理解しきれていませんでした。
mallocやcallocも大学に来てから自学して使っているので正直分からないことだらけです。
今回のプログラムも大学の課題なのですが、正直できる気がしないんですよね…
>>710 上記の事情で3年生です。
高専って出来る奴が多いのかと思ってた。
aiff または wav で保存された8 or 16bitのプレーンPCMデータを、 C言語の配列形式としてテキスト出力するプログラムを誰か作ってください。 出力例: short pcm[] = { 16, // 16bit 48000, // 48000Hz 1234, // データ個数 12, 13, 20, 45, 56, 78, 78, 78, // 実データ ... };
>誰か作ってください。 宿題スレのほうが
intの最小値の絶対値がどうなるのか気になって 以下のように確かめたところ #include <stdio.h> int main() { int plus_max = 0x7fffffff; int minus_max = -plus_max -1; int x = abs(minus_max); int y = -minus_max; printf("%d,%08x\n",plus_max,plus_max); printf("%d,%08x\n",minus_max,minus_max); printf("%d,%08x\n",x,x); printf("%d,%08x\n",y,y); return 0; } このような結果を得ました 2147483647,7fffffff -2147483648,80000000 -2147483648,80000000 -2147483648,80000000 intの最小値の絶対値を求めるような操作は 対応するintの正の数がないのでしてはいけない プログラムを組むときに例外として認識しておくべき ってことでいいんでしょうか(shortでも同じ)
どうなると思ったの?
limits.hに従わない数をabs()に渡したらdomain_errorを起こしてもおかしくないだろ
>>716 とくにどういう予想をしてたわけでもなく
どうなるのかな?と興味本位で確かめてみました
2147483648が返ってくると期待した場合、バグの原因になるのかなぁ
と、みなさんの意見が聞いてみたくなったので書かせていただきました
>>717 「limits.hに従わない」
という部分がよくわからないです
どういう状態をlimits.hに従わないというんでしょうか
おそらく
LONG_MAX long 型の最大値 (2147483647 以上)
LONG_MIN long 型の最小値 (-2147483647 以下)
の部分だと思うんですが
2147483647 以上か-2147483647 以下だとlimits.hに従わないと言うんでしょうか
ちなみに-2147483647をabsに渡すと2147483647が返ってきました
あと、std::domain_errorは標準C++ライブラリがスローすることは無いと
こちら
http://www.geocities.jp/ky_webid/cpp/library/027.html に書かれていますが
私のプログラムだとstd::domain_errorがスローされるんでしょうか?
int minus_max = -plus_max -1; 2進数符号付き32bitでこの計算が...
>>718 ここCスレですよ。
あと、LONG_MINは-2147483648
absって最上位ビットクリアするだけかと思ってたけどちゃんと見てるんだな。
>2147483648が返ってくると期待した場合 そうなるような計算式考えてみりゃいいじゃん
labs?
>>699 >「暗黙のキャスト」とは?
失礼。暗黙のキャストという言葉はありませんね。暗黙の型変換(ボーランドの説明文ではよく使われていました)ということでお願いします。
>>696 >暗黙の型変換(あるいはプロモーション)
特に情報が失われる暗黙の型変換は、規格での integral/integer promotion (の一部)を指しています。
>>699 >標準関数で問題が出るケースはないと思ってよろし?
「問題が出る」や「標準関数」が何を指すのかよくわかりませんが、少なくとも可変長引数ではない関数で前方参照していなければ「問題ない」でしょう。
>>700 char ch;
ch = getchar();
で嵌ってください。
>>724 標準ライブラリに含まれている関数を、普通は標準関数と呼ぶと思うが。
で、わざわざ標準関数以外の例を出したと言うことは、標準関数では問題がないと思っているのかという質問だろう。
>>725 その例と>700とにどんな関係があるのか詳しく。
>>703 ウケ狙いならば惜しいレベル。
「Java、C#、ひょっとしたらOcamlやScala」は何で書かれているか?
「JavaとかC#とか、ひょっとしたらOcamlやScala」を記述している言語は何で書かれているか?
という質問を想定したボケっぷりを塩味として利かせていただければ、より一層、磨きがかかるところだったんだが。
>>726 後半。
失礼、これでは嵌りませんね。
>>700 char ch;
ch = (char)getchar();
で嵌ってください。
つ[自縄自縛]
◆QZaw55cn4cって糞だよなぁ
>>707 }宣言
じゃなくて
}
宣言
じゃだめのな?
日本語で
どうそ。私は止めませんから。
735 :
デフォルトの名無しさん :2011/05/25(水) 10:47:32.70
>>732 int foo;
でも
int
foo
;
でも構わん。同様に、
struct foo {int foo, bar;} foo;
でも
struct
foo
{
int
foo
,
bar
;
}
foo
;
でも構わん。好きにしろ。
>>735 失せるべきは誰か分かったかな?
コンソールプログラミングしかしないのですが そういう用途でもCを勉強する必要ってありますか?
コンソールプログラムならCだと不都合が?
関数で返す値が2つ以上のときはポインタ使うけど 返す値がひとつの場合でもポインタで変数を変更する意義ってありますか?
743 :
デフォルトの名無しさん :2011/05/25(水) 13:16:16.60
さらしあげ
返す値が一つでも、何がしかの状態を返したければポインタは有効だな。 本当に一種類の値だけしか返さないならポインタを使う意義は薄いが、次のような例はしばしば見かける。 -- void set(int * offset, int * array, int value) { array[*offset++] = value; } -- int offset = 0; int array[10]; set(& offset, array, 1); set(& offset, array, 3); set(& offset, array, 2); -- これを戻り値で実装するとこうなる。 -- int set(int offset, int * array, int value) { array[offset++] = value; return offset; } -- int offset = 0; int array[10]; offset = set(offset, array, 1); offset = set(offset, array, 3); offset = set(offset, array, 2);
>>744 他にset2()なるoffsetを2増やす関数があったりするケースだな。
例えば、プロトコルの実装とか帳票作成とか。
746 :
デフォルトの名無しさん :2011/05/25(水) 13:50:06.94
さらしあげ
>>740 そもそも、どうやったって1つしか返せねーよ。
ブラウザで取得したクッキーをcで書いたプログラムで使いたいのですが どのようにクッキーを読むのでしょうか?
>>742 不完全型使ったり
他の関数と合わせたり
ポインタにわざわざ*つけさせるのは何で?
>>752 宣言時なら、ポインタ形であることを示すため。
逆参照時なら、逆参照を行なうことを示すため。
いずれの場合も、つけないと区別できないので「わざわざ」ではあっても必要。
>>757 あぁなんだ、記号が気に入らないって話か? だったら片っ端からtypedefしろよ。
typedef int * intPtr;
typedef int ** intPtrPtr;
typedef int *** intPtrPtrPtr;
and so on.
そうだね。
マルチスレッドの使い方教えろ
実際*はどう扱われるの? 規格やアセンブリ読んだことあるやつ教えてー
ほっほっ
教えて頂けますか? for文を使って 1〜100まで足した合計 1〜100までの偶数を足した合計 1〜100までの奇数を足した合計 をfor文ひとつを使ってやれる方法を教えて頂けますか? 宜しくお願いします。
ん〜、変数3つ用意すりゃいいんじゃない?
そもそもfor要らないじゃん
int a,b,c,d; b=c=d=0; for(a=1;a<=100;++a){ b+=a; c+=a*(a%2==0); d+=a*(a%2==1); } こんな感じじゃね
>>766 for文を使って教えろといわれても困るな・・・
素直にif使えよ
int a,b,c,d; b=c=d=0; for(a=1;a<=100;++a){ b+=a; if(a&1)d+=a;else c+=a; } こうか
>>766 #include <stdio.h>
int sum();
int main(){
int i;
for(i=0;i<3;i++){
printf("%d\n",sum(i));
}
return 0;
}
int sum(int n){
if(n==0)
return 5050;
if(n==1)
return 2550;
if(n==2)
return 2500;
}
皆さん、早い返答ありがとうございました。 まだC言語に触れたばかりなのでこのような優しい方が多い掲示板があることに感謝します。 皆さん、本当にありがとうございました。
お前らべた褒めされてるぞw
778 :
デフォルトの名無しさん :2011/05/25(水) 17:53:32.25
さらしあげ
>>730 いいえ、キャストをつけなければ、最近の馬鹿じゃないコンパイラならば警告を出してくれます。
逆に、ご丁寧にキャストをつけると、本来出るべき警告まで抑制されてしまいます。
無論、馬鹿なコンパイラのことは知りませんが。
>>726 前半。
>標準関数では問題がないと思っているのか
そう思っていましたが、キャストをつけなければいけない場合をひとつ思いつきました。
qsort() や bsearch() のコールバック関数を指定する場合は、
int cmp(struct foo *, struct foo *);
qsort(base, n, size, (int (*)(void *, void *))cmp);
という風にキャストをつけなければ警告が出てしまうコンパイラもありましたね。
キャストの有無にかかわらず、生成されるコードに変化はありませんけれども。
>>779 ああ 警告出るから、コードを見直すチャンスがある と。
警告が出た後、
改めて 警告の解決に即キャストを使う という発想をする奴には
本質ではないような気がするがね
>>781 そういう発想の人を対象とした話題だったの?
>>784 printf() 系は可変長引数の関数ですが、特にキャストを必要としないでしょう。キャストがなくても動く仕様だと考えています。
最近のコンパイラはそれなりに賢くて、printf() の第一引数に対応していない可変長引数に対しては警告を出してくれるようです。
>>780 キャストをつけなれば警告が出るような関数を指定すること自体がだめ。
>780 それはcmp関数の定義がまずい。 そこは int cmp(void *a, void *b) { struct *pA = a; struct *pB = b; /* 以降pA, pBを使って比較関数を書く */ } とすべき。
インターネットでつながった他のコンピューターのファイルを読み書きすることはC言語で加能ですか? 可能ならソース付きで解説しろ
vimのnetrwあたりのソース読めばいいと思うよ
DXライブラリというゲームに関する無料のAPIを使ってC言語勉強してるんですが こんな関数がありますfile_lead_eof(ファイルハンドル) 関数の定義の概略が[fileread_open関数で開いたファイルのファイルポインタが終端に達しているか どうか調べたいときに使う] ↑どういう関数なのか用途がいまいちわかりません わかりやすく教えてください 自分はfopen,fcloseくらいは知ってます
>>790 終端に達したかどうかを調べたい時に使うんだと思うが。
fgetsなり使ったことあればわかりそうなもので。
だれかインターネット用のfopenとfreadとfwrite作れ
>>793 つ バークレーソケット
つ portal filesystem の tcp ドメイン(on BSD4.4)
>>794 ググったら、クライアント用プログラムと、サーバー用プログラムを作らないといけないらしいことはわかった。
でも、サンプルコードが長すぎて意味不明だった。
クライアントのパソコンがhello worldって送ったら、サーバーのパソコンがそれ表示するプログラムを、
それぞれ10行以内で書くことは可能ですか?可能なら書け。
>>785 printf("%d:%d\n", sizeof(int), -1);ではまれ。
>>796 それ、ちゃんと警告出るぜ
printf("%zu:%d\n", sizeof(int), -1);
C99さいこー
>>796 手元の環境(gcc 4.3.4)では、
printf("%ld\n", sizeof(long));
とすると、
qsort.01.c:37: error: format ‘%ld’ expects type ‘long int’, but argument 2 has type ‘unsigned int’
と警告がでましたよ。
sizeof(size_t) ≠ sizeof(T)
という T の書式指定にしてしまってもちゃんと警告がでますので、嵌る要素はありませんが?
%zu が使えないので環境によって書式指定を書き直さなければならない不都合はありますけども。
const char * buf = "%d"; printf(buf, sizeof(int));
いや、もともとはキャストの話だろ? size_t はキャストなんてせずに"%zu"使えよ
>>795 printf とかで充分だよ。
あとは標準入出力を繋ぐだけ。
そこは OS の仕事な。
802 :
デフォルトの名無しさん :2011/05/26(木) 12:39:03.53
printfでコンソールに出力した文字列を取得するにはどうしたらいいですか?
OSが提供する機能で (おおよそ 子プロセス+パイプ かな?)
>>802 あなたのお使いのコンソールの取扱説明書に当たってください。
GUI環境なら、大抵の場合コピーできることかと思われます。
もし仮に、「過去に出力した」ではなく「これから出力するだろう」文字列ということでしたら、
お使いのOSなどのリダイレクト機能についてお調べください。
>>804 プログラム内で出力したのをそのプログラム内で取得したいのですが
>>805 出力したものは既にプログラムの中にはありませんから、プログラムだけでどうこうできるものではありません。
>806のように、事前に自前で確保しておく必要があります。
できるぞ低能共
俺は高脳
初心的な質問ですがよろしいでしょうか? 作成したスレッドは、プロセスが終了すると処理はそこまでなのでしょうか? それともそのスレッドが終了するまで処理されるのでしょうか? また、前者の場合だったとして DLLでスレッドを作成した場合DLLの処理が終了が終了した時点なのでしょうか? それともプロセスが終了した時点なのでしょうか?
プロセスがそれも決める。
なるほど それを設定する方法やそれを取得する方法を宜しければおしえていただけないでしょうか? WINAPIでやっているのですが、此処まで来るとスレチになるのですかね
ちょっと探してきます。 ありがとうございます。
うん。使ってるスレッドライブラリのリファレンスの同期処理とか見ると書いてると思う
#include <stdio.h> #include <pthread.h> double a = 0; void* f(void* _) { int i = 1000*1000; while(i-->0) { a = a + 1; } } main() { pthread_t f0, f1; pthread_create(&f0, NULL, f, NULL); pthread_create(&f1, NULL, f, NULL); pthread_join(f0, NULL); pthread_join(f1, NULL); printf("%f\n", a / (1000 * 1000)); }
818 :
817 :2011/05/26(木) 17:43:45.31
main(){ f(NULL); f(NULL); printf("%f\n", a / (1000*1000)); } なら実行結果が2になりますが 817のように複数スレッドでf()を並列実行した場合、実行結果が 2 にならずに、1.2345 のようになります。 817のmain()を書き換えずに、実行結果が2となるように f() と a を書き換えることは可能か? 可能なら書け。
>>818 double a = 2;
void* f(void* _)
{
}
820 :
817 :2011/05/26(木) 18:21:19.11
@@ -2,12 +2,15 @@ #include <pthread.h> double a = 0; +pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; void* f(void* _) { int i = 1000*1000; while(i-->0) { + pthread_mutex_lock(&mutex); a = a + 1; + pthread_mutex_unlock(&mutex); } } これで2になるのだが、もっと自力でなんとかする『メカニズム』自体を自力で実装することで実現したい。 メカニズムを発案したまえ。 (ググって出てきたソースをコピペした的な優等生回答は0点とする。独創的なものほど高得点を与えゆ。)
この口調、他のスレでも見たけど気持ち悪い。
確かにどうしようも無い気持ち悪さを感じる。
>これで2になるのだが、もっと自力でなんとかする『メカニズム』自体を自力で実装することで実現したい。 自力なんだから自分でなんとかしろよw
バカなのかもしくは機械翻訳なのか
826 :
817 :2011/05/26(木) 21:57:39.89
なんだよおまえらprintf意外の話題にはめっきり弱いな…orz
高得点もらうとどうなるの?
リスト構造のノードの探索で最初のポインタから探索していくとやたら時間がかかるのですがそういう 場合はハッシュでいいのでしょうか? ハッシュを使わないならば関数を配列っぽく利用してリスト構造の位置を 保存っていう方法は危険でしょうか?
>>828 データ構造とアルゴリズム
どんな構造にも得意不得意がある
重要な部分が得意になるように考える
なんとなくハッシュ+リストでいいかもねと思うが詳細不明なので何とも
後半はよく分からん
まあ詳細かかれても答えられんけどね
>>828 リストにしなければならないかどうかを検討してみるとか。
定数はdefineを使う #define a 123456 定数の集合である配列はどうできるでしょうか? int a[ ] = {1,2,3,4,5,6,}; ↑これでは変数になってしまう
const int a[] = {1,2,3};
なあ DLLって読み込むとDllMainというのがよばれるじゃん。 メインの処理ってそこでDllMainが終わるまでとまるん? そんともdllよんだらそのままスレッドみたくべつ処理になるのん?
英字を入力した際に、小文字なら大文字、大文字なら小文字に変換するプログラムを教えて頂けますか? 例:AbCd→aBcD 宜しくお願いします。
>>835 isupper なら tolower
islower なら toupper
^32
>>836 連続して10文字以上を変換する方法がわかりません。
一文字ならできるんですが
一文字ずつ変換しろよ
>>834 スレ違いだし やってみりゃいいじゃん。
ASCII 依存だから失格。
c言語のデバッガを紹介してください。 サクラエディタで書いて、 コマンドプロンプトでbcc32としています。 なるべくシンプルがいいです。
変数の値が知りたいところにprintf文を入れる
変なことが起きそうな場所でassertする
アセンブリを読む
848 :
デフォルトの名無しさん :2011/05/27(金) 19:31:33.10
英文の中に含まれている異なった単語の数を求めよ。
今自分は単語の数を求めるところまで出来ましたが異なった単語を分けるのに詰まっています。
単語を保存、登録し、重複した単語を省いていこうとしてますが上手くいきません
助言を頂けないでしょうか?C言語です
↓今のプログラムです↓
http://pastebin.com/8RvS49Bt
nwrd++;す
C++で書かれた静的ライブラリをC言語で組み込みたいんですが,そうゆうことは可能なのでしょうか? MacOSXでgccでコンパイルしてまいます.
ハッシュ使えば楽だよね。
>>848 今のプログラムを見ていないけど、重複していれば登録しないようにすればいいと思うよ
>>850 C++のコードを変更できるならextern C、できないならマングリングされた名前で呼ぶ
C言語で関数内関数なんて許されてるんだなしらんかった しかもスコープも関数内っぽくて外側のローカル変数呼べるとは なんか慣れないものを見ると気持ち悪い
double a = 0; static int lock = 0; static void __lock(void) { while(__sync_val_compare_and_swap(&lock, 0, 1) != 0) { } } static void __unlock(void) { __sync_val_compare_and_swap(&lock, 1, 0); } void* f(void* id) { int i = 1000 * 1000; while(i-->0) { __lock(); a++; __unlock(); } }
856 :
855 :2011/05/27(金) 20:51:53.03
gcc方言を使わずに、cの四則演算だけで同様のspin lockを実装しようと思ったが、どうしても上手くいかない。 c++0xなら言語仕様としてアトミック操作がサポートされる予定らしいが、cでもサポートされてほしいと思った。 static int lock = 0; static void __lock(void) { A: if(lock == 0) { lock++; if(lock == 1) { return; } else { lock = 0; } } goto A; } static void __unlock(void) { lock = 0; }
改良型逐次探索法を用いて、整数が昇順にソートされているファイルから、ある整数を検索するときの 比較回数を調べたいのですが 以下のものだと比較回数が僅かに少なく、データファイル値域外の判定をしなかった またはデータファイル値域外判定のときに比較回数を数えなかったからだといわれました。 どこをどうすればいいの?
>>857 int search_seqr(int key, int size, int *array){ int i;
count = 0; //比較回数
if(array[size - 1] < key) //末尾要素より大きい
++count;
for(i = 0; i < size; i++){ //終了条件
++count; //比較回数カウント
if(key == array[i]) //探索値が見つかった
return count; //比較回数を返す
if(key < array[i]) //配列中に一致する要素がない
return count;
}
return count;
>>848 一部コンパイラ(gccのみ?)しかコンパイルできないので関数内に関数を定義しないほうがよい
方針は言ってるとおりでいいと思うし、Entryの実装がおかしい以外は大体いいかな?
おかしい点は、文字列とポインタ関連
・63行目if条件がいらない
・68行目では何がしたいのか?intに"\0"を入れるのは間違っている
こういう宿題的なプログラムを作るのが久しぶりで楽しかった
http://pastebin.com/8pBgue5i
関数内に関数はクロージャだっけ? Pascalから見掛けるようになったが C++は関数内でクラスは定義出来るのでそれで代用してるけど あまり意味ない
860のコードかいてて分からなかったんだが char *mystrdup(const char *src) みたいなのにcharの配列を渡しても警告は出ないが、 int exist(const char *list[], int list_num, const char *word) としたときlistにchar*の配列を渡すとincompatible pointer typeって警告が出る listはそれ自身もそのポインタの先も変更する気がない場合 引数の方は本来どう定義するべきもの?
変換ミス ×引数の方は本来どう定義するべきもの? ○引数の型は本来どう定義するべきもの?
>>859 ググったけど英語ページしかでてこない読めないので日本語でだれかc1xの解説よろ
866 :
844 :2011/05/27(金) 23:23:34.40
>>861 関数内関数がクロージャとは限らんだろう
>>867 限らないというか、pascalのやC++の関数の中のクラス定義は
クロージャとだいぶ違うよね。
>>862 typedef const char (*MYARR)[];
void func(MYARR list){}
void main(void){
char *hoge[1];
func((MYARR)hoge);
}
呼ぶ時にキャストしないといけないのがなんとも。
>>853 ありがとうございます
現在、chipmunkとbox2Dのどちらかを使用してゲームをつくろうとしていました。いろいろ試行錯誤してみます。
>>844 まだ Borland が健在だった時期に
BCC 5.5 と一緒に無償配布されてた
Turbo Debuger ってもう配布終了したの?
872 :
デフォルトの名無しさん :2011/05/28(土) 07:04:35.46
すみません、質問させてください。 #include<stdio.h> int main(void) { int i,n; n=52; i=1; while(i++ < 52 ) { if(n%i == 0) { printf(" %d は%dで割り切れる.\n",n,i); } } return 0; } ↑の実行結果で「51は1で割り切れる」が抜けて画面に出力されます。なぜでしょうか? ほんと、こんな質問してすみません・・
while(i < 52 ) { if(n%i == 0) { printf(" %d は%dで割り切れる.\n",n,i); } i++; } ループの最初でiが2になってるから
874 :
デフォルトの名無しさん :2011/05/28(土) 07:52:48.63
>>873 わかりました、ありがとうございます。
while文の条件にインクリメント演算子を使って上記のソースの実行結果と同じにするにはどうすればよいでしょうか?
>>874 do {
if(n%i == 0) {
printf(" %d は%dで割り切れる.\n",n,i);
}
} while(i++ < 52 );
か
i = 0;
のどちらか
つーか、forでできることをwhileでするな。 do whileが妥当なときにwhileにするな。
そんなこといったらwhile使えないじゃないか
forとかwhileを使うパターンってもう半ばイディオムとして覚えてる感じだなあ
>>874 > while文の条件にインクリメント演算子を使って上記のソースの実行結果と同じにするにはどうすればよいでしょうか?
評価順とかわからない(上のプログラムの動作が予想できない)なら、インクリメントとか
whileの条件式から外に出した方がいいでしょ。
どうでもいい工夫のための質問するより、わかりやすいプログラム書きなよ。
874です。解決しました。皆さんありがとうございました。 大学の宿題でwhileの条件式にインクリメント演算子を使って書き直せとあったもので…
21世紀の大学生ってこんなレベルだったの?
俺が大学生の頃はスクラッチでLISPインタプリタ書いてた
プログラミングに興味があるならもっと早くやってるだろうしな
そもそもプログラミングの宿題をネットで聞いちゃう人はなぜ情報系を学んでいるのか聞きたい
聞くなとは言わんが、単語を一つ二つググればわかるような事がたまに質問されてたりするのは・・・
プログラムの授業が情報系とは限らない 文系がパンキョーでとってるのかもしれないし
就職はコンピュータ関係じゃないし、単位取れればそれでいいって感じなんだろうな。
pthread_cancel()に相当する処理をglibで書く場合おまえらどうしてる?
でもこのWhile文の質問はさすがにひどすぎねえ?
俺バカだからたまに同じようなミスする。
俺は情報系だが、コンピュータ関連の仕事につくよ、単位はギリギリだが。 ただ単位はそう簡単に取れるもんじゃない。パソコン幼少時からいじってきた 貴様らと違って大学入ってからコンピュータいじる奴もいるんだよ。 特に大学1年の間はなれない事が多く掲示板や参考書に頼る事も多い。
講義だけで理解できないなら、先はないな
893 :
891 :2011/05/28(土) 21:54:39.88
>>892 黙ってろよムカツクな。
貴様だって最初は理解出来ない事も多かったんだろうが。
随分上から目線のゆとりだなw
プログラム関連は仕事になるとつまらなすぎてワロえない なんだよ、ソースを1行変えたからテスト検証テスト検証・・・ コンパイラが変わったからテスト検証テスト検証・・・
896 :
デフォルトの名無しさん :2011/05/28(土) 22:35:21.12
講義だけで理解できないなら、先はないな
897 :
891 :2011/05/28(土) 22:39:35.68
>>896 黙れつってんだろ。
プログラミング何て単純作業だろうが。
馬鹿でも時間かけて凝ればたまにいいの作るし。
お前はそんなに偉いんか?
>>895 そりゃその1行の変更やコンパイラの変更で痛い目にあってるからしょうがない。
900 :
891 :2011/05/28(土) 22:47:36.61
>>899 クリエイティブな仕事は単純作業じゃない。
スポーツ選手、漫画家などなど。
902 :
891 :2011/05/28(土) 22:54:57.92
また激しくイタいのがきたな。
正規表現ってなんだよ どうやって使えばいいんだよコノヤローオメー
>>900 > スポーツ選手、漫画家などなど。
ひたすらバット振り続けるとか、スクリーントーンを張り続けるとか...
単純作業の連続だぞ。
娯楽産業の担い手に夢を見るのは若気の至りだ。
>>905 振り方一つだって、色んな工夫してるぞ。昨日と同じなんてしていない。
スクリーントーンを張るのは、普通アシスタントだろう。
そういうのを自分でやってるなら、まだ売れてない漫画家。
そういうのに時間をとられてたら、クリエイティブな仕事はできない。
908 :
891 :2011/05/28(土) 23:25:08.89
>>905 黙ってろ。
プログラミングは単純作業どころか適当に作ってもいいものができる。
>>905 ストーリーを抜いて画だけで考えると
単純作業と思えるほど自然に画を画けないと
締め切りに間に合わないだろうな。
逆に考えるんだ 宇宙そのものがそもそも単純作業の集合でできていると
>>908 じゃあ宿題も適当に作ってできたいいものを提出してればいいじゃん
なにもこんなところで要らない知識を得る必要もない
>>900 単純作業じゃない仕事をクリエイティブな仕事って言うんだよ
何を言ってるんだ
クリエイティブな仕事っていうのは業種にかかわらず仕事の仕方しだいだよ
>>907 スクリーントーンを貼らない漫画家はどうですか
てか、スポーツ選手がクリエイティブな仕事であるっていうのは初めて聞いたかも知れん。
単純作業じゃないことは確かだけど、クリエイティブ?
914 :
891 :2011/05/28(土) 23:37:32.53
>>910 ゆとりは寝ろ。
>>912 プログラミングの場合はなぁ、むりやり頭ひねって、こねくり回して
生み出したぎこちないアイデアでもマシンパワーで何とでもなるんだよ。
>>907 >振り方一つだって、色んな工夫してるぞ。昨日と同じなんてしていない。
ん?
プログラマだって工夫はしてるだろ。
してない?
だから君は単純作業しか「させてもらえない」んだろ。(w
916 :
891 :2011/05/28(土) 23:40:57.83
客観的な事実として スポーツ選手や漫画家のほうが、プログラマーより数少ないだろw どっちのほうが簡単な職業かは口に出さずとも明白。
>>916 競技人口比べたら圧倒的にスポーツ選手のほうが多いぞ
簡単なことならこんなところで油売ってないではやく宿題終わらせて寝ろよ
919 :
デフォルトの名無しさん :2011/05/28(土) 23:44:23.72
>>917 競技人口多くても、少数しかなれないのがスポーツ選手だよ。
921 :
891 :2011/05/28(土) 23:47:43.83
>>920 だろ?
趣味が高じれば誰でもなれるプログラマーや、試行錯誤する体力されあれば
誰でもなれるエンジニアとは訳が違う。
情報メディア白書2009によると漫画家の数は2007年時点で5063人だそうだ。 君たちは一年間に何本漫画を読んだんだ?
右脳を使う仕事ほどクリエィティブ。理系の仕事はどうしても左脳になりがち。
>>921 誰にでもできるはずの作業を質問するなよ
>>921 お前が何が気に食わないか知らないけど
プログラマー、エンジニアだけに限らずほぼ全職業そうなんじゃね
>>921 職業として食っていけるかどうかは
どれだけ需要があるかが関係するだけのこと
プログラマはそれだけ需要があるってだけ
プロスポーツ選手はそんなに人数いらないってだけ
927 :
デフォルトの名無しさん :2011/05/28(土) 23:57:46.47
偉い人間は誰にでもできる作業を下の人間にやらせるだろ。 完全論破終了。
偉いんじゃなくて雇う金があるからだよ。 じゃあその金をどこから持ってくるんだって話。
929 :
デフォルトの名無しさん :2011/05/29(日) 00:00:03.17
>>926 その考えていけば文系の仕事に携わってる人間はは理系の仕事のそれより
多いよな。
> 貴様らと違って大学入ってからコンピュータいじる奴もいるんだよ。 > 特に大学1年の間はなれない事が多く掲示板や参考書に頼る事も多い。 これについてだけど、大学入ってからコンピュータいじったし インターネットは存在していたけど、頼るような掲示板は知らなかったし、 むしろインターネットに不慣れだった、そんな俺でも単位取れたよ。 自分で書いてるように参考書に頼ったらどう?
単純作業の組み合わせだから、奥が深いんだよ
公務員だと偉くなればなるほど仕事きつくなるって 防大出の友達言ってた
単位取りはやり方次第でどうにでもなるでしょ。 身に付いてるかどうかは別のような
891ではないが。
>>930 何言いたいの?
単位取れるか取れないかは人それぞれだし。
>>928 経営者が一番偉いんじゃないか?
>>929 どういうこと?
文系のほうが需要が多いってこと?そうなの?
おれはスポーツで稼いでる人はプロスポーツ選手って言うけど、 プログラマはそれで生活してるってだけでプロって言うのは 抵抗あるんで職業プログラマって言ってる。 日本の職業プログラマ60万人のうち、6,7割は趣味プログラマーに 負けてるレベルだしな。
偉いと優秀は比例しないケースも多いからな えーとここなんのスレだったけ?
スレタイには C言語なら俺に聞け と書いてあるっぽい
だから偉いとか偉くないとかそういう子供じみた考えは捨てろ。
人あまり状態、でもモノによってやれる人がいないってのが現実では? マ版ネタだね。
さすがに プログラマー>>趣味プログラマーだと思うぞ。 実践で役に立つものを作ってこそ有能なんだよ。 スポーツ選手に絶対的価値を見出してる俺でもプロフェッショナルという 事は実践、つまり制限された状況で発揮する能力だと思うから。
891がすでに消え去った中・・・ 一体みんな誰と戦っているんだ・・・
職業プログラマー60万人もいるのかww システムエンジニアは別だろw? 情報系の学部出たら誰でもなれるじゃねーかwww
>> プログラマー>>趣味プログラマーだと思うぞ。 使えない人の多さですねわかります
ヘッダファイルからヘッダファイルをインクルードするのってよくないことなんでしょうか? ソースとしては小さいモジュールに分かれていてヘッダファイルが複数あったとして、 ひとつのヘッダファイルを読めば1機能(複数モジュール使用)が使えるようになるってふうでもいいのでしょうか?
趣味っていう時点でプロフェッショナル性0だろwww 所詮、ちょっと器用なメカ好きお兄ちゃんみたいな体だろwww
ネットでよく「新人はなにも知らないやつがいい。 独学でやってるやつは変なクセがついててダメだ」みたいな ことを言ってるやつがいるけど、ああいうのは趣味の学生に 負けてるんだろうな。
>>946 lhaの吉崎さんは全然違う職を持ってる趣味プログラマーだったような
選択肢が多いプログラミングの分野何て趣味で何とかなる世界。 たいていの人間はプログラミングになんて興味ないから。
趣味とか関係なくて、できる奴はできる。 職業でも、なんとなくノルマこなしてるだけって人もいるし
俺はプログラミング15年やっててもすごく楽しいけどなぁ 自分で考えたものが動くって 男の子のロマンだし。 ここのみんなは楽しんでないんだね。
いや、苦しでるのを見たい人がいるんですよ、上のほう
>>951 あー、確かに
自分で設計した物が形になっていくのは楽しいな
いくら高速のアルゴリズムを考えても、光を超えるスピードのアルゴリズムは 不可能、所詮パズル遊びなのがプログラミングの分野。
最終的には1と0の組み合わせで動いてるんだし、CPUには単純作業
アマチュアは甘え
>>950 >職業でも、なんとなくノルマこなしてるだけって人もいるし
多くの職業プログラマに求められているのは、
言われたとおりに、余計なものがないコードを書くこと。
早過ぎもせず、送れもせず、予定通りに要求仕様を消化してくれること。
変なクセというか無意味な技巧に走るんだな。 変数名を漫画のキャラクター名にしたりといった遊び心も忘れずに そういうのが工業製品としてはマイナス。 たとえば仕事で急いでいるときにタクシー呼んだら運転手の好みのキャラの痛車だったりとか困るだろ?
業務で動かすコードは普通に書いてても、 支援ツールみたいに自由にかけるものだと、すごいコード書く人、いるよね。 良いか悪いかは別にして、仕事ってそういうものだと思った。
>>947 独学でツールを作って公開(できればソースも)している奴は多分文句なしでしょうね。
独学でなんかしてて人様に見せたこともないのに
つらつらと語りだすのは変な癖というか人間自体が変です。
まあ大抵の新人はオマエ舐めてるだろっていうレベルです。
>>956 確かに納期がひっつくと死ぬほど苦しいですね。プロって大変ですね。
で、マ板でやるべき話はそろそろ終わった?
>>945 > ひとつのヘッダファイルを読めば1機能(複数モジュール使用)が使えるよう
> になるってふうでもいいのでしょうか?
その考えは正しいと思うし、普通にやられてる。
処理系が提供しているヘッダーファイル見てみればいい。
あと、事前に "インクルードガード" でググってみておいたほうがいい。
データを入力して四次の行列式を計算させるプログラムを作りたいんですが、どなたか教えてもらえませんか? どっかのってるサイトとかないですか?
数学の参考書でも見ればいいんじゃないでしょうか
966 :
デフォルトの名無しさん :2011/05/29(日) 21:09:45.67
設計と実装の違いがわかりません。 プログラム作成
967 :
デフォルトの名無しさん :2011/05/29(日) 21:11:46.22
実装はソースコードについての説明ですよね? 設計は何でしょう?プログラムのイメージについて書くのですか? #include<stdio.h> int main(void) { int a,b; a=1; b=1; printf("a+b=\n"); printf("%d\n",a+b); } だと設計と実装はどう記述されるんでしょうか?
フローチャートとかじゃない?
建築なら、設計は図面、実装に当たるのは実際に建築物を建てるで分かりやすいんだが プログラムの場合設計書を見ながら実装を書くという概念が全く持って理解できません。 教えてください・・・
>>967 のプログラムにデータフローを書くとか指南の技ですよね。
どんな屁理屈でもってそんな大層な事をやる必要があるんでしょう。
昔はハードウェアが高価で動作速度も遅かったから 今みたいにデバッガで動かしながら開発するのは効率が悪かった そのころの開発スタイルに慣れてるやつが設計と開発を分けて非効率的なやり方を おしつけてるだけだよ。いきなりコードを書くのが正しい
設計とは何なのでしょうか?分かりません。
そんな根源的な質問されても困るよな。
わからない人のためのものだからね。わからなくても大丈夫
確かに図面の設計書って言われても意味わからんからな。
コードに対応するレベルの設計はいらないよな。 上のレイヤーの設計は必要だけど。
コード1行を日本語1行にしたような設計書は確かにあまり意味無いと思う
だから
>>967 のような一言ですべてを表せるプログラムに設計はいらない
たとえばVisualStudioであるような巨大プログラムでは、機能(関数)ごとに実装することが必要になり、 「機能ごとに」というのをどういう風に区切るか、どういう階層になるのか、などの考え方をまとめる必要がある こういうのも設計で、これは確実に必要
て言うか、実装見せられて「設計」はどうなってるって聞かれても困るわな。
>>967 そのソースを、丸と線と矢印と名前だけで、概念を簡単な図にしてみろ。
極論言うと、それが設計だよ。
内部(計算)
1を記憶 1→□
1を記憶 1→△
する処理@
□+△を計算する処理A
@→A
外部(出力)
??????????B←/*1+1の結果2を表示する*/
>>982 こんな感じですか?
あぁだめだくそ、設計が全然わからん。 図で書く概念の中に実装が混じる。
>>983 そんな詳細に書かないでいい。もっと漠然としてていい。
○
|ーーー>画面だす
○
こんなんで十分。
なにそのちんこ
ちんこ画伯
お前らまとめてマ板行けよ うっとおしいから次スレには来んな
>>989 ○
|ーーー> 〜○ [ ]
○
正しくはこうだ
992 :
デフォルトの名無しさん :2011/05/30(月) 01:49:24.47
すいません scanfによって整数値を入力させ、1からその値までの間にある全ての素数を順に列挙するプログラムをつくりなさい。 これのコードを、わかりません。 教えてください
>>992 あなたの日本語がわかりません。取り敢えず宿題スレは如何でしょう。
>>992 Wikipediaの素数判定の項目見ると
試し割りのだけどCのコードが載ってるよ
うめ
うめ
次スレ立てます
どうも∩ありがとう。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。