C言語なら俺に聞け(入門編)Part 84

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
C言語の*入門者*向け解説スレッドです。

★前スレ
C言語なら俺に聞け(入門編)Part 83
http://hibari.2ch.net/test/read.cgi/tech/1304304298/
★過去スレ
http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
★教えて欲しいのではなく宿題を丸投げしたいだけなら
  ↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 147代目
http://hibari.2ch.net/test/read.cgi/tech/1301553333/
★C++言語については避けてください。C++対応明記スレへどうぞ
★分からない事をなるべく詳しく書いて下さい。
★ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
★ぬるぽ。

長くなりそうなコードはcodepadに貼り付けてもいいでしょう
http://codepad.org/
2デフォルトの名無しさん:2011/05/13(金) 01:04:10.30
スレ立て規制厳しすぎ
3デフォルトの名無しさん:2011/05/13(金) 01:42:29.63
と、あるマルチスレッドプログラムなんだが、
ロック処理もない。スレッドアンセーフティな関数を狙ったように使っている。スレッド間の通信で遠慮なくポインタでメモリコピーしている。

どうしたらよい?
4デフォルトの名無しさん:2011/05/13(金) 01:44:09.83
>>3
捨てる
5 ◆/91kCCQXBo :2011/05/13(金) 02:04:12.43
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
6デフォルトの名無しさん:2011/05/13(金) 02:14:23.75
◆/91kCCQXBoってどのスレで見ても意味不明な書き込みしてるけど共有トリップかなにか?
7デフォルトの名無しさん:2011/05/13(金) 02:37:12.92
http://hibari.2ch.net/test/read.cgi/tech/1304304298/991
> 親切なコンパイラだとちゃんと警告だしてくれるよ
それが>>990に対してのレスなら、いらぬお節介にもほどがあるねぇ。
pragmaあたりでその警告を抑制することはできるのかい?

http://hibari.2ch.net/test/read.cgi/tech/1304304298/992
> >>978
> > 配列のインデックスとかループの回数とかイチイチ 64bit になってたら勿体ないっしょ。
>
> ループカウンタなんて大抵レジスタだし、メモリにとっても高が4バイト増えるだけだろ。
> 勿体ないって、今時どんだけ節約志向なんだよ。(w

いまどきレジスタは節約しなくていいものになってるのか
8デフォルトの名無しさん:2011/05/13(金) 06:21:06.73
>>7
>いまどきレジスタは節約しなくていいものになってるのか
32bit コードにすればレジスタの節約になるとでも?
9デフォルトの名無しさん:2011/05/13(金) 07:08:40.05
64ビットレジスタの下半分だけを使っても
残りの上半分を別のことに使えるわけじゃないしな
10デフォルトの名無しさん:2011/05/13(金) 07:38:35.01
それに AMD64/Intel64 ならばレジスタが増えたし。
11デフォルトの名無しさん:2011/05/13(金) 07:42:15.18
12デフォルトの名無しさん:2011/05/13(金) 08:22:54.99
AH、ALみたいに上位と下位を別々にアクセスできれば
13デフォルトの名無しさん:2011/05/13(金) 16:01:40.01
>>8
しねたこ
14デフォルトの名無しさん:2011/05/13(金) 16:21:57.18
CDとかDVDじゃなくて
プログラム自体にコピーガードってつけれるの?
ってかコピーガードってどーゆー仕組みよ?
15デフォルトの名無しさん:2011/05/13(金) 16:36:11.83
16デフォルトの名無しさん:2011/05/13(金) 17:31:02.13
小数点以下50桁程度の計算をC言語で行いたいのですが,
visual studio2010 でコンパイル可能な
お勧めの多倍長演算の方法を教えていただけないでしょうか?
17デフォルトの名無しさん:2011/05/13(金) 17:40:01.61
多倍長整数2つ使って分数計算するっていうのはどう
18デフォルトの名無しさん:2011/05/13(金) 20:14:06.46
ポインタで変数名に*を付けないといけない理由がわからない
19デフォルトの名無しさん:2011/05/13(金) 20:21:55.21
*p が気に入らないなら p[0] にすればw
20デフォルトの名無しさん:2011/05/13(金) 20:28:45.32
わかる必要があるとも思えない
そういうものだって覚えればいいだけ
21デフォルトの名無しさん:2011/05/13(金) 20:31:10.08
別に、付けないといけないことはないだろ。
付けたくなきゃ付けなきゃいい。
22デフォルトの名無しさん:2011/05/13(金) 20:43:21.53
C++の
<<
>>
ってかわいいよね
23デフォルトの名無しさん:2011/05/13(金) 20:44:01.61
>>22
for(;;)
24デフォルトの名無しさん:2011/05/13(金) 20:44:20.66
誤爆した
25デフォルトの名無しさん:2011/05/13(金) 20:51:02.42
グローバル変数と静的変数の使い分けができません
静的変数だけで済んでしまうんですが
26デフォルトの名無しさん:2011/05/13(金) 20:57:13.88
必要ないならグローバル変数使わなくてもいいでしょ
27デフォルトの名無しさん:2011/05/13(金) 21:02:20.75
errno とか使わない人は使わないよな。
28デフォルトの名無しさん:2011/05/13(金) 21:08:10.64
>>4
サンスコ、自分捨てたほうが早いから辞めるわ。踏ん切りついた。
29デフォルトの名無しさん:2011/05/13(金) 22:00:09.62
グローバル変数も静的変数もなるべくやめるべき
30デフォルトの名無しさん:2011/05/13(金) 22:03:23.77
>>29
staticかわいいよstatic
31デフォルトの名無しさん:2011/05/13(金) 22:06:59.58
>>29
ローバル変数って、プログラムの実行環境で一旦セットしたら後は参照だけとか、
編集バッファのように、一時的に利用するものだと、使い回せて便利かなって思う
32デフォルトの名無しさん:2011/05/13(金) 22:26:18.94
33デフォルトの名無しさん:2011/05/13(金) 22:27:51.90
>>12
AMD64/Intel 64 ではそれができない
34デフォルトの名無しさん:2011/05/13(金) 22:28:15.52
>>31
そのプログラムは使いまわせて楽かもしれんが、他のプログラムが使えなくなるからヤメテw
35デフォルトの名無しさん:2011/05/13(金) 22:32:38.92
でも無理にローカル変数化してるのも却って見にくいよね
36デフォルトの名無しさん:2011/05/13(金) 22:57:35.23
ローカル変数にできるならしたほうがいいと思うが、
無理にローカル変数化ってどんなの?
37デフォルトの名無しさん:2011/05/13(金) 23:15:08.09
「ローカル」はスコープの問題であって動的静的とは関係ない。
38デフォルトの名無しさん:2011/05/13(金) 23:15:26.05
多次元配列とポインターに関する質問です
#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となってしまうのでしょうか?
39デフォルトの名無しさん:2011/05/13(金) 23:16:51.02
「グローバル」がスコープの問題だからじゃないの
40デフォルトの名無しさん:2011/05/13(金) 23:46:14.80
>>38
「二次元配列」と「ポインタのポインタ」が全然違うから

double (*test)[5] でやってごらん
41デフォルトの名無しさん:2011/05/13(金) 23:49:27.63
>>38
printf("ad1=%X\n",x);
printf("ad2=%X\n",*test);
42デフォルトの名無しさん:2011/05/14(土) 00:12:17.85
>>40
うまく行きました!
二次元配列はポインタのポインタ的なデータ構造ではなかったのですね
ところで、それで宣言されたtestには何が入ってるのでしょうか?
testには最初の一次元配列の先頭アドレスが入ってると思ったのですが、調べてみたら、
最初の一次元配列の先頭の要素が入ってるようなのです。printf("%X",test);で調べてみると・・・
では、二次元配列の任意の要素をtestから参照するにはどうしたら良いのでしょうか?
43デフォルトの名無しさん:2011/05/14(土) 00:20:53.90
>>42
test[1][2]とか出来るっしょ
testはdouble [5]への配列へのポインタだから最初のtest[1]でそのオフセットが
自動的に計算される
44デフォルトの名無しさん:2011/05/14(土) 00:35:57.98
>42
testは配列だから、何が入っているかといえば、初期化子で与えた値が入っている。

testを評価した結果が何になるかといえば&test[0]と同等。
※&, sizeofの被演算子になる場合は例外

45デフォルトの名無しさん:2011/05/14(土) 00:37:42.80
>>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;
}
で試してみると、プログラムが止まってエラーが出てしまいます・・・
46デフォルトの名無しさん:2011/05/14(土) 00:42:26.12
>>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;
}
47デフォルトの名無しさん:2011/05/14(土) 00:49:46.06
>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型に戻っていますか?
49デフォルトの名無しさん:2011/05/14(土) 00:57:59.16
カマを先頭に付けるのキメエ。
50デフォルトの名無しさん:2011/05/14(土) 00:59:50.25
>>46
うまくいきました!
ところでdouble (*x)[5];←これは何を意味してるのでしょうか?
double型の変数のポインターを5個格納する配列を作ったという事ですか?
それとも、アドレス演算に関して、番地を然るべきだけ、つまり五個ずつ飛ばしてくれる、
つまり、x+1でdouble型の値の入った番地の五個先を示してくれるという事ですか?
それが配列のデータ構造という事ですか?
51デフォルトの名無しさん:2011/05/14(土) 00:59:58.47
>>48
戻るって言うか別に変化してない
@ではaから取り出した値を計算したり代入したりするときにint型として扱うイメージでどうぞ
52デフォルトの名無しさん:2011/05/14(土) 01:01:22.88
>>50

double型を5個格納する配列へのポインタを宣言してる
53デフォルトの名無しさん:2011/05/14(土) 01:08:32.29
(int)a
式 a の返り値をintにしてるだけだから
変数としてのa自体は関係ない。
あくまで式な。
54デフォルトの名無しさん:2011/05/14(土) 01:10:50.64
>>52
double *test1[5]; //a
double (*test2)[5]; //b
double *(test3[5]); //c
のうちaとcは何を表しているのか?
55デフォルトの名無しさん:2011/05/14(土) 01:19:53.33
>>52
なるほど・・・
少し分かって来ました

・・・ところで、自分は二次元配列を引数とする関数を作ろうと思ってたのですが、
任意の配列のサイズに対応出来る関数というのは難しいですか?
プロトタイプは
void func(double (*x)[]);
とすべきですか、それとも
void func(double x[][]);
とすべきですか?
プロトタイプにマジックナンバーは使用したくないのですが、
どうも値を入れないとうまくコンパイルが通らないのです。
何かうまい方法はありませんかね・・・
56デフォルトの名無しさん:2011/05/14(土) 01:25:06.68
>>55
二次元配列を大きさ一切指定なし渡すのはCの仕様上無理だから諦めろあきらめろ
gcc拡張でいいならできないこともないが

メモリ上連続してることを利用してdouble * 型にキャストして渡すという方法とかあるよ

57デフォルトの名無しさん:2011/05/14(土) 01:26:57.15
できるでそ
58デフォルトの名無しさん:2011/05/14(土) 01:28:23.96
>>57
じゃぁやってみろよ・・・・・・・
59デフォルトの名無しさん:2011/05/14(土) 01:29:54.71
C99だとできるのか・・・・・・・・・・・・・・
60デフォルトの名無しさん:2011/05/14(土) 01:34:01.20
>>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)で足してやれば、
配列アクセスを実現できますかね?
つまり、こういうやり方は、マシンに依存したりしてやらない方がいいとかありますかね?
61デフォルトの名無しさん:2011/05/14(土) 01:36:24.00
>>51,53
ありがとうございました。
62デフォルトの名無しさん:2011/05/14(土) 01:36:55.06
>>55
二次元配列では難しいが、ポインタのポインタなら割と簡単に出来る
配列のアクセスも x[1][2] と同じ形に書ける
やっている事は違うし少し速度も落ちるが・・・・

それにポインタのポインタは行へのポインタ配列をmalloc()などで割り
付けて、さらにそれぞれに行の領域をmalloc()等で割り付けなければ
ならない

お行儀のよいプログラムにしたいのならプログラム終了前に逆順で
free()
63デフォルトの名無しさん:2011/05/14(土) 01:39:08.60
freeして終了してもメモリ解放されていません><仕様ですか><
64デフォルトの名無しさん:2011/05/14(土) 01:40:19.48
>>60
機械に依存しない形でも書けるけど速度は保証されないぞ
2^Nのサイズのデータをアクセスする時は大抵CPUのシフト命令を
うまく使って高速化している(x86ならスケールドアドレッシング)。

それを式で書くと定数ならばシフトに直してくれる可能性もあるが、
変数にsizeof()を代入しておく形にするとコンパイラは予めサイズを
知る術がないのでMUL命令を呼び出す事になるだろう

それならポインタのポインタの方がいいと思う
65デフォルトの名無しさん:2011/05/14(土) 01:48:55.47
最初から一次元配列で用意してアクセス用の関数用意する方法もあるよな
>>60
その技法をやるときは[i * M + j] みたいなアクセスするだけでいいんじゃないかな

それ以前にポインタにint型で1足すとそのサイズ(doubleなら8とか)分進むんだよ
勘違いしてないか

その辺>>64の指摘もおかしいような
6660:2011/05/14(土) 01:49:59.84
一応行けたっぽいんですけど、配列が絶対に、要素のデータサイズごとにアドレスを飛ばしつつ、
一直線に並んでるって保証があれば、これ>>60でいきたいと思います。
今回は5×5=25だから、たまたま配列要素が一直線に並んでうまくいったとか、そういう事じゃないですよ・・・ね?

>>62
どうしても無理ならそっちで行きたいと思います
>>64
アドレス演算をintでやると効率が悪いという事ですか?
67デフォルトの名無しさん:2011/05/14(土) 01:50:09.34
>>65
だからそれ遅いって
ベンチマーク取ってみれ
できればデバッグ情報付けてコンパイラがどんなコード吐いているか見てみれ
68デフォルトの名無しさん:2011/05/14(土) 01:55:58.37
>>65
アドレスを(int)pでキャスト変換して、それに、SIZEを一次元の配列のサイズとして
p+i*sizeof(double)*SIZE+sizeof(double)*j
みたいな感じで考えてます。
69デフォルトの名無しさん:2011/05/14(土) 01:55:58.64
>>66
違う
2^Nの演算は2進数を基本としているコンピュータではもの凄く速い
しかしMUL、つまりかけ算命令はどんな数を掛けるか分からないので
大抵はマイクロコードかSRT法で作られているので遅い

逆に言えばsizeof()が2^Nになりそうにない構造体などの多次元配列
を使うならベンチマークを取って見るべきだろう
要素数にもよるがポインタの配列なら2次キャッシュに載るだろうが、
ポインタ配列が指すポインタ配列(3次元配列もどき)だとメモリアクセスが
2回になってL2キャッシュからあふれる可能性が出てくる

何をやらせようとしているのか頭の中でイメージが描けなければこの辺りは
難しいかも
70デフォルトの名無しさん:2011/05/14(土) 01:57:35.05
>>67
いや、速度の話じゃなくて
sizeof(double) どこに使う必要あるんだよwwwwっていう話なんだが

と思ったらアドレスをint型に変換してるのか・・・・・・
普通はdouble *型じゃね?
71デフォルトの名無しさん:2011/05/14(土) 01:57:38.87
>>69
SRT法は除算だろ
掛け算は筆算+シフトで行うしかない
72デフォルトの名無しさん:2011/05/14(土) 02:01:47.83
>>68
int型への変換は変換すること自体が非常にまずい

pはdouble *型に変換して
*(p + i * SIZE + j)とかp[i * SIZE + j]でいいよ
73デフォルトの名無しさん:2011/05/14(土) 02:03:44.22
>>69
まるほど・・・つまり、巨大な配列の場合、各要素にアクセスする時に、
配列の各要素のサイズが2^nの形である事を予めコンピュータが知ってる
(通常のアドレス演算の時はもちろん知ってる)でないと、うまく速度が出ないという事ですか?
自分は、せいぜい100×100程度の二次元配列を想定してるのですが、何度もこれにアクセスするとなると
コンピューターに目に見えて負担がかかったり遅くなったりするって事ですか?
74デフォルトの名無しさん:2011/05/14(土) 02:09:51.73
>>70
intだと、桁あぶれしちゃうかもって事ですか?
アドレスは離散的な値なのでintにしたんですが・・・

>>72
なるほど、double*型だと、1足すだけで、アドレスを一個進められますね
そっちでいきたいと思います
75デフォルトの名無しさん:2011/05/14(土) 02:18:48.86
>>73
目に見えて遅くなるかどうかはCPUのL1/L2/L3キャッシュの容量にもより
何とも言えない

メモリアクセスを減らしたいなら>>68みたいにsizeof()で決め打ちすれば
コンパイル時に定数になるからかなりコンパイラが最適化してくれる可能性
が出てくる

それに二次元配列なら目的のアドレスを得るのに掛かるメモリアクセスは
たかだか1回なのでそんなに問題にならないだろう

俺がポインタのポインタを勧めるのは、C++が vector<vector<double> > と
いう形でコンテナで実現している方法が似ているからだ

ただしコンテナはmalloc()/free()は一切必要ないしメモリリークの危険性もない
76デフォルトの名無しさん:2011/05/14(土) 02:22:03.54
ポインタのポインタのほうが目に見えて速いサンプルコードを頼む
77デフォルトの名無しさん:2011/05/14(土) 02:56:16.84
■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デフォルトの名無しさん:2011/05/14(土) 04:03:55.83
>>6469は頭おかしいからスルーしたほうがいい
79デフォルトの名無しさん:2011/05/14(土) 04:49:19.71



80デフォルトの名無しさん:2011/05/14(土) 06:23:31.78
>>78
だね、初心者スレでアドレス演算の速度云々とか、バカとしか思えない。
無視して、まずな >>65 みたいな素直を書きかたするべき ⇒ >>55

>>77
まず va_list 使って何をしたいか書いてくれない?
81デフォルトの名無しさん:2011/05/14(土) 07:43:04.33
>>77
こんな感じで。
http://codepad.org/WWH8So5A
82デフォルトの名無しさん:2011/05/14(土) 07:52:53.11
>>81
va_list に関係ないが myprintf("%"); ってやられるとだめじゃね?
8382:2011/05/14(土) 08:22:58.05
>>77
バグがありました。訂正します。
http://codepad.org/0xhhJAOs
84デフォルトの名無しさん:2011/05/14(土) 08:30:41.91
>>82
ご指摘感謝。

>>77
バグがありました。訂正します。
http://codepad.org/v9HI8tQT
85デフォルトの名無しさん:2011/05/14(土) 09:10:41.41
◆QZaw55cn4cって糞だよなぁ
8677: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;
}

87デフォルトの名無しさん:2011/05/14(土) 11:21:23.66
>>86
直感として va_list を加工するのは無理なんじゃないかなぁ…
(おおよそ、呼び出し側の引数スタックの積み方を変えて操作することになるような気配
88デフォルトの名無しさん:2011/05/14(土) 11:29:00.66
>>86
スタックを直接弄るのは無理
自分で積み直して呼ぶのがいいよ
89デフォルトの名無しさん:2011/05/14(土) 11:32:02.46
>>86
移植性がない感じ
それにスタックはアドレス上位に向かって伸びて行くので、データスタックとリターンスタックが
同じスタックを使っているアーキテクチャでは無理に挿入すると暴走するような気が
9077:2011/05/14(土) 11:36:21.26
>>87 , 88 , 89

基本的な事を忘れてました。
引数はスタックなのですね。
いじれるわけないですね。

ありがとうございました。
91デフォルトの名無しさん:2011/05/14(土) 11:57:25.02
#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;
}

ビルドエラーが起きました
間違いの指摘をお願いします
92デフォルトの名無しさん:2011/05/14(土) 12:01:17.56
30%%7→30%7
9391:2011/05/14(土) 12:09:57.17
>>92
回答ありがとうございます
変更したらビルドエラーは起きませんでしたが、実行結果はおかしくなりました
printfの文字列中では変換仕様に%を使うので%自体を入力するときには%%と記述するのではないでしょうか
94デフォルトの名無しさん:2011/05/14(土) 12:16:23.20
それは第一引数の文字列リテラルの中の話でしょ
95デフォルトの名無しさん:2011/05/14(土) 12:20:57.38
だからprintfから教えるのやめろつってんのに。
putsからにしろ。
96デフォルトの名無しさん:2011/05/14(土) 12:30:21.76
>>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);
97デフォルトの名無しさん:2011/05/14(土) 12:30:52.65
小数形式で出力指定してるのに整数を引数にしてるからだろ。
98デフォルトの名無しさん:2011/05/14(土) 12:38:19.59
>>88
「自分で積み直して」ってどうやるの?それってC言語だけでできるの?
99デフォルトの名無しさん:2011/05/14(土) 12:40:12.47
できるに決まってんだろアホか
10091:2011/05/14(土) 12:41:17.30
>>96
ありがとうございます、できました
なぜ%%と書かないで%と書くのでしょうか、>>94さんの言っている第一引数がわかりません
ググってみましたがピンと来なかったので説明お願いします
101デフォルトの名無しさん:2011/05/14(土) 12:44:55.12
>>100
printf書式文字列 = 第一引数 = 文字列リテラル = "%f\n %f\n %f\n %d\n %f\n" の中の話
102デフォルトの名無しさん:2011/05/14(土) 12:47:13.82
>>101
ということは、%%と書くということではないのでしょうか
10391:2011/05/14(土) 12:50:16.83
あ、すみません理解しました
文字を出力するときに%%と書くのですね
ご協力ありがとうございました
104デフォルトの名無しさん:2011/05/14(土) 12:51:25.43
%% なんて演算子はない
ここにくるより入門書からやり直せ
105デフォルトの名無しさん:2011/05/14(土) 13:12:40.07
>>99
教えてください、お願いします。
106デフォルトの名無しさん:2011/05/14(土) 13:27:37.62
>>105
積み直し専用関数を作り、va_listからsprintf()で積まれたリストを取り出す
それをもう一度myprintf2()などを作ってそこで挿入したい引数を入れると良い
引数に応じてatoi()などが必須になるのは当然なので
107デフォルトの名無しさん:2011/05/14(土) 13:32:30.30
>>106
format で要求している引数数 と 実際に引数に詰まれた数が異なるので、その手法は使えないんじゃね?

myprintf("%d %d %d", 1 2);

こう呼び出しといて、出力結果が 1 100 2 となるようなのを望んでいるように見受けられるが
108デフォルトの名無しさん:2011/05/14(土) 13:33:28.90
× myprintf("%d %d %d", 1 2);
○ myprintf("%d %d %d", 1, 2);
109デフォルトの名無しさん:2011/05/14(土) 13:41:20.95
>>107
ひでえな
そういうのはCでは禁じ手だ
110デフォルトの名無しさん:2011/05/14(土) 13:47:52.79
暫定案としてこういうのはどうだろう?
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);
}
111デフォルトの名無しさん:2011/05/14(土) 13:57:33.84
>>110
ああなるほどvsprintf()を使ってva_listを引数に取る方法があったか
112デフォルトの名無しさん:2011/05/14(土) 14:06:40.27
× vsprintf(buf, form. argp); /* この段階で buf[] は "1 %d 2" */
○ vsprintf(buf, form. argp); /* この段階で buf[] は "1 %d 2 %d" */

