トップページ⇒tech
1001コメント263KB

C言語なら、俺に聞け! <32>

■ このスレッドは過去ログ倉庫に格納されています
0001SHOW-A孫NGNG
漏れ10才。3才のときから父SHOW-A息子にプログラムを叩き込まれてきたんだ。
いろいろな言語を極めたけど、一番漏れになじんだのはCかな。
Cのことなら父をも超えた。疑問な点があったら漏れに聞け。

便所とメシ食ってる時以外は暇だが、いちいちFAQに載った質問に応えるほど暇じゃないよ。
課題丸投げなら別スレにいってね。あと、至急父に仕事を与えてやってください。

コンパイラ、過去ログなどのリンクは>>2-5 あたり
0002SHOW-A孫NGNG
【コンパイラ】
gcc
http://gcc.gnu.org/

【Win32用の開発環境のみ。】
gcc-cygwin
http://www.redhat.com/software/tools/cygwin/
gcc-mingw
http://www.mingw.org
Digital Mars C++
http://www.digitalmars.com/
Open Watcom
http://www.openwatcom.com/
Borland C++ Compiler 5.5.1
http://www.borland.co.jp/cppbuilder/freecompiler/

【ライセンスや機能などに問題あり】
Microsot C/C++ 13.0.9466(VC.NET)
http://www.microsoft.com/japan/msdn/netframework/downloads/
LCC-Win32
http://www.cs.virginia.edu/~lcc-win32/
CINT
http://root.cern.ch/root/Cint.html
めじろ++98
http://www.vector.co.jp/soft/win95/prog/se075910.html
0003SHOW-A孫NGNG
【その他】
http://www.cmt.phys.kyushu-u.ac.jp/~M.Sakurai/prog/progf.html
http://www.bloodshed.net/index.html

【注意】
Cmachineは一般的なCと挙動が違いすぎるので動作の保証はできません。
まともな処理系を使いましょう。
0004SHOW-A孫NGNG
C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html
comp.lang.c FAQ(英語の原文)
http://www.eskimo.com/~scs/C-faq/top.html
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/
推薦図書/必読書のためのスレッド PART 5
http://pc3.2ch.net/test/read.cgi/tech/1027593322/

前スレ <31> http://pc3.2ch.net/test/read.cgi/tech/1031340950/
0005SHOW-A孫NGNG
【過去ログ】
31 http://pc3.2ch.net/test/read.cgi/tech/1031340950/
30 http://pc3.2ch.net/test/read.cgi/tech/1030786546/
29 http://pc3.2ch.net/test/read.cgi/tech/1029605182/
28 http://pc3.2ch.net/test/read.cgi/tech/1028495798/
27 http://pc3.2ch.net/test/read.cgi/tech/1027160374/
26 http://pc3.2ch.net/test/read.cgi/tech/1026048820/
25 http://pc.2ch.net/tech/kako/1024/10249/1024918442.html
24 http://pc.2ch.net/tech/kako/1024/10240/1024033400.html
23 http://pc.2ch.net/tech/kako/1023/10230/1023024817.html
22 http://pc.2ch.net/tech/kako/1022/10224/1022402165.html
21 http://pc.2ch.net/tech/kako/1022/10220/1022045622.html
20 http://pc.2ch.net/tech/kako/1021/10214/1021459016.html
19 http://pc.2ch.net/tech/kako/1020/10207/1020756993.html
18 http://pc.2ch.net/tech/kako/1020/10202/1020260813.html
17 http://pc.2ch.net/tech/kako/1019/10193/1019372139.html
16 http://pc.2ch.net/tech/kako/1018/10184/1018453690.html
15 http://pc.2ch.net/tech/kako/1016/10165/1016519243.html
14 http://pc.2ch.net/tech/kako/1015/10152/1015286974.html
13 http://pc.2ch.net/tech/kako/1013/10139/1013990673.html
12 http://pc.2ch.net/tech/kako/1012/10123/1012348974.html
11 http://pc.2ch.net/tech/kako/1009/10094/1009499565.html
10 http://pc.2ch.net/tech/kako/1008/10083/1008300863.html
9 http://pc.2ch.net/tech/kako/1007/10072/1007272267.html
8 http://pc.2ch.net/tech/kako/1005/10058/1005811510.html
7 http://pc.2ch.net/tech/kako/1003/10034/1003418249.html
6 http://piza2.2ch.net/tech/kako/999/999617524.html
5 http://piza2.2ch.net/tech/kako/994/994908590.html
4 http://piza.2ch.net/tech/kako/992/992357382.html
3 http://piza.2ch.net/tech/kako/989/989929288.html
2 http://piza.2ch.net/tech/kako/979/979529893.html
1 http://piza.2ch.net/tech/kako/967/967985026.html
0006デフォルトの名無しさんNGNG
>>1 乙
0007名無しさん@EmacsNGNG
>>1
お疲れ〜。これで粘着がいなくなるといいね。
0008デフォルトの名無しさんNGNG
>>1
おつかれ。
しかし、メール欄にvoidを忘れてる。
SHOW-Aがスレ主になっても、伝統は守らねば!

