■ 2ちゃんねるは、ここのサーバを使ってるです。。。
 .jp ドメインお持ちのお客様大歓迎。maido3.jp
 .fm 取得代行します。(US) maido3.fm
 .ca 取得代行します。(US) maido3.ca
 .com .net .org 取得代行します。(US) maido3.com
 .cc .to .tv 取得代行はじめました。NEW
人気サイト
月々1,000円からの BinboServer.com 2ちゃんねるも使っている Big-Server.com
>> 2ちゃんねる、サーバ監視所

■掲示板に戻る■ ■過去ログ倉庫めにゅーに戻る■
C言語なら、俺に聞け! <14>
1 名前: スーパーハイソサエティーハッカー日下部陽一 投稿日: 02/03/05 09:09
漏れは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



2 名前: デフォルトの名無しさん 投稿日: 02/03/05 09:23
>>1
どんどん名前が長くなるな。


3 名前: デフォルトの名無しさん 投稿日: 02/03/05 09:36
歳が若くなってるし


4 名前: デフォルトの名無しさん 投稿日: 02/03/05 10:43
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:\>はつみみです;)
'はつみみです' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。


11 名前: デフォルトの名無しさん 投稿日: 02/03/05 15:51
>>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

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

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

よろしくお願いします。



13 名前: デフォルトの名無しさん 投稿日: 02/03/05 16:01
>C++なら俺に聞けって奴みたことねー
そんなことをいうと、尋常でないテンプレートが
バカバカでてきててにおえなくなるからなのれす。


14 名前: デフォルトの名無しさん 投稿日: 02/03/05 16:03
ANSIの規格に割り込みイヴェント関数が存在する意義がよく分かりません。
教えて下さい。


15 名前: デフォルトの名無しさん 投稿日: 02/03/05 16:17
ruby で書かれています。


16 名前: デフォルトの名無しさん 投稿日: 02/03/05 16:25
>>11
ネタを真に受けている馬鹿


17 名前: デフォルトの名無しさん 投稿日: 02/03/05 16:28
>>16
>>11はネタじゃないの?


18 名前: デフォルトの名無しさん 投稿日: 02/03/05 16:38
ネタにしちゃヒネリもなんにもない駄作


19 名前: デフォルトの名無しさん 投稿日: 02/03/05 16:42
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)[];←これって配列の大きさが不定です。ってコンパイラに言われない?


21 名前: デフォルトの名無しさん 投稿日: 02/03/05 16:49
>>18
じゃ君も「ネタを真に受けている馬鹿」なんだね。


22 名前: 20 投稿日: 02/03/05 16:54
あ、言われないか。


23 名前: デフォルトの名無しさん 投稿日: 02/03/05 16:56
>>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で得た領域でしょう?
それを省いたら・・・


26 名前: 25 投稿日: 02/03/05 17:01
7行目ね。


27 名前: デフォルトの名無しさん 投稿日: 02/03/05 17:01
∧__∧
(・ω・)
/[リナ]ヽ
  人


28 名前: デフォルトの名無しさん 投稿日: 02/03/05 17:01
mallocを使わないときはどうしたらいいんでしょうか?


29 名前: デフォルトの名無しさん 投稿日: 02/03/05 17:02
警告メッセージをしっかり読まないやつはドラクエで言えば
酒場でくだ巻いている自称戦士みたいなもんだ。



30 名前: デフォルトの名無しさん 投稿日: 02/03/05 17:03
>>28
配列を用意する。



31 名前: デフォルトの名無しさん 投稿日: 02/03/05 17:09
>>23
ありがとう。
char (*ap)[4]; て宣言しなきゃいけないのか。
別に意味のあるプログラムではないんだけど、昨日からずっと悩んでた。


32 名前: 溺れるプログラマー 投稿日: 02/03/05 17:09
MFCで作ったアプリケーションってDLLいる?
SDKアプリケーションはDLLいる?


33 名前: デフォルトの名無しさん 投稿日: 02/03/05 17:12
>>32
ここはCスレです。
MFCは必要です。Win98以降はMFC4.2DLLが最初から入っているらしいけど。


34 名前: デフォルトの名無しさん 投稿日: 02/03/05 17:23
複数人で開発するプロジェクトの場合、main関数はリーダーが書くの?


35 名前: デフォルトの名無しさん 投稿日: 02/03/05 17:29
>>34
んなこと決まってない。
スケルトンなら全員でかく。


36 名前: デフォルトの名無しさん 投稿日: 02/03/05 17:32
>>34
キミおもしろいなぁ。


37 名前: 35 投稿日: 02/03/05 17:33
スケルトン:×
ドライバ:○

鬱だ・・・


38 名前: デフォルトの名無しさん 投稿日: 02/03/05 17:37
>>12
なんらかのOSの上で稼動するのであれば、アセンブラはいらないでしょう。
独自のブートを行う場合は、ちょびっとだけアセンブラがいる。

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

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

これか。
http://pc.2ch.net/test/read.cgi/unix/1013144113/n682-690


39 名前: デフォルトの名無しさん 投稿日: 02/03/05 17:40
>>38
シュレッダーソフトって全てのクラスタを上書きするんじゃなかった?


40 名前: 38 投稿日: 02/03/05 17:41
>>39
そうだと思う。


41 名前: デフォルトの名無しさん 投稿日: 02/03/05 17:48
>>34
俺ペーペーだから、まだ#defineしか書かしてもらえない。
普通の関数でキャリア5年、mainなら10年以上だな。



42 名前: デフォルトの名無しさん 投稿日: 02/03/05 17:50
>>41
俺なんか#include <stdio.h>しか書かせてもらえない。
他の#includeも書きたいんだけど。


43 名前: デフォルトの名無しさん 投稿日: 02/03/05 17:55
デバッグで関数の中に入った瞬間に
stac overflowのエラーが出てしまいます。
何が原因なんでしょうか?


44 名前: デフォルトの名無しさん 投稿日: 02/03/05 17:56
>>43
配列が大きすぎるとか、関数を再帰的に呼びすぎるとか。


45 名前: デフォルトの名無しさん 投稿日: 02/03/05 17:59
stack?


46 名前: デフォルトの名無しさん 投稿日: 02/03/05 18:07
スタクとバカにしるな!


47 名前: 旧887 投稿日: 02/03/05 18:41
>>888
列挙だけだね〜
>>891
ありましたthanks


48 名前: 超初心者 投稿日: 02/03/05 18:48
K&Rをマスターしたら
C言語は一通り使いこなせるようになったと言えるんでしょうか?

厨房質問ですみませんです。


49 名前: デフォルトの名無しさん 投稿日: 02/03/05 19:06
>>48
C言語を使いこなすと言うのは、C言語で思考出来る事だと思われ。



50 名前: デフォルトの名無しさん 投稿日: 02/03/05 19:15
>以下のソフトを見つけたのですが、こういう機能はC言語だけで書けるのでしょうか?
>http://www.zdnet.co.jp/products/tdk/hddataclear.html

URLをHDDアタッカーと読んでしまって
てっきり物理的にHDDを破壊するソフトか何かかと。



51 名前: デフォルトの名無しさん 投稿日: 02/03/05 19:53
>>48
K&Rにある問題を一通り自力で解いてみたなら基本は一通り、ってかんじだね。

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

がんばれ



52 名前: 名無しさん@Emacs 投稿日: 02/03/05 20:30
そういえば前スレにも 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] );
}
}

と書いたのですが、「この部分の高速化を考えてみよう。」
と言われて、躓きました。
高速化のポイントを教えてください。


55 名前: デフォルトの名無しさん 投稿日: 02/03/05 20:59
>>54
ファイルアクセスは一回ですます


56 名前: デフォルトの名無しさん 投稿日: 02/03/05 20:59
>>54
学校の宿題は、自分で考えよう。
出来なくたって給料に響きもしないし、まして命まで取られるわけじゃない。


57 名前: デフォルトの名無しさん 投稿日: 02/03/05 21:03
>>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]);
ってすればいいんでしょうか?


59 名前: 54 投稿日: 02/03/05 21:05
>>55
即レスthx。それは、考えたのだけれども、具体的にどうすればよいか分からなかった。
とりあえず、大きなchar変数を用意してやればいいのかなと思ったのだが、
うまくいかず。全然早くならない。

>>56
学校の宿題ではないけれども、お言葉は確かに。


60 名前: 54 投稿日: 02/03/05 21:11
>>57
ありがとうございます。
3は知りませんでした。今は、実験できないけれども、実験環境整い次第調べてみます。

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

2に付いては、例えば、fprintfの%dなどの処理を省いた関数を作るって事?
林晴比古の本に書いてあって、試したのだけれども、無駄な苦労に終わった。


61 名前: 55 投稿日: 02/03/05 21:11
>>59
配列で保存形式にこだわらないならば
fwriteで一気に書き込めば?

ポインタで確保したならメモリに書き込むイメージを
作ってから同じように一気に書き込む


62 名前: デフォルトの名無しさん 投稿日: 02/03/05 21:13
>>58
func(a);


63 名前: 54 投稿日: 02/03/05 21:14
>>61
なるほど。早速、明後日試してみることにします。
(今日、明日はCの開発環境が無い環境にいるので。)


64 名前: デフォルトの名無しさん 投稿日: 02/03/05 21:27
>>63
doubleを文字列にしなければならないんだよね?


65 名前: デフォルトの名無しさん 投稿日: 02/03/05 21:57
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くらいだったら、違いが目に見えて出てきただろう。



66 名前: デフォルトの名無しさん 投稿日: 02/03/05 22:41
>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を書けばよいでしょうか?
もう自分の力では無理なので、どなたかお願い致します。


69 名前: デフォルトの名無しさん 投稿日: 02/03/05 23:05
>>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 );
}





72 名前: デフォルトの名無しさん 投稿日: 02/03/05 23:26
>>68
????出来ない事は無いが、やる意味がよくわからん。
ソースの中で
#ifdef HOGE
・・・・
#endif
ってしておいて、Makefaileで

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

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

つか、それがわかった上での質問なのか?


73 名前: 67=71 投稿日: 02/03/05 23:26
>>69でした


74 名前: デフォルトの名無しさん 投稿日: 02/03/05 23:27
大胆なスタックの使い方だ・・・


75 名前: 74 投稿日: 02/03/05 23:32
>>71
スタックに32MB確保してるよ


76 名前: 74 投稿日: 02/03/05 23:33
約24MBだった


77 名前: デフォルトの名無しさん 投稿日: 02/03/05 23:35
コンパイルオプションでスタックサイズ増やせば解決さ!


78 名前: デフォルトの名無しさん 投稿日: 02/03/05 23:36
>>71
1024*1024*8で8MB、それが3つで24MBか。
まぁまぁ大きいかな。
FFT2の宣言はどうなってんだ?



79 名前: 68 投稿日: 02/03/05 23:37
>>68です

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

>>70
色々調べてるんですが・・・grepとか使うのかな


80 名前: デフォルトの名無しさん 投稿日: 02/03/05 23:38
>>70
config.hって、普通ユーザがコンパイル前に希望の状態に
カスタマイズするために用意しているオプション群
みたいなもんだろ?
Makefileとは関係ないじゃん


81 名前: Makefileとは関係ありません 投稿日: 02/03/05 23:40
Makefileとは関係ありません


82 名前: デフォルトの名無しさん 投稿日: 02/03/05 23:40
>>79
>ヘッダーファイルのマクロをMakefileのマクロに渡したいんです.
これをやって最終的に何をしたいんだ?
それを書かないと回答不能。


83 名前: デフォルトの名無しさん 投稿日: 02/03/05 23:44
ハァ?


84 名前: デフォルトの名無しさん 投稿日: 02/03/05 23:47
>>68
grep使うで正解じゃない?
shell出力を make内の変数に取り込む事出来るから。
取り込んだら、ifeqで検査。


85 名前: デフォルトの名無しさん 投稿日: 02/03/05 23:49
>>78
まあまあ?
スタックならとてつもなく大きいと思うけど・・・・


86 名前: デフォルトの名無しさん 投稿日: 02/03/05 23:50
68は何かを勘違いしている。
たぶんもっとまともな解があるよ


87 名前: デフォルトの名無しさん 投稿日: 02/03/05 23:52
最終的な目的を教えてくれれば、もっと一般的な解決法がわかるかも


88 名前: 68 投稿日: 02/03/05 23:53
>>82
ヘッダーファイルのマクロをMakefileのマクロに渡したして
それをもとにオプションを作って>>72さんのように
cc -c ... -D DEF として
別のプログラムに渡したいんです.
それをその別のプログラムを変更しないでやりたいんですが.

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

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





89 名前: 68 投稿日: 02/03/05 23:55
間違えた
if grep "^#define HOGE" head.h; then ○○;fi;

コマンドでやるとこんな感じだと思うんですが,
Makefileの中でどういうふうにやって変数にどう渡したらいいのか


90 名前: デフォルトの名無しさん 投稿日: 02/03/05 23:56
元から Makefile の中に書けば?


91 名前: デフォルトの名無しさん 投稿日: 02/03/05 23:56
>>88
Makefileはincludeできるぞ。それでどうだ?


92 名前: 84 投稿日: 02/03/05 23:59
動作確認してないけど。
$(shell grep なんたら) で参照出来ると思う。
Win32用GNU make使用。

$(shell cd) で、現在のディレクトリ取得した事は有る。


93 名前: 71 投稿日: 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];





94 名前: デフォルトの名無しさん 投稿日: 02/03/06 00:00
>>85
環境に拠るんじゃない。
環境の話は不毛なので、24MBは取れない環境だったということで。
mallocすればよろしい。ってことでどうでしょ。


95 名前: デフォルトの名無しさん 投稿日: 02/03/06 00:02
i386 i486 i586の違いってなんですか?
Pentium3はi586でしょうか?


96 名前: デフォルトの名無しさん 投稿日: 02/03/06 00:05
あまり一緒に仕事をしたくないタイプだな>68
珍妙なMakefile書いて悦に入ってる奴って
例外なくウンコちゃんだったよ。


97 名前: デフォルトの名無しさん 投稿日: 02/03/06 00:05
>>95
板違い
http://pc.2ch.net/hard/
こちらへどうぞ


98 名前: デフォルトの名無しさん 投稿日: 02/03/06 00:06
>>95
http://www.google.com/search?hl=ja&q=i386+i486+i586%82%CC%88%E1%82%A2+pentiumIII&btnG=Google+%8C%9F%8D%F5&lr=lang_ja


99 名前: 84 投稿日: 02/03/06 00:09
>>96
そう言うなって。
68が、あまり一緒に仕事をしたくない人に巻き込まれてる可能性だってあるんだし(w


100 名前: デフォルトの名無しさん 投稿日: 02/03/06 00:10
struct BITS{
unsigned int b0:1;
};
sizeof(struct BITS)
これって何で1バイトや2バイトにならないの?
int型のサイズになるのか?

bcc32+win


101 名前: デフォルトの名無しさん 投稿日: 02/03/06 00:10
100?


102 名前: デフォルトの名無しさん 投稿日: 02/03/06 00:10
100ヴァーン


103 名前: デフォルトの名無しさん 投稿日: 02/03/06 00:13
>>100
1ビットだけ使うように制限しているだけ
メモリはintのサイズとられます。


104 名前: 68 投稿日: 02/03/06 00:17
>>92
なんかそれで上手くいきそうです.
ありがとうございました.

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

>>90>>91
そうなんですが,色々考えてヘッダファイルから読み込むようにしたかったんです.



105 名前: デフォルトの名無しさん 投稿日: 02/03/06 00:21
>>68
ちなみに
#define FOO
cc -DFOO
cc -DFOO=1

どれも#define FOO 1 と等価であることに気づいているのか?



106 名前: デフォルトの名無しさん 投稿日: 02/03/06 00:26
>>105
そ・れ・だ!


107 名前: 84 投稿日: 02/03/06 00:26
もっかい>>88を良く読んでみたけど・・・
単に複数のCソースで、共通のヘッダを読み込めばいいだけのような気が・・・



108 名前: Else 投稿日: 02/03/06 00:30
Windows SDKのことが詳しく書かれた、オススメの本を教えて下さい。
(もちろん、C言語)


109 名前: デフォルトの名無しさん 投稿日: 02/03/06 00:31
たぶん
>それをその別のプログラムを変更しないでやりたいんですが.
に美学を感じてるんだろな。

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

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

>108
MSDNはチェックした?


110 名前: デフォルトの名無しさん 投稿日: 02/03/06 00:32
>>108
つか、msdn見れ
本は知らん。


111 名前: デフォルトの名無しさん 投稿日: 02/03/06 00:34
>>107
変数を渡すほうのプログラムが先輩が作ったもので,なんか書き換えたくないんですよね.
署名が入ってるプログラムって勝手に書き換えていいものなんですか?
使わせてもらうってことの了承はとってるのですが.

自分でもなんかおかしなことやってるような気がしてきました.
他の解決方法も考えてみます.



112 名前: デフォルトの名無しさん 投稿日: 02/03/06 00:39
>>111
署名って、
$Id: lcore.s,v 1.1 2002/03/05 15:38:27 senpai Exp $
って感じなやつ?


113 名前: デフォルトの名無しさん 投稿日: 02/03/06 00:43
>>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の解答例ってどこにありますか?


115 名前: デフォルトの名無しさん 投稿日: 02/03/06 01:39
アンサーブック


116 名前: デフォルトの名無しさん 投稿日: 02/03/06 01:41
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)


120 名前: sage 投稿日: 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;
}

はよ寝ろ


121 名前: sage 投稿日: 02/03/06 02:10
*s2++ = st++;

*p++ = st++;


122 名前: sage 投稿日: 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
あげ


125 名前: s/正規表現/を語ろう/e 投稿日: 02/03/06 16:11
$_ = '騙りましょう。';
s/騙(ら|り|る|れ|ろ)/語$1/;

別にperlじゃなくてもいいです。。


126 名前: s/正規表現/を語ろう/e 投稿日: 02/03/06 16:13
>>125しまったスレタテと間違った。超誤爆すまん。


127 名前: デフォルトの名無しさん 投稿日: 02/03/06 16:49
以下のような
char* ppstr[]={
"いってよし",
"おまえもなー",
"ずざー",
}
という変数があるとします。
それを一単語ずつファイルに書き込みたいのです。
2ch.txt
いってよし
おまえもなー
ずざー

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


128 名前: デフォルトの名無しさん 投稿日: 02/03/06 16:53
>>127

FILE *fp;
int i;
fp=fopen("./2ch.txt","w");
for(i=0;i<3;i++)
fprintf(ppstr[i],"%s\n",fp);
fclose(fp);