ちゃんと推敲しろよ俺orz
113デフォルトの名無しさん:2011/05/14(土) 14:39:01.73
>>106
それって書式文字列を自前パーズするってことだよね?
だとしたら、分解して複数回に別けてprintfするだろうから
積み直しっていう言葉からは遠いような希ガス
114デフォルトの名無しさん:2011/05/14(土) 14:56:15.54
ビット演算子って処理系によって結果が違ってくる場合があるの?
115デフォルトの名無しさん:2011/05/14(土) 15:02:24.79
仕様上はある
負の値のビットシフトは未定義とか
俺は今までそんな変な動作をする処理系に出会ったことはないけれど
116デフォルトの名無しさん:2011/05/14(土) 15:05:59.55
>>115
どうも
今後は気をつけて使うようにする
117デフォルトの名無しさん:2011/05/14(土) 15:53:59.72
デタラメ垂れてんじゃねーよ
118デフォルトの名無しさん:2011/05/14(土) 16:15:49.73
unionってどう使うの?
なんであんなに面倒なの
119デフォルトの名無しさん:2011/05/14(土) 16:22:09.91
>>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);

みたいにするだけだろ。

何のために必要とか言うなら、必要になるまで知らなくてもいい機能だから
無視しとけ。
120デフォルトの名無しさん:2011/05/14(土) 16:34:22.95
structじゃダメなんですか><
121デフォルトの名無しさん:2011/05/14(土) 16:41:10.17
>>120
例えば、固定長レコードでファイルに入出力する処理があるとするじゃない?
各固定長レコードは、いろんなデータがそれぞれのフォーマットで格納されてて、
実際に読んでみないと、その内容が分からないとする。
そしたら、例えば先頭1バイトにその書式情報を入れておいて、
残りはそれぞれのデータごとに格納すればいい。
先頭1バイトと残りの領域を定義するstructを設計し、
その残りの領域を、unionを使って、好きに割り当てて使えばいい。
どのフォーマットかは、先頭の1バイトで判断すればいいよね。
122デフォルトの名無しさん:2011/05/14(土) 16:46:43.85
>>119
そんな使い方するためのものじゃねーよ。
どんだけ低能だな。
123デフォルトの名無しさん:2011/05/14(土) 16:59:15.48
えっ? 全面否定するほどの回答では無い様がするが。
後は、例えば
union HOGE { double d; unsined int n[2]; } hoge;
みたいにして浮動小数点IEEE754形式を直接操りたい時とか
124デフォルトの名無しさん:2011/05/14(土) 17:48:44.56
if文の条件式でnが1か3か7ならtrueって簡単にかける?
125デフォルトの名無しさん:2011/05/14(土) 17:54:44.66
Pascalならn in [1,3,7]と書けるけどCでは書けない
あまり複雑ならswitch caseにしちゃうのもあり
126デフォルトの名無しさん:2011/05/14(土) 17:57:41.12
>>123
soket の INET_ADDR_IN はそういう実装してるような気がした
127デフォルトの名無しさん:2011/05/14(土) 18:08:16.30
>>124
奇数という条件なら
if (n%2)
と簡単にかけるんだけどな
128デフォルトの名無しさん:2011/05/14(土) 18:19:15.30
if(n == 1 || n == 3 || n == 7) のどこが簡単じゃないんだ
129デフォルトの名無しさん:2011/05/14(土) 18:22:02.78
これだから童貞は
130デフォルトの名無しさん:2011/05/14(土) 18:24:06.20
>>128
直感的には
n == 1 || 3 || 7
と書きたい
131デフォルトの名無しさん:2011/05/14(土) 18:24:41.74
>>123,126
unsined → unsigned
soket → socket
けど、この手はコンパイラが見つけてくれるので気にしないw
132デフォルトの名無しさん:2011/05/14(土) 18:25:27.22
case 1: case 3: case 7:
って並べちゃおうw
133デフォルトの名無しさん:2011/05/14(土) 18:27:22.72
>>132
それもイイけど、元の質問者は if 文でと前提条件付けてんだからw
134デフォルトの名無しさん:2011/05/14(土) 18:27:41.94
if ((n & (n + 1)) == 0)
135デフォルトの名無しさん:2011/05/14(土) 18:36:27.88
Perlならこんな感じ

if( $n ~~ [1, 3, 7] )
136デフォルトの名無しさん:2011/05/14(土) 18:46:03.47
>>134
n = 0 と 15, 31, 63 で true になるぞ。
137デフォルトの名無しさん:2011/05/14(土) 19:03:15.24
if (!(n-7)*(n-3)*(n-1)))
138デフォルトの名無しさん:2011/05/14(土) 19:04:10.84
>>137
おめでてーな
139デフォルトの名無しさん:2011/05/14(土) 19:08:09.94
>>138
面白いと思って一生懸命考えたんだよ、察してやれよ。
140デフォルトの名無しさん:2011/05/14(土) 19:09:19.05
3次式にしてみて
141デフォルトの名無しさん:2011/05/14(土) 19:13:13.66
>>137
()がたりない
142デフォルトの名無しさん:2011/05/14(土) 19:13:52.16
>>141
正解
143デフォルトの名無しさん:2011/05/14(土) 19:31:35.26
>>136
if (n&!((n- (n+10)%10)|(n&(n+1))))
144デフォルトの名無しさん:2011/05/14(土) 20:15:08.41
>>134 (>>136じゃなくて)
if ( n>0 && n<10 && !(n&(n+1)) )
145デフォルトの名無しさん:2011/05/14(土) 20:25:13.81
>>144
俺の部下がこんなコード書いてきたら、速攻で没にする。

簡単じゃないという理由以前に、10 なんてわけわからない
直値が入ってるから。
146デフォルトの名無しさん:2011/05/14(土) 20:33:05.11
そりゃあ俺だってボツにするが、ちょっとした遊びみたいなものなんだから別にいいじゃんw
147デフォルトの名無しさん:2011/05/14(土) 20:38:40.62
そんなん言ったら、俺なら>>128以外は没にするよ。
148デフォルトの名無しさん:2011/05/14(土) 20:57:29.48
if ((0x8a >> n) & 1)
ただし n=0..31 に限る
149デフォルトの名無しさん:2011/05/14(土) 21:56:27.36
いやいや遊びだからこそ、遊び以外のところはきちんと書かないと (w
150デフォルトの名無しさん:2011/05/14(土) 21:58:44.03
NULLポインタの解釈はこれであってますか?

NULLポインタは規格上ではどこも指していないポインタで、実装上はアドレスの0番地を指すポインタ
これはソフトウェア上で0番地を指すようにしてるだけで、ハードウェア上の0番地とは関係ない
151デフォルトの名無しさん:2011/05/14(土) 22:10:39.47
おれは>>137>>143も支持するよ
152デフォルトの名無しさん:2011/05/14(土) 22:18:42.35
誰かが演算子作ってくれるよ
153デフォルトの名無しさん:2011/05/14(土) 22:29:12.33
>>150
言えるのは、NULLの入ってるポインタが0とは限らない。

NULLがアドレスの0以外の処理系でも、
p = NULL;
if (p == 0) … は真となる。

ということ。
154デフォルトの名無しさん:2011/05/14(土) 22:43:17.03
勝手に変な解釈したやつが誤解してるだけであって
NULLは0だよ普通に。
余計なこと考える必要はない。
155デフォルトの名無しさん:2011/05/14(土) 22:55:17.27
>>154
ちゃんと規格を読め
156デフォルトの名無しさん:2011/05/14(土) 23:03:13.03
NULLは0だと決まっていなかったような
157デフォルトの名無しさん:2011/05/14(土) 23:08:22.15
>>156
いや、NULL と書くべきところを全部 0 にしても全く問題ない。
コンパイラは賢いから、null ポインタと解釈すべきところを、基本、心得ている。

ただし。

・プロトタイプ宣言してね。前方参照は苦手なの。
・可変長引数に null ポインタを書くときは、キャストしてね。
158デフォルトの名無しさん:2011/05/14(土) 23:10:30.35
0じゃなくても問題ない
159デフォルトの名無しさん:2011/05/14(土) 23:12:57.26
普通に0だっつの。
それ以外の何物でもない。
160デフォルトの名無しさん:2011/05/14(土) 23:16:17.58
a) ソースコード上の表記
b) 実行コードのアドレス

どっちなのかはっきりしろよ。

a) は 0 で、b) は処理系定義で実際 0 でない処理系も普通にある。
161デフォルトの名無しさん:2011/05/14(土) 23:21:10.54
言語の上で単に一つ基準になるものを決めてるだけだっつの。
だから何の変哲もなく、ただの0に過ぎない。
EOF が -1 なのと一緒。
値に意味があるわけじゃなくてただの決めごと。
162デフォルトの名無しさん:2011/05/14(土) 23:51:44.56
>>161
EOFが-1とNULLが0はちょっと違う。
163デフォルトの名無しさん:2011/05/15(日) 00:08:12.84
何が違うのか言ってみろよw
どっちもそうだと決めただけのものだろ。
164デフォルトの名無しさん:2011/05/15(日) 00:09:10.56
NULLが0って決まってたの?
165デフォルトの名無しさん:2011/05/15(日) 00:19:22.39
>>163
NULL (正確にはヌルポインタ) は、ソース上は 0 であることが、言語仕様で
決まっている。また、実際の値が 0 であるかどうかは処理系ごとに違う。

EOF は、単に主要なライブラリがそう決めてるだけ。
166デフォルトの名無しさん:2011/05/15(日) 00:26:09.88
>>164
たとえばヌルが0xFF00の処理系があったとして、
p = 0;
と書けば0xff00がpに入る。
そういう意味では0はNULLと決まってる。

EOFは単純に-1
167デフォルトの名無しさん:2011/05/15(日) 00:28:18.96
その実際の値が0だよ。
変な誤解はやめとめ。
168デフォルトの名無しさん:2011/05/15(日) 00:31:18.90
>>167
つ MS-DOS/i8086
メモリモデルによっては、null ポインタは 0 ではなく、容易にオフセット 0 を書き換えてしまうことが可能であった。
169デフォルトの名無しさん:2011/05/15(日) 00:40:55.80
それ別の話じゃね?
170デフォルトの名無しさん:2011/05/15(日) 00:42:08.31
171デフォルトの名無しさん:2011/05/15(日) 00:48:40.26
#ifって使ってる?
172デフォルトの名無しさん:2011/05/15(日) 00:52:06.13
>>171
#if 0

#endif
173デフォルトの名無しさん:2011/05/15(日) 00:52:55.62
関数作ってmain関数で呼び出すのとmain関数に直接書く場合って
後者の方が実行速度はやくなる?
174デフォルトの名無しさん:2011/05/15(日) 00:55:29.60
>>173
その環境で実測しないと分からないけど、普通は後者のほうが速い。
175デフォルトの名無しさん:2011/05/15(日) 00:56:41.11
数ナノ秒くらいは速くなるかもね
176デフォルトの名無しさん:2011/05/15(日) 00:57:27.60
>>171
一番使うのは #if 0 〜 #endif、/* 〜 */ にするとネストするときがあるから
後は #if defined(foo) || defined(boo) みたいな感じで
177デフォルトの名無しさん:2011/05/15(日) 01:00:20.46
>>173
わからない。

関数呼び出しのコストが削減できるので早くなるかもしれないし、
同じ関数を複数回呼び出していたのをインラインに展開することで、
キャッシュに入らなくなって遅くなるかもしれない。

まずはそんなこと考えずに、普通に書いて測定によって関数呼び出し
がネックになっていたら書き換えればいい。
178デフォルトの名無しさん:2011/05/15(日) 01:02:38.90
>>173
厳密にいえば差はある。
その差を重要視するか、それとも記述性・表現性・ドキュメント性の方を重視するか、の判断はおまかせする。
179デフォルトの名無しさん:2011/05/15(日) 01:08:03.13

NULLはゼロじゃない場合も結構あるよ。

Visual Studio2010は確か、4か7だった気がする
180デフォルトの名無しさん:2011/05/15(日) 01:10:08.45
bakademotyondemowwwwwwww
181uy:2011/05/15(日) 02:12:10.57
C言語関連って、知ったかぶり多いよね
173とか正直に「 わからない 」といえば?w

まず、コンパイラごとの最適化の様子を見ないとわからない
そのコンパイラにとっては、関数分けしたほうが速いコード出すかもしれないし
直接かいたほうが速いかもしれない
結局そこまで気にするならアセンブラで直に書くしかない
182デフォルトの名無しさん:2011/05/15(日) 02:17:22.09
「かわらない」でいいんじゃ
183デフォルトの名無しさん:2011/05/15(日) 03:56:52.25
暇なので>>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のはずなのに何故なんですか?
185デフォルトの名無しさん:2011/05/15(日) 05:37:35.27
>>184
jjの型が整数型なら、実数から整数への変換の際に切り捨てが発生してしまっています。
誤差をフォローするから、実数に頼らない演算にするしかありません。
186デフォルトの名無しさん:2011/05/15(日) 08:24:45.85
>>183
うちのi7 3.5GHzでは
配列: 23934
ポインタ: 26539
187デフォルトの名無しさん:2011/05/15(日) 08:46:08.43
>>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
188187:2011/05/15(日) 08:49:30.90
CPU書いてなかった。i7 860 2.8GHz
189デフォルトの名無しさん:2011/05/15(日) 10:21:54.97
内部表現とかないから。
0は0だから。
190 [―{}@{}@{}-] デフォルトの名無しさん:2011/05/15(日) 13:10:13.26
fopenのモードの"b"が付いてるのと付いてないのとで何が違うんですか
今まで"b"を付けていたfopenの処理を"b"を外すことで何か不具合が起こることってありますか
191デフォルトの名無しさん:2011/05/15(日) 13:14:53.25
>>190
Linux系ならなにも変わらない
Windows系なら以下を参照
http://msdn.microsoft.com/ja-jp/library/yeby3zcb(v=vs.80).aspx
192デフォルトの名無しさん:2011/05/15(日) 13:18:50.30
srand()してからrand()で擬似乱数を取得できますが
このテーブル?を複数同時進行させることはできますか?
srand(10)のrand()取得したら、次はsrand(5)のrand()取得みたいな感じで
毎回srand()呼ぶとrand()が一緒になってしまうのです
何度呼び出したか記憶するという方法はできそうですが
それ以外ありますか?
193デフォルトの名無しさん:2011/05/15(日) 13:20:14.98
まだ言ってんのか
194デフォルトの名無しさん:2011/05/15(日) 13:28:01.31
#include <stdlib.h>
#include <time.h>
  srand(time(0));
195デフォルトの名無しさん:2011/05/15(日) 13:33:32.36
>>192
なんでそんなことがしたいの?
196デフォルトの名無しさん:2011/05/15(日) 13:37:50.68
>>192
代替品を自分で作るかどっかからパクってくる
疑似乱数でぐぐればいくらでも見つかるだろう
197デフォルトの名無しさん:2011/05/15(日) 13:40:05.05
>>190
通常は、システム毎に改行コードが違うのを吸収するための仕組みがあるんだが、
それを b 付けると解除するようになるだけ。
198デフォルトの名無しさん:2011/05/15(日) 13:43:33.20
>>192
まず、それはできません。
あと、擬似乱数が十分に乱数に近いものであれば、それは意味がありません。
普通に rand() で順番に取り出せば十分です。
それで結果が思わしくないようであれば、メルセンヌツイスタ(日本発)などの高性能なアルゴリズムを使えばいいと思います。
199デフォルトの名無しさん:2011/05/15(日) 13:45:22.11
srand は毎回使うんじゃなくて最初の一回だけでよい。
もしかして、再現性のある乱数のラインが二本ほしいってことかな?
200198:2011/05/15(日) 13:50:20.10
>>199
「再現性のある」か、なるほど。
であれば、使う分だけ乱数をあらかじめ取り出してプールしておくしかないでしょうか。
201デフォルトの名無しさん:2011/05/15(日) 13:50:22.82
>>199
左右対戦テトリスみたいな感じか。
202192:2011/05/15(日) 13:50:27.09
返信ありがとうございます
単純にランダム系列?がunsigned int では少ないと感じたことと
得られる結果をリプレイのように再生したいというのがあります
203デフォルトの名無しさん:2011/05/15(日) 13:53:32.00
rand()の最大値は RAND_MAX だから。
int ほど大きくもないよ。
204デフォルトの名無しさん:2011/05/15(日) 14:04:53.07
>>186>>187
おおさすがトリプルチャンネル&L2キャッシュ巨大
Nの大きさを大きくしてL2キャッシュからはみ出すようなテストをすると
差が出てくるかも
205デフォルトの名無しさん:2011/05/15(日) 14:31:10.27
>>187
BCCを使っていたらポインタのポインタ版は配列の3倍ほどになりましたが
VS2010を使ってReleaseでビルドしたらほとんど差が出ませんね
不思議だ・・・
206デフォルトの名無しさん:2011/05/15(日) 14:32:14.08
つーかむしろ最後の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[]とするとエラーが出ます。
なにか空宣言する方法ないのですか?または空宣言できないのですか?
209187:2011/05/15(日) 16:34:19.71
>>204
300*300*4/1024 = 351KiB
Core i7 860はL2キャッシュ256KB/コア、デュアルチャンネルだよ

>>206
最後が一番速いってのが誤差の範囲じゃないなら不思議だね
210デフォルトの名無しさん:2011/05/15(日) 16:35:11.27
>>208
ないので工夫しましょう
211デフォルトの名無しさん:2011/05/15(日) 16:43:48.60
>>209
俺のはAthlon64 X2 3800+だけど512KBL2×2かな?
でもdoubleなら300×300×8=702KiBでL2からはみ出ますよね

BCCではまともにポインタのポインタでメモリアクセスするのに対し
VS2010だと差が出ない
吐いたコードを見て見ようかな
212デフォルトの名無しさん:2011/05/15(日) 16:57:44.06
>>208
Cの配列はサイズを後から変えられないので空の配列なんか作れても何も入れられないし役に立たないし無意味です
213デフォルトの名無しさん:2011/05/15(日) 17:12:10.35
今はサイズ0の配列って駄目なんだな
214デフォルトの名無しさん:2011/05/15(日) 17:16:01.16
Cなら配列ではなくてポインタにしといて後からrealloc()で拡げろよ
215デフォルトの名無しさん:2011/05/15(日) 18:13:30.04
>>208
つvector
216デフォルトの名無しさん:2011/05/15(日) 18:17:46.19
const struct HOGE *hoge_ptrにmallocされた領域へのポインタが
入っているのですが、これを解放したいのでfree(hoge_ptr);とすると

warning C4090: '関数' : 異なる 'const' 修飾子です。

と怒られます。怒られないようにするにはどうすればよいでしょうか?
217デフォルトの名無しさん:2011/05/15(日) 18:22:31.79
>.215
スレタイ読める?
218デフォルトの名無しさん:2011/05/15(日) 18:23:40.87
vector.co.jp ってことだろ。
219デフォルトの名無しさん:2011/05/15(日) 18:25:23.16
vector.co.jpと空宣言とどういう関係があるの?
220デフォルトの名無しさん:2011/05/15(日) 18:28:03.02
>>216
constはがしてfreeする
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)です
222デフォルトの名無しさん:2011/05/15(日) 18:49:51.05
>>221
出てる通りのことを君のプログラムがしているんだよ、free() 以前の問題
223デフォルトの名無しさん:2011/05/15(日) 18:58:10.83
>const struct HOGE *hoge_ptrにmallocされた領域へのポインタが
>入っている

これってどうやるの?
224デフォルトの名無しさん:2011/05/15(日) 18:58:55.74
>>223
関数の引数とか初期化とか
225デフォルトの名無しさん:2011/05/15(日) 19:02:30.98
原因はmalloc(sizeof(struct HOGE *))でした。
お騒がせしました。

// 二徹休出するとアホがポロポロ出てくる……orz
226デフォルトの名無しさん:2011/05/15(日) 19:06:19.32
便乗で済まぬが、一般的に
malloc(sizeof(struct HOGE)) と malloc(sizeof(*hoge_ptr)) のどっちがいいのかな?
227デフォルトの名無しさん:2011/05/15(日) 19:06:37.85
const変数の初期化に関数の戻り値なんてできたのか
なんとなく定数しかできないものだと思ってた
228デフォルトの名無しさん:2011/05/15(日) 19:12:30.35
>>226
前者
229デフォルトの名無しさん:2011/05/15(日) 19:31:04.64
>>226
圧倒的に前者
230デフォルトの名無しさん:2011/05/15(日) 19:34:14.86
多数決で決めよう

オレは前者をとる
231デフォルトの名無しさん:2011/05/15(日) 19:34:22.37
>>226
圧倒的に後者
前者とか言ってるのはアホ
232226:2011/05/15(日) 19:36:30.77
確かによく見かけるのは前者なんだけど、双方の良し悪しの理由が判らんのよ
知ってたら教えて
233デフォルトの名無しさん:2011/05/15(日) 19:36:33.53
>>226
後者に一票
234デフォルトの名無しさん:2011/05/15(日) 19:42:53.79
>>232
後者なら、変数の型を変更したときでもそのままで動く
235デフォルトの名無しさん:2011/05/15(日) 19:42:57.26
>>232
1. hoge = malloc(sizeof(*hoge)) の方が
  hoge = malloc(sizeof(struct HOGE)) より間違いに気づきやすい。

2. hoge の型を struct HOGE から struct HAGE に変更した時に、
  ここのコードを変更せずに済む。

あくまでも俺の考え方だが。
236>>235:2011/05/15(日) 19:43:34.29
被った...
237デフォルトの名無しさん:2011/05/15(日) 19:50:13.02
hoge = malloc(sizeof(struct HOGE *)) と間違えることはめったにないけど
hoge = malloc(sizeof(hoge)) と間違えることは結構ありそうと思うのは俺だけ?
どっちもコンパイラが警告できないのが嫌らしいけどね
238デフォルトの名無しさん:2011/05/15(日) 19:53:36.49
書き直して使い回すにしても、大して手間ではないし、色んな方法で一括変換できるし。

sizeofの中に書かれてるものを見てサイズがイメージできる方がオレは好きだ。
239デフォルトの名無しさん:2011/05/15(日) 19:55:51.85
hoge = malloc(sizeof(hoge)) は見た瞬間「ん?」ってなる
個人差はあるけど、ぱっと見でオカシさに気付く人は多いだろう
240デフォルトの名無しさん:2011/05/15(日) 20:07:22.04
>>237
> hoge = malloc(sizeof(struct HOGE *)) と間違えることはめったにないけど

じゃなくて

struct HOGE {...} *hoge;
struct HAGE {...} *hage;

hoge = malloc(sizeof(struct HAGE))

のケース。

まあ、確かに

> hoge = malloc(sizeof(hoge)) と間違えることは結構ありそうと思うのは俺だけ?

