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

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

■ このスレッドは過去ログ倉庫に格納されています
0001スーパーハイソサエティーハッカー日下部陽一NGNG
漏れは38才、21年間プログラムを一生懸命作ってきた。
いろいろな言語を極めたが、一番手になじむのはCだった。
Cのことなら全てわかるから、疑問な点があったら漏れに聞け。

だが、いちいちFAQに載った質問に応えるほど暇じゃない。
課題丸投げなら別スレにいけ。

・comp.lang.c Frequently Asked Questions
http://www.eskimo.com/~scs/C-faq/top.html

・C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html

Cプログラマならこれを買っとけ。
・プログラミング言語C(K&Rと呼べば通だ)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/yfcbookshelf-22/250-3950205-1475419

K&Rで挫折するようなヤツはこれでも買え。
これでわからない、救いがたいヤツはあきらめろ。
・作ってわかるCプログラミング(アヒル本と呼べば通だ)
http://dennou.gihyo.co.jp/books/void_c/
http://www.amazon.co.jp/exec/obidos/ASIN/477411328X/qid%3D1005618315/250-3950205-1475419

・前スレ C言語なら、漏れに聞け! <13>
http://pc.2ch.net/test/read.cgi/tech/1013990673/l50
0002デフォルトの名無しさんNGNG
>>1
どんどん名前が長くなるな。
0003デフォルトの名無しさんNGNG
歳が若くなってるし
0004デフォルトの名無しさんNGNG
voidのプロフィールに合わせたんでしょ
0005デフォルトの名無しさんNGNG
次はハイパーですか?
age
0006デフォルトの名無しさんNGNG
くそっ、前スレ1000番取られた(笑)
0007デフォルトの名無しさんNGNG
991から1000までに15分もかかっていやがる。
0008デフォルトの名無しさんNGNG
やっぱC++って難しいんだ!!!
C言語のエキスパート(自称)ってウザイほどいるけど。
C++なら俺に聞けって奴みたことねー
0009初耳NGNG
>C言語のエキスパート(自称)ってウザイほどいるけど。

はつみみです;)
0010デフォルトの名無しさんNGNG
C:\>はつみみです;)
'はつみみです' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
0011デフォルトの名無しさんNGNG
>>9
↓ここに一人いますが。
1 名前:スーパーハイソサエティーハッカー日下部陽一 投稿日:02/03/05 09:09
漏れは38才、21年間プログラムを一生懸命作ってきた。
いろいろな言語を極めたが、一番手になじむのはCだった。
Cのことなら全てわかるから、疑問な点があったら漏れに聞け。
0012デフォルトの名無しさんNGNG
以下のソフトを見つけたのですが、こういう機能はC言語だけで書けるのでしょうか?
http://www.zdnet.co.jp/products/tdk/hddataclear.html

それともアセンブラも必要なのでしょうか?

別にこの機能が欲しいわけじゃなくて、どういう原理でできているのかなぁ?
と思いまして、書き込みました。

よろしくお願いします。
0013デフォルトの名無しさんNGNG
>C++なら俺に聞けって奴みたことねー
そんなことをいうと、尋常でないテンプレートが
バカバカでてきててにおえなくなるからなのれす。
0014デフォルトの名無しさんNGNG
ANSIの規格に割り込みイヴェント関数が存在する意義がよく分かりません。
教えて下さい。
0015デフォルトの名無しさんNGNG
ruby で書かれています。
0016デフォルトの名無しさんNGNG
>>11
ネタを真に受けている馬鹿
0017デフォルトの名無しさんNGNG
>>16
>>11はネタじゃないの?
0018デフォルトの名無しさんNGNG
ネタにしちゃヒネリもなんにもない駄作
0019デフォルトの名無しさんNGNG
char a[3][4];
char (*ap)[];

strcpy(a[0], "abc");
strcpy(a[1], "def");
strcpy(a[2], "ghi");

となっていたときに、ap を使って a[0], a[1], a[2] を表示させるには
どう書けばいいですか?
0020デフォルトの名無しさんNGNG
>>19
char (*ap)[];←これって配列の大きさが不定です。ってコンパイラに言われない?
0021デフォルトの名無しさんNGNG
>>18
じゃ君も「ネタを真に受けている馬鹿」なんだね。
002220NGNG
あ、言われないか。
0023デフォルトの名無しさんNGNG
>>19

