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

このエントリーをはてなブックマークに追加
1ともっち
C言語質問すれです

・comp.lang.c FAQ
http://www.eskimo.com/~scs/C-faq/top.html
・C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html

・前スレ
<19> http://pc.2ch.net/test/read.cgi/tech/1020756993/

リンクは>>2-4あたり
2デフォルトの名無しさん:02/05/15 19:37
ともっちはいらん
3ともっち:02/05/15 19:38
僕は、17歳高校2年生。
3ヶ月前まではこんなことを言って皆さんをハァハァさせてしまいました。
http://pc.2ch.net/test/read.cgi/tech/1014370940/
だけど、それから優しいお兄さんたちにいろいろと教えてもらいながら、
勉強することで、C言語を大体マスターすることができました。

今ゲームを開発しているのですが、兄さんは僕自身を開発するとか
言って、なかなかプログラミングに集中させてくれません。
質問するたびに僕の体を触ってくるので正直困っちゃってます。
ぼく自身、そういうのは好きだけど、それだけじゃゲーム作りが進まないので、
ここに質問させてください。よろしくお願いします。
FAQ的な質問ならぼくも回答します。間違いがあれば、先輩方の訂正を
お待ちしております。

なお、課題の○投げは一応別スレへ、ということでお願いします。

プライベートな質問に関してはスレの950が過ぎたあたりから受け付けますので
それまでそういったことは、なるべく謹んでください。

立て直します。
5デフォルトの名無しさん:02/05/15 19:44
>>4
ティムポ、萎えちゃった?
・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/

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

コンパイラ

ぼくもgccは好きです!
http://gcc.gnu.org/

タダで使えるBorland C++!
http://pc.2ch.net/test/read.cgi/tech/1002377328/l50

Win32用の開発環境のみ。

gcc-cygwin
http://www.redhat.com/software/tools/cygwin/
gcc-mingw
http://www.mingw.org
Digital Mars C++
http://www.digitalmars.com/
Open Watcom
http://www.openwatcom.com/
Borland C++ Compiler 5.5.1
http://www.borland.co.jp/cppbuilder/freecompiler/

------------------------ ライセンスや機能などに問題あり ---------------------
Microsot C/C++ 13.0.9466(VC.NET)
http://www.microsoft.com/japan/msdn/netframework/downloads/
LCC-Win32
http://www.cs.virginia.edu/~lcc-win32/
CINT
http://root.cern.ch/root/Cint.html
めじろ++98
http://www.vector.co.jp/soft/win95/prog/se075910.html

その他
http://www.cmt.phys.kyushu-u.ac.jp/~M.Sakurai/prog/progf.html
http://www.bloodshed.net/index.html
void mainloop()
{
 hoyuji();
}
void hyouji()
{
 katakana();
 hiragana();
}
void katakana()
{
 namae();
 tosi();
}
void namae()
{
 printf("なんていうの?");
}
という感じで,関数を何回も入っていく場合は,皆さんはだいたい何回程度に抑えていますか?
ネタはいいから・・・>>8
>>8
必要ならいくらでも。
ただし、中を見なくても関数名を見れば何をしているか分かるようにすべし。
>>9
・・・
13デフォルトの名無しさん:02/05/15 20:53
もう20かい。
Cって多くの人が学んでいるのだなぁ
>>14
C覚えてれば大体の構造化言語は使えるから。
ていうかパート2以降のスレなら20くらいまであっという間なのは普通な気が。。
>>14
大学や専門学校のプログラミングの授業で採用しているところが多いと思うし。
だな。それで質問多い→回答多い→あっという間
>>14
おかげでCの糞スレも多いという事実
プログラマのたしなみでしょ。Cは。
>>1
おまえなんかにゃきかねーよーだ
int main(void)
{
int i, j;
int a[2][3] = { {1, 2, 3}, {4, 5, 6} };
int b[3][2] = { {6, 3}, {4, 5}, {1, 2} };
int c[2][2];

mat_mul(a, b, c);

for(i = 0; i <2; i++){
for(j = 0; j <2; j++){
printf("%d ", c[i][j]);
}
printf("\n");
}
}

質問してみます。
返却値返せって出る・・・何で?
>>22
素人かい・・・。returnが無いぞ。
。・゚・(ノД`)・゚・。 スイマセン上手くいきました(bcc55)

しかしUnixでやったときはreturn無しでも上手くいったのに・・・
ちなみにgnuwinだとreturnつけてもエラーが・・・(´・ω・`)

[main] C:\root\home\a.exe 1079 (0) handle_exceptions: Exception: STATUS_ACCESS_V
IOLATION
[main] a 1079 (0) handle_exceptions: Dumping stack trace to a.exe.core
>>23
多分C++のプログラムと解釈されて、mainにreturnがなくても警告でなく
なってるんじゃない?
>>24-25

>int main(void)