のケースもあるから、微妙ではあるが...。
241デフォルトの名無しさん:2011/05/15(日) 20:40:48.49
どうでもいいけどカッコ付けんな ボケ
242デフォルトの名無しさん:2011/05/15(日) 20:52:29.24
>>241
int a;
sizeof a + 1
とかってやってたまに間違えるからつい習慣でw
243デフォルトの名無しさん:2011/05/15(日) 21:01:40.95
"hoge"の"ってどんな演算子なの?
244デフォルトの名無しさん:2011/05/15(日) 21:03:56.80
あと'のほうも
それとchar型で宣言しているのに'が必要なわけとか
245デフォルトの名無しさん:2011/05/15(日) 21:08:12.40
演算子ではない。
あと>>244は意味不明。
246デフォルトの名無しさん:2011/05/15(日) 21:32:43.02
>>241
括弧をつけないのがかっこいいと思ってるど素人さんですか?
初心者なら、初心者らしくしましょうね。
247デフォルトの名無しさん:2011/05/15(日) 21:45:50.94
必要ないところに括弧つけたら欝陶しいだけだろ。
prindf(("%s\n"),("Fack.","Hello, World."));
248デフォルトの名無しさん:2011/05/15(日) 21:54:49.81
ブロックの最初で宣言するってブロックって何?最初ってどこ?
249デフォルトの名無しさん:2011/05/15(日) 21:55:05.32
>>248
LOGO
250デフォルトの名無しさん:2011/05/15(日) 21:56:47.64
int i = 0;
for (;i<9;i++)



int i;
for (i=0;i<9;i++)

って違いあるの?
251デフォルトの名無しさん:2011/05/15(日) 22:00:17.05
>>250
int i;
for (i=9;i--;)
252 ◆XEE2zLj0dE :2011/05/15(日) 22:01:21.46
mallocの件は sizeof(*hoge) に賛成なんだけど、
たまーに、ヌルポインタ参照してる!と言いがかりをつけられることが。
文脈的にも、「ある型のサイズ分確保したい」より「欲しいもののサイズ分確保したい」という方が素直な気がする。
配列として確保する場合はchar *arr = malloc(sizeof(arr[0]) * N); としたこともあったと思う。

>>244
'が必要ないとした場合を考えると
char c = a; /* a という文字で初期化 */
char c2 = c; /* c という文字で初期化なのか、変数 c の内容で初期かなのか判断できない */

char c = ; /* 構文エラーなのか、空白で初期化なのか判断できない */
などなどの弊害がたくさん。
253デフォルトの名無しさん:2011/05/15(日) 22:02:45.27
>>250
int i;
for (i=0;9-i;i++)
254デフォルトの名無しさん:2011/05/15(日) 22:08:06.05
>>250
> int i = 0;
> for (;i<9;i++)

キモチワルくない?
255デフォルトの名無しさん:2011/05/15(日) 22:15:39.03
callocのcってclear?
mallocのmは想像がつくんだが
256デフォルトの名無しさん:2011/05/15(日) 22:19:39.01
>>250
>>251
>>253
>>254
netagireka?
257デフォルトの名無しさん:2011/05/15(日) 22:21:24.41
>>255
新ANSI C言語辞典って本に標準関数の名前がなんの略かって書かれてるけど
今手元にない。
258デフォルトの名無しさん:2011/05/15(日) 22:28:23.73
>>256
int i;
for (i=-1;8-i++;)
259 ◆XEE2zLj0dE :2011/05/15(日) 22:31:48.49
>>255
Cell/Clear ALLOCateだそう

C言語辞典引っ張り出したの久しぶり。
K&Rは特に何も書いてなかった
260デフォルトの名無しさん:2011/05/15(日) 23:17:17.60
\aってなんですか?
printf("\a");
ってやっても何も出ないんですが?
261デフォルトの名無しさん:2011/05/15(日) 23:21:04.84
>>260
http://wisdom.sakura.ne.jp/programming/c/Cdata1.html
ビープ音でも鳴るのかな?
262デフォルトの名無しさん:2011/05/15(日) 23:26:13.88
うん
263デフォルトの名無しさん:2011/05/15(日) 23:30:33.74
>>261
>>262
どうもです
264デフォルトの名無しさん:2011/05/16(月) 05:59:08.04
これの優劣は?

int a[10];

1.size = sizeof a / sizeof a[0];
2.size = sizeof a / sizeof *a;
265デフォルトの名無しさん:2011/05/16(月) 06:19:15.87
>>264
個人的には2を見たことがないので1の一択
266デフォルトの名無しさん:2011/05/16(月) 07:50:04.00
ttp://www.nitoyon.com/vc/tips/multi_precision.htm

これを使って,小数点以下50桁のa,bを定義して
乗算するにはどのようなプログラムを書けばいいのでしょうか?
267デフォルトの名無しさん:2011/05/16(月) 09:41:21.24
精度50桁という意味ならできません
ぱっとみた感じそのライブラリは指数の範囲を拡大するだけで精度は拡大しません
268デフォルトの名無しさん:2011/05/16(月) 11:34:57.61
>>267
ありがとうございます


指数の精度を高めるのにおすすめのライブラリをおしえていただけませんか?
269デフォルトの名無しさん:2011/05/16(月) 11:40:30.29
任意精度演算 c言語 ライブラリで検索
270デフォルトの名無しさん:2011/05/16(月) 11:41:14.58
>>268
「指数部の精度」なんて概念はないぞ。大人しくポピュラーなものを使ったらどうだ?
つーか、そもそも目的が判らんとアドバイスの仕様もないな。
いずれにしても、このスレだとCの言語入門だからスレ違いだ。
271デフォルトの名無しさん:2011/05/16(月) 12:40:16.55
数字の後のfてなんのため?ちょっと思い出せないので質問しました。J
272デフォルトの名無しさん:2011/05/16(月) 12:41:43.88
float
何も付けなければdouble
273271 ◆WdD1pV9xBc :2011/05/16(月) 12:52:11.58
あ!、ありがと
274デフォルトの名無しさん:2011/05/16(月) 19:35:33.94
10進法から16進法への変換、もしくはその逆のケースを暗算する事は可能でしょうか?
http://ja.wikipedia.org/wiki/%E5%8D%81%E5%85%AD%E9%80%B2%E6%B3%95#.E4.B9.97.E7.AE.97.E8.A1.A8
を丸暗記するべきでしょうか?
275デフォルトの名無しさん:2011/05/16(月) 19:51:28.75
できる人もいるだろうけど、
そんなもの暗算しても意味がない。
標準の calc.exe でも変換できるし。
0h〜Fh(0〜15) まで暗記すりゃ充分。
276デフォルトの名無しさん:2011/05/16(月) 19:52:20.07
便乗ですみません
16進数で00+FFはFFですが、FF+FFは何故FFなんでしょうか?
277デフォルトの名無しさん:2011/05/16(月) 19:59:54.13
>>276
そんなことないだろ
278デフォルトの名無しさん:2011/05/16(月) 20:01:41.39
>>276
そりゃ論理和なんじゃねーの?
OR ってやつな。
0 OR 0 → 0
0 OR 1 → 1
1 OR 0 → 1
1 OR 1 → 1

279デフォルトの名無しさん:2011/05/16(月) 20:03:34.35
FFh+FFh なら 1FEh だよな。
280デフォルトの名無しさん:2011/05/16(月) 21:10:01.55
C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?
281デフォルトの名無しさん:2011/05/16(月) 21:24:58.39
>>280
高速な計算
282デフォルトの名無しさん:2011/05/16(月) 21:28:54.37
>>280
僕もC言語をはじめたばかりでわからないのですが
ビットシフトでどのようなことが起こるのですか?
ビットシフト知っていること事態が凄いですよ
283デフォルトの名無しさん:2011/05/16(月) 21:30:49.86
>>280
けっこう暇つぶしになる
284デフォルトの名無しさん:2011/05/16(月) 21:33:37.84
>>280
2進数で1ビットシフトする事は、2を描けたり2で割ったりする事に等しい
285デフォルトの名無しさん:2011/05/16(月) 21:34:03.00
うーん、なんの役にたつか、といわれると、困りますね。
その昔、マシン語のプログラムを作っていた頃はよく使いました。単純な 2^n 倍とか、CRC の計算とか、割り算掛け算の実装とか。
でも C でわざわざビットシフトを使わないといけない、という局面はそんなにない。(マスクパターンを作成するときくらいか。)
C はマシン語を置き換えてきた、という経緯から考えて、その昔、言語開発者が、努めてマシン語にある命令を C にも持ち込んできたのではないでしょうか。
286デフォルトの名無しさん:2011/05/16(月) 21:36:17.70
>>280
巨大なメルセンヌ素数みつけようぜwwwwwww
287デフォルトの名無しさん:2011/05/16(月) 21:39:32.90
例えばFPUを使わずに実数演算をするルーチンを作る時に
シフト演算は大いに役立つ
あとC言語の最適化によく使われる
288デフォルトの名無しさん:2011/05/16(月) 22:00:16.14
暗号処理、文字コード変換、画像音声コーデックとか
もう少しプリミティブなところだとエンディアン変換とか
289デフォルトの名無しさん:2011/05/16(月) 22:31:30.12
そうそう、その基礎となる FFT の実装でもビットシフトが活躍していますね。
高速化の定石なのかもしれません<ビットシフト
290デフォルトの名無しさん:2011/05/16(月) 22:39:11.72
…まじかよ
291デフォルトの名無しさん:2011/05/16(月) 22:42:57.65
>>289
頭が悪いのかわざとやってるのか
292デフォルトの名無しさん:2011/05/16(月) 22:45:51.35
釣れたw
293デフォルトの名無しさん:2011/05/16(月) 22:52:50.97
2の倍数で割る除算よりシフト演算の方が速い…とかいう話か?
最近のコンパイラなら勝手に最適化して置き換えてるんじゃね
294デフォルトの名無しさん:2011/05/16(月) 22:58:54.33
ニワカばっかだな
295デフォルトの名無しさん:2011/05/16(月) 23:09:01.21
>>293
そういう話じゃない
296デフォルトの名無しさん:2011/05/16(月) 23:11:32.94
>>294
先生〜、ニカワじゃない、ニワカものばかりの僕達に的確かつ正確な回答をお願いしますよ
297デフォルトの名無しさん:2011/05/16(月) 23:33:17.08
>>296
面白いねー
298デフォルトの名無しさん:2011/05/16(月) 23:37:07.54
機械語を知れば、理解される。 答えだ
299デフォルトの名無しさん:2011/05/16(月) 23:49:19.96
>>298 ボケ?それとも釣り? あっ、天然かw
300デフォルトの名無しさん:2011/05/16(月) 23:54:32.35
fft/インプレイス演算でビット逆転カウンタを実装する際に、ビットシフトを活用した記憶がありましたが、
単に 2 で割るだけでよかったのかもしれません。失礼しました。
301デフォルトの名無しさん:2011/05/17(火) 00:07:44.35
10年ちかく前からあるコピペだけどまだまだ通用するんだな
302デフォルトの名無しさん:2011/05/17(火) 00:15:35.39
◆QZaw55cn4cの臭いがする
303デフォルトの名無しさん:2011/05/17(火) 00:17:05.33
mallocつかうにはどれをインクルードすればいいの?
304デフォルトの名無しさん:2011/05/17(火) 00:32:22.93
>303

stdlib.h
305デフォルトの名無しさん:2011/05/17(火) 00:56:03.70
◆QZaw55cn4cは糞
306デフォルトの名無しさん:2011/05/17(火) 09:35:09.16
初心者はまずここ読んどけよ
http://www.jpcert.or.jp/sc-rules/
307デフォルトの名無しさん:2011/05/17(火) 11:12:33.78
>>306
http://www.jpcert.or.jp/sc-rules/c-pre07-c.html

"??/" を使うの禁止されたら
リテラル文字列で改行とかするときに困るんじゃね?
どうすんの?
308デフォルトの名無しさん:2011/05/17(火) 12:15:56.87
リテラル文字列で改行ってこのこと?
"hogehoge
foo"
なら
"hogehoge"
"foo"
でいいよ
309デフォルトの名無しさん:2011/05/17(火) 12:32:46.13
"foo\
bar"
とかやるの?
310デフォルトの名無しさん:2011/05/17(火) 12:33:23.48
禁止されたら"??/n"でなく"\n"にする。
向かってる方向が逆というオチ
311デフォルトの名無しさん:2011/05/17(火) 12:36:54.23
リテラル文字列のエスケープ文字はバックスラッシュ(半角の‘\’)だぞ?
JIS 7 単位符号には存在しない文字だ。
"??/" が使えなかったらどうすんだよ?
312デフォルトの名無しさん:2011/05/17(火) 12:44:29.34
どうしよう…
313デフォルトの名無しさん:2011/05/17(火) 12:56:05.18
もしもし
もし"??/" が使えなかったらどうすんだよ??
314デフォルトの名無しさん:2011/05/17(火) 13:15:14.93
printf("Hello.%c", 10);
315デフォルトの名無しさん:2011/05/17(火) 13:17:13.47
ソースコード書くのにシフトJISじゃなくてUTF-8とか使えばいいんじゃね?
UTF-8なら半角バックスラッシュあるだろ。
316デフォルトの名無しさん:2011/05/17(火) 13:23:38.68
ソースコードに非 ASCII を使う男の人って……
317デフォルトの名無しさん:2011/05/17(火) 13:32:24.53
会社で??/使うの禁止されてたら、JIS7単位符号で\の使えるキーボードを買ってもら???
318デフォルトの名無しさん:2011/05/17(火) 14:12:01.67
>>289
くわしくw
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
に対して最小二乗法により直線近似した場合
320319の続きです。:2011/05/17(火) 17:26:07.78
の傾きと定数項を求めるプログラミングを作成しなさい。
※二つの変数の相関係数を求めて出力しなさい。
[3]環境
[3,1] OS:恐らくWindows7
[3,2] コンパイラ名とバージョン:すいません、わかりません。
[3,3] 言語:C
[4]期限:2011年5月18日10時00分まで

コマンドプロンプトと秀丸を使っています。
321デフォルトの名無しさん:2011/05/17(火) 17:48:41.84
>>319
C/C++の宿題片付けます 147代目
http://hibari.2ch.net/test/read.cgi/tech/1301553333/
322デフォルトの名無しさん:2011/05/17(火) 22:44:41.61
出力をテキストファイルにするコマンドって何でしたっけ?
program.cの計算結果をstdout.txtに出力したい場合どうすればいいですか?

323デフォルトの名無しさん:2011/05/17(火) 22:48:17.07
このスレは捻くれ者ばかりだから
質問は正確にしないと捻くれた回答が来るよ。
324デフォルトの名無しさん:2011/05/17(火) 22:53:08.40
>>320
>コマンドプロンプトと秀丸を使っています。

こんな変な環境を指定してくる奴って何なんだろうな。
Turbo C 2.01 とかを使えば、統合開発環境などもそのまま使えるのに。
325デフォルトの名無しさん:2011/05/17(火) 22:55:22.66
>>323
すいません。

1+2
3×4
5÷1
4-2の
結果をstdout.txtに出力したいです。
326デフォルトの名無しさん:2011/05/17(火) 23:07:33.49
>>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 */
327895の続きです。:2011/05/17(火) 23:15:43.51
>>324
大学で今年から習い始めたばっかで、教師にこれを使うように言われてるんで!
328デフォルトの名無しさん:2011/05/17(火) 23:17:58.10
>>326
ありがとうございます。
329デフォルトの名無しさん:2011/05/17(火) 23:22:45.75
リダイレクトのこと訊きたいんじゃねーの?
330デフォルトの名無しさん:2011/05/17(火) 23:26:29.23
だな
program.exe > stdout.txt
331デフォルトの名無しさん:2011/05/18(水) 00:18:27.37
そもそもどうやって出力しているんだか。これでguiだったら大笑いだな
332デフォルトの名無しさん:2011/05/18(水) 00:20:04.44
そうだね(大爆笑)
333デフォルトの名無しさん:2011/05/18(水) 00:34:49.70
mallocしたあとfreeしますが
ちゃんと開放できたか確認する方法はありますか?
334デフォルトの名無しさん:2011/05/18(水) 00:40:06.83
>>333
環境が判らんので具体的に回答できないから、「メモリリーク 検出」とかでぐぐってみるといいかも
335デフォルトの名無しさん:2011/05/18(水) 00:44:46.73
>>334
ありがとうございます
よさげなサイトがヒットしました
336デフォルトの名無しさん:2011/05/18(水) 07:59:37.77
>switch文 続くのがブロック文でなくてもいいこと。単文、if文、while文などでもいい

単文、if文、while文でもいいと書いてますが、具体的にはどのようなコードになるのでしょうか?

C言語の理解度を突いてみる
http://d.hatena.ne.jp/bellbind/20081105/1225888377
337デフォルトの名無しさん:2011/05/18(水) 08:26:10.28
>>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;
}
// 意味があるかは知らん
338デフォルトの名無しさん:2011/05/18(水) 08:28:38.71
--
switch (argc) while (*++argv) {
==
switch (argc) default: while (*++argv) {
++
339デフォルトの名無しさん:2011/05/18(水) 08:29:59.41
>>337
なるほど。
d
340デフォルトの名無しさん:2011/05/18(水) 08:38:10.06
以下の等式は常に成り立つものなのでしょうか?

(char*)( p + 1 ) - (char*)p == sizeof *p
341デフォルトの名無しさん:2011/05/18(水) 09:35:37.71
>>340
いいえ。
342デフォルトの名無しさん:2011/05/18(水) 09:37:57.67
>>339
>337を見ても判るけど、ブロック化しても書けるのだから素直にブロック化した方がいい。
do whileもそうだね。
343デフォルトの名無しさん:2011/05/18(水) 09:38:43.72
>>341
どのような状況ならば成り立たないのでしょうか?
344デフォルトの名無しさん:2011/05/18(水) 10:16:01.68
例えばpの型が整数型ならエラーだな。
345デフォルトの名無しさん:2011/05/18(水) 11:57:03.91
pの型が少なくとも何かのポインタなら成立する? (配列はエラー:左辺第1項の p+1 で)
346デフォルトの名無しさん:2011/05/18(水) 11:58:16.79
ごめん 配列でもセーフだ p++ が許されないのが配列だた
347デフォルトの名無しさん:2011/05/18(水) 12:26:27.99
(int*) なら +1 すると sizeof (int) だけ増加するぞ。
348デフォルトの名無しさん:2011/05/18(水) 12:46:34.34
っ void*
349デフォルトの名無しさん:2011/05/18(水) 13:20:26.27
>>340は規格スレから来た荒らし
350デフォルトの名無しさん:2011/05/18(水) 14:10:24.94
常にというならオーバーフローの可能性も考えないとな!
351デフォルトの名無しさん:2011/05/18(水) 15:37:12.91
>>349
そのスレ教えてもらえます?
352デフォルトの名無しさん:2011/05/18(水) 15:42:53.87
353デフォルトの名無しさん:2011/05/18(水) 16:08:32.68
不動小数点数ってループしますか?

double d = 1.0;
whle (1) d+=1.0;

これで元の数に帰ってきますか?
354デフォルトの名無しさん:2011/05/18(水) 16:10:10.05
>>353
大抵はinfになる
355デフォルトの名無しさん:2011/05/18(水) 16:43:47.88
>>353
情報落ちでどこかで増加が止まる

http://ja.wikipedia.org/wiki/%E8%AA%A4%E5%B7%AE#.E6.83.85.E5.A0.B1.E8.90.BD.E3.81.A1

ここを参照
356デフォルトの名無しさん:2011/05/18(水) 17:05:45.17
>>354>>355が本気で殴り合ったらどっちが勝つか以前に悲しい
357デフォルトの名無しさん:2011/05/18(水) 18:47:24.61
C言語で「ポインタがわかる」って具体的にどんなプログラムが組めることをいいますか?
単方向のリストは何も見ずに作れるようになったんですけれど、使いこなせているとは思えません。
自分のレベルが今どれくらいなのかや今後どのような練習をしていけばいいのかがいまいちわかりません。
今会社のほうで研修をやっているのですが、大学時代にCを勉強したこともありほとんどわかってる内容だったので。
358デフォルトの名無しさん:2011/05/18(水) 18:50:10.14
>>357

argvの引数文字列が自在に扱える、なんてのはどお?
359デフォルトの名無しさん:2011/05/18(水) 19:13:08.00
んなこと気にせず必要なもの作っていけばいいんだよ。
必要なものが必要な通りに作れれば、わかってるとか、わかってないとか
そんなものどうでもいいだろ。
360デフォルトの名無しさん:2011/05/18(水) 19:15:57.00
>>357
とりあえず巷で見かけるアルゴリズムは一通り自作してみたかい?
構造体ポインタは?コールバック関数(関数ポインタ)は?
このあたりまでできればもう覚える段階じゃない。いかに組み合わせて構想を実現するかだ。
361デフォルトの名無しさん:2011/05/18(水) 20:09:24.81
>>353

元の数に帰ってきた ^^;

double d = 1.0;
whle (1) *(char*)&d+=1.0;
362デフォルトの名無しさん:2011/05/18(水) 20:13:16.95
コンパイルできなかった ^^;;;
363デフォルトの名無しさん:2011/05/18(水) 20:14:13.15
>>357
問題集買え
364デフォルトの名無しさん:2011/05/18(水) 21:02:25.71
実行時に動的リンクされるプログラムでの、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の場合において。
365デフォルトの名無しさん:2011/05/18(水) 21:31:22.74
スレタイ読め
366デフォルトの名無しさん:2011/05/18(水) 21:52:23.87
>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
なぜ関数の宣言と定義を分けて別々のところに書く必要があるんですか?
368デフォルトの名無しさん:2011/05/18(水) 22:22:14.15
>>367
現時点で必要と思えないなら、知る必要もない
369デフォルトの名無しさん:2011/05/18(水) 22:27:08.02
>>368
カスは失せな
370デフォルトの名無しさん:2011/05/18(水) 22:29:34.65
自然数nに最も近い素数を求めるアルゴリズムを考えてくれ
371デフォルトの名無しさん:2011/05/18(水) 22:30:39.46
>>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
>>368
なるほどわかりました
373デフォルトの名無しさん:2011/05/18(水) 22:31:30.26
>>367
「ソースレベル・リンク・システム」おすすめ。
374デフォルトの名無しさん:2011/05/18(水) 22:59:31.82
375デフォルトの名無しさん:2011/05/18(水) 23:10:21.72
>371
そりゃライブラリの設計がおかしいよ。

ライブラリは再利用ができるモジュールであるはず。
それがmainを持っているっていうのは、ファイルとして分かれているだけで
ライブラリとしての再利用性は無いに等しいじゃん。

>a.c側にmain()を持ってくる大改造は避けたかったのですが、他に方法が無いようなのでがんばります。
メインを移すだけでいいならそんな大改造でも無いと思うが。
ファイルスコープ変数が大量にあって、mainで見えるように穴をあけるのが大変、というのなら、
ライブラリの意味ないから、一本の実行ファイルにしてしまえばいいじゃん。
376デフォルトの名無しさん:2011/05/18(水) 23:36:10.41
>>371
美しさ云々はさておき最小の改造で済ませるなら、
b.c の main を mymain に改名して、a.c に mymain を呼ぶ main を作る
じゃダメ?
377デフォルトの名無しさん:2011/05/19(木) 00:09:28.98
>>375
>>ライブラリの設計がおかしい
そんなこと言われてもこまります。
自分はlinuxに移植するだけで、もともとの設計者は別人ですので…

動的ライブラリーにしたいのは、ライセンスの絡みが理由です。
移植の際にgtk+2というライブラリーを使うので、これはLGPLというライセンスなので、
非GPLと静的リンクしてしまうと、非GPLとして発表することでライセンス違反になってしまうのですが、動的リンクなら違反にならないので。
分ける理由はそういう政治的な理由です…orz

>>376
過去のソースも無改造で同様に動作する。という縛りがあるので、
たとえば a.c は、まったく同じソースコードのままでなければならない(一字一句同じ) という縛りがあります。
なので、a.cに直接mainを追加で書いたりはできないんです。
#includeされるライブラリーヘッダー内に、なんとかa.cソース内にmain()を追加する仕掛けを書いて対応しようかと思ってます…orz
378デフォルトの名無しさん:2011/05/19(木) 00:14:50.42
>>377
なんか言ってること矛盾してない?後出し満載なので、これ以上は付き合わないけどね、おやすみ

> a.c側にmain()を持ってくる大改造は避けたかったのですが、他に方法が無いようなのでがんばります。

> たとえば a.c は、まったく同じソースコードのままでなければならない(一字一句同じ) という縛りがあります。

379デフォルトの名無しさん:2011/05/19(木) 00:20:23.10
>>377
b.cを動的リンクにしたいという動機はそのライセンスのせい?にしても筋が通らないように見えるけども。
エントリポイント変えてc.cにエントリポイント書いて、b.cのmain呼べば?
380デフォルトの名無しさん:2011/05/19(木) 00:47:37.61
>>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にできるし。
381デフォルトの名無しさん:2011/05/19(木) 16:35:56.46
fgetsをfopen、fread、fcloseの3つで代用するにはどうすればいいのでしょうか。
382デフォルトの名無しさん:2011/05/19(木) 16:46:32.96
HAHAHAww
383デフォルトの名無しさん:2011/05/19(木) 16:49:36.25
fgetsは改行コードで読み込みをとめる。
違う文字で止めてほしかったから実装例が知りたいんです。
384デフォルトの名無しさん:2011/05/19(木) 16:51:34.17
>>383
fscanf 使うのが楽
385デフォルトの名無しさん:2011/05/19(木) 17:02:00.20
キーボードの入力の改行までっていうのはドライバーの仕様だから
それを変えたいなら raw モードにするといいよ。
Win 環境なら getche() を使うといいかな。
386デフォルトの名無しさん:2011/05/19(木) 18:16:59.14
char*str
str="YAMDA";

としてmallocで新たに取得した領域にYAMADAが確保されるにはどうしたらいいですか?
正しstrcpyなど文字列コピー関数は使わない事。

char*ptr

ptr=mallocです。
387デフォルトの名無しさん:2011/05/19(木) 18:22:43.57
>>386
マジな質問なら、strcpy()を使えない理由を頼む。
宿題か何かなら、一文字ずつコピー。
パズルなら、構造体の代入を利用。
388デフォルトの名無しさん:2011/05/19(木) 19:46:41.45
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
389デフォルトの名無しさん:2011/05/19(木) 19:50:54.27
なんの冗談だよw
390デフォルトの名無しさん:2011/05/19(木) 19:55:24.07

int a, b;
void ooikiku(int &a, int &b);

void ooikiku(int &a, int &b)
{
...
}
391デフォルトの名無しさん:2011/05/19(木) 19:56:46.92
>>388
ちゃんと関数呼び出してください
392デフォルトの名無しさん:2011/05/19(木) 20:00:25.15
scanf("%d %d",&a,&b);
call( 関数 );
関数を呼び出すcallを作れば良いよ
393デフォルトの名無しさん:2011/05/19(木) 20:05:53.01
つーかコンパイラエラーだろ
394デフォルトの名無しさん:2011/05/19(木) 20:05:55.60
int &a; って表記はムカつくよな。
&a が int にならないし。
こういうクソ仕様決めるようなアホが
int* a; なんて書き方して喜んでるんだろうな。
395デフォルトの名無しさん:2011/05/19(木) 21:05:34.73
>>386
環境依存だけど、strdupは
396デフォルトの名無しさん:2011/05/19(木) 22:11:33.41
>394
C++の話はC++のスレで。
397デフォルトの名無しさん:2011/05/19(木) 22:21:21.30
>>388に言えよ
398デフォルトの名無しさん:2011/05/20(金) 13:16:39.27
ローカル変数へのポインタを返しちゃダメって言うのは分かるんだけど、
これもやっぱりダメですか?

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");

}

399デフォルトの名無しさん:2011/05/20(金) 13:21:41.82
ダメじゃない
400デフォルトの名無しさん:2011/05/20(金) 13:22:12.24
>>398
やってること自体は問題ない
だが
>ローカル変数へのポインタ
この意味を全く理解はできていないな

お前が返してるのはローカル変数の値だ
401デフォルトの名無しさん:2011/05/20(金) 13:26:30.40
あ、確かにそうですね!
納得しました。

返すのがポインタなのでちょっとびくびくしてました・・・
402デフォルトの名無しさん:2011/05/20(金) 15:41:40.39
しかし、ポインタで遣り取りする理由の判らんI/F仕様だな。
403デフォルトの名無しさん:2011/05/20(金) 16:48:10.86
「通」まで読み込むと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);
}
404デフォルトの名無しさん:2011/05/20(金) 16:53:49.16
TとWを混ぜるんじゃねーよバカ。
405デフォルトの名無しさん:2011/05/20(金) 17:01:02.97
スレ投稿用に関数化しただけだろうし別によくね