#include <stdio.h>
#include <string.h>

int main()
{
char a[3][4];
char (*ap)[4];

ap=a;

strcpy(a[0], "abc");
strcpy(a[1], "def");
strcpy(a[2], "ghi");

printf("%s\n%s\n%s\n",ap[0],ap[1],ap[2]);

return 0;
}
0024デフォルトの名無しさんNGNG
全スレ895の
int i,j;
int a[5][5];
int **ap;

ap = (int **)malloc(sizeof(int *)*5);
for(i=0;i<5;i++) {
ap[i] = a[i];
}
for(i=0;i<5;i++) {
for(j=0;j<5;j++) {
ap[i][j] = i*10+j; /* apのほうに代入 */
}
}
for(i=0;i<5;i++) {
for(j=0;j<5;j++) {
printf("%d ",a[i][j]); /* aのほうを表示 */
}
puts("");
}
で ap = (int **)malloc(sizeof(int *)*5);を省くと
値が割り当てられていないローカルな変数 'ap' に対して参照が行われました。
というエラーが出ました。
どうしてですか?


0025デフォルトの名無しさんNGNG
>>24
**apはどこを指しているの?
mallocで得た領域でしょう?
それを省いたら・・・
002625NGNG
7行目ね。
0027デフォルトの名無しさんNGNG
∧__∧
(・ω・)
/[リナ]ヽ
  人
0028デフォルトの名無しさんNGNG
mallocを使わないときはどうしたらいいんでしょうか?
0029デフォルトの名無しさんNGNG
警告メッセージをしっかり読まないやつはドラクエで言えば
酒場でくだ巻いている自称戦士みたいなもんだ。
0030デフォルトの名無しさんNGNG
>>28
配列を用意する。
0031デフォルトの名無しさんNGNG
>>23
ありがとう。
char (*ap)[4]; て宣言しなきゃいけないのか。
別に意味のあるプログラムではないんだけど、昨日からずっと悩んでた。
0032溺れるプログラマーNGNG
MFCで作ったアプリケーションってDLLいる?
SDKアプリケーションはDLLいる?
0033デフォルトの名無しさんNGNG
>>32
ここはCスレです。
MFCは必要です。Win98以降はMFC4.2DLLが最初から入っているらしいけど。
0034デフォルトの名無しさんNGNG
複数人で開発するプロジェクトの場合、main関数はリーダーが書くの?
0035デフォルトの名無しさんNGNG
>>34
んなこと決まってない。
スケルトンなら全員でかく。
0036デフォルトの名無しさんNGNG
>>34
キミおもしろいなぁ。
003735NGNG
スケルトン:×
ドライバ:○

鬱だ・・・
0038デフォルトの名無しさんNGNG
>>12
なんらかのOSの上で稼動するのであれば、アセンブラはいらないでしょう。
独自のブートを行う場合は、ちょびっとだけアセンブラがいる。

で、件のソフトは、「オリジナルの起動プログラムで動作するのでOSに
依存しない」と言ってるので、ちょっとだけアセンブラがいるね。

でも、HDDの中身を消すくらい、ちょーかんたん。
って、どっかのスレで出てたな・・・

これか。
http://pc.2ch.net/test/read.cgi/unix/1013144113/n682-690
0039デフォルトの名無しさんNGNG
>>38
シュレッダーソフトって全てのクラスタを上書きするんじゃなかった?
004038NGNG
>>39
そうだと思う。
0041デフォルトの名無しさんNGNG
>>34
俺ペーペーだから、まだ#defineしか書かしてもらえない。
普通の関数でキャリア5年、mainなら10年以上だな。
0042デフォルトの名無しさんNGNG
>>41
俺なんか#include <stdio.h>しか書かせてもらえない。
他の#includeも書きたいんだけど。
0043デフォルトの名無しさんNGNG
デバッグで関数の中に入った瞬間に
stac overflowのエラーが出てしまいます。
何が原因なんでしょうか?
0044デフォルトの名無しさんNGNG
>>43
配列が大きすぎるとか、関数を再帰的に呼びすぎるとか。
0045デフォルトの名無しさんNGNG
stack?
0046デフォルトの名無しさんNGNG
スタクとバカにしるな!
0047旧887NGNG
>>888
列挙だけだね〜
>>891
ありましたthanks
0048超初心者NGNG
K&Rをマスターしたら
C言語は一通り使いこなせるようになったと言えるんでしょうか?

