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

このエントリーをはてなブックマークに追加
漏れは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
>>1
どんどん名前が長くなるな。
歳が若くなってるし
voidのプロフィールに合わせたんでしょ
5デフォルトの名無しさん:02/03/05 13:47
次はハイパーですか?
age
6デフォルトの名無しさん:02/03/05 14:28
くそっ、前スレ1000番取られた(笑)
7デフォルトの名無しさん:02/03/05 14:30
991から1000までに15分もかかっていやがる。
8デフォルトの名無しさん:02/03/05 15:25
やっぱC++って難しいんだ!!!
C言語のエキスパート(自称)ってウザイほどいるけど。
C++なら俺に聞けって奴みたことねー
9初耳:02/03/05 15:29
>C言語のエキスパート(自称)ってウザイほどいるけど。

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

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

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

よろしくお願いします。
>C++なら俺に聞けって奴みたことねー
そんなことをいうと、尋常でないテンプレートが
バカバカでてきててにおえなくなるからなのれす。
ANSIの規格に割り込みイヴェント関数が存在する意義がよく分かりません。
教えて下さい。
ruby で書かれています。
>>11
ネタを真に受けている馬鹿
>>16
>>11はネタじゃないの?
ネタにしちゃヒネリもなんにもない駄作
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] を表示させるには
どう書けばいいですか?
20デフォルトの名無しさん:02/03/05 16:48
>>19
char (*ap)[];←これって配列の大きさが不定です。ってコンパイラに言われない?
>>18
じゃ君も「ネタを真に受けている馬鹿」なんだね。
2220:02/03/05 16:54
あ、言われないか。
>>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;
}
24デフォルトの名無しさん:02/03/05 16:58
全スレ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' に対して参照が行われました。
というエラーが出ました。
どうしてですか?


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

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

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

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

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

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

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

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

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

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

>>52
作れないんだ・・・。
54デフォルトの名無しさん:02/03/05 20:56
浮動小数点変数配列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] );
}
}

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

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

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

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

ポインタで確保したならメモリに書き込むイメージを
作ってから同じように一気に書き込む
>>58
func(a);
6354:02/03/05 21:14
>>61
なるほど。早速、明後日試してみることにします。
(今日、明日はCの開発環境が無い環境にいるので。)
64デフォルトの名無しさん:02/03/05 21:27
>>63
doubleを文字列にしなければならないんだよね?
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くらいだったら、違いが目に見えて出てきただろう。
>58
呼び出すときは
func(a);

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

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

head.hの中でHOGEが定義されてるなら、Makefileの中でDEF=1
コメントアウトされてるならDEF=0
と、するにはどういうMakefileを書けばよいでしょうか?
もう自分の力では無理なので、どなたかお願い致します。
>>67
ソースを見せてよ。
ちなみに俺の環境だと、int型の変数を1個用意する関数を65000回ほど再帰的に呼んだところで
stack overflowを起こしたよ。
70デフォルトの名無しさん:02/03/05 23:20
>>68
それは難しい。漏れには良い解決法が判らん。
でも、configureとかconfig.hとか使う奴はそのへんどうなってるんだろうね。
きっと解決法はあるはずだ。
71デフォルトの名無しさん:02/03/05 23:25
>>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 );
}


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

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

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

つか、それがわかった上での質問なのか?
7367=71:02/03/05 23:26
>>69でした
大胆なスタックの使い方だ・・・
7574:02/03/05 23:32
>>71
スタックに32MB確保してるよ
7674:02/03/05 23:33
約24MBだった
コンパイルオプションでスタックサイズ増やせば解決さ!
>>71
1024*1024*8で8MB、それが3つで24MBか。
まぁまぁ大きいかな。
FFT2の宣言はどうなってんだ?
7968:02/03/05 23:37
>>68です

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

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

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

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


8968:02/03/05 23:55
間違えた
if grep "^#define HOGE" head.h; then ○○;fi;

コマンドでやるとこんな感じだと思うんですが,
Makefileの中でどういうふうにやって変数にどう渡したらいいのか
元から Makefile の中に書けば?
>>88
Makefileはincludeできるぞ。それでどうだ?
9284:02/03/05 23:59
動作確認してないけど。
$(shell grep なんたら) で参照出来ると思う。
Win32用GNU make使用。

$(shell cd) で、現在のディレクトリ取得した事は有る。
9371:02/03/05 23:59
>>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];