反論の余地はないよ。WindowsだからとかC++だからとか。
>>26
反論の余地があるよ。C++だったら。
C++ は main という名前の関数は特別扱いで、末尾に return が無い場合は暗黙に return 0; があるものとされます。
28デフォルトの名無しさん:02/05/16 10:03
C言語質問ホンスレ!
29デフォルトの名無しさん:02/05/16 11:04
回転シフトするプログラムが欲しいです。お願いします。
(var << x) | (var >> bits - x)
>>8
 分割に意味があれば、幾らでも。
 でも、おいらオバカだからパーツとしての関数(標準関数みたいな純粋な機能)以外は、あまり分割しないなあ。
 初期化、ファイル読み込み、メイン、終了処理とかって感じで、相当に単純だと思う。
 所詮、上から下にしか処理を書けない非オブジェクト指向な人間なんで(^^;
>>29

int main()
{
char *text="ShiftShift";
for( int i=0; i<=10000; ++i )
{
fputs( "\r", stdout );
fwrite( text+i%5, 1, 5, stdout );
}
}
33デフォルトの名無しさん:02/05/16 11:18
>>30
すいません。私バカなんで。。。
xとbitsは何に使うんでしょうか?
3429:02/05/16 11:21
>>32
スイマセン.ポインタとかファイルストリームは使わないでください。・゚・(ノД`)・゚・。
>>33
回転シフトって何か曖昧な表現無しで説明して。
その後もう一回>>30を読んでみて。
3629:02/05/16 11:44
xとbitsわかりました。
右回転シフトの場合(1bitずつシフトする)
1.ある変数値aの一番右にあるビットをbに格納
2.aを右に1bitシフト
3.aの最上位ビット(一番左)にbを入れる
この3ができません。
3729:02/05/16 11:52
スイマセンワカリマシタ
|演算見落としてました。||これだと勘違い(恥)
アリガトウゴザイマス。・゚・(ノД`)・゚・。
>>37
unsigned にすんの忘れんなよ
ラジャー!
40デフォルトの名無しさん:02/05/16 12:25
今だ!パコンパコンパンパンしながら500ゲットォ!!
 ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
        ∧∧
       (゚Д゚ )           (´´
アアン !  ∧∧⊂  ヽ/       (´⌒(´
   ⊂(=^_^;=⌒ `つ つ≡≡≡(´⌒;;;≡≡≡
      し' ̄ ̄   (´⌒(´⌒;;
            ズザーーーーーッ


ドッコイショ・・・・・・・・・
 ̄ ̄ ̄ ̄ ̄ ̄∨ ̄ ̄      (´´;;
      ∧∧∧∧        (´;;
  〃 (=^_^;=)Д-)
 〃 ⊂(。(。 つと| グィッ
   〃  > y ) /〜))
      .し'し' U


何見てんだゴルァ!!
 ̄ ̄ ̄ ̄ ̄ ̄∨ ̄ ̄
  パ  ∧∧ ∧∧  パ
  ン (=^_^;=)゚Д゚)  ン
     (.ノ(し⊂ニノ ))
ミナイデェ > y ) /≡〜
     .し'し' U
41デフォルトの名無しさん:02/05/16 12:28
ともっちと俺
42仕様書無しさん:02/05/16 12:32
>>41
前スレあまってるだろ
つーかちょー迷惑なんですけど
根本の原因のともっちにはマジ責任とって氏んでほしい
44デフォルトの名無しさん  :02/05/16 12:59
あるライブラリを書いているときに、
ヘッダーを内部ようと公開用の二種類作るのは
変でしょうか?プログラム構成に関しては色々と
本に書いてあったりしますが、ヘッダーの良い
書き方なんかについて言及してるものは少ないですよね。

Linuxでいえば
linux/include
linux/asm-i386
みたいに分ける感じの方がいいのかな?
linux/include/linux
linux/include/asm-i386
の間違いです、すみません。
46デフォルトの名無しさん:02/05/16 13:10
ともっちってすごいね!
ダブルで1000げっと、おめでとう!
http://pc.2ch.net/test/read.cgi/tech/1020756993/1000
http://pc.2ch.net/test/read.cgi/tech/1013917354/1000

     ついでに1までとってるね。(w
47デフォルトの名無しさん:02/05/16 13:15
(((((,;,゚д゚) イモイモムシムシ
48デフォルトの名無しさん:02/05/16 13:17
>>44
別に普通じゃないか?
49デフォルトの名無しさん:02/05/16 13:22
I'm free to be whatever I
whatever I choose
And I'll sing the blues if I want
50悩むこと1週間:02/05/16 13:43
トケタ━━(゚∀゚)━━ァ!

やっぱ2chの力は凄いわ、サンクス
I get up - when I'm down
I can't swim - but my soul won't drown
I do believe - I got flare
I got speed and I walk on air
アヒャ━━(゚∀゚)━━ァ!
53デフォルトの名無しさん:02/05/16 18:23
(;´Д`)赤玉って本当に出るんですか?
心配でオナニーに気合いが入りません。
だって、これが最後かも・・・って考えてしまうと、
つい、未来の為にとっておこうって思っちゃうんですよ。
いや、それでもイクんですけどね、一応は。
でもこれじゃいけないなぁって後から悩んじゃう訳なんですよ。
限り有る精子をもっと有効(中田氏)に使わなきゃって。
あぁ、出たらどうしよう!
54デフォルトの名無しさん:02/05/16 18:24
さっきまた旦那のあれ掃除機で吸ったんですよ
そしたらポロってとれちゃって
どうすればいいですかね?
血が止まんなくて大変です。
55デフォルトの名無しさん:02/05/16 18:43
>>53
>>54

いいかげん許容範囲を超える。やめろ。

あと、いつまでも「ともっち」言ってるやつら、他のスレでやってくれ。

いくらなんでも最近荒れすぎ。
これはジョブズ師匠が出てきてくれないと収まらないな
switch(Syanpu){
case Masyeri:
まるいち
break;

case Syokubutumonogatari:
まるに
break;

case Vidarusasuunn:
まるさん
break;
}

まるいち、まるに、まるさんの部分に10行以上の長い文を書くのってへんですか?
SEの入社試験とかのソースでそんなふうに書いたらあかんですか?
それよりだったら,その部分を関数にまとめた方がいいですか?
>>57
>SEの入社試験とかのソースでそんなふうに書いたらあかんですか?

その会社ほんとにSE業なのか・・・?転職?
>>57
シャンプーの綴りくらい。。。
>>57
俺は別に100行くらい書くけど。
もちろん関数に分割できればそれに越したことはないけど。
{}でカコッてローカル変数を分けることかな。
おれもヘタレかもしれん。
アンダースコアひとつで始まる名前は、グローバル ネームスペースで使う名前として実装によって予約されています?

そーすると、アンダースコアひとつで始まる名前は、ローカル変数には自由に使って何の問題もない?
63PNPO:02/05/16 22:23
独学でCやりたいんだけど結局、入門書読んではじめるのが一番いいの
か?みんなどういう方法でマスターしていったんだ?
>>63
薄い本買って読んで猿のように書いた。
後、QUICK Cのヘルプは最大限活用した。
fclose はエラーが発生すると EOF を返すらしいです。
クローズ処理でエラーが発生したら、つまりこのファイルはクローズされないんでしょうか?
もしそうなら、クローズするためにもう一度 fclose してもまたエラーになりそうですが、そーすると結局どうすれば FILE* を解放できるんでしょうか???
66デフォルトの名無しさん:02/05/16 22:34
>>63
 何かを作りたくて一所懸命&楽しい、ってゆう状態にもっていく工夫をして下さい。
 それができないようだと我慢の勉強になってしまいます。
67デフォルトの名無しさん:02/05/16 22:36
>>65
fcloseが失敗するのは見た事ないです
でもそうなったら処理系依存の話になっちゃうんじゃないでしょか?
68デフォルトの名無しさん:02/05/16 22:44
>>57
某WIN32系の本に影響されて俺はswitch部はジャンプテーブル的に
使っています。理由はやり方こそ違えど60さんと同じ。1つの関数
に違う処理を突っ込みすぎると変数の再利用などでグチャグチャに
なりやすいからです。


>>67
不正なFILE*を渡せば・・・(w
6968:02/05/16 22:48
>理由はやり方こそ違えど60さんと同じ

61さんだった・・・メンゴ
fwrite/fcloseで書き込みエラーは取れません。
ディスクとCPUが非同期になっているため、プログラムの
終了後にエラーがくる場合があるからです。
また、mallocがNULLを返さないOSもあります。
これも実際に使用するまで取らないからです。
将来、これらの関数を全部voidにして、
シグナルや例外処理およびプログラム終了後の
ハンドラ登録方式にでもにまとめるべきかと。
>>62
実装側でグローバルネームスペースで使うマクロが
存在する可能性があるのでオススメできないぞ。
>>70
fwriteでdisk fullは取れるYO!
>>65
書き込み処理を行ったものについてfcloseがエラーを返したら、
書き込みが失敗したとみなすべきですね。
74初心者:02/05/16 23:39
ちょっとお聞きしたいのですが%dというのはPrintfで数値という意味ですが
%2dとはどういう意味ですか
75PNPO:02/05/16 23:40
>>64
サンキュー!
猿のように書いたって、本に書いてる例題プログラムとかをやった
っていうこと?
>>66
サンキュー!
なんか精神的につらそうだな〜・・・
君はあれかね、本は読まないタイプの人間かね
void fclose(); ぢゃないの?
ぢゃないの。
79初心者:02/05/17 00:04
>>76
%dはどの本にもでているんですが%2dはどこを調べてもでてないんですよ
君はマニュアルが読めない類の人種みたいだね。
ふーん。
82デフォルトの名無しさん:02/05/17 00:08
>>65
exitする。
あるいはmainでreturnする。
83デフォルトの名無しさん:02/05/17 00:13
>>74
%2d→2桁右寄せで出力するということだ
ちなみに、%02d、こうすれば0もつけてくれるぞ。
%*d は?
>>79
(´ー`)。oO(そんな事も書いてない本って、どんな本だろう?)
65
思いっきりSCANDISKしたほうがいいとおもうな。完全オプションつきで。
87初心者:02/05/17 00:18
>>83
ありがとうございます。
助かりました。
俺がいつも心配なのはこういう初心者の質問に逐一教えていくと
初心者はわからないことがあるたびに検索せずに
質問してくるんじゃないかと・・・
89 :02/05/17 00:24
近頃の剥いたでは煽る・罵る・貶めるだけで質問に答えられんヴァカが
いるみたいだな。。。。
>>89
どう控えめに見ても君がヴァカだ。
つーか検索しなくてもフォーマット文くらいなら試してみればよいのに・・・
すぐ人に聞く人はプログラミングの楽しみの90%を逃しているよ。
どうせ宿題小僧なんだろうけどさ
関係ないけどやっぱ名前を空白にする人ってのはゲハ癖の抜けない厨房クンなのかな?
>>89
と煽る君がとてもかわいいよ。。。。
(´・∀・`)へー
質問内容によっちゃ>>89のが当てはまる場合もあるが
今回ばかりは質問が「%2dって何ですか?」だもんな・・・
96 :02/05/17 00:52
多分本に乗ってても読めないんだと思う。
慣れるしかないんだけど
%2dのわからない君にこそ、倉薫をお薦め・・・
%2dなんてあんまりつかわねーよ
普通は%02dか%.2dだろ
99デフォルトの名無しさん:02/05/17 01:42
printf("%*s", space, "");

こんな邪悪なことしてたことある人いる?
使うか使わないかの話ではなくそれくらい調べろよという話だ
だな
>>99
#define _(a) a&&a
 :

if (10 < _(foo) < 100)

こんなことしてた奴もいる。てか漏れ(藁
>>89は、%2dがわからないとき「%2d」で検索する、に1票。
>>102
で、振りかえってみて、あの頃の自分が恥ずかしい、と。
105102:02/05/17 02:11
穴があったら入れたい
>>105
ワロタ
107デフォルトの名無しさん:02/05/17 04:08
火のついたプロジェクトのへルプにはいることになって、
先輩からへッダを渡されてこの中身のbitio.cを作れと言われました。
先輩は、殺気立っててあんまりしつこく聞けません。
よろしくお願いします。少しでも良いです。ヒントをお願いします。

#ifndef bitio_h
#define bitio_h
#include <stddef.h>

typedef struct bitout BITOUT;

extern BITOUT *bitout_open(const char *filename);
extern void bitout_close(BITOUT *);
extern void bit_write(BITOUT *, size_t nbits, unsigned long bits);
extern void bit_flush(BITOUT *);

typedef struct bitin BITIN;

extern BITIN *bitin_open(const char *filename);
extern void bitin_close(BITIN *);
extern unsigned long bit_read(BITIN *, size_t nbits);

typedef void (*ioerr_handler)(const char *fmt, ...);
extern ioerr_handler bitio_error; // Default: print and die.
#endif
108デフォルトの名無しさん:02/05/17 04:14
>>107
仕様書みたいなのはないのか?
なければ先輩の頭をキーボードでぶん殴っていいです
109デフォルトの名無しさん:02/05/17 04:15
>>107
その先輩に↓を見るように言うんだ
http://pc.2ch.net/test/read.cgi/tech/1021459016/107
それで解決


・・・しなければ上司に助けを求めろ
>>108
えっとへッダを印刷したプリンタ用紙に
「可変長ビットI/Oモジュール: 最大32bit」
と鉛筆で殴り書きしてありますた。

これだとマウスでシバクくらい良いでしょうか?
やりたいことも整理できずに、ヘッダそのままもってくるあなたへの
最適な助言としては・・・「諦めてさっさと逃げ出せばーか」ですが、、、

どうしても知りたきゃ情報圧縮の本でも読みなさい。
struct bitout {
unsigned int tmp;
short shift;
FILE *fp;
};
>>110
いえ、キーボードで死なない程度に殴ってください。
ついでにあなたも自分の顔をマウスで殴ってください。

すまんが、これはどういうプログラムの一部なんだ?
bitio.cはなにをするんだ?

http://www.google.co.jp/search?q=bitio.c&ie=UTF8&oe=UTF8&hl=ja&lr=
Googleで検索すると圧縮関係が多くヒットするけど、そっち方面とは関係あるか?
114デフォルトの名無しさん:02/05/17 04:27
>>108
このヘッダ見てやりたいことがわからない奴はプログラマ辞めたほうが良い
と思う。くらいに自明でありがちなパターンだよーん。
115デフォルトの名無しさん:02/05/17 04:28
>>113
君もディスプレイに頭突っ込みなさい。
ビットリードライトは可変長の操作が必要なハフマンとかの圧縮アルゴ
では当たり前の部品だ。
>>114=先輩登場、という罠。
117114:02/05/17 04:30
残念ながら俺様はのんきな大学院生(w
グレイ符号とかかな。
こんな感じだろ。あとは自分でやれや。

#include <stdio.h>
#include "bitio.h"

struct bitout {
 unsigned long bitbuf;
 size_t nbits;
 FILE *fp;
};

void bit_write(BITOUT *out, size_t nbits, unsigned long bits)
{
 if (out->nbits + nbits > 8) {
  putc((out->bitbuf << (8 - out->nbits)) |
(bits >> (nbits - 8 - out->nbits)),
out->fp);
  nbits -= (8 + out->nbits);
 }
 while (nbits > 8) {
  putc(bits >> (nbits - 8), out->fp);
  nbits -= 8;
 }
 out->bitbuf = bits;
 out->nbits = nbits;
}
120119:02/05/17 04:35
ずれた。欝。
>>115
そりゃそうだが、他人事とはいえウソ書いちゃまずいかと思って念のため。。。

今から頭つっこむんで、当分書き込めませーん。じゃあ逝ってきます。

gray code は隣接する符号を1ビットだけ変化するように構成して誤りチェック
に有利にした符号ってだけであって、あまり関係ないと思うよ。
123shige:02/05/17 04:39
データ圧縮ハンドブックの付録ディスケットに、
baka
125デフォルトの名無しさん:02/05/17 04:43
Ruby!!!!!!
>>119
間違ってるYO!
  putc((out->bitbuf << (8 - out->nbits)) |
     (bits >> (nbits - (8 - out->nbits))),
     out->fp);
  nbits -= (8 - out->nbits);
だろ。

ついでに他も添削しちゃる。

void bit_write(BITOUT *out, size_t nbits, unsigned long bits)
{
 if (out->nbits + nbits > 8) {
  nbits -= (8 + out->nbits);
  putc((out->bitbuf << (8 - out->nbits)) | (bits >> nbits),
     out->fp);
 }
 while (nbits > 8) {
  nbits -= 8;
  putc(bits >> nbits, out->fp);
 }
 out->bitbuf = bits;
 out->nbits = nbits;
}
127デフォルトの名無しさん:02/05/17 04:44
which endian?
インディアン関係無い
129デフォルトの名無しさん:02/05/17 04:49
つーか吐き出した部分削るの忘れてるし(w
教育的配慮?
1bitを書きつづけると楽しいことになりそうだね
unsigned long のインディアン嘘つかなーい?
出力する方向がwriteのMSBからかLSBからか決めなくていいのか?
だからさっきからインディアンって・・・
134デフォルトの名無しさん:02/05/17 07:40
>>107
自分でできないその先輩を殴っていいよ。
>>134
あのヘッダを見ても本当にその先輩が自分で出来ないとか思うか?
107はそのレベルから見ても員数外要員だと思うんだが
使えない107を何とかして使ってやろうという心意気を感じる
正直実は演習問題かなんかなんだろ?
こんな車輪の再発明を予備要員にさせる「現場」っつーのが思いつかん。

一番ありそうなのは学校の課題のバカ同士での擦り付け合いって気が・・
BITINとBITOUTを別にしてるところあたり微妙な気もするけど、確かに
マトモな現場ではなさそう。
>BITINとBITOUTを別にしてるところあたり微妙な気もするけど
本気で言ってるなら、自分でビット入出力のモジュール書いてみろ
>>139
ちゃんと説明してごらん。いや是非アフォな俺のためにしてください。


つか書いたことあるけど(w
>>139
正直俺も知りたいのでAGE
142デフォルトの名無しさん:02/05/17 08:48
オーバフローやアンダーフローをif文で判定するにはどうすればいい?
143デフォルトの名無しさん:02/05/17 08:48
オナニー大好きとプリントアウトしたいんですが、
どうやってCで書けばいいでしょうか?
144139:02/05/17 08:51
ランダムアクセスで読み書きを行えるようにすると、
未出力分との整合を取るコードを書かなければいけないし、
そもそもbit単位でのファイルI/Oは、シリアライズ以外での利用方法が無いから、
読み書きを同時に行うメリットがない。

どうしてもランダムアクセスにする必要があるなら、
ファイルIOとビットバッファを分離して、
ファイルから一部(または全部)をメモリに読み込んだ後に処理すべき。
145デフォルトの名無しさん:02/05/17 08:51
>>142
絶対値が大きいほうの項との符号を比べちゃだめ?
146デフォルトの名無しさん:02/05/17 08:52
>>145
aがオーバフローしているときはどうするの?
puts("\0(´д`)y-~~sineyo");
148デフォルトの名無しさん:02/05/17 08:52
>>144
は??? お前138の言ってることがわかってる?
構造体を別にする必要が無いって意味だぞ。107を良く見直せ。
んじゃー、構造体を使い回す意味ってある?
馬鹿がbitoug_open()で開いて、bit_read()を発行する可能性もあるが。
人間素直に認めることも大事だと思うがどうか?
プログラマの責任とか、中でフラグを持ってassert()するとか言うなよ。
コンパイルにチェックが走って通らない方が何倍も安全なんだから
>>146
aってなんだよ(w
まあ数値だけからって言いたいんだろうけどさ。どうしてもなら演算直後
にasm使うとか(間に別の演算が無いという保証は無いが)。
153デフォルトの名無しさん:02/05/17 09:00
たとえば,
while(??){
a/=2.1;
b=3.0/a;
}
なんてやっているとそのうちbがオーバフローしますよね
そのときに,それ以上計算がされないように食い止めたいのです
while(b == 3.0/(a/2.1) * (a/2.1) ){
a/=2.1;
b=3.0/a;
}
>>153
環境わかんないけどSIGNALはつかえねーの?
>>154
詳しくないんだけど、それって演算誤差の方が支配的なんでは・・・?
157デフォルトの名無しさん:02/05/17 09:07
>>154
なんとなくできそうな気がしました
>>155
わかんないっす

もう時間なので,また来ます
ありがとう
浮動小数の比較に==はキケン
159デフォルトの名無しさん:02/05/17 09:18
>馬鹿がbitout_open()で開いて、bit_read()を発行する可能性もあるが。

単純なシリアライズが殆どと自分で逝っておきながらこんな例を出すのはちょっ
と屁理屈くさい気もせんではないが、まあ typedef ではチェックできない
のは確かか。なんか上手い手ないのかね。
>>158
先生!
(fabs(foo-bar)< e)
でOKっすか?
eはどうやって決める?
ヘッダに書いてある EPSILON の値
オーバーフローした場合の値がそのチェックで正常に通るか規定されてないと思うが
>>163
ぐあっ,,確かに。

http://www-utheal.phys.s.u-tokyo.ac.jp/docs/manual/fitsio/node40.html
>defines certain special values that are used to represent such
>quantities as Not-a-Number (NaN), denormalized, underflow,
>overflow, and infinity.

この辺が答えかな? つーかあなたのような人が先輩か先生だったらなあ・・・
俺は俺みたいなのが先輩や先生だったら萎える
ちょっとお勉強してきました。
win32だと status87()(statusfp()), control87()(controlfp()) とか
でFPフラグを弄ったり見たりできるようですね。Linuxでは__setfpucw()で
OKなのかな?
どうせ依存ならインラインアセンブラを使った方がいい
>>164
むしろ全国の先生・先輩の方が、自分で勝手に調べてくれるタイプの生徒・後輩を
熱望してると思うよ(w
>>153
 b が大きくなるか小さくなるかは、分子と分母の関係から分かりますよね。

 で、計算前の b と計算後の b を比較して、大きくなる筈なのに小さかったらオーバーフローでは?
errnoでEDOMかERANGEかHUGE_VALあたりをチェックしてみては?
あとは>>155のいうようにsignal()でSIGFPEでも捕まえてみるのは?
オーバーフローしたあとで捕まえて間に合うのか知らんけど。

ところで実数でも>>169のいうようにラップアラウンドするの?ビット的にはどっちかの無限大だかNaNだかになりそうな気が。
171デフォルトの名無しさん:02/05/17 12:18
172ともっち:02/05/17 12:31
お兄さんがた、おしえてください!
空栗鼠はこっちしかサポートしてないかな?

http://www.informatik.uni-frankfurt.de/doc/man/hpux/fpgetsticky.3m.html
174わからへん。。。:02/05/17 14:28
だれか教えて下さい。

ファイルの文字の出現比率を表示するプログラムを書きなさい。
「英字、数字、空白、改行、その他」の文字ごとに表現比率を表示しなさい。
175デフォルトの名無しさん:02/05/17 14:35
>>172
なんだいともっち
お兄さんが頭の上から足先まで何でもみてあげるよ
さあ、脱いでごらん
>>174
ctype.hをインクルドしよう
>>174
1文字ごとに頻度を数えるなら、

#include <limits.h>
unsigned count[UCHAR_MAX];

に頻度を記録しとけば良いだろう。

文字種ごとの頻度は、

#include <ctype.h>
unsigned class_count[4];

として、文字cについて、
class_count[!!isalpha(c) + !!isdigit(c) * 2 + !!isspace(c) * 3]++;
すればよい。
178お兄さん:02/05/17 14:48
>>174

int cbuf, sum, alpha, digit, space, newline, other;
sum = alpha = digit = space = newline = other = 0;
while((cbuf=getchar()) != EOF){
if(isalpha(cbuf)) alpha++;
else if(isdigit(cbuf)) digit++;
else if(cbuf != '\n' && isspace(cbuf)) space++;
else if(cbuf == '\n') newline++;
else other++;
sum++;
}
if(sum > 0)
printf("英字(%d%%)\n"
"数字(%d%%)\n"
"改行以外のスペース(%d%%)\n"
"改行(%d%%)\n"
"その他(%d%%)\n",
alpha%sum,
digit%sum,
space%sum,
newline%sum,
other%sum
);
else
printf("いやーん\n");
179お兄さん:02/05/17 14:50
あれ?なにやってんだ
死んできます・・・(_A_;)
>>178
getcharだと標準入力から読んじゃうぞ〜
fgetcでしょ。
>>177
>unsigned class_count[4];
>class_count[!!isalpha(c) + !!isdigit(c) * 2 + !!isspace(c) * 3]++;

だめじゃん。
map<char, int>で・・・あ、Cスレだった(w
183デフォルトの名無しさん:02/05/17 15:05
と言ってみるテスト。
184デフォルトの名無しさん:02/05/17 15:06
関数にexternをつけている人は何を考えているんですか?
省略という言葉を知らないんですか?
185デフォルトの名無しさん:02/05/17 15:10
>>184
また使い古された煽りを
>>185
古臭かったか(鬱
>>107の先輩を煽ったつもりなんだが。
こういう奴ってautoとかも書いているのかなー
>>186
さすがにauto書いていたら珍人物だな
そんな珍しいソースを読んでみたいな
extern "C"
俺の使ってるコンパイラに附属してるへッダだと関数は全部externが
ついてるな。なぜだろう?
>>181 何がダメなの?
isalphaとisdigitとisspaceはたかだか1つしか真にならないと思うけど。
191デフォルトの名無しさん:02/05/17 15:32
>>189
そりゃあたりまえだろう
>>191
へ?
>>107みたいなへッダだと略すのが当たり前で
標準へッダだと略さないのが当たり前なの?

ヨクワカラナイ…
193デフォルトの名無しさん:02/05/17 15:40
>>192

へッダで関数にexternつけるのは別に普通だよ。

>>184 はただのネタ。
linker & loader を勉強すればどっちでも良いがかわいいコンピュータ
君のために extern を付けてあげたくなっちゃうんだな(w
>>190
「英字、数字、空白、改行、その他」ごとにカウントするんでしょ?
>>194
後から読む俺様のためにも、だ!ボォゲェ!
>>195
unsigned class_count[5];
class_count[!!isalpha(c) + !!isdigit(c) * 2 + !!isspace(c) * 3 +
(c == '\n') * 4]++;
>>195
ちゃんと係数かかってるジャン??
何だ揚げ足取りだったのか・・・
>>197
まだダメ。
>>199
揚げ足とりというか、仕様をみたしてないじゃん。
(出題者の意図がわからんけど)
>>201
答えを完璧にするのは質問した奴の仕事。教えた奴は基礎的なことがあってれば
あとはどうでもいい。そこまで質問君に優しくしてやる必要はない。
>>201

英字はclass_count[1]に、
数字はclass_count[2]に、
空白はclass_count[3]に、
改行はclass_count[4]に、
その他はclass_count[0]に、
それぞれ入ると思うんだが。
まさか初期化のことを言ってるんじゃ・・・・
>>197
オーバーランするね。
206デフォルトの名無しさん:02/05/17 16:08
isalpha(c)
isdigit(c)
isspace(c)
(c == '\n')

ってどれか同時に真になるの?
207デフォルトの名無しさん:02/05/17 16:09
isspace(c)
(c == '\n')
あ、これか。しかしそれこそ質問者に悩んでほしい問題だが。
>>203
201は>>177のこと言ってるんだけど。。。
isspace使わないとなると面倒だなー。
(c == ' ' || c == '\f' || c == '\t' || c == '\v')
とか書くんかな。
>>207
そんな技巧に走ってバグるなら、スナオにifで書けばいいじゃん。
211 :02/05/17 16:16
>>210
禿同
ヘルパーの関数かマクロにしちゃっても良いけどね。
213??????B?B?B:02/05/17 16:26
解決しました。
ありがとう。
214デフォルトの名無しさん:02/05/17 16:32
>>193
どこが?
215デフォルトの名無しさん:02/05/17 16:44
ここが適当かどうかわからないんですがFreeBSDでユーザ名から
uid知りたければどうすればいいですかね?
216getpwnam:02/05/17 16:47
どう考えてもUNIX板へどうぞ
217デフォルトの名無しさん:02/05/17 16:48
>215
216の言う通り
getpwnam
#include <stdio.h>
void main (void)
{
int a,b,c;
scanf("%s %s %s",&a,&b,&c);

printf("%5s\n",a);
printf("%11s\n",b);
printf("%16s\n",c);
}
コンパイルエラーはないんですが
実行するとエラーが出るのですが原因わかりますか?
メモリがどうたらこうたら初心者でスマソ
>>219
ひょっとすると218は直接答えが出てこないと自分への回答だと理解
しない完全他力本願タイプなんでは・・・?(w
また書式絡みかよ。
もしかして昨日の%2dと同じ奴なのか?
>>220
いや、219を読んでますよ
>>221
違う
この時期何かあるの? 落ちこぼれ研修生?
>>218
a, b, c は数値型なのに文字として扱っている。

まぁ、例えていうと高校生を小学生扱いしたり、
男の子を女の子扱いするとグレてしまう。

数値型a, b, cも自分らしい扱いをされなかったので
グレてしまったのだ
>>225
a,b,cを文字列の変数として扱いたいんですがどうすればいいんでしょうか?
>>226
char a[1024],b[1024],c[1024];
>>226
甘ったれんな。ちゃんと努力しろ。
229デフォルトの名無しさん:02/05/17 20:47
俺は上の二人のうちどっちが親切か即答できない(w
>>226
参考書買ってきて読め。もしくは、C なんか使うな。
231デフォルトの名無しさん:02/05/17 20:48
>>226は悲惨だ・・・
>>229
どう考えても>>228だろうな。
基礎の基礎くらいは調べて欲しいものだ
>>227
おーできた
ありがとうございます!
234デフォルトの名無しさん:02/05/17 20:49
参考書っていうか219さんが折角リンクくれたのに、努力もせずに
すぐ質問は最低だと思ふ。
235227:02/05/17 20:49
>>232
例を言われても余りうれしくないな。
>>234
読んでるって(w
237218:02/05/17 20:51
まあ、俺が悪かったスマソ
初心者用のスレ立てたほうがよくないか?
>>237
もしかして試したのか?(-_-;)
>>237
初心者以前の問題

やる気がないようにしか感じない
ここは十分初心者向け・・・
218はなぜ非難されてるか全く理解してないと思う。努力ってのは読み始めて
30分もたたずに音を上げることじゃない
242ひよこ名無しの4:02/05/17 20:53
PCQAに立てますか?
アウトソーシングならある程度受け付けますが。
Ruby>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>C
244218:02/05/17 20:54
>>238
>>227か?試した。
>>239
やる気はあるよ。でも最初がわからないととっつきにくい
数学だって掛け算できなければ積分やろうとはおもわないだろ
それと俺の中では同じ。
まだ素人中の素人だ。自分自身でもわかってる。
勘弁してくれ
>>242
プログラムに関してはここに真っ先に来るんじゃない?
>>244
(怒)
だったら配列の大きさはそんなにいらないだろくらい言えよ(-_-;)
>>244
その考えが根本的に間違ってる。
素人だから何でも聞いていいというわけじゃない。
文字列の格納の仕方くらいCを始めてから一日で覚えられる範囲だろが
248218:02/05/17 20:56
>>246
素人だから配列の意味がわからないんだよ
勘弁してくれ
>>219みて勉強するから
>>248
ん?本当は分かっているけどみんなを試したんじゃないの?
250218:02/05/17 20:58
>>247
はい、がんばります
251218:02/05/17 20:59
>>249
まじでわからなかったんだよ!
この悔しさをばねに勉強するよ、、、
218にいいことを教えてあげよう。楽して手に入れた知識はあっという間に
散るぞ。ついでにハウツー丸暗記法で覚えると応用が効かないよ。プログ
ラマの多くは怠け者だから何度かこういったミスをしてるから初心者に厳
しくあたるんだよん。ってーことは覚えておいてほしいな。
>>252
218じゃないが了解。
すべての手続き型言語の基礎と言ってもいいCで工夫や試行錯誤が出来なければ
どの言語を使っても結局言語に使われるだけ。
>>248
配列がわからないとな…

努力のカケラも見えんな
>>251
わからなくて他人に聞いた悔しさのバネより

自分で解決した時のうれしさの方がより強いバネになる
入門者の人には厳しいお言葉はとりあえず置いといて、

 >自分で解決した時のうれしさ

を是非味わってほしいです。こればっかりは人に聞いてしまうと
喜び半減なので
258デフォルトの名無しさん:02/05/17 21:07
質問。
socket関数使ってhttpでweb上のページ読むツール作ってるんですが、
串ってどうやって通せばいいかわかる人いますか?
connect()関数に渡すSOCKADDR_IN構造体をどうにかするんでしょうか?
>>258
RFCを見てプロキシの説明参照。
ヒント。

プロキシに繋ぐ−>GET 目的のドメイン/目的のファイル
260デフォルトの名無しさん:02/05/17 21:21
今からC、C++を勉強しようと思うんだけど
ソフト何買えばいいの?
折れxpだからC++.netってやつで十分かな?
>>260
フリーで十分
262デフォルトの名無しさん:02/05/17 21:22
>>260
このスレの上の方を見て。
263デフォルトの名無しさん:02/05/17 21:23
>>261
フリーで十分なの!?
.netとか言う奴はいらない??
264デフォルトの名無しさん:02/05/17 21:23
上の方ねスマソ
やはり以前にも似た話題が出たのか…鬱
>>263
勉強でしょ?
フリーで十分。
>>263
当たり前だろ
覚えるのにわざわざ.net買ってたら金がいくらあってもたらんわ
>>263
めじろを落としてこい。
>>267
よりによって・・・昔アレ¥10k位してたよね?
.NET SDK もフリーだけどね
やっぱ基本はCでコンソールでしょう。

VS.netのアカデミック買いなさい。WindowsXPも付いてくるよ♪
271デフォルトの名無しさん:02/05/17 21:33
C言語って何ですか?
>>271
int main()萌え言語
>>271
もっと
いれて
きもちいい
だめ
ああ
いく!いっちゃぅぅぅ

など。
>>273
あいうえお作文かと思っちゃったよ
275デフォルトの名無しさん:02/05/17 21:42
(゚Д゚)?
>>271
ああああああん!
ほしいのぉ!もっとぉ!
かたいの頂戴!
しょうてんさせて!
ねぇ!お願い!

>>274
こんなの?
>>276
それC++。

オブジェクト指向であんなものやこんなものを挿(略
>>276
おまえ上手いなぁ
279デフォルトの名無しさん:02/05/17 22:09

何・・?このスレ・・・・・

             /ヽ       /ヽ
            / ヽ      / ヽ
  ______ /U ヽ___/  ヽ
  | ____ /   U    :::::::::::U:\
  | |       // ___   \  ::::::::::::::|
  | |       |  |   |     U :::::::::::::|
  | |      .|U |   |      ::::::U::::|
  | |       | ├―-┤ U.....:::::::::::::::::::/  
  | |____ ヽ     .....:::::::::::::::::::::::< 
  └___/ ̄ ̄      :::::::::::::::::::::::::|
  |\    |           :::::::::::::::::::::::|
  \ \  \___      ::::::::::::::::::::::::|



>>279
  ∩∩
  | |.| |
 γ_ _ヽ
 ( .・.・ ) <もういいからshine・・・)
   ̄ ̄
281258:02/05/17 22:32
>>259
ありがとう。
でも、RFCの日本語のページ読んだんですが、概念的なことしか書かれてなかったように思え、
いまいちわかりませんでした。
まずproxyサーバーに繋ぐってことなのだろうか?
検索してもやり方が載ってるページが見つからない。
もうちょっとヒントくれる人いませんか?
プロキシにソケット繋ぐ−>GET 目的のドメイン/目的のファイル HTTP/1.0\r\n\r\n
284 :02/05/18 00:37
c++;
285デフォルトの名無しさん:02/05/18 00:48
>>281
概念的?? いきなり36ページ当たりに

 Note that the proxy MAY
 forward the request on to another proxy or directly to the server
specified by the absoluteURI. In order to avoid request loops, a
proxy MUST be able to recognize all of its server names, including
any aliases, local variations, and the numeric IP address. An example
Request-Line would be:

GET http://www.w3.org/pub/WWW/TheProject.html HTTP/1.1

とかいうのがある気がするんだが。資料から必要な情報だけ抜き出すコツは
早めにつかんでおいたほうが良いよ。
>>285
あ、串はhttpからいるのね。勉強になった。
typedef struct _locus{
struct _locus *next;
int value;
}LOCUS
があって、void new_dna(LOCUS **dna_header,int n_bits)という関数でリストを作成してつなげたいのですが、ヘッダがどうなってるのかわかりません。
教えていただけないでしょうか?
288 :02/05/18 00:54
>>287
へっだって、**dna_headerのこと?
何がわからんの?
正直今日一番意味わからにゃい質問・・・
290287:02/05/18 01:01
void new_dna(LOCUS **dna_header,int n_bits)関数をどう作ったらいいかわかりません。
ヘッダとの関連は・・・?
292 :02/05/18 01:05
>>290
・関数形はそれじゃないとダメなのか?
・引数(n_bits)の意味教えろよ
293デフォルトの名無しさん:02/05/18 01:06
あのさあ。そりゃあ無理に類推すればLOCUS*形の配列をn_bits個(?)走査
して全部その順番にくっつけるのかな〜とか位は妄想できるけど、
君の提示した情報だけでプログラムが作れると思う?
まずは仕様をちゃんと固めなさいな。
294デフォルトの名無しさん:02/05/18 01:06
0以上9以下の整数をランダムにキーボードから入力するとき、全ての整数が少なくとも1回入力された時点でアラートを鳴らし、総入力回数を出力するプログラムを作成せよ
>>294には答えるなよ
>>294
消化し切れてない問題は宿題スレで・・・・
297デフォルトの名無しさん:02/05/18 01:08
ひでぇw
教えてください・・・結構考えたけどわからんかったんよ。
298287:02/05/18 01:08
>>292
すいません、関数形はそれじゃないとだめです。n_bitsはリストの大きさです。
なぜ彼らは助け合いの場としてではなく、努力もせずに便利な回答集
としてここを使おうとするんだろう・・・・
>>298
リストの大きさって、何?
バイト数?ビット数?要素数?
301287:02/05/18 01:11
>>300
要素数。
302デフォルトの名無しさん:02/05/18 01:11
努力したヽ( ´ー`)ノ
>>301
だからさあ・・・んなことは凡そ想像はつくけど>>293読めい
n_bitsが要素数とどうやって想像しろと・・・
305293:02/05/18 01:15
>>304
消去法(w
無理な想像だが多分あってると思うんだな。
306293:02/05/18 01:17
大体287は俺が想像を書いたからそれでもう我々に通じた、とでも思ってるのかい?
何をしたいのかちゃんとしたレスポンスないとこっちは何もできないよ。
307287:02/05/18 01:18
LOCUS形の構造体をmallocでとってきて、n_bits個
全部その順番にくっつけるでおねがいします。
308 :02/05/18 01:18
リストの要素数?つなげるリストの数ってこと?
なんでリストなのに**が必要なの?リストなら*で充分だろ?
309 :02/05/18 01:21
LOCUS *locus[MAX];

for(i=0;;){ locus[i]=(LOCUS*)malloc(sizeof(LOCUS));}
new_dna(locus,i);

みたいなことがしたいのか?
出来たけどLOCUSの仕様が分からんので貼り付けない
つかこんなお粗末な仕様では自信を持って貼り様がないじゃん。
なんかプログラマの卵と話をしてるってよりは、お客さんと話ししてる気分(w
312デフォルトの名無しさん:02/05/18 01:27
仕事でもひどい仕様書から、妄想してプログラム組まんといかん時が
あるからな(あったからな。。。)
いい勉強になるだろ。。。
やりたいことが整理できてないってのは殆どのクライアントの共通項だよね
314287:02/05/18 01:30
>>310
>>287にあります。とりあえず貼り付けてください、お願いします。
>>314
>>287で分かるやつがいたら神
>>312
勉強にはならないよ。当然あり得る帰結で書いてみて後はトライアンドエラーなんだから。
少なくともボランティアでやる気にはなれんし、それを期待するのは聊か図々しいと思う。

>>287
まず日本語を勉強しなおしてくれ。
317**:02/05/18 01:35
ほんの僅かな情報から仕様を自己妄想できるようになれれば一人前のSEだ。
無論、仕様を詰めるのも重要だけどな。。。

で、>>287>>309でやりたいことはあってるのか?
318デフォルトの名無しさん:02/05/18 01:36
>>316
漏れの仕事はそんなのばっかしだが。。。
>>318
みんなそうだよ。素人さん相手の時は・・・
俺が分からないこと
・リスト中最後の要素のnextの値はどうなるのか
・生成後のvalueの値はどうなるのか
・リストは一度にmallocで割り当ててもいいのか
 それとも個々の要素ごとにmallocしなければいけないのか
・途中でmallocに失敗した場合はどうするのか
321287:02/05/18 01:41

>>317
mallocはnew_dnaで呼び出して欲しいです。
322仕様書無しさん:02/05/18 01:42
>>287
ヘッダは多分、こうなっているのではないでしょうか?

dna.h


#ifndef dna_h
#define dna_h

typedef struct _locus{
  struct _locus *next;
  int value;
}LOCUS

void new_dna(LOCUS **dna_header, int n_bits);

#endif
>>322
LOCUSの後ろに;がほしい
解決だね(^o^)
325322:02/05/18 01:46
>>323
うわちゃ、鬱!

といいますか、ネタなので。
・・・しかし>>287のような質問では、漏れのようなヘタレPGに答えられるのは
この程度です。
326287:02/05/18 01:48
>>320
nextはつぎのリストを指します。 valueの値は0でいいです。 個々でmallocして欲しくて、メモリ確保に失敗したら、終了します。お願いします。
327ーーーーー:02/05/18 01:50
>>287
リストってほんとに分かってるのか?
一応リストの作り方かいとくな。

LOCUS *locus = (LOCUS*)malloc(sizeof(LOCUS)),*head;
head = locus;

for(作りたいだけ){
  locus->next = (LOCUS*)malloc(sizeof(LOCUS));
  locus = locus->next;
}

こんなかんじ。
あとはエラー処理とかしる。
>>326
最後の要素の次なんてないです。
終了の意味が分かりません、
リストの宿題が出たので教えてください、って事?
330287:02/05/18 01:57
>>326
mallocするたびにnextにNULLを入れておきます。エラーメッセージを表示して強制終了です。
331デフォルトの名無しさん:02/05/18 01:58
dna_headerが指すポインタがリストの先頭を指してて、
そのポインタに要素を追加するんだろ、きっと。

void new_dna(LOCUS **dna_header, int n_bits)
{
 while (n_bits > 0) {
  LOCUS *locus = malloc(sizeof(LOCUS));
  if (locus == NULL) {
   エラー;
  }
  locus->next = *dna_header;
  **dna_header = locus;
 }
}
う、しまった。
n_bits-- するの忘れてた。
287はなぜ通じないか理解できナインだろうな・・・
>>330
そこまで解ってるなら、あとはCの文法が解らないのかな?

それは置いといて、さっきから「はよ教えんかい!」みたいな態度は感心しないな。
>332
確かにconstじゃないけど引数の値を操作するのはいかがなものかと。
336デフォルトの名無しさん:02/05/18 02:06
初心者のふりしてネタを振る常連と
親切のふりしてプログラミング技術を見せびらかす火魔神と
たま〜にマジで引っかかって熱くなる親切な人が
火花をチラシ合うスレはここですか?
>>335
by value なのはいーじゃんと思う。
>>3

> なお、課題の○投げは一応別スレへ、ということでお願いします。
>>335
他に引数がLOCUS**型をしてる理由を思いつかんのだが。
ありがちなパターンだろ。
340287:02/05/18 02:07
みなさんありがとうございました。331さんのを考えてみます。
初心者のふりって、、、仕様もまとまってないネタなんてスレにとって
有害なだけジャン。
>>336
掛布さんの解説でした。
仕様がまとまってたらネタじゃなくて「問題」じゃん。
それじゃ釣れない。
微妙にバグを残す331は神
>>343「お題」は歓迎だけどそういう意味での「ネタ」はごめんだな
ほんとだポインタのポインタが・・・(w
どこですか?ポインタのポインタはサパーリわかりません。
まあコンパイラがゴネるから初心者でもわかるでしょ。ダイジョーブダイジョーブ
んじゃ、お題…というか何と言うか。
初心者ってわけでもないんですが、
前からちょっと悩んでる事があるんで
教えてつかあさい。

unsigned intが32bitのマシンで、
unsigned int bitmap[N];
という32Nビットのビットマップがあるとき、
「nビット連続して1が立っているのは、先頭から何ビット目か」
を探すのはどうやったら速いでしょう?アセンブラはナシで。
あ、ちなみにLSB, MSBの順序はどっちでも良いです。
350349:02/05/18 02:46
歩測: 2ワードにまたがってるときもちゃんと見つけたいデス
難しそう。一度寝てから考えます。おやしゅみなさい
352デフォルトの名無しさん:02/05/18 02:49
>>349
nは32より大きくなることもあるのか?
353349:02/05/18 02:53
>>352
うーん。nは無制限に死体ですが、「n < 32のとき限定だけど速い版」
とかも歓迎です。

あ、1と0は逆でも良いです。とにかく速いほう。
int search_なんとか(size_t n)
{
 int i, j, count = 0;
 unsigned int bitmap[N];
 
 for (i = 0; i < N; i++) {
  for (j = 0; j < 32; j++) {
   if ( (bitmap[i] >> (32 - j)&1 ) {
    count++;
    if (count == n)
     return i * 8 + j;
   }
   else
    count = 0;
  }
 }
 return -1;
}
s/32 - j/31 - j/
BM法使えば速そう。
0,1しかないのにBM法って(w

いや言いたいことは分かるんだけどさ
テーブルと継続フラグを使ってバイト単位でサーチするのが最速でしょ
まぁ、表は作らなくていいですね。
速いかどうか分からんけど

Xビット目が0
 n-1ビット読み飛ばして1行目へ
Xビット目が1
 前後n-1ビットを調べる
  見つからなかったらn-1ビット読み飛ばして1行目へ
  見つかったらループ抜ける

0の多いデータ中なら速い・・はず
361349:02/05/18 03:09
自分では、
-(1 << n)
でnビットのマスク作って、ワード単位でANDとって逝くのが
速いんじゃないかと…

n > 32の時は、

xビット1の並び
32ビット全部1がyワード
zビット1の並び

x + z = n % 32
y = n / 32
というパターンを探すのかな、とか。
first fitのmallocでも作るつもりか?
>>361
じゃぁ、自分で作れよ。
だいたいn<=32だったら楽だろ
364349:02/05/18 03:22
や、BM法みたいな(途中で1個でも0があったら、その次まで飛ばす)
やりたいんですけど、うまい方法無いですかね。
あんま練ってないけどこんな感じでどうかな。

#define BITSOF(type) (sizeof (type) * 8)

int search(unsigned* bitmap, int N, int n)
{
 const unsigned bits = BITSOF(*bitmap);
 const unsigned maxbit = 1 << (bits - 1);

 for(int i = 0, jmin = 0; i < N * bits + n - 1;)
 {
  for(int j = n - 1; j >= jmin; j--)
  {
   if((bitmap[(i + j) / bits] & (maxbit >> (i + j) % bits)) == 0)
   {
    i += j + 1;
    jmin = n - (j + 1);
    goto NOT_RET;
   }
  }
  return i;

 NOT_RET:;
 }
}
366アマグラマ1号 ◆r6Wx8cCc :02/05/18 03:49
あ、見つからなかった時の処理を忘れてた。
最後に return -1; でも追加。
それのどこがCだよ
う、for(int i とかやっちゃってますね...。
すんまそん。
1バイト単位でテーブル作る
int bl[256] ; /* 左(上の桁)から数えた時に1が並んでる桁数 */
int bm[256] ; /* 1バイト内で1が並んでる最大のビット数 */
int br[256] ; /* 右(下の桁)から数えた時に1が並んでる桁数 */

実際にはこんな感じ
0 → 00000000 → bl[1]=0, bm[1]=1, br[1]=0 ;
1 → 00000001 → bl[1]=0, bm[1]=1, br[1]=1 ;
2 → 00000010 → bl[2]=0, bm[2]=1, br[2]=0 ;
3 → 00000011 → bl[3]=0, bm[3]=2, br[2]=2 ;
:
127 → 01111111 → bl[127]=7, bm[254]=7, br[254]=7 ;
128 → 10000000 → bl[128]=1, bm[254]=1, br[254]=0 ;
:
253 → 11111101 → bl[253]=6, bm[253]=6, br[253]=1 ;
254 → 11111110 → bl[254]=7, bm[254]=7, br[254]=0 ;
255 → 11111111 → bl[255]=8, bm[255]=8, br[255]=8 ;

後は、キャストして、適当に計算すれば、それなりに速そうな気が…
ミスってた…
× 0 → 00000000 → bl[1]=0, bm[1]=1, br[1]=0 ;
○ 0 → 00000000 → bl[0]=0, bm[0]=0, br[0]=0 ;
371デフォルトの名無しさん:02/05/18 06:17
       / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
       | まじでともっちと
       \
          ̄∨ ̄ ̄ ̄ ̄ ̄ ̄
         ∧_∧
         ( ´Д`)
       /⌒    ⌒ヽ
      /_/|     へ \
    (ぃ9 ./    /   \ \.∧_∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄
       /    ./     ヽ ( ´Д` )< やりたいです。
      (    /      ∪ ,  /   \_______
       \ .\\     (ぃ9  |
        .\ .\\    /    /  ,、
          >  ) )  ./   ∧_二∃
         / //   ./     ̄ ̄ ヽ
         / / /  ._/  /~ ̄ ̄/ /
         / / / )⌒ _ ノ     / ./
       ( ヽ ヽ | /       ( ヽ、
        \__つ).し          \__つ
>>293
でも結構いるんだよね。そういうひと。
例の先輩とか(ワラ
>>349
よほど無駄なことをしなければどんな方法でも対して変わらない気がする。
わかりやすい方法でいいと思うんだけど。
>>373
お前の発言って、どんな問題に対しても言える事だな。(w

#define EvaluateAlgorithm(algorithm)\
    (isdull(algorithm)?MUDANAKOTO_YARISUGI:DOREDEMO_ONAJI)
375どうでもいい回想(その1):02/05/18 11:51
〜約1年前の某ミッションにて〜
「やはり、これは・・・」
「・・・コンパイラに問題ありですね。」
「ベンダーのサポートを受けましょう。」
「コンパイラのライセンスは他プロジェクトからのコピーなので、
今回その選択肢はありません。」
「何ィ〜!!」
〜おしまい〜
376どうでもいい回想(その2):02/05/18 12:03
〜約4年前の出張先での某ミッションにて〜
「・・・やはり、これは・・・」
「・・・コンパイラに問題ありですね。」
「ループカウンタにはintを用いよ、という事ですね。」
「全ソースを見直しましょう。」

(お、お前ら、ループカウンタにcharを使うんじゃねえ〜!!
それでメモリ節約したつもりかぁ〜!!)

「さて、今後をどうするかですが・・・」
「ベンダーに連絡しますか。」
「・・・サポート期間は3年前に切れています。」
「阿呆かぁ〜!!ベンダーに連絡しても、
『新バージョンのご案内』が来て終わりじゃあ〜!!」

ちなみにその時の出張先会社のチームの人達は、
ヘッダーの最初と最後につける
#ifndef __XXX_H
#define __XXX_H
#endif
を全く使っていませんでした。
あと、「#defineマクロは小文字で最後は_c」というコーディングルールも持ってました。
〜おしまい〜
377デフォルトの名無しさん:02/05/18 12:25
>>371
キモイです。
378デフォルトの名無しさん:02/05/18 12:26
>>371
ってことは、3pですか?
>>376
ネタだろうけどワラタ
380デフォルトの名無しさん:02/05/18 12:58
>>374
あほか。
構造体のメンバを参照するときに,Kou[Num]で「.」を入力した時,
前にメンバとして使っていたものが出てきてしまいます。
今は,メンバとして,使っていないんですが。
clwだかを削除
char Hairetu[20][20];
を関数に引数として送りたいのですが,うまくいきません
Kansuu(Hairetu,100);

void Kansuu(char *Hanregu)
{
 printf("モナー\n");
}
void Kansuu(char Hanregu[20][]);
とかにせんと。
つかなんで はいれぐ?
ありがとん
おちゃめごころから
386385:02/05/18 15:29
ごめん。うまくいかんかった。
char Hairetu[20][20];

Kansuu(&Hairetu);でアドレスを渡し、

void Kansuu(char *Hai)
{
 Hai[0][0]=5;
}
というような感じで,アドレスを参照して,数字を入れたいのですが

>>384
関数の部分はそれでいいんですよね?
387デフォルトの名無しさん:02/05/18 15:53
ソースコード解析ツールのQACってどうなん?
使える?
388manko chinko:02/05/18 16:02
>>386
>Kansuu(&Hairetu);でアドレスを渡し、

&は必要ないですね。
389386:02/05/18 16:21
できましたが,どうも関数の宣言がおかしいようです

Kan(Hairetu[20];

void Kan(char TempHani[][20])
{

}

関数の宣言はvoid(char *);です。
宣言が
char Hairetu[20][20];
とかになってるのだろうから、

Kan(Hairetu[20]);

では呼ばれたがわに渡されるのは一次元の配列(ポインタ)と等しくなる。
だから呼び出すときは

Kan(Hairetu);

だけでオッケー。

void Kan(char TempHani[][20])
はおかしい。[][20]がおかしい。
なぜ入れ替わってるか?
void Kan(char TempHani[20][20])

void Kan(char *TempHani[20])
も試してみること。
あと慣れるまでは2次元配列を使わないことをお勧めする
(それかほかの関数を呼び出さないように)。
void Kan(char array_2d[][20]);
>>386
人の話聞けよ。
393デフォルトの名無しさん:02/05/18 17:21
scanf("%d",a);     ←(w
394manko chinko:02/05/18 17:24
っていうか多次元配列の渡し方は入門書だったら必ず載ってますよね....

>>393
???
>>394
っていうかscanfの解説なんて入門書だったら必ず載ってますよね。。。

>>395
???
396manko chinko:02/05/18 17:40
>>395
>っていうかscanfの解説なんて入門書だったら必ず載ってますよね。。。
載ってますね。で、何がいいたいんでしょうか?:-)

397デフォルトの名無しさん:02/05/18 17:46
scanf("%s",&a);     ←(w
取 り あ え ず お 前 ら ポ イ ン タ の 使 い 方 復 習 し て こ い
scanf("%s",&*&(&a)[0]);     ←(w
>>381
ってどういうこと?VC++のエディタとかの話?
変なやつがいるな
2人はいるな。
片方は間違いなく14歳コテハンクズ野郎だ
初心者が足を引っ張り合うスレはここですか?
405デフォルトの名無しさん:02/05/18 19:51
struct ...

(*ptr).data = 10;    ←(w

406デフォルトの名無しさん:02/05/18 21:56
>>405
表面上の知識の欠落を笑うよりも、
(おそらくは独力で)構造体への
ポインタの操作が有用だという事に
気づいたそのセンスに活目すべし。

漏れには、こんな些細な事を(wっている奴
なんかより、このコードを書いた奴の方が
ずっと将来性がある様に見受けられるが。
>>406
そだね。同意。
>>406
知識の欠落と断じるのは早いのでは?
私の場合は間接参照を嫌って>>405のように書く場合もあります。
でもこれって少数派かなぁ?
409超初心者です:02/05/18 22:12
教えてください!ANSICライブラリではmathと呼ばれるものがある。
これを用いるにはライブラリ部にどのような行を加えたらよいか?
410超初心者です:02/05/18 22:15
すべてのcプログラムでで定義されなければならない関数の名前はなんですか?
>>409
ライブラリ部ってなんですか?

>>410
ありません。
main
413デフォルトの名無しさん:02/05/18 22:28
-lm
414超初心者です:02/05/18 22:34
1変数のマイナス演算子と2変数の減法演算子との異なる点を挙げよ。
っていう問題を教えてください
宿題は別スレいけバカ
416デフォルトの名無しさん:02/05/18 22:41
>>415
syukudaitoha kgiraneedaro baka?
414
ネタならさげるように
418f:02/05/18 22:45
やっぱりwinアプリをCで作る場合はVCを買った方が良いだろうか?
419デフォルトの名無しさん:02/05/18 22:47
そうだよ
いらない
>>416
最近よく見かけますが、誰も読んでないと思うんです。
>>418
いらない。>>7をミロ
423f:02/05/18 22:52
でもBCCってムズくない?BCCだけで出来てるwinアプリってあんのかな?
424デフォルトの名無しさん:02/05/18 22:53
ある
>>423
あるだろ。
昔はみんなああやってた。
426f:02/05/18 22:54
マジ!?知らなかった・・・。そっか、builderとかは割と最近なのか・・・。
まあ俺はVCを勧めるがな。
428デフォルトの名無しさん:02/05/18 23:04
まあ俺はAVを勧めるがな
まぁ俺はソープを勧めるがな
430デフォルトの名無しさん:02/05/18 23:07
>でもBCCってムズくない?BCCだけで出来てるwinアプリってあんのかな?
皆後者には答えるが前者には答えないという罠
>>430
>>425が答えてるぞ。
bccってリソースコンパイラついてないだろ
433デフォルトの名無しさん:02/05/18 23:10
429はひきこもり
リソースコンパイラは当然ついている。
GUIのリソースエディタがない
435sage:02/05/18 23:39
WinXPでは、Win98等で作ったプログラムが動かない場合があるそうなのですが、
これはどうしようもない事なのでしょうか??
DOSプロンプトの仕様が違うとか・・・。

ネットで見つけた、DOSプロンプトアプリ上のグラフィック関数なんか
コンパイラできても表示が意味不明で・・・。
>>435
DOSリアルタイムで知らない人か?
その辺から勉強した方が良いと思われ。
× WinXPでは、Win98等で作った
○ WinXPでは、Win9X用に作った
435です。sage間違えてしまった・・・。

初心者学生で、先生の言うとおりにしてるだけなんで
全く意味不明です。

VC++6.0を明らかに使いこなせてない・・・。

コンソールアプリで標準関数しか使ってない
(or Win32Api使ってても、CopyMemoryとか基本的なのしか使ってない)
のだったら多分Win9x でもWinXPでも変らんと思うよ
>>349
まぁ、今更ですし、他のやり方と比べてないので
速いかどうかも、分かりませんが、せっかく作ったので…
といっても、結構、手を抜いてる為
返る値は、一致した後のintの添字だったりしますので
必要な場合は、breakの前で適当に処理して下さい

size_t search ( unsigned int *ip, size_t size, size_t n ) {
 unsigned int table, ret, n06, n12, count = 0 ;
 static unsigned short search_table [256] = {
  0x0000, 0x0041, 0x0040, 0x0082, 0x0040, 0x0041, 0x0080, 0x00c3,
  0x0040, 0x0041, 0x0040, 0x0082, 0x0080, 0x0081, 0x00c0, 0x0104,
  0x0040, 0x0041, 0x0040, 0x0082, 0x0040, 0x0041, 0x0080, 0x00c3,
  0x0080, 0x0081, 0x0080, 0x0082, 0x00c0, 0x00c1, 0x0100, 0x0145,
  0x0040, 0x0041, 0x0040, 0x0082, 0x0040, 0x0041, 0x0080, 0x00c3,
  0x0040, 0x0041, 0x0040, 0x0082, 0x0080, 0x0081, 0x00c0, 0x0104,
  0x0080, 0x0081, 0x0080, 0x0082, 0x0080, 0x0081, 0x0080, 0x00c3,
  0x00c0, 0x00c1, 0x00c0, 0x00c2, 0x0100, 0x0101, 0x0140, 0x0186,
  0x0040, 0x0041, 0x0040, 0x0082, 0x0040, 0x0041, 0x0080, 0x00c3,
  0x0040, 0x0041, 0x0040, 0x0082, 0x0080, 0x0081, 0x00c0, 0x0104,
  0x0040, 0x0041, 0x0040, 0x0082, 0x0040, 0x0041, 0x0080, 0x00c3,
  0x0080, 0x0081, 0x0080, 0x0082, 0x00c0, 0x00c1, 0x0100, 0x0145,
  0x0080, 0x0081, 0x0080, 0x0082, 0x0080, 0x0081, 0x0080, 0x00c3,
  0x0080, 0x0081, 0x0080, 0x0082, 0x0080, 0x0081, 0x00c0, 0x0104,
  0x00c0, 0x00c1, 0x00c0, 0x00c2, 0x00c0, 0x00c1, 0x00c0, 0x00c3,
  0x0100, 0x0101, 0x0100, 0x0102, 0x0140, 0x0141, 0x0180, 0x01c7,
  0x1040, 0x1041, 0x1040, 0x1082, 0x1040, 0x1041, 0x1080, 0x10c3,
  0x1040, 0x1041, 0x1040, 0x1082, 0x1080, 0x1081, 0x10c0, 0x1104,
  0x1040, 0x1041, 0x1040, 0x1082, 0x1040, 0x1041, 0x1080, 0x10c3,
  0x1080, 0x1081, 0x1080, 0x1082, 0x10c0, 0x10c1, 0x1100, 0x1145,
  0x1040, 0x1041, 0x1040, 0x1082, 0x1040, 0x1041, 0x1080, 0x10c3,
  0x1040, 0x1041, 0x1040, 0x1082, 0x1080, 0x1081, 0x10c0, 0x1104,
  0x1080, 0x1081, 0x1080, 0x1082, 0x1080, 0x1081, 0x1080, 0x10c3,
  0x10c0, 0x10c1, 0x10c0, 0x10c2, 0x1100, 0x1101, 0x1140, 0x1186,
  0x2080, 0x2081, 0x2080, 0x2082, 0x2080, 0x2081, 0x2080, 0x20c3,
  0x2080, 0x2081, 0x2080, 0x2082, 0x2080, 0x2081, 0x20c0, 0x2104,
  0x2080, 0x2081, 0x2080, 0x2082, 0x2080, 0x2081, 0x2080, 0x20c3,
  0x2080, 0x2081, 0x2080, 0x2082, 0x20c0, 0x20c1, 0x2100, 0x2145,
  0x30c0, 0x30c1, 0x30c0, 0x30c2, 0x30c0, 0x30c1, 0x30c0, 0x30c3,
  0x30c0, 0x30c1, 0x30c0, 0x30c2, 0x30c0, 0x30c1, 0x30c0, 0x3104,
  0x4100, 0x4101, 0x4100, 0x4102, 0x4100, 0x4101, 0x4100, 0x4103,
  0x5140, 0x5141, 0x5140, 0x5142, 0x6180, 0x6181, 0x71c0, 0x8208
 } ;

/* 続きます */
441440:02/05/19 03:01
 n06 = ( n & 0x000fffff ) << 6 ;
 n12 = n06 << 6 ;
 for ( ret = 0 ; ret < size ; ret++ ) {
  table = search_table[ ( ( *(ip+ret) ) >> 24 ) ] ;
  if ( ( count + table ) >= n12 || ( table & 0x03c0 ) >= n06 ) break ;
  count = ( table > 0x08000 ) ? count + 0x08000 : ( table & 0x0f ) << 12 ;
  table = search_table[ 0x0ff & ( ( *(ip+ret) ) >> 16 ) ] ;
  if ( ( count + table ) >= n12 || ( table & 0x03c0 ) >= n06 ) break ;
  count = ( table > 0x08000 ) ? count + 0x08000 : ( table & 0x0f ) << 12 ;
  table = search_table[ 0x0ff & ( ( *(ip+ret) ) >> 8 ) ] ;
  if ( ( count + table ) >= n12 || ( table & 0x03c0 ) >= n06 ) break ;
  count = ( table > 0x08000 ) ? count + 0x08000 : ( table & 0x0f ) << 12 ;
  table = search_table[ 0x0ff & ( *(ip+ret) ) ] ;
  if ( ( count + table ) >= n12 || ( table & 0x03c0 ) >= n06 ) break ;
  count = ( table > 0x08000 ) ? count + 0x08000 : ( table & 0x0f ) << 12 ;
 }
 return ret ;
}
442440:02/05/19 03:03
テーブルは、下のようにして作ったものですが
あまり大きくないので、(掲示板に書き込むには大き過ぎたようですが)
速さの事も考えると、そのままでも良いかなと…
nが9以上の場合は、( table & 0x03c0 ) >= n06 ) の部分が必要ないので
8以下と、9以上で、分けて処理をした方が良いかも

#define BIT 8
unsigned short *mkstable ( void ) {
 unsigned short num, left, max, right, buf1, buf2 ;
 unsigned short *search_table ;
 search_table = (unsigned short *) malloc ( sizeof (short int) << BIT ) ;
 if ( search_table ) {
  for ( num = 0 ; num < ( 0x01 << BIT ) ; num++ ) {
   left = max = right = 0 ;
   while ( ( ( 0x01 << ( BIT - 1 ) ) >> left ) & num ) left++ ;
   buf1 = 0 ;
   do {
    buf2 = 0 ;
    while ( ( 0x01 << buf1++ ) & num ) buf2++ ;
    if ( max < buf2 ) max = buf2 ;
   }
   while ( buf1 < BIT ) ;
   while ( ( 0x01 << right ) & num ) right++ ;
   *(search_table+num) = ( left << 12 ) | ( max << 6 ) | right ;
  }
 }
 return search_table ;
}
>>349
ちょと面白そうなので、俺も参加。

int search( /* 返り値 -> 1:見つかった, 0:見つからなかった */
  unsigned char *a, /* 検索の対象のポインタ */
  int l, /* 検索する対象のサイズ(バイト単位) */
  int sp, /* 検索対象のパリティー */
  int sc, /* 検索対象のビット数 */
  int *fp, /* 検索結果の位置(バイト)*/
  int *fb /* 検索結果の位置(ビット) */ )
{
  struct { int l, r, f; } t[ 256 ], *b;
  int i, j, c[ 8 ], n, d = 0;

  for( i = 0 ; i < 256 ; i ++ ) {
    int p = ( i >> 7 ), q, r, s;

    b = &t[ i ];
    for( c[ n = 0 ] = 0, q = p, j = 8 ; -- j >= 0 ; c[ n ] ++ )
      if( q != ( r = ( ( i >> j ) & 1 ) ) ) {
        c[ ++ n ] = 0;
        q = r;
        }
    n ++;
    b->l = ( ( sp == p ) ? c[ 0 ] : 0 );
    for( b->f = -1, s = 0, q = p, j = 0 ; j < n ; j ++, q = !q ) {
      if( ( sp == q ) && ( sc <= c[ j ] ) )
        b->f = s;
      s += c[ j ];
      }
    b->r = ( ( sp != q ) ? c[ n - 1 ] : 0 );
    }
  for( n = 0 ; n < l ; n ++ ) {
    b = &t[ a[ n ] ];
    if( sc <= b->l + d ) {
      *fp = n - 1 - ( ( d - 1 ) / 8 );
      *fb = 8 - d % 8;
      return 1;
      }
    if( b->f != -1 ) {
      *fp = n;
      *fb = b->f;
      return 1;
      }
    if( b->r != 8 )
      d = 0;
    d += b->r;
    }
  return 0;
  }
444443:02/05/19 09:27
てすと

#include <stdio.h>

int main( void )
{
  unsigned char t[] = { 0x06, 0x01, 0xff, 0xff, 0x80, 0x00, 0x00, };
  int tfp, tfb;

  if( search( t, sizeof( t ), 1, 10, &tfp, &tfb ) )
  /* 1が連続して10ビット立っている位置を検索する */
    printf( "%dバイト目の%dビット目で見つけました\n", tfp, tfb );
  else
    printf( "見つかりません\n" );
  return 0;
}
>>444
正確に動く(バグが無い)のはあくまで最低条件なんだから、
絶対マッチしないパターンを作り出してパフォーマンスをはかるテストルーチン書いてくれ
446443:02/05/19 10:58
>>445
まぁ、ご希望とあらば・・・
てすと(Ver 1.1)

int main( void )
{
  unsigned char t[] = { 0x06, 0x01, 0x80, 0x00, 0x00, };
  int tfp, tfb;
  time_t start, end;
  int r;

  time( &start );
  r = search( t, sizeof( t ), 1, 10, &tfp, &tfb );
  /* 1が連続して10ビット立っている位置を検索する */
  time( &end );
  if( r )
    printf( "%dバイト目の%dビット目で見つけました\n", tfp, tfb );
  else
    printf( "見つかりません\n" );
  printf( "検索時間:%f\n", difftime( end, start ) );
  return 0;
}
447デフォルトの名無しさん:02/05/19 11:37














                         レベルヒクッ!
448443:02/05/19 12:02
>>443
スマソ、バグはけーん。

*fp = n - 1 - ( ( d - 1 ) / 8 ); ==> *fp = n - ( d + 7 ) / 8;
*fb = 8 - d % 8; ==> *fb = 7 - ( d + 7 ) % 8;

ここらへん、テキトーに -1 とかつけただけだったからなぁ
(今回もそうだけど・・・)。

>>447
つーか、「てすと」っていったって usage の意味で
つけただけのコードなんだけど・・・
速いかどうかは自分で動かして評価すればいいだけじゃん?
っていうか、元発言者が
「何に使うのか」
「現在どの程度の速度で、それでどうして不満なのか」
を明らかにしてないくせに、

>>361
>でnビットのマスク作って、ワード単位でANDとって逝くのが
>速いんじゃないかと…

こういうのが早そうだから誰かコーディングして的な発言してたり
どうしようもない屑野郎だよな
ここで質問すると、言葉足らずが、屑野郎にまで昇華する罠。
実装方法が分かっていながら自分で実装するという姿勢を見せないのはどう考えても屑野郎だろ
452デフォルトの名無しさん:02/05/19 14:04
( ´・∀・`) へー
ロジック構築能力が必要だといわれましたが,C言語ではなんの部分に当たるの?
文字列検索とか?ソートとか?
454デフォルトの名無しさん:02/05/19 14:32
>>453
ハァ?
>>451
まあ「お題」もらって暇つぶせたからいいんじゃね〜の?
どうせこのスレ他にやることないんだし。
456デフォルトの名無しさん:02/05/19 15:44
doubleとlongって、longのほうが表現できる数値の範囲は広いですよね?
>>456
いいえ。
458デフォルトの名無しさん:02/05/19 15:51
dobule型のほうが広いんですか。ありがとうございました。
>>458
だからといってlongをdoubleに変換して何も失わないという
わけではない。
単純に比較していいものなのか?扱い方が全然違うけど。
461デフォルトの名無しさん:02/05/19 15:57
しつもんです。
mainで再帰呼び出しやっても良いものですか?
>>461
やってみて、自分で判断しろ
>>462
どんな質問にも使える万能の答登場。
>>462
まさに伝家の宝刀
>>463
しかし実は何も答えていないという罠。
>>465
伝家の宝刀を抜かれた相手は決まってそう言うんだよ・・・
じゃ、今後このスレの答は「やってみて、自分で判断しろ」に統一ってことで。

しゅーりょーーーーーーーーー
ばかだなぁ。
「〜のやり方を教えてください」って質問の場合はどーすんだよぉ。
469デフォルトの名無しさん:02/05/19 16:36
main()で再帰するやり方を教えてくだちい
>>469
だからそれくらいやってみろっつってんだろバカ
#include <stdio.h>

int main(int argc, char **argv){
if(argv)
printf("%d\n",argc*main(argc-1,NULL)) ;
else
return argc?argc*main(argc-1,NULL):1 ;

return 0 ;
}
int main()
{
return main();
}
473デフォルトの名無しさん:02/05/19 16:49
なんでLinuxはヘッダーファイルに共通関数みたいなのを
書き込むんですか?linux/fs.hみたいな必須のファイルに
staticな関数がガリガリか書かれているのを見ると萎えます。
それとも様々なターゲットに向けて書かれているからしょうがないので
しょうか?

今はLinuxは辞めてNetBSDでカーネルの勉強しようとかと思ってます。
>>473
インライン展開したいからに決まってるだろヴォケ。
へッダに書かなきゃどこに書くんだよ。
>>474
それなら普通はインライン関数用のファイルを作るもんじゃないの?
NetBSDのソースは読んでないからしらないが。
>>475
インライン関数用のファイルってへッダじゃないの?
>>476
そう。だから型の定義とは何で別にしないのかと。
言葉遣いの汚いPGは案外良いやつ
でも本当に凄いPGは言葉遣いもいやなくらい丁寧
>>475
ファイルシステムで使うマクロ定義は当然fs.hに書くよね?

だったらファイルシステムで使うインライン関数定義も
fs.hに書くのが当然だろ。
>>477
fs_types.h
fs_constants.h
fs_macros.h
fs_functions.h
等々と分けろと?

C++でプログラム書くときにもクラス定義とメソッド定義と定数定義を
分けるのかね。
>>479
そんなもんですか。
今まで自分がやってきた方法が変なのか。。。鬱だ
Cにインライン関数なんてありません
C++スレに逝けアフォども
484彦一:02/05/19 17:13
メール欄は要チェックや!
型とその型のデータに対する操作は
1つのファイルで定義した方がいいように思うが、
>>481 は今までどうやってたのよ?
486483:02/05/19 17:15
がびーん
>>485
恥かしいからあんま突っ込まないでくれ(泣
C++でクラスの定義と実際のメソドはべつに書くよね?
それと一緒で単純に関数マクロは別ファイルにしてた。
488デフォルトの名無しさん:02/05/19 17:19
 ⊂ ヽ ⊂ ヽ ⊂ ヽ ⊂ ヽ ⊂ ヽ
   \\ ∧_∧∧_∧     ∧∧
     \ ( ´_ゝ`) `∀´>・∀・)*゚∀゚)
      >  ⌒ヽ  ⌒ヽ  ⌒ヽ  ⌒ヽ  ⌒ヽ
     /    へ \ へ \ へ \ へ \ へ \
    /    /   \\   \\ \\ \\ \\
    レ  ノ    ノヽ_つノ ヽ_つ ヽ_つ ヽ_つ
   /  /  /  /  /  /  /  /  /  /
  /  /|  /  /| /  /| /  /| /  /|
 (  / | (  / |  |\_|\_|\_|\_|\________
  |  | ヽ |  | ヽ /
  |  |、 \    | ともっちと、やりたい・・・
  | / \ ⌒l  |
  | |   ) /  \__________________
 ノ  )   し'
(_/
このやろ、おれのことを晒し上げかよ!ま、いいや
490デフォルトの名無しさん:02/05/19 17:23
>>406
どこにアロー演算子が解説してない書籍があるんだ?
それともアロー演算子は知らなくてもいいとおもってるんじゃ、、、、、
491デフォルトの名無しさん:02/05/19 17:25
>>488
そんなに大勢でともっちとやるの?
ともっちがかわいそうだよ。
492デフォルトの名無しさん:02/05/19 17:27
>>488
一番右側にある腕らしきものは何ですか?
493デフォルトの名無しさん:02/05/19 17:28
(´-`)。oO(…書き間違えたのか?…)


494デフォルトの名無しさん:02/05/19 17:30
(´-`)。oO(…ともっち今ごろなにしてるのかな…)
顔4個で、体が5個・・・ (((( ;゚Д゚)))ガクガクブルブル
Cを勉強するならどんな本が良いですか?
497デフォルトの名無しさん:02/05/19 17:36
>>496
擦違い。逝ってよし。
498デフォルトの名無しさん:02/05/19 17:38
ともっち!だ〜い好き!
C言語はLP64の玲にあるように、
longとpointerは同じビット長であることが
重要なことなんですか。
500デフォルトの名無しさん:02/05/19 17:39
500げっと!
ずさ
        by ともっち
( -_-)=○)'Д') >>500
502デフォルトの名無しさん:02/05/19 18:10

         ∧_∧       ( )
         ( ´Д`)    //。
       /⌒    ⌒ヽ//   。
      /_/|     //    。
    (ぃ9 ./    ///     。
       /   //3      
      (  ///        
       \ .\\    
        .\ .\\   
          >  ) ) 
         / //  
         / / /  
         / / / 
       ( ヽ ヽ 
        \__つ)

ともっち!我慢できないよぅ!
>>499
ポインタに対して数値演算(アドレスの上位xxビットで表を引くとか)
ができないと欝だし、数値演算の結果をポインタに変換できないのも
困る。なので、ポインタと同じサイズの整数型が1つはホスィー。
>>499
それを言うならintとポインタな気もする。
どうでもいい話なんですが、
128bitのアドレス空間は
この先20年はないものと考えていいですよね?
>>504
でも64bitUNIXはintは32bitのままなんですよね?
>>506
勉強不足でした。
508デフォルトの名無しさん:02/05/19 18:50
ともっち!じゃあ体の勉強しようか!
509デフォルトの名無しさん:02/05/19 18:52
体、環、群か。代数だね。
>>505
Moore's Law(メモリは3年で4倍)が正しいとして、
32bitで不足ぎみになったのが1990年ごろとすると、
64bitで不足するのは2038年ごろか。
511デフォルトの名無しさん:02/05/19 19:06
カカンカンage!
(unsigned long)sizeof(int);
というふうに(unsigned long)をつけるべくらしいですが,皆さんはやっていますか?
>>512
なんでつけるべくなの?
>>512
(size_t)の方が良くないか?
>>513
処理系によって大きな値が帰ってくる場合があるから?
516デフォルトの名無しさん:02/05/19 19:14
(l)  ←マムコ
既出。うざい。
>>514
size_t型を知らないんだろ。きっと
519デフォルトの名無しさん:02/05/19 19:18
ムーアの法則
キタ━━(゚∀゚)━━ァ!
しかしIntelはムズイです
sizeofの戻り値はもともとsize_tじゃないか?
memset(a,0,(size_t)sizeof(int));
ってすればいいのかな?
>>521
さっさとキャストはいらんという結論に達してくれ。
いらんの?なんで?
>>523
ヘッダ見てsize_tの定義見てみる。
>>523
なんで要ると思うの?
たとえば>>521のコードなら
size_t型を受け取る関数に
size_t型をの値を渡すんだから
キャストが要るわけない。
ロジック構築能力が必要だといわれましたが,C言語ではなんの部分に当たるの?
文字列検索とか?ソートとか?
>>527
論理的思考のことをそんなみょうちくりんな言葉で表現する人間は詐欺っちです。
マルチポストのマルチンコ大王がいるな
>>527
そう言われてC言語の瑣末に飛躍するところなんか、的を射た指摘だったっぽいな
>>530
ロジック構築能力−>授業でその英語聞いた−>トランジスタトランジスタロジック−>パソコン?−>PC−>難しい−>C言語−>ウマー
>>527
Equational Logic理論を構築する能力のことだ。
Cとは全くといってよいほど無縁。
533デフォルトの名無しさん:02/05/19 23:31
マルチンコ大王 キタ━━━(`Д´)ノ━━━!!
534阿呆:02/05/19 23:36
マルチポストは嫌われるようなので別スレのリンク貼っておきます。
http://pc.2ch.net/test/read.cgi/tech/1020785918/174-
あともうひといきなんです。
誰かお願い!
知るか。
536アクビ:02/05/20 00:49
csv形式の文字列からデータを取得しようと思っています。
まず、データファイルから1行を読み込んで、
   char *s="a1.a2.a3.a4";
   strtok(s,',');
   strtok(NULL,',');・・・
としてa1、a2、a3、a4を取得しています。

でも、データが
"a1,,,a4"
の場合、a1とa4しか取得できません。
a2とa3がNULLであることまで知りたいのですがどうしたらいいでしょうか?

#とりあえず前処理として、",,"を",@,"などに置換してなんとかしようとしたのですが、
#だいぶ冗長な処理になってしまいそうで困っています。

537 :02/05/20 00:51
strtokってあまり使ったこと無いからな。。。
データの形式がそこまでばっちり決まってるんなら自作すれば?
連続した区切り文字は一つの区切りとして処理されちゃうから
君の用途には使えないよ。

.@.に置き換えるのは良いアイデアだけど、いっそのこと、Cの勉強がてら自分で作っちゃえば?
539 :02/05/20 02:23
どっかにcsvデータ取得ライブラリとかあるんじゃないの?
splitみたいなのを自分で実装しろ。
strtokなんて使うなよ
Cライブラリの中でも一番気持ち悪い関数だぞ
scanfでいいじゃん。
>>542
アホか?
入力長が定まらないデータに対してscanfなんか使えるかよ
>>543
ホントに上限がないという仕様なのか?
んじゃ1行読み込むのもfgets使わないんだな?

実用上4096文字とかで足りるなら、
fgetsとsscanfで十分じゃん。
>>544
問題を刷りかえるなよ。
scanfとsscanfは違うだろ。
わかった。

んじゃ「fgetsとsscanfでいいじゃん」
男らしくないな。
たかだかカンマと改行識別するだけだろ。
それぐらい数分で作れよ。
すいません。マジで分からないんですが、scanfでもfgetsでも想定した
長さを越えたら動かないのは同じだと思うんですが、なぜsscanfだと
いいんですか?
>>548
もうあるんだからいいじゃん。
これに使わないなら(s)scanfは何のため?
ふつー書式入力なんて使わねーよ
想定外のデータがきたとたん、あぼーん。
>>551
(使い方が下手れなだけでは…)
csvは横にだらだら長い事あるからfgetsだと不安な感じ。
>>553
じゃあどうするの?
カンマまでgetcで切り出すにしても、
文字列の長さにはどっかで限度があるでしょ?
>>554
ヒープ使えば?
足りなかったらreallocで伸ばしていけばいいし。
なるほど…

でも、入力の仕様決めといてfgets使った方が良いと思うな。
長すぎたらエラーにすれば良い。

いちいちそんな趣味的なことやってたら時間が無駄すぎる。
>>556
csvは入力の仕様なんて決まってねーんだよ
適当にやるか、ある出力例に対して準拠するか、ぐらいしかない。
>いちいちそんな趣味的なことやってたら時間が無駄すぎる。
この程度で趣味的ですか。
おめでてーやつ。
>>557
ハァ? >>536は汎用CSVライブラリ作ろうとしてるのかよ?
単にCSV形式でフィールド数や内容も定まったデータだろ?

>>536みたいな初心者にCSV一般を読み取るようなライブラリ
書かせる工数かけるならそれこそCSVライブラリ買った方が
安いじゃねーか馬鹿が。

ライブラリ使わずにいちいち車輪の再発明するのは日曜プロ
グラマのすることだよ、この給料泥棒が。
マァマァオチツイテ
ワラタ
なにか書こうと思ったけどみんな解決ズミなのね ショボーン (・v・)/
562デフォルトの名無しさん:02/05/20 06:34
べるらぼぉ〜
工数って嫌な言葉だ
エ数ならいい?
>>557はホントにアホだな〜
仕様決まってないなら自分で書くこともできないじゃないか。
>>565
どう違うか30秒ほどなやんだ。
もう解決してるけど・・
一行処理はこんな感じでうか?
while((c=fgetc(stdin)) != '\n'){
if(c == ','){
while((c=fgetc(stdin)) == ',')
fprintf(stdout," NULL");
if(c == '\n'){
fprintf(stdout, " NULL");
break;
}
fputc(' ',stdout);
}
fputc(c, stdout);
}
569デフォルトの名無しさん:02/05/20 12:31
ともっち!
>>568
なんか凄いDQNなコード...

fgetc(stdin)とか
fputc(..., stdout)とか
fprintf(stdout, ...)とか
もうやめてって感じ。

EOFの処理もしてないしさー。

だいたいこれ何? 前処理フィルタ?
どうせなら読み込むコード書いてくれよ。
571568:02/05/20 14:06
DQNって言われたよ〜( ´Д⊂ヽうえーん
前処理フィルタって?
たしかになんだろね・・これ
よくわからないことはやらなきゃよかったよ〜( ´Д⊂ヽ
>>571
なにをするプログラムなのか解説求む(ワラ
573デフォルトの名無しさん:02/05/20 14:24
コンマで区切られた要素間にスペースを入れて出力するもんでうぅ・・
コンマが連続してる時は中身が無いと見なしてでNULLを入れます
手抜きだから使い物にならんけど・・(T-T)
しまったageてもた・・・
575CHI-CHI:02/05/20 14:57
あの、教えてほしいんですけど、RS232Cでモーターを制御したいんですけど、
RS232CのOn/offを切り替える、プログラムってどんな感じになりますか?お願いします。
576デフォルトの名無しさん:02/05/20 15:02
            ∧_∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
           ( ´Д` )< キャー!!
          /,  /    \___________    
         (ぃ9  |
          /    /、
         /   ∧_二つ
         /   /
        /    \



577デフォルトの名無しさん:02/05/20 15:38
>>562のライブラリは良さげだね。
(つか、教科書に載ってるコードじゃん。)

CSV使いたい人はこれで解決。
579デフォルトの名無しさん:02/05/20 18:06
質問してもいい?
と訊かれると「だめ」としか言えないな。成り行き上。
581デフォルトの名無しさん:02/05/20 18:36
LSIC86を使っていたのですが、

typedef struct{
char *h[0];
char *k;
char *v;
}FORM;

というコードを書いてコンパイルできていたのですが、bccではh[0]の行でエラーが出てしまいました。
h[0]とkが常に同じ、h[1]とvが常に同じ、というコードにしたいのですが、
一般的にはどう書いたらいいのでしょうか。
unionじゃだめなのか?
(実装依存とおもうけど)
583579:02/05/20 18:55
>580
そうですか・・・・・
でももうprintf("わかりませんでした");と書いて提出したので
解決しました
>>581
つーか、char *h[0]って何?
585デフォルトの名無しさん:02/05/20 19:22

 ⊂ ヽ ⊂ ヽ ⊂ ヽ ⊂ ヽ ⊂ ヽ
   \\ ∧_∧∧_∧     ∧∧
     \ ( ´_ゝ`) `∀´>・∀・)*゚∀゚)
      >  ⌒ヽ  ⌒ヽ  ⌒ヽ  ⌒ヽ  ⌒ヽ
     /    へ \ へ \ へ \ へ \ へ \
    /    /   \\   \\ \\ \\ \\
    レ  ノ    ノヽ_つノ ヽ_つ ヽ_つ ヽ_つ
   /  /  /  /  /  /  /  /  /  /
  /  /|  /  /| /  /| /  /| /  /|
 (  / | (  / |  |\_|\_|\_|\_|\________
  |  | ヽ |  | ヽ /
  |  |、 \    | ともっち!俺たち準備はOKだよ!
  | / \ ⌒l  |
  | |   ) /  \__________________
 ノ  )   し'
(_/
うるせーばか
587デフォルトの名無しさん:02/05/20 19:27
>>584 長さ0の文字配列のポインタ

char *h[];
にしたら通るんでないかい? どっちにせよ,コンパイラ依存の領域
588デフォルトの名無しさん:02/05/20 19:28
            ∧_∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
           ( ´Д` )< >>586 おまえがばかだ!!
          /,  /    \___________    
         (ぃ9  |
          /    /、
         /   ∧_二つ
         /   /
        /    \
( ´_ゝ`)フーン
590デフォルトの名無しさん:02/05/20 19:49
            ∧_∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
           ( ´Д` )< ともっち!はやくやらせろ!
          /,  /    \___________    
         (ぃ9  |
          /    /、
         /   ∧_二つ
         /   /
        /    \
591デフォルトの名無しさん:02/05/20 19:57

                     ノ ⌒)
         ∧_∧     (__/
         ( ´Д`)    / /  。
       /⌒    ⌒'/ /    。
      /_/|       / /     。
    (ぃ9 ./    / //      。
       /   / /3
      (   / //
       \. \\
         \. \\
          >  ) )
         / //
         / / /
         / / /
       ( ヽ ヽ
        \__つ)

我慢できない、、、、
AA貼りつけてるやつ、他板でやれ
AAしろぶたは氏んでね。
594これどーすか?:02/05/20 20:40
#include<stdio.h>
void afo(char *y,char *x);
void afoo(char *x,char *y);
main()
{
char a[] = ">>238は";
char b[] = "一度逝け";
char c[13];
afo(c,a);
afoo(c,b);
printf("%s\n",a);
printf("%s\n",b);
printf("%s\n",c);
}
void afo(char *y,char *x)
{
while(*x)
*y++ = *x++;
*y = '\0';
}
void afoo(char *x,char *y)
{
while(*x)
x++;
while(*y)
*x++ = *y++;
*x = '\0';
}

このCのコードと同じことなんてJAVAでやれば11行で終わる。
>>594
どーもこーもバカ
11行もかかるのかよ(藁
そして11倍遅い。
>>596
Javaの入出力周りは知らないがそれくらいかかりそうな予感
変数宣言*3、printf*3、括弧*2、関数の頭 = 9行
Cの場合さらに#includeが2つで計11行になりますた
もちろん圧縮すれば3行だけど
>>581
大きさ0の配列はCだと使えない。一部のコンパイラ
だと拡張機能として使える(gccとか)。

>>587
char *h[];
という書き方は、「2つ以上メンバを持つ構造体の
最後のメンバ」としてなら許される。途中では
だめ。

union使って問題なしと思うが。
600デフォルトの名無しさん:02/05/20 21:58
おいお前ら、漏れはとりあえずCの入門書を終えました。
そんな漏れに最終試験問題を出題してください。
>>600
C言語のコンパイラを書きなさい(5点)。
>>600
入力行の長さに制限のないCSV読み込みルーチンを書きなさい(20点)。
Cコンパイラを作るよりCSV読み込みを作るほうが4倍むずかしいのか
こ。。こんぱいらで5点か。。
>>600
入門書っていわれても。レベルが全然わからん。しかも入門書で最終?恐るべき自惚れ。
>>600
POSIX互換のOSを(以下略
607600:02/05/20 22:10
マジレス。
お前らはCのコンパイラ書けますか?
Cのコンパイラを書けるというのはどの程度のレベルなんですか?
>>607
マジレス。書ける。
既存のコンパイラより良いコードを出せとか言われると自信がないが。

レベル…遅いコードでも良いならRMSレベルでなくても書けるだろ。
情報系大学院出た人間ならたいてい書けるはず。
/*ネタデスマソ*/
int main( int argc, char * argv[] )
{
str comLine[MAX_PATH+99];
sprintf( comLine, "c:\\Progrm....\\cl.exe %s", argv[1]);
return system( comLine );
}
/*はい5てん*/
>>607
C++ならともかく、単にCなら面倒だけどそれほどむずかしくもない。
言語仕様書とターゲットプロセッサの資料などがあれば。

実用に耐えるレベルにするために、コンパイル・リンク速度向上(プリコンパイルヘッダとかインクリメンタル〜とか)、
最適化、ライブラリ整備などまできっちりやるとかなりつらいが・・

C++コンパイラで標準完全実装(loki, boostが完全に動くとか)だとつらそうだー
611600:02/05/20 22:17
>>608
ガ━━(゚Д゚;)━━━ン!!!!!
Cのコンパイラが書けてもたいしたことないのか。
プログラミングの道は険しい…
またもマジレス。
入門終えた漏れは次は何をすればいい?
>>609
ワラタ
ってか、スレ立てた本人はどこへいった
高専で「コンパイラ」とかいう教科書を使った授業、受けました。低いところを眺めてみると、そういうレベルっつうことで・・・。
614600:02/05/20 22:21
>>613
漏れは現役高専生です。
今2年生で
電気情報工学科なのですがプログラミングの授業が
全くないので独学で勉強しますた。
>>611
初級へと進むんだろな。

書きたいプログラムがあるなら書きなさい。
書いてるうちに「プログラミング作法」とかが
何を言ってるのか分かるようになるんじゃない?

あとは他の言語も覚えると新しい概念が身につく(かも)。
SchemeとJavaは是非やっとくべきだと思う。
>>611
LISP インタプリタでも作ると面白いカナ。
俺は最初Unixのコマンド(のサブセット)いろいろ書いて練習したYO!
最初はwc, head, tail
あと、prとかワイルドカード展開するプログラムとかxargsとか。
618デフォルトの名無しさん:02/05/20 22:26
CのコンパイラってCの知識だけでつくれるの?
機械語やアセンブラの知識は必要ないの?
Scheme・・・ずいぶん最近だけど、興味半分にいろいろサイト見て回ってみた。
感想: call-with-current-continuation がプログラムを破壊的に変化させそう。
>>617
書いた書いた。
正規表現マッチングなんかもおもしろい。
>>618
機械語は必ずしも不要だろうけど
アセンブラは必須だね。
>>618
・・・ネイティブコンパイラ作るなら。バイトコードでもいいんでない?
じゃあ入門卒業試験の課題としてこれはどうだ。

int match(const char *pattern, const char *string);

patternがstringとマッチするなら0で無い値、マッチしないなら0を返す。

pattern中の文字'?'は任意の1文字とマッチする。
'*'は0文字以上の任意の文字列とマッチする。
それ以外の文字は、その文字自身とマッチする。
トークンきりだし、構文解析、構文チェックまではCで書けるとして、
そのあとにネイティブコードを作るときはやっぱりアセンブラだよね。
Cでもできるのかな。
>>624
ネイティブコードを生成すること自体はCでも書けるだろ。
知識は必要だろうけど。
626デフォルトの名無しさん:02/05/20 22:36
>>623
patternの中に*や?がひとつも含まれていなかったら、strcmp(string,pattern)と等価?それともstrstr(string,pattern)と等価?
>>624
アセンブリ言語コードを出力すればいいんじゃないの?
そういうコンパイラも多い。
>>627
gccとか?
>>626
strcmpと等価ということで。
>>628
そう。UnixのたいがいのCコンパイラと
8bitのころのPCのたいがいのCコンパイラ。
DOSだとLSI-C86もそうじゃなかったっけ。
631デフォルトの名無しさん:02/05/20 22:39
>>629
ちょっとやってみよう。
再帰使うとうまくゆくかな・・・
632631:02/05/20 22:41
いや再帰じゃないな・・・
>>632
出題者は再帰を使う回答を用意しますた。
>>623
じゃあ補足すると、これぐらいは全部通ればとりあえず合格?
あんまり書くと長くなりすぎるから省略。

assert( match("abc", "abc") != 0 );
assert( match("abc", "abcd") == 0 );

assert( match("?bc", "abc") != 0 );
assert( match("a?c", "abc") != 0 );
assert( match("ab?", "abc") != 0 );
assert( match("ab?", "ab") == 0 );

assert( match("ab*", "abc") != 0 );
assert( match("ab*", "ab") != 0 );
assert( match("a*c", "abbbbbc") != 0 );
assert( match("a*c", "abc") != 0 );
assert( match("a*c", "ac") != 0 );

// 最長一致なら以下のチェック.
assert( match("a*c", "acc") != 0 );
assert( match("a*d*g", "adgabcdefg") != 0 );
テストドライバその1

#include <stdio.h>

int main(int argc, char **argv)
{
 if (argc != 3) {
  fprintf(stderr, "usage: %s pattern string\n", argv[0]);
  return 1;
 }
 printf("%smatched\n", match(argv[1], argv[2]) ? "" : "un");
 return 0;
}

テストドライバその2
#include <stdio.h>
#include <string.h>

char line[1024];

int main(int argc, char **argv)
{
 if (argc != 2) {
  fprintf(stderr, "usage: %s pattern\n", argv[0]);
  return 1;
 }
 while (fgets(line, sizeof(line), stdin) != NULL) {
  char *eol = strchr(line, '\n');
  if (eol != NULL) {
   *eol = '\0';
  }
  if (match(argv[1], line)) {
   puts(line);
  }
 }
 return 0;
}
assert並べるほうがいいな。
同じテストを何度でも繰り返せ、実行一発で結果がわかる。
637623:02/05/20 22:57
>>634
あ、そうですね。そのテストのほうが良いかも。

ちなみに>>634で用意したテストプログラムは、

その1: patternとstringをコマンドライン引数で与えて
matchedまたはunmatchedをプリントする。

その2: patternをコマンドライン引数で与えて
標準入力から1行ずつ読み込み、マッチする行だけ出力する。

いずれもpatternはちゃんとクオートしないと切ねぇことになる。
638617=623:02/05/20 22:59
テストドライバその2の方は、
むか〜しワタスィが書いた超簡易grepモドキそのものです。
639600:02/05/20 23:02
サパーリ出来ません。
逝ってきます…
640631:02/05/20 23:03
末尾に*がくると失敗するなぁ・・・・
やりなおそう。
641631:02/05/20 23:03
あ、ちなみに私はあの入門書を読み終えたばかりの人じゃないです。
642634:02/05/20 23:04
>>634
いかん、このassertだと * があったら無条件で1返せば通ってしまう(笑)
ので追加。
assert( match("a*c", "ab") == 0 );

あと複合系(もっと要る気が)
assert( match("a**?*", "ab") != 0 );
assert( match("a**?*", "a") == 0 );
643631:02/05/20 23:05
と思ったけどできた。
644デフォルトの名無しさん:02/05/20 23:15
あるモジュールAが別のモジュールBをよんで、さらにモジュールB
が別のモジュールCを呼んで...という具合にモジュールAを頂点とし
て呼ばれているモジュールすべてを洗い出すにはどうやって調べて
いけばよいのでしょうか?モジュールA、B、Cなどすべてのモジュ
ールのソースはあります。どなたか効率よく調べる方法がありましたら、
教えてくださいませんか。
645631:02/05/20 23:18
末尾が?で終わるときに失敗するんですが、いいですか?
だめですよね?(^_^;)
646仕様書無しさん:02/05/20 23:19
M-.
>>644
このへんはどう? http://ctool.sourceforge.net/
他にもいろいろあるはず。
>>644
クロスリファレンスや呼び出しツリーを作ってくれるツールを使えば?
644
もれはソースブラウザ(M$)でしらみつぶしかな。
650623:02/05/20 23:25
あんまり引っ張っても何なので…
出題者が用意した回答です。
あんまり叩かないで(w

int match(const char *pattern, const char *string)
{
 while (*pattern) {
  switch (*pattern) {
  case '?':
   if (! *string) {
    return 0;
   }
   pattern++;
   string++;
   break;
  case '*':
   pattern++;
   do {
    if (match(pattern, string)) {
     return 1;
    }
   } while (*string++);
   return 0;
  default:
   if (*pattern++ != *string++) {
    return 0;
   }
  }
 }
 return ! *string;
}
651631:02/05/20 23:29
ギブアップ 末尾に?があると失敗します。

int match(const char *pattern,const char *str)
{
for(;*str||*pattern;str++,pattern++){
if(*pattern=='?'){
str++,pattern++;
continue;
}
if(*pattern=='*'){
while(*pattern=='?'||*pattern=='*')
pattern++;
if(*pattern=='\0'){
return 1;
}
while(*str!=*pattern){
str++;
}
}
if(*str!=*pattern)
return 0;
}

return 1;
}
652651:02/05/20 23:39
Visual C++の方に持っていって、デバッガにかけてみよう。
でないとどこが間違っているのかわからない(T_T)
653 :02/05/20 23:42
ついでに正規表現版まで作ってくれ!!
>>653
どの正規表現?
.と*だけで良いなら何とか…

(正規表現の文法自体は正規文法でないという罠)
655644:02/05/20 23:55
>>647,648,649
ありがとうございます。ckrefを使用してみます。
656651:02/05/20 23:55
for(;*str||*pattern;str++,pattern++){
の部分を
for(;;str++,pattern++){
if(*str||*pattern){
break;
}
に変えたら成功した・・・・
もしかしたらforについて勘違いしている部分があるかも(汗
657 :02/05/20 23:56
とりあえずperlでつかえるくらい。。ナンチッテ

グループとかは無理ですか?
658651:02/05/20 23:57
あ!!
もしかしたらcontinueした時はforの条件式が評価されないんですか?
>>657
Perlの正規表現だと、それこそちょっとしたコンパイラ書くくらいの
手間がかかると思われ。

グループって[a-z]みたいなやつ?
暇潰しの課題にはちょっと面倒すぎるなあ。
660651:02/05/21 00:06
やっと出来ました・・・・
forについての間違った認識を正すことが出来てよかったです。
ありがとうございました。

int match(const char *pattern,const char *str)
{
for(;*str||*pattern;str++,pattern++){
if(*pattern=='?')
goto loopend;
if(*pattern=='*'){
while(*pattern=='?'||*pattern=='*')
pattern++;
if(*pattern=='\0')
return 1;
while(*str!=*pattern)
str++;
}
if(*str!=*pattern)
return 0;
loopend: ;
}

return 1;
}
661 :02/05/21 00:06
orとかは?

U(MA|FO)

みたいに
>>656
for(;*str||*pattern;str++,pattern++){
は条件式が真ならループは続いて、
for(;;str++,pattern++){
if(*str||*pattern){
break;
}
はifの条件式が真ならループを抜ける。
前者と後者じゃまったく逆の処理じゃないの?
>>662
すみません。
if!(*str||*pattern)) break;の間違いです。
664663:02/05/21 00:09
じゃなくて、
if(!(*str||*pattern)) break;
665デフォルトの名無しさん:02/05/21 00:35
あのなぁ。
if (*str) って書くなら、素直に if (*str != '\0') って書け。
省略すればいいって訳じゃないぜ。
if (isalpha(XXX)) とか、if (found) はこう書くべきだがな。
>>665
同意
strtokを書いたことがある方に聞きます
staticな局所変数を使いました?
>>660
>goto loopend;
continue;じゃいかんの?

Cの文法に躍らされてる気がする。
そんなにまちがえるなら素直に状態遷移書けばいいのに
>>667
聞く前に質問の仕方をもっと勉強しろ

可変長バッファサイズを持ったFIFOを実装したいんだけど、何か良い例ないですかね?
staticなサイズで組むと格納するデータサイズが小さいものの場合、かなりメモリーが
無駄になっちまうので。 どう実装しようかずっと悩んでるんだけど(w
>>665
そうだそうだ!
ちゃんと if ((*str != 0) != 0) と書け!
いや、もっとちゃんと if (((*str != 0) != 0) != 0) と書け!!!!
>>670
8バイト単位とかでリストでも作ったら?
>>670
双方向リストとか。
>>667
局所かどうかはともかくstaticな変数は使うな。
>>673
FIFOなら片方向でいいんじゃない?
メモリーサイズ気にしてるのに。
まあ個人の勝手だけどさ!
676674:02/05/21 00:45
「使うんじゃない」という意味でなく
「使うよね」ってこと(汗
>>672
この場合、8バイト単位のリストにまたがってしまうデータ長の場合、
どう管理するんでしょうか? 管理はなるべく単純にしたいんだけど。

>>673
むむむ、おもしろそうだけど、どう利用するのか良くわからん(w
↑670


>>673
片方向リストは既に固定長サイズでやってみてできています。
問題はリスト構造というよりもどうやって可変長サイズを実装
するかなのですが。
679673:02/05/21 00:49
>>675
そうか。いつも双方向で書いてたよ(欝
片方向だと先頭と末尾へのポインタを持つのかな?
空の時どうなるの?
680デフォルトの名無しさん:02/05/21 00:49
>>668
上の方を見て。
>>678
Addの出来ないリストなんて!

・・・って言うかそれはリストなのか?
>>677
C++のdequeの構造はどう?
適当な大きさのブロックをリンクリストで繋ぐ。
先頭のブロックが空になったら開放。末尾が満杯になったら次のブロックを確保してリンク。

ついでに一個開放したた余剰ブロックはプールしてつぎの確保に使い回すとか
683 :02/05/21 00:50
FIFOってなんですか?
684デフォルトの名無しさん:02/05/21 00:51
>>683
キューみたいに先入れ先出しのこと。
>>681
ん? FIFOだからそれでいいんだろ? 何番目にAddするなんて意識しなくていいんだから
>>685
何番目にAddする=インサート
687 :02/05/21 00:52
漏れ可変長のキューライブラリなら作成したことあるよ
遠い昔だけど。
688デフォルトの名無しさん:02/05/21 00:54
FIFO: First In First Out
トコロテン
>>673
可変長サイズの意味がわからん。
レコードが可変長という意味?
Tlink *link = malloc(sizeof(LINK) + 必要なデータサイズ );
link->next = next;
memcpy((void*)(link + 1),データ,データサイズ);
690689:02/05/21 00:56
切れた。
>というのはたまに使うけど。
と続く予定だった。
691687:02/05/21 00:56
そん時は双方向リスト使ってやってますた。
だって管理が楽なんだもん
>>678
片方向でも普通は可変長だろ
普通は双方向にする。
よほどメモリーが惜しくなければ。
>>678
普通片方向でも可変長でしょう。
staticにバッファとらずにmalloc使えって
>>693
普通って、どこの普通?
>>695
京浜急行の普通(列車)
697694:02/05/21 00:59
かぶりまくってる。鬱だ
単方向リストを使うメリットって何?
>>698
あたま悪いんだ!
670
>>682
なるほどそのつど malloc() して繋げたり、入らなくなったら消したりするわけですね

>>689
>レコードが可変長という意味?
ええそうです。
なるほどやはり、動的に取ったメモリーセルをリストとして消したり貼ったりというのが
一般的なやりかたのようですね。

>>691
双方向リストで管理が楽になるというのは不用なものを消したり付け足したりする
時の場所を探すのが楽になるという事でしょうか?
struct elem {
 char *data; /* 可変長のデータへのポインタ */
 struct elem *next;
};

typedef struct {
 struct elem *head;
 struct elem *tail;
} queue;

int queue_init(queue *q)
{
 struct elem *dummy_head = malloc(sizeof(struct elem));
 if (dummy_head == NULL) {
  return -1;
 }
 dummy_head->next = NULL;
 q->head = q->tail = dummy_head;

 return 0;
}

int is_empty(queue *q)
{
 return q->head == q->tail;
}

int enq(queue *q, char *item)
{
 struct elem *new_elem = malloc(sizeof(struct elem));
 if (new_elem == NULL) {
  return -1;
 }
 new_elem->data = item;
 new_elem->next = NULL;
 
 q->tail->next = new_elem;
 q->tail = new_elem;

 return 0;
}

char *deq(queue *q)
{
 struct elem *first;
 char *value;

 if (is_empty(q)) {
  return NULL;
 }
 first = q->head->next;
 value = first->data;
 q->head->next = first->next;
 free(first);

 return value;
}
>698
双方向にしてもメリットがない時の資源の節約
>>702
やっぱりそれだけ?
704701:02/05/21 01:03
実際にはいちいちmalloc, freeせずに
struct elemをまとめて取ったほうが速い。
670
>>701
具体例をありがとうございます。非常に良くわかりました。(w
むりやりこじつけると
割り込まれると困るクリチカルな時間が短くなる
>>705
その語尾は気に入らないな。
>>703
そんなにもある
>>701
ポインタの参照より加算のが速いんで、
使い方によっては>>689に一票。
710701:02/05/21 01:12
>>709
701のコードだとstruct elemが他のモジュールには見えないが、
リストに続けてデータ本体を書くと、同時にmalloc, freeしなきゃ
ならんよね。

まあ、その方が良い事もあるだろうが。
struct elem {
 char *data; /* 可変長のデータへのポインタ */
 struct elem *prev;
 struct elem *next;
};

typedef struct elem queue;

void queue_init(queue *q)
{
 q->prev = q->next = q;
}

int is_empty(queue *q)
{
 return q->next == q;
}

int enq(queue *q, char *item)
{
 struct elem *new_elem = malloc(sizeof(struct elem));
 if (new_elem == NULL) {
  return -1;
 }
 new_elem->data = item;
 new_elem->next = q;
 new_elem->prev = q->prev;
 q->prev->next = new_elem;
 q->prev = new_elem;

 return 0;
}

char *deq(queue *q)
{
 struct elem *first;
 char *value;

 if (is_empty(q)) {
  return NULL;
 }
 first = q->next;
 value = first->data;
 q->next = first->next;
 first->next->prev = q;
 free(first);

 return value;
}

…つか、普通はinsertとdeleteを作って、それを使って
enqとdeqを書くんだと思うけどね。
ところでやっぱり可変長のキュー管理って、データの出し入れする度に、
mallocしたりfreeしたり、するしかないの? データの出し入れが激しい処理の場合
やばくない?
>>709
持ちまわるデータのサイズが不変とかいう条件なら、
手間がいくらか減るんでいいかもね。
>>712
出し入れにリンク自体はfreeする必要無いんじゃない?
freeは完全に使い終わった後だけにして、
空のリンクとしてリサイクルすればかなり速くなるよ。
715714:02/05/21 01:24
つーかなるべくmalloc/freeは呼ばずにいた方がいいよ。
ページ/ブロック単位でメモリ確保するとか。
struct elem *free_list;

void queue_pool_init()
{
 int i;
 struct elem *block = calloc(sizeof(struct elem), N);

 if (block == NULL) {
  abort(); /* いやホントは何か言うんだろうけど */
 }

 for (i = 0; i < N - 1; i++) {
  block[i].next = block[i + 1];
 }
 block[N].next = NULL;
 free_list = block;
}

struct elem *queue_malloc()
{
 struct elem *v;

 if (free_list == NULL) {
  queue_pool_init();
 }
 v = free_list;
 free_list = free_list->next;

 return v;
}

void queue_free(struct elem *v)
{
 v->next = free_list;
 free_list = v;
}
>>716
もしかしてリアルタイムで作ってるの?
体力あるなー。
718どうでもいい回想(その3):02/05/21 01:52
板違い・スレ違いですいません。

今年の四月、あるミッションを申し渡されました。
開発済み製品のコードに関するサポートです。
その製品に問題が発生した時の解析・修正が主要業務となります。

そのコードを見ていた何日日目に、脳天を突き抜けるかのような衝撃が・・・って、言い過ぎですね。
マルチタスキング環境においては、動的確保したバッファをタスク間メッセージバッファに使うのが定番ですが・・・
何と、そのコードは、auto変数の領域を堂々とメッセージバッファに使っていたのでした。
普通、こんな真似をすれば、プログラムは「即死」です。
恐る恐る調べてみると、うまい具合に「死なない」ように作られていました。
(おそらく、動作テストに適合するためだけに手を入れた結果と思われます。)
前任者へ話を聞くと、「母体をそのまま持ってきたはず」という回答が・・・
(ちなみに、その『前任者』は『作者』ではありません。)
件の「製品」は、全国津々浦々で今もバリバリ動いていますが、
その「母体」もまた、全国でバリバリ動いています。
(続いていいですか?)
>うまい具合に「死なない」ように作られていました
ならいいじゃん。
終了。
720デフォルトの名無しさん:02/05/21 01:58
C 言語そのものの話題と言うよりは開発環境の話になってしまうのですが、
ANSI C のインタープリタなんて無いでしょうか?
外部ライブラリを簡単に呼び出せて後でコンパイルも可能みたいな開発環境
があったら凄く重宝すると思うのですが。
>>718
>普通、こんな真似をすれば、プログラムは「即死」です。
そう思ってるのは君だけかもな。
>>718
staticなら困るけどautoならthread-safeじゃねーの?
autoだって「動的に確保」することには違いないし。

まあ、まだ必要な間に解放されちゃったら困るけどさ。
723デフォルトの名無しさん:02/05/21 02:00
>>718
> ・・・・メッセージバッファに使うのが定番ですが・・・

定番にこだわるのはよくない。
>>720
製品、フリーソフト、
腐るほど(ってほどないかもしれないけど)あるよ。
メンテされずに腐ってるかもしれないが。
>>720
コンパイラでも要求は満たしてる気がするが。
726どうでもいい回想(その3・その2):02/05/21 02:04
(716の続きです。)
こんな腐ったコード、即刻この世から消し去るのが正しい選択でしょうが、
「製品コード」という理由で、半ば力尽きる結果となりました。
「製品」である以上、「実動作不良」や「クレーム」がない以上、手を入れる事は許されません。

さて、そうしているうちに、今月始め、そのミッションには形のみ所属する事となりました。
その「製品」の開発元の業績不振の影響が響いてきたためです。
(無論、昨今の不況の影響もあります。)
最悪、その製品に関しては、サポート体制自体が崩壊する事も有り得るでしょう。

・・・と、書かせていただきました。
これまでの書き込みを拝見するに、皆様の能力は、私に10倍します。
世の中から腐ったコードがなくなるよう、努力して下さい。
ポインタ表現で「&が抜けてる」レベルなら、それこそコンパイル時に気付く問題です。
もっと大きなレベルで、その力を役立てて下さい。

・・・という事で、時々勉強に覗きに参ります。
長文失礼しました。
727デフォルトの名無しさん:02/05/21 02:05
>>726を晒しあげ
>>726
それだけの記述じゃ腐ってるのはコードか君の頭か
判断がつかん。
実は>>718 >>726
がドキュンという結論ですな。
帰ってよし。
730720:02/05/21 02:08
と思ったら CINT という C, C++ のインタープリタがありました。
gtk+ などの外部ライブラリを呼び出せるかは不明ですがちょっと漁ってみます。

http://pcroot.cern.ch/root/Cint.html
struct elem {
 char *data; /* 可変長のデータへのポインタ */
 struct elem *prev;
 struct elem *next;
};
って、
struct elem {
 struct elem *prev;
 struct elem *next;
 char data[1];
};
とかにしない?
732デフォルトの名無しさん:02/05/21 02:12
>>730
cernってあのCERNか?
>>731
がいしゅつ。

>>689
>>709-710
>>713

あと、C99だと
struct elem {
 struct elem *prev;
 struct elem *next;
 char data[];
};
と書ける。
しない。
735デフォルトの名無しさん:02/05/21 02:13
>>733
C99はまだ時期尚早。
マジな話、今どきC99使ってないやつっているの?
737デフォルトの名無しさん:02/05/21 02:15
>>736
いくらでもいる。
738デフォルトの名無しさん:02/05/21 02:16
VC++6.0って98年に出たんだからC99未対応だよな?
>>736
いるだろうけど、今から書くなら自動的にC99になるだろうね。
Unix系はとっくに、Winでもそろそろ処理系はC99準拠になったし。

過去のソフトのメンテならC99は使えないところも多いだろう。
C99なんて意味ない。
出るのが遅すぎた。
>>739
妄想はそれぐらいにしとけ
C99使えないってことは、いまどきallocaとか書くわけですか?
欝だ…
毎日C99しか使ってませんが何か?
>>741
いやだったら他の言語を使えよ。
もうC99の話はやめよう。
allocaなんか使ってる奴は居ない
746739:02/05/21 02:19
>>740
どのへんが妄想なの?
ひょっとして未だにM$はC99対応してくれないとか?
747720:02/05/21 02:20
>>732
以下、引用・・・ だそうです。ソースコードも公開されているらしいので、
Zaurus/Linux に移植したら面白いかもしれません(バイナリは 1.2MB)。

CINT は CERN で開発されている ROOT というデータ解析システムのマクロ
言語として開発されたものです。 したがって,ISO/IEC C++ 完全互換を目指した
ものではなく, むしろ ANSI C をほぼ含む C++ のかなり大きなサブセットと解す
べきものです。

http://www.matsusaka-u.ac.jp/~okumura/c/

たとえばWWWの開発で有名なCERN(欧州原子核共同研究機関)での標準
言語に選ばれています.

http://www.cqpub.co.jp/hanbai/books/30851.HTM
>>740
遅すぎたってどういう意味?

いずれみんな切り替わるでしょ?
教科書も処理系も新規格対応になるんだから。
VC.NETもC99未対応でしょ?
C99ができた時点で以前の規格はobsoleteだろ。
C99に対応してない処理系はANSI/ISO準拠と言えない。
C99対応に向かってるのってgccとcode-worriorだけでしょ
まあまあ。
ANSIが出来たときも嫌がってた奴はいたけど、今はもういない。
時間の問題と思われ。
リッチーもC99の方向性には否定的だったんじゃないの?
>>751
Unixからスーパーコンまで、ベンダー製コンパイラはとっくにC99だよ。
755726:02/05/21 02:23
おお、たくさんレスが・・・
そういえば言い忘れていたので一応申し上げます。
UNIXでのmsgsnd(でしたっけ?msgsnd??)とは異なり、件の環境で使われていたXXX_sndmsgは、
メッセージのコピーは作成せず、そのままバッファが渡されます。

よって、auto変数をメッセージバッファに使う場合、
「メッセージバッファは(内部ルール上)構造体イメージ」→「そのタスクのスタック領域がメッセージとなる可能性極めて高し」→
「他のタスクから、そのタスクのスタックに対する読み書きが可能」
という罠が待っていたのでした。
756デフォルトの名無しさん:02/05/21 02:23
C99なんて特に便利な機能は追加されていないでしょ。
無視無視。
>>754
クソコンパイラはそういうところで点数稼がないとな
>>754
_Boolとか_Comprexとか使えんの?
マジで?
標準pragmaも全部対応してる?
そんな話聞いたこと無いぞ
要するにMS以外は全部もうC99なんだろ?
あとはMSがその気になれば、それで世の中ぜんぶC99になるんじゃねえの?
>>726が浮いてるな(w
http://seclan.dll.jp/c99d/c99d01.htm
ずいぶん便利になったものだと思うが。
gccは準拠してないし、bcc5.6も準拠してないんだが。
Intel C++もvectorC++もまだだな。
当然、open watcomも。DMCはしらん
Borlandはどうよ?
C++Builder6ってC99対応してる?
アップグレードしてないのでわからんが、カタログ見る限り言及がないから対応してないような・・
764デフォルトの名無しさん:02/05/21 02:27
つーかVC++やBCCはCなんてどうでもいいんでしょ。
C++がメインでCはおまけ。
_Complexも_Boolも#pragmaも、今売ってるコンパイラならたいてい
サポートしてるよ。MS以外。
>>765
IntelとBorlandはどうなんだ?
つまりあれだ。
PCではC99のベンリな機能が使えないので羨ましいと。
みんなして「あのブドウはすっぱい」と(w
>>765
具体的にC99に準拠してるっていうコンパイラあげてみろよ
「MS以外」はいいから
>>767
「PCでは」じゃなくて「Winでは」と言え。

gcc3.xには_Boolも_Complexもpragmaもあるよ。
_Complexは2.xからあるけど。
内部定義できない時点でC99はクソ
大抵対応してるんだから、Windows環境も含むすべてのコンパイラで
5割以上はサポートしてないとおかしいよな。
CW Comeau Kaiとかの標準対応だけがウリのコンパイラ上げてもしゃーない。
実用になるモノじゃないとな
>>768
C99になると何が困るの?

今までのプログラムが動かなくなるわけじゃないんだから
別にいいんでは?
Modern C++ Designに出てた Comeau って
http://www.comeaucomputing.com/
対応してる感じ?
Dinkumと組んでるのかー
>>769
gccって標準C99準拠してないんだがどーよ?
準拠に向かっているだけなんだが。

pragma ≒ 標準pragma
775747:02/05/21 02:33
俺も浮いてるっぽい。悲しひ。
C99は、まあ、別にどうでも良いが機能が減るわけじゃないんで使えるよ
うになったら使うだろうな。
C99、出されてもそれほどメリットは無いんだよね。
中途半端に仕様が複雑化するだけ。
>>777
は・げ・ど・う

今までうまく使えたんだからC99なんて使わなくてよい。
でも、さすがに今時トラディショナルCで書いてるヤシはいないよな。
結局製品名が挙がってこないな
781デフォルトの名無しさん:02/05/21 02:41
ungetc って、どんな時に使うと便利なの?
ない頭をフル回転させて考えてみたけど
どう考えても使い道が分からないんですよね
てな訳で、こんな時には便利だぞ〜って
使い方を知ってる人は教えて下さい
>>781
stdinから読んでみた。
やべー・・・読まなきゃよかった。
もどしとこ・・・(-_-)
>>777
そうだね。
無くても困らないんだよね。C->C++みたいなシフトならともかく。
gccの独自拡張と同レベル。
末尾再帰展開でもしてくれるんなら、おおっ!とか思ったけど。
>>783
ワラタ
786783:02/05/21 02:43
例えば、','まで読みたいとすると、','を読まなければならないでしょ?
それを戻したいとき。
>>781
たとえば数字だけを読むルーチンで
読んだ結果が数字じゃなかったらungetcしてリターン
788デフォルトの名無しさん:02/05/21 02:45
よく変数でhogeってありますよね?
その、hogeの意味はなんですか?
>>788
論争になるよ。
bar,baz,fooも。
>>788
名前に意味がないときに付ける名前
>>782
結局一つだけ?
792789:02/05/21 02:47
あ、意味か。由来じゃなくて。
>>790の通りだね。
Comeauってなんて読むの?
カミーユ?
コーマン
795781:02/05/21 02:49
お〜
787は確かに、あった方が便利ですねって
良く考えると、結局783と同じなのかな…
>>793
こもー
今まで知らなかったがマニュアル見てみると、
漏れが使ってるSun Workshop 6のCコンパイラは
ISO/IEC 9899:1999準拠と明記してあった。

>>796
コミューじゃないの? って自信ないけど
>>798
しらん。
シャトーと同じように読んでみただけ。
800デフォルトの名無しさん:02/05/21 02:56
ungetcに2文字戻したい場合は、どうしますか?
801米山:02/05/21 02:56
800GET

余裕でした。
802デフォルトの名無しさん:02/05/21 02:56
>>800
二回使う。
>>802
駄目じゃん?
>>803
そうなの?
>>804
知らん。
でもおれは1文字だけ戻すようにしてる。
なんでだろ?
806デフォルトの名無しさん:02/05/21 03:00
あ、本当だ。
プログラミング言語Cに保証されるのは1文字だけだと書かれている。
>>805
理由があった筈なのに?
>>801って何?
うわ、もう3時だ。
ねなきゃ。
810デフォルトの名無しさん:02/05/21 03:01
>>808
やおい

やまなし
おちなし
いみなし
>>808 シッ見てはいけません!
>>810
全国的にやっぱそう?
友達から同じ様に聞いた。
813デフォルトの名無しさん:02/05/21 03:03
>>812
そうだよ。
雑談スレと化してますな。
深夜だから成せる技ですな。
で、ungetcに2文字入れたい様なケースはどうなの?
つーか、お前らもう少しスレを長持ち汁!
>>815
fseek(fp,-2L,SEEK_CUR);
>>815
ungetcを使わなくても良い関数にする
>>817
それstdinだと無理っぽいね。
あとテキストモードでも微妙。
あ、ケチつけてるわけじゃないよ?ほんとに。
>>819
分かっている。
俺だってstdinにfseekなんて使いたくねー(ワラ
>>819
ネタでしょ
822821:02/05/21 03:11
>>821
ネタではないけどね。
ungetcはstdin以外にも使えるから。
getc/ungetcにラッパーを被せる。
らっぱじゃないよ。
好きなだけgetc/ungetc呼べるようにできるよ。
824822:02/05/21 03:12
名前間違った。
>>823
の解決方法がまともかな。
freadやらは別途対応しないと使えなくなるが。
やった事ないから分からんけど
fgetposとfsetposで、無理やり戻せないかな…
FILE型をラップしたFILEEX型を作る。
typedef struct {
 FILE *fp;
 char ungetbuf[好きなだけ];
} FILEEX;
/*インタフェース*/
FILEEX*fex_open(const char *filename, const char *mode);
void fex_close(FILEEX*);
int fex_getc(FILEEX*);
int fex_ungetc(FILEEX*,int);
/*
お好みで
long fex_read(FILEEX*,const void *,long);
long fex_write(FILEEX*,void *,long);
*/
あ、バッファの現在位置を忘れてた
typedef struct {
 FILE *fp;
 char ungetbuf[好きなだけ];
 size_t pos;/*常にスタックトップを指す*/
} FILEEX;
実装をちょびっと
int fex_ungetc(FILEEX *fexp,int c) {
 return fexp->ungetbuf[fexp->pos++] = c;
}
int fex_getc(FILEEX *fexp) {
 return (fexp->pos)?fexp->ungetbuf[--fexp->pos] : fgetc(fexp->fp);
}
バッファあふれそうなのがちょっとやな感じ。
かといってリストにしたら遅そうだが。
831デフォルトの名無しさん:02/05/21 03:57
変数名をファイルに吐き出すことは可能でしょうか?

int abcd_1,abcd_2,abcd_3,abcd_4,abcd_5;

とあったとき、
void print_function_name(int *hoge);
という関数に変数のポインタを渡して、この関数の中で、
変数の名前、abcd_3、という「文字列」を印字したいのですが。

対応表の文字列リストを作っておく、という方法しかないでしょうか?
>>831
ポータブルにはそれしかないだろうな。

システムに依存してよくて、externな変数だけでいいんなら、
バイナリからアドレスと名前の対応を抜き出す方法がたいがい
ありそうだが。
変数のアドレスと変数名と両方渡せば?
print_function_name(&abcd_1, #abcd_1);
みたいに。

(ナンデfunction_nameナノニヘンスウ名ヲプリントスルンダロ)
>>832-833
ありがとうございます。
グローバル変数なのですが、システム依存するのは危険なので
対応リストを作ってみます。
>#abcd_1
こんな書き方C言語でできましたっけ?
ともあれ、関数名、変数と関数を間違いました・・・突っ込みサンクス
835トレドミンMAX:02/05/21 04:37
>>834
#〜はプリプロセッサが処理します。

それにしてもこの時間にこれだけスレが伸びるとは…
ついでに質問ですが
(1) TRACE("i = %d, j = %d\n", i, j);
とすると、#define DEBUG 1のときだけ
i = 100, j = 20
のように表示して、それ以外の時は何も表示しない
ようにしたいのです。こういう可変引数のマクロはどう
やって書いたら良いですか?

(2) funcという関数が、他のどの関数から何回呼ばれた
か数えたいのです。呼び出し側のソースは変えたくない
のですが、良い方法はないでしょうか?
837デフォルトの名無しさん:02/05/21 06:16
gprof?
>>836
(1)
可変引数のマクロ・・・分らん。関数にしる!
(2)
プロファイルを取れば分ります。
もしくは関数を呼び出すだけのhoge()関数を作って、
今の関数をhoge_himitu()とかにするとか。
#if (DEBUG == 1)
#define TRACE(x) printf x
#else
#define TRACE
#endif

TRACE(("i = %d, j = %d\n", i, j));

static cnt = 0;
++cnt;

コンパイラ付属のプロファイラを使え

なんでお前らCFAQよまねえの?
840デフォルトの名無しさん:02/05/21 06:48
srand( rand() );
こんなコード見たら本人に突っ込んどくべきですか?
問題ない?
841デフォルト値名無しさん:02/05/21 07:01
CってC++みたいなデフォルト値使えないんですか?
べき
つかえない
844デフォルトの名無しさん:02/05/21 07:18
ポインタをint(C99ならintptr_t)にキャストしたときの数値って
何か仕様みたいのあるの? 下位nビットは0、とか
ない
846844:02/05/21 07:39
>>845
thx 簡潔な回答ね
847841:02/05/21 08:15
答えもらっといてから補足で悪いんですが、引数のって意味ですね。
多分何を考えてるのかお見通しだと思いますが。
848840:02/05/21 08:24
>>842 うむ、やはりそうですか。
控えめに問い詰めるてみることにします。
>>844 そもそもDSPなんかアドレス単位が 32bitってのもあるし
>>836

(1)
#if DEBUG
#define TRACE(fmt, ...) printf(fmt, __VARARGS__)
#else
#define TRACE(fmt, ...)
#end

(2)
#define func(x) func0(__func__, x)

呼ばれる側をfunc0という名前にしろ。第1引数に関数名
文字列が渡されてくるので、それをハッシュ表に登録しろ。

これらのコードが使えないコンパイラはさっさと捨てろ。
851デフォルトの名無しさん:02/05/21 09:52
ともっち大好きあげ
852デフォルトの名無しさん:02/05/21 10:28
                     ノ⌒)
         ∧_∧     ( _ノ、ノ
         ( ´Д`)    / /  。
       /⌒    ⌒'/ /    。
      /_/|       / /     。
    (ぃ9 ./    / //      。
       /   / /3
      (   / //
       \. \\
         \. \\
          >  ) )
         / //
         / / /
         / / /
       ( ヽ ヽ
        \__つ)
853836:02/05/21 12:05
みなさんありがとうございます。

>>837-839
呼ばれた回数をプログラムの中で使いたいのです。

>>850
試してみました。
うまくいきそうです。
ありがとう。
854デフォルトの名無しさん:02/05/21 12:36
ターゲットのオペコードマップは覚えないとダメでしょうか?
>>855
いや、冗談抜きにCハカーの人は386の一バイトのオペコードぐらい
覚えてるのかなーと思ったからさ。覚えるっていっても256個しか
ないからたいしたことないけど。
857デフォルトの名無しさん:02/05/21 12:52
>>856
ハイソサイエティハッカーの日下部陽一は覚えています。
x86なんぞ覚えてもあと数年しか役に立たんだろ,と思いつづけて早15年
>>857
マジですか?やっぱり日下部先生凄い。
日下部先生ならhexl-modeでプログラミングしてそうだ。。。

ところで、次スレの1はまた日下部先生にしようよ。
やっぱり先生が一番だよ。
>>859
〜にしよう。だって?何言っているの?
本人が立てるに決まっているだろ。
インタラプトのオペコードは0xCDなヨカン
俺は486用のデバッガ作ったよ。でも今思い出せるのはな・・・

    (゚д゚) NOP ダケダ!
   ~(  )−
    / >
あ、INT3も思い出した
INTも覚えてるな。
865デフォルトの名無しさん:02/05/21 13:14
いまからCを勉強したいのですが
市販のVisual C++,C++ Builder etc
を買ったほうがいいですか?
落とせるCとどう違うんですか?
男は黙ってgcc
867デフォルトの名無しさん:02/05/21 13:31
>>865
コンパイルが簡単。
HELPが充実。
デバッガ、エディタ、ライブラリが圧倒的に強力。
効率が10倍ぐらい違うと思う。
868デフォルトの名無しさん:02/05/21 13:32
>>867
thanks a lot!
869デフォルトの名無しさん:02/05/21 13:34
>>866
Kako(・∀・)EE!!
870デフォルトの名無しさん:02/05/21 13:35
>>866
女は?
女子供はニガテだ
女子供はすっこんでろ!
ここは戦場だぞ!
873デフォルトの名無しさん:02/05/21 13:44
女も第一線で戦います!
874ガンオタ:02/05/21 13:51
考えてみれば富野ってフェミニストだよな。
やっぱ戦場にも女性進出は必要だよ。
>>874
マクロス見ろ
>>874
ザブングル見ろ
877デフォルトの名無しさん:02/05/21 14:13
Windows98のDOS(?)で動かすには
どういうコンパイラが必要なんでしょうか?
x86互換のリアルモードで走るプログラムを吐くスーパーコンパイラが必要です
「DOSを動かす」でなく「DOSで動かす」コンパイラだから16ビットの
コマンドラインコンパイラ。
MS-CとかTurbo-CとかBDS-CとかHITECH−Cとか・・・
880デフォルトの名無しさん:02/05/21 14:59
コンパイルする環境はWindows or DOSで
exeを走らせたいのがWindows98のフロッピーで起動するDOSと言いたかったんです。
Freeなものはあるのでしょうか。

>>880
LSI-Cが最適だと思われ。インストールしても1Mないし。
Vectorで検索しれ
>>880
TurboC 1.01とか。Borlandのサイトから落とせたはず。
いらないライブラリとか削ればフロッピー運用も可能かも。
LSI-Cよりもビルド速度は速いし。
883デフォルトの名無しさん:02/05/21 16:12
878〜882>>
ありがとうございます。
早速試してみます。
884デフォルトの名無しさん:02/05/21 18:23
数学できなくてもシステムエンジニアになれますかね?
>>884
なぜここで聞く・・・・
マ板にでも逝けよ。
886デフォルトの名無しさん:02/05/21 18:26
ご忠告ありがとうございます。
マ板ってどこですか?
>>886
プログラマ板
http://pc.2ch.net/prog/

ネタ・愚痴中心の板。
888デフォルトの名無しさん:02/05/21 18:30
>>887
ありがとうございます
忠告どおり逝ってみます
アセンブラ分からなくてもCプログラマと名乗っていいんですか?
Cでまともなプログラムが書けるなら名乗っても許す
ポインタとか構造体とか分からなくてもCプログラマと名乗っていいですか?
892デフォルトの名無しさん:02/05/21 18:35
アセンブラって何ですか? 藁
>>889
そんな奴腐るほどいるぞ
>>893
例えば俺とかお前とかな。
895デフォルトの名無しさん:02/05/21 18:36
>>893
へーそうなんだって俺もわかんないけど
サブルーチンならなんとなく分かります
897デフォルトの名無しさん:02/05/21 18:37
既出ですが、BASICの
・REM
・PRINT
・END
・INPUT
・LET
この五つのの意味を教えてください。
できればそこのURLを貼っていただくとありがたいです
898デフォルトの名無しさん:02/05/21 18:38
stdio.hっの名称ってどういう由来ですか?
>>897
どう罵倒しようか…
900デフォルトの名無しさん:02/05/21 18:39
900
>>898
Standard I/O
902デフォルトの名無しさん:02/05/21 18:39
分かりましたURLありがとうございます>896
903デフォルトの名無しさん:02/05/21 18:41
>>898
あ、そうだったですね、ありがとうございます。
そうするとスタンダード インプット オンプットの略ってことですかね?
どういう意味なんだろう
904デフォルトの名無しさん:02/05/21 18:41
厨房ですけどC言語はじめるにはどのソフト買えばいいでしょうか
いっぱいあって分からんです
アセンブラなんか萎える
小さいのがいっぱい萎える
906デフォルトの名無しさん:02/05/21 18:43
>>904
マイクロソフトのc++が使いやすそうですよ
907901ではないが:02/05/21 18:43
>>903
スタンダード インプット アウトプットだ。
>>903
アウトプットだよ。
標準入出力
909デフォルトの名無しさん:02/05/21 18:44
>>904
僕も最近,C言語を習得しようと思ってるので
お互いに頑張りましょう
910デフォルトの名無しさん:02/05/21 18:46
>>907
>>908
そういえばそうだった、ありがとうございます!
911デフォルトの名無しさん:02/05/21 18:49
関係ないけど
スタンダードが標準っていう意味なら
GLAYのALL STANDARD IS YOUは
すべての標準はあなたに??
バカですいません
あんたが基準だ じゃねーの?
そういえば、stdin,stdout,stderrってFILE *型の"大域変数"だったんだな。
考えたこともなかったが。
914デフォルトの名無しさん:02/05/21 19:04
const double a=45.72;
double b;
...
...

if(b==a){

}
実際にbが45.72の場合にもif文の中に入ってくれないんですけど、
どうしてなんでしょうか。。。
>>913
とは限らんが。
>>954
なんで浮動小数点型が「見た目ぴったりの厳密な値」と思う
やつがこんなに多いんだろうね。==で比較しちゃいかん、
と言うのは初歩の初歩だと思うんだが。
917デフォルトの名無しさん:02/05/21 19:11
>>916

>>954は浮動小数点の疑問を書くのですか?
914サソの疑問は %f じゃなく %e で差をとって見てみると良く分かる
んじゃないかとおもうんだな。
最初は誰もわからんだろ >>こんなに多い
このスレなんでこんなに人気があるの?
Cだから
922デフォルトの名無しさん:02/05/21 19:22
今日中に新スレになる予感
923デフォルトの名無しさん:02/05/21 19:28
>> 915
んだんだ。昔、そういう仮定のもとに書かれたチャセンという
ぷろぐらむが、まさにそういう罠でコンパイルできなかった。
こういう誤解が広まるのはこまるね。
>>914
if ( fabs(a - b) <= DBL_EPSILON) {
}
925デフォルトの名無しさん:02/05/21 19:34
Singleton

キタ━━(゚∀゚)━━ァ!
926925:02/05/21 19:35
あ、こりゃ失礼
語僕しますた
>>924
二つの値が十分に近いって奴だな。
C Fuck Youか何かに載っていたような・・・
>>926
さらに誤字ですか。
929925ぐらい?:02/05/21 19:38
失礼します
Cでカレントディレクトリからある条件(たとえば二桁の数字とか)
のフォルダのみを取得する方法はありませんでしょうか?
よろしければソースで示していただけると助かります。

最近Cを始めたのですが、
本を見てもフォルダの扱いってあまり書いて無いんですね。
(自分の読み方が悪いのかもしれませんが)
お助けいただけたら幸いです。
>>929
Cの標準規格ではディレクトリ内のファイル(ディレクトリ)名を得る方法は定義されていない。
>>929
組み込み系などディレクトリがない環境もあるからね。
man fnmatch(3)
>>929
プラットフォーム依存。
たいていの処理系だと、それ用のライブラリがあるのでマニュアル見るしかない。
WINだとFindFirstFile(), FindNextFile()
POSIX準拠OSだとopendir(), readdir(), closedir()
933925ぐらい?:02/05/21 19:46
>>930
ご親切にありがとうございます。
それにしても定義されていないのですか。
するとこれはC++などの領域に入るものであるということなのでしょうか。

自分はVC++を使用しているのですが、
もしC++で上で書いたようなことが出来るようでしたら
お教えいただけませんでしょうか。
たびたび申し訳ありません。
>>933
違う違う。
>>932の言うようにOSごとに、可能ならば多くの場合ライブラリが用意されている。
935デフォルトの名無しさん:02/05/21 19:49
識者の方にお伺いしますが、
a^=b^=a^=b
って式は、undefined なんですよね。
936925ぐらい?:02/05/21 19:50
>>931-932,>>934
や、そうなのですか。勘違いして申し訳ありません。
自分の環境はWIN2000なのでそれでご教授いただけますと助かります。
>>931
へー、fnmatchなんてのがあるんだ。知らなかったよ。

ところで、組み込み系だとファイル自体なかったりしないか?(w
(freestanding environmentというやつね。)

fopen()があるのにopendir()等が規格に入らなかったのは何故だらう?
>>936
>>932に書かれている関数をMSDNライブラリで調べる。
>>937
ファイルのない環境までは考えていなかったとか。
元々OS記述用言語だし。
940925ぐらい?:02/05/21 19:52
>>938
わかりました。いろいろありがとうございました。失礼します。
>>937
glob + fnmatch が便利。つーか挙げるなら glob だった。
ソースがほしいみたいなこといってたから挙げたけど、
使うだけなら FindFirstFile opendir でいいか。
>>935
うん。

>>939
規格だとfopen()もfclose()もmalloc()もexit()もとにかく全部の標準ライブ
ラリが使える環境(hosted environment)と、fopen()やfclose()やmalloc()
などが使えない環境(freestanding environment)の2種類を想定してるよね。

で、fopen()が使える環境だと「ファイル名」とか「ファイル」って概念はあ
るのに、ファイル名の一覧を取れないのはなぜなんだろうね。
>>935
式がundefinedというより、1つの式の中で同じlvalueの値を複数回
変えようとする「ことが未定義な動作」だ。
935
シーケンスポイントにaとbがそれぞれ2つか?
>>942
取れるのが名前だけじゃ不便だし、
ファイルシステムがOSにより様々だから規定しようがなかった
946935:02/05/21 20:10
ありがとうございます。
いいアルゴリズムっていうか小技を教えて
ってスレで出ていた小技なのですが、
誰も突っ込まないので、ちょっと心配になったんです。
(もちろん、花っから、こんな馬鹿なコードは使うつもり
はありませんでしたが。。。)
>>944
bは問題なかろ。問題はaだよな。

>>945
そうかもね。不便でもないよりましだった気もするが。

もし入れるとしたら、「ディレクトリ名」なんてのは指定できないから
カレントディレクトリのリストしか取れない。しかもchdirも入れられ
ない、か。うーん。やっぱりあってもしょうがないか?
948デフォルトの名無しさん:02/05/21 22:04
qsortの引数に配列の要素の大きさを指定する場所がありますが、
実際の処理の中ではどう使われてるんでしょう?
自分で汎用的なものをつくるとき、任意のオブジェクトをソートするときは
どうするのかなーと思って。

ソートして入れ替え処理が出てきたとき(Dataが要素の型とすると)
Data work = array[i];
array[i] = array[j];
array[j] = work
とworkのための領域(Data型一個の領域)が必要だと思いますが、
この領域はどう確保してるんですか?
malloc(size)とかだと重いような気がします。

質問がわかりにくくてすいません。
>>948
qsortに渡すのは「void*の配列」じゃないかな。
sortされるのはvoid*であって、実体ではない。
>>948
void qsort(void *base, size_t nelem, size_t width, int (_USERENTRY *fcmp)(const void *, const void *));
このプロトタイプ宣言のうち、widthをひとかたまりとしてソートします。
だから、workのための領域は必要ありません。
951デフォルトの名無しさん:02/05/21 22:28
ポインタってむずいな。
>>951
難しくないよ。慣れの問題だよ。
>>949 ちょっと待った。
だとすると、qsortの第一引数はvoid **じゃないとおかしいし、
第三引数は不要になっちゃうよ(sizeof(void *)に決まってるから)。
sortされるのは実体でしょう。

http://www.freebsd.org/cgi/cvsweb.cgi/~checkout~/src/lib/libc/stdlib/qsort.c?rev=1.11&content-type=text/plain

これはFreeBSDのlibcのqsort()のソースね。
実際の交換を行っているのはswapcode()というマクロで、
(サイズがlongの場合は特例でswap()の中で交換している)
配列要素をcharまたはlong単位で分割して交換処理をやってるみたい。
他のOSのqsort()も似たようなものではないかと。
954948:02/05/21 22:45
>950
>workのための領域は必要ありません。
普通のソートしか知らないので、入れ替えるときに
work領域を使わない方法というのがちょっとわからないんですが・・・。

qsortってc言語でかかれてるんですか?
もしそうなら、一度ソースを見てみたいです。
955948:02/05/21 22:51
>>953
と思ったらソースをどうも。
しっかり読んで見ます。でも難しそー。
>>955
要するに、ライブラリ関数の中で勝手に交換の為のwork領域を用意して
くれるという事だよ。
957デフォルトの名無しさん:02/05/21 23:35
Win me でVisual C++を使ってます。
これで作ったプログラムをDOS上で動かすことはできるんですか?
>>957
できる
そのVCのヴァージョンが1.5とかなら、
 PureDOSの上で動かせるプログラムが作れるでしょう。
「DOSで動かす」のDOSがWin32Consoleの頭悪い表現なら、
 答えは「できます」
そのほかは
 できません
960デフォルトの名無しさん:02/05/21 23:54
FreeBSD について来る heapsort は malloc してますね。
heapsort のアルゴリズムの都合で
ソートするオブジェクト一個分の作業領域があれば便利なんですな。
ちなみに、最悪の場合を考えると、
heapsort の方が qsort (quicksort) よりがぜん有理。
平均の場合は qsort の方が早いけど
オーダは同じなので、最悪の場合が
気になるようなクリティカルな場合は
heapsort の方がいいかも。
たとえば、4.4BSD 由来の qsort は、同じ値のキーが
多数ある場合、死ぬ程遅いのでこういう時に真っ当な
qsort を持って来るのが面倒なら heapsort を使うって感じ。
「VCを使って作ったプログラム」というところがみそ。
作業領域もheapsortが有利だね。
元のデータ以外は定数個しか要らない。
ガーソ...Linuxにはheapsortなんてついてこないようだ
みんなすごいね。。。
そこまでソートに速さを求めるプログラム組んでんだ。。。

。。それとも単なる追求心?
>>964
ソートでハマッたことのある人は多いと思う。
思ったより遅くて。
>>965
多数のデータから上位10件を表示するのに、ソート使ったら怒られました。
(まあ、確かにえらい遅かったが…)
>>966
ソートしないでどうやるの?
>>967
君は多数のデータから1番大きい数字を探す時もソートを使うんですね
969966:02/05/22 00:15
>>967
えーっと、priority queueを使えと言われたが、
良くワカランかったので上位10個ソート済みの
配列を持ってた(w

データなめ終わったとき配列内に残ってたやつ
が上位10個。
>967
ちょっと考えてみた。

たとえば、n件のデータのトップ10をとるなら
qsortだと最速でO(n*log(n))、最低速だとO(n*n)。
一方、全要素をなめて最大値を探すのはO(n)だから
これを10回繰り返せばトップ10が出るからオーダーはO(n*10)
あと、n>>10だと仮定すればO(n)だな。

結果としてオーダーを見るとソートするより最大値取得を
必要な回数だけ繰り返す方が早い。

ちなみに、priority queueを使えば操作自体はO(n)ですむけど
1件当たりの処理がちょっと重くなるから場合によって使い分ければ良いと思う。
971デフォルトの名無しさん:02/05/22 06:07
大きさ m のヒープを作れば、一回のデータ追加の
操作は O(log(m)) だから、
n 個のデータの上位 m 個を求めるには
O(n log(m)) で済む。
(全部のデータをプライオリティキューにするのでは無くて
これまでに見たことがあるデータの上位 m 個だけをキューに
しておけば良いから。)
972971:02/05/22 06:13
いい忘れたけど、
「大きい順んに m 個」
と言う場合、ヒープは小さい順に並べるのね。
そしたら、ヒープにある m 個のデータのうち
最小の奴だけは O(1) で取り出せ、それを更新する手間が
O(log(m)) になるから...
一番大きなものを探すだけなら、配列内の要素を全て一度だけ見ればOKだろ?
int型の変数に数字以外を入力すると表示させる方法がわかりません
↑「数字以外が入力された」を表示させるでした。
976デフォルトの名無しさん:02/05/22 10:51
>>974-975
何を言っているのかよくわからんが、scanf系関数で数字列以外が入力された場合のことなら、戻り値をチェックすればよい。
O(n log n)とO(n log m)って、まあせいぜい数倍の違いってことか。

でも実際には、データを全部メモリ上に持つ(そして何度も見る)のと
1パスで良い(全部同時に持つ必要はない)のはだいぶ違うね。
978デフォルトの名無しさん:02/05/22 14:01
日時を文字列で持っているのですが、これを1分進めたいという
場合どのようなやりかたがあるでしょうか?
char workdate[15];
strcpy(workdate, "20020522135930");
これが
"20020522140030"
になってほしいのですが。
いったん日時型かなにかに変換するのかなと思ったりしていますが
わからないのでよろしくお願いします。
int year, month, date, hour, min, sec;
sscanf(workdate, "%04d%02d%02d%02d%02d%02d", &year, &month, &date, &hour, &min, &sec);
とりあえずworkdate[16];
NULL文字は入れんでええのかえ
>>974
数値の入力にscanfを直接使うのはC言語では推奨されない。
全てを文字列として読み込み、その後、sscanfで処理すべし。
しまった(*ノД゚)
15でよかよ、ワシのミスじゃ。スマソ
次スレは日下部先生でひとつよろしく
立ててみるぞ。
985(@_@)?:02/05/22 14:27
strncpyはコピーすべき文字数がコピー元の文字列長より少なかったら
自動的に'\0'を入れないようだけど何故'\0'を付けないの?
付けた方が使いやすいと思うんだけど
986伝説の日下部陽一:02/05/22 14:34
次スレ
以降しる!

C言語なら、俺に聞け! <21>
http://pc.2ch.net/test/read.cgi/tech/1022045622/l50
>>985
そういう仕様だからです。
文句はK&Rに言いましょう。
ANSIじゃないの?
今まで我慢してたけど、昨日ともっちで初めてオナニしたよ。
気持ちよかった。いつかともっち
いつかともっち
991デフォルトの名無しさん:02/05/22 14:46
Includeフォルダに
graphics.hがはいってないっす。
どこにああるの?
>>991
いつかともっち
993991:02/05/22 14:48
あいた!すれ残り数ぜんぜん見てなかった。
あっちでききます。
>>991
いつの処理系だ?
TurboC++か?
使っている参考書が古すぎて最近のでは動かんぞ。
そのソースは諦めるべし。
9951000!!:02/05/22 14:48
              ∧            ∧
              / ・           / ';,
             /  ';          /  ';  1000 ワショーイ…
             /   ;______/   ;
          /                  \
         /    /          \     \
        /´   (  ) |____|  (  )      |
       |  /////  (  |     :|    )  /////    |
       |    (   ) :|      |  (   (       |
        |    )  (  |     |   )   )      |
        |   (   ) ';    /   (   (     /
         \  )  (   \/    )   )  ../
           ヽ              ........:::
9961000!:02/05/22 14:49

              ∧            ∧
              / ・           / ';,
             /  ';          /  ';  1000 ワショーイ…
             /   ;______/   ;
          /                  \
         /    /          \     \
        /´   (  ) |____|  (  )      |
       |  /////  (  |     :|    )  /////    |
       |    (   ) :|      |  (   (       |
        |    )  (  |     |   )   )      |
        |   (   ) ';    /   (   (     /
         \  )  (   \/    )   )  ../
           ヽ              ........:::

997991:02/05/22 14:50
TurboC++です。
じゃあ、glibw32.libをDLして使うしかないのかな?
参考書、確かに無茶古いの使ってます。
998デフォルトの名無しさん:02/05/22 14:50

              ∧            ∧
              / ・           / ';,
             /  ';          /  ';  1000 ワショーイ…
             /   ;______/   ;
          /                  \
         /    /          \     \
        /´   (  ) |____|  (  )      |
       |  /////  (  |     :|    )  /////    |
       |    (   ) :|      |  (   (       |
        |    )  (  |     |   )   )      |
        |   (   ) ';    /   (   (     /
         \  )  (   \/    )   )  ../
           ヽ              ........:::

1000かも
最後
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。