厨房質問ですみませんです。
0049デフォルトの名無しさんNGNG
>>48
C言語を使いこなすと言うのは、C言語で思考出来る事だと思われ。
0050デフォルトの名無しさんNGNG
>以下のソフトを見つけたのですが、こういう機能はC言語だけで書けるのでしょうか?
>http://www.zdnet.co.jp/products/tdk/hddataclear.html

URLをHDDアタッカーと読んでしまって
てっきり物理的にHDDを破壊するソフトか何かかと。
0051デフォルトの名無しさんNGNG
>>48
K&Rにある問題を一通り自力で解いてみたなら基本は一通り、ってかんじだね。

実際にはアプリケーションに対する知識と
OSに依存した様々な知識がないとまともなプログラムは組めない。

がんばれ
0052名無しさん@EmacsNGNG
そういえば前スレにも K&R 読んだらフリーソフト作れるようになるかって聞
いてるやついたな...
俺も昔はそういう安易な考えだったが、やればやるほど先が長いことに気づく(w
0053超初心者NGNG
>>49
C言語で思考するとはどういうことか
イメージを具現化できないんですが、
実際どう言う事なんでしょう?

>>50
励ましありがとう。
>実際にはアプリケーションに対する知識と
>OSに依存した様々な知識がないとまともなプログラムは組めない。
じゃあこれらはどうやったら身につける事ができますか?

>>52
作れないんだ・・・。
0054デフォルトの名無しさんNGNG
浮動小数点変数配列a[100][100]のデータを
ファイルに出力するのに、

FILE *fp;
fp = fopen("hoehoe.dat", "w");

for( i = 0 ; i < 100 ; i++ ){
for( j = 0 ; j < 100 ; j++ ){
fprintf( fp , %08f\n , a[i][j] );
}
}

と書いたのですが、「この部分の高速化を考えてみよう。」
と言われて、躓きました。
高速化のポイントを教えてください。
0055デフォルトの名無しさんNGNG
>>54
ファイルアクセスは一回ですます
0056デフォルトの名無しさんNGNG
>>54
学校の宿題は、自分で考えよう。
出来なくたって給料に響きもしないし、まして命まで取られるわけじゃない。
0057デフォルトの名無しさんNGNG
>>54
> 高速化のポイントを教えてください。
1. ちまちま書き出さずに一気に書く(例えばa[i][0]〜a[i][99]をまとめて書き出す)。
2. 汎用的なfprintfではなく、浮動小数点に特化した自作printfを作る。
3. 本当に速くなったのかの裏付けをとる(man prof or gprof)
  (特に2.を行う場合、苦労した割には速くならない可能性がある)
0058デフォルトの名無しさんNGNG
二次元配列を関数に渡すときは、
func(int (*a)[3])とかにすればいいって分かったんですけど
関数を呼び出す方はどうすればいいんでしょうか?
func((&a)[3]);
ってすればいいんでしょうか?
005954NGNG
>>55
即レスthx。それは、考えたのだけれども、具体的にどうすればよいか分からなかった。
とりあえず、大きなchar変数を用意してやればいいのかなと思ったのだが、
うまくいかず。全然早くならない。

>>56
学校の宿題ではないけれども、お言葉は確かに。
006054NGNG
>>57
ありがとうございます。
3は知りませんでした。今は、実験できないけれども、実験環境整い次第調べてみます。

1に関しては、>>59にも書いたけれども、

2に付いては、例えば、fprintfの%dなどの処理を省いた関数を作るって事?
林晴比古の本に書いてあって、試したのだけれども、無駄な苦労に終わった。
006155NGNG
>>59
配列で保存形式にこだわらないならば
fwriteで一気に書き込めば?

ポインタで確保したならメモリに書き込むイメージを
作ってから同じように一気に書き込む
0062デフォルトの名無しさんNGNG
>>58
func(a);
006354NGNG
>>61
なるほど。早速、明後日試してみることにします。
(今日、明日はCの開発環境が無い環境にいるので。)
0064デフォルトの名無しさんNGNG
>>63
doubleを文字列にしなければならないんだよね?
0065デフォルトの名無しさんNGNG
a[][]を全部出すっていうのなら二次元配列はメモリ上は一次元に展開されていることを利用して

double *p;
p = (double *)a;
for (i = 0; i < 100*100; ++i)
{
fprintf(fp, _T("%08f\n"), *p++);
}

ってのもあるけど、今時のCPUだとどれだけ速くなるかは疑問だな。

遅いかもしれないポイントは
1. 高水準IOを利用している
-> 低水準IOにするとマイクロ秒単位くらいの違いで速くなったり遅くなったりするかも。
2. 配列への二次元アクセス・二重ループをしている
-> 一次元に展開すれば、ミリ秒単位くらいの違いで速くなるかも。全く変わらないかも(藁
3. fprintfを使用している
-> 書式の解釈を行うfprintfよりはfcvtみたいな書式化関数を使った方がミリ秒単位くらいの違いで速い

だが一番大きなポイントは
100*100で合計10000回程度しかループしてないので最適化のしがいがないこと。

100*100*100*100くらいだったら、違いが目に見えて出てきただろう。
0066デフォルトの名無しさんNGNG
>58
呼び出すときは
func(a);

宣言は
func(int (*a)[3]);
以外にも
func(int a[][3]);
func(int a[10][3]);
なども可
0067デフォルトの名無しさんNGNG
>>44
ローカル変数の配列をポインタで参照したらいいんでしょうか?
0068デフォルトの名無しさんNGNG
Makefileの書き方について質問があります。

---head.hの内容----
#define HOGE
-------------------

head.hの中でHOGEが定義されてるなら、Makefileの中でDEF=1
コメントアウトされてるならDEF=0
と、するにはどういうMakefileを書けばよいでしょうか?
もう自分の力では無理なので、どなたかお願い致します。
0069デフォルトの名無しさんNGNG
>>67
ソースを見せてよ。
ちなみに俺の環境だと、int型の変数を1個用意する関数を65000回ほど再帰的に呼んだところで
stack overflowを起こしたよ。
0070デフォルトの名無しさんNGNG
>>68
それは難しい。漏れには良い解決法が判らん。
でも、configureとかconfig.hとか使う奴はそのへんどうなってるんだろうね。
きっと解決法はあるはずだ。
0071デフォルトの名無しさんNGNG
>>67
入ったらstack overflowする関数のみのソースです。
なぜだか分かりません。
この関数以外の関数が原因ってことはあるんでしょうか?

#define FFT_MAX 1024
#define RATIO 0.1;
void decoding( )
{
int i, j; /* ループ変数 */
double d; /* 作業変数 */
double data[FFT_MAX][FFT_MAX],data2[FFT_MAX][FFT_MAX]; /* 元データの実数部 */
double jdata[FFT_MAX][FFT_MAX]; /* 元データの虚数部 */
int num_of_data; /* データの要素番号の最大値 */

make_data( &num_of_data);
FFT2( data, jdata, num_of_data, 1 );
for ( i = 0; i < y_size1; i ++ ){
for ( j = 0; j < x_size1; j ++ ){
data[i][j] = data[i][j] + image2[i][j] * RATIO;
}
}
FFT2( data,jdata, num_of_data, -1 );
make_output_image( num_of_data );
}


0072デフォルトの名無しさんNGNG
>>68
????出来ない事は無いが、やる意味がよくわからん。
ソースの中で
#ifdef HOGE
・・・・
#endif
ってしておいて、Makefaileで

withhoge:
   cc -c ... -D HOGE
withouthoge:
   cc -c ...

っとかするんだよ。
make withhoge
ってすると、-D HOGEつきのコンパイルが出来る。

つか、それがわかった上での質問なのか?
007367=71NGNG
>>69でした
0074デフォルトの名無しさんNGNG
大胆なスタックの使い方だ・・・
007574NGNG
>>71
スタックに32MB確保してるよ
007674NGNG
約24MBだった
0077デフォルトの名無しさんNGNG
コンパイルオプションでスタックサイズ増やせば解決さ!
0078デフォルトの名無しさんNGNG
>>71
1024*1024*8で8MB、それが3つで24MBか。
まぁまぁ大きいかな。
FFT2の宣言はどうなってんだ?
007968NGNG
>>68です

>>72
レスありがとうございます.
でもMakefileのマクロをソースに渡すのではなくて
ヘッダーファイルのマクロをMakefileのマクロに渡したいんです.

>>70
色々調べてるんですが・・・grepとか使うのかな
0080デフォルトの名無しさんNGNG
>>70
config.hって、普通ユーザがコンパイル前に希望の状態に
カスタマイズするために用意しているオプション群
みたいなもんだろ?
Makefileとは関係ないじゃん
0081Makefileとは関係ありませんNGNG
Makefileとは関係ありません
0082デフォルトの名無しさんNGNG
>>79
>ヘッダーファイルのマクロをMakefileのマクロに渡したいんです.
これをやって最終的に何をしたいんだ?
それを書かないと回答不能。
0083デフォルトの名無しさんNGNG
ハァ?
0084デフォルトの名無しさんNGNG
>>68
grep使うで正解じゃない?
shell出力を make内の変数に取り込む事出来るから。
取り込んだら、ifeqで検査。
0085デフォルトの名無しさんNGNG
>>78
まあまあ?
スタックならとてつもなく大きいと思うけど・・・・
0086デフォルトの名無しさんNGNG
68は何かを勘違いしている。
たぶんもっとまともな解があるよ
0087デフォルトの名無しさんNGNG
最終的な目的を教えてくれれば、もっと一般的な解決法がわかるかも
008868NGNG
>>82
ヘッダーファイルのマクロをMakefileのマクロに渡したして
それをもとにオプションを作って>>72さんのように
cc -c ... -D DEF として
別のプログラムに渡したいんです.
それをその別のプログラムを変更しないでやりたいんですが.

>>84
>shell出力を make内の変数に取り込む事出来るから
この部分をどういう風に書いたらいいのでしょうか

grep "^#define HOGE" head.h; then ○○;fi;


008968NGNG
間違えた
if grep "^#define HOGE" head.h; then ○○;fi;

コマンドでやるとこんな感じだと思うんですが,
Makefileの中でどういうふうにやって変数にどう渡したらいいのか
0090デフォルトの名無しさんNGNG
元から Makefile の中に書けば?
0091デフォルトの名無しさんNGNG
>>88
Makefileはincludeできるぞ。それでどうだ?
009284NGNG
動作確認してないけど。
$(shell grep なんたら) で参照出来ると思う。
Win32用GNU make使用。

$(shell cd) で、現在のディレクトリ取得した事は有る。
009371NGNG
>>77
スタックサイズを増やすのってどうすればいいんでしょうか?

>>78
FFT2の宣言部です。どうでしょう?
void FFT2( double (*data)[FFT_MAX], double (*jdata)[FFT_MAX], int num_of_data, int flag )
{
int i, j; /* ループ変数 */
static double re[FFT_MAX], im[FFT_MAX];


0094デフォルトの名無しさんNGNG
>>85
環境に拠るんじゃない。
環境の話は不毛なので、24MBは取れない環境だったということで。
mallocすればよろしい。ってことでどうでしょ。
0095デフォルトの名無しさんNGNG
i386 i486 i586の違いってなんですか?
Pentium3はi586でしょうか?
0096デフォルトの名無しさんNGNG
あまり一緒に仕事をしたくないタイプだな>68
珍妙なMakefile書いて悦に入ってる奴って
例外なくウンコちゃんだったよ。
0097デフォルトの名無しさんNGNG
>>95
板違い
http://pc.2ch.net/hard/
こちらへどうぞ
0098デフォルトの名無しさんNGNG
>>95
http://www.google.com/search?hl=ja&q=i386+i486+i586%82%CC%88%E1%82%A2+pentiumIII&btnG=Google+%8C%9F%8D%F5&lr=lang_ja
009984NGNG
>>96
そう言うなって。
68が、あまり一緒に仕事をしたくない人に巻き込まれてる可能性だってあるんだし(w
0100デフォルトの名無しさんNGNG
struct BITS{
unsigned int b0:1;
};
sizeof(struct BITS)
これって何で1バイトや2バイトにならないの?
int型のサイズになるのか?

bcc32+win
0101デフォルトの名無しさんNGNG
100?
■ このスレッドは過去ログ倉庫に格納されています