>>85
環境に拠るんじゃない。
環境の話は不毛なので、24MBは取れない環境だったということで。
mallocすればよろしい。ってことでどうでしょ。
95デフォルトの名無しさん:02/03/06 00:02
i386 i486 i586の違いってなんですか?
Pentium3はi586でしょうか?
あまり一緒に仕事をしたくないタイプだな>68
珍妙なMakefile書いて悦に入ってる奴って
例外なくウンコちゃんだったよ。
>>95
板違い
http://pc.2ch.net/hard/
こちらへどうぞ
9984:02/03/06 00:09
>>96
そう言うなって。
68が、あまり一緒に仕事をしたくない人に巻き込まれてる可能性だってあるんだし(w
struct BITS{
unsigned int b0:1;
};
sizeof(struct BITS)
これって何で1バイトや2バイトにならないの?
int型のサイズになるのか?

bcc32+win
100?
102デフォルトの名無しさん:02/03/06 00:10
100ヴァーン
>>100
1ビットだけ使うように制限しているだけ
メモリはintのサイズとられます。
10468:02/03/06 00:17
>>92
なんかそれで上手くいきそうです.
ありがとうございました.

>>96
そんなこと仰らないでくださいよ.
まだ学生なんで,将来よろしくお願いします.
奇妙なMakefile書かないで済むようにします.

>>90>>91
そうなんですが,色々考えてヘッダファイルから読み込むようにしたかったんです.
>>68
ちなみに
#define FOO
cc -DFOO
cc -DFOO=1

どれも#define FOO 1 と等価であることに気づいているのか?
>>105
そ・れ・だ!
10784:02/03/06 00:26
もっかい>>88を良く読んでみたけど・・・
単に複数のCソースで、共通のヘッダを読み込めばいいだけのような気が・・・
108Else:02/03/06 00:30
Windows SDKのことが詳しく書かれた、オススメの本を教えて下さい。
(もちろん、C言語)
たぶん
>それをその別のプログラムを変更しないでやりたいんですが.
に美学を感じてるんだろな。

現実には共通ヘッダかプロジェクトA,Bのmakefileを呼び出す
上位のmakefileを作るかだね。

プロジェクトA->makefile->プロジェクトBという依存の仕方は
あまり見かけることがないので、他の人が見るとびっくりしてしまうよ。

>108
MSDNはチェックした?
>>108
つか、msdn見れ
本は知らん。
>>107
変数を渡すほうのプログラムが先輩が作ったもので,なんか書き換えたくないんですよね.
署名が入ってるプログラムって勝手に書き換えていいものなんですか?
使わせてもらうってことの了承はとってるのですが.

自分でもなんかおかしなことやってるような気がしてきました.
他の解決方法も考えてみます.
>>111
署名って、
$Id: lcore.s,v 1.1 2002/03/05 15:38:27 senpai Exp $
って感じなやつ?
>>111
だから、その先輩はdefineを渡したら、ソース改変しなくても
色々流用できるように考えてくれているんだろ。
なんで、Makefileで定義しないんだよ。
Makefileもその先輩作か?
なら、新しいMakefileを作りな。Makefileとはそうゆうものだ。
114初心者:02/03/06 01:38
K&R 3章 3-3演習
文字列s1中のa-zのような省略記法をそれと等価な完全なリストにしてs2に
展開する関数expand(s1,s2)...

このexpandの解答例ってどこにありますか?
アンサーブック
ASCII コード表を思い出せ!
117デフォルトの名無しさん:02/03/06 01:58
char* expand(const char *s1,char *s2)
{
char *s3 = s2,c;
if(*s1 == '-') s1++;
for(;*s1 != '\0';){
if(isalpha(*s1)){
c = *s1;
s1 += 2;
while(c <= *s1)
*s2++ = c++;
}
}
*s2 = '\0';
return s3;
}

書いてみたんですがだめみたいです、、、
解答をおしえてください!
118初心者:02/03/06 01:59
117は僕です
119初心者:02/03/06 02:06
教えてください気になって夜も眠れません(TT)
120sage:02/03/06 02:09
char *expand(const char *s1, char *s2)
{
int st, ed;
char *p;

p = s2;
while (*s1)
{
if (s1[1] == '-' && s1[2])
{
if (st < ed)
st = s1[0], ed = s1[2];
else
st = s1[2], ed = s1[0];
s1 += 3;
while (st < ed)
*s2++ = st++;
}
else
{
*p++ = *s1++;
}
}
*p = '\0';

return s2;
}

はよ寝ろ
121sage:02/03/06 02:10
*s2++ = st++;

*p++ = st++;
122sage:02/03/06 02:12
if (st < ed)

if (s1[0] < s1[2])
123デフォルトの名無しさん:02/03/06 07:05
>>114
それって展開される文字列はひとつ?
"0-9a-z"とかなることはないの?
ないなら・・・

char *expand(const char *s1, char *s2)
{
int i;

if(strlen(s1)!=3) return NULL;
if(s1[1]!='-') return NULL;
if(s1[0]>s1[2]) return NULL;

for(i=0;i<=s1[2]-s1[0];i++)
s2[i]=s1[0]+i;
/* s2[i]='\0'; */

return s2;
}

ループのたびに計算するところが実に無駄だな。変数名を考えるのが面倒なの。
それと文字コードがアルファベット順に並んでいる環境じゃないとだめだね。
124日下部陽一:02/03/06 14:37
あげ
$_ = '騙りましょう。';
s/騙(ら|り|る|れ|ろ)/語$1/;

別にperlじゃなくてもいいです。。
>>125しまったスレタテと間違った。超誤爆すまん。
127デフォルトの名無しさん:02/03/06 16:49
以下のような
char* ppstr[]={
"いってよし",
"おまえもなー",
"ずざー",
}
という変数があるとします。
それを一単語ずつファイルに書き込みたいのです。
2ch.txt
いってよし
おまえもなー
ずざー

こんな感じなのですがどのようにすればいいか
どなたかご教授ください。
お願いします。
>>127

FILE *fp;
int i;
fp=fopen("./2ch.txt","w");
for(i=0;i<3;i++)
fprintf(ppstr[i],"%s\n",fp);
fclose(fp);
129128:02/03/06 16:54
あ、fopenのエラーチェックをしてねー。まあいいか(ワラ          
130128:02/03/06 16:55
fprintf(fp,"%s\n",ppstr[i]);
だよ(鬱
fprintf の引数の順序逆じゃねぇ?まあいいけど
132131:02/03/06 16:56
かぶったぎゃー。
133127:02/03/06 19:37
ありがとうございますー
試してみます!
>>114
char *expand(const char *s1, char *s2)
{
  char *ret = s2;
  for (int c=*s1++; c; c=*s1++) {
    if (*s1 == '-') {      // 次の文字が "-" のとき
      if (! *++s1) {         // "-" で終わっていたら
        *s2++ = c;        // "-" の前の文字だけ入れて
        break;          // 終わり
      }
      for (int i=c; i<=*s1; i++) // 範囲内の文字
        *s2++ = i;
      s1++;             // "-" の次の文字スキップ
    }
    else
      *s2++ = c;       // そうでなければそのまま
    }
  *s2++ = '\0';
  return ret;
}
s1 が "-" で始まる場合、s2 の先頭にそのまま "-" が入る。
s1 が "-" で終わる場合、s2 はその直前の文字で終わる。
135デフォルトの名無しさん:02/03/06 20:18
最初はC言語で何を作ってた?
俺は今、じゃんけんゲームを作成中(ショボ
C言語では可変長な並列はどうやって作ればいいのですか?
誰か教えてください。
137デフォルトの名無しさん:02/03/06 21:19
>>136
並列を配列に読み替えて・・・・

あんたCをなんだと思っているんだ?
reallocで似たようなことができるといえばできるけど。
>>136>>137
だから、リストやツリーのロジックを教えてやったらいいんだろ
http://www.google.co.jp/search?hl=ja&ie=utf8&oe=utf8&q=%E5%8D%98%E6%96%B9%E5%90%91%E3%83%AA%E3%82%B9%E3%83%88&lr=
>>136
いわゆるVectorの実装はたいてい>>137の言うようにrealloc()だよ。
140136:02/03/06 23:22
>>137-139
どうもありがとうございます。
教えてクンですいませんでした。
open関数のことででちょっと質問が
参考書のサンプルプログラムで
open(lock_file, O_RDWR | O_CREAT | O_EXCL, 0444);
のような文がでてきました。
最後のパーミッションの数値を調べたら"オーナーの読み込み許可:00400"のように
すべて5桁なのですが、このサンプルは4桁で書かれています。
最上位桁の0は省略できるのですか?
8進数だよそれ。
143日下部陽一:02/03/07 09:10
Cは10進数で0を記述できないage
>>143
????

>>141
0で始まる数字列は8進数、0xで始まる数字列は16進数
>>143
なるへそ。単に 0 と表記すると、8進数の0なのか。
さすがスーパーハイソサエティーハッカーだ。
0 とだけ書いたら、それは実は8進数の0という、どーでもいい罠
147146:02/03/07 09:28
かむった…
>>141
つーことで、最上位の0は省略できないよん。
あと、パーミッションは man chmod すると分かるけど、
4桁まであるのだー。
149デフォルトの名無しさん :02/03/07 11:43
 voidってなんですか?
って優香。プログラムの専門用語を検索できる、辞典サイトって
ありますか?
自分で調べろ
void
虚空。空虚。存在しないこと。無駄。無駄無駄。
無駄無駄無駄無駄無駄無駄無駄無駄無駄無駄無駄無駄無駄無駄無駄
無駄無駄無駄無駄無駄無駄無駄無駄無駄無駄無駄無駄無駄ぁあ!!!
捨て捨て
153149:02/03/07 12:03
>>150
 プログラムの辞典サイトってあるんですか?
googleで引っかかる気配すらないんですが・・
>>153
わざわざ辞典サイトなんか探さんでも、そのままgoogleで調べればいいだろ。
http://www.google.com/search?q=void+%82b%8C%BE%8C%EA+%88%D3%96%A1

つーか普通の英単語では? >void
http://jiten.www.infoseek.co.jp/Eigo?pg=result_e.html&col=EW&sm=1&qt=void&svx=100600
>>149
スタークルーザーってやったことないのか?
敵対組織の名前がvoidだよん。
名作なんだけどなぁ。

激しくスレ違いスマソ
156141:02/03/07 14:54
>>142>>148
解りました。ありがとう
voidそれは空の集合。
空の集まりそれは空。
ああ悲しきreturn;
なんでC言語は8進数、16進数の表記ができて2進数表記ができないんだろうね?
漏れ的には8進数よりよっぽど有用だと思うんだけど。
例えば 0b110011 みたいに。独自拡張してるコンパイラとかないんだろうか?
更に読みやすいように、0b1010_1100 みたいな表記ができるとなお便利だが。
159デフォルトの名無しさん:02/03/07 18:26
#error これだとメッセージを出力して終わってしまいますが、
#warn ←こんな感じでメッセージを出力してそのままコンパイルを続けるようなのってないですか?
menuについて解説した日本語ページ無いですかね。
英語ページは見つけたんですけど…
無ければ無いでそっち使いますけどね。
>>160
menuってなーにー?
162160:02/03/07 19:05
説明が足りませんでしたね。
ごめんなさい。
cursesを使ってターミナル画面で
メニューシステムを扱えると言うライブラリです。
(man menuより意訳。大雑把だけど)
163161:02/03/07 19:27
>>162
おぉ、なるへそ。勉強になりました。
164デフォルトの名無しさん:02/03/07 19:33
>>158
それよりも、printf系関数で数値を2進数字列にする機能がほしかった。
逆ならstrtolでできるんだけどな。
>>158
Unixが発祥の地ということで、例のクソファイルシステム関係で
8進数が導入されたんじゃ?
2進がないとは、アセンブラとは違うんじゃヴォケ って意思表示かと。
>>159
汎用的な方法はないと思われ。
とりあえずコンパイラのマニュアル見てみたら。
たとえばVCだったら #pragma message ってのでできる。
質問なのですが、
malloc関数などで、メモリーを確保しますよね。
メモリーが確保された状態で、ALT+F4を押されて強制終了させられたら、
開放しない事になるのでしょうか(多分なると思いますが)。
もしそうならば、ウィンドウプロシージャの中にWM_DESTROYが送られてくるのでしょうか?
OS のやる気次第
普通は解放してくれるんじゃないの?よく知らないけど。
mallocしたらfreeしなさい。
しなさいったらしなさい。
>>167
普通は解放する。

mallocしたままプロセスが異常終了したとき、
OSにそのメモリを返さないライブラリを作ったり使ったりしても、
標準規格の中から外れているわけじゃないので可。

だが、よく考えてみれば分かることだが、
今時のOSでは、そんな屑ライブラリを使ってる可能性はない。

DOSやCP/Mの時代で、EMSとかDPMIを使ってメモリ確保するライブラリとか
作ってて、たまたまそれをmallocに流用してたとして、
CTRL+Cとかでプログラムが中断されたときにマップしたフレームをきちんと
返さない、という屑ライブラリはあったかもしれんがね。

172_:02/03/08 00:48
Cの勉強しようと思うんですが・・・
http://www.bloodshed.net/  の、DevC++ってやつで事足りますか?
入門用のオススメソフトないですかね・・・
>>173

> Q. まずはC言語を覚えたいのですが、コンパイラは何を使えば良いでしょうか。
> A. 使っているOSによります。
> UNIX/Linux
> 標準でインストールされているgccを使いましょう。

Linuxでは、今は標準でインストールされねーぞ。
>>172
わるいことはいわないから、DigitalmarsかBorlandにしておけ。
>>172
Windowsなら cygwinでgccってのもアリかと。
>174
ここで突っ込む暇があったら追加・加筆したれよ(藁
>>177
おお、これWikiだったか。       
結城先生ハァハァ
ウッ!
>>172
事足りるっつーか、それって結局コンパイラは gcc だし、何の問題も無し。
Cygwin 入れるのもかったるいだろうし。
日本では情報少ないだろ>DevC++
DevC++の統合環境って勝手に関連付けしてくれる。
先生、黒板見えませーん!
せめて

i=1;

と書くのはやめて、

i = 1;

と書いてください。

あと、プログラマは何故 "," と "." の区別が一瞬でつきますか?
>183
文脈でわかるだろ
pi=3,14
foo(a.b.c,d,e.f)
とかね
>>184
俺もそう思ったけど、メンバーを参照するときに.を使うね。
>>183
区別が付くほど大きな文字サイズにしているから。
>>184
pi=3,14; は警告も出ずに動いてしまうと言う罠。
おばあちゃんの知恵。

コンマの後ろには必ず空白を。
ピリオドの前後は空白を入れない。
>>187
lint機能搭載してるコンパイラなら警告出るはずだが
>>188
ファイルサイズが増えるから嫌。
最近Kusakabe Youichiさんを見かけないのですが、どうしちゃったんですか?
アクセス規制された?
電波が届かない、圏外?
>>190
いつの時代の人間だよ。
>>191
胃潰瘍で入院中です。

From: Kusakabe Youichi <[email protected]>
Newsgroups: japan.food,fj.sci.lang.japanese
Subject: Re: スローフード
Date: Sat, 02 Mar 2002 04:42:57 +0900
Organization: Macintosh User Group PLEIADES
Lines: 14
Message-ID: <02032002044a7c8669%[email protected]>
References: <[email protected]>
NNTP-Posting-Host: 202-238-200-042.ryukyu.ne.jp
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-2022-jp
Content-Transfer-Encoding: 8bit
NNTP-Posting-Date: 1 Mar 2002 19:42:56 GMT
User-Agent: YA-NewsWatcher/3.1.8


In article <[email protected]>, O.Ogiwara
<[email protected]> wrote:
> スローフード?

私は手術したので、しばらく食べられません。

ヘ_ヘ ____________________________
ミ・・ ミ [email protected]
( ° )〜 日下部陽一
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>193
それは入院中でも書けるということを意味してるような
195191:02/03/08 10:04
>>193
そうですか kusakabe さんお大事に。はぁと。
196デフォルトの名無しさん:02/03/08 12:00
実行速度の目安として、ステップ数を計測したいと思っています。
ある関数に入ってからのアセンブラレベルでの実行ステップ数を計測
したいんだけど現在ではgdbで関数頭でブレークしておいて
その関数を抜けるまで地道にsiを繰り返しています。
でもイマイチ効率が悪いのでもう少しいい方法を模索中です。
197デフォルトの名無しさん:02/03/08 12:33
>>196
あそう。
胃潰瘍ってマジ?
チーズばっかり食ってるからか?
>>196
プロファイルツールを使わないのは何か意味があるのか?
201デフォルトの名無しさん:02/03/08 15:02
>>200
プロファイルツールって何ですか?
202201:02/03/08 15:07
googleで調べたけど売り物ばかり
Unix系(Linuxです)で使える無料のものはないのでしょうか?
>>202
ふーん、お前のところのLinuxって
man gprof
ってやっても何も出ないのか?
それって本当にLinuxなのか?
205201:02/03/08 16:16
>>204
今はじめてしりました。
なかなか便利そうですね。
LinuxとかUnixとかだと、検索しても 見つからない というか、
単語名(キーワード)をしらないとどうしようもないですからね

機能逆引きページみたいなのも全く無いですし。
困ったものです。
206デフォルトの名無しさん:02/03/08 16:37
>>205
普段からマニュアルに目を通しておけ。
全てを覚えるのではなく,どこにどんなことが
書いてあるかをおおざっぱに把握する程度で良い。
>>205
> 機能逆引きページみたいなのも全く無いですし。
man man
と打ち
-k オプションの部分を良く読むこと
apropos 使うとか
209201:02/03/08 18:17
>>207
ステップ数を数えるツール をさがしてて、
「プロファイル」 という単語にたどり着かないじゃないですか。
結局>>206氏のとおり普段からマニュアルを読んどくしかないですけど。

man の -k オプションは役立たずです。
>>209
「プログラム 実行速度 計測 方法」で検索してみた。
http://www.google.com/search?q=%83v%83%8D%83O%83%89%83%80+%8E%C0%8Ds%91%AC%93x+%8Cv%91%AA+%95%FB%96@&hl=ja&lr=lang_ja
結構簡単にプロファイラにたどり着けそうな気がする。
>>209
> ステップ数を数えるツール
確かにそれだと別の物を探してしまうし、
多分それだけのキーワードで質問したら
永遠にgprofは出てこなかっただろう。

検索キーワードの指定方法は結構難しい
私が初心者の頃、一般的なキーワードを指定してしまい、
何千件の一致結果にげんなりしてしまったことがあったり、
自分言葉を検索キーワードにしてしまい全然ヒットしないことがあった
今はの私はキーワードをいろいろ変えながらうまくクズ情報にフィルタをかけたり、
検索エンジンをいろいろ変えたりして何とか
検索エンジンを使いこなしているつもりになっているが、まだまだ先は長い。
212デフォルトの名無しさん:02/03/08 22:31
Cでミリ秒単位で時間は持ってこれないの?
clock()とCLOCKS_PER_SECで場合によっては求められる
下のように関数を作りました。

LOCAL void hankaku(int resu)
{
return;
};

この場合、プロトタイプ宣言も

LOCAL void hankaku(int resu);

とするのでしょうか?
215デフォルトの名無しさん:02/03/09 14:48
>>214

localなんてあったか?
staticとexternなら知っているが。
216デフォルトの名無しさん:02/03/09 14:48
>>214
プロトタイプ宣言なんてする奴はいねーよ!
プロトタイプ宣言しないと

void func1(){ … }
void func2(){ … }

ってなソースで func1 から func2呼び出せませんが 何か?
>>216
GLOBALの時だけ、宣言するのですか?
>>217

うーん?
でも実際にプロトタイプ宣言していないものがほとんどだよね?
>>218
LOCALだとかGLOBALだとか一体なんの話をしているんだ?
221monosiri:02/03/09 14:55
ローカル関数
グローバル関数
>>221
他のファイルから見えるか見えないかってことか?
それはstaticとexternだろ?
>>219
普通はヘッダファイルでプロトタイプ宣言してるからでしょ。
>>223
そのなかにもないし。
標準ライブラリくらいでしかみたことない。
225デフォルトの名無しさん:02/03/09 15:05
みんなはプロトタイプ宣言をしているの?
プロトタイプ宣言したことないって…
ネタか? マジで入門者レベルなのか?
とりあえず相手にしないほうが良さそうだなぁ…
227214:02/03/09 15:09
ネットから落としたサンプルソースに

LOCAL Sint16 e1_pl_search_bak = 0;

GLOBAL Sint16 e1_pl_search(Float32 x, Float32 y)
{
・・・・・・・・・・・・・
}

てな感じで、書いてあったんです。
>>226
いや、俺はしているんだが・・・・
でもApacheとかゆうめいなソフトのソースを見るとないから迷っている。

俺が見落としているだけ?
>>225
> みんなはプロトタイプ宣言をしているの?
1つのファイルのみでプログラムが構成されていて、
main関数を一番最後に書く場合、プロトタイプ宣言はしない。

が、そんなプログラムはあまり書かない。
230214:02/03/09 15:24
なんかヘッダーファイルを一つ一つ見ていったら、
#define GLOBAL // 外部参照
#define LOCAL static // 内部参照

ってなことが書いてありました。

・・・・・・・・
>>229
そうか。ありがとう。
じゃあこのままプロトタイプ宣言をし続けていいんですね・・・
正直迷っていたんで助かりました。
>>230
プロトタイプ宣言でやってみてエラーになったらやめれば?
233デフォルトの名無しさん :02/03/09 16:10
#include <stdio.h>

#define MAX 5 /* これ以後の MAX を 5 に読み替える命令 */

main()
{
int i;
int point[MAX]; /* MAX 個の要素を持つ配列 point を宣言 */
int total=0, avr; /* ★★★★★*/

for(i=0; i<MAX; i++){ /* MAX 回の繰り返し */
printf("%d人目の点数は? >", i+1);
scanf("%d", &point[i]);
/* 配列の場合でも & を忘れずに付ける */
}
for(i=0; i<MAX; i++){
printf("%d人目 = %d\n", i+1, point[i]);
total += point[i];
}
avr = total / MAX;
printf("平均点 = %d\n", avr);
}

 超初心者です。 上の五つ星のところの int total=0 のところの
「 =0 」を消して、実行すると、totalの結果がおかしくなります。
どうしてなんでしょうか? よろしくお願いしますm(__)m
234近頃物忘れが激しい35歳:02/03/09 16:10
質問です

関数その1
void mycopy(char *d,char *s,int n)
{
  while((*s !='\0')&&(n > 0)){

   *d++ = *s++;
    n--;
  }

 *d = '\0';

}
と書くとsの文字はdにコピーできますね。では

関数その2
void mystradv(char *s,int d)
{
  while((*s !='\0')&&(d > 0)){
    *s++;
    d--;
  }

}
のと書くと、何か期待通りに動作しません。
期待っちゆうのは

int main()
{
  char x[20+1];
  char y[20+1];
  memset(x,'\0',sizeof(x));
  memset(y,'\0',sizeof(y));

  strcpy(x,"0123456789");

  mystradv(x,3);//関数その2
  mycopy(y,x,10);//関数その1

  printf("x=%s y=%s\n",x,y);
  return 0;
}
結果   0123456789
期待   3456789

関数の引数に(char *s)を使っているのに何故なんでしょうか?
宜しくお願いします。
235デフォルトの名無しさん:02/03/09 16:12
>>233
コンパイル時に警告がでないか?
>>233
ローカルで宣言した変数は内容が0に初期化される保証はない
237近頃物忘れが激しい35歳:02/03/09 16:13

ごめんなさい。ちょっと訂正

main()
{

 × printf("x=%s y=%s\n",x,y);
 ○ printf("y=%s\n",y);

どうぞ宜しく
>>236
staticなら0に初期化されますがなにか?
>234
void mystradv(char**s, intd)
じゃない?
配列を渡すと変なことになるけど
>>238
ローカルに宣言した自動変数は0に初期化される保証はない。
これでどうだ
>>240
OK!
というか普通はコンパイラが警告を出してくれるよな。どんなの使っているんだろうね。
242近頃物忘れが激しい35歳:02/03/09 16:21
いえ、char* を渡したいんですわ。
*sをs[2]を指すようにしたいんですがな。
ん−−−
243デフォルトの名無しさん:02/03/09 16:23
>1
Cがいちばん経んかが少ない空な.単に経んかについていけなかっただけでは.LOL!
警告メッセージを読まないからバカなんだよ。
>>242
よく考えてみろよ。
char*s だと、s[0]へのポインタがコピー渡しされるわけだから、
そのポインタを書き換えることは不可能。
ポインタを書き換えたいならポインタへのポインタを渡せ
246233 :02/03/09 16:29
>>233 です。
 レス速いですね。 みなさん、ありがとうございます。
自動変数って
 int total = 0 , avr;   (>>233の五つ星のとこ)
 の「 avr 」もそうだと思うのですが、とりあえず結果がおかしければ
変数をゼロにしてて、いいのかな? 「 avr=0 」にしても、しなくても
結果は同じでした。

 て優香。あまりわかってないので、逝ってきます。
ありがとうございました。
>>246
avrは初期化する前に参照していないから。
248プリオンが溜まりつつある35歳:02/03/09 16:34
>246さん

お返事ありがとう。でもね・・・

関数その1
void mycopy(char *d,char *s,int n)
{
  while((*s !='\0')&&(n > 0)){

   *d++ = *s++;
    n--;
  }

 *d = '\0';

}

コピー渡しの*d *sのはずなのに、なんで
コピーできるのだろうかね?

宜しくお願いします。
249プリオンが溜まりつつある35歳:02/03/09 16:34
>>248
mycopyでコピーが出来ているのは、
s[0]へのポインタがコピーされているので、
ポインタは別物でも、ポインタが差す先は同じもの

実体と参照について調べてみよう
251プリオンが溜まりつつある35歳:02/03/09 16:40
タバコすってきた
>>250さん、どうもありがとう。

勉強してみます。
252デフォルトの名無しさん :02/03/09 16:42
#define "逝ってよし" 0
#define "あぼーん" 1
てな感じで日本語使えたよね?
エラーが出るんだがどう書いたらいいか教えてください。
使用しているコンパイラはVisualC++6.0です。
無理だろ
おまえおもろいな
255デフォルトの名無しさん:02/03/09 17:02
>>252
日本語はもとより、"←これも使えないぞ。
>>248
あのさ、
*s++
ってさ、
*(s++)
ってことだよな。
こういう書き方は混乱するから単に
s++
でいいと思うが。(細かいトコだけど)
>>256
イディオムだからいいじゃねーか
258256:02/03/09 17:26
ってmycopyの場合は
*d++=*s++;
の方がが一行で済ませられるな。
良く見てなかった。
氏かも256だと言うのに気づかなかった。
頚釣って夷狄益…
259ビル・ジョブス:02/03/09 17:33
>>256
それじゃ値を代入できないから目的を達成できませんが・・・プ
そして混乱するのは君だけの問題であって、プロにとっては普通というか、
*s++って書いてくれないと読みにくいよ。モットベンキョウシテネ
260名無しさん@Emacs:02/03/09 18:27
char* mystradv(char* s, int d)
{
while ((*s != '\0') && (d > 0)) {
s++;
d--;
}
return s;
}

じゃだめなの?
はずしてたら剥げしくごめん。
261プリオンが溜まりつつある35歳:02/03/09 18:36
いえ、>>260さん、私も同じ事をしてます。
ただ、同じchar *sを引数で取るのに、
「コピーはできるのに配列先頭へのポインタずらしができないのは何故」
と思った次第です。自分の、char * に対する認識がおかしいのかと思ったり
しました。

262プリオンが溜まりつつある35歳:02/03/09 18:41
char *sを引数で取る事=sへの参照渡しと同じと捉えていたのですが、
間違って覚えていたのですかね。今更、COBOLに戻るつもりはないし、
気になっただけです。

strncpy(dest,mystradv(src,3),4);

とか、使う分には申し分ないから、こういうものだと割り切って
覚えていいんですかね。(爆)

>>261
ポインタをずらしたい = ポインタを書き換えなければいけない
ポインタを書き換えるのに、ポインタのコピー渡しをしたら
いくら書き換えてもコピーが書き換えられるだけで元のポインタには一切影響がないから
>>262
それじゃstrncpy(dest,src+3,4);でいいじゃねーか
mystradvなんて書かないで素直に src + 3 しろ。

Cの関数引数はすべて値渡しだ。
参照渡しはいっさいできない。

値を更新するつもりで関数に渡すときは、値のポインタ(アドレス)を値渡しする。
関数は渡されたポインタを足したりひいたりしても、呼び出し元のポインタは更新されない。

でも、だが、しかし、
渡されたポインタ(アドレス)を使って、ポインタの指し示す先を更新することができる。

OK?

では次に、
Cには文字列を扱う型はない。
文字を扱う型もないが、かわりにcharという整数型に文字コードをつっこむことにしている。
文字列を使いたいときは char の配列を作って、そこの中に一文字ずつ分けて入れる。
長さがわからなくなるので、文字列の末尾には 0 を入れる。

OK?

で、文字列を関数に渡したい場合、配列の先頭アドレス(ポインタ)を渡す。

strcpy(char *dst, const char *src)
は、 dst に格納先のchar配列の先頭アドレスを渡す。
srcにはコピー元のchar配列の先頭アドレスを渡す。

strcpy(p, "aaaa");
とやったとき、strcpyの中では
while(*p) { *p = *src; p++; src++; }
みたいなことをやっているが、 p や src そのものは値渡しされたポインタなので、
呼び出し元の p や "aaaa" は更新されない。
でも、 p で渡した char 配列の中身は書き換えられる。

OK?


while (*src) だ鬱だ四天王
267それじゃプリオンが溜まりつつある35歳@バカ丸出しで質問するぜ:02/03/09 18:52
>>263
ポインタのコピー説って本当なの?
だからmycopyの例を書いたんですが、
なんで
void mycopy(char *d,char *s,int n)
{
 while((*s !='\0')&&(n > 0)){
  *d++ = *s++;
  n--;
 }
 *d = '\0';
}
でコピーなはずの*dにコピーができるのか理解不能なのだが。
関数引数は、つまり、呼び出し元から渡されたパラメータの*コピー*だと覚えておこう。
引数そのものを編集しても、呼び出し元にいっさい影響はない。
ご丁寧な説明だこった。
270プリオンが溜まりつつある35歳@src+3はきらいなんだが:02/03/09 18:56

投稿した後に立派な答えをありがとうございます。
しばし熟読してみますね。
ちなみに、
関数にポインタを渡して、そのポインタをずらしてもらいたいときは、
戻り値で更新したポインタ値を返すか、
ポインタのアドレス、つまりポインタのポインタを渡して、
ポインタの指しているポインタ変数を更新するのだ。

char *mystradv(char *p, int n)
{
while (n > 0)
{
p++; n--;
}
return p;
/* もしくは return p + n; */
}

呼び出し元
p = mystradv(p, 3)

それか
mystradv(char **pp, int n)
{
while (n > 0)
{
(*pp)++; n--;
}
/* もしくは *pp += n; */
}

呼び出し元
mystradv(&p, 3)
今まで、よく言われるようなポインタで引っかかるってことは
どういうことか想像もつかなかったんだが
こういうふうに引っかかるわけね。
void mycopy(char *d,char *s,int n)
{
 for(;*s&&n>0;d++,s++,n--)
  *d = *s;
 *d = '\0';
}
いろいろな目的でポインタが使われるのと、
basicのように基本的に参照渡しな言語が入門用といわれてるのが原因か?

話かっちまえば、別にたいしたことない。
275初心者@独学:02/03/09 19:46
void f(char *s,const char *p)
{ /* 文字配列sからパターン文字列pを全て除去する関数 */
 int i,l = strlen(p);
 for(i = l;*s != '\0';i = l)
  if(*s==*p && !strncmp(s,p,l))
   while(i--)
    *s++ = '・';
 else
  s++;
}

除去した所は'・'で潰される関数です。
何かだめなところあるでしょうか?
あれば思いっきり突っ込んでやってください。
超絶な先生様方、おながいしますm(T▽T)m
全然ダメだ
277初心者@独学:02/03/09 19:51
ミス!
関数名は忘れてください。
 超初心者です。 C言語の本に、よく「宣言」という言葉が
出てきますが、なじみがない表現なので違和感があります。
 わかりやすく言い換えると、どういう表現がいいのですか?
>>275
とりあえず、strstrでまわしたほうがすっきりせん?
あと、iに長さをセットするタイミングが奇妙。

void f(char *s, const char *p)
{
 int l = strlen(p);
 while ( (s = strstr(s, p)) != NULL ) {
  memset( s, '・', l );
  s += l;
 }
}
void f(char *s, const char *p)
{
 int i, l = strlen(p);
 while (*s) {
  if (*s == *p && !strncmp(s,p,l)) {
   for (i = 0; i < l; ++i)
    *s++ = '・';
  }
  else {
   s++;
  }
 }
}
でいいだろ

だが、 pの文字列長が0でもたまたま動くし。
う、なんか279のほうがカコイイ
282デフォルトの名無しさん:02/03/09 19:58
トークン切り出し って悩みどころだよね
283初心者@独学:02/03/09 20:10
先生様方、ありがとうございます!

>>279
strstr()とmemset()がわからないのでK&R読み返してみます。
見た感じ凄いスマートで見やすいっすね!
>>280
ありがとうございます、試してみます!
if(NULL)が常に成り立たたない保証ってある?
NULLを再定義しない限りは保証はある。
NULLと0は同義だ。

変なCPUがあったとして、アセンブラ上とかで不正なポインタ(つまりNULL)に0以外のアドレス
0xa0000000 みたいなのを割り当ててたとしても、C言語上ではNULLポインタは常に 0 と等価だ。
286デフォルトの名無しさん:02/03/09 20:42
あなたの環境ではNULLはどのように定義されてますか?
一度手繰ってみると面白いよ。

ちなみにうちでは ((void*)0) だった。
>>278
うーん、逆に聞きたいのですが、
「アメリカの独立宣言」の「宣言」を、わかりやすく
言い換えると、どういう表現がいいですか?
>>285
漏れの感覚だと、NULLはint型じゃなくて、ポインタ型なんだよなぁ。
つまり、>>286がしっくりくる。
289288:02/03/09 21:07
>>285
すまん。>>288は忘れてくれ。
290:02/03/09 21:19
ファイルをランダムな文字列で上書き(数回)してから削除したいのですが
何か良い方法はないですか?
>>290
ランダムな文字列で上書きしてから削除してください
バカだなあ。
どうせ最後に削除するんだから、書かずに消しちゃえばいいだろ。
293デフォルトの名無しさん:02/03/09 22:30
Cで書いたプログラムをアイコンをダブルクリックして起動できるアプリケーションに
するにはどうしたらいいんでしょうか?
VC++6.0スタンダードなんですが、そういうのはC++で書かないとできないんでしょうか?
ダブルクリックして起動できないアプリケーションの作り方がしりたい…
>>294
dllで作ってRunDll使って起動させるのは?
>>295
なるへそ…
てーか、漏れは放置して293に回答解説してやって。
何かだるくて面倒だ。
バカだなぁ。
ファイル消したって、中身は消えてないのになぁ。
>>293

ビルドしたならEXEファイルができてるんじゃないのさ。
system("dd if=/dev/random of=/dev/hda1");
300デフォルトの名無しさん:02/03/09 23:03
C++と違ってCではNULL==0は保証されていないんじゃなかった?
>300
>>1のリンク先を読んだ事はありますか?
302NULL:02/03/09 23:10
なんでせっかくマクロ定義されているのにそれを使わないのか小時間問い詰めたい。
303プリオンが溜まりつつある35歳@src+3はきらいなんだが:02/03/09 23:44
どうも有り難う御座いました。みなさん。
皆さんがいなければ、膨大な調査時間を過ごすところでした。
これからも宜しくお願いいたします。
CやらずにCOBOLで収まってればよかったのに
迷惑な奴
305デフォルトの名無しさん:02/03/09 23:48
http://www.catnet.ne.jp/kouno/c_faq/c5.html#0
この章は読んでて面白い。
ちょっと誤解してた。
反省。
306デフォルトの名無しさん:02/03/10 02:59
日本語を出力とか、日本語で入力されている
文字列をファイルから読み込むとかって
どうすればいいのですか?
>>306
日本語に対応してるOSだったら、標準入出力で日本語読み書き出来ると思うが?
文字単位で扱いたいなら、マルチバイト扱える関数に置き換える必要は有るけど。

具体的に今何が問題で、最終的に何がしたいのか、差し支えない範囲でも書けや。
バカだなぁ。
ファイル上書きしたって、元のクラスタに書かれるとは限らないのに。
int c;
FILE *fp = fopen("糞レス.txt","rb");
while((c = fgec(fp))!=EOF)
fputc(c,stdout);
fclose(fp);
310デフォルトの名無しさん:02/03/10 04:15
標準ライブラリを使っちゃいけない環境用に
自分ライブラリを充実させてる?

ええ、そのくらいの心構えは必要よ。
311デフォルトの名無しさん:02/03/10 04:28
(´Д`)ウワーン
春だねぇ
>>308
バカはお前だ
r+で開いて上書きしてもいいし、メモリマッピングで書いてもいい
314:02/03/10 10:54
>>290です。

>>313さんの意見も考えたのですが、
r+で開いて上書きした場合、HDDのクラスタは
全開記録してあった同じ場所に書かれるんでしょうか?

いったん消したファイルを二度と復元できないように
したいと思ってます。皆様、力を貸してください。
宜しくお願いします。
315:02/03/10 10:56
訂正

× 全開
○ 前回
316デフォルトの名無しさん:02/03/10 11:00
>>313先生の講義が始まったぞ!
みんな急げ!
>>314
C言語としては何の規定もない。上書きされるかもしれないし別の場所に書き込まれるかもしれない。OSのファイルシステムドライバの動作に依る。
>>1 のアヒル本を読んでいるのですが、サンプルコード ce4.c の main の中
の「オプション指定の解析のコード」のところに、

while (*(++s + 1))
;

とあるんですが、意味が分かりません。これは何をしているところですか?

例えば引数で -w12345 と渡した場合、この部分に来たときは s は w の位置
を指しているんですが、このループを抜けた後に s は 5 の後の '\0' を指す
のでしょうか? でも引数が -w120345 のような場合、途中に 0 があるとそこ
で止まってしまう気がするし。
>>314
1, ファイルを削除
2. そのドライブが一杯になるまでランダムな内容のファイルを生成
  char code;
  while (code = (char)rand(), fwrite(&code, 1, 1, fp)) ;
3. 生成したファイルも削除

かなり無茶かも知れないけど,これってどうですか?
つまり >>299 さんの方法と同じような物(っすよね?)なんだけど。
>>318
つまり '0' と '\0' の違いが判らない、と?
321318:02/03/10 11:34
これがそのコードです

/* オプション指定の解析のコード */
while (--argc > 0 && **++argv == '-') {
for (s = *argv + 1; *s != '\0'; s++) {
switch (*s) {
case 'w':
if (alldigit(s + 1) == NO)
usage(); /* no return */
width = atoi(s + 1);
while (*(++s + 1))
;
break;
default:
usage(); /* no return */
}
}
}
322318:02/03/10 11:39
>>320
その違いは分かっているつもりですが...

>>321 は -w[数字] という引数を処理するところなのですが、
while の部分はなくてもいいような気がするんですよね。というか何をしてい
るのかが分かっていないだけですが...
>>318
while( (++s)[1] )
と同じだよん。ループを抜けたあと、sは"5"のアドレスを
指してる。あと、"-w120345" は
2d 77 31 32 30 33 34 35 00
なので、'0' == 0x30 だよん。
書き方からみるに
case 'w':
 if (alldigit(s + 1) == NO)
  usage(); /* no return */

 width = atoi(s + 1);
 while (*(++s + 1))
  ;//この位置には widthを求める処理が入ってたと思われ。
 break;

っつーわけで、widthを求める処理を atoi に置き換えた後
削除するのを忘れた、とか そんな感じだと思う。
325デフォルトの名無しさん :02/03/10 11:51
 これからC言語を勉強しようと思いますが
勉強できる定番サイトがあれば、教えてください。
327323:02/03/10 11:55
>>322
漏れの予想だと、for()ループを綺麗に抜けるための処理だと思う。

フラグ立てるのも嫌だし、strlen()使うほどでも無いと判断
したのでしょう。
328318:02/03/10 11:55
>>323
なるほど、やっぱり '0' と '\0' が分かってなかったかもしれませんね。

>>324
そうですか。ということは while の部分では何もしてないんですか。

まだよく分かってないのでもうちょっと考えてきます。
329324:02/03/10 11:57
ごめん forの終了条件見てなかった。
>>327が正解だと思います。綺麗に抜けてるかどうかは別にして。
>>319
ぬるい。
ぬるい。
ぬるい。
そのプログラム実行中に別プロセスがファイルを新規に作成して、
中身を書かずにファイルサイズのみを拡張した場合、以前書き込んだ内容が
保持される可能性がある。
かつ、その場合、>>319のプログラムではデータを書きつぶすことはできない。

それに、その方法でどんなに必死こいてつぶそうと思っても、スワップファイル
が作成されていればその中に糞データが残っている可能性があるからな。

どうしても消したければ物理的に破壊するか、ドライブの中身を
磁気的にクリアしてくれるツールを使え。
>>321
初心者向け(だよね?)のコードにしては読みづらいね。
その本って評判いいの?
作ってわかるCプログラミング
日下部 陽一
技術評論社
ISBN:477411328X

だそうです。著者名から推して知るべし、なのかも
少なくともgetopt使ってない時点で萎える。
334318:02/03/10 12:24
あ、コードの意味自体は分かってきました。
でも何のためにこういう書き方なのかがちょっと分からない。
-w[数字] 以外のオプションを加えるときに必要になるのかな。

>>327さんのおっしゃっている、フラグを立てるとか strlen() を使う場合ど
うなるかを教えてもらったらすっきり分かる気がするのですが。

どなたか暇な方いらっしゃったらお願いします。
335318:02/03/10 12:29
>>331
>>332さんがおっしゃるように著者の評判は 2ch ではよくないようですね。
コードも難しめですが僕には読みごたえがあっておもしろいです。

>>1で薦められているので本自体の評判はいいのかなと思ったのですが。
>>318
まあ買っちゃったものは仕方がないので
読み終えたらK&Rで口直しして
実用コード書くときはそのコード忘れてgetopt使えば問題ないよ。
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/getopt.3.html
337323:02/03/10 12:38
>>334
ではでは、先のソースで、case 'w': でwidthをatoi()で取得した直後、
switchの外側のforループを抜けなければいけないとき、あなたならどう書きますか?
そもそもforはいらない
Exit For
なんか for (s = *argv + 1; *s != '\0'; s++) のループの書き方見ると
 program -a123b456
 program -a123 -b456
の両方が同じように解釈される
コマンドライン引数の解析を作り
たかったみたいだけど、
case以下の部分を見るに
○ program -a123 -b456
× program -a123b456
のような書き方になってるので、
どっちかに統一するのが良いのでは?

/* オプション指定の解析のコード 片方だけ */
while (--argc > 0 && **++argv == '-') {
 s = *argv + 1;
 switch (*s) {
 case 'w':
  if (alldigit(s + 1) == NO)
   usage(); /* no return */
  width = atoi(s + 1);
   break;

 default:
  usage(); /* no return */
 }
}

/* オプション指定の解析のコード 両方OK */
while (--argc > 0 && **++argv == '-') {
 s = *argv + 1;
 end = s + strlen(s);
 while(s < end) {
  switch (*s) {
  case 'w':
   s++;
   if( isdigit( *s ) )
    usage(); /* no return */
   else
    do{
     width = width * 10 + ( *s - '0' );
    }while( isdigit( *(++s) ) );
   break;
  default:
   usage(); /* no return */
  }
 }
}
  if( isdigit( *s ) )

  if( !isdigit( *s ) )
だな… 他にも間違ってそうな 鬱だ…
糞コードまじめに解読すんなや>all
あっさり捨てて書き直せ。
343デフォルトの名無しさん :02/03/10 13:01
オブジェクトや、オブジェクト指向の意味が、調べても
意味がわからないのですが、猿でもわかる説明のできる方
よろしければ、教えてください。
>>343
この板にオブジェクト指向のスレがいっぱいあるので、どこがいいのか
わかんないけど、そちらへどうぞ。
345318:02/03/10 13:28
>>337
確かに strlen() じゃないと for ループ抜けられないですね。ちょっと考え
ていたんですがうまく動きませんでした。まだまだですね。
単純に s += strlen(++s); と入れてみたのですが。でもとにかく意味は分か
りました。ありがとうございます。

>>338 そうですね。for 文なくてもいけそうですね。
でも>>336さんがおっしゃるように getopt() というのを使うのが一番いいよ
うですね。あとで調べてみます。

>>342
糞コードは糞コードでも意味が分からないと気になったもので。反面教師とい
う意味で勉強になりました(w

これ以上続けると荒れそうな雰囲気(?)なのであとは自分で勉強してきます。
みなさんありがとうございました。
346343:02/03/10 13:31
>>344
そうなんですか!どうも、ありがとう!
347デフォルトの名無しさん:02/03/10 13:35
キャストについて質問です。

unsigned short (うちの環境では16bit) 型の変数を
signed int に変換したいのです。

何も問題なさそうなのですが、ひとつ大問題があったのです。
unsigned short の中身は *本当は符号付き* だったのです。

signed short に入れてから signed int に入れなおすより簡単で
実行時効率もいい解決方法はありますか?
入れなくてもキャストすりゃあじゅうぶん。

unsigned short us;
signed int si;

si = (signed int)(signed short)us;

signed shortからsigned intへの符号拡張は自動的にやってくれるので

si = (signed short)us;

アセンブラに落として見りゃあわかるけど、何十万回も繰り返すんじゃない限り
実行効率は大してかわらん。
>>347
union _danger {
unsigned short us;
signed short ss;
};
に入れてみるという危険なかけをしてみる気はないかい?
なんとなくうまくいくようなきがする。
大してかわらん、というのは

si = *(signed short *)&si;

と比べての話だ。

usがレジスタにマップされているとアドレス演算子が使えなくなるので、
348の方が若干速くなる可能性はあるな。
共用体にしちゃうと、共用体をレジスタにマップできないコンパイラで効率落ちるよ。
可読性もがた落ち。
キャストしなさい。

352349:02/03/10 13:50
>>351
うい。
353347:02/03/10 13:55
あ、そうか、その場でキャストすればよかったんですね。
できました。ありがとうございました。
354デフォルトの名無しさん :02/03/10 14:19
引数と変数って、どう違うのですか?
関数を呼ぶ側から見たとき、関数に渡すパラメータを引数と言います。
呼ばれた側では、関数に渡されたパラメータのコピーを受け取ります。これを引数といいます。

変数は、関数とかそういうの関係無しに、データを格納しておく場所に名前を付けたもののことを言います。
データには様々な種類がありますが、たとえば

int a;

なら、 a はint型のデータを格納する変数。

int *pa;
なら、paはint型を指すポインタを格納する変数。

ということになります。

関数引数は、基本的に、すべて変数で受け取ります。

int func(int a, int b);

の場合、
第一引数を a という int を格納する変数で受け取ります。
第二引数を b という int を格納する変数で受け取ります。

このほかに可変長引数というのがありますが、
貴様にはまだ早いので割愛させていただきます。
356354:02/03/10 14:42
>>355 ご丁寧にありがとう! 
>>356
ネタ質じゃなかったのか?
358デフォルトの名無しさん:02/03/10 15:32
char *の変数があって、その変数は関数の名前を指している。どうす
ればこの関数を呼ぶことができるか。
A:一番単純な方法は、関数の名前と関数へのポインターの対応表を用
することである。
int func(), anotherfunc();
struct { char *name; int (*funcptr)(); } symtab[] = {
"func", func,
"anotherfunc", anotherfunc,};
そうして名前を求めてテーブルを探し、名前に対応する関数へのポイン
ターを使って関数を起動すればよい。

C FAQ 日本語訳の20その他にあった質問ですが
このあとどのようにすれば関数を呼べるでしょうか?
C++Builder 5 を使ってるんですがCGI作る時はどうすれば良いんでしょうか?
CでCGI作るってサイトには% gcc -o hello-world.cgi hello-world.cでコンパイラするって書いてあるけど、自動でコンパイラするのでできません。
Cの質問って言うかBuildeの使い方の質問かもしてないけど・・・
gccではなくbcc32を使う
本当にCでCGI作る必要があるのかと小一時間
>>358
(*symtab[0].funcptrX)();
かねぇ?
>>359
パールで作れ
コンパイラする
自動でコンパイラする


>>359はローカル(win)でコンパイルしたバイナリを
web鯖(unix系)で動かそうとしてるとか。
多分ソースをうpしてからtelnetでログインして
gcc でコンパイルって話なんだろう。ホントは。
>362 出来ました。 サンクスです。
367359:02/03/10 16:13
>>366
できました、ありがとうございました。

説明不足の上に勉強不足でした。
吊って来ます。
368デフォルトの名無しさん:02/03/10 16:14
>>359
どうもこうもない。
ソースプログラムを書いてコンパイル。ウェブサーバーを立ち上げてからブラウザでアクセス。

ただし、最低限必要なヘッダーを出力しないとエラーになる。
ププッ
ヴァーカ
370ビル・ジョブス:02/03/10 20:05
みなさん、単項+演算子活用してますか?
さー知らないやつは勉強勉強!
>>370
はいはい、知らなかった事を知って嬉しいのは分かったから。
厨はおとなしく飯食って寝てろ。
んなもんつかわねーよばーか
いや全然一度も使ったことないがここ10年で不自由したことはないぞ
374デフォルトの名無しさん:02/03/10 20:21
セクタ指定して豪快に塗りつぶせばいいんじゃないでしょうか。
というか、そういうの昔書いたような。
あれってもしかして金になるコードだったのか?
>>374
?????
WinならNT環境でも使えて信頼性が保証されているなら金になるんじゃない?
377:02/03/10 22:35
>>290 & >>314です。

>>376の言うとおり、
セキュリティが騒がれている今は金になりますね。

かくいう私もDOS版でFDDを上書きして消去は作って持ってるんです。
NT環境だとファイルの構成情報をコワしてしまい使い物にならなくて
悩みまくってます。

ホントに、なにかうまい手はないですか?
>>377
ファイルシュレッダーっていうソフトなかったっけ?

それから、環境がないから分からない。
WinNTだったらメモリマッピングを使うなら物理的に同じ位置に書き込まれる。
使い終わったディスクのデータを消去したいだけ(ディスク全体)なら簡単に作れる。
ってか、そういうアプリケーションも売ってる
379:02/03/10 23:09
>>378
ファイルシュレッダーではなくディスクシュレッダーと記憶してます。
このソフトはディスクのデータすべてを上書き消去するんです、確か。
すべてを消去されると、再セットアップするのが面倒なので、
「なければ作ってしまえ」
という発想だったんです。DOSの頃はセクタ単位でファイルをいじれた(アセンブラでしたけど)
んですけど、Windowsになってからは、、、(泣
380デフォルトの名無しさん:02/03/10 23:22
今でもセクタ単位でいじれなかったっけ?
381ビル・ジョブス:02/03/11 00:03
>>372
「ばーか」とはなんだ!
代入時に暗黙の型変換を適用しないというとても便利な演算子だぞ!
頭きた!おまえの会社調べて絶対にクビにしてやる。サヨナラ
382ビル・ボブス:02/03/11 00:06
>>381の兄です。
弟がお世話になっております
>>381
俺は学生だよばーか
>>383弟には構わないでやってください。
猿にエサを与えると勘違いしますから。
>>384
餌付けしてもいいじゃねーかよばーか
386デフォルトの名無しさん:02/03/11 00:15
>>381
int a = +1.1;
int b = 1.1;

どちらも暗黙の型変換が適用されて1が入るんだけど
>>386
ポインタにってことじゃないか?
char*a=+0;
388デフォルトの名無しさん:02/03/11 00:37
>>387
それでも同様ですよね?
>>381の言っているのの具体例がしりたいなぁ。
どっかの変なページからの知識の受け売りなのかな?
>>388
奴の妄想につき合うこたぁないよ。
妄想とはいかがなものか。
391デフォルトの名無しさん:02/03/11 00:53
( 〜´ー`)〜
392ビル・ジョブス:02/03/11 01:09
>>388
char c = -1;
int i,j;
i = c; //i == -1 符号拡張される
j = +c; //j == 255 符号拡張されない

>>372
あーそーか、おれが悪かったよ。
でも「ばーか」は止めとけよ君自身に言ってるみたいだから。
近年稀に見る糞コードで砂
394デフォルトの名無しさん:02/03/11 01:13
>>392
おいおい。
それは - を単項で使うのと同じく正数であるということを
明示してるわけでしょ。
それって>>381の言い方じゃ伝わらないよ。
用語はただしく使ってくれない?
395デフォルトの名無しさん:02/03/11 01:18
無知なのが明らかに・・・
符号拡張されないだけで、型変換は暗黙的に行われていると思われ。
397デフォルトの名無しさん:02/03/11 01:21
さらに言うと、バカばっかのプロジェクトでそういう書き方をすると
致命的な誤解を生むことが結構あるので
なるべくそういう表記は避けるのが通例。
大抵の場合、そんな書き方しなくてもかけるし
しないほうがいい場合の方が多いし
398デフォルトの名無しさん:02/03/11 01:22
>>396
どちらかというと、「拡張」もしてないよね。
399デフォルトの名無しさん:02/03/11 01:24
もうすぐだ・・・
400400!:02/03/11 01:25
今だ!400げっとーー
401デフォルトの名無しさん:02/03/11 01:28
>>361
ときに必要は発生するとおもうよ。
主に処理速度が要求されるときとか
もっと変なことしたいときとか
>>392
こいつ複数人のプロジェクトやったことなさそうだな...
392のコードはいかがなものか。
格上げ時に符号拡張するかどうかは処理系規定じゃなかった?

なお、実際に>>392のiとjを表示させたところ、
LSI Cでは両方255、BCCでは両方-1でした。
LSI Cのcharはunsigned、BCCのcharはsignedです。
405デフォルトの名無しさん:02/03/11 01:49
>>403
知識としては抑えておかないとだめな範囲。

「読めるし書けるけど書かない」というコードの典型例かと。
406デフォルトの名無しさん:02/03/11 02:10
アイタタ・・・
晒しあげ
#include <stdio.h>
main()
{
 int i, j;
 char c = -1;
 i = c; j = +c;
 printf("i = %d\nj = %d", i, j);
}

gcc/bcc/msvc 共に出力結果は
i = -1
j = -1

>>405抑えておかないとダメですか?
明らかに誤りですが。
このスレも実は知ったかが多いのか?
>407
たんに自分で追試するココロが失われているだけでわ?
つーかみんなビル・ジョブスのネタに踊らされてるだけでは・・・
奴がまともなレス付けてるの見たことないよ。
410ハンチク:02/03/11 10:17
仕事暇なんで読んでたけど、このスレ結構おもしろい。(・・いや・・いろんな意味で・・)

>単項+演算子
すまん。現役PGのくせになんのことか理解できんかった(w
しかし、うちじゃ数値型として char は滅多に使わないぞ。
たまに使っても unsigned が普通・・

胃の中の蛙だったのかな〜(汗
本読んでたら、
fprintf(stderr, "--more--", stderr);
こんなのがあったんですけど、後ろの stderr はどういうこと?
普通にコンパイルもできて、エラーにはならないんだけど。

間違いかなと思って web で正誤表見たんだけどその部分の訂正はなかった。
412デフォルトの名無しさん:02/03/11 11:19
>>411
後ろの stderr は消し忘れだろうに1票。
gcc で -Wall を付けてコンパイルすると warning を出してくれるぞ。
413411:02/03/11 11:38
>>412
warning: too many arguments for format
なるほど、↑のように出ました。ありがとう。
;; それにしてもダメ本だなぁ。
414デフォルトの名無しさん:02/03/11 11:41
>>413
なんて本よ?
>>318=>>411
なんですが、上でも書いたアヒル本です。
>>332の本ですね。

ちなみにサンプルコードの page2.c にありました。
さすがスーパーハイソサエティーハッカーの本だな
417デフォルトの名無しさん:02/03/11 13:25
>>411
コンパイル時にも実行時にもエラーが出なければ文脈上の誤りがあってもかまわないという見本です。
418411:02/03/11 14:04
でも実はこの前に読んだ本はもっとダメだったんですが。
簡単なエディタの作り方が載っていたんですが、その仕様がヘボヘボで...
アヒルさんの本は結構いいなぁとか思いながら読んでたんですが...
だめプログラマ街道まっしぐらですか?もしかして(w
419デフォルトの名無しさん:02/03/11 14:25
>>418
なんて本よ?
>>419
>>415 読め
421419:02/03/11 14:46
>>420
アヒル本の前に読んだ本はなにかと聞いているんだ。
日本語大丈夫か?
422411:02/03/11 14:50
>>420は僕じゃないですよ。一応。

アヒルさんの前は
http://www.ai-pub.co.jp/contents/book/prog/linux_c.html
これです。

これも読んでて分からなかったところとか最近 2ch で質問しにきたんですけ
ど。誤植も多いし、たぶんアヒルさんのより変なコードが多いと思います。
音痴な歌を聴くと音痴になるということはない。
そのへん人間はうまく出来ているものだ。
だめ本読んだからって、だめプログラマになることはないだろう。
424デフォルトの名無しさん:02/03/11 15:07
質問です。

ファイルの終端部分だけを削除したいのですが、
対象ファイルが巨大で効率の良い方法が無いかと悩んでいます。

・メモリ上に展開する事は出来ません。
・テンポラリファイルは作りたくない。

Appendの逆のようなことは可能でしょうか?
>>423
C言語の知識は音感と違って生まれつき備わってるようなものではない
>>424
移植性のある方法は思い付かないが
たいていの処理系にはchsize()か_chsize()という関数があると思われ
UNIXならtruncate(), ftruncate()だね
>424
truncateすれ。
はげしくカブタな……
430デフォルトの名無しさん :02/03/11 15:31
 初心者で勉強中ですが、C言語の初心者のサイトを見ていても
「ここを説明してほいのに〜!」と、思うことがあります。

 プログラムの説明で、うざいほどコメントで解説しているサイトが
あったら教えてください。
431デフォルトの名無しさん:02/03/11 15:36
>>430
ない。
この板で教えて君になれ。
fseek()でtruncate出来ると思ってた。
鬱だ...
433デフォルトの名無しさん:02/03/11 15:38
424です。
皆様ありがとうございました。
Cの標準的機能では出来ないと言う事ですね。

紹介された関数を使うことにいたします。
標準ライブラリはCの機能の内に入るのだろうか。
どうでもいいけど。
void main(void)

main()
はどう違うのでしょうか?
戻り値がちがいます。
ちなみにvoid mainなどとかくのはDQNだけです。
437デフォルトの名無しさん:02/03/11 15:47
main()

int main(void)
と等価だろう。
438435:02/03/11 15:50
int main(void)

void main(void)
は等価ではないのですか?
C99 から >>437 は保証されない、んでしたっけ?
440デフォルトの名無しさん:02/03/11 15:53
処理系では void main(void) しか許してないのもある。

閉鎖的ともDQNとも言われようと甘んじて受け入れよう。
あるったら、あるのだ。
441デフォルトの名無しさん:02/03/11 15:57
>>438
>戻り値がちがいます。

>>438
voidとintの違いが分からないのか?

>>440
普通に考えれば「void mainしか許していない処理系を除いて
void mainとかくのはDQN」という意味だろう。
一般的な処理系でvoid mainと書くのは受け入れられません。
>>440
何ていう処理系よ?
444438:02/03/11 15:59
皆さん、ありがとうございます。
>>441
戻り値と、返り値って、具体的にどう違うのですか?
「返りち」はグサッとやったときにかぶるやつだな。
446438:02/03/11 16:01
>>442
>voidとintの違いが分からないのか?
 どうも、ありがとうございます。
 intはわかります。voidはわかりません。
voidって、整数ですか?文字ですか?
voidはスーパーハイソサエティーハッカーのことだな。
448デフォルトの名無しさん :02/03/11 16:08
プログラムの最後の方によく
return(1);

return 0;
が出てきますが、これらはどこに0や1を返してるのですか?

>>446
うむ、プログラミング初心者ってところか、手持ちの本かヘルプ見てみ。
>>448
OSだったりShellだったり。
環境によって違う
戻り値と、返り値は同じだろう。
voidは「空虚」だ。
 void hoge(void)
なら hoge は何も返さないし、引数も無し。
452デフォルトの名無しさん:02/03/11 16:11
>>448
かなりの確率でシェルに返される。
453デフォルトの名無しさん:02/03/11 16:19
このスレの盛況振りを見ると、やっぱりなんだ
かんだ言ってもCって人気あるねぇ・・・
return(1);
みたいに ( ) を付けるのは古くからやってる人だろうか?
漏れは面倒だから括弧は一再付けない。
return 1;
455448:02/03/11 16:21
>>450
 ありがとうございます。
 
 シェルって、Linuxによくでてくる「カーネルとシェル」のシェルですか?
シェルに、return (1); を返すと具体的にどうなるのですか? 

 環境によって違うとは、M$と、Borlandや、システムによって違うって
ことですか? 

>>451
 ありがとうございます。
> void hoge(void)
>なら hoge は何も返さないし、引数も無し。

 void main(void) は、「メイン関数がとりあえずありますよ」
ということでよろしいのでしょうか?
>>455
> void main(void) は、「メイン関数がとりあえずありますよ」
> ということでよろしいのでしょうか?
ダメ、mainはintにすると決まっている。
特に理由が無い限りint main(・・・)にしなさい。
457デフォルトの名無しさん:02/03/11 16:40
>>455
UNIXやDOS(窓)では0が正常終了と決まっている。
バッチファイルやシェルスクリプトでそのぷろぐらむを起動した場合は
その値を使って条件分岐などできる。
1さん、もうそろそろ
まとめて欲しいなぁ、と言ってみるテスト
4591:02/03/11 16:57
>>458
お前がまとめろ
460448:02/03/11 16:57
>>456
>>457
ありがとうございました。
よくわかりました。 
う〜ん、変換ソフトの調子が悪い・・(汗
461デフォルトの名無しさん:02/03/11 17:21
一定時間でパラメータをとってきて表示するような関数で、「あるキーが押されたら終了」のような処理はどうすればよいでしょうか?

while(!getc(stdin))
{
処理
printf("push any key to exit\n");
sleep(1);
}
のようにすると(当然)getcから戻ってくるまで次の処理に進みませんし・・・。
>>461
あるキーが押されたら云々・・・ という処理は別プロセスにやらせて
メイン処理中ではそいつからのシグナルを受け取って もひゃ!
パラメータはどっから持ってくるん?
キー入力は標準入力からとるとして
非カノニカルな動作をするように設定すればいいだけじゃないか

と言ってみたいが環境依存だし。どこで動かすものか判らんことには
ANSIには処理系にキーボード自体が必要だなんて仕様がどこにも無いんだからしょうがないじゃん。
その割には、思いっきり割り込み制御の仕様があったりするけど。
466461:02/03/11 18:05
>>464
Solarisのコンソールで動けば良いんですが。
言われたことをキーにして調べてみましたが、
<termios.h>あたりの関数を使えばできるんですかね?
>>466
はい、そのとおりだす。
void foo()
で虚無を返す関数か・・・
0個のファイルが見つかりました並に不自然だな
>>468
言うなYO・・・
470ビル・ジョブス:02/03/11 23:43
>>おれに文句のあるヤツラへ

あのなー・・・
「符号拡張」って書かなかったから「ばーか」か?
「整数型限定」って書かなかったから「ばーか」か?
挙句の果てに「糞コード」だと?

おまえらおれの建てたスレで何様のつもりだよ・・・
とりあえず、おれに文句のあるやつはもう来るな!
>>470
(・∀・) バーカ
472ビル・ジョブス:02/03/11 23:59
>>471 よく逝った(パチパチ
>>470
まぁまぁ、そう熱くなりなさんな。
そもそも自分で良いコード書ける人は、わざわざ糞とか言わず、黙ってコードで
書いてくる。
つまり、他人のコードを糞コードとか言う奴のスキルは知れているってことで。
何故、ム板のコテハンは痛いヤシばかりなのか…
痛くないコテハンのいる板ってどこ・・・
476痛くない:02/03/12 00:34
よんだ?
寒っ!!
478475:02/03/12 00:36
>>476
ワラタ・・・
チクショー!藁っちまった・・・
漏れも歳かな
>>470
もっと藁わせて下さい。
おながいします
英語で No file was found. (であってる?) っていうのは普通に言いそう
ですけどね。って C とは全然関係ないけど。
no such files. じゃないの?
was foundなんてまわりくどいってば
>>468
I have no money.とか平気で言う奴らだし>アメリカ人
484デフォルトの名無しさん:02/03/12 05:02
>>476
やべ、下から読んだから笑えなかった・・・鬱だ・・・・・
485パッサリ:02/03/12 05:17
ExtractFilePath()ってAPI?

[400]文字列からファイル名とパスを別々に取り出すには
 ファイルのパスが含まれた文字列からファイル名とパスを別々に取り出すには、ExtractFilePathとExtractFileNameというWindowsAPIを用いると、パスとファイル名を取り出す事ができます。

AnsiString PathName,FileName;

// パス名
PathName = ExtractFilePath("C:\\Windows\\Calc.exe");
// ファイル名
FileName = ExtractFileName("C:\\Windows\\Calc.exe");

っていう情報があったけど
未定義の関数 'ExtractFilePath' を呼び出した
ってコンパイルエラーになったよ。
486デフォルトの名無しさん:02/03/12 05:23
>>485
出るファイ独自関数
487パッサリ:02/03/12 05:36
ありがとうございます。
http://www2a.biglobe.ne.jp/~gonta/tipsc.htm
だめだこりゃ。
似たようなAPIなら
Path〜系のAPIが標準であるよ。
IE4以上だった気もするけど
Windowsなら_splitpath()がよろしいかと。
UNIX系(XPG準拠?)OSなら、basename()やdirname()とか。
C言語のプログラムがとても読みづらいんです。
日本語翻訳ソフトはありませんか?
491デフォルトの名無しさん:02/03/12 12:26
>>490
こんなふうにしたら読みやすいのか?


#読込<標準入出.頭>

整数 主要(無)
{
 書式付表示("今日は,皆さん\n")
 戻れ 0;
}
("今日は,皆さん\n")

(「今日は、皆さん。¥行」)
>491 う〜ん30点

六行目で不正な書式が発見されました。
  行末処理が行われていません。
494491:02/03/12 13:21
鬱だ...
495デフォルトの名無しさん:02/03/12 13:30
>>490
#define しまくって日本語かすれ
10進表記の数字を16進表記にしたいのですが
どうしたらいいのですか?
497デフォルトの名無しさん:02/03/12 15:54
>496
printf("%x", i);
>496
すいません。ありがとうございました。
int nTarget = 1234;
char strResult[30];

_itoa( nTarget, strResult, 16 );

こんな感じでもやってみました。
>>490
コーディングスタイルやマクロの利用度にもよるが、
読みなれればなんてことはない。
よく出来たライブラリのソースを読むと良いと思う。
よく出来たライブラリのソースキボン
>>500
libpng
>>501
サンクス
ホカニハ?>ALL
C で正規表現使うにはどうしたらいいですか?
>>503
自分でパーサーを作るか、既存のライブラリを使う。
とにかくC自体にはそんな機能はない(入出力機能さえないし)。
505デフォルトの名無しさん:02/03/12 17:34
>>503
質問はageでね。
506デフォルトの名無しさん :02/03/12 18:45
#include <stdio.h>
は 「これからstdio.hというヘッダファイルを使いますよ。」
ってことですか?

 それと、Visual Studioを使ってますが、プログラムファイルの中に
「inculude」というフォルダがありました。
 これを「muneo」にリネームすると

#muneo <hage.h>

 になるのでしょうか? ちょと怖くてやってませんが・・
>>506
includeという単語を辞書で引くと良いかと思います。
とりあえず英語です。
muneoにすると問題が発生します。
>>506=ムルアカ
コンパイラの検索パスに muneoをいれればOK。全然問題なし。

510506:02/03/12 18:54
皆さん、ありがとう!
#include <stdio.h>
が気になってたので、助かりました。m(__)m
511デフォルトの名無しさん:02/03/12 19:13
純粋に言うと C の問題ではなくてロジックの問題な気がするのですが
論理演算に関する質問です。

unsigned char 一つを 8 つのフラグとして使っています。
そのうち一つだけを変更したいのですが、今は立てる場合とおろす場合で
if で処理しています。
これを論理演算だけでやりたいと思って、さっきから考えているのですが、どうしてもうまくいきません。
imp を使うとよさそうな気がするのですが、もうまったくもってお手上げです。
どうやったらいいでしょうか?
>>511
unsigned char a; /* フラグ */
int x; /* ビット番号(0〜7) */

ビット検査
if( (a>>x) & 1 ) ビット勃ってる;

ビットたて
a |= 1<<x;

ビットおろし
a &= ~(1<<x);
513通りすがりmkII:02/03/12 19:23
>512
おいおい、511じゃないけどif文つかいたくねえから
論理演算でどうにかしろよ、って話じゃないのか?
514通りすがりmkII:02/03/12 19:25
って、おれが間違ってるみたいじゃん。
おれ逝って良し!
515511:02/03/12 19:35
>>512
ありがとうございます。でも分岐したくないんです。

>>514
いえ、>>513 であってます。

よろしくお願いします。
516ぼくフェロー:02/03/12 19:38
perl についてお尋ねしたいことがあるのですけど,
どの掲示板で聞いたらよいでしょか?
>>515
>>512であってんじゃん?
if()の中身だけ使えばいいわけだ。
((a>>x)&1)

でも俺なら迷わずビットフィールド使う。
http://www.pro.or.jp/~fuji/mybooks/cdiag/cdiag.6.4.html
>>516
http://pc.2ch.net/php/
昔はperl・CGI板ってあったんだけどね。
519ぼくメイト:02/03/12 19:47
>>516
【Perl】初心者コーナーPart10
http://pc.2ch.net/test/read.cgi/php/1014556702/
へGO!
520ぼくフェロー:02/03/12 19:49
>> 518

ご案内ありがとうございます.
そちらで聞いてみます.
521デフォルトの名無しさん:02/03/12 20:02
>>517
shortやintのときのビットフィールドについて
あれってビットフィールド定義した構造体と
shortやintそのものと共用体にしたとき
エンディアンはどう扱われるのか とても疑問

バリバリの環境依存なのか、それとも定義があるのか
int main(int argc,char *argv[])
のargvのポイント先の文字をいじることは合法ですか?

int i = 0;
while(argv[0][i]){
argv[0][i] = toupper(argv[0][i]);
i++;
}
とか
523デフォルトの名無しさん:02/03/12 20:12
>>522
ダメとは言ってないがイイとも言ってねーし。
はみ出なきゃ何してもいいよ。
>>522
俺的にはアウト。あくまで俺的。
>>521
環境依存。
おもいっきりK&Rに書いてある
526デフォルトの名無しさん:02/03/12 20:50
>>525
サンクス!

蟹炒飯は会社に置きっぱなしでさ。助かったよ。
527522:02/03/12 21:14
>>523,524
微妙ですね。
あんまりやらないようにします。
(アセンブラだったらやりそうだけど)
528デフォルトの名無しさん:02/03/12 21:18
最初にvoid main(void)と言い出したのは誰なんですか?
MSDNライブラリのプログラム例もvoid main(void)なんだよな。
>>528
両端のvoidは通常の関数定義とも共通だからいいとして、
mainが最初に実行される、っていうのは、Cの言語規則に含まれるのでは?
>>530
main の返り値は int だろ(゚Д゚)ゴルァっていう話じゃないの?
532デフォルトの名無しさん :02/03/12 22:29
int c;
c = getchar( );

 は何を意味するのでしょうか?
本を嫁
534デフォルトの名無しさん :02/03/12 22:32
>>533
読むわけにはい家内
>>515
ひょっとして、ビットが立っていたら落とす、落ちていたら立てるってことがやりたいの?
もしかしたら ^ の出番ですか?
536デフォルトの名無しさん:02/03/12 22:39
>>534
標準入力から一文字読んでcに格納。
537534:02/03/12 22:53
>>536
a ri ga to
>>535
すると
flags ^ (flags & (1<<n))
こうか。
flags ^= (1<<n)
統計によるとvoid mainと書いたりmallocしてもfreeしない
プログラマの給与は平均より約100万円ほど低いそうだ。
541538:02/03/12 23:34
うぎょ、違う。>>539氏のが正しいや。
>>540
> mallocしてもfreeしない
またですか…
またですな
544DSPプログラマ:02/03/12 23:46
>>540
void mainと書いていますが何か?
545デフォルトの名無しさん:02/03/12 23:53
void main() と int main()は
どちらの方が、いいのでしょうか?
好みとかですか?
教えてください。
そーいやなんで C には ^^ 演算子が無いんだ?
>>545
その環境による。
どっちでもいい場合もあるだろうし、必ず int でなければならない事も。
mallocしてもfreeしないのってありですよね。
プログラムなんてたいてい一瞬で終わってしまうし、
今時メモリなんて500−1000メガ当たり前ですし。
実害なんてありませんよね?
その上コードの工数まで減って言うことなしですね。
549545:02/03/12 23:57
必ずintでなければならない時ってどんな時ですか?
あと、逆に必ずvoidでなければならない時って
あるんですか?
教えてください
>>548
んじゃ、freeは絶対に使わないで下さい。
貴方の書いたプログラムは誰にも使われることがありませんから
>>549
ふつうは規格上かならずint。
voidなのは組み込みでシングルタスクだったり、
値を返す対象が居ない環境限定。
>>549
> 必ずintでなければならない時ってどんな時ですか?
ANSI C hosted environment 準拠の処理系を使うとき。

> あと、逆に必ずvoidでなければならない時ってあるんですか?
組み込み系だと、そもそもエントリポイントが main とは限らないし、名前が main
でも void と指定されてるかもしれない。
普通とかかならずとか絶対とかかもしれない
とかいってる人々は現場を知らない人です。
554545:02/03/13 00:05
>>551 ありがとうございます。
これからは、intを使うことにします。
555デフォルトの名無しさん:02/03/13 00:07
処理系に依存しないsizeofの型を教えてください。
すくなくとも
sizeof(char)==1
ですよね。
違うよ。C99かC#使え
sizeof(int32_t)==4
>>555
はっはっは。それはどうかな。
559545:02/03/13 00:09
皆さん、返事を沢山ありがとうございます。
気になっていたので、すっきりしました。
560555:02/03/13 00:12
処理系に依存しないsizeofなんてないってことですか?
環境に依存するsizeofなんてありませんが?
562デフォルトの名無しさん:02/03/13 00:13
sizeof(char) == 1は保証されているのでは。

>>556
>>558
すまんが解説きぼん。
漏れも562に賛成
>>562
ANSI 準拠という処理系に依存してるんでは?
それ言い出すと切りが無くねぇ?
C言語の枠からもはみ出しそうだ。
C#とか逝ってるアフォもいるし…
566デフォルトの名無しさん:02/03/13 00:28
>>565
はげどう。
サイズを決め打ちしないで、ちゃんとsizeofで判断するコードを書きなさいってこった。
sizeof(int)==1の処理系使った事有るし。
charもdoubleも全部1。
568わけわからん:02/03/13 00:40
char ふつう8ビット
short ふつう16ビット
int 今時なら32ビット
long ふつう32ビット

まああれだ。厳格にはlimits.hを見なきゃだめってことだ
569555:02/03/13 00:43
sizeof(char)は1でいいとして。

sizeof(0)==sizeof(int) はあってますか?
また、sizeof(void*)と等しくなることが保証されてる
sizeofってありますか?
>>568
ふつう==移植の落とし穴、と心得よ。
>>569
なぜ規格書をチェックしない?
sizeof(void*)についてはどのポインタも格納できるサイズということしか
規定されてないからな
573511:02/03/13 00:50
>> 535, 538, 539, 541
いえ、立っているか立っていないかに関わらず、入力値で、そのビットだけ
制御したいんです。

#define int BOOL
#define 0 FALSE
#define -1 TRUE

// src の第二ビットを new_value にする
int SetFlag2(BOOL new_value, int src){
  return ?????;
}

今は if で分けて処理しているんですが…。

>>569
あんた様はいったいなにをしたいのか?
処理系に依存しないためにsizeof()使うんじゃないの?
575デフォルトの名無しさん:02/03/13 00:57
>>573
なんでそんなにifを避けたがるの?
576デフォルトの名無しさん:02/03/13 00:57
mallocの話題があったので便乗。
自己参照構造体を作った場合の開放はどうすればいい?
わざわざ処理を作るのが面倒だからプログラム終了時に
OSが開放してくれることを期待してたんだけど、マズイ気がしてきた。
>>573
| 使え
(src | (1<<bit))
でええやん。
代入までやるなら
src |= (1<<bit);
値見るなら
ans = !!(src & (1<<bit));
って所か?

関係ないが #define -1 TRUE は、やめれ。
579517:02/03/13 00:59
>>573
あぁもうわけわからんなぁ。なぜ>>512じゃいけないのか??
>>512のビット立て、ビットおろしの「1」を代入したい変数(0 or 1)にして、
たて、おろしを連続ですれば、その変数が示す0か1になるだろうよ。

ちなみに、>>517も見てね。
>>576
自己参照構造体って
struct test{
struct test *test1;
};
とかのこと?
自己参照までやってるのに、解放考えないとは恐ろしいヤシだな・・・
>>576
malloc()をdefineするなり自分用のmy_malloc()関数等を作るなどして、
確保したポインタをかたっぱしからどっかに記憶していって、
最後にまとめてfree()しまくるってのはどお?

どっかに既にそういうのあるかも。
sizeof って、そもそも、 sizeof char の何倍かを返す、っていう定義でなかったっけか?
584デフォルトの名無しさん:02/03/13 01:23
>548は神
>584 ワラタ
586デフォルトの名無しさん:02/03/13 01:29
>>548
至上稀に見る天才。
>>576
OS が解放してくれるなら、全然問題なし。
デジャヴ?
fj ?
ふーじーのーふじのみやー
ごてんばあさん、おってー
591デフォルトの名無しさん:02/03/13 03:31
質問です。

scanfで入力した変数を配列の大きさにしたいのですが、
どうすればいいのでしょうか?
int i;
scanf("%d",&i);
{
 int *ip = malloc(sizeof(int)*i);
}
性的確保なら、定数式じゃないから無理
>>593
黙れ、エロおやじ
freeしなくても終了時に勝手に開放されんでないの?
まーいーや。
DLLは一応FreeLibraryしてるけどね。
>>573
 return src & ~(1 << n) | (!!new_value << n);
597名無しさん:02/03/13 10:33
あなたさまの力でこの子を1位にしてあげてください。
ただしばれないようにゆっくりと。。。http://orange.ko-mens.tv/idol/view.cgi?id=key
598デフォルトの名無しさん :02/03/13 13:35
int a;
の「 a 」が、scanf()などで「 &a 」と表示されてる部分って
例外なくメモリのアドレスを示してるのですか?
599ヴァッシュ:02/03/13 13:37
>>598
そうだよ
わかりずらいけど
600588:02/03/13 13:38
>>599
ありがとう!
601ヴァッシュ:02/03/13 13:39
つーか&がつくとアドレスをたいてい指す
602デフォルトの名無しさん:02/03/13 13:53
配列型、関数型に&が付くと型が変わるんですか?
bcc32で

char a[5];
printf("%p %p",a.&a);
とやると下のように
0012FF84 0012FF840
同じアドレスが表示されます。
同じだから
*&a = 0; //最初の要素に0を代入
ができると思ったのですが左辺値が必要と言われるので・・
配列の名前は、たいていの場合は先頭要素を指すポインタ( &a[0] )として
扱われるけど、& が付くときとか sizeof のオペランドになる時とかは
配列そのものとして処理されるので、 *a と *&a じゃ意味が違うっていうか
型が違うっていうか。
604602(状態:デムパ):02/03/13 14:06
Σ( ̄□ ̄;)
ごめんなさいちょっと間違いました(- -;)
忘れてください。

こちらを教えて頂きたいです
pを構造体ポインタだとして
*p++->str;
のような式文は
strが指しているオブジェクトを参照し、pをインクリメントする
とありますが
->は左辺値付きのpと結びつくのか、p++が返したインクリメント前のpの
値と結びつくのか、どちらなのでしょうか?
605602:02/03/13 14:09
とありますが

とK&Rにありますが
*p++->str;
*p->str; p++;ってこった。
演算子の順位表をみろ。
607デフォルトの名無しさん :02/03/13 14:17
 ポインタについて質問です。
ポイントは、、「変数のアドレスを記憶する変数」と某サイトの説明が
ありました。 意味はよくわかります。
 どういうときに便利なんでしょうか? プログラム例を見たりしてますが
難解に見えるだけなんですが・・
608602:02/03/13 14:21
ΣΣ( ̄□ ̄|||)
もうだめだ・・・徹夜してたからかな・・・(-_-_-)
>>602
0012FF84 0012FF840
とあるので、あれ?アドレス違うのか?と思って
604で忘れてくださいなどと言ってしまいました<(_ _)>スイマセン
プログラムをコンパイルするとき
char a[5];
printf("%p %p",a.&a);
*a = 0;
printf("%d");
とやっちまって変な結果をコピペしてしまいました。
そんな俺にレスしてくれてありがとうございます。603様
色々と違うのですね、了解しました!
609デフォルトの名無しさん:02/03/13 14:26
>>607 ここはCスレだから参照と比べてどうかってことではないよな…?
>どういうときに便利
そういう台詞は代替手段があるときに口にするべき。
ポインタでしかできないことがCでは厳然として存在する
ことを踏まえれば、そんな言葉は出てこない。
611607:02/03/13 14:40
>>610
ありがとうございました。
おれ逝ってよし!
612デフォルトの名無しさん:02/03/13 14:41
>ポインタでしかできないことがCでは厳然として存在する
まぁたしかにそうなんだけど具体例を挙げないとわかんないだろうから。

たとえばCでは関数の引数として配列そのものを渡すことができないのでポインタを渡して
必要に応じて実体を参照する。文字列もcharの配列でしかないのでこれと同じ。

あとはCでは関数の引数は値渡しでコピーが行われるのででかい構造体の実体を引数にしちゃうと
遅くなっちゃうとか。

まぁ必ず例として出される二つの引数の値を入れ替えるswap関数がわかりやすいでしょ。
Cの入門書には必ずでてるからそのくらいは自分で調べて。
613607:02/03/13 15:17
>>612 
ありがとうございました。
もひとつ質問です。

char a[4] = "xyz";
char *p;

p = a;

 「 p=a; 」の「 a 」は、アドレスになるのでしょうか?
「 p=a; 」 と 「 p=&a[0]; 」 では、全く同じ意味になるのでしょうか?
614デフォルトの名無しさん:02/03/13 15:39
>613
ポインタ=アドレスではない。ポインタとはあくまでもオブジェクトを指すものであって
メモリ上のアドレスと決まっているわけではない。*pと書くとpが指しているものを取り出せることが
保証されているというだけの話。実際Cはアドレスとそのオブジェクトのサイズをコンパイラが覚えることで
ポインタという機能を実装している。一応これが前提。

基本的に式の中で配列名だけを書くとその配列の先頭の要素のポインタに読み替えられる。
ただし例外があって&, sizeofのオペランドになるときは配列全体の意味になる。
もういっこ例外があったと思うのだが思い出せない。

よってp = a; と p = &a[0]; は同じ意味。

それと質問に直接関係ないが
char a[4] = "xyz";

char a[] = "xyz";
と書くのがふつう。
615613:02/03/13 16:51
>>614
ご丁寧にありがとうございます。
ポインタの解説をもう一度よく読んでみます。
オブジェクトの意味がわからないので、逝ってきます。
616デフォルトの名無しさん :02/03/13 17:31
1. char  *p = "ABC";

2. char  *p;
    p = "ABC";

 1と、2は同じ意味らしいです。
http://www.ht-net21.ne.jp/~sgwr-t/sec10-3.htm (上から7行目くらい)

 1は解るのですが、2が「 *p = p 」になると
思うのですが。
 ポインタって、1日で理解するのは無理ですか?

 
>>613
char* pSrcMax = pSrc + iLength;
while( pSrc < pSrcMax )
{
*pDst ++ = *pSrc ++;
}
とかできて便利♪
>>616
どっちも、 *pはchar型のポインタだよって定義して
そこに"ABC"の文字列(これはどっかに確保される)
へのポインタ(この際アドレスでもいいや)を代入してる。
>>616
char *p = "ABC";
は、
char *p;
と、
*p = "ABC"
という意味ではない。
620デフォルトの名無しさん :02/03/13 17:55
>>618-619
 ありがとうございます。

>>619 
 どうしてですか?矛盾してるような気がするのですが。^-^;
すみませんが、もう少し詳しくお願いします。m(__)m

あー俺も昔同じことで悩んだ覚えがある...

char *p = "ABC";

char *p;
p = "ABC";
ですね。確かに最初は変に思えるかもしれないがとにかくそういうことになっ
ている。
622620:02/03/13 18:05
>>621
 ありがとうございます。
これって理由があるのでしょうか?
気持ち悪いのですが・・。^-^;
623デフォルトの名無しさん:02/03/13 18:10
こう考えては?
char* p = "ABC";
char* p = "ABC";

char* p;
p = "ABC";
って考えて納得するんじゃダメ?
被った・・・
626622:02/03/13 18:22
>>623-624
その考えだと、解ります。
これで先に進めそうです。 ありがとうございました。


前スレに
int *p;
int* p;
のどっち使うかで盛り上がってたな。
とか蒸し返したら怒られるかな?(w
int* p1,p2;

こんなんしちゃったり
629デフォルトの名無しさん:02/03/13 18:33
>616
C言語では文字列はcharの配列として扱われる。文字列リテラルでも同じこと。
また式の中では配列はその先頭要素のへのポインタに読みかえられる。
よって2は「*p = p」ではない。
char str[] = "ABC";
char *p;
p = str
と本質的には同じ。というかそういう意味では1も同じだけど。

char *p; というのはあくまでもcharを指すポインタ型の「変数p」の宣言
だということを誤解してない?

ただし1と2は同じではない。1はポインタpを"ABC"で初期化しているが
2はゴミの値で初期化して代入している。初期化と代入は区別する必要がある。
リンク先の説明ではpが"ABC"を指すという意味で同じと説明しているような気がするが
誤解を招きそうだ。
630デフォルトの名無しさん:02/03/13 18:50
なんか書いてる間にいっぱい書き込みがあるし。

>618
>どっちも、 *pはchar型のポインタだよって定義して
これは間違い。変数はあくまでもp

>626
623,624でわかったと言っているようではたぶんわかっていない。"ABC"はcharの
配列で式の中ではその先頭要素のポインタに読みかえられるということが大事。

>620
初期化というのはそのオブジェクトが作られるときに行われるという点が違う。たとえば
void func(void){
static int x = 0;
int y;
y = 0;
  printf("x = %d ; y = %d\n", x++, y++);
}
というような場合xはプログラムが実行されるときはじめに確保されて0に「初期化」
されるがyはfuncが呼ばれるたびに確保されその後0が代入される。初期化と代入は
区別しなくてはならない。
631630:02/03/13 18:57
いかん上の説明はどっちかというと静的変数と自動変数の違いという感じで
初期化と代入の区別という感じはしないね。うまいサンプルを思いつかない。

618の補足
char *p;
はcharを指すポインタ型の「変数p」の宣言であって
char型の「変数*p」の宣言ではありません。
>>631
const char *mona = "omaemona";
/*
const char *giko;
giko = "itteyosi";
*/
これはどーよ。今回の件とはあんまり関係ないけど。
633616:02/03/13 19:37
>>629-631
 ご丁寧にありがとうございました。m(___)m
何度か繰り替えし読んだのですが、混乱してます。

 おもっっ〜きりかみ砕いた、たとえ話で説明
できますでしょうか?
 例えば、1001号室にいる、ABCという名前の
猫の話とか・・。 

 ポインタというモノが雲のような存在なんです。
634デフォルトの名無しさん:02/03/13 19:46
int *p; int* p;
この二つは書き方が違うだけ?
>>633 (616)
多少間違ってることを承知で説明する。

Cでは、文字列は、次のようにあらわされる。
1000番地にAという文字
1001番地にBという文字
1002番地にCという文字
1003番地に終端文字

ここで、 char *p = "ABC";
とやった場合、pは1000番地を指す。つまり、ABCという文字列の
開始点を指すことになる。

char *p; // <- 1
p = "ABC" // <- 2
とやった場合、1の部分では p は何処を指すかは決まっていない。
2の部分で、p に "ABC"という文字列の先頭の番地が代入される。

宣言と代入は、「構文が違う」ということは覚える必要がある。
636635:02/03/13 20:23
>>635
宣言、というよりも初期化だな。スマン。

>>634
yes。書き方が違うだけ。
>>633
じゃぁ、俺の理解で教えてあげよう。
まず、宣言時の
int *p;
の「*」と、参照時の
i = *p;
の「*」の意味は別物です。これ重要。

あと、アドレスという言葉とポインタという言葉を明確に区別しましょう。
(これにはいろいろ議論があると思うけど、とりあえずゆるして>みんな)
ポインタは「アドレスを格納するための変数(by K&R)」ですので、
「アドレスを代入できないもの」はポインタではなく、ただのアドレスの参照です。

◎char *a; a=(char *)0x0000;
×char a[30]; a=(char *)0x0000;

前者のaはアドレス(この場合0x0000)が代入できるのでポインタですが、
後者のaはアドレスを代入できない(参照しかできない)ので、ポインタではありません。
コンパイルしてみれば、後者はエラーが出てコンパイルできない
ことが分かります。
638sage:02/03/13 20:31
宣言は使うときと同じように書く。
初期化は宣言中の変数に対して行われる。

コンパイラが
int *p;
をみつけたとき、
pに参照演算子*を適用するとintになるんですな。
と解釈する。つまりはint型へのポインタへ変数だ。

int *p = a;


pに参照演算子*を適用するとintになるんですな。
ついでにpにaを入れて初期化するんですな。
と解釈する。

int *p = "ABC";
は、
pに参照演算子*を適用するとintになるんですな。
さらに静的領域に4バイトのメモリを予約して、そこにAとBとCと\0というコードを入れて置くんですな。
ついでにpにその連続したメモリの先頭アドレスを入れて初期化するんですな。
と解釈する。

宣言は使うときと同じように書く。
初期化は、宣言中の変数に対して行う。

覚えておけ。
>覚えておけ。
まちがった説明なのに、やけにエラそうですな。
640633:02/03/13 20:56
>>635-639
ありがとうございました。
まだ読んでませんが・・。 カンシャ!^-^)/"
641629:02/03/13 21:24
混乱を招く例を出してしまったので補足する。
文字列リテラル("ABC"こうゆうやつね)は文字の配列と本質的に同じであり式の中では
その先頭要素を指すポインタに読み替えられる。
ただし「char配列の初期化」の場合は例外

char str[] = "ABC"; /* char str[] = {'A', 'B', 'C', '\0'}; と同意 */

従って
char str[4] = "ABC";
はよいが
char str[4];
str[4] = "ABC"; /* !!エラー!! */
期せずして代入と宣言というか初期化の処理は別物として処理されている例になってしまった。

このことを説明せずに
char str[] = "ABC"; /* この部分がね・・・・。 */
char *p;
p = str;
の例を出したのは混乱を招くものでしかなかった。

635の説明は大筋では間違っていない。
試しに
int main(void){
printf("%p\n", "ABC");
return 0;
}
ってしてみたら実感できると思う。

ちなみに638はネタなのでそのつもりで(だよね>638)。638読んでつっこめたり笑えるようになれば
理解できたと思っていいでしょう。
642デフォルトの名無しさん:02/03/13 22:08
1 << i
これはどういう意味なんでしょうか?
1を左にiビットシフトする。
644デフォルトの名無しさん:02/03/13 22:15
すんません。

a = 3;
b = a++ * a++;

のときbがいくつになるかは未定義なのは
有名なのですが、そうすると、

b = ++a * ++a;

の場合も同じく未定義と考えていいのでしょうか。
1にiを流し込む
*で繋いだ場合も同様、未定義だ。
未定義なんで、実行したとたんOSがハングしてPCから煙がでてきたとしても仕方ない。
>>643
どもです。
http://pinktower.com/www.ne.jp/asahi/gravure/com/096/001.jpg
つまらないものですがどうぞ。37まであります。
648644:02/03/13 22:20
>>646
すいません。「*」でつないでるのは上も下も
同じなんです。インクリメント演算子が前置と後置で
変わるものなのか?と思ったんです。
 b
 =
 +
 +
 a++
 *
++a
 +
 +
よく見たら上も*か。
*ではまだ式の評価は完了しないから、
前置だろうが後置だろうが、未定義の動作になるよ。

C FAQ嫁。
651644:02/03/13 22:25
>>650
ありがとうございました。
やっぱり副作用完了点までに複数副作用があるから
そうなるんですよね。
main(){
 int a=4,b=2,*A,*B;
 A=&a; B=&b;
 printf("%d \n", *A/*B );
}
653デフォルトの名無しさん:02/03/13 22:53
>635
を具体的にコーディングしてみたのでコンパイルして実行してみそ。

#include <stdio.h>
int main(void){
    char *p = "ABC";
    for (; *p != '\0'; p++)
        printf("[%p] => [%c]\n", p, *p);
    return 0;
}

ちなみに私の環境だと

[0040A128] => [A]
[0040A129] => [B]
[0040A12A] => [C]

こんな感じだ。左側に各文字のアドレスが入っている。
>>652
Borland C++ 5.5 for Win32 Copyright (c) 1993, 2000 Borland
hoge.c:
エラー E2186 hoge.c 7: 4 行目で始まったコメントの途中でファイルが終わっている(関数 main )
エラー E2121 hoge.c 4: 関数呼び出しに ) がない(関数 main )
エラー E2134 hoge.c 4: 複合文に } がない(関数 main )
警告 W8070 hoge.c 4: 関数は値を返すべき(関数 main )
警告 W8004 hoge.c 4: 'B' に代入した値は使われていない(関数 main )
警告 W8004 hoge.c 4: 'A' に代入した値は使われていない(関数 main )
*** 3 errors in Compile ***
>>652
VC++6.0
test.c(8) : fatal error C1071: コメントをスキャン中に予期せぬ EOF が検出されました。
656デフォルトの名無しさん:02/03/13 23:00
printf("%d \n", *A/*B );
これを
printf("%d \n", *A / *B);
にしろ。
っていうかすこしは自分で補完するように。

え?おれはてっきりこういう意外なところで
コメント扱いされるエラーが出るよって教えて
くれてるのかと思ってたよ。
>>656
( ゚Д゚)ホカーン

(゚∀゚)ネタニマジレス? クスクス
*A**B とかも微妙な線だよね
#include <stdio.h>
void main(){
  int data1 = 0, data2 = 0, data3 = 0;
  ++data3 += data1++ + ++data2;
  printf("%d\n", data1);
  printf("%d\n", data2);
  printf("%d\n", data3);
}

1
1
2
660は何を言いたいのか?
662656:02/03/13 23:30
>658
(゚∀゚)ネタニマジレス? クスクス

だよね。自分が恥ずかしい。
やはりみんな最初はポインタの壁にぶち当たるのですね
そういう自分もつい先日n重のポインタを理解したばかりですが…


◆おすすめスレッド◆
トリッキーなコード
http://pc.2ch.net/test/read.cgi/tech/983191866/
ごめんオレマジでそのカベにぶち当たったこと無い。
665デフォルトの名無しさん:02/03/13 23:58
アセンブラ修得してからC始めた人なら、ポインタはあまり障害にならないね。
ポインタの表記の仕方と、ポインタの型に慣れるのにちょっとかかったけど。
++data3じゃ左辺値が(略)
アセンブラに手をつける前は、たしかに、お前らみたいな楽しい疑問や
勘違いコードを書いてたもんだなあ。
そういや最近はアセンブラやベーシックやCをすっ飛ばして
別の言語を習得する人が増えてきたんだよね。
669653:02/03/14 00:06
配列とポインタの交換性が理解できればそんなに難しく無い。
p[i]というのは*(p + i)のシンタックスシュガーということがわかれば同じ動きをする
コードを配列とポインタで書いてみれば理解できると思う。

文字列リテラルも実際は先頭のポインタをもっていてそれを渡すと'\0'までを文字列とする
とわかれば混乱しないだろう。

653の配列版(ちなみに653はコピペすると全角スペースのせいでそのままじゃコンパイルが通らない)
#include <stdio.h>
int main(void){
char *p = "ABC";
int i;
for (i = 0; p[i] != '\0'; i++)
printf("[%p] => [%c]\n", &p[i], p[i]);
return 0;
}
>>666
だね。言われてコンパイルしてみたけど、やっぱり通らなかった。
671633:02/03/14 00:08
>>653
わざわざ、ありがとうございます。
よくわかりました。

・「 p 」はポインタであり、アドレス。
・「 *p 」は、char型の文字。

 に見えますが、このすれの>>614
>ポインタ=アドレスではない。
と書いていました。

 ネタレスは、>>638だけですよね?
ポインタは、「アドレスを格納するための変数」(>>647より)
ということは、アドレスを格納するための変数とは、>>653
プログラムでは、どこを指してるのですか?

 アドレス[0040A128] にある文字[A]があると、ポインタ
はいくらになるのですか? マヅで混乱してます。
よろしくお願いしますm(__)m
>>638はネタだが嘘は書いてないぞ。
コンパイラの内部動作がわかるやつ、少ないのか?
ポインタぐらいわからないんじゃあ
テンプレート尽くしのC++ソースなんか読めない(略)
汗とセットで覚える方が気苦労が少ないと思うのだが・・
汗をかける必要はないから読める程度に勉強するのがいい。
そうすればポインタごとき665が言ってるみたいに表記の仕方
だけ覚えればいいんだけどなー。
Cはやっぱり高級アセンブラ的な側面が大きいからねぇ。
実務に追われてるならともかく、これから学ぼうって人なら
アセンブラは修得しておいて損は無いYO!
>>671
pの値は0040A128。
*pの値は'A'。
OK?
あたまわりーな
> に見えますが、このすれの>>614
>>ポインタ=アドレスではない。
>と書いていました
例えば32bitマシンでintは4バイトだろ、その属性と先頭アドレスを含めてポインタ
だから、イコールじゃないって書いてあるじゃん、ちゃんと読めよ。
>・「 p 」はポインタであり、アドレス。
>・「 *p 」は、char型の文字。
どっちもはずれじゃ、ボケェ
> アドレス[0040A128] にある文字[A]があると、ポインタ
>はいくらになるのですか? マヅで混乱してます。
なんでだよ、そのままじゃん。
「ポインタはいくら」って、日本語になってねーぞ
ポインタの値を聞いてるなら、[0040A128]
678デフォルトの名無しさん:02/03/14 00:27
>>638はネタだが嘘は書いてないぞ。
671が本気にして混乱するじゃないか。

>pに参照演算子*を適用するとintになるんですな。
*は参照演算子ではなく間接演算子もしくは逆参照演算子

>int *p = "ABC";
はintをさすポインタをcharへのポインタで初期化しているから最近のコンパイラは
警告を出すだろう。

>宣言は使うときと同じように書く。
というのは確かにそうだけど嘘じゃないというにはちょっと、、、。
679678:02/03/14 00:29
>671が本気にして混乱するじゃないか。
そうでなくても混乱してるけど、、、、、。

それだけに一部が間違っている文章は毒にしかならない。
680結論:02/03/14 00:33
>>671にはCは無理。
工房が何やら喚いてます。
人に適切に説明できないというのは、
自分でも深く理解できない証拠です。
ほんとだint *p age
ちなみにコンパイラは右から解釈していく。これは正しい。
(char *)age;
685デフォルトの名無しさん:02/03/14 00:36
>コンパイラが
>int *p;
>をみつけたとき、
>pに参照演算子*を適用するとintになるんですな。
>と解釈する。つまりはint型へのポインタへ変数だ。

ここらへんは禿同。
686633:02/03/14 00:45
>>672-684
 ありがとうございました。
アセンブラも勉強します。

>>677
 
>>・「 p 」はポインタであり、アドレス。
>>・「 *p 」は、char型の文字。
>どっちもはずれじゃ、ボケェ
 正解は何ですか?

 どこかのサイトにポインタは簡単って書いてましたけど
頭悪い人には難しいんですね・・(汗
>>669
> 配列とポインタの交換性が理解できればそんなに難しく無い。
互換性? 配列変数を右辺値として評価するとポインタに縮退するという
特例があるだけで、あとは全然別物だと思うが。

int n, *p, a[10];

こう定義されていたときに n = *p, n = a[0]; を仮想的なアセンブラコードで
書き出すと、次のような感じでしょ? (C 言語なんで実装の詳細は規格で
は規定されていないけど、一般的な実装の話ね)

n = *p;
// mov r1, addr(p)   ; 変数 p のアドレスを読み出す
// lod r2, [r1]     ; 変数 p の値を読み出す
// lod r3, [r2]     ; 変数 p が指している先に書いてある値を読み出す
// mov r4, addr(n)
// store [r5], r3

n = a[0];
// mov r1, addr(a)  ; 変数 a のアドレスを読み出す
// add r1, 0      ; 変数 a[0] のアドレスに変換する
// lod r2, [r1]    ; 変数 a[0] の値を読み出す
// mov r3, addr(n)
// sto [r3], r2

間接参照の回数が 1 回違う。
mov ウマー!
別物というのは同意するが、その擬似コードはなんか微妙に違うような..
ポインタなんてデバッガでステップ実行しながら
メモリダンプや変数の値チェックしてけばする理解できるよ。
アセンブラ覚えるんならIDEの使い方覚えたほうがまだまし。
汗知らずにCやってる人って、、、
>>687
最適化を行わないコンパイラなら多分そんな感じだろうけど、
最適化を考慮すると、その考え方は危険。

どんな値が入るか解らないポインタに比べ、添え字の範囲にしか
アドレスの変化しない配列の方が、高度に最適化される処理系が有る。
つーか折れの使ってるDSP用のコンパイラは、配列の方が速い。
>>692
ああ、もちろん「配列よりポインタが効率的だ」とか言うつもりは全く無いよ。
ただ別モノだ、と言いたかっただけ。

(配列は左辺値にならんし)
>>689
sto と store が混在してたり? (違
折れがアセンブラ使ってた頃は、Z80 ,6809,8086,68Kだったからなぁ。
今のIA32でアセンブラ入門しろたって、ちと酷か。

なんかいいアセンブラ入門させられる処理系無いかねぇ?
C#のバイトコードの、なんだったか名前忘れたけど(w
それのアセンブラ、今度見てみっかな
>>691
それ俺ですが何か?

だって資料が無いんだよヽ(`Д´)ノ
男らしくGASかpcodeだろ。
>>695
> なんかいいアセンブラ入門させられる処理系無いかねぇ?
シンプルなところで MIPS でしょ。Windows や UNIX で動く、わりと出来の良い
エミュレータ SPIM もあるし、PS2 Linux 買えば gcc + gas で実際の CPU を
使って遊べるし。
386ってそんなに難しいかなぁ。
蒲地さんの本読めばかなり分かると思うけど。
700695:02/03/14 01:08
>>698
MIPSか。折れ勉強した事無いんだよね(藁
でもRISC系やDSPはは命令は簡単だけど、各命令に制限多くない?
MIPSは知らないけど、遅延分岐なんて入門者にゃ敷居高すぎ。

まぁ折れが覚えるんじゃ無いから別にいいんだけど(w
プロテクトモードだけなら簡単だね
702695:02/03/14 01:10
>>699
SSEとか魅力的な機能有って、覚えた気になった直後に目移りしちゃって、
まともに理解出来ない罠。
アセンブラ覚えるにゃ、やっぱチープなチップが良いかと。
いや、特権モードでの説明に特化した
「初めて読む486」とかいい本だと思うけどっていいたかった。
>>700
> でもRISC系やDSPはは命令は簡単だけど、各命令に制限多くない?
むしろ CISC 系の方が、レジスタの用途に制限が多くて面倒だと思うが。
RISC 系だと、汎用レジスタは本当に汎用で、Z80 みたいに

 この命令では、オペランドに IX, IY は使ええない

みたいな制限は無いし。

RISC の場合には、アセンブラでも「機械語コードに一対一対応」じゃなくて、
アセンブラが使うためのレジスタを別途確保してあったりするあたりが、学習
用としてはアレかもしれん。

ま、優秀なやつには、SPIM とヘネシー&パターソンの「コンピュータの構成
と設計」をセットで渡しておけ。あれで、背景を含めて必要な知識が押さえら
れる。
CASLは?
706695:02/03/14 01:34
>>705
CASLはアクビが出る位簡単。あくまで試験用のアセンブラだしね。
情報処理試験で、事前勉強ゼロで、巻末のアセンブラ仕様読みながら回答したけど、それで通った位だし。
とは言え、Z80と8086のアセンブラの経験は有ったけど。
それも15年前の事だが・・・

でも確かにアレは簡単だけど、学習へのモチベーションは維持できないと思われ。
自分で持ってるPCとか、PS2とかなら学習意欲も涌くだろうけど。

まぁアセンブラは、学生のウチに勉強しときなさいってこった。
707637:02/03/14 01:56
>>686
では私めが。

>・「 p 」はポインタであり、アドレス。
>・「 *p 」は、char型の文字。
・pはポインタであり、アドレスを「格納する変数」です。
・*pは、(ポインタpが指すアドレスに格納されている)char型の
「数値」です。(これは用語の問題。「文字」じゃなくて「文字コード」ならOKです。)

で、ポインタは「アドレス変数」と読み替えると、意味が分かりやすくなります。
つまり、変数というからには、左辺値になりえる(何かを代入できる)必要があります。
判断基準は、ずばりこの「左辺値になりえる=代入できる」という点のみです。
int a,*b,c[10];
と宣言した場合、
「&a」はポインタとは言いません。(&aにはアドレスを代入できません。&a=(int *)0はエラーです)
「b」はポインタです。(bにはアドレスを「代入できます」。b=(int *)0はOKです。)
「c」はポインタとは言いません。(cにはアドレスを代入できません。c=(int *)0はエラーです。)

ちなみに、上記の&a,b,cともに、右辺値として使用した場合(参照した場合)は、
どれも「アドレス」を返します。

ついでに、俺的解釈では、右辺値として現れた場合のみ、上記a,&b,cともに
「〜〜〜”の”アドレス」という代わりに、「〜〜〜”への”ポインタ」と言ってもOKです。
708デフォルトの名無しさん:02/03/14 04:28
たった今から始めたものです。。非常にお馬鹿な質問ですまそ

とりあえずメモ帳で書いてみたのですが、 保存するとき、 .c
と拡張子を付け、すべてのファイルで ってやったのに、
txt形式で保存されてしまいます。 これはいったい全体どうしたら?
709おじさん:02/03/14 04:30
"file-name.c"
だっつってんだろゴルァ
もしかしてみんなWin世代か・・・
710デフォルトの名無しさん:02/03/14 04:37
>>709 むむ?それはどういうことでしょうか。。
       hello.c じゃ駄目なんですか?
ホームラン級の馬鹿ですまそ。
711デフォルトの名無しさん:02/03/14 04:42
たのむ!教えてくだされ
コンパイルして早く寝たい。 とにかく実行させて 寝たい。
っくっつ 目が 目が かすんできやがった..  限界か..?
>>711
その保存したテキストファイルを選択して
「F2」を押してごらん。
C++がわかーるって、ソフトってほんとにわかるのですか?
また、どの程度の内容なんでしょうか?
使ったことのある人、教えてください。
714デフォルトの名無しさん:02/03/14 04:47
>>712 おお神よ..ゴッド!観音様! やってみます!!
アビバ逝け
716デフォルトの名無しさん:02/03/14 04:53
>>712 おお、拡張子 .c に変換できました、
しかし、ファイルが windows のマークになって、アプリケーション
から開かないと駄目な形式に変ったのですが。。
 プロパティをみると、種類が Cファイルとなっているから
このままMS-DOSでコンパイルしてよいのかな?
>>716
いいよ
718デフォルトの名無しさん:02/03/14 04:58
>>716
そういう質問は、まずやってみてから。

まさか、関連付けくらいできるよな・・
720デフォルトの名無しさん:02/03/14 05:02
ちっ ちくしょう!! なんか出来そうな勢いだったんですが、
コマンド打ちこんで、やったら 
”パラメーターが多すぎます”
ってでた。   こいつはいったい。。?
721デフォルトの名無しさん:02/03/14 05:31
>>720
アビバ逝け
722デフォルトの名無しさん:02/03/14 05:34
>>721 こ、このやろう! あんなボッタクリいくかよ
しねよ〜
723デフォルトの名無しさん:02/03/14 07:22
>>720
アビバ逝け
724デフォルトの名無しさん:02/03/14 08:56
電源操作の簡単なプログラムを作ったのですがこれでは全然だめ、といわれましたがどこに問題があるのでしょうか?
電源は落とせますが私にはわからない問題点がやまずみらしいのです
どこがおかしいのでしょうか?
一応コンパイルは通りまして警告も出ません
WindowsXPにVC++6.0でC言語プログラムです
XPの権利関係のところのプログラムは長くなってしまうので今ははずしております
#include "stdafx.h"
#include "windows.h"
#include "stdio.h"
int main(int argc, char* argv[])
{

if(argc == 2)
{
switch(argv[1][0]){
case 'r': ExitWindowsEx(EWX_REBOOT, 0);
break;
case 's': ExitWindowsEx(EWX_SHUTDOWN, 0);
break;
case 'l': ExitWindowsEx(EWX_LOGOFF, 0);
break;
default: printf("引数は\"l\"はログオフ\"r\"はリブート\"s\"はシャットダウン");
}
}
else
printf("test1 arg とコマンド引数を当てる");




return 0;
}
printfで\n表示してないとか
windows.hとかstdio.hが<>でなく""だとか、
それをいえば、stdafx.hなんかいらんやろ、とか
"shutdown r"みたいな使用方法はセンスがないとか
defaultの来たときのメッセージがDQN臭いのが一番気になる。
727630:02/03/14 09:43
>687

>> 配列とポインタの交換性が理解できればそんなに難しく無い。
>互換性? 配列変数を右辺値として評価するとポインタに縮退するという
>特例があるだけで、あとは全然別物だと思うが。

もちろん同じと言っているわけではありません。

ちなみに「交換性」を「互換性」に読みかえていらっしゃいますがこの2つの言葉には「交換性」はないと思います。
//「互換性」もないと思うけど。

式の中ではa[i]は*(a+i)のシンタックスシュガーだと言っているだけです。
int a[20]に対してaが配列aの先頭要素へのポインタに読みかえられるというのはまた別の話。
aはポインタじゃないですからね。

>汗知らずにCやってる人って、、、
まぁでもわざわざアセンブラを覚える必要はないでしょ。わしアセンブラ知らんし。
車を組み立てられなくても車の運転をするのには困らないし。知ってて損はしないだろうけど。
「そろばんを知らなくても電卓は使える」と表現しちゃうとそろばんくらいは知っていた方が
いいよなと思っちゃうけどね。
それならどっちかというと車の中身が分かる方が大切。
>>695
ユーザーモードのアプリに最低限必要な命令だけだったらたいして難しくない。
セグメントを考える必要がないぶん8086より楽なくらいだと思われ
入門なんだからSSEやら何やらは単に無視すればいいだろ。
自分で作ったプログラムを逆汗汁。
たまにすさまじい無駄に気づくぞ。
731デフォルトの名無しさん:02/03/14 10:50
>>730
ああ、禿しく同意だ
でも”無駄を削った”はずのコードが
すさまじい無駄を含んだコードと
大して変わらない実行速度だったりする罠。

ファイルサイズ削りたいんなら有効かも。
半分同意だが、戦場全体を見渡して一番苦戦してるところを見つける目の方がもっと重要だ。
734デフォルトの名無しさん:02/03/14 12:48
ご希望通りにたとえ話にしましょう。

将棋盤や碁盤のようなマス目がある板を考えます。各マスには番号を振っておきます。
たとえば1001, 1002, 1003, ... , 1100とあったとします。
各マス目にはいろんなものが置いてあります。一つのマス目には収まらなくていくつかの
マス目にまたがっているものもあります。

ポインタは単なるアドレスではなくどれだけの大きさのものを取り出せばよいか知っています。
char *cp; int *ip; double *rp; とあってcp, ip, rp の値がどれも1001になる場合があり得ます。
そういうときでも *cpとすれば1001からものを取り出してくるし *ipとすると1001から1004にあるものを
とってきます。*rpとすれば1001から1008までを取り出します。

いまたまたま*cpの大きさは1、*ipは4、*rpは8というのは状況によって変わるのですが
宣言時にコンパイラの方が調べて覚えておいてくれるのでプログラマは覚える必要はない。
(むしろ意識してはいけない)

ポインタが単なるアドレスではないというのはこういう意味。
>>734
ip = cp = 1001;
で cp++; とすると cp は 1002 になるし
ip++; とすると ip は 1005 になったりとかね。
736742:02/03/14 15:01
前回お答えありがとうございました
printfの\nやincludeの<>などはいわれてみればそのとおり、と思って修正できたのですが

コマンド引数で"-"をつけるにはどうやってプログラムすればよいのでしょうか?
確かにコマンドでは"-"ははいっておりますが自分でやろうとすると反応しません
lとかsとか一文字だけですと問題ないのですが…
やべー俺ポインタ理解しないまま霊感でコーディングしてた。
論理式とかも見た目勝負
>>727
交換性って日本語は、初めて聞いた…

> まぁでもわざわざアセンブラを覚える必要はないでしょ。
俺個人の意見としては、

 アルゴリズムや計算機論理設計、コンパイラ理論、OS などは知らなくても
 最低限の仕事は出来るが、上を目指すなら知っておいた方が良い

かな。周囲を見回しても、そのあたりの基礎知識があるヤツとないヤツを比較
すると、成長の早さがずいぶん違うから。
739デフォルトの名無しさん :02/03/14 16:54
オブジェクトって、簡単に言うとなんですか?
変数などが入ってる箱みたいなものですか?
740デフォルトの名無しさん:02/03/14 16:55
>>736
なにがわからんのだ?

コマンドライン
hoge -a
  ↓
arg[1][0] = '-'
arg[1][1] = 'a'
arg[1][2] = '\0'
>やべー俺ポインタ理解しないまま霊感でコーディングしてた。

ある意味すごい才能だな 藁
742デフォルトの名無しさん:02/03/14 16:57
getopt とかのライブラリがきっとあると思うから
それらを活用するというのも手だね。
743デフォルトの名無しさん:02/03/14 17:00
CでString型もどきを実現するのは大変?
演算子のオーバーロードはこの際無視するとして
744デフォルトの名無しさん:02/03/14 17:02
>交換性って日本語は、初めて聞いた…
国語辞典調べたら乗ってなかった。ということで互換性に訂正します。
#どこで覚えた言葉なんだろう。

>アルゴリズムや計算機論理設計、コンパイラ理論、OS などは知らなくても
>最低限の仕事は出来るが、上を目指すなら知っておいた方が良い

これに関しては全く同感。でもね、734のようにかみ砕いた説明で
(図にかければもっとわかりやすくはなるけど)
わかんない人がアセンブラなら理解できるのか疑問。

結局Cではint *pの値をみると確かにアドレス値が表示されるのでポインタ=アドレスって
勘違いしてわかった気になっちゃうんじゃないかなと。
string *str = new_string("test");
string_replace( str, new_string("t"), new_string("pch"));
...
やってられるか、っちゅうねん。

>>演算子のオーバーロードはこの際無視するとして
Cでオーバーロードなんか無視する以前にできねーだろが。
746デフォルトの名無しさん:02/03/14 17:19
>739
>オブジェクトって、簡単に言うとなんですか?
>変数などが入ってる箱みたいなものですか?

初めのうちはそのくらいの認識でいいと思う。
ただしプリミティブな変数だけじゃなくて配列や、構造体、
関数もオブジェクトだったりするので箱よりももっと抽象的なものだ
ということは頭のどこかにおいておこう。
オブジェクト = 名前付きのメモリ領域

K&R風
>>736 (724)
やれやれ。

#include <stdio.h>
int main(int argc, char *argv[]){
 switch(argc){
  case 2:
   switch(argv[1][0]){
    case '-':
     switch(argv[1][1]){
      case 'r':
       printf("reboot\n");
       break;
      case 's':
       printf("shutdown\n");
       break;
      default:
       goto INVALID;
     
     }
     break;
    default:
     goto INVALID;
   }
  case 1:
   printf("...\n");
   break;
  default:
   goto INVALID;
 }   
 return 0;
INVALID:
 printf("usage\n-r: reboot\n-s:shutdown\n");
 return 1;
}
749デフォルトの名無しさん:02/03/14 18:51
メモリを参照しました。メモリが”written”になることはできませんでした

って出てきます。
どうしたらいいでしょう。
>>749
ポインタ周りのバグだな。頑張ってデバッグしろ。

金があるなら BoundsChecker とか Purify 使う。VC6 なら _CrtSetDbgFlag() で
ヒープのチェックを厳密にすると良いかも。
751デフォルトの名無しさん :02/03/14 19:06
VCに出てくる、ドキュメントや、クラスってどういうもの
なんですか?
Doc-Viewでいうところのドキュメントは、ファイルに保存したりファイルから読み込んだりできる
アプリケーションデータのこと。

クラスっていうのはC++のキーワード。
構造体をもっと便利かつ複雑にしたもの。
753751:02/03/14 19:52
>>752
どうも、ありがとうございました
754700:02/03/14 22:17
>>748
すみません、ありがとうございました
755NEWTON:02/03/14 23:41
newtom法
f(x)=0をもとめられる
プログラムください。
int f(int x)
{
return 0;
}
757NEWTON:02/03/15 00:16
newtom法
(x0,f(x0))の接線の方程式
y=f'(xo)(x-x0)+f(x0)
この接線がx軸と交わるx1は、
x1=x f(x0)/f'(n)
xn+1=x-f(xn)/f'(xn)
|xn+1 - xn|<0.00001
f'(x)はf(x)の微分
f(x)=3x3−5x2+2x−3としたとき
f(x)=0の解をnewtom法
微分f'(x)=9x2-10x+2
プログラムを作ってください。 m(-_-)m
758デフォルトの名無しさん:02/03/15 00:33
>>757
>プログラムを作ってください。 m(-_-)m

そういう姿勢はここでは許されていません。
逝ってよし扱いとなりますので、
誰も答えない事になっています。

叩かれる覚悟はよかですか?
>757
ニュートン先生、日本語に慣れていないのは仕方ないのかもしれませんが、
自身の名前を冠した手法のつづりを間違えているのはどうかと思います。
あと、怜タンが暇そうにしていたので、宿題スレをたずねてあげたら喜ばれますよ。
760デフォルトの名無しさん:02/03/15 00:42
嫌がらせで「C言語以外」でバンバンプログラムを作ってあげるとか(笑
>>760
BASICで作ってみた
762デフォルトの名無しさん:02/03/15 00:59
作れもしないカスが消えな
悔しいかったら作ってみな
>>760
Occamで作ってみた。
MATLABで作ってみた・・・と言いたい所だが、作るまでもなく入っている。
765デフォルトの名無しさん:02/03/15 01:06
C言語で作れもしないカスが消えな
悔しいかったら作ってみな
ちゃんとUPしろよ
だから何処の人だ?<“悔しいかったら”
767デフォルトの名無しさん:02/03/15 01:11
w
768デフォルトの名無しさん:02/03/15 01:12
ABIってどういう意味なんでしょうか?
769デフォルトの名無しさん:02/03/15 01:12
C言語で作れもしないカスが消えな
悔しかったら作ってみな
ちゃんとUPしろよ
770デフォルトの名無しさん:02/03/15 01:13
769
作ってあげたら
ちとーも悔しくないのはどうしてでしょうか?
悲惨な765のいるスレ
ナ○コを馬鹿にするな!
ナオコ?
775デフォルトの名無しさん:02/03/15 01:37
質問したと思ったら逆ギレですか?(笑

こんな簡単な問題だれにでも書けますけどね、
もうだれも書いてくれないでしょう。
ま、自分で苦しみなさい。
ここはHSPスレですか?
>>775
ななこSOS!
MLとかHaskellだとどんなコードになるんだろう?
やっぱりすごくエレガントなコードになるんだろうけど。
アルゴリズム解ってるのにコーディング出来ないなんて
このスレどころか、この板にも来る資格ネェよと言ってみるテスト。
780愚民:02/03/15 01:53
757

マズ−
私もNEWTON法が解けないんですけど教えてください。
781さげ!:02/03/15 01:55
>>757
方程式ってなんだっけ?

トイッテミチャッタリ
>>780
つーか、NEWTON法も何もしらなくても
することは全部問題文に書いてあるわけね。
それなのに出来ないのはただのアフォです。

しかしてアフォな上に失礼なクレクレ君。
783デフォルトの名無しさん :02/03/15 01:58
C言語を勉強するときに便利なソフトって
できーるシリーズの他にあったら教えてください。
784愚民:02/03/15 01:59
NEWTON :02/03/15 00:16
newtom法
(x0,f(x0))の接線の方程式
y=f'(xo)(x-x0)+f(x0)
この接線がx軸と交わるx1は、
x1=x f(x0)/f'(n)
xn+1=x-f(xn)/f'(xn)
|xn+1 - xn|<0.00001
f'(x)はf(x)の微分
f(x)=3x3−5x2+2x−3としたとき
f(x)=0の解をnewtom法
微分f'(x)=9x2-10x+2
ニュートン先生が757 で書いてました。
>>783
そんなあなたにここがおすすめ
http://www.aviva.co.jp/
逝け
757  ←ここに数字を入れる人って少ないよね。>>770とか>>780
>>783
Cコンパイラとデバッガとエディタ。
そしてライブラリのソース。以上。
>>783
>できーるシリーズ
・・・・・
ネタですか?
>>783
プログラミングができる友人
790783:02/03/15 03:08
みなさんありがとう!
>>788
突っ込みありがとう!
気付きませんでした。

×できーるシリーズ
○わかーるシリーズ
プログラミングができるともだち100人できーる(民明書房)\1,200-
「週間プログラミング」創刊!
いまならアヒル本が付いて250円。デアゴスティーニから。
793デフォルトの名無しさん:02/03/15 03:39
sage
794デフォルトの名無しさん:02/03/15 04:03
ひきこもりができるともだち100人できーる(民明消防)\1,200-
>>768
Application Binary Interface

関数の呼び出し規約(引数の渡し方、呼び出し側で保存すべきレジスタ等)や
実行ファイルのヘッダ構造などを規定する。
void get_str(char *p)
{
  p = "hoge";
}

void main(void)
{
  char *p;

  get_str(p);
  printf("%s\n", p);
}

このコードをコンパイルすると
「値が割り当てられていないローカルな変数 'p' に対して参照が行われました。」
と警告を出され、構わず実行すると強制終了するんですが、何が悪いんでしょうか・・・。
つまりあなたは、
void get_value(int i)
{ i=500;}
int main()
{
int i=0;
get_value( i );
return 0;
}
とかやって、mainの i が0のままだ、とか仰るのでせう。
798796:02/03/15 08:09
>>797
それについてはわかっていたつもりだったんですが・・・。
767のmainは
void main(void)
{
  char p;

  get_str(&p);
  printf("%s\n", p);
}
と等価ではないんでしょうか?
799796:02/03/15 08:12
すいません。対象が文字列だってこと忘れてました。
上のは大間違いですね・・・。
>>799
文字列っつーか…。ポインタ変数でもなんでも普通の変数と
変わらんので、他の関数の中で書き換えたいなら

char *p;
get_str(&p);

って形になるように get_str を作らんと。
801デフォルトの名無しさん:02/03/15 08:37
>void main(void)
これを見ただけで頭が拒絶反応を起こす罠
802796:02/03/15 08:41
>>800
get_strにはpのアドレスが渡るのかと思ってました・・・。
おかげで一つ賢くなりました。

void get_str(char **p)
{
  *p = "hoge";
}

としてみたら期待通りに動きました。
ありがとうございました。

>>801
スペース節約の為、 return 0; を省く為にvoidにしました。
普段は一応intを返してます。
803デフォルトの名無しさん:02/03/15 09:16
Cでは関数へはすべて値渡しだから元の引数に書き換えを反映したいときはポインタを
渡して関数の中で実体を参照する。

逆に言えばポインタ渡しをしなければ勝手に書き換えられたりしない。
たぶんコードをみたら納得すると思う。

#include <stdio.h>
void get_str(char **p){
*p = "hoge"; /* ポインタをもらって実体を参照する */
}

int main(void){
char *p;
get_str(&p); /* ポインタを渡たす */
printf("%s\n", p);
return 0;
}
804デフォルトの名無しさん:02/03/15 09:19
自力救済できていたのね。
>>801
実はC99という罠
C99の仕様は何処読めばいいんだろう。
とりあえずこんなの見つけたが、ごっつい量や...
http://www.cl.cam.ac.uk/~mgk25/volatile/ISO-C-FDIS.1999-04.pdf
807デフォルトの名無しさん :02/03/15 12:24
コンストラクタって何ですか?
>807
プログラミング言語Cにコンストラクタはありません。
気にしなくても良いですよ。
>>807
Cにはコンストラクタはない

C++にはある
http://www.bohyoh.com/CandCPP/FAQ/FAQ00084.html
810デフォルトの名無しさん:02/03/15 12:34
constructor n.
建造者,建設者
811807:02/03/15 12:39
ありがと〜
C には文字列型はありません。
文字型もたぶんありません。
>>812

typdef char* string;
string str = "sage";
typdef -> typedef

ごめんなさい。逝って来ます。
>>806
ここはどう? 日本語のページだよ。
ttp://seclan.dll.jp/c99d/c99d00.htm
正確な仕様書ではないけど、従来のCとなにが変わったのか概要を知るにはいいと思う。
816806:02/03/15 13:35
>>815
さんくす
ゆっくり読んでみます。
817806:02/03/15 16:17
やっぱ処理系手に入れて遊んでみないとなぁ
gcc -std=c99 hoge.c でできるらしいけど如何?
gcc-3.x じゃないとだめなのかな?
819806:02/03/15 16:45
cc1.exe: unknown C standard `c99'
とか言われます。
cygwin gcc は 2.95.3-5 ですな。
現在 GCC 3.X 導入画策中っす。
820デフォルトの名無しさん :02/03/15 18:31
CとC++って、どう違うのですか?
おなじだよ
チンコが付いてるかどうかの違いだ
C → /
C++ → つ

おったち度で言うとこう。
まあ例外として、神が降臨すると
C++ → |
という具合。
824熱血初心者:02/03/15 19:06
80字より長い行を全て表示するプログラムは
#include <stdio.h>
#include <string.h>
int main(void)
{
char s[256];
while(gets(s) != NULL)
 if(strlen(s) >= 80)
  puts(s);
return 0;
}
でよいですか?
825デフォルトの名無しさん:02/03/15 19:08
>>824
80字より という以上、80字の行は含まれない。 よって、間違い。
>>820
アビバ逝け!
827熱血初心者:02/03/15 19:23
日本語勉強してきます<(_ _)>
>>824
10000字の行があったらそれで正しく表示できるのかと56時間(略)
829 :02/03/15 21:01
80字より長い行???
>>824
macのテキストファイル食わせると死ぬ罠。
>>757
もう要らないのかもしれないけど、とりあえず見つけたので。ほい。
http://www.arai.pe.u-tokyo.ac.jp/~arai/lectu/optim-j.html
でも、連立ニュートン法って書いてあるので、別物かな?

こっちのうほうがいいかも。
http://www.cs.reitaku-u.ac.jp/~ykago/semi/semi1-3.html
>>831
バカを甘やかさないように

スレに定住されたら困るので。
833デフォルトの名無しさん:02/03/15 22:24
>>813
const string str = "sage";
としてハマるの罠。
次のうち、コンパイルできないのはどっち?
str = "age";
*str = ' ';
834831:02/03/15 22:28
>>832
まぁまぁそう言わず、Excelも捨てたもんじゃないっていうことで。
どんなコンパイラがある?それとどんなの使ってる?
836デフォルトの名無しさん:02/03/16 01:41
void ( *signal( int sig, void (__cdecl *func) ( int sig [, int subcode ] )) ) ( int sig );

この宣言の読みかたが分かりません。
”signalは第一引数にint sigをとって、...
ここから先を教えてください。お願いします。

>>836
ばらしとけ
typedef void (*functype)(int sig);
functype signal(int sig,functype func);
838sage:02/03/16 01:45
singalは引数に int sigと int sig, int subcode(subcodeは任意)を引数に取るvoidを返す関数のポインタを
とり、 int sigを引数に取る void型関数へのポインタを戻り値として返す。
839デフォルトの名無しさん:02/03/16 01:48
837さん838さんありがうございました。
よくわかりますた。
char *hoge;

と宣言したのを

realloc(hoge,strlen(hoge) + i + 1);
/* iはunsigned intの適当な値 */

って使い方はよくないですか?えっと、つまりhogeのメモリ領域を
再確保する際に、strlen(hoge)って使うのがよくないのかな
と思いまして。それとも

n = strlen(hoge) + i;
realloc(hoge, i + 1);

とかのが良いですか?
>>840
関数へ渡される引数は、関数呼び出しに先立ってすべて評価されてから
渡されます。なので、>>840の場合どっちも同じです。
>>841

わかりました。ありがとうございます。
1)
realloc(hoge,strlen(hoge) + i + 1);

2)
new_strlen = strlen(hoge) + i;
realloc(hoge, new_strlen);

確かにどっちも同じだしこの程度ならあまり変わらないけど、
どっちが見やすいかと言えば後者だと思う。

>hogeのメモリ領域を
>再確保する際に、strlen(hoge)って使うのがよくないのかな

と迷う時点であまり好ましくないなと思う。
そういうことが積み重なっていくとコード全体が読みづらくなる。

しかしもちろん一時変数が増えることによってコードが読みづらくなったりもするので
これはケースバイケースであることは言うまでもない。ただし一時変数だらけになるのは
その時点で関数の機能の切り分けに問題があると思われる。

基本的には2をおすすめする。
間違って下げちゃったよ。

単発すれとかネタスレが多いので上げとく
間違えた。
new_strlen = strlen(hoge) + i;

new_strlen = strlen(hoge) + i + 1;
だね。
846840:02/03/16 18:23
さっきの内容のあるプログラムですが、今こんなの作ってます。

key_stringに含まれるlookforをreplaceに置換するというプログラム
です。実はまだよくポインタとかわかってない厨房なんですが、参考書や
WEBにあるサンプルを参考にしながら作ってみました。

void ReplaceTag(char *key_string, const char *lookfor, const char *replace)
{
char *reference_string, *sub_string;
int key_len, replace_len, hit_to_top, temp_len = 0;


sub_string[0] = '\0';
key_len = strlen(key_string);
replace_len = strlen(replace);

while(1) {
//lookforがある位置を検索
reference_string = strstr(key_string, lookfor);
if (reference_string == NULL ) {
realloc(sub_string, strlen(sub_string) + strlen(key_string) + 1);
strcat(sub_string, key_string);
break;
}
//lookforの1つ前までの長さを取得
hit_to_top = key_len - strlen(reference_string) - temp_len;
//メモリの再割り当て
realloc(sub_string, hit_to_top + strlen(sub_string) + 1);
//lookforが見つかった場所の1つ前までをコピー
strncat(sub_string, key_string, hit_to_top);
strcat(sub_string, replace);
reference_string ++;
key_string += hit_to_top;
temp_len = (hit_to_top + 1);
}

key_string = malloc(strlen(sub_string) + 1);
strcpy(key_string, sub_string);

free(sub_string);
}

コンパイルは通るのですが、実行時にエラーになります。ドコで
コケてるのかすらわかりません。もう3日ほど費やしたのですが。
どうかご教授ください。
これくらいなら 1の方が見やすいと思うけどなぁ。
>>846
reallocの結果のアドレス受け取ってないじゃん
reallocは、その結果アドレスが変化することを考慮して使うものだよ。
849デフォルトの名無しさん:02/03/16 18:32
gdbの使い方を解説しているページを教えてください。
よろしくお願いします。
>>846
replace ってシンボルが関数じゃなくて変数なあたり、激しく読みにくい…。
(ふつー動詞は関数、名詞は変数っつー気が)

問題点多数たが、とりあえず
> sub_string[0] = '\0';
これでダメだろ。最初の時点では sub_string は有効なメモリ領域を指して
いない。
851840:02/03/16 18:35
>>848
sub_string = realloc(sub_string, hit_to_top + strlen(sub_string) + 1);

なんですね。お手数おかけしました。
>>849
info gdb では不満か? 使い方で悩むなら xxgdb とか ddd, Emacs の
gdb-mode のような

 対話的に使用できるインターフェース

をかぶせて使うのも手だと思うが。
853デフォルトの名無しさん:02/03/16 19:03
854デフォルトの名無しさん:02/03/16 19:03
ありがとうございました。
独習Cの最初のプログラムとK&Rの最初のプログラムって
形がほぼ同じで「return 0;」だけが違うのですよネ?
これって特に覚えておく必要あります?
・・・って頭には既に刻み込まれていますが(^^;
857デフォルトの名無しさん :02/03/16 23:57
| (or) ,^ (xor) , ~(補数)の記号ってなんて読むのですか?
「;」をセミコロンと読むように。 一応ネタではないです。
858デフォルトの名無しさん:02/03/17 00:03
漏れは|(パイプ)^(やま)~(チルダ)とよんでいるが
パイプ カレット にょろ
パイプカット…
折れは、文脈に従って、or、xor、notと呼ぶけど。
~は、URLに有る時はチルダだな。

HTMLのキャラクタセットの説明書いておくと、
| Vertical bar
^ Caret
~ Tilde
862デフォルトの名無しさん:02/03/17 00:16
>846
とりあえず仕様としてはたとえば文字列 key_str = "hogehogeabcdef", lookfor = "abc",
replace = "xyzzy"があってReplaceTag(key_str, lookfor, replace)ってやると
key_str = "hogehogexyzzxdef"っていう感じでいい?

問題点はたくさんあって第一にはvoidで関数の中でkey_stringを書き換えてもとの文字列を
変更したいんだよね。それなら
void ReplaceTag(char **key_string, const char *lookfor, const char *replace)
という風に宣言して呼び出し側ではReplaceTag(&key_str, lookfor, replace)という感じで呼び出さないと
いけない。

それから悪いけど関数の中身が何やってるのかよくわからない。
「key_stringに含まれるlookforをreplaceに置換するというプログラム」
というのならまず
char *destというポインタを用意
置換した後の文字列の長さを求める。
その文字列分mallocでdestの領域を確保。
lookforの先頭までkey_stringをdestにコピー
replaceをdestにコピー
lookforのあとから最後までkey_stringをdestにコピー
destをkey_stringに渡す。

という感じがいいんじゃないかと思う。


863デフォルトの名無しさん:02/03/17 00:40
シンボルってなんでしょうか?
シンボルってアドレスですか?
それともアドレス以外にシンボルとしてテキストに占有しているのでしょうか?
またstripコマンドでシンボルが取り除けるとはどういうことでしょうか?
お願いします。
チンコ
865857:02/03/17 01:23
| (or) ,^ (xor) , ~(補数)の記号の読み方を教えて頂き
ありがとうございました。
866デフォルトの名無しさん :02/03/17 01:34
参考本や、サイトで「バイト幅は処理系により異なり・・・」
の「処理系」は、具体的にどのようなことを指してるのですか?
>>866
コンパイラ。OS。ハードウェア構成、等々言い出せば際限無い。
多くの場合「違うぞゴルァ」という指摘をあらかじめ防ぐためのもの。
868デフォルトの名無しさん:02/03/17 01:41
>866
処理系 = コンパイラと思っておいていい。
一般的に処理系と言えば >>867だが、
このスレの中で処理系と出た場合は>>868
870866:02/03/17 02:01
>>866です。
皆さん、わかりやすい説明ありがとうございました。
>>863
ふつー、コンパイルすると機械語コードに変換されるんだけど、
デバッグのため、関数名とか変数名とかの名前を一緒に記録
しておくと、デバッグ中にわけわからんアドレスを「これ、どの
変数に対応しとるんじゃ!?」と悩まなくてすむ。
で、この関数名とか変数名とかその他文字列がシンボルだね。

で、シンボルを実行ファイルに埋めこむと、上記の利点の反面、
サイズがでかくなるので、もうデバッグしなーいってときは、
シンボルテーブルを削っちゃってもいいわけだ。これをやって
くれるのがstrip。
>>871
デバッグ以外にも、リンク時には必要になるよね。

オブジェクトファイルやライブラリを strip すると不幸になるので、気をつけ
ましょう。あと kernel も strip できるけど、やるといくつかコマンドが正常に
動かなくなる。(でもルータとして使う程度なら、動作に支障はない)
873初心者:02/03/17 07:21
2chもしっかりしたところで質問すると皆さんにしっかりお答えしていただけるのでよいですね
しかもほとんど時間差なしというのがよいです
余計に自分で調べられるところは調べて本当にわからないところだけきけばよいので自分で調べる癖もついてよいです

なんて、最近こういうところを見ていて思った大きな独り言でした
863です。
とても解かり易い解説をありがとうございました。
本当に勉強になります。
875デフォルトの名無しさん:02/03/17 11:45
win32apiを使ってWindowsprogrammingをC/C++でしている時に
HANDLE型が出てきますがHANDLE方とはいったい何なのでしょうか?
VC++6をつかってます

また
ピアソンエデュケーション社から出ているwin32システムサービスプログラミングという書籍について皆さんどう思われますでしょうか?
ああ言う書籍は結構MSDNヘルプに載っていることを書籍課したような気がするのですがプロの方々はどう思いますか?

よろしくお願いいたします
HANDLE型って、あれでしょ。FILE*とおんなじような。
実体はvoid*だけど。不完全型のポインタとおんなじで
「Windowsである俺様には重要やけど、おまいら一般
プログラマは、内容を参照しようとすんなよ、バカチンが」
っていうような感じ。そういうオブジェクトを格納・参照する型が
HANDLEなわけよ。UNIXソケトハンドルがintなのとそう変わらない。

ああ、そうそう。「スレ違い」だよ。
>>875
typedef (void *) HANDLE;
878デフォルトの名無しさん:02/03/17 12:10
>2chもしっかりしたところで質問すると皆さんにしっかりお答えしていただけるのでよいですね

そう思っていると自分の質問は無視されるという罠。
そうじゃなければネタレスばかりつくという罠。
せっかく教えてもらっても実は間違いという罠。

鵜呑みにしてはいけません。自分で調べようという人ならば2chより先に
自分のもってる本の索引を引く、サーチエンジンにキーワードを放り込む、
その先で解決に結びつきそうな糸口をさがす。そういうことをするひとなら
要領をえた質問ができるだろうからちゃんとした答えが期待できるでしょう。

879デフォルトの名無しさん:02/03/17 12:16
>>877
結局typedefしているだけなんだ
>>879
yes ヘッダ見れ。winnt.hにいた。正確には
>typedef void *HANDLE;
だったが。
881デフォルトの名無しさん:02/03/17 12:41
というか、xor ってそもそもどう読んでるよ。

えっくすおあ で済ましてるのは軟弱ですか?
>>881
えっくすおあです。えくすくれっしヴおあなんて長ったらしい。
横から割り込みでごめんなさい
>>880
本とだ
winnt.hにいた
初めて知った

でもvoid* は何なのですか?
型のないポインタとは?
(戻り値のないポインタ?)
ポインタにしまっておくだけということなのでしょうか?
それともHANDLEはWINの中でしか関係ないというようなのでWINが隠してしまうからHANDLE型とか?

ちょい日本語変ですが。。。
884デフォルトの名無しさん:02/03/17 13:34
>>875
本の話はこっちかな。

推薦図書/必読書のためのスレッド PART2
http://pc.2ch.net/test/read.cgi/tech/1010312992/l50

「スレッド一覧はこちら」ってとこみるとあがってないスレッドも見れるから。
今度から質問する前に先ず自分で探しとけ。
885デフォルトの名無しさん:02/03/17 14:00
> void*
汎用のポインタ。
どんな型のポインタもに代入できる便利だけど節操が無いポインタ。
886sage:02/03/17 14:15
>>883
本当はね、意味のある構造体へのポインタだったり、
意味のある構造体を指すポインタへのポインタだったりするんだけど、

ユーザプログラムに中を見られたり、中を書き換えられたりされたら困るから
(CPUの保護機能を使って元々見たり書いたりできないようになってるけどね)
意味のない汎用ポインタ void * にキャストしてるんだよ。
887デフォルトの名無しさん:02/03/17 14:54
ローダーの仕事について質問させていただきます。

ELF形式の実行ファイルhogeがあるとします。
この時
./hoge
とするとプログラムhogeが実行されますが

この時のローダーの仕事は
☆ハードディスク上のオブジェクトhogeを各セグメント(.text, .data, .bss等)に分割しメモリ上に配置する。
#当然ながらオブジェクトhogeがメモリ上にそのまま読み込まれるわけではない。

というので当たっていますか?
これ以外にローダーの重要な仕事というのはあるのでしょうか?

よろしくお願いします。
>>833
もう十分説明は出てるが追記。使うとしたら
| int n = 100;
| void *p = &a;
| printf("%d", *(int *)p);
って感じ。型キャストを外すと許されない型といわれた(BCC)。
./ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 
|  参考になりますね
.\
  . ̄ ̄ ̄∨ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
       _ _  _   __,、--――- 、
    ,、'´/  `´´  `''´ ̄,、―'´ ̄ '´ ̄..`ヽ、_
   // '´  / ,、  ,、    /  '´ ̄`ヽ、 /`l
  / ´ //  // // //     ̄= ,、'´|  )
  |   | | / / /   /  //    ,、'´  | /\
  ,|     | || /   / /   _,、'´ |   /― `l
  |        |    /  ,、--イ   |_,、'´ ̄`ヽ\`l
  | `l  |`l     | |  ,、'´   / _,、'「==    _   `l
  \ /'l   _,、'´ ̄ / ,、-'´ ̄  ‘l__ /,\  |
    `l  ├―'´ /  _,、'´ ̄ / ̄   \__  | /|´ | |
  ,、'´ ̄_/__/--┴'´ ̄   / _       \|| └`l |
  └`┬'| __        / /_`__       \ | |―-
      l   `ヽ-、_ ´ /  < `-´/    l l'ノ/,、|/ `l
      `l  '´__     ヽ ̄ ̄     / | //     `l
         `l / `´/l      `''´    ノ  |/      `l
        |  ̄ ̄/|          / / ̄        `l
        \    /  -、      `l/´            |
          `lヽi/  _,l     /             /、
         /`l |`―´_,-、   ,、-'´            /   ̄`ヽ、
       /   \ \二二=<             /       `ヽ、
      /      \|---―'´`l          /´           `ヽ、
      |        `l _   `l       /´/ /        ,、-'´ ̄\
      `l        |      `l      / / /       /      \
      `l        |    ,、'´\  /)/         /´
    ,、'´´`l     / `―フ ̄   ) ,、'´          /
   //   \  / |  / ̄`ヽ、,、'´フ          /
890888:02/03/17 15:03
>>833 <- >>883
>>887
基本的にはそんなとこじゃない?
シェアードライブラリとかの処理はどうなってるのか知らないけど。
#include<stdio.h>

main()
{
/* char型の配列を宣言し、初期化をする */
char charray[]="はじめての"

/* printf()関数を使って文字列を表示する */
printf("%s", charray);

/* printf()関数を使って文字列を表示する */
printf("Cプログラム\n");

return0;

}
て本に書いていたのを初めてコンパイラしようとしたのですが
MAKE Version 5.2 Copyright (c) 1987, 2000 Borland
BCC32 -WC -3 -Od -w- -AT -pc -H- -k -b -v -y -nDebug -c E:\program.c\2.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
E:\program.c\2.c:
エラー E2209 E:\program.c\2.c 1: インクルードファイル 'studei.h' をオープンできない
*** 1 errors in Compile ***

** error 1 ** deleting Debug\2.obj

Compile End !! (Elapsed time 0:00.030)
とでてしまいます。なぜでしょうか、
http://www.borland.co.jp/cppbuilder/freecompiler/index.html
を使ってます。
>>892
E:\program.c\2.c
の1行めになんて書いてあるの?
>>887
ローダーといっても、

- kernel が立ち上がる前の boot loader
- kernel 立ち上がった後 exec システムコール内部で行われる処理

どのあたりを指していってるのか明示しないと、話が混乱しそう。あと
書籍で Linkers & Loaders 読むのが良いんじゃないのか? (俺は
まだ読んでないんだが)
895892:02/03/17 16:57
この内容には
#include <studei.h>
と書いてありますが、それのことでしょうか?
studei.hこのファイルがないって事
正解はstdio.hだ
897892:02/03/17 17:29
MAKE Version 5.2 Copyright (c) 1987, 2000 Borland

Compile End !! (Elapsed time 0:00.020)
と出たんですが、出力結果というのでしょうか、それは出てこないんでしょうか?
>>897
同じディレクトリに何かできたと思われるのでそれを実行汁。
人に聞いてばかりでなく、少しくらいは自分で調べろ。
899デフォルトの名無しさん:02/03/17 18:44
>>892
には #include<stdio.h> って書いてるのに、
>>895
って、


ネタですか?

そうでなかったら、
charray の行末のセミコロン抜けてたりしてるから、
まず正確にコードを写すことを心がけた方がいいと思うよ。
>>899
コードを手で写している以上、まともなプログラマにはなれない。
>>900
コピペだけ覚えてもまともなプログラマにはなれない。
902デフォルトの名無しさん:02/03/17 21:57
>892
とりあえずくだらないタイプミスが何カ所かあります。指摘するのは簡単なんだけど
1行目が #include<stdio.h> なのにコンパイラに
>エラー E2209 E:\program.c\2.c 1: インクルードファイル 'studei.h' をオープンできない
っていわれているのだから掲示板に書き写すときにまたタイプミスしています。
自分が実際に書いたコードをコピペした方が問題点がはっきりするからコピペ奨励。


903892:02/03/17 22:08
コピペしてたのですが、一度貼り付けてまたコピーする時に違うのを
コンパイラして違う文章のエラーを貼り付けてしまっていたみたいです。
#include <stdio.h>
main()
{
/* char型の配列を宣言し,初期化する */

char charray[]="は\nじ\nめ\nて\nの\nC\n";

/* printf()関数を使って文字列を表示する */

printf("%s",charray);

return 0;

}
で、
MAKE Version 5.2 Copyright (c) 1987, 2000 Borland

Compile End !! (Elapsed time 0:00.020)
こうなりました。
904デフォルトの名無しさん:02/03/17 22:59
>903
うん問題なくコンパイルできて実行できるよ。
で、何が聞きたいの?

もしかして
>と出たんですが、出力結果というのでしょうか、それは出てこないんでしょうか?
のことかい?自分の環境はちゃんと書こうね。
出力結果を見るにもしかしてBCC Devを使ってると思うんだけどそれならツールバーの
実行を実行しよう。

それとこれはCの質問じゃなくてBCC Devの質問と言うことになる。BCC Devのことをこのすれで聞いて悪いことは無いと思うけど
C言語一般の話じゃないのでちゃんと環境を書いてから質問すること。

ちなみに一般的にはhoge.cというソースを書いたらそのディレクトリで
>bcc32 hoge.c [return]
とやって同じフォルダにhoge.exeができるので
>hoge [return]
とする。ちなみにこれもwindowsでbcc32だからこうなるのであってlinuxとかだとふつうは
$gcc hoge.c [return]
$./a [return]
となる。環境を書かないとみんな一般的な話をするしかなくなるので自分がどういう状況で
困っているのか必要十分な情報を伝えるように。

今回はコンパイラのメッセージがあったから予想がつきました。そのうちエラーメッセージの読み方も
わかるようになります。

実行できないのですが
906デフォルトの名無しさん:02/03/17 23:13
>903
わかった。
BCC Devでコンパイルするとコンパイルだけして実行ファイルは生成されません。
実行ファイルを作成するにはmakeしてください。そうじゃないと実行ボタンがグレイアウトして
有効になりません。

これも903がBCC Devを使っていると言ってくれればすぐわかったかもしれないのに。

甘やかしすぎちゃったかな。
907デフォルトの名無しさん:02/03/17 23:16
投稿文を書いている間に書き込みがあったようですね。

>実行できないのですが

やれやれ、、、、、、、、、、、、、。

「実行ボタンがグレイアウトして押すことができない。」
という一文がなぜ書けないんだ。

君は教えてくん認定。

もう俺は知らん。
>>905
makeは、コンパイルするコマンドであって、実行するコマンドじゃないよ。
Cではコンパイルして実行ファイルを一度生成して(これをmakeがやる)、
次にその実行ファイルをdos窓から実行すると、実行されるんだよ。
C:\>e:
E:\>cd \program.c
E:\program.c> 2.exe.
て感じかね?
(コンパイルして生成された実行ファイルがE:\program.c\2.exeならね)

漏れはWindowsではVCしか使ったことないので、BCCの
詳しいとこは分かんないけど。
教えて君にはあまり構うなよ。教えてる奴は善意かもしれんが、
結局ここに教えて君が多数住み着くようになり周りの奴にとって
害になるからな。

質問するやつは「十分に自分で調べた後」、「環境」、「状況」を
できる限り細かく書け。何がわからないかがわからなければ
こちらとしても答えようが無い。
910ビル・ジョブス:02/03/18 02:31
HANDLEってのを簡単に説明すると、
「色々なオブジェクトを管理するための構造体へのポインタ」
って事になるな。
>>910
間違っちゃいないが、素人っぷり全開なレスにしか見えないのは俺だけか?
>>911
まぁ奴の言うことは、いつもそうだよ。
913ビル・ジョブス:02/03/18 03:03
おーい「素人」ってオレの事か?
ならチミの技術力は「素人の10分の1」くらいだよ。
914デフォルトの名無しさん:02/03/18 03:08
>>910
用語の使い方なんか、こいつどこまで理解してるのかって不安になるよな。
915ビル・ジョブス:02/03/18 03:12
HANDLEの示す「実体の定義」のソースコードを見せてやりたいぜ!(フフフ
916ビル・ジョブス:02/03/18 03:19
>>914
そうだな・・・
DC(デバイスコンテキスト)って何ですか?とか、お気楽に聞かれても
いっぱいあるから「え!何に使うDC?」って聞き返してるよ・・・フー
ハンドルって、ポインタへのポインタだったり、構造体の配列のインデックスだったりするけどね。
918ビル・ジョブス:02/03/18 03:26
>>911
あっ!そーだ!
じゃー貴様が説明してみろよ!(50文字以内で)
919ビル・ジョブス:02/03/18 03:29
>>917
そんな事は百も承知ですが・・・フー
>>919
おいおい >>910 と言ってることが違うだろ(w
921ビル・ジョブス:02/03/18 03:49
>>920
「簡単に」って書いてあるだろ?
それとも「HANDLEの指し示す型を全部言え」ってか?
おまえアフォ?
ジョブス厨房すぎる。
日下部さん帰ってきてよ〜
>>920の負けですな
簡単にいうと>>923==ビル・ジョブス
925デフォルトの名無しさん:02/03/18 07:38
ビル・ジョブス は放置ということでお願いします。>> ALL
926sage:02/03/18 07:43
ええそうですね、ついでにつまらんことでageた>>925も放置で・・・
ちっと気になったんだけど、>>910の言う「オブジェクト」ってのは、
ペンとかブラシ(GDIオブジェクト?)って意味でよろしいか?

とすると、>>911>>914が気になってる点はどこ?
>>926
このスレは sage なきゃならんの?
929デフォルトの名無しさん:02/03/18 12:28
それで?
>>927
一番気になってるのは、たぶん、それがビル・ジョブスだって事。
>>927
ハンドルが指し示すリソースって、プロセスとかファイルとかデバイスとか、
そういうレベルで捉えるもんでしょ。
まあ、実装は特定のメモリとそれを指すポインタかもしれないけど、
「構造体」って言葉で説明してしまうとなんかちがうよな。
932927:02/03/18 13:21
>>930
なるへそ。
遙か昔の>>886で回答でてるじゃん。
今頃とんちんかんな回答するやつは誰だ?
934934!:02/03/18 14:14
OSで使うハンドルのことを、構造体へのポインタなんて説明してる
ほうがトンチンカンだろ。
OSの中身タコと無いんだね。
かわいそうに
936デフォルトの名無しさん:02/03/18 14:30
#define CHUBO 8
#define ITTEYOSHI (CHUBO*8)

のような多重defineは合法ですか?
>>936
合法だ。
938936:02/03/18 14:45
>>937
どうも〜
ちょいとしたパズル解きでやりたかったので。
939デフォルトの名無しさん:02/03/18 15:18
>>935
ハンドルはハンドルだろ
実装ならポインタよりテーブルのインデックスのほうが近い(事が多い)
940デフォルトの名無しさん:02/03/18 17:20
メモリをバイト境界にアラインする理由、メリットとはなんなんでしょうか?
アラインしないほうがメモリが節約されていいような気がするのですが。

>>940
バイト境界にアライン、というと1バイト境界, つまり逆にパックすることを意味するように取れるが。

まあ4とか8とかという意味なら、
1. プロセッサによってはそもそも4バイトワードを4で割り切れないアドレスでアクセスできない。
バスエラーというプロセッサ例外が発生し、停止する。
2. そのアクセス機能があるプロセッサであっても、複数のワードをまとめてアクセスしたあと、
ずらして合成するため、アクセス時間が余計にかかる。

ということで、アラインサイズより大きなデータへのアクセスは、普通避ける。
流石2ch、素早いレスありがとうございました。
943U-名無しさん:02/03/18 19:25
800 名前:ガンヲタ ◆GUNDAMIU 投稿日:02/03/02 19:53 ID:???
   今だ!800番ゲットォォォォ!!
    ̄ ̄ ̄∨ ̄ ̄ ̄ ̄ ̄
      ∧赤∧
      (・∀・ )           (´´
      ( つG つ       (´⌒(´
     / /〉 〉≡≡≡(´⌒;;;≡≡≡
    (__)(__) (´⌒(´⌒;;
      ズザーーーーーッ
944デフォルトの名無しさん:02/03/18 20:15
VC++6.0SP5にMSDN2001/10を使っております

FILE構造体をMSDNのヘルプで見ると
stdio.hをインクルードしろ、と書いてありますのでstdio.hのなかに書いてあるのかも、と思ってstdil.hの中身を見てもFILE構造体の定義がありません
stdio.hのなかにcruntime.hがインクルードしてありますのでそこを見ても入ってません
FILE構造体はどこにあるのでしょうか?
VC++をインストールするときにVC++のインストールはオプションまですべてインストールしたのですが…
>>944
grepした?
>>944
BCC5.5にて、stdio.hに発見。
VC6.0にて、stdio.hに発見。
947デフォルトの名無しさん:02/03/18 21:19
>>944
です
見つけました
失礼いたしました
struct _iobuf{} をtypedef しているのですね
失礼いたしました
948初心者1:02/03/19 00:25
Cのコメント除去をするプログラムの裸の版を教えてください。
>>948

foreach(<>)
{
$data = $_;

$data =~ /\/\/.*$//g;
$data =~ /\/\*.*\*\///g;
}
>>949
Cつかってて思うのは、Perlの簡潔さと暗号っぽさだなぁ。
しかし文字列解析がめっちゃ強いのはやっぱり美味しい…。
951デフォルトの名無しさん:02/03/19 00:41
>948
何を言っているのかよくわからん。プリプロセッサのことか?
952初心者1:02/03/19 00:42
ごめんなさい間違いました。
Cのコメントを除去するプログラムを
Cの文法で教えてください。
953初心者1 :02/03/19 00:48
裸の版ていうのは

while(まだ行がある)
if(コメント開始文字列がある)
除去除去

....?なんか違うかな・・・(-_-)
954デフォルトの名無しさん:02/03/19 00:50
ある文字列の中で、複数文字列からなるデリミッタの位置を返す関数を考えてるん
だけど、単一文字デリミッタならいけるんだけど、複数文字列だと配列に順番に
シフトしながら入れていって比較を繰り返すという感じにするしかないんでしょうか?
もうちょっとエレガントで少ないコード行でできませんかね?
>>954
strstr()じゃだめ?
956デフォルトの名無しさん:02/03/19 01:08
>952
コメント除去はスチャラカでいいなら

1行をバッファに読み込む
そのバッファを一文字づつ読んでいってホワイトスペース、/*の並びをコメント開始
としてコメント終了の*/まで読み飛ばす。

でいいでしょう。でも複数行にわたったコメントとか文字列中の/*を見つけたときに
きちんと対応させようとすると結構やっかいです。とりあえず裸と言うことだから
上の仕様で書いてみたら。

>954
strstr使ったらうまくいきそうに思えるけど。デリミタのポインタが返ってくるんじゃないの?
>>955
>>956
ライブラリでそういう関数が既にあるんですね。
自分で作ろうとしてました。どうもです。
958ビル・ジョブス:02/03/19 01:18
>>957
ANSI/UNICODEに気を付けて。
ビルはいわゆるEUCとかEBCDICは気をつけなくていい環境なんだね(藁
960デフォルトの名無しさん:02/03/19 11:57
なるほどねぇ
961デフォルトの名無しさん:02/03/19 12:15
>>948
「除去」って言葉が曖昧なんだけど、
コメントだけを表示するプログラム作ってみた。
参考にシル。


#include <stdio.h>

#define OUT 0
#define IN 1

#define BUFSIZE 8

int buffer[BUFSIZE];
int buffer_ptr = 0;

int getch(void);
void ungetch(int);

- つづく -
962デフォルトの名無しさん:02/03/19 12:16

- つづき -

int main(void){

    int c, d;
    int state = OUT;

    while((c = getch()) != EOF){

        if(state == IN && c == '*'){
            if((d = getch()) == '/'){
                putchar(c);
                putchar(d);
                putchar('\n');
                state = OUT;
                continue;
            }else{
                ungetch(d);
            }
        }

        if(state == OUT && c == '/'){
            if((d = getch()) == '*'){
                putchar(c);
                putchar(d);
                state = IN;
                continue;
            }else{
                ungetch(d);
            }
        }

        if(state == IN){
            putchar(c);
        }else{
            continue;
        }
    }

    return 0;
}

- つづく -
963デフォルトの名無しさん:02/03/19 12:17
- つづき -

int getch(void){
    int c;

    if(buffer_ptr <= 0){
        c = getchar();
    }else{
        c = buffer[buffer_ptr];
        --buffer_ptr;
    }
    return c;
}

void ungetch(int c){
    if(buffer_ptr <= BUFSIZE - 1){
        buffer[buffer_ptr] = c;
        ++buffer_ptr;
    }else{
        fprintf(stderr, "Error: buffer full\n");
        exit(1);
    }
}

課題は自分でとくことに意味があると思うぞ。
964デフォルトの名無しさん:02/03/19 12:23
新スレは?
965961 - 963:02/03/19 12:25
コードがべたでスマソ。
間違ってたら誰かなおしといてクリ。

ところで次スレはどこ?
C言語なら、俺に聞いてくれませんか?==15;
名前: デフォルトの名無しさん
E-mail: sage
内容:
先人のお言葉。
漏れは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言語なら、俺に聞け! <14>
http://pc.2ch.net/test/read.cgi/tech/1015286974/l50

967デフォルトの名無しさん:02/03/19 12:48
> 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

いいかげん、これはいらないだろ。
かわりに、こっち載せといたら。

推薦図書/必読書のためのスレッド PART2
http://pc.2ch.net/test/read.cgi/tech/1010312992/l50

毒が足りないか。(W
文字列定数に含まれた /* */ はスキップしないのか?
ぜんて、がいい
>C言語なら、俺に聞いてくれませんか?==15;

腰が低いのはイヤだな。なんとなく。
C言語なら私におまかせ♪+=15;

媚びてみるというのは?
972デフォルトの名無しさん:02/03/19 13:30
>>971
ネカマっぽい 藁
973デフォルトの名無しさん:02/03/19 13:58
C言語なら、他に聞け! <15>
>>973
(あかんやん・・・。> Σ(`ヾ)<
975デフォルトの名無しさん:02/03/19 14:07
ハンドルされてない例外って何ですか?
>>975
catchされてない例外。
977デフォルトの名無しさん:02/03/19 14:33
すいません・・・
catchってなんですか?
978デフォルトの名無しさん:02/03/19 14:39
WindowsXPにVC++を使っているのですがC言語でHTMLのタグなどの他言語の命令文などはどうやって取得するのでしょうか?
たとえばHTMLなら<a href="URL">飛んでけ</a>や<br>
などというものなどの場合?
979デフォルトの名無しさん:02/03/19 14:42
HTMLのタグの話しなら、
XMLやHTMLのタグを解釈するライブラリを探して使え。
それがなければ構文解析をするプログラムをCで書け。
981デフォルトの名無しさん:02/03/19 14:47
>>978
parser を作る。
>>978
「IEコンポーネントを使い倒すスレ」ってのがあったな。
>>982
IEコンポーネントを使い倒すスレ
http://pc.2ch.net/test/read.cgi/tech/982930049/
>>978
取得した後に何をやるのかがわからなければなんともいえない。
985978:02/03/19 14:54
IEコンポーネントを見てみます
わざわざありがとうございます
986973:02/03/19 15:01
C言語だけなら、俺に聞け! <15>
C言語っぽく俺に聞け! <15>
C言語なら、俺が聞く! <15>
C言語なら、俺を見ろ! <15>
C言語から俺が逝く! <15>

そろそろ番号がきびしくないか。
そろそろ日下部はやめようぜ。
それにしても2週間でスレ一つ使うとはかなり人の多いスレですね。
989デフォルトの名無しさん:02/03/19 15:09
漏れ的には Dennis Ritchie がいいな。
残り10になッても誰もスレ立てようとしないのが
このスレのいい加減さを表してていい(藁
>>990
失敗しましたがなにか?
プログラミング作法・ハーニンハン博士
( ;´Д`)
新スレ勃てたよ。

C言語なら、俺に聞け! <15>
http://pc.2ch.net/test/read.cgi/tech/1016519243/l50
>>993
おつかれー
わーいわーい、ぜんてだぜんて!
996女性雑誌にも載ってるよ♪:02/03/19 15:32

女性雑誌 (;´Д`) ハアハア
999デフォルトの名無しさん:02/03/19 16:16
後1…
1000デフォルトの名無しさん:02/03/19 16:18
1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。