そしれ新スレ上げ
0009デフォルトの名無しさんNGNG
>>1
すげー、10歳で父を越えるとは。
将来有望じゃん。
0010デフォルトの名無しさんNGNG
>>1の居候のララベルです。
0011デフォルトの名無しさんNGNG
次スレはひ孫で次はやしゃごか?
0012デフォルトの名無しさんNGNG
ロマサガ2みたいに継承をきぼん
0013684NGNG
>>1
お疲れ様。

どうもこの684というハンドルは験が悪いようなので、次に質問する時は
また新しいナンバーを使います。
0014デフォルトの名無しさんNGNG
>>1
仕事を振るべきなのは祖父の方じゃなかったか?
0015デフォルトの名無しさんNGNG
>>13
気にするなよ。
一部のfread厨が騒いでいるだけだから。
でも他のスレでレス番号の684は使えないな(ワラ
0016デフォルトの名無しさんNGNG
mallocを使って動的に確保した3次元配列と同じくmallocを使って
確保した2次元配列をつくり、3次元配列の値を2次元配列に代入したいのですが
どうもうまく行きません。全て"0"の値をもつテストデータを3次元配列に格納
してから2次元配列へ

a=xxx[i][j][k];
xx[j][k]=a;

のように代入してからxx[j][k]の値を出力すると

4252620
4252620
0
0
0
0
.
.
.
のように、先頭2つにおかしな整数値が現れます。
どこがおかしいのでしょうか?
0017デフォルトの名無しさんNGNG
>>16
ソースを見せてもらわないと、文章だけじゃ分からないです…。
0018デフォルトの名無しさんNGNG
>>16 変数の型を正確に書け。どうやって表示したのかも
0019デフォルトの名無しさんNGNG
>>16
int xxx[ISIZE][JSIZE][KSIZE];
int xx[JSIZE][KSIZE];
だったら、
memcpy (xx, xxx[i], sizeof (xx));
でいけるんじゃないか?完全なコピーではないなら別だが

それはそれとして、おかしくなった原因を必ず突き止めておくべき。
最低でも変数定義、malloc部分、表示部分を見ないとわからない
002016NGNG
>>17>>18>>19
すみません。
結構長いコードなので、必要部分を抜き出して
再掲します。
0021デフォルトの名無しさんNGNG
ふーっ、また1はつまらん名前だな・・・
0022デフォルトの名無しさんNGNG
unsigned doubleは合法?
0023デフォルトの名無しさんNGNG
>>22
1ビット目使用しないだけ?扱える数増えるの?
0024デフォルトの名無しさんNGNG
>>22
そういう拡張をしてはならん、という規定はないと思うから、合法なんじゃない?
そんなの見た事ないけど。>>22がそれを何に使いたいのかも知らないけど。
0025デフォルトの名無しさんNGNG
符号なし浮動小数点数・・
002616NGNG
--->>16の再掲です。-----
void main(){
int ***xxx,***yyy,**xx,**yy,a;
// 3次元配列を確保
// 2次元配列を確保
//ファイルオープン
for(i=0 ; i < t ; i++){
for(j=0; j < 128 ; j++){
for(k=0; k < 40 ; k++){
fscanf(fp1,"%5d", &a);
x[i][j][k]=a; //データは全て"0"
}
}
for( m=0 ; m < 6400 ; m++ ){
for(i=0 ; i < t ; i++){
for(j=0 ; j < 128 ; j++){
for(k=0 ; k < 40 ; k++){
a=xxx[i][j][k];
xx[i][m]=a;
}
}
}
}
for( m = 0 ; m < 6400 ; m++ ){
for(i = 0 ; i < t ; i++ ){
xx=xx[i][m];
printf("%d\n",xx);
}
}
}
002716NGNG
改行の数が多すぎて書き込めないのでmallocを使った
配列の動的確保の部分はとりあえず省いています。
0028デフォルトの名無しさんNGNG
本当にきちんと三次元配列みたいなものをつくれているのかしら・・・心配だ。
002916NGNG
>>28
こんなのでやっていますが......。
(一応、失敗はしていないようです)
int ***new_matrix3d( int time, int range, int sector ){
int i,j;
int ***a;
if( ( a = ( int*** )malloc( sizeof( int** ) * time ) ) == NULL ) return NULL;
memset( a, '\0', sizeof( sizeof( int** ) * time ));
for( i = 0; i < time; i++ ) {
if( ( a[ i ] = ( int** )malloc( sizeof( int** ) * range ) ) == NULL ) {
free(a);
return NULL;
}
memset( a[ i ], '\0', sizeof( int* ) * range );
for( j = 0; j < range; j++ ) {
if( ( a[ i ][ j ] = ( int* )malloc( sizeof( int ) * sector ) ) == NULL ) {
free(a);
return NULL;
}
memset( a[ i ][ j ], '\0', sizeof( int ) * sector );
}
}
return(a);
}
0030デフォルトの名無しさんNGNG
一様乱数を作りたいんですが。
randでは無理ですよね?
0031デフォルトの名無しさんNGNG
>>29
ゼロクリアならmemset使わないでcallocでいいでしょ。
0032デフォルトの名無しさんNGNG
>>29
メモリーの確保に失敗した時、freeするのはaだけじゃまずいでしょ。
メモリーリークの原因になるよ。
0033デフォルトの名無しさんNGNG
>>26
for(i=0 ; i < t ; i++){
・・・
 for( m = 0 ; m < 6400 ; m++ ){
  for(i = 0 ; i < t ; i++ ){
   xx=xx[i][m];<−−−−−−−−??????
   printf("%d\n",xx);
  }
 }
}
?のとこはこれでいいつの?
0034デフォルトの名無しさんNGNG
>>30
ええ、思いっきり疑似乱数ですから。

数学の本見てその通り実装するのが吉。探せばありそうだけど。
0035デフォルトの名無しさんNGNG
>26
a=xxx[i][j][k];
xx[i][m]=a;
一対一の射像になっていない。>
0036デフォルトの名無しさんNGNG
>>26 >>29
まず、全然多次元配列になっていない。
003716NGNG
即レス有難うございます。
>>31
callocってつかった事が無くて...同じような使い方
ができるとは聞いていますが。
>>32
あ、そうですね。ループして全部開放して
やらないといけないですね。
>>33
そうです。まずいですか?
003833NGNG
>>36
斜め読みだと>>29は多事件配列になってそう(不安
0039デフォルトの名無しさんNGNG
>26
for(i〜〜){
for(i〜〜){ と iが2つ重なっているよ。
0040デフォルトの名無しさんNGNG
重箱

・多次元配列 a[1,3,5];
・配列の配列の配列 a[1][3][5];
0041デフォルトの名無しさんNGNG
xx=xx[i][m];これは駄目!
0042デフォルトの名無しさんNGNG
#define JSIZE 128
#define KSIZE 40
...
int t;
int (*xxx)[JSIZE][KSIZE];
int (*xx)[KSIZE];
...
xxx = malloc (sizeof (int) * t * JSIZE * KSIZE);
xx = malloc (sizeof (int) * JSIZE * KSIZE);
...

とりあえず、こっち↑のほうが余分なループがなくていいと思う。
xxは固定サイズなので、動的に割り当てる必要はないと思うのだが?
0043デフォルトの名無しさんNGNG
>>37
xxかえたら迷子にならない?
ポインタの計算元じゃあないの?
0044デフォルトの名無しさんNGNG
>>30
一様乱数で検索かければたくさん出てくるじゃん。
っていうか一様乱数って知らなかったから検索かけちまった。
004542NGNG
あっ、勘違いした!xxのサイズが全然違うな。スマソ
0046デフォルトの名無しさんNGNG
つーかポインタやりなおし
木構造実装してみ勉強になると思うよ
参考
struct foo{
 type Obj;
 foo* pParent;
 foo** pChild;
};
004742NGNG
ひょっとして、これって。。。

int (*xxx)[JSIZE][KSIZE];
int (*xx)[JSIZE * KSIZE];
...
int xxx_size = sizeof (int) * t * JSIZE * KSIZE;
xxx = malloc (xxx_size);
...

xx = xxx; // 内容を一致させるのであれば、ポインタの置き換えで終わり
または
xx = malloc (xxx_size); // 同じサイズ
memcpy (xx, xxx, xxx_size); // コピー

これで終わり?
0048デフォルトの名無しさんNGNG
>>46
そういうあなたもポインタを勉強し直してね。
foo *pChild;でしょ。
0049デフォルトの名無しさんNGNG
>>46
> foo** pChild;

これに何入れるか教えてあげないと怪我すると思った。
005048NGNG
違う、
struct foo *pChild;だ。
00511NGNG
これのやり方おしえてください。
基本情報の問題なんですけど、ずっとわからなくて次に進めません。
回答や参考書を見てもわからないです。
どなたかわかりやすく教えてください!
--------------------------------------------------------------------------------
次のような3バイトで数値±a×16^nを表現する浮動小数点がある。

     |    指数部7ビット  |       仮数部16ビット     |
 ┌─┐─────────┐──────────────┐
 │   |        n         |             a            |
 └―┘―――──――――┘―――───────――――┘
  ↑         ↑     ▲
ビット0  数値全体の符号   小数点の位置
      (0:正、1:負)

・仮数部の数値は、絶対値で表す。 0<=a<1。
・指数部のnは、指数部が16^nであることを表す。
・指数部のnの負数は、2の補数で表す。

この形式で表現できる負の数の最大値(0に最も近い値)はどれか。


ア 000001   イ 00FFFF   ウ 410001   エ C00001   オ F00FF1
---------------------------------------------------------------------------------
答えは「エ」なんです。でも、やり方がわかりません。
自分で問題を解いた時は、
「この形式で表現できる負の数の最大値(0に最も近い値)はどれか。」
と書いてあるので1 111 1111 1111 1111 1111 1111(2)にしてFFFFFF(16)って
答えがなったんですけど、解答欄にないんです。
005246NGNG
>>47
ああそれだ!
005316NGNG
>>38
え.....そんな....。
>>39
あ、ミスです。i〜、j〜です。
>>40
重箱??
>>41
あ、そうでした。
a=xx[i][j];
とかにしないと。

>>42
それでも2次元、3次元つくれるんですね。
(知らなかった)
xxのインデックスも変わる可能性があるので、一応、
動的に割り当てています。

とりあえずありがとうです。
今日は終電近いので帰ります。
(連休も無しだな......とほほ。)
明日またレスします。
0054デフォルトの名無しさんNGNG
>>51
あちらこちらに貼るなよ。
荒らすなら例のスレだけにしろよ。
005546NGNG
>>48
多木構造なので子供がイパーイあるのよ
子供ポインタの配列でしょ
0056デフォルトの名無しさんNGNG
>>55
ああすまん、木構造って二分木かと思った。
でも、foo **pChild;じゃなくてstruct foo **pChild;にしないとだめじゃない?
005742NGNG
>>47はキャストが無かったので、一応完全版

#define JSIZE 128
#define KSIZE 40

main () {
  int (*xxx)[JSIZE][KSIZE];
  int (*xx)[JSIZE * KSIZE];
  int t;
  int xxx_size;
  //
  t = 3;
  // xxx
  xxx_size = sizeof (int) * t * JSIZE * KSIZE;
  xxx = (int (*)[JSIZE][KSIZE]) malloc (xxx_size);
  // xx
  xx = (int (*)[JSIZE * KSIZE]) xxx; // 内容を一致させるのであれば、ポインタの置き換えで終わり
  //
  free (xxx);
}
005856NGNG
つーか、二分木なら子供へのポインタが二つあるだろうが(鬱
005946NGNG
>>56
structいる?
省略できるんじゃない?
0060デフォルトの名無しさんNGNG
>>59
C++ならね。
006146NGNG
>>60
漏れはVC++使ってる罠
0062デフォルトの名無しさんNGNG
>>61
拡張子を.cppじゃなくて.cにしてコンパイル。
0063デフォルトの名無しさんNGNG
いや、その子供達のリストを保存する領域作らないといけないでしょと。
006442NGNG
いちおうまとめとこう。
>>16
>>57を使うと、常に
(xxx[i][j][k] == xx[i][m])   (ただし m = j * KSIZE + k)
が成り立っている状況を作れる。多次元配列の要素の連続性を利用している

。。。というつもりで作ったけど、バグってたらごめん
006546NGNG
>>62
そこまでCにこだわってるわけじゃないので・・・
このスレとしては不可?
006646NGNG
>>63
うん、だから
AddChild()DelChild()GoToChild()とか
実装するとポインタとメモリの動的確保の練習になるでしょ
0067デフォルトの名無しさんNGNG
>>前スレ955
1000でマジレスカコイイ!
006846NGNG
それでfoo構造体にpChildの数とか必要だけど内緒(w
0069デフォルトの名無しさんNGNG
>>68
配列の末尾にNULLはどう?
007046NGNG
>>69
*とunsigned intはサイズ同じだからお好きなほうを
0071デフォルトの名無しさんNGNG
>>67
そうそう、最初コピペかと思って読んでみたら
0072デフォルトの名無しさんNGNG
>>70
これまた処理系依存とかじゃないの?
007346NGNG
子供辿るには再帰呼び出しが必要になるからその練習にもなるぽ
0074デフォルトの名無しさんNGNG
可変この引数を持たせる関数は

__cdecl

じゃないとだめらしいのですが、この関数はどうやって引数の数を調べるのでしょうか?
007546NGNG
>>72
つーかポインタのsizeof(p)ってunsigned intしかないと認識してますが
0076デフォルトの名無しさんNGNG
>>74
引数を右からとか左からとか
VCならヘルプみそ載ってたよ
0077デフォルトの名無しさんNGNG
んなこたぁない
007874NGNG
>>76
ちがーう。アセンブラレベルでの話だ
0079デフォルトの名無しさんNGNG
呼び出し元でpush/popするか呼び出し先でするかの差?
_cdeclと_pascalって。
008046NGNG
>>77
そうでふか
winかunix位でしか組んだこと無いのでスマソ
008176NGNG
>>78
アセンブラならフォーマット調べてスタックから取ってくるだけじゃない?
Cでやるより楽なはずだけど
0082デフォルトの名無しさんNGNG
>>80
大抵の環境でintと同じサイズになると言うのは真だけど、
標準で規定されているわけじゃないから、実装依存と言わざるを得ないってところ。
008374NGNG
>>76
本読んでたら 79が言うように _cdcelは呼び出し元で引数をPUSH/POPするんだって。
呼び出された側ではドンだけ引数が渡されるかわからないから。
でもそのままだとどっちにしろドンだけ引数が渡されたかわからない気がするのは僕だけ?
0084デフォルトの名無しさんNGNG
だから、引数の数を渡したりターミネータを渡したりprintfのようにフォーマットで指定したり工夫がある
008574NGNG
>>84
なるほど。printfって引数の数が合ってないときは動作保証なかったしね。
納得っす。ありがとー。
0086デフォルトの名無しさんNGNG
tmpfileの実装方法がはげしくわからん。
どうやったらクローズ時にファイルが消えるようにできるんだYO!

独り言スマソ
0087デフォルトの名無しさんNGNG
1クローズしてから消す
2作ったときからインデックスと分離しておく
3OSの機能
0088デフォルトの名無しさんNGNG
>>86
remove()でだめぽ?
0089デフォルトの名無しさんNGNG
>>86
>tmpfile
とりあえずこんな妙な英単語はない。

最近の若いもんはテンポラリも知らんのか・・・。
0090デフォルトの名無しさんNGNG
>>87
悪い、3以外全然わからん(煽りじゃなくてマジで)

>>88
fcloseも改造すればいいのかな???
fclose時に削除ルーチンを呼ぶ方法がわからないのよ。
0091デフォルトの名無しさんNGNG
>>89
Cの標準関数にあるはずだけど・・・
0092デフォルトの名無しさんNGNG
>>89
省略形くらい大目に見てやってよ
通じるんだから
0093デフォルトの名無しさんNGNG
NEG命令ってなにに使うのでしょうか。
0094デフォルトの名無しさんNGNG
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/tmpfile.3.html
tmpfile()
0095デフォルトの名無しさんNGNG
>>90
tmpfileで作成したディスクリプタを判別する方法があるんだろ
#ライブラリ内部で
で、fclose時に自動的に消している、と。
009688NGNG
>>90
改造とかじゃなくて(できんのか?
オープン->何か処理->クローズ->再オープン->remove()->クローズ
で駄目?
0097デフォルトの名無しさんNGNG
>>95
ああやっぱりfcloseにしかけがあるんだね。ありがとう。
プログラム終了時に削除ってのはatexitでどうにかなるかな。
0098デフォルトの名無しさんNGNG
先輩からC言語なら大抵どんなことでもできると教えてもらいました。
で、早速C言語でXBOXを作りたいのですが、C言語はドコで習えばいいのですか?
0099デフォルトの名無しさんNGNG
>>96
ごめんなさい、実装方法なんて書いたけれど、
本当はtmpfileの仕組みが知りたかっただけなんです。
0100デフォルトの名無しさんNGNG
>>98
NOVA行きな!
0101やった〜NGNG
0時丁度に100ゲトー
■ このスレッドは過去ログ倉庫に格納されています