wint_t → _TINT
WEOF → _TEOF

こうしても無理だろ
406デフォルトの名無しさん:2011/05/20(金) 17:31:33.35
クソきめえコードだな。
最初から書きなおせよ。
407デフォルトの名無しさん:2011/05/20(金) 17:53:14.64
やってみたけどバイナリで読むしかないんじゃないか?

#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);
}
408デフォルトの名無しさん:2011/05/20(金) 17:56:43.41
>void main(void)

> char ch = 0;
> while((ch = fgetc(fr)) != EOF) {
409デフォルトの名無しさん:2011/05/20(金) 18:03:29.97
>void main(void)

main を void 型にしないこと。

> char ch = 0;

無意味な初期化はしないこと。

> while((ch = fgetc(fr)) != EOF) {

fgetc の返り値を char 型で受けとらないこと。
410デフォルトの名無しさん:2011/05/20(金) 19:15:07.61
直しても無理だな

UnicodeとUTF-8は"r, ccs=UNICODE"と"r, ccs=UTF-8"でやってるんだろうか
411デフォルトの名無しさん:2011/05/20(金) 19:17:29.46
何回も使う関数の中で、一回関数が呼び出されるたび一回だけ
使用する配列はどう定義したらいいですか?
412デフォルトの名無しさん:2011/05/20(金) 19:24:35.80
特に大きいわけじゃないなら普通に自動変数で
413デフォルトの名無しさん:2011/05/20(金) 19:39:34.89
>>403
通でEOF(エラーではなくファイル終了)が返るな
やっぱバイナリじゃないだろうか
414デフォルトの名無しさん:2011/05/20(金) 20:25:30.45
>>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))
はどうなんですか?
416デフォルトの名無しさん:2011/05/20(金) 21:01:11.10
文字と文字のスペースをあけるって何ていうんだけ?改行じゃなくて・・
まぁ
tablenoteじゃなくて

tabel noteとしたいです。同じ行です。

どうしたらいいですか?
改行の場合は\nでしたよね。
417デフォルトの名無しさん:2011/05/20(金) 21:04:58.69
>>415
if( a = 1 ) って書き間違えたときに if( 1 = a ) ならエラーにしてくれるから癖にしておくといいよってことだろ
if( a == b ) とかの場合だと入れ替えても意味がないけど。
418デフォルトの名無しさん:2011/05/20(金) 21:11:08.23
http://bellard.org/jslinux/
これで getch() や kbhit() 的な関数って、どうやってプログラムすればできる? だれかソースよろ

ちなみにコンパイルは tcc hello.c で ./a.outが実行ファイルになる
419デフォルトの名無しさん:2011/05/20(金) 21:14:17.26
>>418
それ凄いよな
emacs立ちあがったとき感動したw
420デフォルトの名無しさん:2011/05/20(金) 21:18:28.84
>>416
\x20
421デフォルトの名無しさん:2011/05/20(金) 21:19:13.77
バッファオーバーランの実例があった。
http://nico.ms/sm14500277
解説は13分過ぎ辺りから。
422デフォルトの名無しさん:2011/05/20(金) 21:20:02.51
>>415
>if (1==a)
悪しき習慣だ。「1がaに等しかったら」なんて普通の思考じゃない。
思考過程をなぞって「aが1に等しかったら」つまり、a == 1 とするべきだ。
これを強要されるような環境だと、形式主義に陥りがちだから他にも変な習慣があるに違いない。

>if (!(a-1))
判り難い上に定数前置のような微かなメリットもない。従って、スタイルとしては論外。
423デフォルトの名無しさん:2011/05/20(金) 21:21:09.42
>>416
何がしたいんだ? 文字列リテラル中に空白を置きたいだけならそのまま書けばいい。
424デフォルトの名無しさん:2011/05/20(金) 21:23:22.02
だな
if( a = 1 ) とした(間違った)ときにワーニングが出るようにして、注意深く精査すべき
425デフォルトの名無しさん:2011/05/20(金) 21:24:15.54
>>415
まちがえて
==
ではなく
=
って書いちゃったときに、コンパイルエラーが出るから安全(?)って理由が主でしょ。

たとえば
if(a = 1)
ならコンパイル通るけど

if(1 = a)
ならエラー(定数への代入でエラー)になるから、いろいろ捗るってことだと思う。
426デフォルトの名無しさん:2011/05/20(金) 21:25:26.71
windows.hってどこで手に入れたらいいん?
427デフォルトの名無しさん:2011/05/20(金) 21:28:07.05
自分で作れ
428デフォルトの名無しさん:2011/05/20(金) 21:28:44.48
>>426
VC++かMinGW
MinGWのはどこまで互換性があるか知らんけど
429デフォルトの名無しさん:2011/05/20(金) 21:30:04.23
間違えて = にして痛い思いをすると、二度としなくなる。
430デフォルトの名無しさん:2011/05/20(金) 21:41:20.73
if( a = 1 )
これがコンパイルできないようにするのがよりよい
431デフォルトの名無しさん:2011/05/20(金) 21:42:56.62
Cの規格に何一つ違反してないものをコンパイルできなくするとかw
432403: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」として認識されるため
って言うことでした

お騒がせしました
433デフォルトの名無しさん:2011/05/20(金) 21:53:27.79
訳も分からないままTCHAR使うのはやめたほうがいいね
434デフォルトの名無しさん:2011/05/20(金) 21:54:32.64
>>431
俺バカなんでバカよけ仕込んどかないとだめなんよ
435デフォルトの名無しさん:2011/05/20(金) 21:55:40.36
>>434
お前を除くのが一番いいんじゃね
436デフォルトの名無しさん:2011/05/20(金) 21:56:04.80
俺も>>429と違ってバカだから今まで何回同じミスしたことか・・・
437デフォルトの名無しさん:2011/05/20(金) 21:56:17.06
>>435
いつも使ってるコンパイルスイッチ教えて
438デフォルトの名無しさん:2011/05/20(金) 21:57:28.21
ちゃんとしたコンパイラなら警告出るでしょ。
439デフォルトの名無しさん:2011/05/20(金) 21:57:34.90
>>436
俺と同じくらいバカなら Wall Werrorは最低限やっとくといいよ。なんど救われたかわからん。
440デフォルトの名無しさん:2011/05/20(金) 21:57:59.54
>>436
えてして痛みって時間経過で消えてしまうんだよな
そのたびに、新鮮な気持ちで間違えるw
441デフォルトの名無しさん:2011/05/20(金) 22:00:46.39
>>431,435は素人さんなんじゃないかな。
もしくはほんとにミスをしない人。
でも後者ならこんなとこでくだまいてないから……ね。
442 [―{}@{}@{}-] デフォルトの名無しさん:2011/05/20(金) 22:02:25.70
VCだと警告出るけどgccだと出ないよね
443デフォルトの名無しさん:2011/05/20(金) 22:10:09.32
へぇ
444デフォルトの名無しさん:2011/05/20(金) 22:12:19.96
>>441
つまり自称玄人はコンパイラの出す警告なんて無視するってことかなw
445デフォルトの名無しさん:2011/05/20(金) 22:15:31.09
gcc -Wall -Wextra
これで出なきゃ諦めろw
446デフォルトの名無しさん:2011/05/20(金) 22:15:42.70
コンパイラのご機嫌伺いなんて素人のすること
プロにとってコンパイルエラーはコンパイラのバグ
447デフォルトの名無しさん:2011/05/20(金) 22:19:21.54
double型で精度を良くしたい場合どうしたらいいでしょうか?
448デフォルトの名無しさん:2011/05/20(金) 22:22:42.34
>>444
なんで警告無視することになってんの?

>>442
gccは -Wparentheses で。(-Wallに含まれる)
VCもスイッチなしなら警告でない。
かといってWallつけるとstdio.hの中で警告が出る問題を抱えてる
449デフォルトの名無しさん:2011/05/20(金) 22:24:05.53
> stdio.hの中で警告が出る問題
そうなんだ
そうなんだ
450デフォルトの名無しさん:2011/05/20(金) 22:28:07.67
プロにとってシンタックスエラーはパーサのバグ
451デフォルトの名無しさん:2011/05/20(金) 22:29:01.01
そんなに=にするミス頻発するならマクロで
#define EQ(A, B) ((A) == (B))
でも定義しろよw
452デフォルトの名無しさん:2011/05/20(金) 22:29:09.90
QZは糞って書いてる人か
453デフォルトの名無しさん:2011/05/20(金) 22:29:22.81
Wno-system-headers じゃダメか?
454デフォルトの名無しさん:2011/05/20(金) 22:29:55.35
入門編スレでそんな事どうでもいい
455デフォルトの名無しさん:2011/05/20(金) 22:31:10.27
そんなマクロ書くとかどうかしてる
456デフォルトの名無しさん:2011/05/20(金) 22:34:11.90
>>453
伝わりにくくてすまん。clだと警告が出る。

>>454
入門者こそ警告が沢山でる設定にすべきだと思わない?
457デフォルトの名無しさん:2011/05/20(金) 22:38:50.70
定数左に書かなきゃいけないほど==と=を取り違える人間が、
変数同士のときは==と=取り違えないとは思えない
458デフォルトの名無しさん:2011/05/20(金) 22:39:35.97
>>456
>入門者こそ警告が沢山でる設定にすべきだと思わない?

同意。出された警告の意味をちゃんと分かって欲しいよね
459デフォルトの名無しさん:2011/05/20(金) 22:45:53.68
>>447
・可能な限り誤差を抑えられるよう工夫して計算方法を変える
・double型をあきらめて他の方法を考える
460デフォルトの名無しさん:2011/05/20(金) 23:14:11.34
>>459
%eの後ろに付ける桁数調整の記号とかは何の役割なんですか?
461デフォルトの名無しさん:2011/05/20(金) 23:16:33.28
>>460
doubleが記憶している本物の値のうち何桁まで表示するかを指定する
462デフォルトの名無しさん:2011/05/20(金) 23:18:38.43
>>460
%eの後ろに付けれるものなんかあったっけ?
463デフォルトの名無しさん:2011/05/20(金) 23:20:56.11
元々の演算結果が解析解と一致しているかどうかは関係なしに
(文字列化の際の)表示桁の調整してるだけ。

精度・誤差 ≒ 解析解との違い
464デフォルトの名無しさん:2011/05/20(金) 23:22:41.59
>>461
桁数調整記号つけないとどうなるんですか?
またつけるときの例を教えてください。
465デフォルトの名無しさん:2011/05/20(金) 23:38:05.56
じゃぁ処理系によってdoubleの掛け算の結果を同じ桁で表示させても
違ってくるんですか?
466デフォルトの名無しさん:2011/05/20(金) 23:42:08.68
表示桁にもよるが十分にありえる話
467デフォルトの名無しさん:2011/05/20(金) 23:47:44.03
>>466
double型って何桁まで表示できるんですか?

468デフォルトの名無しさん:2011/05/20(金) 23:53:04.56
型が表示してるわけじゃない
469デフォルトの名無しさん:2011/05/20(金) 23:53:43.34
さあ? どこまで出せるか試したことないし

整数部が1で少数部の4桁目〜5桁目で食い違った系は経験したことがある
470デフォルトの名無しさん:2011/05/20(金) 23:54:37.36
>>469
e--
以下の部分が全然違う事があるんですが。
471デフォルトの名無しさん:2011/05/20(金) 23:57:38.65
>>467
2進数で53ビットだから、10進で9007199254740992なので15~16桁が有効桁数かな
472デフォルトの名無しさん:2011/05/21(土) 00:04:35.63
その15~16桁ってのは
小数点以下のことですか?
473デフォルトの名無しさん:2011/05/21(土) 00:07:04.23
>>472
「浮動」小数点の意味がわかってないのか?
474デフォルトの名無しさん:2011/05/21(土) 00:10:51.00
>>473
どういう意味ですか?
475デフォルトの名無しさん:2011/05/21(土) 00:10:55.57
>>471
素朴な疑問

double が IEEE754 基数2 として実装されてて、
保持されてるそれが 10進の値で循環小数になるようなのは
printf やそれに類する文字列化関数でいくらでも文字を並べることが可能なのだろうか?
476デフォルトの名無しさん:2011/05/21(土) 00:11:20.53
むり
477デフォルトの名無しさん:2011/05/21(土) 00:19:56.47
>>475
確か256バイト制限かなにかがあったんじゃなかったかな?
異常値が来ると怖いから、%fはそのままでは殆ど使わなくなったから用ないけど。
たとえば、
void func(double val)
{
char buf[100];
sprintf(buf, "%f", val);
}
なんて関数があったとして、func(1e100)なんてした日には。
478デフォルトの名無しさん:2011/05/21(土) 00:29:43.15
>>474
ある数字の適当なところに小数点をつけて表現するから浮動
有効桁数が8けただとすると、12345678は表現できるけど、123456789は表現できない

で、12345678の適当なところに小数点をつけて表現できるので
0.000012345678 も 1234.5678 も 1234567800000000.0も表現できる
けど、1234567800000000.0 に 1.0を足そうとしても、有効桁数の範囲で収まらないので、消える
479デフォルトの名無しさん:2011/05/21(土) 00:34:56.62
>>475
2進数から10進数への変換は常に有限
循環小数にはならない
480デフォルトの名無しさん:2011/05/21(土) 00:43:14.64
>>479
ありゃ 俺の勘違いなのかな。

基数2での可数部の値の表現を確認してみるー
481デフォルトの名無しさん:2011/05/21(土) 00:48:08.18
>>479
ん?それ整数の時だけだろ
482デフォルトの名無しさん:2011/05/21(土) 01:03:17.11
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で割るたびに桁が増えていくだけで無限にはならない
483デフォルトの名無しさん:2011/05/21(土) 01:12:41.73
循環したような気がして思い出してみたが
思い出したのは0.1(10進)が2進では循環することだった
484デフォルトの名無しさん:2011/05/21(土) 07:30:16.09
ゼロからソースを書いてオリジナルOSを作ってみたいんだけど、どれくらいのC言語の実力があればいいと思う?
一応、縦シューティングなんかはよく作るんだが
485デフォルトの名無しさん:2011/05/21(土) 07:38:50.87
>>484
ブートとかでアセンブラの知識がいるだろう
そのほかの部分でもレジスタ直接たたいたりする低級なところの知識が要る
Cの知識はプログラム書ければ問題ない
486デフォルトの名無しさん:2011/05/21(土) 07:42:18.84
>>484
こんなところで聞いてる時点でお前の実力じゃ無理。
487デフォルトの名無しさん:2011/05/21(土) 07:56:31.16
>>484
作り始めの時点でC言語知識無しの
ひげぽんが作れたからやる気の問題だろ
488デフォルトの名無しさん:2011/05/21(土) 11:22:28.84
C言語で座標上の点を考えて図形の面積を考察するという問題があるのですが
この場合doubleかfloatどっちが有効ですか?
489デフォルトの名無しさん:2011/05/21(土) 14:01:33.29
許容誤差による
long double でさえダメな可能性あり
490デフォルトの名無しさん:2011/05/21(土) 14:28:32.30
>>489
精度がいいほうがいいです。
long double とdoubleだと
long doubleを使うにこしたことないんですか?
491デフォルトの名無しさん:2011/05/21(土) 14:41:48.55
typedefとdefineでは書き順が逆なのはなぜですか?
typedef int INT
define INT int
492デフォルトの名無しさん:2011/05/21(土) 14:48:55.94
どなたか教えて下さい。
行列のサイズを2または3を選択させ、その行列を表示しその行列式を計算するプログラムを作れって問題です。
どなたかお願いします。
493デフォルトの名無しさん:2011/05/21(土) 15:24:12.94
>>492
宿題スレへでも。

>>491
目的が違うから構文が違うのも無辺なるかな。

>>490
long doubleを使うべきならその通りだが、大抵の用途ではdoubleで充分かlong doubleでも不充分だろう。
用途をはっきりさせたまえ。
494デフォルトの名無しさん:2011/05/21(土) 15:32:05.48
無辺なるかなw
495デフォルトの名無しさん:2011/05/21(土) 15:58:40.58
>>493
単に学校の演習です。
精度が良ければいいにこしたことないけど、大規模な事をするわけでも
ありません。
496デフォルトの名無しさん:2011/05/21(土) 16:41:06.33
浮動小数は精度のための規格じゃないよ。
497デフォルトの名無しさん:2011/05/21(土) 16:45:04.86
ちょっと何言ってるかわかりません
498デフォルトの名無しさん:2011/05/21(土) 16:48:51.24
有効桁数のことをいってるんだよ
499デフォルトの名無しさん:2011/05/21(土) 16:52:43.13
>>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;
を起こしているのに・・
502デフォルトの名無しさん:2011/05/21(土) 17:55:52.41
>>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
503デフォルトの名無しさん:2011/05/21(土) 17:57:50.40
略のところで1にしちゃってるんだろ。
504デフォルトの名無しさん:2011/05/21(土) 18:48:50.98
sinやtanなどの三角関数はラジアンで入力、出力されるのですか?
自分の電卓では弧度法なんですよ。
505デフォルトの名無しさん:2011/05/21(土) 18:56:01.71
自分で調べればわかる範囲は自分でやれよ
506デフォルトの名無しさん:2011/05/21(土) 19:46:10.00
変換すりゃいいだろが。
ちょっと掛け算するだけだろ。
507デフォルトの名無しさん:2011/05/21(土) 20:04:09.78
三角関数はラジアンで「出力」とか言っちゃってる奴はスルーしなよ
508デフォルトの名無しさん:2011/05/21(土) 20:14:32.09
大人だったら善意に解釈して逆三角関数も含めてあげなきゃ
509デフォルトの名無しさん:2011/05/21(土) 20:25:00.16
助けて下さい・・・2年連続で単位落としてるんです。
3年連続で単位は落としたくないです。

昨日のdoublenの質問をしたものですが、座標上の値をdoubleで表現すると
1.23200e-16
みたいになってしまいます・・・
僕的には0,323みたいに
このeみたいなのがつかない表示がしたいです。
どうしたらいいですか?
もう頭がおかしくなりそうです。
510デフォルトの名無しさん:2011/05/21(土) 20:28:05.44
>>509
double x;
printf("%f\n", x);

あと、http://hibari.2ch.net/test/read.cgi/tech/1305867431/ というスレがある。
511509:2011/05/21(土) 20:30:43.53
>>510
fはfloat型じゃないのでしょうか?
eはdouble型でしょう?
助けて下さい・・