129 名前: 128 投稿日: 02/03/06 16:54
あ、fopenのエラーチェックをしてねー。まあいいか(ワラ          


130 名前: 128 投稿日: 02/03/06 16:55
fprintf(fp,"%s\n",ppstr[i]);
だよ(鬱


131 名前: デフォルトの名無しさん 投稿日: 02/03/06 16:56
fprintf の引数の順序逆じゃねぇ?まあいいけど


132 名前: 131 投稿日: 02/03/06 16:56
かぶったぎゃー。


133 名前: 127 投稿日: 02/03/06 19:37
ありがとうございますー
試してみます!


134 名前: デフォルトの名無しさん 投稿日: 02/03/06 20:13
>>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言語で何を作ってた?
俺は今、じゃんけんゲームを作成中(ショボ


136 名前: デフォルトの名無しさん 投稿日: 02/03/06 21:15
C言語では可変長な並列はどうやって作ればいいのですか?
誰か教えてください。


137 名前: デフォルトの名無しさん 投稿日: 02/03/06 21:19
>>136
並列を配列に読み替えて・・・・

あんたCをなんだと思っているんだ?
reallocで似たようなことができるといえばできるけど。


138 名前: デフォルトの名無しさん 投稿日: 02/03/06 22:07
>>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=


139 名前: デフォルトの名無しさん 投稿日: 02/03/06 22:10
>>136
いわゆるVectorの実装はたいてい>>137の言うようにrealloc()だよ。


140 名前: 136 投稿日: 02/03/06 23:22
>>137-139
どうもありがとうございます。
教えてクンですいませんでした。


141 名前: デフォルトの名無しさん 投稿日: 02/03/07 05:56
open関数のことででちょっと質問が
参考書のサンプルプログラムで
open(lock_file, O_RDWR | O_CREAT | O_EXCL, 0444);
のような文がでてきました。
最後のパーミッションの数値を調べたら"オーナーの読み込み許可:00400"のように
すべて5桁なのですが、このサンプルは4桁で書かれています。
最上位桁の0は省略できるのですか?


142 名前: デフォルトの名無しさん 投稿日: 02/03/07 07:14
8進数だよそれ。


143 名前: 日下部陽一 投稿日: 02/03/07 09:10
Cは10進数で0を記述できないage


144 名前: デフォルトの名無しさん 投稿日: 02/03/07 09:14
>>143
????

>>141
0で始まる数字列は8進数、0xで始まる数字列は16進数


145 名前: デフォルトの名無しさん 投稿日: 02/03/07 09:26
>>143
なるへそ。単に 0 と表記すると、8進数の0なのか。
さすがスーパーハイソサエティーハッカーだ。


146 名前: デフォルトの名無しさん 投稿日: 02/03/07 09:27
0 とだけ書いたら、それは実は8進数の0という、どーでもいい罠


147 名前: 146 投稿日: 02/03/07 09:28
かむった…


148 名前: デフォルトの名無しさん 投稿日: 02/03/07 09:30
>>141
つーことで、最上位の0は省略できないよん。
あと、パーミッションは man chmod すると分かるけど、
4桁まであるのだー。


149 名前: デフォルトの名無しさん 投稿日: 02/03/07 11:43
 voidってなんですか?
って優香。プログラムの専門用語を検索できる、辞典サイトって
ありますか?


150 名前: デフォルトの名無しさん 投稿日: 02/03/07 11:52
自分で調べろ


151 名前: デフォルトの名無しさん 投稿日: 02/03/07 12:01
void
虚空。空虚。存在しないこと。無駄。無駄無駄。
無駄無駄無駄無駄無駄無駄無駄無駄無駄無駄無駄無駄無駄無駄無駄
無駄無駄無駄無駄無駄無駄無駄無駄無駄無駄無駄無駄無駄ぁあ!!!


152 名前: デフォルトの名無しさん 投稿日: 02/03/07 12:02
捨て捨て


153 名前: 149 投稿日: 02/03/07 12:03
>>150
 プログラムの辞典サイトってあるんですか?
googleで引っかかる気配すらないんですが・・


154 名前: デフォルトの名無しさん 投稿日: 02/03/07 12:19
>>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


155 名前: デフォルトの名無しさん 投稿日: 02/03/07 12:50
>>149
スタークルーザーってやったことないのか?
敵対組織の名前がvoidだよん。
名作なんだけどなぁ。

激しくスレ違いスマソ


156 名前: 141 投稿日: 02/03/07 14:54
>>142>>148
解りました。ありがとう


157 名前: デフォルトの名無しさん 投稿日: 02/03/07 16:08
voidそれは空の集合。
空の集まりそれは空。
ああ悲しきreturn;


158 名前: デフォルトの名無しさん 投稿日: 02/03/07 18:25
なんでC言語は8進数、16進数の表記ができて2進数表記ができないんだろうね?
漏れ的には8進数よりよっぽど有用だと思うんだけど。
例えば 0b110011 みたいに。独自拡張してるコンパイラとかないんだろうか?
更に読みやすいように、0b1010_1100 みたいな表記ができるとなお便利だが。



159 名前: デフォルトの名無しさん 投稿日: 02/03/07 18:26
#error これだとメッセージを出力して終わってしまいますが、
#warn ←こんな感じでメッセージを出力してそのままコンパイルを続けるようなのってないですか?



160 名前: デフォルトの名無しさん 投稿日: 02/03/07 18:52
menuについて解説した日本語ページ無いですかね。
英語ページは見つけたんですけど…
無ければ無いでそっち使いますけどね。


161 名前: デフォルトの名無しさん 投稿日: 02/03/07 18:56
>>160
menuってなーにー?


162 名前: 160 投稿日: 02/03/07 19:05
説明が足りませんでしたね。
ごめんなさい。
cursesを使ってターミナル画面で
メニューシステムを扱えると言うライブラリです。
(man menuより意訳。大雑把だけど)


163 名前: 161 投稿日: 02/03/07 19:27
>>162
おぉ、なるへそ。勉強になりました。


164 名前: デフォルトの名無しさん 投稿日: 02/03/07 19:33
>>158
それよりも、printf系関数で数値を2進数字列にする機能がほしかった。
逆ならstrtolでできるんだけどな。


165 名前: デフォルトの名無しさん 投稿日: 02/03/07 20:16
>>158
Unixが発祥の地ということで、例のクソファイルシステム関係で
8進数が導入されたんじゃ?
2進がないとは、アセンブラとは違うんじゃヴォケ って意思表示かと。



166 名前: デフォルトの名無しさん 投稿日: 02/03/07 22:51
>>159
汎用的な方法はないと思われ。
とりあえずコンパイラのマニュアル見てみたら。
たとえばVCだったら #pragma message ってのでできる。



167 名前: デフォルトの名無しさん 投稿日: 02/03/07 23:27
質問なのですが、
malloc関数などで、メモリーを確保しますよね。
メモリーが確保された状態で、ALT+F4を押されて強制終了させられたら、
開放しない事になるのでしょうか(多分なると思いますが)。
もしそうならば、ウィンドウプロシージャの中にWM_DESTROYが送られてくるのでしょうか?


168 名前: デフォルトの名無しさん 投稿日: 02/03/07 23:52
OS のやる気次第


169 名前: 名無しさん@Emacs 投稿日: 02/03/08 00:03
普通は解放してくれるんじゃないの?よく知らないけど。


170 名前: デフォルトの名無しさん 投稿日: 02/03/08 00:08
mallocしたらfreeしなさい。
しなさいったらしなさい。


171 名前: デフォルトの名無しさん 投稿日: 02/03/08 00:30
>>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 名前: デフォルトの名無しさん 投稿日: 02/03/08 00:48
http://paming.s7.xrea.com/ykwk166_kai/yukiwiki.cgi?mycmd=read&mypage=%5B%5B%82%DC%82%B8%82%CDC%8C%BE%8C%EA%82%F0%8Ao%82%A6%82%BD%82%A2%82%CC%82%C5%82%B7%5D%5D


174 名前: デフォルトの名無しさん 投稿日: 02/03/08 00:52
>>173

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

Linuxでは、今は標準でインストールされねーぞ。


175 名前: デフォルトの名無しさん 投稿日: 02/03/08 00:56
>>172
わるいことはいわないから、DigitalmarsかBorlandにしておけ。


176 名前: デフォルトの名無しさん 投稿日: 02/03/08 01:10
>>172
Windowsなら cygwinでgccってのもアリかと。


177 名前: デフォルトの名無しさん 投稿日: 02/03/08 01:12
>174
ここで突っ込む暇があったら追加・加筆したれよ(藁


178 名前: デフォルトの名無しさん 投稿日: 02/03/08 01:16
>>177
おお、これWikiだったか。       


179 名前: デフォルトの名無しさん 投稿日: 02/03/08 01:16
結城先生ハァハァ
ウッ!


180 名前: デフォルトの名無しさん 投稿日: 02/03/08 01:28
>>172
事足りるっつーか、それって結局コンパイラは gcc だし、何の問題も無し。
Cygwin 入れるのもかったるいだろうし。


181 名前: デフォルトの名無しさん 投稿日: 02/03/08 01:31
日本では情報少ないだろ>DevC++


182 名前: デフォルトの名無しさん 投稿日: 02/03/08 01:52
DevC++の統合環境って勝手に関連付けしてくれる。


183 名前: デフォルトの名無しさん 投稿日: 02/03/08 01:56
先生、黒板見えませーん!
せめて

i=1;

と書くのはやめて、

i = 1;

と書いてください。

あと、プログラマは何故 "," と "." の区別が一瞬でつきますか?


184 名前: デフォルトの名無しさん 投稿日: 02/03/08 01:58
>183
文脈でわかるだろ
pi=3,14
foo(a.b.c,d,e.f)
とかね


185 名前: デフォルトの名無しさん 投稿日: 02/03/08 01:59
>>184
俺もそう思ったけど、メンバーを参照するときに.を使うね。


186 名前: デフォルトの名無しさん 投稿日: 02/03/08 02:00
>>183
区別が付くほど大きな文字サイズにしているから。


187 名前: デフォルトの名無しさん 投稿日: 02/03/08 02:02
>>184
pi=3,14; は警告も出ずに動いてしまうと言う罠。


188 名前: デフォルトの名無しさん 投稿日: 02/03/08 02:27
おばあちゃんの知恵。

コンマの後ろには必ず空白を。
ピリオドの前後は空白を入れない。



189 名前: デフォルトの名無しさん 投稿日: 02/03/08 02:28
>>187
lint機能搭載してるコンパイラなら警告出るはずだが


190 名前: デフォルトの名無しさん 投稿日: 02/03/08 02:30
>>188
ファイルサイズが増えるから嫌。


191 名前: デフォルトの名無しさん 投稿日: 02/03/08 07:21
最近Kusakabe Youichiさんを見かけないのですが、どうしちゃったんですか?
アクセス規制された?
電波が届かない、圏外?


192 名前: デフォルトの名無しさん 投稿日: 02/03/08 08:59
>>190
いつの時代の人間だよ。


193 名前: デフォルトの名無しさん 投稿日: 02/03/08 09:29
>>191
胃潰瘍で入院中です。

From: Kusakabe Youichi <void@merope.pleiades.or.jp>
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%void@merope.pleiades.or.jp>
References: <3c7c1f$05d159ee4c9b20d@news2.asahi-net.or.jp>
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 <3S7C595S.8990500@gu.edu.au>, O.Ogiwara
<O.Ogiwara@gu.edu.au> wrote:
> スローフード?

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

ヘ_ヘ ____________________________
ミ・・ ミ void@merope.pleiades.or.jp
( ° )〜 日下部陽一
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


194 名前: デフォルトの名無しさん 投稿日: 02/03/08 09:54
>>193
それは入院中でも書けるということを意味してるような


195 名前: 191 投稿日: 02/03/08 10:04
>>193
そうですか kusakabe さんお大事に。はぁと。


196 名前: デフォルトの名無しさん 投稿日: 02/03/08 12:00
実行速度の目安として、ステップ数を計測したいと思っています。
ある関数に入ってからのアセンブラレベルでの実行ステップ数を計測
したいんだけど現在ではgdbで関数頭でブレークしておいて
その関数を抜けるまで地道にsiを繰り返しています。
でもイマイチ効率が悪いのでもう少しいい方法を模索中です。


197 名前: デフォルトの名無しさん 投稿日: 02/03/08 12:33
>>196
あそう。


198 名前: デフォルトの名無しさん 投稿日: 02/03/08 12:36
胃潰瘍ってマジ?


199 名前: デフォルトの名無しさん 投稿日: 02/03/08 12:39
チーズばっかり食ってるからか?


200 名前: デフォルトの名無しさん 投稿日: 02/03/08 13:03
>>196
プロファイルツールを使わないのは何か意味があるのか?



201 名前: デフォルトの名無しさん 投稿日: 02/03/08 15:02
>>200
プロファイルツールって何ですか?


202 名前: 201 投稿日: 02/03/08 15:07
googleで調べたけど売り物ばかり
Unix系(Linuxです)で使える無料のものはないのでしょうか?


203 名前: デフォルトの名無しさん 投稿日: 02/03/08 15:08
http://www.linux.or.jp/JM/html/GNU_binutils/man1/gprof.1.html


204 名前: デフォルトの名無しさん 投稿日: 02/03/08 15:40
>>202
ふーん、お前のところのLinuxって
man gprof
ってやっても何も出ないのか?
それって本当にLinuxなのか?



205 名前: 201 投稿日: 02/03/08 16:16
>>204
今はじめてしりました。
なかなか便利そうですね。
LinuxとかUnixとかだと、検索しても 見つからない というか、
単語名(キーワード)をしらないとどうしようもないですからね

機能逆引きページみたいなのも全く無いですし。
困ったものです。


206 名前: デフォルトの名無しさん 投稿日: 02/03/08 16:37
>>205
普段からマニュアルに目を通しておけ。
全てを覚えるのではなく,どこにどんなことが
書いてあるかをおおざっぱに把握する程度で良い。


207 名前: デフォルトの名無しさん 投稿日: 02/03/08 16:42
>>205
> 機能逆引きページみたいなのも全く無いですし。
man man
と打ち
-k オプションの部分を良く読むこと



208 名前: デフォルトの名無しさん 投稿日: 02/03/08 17:05
apropos 使うとか


209 名前: 201 投稿日: 02/03/08 18:17
>>207
ステップ数を数えるツール をさがしてて、
「プロファイル」 という単語にたどり着かないじゃないですか。
結局>>206氏のとおり普段からマニュアルを読んどくしかないですけど。

man の -k オプションは役立たずです。


210 名前: デフォルトの名無しさん 投稿日: 02/03/08 18:32
>>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
結構簡単にプロファイラにたどり着けそうな気がする。


211 名前: デフォルトの名無しさん 投稿日: 02/03/08 19:07
>>209
> ステップ数を数えるツール
確かにそれだと別の物を探してしまうし、
多分それだけのキーワードで質問したら
永遠にgprofは出てこなかっただろう。

検索キーワードの指定方法は結構難しい
私が初心者の頃、一般的なキーワードを指定してしまい、
何千件の一致結果にげんなりしてしまったことがあったり、
自分言葉を検索キーワードにしてしまい全然ヒットしないことがあった
今はの私はキーワードをいろいろ変えながらうまくクズ情報にフィルタをかけたり、
検索エンジンをいろいろ変えたりして何とか
検索エンジンを使いこなしているつもりになっているが、まだまだ先は長い。



212 名前: デフォルトの名無しさん 投稿日: 02/03/08 22:31
Cでミリ秒単位で時間は持ってこれないの?


213 名前: デフォルトの名無しさん 投稿日: 02/03/08 22:50
clock()とCLOCKS_PER_SECで場合によっては求められる


214 名前: デフォルトの名無しさん 投稿日: 02/03/09 14:46
下のように関数を作りました。

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
プロトタイプ宣言なんてする奴はいねーよ!


217 名前: デフォルトの名無しさん 投稿日: 02/03/09 14:52
プロトタイプ宣言しないと

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

ってなソースで func1 から func2呼び出せませんが 何か?


218 名前: デフォルトの名無しさん 投稿日: 02/03/09 14:52
>>216
GLOBALの時だけ、宣言するのですか?


219 名前: デフォルトの名無しさん 投稿日: 02/03/09 14:54
>>217

うーん?
でも実際にプロトタイプ宣言していないものがほとんどだよね?



220 名前: デフォルトの名無しさん 投稿日: 02/03/09 14:54
>>218
LOCALだとかGLOBALだとか一体なんの話をしているんだ?


221 名前: monosiri 投稿日: 02/03/09 14:55
ローカル関数
グローバル関数


222 名前: デフォルトの名無しさん 投稿日: 02/03/09 14:56
>>221
他のファイルから見えるか見えないかってことか?
それはstaticとexternだろ?


223 名前: デフォルトの名無しさん 投稿日: 02/03/09 15:02
>>219
普通はヘッダファイルでプロトタイプ宣言してるからでしょ。



224 名前: デフォルトの名無しさん 投稿日: 02/03/09 15:03
>>223
そのなかにもないし。
標準ライブラリくらいでしかみたことない。


225 名前: デフォルトの名無しさん 投稿日: 02/03/09 15:05
みんなはプロトタイプ宣言をしているの?



226 名前: デフォルトの名無しさん 投稿日: 02/03/09 15:08
プロトタイプ宣言したことないって…
ネタか? マジで入門者レベルなのか?
とりあえず相手にしないほうが良さそうだなぁ…


227 名前: 214 投稿日: 02/03/09 15:09
ネットから落としたサンプルソースに

LOCAL Sint16 e1_pl_search_bak = 0;

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

てな感じで、書いてあったんです。


228 名前: デフォルトの名無しさん 投稿日: 02/03/09 15:09
>>226
いや、俺はしているんだが・・・・
でもApacheとかゆうめいなソフトのソースを見るとないから迷っている。

俺が見落としているだけ?


229 名前: デフォルトの名無しさん 投稿日: 02/03/09 15:24
>>225
> みんなはプロトタイプ宣言をしているの?
1つのファイルのみでプログラムが構成されていて、
main関数を一番最後に書く場合、プロトタイプ宣言はしない。

が、そんなプログラムはあまり書かない。



230 名前: 214 投稿日: 02/03/09 15:24
なんかヘッダーファイルを一つ一つ見ていったら、
#define GLOBAL // 外部参照
#define LOCAL static // 内部参照

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

・・・・・・・・


231 名前: デフォルトの名無しさん 投稿日: 02/03/09 15:25
>>229
そうか。ありがとう。
じゃあこのままプロトタイプ宣言をし続けていいんですね・・・
正直迷っていたんで助かりました。


232 名前: デフォルトの名無しさん 投稿日: 02/03/09 15:34
>>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
コンパイル時に警告がでないか?



236 名前: デフォルトの名無しさん 投稿日: 02/03/09 16:12
>>233
ローカルで宣言した変数は内容が0に初期化される保証はない


237 名前: 近頃物忘れが激しい35歳 投稿日: 02/03/09 16:13

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

main()
{

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

どうぞ宜しく



238 名前: デフォルトの名無しさん 投稿日: 02/03/09 16:15
>>236
staticなら0に初期化されますがなにか?


239 名前: デフォルトの名無しさん 投稿日: 02/03/09 16:15
>234
void mystradv(char**s, intd)
じゃない?
配列を渡すと変なことになるけど


240 名前: デフォルトの名無しさん 投稿日: 02/03/09 16:16
>>238
ローカルに宣言した自動変数は0に初期化される保証はない。
これでどうだ


241 名前: デフォルトの名無しさん 投稿日: 02/03/09 16:17
>>240
OK!
というか普通はコンパイラが警告を出してくれるよな。どんなの使っているんだろうね。


242 名前: 近頃物忘れが激しい35歳 投稿日: 02/03/09 16:21
いえ、char* を渡したいんですわ。
*sをs[2]を指すようにしたいんですがな。
ん−−−


243 名前: デフォルトの名無しさん 投稿日: 02/03/09 16:23
>1
Cがいちばん経んかが少ない空な.単に経んかについていけなかっただけでは.LOL!


244 名前: デフォルトの名無しさん 投稿日: 02/03/09 16:25
警告メッセージを読まないからバカなんだよ。



245 名前: デフォルトの名無しさん 投稿日: 02/03/09 16:28
>>242
よく考えてみろよ。
char*s だと、s[0]へのポインタがコピー渡しされるわけだから、
そのポインタを書き換えることは不可能。
ポインタを書き換えたいならポインタへのポインタを渡せ


246 名前: 233 投稿日: 02/03/09 16:29
>>233 です。
 レス速いですね。 みなさん、ありがとうございます。
自動変数って
 int total = 0 , avr;   (>>233の五つ星のとこ)
 の「 avr 」もそうだと思うのですが、とりあえず結果がおかしければ
変数をゼロにしてて、いいのかな? 「 avr=0 」にしても、しなくても
結果は同じでした。

 て優香。あまりわかってないので、逝ってきます。
ありがとうございました。


247 名前: デフォルトの名無しさん 投稿日: 02/03/09 16:30
>>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
>>246×
>>245


250 名前: デフォルトの名無しさん 投稿日: 02/03/09 16:38
>>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です。


253 名前: デフォルトの名無しさん 投稿日: 02/03/09 16:44
無理だろ


254 名前: デフォルトの名無しさん 投稿日: 02/03/09 16:47
おまえおもろいな


255 名前: デフォルトの名無しさん 投稿日: 02/03/09 17:02
>>252
日本語はもとより、"←これも使えないぞ。


256 名前: デフォルトの名無しさん 投稿日: 02/03/09 17:21
>>248
あのさ、
*s++
ってさ、
*(s++)
ってことだよな。
こういう書き方は混乱するから単に
s++
でいいと思うが。(細かいトコだけど)


257 名前: デフォルトの名無しさん 投稿日: 02/03/09 17:26
>>256
イディオムだからいいじゃねーか


258 名前: 256 投稿日: 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);

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




263 名前: デフォルトの名無しさん 投稿日: 02/03/09 18:42
>>261
ポインタをずらしたい = ポインタを書き換えなければいけない
ポインタを書き換えるのに、ポインタのコピー渡しをしたら
いくら書き換えてもコピーが書き換えられるだけで元のポインタには一切影響がないから


264 名前: デフォルトの名無しさん 投稿日: 02/03/09 18:43
>>262
それじゃstrncpy(dest,src+3,4);でいいじゃねーか


265 名前: デフォルトの名無しさん 投稿日: 02/03/09 18:49
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?





266 名前: デフォルトの名無しさん 投稿日: 02/03/09 18:50
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にコピーができるのか理解不能なのだが。


268 名前: デフォルトの名無しさん 投稿日: 02/03/09 18:52
関数引数は、つまり、呼び出し元から渡されたパラメータの*コピー*だと覚えておこう。
引数そのものを編集しても、呼び出し元にいっさい影響はない。



269 名前: デフォルトの名無しさん 投稿日: 02/03/09 18:52
ご丁寧な説明だこった。


270 名前: プリオンが溜まりつつある35歳@src+3はきらいなんだが 投稿日: 02/03/09 18:56

投稿した後に立派な答えをありがとうございます。
しばし熟読してみますね。


271 名前: デフォルトの名無しさん 投稿日: 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)



272 名前: デフォルトの名無しさん 投稿日: 02/03/09 18:58
今まで、よく言われるようなポインタで引っかかるってことは
どういうことか想像もつかなかったんだが
こういうふうに引っかかるわけね。


273 名前: デフォルトの名無しさん 投稿日: 02/03/09 19:00
void mycopy(char *d,char *s,int n)
{
 for(;*s&&n>0;d++,s++,n--)
  *d = *s;
 *d = '\0';
}


274 名前: デフォルトの名無しさん 投稿日: 02/03/09 19:01
いろいろな目的でポインタが使われるのと、
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


276 名前: デフォルトの名無しさん 投稿日: 02/03/09 19:50
全然ダメだ



277 名前: 初心者@独学 投稿日: 02/03/09 19:51
ミス!
関数名は忘れてください。


278 名前: デフォルトの名無しさん 投稿日: 02/03/09 19:51
 超初心者です。 C言語の本に、よく「宣言」という言葉が
出てきますが、なじみがない表現なので違和感があります。
 わかりやすく言い換えると、どういう表現がいいのですか?


279 名前: デフォルトの名無しさん 投稿日: 02/03/09 19:52
>>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;
 }
}


280 名前: デフォルトの名無しさん 投稿日: 02/03/09 19:54
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でもたまたま動くし。



281 名前: デフォルトの名無しさん 投稿日: 02/03/09 19:56
う、なんか279のほうがカコイイ



282 名前: デフォルトの名無しさん 投稿日: 02/03/09 19:58
トークン切り出し って悩みどころだよね


283 名前: 初心者@独学 投稿日: 02/03/09 20:10
先生様方、ありがとうございます!

>>279
strstr()とmemset()がわからないのでK&R読み返してみます。
見た感じ凄いスマートで見やすいっすね!
>>280
ありがとうございます、試してみます!


284 名前: デフォルトの名無しさん 投稿日: 02/03/09 20:31
if(NULL)が常に成り立たたない保証ってある?


285 名前: デフォルトの名無しさん 投稿日: 02/03/09 20:34
NULLを再定義しない限りは保証はある。
NULLと0は同義だ。

変なCPUがあったとして、アセンブラ上とかで不正なポインタ(つまりNULL)に0以外のアドレス
0xa0000000 みたいなのを割り当ててたとしても、C言語上ではNULLポインタは常に 0 と等価だ。



286 名前: デフォルトの名無しさん 投稿日: 02/03/09 20:42
あなたの環境ではNULLはどのように定義されてますか?
一度手繰ってみると面白いよ。

ちなみにうちでは ((void*)0) だった。


287 名前: デフォルトの名無しさん 投稿日: 02/03/09 21:04
>>278
うーん、逆に聞きたいのですが、
「アメリカの独立宣言」の「宣言」を、わかりやすく
言い換えると、どういう表現がいいですか?


288 名前: デフォルトの名無しさん 投稿日: 02/03/09 21:06
>>285
漏れの感覚だと、NULLはint型じゃなくて、ポインタ型なんだよなぁ。
つまり、>>286がしっくりくる。


289 名前: 288 投稿日: 02/03/09 21:07
>>285
すまん。>>288は忘れてくれ。


290 名前: 投稿日: 02/03/09 21:19
ファイルをランダムな文字列で上書き(数回)してから削除したいのですが
何か良い方法はないですか?


291 名前: デフォルトの名無しさん 投稿日: 02/03/09 21:31
>>290
ランダムな文字列で上書きしてから削除してください


292 名前: デフォルトの名無しさん 投稿日: 02/03/09 22:22
バカだなあ。
どうせ最後に削除するんだから、書かずに消しちゃえばいいだろ。



293 名前: デフォルトの名無しさん 投稿日: 02/03/09 22:30
Cで書いたプログラムをアイコンをダブルクリックして起動できるアプリケーションに
するにはどうしたらいいんでしょうか?
VC++6.0スタンダードなんですが、そういうのはC++で書かないとできないんでしょうか?


294 名前: デフォルトの名無しさん 投稿日: 02/03/09 22:35
ダブルクリックして起動できないアプリケーションの作り方がしりたい…


295 名前: デフォルトの名無しさん 投稿日: 02/03/09 22:35
>>294
dllで作ってRunDll使って起動させるのは?


296 名前: デフォルトの名無しさん 投稿日: 02/03/09 22:39
>>295
なるへそ…
てーか、漏れは放置して293に回答解説してやって。
何かだるくて面倒だ。


297 名前: デフォルトの名無しさん 投稿日: 02/03/09 22:40
バカだなぁ。
ファイル消したって、中身は消えてないのになぁ。


298 名前: デフォルトの名無しさん 投稿日: 02/03/09 22:42
>>293

ビルドしたならEXEファイルができてるんじゃないのさ。


299 名前: デフォルトの名無しさん 投稿日: 02/03/09 22:48
system("dd if=/dev/random of=/dev/hda1");


300 名前: デフォルトの名無しさん 投稿日: 02/03/09 23:03
C++と違ってCではNULL==0は保証されていないんじゃなかった?



301 名前: デフォルトの名無しさん 投稿日: 02/03/09 23:07
>300
>>1のリンク先を読んだ事はありますか?


302 名前: NULL 投稿日: 02/03/09 23:10
なんでせっかくマクロ定義されているのにそれを使わないのか小時間問い詰めたい。


303 名前: プリオンが溜まりつつある35歳@src+3はきらいなんだが 投稿日: 02/03/09 23:44
どうも有り難う御座いました。みなさん。
皆さんがいなければ、膨大な調査時間を過ごすところでした。
これからも宜しくお願いいたします。


304 名前: デフォルトの名無しさん 投稿日: 02/03/09 23:47
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
日本語を出力とか、日本語で入力されている
文字列をファイルから読み込むとかって
どうすればいいのですか?


307 名前: デフォルトの名無しさん 投稿日: 02/03/10 03:08
>>306
日本語に対応してるOSだったら、標準入出力で日本語読み書き出来ると思うが?
文字単位で扱いたいなら、マルチバイト扱える関数に置き換える必要は有るけど。

具体的に今何が問題で、最終的に何がしたいのか、差し支えない範囲でも書けや。


308 名前: デフォルトの名無しさん 投稿日: 02/03/10 03:19
バカだなぁ。
ファイル上書きしたって、元のクラスタに書かれるとは限らないのに。


309 名前: デフォルトの名無しさん 投稿日: 02/03/10 04:01
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
(´Д`)ウワーン


312 名前: デフォルトの名無しさん 投稿日: 02/03/10 05:38
春だねぇ


313 名前: デフォルトの名無しさん 投稿日: 02/03/10 10:20
>>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先生の講義が始まったぞ!
みんな急げ!


317 名前: デフォルトの名無しさん 投稿日: 02/03/10 11:15
>>314
C言語としては何の規定もない。上書きされるかもしれないし別の場所に書き込まれるかもしれない。OSのファイルシステムドライバの動作に依る。


318 名前: 名無しさん@Emacs 投稿日: 02/03/10 11:25
>>1 のアヒル本を読んでいるのですが、サンプルコード ce4.c の main の中
の「オプション指定の解析のコード」のところに、

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

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

例えば引数で -w12345 と渡した場合、この部分に来たときは s は w の位置
を指しているんですが、このループを抜けた後に s は 5 の後の '\0' を指す
のでしょうか? でも引数が -w120345 のような場合、途中に 0 があるとそこ
で止まってしまう気がするし。



319 名前: デフォルトの名無しさん 投稿日: 02/03/10 11:28
>>314
1, ファイルを削除
2. そのドライブが一杯になるまでランダムな内容のファイルを生成
  char code;
  while (code = (char)rand(), fwrite(&code, 1, 1, fp)) ;
3. 生成したファイルも削除

かなり無茶かも知れないけど,これってどうですか?
つまり >>299 さんの方法と同じような物(っすよね?)なんだけど。


320 名前: デフォルトの名無しさん 投稿日: 02/03/10 11:30
>>318
つまり '0' と '\0' の違いが判らない、と?


321 名前: 318 投稿日: 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 */
}
}
}


322 名前: 318 投稿日: 02/03/10 11:39
>>320
その違いは分かっているつもりですが...

>>321 は -w[数字] という引数を処理するところなのですが、
while の部分はなくてもいいような気がするんですよね。というか何をしてい
るのかが分かっていないだけですが...



323 名前: デフォルトの名無しさん 投稿日: 02/03/10 11:41
>>318
while( (++s)[1] )
と同じだよん。ループを抜けたあと、sは"5"のアドレスを
指してる。あと、"-w120345" は
2d 77 31 32 30 33 34 35 00
なので、'0' == 0x30 だよん。


324 名前: デフォルトの名無しさん 投稿日: 02/03/10 11:50
書き方からみるに
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言語を勉強しようと思いますが
勉強できる定番サイトがあれば、教えてください。


326 名前: デフォルトの名無しさん 投稿日: 02/03/10 11:52
http://www.google.com


327 名前: 323 投稿日: 02/03/10 11:55
>>322
漏れの予想だと、for()ループを綺麗に抜けるための処理だと思う。

フラグ立てるのも嫌だし、strlen()使うほどでも無いと判断
したのでしょう。


328 名前: 318 投稿日: 02/03/10 11:55
>>323
なるほど、やっぱり '0' と '\0' が分かってなかったかもしれませんね。

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

まだよく分かってないのでもうちょっと考えてきます。


329 名前: 324 投稿日: 02/03/10 11:57
ごめん forの終了条件見てなかった。
>>327が正解だと思います。綺麗に抜けてるかどうかは別にして。


330 名前: デフォルトの名無しさん 投稿日: 02/03/10 12:00
>>319
ぬるい。
ぬるい。
ぬるい。
そのプログラム実行中に別プロセスがファイルを新規に作成して、
中身を書かずにファイルサイズのみを拡張した場合、以前書き込んだ内容が
保持される可能性がある。
かつ、その場合、>>319のプログラムではデータを書きつぶすことはできない。

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

どうしても消したければ物理的に破壊するか、ドライブの中身を
磁気的にクリアしてくれるツールを使え。



331 名前: デフォルトの名無しさん 投稿日: 02/03/10 12:02
>>321
初心者向け(だよね?)のコードにしては読みづらいね。
その本って評判いいの?


332 名前: デフォルトの名無しさん 投稿日: 02/03/10 12:05
作ってわかるCプログラミング
日下部 陽一
技術評論社
ISBN:477411328X

だそうです。著者名から推して知るべし、なのかも


333 名前: デフォルトの名無しさん 投稿日: 02/03/10 12:06
少なくともgetopt使ってない時点で萎える。



334 名前: 318 投稿日: 02/03/10 12:24
あ、コードの意味自体は分かってきました。
でも何のためにこういう書き方なのかがちょっと分からない。
-w[数字] 以外のオプションを加えるときに必要になるのかな。

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

どなたか暇な方いらっしゃったらお願いします。



335 名前: 318 投稿日: 02/03/10 12:29
>>331
>>332さんがおっしゃるように著者の評判は 2ch ではよくないようですね。
コードも難しめですが僕には読みごたえがあっておもしろいです。

>>1で薦められているので本自体の評判はいいのかなと思ったのですが。



336 名前: デフォルトの名無しさん 投稿日: 02/03/10 12:34
>>318
まあ買っちゃったものは仕方がないので
読み終えたらK&Rで口直しして
実用コード書くときはそのコード忘れてgetopt使えば問題ないよ。
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/getopt.3.html


337 名前: 323 投稿日: 02/03/10 12:38
>>334
ではでは、先のソースで、case 'w': でwidthをatoi()で取得した直後、
switchの外側のforループを抜けなければいけないとき、あなたならどう書きますか?


338 名前: デフォルトの名無しさん 投稿日: 02/03/10 12:47
そもそもforはいらない


339 名前: デフォルトの名無しさん 投稿日: 02/03/10 12:54
Exit For


340 名前: デフォルトの名無しさん 投稿日: 02/03/10 12:57
なんか 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 */
  }
 }
}


341 名前: デフォルトの名無しさん 投稿日: 02/03/10 13:00
  if( isdigit( *s ) )

  if( !isdigit( *s ) )
だな… 他にも間違ってそうな 鬱だ…



342 名前: デフォルトの名無しさん 投稿日: 02/03/10 13:01
糞コードまじめに解読すんなや>all
あっさり捨てて書き直せ。


343 名前: デフォルトの名無しさん 投稿日: 02/03/10 13:01
オブジェクトや、オブジェクト指向の意味が、調べても
意味がわからないのですが、猿でもわかる説明のできる方
よろしければ、教えてください。


344 名前: デフォルトの名無しさん 投稿日: 02/03/10 13:04
>>343
この板にオブジェクト指向のスレがいっぱいあるので、どこがいいのか
わかんないけど、そちらへどうぞ。


345 名前: 318 投稿日: 02/03/10 13:28
>>337
確かに strlen() じゃないと for ループ抜けられないですね。ちょっと考え
ていたんですがうまく動きませんでした。まだまだですね。
単純に s += strlen(++s); と入れてみたのですが。でもとにかく意味は分か
りました。ありがとうございます。

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

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

これ以上続けると荒れそうな雰囲気(?)なのであとは自分で勉強してきます。
みなさんありがとうございました。



346 名前: 343 投稿日: 02/03/10 13:31
>>344
そうなんですか!どうも、ありがとう!


347 名前: デフォルトの名無しさん 投稿日: 02/03/10 13:35
キャストについて質問です。

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

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

signed short に入れてから signed int に入れなおすより簡単で
実行時効率もいい解決方法はありますか?


348 名前: デフォルトの名無しさん 投稿日: 02/03/10 13:40
入れなくてもキャストすりゃあじゅうぶん。

unsigned short us;
signed int si;

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

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

si = (signed short)us;

アセンブラに落として見りゃあわかるけど、何十万回も繰り返すんじゃない限り
実行効率は大してかわらん。



349 名前: デフォルトの名無しさん 投稿日: 02/03/10 13:41
>>347
union _danger {
unsigned short us;
signed short ss;
};
に入れてみるという危険なかけをしてみる気はないかい?
なんとなくうまくいくようなきがする。


350 名前: デフォルトの名無しさん 投稿日: 02/03/10 13:42
大してかわらん、というのは

si = *(signed short *)&si;

と比べての話だ。

usがレジスタにマップされているとアドレス演算子が使えなくなるので、
348の方が若干速くなる可能性はあるな。



351 名前: デフォルトの名無しさん 投稿日: 02/03/10 13:44
共用体にしちゃうと、共用体をレジスタにマップできないコンパイラで効率落ちるよ。
可読性もがた落ち。
キャストしなさい。




352 名前: 349 投稿日: 02/03/10 13:50
>>351
うい。


353 名前: 347 投稿日: 02/03/10 13:55
あ、そうか、その場でキャストすればよかったんですね。
できました。ありがとうございました。


354 名前: デフォルトの名無しさん 投稿日: 02/03/10 14:19
引数と変数って、どう違うのですか?


355 名前: デフォルトの名無しさん 投稿日: 02/03/10 14:27
関数を呼ぶ側から見たとき、関数に渡すパラメータを引数と言います。
呼ばれた側では、関数に渡されたパラメータのコピーを受け取ります。これを引数といいます。

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

int a;

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

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

ということになります。

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

int func(int a, int b);

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

このほかに可変長引数というのがありますが、
貴様にはまだ早いので割愛させていただきます。



356 名前: 354 投稿日: 02/03/10 14:42
>>355 ご丁寧にありがとう! 


357 名前: デフォルトの名無しさん 投稿日: 02/03/10 15:19
>>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その他にあった質問ですが
このあとどのようにすれば関数を呼べるでしょうか?


359 名前: デフォルトの名無しさん 投稿日: 02/03/10 15:37
C++Builder 5 を使ってるんですがCGI作る時はどうすれば良いんでしょうか?
CでCGI作るってサイトには% gcc -o hello-world.cgi hello-world.cでコンパイラするって書いてあるけど、自動でコンパイラするのでできません。
Cの質問って言うかBuildeの使い方の質問かもしてないけど・・・


360 名前: デフォルトの名無しさん 投稿日: 02/03/10 15:38
gccではなくbcc32を使う


361 名前: デフォルトの名無しさん 投稿日: 02/03/10 15:39
本当にCでCGI作る必要があるのかと小一時間


362 名前: デフォルトの名無しさん 投稿日: 02/03/10 15:39
>>358
(*symtab[0].funcptrX)();
かねぇ?


363 名前: デフォルトの名無しさん 投稿日: 02/03/10 15:41
>>359
パールで作れ


364 名前: デフォルトの名無しさん 投稿日: 02/03/10 15:47
コンパイラする
自動でコンパイラする


>>359はローカル(win)でコンパイルしたバイナリを
web鯖(unix系)で動かそうとしてるとか。
多分ソースをうpしてからtelnetでログインして
gcc でコンパイルって話なんだろう。ホントは。


365 名前: デフォルトの名無しさん 投稿日: 02/03/10 15:54
>362 出来ました。 サンクスです。


366 名前: デフォルトの名無しさん 投稿日: 02/03/10 15:55
>>359
http://tohoho.wakusei.ne.jp/lng/199910/99100377.htm
こういう事か?


367 名前: 359 投稿日: 02/03/10 16:13
>>366
できました、ありがとうございました。

説明不足の上に勉強不足でした。
吊って来ます。


368 名前: デフォルトの名無しさん 投稿日: 02/03/10 16:14
>>359
どうもこうもない。
ソースプログラムを書いてコンパイル。ウェブサーバーを立ち上げてからブラウザでアクセス。

ただし、最低限必要なヘッダーを出力しないとエラーになる。


369 名前: デフォルトの名無しさん 投稿日: 02/03/10 16:15
ププッ
ヴァーカ


370 名前: ビル・ジョブス 投稿日: 02/03/10 20:05
みなさん、単項+演算子活用してますか?
さー知らないやつは勉強勉強!



371 名前: デフォルトの名無しさん 投稿日: 02/03/10 20:09
>>370
はいはい、知らなかった事を知って嬉しいのは分かったから。
厨はおとなしく飯食って寝てろ。


372 名前: デフォルトの名無しさん 投稿日: 02/03/10 20:15
んなもんつかわねーよばーか


373 名前: デフォルトの名無しさん 投稿日: 02/03/10 20:16
いや全然一度も使ったことないがここ10年で不自由したことはないぞ



374 名前: デフォルトの名無しさん 投稿日: 02/03/10 20:21
セクタ指定して豪快に塗りつぶせばいいんじゃないでしょうか。
というか、そういうの昔書いたような。
あれってもしかして金になるコードだったのか?


375 名前: デフォルトの名無しさん 投稿日: 02/03/10 20:25
>>374
?????


376 名前: デフォルトの名無しさん 投稿日: 02/03/10 20:25
WinならNT環境でも使えて信頼性が保証されているなら金になるんじゃない?


377 名前: 投稿日: 02/03/10 22:35
>>290 & >>314です。

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

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

ホントに、なにかうまい手はないですか?


378 名前: デフォルトの名無しさん 投稿日: 02/03/10 22:56
>>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の兄です。
弟がお世話になっております


383 名前: デフォルトの名無しさん 投稿日: 02/03/11 00:07
>>381
俺は学生だよばーか


384 名前: ビル・ボブス ◆ZMVdytmo 投稿日: 02/03/11 00:11
>>383弟には構わないでやってください。
猿にエサを与えると勘違いしますから。


385 名前: デフォルトの名無しさん 投稿日: 02/03/11 00:13
>>384
餌付けしてもいいじゃねーかよばーか


386 名前: デフォルトの名無しさん 投稿日: 02/03/11 00:15
>>381
int a = +1.1;
int b = 1.1;

どちらも暗黙の型変換が適用されて1が入るんだけど


387 名前: デフォルトの名無しさん 投稿日: 02/03/11 00:17
>>386
ポインタにってことじゃないか?
char*a=+0;


388 名前: デフォルトの名無しさん 投稿日: 02/03/11 00:37
>>387
それでも同様ですよね?
>>381の言っているのの具体例がしりたいなぁ。
どっかの変なページからの知識の受け売りなのかな?


389 名前: デフォルトの名無しさん 投稿日: 02/03/11 00:43
>>388
奴の妄想につき合うこたぁないよ。


390 名前: デフォルトの名無しさん 投稿日: 02/03/11 00:47
妄想とはいかがなものか。


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
あーそーか、おれが悪かったよ。
でも「ばーか」は止めとけよ君自身に言ってるみたいだから。


393 名前: デフォルトの名無しさん 投稿日: 02/03/11 01:11
近年稀に見る糞コードで砂


394 名前: デフォルトの名無しさん 投稿日: 02/03/11 01:13
>>392
おいおい。
それは - を単項で使うのと同じく正数であるということを
明示してるわけでしょ。
それって>>381の言い方じゃ伝わらないよ。
用語はただしく使ってくれない?


395 名前: デフォルトの名無しさん 投稿日: 02/03/11 01:18
無知なのが明らかに・・・


396 名前: デフォルトの名無しさん 投稿日: 02/03/11 01:21
符号拡張されないだけで、型変換は暗黙的に行われていると思われ。


397 名前: デフォルトの名無しさん 投稿日: 02/03/11 01:21
さらに言うと、バカばっかのプロジェクトでそういう書き方をすると
致命的な誤解を生むことが結構あるので
なるべくそういう表記は避けるのが通例。
大抵の場合、そんな書き方しなくてもかけるし
しないほうがいい場合の方が多いし


398 名前: デフォルトの名無しさん 投稿日: 02/03/11 01:22
>>396
どちらかというと、「拡張」もしてないよね。


399 名前: デフォルトの名無しさん 投稿日: 02/03/11 01:24
もうすぐだ・・・


400 名前: 400! 投稿日: 02/03/11 01:25
今だ!400げっとーー


401 名前: デフォルトの名無しさん 投稿日: 02/03/11 01:28
>>361
ときに必要は発生するとおもうよ。
主に処理速度が要求されるときとか
もっと変なことしたいときとか


402 名前: デフォルトの名無しさん 投稿日: 02/03/11 01:36
>>392
こいつ複数人のプロジェクトやったことなさそうだな...


403 名前: デフォルトの名無しさん 投稿日: 02/03/11 01:39
392のコードはいかがなものか。


404 名前: デフォルトの名無しさん 投稿日: 02/03/11 01:48
格上げ時に符号拡張するかどうかは処理系規定じゃなかった?

なお、実際に>>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
アイタタ・・・
晒しあげ


407 名前: デフォルトの名無しさん 投稿日: 02/03/11 02:22
#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抑えておかないとダメですか?
明らかに誤りですが。
このスレも実は知ったかが多いのか?


408 名前: デフォルトの名無しさん 投稿日: 02/03/11 02:27
>407
たんに自分で追試するココロが失われているだけでわ?


409 名前: デフォルトの名無しさん 投稿日: 02/03/11 02:47
つーかみんなビル・ジョブスのネタに踊らされてるだけでは・・・
奴がまともなレス付けてるの見たことないよ。


410 名前: ハンチク 投稿日: 02/03/11 10:17
仕事暇なんで読んでたけど、このスレ結構おもしろい。(・・いや・・いろんな意味で・・)

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

胃の中の蛙だったのかな〜(汗


411 名前: デフォルトの名無しさん 投稿日: 02/03/11 11:03
本読んでたら、
fprintf(stderr, "--more--", stderr);
こんなのがあったんですけど、後ろの stderr はどういうこと?
普通にコンパイルもできて、エラーにはならないんだけど。

間違いかなと思って web で正誤表見たんだけどその部分の訂正はなかった。


412 名前: デフォルトの名無しさん 投稿日: 02/03/11 11:19
>>411
後ろの stderr は消し忘れだろうに1票。
gcc で -Wall を付けてコンパイルすると warning を出してくれるぞ。


413 名前: 411 投稿日: 02/03/11 11:38
>>412
warning: too many arguments for format
なるほど、↑のように出ました。ありがとう。
;; それにしてもダメ本だなぁ。


414 名前: デフォルトの名無しさん 投稿日: 02/03/11 11:41
>>413
なんて本よ?


415 名前: デフォルトの名無しさん 投稿日: 02/03/11 11:45
>>318=>>411
なんですが、上でも書いたアヒル本です。
>>332の本ですね。

ちなみにサンプルコードの page2.c にありました。



416 名前: デフォルトの名無しさん 投稿日: 02/03/11 11:54
さすがスーパーハイソサエティーハッカーの本だな



417 名前: デフォルトの名無しさん 投稿日: 02/03/11 13:25
>>411
コンパイル時にも実行時にもエラーが出なければ文脈上の誤りがあってもかまわないという見本です。


418 名前: 411 投稿日: 02/03/11 14:04
でも実はこの前に読んだ本はもっとダメだったんですが。
簡単なエディタの作り方が載っていたんですが、その仕様がヘボヘボで...
アヒルさんの本は結構いいなぁとか思いながら読んでたんですが...
だめプログラマ街道まっしぐらですか?もしかして(w


419 名前: デフォルトの名無しさん 投稿日: 02/03/11 14:25
>>418
なんて本よ?


420 名前: デフォルトの名無しさん 投稿日: 02/03/11 14:31
>>419
>>415 読め


421 名前: 419 投稿日: 02/03/11 14:46
>>420
アヒル本の前に読んだ本はなにかと聞いているんだ。
日本語大丈夫か?


422 名前: 411 投稿日: 02/03/11 14:50
>>420は僕じゃないですよ。一応。

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

これも読んでて分からなかったところとか最近 2ch で質問しにきたんですけ
ど。誤植も多いし、たぶんアヒルさんのより変なコードが多いと思います。



423 名前: デフォルトの名無しさん 投稿日: 02/03/11 15:02
音痴な歌を聴くと音痴になるということはない。
そのへん人間はうまく出来ているものだ。
だめ本読んだからって、だめプログラマになることはないだろう。


424 名前: デフォルトの名無しさん 投稿日: 02/03/11 15:07
質問です。

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

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

Appendの逆のようなことは可能でしょうか?


425 名前: デフォルトの名無しさん 投稿日: 02/03/11 15:11
>>423
C言語の知識は音感と違って生まれつき備わってるようなものではない


426 名前: デフォルトの名無しさん 投稿日: 02/03/11 15:13
>>424
移植性のある方法は思い付かないが
たいていの処理系にはchsize()か_chsize()という関数があると思われ


427 名前: デフォルトの名無しさん 投稿日: 02/03/11 15:15
UNIXならtruncate(), ftruncate()だね



428 名前: デフォルトの名無しさん 投稿日: 02/03/11 15:16
>424
truncateすれ。


429 名前: デフォルトの名無しさん 投稿日: 02/03/11 15:16
はげしくカブタな……


430 名前: デフォルトの名無しさん 投稿日: 02/03/11 15:31
 初心者で勉強中ですが、C言語の初心者のサイトを見ていても
「ここを説明してほいのに〜!」と、思うことがあります。

 プログラムの説明で、うざいほどコメントで解説しているサイトが
あったら教えてください。


431 名前: デフォルトの名無しさん 投稿日: 02/03/11 15:36
>>430
ない。
この板で教えて君になれ。


432 名前: デフォルトの名無しさん 投稿日: 02/03/11 15:37
fseek()でtruncate出来ると思ってた。
鬱だ...


433 名前: デフォルトの名無しさん 投稿日: 02/03/11 15:38
424です。
皆様ありがとうございました。
Cの標準的機能では出来ないと言う事ですね。

紹介された関数を使うことにいたします。


434 名前: デフォルトの名無しさん 投稿日: 02/03/11 15:40
標準ライブラリはCの機能の内に入るのだろうか。
どうでもいいけど。


435 名前: デフォルトの名無しさん 投稿日: 02/03/11 15:44
void main(void)

main()
はどう違うのでしょうか?


436 名前: デフォルトの名無しさん 投稿日: 02/03/11 15:46
戻り値がちがいます。
ちなみにvoid mainなどとかくのはDQNだけです。


437 名前: デフォルトの名無しさん 投稿日: 02/03/11 15:47
main()

int main(void)
と等価だろう。


438 名前: 435 投稿日: 02/03/11 15:50
int main(void)

void main(void)
は等価ではないのですか?


439 名前: デフォルトの名無しさん 投稿日: 02/03/11 15:51
C99 から >>437 は保証されない、んでしたっけ?


440 名前: デフォルトの名無しさん 投稿日: 02/03/11 15:53
処理系では void main(void) しか許してないのもある。

閉鎖的ともDQNとも言われようと甘んじて受け入れよう。
あるったら、あるのだ。


441 名前: デフォルトの名無しさん 投稿日: 02/03/11 15:57
>>438
>戻り値がちがいます。




442 名前: デフォルトの名無しさん 投稿日: 02/03/11 15:59
>>438
voidとintの違いが分からないのか?

>>440
普通に考えれば「void mainしか許していない処理系を除いて
void mainとかくのはDQN」という意味だろう。
一般的な処理系でvoid mainと書くのは受け入れられません。


443 名前: デフォルトの名無しさん 投稿日: 02/03/11 15:59
>>440
何ていう処理系よ?


444 名前: 438 投稿日: 02/03/11 15:59
皆さん、ありがとうございます。
>>441
戻り値と、返り値って、具体的にどう違うのですか?



445 名前: デフォルトの名無しさん 投稿日: 02/03/11 16:01
「返りち」はグサッとやったときにかぶるやつだな。


446 名前: 438 投稿日: 02/03/11 16:01
>>442
>voidとintの違いが分からないのか?
 どうも、ありがとうございます。
 intはわかります。voidはわかりません。
voidって、整数ですか?文字ですか?



447 名前: デフォルトの名無しさん 投稿日: 02/03/11 16:04
voidはスーパーハイソサエティーハッカーのことだな。


448 名前: デフォルトの名無しさん 投稿日: 02/03/11 16:08
プログラムの最後の方によく
return(1);

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




449 名前: デフォルトの名無しさん 投稿日: 02/03/11 16:09
>>446
うむ、プログラミング初心者ってところか、手持ちの本かヘルプ見てみ。


450 名前: デフォルトの名無しさん 投稿日: 02/03/11 16:10
>>448
OSだったりShellだったり。
環境によって違う


451 名前: デフォルトの名無しさん 投稿日: 02/03/11 16:11
戻り値と、返り値は同じだろう。
voidは「空虚」だ。
 void hoge(void)
なら hoge は何も返さないし、引数も無し。


452 名前: デフォルトの名無しさん 投稿日: 02/03/11 16:11
>>448
かなりの確率でシェルに返される。


453 名前: デフォルトの名無しさん 投稿日: 02/03/11 16:19
このスレの盛況振りを見ると、やっぱりなんだ
かんだ言ってもCって人気あるねぇ・・・


454 名前: デフォルトの名無しさん 投稿日: 02/03/11 16:21
return(1);
みたいに ( ) を付けるのは古くからやってる人だろうか?
漏れは面倒だから括弧は一再付けない。
return 1;


455 名前: 448 投稿日: 02/03/11 16:21
>>450
 ありがとうございます。
 
 シェルって、Linuxによくでてくる「カーネルとシェル」のシェルですか?
シェルに、return (1); を返すと具体的にどうなるのですか? 

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

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

 void main(void) は、「メイン関数がとりあえずありますよ」
ということでよろしいのでしょうか?


456 名前: デフォルトの名無しさん 投稿日: 02/03/11 16:27
>>455
> void main(void) は、「メイン関数がとりあえずありますよ」
> ということでよろしいのでしょうか?
ダメ、mainはintにすると決まっている。
特に理由が無い限りint main(・・・)にしなさい。


457 名前: デフォルトの名無しさん 投稿日: 02/03/11 16:40
>>455
UNIXやDOS(窓)では0が正常終了と決まっている。
バッチファイルやシェルスクリプトでそのぷろぐらむを起動した場合は
その値を使って条件分岐などできる。



458 名前: デフォルトの名無しさん 投稿日: 02/03/11 16:43
1さん、もうそろそろ
まとめて欲しいなぁ、と言ってみるテスト


459 名前: 1 投稿日: 02/03/11 16:57
>>458
お前がまとめろ


460 名前: 448 投稿日: 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から戻ってくるまで次の処理に進みませんし・・・。


462 名前: デフォルトの名無しさん 投稿日: 02/03/11 17:23
>>461
あるキーが押されたら云々・・・ という処理は別プロセスにやらせて
メイン処理中ではそいつからのシグナルを受け取って もひゃ!


463 名前: デフォルトの名無しさん 投稿日: 02/03/11 17:24
パラメータはどっから持ってくるん?


464 名前: デフォルトの名無しさん 投稿日: 02/03/11 17:27
キー入力は標準入力からとるとして
非カノニカルな動作をするように設定すればいいだけじゃないか

と言ってみたいが環境依存だし。どこで動かすものか判らんことには


465 名前: デフォルトの名無しさん 投稿日: 02/03/11 17:54
ANSIには処理系にキーボード自体が必要だなんて仕様がどこにも無いんだからしょうがないじゃん。
その割には、思いっきり割り込み制御の仕様があったりするけど。


466 名前: 461 投稿日: 02/03/11 18:05
>>464
Solarisのコンソールで動けば良いんですが。
言われたことをキーにして調べてみましたが、
<termios.h>あたりの関数を使えばできるんですかね?


467 名前: デフォルトの名無しさん 投稿日: 02/03/11 18:38
>>466
はい、そのとおりだす。


468 名前: デフォルトの名無しさん 投稿日: 02/03/11 23:36
void foo()
で虚無を返す関数か・・・
0個のファイルが見つかりました並に不自然だな


469 名前: デフォルトの名無しさん 投稿日: 02/03/11 23:41
>>468
言うなYO・・・


470 名前: ビル・ジョブス 投稿日: 02/03/11 23:43
>>おれに文句のあるヤツラへ

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

おまえらおれの建てたスレで何様のつもりだよ・・・
とりあえず、おれに文句のあるやつはもう来るな!



471 名前: デフォルトの名無しさん 投稿日: 02/03/11 23:58
>>470
(・∀・) バーカ


472 名前: ビル・ジョブス 投稿日: 02/03/11 23:59
>>471 よく逝った(パチパチ


473 名前: デフォルトの名無しさん 投稿日: 02/03/12 00:20
>>470
まぁまぁ、そう熱くなりなさんな。
そもそも自分で良いコード書ける人は、わざわざ糞とか言わず、黙ってコードで
書いてくる。
つまり、他人のコードを糞コードとか言う奴のスキルは知れているってことで。


474 名前: デフォルトの名無しさん 投稿日: 02/03/12 00:24
何故、ム板のコテハンは痛いヤシばかりなのか…


475 名前: デフォルトの名無しさん 投稿日: 02/03/12 00:33
痛くないコテハンのいる板ってどこ・・・


476 名前: 痛くない 投稿日: 02/03/12 00:34
よんだ?


477 名前: デフォルトの名無しさん 投稿日: 02/03/12 00:35
寒っ!!


478 名前: 475 投稿日: 02/03/12 00:36
>>476
ワラタ・・・


479 名前: デフォルトの名無しさん 投稿日: 02/03/12 00:39
チクショー!藁っちまった・・・
漏れも歳かな


480 名前: デフォルトの名無しさん 投稿日: 02/03/12 00:53
>>470
もっと藁わせて下さい。
おながいします


481 名前: デフォルトの名無しさん 投稿日: 02/03/12 02:03
英語で No file was found. (であってる?) っていうのは普通に言いそう
ですけどね。って C とは全然関係ないけど。


482 名前: デフォルトの名無しさん 投稿日: 02/03/12 02:08
no such files. じゃないの?
was foundなんてまわりくどいってば


483 名前: デフォルトの名無しさん 投稿日: 02/03/12 05:01
>>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
だめだこりゃ。


488 名前: デフォルトの名無しさん 投稿日: 02/03/12 06:01
似たようなAPIなら
Path〜系のAPIが標準であるよ。
IE4以上だった気もするけど


489 名前: デフォルトの名無しさん 投稿日: 02/03/12 11:06
Windowsなら_splitpath()がよろしいかと。
UNIX系(XPG準拠?)OSなら、basename()やdirname()とか。


490 名前: デフォルトの名無しさん 投稿日: 02/03/12 11:25
C言語のプログラムがとても読みづらいんです。
日本語翻訳ソフトはありませんか?


491 名前: デフォルトの名無しさん 投稿日: 02/03/12 12:26
>>490
こんなふうにしたら読みやすいのか?


#読込<標準入出.頭>

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


492 名前: デフォルトの名無しさん 投稿日: 02/03/12 12:45
("今日は,皆さん\n")

(「今日は、皆さん。¥行」)


493 名前: デフォルトの名無しさん 投稿日: 02/03/12 13:19
>491 う〜ん30点

六行目で不正な書式が発見されました。
  行末処理が行われていません。



494 名前: 491 投稿日: 02/03/12 13:21
鬱だ...


495 名前: デフォルトの名無しさん 投稿日: 02/03/12 13:30
>>490
#define しまくって日本語かすれ


496 名前: デフォルトの名無しさん 投稿日: 02/03/12 15:50
10進表記の数字を16進表記にしたいのですが
どうしたらいいのですか?


497 名前: デフォルトの名無しさん 投稿日: 02/03/12 15:54
>496
printf("%x", i);


498 名前: デフォルトの名無しさん 投稿日: 02/03/12 15:59
>496
すいません。ありがとうございました。
int nTarget = 1234;
char strResult[30];

_itoa( nTarget, strResult, 16 );

こんな感じでもやってみました。


499 名前: デフォルトの名無しさん 投稿日: 02/03/12 16:39
>>490
コーディングスタイルやマクロの利用度にもよるが、
読みなれればなんてことはない。
よく出来たライブラリのソースを読むと良いと思う。


500 名前: デフォルトの名無しさん 投稿日: 02/03/12 16:46
よく出来たライブラリのソースキボン


501 名前: デフォルトの名無しさん 投稿日: 02/03/12 16:57
>>500
libpng



502 名前: デフォルトの名無しさん 投稿日: 02/03/12 16:59
>>501
サンクス
ホカニハ?>ALL


503 名前: デフォルトの名無しさん 投稿日: 02/03/12 17:24
C で正規表現使うにはどうしたらいいですか?


504 名前: デフォルトの名無しさん 投稿日: 02/03/12 17:30
>>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>

 になるのでしょうか? ちょと怖くてやってませんが・・


507 名前: デフォルトの名無しさん 投稿日: 02/03/12 18:47
>>506
includeという単語を辞書で引くと良いかと思います。
とりあえず英語です。
muneoにすると問題が発生します。


508 名前: デフォルトの名無しさん 投稿日: 02/03/12 18:49
>>506=ムルアカ


509 名前: デフォルトの名無しさん 投稿日: 02/03/12 18:50
コンパイラの検索パスに muneoをいれればOK。全然問題なし。




510 名前: 506 投稿日: 02/03/12 18:54
皆さん、ありがとう!
#include <stdio.h>
が気になってたので、助かりました。m(__)m


511 名前: デフォルトの名無しさん 投稿日: 02/03/12 19:13
純粋に言うと C の問題ではなくてロジックの問題な気がするのですが
論理演算に関する質問です。

unsigned char 一つを 8 つのフラグとして使っています。
そのうち一つだけを変更したいのですが、今は立てる場合とおろす場合で
if で処理しています。
これを論理演算だけでやりたいと思って、さっきから考えているのですが、どうしてもうまくいきません。
imp を使うとよさそうな気がするのですが、もうまったくもってお手上げです。
どうやったらいいでしょうか?


512 名前: デフォルトの名無しさん 投稿日: 02/03/12 19:19
>>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
って、おれが間違ってるみたいじゃん。
おれ逝って良し!


515 名前: 511 投稿日: 02/03/12 19:35
>>512
ありがとうございます。でも分岐したくないんです。

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

よろしくお願いします。


516 名前: ぼくフェロー 投稿日: 02/03/12 19:38
perl についてお尋ねしたいことがあるのですけど,
どの掲示板で聞いたらよいでしょか?


517 名前: デフォルトの名無しさん 投稿日: 02/03/12 19:46
>>515
>>512であってんじゃん?
if()の中身だけ使えばいいわけだ。
((a>>x)&1)

でも俺なら迷わずビットフィールド使う。
http://www.pro.or.jp/~fuji/mybooks/cdiag/cdiag.6.4.html


518 名前: デフォルトの名無しさん 投稿日: 02/03/12 19:46
>>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そのものと共用体にしたとき
エンディアンはどう扱われるのか とても疑問

バリバリの環境依存なのか、それとも定義があるのか


522 名前: デフォルトの名無しさん 投稿日: 02/03/12 20:05
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
ダメとは言ってないがイイとも言ってねーし。
はみ出なきゃ何してもいいよ。


524 名前: デフォルトの名無しさん 投稿日: 02/03/12 20:34
>>522
俺的にはアウト。あくまで俺的。


525 名前: デフォルトの名無しさん 投稿日: 02/03/12 20:49
>>521
環境依存。
おもいっきりK&Rに書いてある


526 名前: デフォルトの名無しさん 投稿日: 02/03/12 20:50
>>525
サンクス!

蟹炒飯は会社に置きっぱなしでさ。助かったよ。


527 名前: 522 投稿日: 02/03/12 21:14
>>523,524
微妙ですね。
あんまりやらないようにします。
(アセンブラだったらやりそうだけど)


528 名前: デフォルトの名無しさん 投稿日: 02/03/12 21:18
最初にvoid main(void)と言い出したのは誰なんですか?


529 名前: デフォルトの名無しさん 投稿日: 02/03/12 21:28
MSDNライブラリのプログラム例もvoid main(void)なんだよな。


530 名前: デフォルトの名無しさん 投稿日: 02/03/12 21:43
>>528
両端のvoidは通常の関数定義とも共通だからいいとして、
mainが最初に実行される、っていうのは、Cの言語規則に含まれるのでは?


531 名前: デフォルトの名無しさん 投稿日: 02/03/12 22:00
>>530
main の返り値は int だろ(゚Д゚)ゴルァっていう話じゃないの?


532 名前: デフォルトの名無しさん 投稿日: 02/03/12 22:29
int c;
c = getchar( );

 は何を意味するのでしょうか?


533 名前: デフォルトの名無しさん 投稿日: 02/03/12 22:31
本を嫁


534 名前: デフォルトの名無しさん 投稿日: 02/03/12 22:32
>>533
読むわけにはい家内


535 名前: デフォルトの名無しさん 投稿日: 02/03/12 22:38
>>515
ひょっとして、ビットが立っていたら落とす、落ちていたら立てるってことがやりたいの?
もしかしたら ^ の出番ですか?


536 名前: デフォルトの名無しさん 投稿日: 02/03/12 22:39
>>534
標準入力から一文字読んでcに格納。


537 名前: 534 投稿日: 02/03/12 22:53
>>536
a ri ga to


538 名前: デフォルトの名無しさん 投稿日: 02/03/12 23:26
>>535
すると
flags ^ (flags & (1<<n))
こうか。


539 名前: デフォルトの名無しさん 投稿日: 02/03/12 23:28
flags ^= (1<<n)


540 名前: デフォルトの名無しさん 投稿日: 02/03/12 23:31
統計によるとvoid mainと書いたりmallocしてもfreeしない
プログラマの給与は平均より約100万円ほど低いそうだ。


541 名前: 538 投稿日: 02/03/12 23:34
うぎょ、違う。>>539氏のが正しいや。


542 名前: デフォルトの名無しさん 投稿日: 02/03/12 23:45
>>540
> mallocしてもfreeしない
またですか…


543 名前: デフォルトの名無しさん 投稿日: 02/03/12 23:46
またですな


544 名前: DSPプログラマ 投稿日: 02/03/12 23:46
>>540
void mainと書いていますが何か?


545 名前: デフォルトの名無しさん 投稿日: 02/03/12 23:53
void main() と int main()は
どちらの方が、いいのでしょうか?
好みとかですか?
教えてください。


546 名前: デフォルトの名無しさん 投稿日: 02/03/12 23:53
そーいやなんで C には ^^ 演算子が無いんだ?


547 名前: デフォルトの名無しさん 投稿日: 02/03/12 23:54
>>545
その環境による。
どっちでもいい場合もあるだろうし、必ず int でなければならない事も。


548 名前: デフォルトの名無しさん 投稿日: 02/03/12 23:56
mallocしてもfreeしないのってありですよね。
プログラムなんてたいてい一瞬で終わってしまうし、
今時メモリなんて500−1000メガ当たり前ですし。
実害なんてありませんよね?
その上コードの工数まで減って言うことなしですね。


549 名前: 545 投稿日: 02/03/12 23:57
必ずintでなければならない時ってどんな時ですか?
あと、逆に必ずvoidでなければならない時って
あるんですか?
教えてください


550 名前: デフォルトの名無しさん 投稿日: 02/03/12 23:59
>>548
んじゃ、freeは絶対に使わないで下さい。
貴方の書いたプログラムは誰にも使われることがありませんから


551 名前: デフォルトの名無しさん 投稿日: 02/03/13 00:00
>>549
ふつうは規格上かならずint。
voidなのは組み込みでシングルタスクだったり、
値を返す対象が居ない環境限定。


552 名前: デフォルトの名無しさん 投稿日: 02/03/13 00:01
>>549
> 必ずintでなければならない時ってどんな時ですか?
ANSI C hosted environment 準拠の処理系を使うとき。

> あと、逆に必ずvoidでなければならない時ってあるんですか?
組み込み系だと、そもそもエントリポイントが main とは限らないし、名前が main
でも void と指定されてるかもしれない。


553 名前: デフォルトの名無しさん 投稿日: 02/03/13 00:05
普通とかかならずとか絶対とかかもしれない
とかいってる人々は現場を知らない人です。


554 名前: 545 投稿日: 02/03/13 00:05
>>551 ありがとうございます。
これからは、intを使うことにします。



555 名前: デフォルトの名無しさん 投稿日: 02/03/13 00:07
処理系に依存しないsizeofの型を教えてください。
すくなくとも
sizeof(char)==1
ですよね。


556 名前: デフォルトの名無しさん 投稿日: 02/03/13 00:08
違うよ。C99かC#使え


557 名前: デフォルトの名無しさん 投稿日: 02/03/13 00:08
sizeof(int32_t)==4


558 名前: デフォルトの名無しさん 投稿日: 02/03/13 00:09
>>555
はっはっは。それはどうかな。


559 名前: 545 投稿日: 02/03/13 00:09
皆さん、返事を沢山ありがとうございます。
気になっていたので、すっきりしました。



560 名前: 555 投稿日: 02/03/13 00:12
処理系に依存しないsizeofなんてないってことですか?


561 名前: デフォルトの名無しさん 投稿日: 02/03/13 00:12
環境に依存するsizeofなんてありませんが?


562 名前: デフォルトの名無しさん 投稿日: 02/03/13 00:13
sizeof(char) == 1は保証されているのでは。

>>556
>>558
すまんが解説きぼん。


563 名前: デフォルトの名無しさん 投稿日: 02/03/13 00:14
漏れも562に賛成


564 名前: デフォルトの名無しさん 投稿日: 02/03/13 00:17
>>562
ANSI 準拠という処理系に依存してるんでは?


565 名前: デフォルトの名無しさん 投稿日: 02/03/13 00:25
それ言い出すと切りが無くねぇ?
C言語の枠からもはみ出しそうだ。
C#とか逝ってるアフォもいるし…


566 名前: デフォルトの名無しさん 投稿日: 02/03/13 00:28
>>565
はげどう。


567 名前: デフォルトの名無しさん 投稿日: 02/03/13 00:39
サイズを決め打ちしないで、ちゃんとsizeofで判断するコードを書きなさいってこった。
sizeof(int)==1の処理系使った事有るし。
charもdoubleも全部1。


568 名前: わけわからん 投稿日: 02/03/13 00:40
char ふつう8ビット
short ふつう16ビット
int 今時なら32ビット
long ふつう32ビット

まああれだ。厳格にはlimits.hを見なきゃだめってことだ


569 名前: 555 投稿日: 02/03/13 00:43
sizeof(char)は1でいいとして。

sizeof(0)==sizeof(int) はあってますか?
また、sizeof(void*)と等しくなることが保証されてる
sizeofってありますか?


570 名前: デフォルトの名無しさん 投稿日: 02/03/13 00:43
>>568
ふつう==移植の落とし穴、と心得よ。


571 名前: デフォルトの名無しさん 投稿日: 02/03/13 00:47
>>569
なぜ規格書をチェックしない?


572 名前: デフォルトの名無しさん 投稿日: 02/03/13 00:49
sizeof(void*)についてはどのポインタも格納できるサイズということしか
規定されてないからな


573 名前: 511 投稿日: 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 で分けて処理しているんですが…。




574 名前: デフォルトの名無しさん 投稿日: 02/03/13 00:53
>>569
あんた様はいったいなにをしたいのか?
処理系に依存しないためにsizeof()使うんじゃないの?


575 名前: デフォルトの名無しさん 投稿日: 02/03/13 00:57
>>573
なんでそんなにifを避けたがるの?


576 名前: デフォルトの名無しさん 投稿日: 02/03/13 00:57
mallocの話題があったので便乗。
自己参照構造体を作った場合の開放はどうすればいい?
わざわざ処理を作るのが面倒だからプログラム終了時に
OSが開放してくれることを期待してたんだけど、マズイ気がしてきた。


577 名前: デフォルトの名無しさん 投稿日: 02/03/13 00:57
>>573
| 使え


578 名前: デフォルトの名無しさん 投稿日: 02/03/13 00:57
(src | (1<<bit))
でええやん。
代入までやるなら
src |= (1<<bit);
値見るなら
ans = !!(src & (1<<bit));
って所か?

関係ないが #define -1 TRUE は、やめれ。


579 名前: 517 投稿日: 02/03/13 00:59
>>573
あぁもうわけわからんなぁ。なぜ>>512じゃいけないのか??
>>512のビット立て、ビットおろしの「1」を代入したい変数(0 or 1)にして、
たて、おろしを連続ですれば、その変数が示す0か1になるだろうよ。

ちなみに、>>517も見てね。


580 名前: デフォルトの名無しさん 投稿日: 02/03/13 00:59
>>576
自己参照構造体って
struct test{
struct test *test1;
};
とかのこと?


581 名前: デフォルトの名無しさん 投稿日: 02/03/13 01:00
自己参照までやってるのに、解放考えないとは恐ろしいヤシだな・・・


582 名前: デフォルトの名無しさん 投稿日: 02/03/13 01:03
>>576
malloc()をdefineするなり自分用のmy_malloc()関数等を作るなどして、
確保したポインタをかたっぱしからどっかに記憶していって、
最後にまとめてfree()しまくるってのはどお?

どっかに既にそういうのあるかも。


583 名前: デフォルトの名無しさん 投稿日: 02/03/13 01:07
sizeof って、そもそも、 sizeof char の何倍かを返す、っていう定義でなかったっけか?


584 名前: デフォルトの名無しさん 投稿日: 02/03/13 01:23
>548は神


585 名前: デフォルトの名無しさん 投稿日: 02/03/13 01:25
>584 ワラタ


586 名前: デフォルトの名無しさん 投稿日: 02/03/13 01:29
>>548
至上稀に見る天才。


587 名前: デフォルトの名無しさん 投稿日: 02/03/13 01:32
>>576
OS が解放してくれるなら、全然問題なし。


588 名前: デフォルトの名無しさん 投稿日: 02/03/13 01:33
デジャヴ?


589 名前: デフォルトの名無しさん 投稿日: 02/03/13 02:55
fj ?


590 名前: デフォルトの名無しさん 投稿日: 02/03/13 03:03
ふーじーのーふじのみやー
ごてんばあさん、おってー


591 名前: デフォルトの名無しさん 投稿日: 02/03/13 03:31
質問です。

scanfで入力した変数を配列の大きさにしたいのですが、
どうすればいいのでしょうか?


592 名前: デフォルトの名無しさん 投稿日: 02/03/13 03:40
int i;
scanf("%d",&i);
{
 int *ip = malloc(sizeof(int)*i);
}


593 名前: デフォルトの名無しさん 投稿日: 02/03/13 03:59
性的確保なら、定数式じゃないから無理


594 名前: デフォルトの名無しさん 投稿日: 02/03/13 04:18
>>593
黙れ、エロおやじ


595 名前: デフォルトの名無しさん 投稿日: 02/03/13 09:12
freeしなくても終了時に勝手に開放されんでないの?
まーいーや。
DLLは一応FreeLibraryしてるけどね。


596 名前: デフォルトの名無しさん 投稿日: 02/03/13 09:59
>>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
そうだよ
わかりずらいけど


600 名前: 588 投稿日: 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を代入
ができると思ったのですが左辺値が必要と言われるので・・


603 名前: デフォルトの名無しさん 投稿日: 02/03/13 14:01
配列の名前は、たいていの場合は先頭要素を指すポインタ( &a[0] )として
扱われるけど、& が付くときとか sizeof のオペランドになる時とかは
配列そのものとして処理されるので、 *a と *&a じゃ意味が違うっていうか
型が違うっていうか。


604 名前: 602(状態:デムパ) 投稿日: 02/03/13 14:06
Σ( ̄□ ̄;)
ごめんなさいちょっと間違いました(- -;)
忘れてください。

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


605 名前: 602 投稿日: 02/03/13 14:09
とありますが

とK&Rにありますが


606 名前: デフォルトの名無しさん 投稿日: 02/03/13 14:16
*p++->str;
*p->str; p++;ってこった。
演算子の順位表をみろ。


607 名前: デフォルトの名無しさん 投稿日: 02/03/13 14:17
 ポインタについて質問です。
ポイントは、、「変数のアドレスを記憶する変数」と某サイトの説明が
ありました。 意味はよくわかります。
 どういうときに便利なんでしょうか? プログラム例を見たりしてますが
難解に見えるだけなんですが・・


608 名前: 602 投稿日: 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スレだから参照と比べてどうかってことではないよな…?


610 名前: デフォルトの名無しさん 投稿日: 02/03/13 14:27
>どういうときに便利
そういう台詞は代替手段があるときに口にするべき。
ポインタでしかできないことがCでは厳然として存在する
ことを踏まえれば、そんな言葉は出てこない。


611 名前: 607 投稿日: 02/03/13 14:40
>>610
ありがとうございました。
おれ逝ってよし!


612 名前: デフォルトの名無しさん 投稿日: 02/03/13 14:41
>ポインタでしかできないことがCでは厳然として存在する
まぁたしかにそうなんだけど具体例を挙げないとわかんないだろうから。

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

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

まぁ必ず例として出される二つの引数の値を入れ替えるswap関数がわかりやすいでしょ。
Cの入門書には必ずでてるからそのくらいは自分で調べて。


613 名前: 607 投稿日: 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";
と書くのがふつう。


615 名前: 613 投稿日: 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日で理解するのは無理ですか?

 



617 名前: デフォルトの名無しさん 投稿日: 02/03/13 17:32
>>613
char* pSrcMax = pSrc + iLength;
while( pSrc < pSrcMax )
{
*pDst ++ = *pSrc ++;
}
とかできて便利♪



618 名前: デフォルトの名無しさん 投稿日: 02/03/13 17:46
>>616
どっちも、 *pはchar型のポインタだよって定義して
そこに"ABC"の文字列(これはどっかに確保される)
へのポインタ(この際アドレスでもいいや)を代入してる。


619 名前: デフォルトの名無しさん 投稿日: 02/03/13 17:49
>>616
char *p = "ABC";
は、
char *p;
と、
*p = "ABC"
という意味ではない。


620 名前: デフォルトの名無しさん 投稿日: 02/03/13 17:55
>>618-619
 ありがとうございます。

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




621 名前: デフォルトの名無しさん 投稿日: 02/03/13 18:01
あー俺も昔同じことで悩んだ覚えがある...

char *p = "ABC";

char *p;
p = "ABC";
ですね。確かに最初は変に思えるかもしれないがとにかくそういうことになっ
ている。



622 名前: 620 投稿日: 02/03/13 18:05
>>621
 ありがとうございます。
これって理由があるのでしょうか?
気持ち悪いのですが・・。^-^;


623 名前: デフォルトの名無しさん 投稿日: 02/03/13 18:10
こう考えては?
char* p = "ABC";



624 名前: デフォルトの名無しさん 投稿日: 02/03/13 18:10
char* p = "ABC";

char* p;
p = "ABC";
って考えて納得するんじゃダメ?


625 名前: デフォルトの名無しさん 投稿日: 02/03/13 18:12
被った・・・


626 名前: 622 投稿日: 02/03/13 18:22
>>623-624
その考えだと、解ります。
これで先に進めそうです。 ありがとうございました。





627 名前: デフォルトの名無しさん 投稿日: 02/03/13 18:29
前スレに
int *p;
int* p;
のどっち使うかで盛り上がってたな。
とか蒸し返したら怒られるかな?(w


628 名前: デフォルトの名無しさん 投稿日: 02/03/13 18:32
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が代入される。初期化と代入は
区別しなくてはならない。


631 名前: 630 投稿日: 02/03/13 18:57
いかん上の説明はどっちかというと静的変数と自動変数の違いという感じで
初期化と代入の区別という感じはしないね。うまいサンプルを思いつかない。

618の補足
char *p;
はcharを指すポインタ型の「変数p」の宣言であって
char型の「変数*p」の宣言ではありません。


632 名前: デフォルトの名無しさん 投稿日: 02/03/13 19:22
>>631
const char *mona = "omaemona";
/*
const char *giko;
giko = "itteyosi";
*/
これはどーよ。今回の件とはあんまり関係ないけど。


633 名前: 616 投稿日: 02/03/13 19:37
>>629-631
 ご丁寧にありがとうございました。m(___)m
何度か繰り替えし読んだのですが、混乱してます。

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

 ポインタというモノが雲のような存在なんです。


634 名前: デフォルトの名無しさん 投稿日: 02/03/13 19:46
int *p; int* p;
この二つは書き方が違うだけ?


635 名前: デフォルトの名無しさん 投稿日: 02/03/13 20:21
>>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"という文字列の先頭の番地が代入される。

宣言と代入は、「構文が違う」ということは覚える必要がある。


636 名前: 635 投稿日: 02/03/13 20:23
>>635
宣言、というよりも初期化だな。スマン。

>>634
yes。書き方が違うだけ。


637 名前: デフォルトの名無しさん 投稿日: 02/03/13 20:28
>>633
じゃぁ、俺の理解で教えてあげよう。
まず、宣言時の
int *p;
の「*」と、参照時の
i = *p;
の「*」の意味は別物です。これ重要。

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

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

前者のaはアドレス(この場合0x0000)が代入できるのでポインタですが、
後者のaはアドレスを代入できない(参照しかできない)ので、ポインタではありません。
コンパイルしてみれば、後者はエラーが出てコンパイルできない
ことが分かります。


638 名前: sage 投稿日: 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にその連続したメモリの先頭アドレスを入れて初期化するんですな。
と解釈する。

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

覚えておけ。



639 名前: デフォルトの名無しさん 投稿日: 02/03/13 20:38
>覚えておけ。
まちがった説明なのに、やけにエラそうですな。


640 名前: 633 投稿日: 02/03/13 20:56
>>635-639
ありがとうございました。
まだ読んでませんが・・。 カンシャ!^-^)/"


641 名前: 629 投稿日: 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
これはどういう意味なんでしょうか?


643 名前: デフォルトの名無しさん 投稿日: 02/03/13 22:09
1を左にiビットシフトする。


644 名前: デフォルトの名無しさん 投稿日: 02/03/13 22:15
すんません。

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

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

b = ++a * ++a;

の場合も同じく未定義と考えていいのでしょうか。


645 名前: デフォルトの名無しさん 投稿日: 02/03/13 22:15
1にiを流し込む


646 名前: デフォルトの名無しさん 投稿日: 02/03/13 22:16
*で繋いだ場合も同様、未定義だ。
未定義なんで、実行したとたんOSがハングしてPCから煙がでてきたとしても仕方ない。



647 名前: デフォルトの名無しさん 投稿日: 02/03/13 22:17
>>643
どもです。
http://pinktower.com/www.ne.jp/asahi/gravure/com/096/001.jpg
つまらないものですがどうぞ。37まであります。


648 名前: 644 投稿日: 02/03/13 22:20
>>646
すいません。「*」でつないでるのは上も下も
同じなんです。インクリメント演算子が前置と後置で
変わるものなのか?と思ったんです。


649 名前: デフォルトの名無しさん 投稿日: 02/03/13 22:21
 b
 =
 +
 +
 a++
 *
++a
 +
 +


650 名前: デフォルトの名無しさん 投稿日: 02/03/13 22:24
よく見たら上も*か。
*ではまだ式の評価は完了しないから、
前置だろうが後置だろうが、未定義の動作になるよ。

C FAQ嫁。



651 名前: 644 投稿日: 02/03/13 22:25
>>650
ありがとうございました。
やっぱり副作用完了点までに複数副作用があるから
そうなるんですよね。


652 名前: デフォルトの名無しさん 投稿日: 02/03/13 22:44
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]

こんな感じだ。左側に各文字のアドレスが入っている。


654 名前: デフォルトの名無しさん 投稿日: 02/03/13 22:55
>>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 ***


655 名前: デフォルトの名無しさん 投稿日: 02/03/13 22:56
>>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);
にしろ。
っていうかすこしは自分で補完するように。




657 名前: デフォルトの名無しさん 投稿日: 02/03/13 23:01
え?おれはてっきりこういう意外なところで
コメント扱いされるエラーが出るよって教えて
くれてるのかと思ってたよ。


658 名前: デフォルトの名無しさん 投稿日: 02/03/13 23:03
>>656
( ゚Д゚)ホカーン

(゚∀゚)ネタニマジレス? クスクス


659 名前: デフォルトの名無しさん 投稿日: 02/03/13 23:04
*A**B とかも微妙な線だよね


660 名前: デフォルトの名無しさん 投稿日: 02/03/13 23:15
#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


661 名前: デフォルトの名無しさん 投稿日: 02/03/13 23:26
660は何を言いたいのか?


662 名前: 656 投稿日: 02/03/13 23:30
>658
(゚∀゚)ネタニマジレス? クスクス

だよね。自分が恥ずかしい。



663 名前: デフォルトの名無しさん 投稿日: 02/03/13 23:45
やはりみんな最初はポインタの壁にぶち当たるのですね
そういう自分もつい先日n重のポインタを理解したばかりですが…


◆おすすめスレッド◆
トリッキーなコード
http://pc.2ch.net/test/read.cgi/tech/983191866/


664 名前: デフォルトの名無しさん 投稿日: 02/03/13 23:48
ごめんオレマジでそのカベにぶち当たったこと無い。



665 名前: デフォルトの名無しさん 投稿日: 02/03/13 23:58
アセンブラ修得してからC始めた人なら、ポインタはあまり障害にならないね。
ポインタの表記の仕方と、ポインタの型に慣れるのにちょっとかかったけど。


666 名前: デフォルトの名無しさん 投稿日: 02/03/14 00:00
++data3じゃ左辺値が(略)


667 名前: デフォルトの名無しさん 投稿日: 02/03/14 00:02
アセンブラに手をつける前は、たしかに、お前らみたいな楽しい疑問や
勘違いコードを書いてたもんだなあ。



668 名前: デフォルトの名無しさん 投稿日: 02/03/14 00:05
そういや最近はアセンブラやベーシックやCをすっ飛ばして
別の言語を習得する人が増えてきたんだよね。


669 名前: 653 投稿日: 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;
}



670 名前: デフォルトの名無しさん 投稿日: 02/03/14 00:07
>>666
だね。言われてコンパイルしてみたけど、やっぱり通らなかった。


671 名前: 633 投稿日: 02/03/14 00:08
>>653
わざわざ、ありがとうございます。
よくわかりました。

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

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

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

 アドレス[0040A128] にある文字[A]があると、ポインタ
はいくらになるのですか? マヅで混乱してます。
よろしくお願いしますm(__)m


672 名前: デフォルトの名無しさん 投稿日: 02/03/14 00:10
>>638はネタだが嘘は書いてないぞ。
コンパイラの内部動作がわかるやつ、少ないのか?



673 名前: デフォルトの名無しさん 投稿日: 02/03/14 00:13
ポインタぐらいわからないんじゃあ
テンプレート尽くしのC++ソースなんか読めない(略)


674 名前: デフォルトの名無しさん 投稿日: 02/03/14 00:16
汗とセットで覚える方が気苦労が少ないと思うのだが・・
汗をかける必要はないから読める程度に勉強するのがいい。
そうすればポインタごとき665が言ってるみたいに表記の仕方
だけ覚えればいいんだけどなー。


675 名前: デフォルトの名無しさん 投稿日: 02/03/14 00:24
Cはやっぱり高級アセンブラ的な側面が大きいからねぇ。
実務に追われてるならともかく、これから学ぼうって人なら
アセンブラは修得しておいて損は無いYO!



676 名前: デフォルトの名無しさん 投稿日: 02/03/14 00:24
>>671
pの値は0040A128。
*pの値は'A'。
OK?


677 名前: デフォルトの名無しさん 投稿日: 02/03/14 00:24
あたまわりーな
> に見えますが、このすれの>>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へのポインタで初期化しているから最近のコンパイラは
警告を出すだろう。

>宣言は使うときと同じように書く。
というのは確かにそうだけど嘘じゃないというにはちょっと、、、。


679 名前: 678 投稿日: 02/03/14 00:29
>671が本気にして混乱するじゃないか。
そうでなくても混乱してるけど、、、、、。

それだけに一部が間違っている文章は毒にしかならない。


680 名前: 結論 投稿日: 02/03/14 00:33
>>671にはCは無理。


681 名前: デフォルトの名無しさん 投稿日: 02/03/14 00:33
工房が何やら喚いてます。
人に適切に説明できないというのは、
自分でも深く理解できない証拠です。


682 名前: デフォルトの名無しさん 投稿日: 02/03/14 00:34
ほんとだint *p age


683 名前: デフォルトの名無しさん 投稿日: 02/03/14 00:35
ちなみにコンパイラは右から解釈していく。これは正しい。


684 名前: デフォルトの名無しさん 投稿日: 02/03/14 00:35
(char *)age;


685 名前: デフォルトの名無しさん 投稿日: 02/03/14 00:36
>コンパイラが
>int *p;
>をみつけたとき、
>pに参照演算子*を適用するとintになるんですな。
>と解釈する。つまりはint型へのポインタへ変数だ。

ここらへんは禿同。


686 名前: 633 投稿日: 02/03/14 00:45
>>672-684
 ありがとうございました。
アセンブラも勉強します。

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

 どこかのサイトにポインタは簡単って書いてましたけど
頭悪い人には難しいんですね・・(汗


687 名前: デフォルトの名無しさん 投稿日: 02/03/14 00:45
>>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 回違う。


688 名前: デフォルトの名無しさん 投稿日: 02/03/14 00:49
mov ウマー!


689 名前: デフォルトの名無しさん 投稿日: 02/03/14 00:49
別物というのは同意するが、その擬似コードはなんか微妙に違うような..



690 名前: デフォルトの名無しさん 投稿日: 02/03/14 00:53
ポインタなんてデバッガでステップ実行しながら
メモリダンプや変数の値チェックしてけばする理解できるよ。
アセンブラ覚えるんならIDEの使い方覚えたほうがまだまし。


691 名前: デフォルトの名無しさん 投稿日: 02/03/14 00:56
汗知らずにCやってる人って、、、


692 名前: デフォルトの名無しさん 投稿日: 02/03/14 00:56
>>687
最適化を行わないコンパイラなら多分そんな感じだろうけど、
最適化を考慮すると、その考え方は危険。

どんな値が入るか解らないポインタに比べ、添え字の範囲にしか
アドレスの変化しない配列の方が、高度に最適化される処理系が有る。
つーか折れの使ってるDSP用のコンパイラは、配列の方が速い。


693 名前: デフォルトの名無しさん 投稿日: 02/03/14 00:59
>>692
ああ、もちろん「配列よりポインタが効率的だ」とか言うつもりは全く無いよ。
ただ別モノだ、と言いたかっただけ。

(配列は左辺値にならんし)


694 名前: デフォルトの名無しさん 投稿日: 02/03/14 01:00
>>689
sto と store が混在してたり? (違


695 名前: デフォルトの名無しさん 投稿日: 02/03/14 01:01
折れがアセンブラ使ってた頃は、Z80 ,6809,8086,68Kだったからなぁ。
今のIA32でアセンブラ入門しろたって、ちと酷か。

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


696 名前: デフォルトの名無しさん 投稿日: 02/03/14 01:02
>>691
それ俺ですが何か?

だって資料が無いんだよヽ(`Д´)ノ


697 名前: デフォルトの名無しさん 投稿日: 02/03/14 01:02
男らしくGASかpcodeだろ。



698 名前: デフォルトの名無しさん 投稿日: 02/03/14 01:04
>>695
> なんかいいアセンブラ入門させられる処理系無いかねぇ?
シンプルなところで MIPS でしょ。Windows や UNIX で動く、わりと出来の良い
エミュレータ SPIM もあるし、PS2 Linux 買えば gcc + gas で実際の CPU を
使って遊べるし。


699 名前: デフォルトの名無しさん 投稿日: 02/03/14 01:07
386ってそんなに難しいかなぁ。
蒲地さんの本読めばかなり分かると思うけど。


700 名前: 695 投稿日: 02/03/14 01:08
>>698
MIPSか。折れ勉強した事無いんだよね(藁
でもRISC系やDSPはは命令は簡単だけど、各命令に制限多くない?
MIPSは知らないけど、遅延分岐なんて入門者にゃ敷居高すぎ。

まぁ折れが覚えるんじゃ無いから別にいいんだけど(w


701 名前: デフォルトの名無しさん 投稿日: 02/03/14 01:09
プロテクトモードだけなら簡単だね


702 名前: 695 投稿日: 02/03/14 01:10
>>699
SSEとか魅力的な機能有って、覚えた気になった直後に目移りしちゃって、
まともに理解出来ない罠。
アセンブラ覚えるにゃ、やっぱチープなチップが良いかと。


703 名前: デフォルトの名無しさん 投稿日: 02/03/14 01:11
いや、特権モードでの説明に特化した
「初めて読む486」とかいい本だと思うけどっていいたかった。


704 名前: デフォルトの名無しさん 投稿日: 02/03/14 01:15
>>700
> でもRISC系やDSPはは命令は簡単だけど、各命令に制限多くない?
むしろ CISC 系の方が、レジスタの用途に制限が多くて面倒だと思うが。
RISC 系だと、汎用レジスタは本当に汎用で、Z80 みたいに

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

みたいな制限は無いし。

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

ま、優秀なやつには、SPIM とヘネシー&パターソンの「コンピュータの構成
と設計」をセットで渡しておけ。あれで、背景を含めて必要な知識が押さえら
れる。


705 名前: デフォルトの名無しさん 投稿日: 02/03/14 01:18
CASLは?


706 名前: 695 投稿日: 02/03/14 01:34
>>705
CASLはアクビが出る位簡単。あくまで試験用のアセンブラだしね。
情報処理試験で、事前勉強ゼロで、巻末のアセンブラ仕様読みながら回答したけど、それで通った位だし。
とは言え、Z80と8086のアセンブラの経験は有ったけど。
それも15年前の事だが・・・

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

まぁアセンブラは、学生のウチに勉強しときなさいってこった。


707 名前: 637 投稿日: 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
たのむ!教えてくだされ
コンパイルして早く寝たい。 とにかく実行させて 寝たい。
っくっつ 目が 目が かすんできやがった..  限界か..?


712 名前: デフォルトの名無しさん 投稿日: 02/03/14 04:44
>>711
その保存したテキストファイルを選択して
「F2」を押してごらん。


713 名前: デフォルトの名無しさん 投稿日: 02/03/14 04:45
C++がわかーるって、ソフトってほんとにわかるのですか?
また、どの程度の内容なんでしょうか?
使ったことのある人、教えてください。


714 名前: デフォルトの名無しさん 投稿日: 02/03/14 04:47
>>712 おお神よ..ゴッド!観音様! やってみます!!


715 名前: デフォルトの名無しさん 投稿日: 02/03/14 04:52
アビバ逝け


716 名前: デフォルトの名無しさん 投稿日: 02/03/14 04:53
>>712 おお、拡張子 .c に変換できました、
しかし、ファイルが windows のマークになって、アプリケーション
から開かないと駄目な形式に変ったのですが。。
 プロパティをみると、種類が Cファイルとなっているから
このままMS-DOSでコンパイルしてよいのかな?


717 名前: デフォルトの名無しさん 投稿日: 02/03/14 04:56
>>716
いいよ


718 名前: デフォルトの名無しさん 投稿日: 02/03/14 04:58
>>716
そういう質問は、まずやってみてから。




719 名前: デフォルトの名無しさん 投稿日: 02/03/14 04:58
まさか、関連付けくらいできるよな・・


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;
}


725 名前: デフォルトの名無しさん 投稿日: 02/03/14 09:10
printfで\n表示してないとか
windows.hとかstdio.hが<>でなく""だとか、
それをいえば、stdafx.hなんかいらんやろ、とか
"shutdown r"みたいな使用方法はセンスがないとか


726 名前: デフォルトの名無しさん 投稿日: 02/03/14 09:28
defaultの来たときのメッセージがDQN臭いのが一番気になる。


727 名前: 630 投稿日: 02/03/14 09:43
>687

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

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

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

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

>汗知らずにCやってる人って、、、
まぁでもわざわざアセンブラを覚える必要はないでしょ。わしアセンブラ知らんし。
車を組み立てられなくても車の運転をするのには困らないし。知ってて損はしないだろうけど。
「そろばんを知らなくても電卓は使える」と表現しちゃうとそろばんくらいは知っていた方が
いいよなと思っちゃうけどね。


728 名前: デフォルトの名無しさん 投稿日: 02/03/14 09:50
それならどっちかというと車の中身が分かる方が大切。



729 名前: デフォルトの名無しさん 投稿日: 02/03/14 09:51
>>695
ユーザーモードのアプリに最低限必要な命令だけだったらたいして難しくない。
セグメントを考える必要がないぶん8086より楽なくらいだと思われ
入門なんだからSSEやら何やらは単に無視すればいいだろ。


730 名前: デフォルトの名無しさん 投稿日: 02/03/14 10:22
自分で作ったプログラムを逆汗汁。
たまにすさまじい無駄に気づくぞ。


731 名前: デフォルトの名無しさん 投稿日: 02/03/14 10:50
>>730
ああ、禿しく同意だ



732 名前: デフォルトの名無しさん 投稿日: 02/03/14 10:56
でも”無駄を削った”はずのコードが
すさまじい無駄を含んだコードと
大して変わらない実行速度だったりする罠。

ファイルサイズ削りたいんなら有効かも。


733 名前: デフォルトの名無しさん 投稿日: 02/03/14 11:12
半分同意だが、戦場全体を見渡して一番苦戦してるところを見つける目の方がもっと重要だ。



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というのは状況によって変わるのですが
宣言時にコンパイラの方が調べて覚えておいてくれるのでプログラマは覚える必要はない。
(むしろ意識してはいけない)

ポインタが単なるアドレスではないというのはこういう意味。


735 名前: デフォルトの名無しさん 投稿日: 02/03/14 13:02
>>734
ip = cp = 1001;
で cp++; とすると cp は 1002 になるし
ip++; とすると ip は 1005 になったりとかね。


736 名前: 742 投稿日: 02/03/14 15:01
前回お答えありがとうございました
printfの\nやincludeの<>などはいわれてみればそのとおり、と思って修正できたのですが

コマンド引数で"-"をつけるにはどうやってプログラムすればよいのでしょうか?
確かにコマンドでは"-"ははいっておりますが自分でやろうとすると反応しません
lとかsとか一文字だけですと問題ないのですが…


737 名前: デフォルトの名無しさん 投稿日: 02/03/14 15:11
やべー俺ポインタ理解しないまま霊感でコーディングしてた。
論理式とかも見た目勝負


738 名前: デフォルトの名無しさん 投稿日: 02/03/14 16:32
>>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'



741 名前: デフォルトの名無しさん 投稿日: 02/03/14 16:56
>やべー俺ポインタ理解しないまま霊感でコーディングしてた。

ある意味すごい才能だな 藁


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の値をみると確かにアドレス値が表示されるのでポインタ=アドレスって
勘違いしてわかった気になっちゃうんじゃないかなと。


745 名前: デフォルトの名無しさん 投稿日: 02/03/14 17:03
string *str = new_string("test");
string_replace( str, new_string("t"), new_string("pch"));
...
やってられるか、っちゅうねん。

>>演算子のオーバーロードはこの際無視するとして
Cでオーバーロードなんか無視する以前にできねーだろが。


746 名前: デフォルトの名無しさん 投稿日: 02/03/14 17:19
>739
>オブジェクトって、簡単に言うとなんですか?
>変数などが入ってる箱みたいなものですか?

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



747 名前: デフォルトの名無しさん 投稿日: 02/03/14 17:22
オブジェクト = 名前付きのメモリ領域

K&R風


748 名前: デフォルトの名無しさん 投稿日: 02/03/14 18:19
>>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”になることはできませんでした

って出てきます。
どうしたらいいでしょう。


750 名前: デフォルトの名無しさん 投稿日: 02/03/14 18:53
>>749
ポインタ周りのバグだな。頑張ってデバッグしろ。

金があるなら BoundsChecker とか Purify 使う。VC6 なら _CrtSetDbgFlag() で
ヒープのチェックを厳密にすると良いかも。


751 名前: デフォルトの名無しさん 投稿日: 02/03/14 19:06
VCに出てくる、ドキュメントや、クラスってどういうもの
なんですか?


752 名前: デフォルトの名無しさん 投稿日: 02/03/14 19:18
Doc-Viewでいうところのドキュメントは、ファイルに保存したりファイルから読み込んだりできる
アプリケーションデータのこと。

クラスっていうのはC++のキーワード。
構造体をもっと便利かつ複雑にしたもの。



753 名前: 751 投稿日: 02/03/14 19:52
>>752
どうも、ありがとうございました


754 名前: 700 投稿日: 02/03/14 22:17
>>748
すみません、ありがとうございました


755 名前: NEWTON 投稿日: 02/03/14 23:41
newtom法
f(x)=0をもとめられる
プログラムください。


756 名前: デフォルトの名無しさん 投稿日: 02/03/14 23:49
int f(int x)
{
return 0;
}


757 名前: 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
プログラムを作ってください。 m(-_-)m


758 名前: デフォルトの名無しさん 投稿日: 02/03/15 00:33
>>757
>プログラムを作ってください。 m(-_-)m

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

叩かれる覚悟はよかですか?


759 名前: デフォルトの名無しさん 投稿日: 02/03/15 00:40
>757
ニュートン先生、日本語に慣れていないのは仕方ないのかもしれませんが、
自身の名前を冠した手法のつづりを間違えているのはどうかと思います。
あと、怜タンが暇そうにしていたので、宿題スレをたずねてあげたら喜ばれますよ。


760 名前: デフォルトの名無しさん 投稿日: 02/03/15 00:42
嫌がらせで「C言語以外」でバンバンプログラムを作ってあげるとか(笑


761 名前: デフォルトの名無しさん 投稿日: 02/03/15 00:55
>>760
BASICで作ってみた



762 名前: デフォルトの名無しさん 投稿日: 02/03/15 00:59
作れもしないカスが消えな
悔しいかったら作ってみな


763 名前: デフォルトの名無しさん 投稿日: 02/03/15 01:01
>>760
Occamで作ってみた。


764 名前: デフォルトの名無しさん 投稿日: 02/03/15 01:03
MATLABで作ってみた・・・と言いたい所だが、作るまでもなく入っている。


765 名前: デフォルトの名無しさん 投稿日: 02/03/15 01:06
C言語で作れもしないカスが消えな
悔しいかったら作ってみな
ちゃんとUPしろよ


766 名前: デフォルトの名無しさん 投稿日: 02/03/15 01:08
だから何処の人だ?<“悔しいかったら”


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
作ってあげたら



771 名前: デフォルトの名無しさん 投稿日: 02/03/15 01:14
ちとーも悔しくないのはどうしてでしょうか?


772 名前: デフォルトの名無しさん 投稿日: 02/03/15 01:22
悲惨な765のいるスレ


773 名前: デフォルトの名無しさん 投稿日: 02/03/15 01:30
ナ○コを馬鹿にするな!


774 名前: デフォルトの名無しさん 投稿日: 02/03/15 01:34
ナオコ?


775 名前: デフォルトの名無しさん 投稿日: 02/03/15 01:37
質問したと思ったら逆ギレですか?(笑

こんな簡単な問題だれにでも書けますけどね、
もうだれも書いてくれないでしょう。
ま、自分で苦しみなさい。


776 名前: デフォルトの名無しさん 投稿日: 02/03/15 01:38
ここはHSPスレですか?


777 名前: デフォルトの名無しさん 投稿日: 02/03/15 01:39
>>775
ななこSOS!


778 名前: デフォルトの名無しさん 投稿日: 02/03/15 01:39
MLとかHaskellだとどんなコードになるんだろう?
やっぱりすごくエレガントなコードになるんだろうけど。


779 名前: デフォルトの名無しさん 投稿日: 02/03/15 01:47
アルゴリズム解ってるのにコーディング出来ないなんて
このスレどころか、この板にも来る資格ネェよと言ってみるテスト。


780 名前: 愚民 投稿日: 02/03/15 01:53
757

マズ−
私もNEWTON法が解けないんですけど教えてください。



781 名前: さげ! 投稿日: 02/03/15 01:55
>>757
方程式ってなんだっけ?

トイッテミチャッタリ


782 名前: デフォルトの名無しさん 投稿日: 02/03/15 01:58
>>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 で書いてました。


785 名前: デフォルトの名無しさん 投稿日: 02/03/15 02:02
>>783
そんなあなたにここがおすすめ
http://www.aviva.co.jp/
逝け


786 名前: デフォルトの名無しさん 投稿日: 02/03/15 02:03
757  ←ここに数字を入れる人って少ないよね。>>770とか>>780


787 名前: デフォルトの名無しさん 投稿日: 02/03/15 02:15
>>783
Cコンパイラとデバッガとエディタ。
そしてライブラリのソース。以上。


788 名前: デフォルトの名無しさん 投稿日: 02/03/15 02:25
>>783
>できーるシリーズ
・・・・・
ネタですか?


789 名前: デフォルトの名無しさん 投稿日: 02/03/15 02:37
>>783
プログラミングができる友人


790 名前: 783 投稿日: 02/03/15 03:08
みなさんありがとう!
>>788
突っ込みありがとう!
気付きませんでした。

×できーるシリーズ
○わかーるシリーズ


791 名前: デフォルトの名無しさん 投稿日: 02/03/15 03:13
プログラミングができるともだち100人できーる(民明書房)\1,200-



792 名前: デフォルトの名無しさん 投稿日: 02/03/15 03:26
「週間プログラミング」創刊!
いまならアヒル本が付いて250円。デアゴスティーニから。


793 名前: デフォルトの名無しさん 投稿日: 02/03/15 03:39
sage


794 名前: デフォルトの名無しさん 投稿日: 02/03/15 04:03
ひきこもりができるともだち100人できーる(民明消防)\1,200-


795 名前: デフォルトの名無しさん 投稿日: 02/03/15 04:52
>>768
Application Binary Interface

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


796 名前: デフォルトの名無しさん 投稿日: 02/03/15 07:54
void get_str(char *p)
{
  p = "hoge";
}

void main(void)
{
  char *p;

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

このコードをコンパイルすると
「値が割り当てられていないローカルな変数 'p' に対して参照が行われました。」
と警告を出され、構わず実行すると強制終了するんですが、何が悪いんでしょうか・・・。


797 名前: デフォルトの名無しさん 投稿日: 02/03/15 08:02
つまりあなたは、
void get_value(int i)
{ i=500;}
int main()
{
int i=0;
get_value( i );
return 0;
}
とかやって、mainの i が0のままだ、とか仰るのでせう。


798 名前: 796 投稿日: 02/03/15 08:09
>>797
それについてはわかっていたつもりだったんですが・・・。
767のmainは
void main(void)
{
  char p;

  get_str(&p);
  printf("%s\n", p);
}
と等価ではないんでしょうか?


799 名前: 796 投稿日: 02/03/15 08:12
すいません。対象が文字列だってこと忘れてました。
上のは大間違いですね・・・。


800 名前: デフォルトの名無しさん 投稿日: 02/03/15 08:31
>>799
文字列っつーか…。ポインタ変数でもなんでも普通の変数と
変わらんので、他の関数の中で書き換えたいなら

char *p;
get_str(&p);

って形になるように get_str を作らんと。


801 名前: デフォルトの名無しさん 投稿日: 02/03/15 08:37
>void main(void)
これを見ただけで頭が拒絶反応を起こす罠



802 名前: 796 投稿日: 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
自力救済できていたのね。


805 名前: デフォルトの名無しさん 投稿日: 02/03/15 09:24
>>801
実はC99という罠


806 名前: デフォルトの名無しさん 投稿日: 02/03/15 10:10
C99の仕様は何処読めばいいんだろう。
とりあえずこんなの見つけたが、ごっつい量や...
http://www.cl.cam.ac.uk/~mgk25/volatile/ISO-C-FDIS.1999-04.pdf



807 名前: デフォルトの名無しさん 投稿日: 02/03/15 12:24
コンストラクタって何ですか?


808 名前: デフォルトの名無しさん 投稿日: 02/03/15 12:29
>807
プログラミング言語Cにコンストラクタはありません。
気にしなくても良いですよ。


809 名前: デフォルトの名無しさん 投稿日: 02/03/15 12:30
>>807
Cにはコンストラクタはない

C++にはある
http://www.bohyoh.com/CandCPP/FAQ/FAQ00084.html



810 名前: デフォルトの名無しさん 投稿日: 02/03/15 12:34
constructor n.
建造者,建設者


811 名前: 807 投稿日: 02/03/15 12:39
ありがと〜



812 名前: デフォルトの名無しさん 投稿日: 02/03/15 12:51
C には文字列型はありません。
文字型もたぶんありません。


813 名前: デフォルトの名無しさん 投稿日: 02/03/15 12:59
>>812

typdef char* string;
string str = "sage";


814 名前: デフォルトの名無しさん 投稿日: 02/03/15 13:01
typdef -> typedef

ごめんなさい。逝って来ます。


815 名前: デフォルトの名無しさん 投稿日: 02/03/15 13:06
>>806
ここはどう? 日本語のページだよ。
ttp://seclan.dll.jp/c99d/c99d00.htm
正確な仕様書ではないけど、従来のCとなにが変わったのか概要を知るにはいいと思う。



816 名前: 806 投稿日: 02/03/15 13:35
>>815
さんくす
ゆっくり読んでみます。


817 名前: 806 投稿日: 02/03/15 16:17
やっぱ処理系手に入れて遊んでみないとなぁ


818 名前: デフォルトの名無しさん 投稿日: 02/03/15 16:36
gcc -std=c99 hoge.c でできるらしいけど如何?
gcc-3.x じゃないとだめなのかな?


819 名前: 806 投稿日: 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++って、どう違うのですか?


821 名前: デフォルト名無しさん 投稿日: 02/03/15 18:34
おなじだよ


822 名前: デフォルトの名無しさん 投稿日: 02/03/15 18:59
チンコが付いてるかどうかの違いだ


823 名前: デフォルトの名無しさん 投稿日: 02/03/15 19:01
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字の行は含まれない。 よって、間違い。


826 名前: デフォルトの名無しさん 投稿日: 02/03/15 19:22
>>820
アビバ逝け!


827 名前: 熱血初心者 投稿日: 02/03/15 19:23
日本語勉強してきます<(_ _)>


828 名前: デフォルトの名無しさん 投稿日: 02/03/15 20:56
>>824
10000字の行があったらそれで正しく表示できるのかと56時間(略)


829 名前: 投稿日: 02/03/15 21:01
80字より長い行???


830 名前: デフォルトの名無しさん 投稿日: 02/03/15 21:18
>>824
macのテキストファイル食わせると死ぬ罠。


831 名前: デフォルトの名無しさん 投稿日: 02/03/15 21:29
>>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


832 名前: デフォルトの名無しさん 投稿日: 02/03/15 21:40
>>831
バカを甘やかさないように

スレに定住されたら困るので。


833 名前: デフォルトの名無しさん 投稿日: 02/03/15 22:24
>>813
const string str = "sage";
としてハマるの罠。
次のうち、コンパイルできないのはどっち?
str = "age";
*str = ' ';


834 名前: 831 投稿日: 02/03/15 22:28
>>832
まぁまぁそう言わず、Excelも捨てたもんじゃないっていうことで。


835 名前: デフォルトの名無しさん 投稿日: 02/03/16 01:07
どんなコンパイラがある?それとどんなの使ってる?


836 名前: デフォルトの名無しさん 投稿日: 02/03/16 01:41
void ( *signal( int sig, void (__cdecl *func) ( int sig [, int subcode ] )) ) ( int sig );

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




837 名前: デフォルトの名無しさん 投稿日: 02/03/16 01:45
>>836
ばらしとけ
typedef void (*functype)(int sig);
functype signal(int sig,functype func);


838 名前: sage 投稿日: 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さんありがうございました。
よくわかりますた。


840 名前: デフォルトの名無しさん 投稿日: 02/03/16 16:00
char *hoge;

と宣言したのを

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

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

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

とかのが良いですか?



841 名前: デフォルトの名無しさん 投稿日: 02/03/16 16:13
>>840
関数へ渡される引数は、関数呼び出しに先立ってすべて評価されてから
渡されます。なので、>>840の場合どっちも同じです。


842 名前: デフォルトの名無しさん 投稿日: 02/03/16 16:27
>>841

わかりました。ありがとうございます。


843 名前: デフォルトの名無しさん 投稿日: 02/03/16 16:52
1)
realloc(hoge,strlen(hoge) + i + 1);

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

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

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

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

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

基本的には2をおすすめする。


844 名前: デフォルトの名無しさん 投稿日: 02/03/16 16:53
間違って下げちゃったよ。

単発すれとかネタスレが多いので上げとく


845 名前: デフォルトの名無しさん 投稿日: 02/03/16 16:57
間違えた。
new_strlen = strlen(hoge) + i;

new_strlen = strlen(hoge) + i + 1;
だね。


846 名前: 840 投稿日: 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日ほど費やしたのですが。
どうかご教授ください。



847 名前: デフォルトの名無しさん 投稿日: 02/03/16 18:23
これくらいなら 1の方が見やすいと思うけどなぁ。


848 名前: デフォルトの名無しさん 投稿日: 02/03/16 18:27
>>846
reallocの結果のアドレス受け取ってないじゃん
reallocは、その結果アドレスが変化することを考慮して使うものだよ。


849 名前: デフォルトの名無しさん 投稿日: 02/03/16 18:32
gdbの使い方を解説しているページを教えてください。
よろしくお願いします。


850 名前: デフォルトの名無しさん 投稿日: 02/03/16 18:34
>>846
replace ってシンボルが関数じゃなくて変数なあたり、激しく読みにくい…。
(ふつー動詞は関数、名詞は変数っつー気が)

問題点多数たが、とりあえず
> sub_string[0] = '\0';
これでダメだろ。最初の時点では sub_string は有効なメモリ領域を指して
いない。


851 名前: 840 投稿日: 02/03/16 18:35
>>848
sub_string = realloc(sub_string, hit_to_top + strlen(sub_string) + 1);

なんですね。お手数おかけしました。



852 名前: デフォルトの名無しさん 投稿日: 02/03/16 18:35
>>849
info gdb では不満か? 使い方で悩むなら xxgdb とか ddd, Emacs の
gdb-mode のような

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

をかぶせて使うのも手だと思うが。


853 名前: デフォルトの名無しさん 投稿日: 02/03/16 19:03
>>849
http://flex.ee.uec.ac.jp/texi/gdb-j/gdb-j_toc.html


854 名前: デフォルトの名無しさん 投稿日: 02/03/16 19:03
>>849
http://www.asahi-net.or.jp/~wg5k-ickw/html/online/gdb-4.18/gdb_toc.html


855 名前: デフォルトの名無しさん 投稿日: 02/03/16 19:13
ありがとうございました。


856 名前: デフォルトの名無しさん 投稿日: 02/03/16 23:37
独習Cの最初のプログラムとK&Rの最初のプログラムって
形がほぼ同じで「return 0;」だけが違うのですよネ?
これって特に覚えておく必要あります?
・・・って頭には既に刻み込まれていますが(^^;


857 名前: デフォルトの名無しさん 投稿日: 02/03/16 23:57
| (or) ,^ (xor) , ~(補数)の記号ってなんて読むのですか?
「;」をセミコロンと読むように。 一応ネタではないです。



858 名前: デフォルトの名無しさん 投稿日: 02/03/17 00:03
漏れは|(パイプ)^(やま)~(チルダ)とよんでいるが


859 名前: デフォルトの名無しさん 投稿日: 02/03/17 00:04
パイプ カレット にょろ


860 名前: デフォルトの名無しさん 投稿日: 02/03/17 00:08
パイプカット…


861 名前: デフォルトの名無しさん 投稿日: 02/03/17 00:08
折れは、文脈に従って、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コマンドでシンボルが取り除けるとはどういうことでしょうか?
お願いします。


864 名前: デフォルトの名無しさん 投稿日: 02/03/17 00:44
チンコ


865 名前: 857 投稿日: 02/03/17 01:23
| (or) ,^ (xor) , ~(補数)の記号の読み方を教えて頂き
ありがとうございました。



866 名前: デフォルトの名無しさん 投稿日: 02/03/17 01:34
参考本や、サイトで「バイト幅は処理系により異なり・・・」
の「処理系」は、具体的にどのようなことを指してるのですか?


867 名前: デフォルトの名無しさん 投稿日: 02/03/17 01:38
>>866
コンパイラ。OS。ハードウェア構成、等々言い出せば際限無い。
多くの場合「違うぞゴルァ」という指摘をあらかじめ防ぐためのもの。


868 名前: デフォルトの名無しさん 投稿日: 02/03/17 01:41
>866
処理系 = コンパイラと思っておいていい。


869 名前: デフォルトの名無しさん 投稿日: 02/03/17 01:50
一般的に処理系と言えば >>867だが、
このスレの中で処理系と出た場合は>>868



870 名前: 866 投稿日: 02/03/17 02:01
>>866です。
皆さん、わかりやすい説明ありがとうございました。



871 名前: デフォルトの名無しさん 投稿日: 02/03/17 03:26
>>863
ふつー、コンパイルすると機械語コードに変換されるんだけど、
デバッグのため、関数名とか変数名とかの名前を一緒に記録
しておくと、デバッグ中にわけわからんアドレスを「これ、どの
変数に対応しとるんじゃ!?」と悩まなくてすむ。
で、この関数名とか変数名とかその他文字列がシンボルだね。

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


872 名前: デフォルトの名無しさん 投稿日: 02/03/17 03:30
>>871
デバッグ以外にも、リンク時には必要になるよね。

オブジェクトファイルやライブラリを strip すると不幸になるので、気をつけ
ましょう。あと kernel も strip できるけど、やるといくつかコマンドが正常に
動かなくなる。(でもルータとして使う程度なら、動作に支障はない)


873 名前: 初心者 投稿日: 02/03/17 07:21
2chもしっかりしたところで質問すると皆さんにしっかりお答えしていただけるのでよいですね
しかもほとんど時間差なしというのがよいです
余計に自分で調べられるところは調べて本当にわからないところだけきけばよいので自分で調べる癖もついてよいです

なんて、最近こういうところを見ていて思った大きな独り言でした


874 名前: デフォルトの名無しさん 投稿日: 02/03/17 10:52
863です。
とても解かり易い解説をありがとうございました。
本当に勉強になります。


875 名前: デフォルトの名無しさん 投稿日: 02/03/17 11:45
win32apiを使ってWindowsprogrammingをC/C++でしている時に
HANDLE型が出てきますがHANDLE方とはいったい何なのでしょうか?
VC++6をつかってます

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

よろしくお願いいたします


876 名前: デフォルトの名無しさん 投稿日: 02/03/17 12:07
HANDLE型って、あれでしょ。FILE*とおんなじような。
実体はvoid*だけど。不完全型のポインタとおんなじで
「Windowsである俺様には重要やけど、おまいら一般
プログラマは、内容を参照しようとすんなよ、バカチンが」
っていうような感じ。そういうオブジェクトを格納・参照する型が
HANDLEなわけよ。UNIXソケトハンドルがintなのとそう変わらない。

ああ、そうそう。「スレ違い」だよ。


877 名前: デフォルトの名無しさん 投稿日: 02/03/17 12:08
>>875
typedef (void *) HANDLE;


878 名前: デフォルトの名無しさん 投稿日: 02/03/17 12:10
>2chもしっかりしたところで質問すると皆さんにしっかりお答えしていただけるのでよいですね

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

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




879 名前: デフォルトの名無しさん 投稿日: 02/03/17 12:16
>>877
結局typedefしているだけなんだ


880 名前: デフォルトの名無しさん 投稿日: 02/03/17 12:25
>>879
yes ヘッダ見れ。winnt.hにいた。正確には
>typedef void *HANDLE;
だったが。


881 名前: デフォルトの名無しさん 投稿日: 02/03/17 12:41
というか、xor ってそもそもどう読んでるよ。

えっくすおあ で済ましてるのは軟弱ですか?


882 名前: デフォルトの名無しさん 投稿日: 02/03/17 12:54
>>881
えっくすおあです。えくすくれっしヴおあなんて長ったらしい。



883 名前: デフォルトの名無しさん 投稿日: 02/03/17 13:28
横から割り込みでごめんなさい
>>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*
汎用のポインタ。
どんな型のポインタもに代入できる便利だけど節操が無いポインタ。



886 名前: sage 投稿日: 02/03/17 14:15
>>883
本当はね、意味のある構造体へのポインタだったり、
意味のある構造体を指すポインタへのポインタだったりするんだけど、

ユーザプログラムに中を見られたり、中を書き換えられたりされたら困るから
(CPUの保護機能を使って元々見たり書いたりできないようになってるけどね)
意味のない汎用ポインタ void * にキャストしてるんだよ。



887 名前: デフォルトの名無しさん 投稿日: 02/03/17 14:54
ローダーの仕事について質問させていただきます。

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

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

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

よろしくお願いします。



888 名前: デフォルトの名無しさん 投稿日: 02/03/17 15:03
>>833
もう十分説明は出てるが追記。使うとしたら
| int n = 100;
| void *p = &a;
| printf("%d", *(int *)p);
って感じ。型キャストを外すと許されない型といわれた(BCC)。


889 名前: デフォルトの名無しさん 投稿日: 02/03/17 15:03
./ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 
|  参考になりますね
.\
  . ̄ ̄ ̄∨ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
       _ _  _   __,、--――- 、
    ,、'´/  `´´  `''´ ̄,、―'´ ̄ '´ ̄..`ヽ、_
   // '´  / ,、  ,、    /  '´ ̄`ヽ、 /`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     / `―フ ̄   ) ,、'´          /
   //   \  / |  / ̄`ヽ、,、'´フ          /



890 名前: 888 投稿日: 02/03/17 15:03
>>833 <- >>883



891 名前: デフォルトの名無しさん 投稿日: 02/03/17 15:58
>>887
基本的にはそんなとこじゃない?
シェアードライブラリとかの処理はどうなってるのか知らないけど。


892 名前: デフォルトの名無しさん 投稿日: 02/03/17 16:44
#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
を使ってます。


893 名前: デフォルトの名無しさん 投稿日: 02/03/17 16:51
>>892
E:\program.c\2.c
の1行めになんて書いてあるの?


894 名前: デフォルトの名無しさん 投稿日: 02/03/17 16:55
>>887
ローダーといっても、

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

どのあたりを指していってるのか明示しないと、話が混乱しそう。あと
書籍で Linkers & Loaders 読むのが良いんじゃないのか? (俺は
まだ読んでないんだが)


895 名前: 892 投稿日: 02/03/17 16:57
この内容には
#include <studei.h>
と書いてありますが、それのことでしょうか?


896 名前: デフォルトの名無しさん 投稿日: 02/03/17 17:01
studei.hこのファイルがないって事
正解はstdio.hだ


897 名前: 892 投稿日: 02/03/17 17:29
MAKE Version 5.2 Copyright (c) 1987, 2000 Borland

Compile End !! (Elapsed time 0:00.020)
と出たんですが、出力結果というのでしょうか、それは出てこないんでしょうか?


898 名前: デフォルトの名無しさん 投稿日: 02/03/17 18:26
>>897
同じディレクトリに何かできたと思われるのでそれを実行汁。
人に聞いてばかりでなく、少しくらいは自分で調べろ。


899 名前: デフォルトの名無しさん 投稿日: 02/03/17 18:44
>>892
には #include<stdio.h> って書いてるのに、
>>895
って、


ネタですか?

そうでなかったら、
charray の行末のセミコロン抜けてたりしてるから、
まず正確にコードを写すことを心がけた方がいいと思うよ。



900 名前: デフォルトの名無しさん 投稿日: 02/03/17 21:07
>>899
コードを手で写している以上、まともなプログラマにはなれない。


901 名前: デフォルトの名無しさん 投稿日: 02/03/17 21:16
>>900
コピペだけ覚えてもまともなプログラマにはなれない。


902 名前: デフォルトの名無しさん 投稿日: 02/03/17 21:57
>892
とりあえずくだらないタイプミスが何カ所かあります。指摘するのは簡単なんだけど
1行目が #include<stdio.h> なのにコンパイラに
>エラー E2209 E:\program.c\2.c 1: インクルードファイル 'studei.h' をオープンできない
っていわれているのだから掲示板に書き写すときにまたタイプミスしています。
自分が実際に書いたコードをコピペした方が問題点がはっきりするからコピペ奨励。





903 名前: 892 投稿日: 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]
となる。環境を書かないとみんな一般的な話をするしかなくなるので自分がどういう状況で
困っているのか必要十分な情報を伝えるように。

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




905 名前: デフォルトの名無しさん 投稿日: 02/03/17 23:07
実行できないのですが


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

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

甘やかしすぎちゃったかな。


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

>実行できないのですが

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

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

君は教えてくん認定。

もう俺は知らん。


908 名前: デフォルトの名無しさん 投稿日: 02/03/17 23:38
>>905
makeは、コンパイルするコマンドであって、実行するコマンドじゃないよ。
Cではコンパイルして実行ファイルを一度生成して(これをmakeがやる)、
次にその実行ファイルをdos窓から実行すると、実行されるんだよ。
C:\>e:
E:\>cd \program.c
E:\program.c> 2.exe.
て感じかね?
(コンパイルして生成された実行ファイルがE:\program.c\2.exeならね)

漏れはWindowsではVCしか使ったことないので、BCCの
詳しいとこは分かんないけど。


909 名前: デフォルトの名無しさん 投稿日: 02/03/18 00:44
教えて君にはあまり構うなよ。教えてる奴は善意かもしれんが、
結局ここに教えて君が多数住み着くようになり周りの奴にとって
害になるからな。

質問するやつは「十分に自分で調べた後」、「環境」、「状況」を
できる限り細かく書け。何がわからないかがわからなければ
こちらとしても答えようが無い。


910 名前: ビル・ジョブス 投稿日: 02/03/18 02:31
HANDLEってのを簡単に説明すると、
「色々なオブジェクトを管理するための構造体へのポインタ」
って事になるな。


911 名前: デフォルトの名無しさん 投稿日: 02/03/18 02:42
>>910
間違っちゃいないが、素人っぷり全開なレスにしか見えないのは俺だけか?


912 名前: デフォルトの名無しさん 投稿日: 02/03/18 02:54
>>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?」って聞き返してるよ・・・フー



917 名前: デフォルトの名無しさん 投稿日: 02/03/18 03:22
ハンドルって、ポインタへのポインタだったり、構造体の配列のインデックスだったりするけどね。


918 名前: ビル・ジョブス 投稿日: 02/03/18 03:26
>>911
あっ!そーだ!
じゃー貴様が説明してみろよ!(50文字以内で)


919 名前: ビル・ジョブス 投稿日: 02/03/18 03:29
>>917
そんな事は百も承知ですが・・・フー


920 名前: デフォルトの名無しさん 投稿日: 02/03/18 03:36
>>919
おいおい >>910 と言ってることが違うだろ(w


921 名前: ビル・ジョブス 投稿日: 02/03/18 03:49
>>920
「簡単に」って書いてあるだろ?
それとも「HANDLEの指し示す型を全部言え」ってか?
おまえアフォ?



922 名前: デフォルトの名無しさん 投稿日: 02/03/18 03:52
ジョブス厨房すぎる。
日下部さん帰ってきてよ〜


923 名前: デフォルトの名無しさん 投稿日: 02/03/18 03:56
>>920の負けですな


924 名前: デフォルトの名無しさん 投稿日: 02/03/18 04:46
簡単にいうと>>923==ビル・ジョブス


925 名前: デフォルトの名無しさん 投稿日: 02/03/18 07:38
ビル・ジョブス は放置ということでお願いします。>> ALL


926 名前: sage 投稿日: 02/03/18 07:43
ええそうですね、ついでにつまらんことでageた>>925も放置で・・・


927 名前: デフォルトの名無しさん 投稿日: 02/03/18 11:40
ちっと気になったんだけど、>>910の言う「オブジェクト」ってのは、
ペンとかブラシ(GDIオブジェクト?)って意味でよろしいか?

とすると、>>911>>914が気になってる点はどこ?


928 名前: デフォルトの名無しさん 投稿日: 02/03/18 12:04
>>926
このスレは sage なきゃならんの?


929 名前: デフォルトの名無しさん 投稿日: 02/03/18 12:28
それで?


930 名前: デフォルトの名無しさん 投稿日: 02/03/18 13:00
>>927
一番気になってるのは、たぶん、それがビル・ジョブスだって事。


931 名前: デフォルトの名無しさん 投稿日: 02/03/18 13:06
>>927
ハンドルが指し示すリソースって、プロセスとかファイルとかデバイスとか、
そういうレベルで捉えるもんでしょ。
まあ、実装は特定のメモリとそれを指すポインタかもしれないけど、
「構造体」って言葉で説明してしまうとなんかちがうよな。



932 名前: 927 投稿日: 02/03/18 13:21
>>930
なるへそ。


933 名前: デフォルトの名無しさん 投稿日: 02/03/18 13:56
遙か昔の>>886で回答でてるじゃん。
今頃とんちんかんな回答するやつは誰だ?


934 名前: 934! 投稿日: 02/03/18 14:14
OSで使うハンドルのことを、構造体へのポインタなんて説明してる
ほうがトンチンカンだろ。


935 名前: デフォルトの名無しさん 投稿日: 02/03/18 14:24
OSの中身タコと無いんだね。
かわいそうに



936 名前: デフォルトの名無しさん 投稿日: 02/03/18 14:30
#define CHUBO 8
#define ITTEYOSHI (CHUBO*8)

のような多重defineは合法ですか?



937 名前: デフォルトの名無しさん 投稿日: 02/03/18 14:35
>>936
合法だ。


938 名前: 936 投稿日: 02/03/18 14:45
>>937
どうも〜
ちょいとしたパズル解きでやりたかったので。



939 名前: デフォルトの名無しさん 投稿日: 02/03/18 15:18
>>935
ハンドルはハンドルだろ
実装ならポインタよりテーブルのインデックスのほうが近い(事が多い)


940 名前: デフォルトの名無しさん 投稿日: 02/03/18 17:20
メモリをバイト境界にアラインする理由、メリットとはなんなんでしょうか?
アラインしないほうがメモリが節約されていいような気がするのですが。




941 名前: デフォルトの名無しさん 投稿日: 02/03/18 17:31
>>940
バイト境界にアライン、というと1バイト境界, つまり逆にパックすることを意味するように取れるが。

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

ということで、アラインサイズより大きなデータへのアクセスは、普通避ける。


942 名前: デフォルトの名無しさん 投稿日: 02/03/18 17:36
流石2ch、素早いレスありがとうございました。


943 名前: U-名無しさん 投稿日: 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++のインストールはオプションまですべてインストールしたのですが…



945 名前: デフォルトの名無しさん 投稿日: 02/03/18 20:25
>>944
grepした?


946 名前: デフォルトの名無しさん 投稿日: 02/03/18 20:58
>>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のコメント除去をするプログラムの裸の版を教えてください。


949 名前: デフォルトの名無しさん 投稿日: 02/03/19 00:34
>>948

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

$data =~ /\/\/.*$//g;
$data =~ /\/\*.*\*\///g;
}



950 名前: デフォルトの名無しさん 投稿日: 02/03/19 00:39
>>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
ある文字列の中で、複数文字列からなるデリミッタの位置を返す関数を考えてるん
だけど、単一文字デリミッタならいけるんだけど、複数文字列だと配列に順番に
シフトしながら入れていって比較を繰り返すという感じにするしかないんでしょうか?
もうちょっとエレガントで少ないコード行でできませんかね?


955 名前: デフォルトの名無しさん 投稿日: 02/03/19 01:04
>>954
strstr()じゃだめ?


956 名前: デフォルトの名無しさん 投稿日: 02/03/19 01:08
>952
コメント除去はスチャラカでいいなら

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

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

>954
strstr使ったらうまくいきそうに思えるけど。デリミタのポインタが返ってくるんじゃないの?


957 名前: デフォルトの名無しさん 投稿日: 02/03/19 01:13
>>955
>>956
ライブラリでそういう関数が既にあるんですね。
自分で作ろうとしてました。どうもです。


958 名前: ビル・ジョブス 投稿日: 02/03/19 01:18
>>957
ANSI/UNICODEに気を付けて。


959 名前: デフォルトの名無しさん 投稿日: 02/03/19 07:35
ビルはいわゆる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
新スレは?


965 名前: 961 - 963 投稿日: 02/03/19 12:25
コードがべたでスマソ。
間違ってたら誰かなおしといてクリ。

ところで次スレはどこ?


966 名前: デフォルトの名無しさん 投稿日: 02/03/19 12:27
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


968 名前: デフォルトの名無しさん 投稿日: 02/03/19 12:49
文字列定数に含まれた /* */ はスキップしないのか?


969 名前: デフォルトの名無しさん 投稿日: 02/03/19 12:52
ぜんて、がいい


970 名前: デフォルトの名無しさん 投稿日: 02/03/19 12:56
>C言語なら、俺に聞いてくれませんか?==15;

腰が低いのはイヤだな。なんとなく。


971 名前: デフォルトの名無しさん 投稿日: 02/03/19 13:16
C言語なら私におまかせ♪+=15;

媚びてみるというのは?


972 名前: デフォルトの名無しさん 投稿日: 02/03/19 13:30
>>971
ネカマっぽい 藁


973 名前: デフォルトの名無しさん 投稿日: 02/03/19 13:58
C言語なら、他に聞け! <15>


974 名前: デフォルトの名無しさん 投稿日: 02/03/19 14:00
>>973
(あかんやん・・・。> Σ(`ヾ)<


975 名前: デフォルトの名無しさん 投稿日: 02/03/19 14:07
ハンドルされてない例外って何ですか?


976 名前: デフォルトの名無しさん 投稿日: 02/03/19 14:14
>>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
>>975
スレ違いだ。
http://pc.2ch.net/test/read.cgi/tech/1008311607/
でも嫁。


980 名前: デフォルトの名無しさん 投稿日: 02/03/19 14:46
HTMLのタグの話しなら、
XMLやHTMLのタグを解釈するライブラリを探して使え。
それがなければ構文解析をするプログラムをCで書け。



981 名前: デフォルトの名無しさん 投稿日: 02/03/19 14:47
>>978
parser を作る。


982 名前: デフォルトの名無しさん 投稿日: 02/03/19 14:49
>>978
「IEコンポーネントを使い倒すスレ」ってのがあったな。


983 名前: デフォルトの名無しさん 投稿日: 02/03/19 14:50
>>982
IEコンポーネントを使い倒すスレ
http://pc.2ch.net/test/read.cgi/tech/982930049/



984 名前: デフォルトの名無しさん 投稿日: 02/03/19 14:52
>>978
取得した後に何をやるのかがわからなければなんともいえない。


985 名前: 978 投稿日: 02/03/19 14:54
IEコンポーネントを見てみます
わざわざありがとうございます


986 名前: 973 投稿日: 02/03/19 15:01
C言語だけなら、俺に聞け! <15>
C言語っぽく俺に聞け! <15>
C言語なら、俺が聞く! <15>
C言語なら、俺を見ろ! <15>
C言語から俺が逝く! <15>

そろそろ番号がきびしくないか。



987 名前: デフォルトの名無しさん 投稿日: 02/03/19 15:05
そろそろ日下部はやめようぜ。



988 名前: デフォルトの名無しさん 投稿日: 02/03/19 15:09
それにしても2週間でスレ一つ使うとはかなり人の多いスレですね。


989 名前: デフォルトの名無しさん 投稿日: 02/03/19 15:09
漏れ的には Dennis Ritchie がいいな。


990 名前: デフォルトの名無しさん 投稿日: 02/03/19 15:19
残り10になッても誰もスレ立てようとしないのが
このスレのいい加減さを表してていい(藁


991 名前: 俺に聞いてくれませんか? 投稿日: 02/03/19 15:22
>>990
失敗しましたがなにか?


992 名前: デフォルトの名無しさん 投稿日: 02/03/19 15:25
プログラミング作法・ハーニンハン博士
( ;´Д`)


993 名前: デフォルトの名無しさん 投稿日: 02/03/19 15:28
新スレ勃てたよ。

C言語なら、俺に聞け! <15>
http://pc.2ch.net/test/read.cgi/tech/1016519243/l50



994 名前: デフォルトの名無しさん 投稿日: 02/03/19 15:30
>>993
おつかれー


995 名前: デフォルトの名無しさん 投稿日: 02/03/19 15:31
わーいわーい、ぜんてだぜんて!


996 名前: 女性雑誌にも載ってるよ♪ 投稿日: 02/03/19 15:32
http://www.kokorode.com/000000/



997 名前: デフォルトの名無しさん 投稿日: 02/03/19 15:54

女性雑誌 (;´Д`) ハアハア


998 名前: デフォルトの名無しさん 投稿日: 02/03/19 16:08



999 名前: デフォルトの名無しさん 投稿日: 02/03/19 16:16
後1…


1000 名前: デフォルトの名無しさん 投稿日: 02/03/19 16:18
1000


1001 名前: 1001 投稿日: Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。



2ちゃんねるは、ここのサーバを使ってるです。。。