3年の時点で単位30個です・・・
ほとんど留年決定してますが。
プログラミングの授業が出来なくて、簡単なほかの授業のテスト勉強も
ままならず単位落としてしまってる状況です。
512デフォルトの名無しさん:2011/05/21(土) 20:38:34.97
%f %e %g は全部 double
printf に渡すとき float は自動的に double に格上げされるので float の変換指定子は無い
513デフォルトの名無しさん:2011/05/21(土) 20:44:44.18
>>511
具体的な問題を先入観抜きでアップせよ。
よけいなバイアスがかかっていてこちらには伝わってこない。

※ %e は、浮動小数点式の表示方法、%f は固定小数点式の表示方法を指定する
※ %e や %f の表示対象は浮動小数点数、つまり double か float
※ %f は double でも float でも OK。printf() は可変長引数だから、結局は double に変換される。
※ float と double の違いは、変数のサイズ。その結果が精度や表現可能な数の範囲にも反映される。
514509:2011/05/21(土) 20:54:37.38
>>513
ありがとうございます・・
floatとdoubleの違いが全く分かりません
515デフォルトの名無しさん:2011/05/21(土) 21:03:42.60
どうせだから3年連続で落としておけよ。
516デフォルトの名無しさん:2011/05/21(土) 21:25:59.87
30桁の整数の積を表示するにはどうしたらいいですか
517デフォルトの名無しさん:2011/05/21(土) 21:29:31.45
暗算
518デフォルトの名無しさん:2011/05/21(土) 21:32:58.23
その前にどうやって計算させたんだ?
計算ができてりゃ表示なんて簡単だろ
519デフォルトの名無しさん:2011/05/21(土) 21:33:05.35
>>516
積を文字列として入力してもらい、printf()などで表示。
520デフォルトの名無しさん:2011/05/21(土) 21:41:49.89
>>518
計算もしてください
521デフォルトの名無しさん:2011/05/21(土) 21:47:49.22
>>5
522513:2011/05/21(土) 22:04:50.24
>>514
float は(環境にもよるが普通) 4バイトで実数を表現する。
double は 8バイトで実数を表現する。
おのずと、double のほうが表現できる範囲が広くかつきめ細かく表現できる。
そのかわり float のほうが、サイズが小さい分、限られたサイズのなかでは多くの実数を格納でき、(一般的には)演算が速い。
要は用途にあわせて一長一短になるといってよい。

演習レベルでは double にしておくのが無難である。 C の関数によっては float を double に変換して処理するものがある。
例:printf()


523デフォルトの名無しさん:2011/05/21(土) 22:11:34.92
>>516
http://hibari.2ch.net/test/read.cgi/tech/1301553333/668
20桁同士用に調整していますので、30桁の場合には、このままではオーバーフローします。
宿題スレに書式を整えて依頼していただければ、きちんと検証したコードをアップロードできるかもしれません。
524509:2011/05/21(土) 22:56:23.18
>>522
ありがとうございます。

多くの実数を格納できるという意味がよくわかりません。
どういうことですか?
525デフォルトの名無しさん:2011/05/21(土) 23:04:55.22
>>509
卒業まであと何年掛かるのか?
卒業してどういう仕事に付きたいのか?
今やっていることは仕事に直結させたいのか?


おそらく決定的に向いていないと思うので、
さっさと学校辞めて高卒資格の公務員にでもなった方がいいよ。
526デフォルトの名無しさん:2011/05/21(土) 23:11:22.90
高卒程度の公務員は20歳までの年齢制限です
527デフォルトの名無しさん:2011/05/21(土) 23:37:40.55
>>526
じゃあもうアウトなんだなw
>>509は派遣労働者確定ですかwww
色々渡り歩いて仕事が辛くない&正社員登用している工場探した方がいいな。
大手だと残業夜勤で中小の大卒よりもいい思いできるからな。
一生フリーターより断然いい。
528509:2011/05/21(土) 23:50:47.23
>>527
黙ってろ。どうせアドバイスするつもりもねーんだろ。
>>522
とりあえずdouble使ってみます。
floatだと小数点表示がわかりやすい気がするのですが・・
529509:2011/05/21(土) 23:55:11.34
すいません、言い過ぎました。
ただ煽らないでください。そういったら煽るんでしょうけど。
530デフォルトの名無しさん:2011/05/22(日) 00:00:06.82
>>524
単に、同一サイズの領域の中に変数を詰め込む場合、float の方が double の倍詰め込むことができる、位の意味です。
実用的には、float の方が演算が速い、というのが大きいようです。(cuda とか。まだやったことないけどいずれは‥‥)
531522,530 ◆QZaw55cn4c :2011/05/22(日) 00:01:36.48
>>529
煽りは 2ch の華ですからねえ。つhttp://hibari.2ch.net/test/read.cgi/tech/1295273862/
532デフォルトの名無しさん:2011/05/22(日) 00:18:45.49
>>531
相変わらず見当違いのレス乙。
floatが速いなんて、それなりの知識がないと応用できないようなこと初心者に言うな。
自分自身だって判ってないじゃないか。
それと、printf()がfloatをdoubleに変換するわけじゃない。
つーか、いい加減既にないスレのリンクなんか書いてないで布団被って寝ろ。
533デフォルトの名無しさん:2011/05/22(日) 00:35:07.30
公務員はもうオワコン。
これからはブラジルで農業がアツい。
534デフォルトの名無しさん:2011/05/22(日) 00:40:05.89
>>532
>floatが速いなんて、それなりの知識がないと応用できないようなこと初心者に言うな。
それは >>530 で私自身も認めていることであるし、あらためて言われてもねえ。

>それと、printf()がfloatをdoubleに変換するわけじゃない。
それも >>513 できちんと書いておきました。なんなら IEC/ISO 9899:1999 の該当場所でも引用しますか?

最終的に >>522 で 私自身の意見として double を勧めていますが、それでもご不満?
535デフォルトの名無しさん:2011/05/22(日) 00:44:15.56
なんであれほどの頭の悪さで、他人の質問に答えられるとか思うんだろう
536デフォルトの名無しさん:2011/05/22(日) 01:53:02.80
俺に言わせりゃ>>532も目くそ鼻くそを笑うだなw
537デフォルトの名無しさん:2011/05/22(日) 01:57:25.80
>>536
ほう、では >>529 に対してさぞかしすばらしい、いや妥当な回答をかけるというわけですね。期待しています。
538デフォルトの名無しさん:2011/05/22(日) 02:17:35.29
また◆QZaw55cn4cが荒してんのか
539デフォルトの名無しさん:2011/05/22(日) 02:20:58.30
>>534
>実用的には、float の方が演算が速い
そもそも、それ自体が一般的ではない。

>可変長引数だから、結局は double に変換される
だから、それはprintf()が行なうのではない。

やっぱり判ってないじゃないか。
540デフォルトの名無しさん:2011/05/22(日) 02:29:19.43
◆QZaw55cn4cは糞
541デフォルトの名無しさん:2011/05/22(日) 02:43:11.79
CPUに載っているかいないか、どういう実装なのかだけの話なのに
何キリキリしてんだよ。
542デフォルトの名無しさん:2011/05/22(日) 03:09:26.58
C言語使い==キチガイだからね
543デフォルトの名無しさん:2011/05/22(日) 03:35:01.67
そういう用途で "==" を使う馬鹿って後を断たないよな。
これ、
1 == 0
と書いたって別に間違いじゃないんだぞ?

意味解ってやってんのか?
544デフォルトの名無しさん:2011/05/22(日) 03:45:33.62
>>543
屁理屈はどうでもいい
545デフォルトの名無しさん:2011/05/22(日) 04:35:09.53
◆QZaw55cn4cは糞
546デフォルトの名無しさん:2011/05/22(日) 09:35:26.63
545 ていうのは、いつどのスレでQZにいじめられたんだ?
547デフォルトの名無しさん:2011/05/22(日) 09:44:49.80
それを言うなら "C言語使い"=="キチガイ" だが常に偽だなw
548デフォルトの名無しさん:2011/05/22(日) 11:23:23.93
>>547
◆QZaw55cn4c == キチガイ は常に真
549デフォルトの名無しさん:2011/05/22(日) 11:55:11.63
550デフォルトの名無しさん:2011/05/22(日) 12:42:17.81
自作ヘッダ内で例えば、int tokubetu;と宣言されていたら
あるプログラムファイル上でそのヘッダをインクルードする場合
main関数内でint tokubetu;と宣言するのはだめなのでしょうか?
551 ◆/91kCCQXBo :2011/05/22(日) 12:48:34.81
インクルードしているのを自前で展開してみるとわかる。
#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;
552デフォルトの名無しさん:2011/05/22(日) 12:51:35.00
問題ない。

int a;
int main(){
 int a;
 {
  int a;
  {int a;}
 }
 return a;
}
いくつでも書ける。
553デフォルトの名無しさん:2011/05/22(日) 12:53:24.58
>>551
読解力ねえなw
554デフォルトの名無しさん:2011/05/22(日) 12:58:54.84
ヘッダファイル内で宣言されたint型の変数などは
外部変数と呼ばれるんですか?呼ばれないのでしょうか?
555 ◆/91kCCQXBo :2011/05/22(日) 13:11:31.74
それも、インクルードしているのを自前で展開してみるとわかる。
556デフォルトの名無しさん:2011/05/22(日) 13:19:56.93
終了しないことが前提の関数のテストになにを使っていますか?
557 ◆/91kCCQXBo :2011/05/22(日) 13:35:38.35
>>556
英語でOK!
558デフォルトの名無しさん:2011/05/22(日) 13:47:42.92
while(1)の中でbreak;を使ってもいいですか?
559デフォルトの名無しさん:2011/05/22(日) 13:50:51.97
>>558
それだけはやってはならない
560デフォルトの名無しさん:2011/05/22(日) 13:53:53.48
>>559
何故でしょうか?
while(1)から抜ける条件としてはbreak;以外にありますか?
561デフォルトの名無しさん:2011/05/22(日) 13:56:19.58
>>560
return
562デフォルトの名無しさん:2011/05/22(日) 13:56:31.44
goto
563デフォルトの名無しさん:2011/05/22(日) 13:58:20.90
longjmp
564デフォルトの名無しさん:2011/05/22(日) 13:59:40.75
exit()
565デフォルトの名無しさん:2011/05/22(日) 14:01:32.87
>>561
何故やったらいけないのですか?
while(1)
{

break;
}
だめですか?
566デフォルトの名無しさん:2011/05/22(日) 14:03:34.54
>>565
なんで質問しようと思ったの?
567デフォルトの名無しさん:2011/05/22(日) 14:13:06.15
>>557
無限ループで戻らない関数をテストするのに便利な
テストツールはありますか?
568デフォルトの名無しさん:2011/05/22(日) 14:14:42.46
>>566
while(1)
{


if~~
break;

}

みたいな形見た事ないからです。
569デフォルトの名無しさん:2011/05/22(日) 14:16:21.26
>>568
いくらでも見たことあるなぁ。
570デフォルトの名無しさん:2011/05/22(日) 14:20:38.73
>>560
無限ループは抜けないのが前提なんだから抜けるのはおかしい。
抜けるなら while(1) を使うのはおかしい。
571デフォルトの名無しさん:2011/05/22(日) 14:22:31.70
>>570
何言ってるの?
572 ◆/91kCCQXBo :2011/05/22(日) 14:24:06.25
>>556 >>567
関数の中で、ログをテキストファイルに吐き出しながら、別プロセスの tail.exe で監視なら。
テキストファイルのオープンとクローズはその関数を呼び出す前に。
573デフォルトの名無しさん:2011/05/22(日) 14:35:21.48
>>572
それってテストの自動化面倒くさくないですか?
574デフォルトの名無しさん:2011/05/22(日) 14:42:19.03
//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のバグ?
575デフォルトの名無しさん:2011/05/22(日) 14:43:59.79
>>574
おめーの頭がバグってる
576デフォルトの名無しさん:2011/05/22(日) 15:10:34.16
577デフォルトの名無しさん:2011/05/22(日) 15:17:16.77
>>576
別に宿題じゃないよ。要素数1の配列でいろいろ試してるだけ。
バグかどうか切り分けたいからあんたの環境で実行してみてよ。
578デフォルトの名無しさん:2011/05/22(日) 15:19:57.47
%dにはintのポインタを渡さなければ結果は未定義
579デフォルトの名無しさん:2011/05/22(日) 15:24:03.89
抜ける条件があるならwhile(1)なんて使うなよアホか
580デフォルトの名無しさん:2011/05/22(日) 15:26:19.41
途中で抜けたい場合もあるだろ
581デフォルトの名無しさん:2011/05/22(日) 15:31:41.59
>>579
for(;;)を使えってことだよ
582デフォルトの名無しさん:2011/05/22(日) 15:34:49.54
>>581
それも同罪だボケ
583デフォルトの名無しさん:2011/05/22(日) 15:41:23.57
じゃあ
loop:
goto loop;
584デフォルトの名無しさん:2011/05/22(日) 15:45:32.24
http://codepad.org/NAUwzrRt
実行結果が思うようにいきません
なんかおかしいとこありますか
585デフォルトの名無しさん:2011/05/22(日) 15:47:09.87
%dがおかしい
586デフォルトの名無しさん:2011/05/22(日) 15:47:48.14
printf("%f\n",a);
587デフォルトの名無しさん:2011/05/22(日) 17:03:11.41
>>579
スピンロックってそういう構造だと思うけど
588デフォルトの名無しさん:2011/05/22(日) 17:12:17.72
>>415
コンパイラがどう解釈してるのかは知らないけど、
左辺に定数置くと条件判定が速くなるとか誰かが言ってた。詳しい人教えてくれ。
589デフォルトの名無しさん:2011/05/22(日) 17:21:08.59
ならねーよ
590デフォルトの名無しさん:2011/05/22(日) 18:37:49.19
>>415
それは古豪がよく使っており賛否両論。

if (a == 1)
を間違って
if (a = 1)
と書いてしまっても昔のコンパイラは警告はださなかった。
こんな間違いをするか!と思うだろうが1万ステップに1回くらいはやらかしても不思議はないし、そしてなによりも
この手のバグは見つけにくい。

if (1 == a)
と書くように習慣づけておれば、間違って
if (1 = a)
と書いたとして、当時のコンパイラも左辺値云々のエラーを出してくれたらしい。

コンパイラの出すエラーや警告と相談して好きにしていいと思う。

>>588
さすがにそれはないと思う。
591デフォルトの名無しさん:2011/05/22(日) 19:32:00.87
俺は騙されてたのか(´・ω・`)
592デフォルトの名無しさん:2011/05/22(日) 20:17:37.04
未だに1 == aがいいのかa == 1がいいのかわからない。
ミスを少なくするなら前者だとは思うんだけど。
うちの仕様書でも明確に決まってないし。
593デフォルトの名無しさん:2011/05/22(日) 20:18:59.56
まともにデバッグできれば、すぐわかることを...
594デフォルトの名無しさん:2011/05/22(日) 20:23:29.35
苦cのプログラムなんだが、

#include <stdio.h>

int main(void)
{
char str[32];
scanf("%32s",str);
printf("%s\n",str);
return 0;
}

これで32字以上入力したらEOSを入れる場所が無い気がする

・EOSが入らない
・配列の最終要素のさらに次のメモリ領域を破壊して無理矢理EOSが追加される
・俺の勘違い

どれ?
595デフォルトの名無しさん:2011/05/22(日) 20:24:35.70
char str[32+1];
596デフォルトの名無しさん:2011/05/22(日) 20:28:03.78
>>595
トン
ミス報告しとく
597デフォルトの名無しさん:2011/05/22(日) 20:28:37.75
等号一つの箇所を、エディタの検索使ってチェックすれば済むだけだと思う
598デフォルトの名無しさん:2011/05/22(日) 20:38:53.01
fgets(buf, sizeof(buf), stdin);
sscanf(buf, "%d %d", &x, &y);


改行をバッファに残さないためには、
これがスタンダードなのかい?
599デフォルトの名無しさん:2011/05/22(日) 20:46:23.44
>>592
決められるわけないでしょ
両側が変数になっただけで破綻する論理だし
600デフォルトの名無しさん:2011/05/22(日) 20:48:44.13
カッコ付けんなボケ
って言われるよ。
601デフォルトの名無しさん:2011/05/22(日) 20:58:15.03
>>597
バグの原因が等号ひとつのせいとわかっておれば、の話ですが。
症状があって有象無象の原因が考えられる最中に、実際そんなことできます?

>>593
そういいきってしまえば、それでおしまい。
602デフォルトの名無しさん:2011/05/22(日) 21:01:57.12
>>592
いまのコンパイラは if / while (int a = func()) {
で警告を出してくれるし、可読性を優先させてもいいんじゃないですか?
603デフォルトの名無しさん:2011/05/22(日) 21:04:59.23
>>601
稼働している場合は、アプローチも変わると思うな。
現象や症状から、どこかを特定しながらやるだろうけど。

エディタの検索の話は、製造段階でのセルフチェックだと思う。
これは一度バグ作って痛い思いをすれば、黙ってでもする(ヨネ?)
604デフォルトの名無しさん:2011/05/22(日) 21:17:22.89
>>601
Cの流行り始めに口先男の常套句を今時見るとは思わんかった
605デフォルトの名無しさん:2011/05/22(日) 21:18:46.77
>>601は◆QZaw55cn4c臭い文章だな
見てすぐにわかる
606デフォルトの名無しさん:2011/05/22(日) 21:21:35.25
条件式中の=は正規表現で抽出してシンタックスハイライトみたいに強調するようにしてる
本当に=を使いたいときには多少邪魔だが、見逃すよりはいい
607デフォルトの名無しさん:2011/05/22(日) 21:34:27.40
すんません、教えてください。
入門書読んでソースを実行して確認してるところなんです
環境 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がインクリメントされてないのは何故なんでしょう?
608デフォルトの名無しさん:2011/05/22(日) 21:37:18.75
for (i = 0; i < 0; i++)
609デフォルトの名無しさん:2011/05/22(日) 21:37:22.11
>>606
おまえ alias で sl とか作ってない?
610デフォルトの名無しさん:2011/05/22(日) 21:41:54.08
>>607
nを表示しろ
611デフォルトの名無しさん:2011/05/22(日) 21:44:47.91
>>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
613607: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]の表示についてはまた勉強してみます。
ありがとうございました。
614デフォルトの名無しさん:2011/05/22(日) 22:37:23.25
>>592
警告レベルを最大にして警告が出ないように書くって基本的なことをする
だけで防げるミスを 1 == a とか変な書き方するのって技巧に走りすぎてる。
615デフォルトの名無しさん:2011/05/22(日) 23:01:33.78
>>603
チェックしないで、コンパイルできないようにする
616デフォルトの名無しさん:2011/05/22(日) 23:12:06.19
普通ソースレビュー位すると思ってたが、○菱の件で、何も見てない会社もある事を知った。
617デフォルトの名無しさん:2011/05/22(日) 23:27:20.71
ガチでコードレビューするとこって今少ないんじゃないのかなぁ。
618デフォルトの名無しさん:2011/05/22(日) 23:35:10.02
人命にかかわるものだったら確実にやってるが
そうでなきゃ正直やるか微妙
619デフォルトの名無しさん:2011/05/22(日) 23:41:34.71
オレのプロジェクトチームは全員コードレビューするよ。
メンバーは全部オレで、レビュワーもオレだけど。
620デフォルトの名無しさん:2011/05/22(日) 23:42:51.48
>>619
いっつも俺も後ろで見てるよ
621デフォルトの名無しさん:2011/05/23(月) 01:32:17.81
>>614
可読性もよくないし、ご意見には全く同意です。

ただし私は知らないけれど、昔のコンパイラは警告に関しては酷かったみたいですよ。
プロトタイプ宣言もないし、引数チェックもない。
int f(a, b)
int a, b
{
return (0);


lint なんていうものがあるくらいだから。
622デフォルトの名無しさん:2011/05/23(月) 03:11:06.08
K&R時代ひっぱりださなくてもいいと思うが。
lintが有効な時代だったころはlintかけて警告全部潰すのが当たり前だったね。

んで、昔のコードをメンテしてたら1 == aなんて懐かしい記述がでてきたという話じゃなくて、
今の時代で、1 == aと書くかどうかなんでしょ。昔話をしたいわけじゃない。

今の時代に、そのような昔のコンパイラを使うことは論外だと思わない?QZさん。
623デフォルトの名無しさん:2011/05/23(月) 03:13:19.49
ちなみにQZがansi pedantic Wall Werrorでコンパイルできるコードを書いてることは知ってる。
意図してるかどうかはわからんが、少なくとも最初のアップロードするコードに関してはそうなってる場合が多い。
修正しだすとその辺がぐだぐだになることも多い。
624デフォルトの名無しさん:2011/05/23(月) 03:20:29.23
>>623
それにしてはC99でしかコンパイル出来ないソースを上げたりポカをやるけどな
抜けているとしか言いようがない
625デフォルトの名無しさん:2011/05/23(月) 13:01:54.88
◆QZaw55cn4cって糞だよなぁ
626デフォルトの名無しさん:2011/05/23(月) 14:48:01.08
webプログラム板のPHPスレ住民だけど
俺らは正直ここの連中を見下してますよ
627デフォルトの名無しさん:2011/05/23(月) 15:10:26.52
2ちゃんねるはperlだけどな
628デフォルトの名無しさん:2011/05/23(月) 15:26:20.01
パフォーマンス出ないから生Cじゃなかったか? < read.cgi の本体
629デフォルトの名無しさん:2011/05/23(月) 15:43:34.75
変数名に全角使えるの?
教えて
630デフォルトの名無しさん:2011/05/23(月) 18:01:05.67
遅レスだがwhile(1)で盛り上がってたな... それでdo { } while(0)が出なかったのは不思議だ...
便利だぞ! 関数でのタイムアウトエラーからの脱出なんか... breakで出れるんでスッキリする gotoは使いたくないからのう w
マクロサンドウィッチ? ああ あれは定番なんで...
631デフォルトの名無しさん:2011/05/23(月) 18:12:34.98
ついでに質問なんだが

typedef struct _CINHERIT{
COBJ obj;
CANCESTOR ancestor;
.
.
} _CINHERIT;

なんてOOPホリモーフィズムの定番構図なんだが objやancestorの先頭からの相対アドレスが問題になる処理系ってある?
継承したクラスでobjをアクセスしようとしたら吹っ飛ぶとか.... もちろんobjインスタンスは生成されているとして...
あちきは今のところ無いんだが...
632デフォルトの名無しさん:2011/05/23(月) 18:14:52.18
>>631
どう見ても入門向けじゃないのでスレ違い。
633デフォルトの名無しさん:2011/05/23(月) 18:17:17.95
>>632
ん? いけね 入門編だったか 失礼!
634デフォルトの名無しさん:2011/05/23(月) 18:41:49.78
処理系の有る無しは入門の範囲外だが、
言語仕様についていえば保証されてる
635デフォルトの名無しさん:2011/05/23(月) 18:43:56.06
悩む理由がわからない
上級者は大変なんだなぁ
636デフォルトの名無しさん:2011/05/23(月) 18:47:54.45
\xE3\x83\xAD\xE3

この文字列を読みたいのですが何で変換したらよいのでしょうか?
637デフォルトの名無しさん:2011/05/23(月) 18:50:02.70
>>630
脱出する手段としては綺麗かもだけど、結局呼び出し元とかに通達しない? <タイムアウトエラー
そうなると エラーコード積んで return でも ということに…

呼び出し前の事前処理・呼び出し後の後始末で
きちんと挟まれてないとまずいケースもあるから 一概に即 return で良いじゃんとは言わないヨ
638デフォルトの名無しさん:2011/05/23(月) 19:11:31.59
>>637
おっ 今日は休みなんで... w しかし 暇だなぁ 仕事も薄くなってきた orz 仕事くれ〜!

説明が足らんかった ワルッ のし
関数内でタイムアウトを処理し 戻り値で処理する場合だな これのメリットは...

例えばZigBeeなんかでコマンドのやり取りをする場合に
コマンド関数内でタイムアウトをモニターする現場的な関数の作り方は多い...
エラーはDelphiIO並みにIOResultとして処理する方式として
戻り値にエラーを返すスタイルではdo {} while(0)はスッキリする

俺の場合 ほとんどARMやらAVR32やらマイコンベースなんでちょっとわかりずらいかもな...
639デフォルトの名無しさん:2011/05/23(月) 19:25:39.93
fwrite()でのテキストファイルへの追記出力に関して、
ファイルサイズを制限、または行数を制限したいと考えています。
具体的には、超過が確認された場合、古い行(先頭から)を削除していこうというものです。

しかし、ファイルサイズの取得は簡単にできるのですが、超過が確認された際の処理が思い浮かびません。
_chsize()で切り詰めは可能ですが、これでは新しい行が捨てられてしまいます。

新規ファイルに、必要な行のみ書き出すことも考えたのですが、不要行の判定の仕方がこれまた思い浮かびません。

どなたかご教授お願いします。
640デフォルトの名無しさん:2011/05/23(月) 19:33:52.21
>>639
複数のファイルに分割してみたらどうかな?
それぞれ分割値の最大を超えたら、次のファイルに書き出すようにして、
合計値が所定の値を超えたら、古いファイルから順に削除、とか?
641デフォルトの名無しさん:2011/05/23(月) 20:19:01.08
>>639
古くて新しい問題だな。
一行のサイズを固定にできてリングバッファ状になっていいなら、一定行数に達した後は既存行を上書きする形でできるけどね。
要は、要件定義をしっかり確認するのが先だろうな。
642デフォルトの名無しさん:2011/05/23(月) 21:38:53.38
>>622
でも、それをやると
(void)printf("foo");
とかやらないといけなかったんではなかったでしょうか、手元のキーゥイ本だとたしか。

まあ、全面的に同意します。
643デフォルトの名無しさん:2011/05/23(月) 21:46:41.52
lint に振り回されて不本意なコードを書く本末転倒が流行ったのは黒歴史だが
まだ目が醒めてない間抜けが後を絶たない
644デフォルトの名無しさん:2011/05/23(月) 23:07:02.81
放置してバグを量産するより振り回された方が100倍マシだというだけだ
645デフォルトの名無しさん:2011/05/23(月) 23:08:03.27
>>643
まだこういうこと言うやつがいるの?
びっくりだわ・・・
おまえプログラマー辞めろ。ほんと。
646デフォルトの名無しさん:2011/05/23(月) 23:41:11.08
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;
}
647デフォルトの名無しさん:2011/05/23(月) 23:46:26.46
>>623
癖というか、多分、ソースコードとバイナリとができるだけ対応しているのがいい、というブレーキが微妙に働いているのかもしれません。
実際には、 symdeb / gdb を使うまでに追い込まれたことは数えるほどしかないのですが。

それとも頻繁に使って慣れておいたほうがいいものなのでしょうか?お聞かせいただけるとうれしいです。
648デフォルトの名無しさん:2011/05/23(月) 23:48:05.27
>>646
sprintf()
649デフォルトの名無しさん:2011/05/23(月) 23:50:55.98
>>648
?
650デフォルトの名無しさん:2011/05/23(月) 23:51:42.29
普通の掛け算割り算で書いとけば最適化でビット演算にしてくれるだろ。
651デフォルトの名無しさん:2011/05/23(月) 23:54:54.15
なんぼ賢いコンパイラでも /10 とか *10 は無理じゃね?
652デフォルトの名無しさん:2011/05/23(月) 23:58:19.02
定数で書いてあるなら割とやってくれそうな気がしてる(根拠なし)
653648:2011/05/23(月) 23:58:36.68
>>646
まじめに答えると、
そもそも割り算という演算操作一回で、商と余りとの両方が手に入るはずなのに、
% や / だと、その片一方しか得られないのがもったいない、という感じがします。その辺からアプローチすると、どうなるか‥‥‥。
654デフォルトの名無しさん:2011/05/24(火) 00:03:28.89
確かにアセンブラだと両方手に入ってるだけどね…
Cだと浮動小数点でその手の標準関数があるだけじゃないかな
655デフォルトの名無しさん:2011/05/24(火) 00:35:18.66
CのコードですよってなっていながらC++での書き方をしているくそサイト滅べ
656デフォルトの名無しさん:2011/05/24(火) 00:41:42.71
>>651
一度最適化コンパイルしたアセンブリを読んでみるといいよ
657デフォルトの名無しさん:2011/05/24(火) 00:43:37.28
>>656
>>651 じゃないけど、/10 をビット演算に直す最適化コンパイラがあるの?!
それ何てコンパイラ?
658デフォルトの名無しさん:2011/05/24(火) 00:48:12.53
なるほど a*10 は a*8+a*2 か
a/10はどうやんだ?
659デフォルトの名無しさん:2011/05/24(火) 00:49:59.63
みんなアセンブラとかすごいな・・・僕にはちょっと難しいです
660デフォルトの名無しさん:2011/05/24(火) 00:51:12.86
>>659
#
661デフォルトの名無しさん:2011/05/24(火) 01:15:24.27
定数除算は乗算に置換可能。今時のコンパイラは当たり前のように置換する。
除算の剰余と商の両方を演算に利用しているなら、一回の除算で済ませる最適化も普通に行なわれる。
だから、下手にあれこれ考えずにコンパイラに任せるのが一番。
662623 ◆XEE2zLj0dE :2011/05/24(火) 01:51:19.81
>>647
わかってたと思うけどトリつけた。

gdbに慣れたほうがいいと思うけど、底辺マらしくprintデバッグですませてる。
gdb使ってもスタックトレース見るのに使うぐらい。
なもんで参考にならないと思うよ。ソースコードとバイナリの対応とかも全然考えてない。

×複雑なコードでもデバッガを使えば追えるよ
○複雑なコードはとっととリファクタリングしちゃえばいいよ
という方針。賛否あると思うけども。
663デフォルトの名無しさん:2011/05/24(火) 06:40:55.54
>>657-658
煽ってるつもりなのか知らんけど
>>661の通りで、GCCでも最適化される
664デフォルトの名無しさん:2011/05/24(火) 07:54:46.62
除算が乗算で書けるの知らなかった
665657:2011/05/24(火) 08:27:17.66
>>663
んー、最適化されるかどうかじゃなくてビット演算に直されるかどうかだから、>>661 は話が微妙に違うよね

GCC は IMUL してから SAR してるんだけど、これをビット演算に直したと言って良いのかな?
666デフォルトの名無しさん:2011/05/24(火) 08:30:31.70
>>661
いや、逆に定数除算をどのように乗算に置き換えるのか検討もつかない。
よろしければポインタをば。

乗算をコンボリューションとみなしてdft/idft する話くらいしか‥‥‥。
667デフォルトの名無しさん:2011/05/24(火) 08:31:13.92
ビット演算とは言わないね。そういう意味では>658もビット演算じゃないし。
それに、そもそもビット演算にすれば速くなるというわけでもないから>650は頓珍漢。
668デフォルトの名無しさん:2011/05/24(火) 08:36:38.57
>底辺マらしくprintデバッグですませてる。
魔じゃない系はprintfデバッグすら使いこなせません。
669デフォルトの名無しさん:2011/05/24(火) 09:11:23.24
a*10=a*8+a*2=(a<<3)+(a<<1) ってビット演算じゃないの?
670デフォルトの名無しさん:2011/05/24(火) 09:23:28.52
>>666
マジで知らない?
基本的な考え方は、逆数を掛けるだけ。
面倒だから、16ビット整数を3で割る場合の例を。
numerator / 3
= numerator * (1 / 3)
= numerator * (65536 / 3) // 16ビット整数を仮定しているので65536を掛けても結果は変わらない
= numerator * 21846 / 65536 // 商を繰り上げるのは、65536で割って切り捨てるために必要になるため
671デフォルトの名無しさん:2011/05/24(火) 09:27:40.06
>>669
だから、今時のCPUはそんな最適化の必要がない。
実際、x86ならmov eax, [eax + eax * 4]
add eax, eax
のように計算できてしまう。
最早、ビットシフトの出番は殆ど残されていない。
672デフォルトの名無しさん:2011/05/24(火) 09:36:06.37
>>670
これだな。
ttp://d.hatena.ne.jp/kikx/20070504

なんだ、この板のx86計測スレが元ネタじゃないか。
673デフォルトの名無しさん:2011/05/24(火) 09:50:22.46
えw
こいつ馬鹿なの?
674デフォルトの名無しさん:2011/05/24(火) 09:53:08.58
知らなくて悔しかったからビット演算じゃないことや元ネタ云々で悪あがき
675デフォルトの名無しさん:2011/05/24(火) 09:54:43.11
>>672
元ネタはコンパイラの最適化だよ
676デフォルトの名無しさん:2011/05/24(火) 10:04:15.78
なんでそのスレ以前から常識だって考えないんだろう
677 忍法帖【Lv=27,xxxPT】 :2011/05/24(火) 10:24:12.85
みんな、誰と戦っているの?
678デフォルトの名無しさん:2011/05/24(火) 10:45:23.80
常識という魔女?
679デフォルトの名無しさん:2011/05/24(火) 11:15:45.48
えええーえーえー
680デフォルトの名無しさん:2011/05/24(火) 12:35:56.99
「知らなかったありがとう」

たった1行だけで済むやり取りなのに、何故無駄に張り合うバカが後を絶たないのか?
知らなかったふりして自分の中で取捨選択するのが一番賢いのに。
681デフォルトの名無しさん:2011/05/24(火) 12:42:01.19
>>680
うむ
682デフォルトの名無しさん:2011/05/24(火) 13:18:33.78
ビット演算じゃない演算なんて今のPCでできるの?
683デフォルトの名無しさん:2011/05/24(火) 13:38:02.84
>>682
アスペ乙
684デフォルトの名無しさん:2011/05/24(火) 14:36:59.72
今迄のPCはビット演算だけで計算してたのか。
685デフォルトの名無しさん:2011/05/24(火) 14:54:18.48
CPU演算回路にNAND回路とNOR回路以外の回路が使われてのるかって話?
686デフォルトの名無しさん:2011/05/24(火) 15:20:12.51
大学の課題で、

砂時計みたいに、三角形が二つくっついてる図形作りたいんだけど
どうすればいいですか??(cygwin)
687デフォルトの名無しさん:2011/05/24(火) 15:29:32.00
画像を読み込む
688デフォルトの名無しさん:2011/05/24(火) 15:33:56.13
GIMPはCソースで出力してくれるよ
689デフォルトの名無しさん:2011/05/24(火) 15:57:01.55
>>688
あれはじめてみるとインパクトあるよな
どんな基地外機能だと思ったもんだ
690デフォルトの名無しさん:2011/05/24(火) 16:15:07.29
水道局水道使用料・下水道使用料などの払込取扱票に
OCR-Bでかかれている数字のチェックディジット(CDは11, 41 )の
計算方法わかるかい。

110123467890200000010000223567011600000 --> CDは11

41000123456789002090153880000000000000000000 --> CDは41
691デフォルトの名無しさん:2011/05/24(火) 16:55:48.61
>>690
先頭1バイト?
692デフォルトの名無しさん:2011/05/24(火) 17:31:05.74
>>691
110123467890200000010000223567011600000のチェックディジットは11
データ部は11を除いた
012346789020000001000022356701160000です

41000123456789002090153880000000000000000000のチェックディジットは41
データ部は41を除いた
000123456789002090153880000000000000000000です


693デフォルトの名無しさん:2011/05/24(火) 18:03:33.16
下記質問での、

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 );
694デフォルトの名無しさん:2011/05/24(火) 18:09:05.04
OKじゃない
695デフォルトの名無しさん:2011/05/24(火) 18:54:20.84
OKです
696 ◆QZaw55cn4c :2011/05/24(火) 20:01:53.26
>>693
***プロトタイプ宣言されている***関数を呼び出す限り、キャストは必要ない。暗黙の型変換(あるいはプロモーション)に頼ってよい。
むしろ、情報の一部が失われる暗黙のキャストに対しては、最近のコンパイラは警告を出してくれるのにもかかわらず、
明示的にキャストすることによって、コンパイラの警告機能がキャンセルされてしまう弊害がでる。

繰り返す。キャストはしなくてもいい。問題があればコンパイラが警告する。
ただし、可変長引数のキャストは必要な場合がある。unix なら exec*() の (char *)NULL あたりとか。
697デフォルトの名無しさん:2011/05/24(火) 20:05:40.50
>>671
ARMもその今時のCPUの仲間に入れてやってくれよ
Windows8のターゲットにもなったことだしさ

mov r3, r0, asl #3
mov r0, r0, asl #1
add r0, r0, r3
698デフォルトの名無しさん:2011/05/24(火) 21:16:07.17
>>697
ビットシフト単体のニモニックじゃないんだから、内部がどうあれx86のleaと同じことじゃん。
699デフォルトの名無しさん:2011/05/24(火) 21:19:05.30
>>696
>むしろ、情報の一部が失われる暗黙のキャストに対しては、
「暗黙のキャスト」とは?

>ただし、可変長引数のキャストは必要な場合がある。unix なら exec*() の (char *)NULL あたりとか。
標準関数で問題が出るケースはないと思ってよろし?
700uy:2011/05/24(火) 22:12:46.71
>>696
は?
キャストしろよ

何言ってんだこいつ
暗黙のキャストに任せるって何いってんだこいつwwwwww

C言語だぞ

スクリプト言語じゃねーんだぞ

C++すら触ったことなさそうだな
701デフォルトの名無しさん:2011/05/24(火) 22:12:50.77
なんで構造体の宣言を}の後ろに書くの?
702デフォルトの名無しさん:2011/05/24(火) 22:20:01.76
なんで◆QZaw55cn4cがいるの?
703デフォルトの名無しさん:2011/05/24(火) 22:22:24.81
どうも周知徹底が不足しているようなので再度のお願いとなりますが、C死ね。
ttp://shyouhei.tumblr.com/post/5545216280/c
704デフォルトの名無しさん:2011/05/24(火) 22:23:21.07
>>702
ファンが多いからじゃね?
705デフォルトの名無しさん:2011/05/24(火) 22:29:18.93
民主党ですか?
706デフォルトの名無しさん:2011/05/24(火) 22:34:37.92
なんで構造体の宣言を}の後ろに書くの?
707デフォルトの名無しさん:2011/05/24(火) 23:20:16.35
>>706
変数宣言は型の後に変数名を書く。
構造体もまた然り。
708デフォルトの名無しさん:2011/05/24(火) 23:55:34.38
流れ切って申し訳ないけど質問です。

http://codepad.org/qeXhAizm の74行目のコメントアウトを外して、
ポインタ配列*gの内容を構造体*amのポインタ配列*genoに代入させるという動作をしたいのですが、
どのようにしてmallocで領域を確保していいのかが分かりません。
create_automaton関数内で領域を確保しなければいけないのは分かっているのですが、
*amに対して領域を確保すればよいのか、*genoに対して確保すればいいのか、
どちらでもなく全く別の領域を確保すればいいのかの見当が立てられません。

どなたかどのようにすれば良いかの指摘や手直しなどをお願いします。
709デフォルトの名無しさん:2011/05/25(水) 00:29:35.89
>>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;としなければならない。

全体的にポインタの取り扱いに慣れていないようだが、そのレベルでオートマトンなんて大丈夫か?
710デフォルトの名無しさん:2011/05/25(水) 00:45:54.43
2年生かなー。後期にはコンパイラの授業が出てくるんじゃないかな。
そんぐらいのペースだったような気がする。
711デフォルトの名無しさん:2011/05/25(水) 01:45:56.98
>>709
ありがとうございます。
修正してみます。

高専の電気系学科から大学の情報系学科に編入したのですが正直情報系をナメてました。
Cは数年振りの上に基礎しかやってないのでポインタとかも完全に理解しきれていませんでした。
mallocやcallocも大学に来てから自学して使っているので正直分からないことだらけです。
今回のプログラムも大学の課題なのですが、正直できる気がしないんですよね…

>>710
上記の事情で3年生です。
712デフォルトの名無しさん:2011/05/25(水) 01:59:57.85
高専って出来る奴が多いのかと思ってた。
713デフォルトの名無しさん:2011/05/25(水) 02:03:17.49
aiff または wav で保存された8 or 16bitのプレーンPCMデータを、
C言語の配列形式としてテキスト出力するプログラムを誰か作ってください。

出力例:
short pcm[] = {
    16,    // 16bit
    48000,    // 48000Hz
    1234,    // データ個数
    12, 13, 20, 45, 56, 78, 78, 78,    // 実データ
    ...
};
714デフォルトの名無しさん:2011/05/25(水) 03:06:06.05
>誰か作ってください。
宿題スレのほうが
715デフォルトの名無しさん:2011/05/25(水) 03:53:11.17
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でも同じ)
716デフォルトの名無しさん:2011/05/25(水) 04:01:58.45
どうなると思ったの?
717デフォルトの名無しさん:2011/05/25(水) 04:06:14.36
limits.hに従わない数をabs()に渡したらdomain_errorを起こしてもおかしくないだろ
718デフォルトの名無しさん:2011/05/25(水) 04:37:11.35
>>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がスローされるんでしょうか?
719デフォルトの名無しさん:2011/05/25(水) 04:44:21.50
int minus_max = -plus_max -1;
2進数符号付き32bitでこの計算が...
720デフォルトの名無しさん:2011/05/25(水) 04:57:49.52
>>718
ここCスレですよ。
あと、LONG_MINは-2147483648

absって最上位ビットクリアするだけかと思ってたけどちゃんと見てるんだな。
721デフォルトの名無しさん:2011/05/25(水) 06:30:11.76
>>719
どこか計算間違ってます?
符号付き整数の最小値って最大値*-1 -1だと思うんでそうしたんですが

>>720
具体的な数値で言うとそうなるんですが
limits.hでググるとそういう定義になってるって事が書かれてるんですよね・・・
とりあえず今回はwikipediaから引っ張ってきたんですが
http://ja.wikipedia.org/wiki/%E6%A8%99%E6%BA%96C%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA#.E6.95.B4.E6.95.B0.E5.9E.8B.E3.81.AE.E5.A4.A7.E3.81.8D.E3.81.95_.3Climits.h.3E

あと、私からdomain_errorの話を出したわけではないので悪しからずご了承ください
あ、私が知らないだけでC言語でもdomain_errorというのならすみませんです
722デフォルトの名無しさん:2011/05/25(水) 06:38:53.00
>2147483648が返ってくると期待した場合
そうなるような計算式考えてみりゃいいじゃん
723デフォルトの名無しさん:2011/05/25(水) 06:44:17.31
labs?
724デフォルトの名無しさん:2011/05/25(水) 08:12:21.13
>>699
>「暗黙のキャスト」とは?

失礼。暗黙のキャストという言葉はありませんね。暗黙の型変換(ボーランドの説明文ではよく使われていました)ということでお願いします。
>>696
>暗黙の型変換(あるいはプロモーション)
特に情報が失われる暗黙の型変換は、規格での integral/integer promotion (の一部)を指しています。

>>699
>標準関数で問題が出るケースはないと思ってよろし?
「問題が出る」や「標準関数」が何を指すのかよくわかりませんが、少なくとも可変長引数ではない関数で前方参照していなければ「問題ない」でしょう。
725デフォルトの名無しさん:2011/05/25(水) 08:13:29.74
>>700
char ch;
ch = getchar();
で嵌ってください。
726デフォルトの名無しさん:2011/05/25(水) 08:33:42.59
>>724
標準ライブラリに含まれている関数を、普通は標準関数と呼ぶと思うが。
で、わざわざ標準関数以外の例を出したと言うことは、標準関数では問題がないと思っているのかという質問だろう。

>>725
その例と>700とにどんな関係があるのか詳しく。
727デフォルトの名無しさん:2011/05/25(水) 08:41:52.72
>>703
ウケ狙いならば惜しいレベル。
「Java、C#、ひょっとしたらOcamlやScala」は何で書かれているか?
「JavaとかC#とか、ひょっとしたらOcamlやScala」を記述している言語は何で書かれているか?
という質問を想定したボケっぷりを塩味として利かせていただければ、より一層、磨きがかかるところだったんだが。
728デフォルトの名無しさん:2011/05/25(水) 08:43:12.03
>>726
後半。
失礼、これでは嵌りませんね。

>>700
char ch;
ch = (char)getchar();
で嵌ってください。
729デフォルトの名無しさん:2011/05/25(水) 08:48:29.73
つ[自縄自縛]
730デフォルトの名無しさん:2011/05/25(水) 09:05:41.16
>>728
キャストの有無に関係なく嵌るんじゃ?
731デフォルトの名無しさん:2011/05/25(水) 09:27:10.70
◆QZaw55cn4cって糞だよなぁ
732デフォルトの名無しさん:2011/05/25(水) 10:32:00.63
>>707
}宣言
じゃなくて
}
宣言
じゃだめのな?
733デフォルトの名無しさん:2011/05/25(水) 10:36:15.48
日本語で
734デフォルトの名無しさん:2011/05/25(水) 10:36:29.96
どうそ。私は止めませんから。
735デフォルトの名無しさん:2011/05/25(水) 10:47:32.70
>>733
>>734
くずは失せな
736デフォルトの名無しさん:2011/05/25(水) 11:03:40.83
>>732
int foo;
でも
int
foo
;
でも構わん。同様に、
struct foo {int foo, bar;} foo;
でも
struct
foo
{
int
foo
,
bar
;
}
foo
;
でも構わん。好きにしろ。

>>735
失せるべきは誰か分かったかな?
737デフォルトの名無しさん:2011/05/25(水) 11:04:54.46
>>733
738デフォルトの名無しさん:2011/05/25(水) 12:53:24.94
コンソールプログラミングしかしないのですが
そういう用途でもCを勉強する必要ってありますか?
739デフォルトの名無しさん:2011/05/25(水) 12:55:29.70
コンソールプログラムならCだと不都合が?
740デフォルトの名無しさん:2011/05/25(水) 13:08:21.28
関数で返す値が2つ以上のときはポインタ使うけど
返す値がひとつの場合でもポインタで変数を変更する意義ってありますか?
741デフォルトの名無しさん:2011/05/25(水) 13:14:44.57
>>740
場合によってはね
742デフォルトの名無しさん:2011/05/25(水) 13:15:23.84
>>741
どういう場合ですか?
743デフォルトの名無しさん:2011/05/25(水) 13:16:16.60
さらしあげ
744デフォルトの名無しさん:2011/05/25(水) 13:45:44.35
返す値が一つでも、何がしかの状態を返したければポインタは有効だな。
本当に一種類の値だけしか返さないならポインタを使う意義は薄いが、次のような例はしばしば見かける。
--
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);
745デフォルトの名無しさん:2011/05/25(水) 13:49:01.04
>>744
他にset2()なるoffsetを2増やす関数があったりするケースだな。
例えば、プロトコルの実装とか帳票作成とか。
746デフォルトの名無しさん:2011/05/25(水) 13:50:06.94
さらしあげ
747デフォルトの名無しさん:2011/05/25(水) 13:51:13.93
>>740
そもそも、どうやったって1つしか返せねーよ。
748デフォルトの名無しさん:2011/05/25(水) 13:51:56.93
749デフォルトの名無しさん:2011/05/25(水) 13:52:57.08
750デフォルトの名無しさん:2011/05/25(水) 13:53:08.21
ブラウザで取得したクッキーをcで書いたプログラムで使いたいのですが
どのようにクッキーを読むのでしょうか?
751デフォルトの名無しさん:2011/05/25(水) 13:53:19.90
>>742
不完全型使ったり
他の関数と合わせたり
752デフォルトの名無しさん:2011/05/25(水) 14:12:29.98
ポインタにわざわざ*つけさせるのは何で?
753デフォルトの名無しさん:2011/05/25(水) 14:14:19.89
>>752
宣言時なら、ポインタ形であることを示すため。
逆参照時なら、逆参照を行なうことを示すため。
いずれの場合も、つけないと区別できないので「わざわざ」ではあっても必要。
754デフォルトの名無しさん:2011/05/25(水) 14:15:55.50
>>753
宣言時のときはいらない
755デフォルトの名無しさん:2011/05/25(水) 14:16:00.09
>>478-479
二つ返してみろよwww
756デフォルトの名無しさん:2011/05/25(水) 14:18:51.81
>>754
一番いい具体例を頼む。
757デフォルトの名無しさん:2011/05/25(水) 14:20:43.37
>>756
アドレスを格納するだけなんだから
758デフォルトの名無しさん:2011/05/25(水) 14:23:45.39
>>747
失せろカス
759デフォルトの名無しさん:2011/05/25(水) 14:24:22.60
>>757
そう
なのに*をつけないといけない
760デフォルトの名無しさん:2011/05/25(水) 14:30:40.18
>>757
あぁなんだ、記号が気に入らないって話か? だったら片っ端からtypedefしろよ。
typedef int * intPtr;
typedef int ** intPtrPtr;
typedef int *** intPtrPtrPtr;
and so on.
761デフォルトの名無しさん:2011/05/25(水) 14:36:25.47
そうだね。
762デフォルトの名無しさん:2011/05/25(水) 14:38:28.49
マルチスレッドの使い方教えろ
763デフォルトの名無しさん:2011/05/25(水) 14:44:54.69
実際*はどう扱われるの?
規格やアセンブリ読んだことあるやつ教えてー
764デフォルトの名無しさん:2011/05/25(水) 14:55:37.90
>>763
コンパイラのオプション使えよバカ
765デフォルトの名無しさん:2011/05/25(水) 15:01:16.86
ほっほっ
766デフォルトの名無しさん:2011/05/25(水) 15:01:59.47
教えて頂けますか?
for文を使って
1〜100まで足した合計
1〜100までの偶数を足した合計
1〜100までの奇数を足した合計
をfor文ひとつを使ってやれる方法を教えて頂けますか?
宜しくお願いします。
767デフォルトの名無しさん:2011/05/25(水) 15:08:24.82
>>766
宿題スレへどうぞ。
768デフォルトの名無しさん:2011/05/25(水) 15:11:28.31
ん〜、変数3つ用意すりゃいいんじゃない?
769 忍法帖【Lv=28,xxxPT】 :2011/05/25(水) 15:14:30.97
そもそもfor要らないじゃん
770デフォルトの名無しさん:2011/05/25(水) 15:18:41.58
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);
}
こんな感じじゃね
771デフォルトの名無しさん:2011/05/25(水) 15:22:14.15
>>766
for文を使って教えろといわれても困るな・・・
772デフォルトの名無しさん:2011/05/25(水) 15:24:30.79
素直にif使えよ
773デフォルトの名無しさん:2011/05/25(水) 15:32:44.30
>>764
なんですかそれ?
774デフォルトの名無しさん:2011/05/25(水) 15:36:31.91
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;
}
こうか
775デフォルトの名無しさん:2011/05/25(水) 15:56:50.23
>>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;
}
776デフォルトの名無しさん:2011/05/25(水) 16:26:16.89
皆さん、早い返答ありがとうございました。
まだC言語に触れたばかりなのでこのような優しい方が多い掲示板があることに感謝します。
皆さん、本当にありがとうございました。
777デフォルトの名無しさん:2011/05/25(水) 16:29:24.29
お前らべた褒めされてるぞw
778デフォルトの名無しさん:2011/05/25(水) 17:53:32.25
さらしあげ
779デフォルトの名無しさん:2011/05/25(水) 19:06:10.36
>>730
いいえ、キャストをつけなければ、最近の馬鹿じゃないコンパイラならば警告を出してくれます。
逆に、ご丁寧にキャストをつけると、本来出るべき警告まで抑制されてしまいます。

無論、馬鹿なコンパイラのことは知りませんが。
780デフォルトの名無しさん:2011/05/25(水) 19:12:02.68
>>726
前半。
>標準関数では問題がないと思っているのか
そう思っていましたが、キャストをつけなければいけない場合をひとつ思いつきました。
qsort() や bsearch() のコールバック関数を指定する場合は、
int cmp(struct foo *, struct foo *);
qsort(base, n, size, (int (*)(void *, void *))cmp);
という風にキャストをつけなければ警告が出てしまうコンパイラもありましたね。
キャストの有無にかかわらず、生成されるコードに変化はありませんけれども。
781デフォルトの名無しさん:2011/05/25(水) 19:15:18.11
>>779
ああ 警告出るから、コードを見直すチャンスがある と。

警告が出た後、
改めて 警告の解決に即キャストを使う という発想をする奴には
本質ではないような気がするがね
782デフォルトの名無しさん:2011/05/25(水) 20:57:02.12
>>781
そういう >>700 みたいな人間には、C はお勧めできないのは確かですね。
783デフォルトの名無しさん:2011/05/25(水) 21:03:27.44
>>781
そういう発想の人を対象とした話題だったの?
784デフォルトの名無しさん:2011/05/25(水) 23:33:08.39
>>780
printf()系は?
785デフォルトの名無しさん:2011/05/25(水) 23:47:45.60
>>784
printf() 系は可変長引数の関数ですが、特にキャストを必要としないでしょう。キャストがなくても動く仕様だと考えています。
最近のコンパイラはそれなりに賢くて、printf() の第一引数に対応していない可変長引数に対しては警告を出してくれるようです。
786デフォルトの名無しさん:2011/05/26(木) 00:04:49.36
>>780
キャストをつけなれば警告が出るような関数を指定すること自体がだめ。
787デフォルトの名無しさん:2011/05/26(木) 00:55:31.67
>780

それはcmp関数の定義がまずい。
そこは
int cmp(void *a, void *b)
{
struct *pA = a;
struct *pB = b;
/* 以降pA, pBを使って比較関数を書く */
}

とすべき。
788デフォルトの名無しさん:2011/05/26(木) 01:00:41.09
インターネットでつながった他のコンピューターのファイルを読み書きすることはC言語で加能ですか?
可能ならソース付きで解説しろ
789デフォルトの名無しさん:2011/05/26(木) 01:15:38.94
vimのnetrwあたりのソース読めばいいと思うよ
790デフォルトの名無しさん:2011/05/26(木) 01:48:53.26
DXライブラリというゲームに関する無料のAPIを使ってC言語勉強してるんですが
こんな関数がありますfile_lead_eof(ファイルハンドル)

関数の定義の概略が[fileread_open関数で開いたファイルのファイルポインタが終端に達しているか
         どうか調べたいときに使う]

↑どういう関数なのか用途がいまいちわかりません わかりやすく教えてください
 自分はfopen,fcloseくらいは知ってます
791デフォルトの名無しさん:2011/05/26(木) 01:53:12.52
>>786, >>787
なるほど。
http://codepad.org/JzZGbaoP
コメントありがとうございました。
792デフォルトの名無しさん:2011/05/26(木) 02:29:17.23
>>790
終端に達したかどうかを調べたい時に使うんだと思うが。
fgetsなり使ったことあればわかりそうなもので。
793デフォルトの名無しさん:2011/05/26(木) 02:36:12.16
だれかインターネット用のfopenとfreadとfwrite作れ
794デフォルトの名無しさん:2011/05/26(木) 03:39:58.34
>>793
つ バークレーソケット
つ portal filesystem の tcp ドメイン(on BSD4.4)
795デフォルトの名無しさん:2011/05/26(木) 05:29:37.29
>>794
ググったら、クライアント用プログラムと、サーバー用プログラムを作らないといけないらしいことはわかった。
でも、サンプルコードが長すぎて意味不明だった。

クライアントのパソコンがhello worldって送ったら、サーバーのパソコンがそれ表示するプログラムを、
それぞれ10行以内で書くことは可能ですか?可能なら書け。
796デフォルトの名無しさん:2011/05/26(木) 07:16:54.50
>>785
printf("%d:%d\n", sizeof(int), -1);ではまれ。
797デフォルトの名無しさん:2011/05/26(木) 07:54:19.78
>>796
それ、ちゃんと警告出るぜ

printf("%zu:%d\n", sizeof(int), -1);

C99さいこー
798デフォルトの名無しさん:2011/05/26(木) 08:17:07.89
>>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 が使えないので環境によって書式指定を書き直さなければならない不都合はありますけども。
799デフォルトの名無しさん:2011/05/26(木) 10:47:27.52
const char * buf = "%d";
printf(buf, sizeof(int));
800デフォルトの名無しさん:2011/05/26(木) 10:58:55.72
いや、もともとはキャストの話だろ?
size_t はキャストなんてせずに"%zu"使えよ
801デフォルトの名無しさん:2011/05/26(木) 11:33:40.23
>>795
printf とかで充分だよ。
あとは標準入出力を繋ぐだけ。
そこは OS の仕事な。
802デフォルトの名無しさん:2011/05/26(木) 12:39:03.53
printfでコンソールに出力した文字列を取得するにはどうしたらいいですか?
803デフォルトの名無しさん:2011/05/26(木) 12:41:13.73
OSが提供する機能で
(おおよそ 子プロセス+パイプ かな?)
804デフォルトの名無しさん:2011/05/26(木) 12:42:03.57
>>802
あなたのお使いのコンソールの取扱説明書に当たってください。
GUI環境なら、大抵の場合コピーできることかと思われます。
もし仮に、「過去に出力した」ではなく「これから出力するだろう」文字列ということでしたら、
お使いのOSなどのリダイレクト機能についてお調べください。
805デフォルトの名無しさん:2011/05/26(木) 12:44:38.05
>>804
プログラム内で出力したのをそのプログラム内で取得したいのですが
806デフォルトの名無しさん:2011/05/26(木) 12:45:46.44
>>805
一旦sprintfがいいと思う
807デフォルトの名無しさん:2011/05/26(木) 12:46:52.86
>>805
出力したものは既にプログラムの中にはありませんから、プログラムだけでどうこうできるものではありません。
>806のように、事前に自前で確保しておく必要があります。
808デフォルトの名無しさん:2011/05/26(木) 12:57:23.25
できるぞ低能共
809デフォルトの名無しさん:2011/05/26(木) 13:09:18.11
俺は高脳
810デフォルトの名無しさん:2011/05/26(木) 13:20:39.44
初心的な質問ですがよろしいでしょうか?

作成したスレッドは、プロセスが終了すると処理はそこまでなのでしょうか?
それともそのスレッドが終了するまで処理されるのでしょうか?

また、前者の場合だったとして
DLLでスレッドを作成した場合DLLの処理が終了が終了した時点なのでしょうか?
それともプロセスが終了した時点なのでしょうか?
811デフォルトの名無しさん:2011/05/26(木) 13:23:31.73
プロセスがそれも決める。
812デフォルトの名無しさん:2011/05/26(木) 13:24:58.54
なるほど

それを設定する方法やそれを取得する方法を宜しければおしえていただけないでしょうか?
WINAPIでやっているのですが、此処まで来るとスレチになるのですかね
813デフォルトの名無しさん:2011/05/26(木) 13:25:28.54
>>812
環境によるけどjoinとかない?
814デフォルトの名無しさん:2011/05/26(木) 13:32:04.16
ちょっと探してきます。

ありがとうございます。
815デフォルトの名無しさん:2011/05/26(木) 13:34:22.71
うん。使ってるスレッドライブラリのリファレンスの同期処理とか見ると書いてると思う
816デフォルトの名無しさん:2011/05/26(木) 13:49:00.59
>>815

了解しました。
817デフォルトの名無しさん:2011/05/26(木) 17:33:31.37
#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));
}
818817: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 を書き換えることは可能か?
可能なら書け。
819デフォルトの名無しさん:2011/05/26(木) 18:16:26.79
>>818
double a = 2;

void* f(void* _)
{
}
820817: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点とする。独創的なものほど高得点を与えゆ。)
821デフォルトの名無しさん:2011/05/26(木) 18:23:34.87
>>819
それは禁じ手とする
822デフォルトの名無しさん:2011/05/26(木) 18:26:28.34
この口調、他のスレでも見たけど気持ち悪い。
823デフォルトの名無しさん:2011/05/26(木) 18:38:04.79
確かにどうしようも無い気持ち悪さを感じる。
824デフォルトの名無しさん:2011/05/26(木) 18:44:31.51
>これで2になるのだが、もっと自力でなんとかする『メカニズム』自体を自力で実装することで実現したい。
自力なんだから自分でなんとかしろよw
825デフォルトの名無しさん:2011/05/26(木) 18:44:57.36
バカなのかもしくは機械翻訳なのか
826817:2011/05/26(木) 21:57:39.89
なんだよおまえらprintf意外の話題にはめっきり弱いな…orz
827デフォルトの名無しさん:2011/05/26(木) 22:01:50.65
高得点もらうとどうなるの?
828デフォルトの名無しさん:2011/05/26(木) 22:32:56.46
リスト構造のノードの探索で最初のポインタから探索していくとやたら時間がかかるのですがそういう
場合はハッシュでいいのでしょうか?

ハッシュを使わないならば関数を配列っぽく利用してリスト構造の位置を
保存っていう方法は危険でしょうか?
829デフォルトの名無しさん:2011/05/26(木) 22:51:29.74
>>828
データ構造とアルゴリズム

どんな構造にも得意不得意がある
重要な部分が得意になるように考える
なんとなくハッシュ+リストでいいかもねと思うが詳細不明なので何とも
後半はよく分からん

まあ詳細かかれても答えられんけどね
830デフォルトの名無しさん:2011/05/26(木) 23:20:12.67
>>828
まずは二分木
831デフォルトの名無しさん:2011/05/26(木) 23:25:11.43
>>828
リストにしなければならないかどうかを検討してみるとか。
832デフォルトの名無しさん:2011/05/27(金) 01:02:40.08

定数はdefineを使う

#define a 123456


定数の集合である配列はどうできるでしょうか?

int a[ ] = {1,2,3,4,5,6,};
↑これでは変数になってしまう
833デフォルトの名無しさん:2011/05/27(金) 01:06:39.95
const int a[] = {1,2,3};
834デフォルトの名無しさん:2011/05/27(金) 11:15:25.40
なあ DLLって読み込むとDllMainというのがよばれるじゃん。
メインの処理ってそこでDllMainが終わるまでとまるん?
そんともdllよんだらそのままスレッドみたくべつ処理になるのん?
835デフォルトの名無しさん:2011/05/27(金) 12:07:24.78
英字を入力した際に、小文字なら大文字、大文字なら小文字に変換するプログラムを教えて頂けますか?
例:AbCd→aBcD
宜しくお願いします。
836デフォルトの名無しさん:2011/05/27(金) 12:21:52.29
>>835
isupper なら tolower
islower なら toupper
837デフォルトの名無しさん:2011/05/27(金) 12:30:29.16
^32
838デフォルトの名無しさん:2011/05/27(金) 12:49:22.02
>>836
連続して10文字以上を変換する方法がわかりません。
一文字ならできるんですが
839デフォルトの名無しさん:2011/05/27(金) 12:56:53.09
一文字ずつ変換しろよ
840デフォルトの名無しさん:2011/05/27(金) 13:00:54.77
>>834
スレ違いだし やってみりゃいいじゃん。
841デフォルトの名無しさん:2011/05/27(金) 13:38:34.57
>>833

ありがとうございます。
842デフォルトの名無しさん:2011/05/27(金) 13:43:25.44
>>837
なるほどそんな風にもできたのか
843デフォルトの名無しさん:2011/05/27(金) 14:08:33.47
ASCII 依存だから失格。
844デフォルトの名無しさん:2011/05/27(金) 18:02:31.81

c言語のデバッガを紹介してください。

サクラエディタで書いて、
コマンドプロンプトでbcc32としています。

なるべくシンプルがいいです。
845デフォルトの名無しさん:2011/05/27(金) 18:03:52.76
変数の値が知りたいところにprintf文を入れる
846デフォルトの名無しさん:2011/05/27(金) 18:08:35.48
変なことが起きそうな場所でassertする
847デフォルトの名無しさん:2011/05/27(金) 18:46:23.77
アセンブリを読む
848デフォルトの名無しさん:2011/05/27(金) 19:31:33.10
英文の中に含まれている異なった単語の数を求めよ。

今自分は単語の数を求めるところまで出来ましたが異なった単語を分けるのに詰まっています。
単語を保存、登録し、重複した単語を省いていこうとしてますが上手くいきません
助言を頂けないでしょうか?C言語です
↓今のプログラムです↓
http://pastebin.com/8RvS49Bt
849デフォルトの名無しさん:2011/05/27(金) 19:38:46.89
nwrd++;す
850デフォルトの名無しさん:2011/05/27(金) 19:49:05.19
C++で書かれた静的ライブラリをC言語で組み込みたいんですが,そうゆうことは可能なのでしょうか?
MacOSXでgccでコンパイルしてまいます.
851デフォルトの名無しさん:2011/05/27(金) 19:51:26.30
ハッシュ使えば楽だよね。
852デフォルトの名無しさん:2011/05/27(金) 19:54:17.30
>>826
ロックすればいいよ
853デフォルトの名無しさん:2011/05/27(金) 19:56:38.86
>>848
今のプログラムを見ていないけど、重複していれば登録しないようにすればいいと思うよ

>>850
C++のコードを変更できるならextern C、できないならマングリングされた名前で呼ぶ
854デフォルトの名無しさん:2011/05/27(金) 20:00:15.12
C言語で関数内関数なんて許されてるんだなしらんかった
しかもスコープも関数内っぽくて外側のローカル変数呼べるとは
なんか慣れないものを見ると気持ち悪い
855デフォルトの名無しさん:2011/05/27(金) 20:02:01.77
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();
}
}
856855: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デフォルトの名無しさん:2011/05/27(金) 20:54:06.93
改良型逐次探索法を用いて、整数が昇順にソートされているファイルから、ある整数を検索するときの
比較回数を調べたいのですが
以下のものだと比較回数が僅かに少なく、データファイル値域外の判定をしなかった
またはデータファイル値域外判定のときに比較回数を数えなかったからだといわれました。
どこをどうすればいいの?
858デフォルトの名無しさん:2011/05/27(金) 20:56:10.22
>>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;
859デフォルトの名無しさん:2011/05/27(金) 22:01:55.61
>>856
C1xに入る予定です
860デフォルトの名無しさん:2011/05/27(金) 22:10:48.35
>>848
一部コンパイラ(gccのみ?)しかコンパイルできないので関数内に関数を定義しないほうがよい
方針は言ってるとおりでいいと思うし、Entryの実装がおかしい以外は大体いいかな?
おかしい点は、文字列とポインタ関連
・63行目if条件がいらない
・68行目では何がしたいのか?intに"\0"を入れるのは間違っている

こういう宿題的なプログラムを作るのが久しぶりで楽しかった
http://pastebin.com/8pBgue5i
861デフォルトの名無しさん:2011/05/27(金) 22:19:13.22
関数内に関数はクロージャだっけ?
Pascalから見掛けるようになったが

C++は関数内でクラスは定義出来るのでそれで代用してるけど
あまり意味ない
862デフォルトの名無しさん:2011/05/27(金) 22:37:02.04
860のコードかいてて分からなかったんだが
char *mystrdup(const char *src)
みたいなのにcharの配列を渡しても警告は出ないが、
int exist(const char *list[], int list_num, const char *word)
としたときlistにchar*の配列を渡すとincompatible pointer typeって警告が出る

listはそれ自身もそのポインタの先も変更する気がない場合
引数の方は本来どう定義するべきもの?
863デフォルトの名無しさん:2011/05/27(金) 22:38:25.41
変換ミス
×引数の方は本来どう定義するべきもの?
○引数の型は本来どう定義するべきもの?
864デフォルトの名無しさん:2011/05/27(金) 22:52:40.63
>>848
それって大学の宿題なの?
865デフォルトの名無しさん:2011/05/27(金) 23:22:25.19
>>859
ググったけど英語ページしかでてこない読めないので日本語でだれかc1xの解説よろ
866844:2011/05/27(金) 23:23:34.40
>>845
>>846
>>847


ありがとうございます。
867デフォルトの名無しさん:2011/05/28(土) 01:15:26.41
>>861
関数内関数がクロージャとは限らんだろう
868デフォルトの名無しさん:2011/05/28(土) 01:45:59.46
>>867
限らないというか、pascalのやC++の関数の中のクラス定義は
クロージャとだいぶ違うよね。
869デフォルトの名無しさん:2011/05/28(土) 02:26:02.47
>>862
typedef const char (*MYARR)[];

void func(MYARR list){}

void main(void){
char *hoge[1];
func((MYARR)hoge);
}

呼ぶ時にキャストしないといけないのがなんとも。
870デフォルトの名無しさん:2011/05/28(土) 02:44:22.47
>>853
ありがとうございます

現在、chipmunkとbox2Dのどちらかを使用してゲームをつくろうとしていました。いろいろ試行錯誤してみます。
871デフォルトの名無しさん:2011/05/28(土) 06:01:38.87
>>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で割り切れる」が抜けて画面に出力されます。なぜでしょうか?
ほんと、こんな質問してすみません・・
873デフォルトの名無しさん:2011/05/28(土) 07:41:25.83
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文の条件にインクリメント演算子を使って上記のソースの実行結果と同じにするにはどうすればよいでしょうか?
875デフォルトの名無しさん:2011/05/28(土) 08:22:48.83
>>874

do {
    if(n%i == 0) {
        printf(" %d は%dで割り切れる.\n",n,i);
    }
} while(i++ < 52 );



i = 0;

のどちらか
876デフォルトの名無しさん:2011/05/28(土) 08:50:49.02
つーか、forでできることをwhileでするな。
do whileが妥当なときにwhileにするな。
877デフォルトの名無しさん:2011/05/28(土) 08:58:13.27
そんなこといったらwhile使えないじゃないか
878デフォルトの名無しさん:2011/05/28(土) 09:14:43.16
forとかwhileを使うパターンってもう半ばイディオムとして覚えてる感じだなあ
879デフォルトの名無しさん:2011/05/28(土) 10:29:30.93
>>874
> while文の条件にインクリメント演算子を使って上記のソースの実行結果と同じにするにはどうすればよいでしょうか?

評価順とかわからない(上のプログラムの動作が予想できない)なら、インクリメントとか
whileの条件式から外に出した方がいいでしょ。

どうでもいい工夫のための質問するより、わかりやすいプログラム書きなよ。
880デフォルトの名無しさん:2011/05/28(土) 12:43:12.86
874です。解決しました。皆さんありがとうございました。
大学の宿題でwhileの条件式にインクリメント演算子を使って書き直せとあったもので…

881デフォルトの名無しさん:2011/05/28(土) 14:29:43.88
21世紀の大学生ってこんなレベルだったの?
882デフォルトの名無しさん:2011/05/28(土) 14:31:02.56
俺が大学生の頃はスクラッチでLISPインタプリタ書いてた
883デフォルトの名無しさん:2011/05/28(土) 14:49:56.67
プログラミングに興味があるならもっと早くやってるだろうしな
884デフォルトの名無しさん:2011/05/28(土) 16:29:21.05
そもそもプログラミングの宿題をネットで聞いちゃう人はなぜ情報系を学んでいるのか聞きたい
885デフォルトの名無しさん:2011/05/28(土) 18:06:04.73
聞くなとは言わんが、単語を一つ二つググればわかるような事がたまに質問されてたりするのは・・・
886デフォルトの名無しさん:2011/05/28(土) 18:19:48.76
プログラムの授業が情報系とは限らない
文系がパンキョーでとってるのかもしれないし
887デフォルトの名無しさん:2011/05/28(土) 18:51:28.73
就職はコンピュータ関係じゃないし、単位取れればそれでいいって感じなんだろうな。
888デフォルトの名無しさん:2011/05/28(土) 19:53:49.65
pthread_cancel()に相当する処理をglibで書く場合おまえらどうしてる?
889デフォルトの名無しさん:2011/05/28(土) 19:54:39.58
でもこのWhile文の質問はさすがにひどすぎねえ?
890デフォルトの名無しさん:2011/05/28(土) 19:58:24.09
俺バカだからたまに同じようなミスする。
891デフォルトの名無しさん:2011/05/28(土) 21:27:00.49
俺は情報系だが、コンピュータ関連の仕事につくよ、単位はギリギリだが。
ただ単位はそう簡単に取れるもんじゃない。パソコン幼少時からいじってきた
貴様らと違って大学入ってからコンピュータいじる奴もいるんだよ。

特に大学1年の間はなれない事が多く掲示板や参考書に頼る事も多い。


892デフォルトの名無しさん:2011/05/28(土) 21:41:43.76
講義だけで理解できないなら、先はないな
893891:2011/05/28(土) 21:54:39.88
>>892
黙ってろよムカツクな。
貴様だって最初は理解出来ない事も多かったんだろうが。
894デフォルトの名無しさん:2011/05/28(土) 22:19:40.63
随分上から目線のゆとりだなw
895デフォルトの名無しさん:2011/05/28(土) 22:34:47.70
プログラム関連は仕事になるとつまらなすぎてワロえない
なんだよ、ソースを1行変えたからテスト検証テスト検証・・・
コンパイラが変わったからテスト検証テスト検証・・・
896デフォルトの名無しさん:2011/05/28(土) 22:35:21.12
講義だけで理解できないなら、先はないな
897891:2011/05/28(土) 22:39:35.68
>>896
黙れつってんだろ。

プログラミング何て単純作業だろうが。
馬鹿でも時間かけて凝ればたまにいいの作るし。

お前はそんなに偉いんか?
898デフォルトの名無しさん:2011/05/28(土) 22:41:26.27
>>895
そりゃその1行の変更やコンパイラの変更で痛い目にあってるからしょうがない。
899デフォルトの名無しさん:2011/05/28(土) 22:41:31.53
>>897
例えば何なら単純作業じゃないの?
900891:2011/05/28(土) 22:47:36.61
>>899
クリエイティブな仕事は単純作業じゃない。
スポーツ選手、漫画家などなど。
901デフォルトの名無しさん:2011/05/28(土) 22:50:43.03
>>900
そっか
902891:2011/05/28(土) 22:54:57.92
>>901
文句あんのかおら。
903デフォルトの名無しさん:2011/05/28(土) 22:56:26.65
また激しくイタいのがきたな。
904デフォルトの名無しさん:2011/05/28(土) 23:00:14.26
正規表現ってなんだよ
どうやって使えばいいんだよコノヤローオメー
905デフォルトの名無しさん:2011/05/28(土) 23:19:01.46
>>900
> スポーツ選手、漫画家などなど。

ひたすらバット振り続けるとか、スクリーントーンを張り続けるとか...
単純作業の連続だぞ。
906デフォルトの名無しさん:2011/05/28(土) 23:24:01.94
娯楽産業の担い手に夢を見るのは若気の至りだ。
907デフォルトの名無しさん:2011/05/28(土) 23:24:58.80
>>905
振り方一つだって、色んな工夫してるぞ。昨日と同じなんてしていない。

スクリーントーンを張るのは、普通アシスタントだろう。
そういうのを自分でやってるなら、まだ売れてない漫画家。
そういうのに時間をとられてたら、クリエイティブな仕事はできない。
908891:2011/05/28(土) 23:25:08.89
>>905
黙ってろ。

プログラミングは単純作業どころか適当に作ってもいいものができる。
909デフォルトの名無しさん:2011/05/28(土) 23:27:00.00
>>905
ストーリーを抜いて画だけで考えると
単純作業と思えるほど自然に画を画けないと
締め切りに間に合わないだろうな。
910デフォルトの名無しさん:2011/05/28(土) 23:27:07.05
逆に考えるんだ

宇宙そのものがそもそも単純作業の集合でできていると
911デフォルトの名無しさん:2011/05/28(土) 23:27:14.18
>>908
じゃあ宿題も適当に作ってできたいいものを提出してればいいじゃん
なにもこんなところで要らない知識を得る必要もない
912デフォルトの名無しさん:2011/05/28(土) 23:28:54.22
>>900
単純作業じゃない仕事をクリエイティブな仕事って言うんだよ
何を言ってるんだ
クリエイティブな仕事っていうのは業種にかかわらず仕事の仕方しだいだよ
913デフォルトの名無しさん:2011/05/28(土) 23:32:11.44
>>907
スクリーントーンを貼らない漫画家はどうですか

てか、スポーツ選手がクリエイティブな仕事であるっていうのは初めて聞いたかも知れん。
単純作業じゃないことは確かだけど、クリエイティブ?
914891:2011/05/28(土) 23:37:32.53
>>910
ゆとりは寝ろ。
>>912

プログラミングの場合はなぁ、むりやり頭ひねって、こねくり回して
生み出したぎこちないアイデアでもマシンパワーで何とでもなるんだよ。
915デフォルトの名無しさん:2011/05/28(土) 23:37:46.61
>>907
>振り方一つだって、色んな工夫してるぞ。昨日と同じなんてしていない。

ん?

プログラマだって工夫はしてるだろ。

してない?

だから君は単純作業しか「させてもらえない」んだろ。(w
916891:2011/05/28(土) 23:40:57.83
客観的な事実として

スポーツ選手や漫画家のほうが、プログラマーより数少ないだろw
どっちのほうが簡単な職業かは口に出さずとも明白。
917デフォルトの名無しさん:2011/05/28(土) 23:42:30.33
>>916
競技人口比べたら圧倒的にスポーツ選手のほうが多いぞ
918デフォルトの名無しさん:2011/05/28(土) 23:42:56.20
簡単なことならこんなところで油売ってないではやく宿題終わらせて寝ろよ
919デフォルトの名無しさん:2011/05/28(土) 23:44:23.72
>>917
競技人口多くても、少数しかなれないのがスポーツ選手だよ。
920デフォルトの名無しさん:2011/05/28(土) 23:46:38.80
>>919
スポーツ選手かっけー
921891:2011/05/28(土) 23:47:43.83
>>920
だろ?
趣味が高じれば誰でもなれるプログラマーや、試行錯誤する体力されあれば
誰でもなれるエンジニアとは訳が違う。
922デフォルトの名無しさん:2011/05/28(土) 23:48:23.84
情報メディア白書2009によると漫画家の数は2007年時点で5063人だそうだ。
君たちは一年間に何本漫画を読んだんだ?
923デフォルトの名無しさん:2011/05/28(土) 23:50:06.37
右脳を使う仕事ほどクリエィティブ。理系の仕事はどうしても左脳になりがち。
924デフォルトの名無しさん:2011/05/28(土) 23:52:08.48
>>921
誰にでもできるはずの作業を質問するなよ
925デフォルトの名無しさん:2011/05/28(土) 23:53:27.65
>>921
お前が何が気に食わないか知らないけど
プログラマー、エンジニアだけに限らずほぼ全職業そうなんじゃね
926デフォルトの名無しさん:2011/05/28(土) 23:55:42.21
>>921
職業として食っていけるかどうかは
どれだけ需要があるかが関係するだけのこと
プログラマはそれだけ需要があるってだけ
プロスポーツ選手はそんなに人数いらないってだけ
927デフォルトの名無しさん:2011/05/28(土) 23:57:46.47
偉い人間は誰にでもできる作業を下の人間にやらせるだろ。
完全論破終了。

928デフォルトの名無しさん:2011/05/29(日) 00:00:01.88
偉いんじゃなくて雇う金があるからだよ。
じゃあその金をどこから持ってくるんだって話。
929デフォルトの名無しさん:2011/05/29(日) 00:00:03.17
>>926
その考えていけば文系の仕事に携わってる人間はは理系の仕事のそれより
多いよな。
930デフォルトの名無しさん:2011/05/29(日) 00:00:42.45
> 貴様らと違って大学入ってからコンピュータいじる奴もいるんだよ。
> 特に大学1年の間はなれない事が多く掲示板や参考書に頼る事も多い。

これについてだけど、大学入ってからコンピュータいじったし
インターネットは存在していたけど、頼るような掲示板は知らなかったし、
むしろインターネットに不慣れだった、そんな俺でも単位取れたよ。

自分で書いてるように参考書に頼ったらどう?
931デフォルトの名無しさん:2011/05/29(日) 00:00:50.68
単純作業の組み合わせだから、奥が深いんだよ
932デフォルトの名無しさん:2011/05/29(日) 00:02:30.70
公務員だと偉くなればなるほど仕事きつくなるって
防大出の友達言ってた
933デフォルトの名無しさん:2011/05/29(日) 00:02:48.71
単位取りはやり方次第でどうにでもなるでしょ。
身に付いてるかどうかは別のような
934デフォルトの名無しさん:2011/05/29(日) 00:06:14.91
891ではないが。

>>930
何言いたいの?
単位取れるか取れないかは人それぞれだし。
>>928
経営者が一番偉いんじゃないか?
935デフォルトの名無しさん:2011/05/29(日) 00:07:04.51
>>929
どういうこと?
文系のほうが需要が多いってこと?そうなの?
936デフォルトの名無しさん:2011/05/29(日) 00:08:29.81
おれはスポーツで稼いでる人はプロスポーツ選手って言うけど、
プログラマはそれで生活してるってだけでプロって言うのは
抵抗あるんで職業プログラマって言ってる。

日本の職業プログラマ60万人のうち、6,7割は趣味プログラマーに
負けてるレベルだしな。
937デフォルトの名無しさん:2011/05/29(日) 00:08:51.78
偉いと優秀は比例しないケースも多いからな
えーとここなんのスレだったけ?
938デフォルトの名無しさん:2011/05/29(日) 00:10:13.57
スレタイには C言語なら俺に聞け と書いてあるっぽい
939デフォルトの名無しさん:2011/05/29(日) 00:12:02.63
だから偉いとか偉くないとかそういう子供じみた考えは捨てろ。
940デフォルトの名無しさん:2011/05/29(日) 00:14:23.65
人あまり状態、でもモノによってやれる人がいないってのが現実では?
マ版ネタだね。
941デフォルトの名無しさん:2011/05/29(日) 00:14:31.71
さすがに
プログラマー>>趣味プログラマーだと思うぞ。
実践で役に立つものを作ってこそ有能なんだよ。

スポーツ選手に絶対的価値を見出してる俺でもプロフェッショナルという
事は実践、つまり制限された状況で発揮する能力だと思うから。

942デフォルトの名無しさん:2011/05/29(日) 00:16:19.21
891がすでに消え去った中・・・
一体みんな誰と戦っているんだ・・・
943デフォルトの名無しさん:2011/05/29(日) 00:16:32.70
職業プログラマー60万人もいるのかww
システムエンジニアは別だろw?
情報系の学部出たら誰でもなれるじゃねーかwww
944デフォルトの名無しさん:2011/05/29(日) 00:16:45.29
>> プログラマー>>趣味プログラマーだと思うぞ。
使えない人の多さですねわかります
945デフォルトの名無しさん:2011/05/29(日) 00:18:43.14
ヘッダファイルからヘッダファイルをインクルードするのってよくないことなんでしょうか?
ソースとしては小さいモジュールに分かれていてヘッダファイルが複数あったとして、
ひとつのヘッダファイルを読めば1機能(複数モジュール使用)が使えるようになるってふうでもいいのでしょうか?
946デフォルトの名無しさん:2011/05/29(日) 00:19:28.38
趣味っていう時点でプロフェッショナル性0だろwww

所詮、ちょっと器用なメカ好きお兄ちゃんみたいな体だろwww
947デフォルトの名無しさん:2011/05/29(日) 00:21:14.15
ネットでよく「新人はなにも知らないやつがいい。
独学でやってるやつは変なクセがついててダメだ」みたいな
ことを言ってるやつがいるけど、ああいうのは趣味の学生に
負けてるんだろうな。
948デフォルトの名無しさん:2011/05/29(日) 00:23:42.66
>>946
lhaの吉崎さんは全然違う職を持ってる趣味プログラマーだったような
949デフォルトの名無しさん:2011/05/29(日) 00:27:42.26
選択肢が多いプログラミングの分野何て趣味で何とかなる世界。
たいていの人間はプログラミングになんて興味ないから。
950デフォルトの名無しさん:2011/05/29(日) 00:28:34.05
趣味とか関係なくて、できる奴はできる。
職業でも、なんとなくノルマこなしてるだけって人もいるし
951デフォルトの名無しさん:2011/05/29(日) 00:30:18.77
俺はプログラミング15年やっててもすごく楽しいけどなぁ
自分で考えたものが動くって 男の子のロマンだし。
ここのみんなは楽しんでないんだね。
952デフォルトの名無しさん:2011/05/29(日) 00:31:48.78
いや、苦しでるのを見たい人がいるんですよ、上のほう
953デフォルトの名無しさん:2011/05/29(日) 00:32:04.90
>>951
あー、確かに
自分で設計した物が形になっていくのは楽しいな
954デフォルトの名無しさん:2011/05/29(日) 00:32:11.70
いくら高速のアルゴリズムを考えても、光を超えるスピードのアルゴリズムは
不可能、所詮パズル遊びなのがプログラミングの分野。
955デフォルトの名無しさん:2011/05/29(日) 00:34:14.19
最終的には1と0の組み合わせで動いてるんだし、CPUには単純作業
956デフォルトの名無しさん:2011/05/29(日) 00:34:21.17
アマチュアは甘え
957デフォルトの名無しさん:2011/05/29(日) 00:36:24.15
>>950
>職業でも、なんとなくノルマこなしてるだけって人もいるし

多くの職業プログラマに求められているのは、
言われたとおりに、余計なものがないコードを書くこと。
早過ぎもせず、送れもせず、予定通りに要求仕様を消化してくれること。
958デフォルトの名無しさん:2011/05/29(日) 00:37:44.09
変なクセというか無意味な技巧に走るんだな。
変数名を漫画のキャラクター名にしたりといった遊び心も忘れずに
そういうのが工業製品としてはマイナス。

たとえば仕事で急いでいるときにタクシー呼んだら運転手の好みのキャラの痛車だったりとか困るだろ?
959デフォルトの名無しさん:2011/05/29(日) 00:44:38.13
業務で動かすコードは普通に書いてても、
支援ツールみたいに自由にかけるものだと、すごいコード書く人、いるよね。
良いか悪いかは別にして、仕事ってそういうものだと思った。
960デフォルトの名無しさん:2011/05/29(日) 01:15:51.90
>>947
独学でツールを作って公開(できればソースも)している奴は多分文句なしでしょうね。
独学でなんかしてて人様に見せたこともないのに
つらつらと語りだすのは変な癖というか人間自体が変です。

まあ大抵の新人はオマエ舐めてるだろっていうレベルです。
961デフォルトの名無しさん:2011/05/29(日) 01:22:51.29
>>956
確かに納期がひっつくと死ぬほど苦しいですね。プロって大変ですね。
962デフォルトの名無しさん:2011/05/29(日) 08:01:25.43
で、マ板でやるべき話はそろそろ終わった?
963デフォルトの名無しさん:2011/05/29(日) 08:28:07.43
>>945
> ひとつのヘッダファイルを読めば1機能(複数モジュール使用)が使えるよう
> になるってふうでもいいのでしょうか?

その考えは正しいと思うし、普通にやられてる。

処理系が提供しているヘッダーファイル見てみればいい。

あと、事前に "インクルードガード" でググってみておいたほうがいい。
964デフォルトの名無しさん:2011/05/29(日) 18:59:37.00
データを入力して四次の行列式を計算させるプログラムを作りたいんですが、どなたか教えてもらえませんか?
どっかのってるサイトとかないですか?
965デフォルトの名無しさん:2011/05/29(日) 19:13:31.35
数学の参考書でも見ればいいんじゃないでしょうか
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);
}
だと設計と実装はどう記述されるんでしょうか?
968デフォルトの名無しさん:2011/05/29(日) 21:16:07.13
フローチャートとかじゃない?
969デフォルトの名無しさん:2011/05/29(日) 21:20:41.88
建築なら、設計は図面、実装に当たるのは実際に建築物を建てるで分かりやすいんだが

プログラムの場合設計書を見ながら実装を書くという概念が全く持って理解できません。

教えてください・・・

970デフォルトの名無しさん:2011/05/29(日) 21:21:36.73
>>969
データフローが設計書だと思う
971デフォルトの名無しさん:2011/05/29(日) 21:26:21.98
>>967のプログラムにデータフローを書くとか指南の技ですよね。
どんな屁理屈でもってそんな大層な事をやる必要があるんでしょう。
972 [―{}@{}@{}-] デフォルトの名無しさん:2011/05/29(日) 21:27:52.98
昔はハードウェアが高価で動作速度も遅かったから
今みたいにデバッガで動かしながら開発するのは効率が悪かった
そのころの開発スタイルに慣れてるやつが設計と開発を分けて非効率的なやり方を
おしつけてるだけだよ。いきなりコードを書くのが正しい
973デフォルトの名無しさん:2011/05/29(日) 21:31:19.92
設計とは何なのでしょうか?分かりません。
974デフォルトの名無しさん:2011/05/29(日) 21:33:59.14
そんな根源的な質問されても困るよな。
975デフォルトの名無しさん:2011/05/29(日) 21:38:25.15
ttp://www.prognavi.com/progdoc.html
ここに書かれている事に僕も同意なんですよ。

プログラムの設計とか全く意味が分かりません・・・
976デフォルトの名無しさん:2011/05/29(日) 21:43:29.44
わからない人のためのものだからね。わからなくても大丈夫
977デフォルトの名無しさん:2011/05/29(日) 21:46:00.14
確かに図面の設計書って言われても意味わからんからな。
978デフォルトの名無しさん:2011/05/29(日) 21:49:14.48
コードに対応するレベルの設計はいらないよな。
上のレイヤーの設計は必要だけど。
979デフォルトの名無しさん:2011/05/29(日) 22:06:04.20
コード1行を日本語1行にしたような設計書は確かにあまり意味無いと思う
だから>>967のような一言ですべてを表せるプログラムに設計はいらない
980デフォルトの名無しさん:2011/05/29(日) 22:08:15.50
たとえばVisualStudioであるような巨大プログラムでは、機能(関数)ごとに実装することが必要になり、
「機能ごとに」というのをどういう風に区切るか、どういう階層になるのか、などの考え方をまとめる必要がある
こういうのも設計で、これは確実に必要
981デフォルトの名無しさん:2011/05/29(日) 22:08:50.06
て言うか、実装見せられて「設計」はどうなってるって聞かれても困るわな。
982デフォルトの名無しさん:2011/05/29(日) 22:13:12.04
>>967
そのソースを、丸と線と矢印と名前だけで、概念を簡単な図にしてみろ。
極論言うと、それが設計だよ。
983デフォルトの名無しさん:2011/05/29(日) 22:24:59.71
内部(計算)
1を記憶 1→□
1を記憶 1→△
する処理@

□+△を計算する処理A

@→A

外部(出力)
??????????B←/*1+1の結果2を表示する*/


>>982
こんな感じですか?
984デフォルトの名無しさん:2011/05/29(日) 22:31:51.09
あぁだめだくそ、設計が全然わからん。

図で書く概念の中に実装が混じる。
985デフォルトの名無しさん:2011/05/29(日) 22:45:15.76
>>983
そんな詳細に書かないでいい。もっと漠然としてていい。


|ーーー>画面だす


こんなんで十分。
986デフォルトの名無しさん:2011/05/29(日) 22:48:48.54
>>985
うんww
987デフォルトの名無しさん:2011/05/29(日) 23:32:01.38
なにそのちんこ
988 [―{}@{}@{}-] デフォルトの名無しさん:2011/05/29(日) 23:41:41.42
ちんこ画伯
989デフォルトの名無しさん:2011/05/30(月) 00:17:26.31
>>985
まじめにお願いします・・・
>>987の通りじゃないですか・・
990デフォルトの名無しさん:2011/05/30(月) 00:56:29.03
お前らまとめてマ板行けよ
うっとおしいから次スレには来んな
991デフォルトの名無しさん:2011/05/30(月) 01:18:18.92
>>989


|ーーー> 〜○ [  ]


正しくはこうだ
992デフォルトの名無しさん:2011/05/30(月) 01:49:24.47
すいません
scanfによって整数値を入力させ、1からその値までの間にある全ての素数を順に列挙するプログラムをつくりなさい。
これのコードを、わかりません。
教えてください
993デフォルトの名無しさん:2011/05/30(月) 02:10:09.40
>>992
あなたの日本語がわかりません。取り敢えず宿題スレは如何でしょう。
994デフォルトの名無しさん:2011/05/30(月) 02:12:34.97
>>992
Wikipediaの素数判定の項目見ると
試し割りのだけどCのコードが載ってるよ
995 忍法帖【Lv=1,xxxP】 :2011/05/30(月) 02:14:32.35
うめ
996デフォルトの名無しさん:2011/05/30(月) 03:31:35.42
うめ
997デフォルトの名無しさん:2011/05/30(月) 06:20:07.05
次スレ立てます
998デフォルトの名無しさん:2011/05/30(月) 06:21:49.04
次スレ立てました
C言語なら俺に聞け(入門編)Part 85
http://hibari.2ch.net/test/read.cgi/tech/1306704064/
999デフォルトの名無しさん:2011/05/30(月) 07:14:56.29
どうも∩ありがとう。
1000 忍法帖【Lv=1,xxxP】 :2011/05/30(月) 07:33:45.67
>>998
おつうめ
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。