5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

C言語なら、オレに聞け! <5>

1 :ジョブス2世:2001/07/12(木) 12:29
おれは26才、4年間プログラムを一生懸命作ってきた。
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

前スレ、関連スレは >>2

2 :ジョブス2世:2001/07/12(木) 12:30
独断と偏見で選んだ関連スレだ。

関連スレ
・( ゚Д゚)ノ ギコ猫のプログラム相談室part5
http://piza.2ch.net/test/read.cgi?bbs=tech&key=980521175

・お兄ちゃんの宿題、私が答えるよ
http://piza.2ch.net/test/read.cgi?bbs=tech&key=982853418

・VisualC++相談室 2
http://piza.2ch.net/test/read.cgi?bbs=tech&key=981630730

・C++Builder相談室
http://piza.2ch.net/test/read.cgi?bbs=tech&key=969458279

・C++相談室
http://piza.2ch.net/test/read.cgi?bbs=tech&key=980175292

・C#相談室
http://piza.2ch.net/test/read.cgi?bbs=tech&key=977112364

・ネットワークプログラミング相談室
http://piza.2ch.net/test/read.cgi?bbs=tech&key=970344582

過去スレ
・C言語なら、オレに聞け!
http://piza.2ch.net/tech/kako/967/967985026.html

・C言語なら、オレに聞け! <2>
http://piza.2ch.net/test/read.cgi?bbs=tech&key=979529893

・C言語なら、オレに聞け! <3>
http://piza.2ch.net/test/read.cgi?bbs=tech&key=989929288

・C言語なら、オレに聞け! <4>
http://piza.2ch.net/test/read.cgi?bbs=tech&key=992357382

3 :デフォルトの名無しさん:2001/07/12(木) 12:38
こんどのジョブスさんはとてもいい人そうだ。
なんだかほのぼのした。

CでString型を実装するにはどうしたらいいかな?

4 :デフォルトの名無しさん:2001/07/12(木) 12:43
>>3
無理。
C++使え。

5 :デフォルトの名無しさん:2001/07/12(木) 13:22
>>3
char *string_alloc(size_t);
void string_free(char *);
char *string_assign(char *, const char *);
char *string_append(char *, const char *);
なんて感じで関数作れば?それ以上は無理。

6 :デフォルトの名無しさん:2001/07/12(木) 14:01
多倍長演算を扱ったいい本ってないでしょうか?
検索しても中途半端なものしか見つからないので、
よろしくお願いします。

7 :デフォルトで能無しさん:2001/07/12(木) 20:31
http://www.ansi.org/
ANSIってここっすよね?

CとC++の仕様書読みたいんですが、どこにあるかわかんないです。教えてください。
サーチしてもでてこないし・・・(涙)

8 :デフォルトの名無しさん:2001/07/12(木) 21:15
http://webstore.ansi.org/ansidocstore/product.asp?sku=ISO%2FIEC+14882%3A1998
これ?C言語はわからない。245ドルって・・・

9 :7:2001/07/12(木) 21:29
どもです。8さん。やっぱ基本から学びたいけど高すぎる!
だれか共同購入しませんか?

10 :デフォルトの名無しさん:2001/07/12(木) 23:03
C でString実装はちょっぴりめんどいな!
まあ、モドキでいいんだけどね。

ところで、ASCIIコードとかは A〜Z が連続であることが保証
されてるけど、これが保証されていない文字コードなんて
実際のところ世の中に存在するのかね?

11 :デフォルトの名無しさん:2001/07/12(木) 23:20
質問ですが、

typedef struct
{
int a;
MIKAN b; //エラー

} RINGO;

typedef struct
{
int c;
...

} MIKAN;

このエラーが出ないようにする方法はありますか?

12 :デフォルトの名無しさん:2001/07/12(木) 23:21
>>11
定義の順番逆にすれば?(大爆笑)

13 :デフォルトの名無しさん:2001/07/12(木) 23:22
>>10
EBCDICは?

14 :デフォルトの名無しさん:2001/07/12(木) 23:22
あるよ。
typedef struct
{
int c;

} MIKAN;

typedef struct
{
int a;
MIKAN b; //エラーにならんぜ

} RINGO;

15 :10:2001/07/12(木) 23:25
>>13
http://www.pleasuresky.co.jp/images/ebcdic.gif

おふー
こんなコード形態があったとわ〜
教えてくれてありがとう

16 :デフォルトの名無しさん:2001/07/12(木) 23:25
すみません間違えました

typedef struct
{
 int a;
 MIKAN b; //エラー
} RINGO;

typedef struct
{
 int c;
 RINGO d;
} MIKAN;

このエラーが出ないようにする方法はありますか?

17 :デフォルトの名無しさん:2001/07/12(木) 23:26
>>7
共同購入すると安くなるのかな?送料稼げる?近くじゃないと意味ないしね。
多分コピーしようってんだろうけど、それは犯罪だよ。

18 :デフォルトの名無しさん:2001/07/12(木) 23:28
>>16
ないね。
フツーそういう時はポインタにするんだけど。
もっと根本的な問題はまぁ置いとくとしてもね。

19 :デフォルトの名無しさん:2001/07/12(木) 23:29
>>11
typedef struct
{
 int a;
 struct _MIKAN b;
} RINGO;

typedef struct _MIKAN
{
 int c;
 ...
} MIKAN;

20 :デフォルトの名無しさん:2001/07/12(木) 23:31
>>19
コンパイルくらいしとけって。

21 :デフォルトの名無しさん:2001/07/12(木) 23:37
>>20
ほんとだ、だめか・・・。

22 :16:2001/07/12(木) 23:41
C言語の規定で解決法があるのかなと思ったんですが
どうやらないようですね。あきらめます。ありがとうございました。

23 :デフォルトの名無しさん:2001/07/12(木) 23:50
>>22
つーか、無限?
RINGO r;
r.b.d.b.d.b.d.b.d.b.d.b.d.b.d.b.d.b.d.b.d.a = 123;
とか?

24 :デフォルトの名無しさん:2001/07/12(木) 23:51
>>16
そのような構造を無限マトリョーシカといいます。

25 :7:2001/07/12(木) 23:57
まぁ大いにマズイかんじしますけど。一応Personal UseコピーについてANSIにメールしてみました。>17
つうことでトモダチ募集!!
ansi-c@excite.co.jp

26 :デフォルトの名無しさん:2001/07/12(木) 23:59
>>25
だから友達コピは犯罪だって。養子縁組するなら見逃されるかもしれないけどさ。

27 :デフォルトの名無しさん:2001/07/13(金) 00:00
>>26
穴兄弟になればいいんじゃないか?

28 :デフォルトの名無しさん:2001/07/13(金) 00:01
>>16
1.この宣言が成立したと仮定する。
 sizeof( RINGO )は、いったいどうなるか(10点)
2.不完全型について述べよ(20点)
3.自己参照構造体について述べよ(20点)
4.相互参照する構造体について、その実現方法について述べよ(50点)

29 :16:2001/07/13(金) 00:05
無限になりますね(汗
実際には構造体のポインタとして使うのですが、
前方参照の問題なので、ポインタにしなくてもいいかと思って…。

MIKAN *b をvoidのポインタとして宣言して、キャストして解決してる
んですが、なんとなく気になったので質問させていただきました。

30 :デフォルトの名無しさん:2001/07/13(金) 00:07
>>29
だから、ポインタだったらそんなことせんでもよかんべ。
本くらい読めよ。大抵の本には載ってると思うが。

31 :デフォルトの名無しさん:2001/07/13(金) 00:09
>>25
うーむ、養子になってもアナログコピーマシンを使わないとダメ
みたいだな。まぁがんばれよ。
http://www.bunka.go.jp/8/2/VIII-2-C.html

32 :7:2001/07/13(金) 00:14
>>26 ANSI準拠とか言って本売ってるとこいっぱいあるし・・やっぱいいんじゃないの?
商用の際は特別に申告&追加料金払えとかパッと見て書いてないし>本家
つまり自分が2MBの文書を定価245jで買って、赤の他人に(安く)再販するのはOKじゃないかと。
(そのあたりをメールで聞いてみた)

33 ::2001/07/13(金) 00:17
>>31 どもです。WEBからDL購入らしいです。>アナログコピー

34 :デフォルトの名無しさん:2001/07/13(金) 00:17
>>29
そらよ。
typedef struct MIKAN *pMIKAN;
typedef struct
{
int a;
pMIKAN *b;
} RINGO;

typedef struct
{
int c;
RINGO d;
} MIKAN;

35 :デフォルトの名無しさん:2001/07/13(金) 00:25
今度の土曜にC言語検定の2級、3級のテストなんですけど
どんなのがでそうですか?

36 :デフォルトの名無しさん:2001/07/13(金) 00:52
>>32
しかし、全くすごい発想だな。
メールで聞くだけハナクソくらいの救いはあるが。

37 :デフォルトの名無しさん:2001/07/13(金) 01:34
clock()の精度って上げられないですか?
せめて10倍ぐらいに。

38 :7>36:2001/07/13(金) 01:44
死ね

39 :デフォルトの名無しさん:2001/07/13(金) 01:48
>>37
カーネルパラメータを変更して再コンパイル。

40 :デフォルトの名無しさん:2001/07/13(金) 01:51
>>37
timeGetTime()使え。

41 :37:2001/07/13(金) 02:05
サンクス

42 :だるだる:2001/07/13(金) 09:45
C言語で人工生命とか人工知能のプログラムを
作ろうかと思いますが、これは一般的ですかね?
AI,ALとかを作ることに適している言語って
あるんですかね?(聞いたことがあるが忘れました)

43 :デフォルトの名無しさん:2001/07/13(金) 10:27
>>28
16ではないが、合ってる?

> 1.この宣言が成立したと仮定する。
>  sizeof( RINGO )は、いったいどうなるか(10点)
sizeof(RINGO) == sizeof(a) + sizeof(MIKAN)
正確にはパディングが入る可能性があるので
sizeof(RINGO) => sizeof(a) + sizeof(MIKAN)

> 2.不完全型について述べよ(20点)
定義されていない、または定義途中の型

> 3.自己参照構造体について述べよ(20点)
C-FAQ 1.14参照
http://www.catnet.ne.jp/kouno/c_faq/c1.html#0

> 4.相互参照する構造体について、その実現方法について述べよ(50点)
typedef struct _a_t a_t;
typedef struct _b_t b_t;
struct _a_t { b_t *b; };
struct _b_t { a_t *b; };

44 :デフォルトの名無しさん:2001/07/13(金) 10:29
>>42
ネタか?

そっち方面は門外漢なんで最近はどうか知らないが、前は
Prolog か LISP が定番だったけどな。

45 :デフォルトの名無しさん:2001/07/13(金) 15:38
>>44
おもんない

46 :デフォルトの名無しさん:2001/07/13(金) 18:31
前スレで可変個の引数についての話があったけど、
_beginthreadex()で渡す、引数リストってどうやって
作成するんですか?

47 :デフォルトの名無しさん:2001/07/13(金) 18:32
>>46
K&R読んだ?(大爆笑)

48 :デフォルトの名無しさん:2001/07/13(金) 20:02
>>47
旧Perl板にでも帰れ。

49 :K&Rって:2001/07/13(金) 20:50
インチキでしょ?

50 :デフォルトの名無しさん:2001/07/13(金) 21:56
>>46
http://www.pro.or.jp/~fuji/mybooks/cdiag/cdiag.8.5.html
超有名な「Cプログラミング診断室」より。
ここは一通り目を通しておこう

51 :眠い…:2001/07/13(金) 23:04
>>46
> _beginthreadex()で渡す、引数リストってどうやって
> 作成するんですか?
struct hoge{
int para1;
int para2;
int para3;
};

foo(){
struct hoge hogehoge;
DWORD t_id;

_beginthreadex(NULL, 0, thread_func, (void*)&hogehoge, 0, &t_id);
}

unsigned thread_func(void *param){
struct hoge *p;
p = (struct hoge *)param;
}

52 :デフォルトの名無しさん:2001/07/13(金) 23:48
>>43
_ 始まりはシステム予約などで使用される。
サンプルでも使用すべきでない。

53 :デフォルトの名無しさん:2001/07/14(土) 00:09
#ifndef _MYPROJ_H
#define _MYPROJ_H
:
:
:
#endif

も同じレベルで逝ってよしってことでよろしく

54 :Q:2001/07/14(土) 00:42
すみません、別スレで質問したのですが、どなたも答えてくれなかったもので...。
Visual Studio6を使ってるんですが、MS-DOSプロンプトで
cl 〜.c
のように入力してもコンパイルできません。他のコンパイラでコンパイル
したものを実行することはできるのですが。
どなたか分かりますでしょうか。

55 :デフォルトの名無しさん:2001/07/14(土) 00:52
>>54
path

56 :デフォルトの名無しさん:2001/07/14(土) 02:24
>>54
だから、どんなエラーが出るかくらい書けよ。

57 :ジョル.ビブズ(偽者):2001/07/16(月) 05:12
ビル.ジョブズさんって普段何してはるひとなん?
ちょっと興味あり(はあと)

58 :ジョブス2世:2001/07/16(月) 12:45
>>57
> ビル.ジョブズさんって普段何してはるひとなん?
普通のサラリーマンプログラマです。

プログラムに詰まったり、コンパイル中にここを見てます。

59 :アイズ:2001/07/17(火) 00:12
スケジュールを作るプログラムを作りたいのですが。
登録、修正、削除、表示、検索が行えるように。
YYYY/MM/DD,HH:MM
月日、時刻、内容
ってかんじで。
ます、なにから考えればいいですかね?

60 :>>59:2001/07/17(火) 00:25
スケジュール

61 :デフォルトの名無しさん:2001/07/17(火) 00:27
>>59
プログラマー以外の職業への転職、もしくは就職

62 :デフォルトの名無しさん:2001/07/17(火) 04:35
駄目スレになりつつあるな・・

63 :デフォルトの名無しさん:2001/07/17(火) 06:38
>>52
>>53
そうかな〜?
外に見えなきゃいいんじゃないのかな〜?
>>43
のは、見えてそうだけど。

64 :デフォルトの名無しさん:2001/07/17(火) 08:54
>>63
53はUUIDを噛ませろって言ってんじゃねぇーの。

65 :デフォルトの名無しさん:2001/07/17(火) 09:48
>>59
日付と時間をおさめる構造体
この構造体と予定を納める双方向リスト(を実現する構造体)
双方向リストから登録、修正、削除、表示、検索を行う関数
C++だといいのにね・・・

66 :デフォルトの名無しさん:2001/07/17(火) 22:14
>>64
_ で始まる名前はやめろっていってるんじゃ?

67 :デフォルトの名無しさん:2001/07/19(木) 01:06
大した話じゃないし,実際動いているから問題ないんだけど
スタイルについて疑問に思っていたので質問.
Cの構造体の宣言の仕方について自分がよくやるパターンで,
具体例を挙げると例えばCSVのトークナイザを作る時に

csv.h
typedef struct _CSV CSV;
CSV *csv_new(char *filename);
char *csv_getvalue(CSV *cp);
...

csv.c
#include "csv.h"
struct _CSV {
...
};
CSV *csv_new(char *filename)
{
...
}

みたいな感じにする.で、これを使うファイルからは,

#include "csv.h"

としてる.つまり,typedefとインターフェイスだけ外に見せるっていうやり方.
外部から構造体の中身について触る必要がない場合,いつもこういうやり方を
してるんだけど,これってなんていうか,まともなやり方?

知りたいのは,こういう場合構造体定義もヘッダに書くべきなのか,
上記のようなやり方がまかりとおるかどうかは処理系依存なのかどうかとか.
今まで見てきたソースだと,大抵構造体定義もヘッダに出してるから
どうなのかなーと思った.

一応LinuxでのgccとHP-UXのccではこう書けたんだけど.

68 :デフォルトの名無しさん:2001/07/19(木) 01:22
>>67
ユーザーによる構造体メンバへの直接アクセスを避けたい
場合とかでは普通のテクニックだと思います。
ハンドル指向(?)の徹底という意味で、
良いコーティングスタイル事だと思います。

69 :デフォルトの名無しさん:2001/07/19(木) 02:26
>>67 >>68
ほう、これ知らなかったよ。

参考にしとこう。

70 :デフォルトの名無しさん:2001/07/19(木) 03:10
ハンドルにするなら*なんか書かせんなよ.

71 :デフォルトの名無しさん:2001/07/19(木) 03:23
つーか気に入る様に勝手にtypedefすりゃいいじゃん。>70
厨房?

72 :デフォルトの名無しさん:2001/07/19(木) 09:44
>>67
そんなところは無いようだが、どの変が処理系依存だと思ってるんだ?

73 :出張あさはかマン:2001/07/19(木) 10:34
gnu newlibを解析してるつもりの人です。
こんなとこを見つけたのですが
------------
ctype.h
------------
...
#define _U 01
#define _L 02
#define _C 040
...
#define isalpha(c) ((_ctype_+1)[(unsigned)(c)]&(_U|_L))
...

------------
ctype_.c
------------

#include ctypes.h
...

_CONST char _ctype_[1 + 256] = {
 0,
 _C,_C,_C,_C,_C,_C,_C,_C,
...
}
------------
と書いてあったんですが、
(_ctype_ + 1)[n]って、_ctype_[n + 1]と同意なのでしょうか?
もしそうだとして、unsignedなのに配列の大きさが[1 + 256]なのも
良くわかんないです・・・・
_ctypes_[0]は何につかうのだろ・・?

74 :デフォルトの名無しさん:2001/07/19(木) 11:38
CSVファイルを編集するソフトを作ってみたいのですが
何かよいサンプルはありませんか。

75 :デフォルトの名無しさん:2001/07/19(木) 12:04
>>73
EOF用

76 :デフォルトの名無しさん:2001/07/19(木) 12:13
>>73
> unsignedなのに配列の大きさが[1 + 256]なのも
> 良くわかんないです・・・・
is系は0〜255までの文字とEOFの257種類を判定しなければいけない為

77 :出張あさはかマン:2001/07/19(木) 14:11
>>75,>>76
と、すると
EOFが返ってきそうなものは符号付で来るのかな・・・

ちょっと確かめて見ます。
有難うございます。

78 :出張あさはかマン:2001/07/19(木) 14:19
int getc(FILE *fp)とか、すべてint表記でした。
すると(_ctype_-1)[n]は、やはり(_ctype_)[n-1]と
結果は同じになるということですね。

納得。
さんくすです。

79 :67:2001/07/19(木) 21:25
ありがとう.意見が聞けて良かったよ.
ポインタを意識させるかどうかは最初迷ったけど,考えた結果どっちでも
いいような事だと分かったんだ.だから,標準ライブラリのFILE構造体の
扱いにならってこうしたんだ.それ以来このパターンではずっとこのやり方だよ.
処理系依存かもしれないと思ってた個所は先に書いた通り,構造体定義の場所に
ついて.>>74は暗に俺に向かって言ってるのかも知れないけど,言語とか
はっきりしないのでパスするね.

80 :デフォルトの名無しさん:2001/07/20(金) 03:02
>>79
Cの仕様をちゃんと理解した方がいいと思われ.

81 :デフォルトの名無しさん:2001/07/20(金) 05:11
さぁ、もうすぐ夏休みだ!!!!!!!!!!!!!
プログラム板のみんな気を引き締めろ!!!!!!!!!!!!

82 :デフォルトの名無しさん:2001/07/20(金) 07:11
>>80
激しく同意

83 :( ´∀`)さん:2001/07/21(土) 00:14
quick sortを自前で作ったら
データ数20万を0.6秒でソートできたよ!
qsort使ったら2.6秒くらい。

誰か ほめて!!

84 :デフォルトの名無しさん:2001/07/21(土) 00:28
>>83
対象データは?

85 :デフォルトの名無しさん:2001/07/21(土) 02:52
>>83
これより速い?
http://www.mars.dti.ne.jp/~a-wada/qsortlib.html

86 :ビル・ジョブス:2001/07/21(土) 03:37
>>83
どうせオンメモリーだろ!
件数増えるとメモリーへのロード時間がネックになるだろ!
オレ様の場合は、MapViewOfFile駆使して、
10万件だろうが、100万件だろうが、
ほぼ同じスピードでソートできるロジック
もってるぜ!

87 :デフォルトの名無しさん:2001/07/21(土) 03:47
>>86
それはスラッシングでは・・・

88 :デフォルトの名無しさん:2001/07/21(土) 03:58
へなへなへな。仮想記憶の立場は....
それとも窓系ってそこまでヘボなの?

89 :ビル・ジョブス:2001/07/21(土) 04:10
スループットを追求するなら、仮想記憶させない
配慮が必要だ。
アーキテクチャーを味方に付けるのだよ。
お前らに言っても分からないと思うけど。

90 :デフォルトの名無しさん:2001/07/21(土) 04:18
>>86>>89 で、なんか言ってること矛盾してない?

91 :ビル・ジョブス:2001/07/21(土) 04:24
どこがだよ!ボケ!

92 :ビルは嫌いだがジョブズはまあいいか:2001/07/21(土) 04:27
おまえなあ。MapViewOfFile or mmapが裏で何やってるかを把握
してから出直しな。

93 :デフォルトの名無しさん:2001/07/21(土) 04:32
>>86
なぜにこーゆー口調の奴ってばドキュソてんこもりなの?

94 :90:2001/07/21(土) 04:34
オンメモリをMapViewOfFileに変えた所で、
結局裏で仮想記憶が働くのは一緒。(>>86)
で、>>89で「仮想記憶させない配慮〜」とか言ってるから。
わかった?

95 :88:2001/07/21(土) 04:35
>>89
確かにそんなマヌケで曖昧な意見言われてもわからん。
今更キャッシュラインサイズにあわせたストライピングなんて
ガイシュツもいい所の話をだしたら、流石に一同ズッこけるか
ら、面白いネタ期待してるよ。

96 :ビル・ジョブス:2001/07/21(土) 05:32
そっかー、お前らみたいなヤツらが居るから、
迷惑なくらい遅いソフトがまかりとおるわけね。
仮想アドレスと仮想記憶って別物だよな。
仮想アドレスにアクセスした時にオブジェクトが
存在しないと、Page Faultするよな。
ここで仮想記憶が動くわけだ。
最初の1回目に動くのは当たり前だ!
お前らみたいに数10MBも一気にアロケートして
Faultしまくりおバカに、mmapを…などと言われたく
ないんだよ。
もーWIN32使わないでくれ!
死んでくれ!>>92

97 :デフォルトの名無しさん:2001/07/21(土) 08:17
まー、仮想記憶システムの完成度によるよね >メモリマップの有効性
お馬鹿キャッシュなら仮想記憶もダメ→依存してるメモリマップもダメ
っていう図式ができる。
ビルの言ってることも間違いではない。口が悪いけど。

98 :  :2001/07/21(土) 08:32
レベルの低い質問で恐縮ですが
Visual C++ のprofessional EditionとStandard Editionの違いを
教えてください。

99 :88:2001/07/21(土) 08:51
>>97
口が悪いとか何とかの以前の問題で間違ってるよ。
マッピングは仮想アドレス空間に一度invalid状態でファイル
全体を割り当て、ページフォルトをつかって実際の読み込みに
入るんだから。そうじゃなきゃどのタイミングで読み込むか
教えてくれ。だからこそ最初に「窓系ってそこまでヘボなの?」
って聞いたのだよ。

100 :デフォルトの名無しさん:2001/07/21(土) 08:58
というか窓林檎野郎も技術屋の端くれだったら馬鹿みたいに
吠えてないで、自分の方式のほうが圧倒的に速い、という事
を定量的に実証して見せれば良いだけジャンか。なんでその
程度できん?

そもそもUNIXプログラマならmmap使った処理は一般的なもの
で、なにも特別な方法ではないのだよ。
#圧倒的に高速には88の理由からならんが。

101 :88:2001/07/21(土) 09:11
>>100
その通りっす。でかすぎるファイルの一部を弄るときなんかに多用します。
あと、極端に大域的にランダムアクセスになるような場合、小領域での"分
割リード"に比べれば有利です。

ただし、sorting のように全体をスパースする場合は....って一々言わな
くても分るよね。

102 :83@( ´∀`)さん:2001/07/21(土) 09:52
>>84
ただのint

>>85
見たけどよく分からん!

>>86
もっと分からん!
オンメモリー?たぶん!

103 :83@( ´∀`)さん:2001/07/21(土) 09:53
こんな感じ。

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

#define NELEM 10000

void mysort(int* pn, int nLen)
{
  switch(nLen)
  {
  case 0:
  case 1:
    return;
  case 2:
    if(0){
  case 3:
    (pn[0] < pn[1]) || (pn[0]^=pn[1]^=pn[0]^=pn[1]);
    (pn[1] < pn[2]) || (pn[1]^=pn[2]^=pn[1]^=pn[2]); }
    (pn[0] < pn[1]) || (pn[0]^=pn[1]^=pn[0]^=pn[1]);
    return;
  default:
    {
      int* pnH = pn;
      int n = nLen, nn;
      int nPiv = *pn, nVal, nPos, nNumS, nNumL, nNumE;
      nVal = pn[ nPos = nNumE = 1 ]; nNumS = nNumL = 0;
      while(--n){
        if(nVal < nPiv){
          pn[nNumS++] = nVal; nVal = pn[++nPos]; continue;
        }
        if(nVal > nPiv){
          pn[nn]^=nVal^=pn[nn = nLen-1-nNumL++]^=nVal; continue;
        }
        nNumE++; nVal = pn[++nPos];
      }
      pn += nNumS;
      for(n = 0; n++ < nNumE; *pn++ = nPiv);
      mysort(pn-nNumE-nNumS, nNumS);
      mysort(pn,       nNumL);
      return;
    }
  }
}

int main()
{
  int n, an[NELEM+1];
  clock_t tStr, tFin;
  srand(time(NULL));
  for(n = 0; n < NELEM; an[n++] = rand());
  tStr = clock();
  mysort(an, NELEM);
  tFin = clock();
  printf("\n[time:%f]\n", (double)(tFin - tStr)/CLOCKS_PER_SEC);
  return 0;
}

104 :チト気を付けよう:2001/07/21(土) 11:05
>>99
あのー良くよんだほうがいいですよ。
ビルも一回目は…、って言ってるじゃん!
それはそうと、ビルジョブスって、このスレの
創設者じゃない?
だとすると、雲の上の人だよ。

105 :デフォルトの名無しさん:2001/07/21(土) 11:33
>>103
どんなデータもソートできるように、比較をコールバックで行った
りmemcpy()的な方法で交換したりしている分、qsort()は不利かもし
れない。
その辺の条件そろえてなお速かったらほめてやるよ。

106 :デフォルトの名無しさん:2001/07/21(土) 13:04
>>103
この程度の関数を qsort() と比較してはいけません。

- 単なる int 配列のソートしかできない。
- ソート条件は固定。
- ソートする要素に重複する値が無いことを前提としている(重複す
 る値があると nLen == 3のときに xor の結果として 0 で上書き
 されてしまう)。
- ソート済みのデータを与えたときに、処理時間が最悪のケース
 O(n^2) になってしまう。
- 再帰を使っているので、メモリ不足時のエラーハンドリングが難
 しい。

汎用的に書かず、エラーハンドリングや最悪のケースを避けるため
の配慮もしなければ、そりゃ多少は速くなりますが、代償として実
用性を失うことになります。

あと mmap() 云々は、またちょっと別の話ですね。巨大なデータを
整列させる場合には、データの読み書き部分がクリティカルパスに
なることがあります。UNIX の場合、伝統的なファイル入力のシステ
ムコールは read() ですが、これを使うと

1. デバイスからデータを kernel 中のバッファキャッシュに読み込む
2. kernel からバッファキャッシュから read() を呼び出したプロセ
 スのメモリ空間にデータをコピー

と 2 度のコピーが発生します。mmap() だとこれが 1 度で済むので、
メモリの使用効率も CPU 負荷も下がることが期待されます。

ただし、単純に read() を mmap() に書き換えたら速くなるという話
ではなく、性能を出すにはデータ構造やロジックに関して、注意深い設
計が必要です。ソートでは入出力の回数を少なくするため、いかにメモ
リアクセスを局所化するかが肝ですね。

107 :デフォルトの名無しさん:2001/07/21(土) 13:38
>>103
なんでint決め打ちなのにxorなんて使うかね.xor知ってよっぽどうれしかったのかな.
pivot選択少しくらい工夫しろよ.

108 :デフォルトの名無しさん:2001/07/21(土) 13:47
unsigned shortを引数にもつ関数にunsigned shortの変数codeを
渡すと、
A(code);
は問題ないのですが、
A(code | 1);
とすると仮引数と実引数が異なると警告が出るのですが
なぜでしょうか。|を使うと型が変更されるのでしょうか?

109 :デフォルトの名無しさん:2001/07/21(土) 13:52
>>108
汎整数拡張について調べてみて。

110 :デフォルトの名無しさん:2001/07/21(土) 13:53
>>108
1はintだから。

111 :108:2001/07/21(土) 13:57
>>109,110
早い反応アリガトウございます。

112 :デフォルトの名無しさん:2001/07/21(土) 14:16
てゆーかー、unsigned shortなんて引数にする意味ないのよ。

113 :君もチト気をつけよう:2001/07/21(土) 17:29
>>104
どう考えたってファイルのマッピングの仕組みをビルが勘違いしていたのは間違いないぞ。
ていうかいちいち「!」つけるなよ。まるっきりビルだぞ(w
#ああ、こういったときのために sage 以下が欲しいなあ。

114 :デフォルトの名無しさん:2001/07/21(土) 17:35
結局>>87が真理か…

115 :デフォルトの名無しさん:2001/07/21(土) 18:43
>>114
なわけねーだろ.

116 :( ´∀`)さん:2001/07/21(土) 20:46
qsortと同じ汎用性を持たせたら
予想どうり負けたじゃん!
ライブラリ関数には勝てないってことか…

そんなqsortの中身を見てみたいんだけど、
見れないのかな?

117 :デフォルトの名無しさん:2001/07/21(土) 21:11
>>116
見たけりゃ見れるさ.

118 :108:2001/07/21(土) 21:11
>>112
どうしてなんですか。教えてください。

119 :ビル・ジョブス:2001/07/21(土) 21:19
>>113>>114
オレは勘違いもしていないし、間違ってもいない。
コアな部分は作った経験が無いと分からないんだよな!
上記2名はVRとかSHでいいから、簡単なボードを
自作でもして、仮想記憶コードを作ってみろよ!
まぁ、多重仮想記憶モードのASIDの使い方で
頭がハゲるだろうな。
偉そうこいといて、無理だって言うなら、
即刻コンピューターやめな!このタコが!

120 :君もチト気をつけよう:2001/07/21(土) 21:26
>>119
まあそのくらいにしとき。
少なくとも俺はx86とMIPSでの仮想記憶コードの作成
経験があるよ。

121 :デフォルトの名無しさん:2001/07/21(土) 21:32
>>119, >>120
そんな簡単なことで威張るなよ。馬鹿馬鹿しい。

122 :デフォルトの名無しさん:2001/07/21(土) 21:41
>>116
VC++ 使ってるなら CRT ソースコードをインストールしましょう。QSORT.C という
名前で qsort のソースがインストールされます。ソース非公開のライブラリを使っ
ている場合には、フリーの UNIX のソースコードを参照するのも手です。

http://www.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/stdlib/qsort.c

>>119
騙りかな? なんにせよ、技術的な中身がない書き込みは sage で頼みます。
ただでさえ夏休みに入って、板のレベル下がってるんですから。

123 :ビル・ジョブス:2001/07/21(土) 21:42
>>120
どうせ、HALかOALでエクセプションハンドリングを
ちょこっと書いただけだろ。
そりゃ仮想記憶コードとは言わないぜ!
あっ、明日、渋谷でデートだ!A.I.観るんだった!
お風呂はいろーっと。
もう、2chつまんねーなー…

124 :デフォルトの名無しさん:2001/07/21(土) 22:12
なんか引き際の見苦しいやっちゃなあ。
ビルってこんなにしょうもない奴だったの?

125 :>>124:2001/07/21(土) 22:30
"悔しい"の間違いでは…
彼女居ないからって僻むなよ…
まず痩せろよ!デブ!

126 :デフォルトの名無しさん:2001/07/21(土) 23:33
>>123
linuxの仮想記憶部分見れば一発じゃん。
もうすこし面白い煽りしてくれよ。つーことでさげ。

127 :君もチト気をつけよう :2001/07/21(土) 23:44
>>126
これは放置でしょう。
もう既に技術ネタでは勝てないことを自分でアピールしてるくらいだから。
普段なら空白下げで隙間空けてから仕切り直すところだけど、この時期は
無駄だろうなあ。

#余談だが太ってるくらいで彼女できない奴なんているのか?
#俺も太めだが。

128 :やっぱり…:2001/07/22(日) 00:26
悔しいの? >>127
ピル様の勝ちかな?

129 :デフォルトの名無しさん:2001/07/22(日) 06:36
ファイル名を入力して
ファイルの大きさ(バイト数)を出力するプログラムって
どうやって作るんですか?

130 :デフォルトの名無しさん:2001/07/22(日) 08:32
ビルは複数存在してるぜ。

131 :デフォルトの名無しさん:2001/07/22(日) 10:24
Cを始めて半年の初心者です。
「is〜」関数(マクロ)について教えて下さい。

例えば、isdigit 関数なのですが、
ヘッダ ctype.h に次のように定義されています。

extern const unsigned char _ctype[];

#define _DGT_P 0x4 /* digit */

#define isdigit(c) ((_ctype[(c)+1] & _DGT_P) != 0)

これでなぜ (c) が数字かどうか判定できるのか、いまいち理解できません。

・_ctype[] とは何か? この外部変数の実態定義がどこにもありません
・_ctype[(c)+1] とは、具体的に何か?
・なぜ 4 とビットANDをとるだけで数字かどうか判定できるのか?

他の is〜関数も似たような定義になっています。
このコンパイラは LSI C-86 Ver.3.30 試食版です。

よろしくお願いします。

132 :デフォルトの名無しさん:2001/07/22(日) 10:51
_ctype[]は探すと extern で宣言されていると思いますが、こ
のことからもわかる通り、ライブラリ中にあります。要するに
各キャラクタごとに予め種類分けしたテーブルを参照する訳で
す(単純!)。and を取るのは、各エントリの各ビットが其々の
種類に対応している、というわけです。

133 :デフォルトの名無しさん:2001/07/22(日) 12:56
>131
>>73-78 も参考にすべし。

134 :デフォルトの名無しさん:2001/07/22(日) 15:56
>>129
1. プログラムを書いて
2. コンパイルして、
3. 実行する.
だけなんだけど、システム依存だから何でやりたいのか書けよ.

135 :129:2001/07/22(日) 15:58
FILE * fp;
使うのは分るんだけど。。。

136 :129:2001/07/22(日) 16:01
>>134
レス有難う。
パソコンでやりたいんだけど。。。

137 :デフォルトの名無しさん:2001/07/22(日) 16:04
>>129
言語や環境がわからないと答えようも無いな・・・

ハッ! (ゴゴゴゴゴ) 新手の荒らしかッ!

138 :129:2001/07/22(日) 16:11
>>137
ごめん。。。嵐じゃないです。
c言語です。あと環境はウィンドウズ98です。

139 :129:2001/07/22(日) 16:20
>>137
怒ったんすか?なにぶん初心者なもんで・・
ゴメンナサイ。

140 :デフォルトの名無しさん:2001/07/22(日) 16:26
一番肝心なコンパイラが何か書いてないし

141 :129:2001/07/22(日) 16:32
C machine Version 2.00
とか言ううやつです。。。

開発環境
PC-AT互換機にてVisualC++ Ver6.0+旧Ver

だそうです。

142 :131:2001/07/22(日) 16:36
>>132
>>133
ありがとうございました。
う〜ん、_ctype[] の中を見ることはできなさそうですね。残念。

143 :デフォルトの名無しさん:2001/07/22(日) 16:53
>>141
なんだか分からんが、fopen()、fseek()してftell()で調べるのが
どこでも動いていんじゃないかな。パフォーマンスは悪いが。

144 :デフォルトの名無しさん:2001/07/22(日) 16:59
>>142
ええ?なんで?ソースに書いてあるんじゃないの?
もしないなら、プログラム書いて配列先頭から順番に
出力してみたら?

145 :デフォルトの名無しさん:2001/07/22(日) 17:01
MFC使えるならCFileのGetLength()でもええし

146 :デフォルトの名無しさん:2001/07/22(日) 21:38
MFC使えるならCFileのGetLength()でもええし

147 :デフォルトの名無しさん:2001/07/22(日) 22:11
GetFileSizeとかいうAPIがあったと思う.

148 :デフォルトの名無しさん:2001/07/22(日) 23:38
>>144
ソースはなかったと思う。
ライブラリを逆汗するという方法もある。(藁

149 :デフォルトの名無しさん:2001/07/23(月) 00:05
一つ教えてくらはい。
enumって無条件にintになるじゃないですか?(あってる?)
それをcharとか割り当てサイズを変えたいのですが。。。
あくまでも、enumにこだわっています。

150 :デフォルトの名無しさん:2001/07/23(月) 00:19
>>149
-fshort-enums が使えるんじゃない?(大爆笑)

151 :デフォルトの名無しさん:2001/07/23(月) 00:27
コムパイルオプチョンですか。。却下。

こういうふうに書きてぇ〜>ANSI C改革!
typedef char enum {
hoge,
hage,
hige
}hhh;

152 :デフォルトの名無しさん:2001/07/23(月) 00:33
>>151
C++使えば?
http://www.interq.or.jp/jazz/iijima/primer/comment/enum.html

153 :デフォルトの名無しさん:2001/07/23(月) 00:41
>>152
意味不明な指摘だな...

>>151
enumはintと同じ扱いだから例えば255以下が保証できるなら勝手にchar配列
にとりゃいいんだよ。キャストしないとwarningはでるだろうけどね.

154 :ジョル.ビブズ(偽者):2001/07/23(月) 01:19
あのちょっと参考に聞かせてほしいのです。
自分は、C言語を一応使えるようになった(と、思っている)レベルなんですが
さまざまな長さの行を持つテキストファイルを1行づつreadしてmallocした領域
に放り込んで、各行をポインタのチェーンで結んでやって行を移動できるようにしたい
んですが(テキストエディタの基本構造を作成してるんです)小規模なファイルなら
問題なく動作するんですが、極端に大きいファイルだと使い物にならないくらいに遅い
んですが、これを回避する方法はあるのでしょうか?

155 :デフォルトの名無しさん:2001/07/23(月) 01:22
極端に大きいとないんじゃないか?メモリを増やすんだな。

156 :デフォルトの名無しさん:2001/07/23(月) 01:25
>>152
そのURLがあったんで意味不明なんだが、C++を使うというのは
正しい指摘だな.
operator intとかoperator =を使えば少しおもしろいかもな.

157 :デフォルトの名無しさん:2001/07/23(月) 01:28
一発で全部(もしくはチャンク全体)を読み込んで、リンクリストはその後一気に作る。
くらいか。

158 :ジョル.ビブズ(偽者):2001/07/23(月) 01:30
154の続き
で、思いついたのは巨大なファイルの一部だけをメモリに乗せておいて
メモリの範囲外を参照されたときにファイルを読み直しするように
すればOKか?と思ったのですがテキストエディタを作った事のある
方にお聞きしたいんですが「考え方」として合っていますか?

159 :デフォルトの名無しさん:2001/07/23(月) 01:32
>>158
UNIX系なら何も考えないとそうなってるんだが.

160 :ジョル.ビブズ(偽者):2001/07/23(月) 01:42
>>159
あっそうか!
そうですよね!うーん自分であれこれ考えるより
素直に仮想記憶にお任せするしかないのかなあ?

161 :デフォルトの名無しさん:2001/07/23(月) 01:49
>>159
大きいってどのくらいのファイル?
ただ単にプログラムがしょぼくて処理が遅くなってるだけでは?

162 :デフォルトの名無しさん:2001/07/23(月) 02:14
>>161
極端っていうわけだから実メモリの数百倍以上じゃないか?

163 : :2001/07/23(月) 02:19
>>160
そうやって諦めちゃうから、メモリばっかり食う
アプリが出来ちゃうんだよね。

mallocは、システムコールと言えども、結構時間かかるから
頻繁に行うのばダメです。

行の先頭のファイル位置だけを、メモリブロックに保存。
編集した行だけをメモリブロックに、もしそれが足りないなら
一時ファイルに書き出しておく・・
最後に保存するときに、全ての順番を整えます・・

164 :デフォルトの名無しさん:2001/07/23(月) 02:33
おいおい malloc はシステムコールじゃないぜよ。
ブレークアドレスとかって知らんか?

165 :デフォルトの名無しさん:2001/07/23(月) 04:38
C++は、もう破滅寸前。
ここらでSTLに挫折した、全体の95%相当のプログラマが
不買運動を起こし、消滅します。

ありがとうC言語!そしてC++さようなら!(^_^)また会えるといいね!

http://piza.2ch.net/test/read.cgi?bbs=tech&key=995820118&ls=100

166 :デフォルトの名無しさん:2001/07/23(月) 06:38
>>165
板違いだが反応してやろう。
STLが分からなければ、自分で同様な動作をする
クラステンプレートを設計してみな。listあたりが楽、
一通り出来たらSTLと動作を比較して、違いをソース
レベルで検証する。さすればSTLに対する理解がドーン
と深まる。

167 :デフォルトの名無しさん:2001/07/23(月) 12:39
多体問題とかの物理の微分方程式を近似計算で数値的に解いてるんだけど
グラフィカルにみてみたい。コンソールでの知識しかないから、VCコンパ
イラのVisualな部分に頼れない。DOS窓で何とかならないものか?

168 :デフォルトの名無しさん:2001/07/23(月) 13:19
VCならDialogベースで直接落書きしてみたら?
mainからのプログラムでないとわからん、つうのならJavaが楽なんだけど

169 :デフォルトの名無しさん:2001/07/23(月) 13:23
ある変数のん番目のビットが0か1かを判断するマクロを作って
ください。自分ではよくわからないのでお願いします。
自分でやれなどのレスはご遠慮します。宿題は自分でやれってのも
ご遠慮ください。まともな返答以外はレスはいりません。

170 :デフォルトの名無しさん:2001/07/23(月) 13:29
あ & (1 << ん)

171 :デフォルトの名無しさん:2001/07/23(月) 13:32
>>169
「宿題は自分でやれ」以上にまともな返答はこの板にはないYO!(藁

172 :デフォルトの名無しさん:2001/07/23(月) 13:40
弊社のソフトウェアを買って下さい。自分はよくわかりませんがお願いします。
説明をしろなどの返事はご遠慮します。営業なんだから営業やれってのもご遠慮ください。
色よい返答以外はいりません。

こんな営業が来たら蹴り返します。

173 :デフォルトの名無しさん:2001/07/23(月) 13:57
>>172
つーかそんなやつ生かして返さないYO!

174 :デフォルトの名無しさん:2001/07/23(月) 14:51
科学計算のプログラムについて書かれてる本などはないでしょうか。

175 : :2001/07/23(月) 15:12
>>174
Numerical Recipes

176 :デフォルトの名無しさん:2001/07/23(月) 15:31
ジョブスよぉ
オナーニは一日に何回するんだ?

177 :ジョブス:2001/07/23(月) 16:01
>>176
5回だ。

178 :デフォルトの名無しさん:2001/07/23(月) 18:12
3次の2次方程式を解くプログラムってどう作ればいいんですか?

179 :デフォルトの名無しさん:2001/07/23(月) 19:26
何次だよっ!

180 :デフォルトの名無しさん:2001/07/23(月) 20:16
>>178
aX^3+bX^2+cX+d=0
を解くプログラムで
a=0の時の場合訳を考えろよ。
普通なら2次方程式の解を解くプログラムに振り分けるわな。

181 :174:2001/07/23(月) 20:55
Numerical Recipes ってどんなことが書いてあるんですか?
アマゾンとかあんまり内容が書いてなくて買うのが不安なんですが。
学校の図書館にも置いてなかったし。

182 :176:2001/07/23(月) 21:45
FreeBSD98からGCC使ってコンパイルしたいんだけど
具体的にどうやってやるか方法を掲載して在る所教えて。

183 :デフォルトの名無しさん:2001/07/23(月) 23:22
>>177
少ないな.

184 :ビル・ジョブス:2001/07/23(月) 23:58
よーゴミ野郎はとっととこのスレから出て行きな!
2ch出禁だな!ターコ!
でも仮想記憶のコードはお前らンコ以下のガキ
にはレベルが合わないよな。オレが悪かったよ。
さーて、そんな方程式簡単に解けるだろ!
マスマティカとか使えよ。

185 :デフォルトの名無しさん:2001/07/24(火) 00:27
>>1 がホントならCで答えてやれよ.

186 :デフォルトの名無しさん:2001/07/24(火) 00:28
どーせ使えねんだろ、マスしかかいたことねーくせに.

187 :175:2001/07/24(火) 00:58
>>181
http://www.nr.com/
http://www.ulib.org/webRoot/Books/Numerical_Recipes/bookcpdf.html
とか見れば大体内容がわかるかも.
ちなみに原書と日本語訳では内容が若干異なるので注意.
概ね以下の構成でいろんな分野のアルゴリズムを解説してある.
1.アルゴリズム解説
2.ソースリスト提示
3.参考文献
図書館に買ってもらえば?

188 :  :2001/07/24(火) 02:30
enum って必要なのか?

俺的には理解不能だし、いらない。

189 :デフォルトの名無しさん:2001/07/24(火) 02:36
>>188
あればあったで便利な機能だよ。
いちいち定数に自分で数字を振りたくないときとか。

190 :デフォルトの名無しさん:2001/07/24(火) 02:42
>>188
C-FAQ的話題だけど、
シンボルの列挙は記述が楽。デバッガでシンボル名が見える。
列挙使わないとすると、
#define hage 0
#define mage 1
#define sage 2
とか書いていくの?
これでhageを1に変更したい場合とか、
全部書き換えなきゃならないじゃん。
(perlやsedとかで自動生成する、みたいな反論は無しにしてね。)

191 :デフォルトの名無しさん:2001/07/24(火) 02:45
それに列挙体ならまとめて書けるし。
enum {hage, mage, sage};

192 :デフォルトの名無しさん:2001/07/24(火) 02:57
それこそ#defineと同じで
「無くても書けるがあった方が便利」
なシロモノだろ<列挙体

193 :デフォルトの名無しさん:2001/07/24(火) 02:58
なにがいいたいのかよくわからん>192

194 :デフォルトの名無しさん:2001/07/24(火) 03:25
enumはdefineと違ってローカルスコープをもてるからいいね。
C++ならばこれが重要になってくる。

195 :デフォルトの名無しさん:2001/07/24(火) 03:46
>>194
同意。

加えて enum だと switch - case に漏れが無いかを、コンパイラや lint で
チェックできるのも便利かな。

196 :デフォルトの名無しさん:2001/07/24(火) 11:50
>>188
実社会でホザく前にここでお勉強できてよかったね・・・

197 :デフォルトの名無しさん:2001/07/24(火) 16:01
Visual C++でMFC使ってるんだけど、CBrushクラスで四角とか円とか描画すると
黒い境界が出るのはなんとかならないかな?あと、中身を塗りつぶさない方法も
わからない!四角形だったらCPenクラス使って線引くだけでいいんだけど、円は
かなり厳しい!まさか円の方程式使って一点一点描画するわけにもいかないし。

198 :デフォルトの名無しさん:2001/07/27(金) 00:24
BSTRをcharに変換する方法を教えてください

199 :デフォルトの名無しさん:2001/07/27(金) 10:59
>>198
WideCharToMultiByteあたりで変換すればよし

200 :デフォルトの名無しさん:2001/07/27(金) 11:29
>>199
うそでしょ?

201 :デフォルトの名無しさん:2001/07/27(金) 11:50
C言語の8進数表記が許せないです。
やつは危険すぎます。
いくらジョブズでも、いまさら8進数表記を
無くす訳にはいかなでしょうから、
せめて、なぜ、2進数表記すらないC言語で、
8進数が、しかもあんな危険な表記方法で
実装されているのか、理由を教えてください。
納得の行く理由があるのなら
多少は腹の虫も治まるかも知れないので。

202 :デフォルトの名無しさん:2001/07/27(金) 12:01
言語は悪くない、知らなかったやつが悪い

203 :デフォルトの名無しさん:2001/07/27(金) 12:27
>>201
8進数使わなきゃイーだろ。

204 :デフォルトの名無しさん:2001/07/27(金) 12:48
つい0でパディングしてしまいます。

205 :shige:2001/07/27(金) 12:55

              / /    /                 |
             /  /  /   / /                 |
             |  |  |   / /  / フ              |
              |  |  | | | /   τ              |
              |  | | | | |/_ ─-  τ            |
    |           | | | | イ (。@)ヽ   ノ  /⌒ヽ       ∠___
   || |             | |ノ| x ー─    ノ  //^) |        ∠___
  | | |             |ノ |  X    _(   /__ノ__ノ         ∠_____
  | | |             (|    X    |
  | | |             ヽ    X   |
  | | |              冫ーヽ  X |
  | | |              冫     x|
   )| |          /⌒ ─────-
  |  |        /
  |  |      /⌒  モグリの私がこんなことを言うのも何だがね、アセンブラの知識をひけらかし、
  |  | __/⌒    厨房に信仰され悦に入っているジジイと、VBで糞ツールをつくってばらまく厨房なんざ
            私たちRubyユーザから見ればどちらも同じ様な物だがね
            まあ助かりたいと言うなら一千万頂きますよ、それで助かるんだ安いもんでしょう?
            企業の一千万なんて軽いもんでしょう、だが君らには二千万払ってもらうがね

206 :デフォルトの名無しさん:2001/07/27(金) 16:58
char* ReturnMoji()
{
    char szMoji[256] = "Hello,world!";
    return szMoji;
}

はエラーにってしまいますがアドレスszMojiを返したい場合にはどうすればいいのでしょうか。
やりたい事は解って頂けると思いますが・・・・

207 :206:2001/07/27(金) 16:59
×はエラーにってしまいますが
○はエラーになってしまいますが

208 :デフォルトの名無しさん:2001/07/27(金) 17:22
>>207
ローカル変数へのポインタを返してはいけない。

209 :デフォルトの名無しさん:2001/07/27(金) 17:23
const char* ReturnMoji()
{
return "Hello,world!";
}

210 :デフォルトの名無しさん:2001/07/27(金) 17:37
>>209
そんなことしても、なんも面白くないと思うが
せめて
const char* ReturnMoji(){
const static char* szMoji = "Hello,world!";
return szMoji;
}

211 :206:2001/07/27(金) 17:59
なるほど、constですか。
グローバル変数を使うところでした。
ありがとうございました。

212 :デフォルトの名無しさん:2001/07/27(金) 18:09
constじゃなくてstaticに注目されたし。
その前に210より209に注目されたし。

213 :デフォルトの名無しさん:2001/07/27(金) 18:37
ていうか>>209-210は煽り。

214 :デフォルトの名無しさん:2001/07/27(金) 18:39
>>208
ローカルでもstaticならokだろ、ゴルァ.

215 :デフォルトの名無しさん:2001/07/27(金) 21:03
>>210
>const static char* szMoji = "Hello,world!";
staticにする意味無し

static const char szMoji[] = "Hello,world!";
なら意味もあるが

216 :デフォルトの名無しさん:2001/07/27(金) 21:20
>>215
一からやり直した方がいいと思われ.

217 :デフォルトの名無しさん:2001/07/27(金) 22:11
>>216
なぜに??

218 :デフォルトの名無しさん:2001/07/27(金) 23:09
209や215はなんも間違ってないだろ。
やり直したほうがいいのは210=212。

209のようなコード書いて、コードをレビューする人間に
つっこまれたことは俺もある。

219 :デフォルトの名無しさん:2001/07/27(金) 23:13
210と212は別人だね…。大変失礼。
逝ってきます。。

220 :shige:2001/07/27(金) 23:28
馬鹿が..............いる。

221 :デフォルトの名無しさん:2001/07/27(金) 23:45
>>220
なぜに??

222 :ジョル.ビブズ(偽者):2001/07/27(金) 23:57
ほんもののビル.ジョブズ氏はもうこないんですか?
ファンだったのにぃ(めそめそ)

223 :無能な姦理人@Shiri-Q:2001/07/28(土) 00:11
□□□□■□□□□□■□□□□□□□□□□□□□□□□□□□□□
□□□■■□□□□□■□□□□□□□■■■■■■■■■■■■□□
□□■■□□□□□■■■■■■□□□□□□□□□□□□□■■□□
□■■□□■□□□■□□□□■□□□□□□□□□□□□■■□□□
□□■□■■□□■■■□□■■□□□□□□□□□□□■■□□□□
□□□■■□□■■□■■■■□□□□□□□□□□□■■□□□□□
□□■■□□□□□□□■■□□□□□□□□□□□■■□□□□□□
□□■□□□■□□□■■■■□□□□□□□□□□■□□□□□□□
□■■■■■■□□■■□□■■□□□□□□□□□■□□□□□□□
□□□□■□□□■■□□□□■■□□□□□□□□■□□□□□□□
□□■□■□■□□□□■■□□□□□□□□□□□■□□□□□□□
□□■□■□■□□□□□■■□□□□□□□□□□■□□□□□□□
□■■□■□■□□□□□□□□□□□□□□□□□■□□□□□□□
□■□□■□□□□■■■□□□□□□□□□□□□■□□□□□□□
□□□□■□□□□□□■■■□□□□□□□□□□■□□□□□□□
□□□□■□□□□□□□□■■□□□□□□■■■■□□□□□□□





続きはコチラです
http://www.geocities.com/entry_k/main/main01.html

224 :デフォルトの名無しさん:2001/07/28(土) 01:09
const static char* szMoji = "Hello,world!"

static const char szMoji[] = "Hello,world!";
の違いってなんですか?

前者は「静的なポインタ変数」が変更不可能
後者は「変更不可能な文字配列=文字列リテラル」が静的
であってます?

225 :デフォルトの名無しさん:2001/07/28(土) 01:21
前者は"Hello,world!"のアドレスを、
わざわざ静的なポインタにいれて値を返しているから無意味
ポインタにstaticが無くても"Hello,world!"が静的に確保されるので
一時的なポインタで良いものにstaticを付ける必要はない

226 :デフォルトの名無しさん:2001/07/28(土) 01:28
>>225
なるほど、納得
Cのコードが読めていないのかと思った。ロジックでしたか。

227 :デフォルトの名無しさん:2001/07/28(土) 01:30
別人だけど225を補足すると、
結論として、 >>206 のような「用途」には、 >>209 の方法がよいということね。

>アドレスszMojiを返したい場合にはどうすればいいのでしょうか
こういう、アドレスを〜 という書き方をしているせいで、static
云々の話になってしまったのかもしれないね。

228 :デフォルトの名無しさん:2001/07/28(土) 01:38
>>199
198 ありがとうございました

229 :デフォルトの名無しさん:2001/07/28(土) 03:13
>>222
来てもいいけど、今度は論理で勝負して欲しいもんだな。
定量評価せい、といわれても無視する上、匿名版でプライベート
自慢する寒さに気付かないようでは、単なるスレ上の障害物だ。

230 :デフォルトの名無しさん:2001/07/29(日) 13:30
C言語とは直接関係無いかもしれませんが……。

fputs を無限ループ内に記述し実行した場合、最終的にどうなってしまうのですか?
(実行環境は Windows98のDOS窓とした場合)

1.「ディスクがいっぱいです〜」と Windows からメッセージが出る。
2.ブルースクリーンになる。
3.ブルースクリーンにならずハングアップする。
4.プログラムは異常終了するが、Windows には影響なし。
5.その他。

経験された事のある方いましたら教えて下さい。


先日、setjmp と longjmp の勉強をしていて、似たような状況になりました。
setjmp のある関数がリターンした後、longjmp をすると暴走する、とあったので、
ためしにやってみたのです。
longjmp の記述がある関数が無限ループになったらしく、そこに printf があって、
それをファイルにリダイレクトさせて実行していました。
ハードディスクがカリカリと音を立てて止まりません。ヤバイと思いDOS窓を強制終了させました。
で、300MBのテキストファイルが出来上がりました(笑)。

231 :デフォルトの名無しさん:2001/07/29(日) 14:10
>>230
自分で試せ、ぼけっ。

232 :デフォルトの名無しさん:2001/07/29(日) 16:38
平方根を高速に求める方法ってありますか?
あと立方根とかも?

233 :デフォルトの名無しさん:2001/07/29(日) 16:59
extern float x, y;
y = sqrtf(x);
y = powf(x, 1/3.0f);

234 :デフォルトの名無しさん:2001/07/29(日) 17:02
>>233
なぜにextern?

235 :デフォルトの名無しさん:2001/07/29(日) 17:15
値が不定になるから.

236 :デフォルトの名無しさん:2001/07/29(日) 21:17
powf()より速い実装どっかにありませんか?

237 :デフォルトの名無しさん:2001/07/29(日) 21:44
powf()の実装って決まってるのですか?

238 :デフォルトの名無しさん:2001/07/29(日) 22:09
powf()はMSよりボーランドが速いね。

239 :デフォルトの名無しさん:2001/07/29(日) 22:34
>>238
本当?

240 :デフォルトの名無しさん:2001/07/30(月) 02:26
フツー仕様は決まっても実装が決まっているものなんてないぞ。

241 :デフォルトの名無しさん:2001/07/30(月) 02:32
>>240
そうは言っても、公開されているCの標準ライブラリの実装はほとんど
アルゴリズム集って言ってもいいくらい実装が同じだよね。

242 :デフォルトの名無しさん:2001/07/30(月) 02:40
ちなみに、P.J.Plaugerの"The Standard C Library"は、
その名のとおり、C Standard Library内部の実装の解説本で、
K&Rと同じくらい有名な本。
読んでない人は読むべし本。

243 :デフォルトの名無しさん:2001/07/30(月) 03:34
>>241
そりゃ元が同じだからじゃねーのか?
別に実装方法が決まってるわけじゃない。ま、的外れなだけで言いたいことは分かるが。

244 :ななし:2001/07/30(月) 06:50
atoiってなんですか?

245 :デフォルトの名無しさん:2001/07/30(月) 08:24
>244
A と I です。
引数を渡すと A と I の文字コードを足した数が返されます。

つーかネタであげんなや。まじで。

246 :デフォルトの名無しさん:2001/07/30(月) 09:46
>>236
コプロに値を送るだけなので高速化しようがない
四則演算一回やるのと同じで、
値が決め打ちでもない限りアルゴリズムもへったくれもない

247 :>>244:2001/07/30(月) 11:09
Ascii TO Integerさ。数字を数値に変換するのさ。

248 :デフォルトの名無しさん:2001/07/30(月) 11:12
>>246
コプロってフツーpowは持ってなくない?

249 :デフォルトの名無しさん:2001/07/30(月) 11:49
つか atoi みて思ったんだけど、
なんで itoa ってあるんだろ?
使うやつなんているの?

現役の人に聞きたいです。

250 :デフォルトの名無しさん:2001/07/30(月) 12:01
>>249sprintfよりitoaのが短いから(藁

251 :デフォルトの名無しさん:2001/07/30(月) 12:08
>>240
元が同じだからじゃない。
Cの標準ライブラリはアルゴリズムとして定着しているからだよ。

252 :251:2001/07/30(月) 12:10
>>243 だった。

253 :デフォルトの名無しさん:2001/07/30(月) 12:31
>>249 ベンダの独自関数だろ C99にはあるのか?
ANSI X3.159-1989 のCには少なくともそんな関数ないぞ?

254 :デフォルトの名無しさん:2001/07/30(月) 12:31
えっと、他スレでも一度質問したんですが、
調べても結局わからなかったので・・・

ある、インタプリタ(後でコンパイラにする予定)を作っているんですが、
その言語にDLLをロードする関数をいれたいんです。

それで、その関数を使うために、
そのDLLの関数の引数、返される値の型情報を
動的に取り出すにはどうしたらいいんでしょう?

どなたかわかる方いらっしゃいましたら、
どうかご教授おねがいします。m( _ _ )m

255 :デフォルトの名無しさん:2001/07/30(月) 12:37
>>254
無理です。普通の DLL にはそもそもその情報が含まれていません。

256 :249:2001/07/30(月) 12:38
>250

なるほど(w

>253

なんだ、ANSIで定義されてなかったのか・・
atoiあるからてっきり。

おれが使ってんのはVC。
調べたらBCCもあった。

でもどちらにしろ意味ないね(w

257 :254:2001/07/30(月) 12:44
>255

ということは一つのDLLごとに
そのDLLのための構造体などを処理系側で
用意しないといけないということですか?・・・

258 :デフォルトの名無しさん:2001/07/30(月) 12:55
atokってなんですか?

259 :デフォルトの名無しさん:2001/07/30(月) 13:13
>>257 DLLとかヘッダファイルを一緒に流通させるとか。
COMにすれば?

260 :デフォルトの名無しさん:2001/07/30(月) 13:14
>>258 そうか!
atokの名前の意味に始めて気がついたよ

261 :254:2001/07/30(月) 13:21
>259
えっと、COMがよくわからないんですが、
DLLってCOMが必ず含まれているんですか?
(なんか表現変ですね・・・)

262 :デフォルトの名無しさん:2001/07/30(月) 13:29
>>260
阿波・徳島の略です。

263 :デフォルトの名無しさん:2001/07/30(月) 13:44
じゃあ呼び名は「エー・トゥ・ケー」でいいんか?
昔「あとく」か「あとき」とかで口論した覚えがある(藁

264 :デフォルトの名無しさん:2001/07/30(月) 13:46
そういや「えいとく」ってのもあったな。
Cと関係なくてスマソ

265 :デフォルトの名無しさん:2001/07/30(月) 14:28
>>263-264
あの〜、>>262はマジレスなんですが…

266 :デフォルトの名無しさん:2001/07/30(月) 14:39
>>265
Ascii To 漢字 じゃないの?
マジレスと言いつつネタだったらすまんが

267 :デフォルトの名無しさん:2001/07/30(月) 14:56
現在ではAdvanced Technology of Kana-kanji transgferてなアナグラムが
公式だけど、これは後付。元はAscii to Kanaと阿波徳島のダブルミーニング。

268 :デフォルトの名無しさん:2001/07/30(月) 15:49
浮動小数点と固定小数点ってなにが違うんですか?精度とかも違うんでしょうか?

269 :デフォルトの名無しさん:2001/07/30(月) 18:35
#include <stdio.h>

int main(void)
{
printf("Hello World!\n");
return 0;
}
を実行したら・・・・
-------------------構成: ConHell - Win32 Debug--------------------
コンパイル中...
コマンド ラインのエラー D2016 : コマンド ライン オプション '/ZI' と '/O1' は同時に指定できません
cl.exe の実行エラー
ブラウザ データベースを作成中...

ConHell.exe - エラー 1、警告 0
が出て,実行でません! プロジェクトの設定を変えたりしているのですが、
よく分かりません。解決方法教えてください。 お願いします。

270 :デフォルトの名無しさん:2001/07/30(月) 18:37
>>269
コンソールアプリケーションで作ったか?

271 :あああ:2001/07/30(月) 18:56
C言語の関数(ソース付き)を集めたサイトってあります?
無かったら作ろうと思うんだけどどう思う?

272 :デフォルトの名無しさん:2001/07/30(月) 19:00
>271
フリーで商用利用もおっけーな事を保証してくれるなら作ってくれ

273 :デフォルトの名無しさん:2001/07/30(月) 19:19
フリーと謳いつつ他人のソースのパクリがあったりすると厄介だな

274 :デフォルトの名無しさん:2001/07/30(月) 19:35
>>270
コンソールアプリケーションでつくりました。
1.新規作成のプロジェクトでWin32ConsoleApplicationを選択。
2.空のプロジェクトでリターン。
3.新規作成でC++ソースファイルにて、フェイル名を入力して。
です。
 なにか、問題があるのですか? それとも、設定方法とか、よろしくお願いします。

275 :デフォルトの名無しさん:2001/07/30(月) 19:59
>>269
何故エラーメッセージもヘルプも読まない?

>-------------------構成: ConHell - Win32 Debug--------------------
>コマンド ラインのエラー D2016 : コマンド ライン オプション '/ZI' と '/O1' は同時に指定できません

debugビルドなのに最適化オプションが指定されてるように見えるが。

276 :あああ:2001/07/30(月) 20:12
法律的に難しかったりするんすか?
流石に会社のライブラリを公開しようとは思わないけどさ。
ニーズはあるでしょ?

277 :デフォルトの名無しさん:2001/07/30(月) 20:51
>>271
ここに作ってくれよ。いいものならみんな協力してくれるぞ。

278 :デフォルトの名無しさん:2001/07/30(月) 23:10
>>275
F1でエラーメッセージをみたんだけど・・・・
で、最適化オプションを無効とかにすると、下記のエラーメッセージがでるんです。
なにか、インストール時にしくじったのでしょうか? 「・・・・DLLは現在使用されています」とかいうので、無視してインストールしちゃったんですけど!
--------------------構成: ConHell - Win32 Debug--------------------
コンパイル中...
ConHello.cpp
リンク中...
LIBCD.lib(wincrt0.obj) : error LNK2001: 外部シンボル "_WinMain@16" は未解決です
Debug/ConHell.exe : fatal error LNK1120: 外部参照 1 が未解決です。
link.exe の実行エラー

ConHell.exe - エラー 2、警告 0

お願いします。

279 :なんでやねん:2001/07/30(月) 23:15
>>278
>外部シンボル "_WinMain@16" は未解決です

ってコンソールアプリじゃないやん!

280 :1:2001/07/30(月) 23:19
>>279
本当に。笑えた。

281 :デフォルトの名無しさん:2001/07/30(月) 23:19
>>278
"Win32"Consoleにしたからじゃない?
ソースを"MSDEVで開く"で開いて、そのままコンパイルしてみ。

282 :デフォルトの名無しさん:2001/07/31(火) 00:24
>>270さん、275さん、279さん、281さん他のみなさま、大変ご迷惑をおかけしまして
申し訳ありませんでした・・・・m(__)m
まじめに、"Win32"Console”でソースプログラムを作っておりました・・・・
全て、解決しました!
先ほど,VC++あんしん入門とC++デバック技術の本(計6699円)を購入してまいりました。
こんごは、上記なような、おろかな質問をしないよう、精進してまいりたいとおもいます。
今後とも、宜しくお願い申し上げます。 Mr.℃氏ロート

283 :デフォルトの名無しさん:2001/07/31(火) 00:28
というか、その程度の物、コマンドラインでコンパイルすりゃいいじゃん。

284 :デフォルトの名無しさん:2001/07/31(火) 00:53
いやだー、夏厨多すぎるー!

285 :デフォルトの名無しさん:2001/07/31(火) 22:51
age

286 :デフォルトの名無しさん:2001/07/31(火) 23:55
自作のルーチンなのに企業ベースにちょっと似てるから
告訴なんてされると嫌だな。

287 :デフォルトの名無しさん:2001/08/01(水) 00:59
void lreplace(
char *cp1, /*調べられる文字列*/
char *cp2, /*置き換えられる文字列*/
char *cp3, /*置き換える文字列*/
char *cp4) /*結果を格納する領域*/
{
long n=strlen(cp1);
long m=strlen(cp2);

for(; n>=m; n--,*cp4++=*cp1++) {
if(memcmp(cp1,cp2,m)==0) {
strcpy(cp3,cp4);
strcpy(cp4+strlen(cp3),cp3+m);
}
}
}
どこがまずい?

288 :デフォルトの名無しさん:2001/08/01(水) 01:10
>>287
ぱっと見た限りだと *cp4++=*cp1++ の場所がまずそう

289 :デフォルトの名無しさん:2001/08/01(水) 01:30
strcpy(cp3,cp4);
strcpy(cp4+strlen(cp3),cp3+m);
何がしたいのか説明してくれ(;´Д`)

290 :デフォルトの名無しさん:2001/08/01(水) 01:36
いや、やりたいことすら推理させ、かつ間違いを探す・・・
こういうゲームは大好きだな。

291 :デフォルトの名無しさん:2001/08/01(水) 01:48
>>287
Cだとこういう無国籍かつ意味不明なコード
良く見るからやだね〜ったら、やだね〜

292 :デフォルトの名無しさん:2001/08/01(水) 01:54
このくらいのレベルだとフローチャート書けってのもわかるなぁ

293 :デフォルトの名無しさん:2001/08/01(水) 02:00
>>291
perlよりマシだけど…

294 :デフォルトの名無しさん:2001/08/01(水) 05:07
>>287
コメント等から予想できるコードと、実際のコード違いが、
あまりにも大き過ぎるので、何をやりたいか、全く把握できません。
取り敢えず、与える文字列(cp1,cp2,cp3)と、それに応じて、
変化する文字列(cp3,cp4)の結果の例をいくつか上げて下さい。

295 :こうか?:2001/08/01(水) 08:24
for(; n>=m; n--,*cp4++=*cp1++) {
 if(memcmp(cp1,cp2,m)==0) {
  strcpy(cp4,cp3);
  cp1 += m; /*strlen(cp2);*/
  cp4 += strlen(cp3);
 }
}

296 :2chの夏、厨房の夏:2001/08/01(水) 13:06
288の言うとおり
*cp4++=*cp1++ はヤバイ
ttp://www.catnet.ne.jp/kouno/c_faq/c3.html#0
を熟読せよ。
コンパイラを信じて可読性のあるコードにしたほうが
デバッグが楽。
*cp4++=*cp1++ は分けて表示したほうが吉。

297 :デフォルトの名無しさん:2001/08/01(水) 15:13
>>296
C FAQよんだけど「*cp4++=*cp1++ はヤバイ」の理由がわかりません。
解説お願いします。

298 :デフォルトの名無しさん:2001/08/01(水) 15:17
>>296
なにか勘違いしてると思われ。

299 :デフォルトの名無しさん:2001/08/01(水) 15:17
>>297
逆に質問
なぜヤバくないと思うのかを教えて

300 :デフォルトの名無しさん:2001/08/01(水) 15:24
>>299
>>296 のページに「*a++=*b++」って書き方がまずいって書いてあるんでしょ?
でも、自分はどこにそれが書いてあるのかわかりません。
どこが該当個所か教えてください。

301 :デフォルトの名無しさん:2001/08/01(水) 15:25
>>299
演算順序気にしてるんだろ
つーか、それよりもそんなところにあってあふれねーか?
って方が気になるがな。

302 :デフォルトの名無しさん:2001/08/01(水) 15:30
「*cp4++=*cp1++」に演算子の評価順序は関係ないっしょ。
>>296 は知ったかしてるだけ。

303 :デフォルトの名無しさん:2001/08/01(水) 16:01
じゃあこのコードってマズイの?
char *strcpy(char s1, const s2)
{
  while( *s1++ = *s2++)
    ;
  return s2;
}

304 :デフォルトの名無しさん:2001/08/01(水) 16:03
>>303
間違えた
> char *strcpy(char s1, const s2)
char *strcpy(char *s1, const char *s2)

305 :煽りのようだがマジレス:2001/08/01(水) 16:07
>>300
つーかコードの文字列そのものが資料に見当たらないってだけで
思考が止まってしまう野郎にプログラミングの資格なし。
つーか人工、自然言語問わず語学全般絶対無理。
おとなしくドカチンかライン工でもしてるのが吉。

306 :デフォルトの名無しさん:2001/08/01(水) 16:18
>>305
ドカチンでもいいから、どこが該当個所か教えてよ。ねえ?

307 :デフォルトの名無しさん:2001/08/01(水) 16:26
>>306
だーかーらー、a++=b++なんて書き方すると
処理の順序が直感的にわかりにくいだろ?
そんなバグの温床になるような書き方するなつってんだよ!ヴォケ!

308 :デフォルトの名無しさん:2001/08/01(水) 16:37
>>307
結局、思わせぶりに持ち出したC FAQは、なんの関係も無かった
わけね。トホホ

309 :デフォルトの名無しさん:2001/08/01(水) 16:41
>>307
そりゃあんたがバカなだけだ。

310 :デフォルトの名無しさん:2001/08/01(水) 16:44
>>307
結局わかりにくいってだけなの?
問題ないんだよね?

311 :デフォルトの名無しさん:2001/08/01(水) 16:46
*a++ = *b++; ← これ。
好き嫌いはあるだろうけど、Cだとイデオムだと思う。
こういう書き方をヘタってのは言い過ぎだと思うよ。

312 :デフォルトの名無しさん:2001/08/01(水) 16:49
じゃ結論は、>>296 がバカってことで。

313 :デフォルトの名無しさん:2001/08/01(水) 17:10
(゚д゚)ハァ?>>309
わかり易い=技術が低いとか思ってないか?
人をバカ呼ばわりするヒマあったらてめぇのソースに
コメントでも付けてろ、この腐れ厨房が。逝ってよし!

314 :デフォルトの名無しさん:2001/08/01(水) 17:12
>>313
ほっときゃいーじゃん。これ以上いじめてもかわいそうだよ。

315 :307=313:2001/08/01(水) 17:13
ここでも読んで少しは勉強しろよ。ドキュソ厨房が(怒
http://www.pro.or.jp/~fuji/mybooks/cdiag/index.html#appendix

316 :ソープ:2001/08/01(水) 17:25
高いね。

317 :デフォルトの名無しさん:2001/08/01(水) 17:30
>>315
で、そこのリンク先には「わかりやすいプログラムを書こう」とは言っているが
「*a++ = *b++;はわかりにくい」とは言っていないね。

*a++ = *b++;はCでは慣用句であり、無理に書く必要はないが、
知っといた方がいい。

318 :デフォルトの名無しさん:2001/08/01(水) 17:47
ちなみにMSのCRTのソースより
memcpy
while (count--) {
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
これはvoid *で受けてるからか

strcpy
while( *cp++ = *src++ )
;
でした

319 :デフォルトの名無しさん:2001/08/01(水) 18:10
わからない ってのと、わかるけどやらない ってのは
別物だぜ、>>307

320 :デフォルトの名無しさん:2001/08/01(水) 23:22
C99フルサポートした処理系って未だでないの?

321 :デフォルトの名無しさん:2001/08/01(水) 23:47
>>320
ないよ。

322 :デフォルトの名無しさん:2001/08/02(木) 01:00
http://www.ucatv.ne.jp/~spitznao/itimatu.htm

323 :デフォルトの名無しさん:2001/08/02(木) 01:10
↑クリック無用

324 :デフォルトの名無しさん:2001/08/02(木) 02:28
今日はバカが一人紛れ込んでるのでクリックには注意して下さい。

325 :デフォルトの名無しさん:2001/08/02(木) 02:42
>>295
試してないからミスってるかもしれんが、こんなところだろう。
void lreplace ( char *cp1, char *cp2, char *cp3, char *cp4 ) {
 size_t l, m, n ;
 n = strlen ( cp1 ) + 1 ;
 m = strlen ( cp2 ) ;
 l = strlen ( cp3 ) ;
 if ( m ) {
  for ( ; n > m ; n--, *cp4++ = *cp1++ ) {
   if ( memcmp ( cp1, cp2, m ) == 0 ) {
    memcpy ( cp4, cp3, l ) ;
    n -= m ;
    cp1 += m ;
    cp4 += l ; } } }
 memcpy ( cp4, cp1, n ) ; }

326 :デフォルトの名無しさん:2001/08/02(木) 04:54
#include<stdio.h>
main()
{
int a[3], s[3], i;
int *pa, *ps;

pa = a;
ps = s;

for(i = 0;i < 3;i++,pa++,ps++){
*(pa + i) = (i + 1) * 10;
*ps = *pa;
printf("%d,", *ps);
}
printf("%d", *ps);
}

こんなプログラムを作りました。
最後のprintfは配列の大きさを超えているのでおかしなプログラムと
いうところまではいいのですが、これを実行すると
10、20、30、10と出てきます。
ポインタに代入する値をいろいろ変えてみたのですが、
必ず配列の最初と同じ値が出ます。
ただの偶然ですか?

327 :326:2001/08/02(木) 04:55
スマソ。
×*(pa + i) = (i + 1) * 10;
○*pa = (i + 1) * 10;
です。

328 :デフォルトの名無しさん:2001/08/02(木) 06:18
a[3]とs[3]がスタック上にどう取られてるかによる
s[0],s[1],s[2],a[0],a[1],a[2]
になってるとすると最後の*ps=s[3]はa[0]の所を指してるだけ

329 :デフォルトの名無しさん:2001/08/02(木) 06:25
>>325
偶然と言えば偶然だし、必然と言えば必然。
なんでそうなるのか知りたければ、
printf ( "\n%d %d %d %d\n", a, s, pa, ps ) ;
の1行を最後に追加すれば、その理由が見えてきます。

330 :学生:2001/08/02(木) 15:27
editに文字列吐かせたら\nじゃ改行しなかった。
調べたら\r\nだそうで・・・。Windowsだからこうなるんですよね?

331 :デフォルトの名無しさん:2001/08/02(木) 17:32
個人的にウケたのでここで紹介age
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=996739281&st=6&to=6&nofirst=true

332 :デフォルトの名無しさん:2001/08/02(木) 17:37
>>330
APIスレの方がいいのでは?
Winだからそうなるんですけど。

333 :デフォルトの名無しさん:2001/08/02(木) 18:55
>>287
こういうことをしたかったのか?
void lreplace(
 const char *cp1, /*調べられる文字列*/
 const char *cp2, /*検索する文字列*/
 const char *cp3, /*置換する文字列*/
 char *cp4) /*結果を格納する領域*/
{
 long n=strlen(cp1);
 long m=strlen(cp2);
 long l=strlen(cp3);

 while( n>=m ) {
  if(memcmp(cp1,cp2,m)==0) {
   memcpy(cp4,cp3,l);
   cp4+=l;
   cp1+=m;
   n-=m;
  } else {
   *cp4++=*cp1++;
   n--;
  }
 }
}

334 :デフォルトの名無しさん:2001/08/02(木) 20:45
ハミング距離を求めるコードを書いているのですが
うまい具合に記述することが出来ません。
どなたか綺麗に記述した例を示してくれませんか?

335 :334:2001/08/02(木) 21:41
自己解決しました。

336 :デフォルトの名無しさん:2001/08/02(木) 23:46
>>333
駄目じゃん。

337 :学生:2001/08/03(金) 08:12
>>332
やっぱりWinだからですか。ありがとー。

ちなみに、ジョブスは何て答えるか興味があって
あえてここで聞いてみました。

338 :デフォルトの名無しさん:2001/08/03(金) 18:04
void test(char str[])
{
printf("test : %s\n", str);
}

なぜ str[] みたいな書き方がOKなんですか?

339 :デフォルトの名無しさん:2001/08/03(金) 19:04
>>337
ジョブスうんぬん以前の問題だろ。そのくらい適当なプログラム
作って確かめられるだろーが。

340 :デフォルトの名無しさん:2001/08/03(金) 19:35
>>338
そういう仕様だからです。

341 :デフォルトの名無しさん:2001/08/03(金) 21:32
質問させてもらいます。
下のコードのmain関数内でポインタ変数char* heapを確保して
それをSetArray関数に渡してSetArray内でヒープ領域にメモリを確保したいのですが
エラーがでました。
よく考えたらheapを渡す時点でheapが実態をどこも指してないのが理由という事に気づきました。
では、このような事がしたい時にはどうすればよいのでしょうか?

色々調べたら 「*&」 というものが関係ありそうなところまでは調べたのですが・・・・
よろしくお願いします。

main()
{
  char* heap;
  SetArray(heap);
}

void SetArray(char* pointer)
{
  pointer = new char[128];
  strcpy(pointer,"できるかな?");
}

342 :デフォルトの名無しさん:2001/08/03(金) 21:51
ポインタのポインタ。
SetArray に「何が」渡されているのか考えてみよう。

main()
{
char* heap;
SetArray(&heap);
}

void SetArray(char** pointer)
{
*pointer = new char[128];
strcpy(*pointer,"できるかな?");
}

343 :デフォルトの名無しさん:2001/08/03(金) 21:56
void SetArray(char*&pointer)
{
pointer = new char[128];
strcpy(pointer,"できるかな?");
}

main()
{
char* heap;
SetArray(heap);
}

C++だったらこうも書ける。
つか文字列クラス使え。

344 :デフォルトの名無しさん:2001/08/03(金) 21:58
むむむぅポインタのポインタですか・・・・・・
もう混乱してきましたがこれからよく考えて消化したいと思います。
ありがとうございました。

345 :デフォルトの名無しさん:2001/08/03(金) 22:02
>>343さん
それです。私が調べているうちに発見したのは。
これまた混乱してきましたが併せて消化させてもらいたいと思います。
またまたありがとうございました。

346 :デフォルトの名無しさん:2001/08/03(金) 22:53
バグのもとだから絶対やめとけよ.

347 :デフォルトの名無しさん:2001/08/04(土) 04:37
すみません
Cで1京の階乗(10,000,000,000,000,000!)の概算をしたいのですが
高速に計算する方法がみつからなくて詰まっています。
精度は 6 桁 で ?.???e?? 形式で出力したいです。

30万! 程度までは求められたのですが、ループしていたのでは
焼け石に水のようです。どうか宜しくご教示お願いいたします。

348 :デフォルトの名無しさん:2001/08/04(土) 04:46
>>347
近似値でいいなら「スターリングの公式」で検索してみな。

349 :347:2001/08/04(土) 04:55
>>348
ありがとうございます。
数学は弱いので理解できるか不安ですが
がんばってみます。

350 :347:2001/08/04(土) 06:04
解けました!

351 :デフォルトの名無しさん:2001/08/04(土) 08:48
>>347
ところで、何に使うの?

352 :デフォルトの名無しさん:2001/08/04(土) 10:47
ベンチマークでは?

353 :デフォルトの名無しさん:2001/08/04(土) 11:23
宿題じゃねーのか?

354 :デフォルトの名無しさん:2001/08/04(土) 12:50
夏休み?

355 :デフォルトの名無しさん:2001/08/04(土) 13:58
構造体のアライメントの隙間にデータを格納する 方法を教えてください。

356 :デフォルトの名無しさん:2001/08/04(土) 14:36
>>355
なんのためにそんなことすんの?

357 :355:2001/08/04(土) 14:58
>>356
メモリの節約のためです。

358 :デフォルトの名無しさん:2001/08/04(土) 15:04
>>357
コンパイラのマニュアルを読んで、構造体の隙間を詰める
オプションが無いか調べてください。

359 :孫悟空:2001/08/04(土) 15:07
>>355
使ってるコンパイラのコンパイルオプションにアライメント指定オプションがないか、
調べれ
#pragmaプリプロセッサ命令も調べてみれ

360 :デフォルトの名無しさん:2001/08/04(土) 17:41
>>355
つーか、隙間が出来ないように宣言に工夫しろ。

361 :デフォルトの名無しさん:2001/08/04(土) 17:43
>>360
どーやって?

362 :デフォルトの名無しさん:2001/08/04(土) 17:49
>>361
ビット構造体

363 :デフォルトの名無しさん:2001/08/04(土) 17:52
>>361
ワード境界に気を配って、char,int,charなんて並べないようにするとか。
あと、最近のコンパイラは賢くてかってに並び替えるから心配するな。

364 :361:2001/08/04(土) 17:52
>>362
あーそーですか。

365 :デフォルトの名無しさん:2001/08/04(土) 17:57
>あと、最近のコンパイラは賢くてかってに並び替えるから心配するな。

メジャーなコンパイラは並べ替えなんてやってないよ。

366 :デフォルトの名無しさん:2001/08/04(土) 18:54
>>365
そう?
まあそうしたら自分で気をつけるんだね。

367 :デフォルトの名無しさん:2001/08/04(土) 20:15
>>366
適当なこといって「そう?」かよ。

368 :デフォルトの名無しさん:2001/08/04(土) 21:40
フォルダのファイル一覧、テキスト化したいので
簡単に取得する方法教えてくださいな。

369 :デフォルトの名無しさん:2001/08/04(土) 21:41
>>368
dir >hoge.txt

370 :デフォルトの名無しさん:2001/08/04(土) 21:42
ls > tmp.txt

371 :デフォルトの名無しさん:2001/08/04(土) 21:42
>>368
system("command.com dir > dir.txt")

372 :デフォルトの名無しさん:2001/08/04(土) 21:43
言われればごもっとも。

373 :デフォルトの名無しさん:2001/08/04(土) 21:44
でもリダイレクトか。卑怯だね。
Perlのglobみたいなん無いの?

374 :デフォルトの名無しさん:2001/08/04(土) 21:50
>>373
卑怯でも何でも、いちばん簡単で確実な手法を取るのは当然のこと。
これが確実じゃない環境(シェルがないとか)なら別の方法を考えるが。

375 :デフォルトの名無しさん:2001/08/04(土) 21:50
>>373
シェルスクリプトじゃ常套句だけど。

for i in `ls`;do
echo $i
done

376 :370:2001/08/04(土) 21:51
>>369-371
^^;

377 :デフォルトの名無しさん:2001/08/04(土) 21:57
まあ、U**X だったらこれ。
man opendir
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/opendir.3.html

378 :デフォルトの名無しさん:2001/08/05(日) 14:32
if(a == 3 || ++b == 10)
見たいな場合に、もしa == 3だったら++b == 10の判定はおこなわれないので
しょうか?

379 :デフォルトの名無しさん:2001/08/05(日) 14:43
>>378
おこなわれません。

380 :379:2001/08/05(日) 15:11
>>379
本当ですか?

381 :デフォルトの名無しさん:2001/08/05(日) 15:11
>>380
それが仕様です。

382 :デフォルトの名無しさん:2001/08/05(日) 15:22
http://homepage2.nifty.com/katuya/index.html

383 :デフォルトの名無しさん:2001/08/05(日) 16:24
>>382
危険です。

384 :デフォルトの名無しさん:2001/08/05(日) 16:43
>>380
おこなってほしい人はパスカルをつかいましょう。
DelphiやKylixをどうぞ。

385 :デフォルトの名無しさん:2001/08/05(日) 17:27
>>384
なんでそーなる。ちょっと書き方を変えればすむ話じゃないか

386 :デフォルトの名無しさん:2001/08/05(日) 17:30
ていうか条件判断式に副作用のある演算子を書くやつを俺は信用しない。
そんなやつは何使わせても一緒だ。

387 :デフォルトの名無しさん:2001/08/05(日) 17:43
>>386
問題提起として書いただけでは。本人だってどうなるかわからんから
一応聞いてみただけだろ。そんなことも考えないやつだって
いるし、そういう奴の方が問題だよ。

388 :デフォルトの名無しさん:2001/08/05(日) 23:53
関数の引数はいくつぐらいまでなら許されるのでしょうか?
1つの関数の引数を減らすためだけに構造体を使うのもどうかと思うので。

389 :デフォルトの名無しさん:2001/08/06(月) 00:00
>388
特にこれといった数はないので必要なら好きなだけ渡せばいい。

ただ、それらの引数郡(の一部)が
頻繁に他の関数にも渡されているなら再考の余地あり。
その場合は構造体にして渡すか
初期化関数などで一度だけ渡すようにする。

390 :デフォルトの名無しさん:2001/08/06(月) 02:10
絵を表示したいんだけど、やはりWindowsプログラミングの知識が必要
ですか?Windows使ってるんで。
2重振り子の様子みたいなのを書いてみたいんだけど、数値だけ計算して
もつまらないので。
LinuxってやつのGUIの方が楽なんでしょうか。

391 :デフォルトの名無しさん:2001/08/06(月) 02:13
>>390
C言語でやりたいというならどっちでも同じ。

392 :デフォルトの名無しさん:2001/08/06(月) 05:02
>>390
それならJAVAがお薦めです。

393 :デフォルトの名無しさん:2001/08/06(月) 09:03
>>390
それならVBがお勧めです

394 :デフォルトの名無しさん:2001/08/06(月) 09:26
今後のことも考えるならGLとか。

395 :デフォルトの名無しさん:2001/08/06(月) 09:44
>>390
それならDelphiがオススメです。

396 :デフォルトの名無しさん:2001/08/06(月) 09:48
>>390
それならCocoaがオススメです。

397 :デフォルトの名無しさん:2001/08/06(月) 10:34
>>390
それならjavascriptがお勧めっす。

398 :デフォルトの名無しさん:2001/08/06(月) 10:46
>>390
それならHSPがお奨めです。

399 :デフォルトの名無しさん:2001/08/06(月) 11:14
>>398
いや、それだけはお奨めしません。

400 :398:2001/08/06(月) 11:15
>>399
why?

401 :デフォルトの名無しさん:2001/08/06(月) 12:15
先が無いからでしょう

402 :デフォルトの名無しさん:2001/08/06(月) 13:40
>>401
Javaにもないでしょ。

403 :デフォルトの名無しさん:2001/08/06(月) 13:52
>>402
まだ企業によっては潰しが効く。
面接で HSP 使えマース。なんていったらただのアホでしょ。

404 :デフォルトの名無しさん:2001/08/06(月) 15:20
C言語で(C++でのお話も聞きたいけど)、<< や >> 演算子に対して、
扱おうとする整数型のビット数以上のビットシフトをやらせようと
したときの結果は処理系とか環境に依存しますか?

405 :デフォルトの名無しさん:2001/08/06(月) 15:44
>>404
普通は0になるけど、どうなんだろ。

406 :デフォルトの名無しさん:2001/08/06(月) 15:54
その状況を見てその中身を数値として
書き換えるべくファイルに戻したいと
言う時
(たとえば
   1 2 3 4
 A=[ 5 6 7 8 ]
   9 10 11 12
 と言うような3行4列の行列)
はどんな命令(fget? fput?)
を使えばいいのでしょうか?
ファイルの行列の記述の仕方も含めてお教え下さい。

407 :お厨腐人:2001/08/06(月) 16:25
>>404
不貞。
やだ!奥様がそんなことなさるお方とは思いませんでしたわ!
見損ないましてよ!

408 :デフォルトの名無しさん:2001/08/06(月) 16:30
>>406
まず適切に質問をする能力を身に付けてくれ。
>その状況を見てその中身を
「その」って何だ?

「下のようなm行n列の行列をファイルに
読み書きするとしたらどうすれば良いか?

1 2 3 4
4 5 6 7
9 10 11 12

ということか?

409 :デフォルトの名無しさん:2001/08/06(月) 16:33
>>407
うっそだー。

410 :406:2001/08/06(月) 16:35
>>408
そのとうりだ。

411 :デフォルトの名無しさん:2001/08/06(月) 16:39
>>410
406じゃないだろ(笑

ファイルには見たままテキストで保存すれば良い。
つまりメモ帳で開いた時に
1 2 3 4
4 5 6 7
9 10 11 12
と読めるように保存する。
ファイルを直接いじるよりも標準入出力を使ったほうが柔軟だが一応 f*() 系関数を使う。
で、何も考えないコーディングは以下の通り。

fp = fopen("matrix.txt", "w");

for (i = 0; i < m; i++){
&bnsp;&bnsp;for (j = 0; j < n; j++){
&bnsp;&bnsp;&bnsp;&bnsp;if (j < n - 1){
&bnsp;&bnsp;&bnsp;&bnsp;&bnsp;&bnsp;fprintf(fp, "%d ", a[i][j]);
&bnsp;&bnsp;&bnsp;&bnsp;}
&bnsp;&bnsp;&bnsp;&bnsp;else {
&bnsp;&bnsp;&bnsp;&bnsp;&bnsp;&bnsp;fprintf(fp, "%d", a[i][j]);
&bnsp;&bnsp;&bnsp;&bnsp;}
&bnsp;&bnsp;}
&bnsp;&bnsp;fprintf(fp, "\n");
}

fclose(fp);

412 :デフォルトの名無しさん:2001/08/06(月) 16:41
激しくtypo。何やってんだか。

fp = fopen("matrix.txt", "w");

for (i = 0; i < m; i++){
  for (j = 0; j < n; j++){
    if (j < n - 1){
      fprintf(fp, "%d ", a[i][j]);
    }
    else {
      fprintf(fp, "%d", a[i][j]);
    }
  }
  fprintf(fp, "\n");
}

fclose(fp);

413 :デフォルトの名無しさん:2001/08/06(月) 16:45
>>411
s/&bnsp;/ /g

あと、書換えることを考えると、最大桁数が8桁と仮定すると
> fprintf(fp, "%d ", a[i][j]);
fprintf(fp, "%8d ", a[i][j]);
とかの方がいいかもしれない

414 :406:2001/08/06(月) 16:47
うむ、ごくろうであった。

415 :デフォルトの名無しさん:2001/08/06(月) 16:54
>>414
じゃ、書き換えは自分で考えてくれ

416 :デフォルトの名無しさん:2001/08/06(月) 16:54
>>413
どうも。読み込みの方はよろしく。
fscanf 版と strtok 版で(笑

417 :デフォルトの名無しさん:2001/08/06(月) 17:02
>>409
すくなくとも VC++ では
int a() { return 0x12345678; }
int b() { return 32; }
int main(int argc, char* argv[]){
printf("%d %X %X\n", sizeof(int), a() << b(), a() >> b());
return 0;
}
とやると
4 12345678 12345678
と表示する。

418 :406:2001/08/06(月) 17:04
うむ、よきにはからえ。

419 :デフォルトの名無しさん:2001/08/06(月) 17:06
>>400
いやぁ、前にちょっとHSPのスレを煽って見たんだけど
他の言語と違って確実に厨な反応をするんだよね。

どうでもいいのでsage

420 :デフォルトの名無しさん:2001/08/06(月) 17:19
>>417
gcc (cygwin) と bcc32 でも同じだった。
64bit OS だと違ったりするかね。

421 :お厨腐人:2001/08/06(月) 18:10
>>409
あら、あたくしK&R両先生の御教えにすがることしかできない
か弱いお厨の女ですのに…そんな言い方…、酷い…。
どうぞ K&R2nd(共立出版.邦訳) p253をごらんになって
くださいまし……

422 :デフォルトの名無しさん:2001/08/06(月) 18:13
>>412
俺、持ってない。かいつまんで教えてくれるとすごい幸せ。

423 :422:2001/08/06(月) 18:14
あ、422は>>421に対するレスね
さっき首つろうとして失敗したからだな、多分

424 : :2001/08/06(月) 18:30
何処で質問していいかわからないのでここで質問させてもらいます。
PC,デジタル時計。。。問わず、1秒ってどのようにカウントしてるんですか?
ある一定の条件下である一定の処理を規定回数実行したら1秒なんでしょうか?

425 :デフォルトの名無しさん:2001/08/06(月) 18:32
>>424
sleep(1); とか。
精度はどのくらいほしいんだい?

426 :424:2001/08/06(月) 18:37
>sleep(1); とか。
例えばそのsleep(1)で呼び出しても、まさか人間みたく感覚で時間を
カウントして実行結果を返すわけじゃないですよね?
その実際に時間を生成する仕組みが知りたいんです。

427 :デフォルトの名無しさん:2001/08/06(月) 18:41
>>424
水晶発振体の振動回数を元にしています。いわゆるクォーツ。
http://www.hyperdyne.co.jp/~oohashi/work/inet2/03time/03time.shtml

428 :デフォルトの名無しさん:2001/08/06(月) 18:42
>>426
そりゃーあんた、おおもとを辿れば、時計見てるんだよ。

429 :奈々資産:2001/08/06(月) 18:45
マザーボードに小型のGショックが内蔵されてるのかと思った

430 :デフォルトの名無しさん:2001/08/06(月) 18:46
>>426

クオーツ腕時計の中はどんなしくみになっているのでしょうか?
http://www.fh-tokyo.com/Mechanism/quartz/Page1.htm

上記と原理は一緒、腕時計の場合は歯車をまわすが、
PCの場合、内部カウンタをカウントUPする。

431 :デフォルトの名無しさん:2001/08/06(月) 18:49
その水晶発振体は時計を見て振動している。

432 :お厨腐人:2001/08/06(月) 20:06
>>422=423
上掲書 p253 A7.8 シフト演算子 の項に
>右演算数が負であったり、左側の式の型のビット長より大きいか等しい場合、
>結果は不定となる。
とあるのですわ。

433 :デフォルトの名無しさん:2001/08/06(月) 20:09
>>432
ありがと。
>右演算数が負であったり
ここの部分は右ビットシフト、左ビットシフト関係なくなのかな?
ずっと(int)-4 >> 1 は(int)-2だと思ってたけどそうじゃない
ってこともあるのかな。

434 :デフォルトの名無しさん:2001/08/06(月) 21:32
>>433
うむ。 2147483646 になる処理系があっても悪くはない。
…俺は見たこと無いけど。

Javaだと >> << は算術シフトと決まってるみたいだね。

435 :お厨腐人:2001/08/06(月) 22:56
>>433
揚げ足とりみたいになって恐縮なのですけれど…
>右演算数が負
というのは x >> -1 と書いても
それが x << 1 と処理される保証はない、ということを
仰りたいのだと思いますわ。
符号付整数(で、その値が負であるとき)の右シフトの結果については、
>>結果は処理系に依存する
と、書いておられますわ。

436 :433:2001/08/06(月) 23:01
>>435
ありがと。あ、右ってそういうことね。わかった。

437 :デフォルトの名無しさん:2001/08/08(水) 19:14
とある関数内の変数宣言で
static int a,b,c
だと変な動作になるのに、
使わない変数dを加えて
static int a,b,c,d
で宣言するとちゃんと動くようになりました。
dは一度も使わない変数です。

何度もd入れたり消したりしてみたんで
これがエラーが消える原因には間違いないです。

これってどういうことでしょう?
ド素人厨房なんで意味わからない質問でスマソ

438 :デフォルトの名無しさん:2001/08/08(水) 19:20
>>437
その関数のソースを書いてくれないとどうにもならん。

439 :デフォルトの名無しさん:2001/08/08(水) 22:39
>>437
初心者によくある現象だね。

440 :( ゚Д゚)ウボァー!:2001/08/08(水) 22:59
>>439
たとえばどんなとき?

441 :デフォルトの名無しさん:2001/08/08(水) 23:18
>>440
メモリを破壊しているとき

442 :437:2001/08/08(水) 23:22
>>438
ヘタレなんでそんな・・・

>>439
>>441
メモリを破壊しないようにするためには
どういうことに注意していればいいですか?

443 :デフォルトの名無しさん:2001/08/08(水) 23:29
>>442
メモリを破壊しないように注意するんだよ。
ポインタがvalidなとこを指しているかどうかだけ気をつけりゃいーんだよ。

444 :437:2001/08/08(水) 23:32
>>443
validってなんですか?

445 :デフォルトの名無しさん:2001/08/08(水) 23:38
valid=有効
和英引け
443は正確な意味をわからずに,この単語を使っていると思われ

446 :437:2001/08/08(水) 23:44
>>445
サンクス

447 :デフォルトの名無しさん:2001/08/08(水) 23:47
和英にゃ載ってらんだろ。
445は正確な意味をわからずに,この単語を使っていると思われ

448 :455:2001/08/08(水) 23:53
しまった

449 :デフォルトの名無しさん:2001/08/09(木) 02:13
読みこんだファイルが何バイトか知りたい
ときってひとつずつ数えていかなきゃダメ?

450 :デフォルトの名無しさん:2001/08/09(木) 02:18
カンマと改行区切りの文字列を渡すと、
みためにきれいになるように(カンマの位置がすべてそろうように)
整形する関数をつくれば良いのではないでしょーか。

"c,c++,java\nbasic,pascal,ruby\ncobol,fortran,perl\n"
このまま表示すると
c,c++,java
basic,pascal,ruby
cobol,fortran,perl
となる。これを整形関数に通すと
"c____,c++____,java\nbasic,pascal_,ruby\ncobol,fortran,perl\n"
となる。(_は空白文字)
c____,c++____,java
basic,pascal_,ruby
cobol,fortran,perl

こんな関数作って〜〜

451 :デフォルトの名無しさん:2001/08/09(木) 02:25
文字列を整形するの?
整形した文字列を出力するの?

452 :デフォルトの名無しさん:2001/08/09(木) 02:33
>>450
まず最初に文字列を走査して、
各列(カンマ区切り)の最長単語長を見つける。
一文字ずつ見ていって , が出るまでカウントを増やせば良い。
例えば、
a[0] = 5 // cobol = 5
a[1] = 7 // fortran = 7
a[2] = 4 // perl = 4

次に、また文字列を走査、同じように一文字ずつ見ていく。
また単語の長さをカウントしておく。
次の文字が区切り文字だったら、
その列の最長単語長-現在の単語長分だけ空白を入れる。

453 :デフォルトの名無しさん:2001/08/09(木) 02:38
a[0] ←最初、単語の数は分かっていないのでは。

454 :452:2001/08/09(木) 02:50
>>453
仕様として決め打ち、あるいは3パス(笑

455 :デフォルトの名無しさん:2001/08/09(木) 02:57
>>449
fseek でファイルの最後に飛んで、それから ftell を呼べば
良いと思う

456 :デフォルトの名無しさん:2001/08/09(木) 03:03
>>449
UNIX系だったら man stat すれ。

457 :デフォルトの名無しさん:2001/08/09(木) 03:17
>>449
「読みこんだファイルが何バイトか知りたい 」
読み込み済みのファイルだったら、サイズは自明だと思うが…

458 :デフォルトの名無しさん:2001/08/09(木) 03:20
>>452-454
最初は、各行の1番目の単語について最長単語長を調べる。
つぎに、各行の2        〃

配列を確保する必要は全く無い。

459 :デフォルトの名無しさん:2001/08/09(木) 05:58
makeモドキを作ろうとしています。
そこで、ファイルの時間を取得して、
比較するにはどうすればいいんでしょう?
取得はとりあえずstat/fstatでするとして、
比較の方法がわかりません

460 :459:2001/08/09(木) 06:04
time_t型の比較の方法がわかればいいんですが。
typedef long time_t;
となってるので、そのままlong値で比較して良いものでしょうか?

461 :デフォルトの名無しさん:2001/08/09(木) 07:34
>>460
平林雅英著 新ANSI C言語辞典によると、
普通に比較演算子で比較してもいいらしい。

462 :デフォルトの名無しさん:2001/08/09(木) 08:05
>>457
え?どうすりゃいいの?
たとえば、今から「aborn」っていうファイルが何バイト
か知りたいゼ!っていうときは。
厨房でスマソ

463 :デフォルトの名無しさん:2001/08/09(木) 09:35
>>462
ちゃんと>>455,>>456に書いてあるだろ。

464 :デフォルトの名無しさん:2001/08/09(木) 09:45
>>462
それは「読み込んだファイル」とは言わないだろ。

465 : :2001/08/09(木) 12:00
C言語を勉強中の後輩にヤル気が起きないので困っています。(;´Д`)

466 :デフォルトの名無しさん:2001/08/09(木) 12:51
Cを勉強中の後輩(男)に犯る気が起きて困っています。(;´Д`)

467 :デフォルトの名無しさん:2001/08/09(木) 15:07
しつもんします
-------------------
char age[10];
char sage;

scanf("%s", age);
scanf("%c", &sage);
--------------------
ってやると2回目のscanfが実行されてないような気がするのですが…
ひょっとして1回目のscanfでリターンすると%cでそれを入れてしまうのでしょうか?

468 :デフォルトの名無しさん:2001/08/09(木) 15:14
>>467

その通りです。

char linebuff[1024];
char age[10];
char sage;

fgets(linebuff, sizeof(linebuff), stdin);
sscanf("%s", age);
fgets(linebuff, sizeof(linebuff), stdin);
sscanf("%c", &sage);

のほうが安全。

469 :468:2001/08/09(木) 15:15
sscanf のところをミスった。

sscanf(linebuff, "%s", age);
ね。

470 :460:2001/08/09(木) 22:05
ありがとうございます。
うまくいきました。

471 :デフォルトの名無しさん:2001/08/09(木) 22:22
非国民がー。

472 :462:2001/08/09(木) 22:27
>>463
スマソ。よく見てなかった。
>>455-456
ありがとうございます。

473 : ◆p.oaL5RA:2001/08/09(木) 22:51
ファイル操作が苦手です。
タスケテー

474 :デフォルトの名無しさん:2001/08/09(木) 22:59
何を?どうやって?

475 :デフォルトの名無しさん:2001/08/09(木) 23:00
>>473
何が不得意か言ってみろ

476 :デフォルトの名無しさん:2001/08/09(木) 23:00
MFCによくみられるんですが、クラスの関数の中で
TYPE& GetHead();
TYPE GetHead() const;
こんな感じのものがあります。この場合、呼び出されるのは
どちらになるんでしょうか?GetHead()って呼び出しても
どっちが呼び出されるかどのように判断できるんでしょうか?

477 :473:2001/08/09(木) 23:06
いまいち動きが頭の中で理解しにくいというか・・・
似たような関数がけっこうありますし。

478 :デフォルトの名無しさん:2001/08/09(木) 23:09
>>477
似たようなやつなんか使うな。
分かるようになるまでは使う関数は統一しろ。
身にならない知識を振り回す前にまず足場を固めろ。

479 :477:2001/08/09(木) 23:13
御意。

480 :マジレスさん:2001/08/09(木) 23:17
C言語の「C」ってなんの略なの?

481 :デフォルトの名無しさん:2001/08/09(木) 23:18
>>480
B言語の次にできたから

482 :コメント無しさん:2001/08/09(木) 23:45
>>480
Chu-bou

483 :480:2001/08/10(金) 00:04
>>481
なにそれ?
>>482
そうか!サンクス。

484 :デフォルトの名無しさん:2001/08/10(金) 02:30
age

485 :デフォルトの名無しさん:2001/08/10(金) 02:33
481じゃないけど
BCPL->B->C

486 :デフォルトの名無しさん:2001/08/10(金) 03:34
ドレミファドンのド(C)>480

487 :デフォルトの名無しさん:2001/08/10(金) 03:37
>>486
ド言語?

はにほへといろは〜

488 :C#:2001/08/10(金) 08:15
>>476
例えば
 CList::GetHead
  const リストの場合は、GetHead 関数はリストの先頭要素のコピーを返します。このとき、この関数を代入ステートメントの右辺にしか使えないので、リストは変更されません。
  const 以外のリストの場合は、GetHead 関数はリスト要素への参照を返します。このとき、この関数を代入ステートメントの左辺、右辺の両方に使えるので、リストのエントリを変更できます。
です。constか否かで区別。

489 :C:2001/08/10(金) 11:50
void hoge(const int a);この2つはどうちがいますか。
void hoge(int conat a);

void hoge(const int *a);この2つはどうちがいますか。
void hoge(int const *a);

490 :デフォルトの名無しさん:2001/08/10(金) 11:59
>>489
void hoge(const int *a);
void hoge(int const *a);
これは同じです。int * const aとすれば違いますが。

void hoge(const int a);
void hoge(int conat a);
これはconatがなにかわからないのでなんとも言えません。

491 :デフォルトの名無しさん:2001/08/11(土) 15:34
include<stdio.h>

int main(void)
{
int i,c;
int cnt[10] = {0};

while(1){
c = getchar();
if(c==EOF)break;
if(c => '0' && c <='9')
cnt[10 - '0']++;
}
puts("数字の出現回数");
for(i = 0;i<10;i++)
printf("%d %d",i,cnt[i]);
return 0;
}
上のif(c => '0' && c <='9')で構文エラーって言われちゃうんだけど
どこがだめなの?後、'0'と0と"0"は意味が違うの?
教えてください。

492 :デフォルトの名無しさん:2001/08/11(土) 15:49
>>491
main()
{
int aa = 0;
char bb = '0';
char cc[]= "0";

printf("%d,%c,%s", aa, bb, cc);
}

493 :デフォルトの名無しさん:2001/08/11(土) 15:51
=>なんてーのはねーよ。>=だろ。
'0'は文字、0は0、"0"は'0'と'\0'の2文字。
体で教えてやろーか?

494 :デフォルトの名無しさん:2001/08/11(土) 17:03
00H
30H
30H,00H

495 :デフォルトの名無しさん:2001/08/11(土) 17:04
a- intだと0は00H,00H,00H,00H

496 :デフォルトの名無しさん:2001/08/11(土) 17:30
ある文字列に別の文字列が含まれているかを調べるには
どうすればいいのでしょうか。

if( $str =~ /abc/ )
こんな感じのことをCでやりたいのですが。

497 :デフォルトの名無しさん:2001/08/11(土) 17:32
>>496
man strstr


正規表現までは出来ないよ

498 :デフォルトの名無しさん:2001/08/11(土) 17:33
勉強したいので、ソースの美しさで定評のある
ソースの入手可能なプロジェクトがあれば教えてください。

499 :デフォルトの名無しさん:2001/08/11(土) 17:38
>>497
多謝。多謝。

500 :デフォルトの名無しさん:2001/08/11(土) 18:10
http://www.ingrid.org/jajakarta/regexp/
regexpかoro参照

501 :デフォルトの名無しさん:2001/08/11(土) 18:10
あーここCスレか

502 :デフォルトの名無しさん:2001/08/11(土) 19:07
>>498
美しいがどうかは知らんが、
gtk や libpng なんかは読みやすいよ。

503 :491 :2001/08/11(土) 21:09
ども、ありがとうございます。助かりました。
このプログラムは、数字として数えてるのではなくて、文字として
カウントしているってことでいいですか。

504 :デフォルトの名無しさん:2001/08/11(土) 22:25
いや、全然バグってるよ。
宿題?正直に自分が何でどういうプログラムか教えてくれたら教えてあげる:-)

505 :デフォルトの名無しさん:2001/08/11(土) 23:20
>>504
>正直に自分が何でどういうプログラムか教えてくれたら教えてあげる
…あんたの文章もバグってるぞ…(藁

506 :505:2001/08/11(土) 23:29
アリャ、バグは言い過ぎた。
俺が意味を読み取れなかっただだけだな、ゴメソ。

507 :!!!警告!!!:2001/08/11(土) 23:47
>>504は日本語文法を学習しなさい。

508 :デフォルトの名無しさん:2001/08/11(土) 23:51
>>507
コンパイルが通ってもバグがあったりするように、
文法は正しくても意味は通じなかったりするのだよ。
言語学板にでも行ってみれ。

509 :!!!警告!!!:2001/08/11(土) 23:58
(>>508ネタニマジレズカコワルイヨ)

510 :デフォルトの名無しさん:2001/08/12(日) 00:18
>>505
バグってるのはテメーの頭。

511 :デフォルトの名無しさん:2001/08/12(日) 02:49
>>498
プログラマ板に「プロのプログラマのプログラム教えて」という
スレが立っています。これなんかどうでしょう
http://mentai.2ch.net/test/read.cgi?bbs=prog&key=994898315

512 :デフォルトの名無しさん:2001/08/13(月) 01:10
Cを勉強している厨房です。大変厨房な質問で申し訳ないですが
質問させてください。

構造体のメンバ変数をポインタで参照するとき
たとえばアロー演算子で pms->data1 のようにすると思うのですが
なぜ 間接演算子の *pms->data1 のようにしてはいけないのでしょうか?
ポインタがまだわかってないのでしょうが、疑問に思っています。
よろしくお願い致します。

513 :デフォルトの名無しさん:2001/08/13(月) 01:12
pms->data1と
(*pms).data1はおんなじ

514 :デフォルトの名無しさん:2001/08/13(月) 01:12
data1の型が不明だが、
(*pms).data1でできるぞ。
*pms->data1は*(pms->data1)と同等。

515 :デフォルトの名無しさん:2001/08/13(月) 01:13
->は(*).の簡略表記だね

516 :デフォルトの名無しさん:2001/08/13(月) 01:15
すばやいレス本当にありがとうございます。
あ なるほど。そうゆうことなのですね。
簡略表記。なるほど、それだと納得できます。
本当にありがとうございました>>514-515

517 :516:2001/08/13(月) 01:16
>>513-515さんに訂正です。ありがとうございました。
2Chってレスが速くてすばらしい。感動しました。

518 :デフォルトの名無しさん:2001/08/13(月) 06:45
きれいなプログラムってどんなやつをいうんでしょうか?
やっぱり、誰が見てもわかりやすいとかそんな感じなんでしょうが、
実際よくわかりません。
学生の時、研究で使うソフトがどうしても動かず、
プログラマの友達に見てもらったとき一言「コードが汚い」
自分ではわかりやすく書いてたつもりだったんですが・・・。
どなたか教えていただけませんか?
参考までに汚いといわれたのはVBです。現在はC++の勉強中です。

519 :デフォルトの名無しさん:2001/08/13(月) 06:49
>>518
見やすい、ではなく分かりやすい。
バグが無い、ではなくバグを直しやすい。

そういうプログラムです。

520 :デフォルトの名無しさん:2001/08/13(月) 07:28
<<512
->と(*).の問題というより、
演算子結合強度について説明する方が親切だと思うのだが、どうか。

521 :デフォルトの名無しさん:2001/08/13(月) 10:10
>>520
演算子の結合順位と、右・左結合はCをやる上での基本事項にもかかわらず
明快に解説した良書が少ないので「難しい」範疇に入っていると思われ。

そこまで解説しなくても、つまずいてるところだけをさくっと答えているので
よいのでは?

522 :デフォルトの名無しさん:2001/08/13(月) 11:32
右・左結合ってなんですか?

523 :デフォルトの名無しさん:2001/08/13(月) 12:43
>>522
同じ優先順位の演算子が複数並んでいるときに、
どういう順序で結合するかっていうこと。

例えば、後置演算子は左から右に結合するから、
a[0]++ は (a[0])++ と同じになる。

524 :522:2001/08/13(月) 13:00
>>523さん
解説ありがとうございました。
ポインタの間接演算子*が絡んでくると、わけがわからなくなってしまい
これでもか!ってカッコでくくってます(^_^;)
そのようなことも勉強しないといけませんね。
ありがとうございました。

525 :デフォルトの名無しさん:2001/08/13(月) 13:06
substr() のような関数はCではどうやるの?

526 :デフォルトの名無しさん:2001/08/13(月) 15:01
動作確認してないけど

void substr(const char* s,
      unsigned int offset,
      unsigned int length,
      char* res)
{
 if( offset >= strlen(s) ) {
  *res = '\0';
  return;
 }

 s += offset;
 while( *s != '\0' && length-- > 0 ) {
  res++ = s++;
 }
 *res = '\0';
}

527 :デフォルトの名無しさん:2001/08/13(月) 15:18
>>526
res++ = s++;
に * がついてないが?

528 :526:2001/08/13(月) 15:53
>>527
あ、ほんとだ。バグってるね。

529 : :2001/08/13(月) 21:43
トリップ計算機のソースきぼーん

530 :デフォルトの名無しさん:2001/08/13(月) 21:50
>>529
こんなの?

d.HH = a.HH -b.HH; /* -23〜+23*/
d.MM = a.MM -b.MM; /* -59〜 59*/
d.SS = a.SS -b.SS; /* -59〜 59*/

if( 0 > d.SS ){ d.SS = d.SS+60; d.MM = d.MM -1; };
if( 0 > d.MM ){ d.MM = d.MM+60; d.HH = d.HH -1; };
if( 0 > d.HH ){ d.HH = d.HH+24; d.DD = d.DD -1; };

531 :デフォルトの名無しさん:2001/08/13(月) 22:55
これっす。
http://2ch-dokyuso.virtualave.net/upload/image/051.xxx
(拡張子をexeに変えて実行)

これのトリップ計算の部分だけでも、、お願い!

532 :デフォルトの名無しさん:2001/08/13(月) 23:11
Torojan house.

533 :デフォルトの名無しさん:2001/08/13(月) 23:19
>>532
不覚にもワラタ・・・

534 :デフォルトの名無しさん:2001/08/14(火) 15:29
ボーリングでのブービー点を出力。
-1で終了

これを、コーディングしてください。

535 :デフォルトの名無しさん:2001/08/14(火) 16:39
>>534
printf("%d人中%d位 SCORE=%d\n", member_cnt, menber_cnt - 1, sorted_score[menber_cnt - 2]);

536 :><:2001/08/14(火) 21:48
ハイル・マイスター。C厨のわたくしにご教示ください。
fputc()を使ってファイルに出力するとき
ファイルの終わりに^@が入ってしまいます。
この現象はなぜ起こるのですか。
またどうすれば^@なしにきれいに書き込めるのでしょうか。

537 :デフォルトの名無しさん:2001/08/14(火) 22:22
^@つーのは文字劣の欠の\0が出てるんだよ。(笑

538 :デフォルトの名無しさん:2001/08/14(火) 22:57
かわいいな、これ。
そのうち、CP/Mなんですけど最後に0x1aがついてきますタスケテ
とかってやつが来るのか?

539 :><:2001/08/15(水) 22:34
>>537
>>538
//////赤面しております。ご教示ありがとうございます。
バッファに文字列を詰め込む場合と違ってファイル(ストリーム)に出力する場合は欠に'\0'を詰めなくてよいのですね。いちいちやってゐました(/////恥

540 : :2001/08/17(金) 21:25
ファイルで分割して、コンパイルしたいと思います。
すべてのファイルで同じ構造体を使用しますが、
ファイル1つ1つに長ったらしい構造体宣言を
しなければならないのですか。
extern struct hoge{…};
などと宣言しなければならないのですか?

 
          

541 :デフォルトの名無しさん:2001/08/17(金) 21:45
>>540
typedef

542 :名無しさんだよもん:2001/08/17(金) 21:49
>>540
typedefしたら?

543 :デフォルトの名無しさん:2001/08/17(金) 21:53
typedefはもっともなんだが

>extern struct hoge{…};

を見ると
ヘッダに書いてインクルードするって方法を知らないと思われるんだが…

544 : :2001/08/17(金) 22:08
厨房ですいません。

つまり・・・

--- myheader.h ---
typedef struct{...} Foo;
typedef struct{...] Hoge;
--- EOF ---

というヘッダファイルをつくって、
すべてのファイルに
#include "myheader.h"
とインクルードすればいいのですか?

545 :デフォルトの名無しさん:2001/08/17(金) 22:12
>>544
それでいいよ。
念のために書いておくけど
すべてのファイルにインクルードというのは
正確には その構造体を使うすべてのファイルのことだね。

まあ、わかってると思うけど一応。

546 :540,544:2001/08/17(金) 22:19
>>545
ありがとうございます。

547 :デフォルトの名無しさん:2001/08/17(金) 22:29
??
typedefは関係無くないか?

548 :初心者:2001/08/18(土) 10:09
こんにちは。

char 配列変数 str[x] の中が空かどうかを判定する場合、

1. if ( strlen( str ) == 0 ) {
2. if ( strcmp( str, "" ) == 0 ) {

のどちらが一般的でしょうか。

549 :デフォルトの名無しさん:2001/08/18(土) 10:18
>>548
if( !str[0] ) {

550 :デフォルトの名無しさん:2001/08/18(土) 10:24
>>547
同意。

551 :デフォルトの名無しさん:2001/08/18(土) 10:25
int getsym(void) { return getchar(); }
struct base{ int num,sym; }b={0,' '};
enum bdepth { Baddsub,Bmuldiv,Bfactor} ;
#define Bexpression Baddsub
int b_func(enum bdepth depth)
{ struct base save;
 if(b.sym==' ') while(' '==(b.sym=getsym()));
 switch(depth){
 case Baddsub:  switch(b.sym){
    case '+': b.sym=getsym();b_func(Bmuldiv);break;
    case '-': b.sym=getsym();b_func(Bmuldiv);
         b.num = -b.num;break;
    default : b_func(Bmuldiv);}
  while(b.sym == '+' || b.sym == '-'){
    save= b; b.sym=getsym(); b_func(Bmuldiv);
   switch(save.sym){
   case '+': b.num=save.num + b.num;break;
   case '-': b.num=save.num - b.num;
    };
  }break;
 case Bmuldiv: b_func(Bfactor);
  while(b.sym == '*' || b.sym == '/'){
       save = b;b.sym=getsym(); b_func(Bfactor);
   switch(save.sym){
   case '*': b.num=save.num * b.num;break;
   case '/': b.num=save.num / b.num;
    };
  }break;
 case Bfactor:
 switch(b.sym){
 case '(':  b.sym=getsym(); b_func(Baddsub);
    if(b.sym == ')') b.sym=getsym();
    else /*エラー*/;
  break;
 case '$':{int n; hex:;
    b.num=0; b.sym=getsym();
    while((n=hex1(b.sym))>=0){b.sym=getsym();b.num=(b.num<<4)+n;}
   };break;
 case '0':  b.sym=getsym();
  if(b.sym=='x'||b.sym=='X') goto hex;
  goto bcd;
 default:
#define isNum(ch) ((ch>='0') && (ch <='9'))
   if(isNum(b.sym)){
   bcd:;{int n=b.sym-'0';
      b.num=0;
      while((n>=0)&&(n<=9)){b.num=(((b.num<<2)+b.num)<<1)+n;
       b.sym=getsym();n=b.sym-'0';
      }
     }
   }
  }
 };
 return b.num;
}

552 :デフォルトの名無しさん:2001/08/18(土) 10:31
四則演算をする関数を作りたくて >>551 のように作り始めたんだけど
どうしても再帰が必要なのかなあ?
だったら関数をaddsub/muldivとか分けた方がいいんだけど、
すると構造体ポインタを引数にしなくちゃいけないからなんか重そう

テスト用のメイン
int main(int argc, char* argv[])
{while(1){
 printf("[%5d", b_func(Bexpression) );
 printf("sep=%02X ]\n", b.sym);
  b.sym=' ';
 } return 0;
}

553 :デフォルトの名無しさん:2001/08/18(土) 15:28
>>551 夏休みの課題ですか?

頑張っていると思います。
save先をスタックにし、プログラム構造を
テーブル駆動式にすれば再帰を使わなくても良いのですが
手間は増えますし、とりあえずそこは今のままで先に進むと
いいでしょう

554 :デフォルトの名無しさん:2001/08/19(日) 19:22
あげ

555 :デフォルトの名無しさん:2001/08/19(日) 22:25
>>552
ポインタ引数の重さなんて8bit環境ですら屁みたいなもんだよ。
構造体実体引数ならドキュだが。

再帰を使ってCプログラム自体で演算を実行するか、
VirtualMachineを作るか、のどっちかだろうけど、
子息演算(家族計画の一種か?)くらいならVM作るのはヤリスギ。

556 :デフォルトの名無しさん:2001/08/19(日) 23:49
K&Rを読み終わった程度なんだけど、なにか画面で動かしたい。
でもコマンドラインのしかやったことないし、VCは触ったことないのでサパーソワカラン。
手っ取り早く画面に自由にナニカを表示して動かしたいわけですが、良い方法、参考
になるWEBサイトはありませんか?

557 :デフォルトの名無しさん:2001/08/19(日) 23:54
>>556
君が使える環境をまず書き給え。

558 :デフォルトの名無しさん:2001/08/19(日) 23:57
>556 Javaへようこそ

559 :デフォルトの名無しさん:2001/08/20(月) 00:06
>>558
SmallTalkへようこそ

560 :デフォルトの名無しさん:2001/08/20(月) 00:12
>559
いやっぷー(・ε・)

561 :デフォルトの名無しさん:2001/08/20(月) 00:42
>>558
curses へようこそ。

562 :デフォルトの名無しさん:2001/08/20(月) 00:44
556です。
>>557
Windows2000SP2にVisual C++6.0、で遊んでいますがこれだけじゃ
不十分ですか?

Javaもゆくゆくはかじってみたいと思ってますし、この目的の
ためにはいいらしいですね。運動方程式を数値的に解いた、運動
の様子を見たいのですが、とりあえずCでできるならCでやってみ
ようと思い聞いてみました。

563 :デフォルトの名無しさん:2001/08/20(月) 00:50
>>562
本気でやりたいなら Win32 API 勉強すれば? 窓を開いて GDI 関数
で絵を書くだけなら、それほど道のりは遠くないぞ。とりあえず書店に
行って Petzold の「プログラミング Windows」という本を読んでみて、
自分の手に負えるかどうか判断して下さい。

564 :デフォルトの名無しさん:2001/08/20(月) 01:15
>>562
VCはサパーリじゃなかったのか?

565 :デフォルトの名無しさん:2001/08/20(月) 01:33
>>562
エクセールでいんじゃねーか?

566 :デフォルトの名無しさん:2001/08/20(月) 01:50
>>564
サパーリだけどただのCコンパイラとして使ってます。
Win32コンソールアプリケーションっていうやつです。
学校がMSと契約してるらしくて、学生にくれてるんですよ。

http://www.amazon.co.jp/exec/obidos/tg/detail/glance/-/books/4756136001/qid=998239629/ref=sr_sp_re_1_6/249-0984941-9883563
これですね、APIの本。
高いし上下あるのか(´Д`;)
とりあえずこれ読んでみます。ありがとうございました。

567 :デフォルトの名無しさん:2001/08/20(月) 02:35
>>566
そんな古い本はやめとけって。

568 :デフォルトの名無しさん:2001/08/20(月) 02:39
手軽にグラフィックやりたいならVCよりC++BuilderかJavaの方が楽
まぁVCでも1度作ってしまえばあとの手間は変わらんけどね
C#もよこせって言えば?

569 :デフォルトの名無しさん:2001/08/20(月) 02:56
>>567
しっかり改訂されてるから問題ないぞ。Win32 API プログラミングと
いったら、こいつがバイブルだと思うんだが、他にお勧めある?

570 :デフォルトの名無しさん:2001/08/20(月) 03:34
C++BuilderってボーランドのVC++みたいなやつですよね?
MSの開発環境よりいいものなんでしょうか。
友達が昔、VBのC版だ、みたいに言っていましたけど。
MSDNのVCのサンプルみてもワケわかんないッス。
でも、みなさんもやっぱり大変だったんですよね最初は。

571 :デフォルトの名無しさん:2001/08/20(月) 04:08
>>570
コンソールアプリだと、プログラムのロジックが OS にサービスを要求
するわけだが、Win32 だと OS からユーザの登録した関数が呼び出され
る形になるので、パラダイムが全然違うんだよね。

最初は戸惑うと思うが、処理の流れと代表的なコントロール・メッセー
ジを一通り押さえれば見通しが利くようになるよ。

あと、Win32 API の知識と処理の流れに関する大まかな知識は必須で、
いくつか API のみでプログラムを書いて勉強することを勧めるけど、
実際のプログラムを組む段階になったら適当なクラスライブラリを使っ
た方が良い。

正直、素の API だけでプログラミングするのは辛いので。

572 :デフォルトの名無しさん:2001/08/20(月) 12:16
くだらない質問ですけどswitch文でcaseやdefaultは字下げしますか?
Developer Studioでは字下げされないのですが、
本によってはcaseなどの部分が字下げされているものもあります。
どちらの方が美しく正しい記述なのでしょうか?

573 :デフォルトの名無しさん:2001/08/20(月) 12:40
>>572
これは完全に俺のシュミなんだけど、
基本は字下げ4文字で、case文は2文字字下げにしてる。
こうするとcaseは出っ張って、カッコは他のと同じ下げになる。

正式なのはしらん。会社で文句いわれたことも無い。

574 :デフォルトの名無しさん:2001/08/20(月) 13:05
>>572
> どちらの方が美しく正しい記述なのでしょうか?
自分で美しいと思った方を使え

ちなみに俺はcaseの字下げはしない方が美しいと思う。

575 :デフォルトの名無しさん:2001/08/20(月) 13:34
>>572
どっちでも良いけど、有名どころのコーディング規約が知りたいなら
Artistic Style のソースを落としてきて astyle.html を読んでみ
れば?

Artistic Style
http://astyle.sourceforge.net/

あと FreeBSD の kernel ソースコードで使われているコーディング規
約が、次の URL で見られる。

http://www.freebsd.org/cgi/man.cgi?query=style&apropos=0&sektion=9&manpath=FreeBSD+5.0-current&format=html

576 :デフォルトの名無しさん:2001/08/20(月) 16:30
C言語で、変数と文字列の比較ってどうやるのですか?

今まではBASICで

if x = "文字列" then...

みたいにやっていたのですが、初めてC言語でプログラムを作っているのですが
if文だと文字列比較ができないみたいなので。

577 :デフォルトの名無しさん:2001/08/20(月) 16:34
if (strcmp(x , "文字列" )==0 ){
 ...
}

とやりますが、無理にこのやりかたに慣れるより C++でやった方がいいですよ

578 :デフォルトの名無しさん:2001/08/20(月) 16:35
ネタにマジレスかこわるい。

579 :デフォルトの名無しさん:2001/08/20(月) 16:38
BASICで文字列変数って $をつけなくてもいいの?
気のせい?まあBASICなんていろいろあるからね。

580 :576:2001/08/20(月) 16:41
>>577
ありがとうございます。strcmpという関数はしりませんでした。
でも、無理に・・・って事は、C++だともっと上手いやり方があるのですか?

>>578
ねたではありません。C言語は二日前に始めたばかりなのです。
今まではBASICでやっていました。

581 :デフォルトの名無しさん:2001/08/20(月) 16:59
>>580
>C++だともっと上手いやり方があるのですか

VBと同じように比較したり 加算したり出来ますよ

582 :こんな具合で:2001/08/20(月) 18:14
>>580
string x = "文字";
string y = "列";
string z = x + y;

if( z == "文字列" ) {
 ...
}

583 :デフォルトの名無しさん:2001/08/21(火) 02:36
しかし、
 if ("文字列" == z) {
つーのはできんのだな、これが。

584 :デフォルトの名無しさん:2001/08/21(火) 09:37
((*(int *)PORT_B) = (*(int *)PORT_B) & 0xFFEF)

585 :デフォルトの名無しさん:2001/08/21(火) 23:19
Cで長い間プログラム書いてきている方は、みんな自分のライブラリとか
持っているんですか?
たとえば他の言語だとすぐHashが使えるけど、Cではなんとかして
Hashのコードを用意しなければ逝けないとか、、、その辺どうしてますか?

586 :デフォルトの名無しさん:2001/08/21(火) 23:21
>>585
職業プログラマでもないかぎり持ってないと思うよ。
どっかから拾ってきて使う。

587 :デフォルトの名無しさん:2001/08/21(火) 23:35
>>585
今時STLでしょ。

588 :デフォルトの名無しさん:2001/08/22(水) 00:47
>>585
Glibなんかどうよ?
オプソアレルギーなドキュ(個人にせよ職場にせよ)には使えぬが。

職業プログラマだっていちいち「毎回」作りたくないよ。
毎回ってのは、ソース「全部」のライセンスを寄越すという契約を
客と交わしている場合、自分で溜めこんだ奴を事実上使えないので。
ま、デュアルライセンスだということにするとか、
「予め」オプソライセンスで自分の名義で公開しとく
(これは誰が言った作戦だったかな)とか、手は有るが。

589 :ななしんぐ:2001/08/22(水) 01:26
C初心者なんですけど
以下のプログラムでオラクルのDBに繋ごうと思ってるんですけど
なかなかうまくいきません。
何か間違ってる部分とか、インクルードされてるファイルで何が
起こってる事が予想されるか誰か教えてください
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <sqlcpr.h> /* オラクルライブラリ */
#include <sqlca.h> /* オラクルライブラリ */
#include <sqlda.h> /* オラクルライブラリ */
#include <stdio.h>
#include <string.h>

int CountOfData; /* データ数 */

int main(
)
{
FILE *fp;
int ii, chk ;

/* DB接続 */
chk = CMNconnectDB( cCMN_DB_USER, cCMN_DB_PASSWORD, 0, &result );

if( chk != cCMN_OK ) { /* 接続エラー */
sprintf ( gMBuf, cCMNCONERR, cMYNAME, chk );
CMNsetMessage ( cCMN_MAINTENANCE_MSG, gMBuf );
exit(-1);
}

EXEC SQL BEGIN DECLARE SECTION;
int CountOfData; /* データ数 */
EXEC SQL END DECLARE SECTION;

EXEC SQL SELECT
COUNT(*)
INTO :CountOfData
FROM CMN_TD_CRE
;
if( sqlca.sqlcode != 0 ) { /* データベース参照失敗 */
printf("データベース参照失敗!\n");
exit(1);
}
printf("CRE_DT = %d\n",CountOfData);
}

590 :デフォルトの名無しさん:2001/08/22(水) 01:43
>>589
スレ違い。

591 : :2001/08/22(水) 03:16
プログラミングって何が楽しいの?

592 :デフォルトの名無しさん:2001/08/22(水) 03:18
>>591
コピペ氏ね

593 : :2001/08/22(水) 03:22
ごめん。

594 :デフォルトの名無しさん:2001/08/22(水) 03:28
c言語ってデフォルト引数ってありましたっけ?

595 :デフォルトの名無しさん:2001/08/22(水) 03:29
>>594
ない。

596 :594:2001/08/22(水) 03:36
ありがとうございます.

597 :585:2001/08/22(水) 14:10
>>586 >>587 >>588
そうですか、貴重な意見どうもありがとうございます。
自分の場合も、どっからか拾ってきて使う、というのが多いです。
(イイトコダケ、ツマミグイスルノハムズカシイ)

598 :デフォルトの名無しさん:2001/08/22(水) 20:43
16進数→10進数変換
できる関数とかあります?

599 :デフォルトの名無しさん:2001/08/22(水) 20:52
>>598
strtol 関数を基数16で呼ぶ

600 :デフォルトの名無しさん:2001/08/22(水) 20:57
>>599
16進数「文字列」ならね。

>>598
アホ。

601 :デフォルトの名無しさん:2001/08/22(水) 21:02
CとC++はどっちがイイ?

602 : :2001/08/22(水) 21:07
アルゴリズムの決定本教えてくれ。

603 :デフォルトの名無しさん:2001/08/22(水) 21:08
>>602
マルチポストですか?

604 :デフォルトの名無しさん:2001/08/22(水) 21:14
>>601
C が使いこなせない人間に C++ は使えない。まず C, そしてオブジェク
ト指向分析・設計を勉強して、最後に C++。

605 : :2001/08/22(水) 22:22
>>604
C++の方が安全性に優れてるんだから、そうとも言えんよ。
実際、C++をやるのにCを勉強するべきかは意見が分かれる
ところ。

606 :デフォルトの名無しさん:2001/08/22(水) 22:42
>>605
C++ の方が「安全」というのは、どうかなぁ。

別のスレッドでも書きましたが、例外が絡むと簡単にリークが発生しえ
ますし、メンバ変数にポインタが絡む場合、デフォルトで作成されるコ
ンストラクタや = 演算子の挙動を把握していないと簡単にメモリを破
壊します。

C は文字列操作、キャスト、ポインタ演算に絡んで落とし穴があります。
C++ は文字列操作は std::string なり CString を使うことで落とし穴
を避けられますが、キャストとポインタ演算は相変わらずですし、加え
て例外や暗黙で生成される関数、型変換、デフォルトパラメタの再定義、
非仮想関数の再定義と、落とし穴満載です。

あと実際のコーディングに関してですが、既存の C++ のソースコード
は大半が C 言語流のプログラミングスタイルと C++ 言語流のスタイル
のハイブリッドです。C 言語で書かれたソースコードを読み書きできな
いと、現実にはほとんど役に立たないと思います。

607 :デフォルトの名無しさん:2001/08/22(水) 22:56
C++はCの上位互換だからC++だけやれば十分だよ。C++的Cを最初からやれば
いいだけ。Cからやる必要全く無し。

608 :デフォルトの名無しさん:2001/08/22(水) 23:09
C++作ったおっさんも、確か著書でC言語から勉強する必要ないと
思うって言ってたな・・・

609 :デフォルトの名無しさん:2001/08/23(木) 00:49
入門の段階ではC++の方が簡単でしょ。

610 :デフォルトの名無しさん:2001/08/23(木) 00:53
C歴2ヶ月ほどの者ですが、
今、csv形式のファイルからhtml形式のファイルを作るプログラムと思っています。
元のファイルのカンマ(あるいはタブ)があったら、そこにテーブルタグを入れようと
思って、if文で分岐を作り、カンマ・改行・その他で動作を分けようとしたのですが
思いどおりに動いてくれません。どこがいけないのでしょうか??

以下ソース(sは文字列を格納する変数、fin・foutはそれぞれ読み込み・書き込み用
ファイルのポインタです。)

while(getc(fin) !=NULL){
if(s == "\t"){
fputs("〜略〜">\n",fout);
}
else if(s == "\0"){
fputs("〜〜略〜〜">\n",fout);
}
else{
fputs(s,fout);
}
}

611 :sage:2001/08/23(木) 00:59
>>610
Cの文字列の扱いを理解していないと思われ。

索引のきちんとついてる本を買って、
「文字列」「文字コード」あたりを調べてみなさい。

612 :デフォルトの名無しさん:2001/08/23(木) 01:00
>>610
タブやNULL文字は文字列ではないので、
シングルクォートで囲まないといけないのでは?
俺も初心者なので間違ってたらスマソ。

613 :610:2001/08/23(木) 01:05
>>611
明日あたり調べてみたいと思います。

>>612
なるほど。でも、それでやってもタブと改行にマッチしなかった(はず)
の場合でも出力されないんです(;´Д`) これいかに??

614 :610:2001/08/23(木) 01:09
ついでにもう一個。
fgetsで拾ってきた文字列の中の任意の文字列を他の文字列に
置き換える事って可能ですか??ちなみに上のはgetc使ってます。

615 :デフォルトの名無しさん:2001/08/23(木) 01:14
>>614
もちろんできます。Cで出来ないことはどういう手段を使ってもできません。

616 :sage:2001/08/23(木) 01:14
>>614
できるよ。

ついでに、君の持っている参考書でいいから、
文字列とポインタのことが書かれているページを
しっかり読み直しときなさい。

617 :デフォルトの名無しさん:2001/08/23(木) 01:18
>>610

(>>612に加えて)

>if(s == "\t"){
としていますが、sはどこで代入されていますか?

618 :デフォルトの名無しさん:2001/08/23(木) 01:24
>>617
つっこみどころが多すぎるから、
放置でいいよ..

619 :デフォルトの名無しさん:2001/08/23(木) 01:39
BCC55のコンパイラのエラー文で
左辺値が必要
ってどういう意味?

620 :デフォルトの名無しさん:2001/08/23(木) 01:43
>>619
数学の教科書読めよ。

621 :610:2001/08/23(木) 01:47
>>617
スマソ、代入文忘れてました(;´Д`)
というわけで書き直してみたんですけど、

while((s=getc(fin)) != NULL){



ってのは無理なんですか??

622 :デフォルトの名無しさん:2001/08/23(木) 01:49
>>619
ヘルプぐらい嫁よ。

623 :デフォルトの名無しさん:2001/08/23(木) 01:50
>>607
そうか。

私の周りでは C++ で閉じてるプロジェクトはほとんどなくて、Win32
アプリケーションなら Win32 API を直に呼び出す部分があったり、過
去の資産が C ライブラリのままで C++ のラッパクラス作ってないモノ
も多いです。

それで、C++ プログラマといっても結局 C っぽいコードも読み書きで
きないと仕事にならないのですが、世の中は、そういう時代じゃないの
かな。

624 :612:2001/08/23(木) 01:53
>>610
これでどうだろうか。
while ((s = fgetc(fin)) != EOF) {
if (s == '\t')
fputs("〜略〜>\n", fout);
else if (s == '\n')
fputs("〜〜略〜〜>\n", fout);
else
fputc(s, fout);
}

ネタじゃないよね…?

625 :デフォルトの名無しさん:2001/08/23(木) 02:00
>>623
意味不明だが、C++はCを含んでるんだぞ?
なんだCっぽいコードってーのは。クラスを使うだけがC++じゃねーぞ?

626 :デフォルトの名無しさん:2001/08/23(木) 02:01
>>619
左辺値は代入可能な変数ですか?
たとえば
int a,b;
&a = &b;
とかすると
左辺値が必要というエラーが出ます。

627 :610:2001/08/23(木) 02:02
>>624
> error C2106: '=' : 左のオペランドが、左辺値になっていません。

って返されちゃってコンパイルできないです。(whileの行)

もちろんネタじゃないんで、もう少しおつきあい下さい。

628 :デフォルトの名無しさん:2001/08/23(木) 02:04
>>626
*(&a)=(int)&b ならアドレスが入るんじゃない?
そうしたら *(int*)a で bの中身が参照できる?
文句言われたら(void)を挟めばいいよね。

629 :デフォルトの名無しさん:2001/08/23(木) 02:05
>>625
>>623の書き方が悪かったんだろうけど、
C++では一般的だがCではそれしか使えない書き方ってのがある。
そこんとこだと思われ。

630 :デフォルトの名無しさん:2001/08/23(木) 02:07
ありゃ? これC++?
文字の比較は==じゃできないでしょ?Cは。
strcmpとか使わないとまずいんじゃないの?
初心者だから間違ってたらスマン

631 :デフォルトの名無しさん:2001/08/23(木) 02:08
fgetcとfgetsの違いに気づくまで放置しろって!

632 :デフォルトの名無しさん:2001/08/23(木) 02:09
>>629
なんなんだ「C++では一般的だがCではそれしか使えない書き方」って。
今時Cコンパイラなんて無いってことは分かってるよな?

633 :デフォルトの名無しさん:2001/08/23(木) 02:09
>>630
ひっこめ。

>>610
sの型教えて。

634 :デフォルトの名無しさん:2001/08/23(木) 02:09
>>630
*文字*の比較ならできるよ。単なる整数値だから。

635 :デフォルトの名無しさん:2001/08/23(木) 02:10
>>634
なるほど。ひっこんどきます(^_^;

636 :デフォルトの名無しさん:2001/08/23(木) 02:10
>>628
>>626は単なる例です。
>>619を読んだだけでは詳細はわからないので
あんなことをすると「左辺値が必要です」っていうエラーがでるので
同じようなことをしていませんか?
っていう意味です。

637 :デフォルトの名無しさん:2001/08/23(木) 02:13
>>627
ヘルプでキーワードでC2106を引けよ。

638 :デフォルトの名無しさん:2001/08/23(木) 02:17
>>633
sの型はchar型です。
getcで一文字づつ拾ってって比較ってやり方でできますよね??
それが楽なやり方かどうかは別として。

639 :633:2001/08/23(木) 02:18
int じゃないの?

640 :612:2001/08/23(木) 02:22
sがポインタになってるとか…。

641 :610:2001/08/23(木) 02:24
はい、intじゃないです。
今きづいたんですが、左辺がポインタになってなかったっすね(;´Д`)
でもまだ期待どおり動いてくれないんで、精進してみます。
厨房な質問につきあって下さったみなさん、本当にありがとうございました。
またそのうち来るかもしんないっす・・・。

642 :633:2001/08/23(木) 02:25
まさか関数名とか?

643 :633:2001/08/23(木) 02:26
>>641
まずいって・・・

int fgetc( FILE* );

だからね。
ポインタに代入しちゃダメだよ。

644 :デフォルトの名無しさん:2001/08/23(木) 02:27
>>641
ポインタでなくていいんですけど・・・
intにする必要はあるが。

645 :610:2001/08/23(木) 02:35
そのうちって意外と早かったみたいっすね(;´Д`)
はやとちりスマソ。
while(getc(fin) !=NULL){

while((*s = getc(fin))!=EOF){
にしてみたら近い動きしたもんで・・・。

646 :デフォルトの名無しさん:2001/08/23(木) 02:39


647 :デフォルトの名無しさん:2001/08/23(木) 02:40
>>623
Cのライブラリの知識が必要になったら勉強すりゃいいじゃん。
みんながみんな必要になるわけでもないし。
Cっぽいコードってのがいまいちわからんけど、例えばC++
使う上でC言語の知識が必要なら、それはC++の解説書にも
書いてあるべきことでしょ。逆にC++使う上で不必要なC言語
の知識もあるわけで、C++やるのにC言語からってのはおかしな
話だよ。C++の勉強とは、C言語から拡張された部分だけの勉強で
はないのですよ?あくまでC++を習得したいのであればC++を
初歩からやればいいし、C言語を習得したいor仕事で必要ならC言語
を勉強したらよいのでは?

648 :!=623:2001/08/23(木) 02:43
>>647
でもさぁ、C++の参考書ってCがわかってる人
(Cをかじったことのある人)向けに書いてあるのばっかじゃない?

649 :デフォルトの名無しさん:2001/08/23(木) 03:20
>>648
同意。Cからやらないと意味わからないやつばっかり。
必要なCの知識もみっちり教えてくれる親切なC++本ないのかな

650 :デフォルトの名無しさん:2001/08/23(木) 03:23
カンマが検出されるまで一文字ずつ調べるという方法では
2バイト文字を使ったときにそこで偽カンマを検出することがあるけど
なんかいい対処方法無いですか?
自分は610ではないです、一応。

651 :デフォルトの名無しさん:2001/08/23(木) 03:24
>>649
そもそも「C++ を使うと不要になる C の知識」ってあるのか?

652 :デフォルトの名無しさん:2001/08/23(木) 03:38
>>651
Cの文字列の扱いは忘れてしまいたい。(T_T)

653 :610:2001/08/23(木) 03:39
>>650
漏れも同じとこで詰まってます(;´Д`)
fscanfだと比較できないし、getcで得ると2バイト文字対応できないし・・・。
どなたかいい解決方法ないですか??

654 :デフォルトの名無しさん:2001/08/23(木) 03:40
>>651
本末転倒だな。

655 :デフォルトの名無しさん:2001/08/23(木) 03:43
>>651
setjmp()

あとはポインタを直接いじってリスト操作、とかの機会は減るね。
減るだけでなくなるわけじゃないので、分かってないとダメだが。

>>652
VC++ だと char[] に加えて CString, CComBSTR, _bstr_t とか
増えたり。笑えん。

656 :デフォルトの名無しさん:2001/08/23(木) 03:45
>>653
http://www.people.or.jp/~fussy/argo7-4.htm

657 :633:2001/08/23(木) 03:47
>>650
2バイト文字の判定すりゃいいじゃん。

658 :633:2001/08/23(木) 03:48
わりい・・
656が出してたね・・・

659 :651:2001/08/23(木) 03:50
>>654
書き方がまずかったか? 意味が良くわからんので、補足希望。

660 :610:2001/08/23(木) 03:58
>>656-657
ありがとうございます、とりあえずそのページでもよく読んでみたいと思います。

661 :デフォルトの名無しさん:2001/08/23(木) 08:20
オブジェクトを使うだけならCを詳しく知る必要は、
無いかもしれない。しかし、低級なクラスライブラリ
を作るようなことをするには、Cは必須。

662 :デフォルトの名無しさん:2001/08/23(木) 12:16
>>661
> 低級なクラスライブラリを作るようなことをするには、Cは必須。
そうだね。そして、低レベルの処理をする場合はアセンブラは必須だね。

663 :デフォルトの名無しさん:2001/08/23(木) 18:09
為になるC言語ソースのあるページない?
大きいサイトでも小さいサイトでもいいっす。

664 :デフォルトの名無しさん:2001/08/23(木) 18:10
為にならなくても実用的なのも教えてほしいっす。

665 :デフォルトの名無しさん:2001/08/23(木) 18:15
>>663-664
俺は勉強するなら本のほうがいいと思うが、一応
http://www.inet-lab.org/ted/program/progdetail.html

666 :デフォルトの名無しさん:2001/08/23(木) 18:42
>>665
どうもどうも。

漏れは最近こんなページにちょっと興味が

http://www.cpluspluscode.com/#categories
http://www.freecode.com/
http://www.cprogramming.com/
http://www.devx.com/sourcebank/

667 :デフォルトの名無しさん:2001/08/23(木) 19:01
中級、上級者用のサイトが知りたいage

668 :_:2001/08/23(木) 21:50
攻撃コードのあるページない?
漏れは最近こんなページにちょっと興味が
http://community.core-sdi.com/~gera/InsecureProgramming/

669 :デフォルトの名無しさん:2001/08/23(木) 21:57
>>667

ブラクラ

670 :デフォルトの名無しさん:2001/08/23(木) 22:44
>>661-662
何をそんなにムキになっているのか分からんが。いきなり C++ やって
挫折するも良し、C やって遠回りしたと後悔するも良し。これから勉強
するヤツには好きにやらせておけば良いじゃない。

671 :デフォルトの名無しさん:2001/08/23(木) 22:53
>>670
同意。

おれはCやってC++勉強中だけど、
なにげにCの知識かなり役に立ってる。

でも、C++だけでもよかったかなってとこもあるし、
やっぱり好きにしろって感じかな?


つーか、何か必要なときは調べればよし

672 : :2001/08/23(木) 23:14
だから「プログラミング言語C++第3版」でも、そこは議論が分かれる
ところと言っているのだ。

673 :デフォルトの名無しさん:2001/08/23(木) 23:25
>>669
( ゚Д゚)ハァ・・・

674 :デフォルトの名無しさん:2001/08/23(木) 23:32
>>671
分からんやつだな。だからC++ってのはCを含んでんだよ。C++にないCってのは
ほとんどANSI以前のC、過去の遺物ってやつだってばさ。

675 :エクソシスト:2001/08/23(木) 23:35
#include <stdio.h>

void fnc(const char*);
char *p;

void main(){
char *Xa="abcdefghijkl";
fnc(Xa);
}

void fnc (const char* Xa){
while( *Xa != NULL ){
p++;Xa++;
*p=*Xa;
printf("%s",p);
}
}
----------------------------------------
文字列のコピーをしたいのですが、上記のようにやると
変なエラーがでます。初歩な質問かと思いますが、
どのようにすれば片一方のpにコピーできるようになるでしょうか?

676 :671:2001/08/23(木) 23:37
>>674
そんなんわかってるよ・・・

C++からはじめてもできないことないでしょ?

677 :デフォルトの名無しさん:2001/08/23(木) 23:43
>>676
Cなんかやる必要ねーってんだろがゴラァ。

678 :デフォルトの名無しさん:2001/08/23(木) 23:43
>>675
ポインタpがどこを指していると思ってるんだ?

679 :671:2001/08/23(木) 23:43
>>675
>printf("%s",p);
フォーマットが間違ってる。つーか危ない。
正しくは

printf("%c",*p);

それと、NULL != '\0' だから

>while( *Xa != NULL ){
while(* Xa != '\0' ){


あと、 p はfncの ローカルの配列にしたほうがいい。
メモリ領域破壊してる。



つーか、strcpy使えって。

680 :デフォルトの名無しさん:2001/08/23(木) 23:46
>>671
君こそムキになってないかね。
指名されて批判されたと勘違いしたのかな?
一意見として書き込んだだけだが。

681 :680:2001/08/23(木) 23:48
おっと間違いた。
671->>670ね。

682 :671:2001/08/23(木) 23:49
>>675
ごめん。
コピーするやつなのに、結果返さないとね。


/*
p : コピーされる領域のポインタ
cp: コピーもとの文字列のポインタ
*/

int my_strcpy( char* p, const char* cp ){
while( cp != '\0' )
*(p++) = *(cp++);
*p = '\0';
return 0;
}

683 :エクソシスト:2001/08/23(木) 23:51
>>679 671
さん、ありがとうございます。指摘部分を変更して実行してみると。
b@
と文字化けしています。どうしてなんでしょうか?

-----------------------------------
#include <stdio.h>

void fnc(const char*);
char *p;

void main(){
char *Xa="abcdefghijkl";
fnc(Xa);

}
void fnc (const char* Xa){
p=&Xa;
while( *Xa != '\0' ){
p++;Xa++;
*p=*Xa;
printf("%c",*p);
}
}

684 :エクソシスト:2001/08/23(木) 23:52
>>682
時間差すみません。

685 :671:2001/08/23(木) 23:53
>>683
そうか・・・
ネタだったのか・・・
鬱だ・・・

686 :670=655:2001/08/24(金) 00:00
>>680
指名された覚えはないけど。誰かと勘違いしてない?

っつーか、すこし冷静になってくれ。熱くなりすぎ。

687 :エクソシスト:2001/08/24(金) 00:06
>>671 ありがとうございます。いろいろやってみました。
#include <stdio.h>

void fnc(char*,const char*);

void main(){
char *Xa="abcdefghijkl";
char *p;
fnc(p,Xa);
printf("%s",p);
}

void fnc (char *p, const char* Xa){

while( *Xa != '\0' )
*(p++) = *(Xa++);
*p= '\0';
return 0;
}
----------------------------------------------------
上記ではきちんとコピーできますが、へんなエラーメッセージがでるのはどうして?
printf("%s",p);
をコメントアウトすると、エラーがでないので、こいつだと思いますが。

あと、下のは上記のプログラムと同じ働きをするはずですが、エラーがでます。
なぜなんでしょうか?
------------------------------------
#include <stdio.h>

void fnc(const char*);
char *p;

void main(){
char *Xa="abcdefghijkl";

fnc(Xa);
printf("%s",p);
}

void fnc (const char* Xa){

while( *Xa != '\0' )
*(p++) = *(Xa++);
*p= '\0';
return 0;
}

688 :デフォルトの名無しさん:2001/08/24(金) 00:18
何がやりたい、メモリ破壊プログラムか

689 :エクソシスト:2001/08/24(金) 00:19
>>685
ネタじゃないよ、更新したら新しくレスが付いていただけですから。
ご勘弁を。

690 :671:2001/08/24(金) 00:24
まず、ポインタについて理解してください。

char*p;

これは、このままでは使い物になりません。
なぜなら、宣言されただけじゃ値は不定だからです。
(staticとかはこの際省く)

だから、配列(など)の最初のアドレスを代入してください。
または、メモリを確保してください。

#include <stdio.h>

int fnc(char*,const char*);

int main( void ){

char *Xa="abcdefghijkl";
char *p;
char buf[1024]; /*値は、適当。*/

p = buf; /* 配列の先頭のアドレスを代入 */

fnc(p,Xa);
printf("%s",p);

return 0;

}

int fnc (char *p, const char* Xa){

while( *Xa != '\0' )
*(p++) = *(Xa++);
*p= '\0';
return 0;
}


わかりました?

691 :エクソシスト:2001/08/24(金) 00:25
>>688
メモリ破壊好きでやってませんよ。(泣
任意文字列「abcdefghijklmnopqrstu」
から(任意文字)例g から(任意個)例3文字までを取得 ghi
とするプログラムを書きたいんですが、どうも>>687
下記エラー理由が分からないと前に進まない気が、。

692 :エクソシスト:2001/08/24(金) 00:26
>>691
ありがとうございます。さっそく見てみます。

693 :デフォルトの名無しさん:2001/08/24(金) 00:51
>>690
初心者相手に丁寧な解説で、好感が持てるけど…
ちょっとおかしなところがあるんで軽くツッコミ。
>*(p++) = *(Xa++);
これだと双方インクリメントしてから中身を代入することになる。
(*++p = *++Xa; と同じ。つまり先頭文字はコピーされない。)
*p++ = *Xa++; とするべき。
あと
>return 0;
これはいらない。 void func でいいと思う。
無条件に0を返されたって、使い道ないし。

694 :エクソシスト:2001/08/24(金) 00:53
>>690
>char*p;
>これは、このままでは使い物になりません。
>なぜなら、宣言されただけじゃ値は不定だからです。
親切にどうもありがとうございます、長くつっかえていたものが取れた気分です。感謝
--(test1.c)------------------------------------------------
#include <stdio.h>

void fnc(char*,const char*);

void main(){
char *Xa="abcdefghijkl";
char *p;
char buf[1024];

p=buf;

fnc(p,Xa);
printf("%s",p);
return 0;
}

void fnc (char *p, const char* Xa){
while( *Xa != '\0' )*(p++) = *(Xa++);

*p= '\0';
return 0;
}
------------------------------------
---test2.c----------------------------------
#include <stdio.h>

void fnc(const char*);//(1)
char buf[1024]; //(2)
char *p; //(3)

void main(void){
char *Xa="abcdefghijkl";

p=buf;

fnc(Xa);
printf("%s",p);
return 0;
}

void fnc (const char* Xa){
while( *Xa != '\0' )*(p++) = *(Xa++);

*p= '\0';
return 0;
}
--------------------------------------
test1.cでは出来ました。(うるうる)あと、少し欲をいえば
test2.cでは (1)〜(3)がtest1.cとの相違点です。
これを実行させると、空白しか返ってきません、なぜなんでしょうか?

695 :sage:2001/08/24(金) 00:54
>>692
なんでもいいんだけどさ、
変なエラーとか言う前に、エラーの意味調べる癖つけた方がいいぞ。

それでもわからないときにまたここに来なさい。

696 :エクソシスト:2001/08/24(金) 01:12
#include <stdio.h>

void fnc(const char*);//(1)
char buf[1024]; //(2)
char *p; //(3)

void main(void){
char *Xa="abcdefghijkl";

p=buf;

fnc(Xa);
printf("2:%s:",p);

}

void fnc(const char* Xa){
int i;
printf("1:%s,%s:\n",Xa,p);
i=0;
while( *Xa != '\0' ){
*p++ = *Xa++;i++;
printf("1:%d,%s,%s\n",i,Xa,p);
}
*p= '\0';

return 0;
}
---------------------------------
C:\>tes2
1:abcdefghijkl,:
1:1,bcdefghijkl,:
1:2,cdefghijkl,:
1:3,defghijkl,:
1:4,efghijkl,:
1:5,fghijkl,:
1:6,ghijkl,:
1:7,hijkl,:
1:8,ijkl,:
1:9,jkl,:
1:10,kl,:
1:11,l,:
1:12,,:
2::
C:\>
なんでコピーされないんだろう?

697 :デフォルトの名無しさん:2001/08/24(金) 01:16
とある計算を行い、答をdouble型で返す関数を作ったところ

-1.#IND00e+000

のような不可解な値が返ってきました
原因に心当たりのある方はアドバイスをいただけないでしょうか?
素人くさくてスイマセン

ちなみに、ちゃんとした値が返ってくるコトも当然あります
VC++6を使ってます〜

698 :sage:2001/08/24(金) 01:18
p=buf;
printf("%x\n", p);
fnc(Xa);
printf("%x\n", p);
printf("2:%s:",p);

を試してみなさい。

699 :693:2001/08/24(金) 01:22
>>693 事故レス
え…偉そうに書いてまちがっとる…。
>*(p++) = *(Xa++);

>*p++ = *Xa++;
と同じで、
>*++p = *++Xa;
とはならんのね…。エラソウニイッテゴメンネ >>690

700 :671:2001/08/24(金) 01:26
>>693
ちょいと。
>これだと双方インクリメントしてから中身を代入することになる
そんなことはないですよ。
構文が実行されてからインクリメントされるはずです。

701 :エクソシスト:2001/08/24(金) 01:32
>>698 ありがとうございます。
そっか、
p=buf;
がPublicで、アドレス指定されていない為に、アドレスが違ってきて空白なんすね?(多分)
main と fnc それぞれに有効に任意のアドレス指定する方法ってどうすのですか?

702 :デフォルトの名無しさん:2001/08/24(金) 01:39
>>700
んなわけねーだろ。

703 :デフォルトの名無しさん:2001/08/24(金) 02:39
>>701
698のが十分なヒントになっていると思ったが、そうでもないみたいなので、
test1.c, test2.cのそれぞれのmain()の
  printf("%s",p);

  printf("%s",buf);
として試してみなさい。bufへのコピーができていることが分かるはず。
あとは698のヒントをよく理解すること。pがfnc()復帰後どこ挿してるのか。

704 :じみー:2001/08/24(金) 03:12
Cというよりアルゴリズムの問題でしょうが
次のようなプログラムを書こうとしたのですが
例えば8月23日の8:00から9月4日の間の経過時間を出す
自分で考えたのですが月をまたがるとややこしく
どうしても良い方法が思いつきません。
どうかヒントでも何でも良いのでお力をお貸しください。

705 :じみー:2001/08/24(金) 03:18
方法がわかりました
くだらない質問を書いてしまいすいませんでした。TT

706 :デフォルトの名無しさん:2001/08/24(金) 03:31
>>705
自分で解決できたなら、その方法を書きなさい。
2ちゃんでマナーを言っても仕方ないけど、
普通のところはそれがマナーとされている。

707 :671:2001/08/24(金) 05:10
>>エ糞死すと

CはJavaとは違う。

直接、メモリを扱うことを常に頭に入れてください。

つか、本読め。

>>693

忙しかったんで、読めてなかった・・・

スマソ

708 :デフォルトの名無しさん:2001/08/24(金) 09:03
>>707
それ、以前。(後半)

709 : :2001/08/24(金) 19:31
俺はまだ初心者だが、
*p++これとか後置型だからなにやら処理された後
インクリメントされるのと違うんですか??

710 :名無しさん:2001/08/24(金) 19:50
初めてのプログラミング言語としてC言語を勉強しようと思うのですが
C専門の書籍も買おうと思っていますが、C MAGAZINEのバックナンバーを
4月号からまとめて購入するって言うのもありでしょうか?

711 :デフォルトの名無しさん:2001/08/24(金) 20:02
Cmaga買うより専門の入門書買ったほうがずっといい

712 :デフォルトの名無しさん:2001/08/24(金) 20:07
>>697
> 1.#IND00e+000

浮動小数点数として「不定」な値。
例えば log(-1.0) などの結果。

713 :名無しさん:2001/08/24(金) 21:02
C MAGAZINEて駄目?

714 :デフォルトの名無しさん:2001/08/24(金) 21:04
>>713
じっくり読んでみよう。

Cマガを語る
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=992194388

715 :名無しさん:2001/08/25(土) 00:55
う〜ん、どうしよう。。。
ドキュソな自分にとっては4月号からまとめて買うのもありかな。

716 : :2001/08/25(土) 01:41
CマガってC/C++以外の記事の方が多くないかい?

717 :デフォルトの名無しさん:2001/08/25(土) 01:43
C言語から始めたが、Cマガ読んだことないよ。

718 :デフォルトの名無しさん:2001/08/25(土) 13:08
>>716
CマガのCはComputerのCってことになってるんだYO。

719 :デフォルトの名無しさん:2001/08/25(土) 13:14
Windows NT MagagineはNew Technologyだっていってたけど
Win2KでたらWindows 2000 Magagineに改名したYO

720 :デフォルトの名無しさん:2001/08/25(土) 13:47
age

721 :デフォルトの名無しさん:2001/08/25(土) 14:02
>>719
そのままやんけ。

722 :デフォルトの名無しさん:2001/08/25(土) 14:42
きっとそのうちXPマガジンになるね

723 :デフォルトの名無しさん:2001/08/25(土) 15:27
#include <stdio.h>
struct pen
{
int aaa;
char bbb;
int ccc;
};
main()
{
int count;
struct pen p[1], *point;
point = p;

p[0].aaa = 1;
p[0].bbb = 'a';
p[0].ccc = 10;

p[1].aaa = 2;
p[1].bbb = 'b';
p[1].ccc = 20;


for(count = 0; count <= 1; count++){
printf("p[%d].a = %d\n", count, p[count].aaa);
printf("p[%d].b = %c\n", count, p[count].bbb);
printf("p[%d].c = %d\n", count, p[count].ccc);
printf("p[%d].a = %d\n", count, point->aaa);
printf("p[%d].b = %c\n", count, point->bbb);
printf("p[%d].b = %d\n", count, point->ccc);
point++;
printf("\n");
}
return 0;
}
実行結果:
p[0].aaa = 1
p[0].bbb = a
p[0].ccc = 10
p[0].aaa = 1
p[0].bbb = a
p[0].ccc = 10

p[1].aaa = 1
p[1].bbb = b
p[1].ccc = 20
p[1].aaa = 1
p[1].bbb = b
p[1].ccc = 20

セグメントエラー(coreを出力しました)

何故 p[1].aaa が 1 になるのか、core を吐いてこけるのか、
分かりません。教えてください。

724 :デフォルトの名無しさん:2001/08/25(土) 15:36
>>723
p[1].aaa = 2;
p[1].bbb = 'b';
p[1].ccc = 20;
でメモリー破壊起こしているから何が起こるか誰も予想がつかんよ。
いろいろな環境、異なるベンダで試してみぃ。

725 :デフォルトの名無しさん:2001/08/25(土) 16:29
>>724
ひけらかし男爵!!

726 :デフォルトの名無しさん:2001/08/25(土) 17:05
>>725
ネタは sage で書けよ。しかも面白くないし。

727 :デフォルトの名無しさん:2001/08/25(土) 17:13
struct pen p[2], *point;

にすればいいのでは?
pen 構造体ひとつ分しか確保してないから問題発生かと。

728 :デフォルトの名無しさん:2001/08/25(土) 17:19
>>723
どう考えてもネタ。

>セグメントエラー(coreを出力しました)

あたりまえ。

729 :デフォルトの名無しさん:2001/08/25(土) 18:54
質問です。

char* pointer = NULL;

pointer = getenv("KANNKYOU");

pointer = crypt("hoge","aa");
とした時にこのpointerの指し示す場所は具体的に何処ですか?
コード領域でなければスタック変数上でも無いですよね?
いったい何処に??とても疑問に思いました。お願いします。

730 :デフォルトの名無しさん:2001/08/25(土) 20:23
getenvは環境変数領域上のアドレスを返すから、その内容を変更しちゃダメらしい。
OSが使ってるのを弄ったらまずいってことか。

cryptは関数自体わからないっす

731 :デフォルトの名無しさん:2001/08/25(土) 20:49
>>709
心配するな。キミの言う通り。
693が間違ってるだけ。

732 :デフォルトの名無しさん:2001/08/25(土) 22:20
>>730
OSによるけど、フツーのUNIX系なら弄っても問題ないよ。自プロセスが困るだけで。

733 :デフォルトの名無しさん:2001/08/25(土) 23:06
C++ってCのスーパーセットなの?

734 :デフォルトの名無しさん:2001/08/25(土) 23:07
>>733
ネタ?

735 :デフォルトの名無しさん:2001/08/25(土) 23:26
C初心者です。最近数値計算をCで作らなきゃならなくて
色々勉強してるものです。
unsigned int a:

として、a に正の大きな値を入れます。それから
printf("a=%ld\n",a);
ってやると、−xxxxx
というように負の値として表示されてしまいます。
MSBを符号ビットとして扱うかどうかという問題
だというとこまではわかったのですが、上のように
大きな正の値をそのまま表示させるにはどうすれば
いいでしょうか?
また計算機は内部で unsigned int で用意された
a をどう扱ってるのでしょう?
質問内容まとまりなくてスマソ。

736 :デフォルトの名無しさん:2001/08/25(土) 23:28
%u

737 :729:2001/08/25(土) 23:30
レスありがとうございます。
getenvの事は良くわかりました。
ではcryptはどうなんでしょうか?
どこに文字列を収納しているのですか?

738 :デフォルトの名無しさん:2001/08/25(土) 23:32
ライブラリが持っている静的領域。

739 :729:2001/08/25(土) 23:38
あ、当たり前の事だった・・・・・

サンキュー

740 :デフォルトの名無しさん:2001/08/25(土) 23:44
>>733
まあ、大体そんな感じ。

741 :デフォルトの名無しさん:2001/08/25(土) 23:48
>>733
>>740も「大体」と言ってるように、完全なスーパーセットではない。
『プログラミング言語 C++』の付録Bあたりを読んでくれ。

これが最後の書き込みになっちゃうのかな…。

742 :735:2001/08/25(土) 23:57
>>736
printfの問題だったんですね。
マニュアルあたりますです。どうもです。

743 :デフォルトの名無しさん:2001/08/26(日) 00:29
てst

744 :デフォルトの名無しさん:2001/08/26(日) 00:51
mallocで割り当てられたメモリサイズを知る方法ってありますか?

char c1[100],*c2;
c2 = malloc(200);

としたとき、c1はsizeof(c1)で100と分かるんだけど、
c2が200であると調べるにはどうしたらいいんだか・・・

745 :デフォルトの名無しさん:2001/08/26(日) 00:56
>744
ない。mallocの呼び出し元で管理しとかないといけない

746 :デフォルトの名無しさん:2001/08/26(日) 01:04
>>744
malloc()のソース追えば分かるんじゃない?

747 :初心者A:2001/08/26(日) 01:56
C言語を始めようと思うのですが、
C言語を始めるには何のソフトが必要ですか?あと他にも何か必要な物はありますか?
習いには行かないで独学で基本だけでもマスターしようと思うのですが難しいでしょうか?

748 :744:2001/08/26(日) 02:11
了解しました。

都合のいい方法でもないかと考えてましたが甘かったようですね。

とりあえず適当に自作してみます。

749 :NOS-TAL-GIA:2001/08/26(日) 02:56
>744
見てるかどうかしりまへんが…
使っているコンパイラによりますが
"_msize()" という関数を探してみてくださいな
もしかするとあるかもね
----
無理矢理にでも知りたい場合
かなり強引でコンパイラに依存しますが
void *block=malloc(123);
の様に確保した場合
((size _t *)block)[-1]
でサイズを取得できる場合があります
古いOS等では大方この方法が効きます

750 :デフォルトの名無しさん:01/08/26 09:56
>>747
まぁWebを見る機械は持ってるようだから、i-modeとかだと厳しいかも知れんがとりあえずは検索したら?
Webで済まないなら本だな。しかし、今時Cから始めなくてもC++からやりゃいいから「プログラミング言語C++」買え。
PCを持ってたらGNU/LinuxかFreeBSDかなにかをダウンロードしてきてインストすればg++がロハで使えるよ。

751 :デフォルトの名無しさん:01/08/26 11:37
>>747
>C言語を始めるには何のソフトが必要ですか?
Cコンパイラ。「Cマガジン」という雑誌に
フリーのやつが付録としてついてたりする。(Cマガ自体は¥1,200)
>独学で基本だけでもマスターしようと思うのですが難しいでしょうか?
十分できる。本人の能力と努力次第。
本選びは以下のスレが参考になる。
http://mentai.2ch.net/test/read.cgi?bbs=prog&key=964560144

752 :デフォルトの名無しさん:01/08/26 12:19
>>750
C++からはじめるのには賛成だが、いきなり「プログラミング言語C++」
は読めんと思うぞ。プログラムのプの字も知らんのだろ。
それにC++の本て、C言語知ってる人向けのがほとんどだから、
そういった理由でC言語も少しかじる必要があるかもしれん。

>>747
プログラミングなんてもともと習うもんじゃないぞ。とにかく本やソースを読むし
かない。まー、要所要所で聞いてもかまわんが、なるべく自分で調べて自分で
コード書いてみるしかない。本にいくら金かけられるかだと思うぞ。(高いのが多いのだ)

753 :名無しさん:01/08/26 12:24
C++からはやめといたほうがいいんじゃないかなあ・・・

754 :デフォルトの名無しさん:01/08/26 13:07
>>753
その議論は、白熱するからやめといた方が。好きにやらせておきなよ。

>>750
世の中には

1. いきなりC++やるべし。
2. そのまえにC言語を押さえておいた方が良い。
3. さらにC言語の前にPASCALやっておいた方が良い。
4. C++の前にCとオブジェクト指向について勉強しておいた方が
  良い。SMALLTALKやっとけ。

とか、いろいろ薦める人間がいる。当人のプログラミング経験や環境、
目標、そして資質によって最適解は変わるから、好きな方法でやって
くれ。一つの方法で挫折したら、別の方法を試せば良いだけ。

ちなみにC++の言語仕様はCに比べると巨大で全体を把握するのは難
しい、C++のクラス周りの仕様はオブジェクト指向を理解せずに文法
面から意味を把握しようとすると挫折しがち、というのは事実。だから
C++から勉強するのが良くないかというと、それは別の話ね。

755 :デフォルトの名無しさん:01/08/26 13:52
つーか、C++やるにあたり、Cの知識はあったらちょいと楽、程度。
基本的に別物って考えてもらわないと困るザンスよ

756 :デフォルトの名無しさん :01/08/26 14:19
関数ungetc( int c , FILE *stream )についての質問です。
cをstreamに押し戻すとは、どういうことなのかイメージできません。
特に『押し戻す』という点が良く分かりません。教えて下さい。

757 :デフォルトの名無しさん:01/08/26 14:19
だから、C++に含まれないCの知識なんていらんのだって。

758 :デフォルトの名無しさん:01/08/26 14:27
>>756
もういちどゲットできるようにする。

759 :デフォルトの名無しさん:01/08/26 14:50
>>756
入力文字を保管するバッファを関数外部に用意しておいて、
ungetch(c, fp) では、c をそのバッファに保管し、
次に getch(fp) する時には、まずバッファ内の c を取り出して返し、
バッファが空になったら、入力ストリーム fp から文字を読み込む。
というようにして、あたかも
>cをstreamに押し戻す
かのように動作しているのが、ungetch()。

この際だからK&R買っては?
上記以外にも malloc() や printf() なんかの仕組みも載ってて
勉強になるよ。

760 :デフォルトの名無しさん:01/08/26 14:55
でも>>747
>C言語を始めようと思うのですが、
と言ってるんだよ。C++と言ってるんじゃないだ。
だからC++は特に意識せず、Cを習うべし。

>>756
実際にファイルに何か書くわけではないけれど、入力バッファ
にcを書き込んで、直後のgetc等ではそのcが読み込まれると言
うことだよ。(だから、バッファのサイズを超えてはungetc
出来ないと思う。)
全然意味ないコードだけど

#include <stdio.h> /*getc, ungetc*/
#include <ctype.h> /*islower, toupper */
int main(int argc, char* argvp[]){
unsigned int ch;
do{
ch=getc(stdin);
if(islower(ch))
ungetc(toupper(ch), stdin);
else
putc(ch, stdout);
}while(EOF != ch);
return 0;
}

761 :デフォルトの名無しさん:01/08/26 14:57
Cのバイブルは「プログラミング言語C 第2版」
C++のは「プログラミング言語C++ 第3版」

ただいきなり読めるかはその人による。

762 :760:01/08/26 14:58
重複れす、すんませんでした。
それに全然インデントしてないコード、お見苦しいものを
失礼しました。

763 :デフォルトの名無しさん:01/08/26 15:00
でも、今から始めるのにC++を避けてあえてC言語を
学ぶメリットなんてあるんかなぁ・・・。仕事とかで
必要ってならともかく、学生が身に付けようってんなら
C++でしょう、このご時世。
C++の準備としてCやるならともかく・・・・。

764 :デフォルトの名無しさん:01/08/26 15:06
Macで使えるフリーのCコンパイラを御存知ですか?

1つだけハーベストCというのを持っているのですが、使い方が
よく分かりません。

765 :デフォルトの名無しさん:01/08/26 15:13
>>763
絶対数で言えばC++よりCの方が使用されてる事例の方が多い。
これからのことを考慮に入れても、C++とCどっちやろうかな〜なんて
漠然と考えている程度なら、どう考えてもCを学んだ方が良い。

766 :760:01/08/26 15:14
>>763
結局は『選択の自由』とは思う。彼の動機がなんなのか
は知らないけれど、例えばrubyの本とか見てて、拡張がC
で説明されていればCに入って行くと思う。

それから、本人がC++書いてるつもりでもvalarrayとかvector
使わないでint[128]なんてやって悶々と無駄な事やってる
人見ると悲しくなってくる。

仕事になるとCのみってことあるじゃん。
そこで new int[128]が通らなくて迷う前にCはCとして
覚えていても良いかも。

767 :デフォルトの名無しさん:01/08/26 15:31
>>759
ungetch ぢゃなくて ungetc のこと聞いてんだろ。(苦笑
>>756
ungetc なら、 FILE構造体 は
そのファイルの何文字目まで読んだかを記憶する変数を持ってるから、
その値を1文字分戻すってことをやっているんだと思う。

768 :デフォルトの名無しさん:01/08/26 15:46
これつかえる?
http://developer.intel.com/software/products/compilers/pix/c_head3.gif

769 :デフォルトの名無しさん:01/08/26 15:50
>>768
言葉どおりの質問なら答えはYesだが、
行間も読むと答えはNoとなる。

770 :デフォルトの名無しさん:01/08/26 16:24
>>765
今時Cコンパイラなんてねーって。

771 :デフォルトの名無しさん:01/08/26 16:31
分かってないなー > & 770

772 :デフォルトの名無しさん:01/08/26 16:31
>>770
煽りでなければ、情報のソースを出してくれ。

773 :デフォルトの名無しさん:01/08/26 16:35
>>765は言語の話してたんだろ。それで>>770はコンパイラのこと言ってる。
もう、そこで食い違いじゃないか。

774 :デフォルトの名無しさん:01/08/26 16:36
>>772
多分C/C++コンパイラはある、とか言いそうだ。

775 :デフォルトの名無しさん:01/08/26 16:41
今はCからC++に移りつつあるよ。まだCの方が多くてもね。
CよりC++の方がすぐれた言語なんだから当然よ。

776 :デフォルトの名無しさん:01/08/26 16:41
>>775
速度は?

777 :773:01/08/26 16:42
そうするとC/C++じゃないC++専用ってあるのか

778 :773:01/08/26 16:45
>>775
その優れたと言われる新しい所ほど実際には使われてないんだよな。
というより、使う方が大変だよ。いや、使い切ってる例を知りたいよ。

779 :デフォルトの名無しさん:01/08/26 16:45
>>775
C++はこれからも少しずつ進化していくだろうね。
一方のCはというと、既に言語としては完成している。

これらをメリットと捉えるか、デメリットと捉えるか。
目的によってだいぶ変わるだろうね。

ただ一ついえることは、C++に移りつつある、なんてことは
断じてない。

780 :デフォルトの名無しさん:01/08/26 16:49
C++ができないからって必死だな…(藁

781 :デフォルトの名無しさん:01/08/26 16:52
>>776
まず、本当に速度が必要な部分てのはそうそう無い。
本当に必要な場合でもフツーアルゴリズムをまともにすれば解決する。
それでもダメな本当に必要な部分はCで書いてもダメ。

782 :773:01/08/26 17:00
ほんとそうだよ。> 780

おれはC++でどーしようか、突き詰めて考えてたら鬱になるよ。
あのSTLどうやってホントに使おうか迷うよ。
えっと、algorithmとかfunctionだっけ?
あれ本気で使って、テンプレートだなんだと組み合わせて、
あーだどーだでOOPだなんて、さっさと昔ながらのやり方した
ほうがよっぽど良いように思うよ。

783 :デフォルトの名無しさん:01/08/26 18:16
C++はCより難しいって言って、Cを初心者に勧めてる人がいるけどさ、
入門レベルではC++の方が簡単でしょ。

stringとか参照を使えば、ポインタの概念を知らなくても一通りプログラム
を組めるしさ。
もしかするとポインタ(参照)を使わざるをえないJavaより簡単かもしれない。

ポインタを理解してないで「C++を使える」とは言えないけど、ポインタやクラス
のような難しい部分は、プログラムそのもの慣れてからマスターすればいいよね。

784 :デフォルトの名無しさん:01/08/26 18:24
>>783
ポインタやクラスを理解しないでC++って学習できるかな?
少なくとも、一番最初に学ぶべきポイントをすっ飛ばしては
慣れるも何もないと思うんだけど、どうよ? ↓

785 :デフォルトの名無しさん:01/08/26 18:29 ID:Rb2DRqs2
16bit BMP画像(モノクロデータ)の作成について

Image画像(現在、UNIXのXウィンドウで表示している)をBMP画像(ウィンドウズの環境で表示)に変換するプログラムを作っているのですがうまくいきません。
Image画像はピクセル値2バイトのモノクロデータ(カラーテーブル有り)ですが、BMP画像に変換するとカラー色がついてしまいます。
原因は、カラーテーブルが使われていないようです。
(16bit以上はカラーテーブルが使われないようですが、使うことはできないのですか?)
やっぱり、BITMAPINFOHEADER構造体の指定が間違っているのでしょうか?

786 :デフォルトの名無しさん:01/08/26 18:36 ID:5xawU9/M
>>785
スレ違い。

787 :デフォルトの名無しさん:01/08/26 18:41 ID:Svg5Z2ms
>>784
ポインタやクラスの学習はC++の学習に含まれています。

788 :デフォルトの名無しさん:01/08/26 18:47 ID:Svg5Z2ms
VisualC言語なんてあるか?
MFCだってDirectXだってC++。
もう世の中C++よ。

789 :デフォルトの名無しさん:01/08/26 18:48 ID:gEEpQCFI
なんかCよりC++のレスが多いね

790 :デフォルトの名無しさん:01/08/26 18:53 ID:zzJMGaZY
あんたがたのC++の知識は分かったからここから出て行って下さい。
C++関連スレなら山ほどあるだろ。

791 :デフォルトの名無しさん:01/08/26 18:59 ID:3fbgCCw6
>>783
話が微妙にずれてるね。>>783 が書いてるのは

 プログラミング自体の初心者で「変数って何ですか」のレベルの人
 間が、変数や制御構造などの概念を理解するまで。

の話だよね。

それなら個人的には「C, C++ どっちでも大差ない、むしろ変数の型や
#include を気にせずに済む Perl でも使った方が良いよ」と思う。

むしろ問題はその先で、Hello World から実用的なプログラムを組める
ようになるまでの段差じゃないかな? C なら

「プログラミング言語C」
「エキスパートCプログラミング」

それにアルゴリズムとデータ構造を解説した本を一冊読めば、まぁ合格
というところだが、C++ だと

「プログラミング言語C++」
「Effective C++」
「More Effective C++」
「憂鬱なプログラマのためのオブジェクト指向開発講座」
「デザインパターン」

程度まで理解しないと、実用的なコードは書けないし読めない。道のり
は遠いよ。

792 :デフォルトの名無しさん:01/08/26 19:06 ID:1gb.tnZw
ぶっちゃけた話C++はC言語を含んでるんだから、C言語なんてもの
いらんのと違うか?なにもC++やるのにすべての機能知ってる必要
ないし、自分の使いこなせる部分だけひろってけばC++は十分使える
のだ。

793 :デフォルトの名無しさん:01/08/26 19:11 ID:UgfBg/w6
>>792
あのー、コンパイラの数と質がぜんぜんちがうんですけど。。

794 :デフォルトの名無しさん:01/08/26 19:12 ID:JomjwhzY
>792
それでSTLとかMFCとか使ってバンバンコード書くんだろ?
それはそれでいいんだが、Cとはやってる事が違うんだよ。

795 :デフォルトの名無しさん:01/08/26 19:21 ID:23IWzhMA
>>792
C++ コンパイラを作るのは C コンパイラを作るよりも数段難しいし、
C++ のオーバーヘッドが許容できない実行環境も存在する。

796 :デフォルトの名無しさん:01/08/26 19:25 ID:pP2VgnkE
C言語なら、オレに聞け! <5> と書いてありますが、スレ違いですか?

16bit BMP画像(モノクロデータ)の作成について

Image画像(現在、UNIXのXウィンドウで表示している)をBMP画像(ウィンドウズの環境で表示)に変換するプログラムを作っているのですがうまくいきません。
Image画像はピクセル値2バイトのモノクロデータ(カラーテーブル有り)ですが、BMP画像に変換するとカラー色がついてしまいます。
原因は、カラーテーブルが使われていないようです。
(16bit以上はカラーテーブルが使われないようですが、使うことはできないのですか?)
やっぱり、BITMAPINFOHEADER構造体の指定が間違っているのでしょうか?

797 :デフォルトの名無しさん:01/08/26 19:33 ID:bFSG.ukQ
>>795
Cで書いてたのをC++にしたからってオーバーヘッドなんて無いよ。
速度が重要な時に論理的に美しく書こうとしてCでは無かった構造(継承とか)使うと
そうもなるけどね。

798 :デフォルトの名無しさん:01/08/26 19:36 ID:1i8tqCTs
>>796
環境に依存しすぎる質問は無視されやすいから
もう少し質問をスタンダードなものに噛み砕いてから
もう一度書こう。

799 :796:01/08/26 19:48 ID:pP2VgnkE
>>798
すいません。
わかりました。

800 :デフォルトの名無しさん:01/08/26 20:13 ID:YSpgd2FA
なんか微妙にスレ違いな議論だけど、基本的に >>792 に同意だな。
C++ でいわゆるオブジェクト指向と関係ないものを揚げても

(1) 型保障リンケージ
(2) 強力な型チェック
(3) 関数テンプレート
(4) 関数オーバロード
(5) デフォルト引数
(6) 局所変数をブロックの途中で定義できる

これらの機能使うだけでも C から C++ に移行する価値は十分あると思われ。

801 :デフォルトの名無しさん:01/08/26 20:18 ID:qOGvKvts
>>797
仮想関数などのオーバーヘッドは当然ですが、それがなくてもランタイ
ム環境の仕事が増えます。

C++ では例外が飛んできたときに自動変数のデストラクタを呼ぶ必要
があるけど、そのための追跡コードとか、実行時型識別のためのコー
ドとか。

802 : :01/08/26 20:39 ID:7dBbEFak
fcloseにNULLって渡してもいいものなのでしょうか?

803 :デフォルトの名無しさん:01/08/26 21:08 ID:xAvBmpd.
>>802
マニュアルを読んでください。

804 :デフォルトの名無しさん:01/08/26 21:26 ID:y4vgeGlc
>>801
ランタイム環境の仕事ってなに?Cのコード持ってきた時に何が呼ばれるっての?
例外とかRTTIとかもCのコードなら関係ねーと思うけど。
あったとしてもゴミでしょ。

805 :800:01/08/26 21:38 ID:T2mfBZtY
>>801
例外や実行時型チェックを禁止してオーバヘッドを回避する
コンパイルオプションは大抵の処理系にあるはず。

C++ も C 譲りの効率重視の言語であることに変わりはない。

806 :デフォルトの名無しさん:01/08/26 21:49 ID:8vO3bCFk
>>805
だから C 言語なんて要らない、と?

807 :800:01/08/26 21:54 ID:T2mfBZtY
>>806
要らないとまでは言わないけど、C++ が使える環境では積極的に使うべきだろう
ということ。

808 :デフォルトの名無しさん:01/08/26 22:14 ID:8vO3bCFk
>>807
話が噛み合ってなかったか。

かなり脱線してるけど >>801 は元々 >>792 で「C++はC言語を含んでるんだか
ら、C言語なんてものいらん」と書かれていたことに対する反論なんです。主張は
次の二つ。

まずは、C++はCのスーパーセットだけど、コンパイラやランタイム環境を提供
する側からするとC++はCよりも手間がかかる。だから、実装が容易なC言語に
も意味がある。

もう一つは、C++もフルスペックで使うと、リソースが厳しい環境では性能上の
問題が出る。そこでぎりぎりまで絞ると結局Cと大差ないから、それならCでも良
いだろう(もちろん Embedding C++ って選択肢もあるけど、これが使えるかどう
かは場合によるので、素のCも選択肢に残しておいて欲しい)。

C++使える環境なら積極的に使えというのは同意だけど、C++処理系が提供さ
れていてもCの処理系ほど枯れていない場合も多いので、何でもかんでもC++と
はいかないのが現実。

809 :800:01/08/26 22:17 ID:/iAV1yEw
>>808
うん、同意です。

810 :デフォルトの名無しさん:01/08/26 22:42 ID:oX28S3OM
>>782
STLとOOPはあまり関係無いと思うが。

811 :800:01/08/26 22:55 ID:kIMgTLjk
ついでだから、もうちょっと書くと。

前言を翻すようだけど C++ 勉強する人は いきなり C++ からやるのではなくて、
やはり最初は基本として C の文法を頭に叩き込んでから C++ に入ってほしい。
C++ だけやってるやつはどうも信頼できない気がする。まぁ、単にオレが C++ の
前に C をやってたせいかもしれないけどね。

その場合でもコンパイルは(C++ が使える環境なら)型チェックが強力な C++ で
行った方がよいとは思うけどね。

ただ C も型保障リンケージくらいは導入してほしい、てのもあるのだが。

812 :デフォルトの名無しさん:01/08/26 22:58 ID:ZfNWoqwQ
>>811
型保証リンクなんて全然いらないね。ヘッダファイルを使えば済む。
それより、変数宣言だけでも好きな場所でさせてくれ。

813 :デフォルトの名無しさん:01/08/26 23:07 ID:9zk6TrLQ
ところでC言語でWindowsプログラミングってできるんですか?

814 :デフォルトの名無しさん:01/08/26 23:11 ID:oFIkZVhA
>>813
できるよ。

815 :デフォルトの名無しさん:01/08/26 23:53 ID:1sqowans
今さらだけどさ、CはC++に含まれてるからCはやんなくていい!!ってのは
やっぱ違うと思う。
C++では使えるけど、Cでは使えない事ってかなりあるんだから、
Cを知っておくに越したことはないと思う。
Cマガ投稿する時とか困らないようにな(w

816 :デフォルトの名無しさん:01/08/27 00:02 ID:n/Vu4WNc
WinAPIってC言語から呼び出す事を前提に作ってるんじゃなかったけ?

817 :デフォルトの名無しさん:01/08/27 00:02 ID:INo6JfbM
プラットホームがWindowsなら、Cから入る意味はほとんどない。
Cは、読める程度でよい。
C++が一通りできれば、Cは読める。

C++は入門には敷居が高いって声が相変わらずあるけど、
入門レベルでは、むしろC++のほうが簡単である。

818 :デフォルトの名無しさん:01/08/27 00:03 ID:INo6JfbM
>>816
ふつうC++はCのライブラリもリンクできるようになっている。

819 :デフォルトの名無しさん:01/08/27 00:06 ID:INo6JfbM
818に追加
 WinAPIは、処理系が対応すれは、言語にかかわらず呼び出せる。

820 :デフォルトの名無しさん:01/08/27 00:13 ID:/84EBIzA
>>817
プログラミング言語の習得と、各プラットホームでのプログラミング
技術の習得は別だよ。

Cプログラミングが一通りできるからといって、すぐに通信関係のプロ
グラムを書けるわけではないし、UNIX プログラマが Win32 に鞍替え
するなら Win32 に関する勉強が必要になる。

あと「入門レベル」というのが曖昧なので、もう少し詳しくかいた方が
良いと思うよ。

821 :デフォルトの名無しさん:01/08/27 00:26 ID:INo6JfbM
>>820
べつに、全てのプラットホームで全てのジャンルのプログラミング
スキルを身につける話をしてるわけじゃない。
そんなことは現実的でもないし。

Windowsでプログラムを学ぼうすると、いろいろ選択肢があるが
CかC++に限定して、どちらが良いかということなら、
Cから入るメリットはない。

822 :デフォルトの名無しさん:01/08/27 00:38 ID:/84EBIzA
>>821
SDK か MFC か、という話?

823 :デフォルトの名無しさん:01/08/27 00:47 ID:pgWYs8fA
>>816
APIの呼び出し形式はPASCAL形式なので、
C前提ってわけではない。
# int PASCAL WinMain()とかって見覚えないかな

824 :800:01/08/27 01:30 ID:gDY6k4QU
>>821
> Windowsでプログラムを学ぼうすると、いろいろ選択肢があるが
> CかC++に限定して、どちらが良いかということなら、
> Cから入るメリットはない。

う〜ん、そういういきなりGUI から入るやつが微妙に信頼できないのだよね。
Win 環境でプログラムする場合でも、まずはアルゴリズムの勉強から入るはず
でしょ。とすると、最初はコマンドラインのプログラムから入って基本を身に
つけるべきだと思う。C の標準ライブラリの使い方も知らんやつに Win API が
マトモに使えるとは、ましてや MFC が使いこなせるとは思えない。

オレの考えが古いのかもしれんが。

825 :デフォルトの名無しさん:01/08/27 01:43 ID:INo6JfbM
>>824
そういう書き方をすると、C++ってGUI用の言語みたいじゃん。
UIで、CとC++の使いどころを分けるのって認識が間違ってるよ。

826 :800:01/08/27 01:54 ID:gDY6k4QU
>>825
なるほど、そういやそうだな。ま、>>817 が Win やるなら C やらなくて
よいみたいなこと言ったから…。

ともかく C++ から入る人でも C の標準ライブラリはマスタしてほしいし、
C だけでできること、できないことをきちんと区別できるようになってほしい。

827 :デフォルトの名無しさん:01/08/27 03:07 ID:iVLWrpEM
>>823
PASCAL とついてるから C 前提ではない、というのも短絡な気が少々。
コールゲートあたりにあわせたんじゃ?とも考えられるような気もしますけど。

828 :デフォルトの名無しさん:01/08/27 04:18 ID:INo6JfbM
>>826
>なるほど、そういやそうだな。ま、>>817 が Win やるなら C やらなくて
>よいみたいなこと言ったから…。

自分の勘違いを人のせいにすんなよ。
俺は、コンパイラとか、各種の資源の状況から「Windowsでやるなら」って
言ったの。

829 :800:01/08/27 05:22 ID:OdbfeXSk
>>828
> 俺は、コンパイラとか、各種の資源の状況から「Windowsでやるなら」って
> 言ったの。

それは悪かった。それについては同意。
でも「C は読める程度でよい」とか、「入門レベルでは C++ の方が簡単」と
いう点では、やはり賛成しかねるな。

C/C++ が実行効率重視の言語であることは、C++ でその比重が多少他の要素に
移ったとは言え、依然として第一の目的であることに変わりはない。
だから入門者に、低レベルの文字列操作やポインタより先に string クラス
とかを教えることは、使えない C++ プログラマを量産することにしかならない
と思う。

入門者には練習問題として string クラスを作らせるべきだ、と言うならわかるが。

830 :デフォルトの名無しさん:01/08/27 05:35 ID:6h0gcybg
>>828
議論がかみ合ってない、っていうか議論になってないね。
Windows固有の話ならスレ違いっていうのがまずあるけど、
それを別にしても、828の主張は他人と議論するそれではない。
「入門レベルって何?」ってところも明確にしていないし、>>784,>>787
で触れられているポインタの話だって、クラスとかそこから派生させる
事を考えると必要不可欠。
「そんなのは入門レベルじゃない。」って主張するかもしれないけど、
じゃあそれがどれほどCと違っているのかはこれもまでの説明からは不明。

ただ、WindowでGUIプログラムを学ぼうとすると、C++(むしろVC++&Win方言)
が必須という点には同意。これはオレの経験からの話だけど、通信系でWinAPI
を直で叩いていた頃には、Unix上での知識&Cプログラムで十分だったけど、
Windowsが提供する枠組みの中で、特にGUI系のプログラムを作る場合には、
C++は不可避だし、>>820の言う通り、Windowsがどう動いているのかと言う勉
強は必要。ただ、これらがCに比べて簡単かと言われると同意しかねる。
(すでに>>828が言う入門レベルではないかもしれないが、、、)

まずは、「入門レベルって何?」ってところからはっきりさせて欲しい。

831 :デフォルトの名無しさん:01/08/27 09:00 ID:WSIwDgS6
両方やれよ。
どっちか片方なんてケチくさいこと言うな。

832 :デフォルトの名無しさん:01/08/27 15:52 ID:3Bh1bjXY
もしかして >>828 って、プログラミング初心者はまず VC++ / MFC を使うのが
近道、と主張してるんだろうか?

833 :デフォルトの名無しさん:01/08/28 12:37 ID:qhPN40nM
1文字:a,b,c,d,e,f,g............x,y,z
2文字:aa,ab,ac,ad,..............xx,xy,xz
3文字:aaa,aab,aac,aad,...aaz,aba,abb,acc.....azy,azz,baa,bab........xxx
......
n文字:.....

とn文字までの全てのアルファベット(小文字のみ)の組み合わせの文字列を作りたいのですがどうすればいいのでしょうか?

char Moji[] = "abcdefghijklmnopqrstuvwxyz"; //26文字

int main(int argc,char* argv[])
{
  int loop1,loop2,loop3,loop4.....loopn;

  for (loop1 = 0;loop1 <25;loop1++){
    printf("%c%c",Moji[loop1*2],Moji[loop1*2+1]);
    for (loop2 = 0;loop2 <25;loop2++){
      printf("%c%c",Moji[loop2*2],Moji[loop2*2+1]);
      for (loop3 = 0;loop3 <25;loop3++){
        printf("%c%c",Moji[loop3*2],Moji[loop3*2+1]);
        for (loop4 = 0;loop4 <25;loop4++){
          printf("%c%c",Moji[loop4*2],Moji[loop4*2+1]);
          ........
                for (loopn = 0;loopn <25;loopn++){
                  printf("%c%c",Moji[loopn*2],Moji[loopn*2+1]);
以下処理続く

と、すればできない事も無いですが明らかに賢くないですよね・・・・
その上これだと1〜n文字の文字列を作るのではなくn文字の文字列だけしか作れません。
Create_Moji(int n);のような関数をつくるには
どうすればいいのでしょうか?お願いします。

834 :デフォルトの名無しさん:01/08/28 13:22 ID:3vVKFA1E
>>833
Create_Moji(int n);
    ↓
Create_Moji(int n,char* lpStr);
で考えた方がいいのでは。

STLが使えるならstd::stringを使う。

835 :デフォルトの名無しさん:01/08/28 14:00 ID:ign9iVXY
>>833
a-zを26進数で考えればいい
26のn乗で取り得る最大値を求めその数分ループ
あとは数値を26進数に変換すればOK


こんなかんじ
int Create_Moji(int n)
{
  int i, max = pow(26, n);
  for(i = 0; i < max; i++)
    conv26(i);
}
# conv26()は宿題

836 :デフォルトの名無しさん:01/08/28 14:19 ID:W6L8C4FU
>>835
それだと、n文字のものしか作れないと思われ

837 :デフォルトの名無しさん:01/08/28 14:44 ID:ign9iVXY
>>836
> それだと、n文字のものしか作れないと思われ

void Create_Moji(int n)
{
  int i, j, max;
  for(i = 1; i <= n; i++){
    max = pow(26, i)
    fot(j = 0; j < max; j++)
      conv26(i);
  }
}

838 :デフォルトの名無しさん:01/08/28 15:26 ID:qhPN40nM
驚くほどスマートなコードですなぁ。
ありがとうございました。

これから解読(理解)させてもらいます。(w

839 :デフォルトの名無しさん:01/08/28 15:28 ID:qhPN40nM
ID変わっちゃいました。833=838です。

840 :デフォルトの名無しさん:01/08/28 16:57 ID:qhPN40nM
># conv26()は宿題

             ∩
        ∧_∧   | |   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
       ( ´Д`)//  < 先生! 宿題解りませ〜ん
      /       /     \_____________

ずっと考えてましたが解りません。a-zを26進数で考えればいい
というのは理解できましたが具体的にコーディングしようとすると・・・・
ヒープ領域を使ってみたり色々しましたが解りませんでした。
conv26()についてもう少し具体的に教えて頂けないでしょうか。
よろしくお願いします。

841 :デフォルトの名無しさん:01/08/28 17:13 ID:PsZ1SeyA
Borland C++ Compiler 5.5と
Borland C++ Compiler 5.5 環境ファイル/パス設定プログラム(http://cmaga.zdnet.co.jp/setbcc.html)を
落として設定を終えました。
…が、上記サイトの『「ちょっと」使ってみる』で行き詰ってしまいました。
OSはw2kなのですがMS-DOSプロンプトて2kには無いんですよね?
何かいい方法を教えてください。お願いします。

842 :デフォルトの名無しさん:01/08/28 17:14 ID:u7V458JA
最大、最小値、中央値を出したいのですが、わかりません。
なにが足りないのでしょうか?
教えてください。



/*sk2-11 */
#include <stdio.h>

main()
{
int score, i, j, n=0, data[100], work;

do{
printf("%d件目のデータを入力してください。(終了時は-99999)",n+1);

scanf("%d", &score);

if(score!=-99999){
data[n++]=score;
}
}while(score!=-99999);

for(i=0; i<n-1 ;i++){
for(j=i+1; j<n; j++){
if(data[i]<data[j]){
work=data[i];
data[i]=data[j];
data[j]=work;
}
}

843 :デフォルトの名無しさん:01/08/28 17:24 ID:2hRAXWEY
>>841
あるよ

844 :デフォルトの名無しさん:01/08/28 17:55 ID:G/nWj5eY
>>833
再起呼び出しではだめですか?

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

char Moji[] = "abcdefghijklmnopqrstuvwxyz"; //26文字

void make_moji( int n, int depth, char * tMoji )
{
char ttMoji[32]; //最大31文字までとしよう
int i;

if(depth>n) {
tMoji[n] = '\0';
printf("%s\n", tMoji);
return;
}
strncpy(ttMoji, tMoji, depth);
for(i=0; i<26; i++) {
ttMoji[depth-1] = Moji[i];
make_moji(n, depth+1, ttMoji);
}
}

int main(int argc,char* argv[])
{
int n;
char tMoji[32]; //最大31文字までとしよう

n=10; //10文字としよう
tMoji[0] = '\0';
make_moji(n, 1, tMoji);
return 0;
}

でもこれってまさかスパムメール作成に使うんじゃないですよね?

845 :デフォルトの名無しさん:01/08/28 18:00 ID:sorP8m5g
>>840
作ってみた。
/* include files : stdio.h stdlib.h string.h math.h */
void Create_Moji(int n)
{
 char *temp;
 const int loop_end = pow(26, n); /* 必要となるループ回数  */
 int i, j;
 /* 作業用配列の確保と初期化 */
 if ((temp = (char *)malloc(n + 1)) == NULL)
  fputs("Create_Moji : failed in malloc!", stderr), exit(1);
 memset(temp, 'a', n);
 temp[n] = '\0';
 /* 表示部 */
 for (i = 0; i < loop_end; i++) {
  puts(temp);
  for (j = n - 1; temp[j] == 'z'; j--)
   temp[j] = 'a';
  temp[j]++;
 }
 free(temp);
}
ASCII系文字コード以外への対応は宿題ということで…。

846 :デフォルトの名無しさん:01/08/28 18:20 ID:ign9iVXY
>>840
基数(今回は26進数なので26)で割りながら、余りを文字列にセットする
割れなくなったら再帰を終了
しかし、それだと上位桁と下位桁が逆転しているのでreverse()で
文字列を逆転する

また、BASE,TBLを設定しなおせば16進数, 62進数も処理できるが
あまり速くはない

#define BASE 26
const static char tbl[] = "abcdefghijklmnopqrstuvwxyz";

void conv26(int i)
{
  char buf[256];
  conv26str(i, buf);
  reverse(buf);
  printf("%s\n", buf);
}

void conv26str(int i, char *s)
{
  if(i / BASE == 0){
    *s++ = tbl[i % BASE];
    *s = '\0';
    return;
  }
  *s++ = tbl[i % BASE];
  conv26str(i / BASE, s);
}

void reverse(char *s)
{
  char *e;
  for(e = s + strlen(s) - 1; s < e; s++, e--)
    swap(s, e);
}

void swap(char *a, char *b)
{
  char buf;
  buf = *a; *a = *b; *b = buf;
}

847 :デフォルトの名無しさん:01/08/28 18:22 ID:ign9iVXY
> MS-DOSプロンプトて2kには無いんですよね?
あります。コマンドプロンプトとよばれていますが...

848 :デフォルトの名無しさん:01/08/28 18:34 ID:ign9iVXY
> なにが足りないのでしょうか?
> 教えてください。
こちらもいくつか質問をしたい、それによって回答するかしないかの判断を行う

問1:このソースは自分で考えたものですか?
問2:以下のアルゴリズムが行っている処理を一言で述べてください。
   (あなたの提示したソースの下の部分です)
> for(i=0; i<n-1 ;i++){
>   for(j=i+1; j<n; j++){
>     if(data[i]<data[j]){
>       work=data[i];
>       data[i]=data[j];
>       data[j]=work;
>     }
>   }
> }

849 :デフォルトの名無しさん:01/08/28 18:42 ID:TagcTmmE
再帰を使った基数変換は終了条件にたどり着いてから
出力を開始すれば逆順にならないよ。

ゼロ埋め(このばあい 'a' 埋め)でちょっと美しくない処理を
してるけど、↓を作ってみた。

#include <stdio.h>
#include <math.h>

void dec2nnn(int dec, int cardinal)
{
    if((dec / cardinal) == 0)
        printf("%c", dec%cardinal + 'a');
    else{
        dec2nnn(dec/cardinal, cardinal);
        printf("%c", dec%cardinal + 'a');
    }
}

void Create_Moji(int n) 
{
    int i, j, k, max;
    for(i=1; i<=n; i++){
        printf("[%d文字] ", i);
        max = pow(26, i);
        for(j = 0; j<i; j++) printf("a");
        printf(", ");
        for(j = 1; j < max; j++){
            for(k=pow(26, i-1); j<=k-1; k=k/26)
                printf("a");
            dec2nnn(j, 26);
            printf(", ");
        }
        printf("\n");
    }
}

int main()
{
    Create_Moji(3);
    
    return 0;
}

850 :デフォルトの名無しさん:01/08/28 23:17 ID:DRFexFbs
>>833
基本的に君の考えでOKだと思うんだけど。

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

#define MAX_PLACE 1024

int disp(int n)
{
  char t[MAX_PLACE];
  int i;
  
  if (n >= MAX_PLACE) {
    return -1;
  }
  
  memset(t, 'a', n + 1);
  
  while (t[n] == 'a') {
    for (i = n - 1; i >= 0; --i) {
      putchar(t[i]);
    }
    putchar('\n');
    t[0]++;
    for (i = 0; i < n; i++) {
      if (t[i] > 'z') {
        t[i] = 'a';
        t[i + 1]++;
      }
    }
  }
  
  return 0;
}

int main()
{
  return disp(3);
}

851 :デフォルトの名無しさん:01/08/29 00:23 ID:a/JC9lb2
             ∩
        ∧_∧   | |   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
       ( ´Д`)//  < 先生達の事は絶対忘れません
      /       /     \_____________
みなさんありがとうございました。でも、どれもなかなか難しいですね。
ようやく、2,3個理解する事ができたような気がしてる最中です。
残りも含めてアルゴリズムを自分のものにしようと思います。

852 :デフォルトの名無しさん:01/08/29 01:33 ID:SkRUP4ao
グレースケール(16Bit)のBMP画像を作りたいのですが、うまくいきません。
如何すればよいですか?

853 :デフォルトの名無しさん:01/08/29 01:38 ID:GIhJkjc.
>>852
そんなことできるの?
パレット持ってないと駄目っぽい気がするけど。

854 :デフォルトの名無しさん:01/08/29 01:39 ID:.vw5ElIM
>>852
16bitグレースケールなんてマニアックな仕様、まず使えるかどうか調べてから使え。
少なくともそんなもんサポートしてるビデオカードはほとんど無いと思われ。

855 :852:01/08/29 03:27 ID:SkRUP4ao
>>853
カラーテーブルは自分で指定しているのですが、使われていない見たいです。
(16bit以上では、普通はカラーテーブルを持たないらしいですね。)

>>854
ビデオカードは問題あるの?
UNIXのXウィンドウでは、綺麗にでました。

856 :デフォルトの名無しさん:01/08/29 04:16 ID:xEZlTqw2
普通のビデオだとRGB(0,0,0)〜(255,255,255)相当になると思うけど
16bitグレースケールだと(65535,65535,65535)になるのか?
単純に考えると各カラー16bit対応のビデオが要りそう。
フルカラー相当だと48bit必要。って合ってるかこれ?

857 : ◆winntZag :01/08/30 02:02 ID:OJtyVZPM
>>856
あってるとおもう。

>>855のいうようにきれいにでたからといって、
ライブラリーの段階で下位8ビットは無視して上位8ビットだけ表示している可能性もあるので、
それが本当に16ビットで表示されているかどうかはハードに依存するはず。

858 :852:01/08/30 02:20 ID:.Z520LV6
>>857さん、
あなたの言う通りだと思います。
たぶん、表示の際には、8bitに丸められていると思います。

859 :デフォルトの名無しさん:01/08/30 05:27 ID:MjfilObQ
医療用のならあるかもしれん、高いと思うが

860 :デフォルトの名無しさん:01/08/30 20:53 ID:M.Ld2ZAM
>>859
医療用じゃなくてもフツーのSGIのマシンは12bit以上とかあるよ。
フルカラーなら8bitでも分からないけどモノクロでも12bitあれば
まぁ十分じゃないかな。

861 : :01/08/30 23:52 ID:cl5gnins
C++って何て読むの?

862 :デフォルトの名無しさん:01/08/30 23:54 ID:EkMPJ/Yg
?

863 :デフォルトの名無しさん:01/08/30 23:57 ID:Esv.WjFE
しいぷらすぷらす

864 :デフォルトの名無しさん:01/08/31 01:36 ID:FMmhIaGI
シープラプラ

865 :デフォルトの名無しさん:01/08/31 01:44 ID:6a8y9j3k
1よりも read.c を ハックしまくってる #6411にでも聞け
ヤツが書いた部分はかなり職人だと思ったり。

866 : ◆yEF18Xi6 :01/08/31 01:57 ID:SQb0Wr6Y

 

867 :デフォルトの名無しさん:01/08/31 21:22 ID:7zNmzfnI
いつもお世話になっています。
頭爆発しそうです。質問させて頂きます。
ポインタへのポインターを動的に確保するには例えば
char **NewStr = NULL;
NewStr = (char**)malloc( sizeof(char**) *7 );
という具合にすればいいのでしょうか?なんか頭が混乱してしまって。
お願いします。

868 :デフォルトの名無しさん:01/08/31 21:34 ID:7zNmzfnI
ひろゆきってこんなにクズな野郎とは思わなかった。

869 :デフォルトの名無しさん:01/08/31 21:48 ID:7zNmzfnI
>>868 すいません誤爆です。しかも上げてしまった。
すいませんでした。

870 :デフォルトの名無しさん:01/08/31 22:23 ID:7zNmzfnI
>>867 解決しました。ポインタのポインタになるとややこしくていけませんね。
お騒がせしてもうしわけありませんでした。

871 :デフォルトの名無しさん:01/08/31 23:28 ID:7xETyOKM
>>
char **string_array = (char **)malloc( sizeof(char *) * 10);
string_array[0] = "blah blah";
string_array[1] = "sigh sigh";

872 :sage:01/08/31 23:45 ID:Rxk6Y1v6
↑つっこむべき?

873 :デフォルトの名無しさん:01/09/01 00:13 ID:vYeYNb6o
>>872
別に問題はないね。エラーチェックは無いけど。

874 :sage:01/09/01 00:21 ID:WPZOqF8E
ならいいや。
間違いではないし。うん

875 :デフォルトの名無しさん:01/09/01 00:22 ID:8UdnvL3A
C++
ちんこぷらぷら

876 :デフォルトの名無しさん:01/09/01 01:10 ID:LeyymvoY
ポインタへのポインタってややこしいですね。慣れるしかないのでしょうか?
ポインタって[]のシンタックスシュガーとからむと死にそうになりますね。
例えば
char **NewStr = NULL;;
NewStr = (char**)malloc( sizeof(char*) * 7 );
*NewStr = (char*)malloc( sizeof( char ) * 256 );
*NewStr = "ABCDEFGHIJKLMNOPQRSTU";
printf( "%s\n" , &*NewStr[0] );
printf( "%s\n" , NewStr[0] );
printf( "%s\n" , *(NewStr + 0 ) );
printf( "%s\n" , &NewStr[0][0] );
で全部同じ表示しますよね。プロの皆さんってこうゆう場合でも
すらすら読めるものでしょうか?
私は一生すらすら読めそうにない(T_T)

877 :sage:01/09/01 01:14 ID:WPZOqF8E

これもつっこまないでおくよ。あるいみ間違いでもないし。

878 :デフォルトの名無しさん:01/09/01 01:15 ID:LeyymvoY
>>877 つっこんで下さいよ。勉強になるし(T_T)
頭混乱しまくって死にそうです。

879 :sage:01/09/01 01:32 ID:WPZOqF8E
>>878
char **NewStr = NULL;;
NewStr = (char**)malloc( sizeof(char*) * 7 );
*NewStr = (char*)malloc( sizeof( char ) * 256 );
printf("%x\n", *NewStr);/*(゜д゜)<ナンダコノヤロー*/
*NewStr = "ABCDEFGHIJKLMNOPQRSTU";
printf("%x\n", *NewStr);/*(゜д゜)<ミテンナヨ*/
printf( "%s\n" , &*NewStr[0] );
printf( "%s\n" , NewStr[0] );
printf( "%s\n" , *(NewStr + 0 ) );
printf( "%s\n" , &NewStr[0][0] );

とりあえずこれやっとけ。
で、じっくり考えとけ。

880 :デフォルトの名無しさん:01/09/01 01:35 ID:LeyymvoY
>>879 ありがとうございます。がんばって、考えてみます。

881 :パンティーはいたまま排便、好きな人:01/09/01 01:38 ID:OK9pI4Co
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人

882 :パンティーはいたまま排便、好きな人:01/09/01 01:45 ID:OK9pI4Co

パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好き
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人

883 :デフォルトの名無しさん:01/09/01 01:49 ID:3D0QdnKM
>>876
> *NewStr = (char*)malloc( sizeof( char ) * 256 );
> *NewStr = "ABCDEFGHIJKLMNOPQRSTU";
本題と関係ないが、これだと *NewStr に割り当てたメモリがリーク
する。

strcpy(NewStr[0], "ABCD...");

884 :パンティーはいたまま排便、好きな人:01/09/01 01:51 ID:OK9pI4Co

パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人

885 :デフォルトの名無しさん:01/09/01 01:52 ID:aOy89HzY
なーんか、不気味だな。(w
変な目つきで静観してる連中は見ないことにしよう。
>>880
*NewStr = (char *)malloc...
*NewStr = "ABC...
下のところ、const char * なので少し注意したほうがいいです。
厳密にコンパイルすると警告がでます。そんなところで。
慣れれば大したことないよ。 がんばれっ。

886 :デフォルトの名無しさん:01/09/01 01:57 ID:LeyymvoY
>>883 レスありがとうございます〜。そうなんですか。
うう 難しいですね。文字列リテラルはどこかに確保された
char型の配列で、式中では先頭ポインタに読み替えられるから
、、、、えっと、たしかに文字列を代入してることにはならないって
理解でいいのでしょうか????うう難しい。
ポインタまではいけそうだと思ったんですがポインタへのポインタ
になったとたん訳がわからなくなってしまいました。
こつとかあるのかな。とほほ。

887 :パンティーはいたまま排便、好きな人:01/09/01 01:57 ID:OK9pI4Co
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人

888 :デフォルトの名無しさん:01/09/01 02:02 ID:LeyymvoY
>>886 レスありがとうございます。がんばります!
ですが、今日のところは休みます。皆様、おやすみなさいです。

889 :デフォルトの名無しさん:01/09/01 02:07 ID:aOy89HzY
(char **)NewStr -----> (char *)の配列 を指す
NewStr[0] はこの配列の 0 番目、型は char *
NewStr[1] はこの配列の 1 番目、型は char *
...
NewStr[0] = "ABCDEFG";
strcpy( NewStr[0], "ABCDEFG");
上はすでにある文字列リテラル "ABCDEFG" のアドレスを代入
下はNewStr[0]の指すアドレスに "ABCDEFG" をコピー
動きがちがうのでちうい。
下は NewStr[0] が malloc などで使える領域を指していないと
コアダンプします。

890 :sage:01/09/01 02:23 ID:WPZOqF8E
>>886
その認識であってる。
ポインタの本質についてしっかり理解していこう。

891 :デフォルトの名無しさん:01/09/01 07:46 ID:q8G9lFA6
ポインタへのポインタへのポインタ

892 :デフォルトの名無しさん:01/09/01 14:21 ID:MI8SfqKo
>>889-891 レスありがとうございます。
2次元配列は「配列の配列」と言うのをきちんと理解してない
のが混乱してた原因だったのかもです。
2次元配列が式中では「intの配列」へのポインタに読み替えられるという事が
アドレスをすべて表示する実験でやっとわかりました。
第一次元?のhoge[0][]はどこかに別のところにスタックを確保してるのだと誤解してました。
単に配列への先頭のポインタ?なんですね。
実験して気づいたのですが、hoge[3][3]の時、hoge[0][8];とかやっても要素にアクセス
できますね。やっちゃいけないんでしょうが(^_^;

893 :デフォルトの名無しさん:01/09/01 16:35 ID:uXCDEcwM
2行2列の場合
hanya[1][0] == hanya[0][2]
で、けっきょく同じことだったと思う。
別にアクセス違反じゃないので、大丈夫(だったと思う。)
ちょっと変わったやり方だけど。

894 :デフォルトの名無しさん:01/09/01 16:43 ID:uXCDEcwM
とりあえず入門書読んだがいまいち根本から
理解してない、とかもっとCを掘り下げたいって人は
「Cプログラミング専門過程」藤原博文 技術評論社
なんていいのではないかと。「Cプログラミング診断室」の著者
です。けっこうたたかれてるみたいだけど^^;。
入門書の次に読む本としてはなかなかだと思います。
メモリの動作を詳しく見ているので、ポインタとか理解深まる
のではないかと。

895 :894:01/09/01 16:46 ID:uXCDEcwM
あ・・字間違っとる、スマソ
専門過程→専門課程

896 :デフォルトの名無しさん:01/09/01 17:46 ID:MI8SfqKo
>>895 レスありがとうございます。
Cプログラミング診断室は熟読しました。面白いですね。
ネットで無料で読めるなんて驚きです。
「Cプログラミング専門課程」も興味あります。どんな本か知らなかった
のですが、そうですか。読んでみます。
叩かれてるってのが気になりますが、今の私では何で叩かれてるか
理解できないと思うのでいいかな。(笑)

897 :デフォルトの名無しさん:01/09/01 18:24 ID:GmO3PIyE
プログラミング作法については、みなさん自分のやり方というのが
あるので、その辺で衝突するのでしょうか。
C診断室に、たしか1つの関数の長さは60行ぐらいとか書いてあった
と思いますが、60行という制限は短すぎるという人もちらほら。

898 :デフォルトの名無しさん:01/09/01 20:25 ID:MI8SfqKo
>>897なるほど。確か100行言ったら恥ずかしいと思えとか書いてましたね。
あのおかげで関数を短くして分けるくせはつきました。

899 :デフォルトの名無しさん:01/09/01 22:08 ID:ddv07fY2
久々に思い出したよ。最長不倒関数(vv
関数が長いと確かに恥ずかしい。
が、漏れはプログラマやってること自体がそもそも恥ずかしいな。

900 :デフォルトの名無しさん:01/09/01 22:21 ID:TY5fGfOk
>>897
1000行でももれなく把握できる、と断言できるなら1000行でもいいでしょ。
だけどそんな人は一握りしかいないし普通の人は馬鹿だから
60行程度に収めとけば馬鹿がメンテすることになっても
まあ大丈夫かなという目安かと。

901 :デフォルトの名無しさん:01/09/01 22:27 ID:OpA/UgtQ
>>899
2000行以上だったっけ?あれって。

902 :デフォルトの名無しさん:01/09/01 23:14 ID:23xXAcjE
現在の記録は6344行みたい。その関数のソースファイルも
DLできるよ。↓ここで。

http://www.pro.or.jp/~fuji/mybooks/cdiag/index.html

これってC++かな?

903 :デフォルトの名無しさん:01/09/01 23:46 ID:Fd.AZCp.
>>896
藤原本が叩かれるのは、基礎的な内容を大げさに書いているからだよ。
彼の本を遊びで読むのは良いが、それに信じ込まないようにね。
慣れたら多くの本や多くのコードを読みましょう。規格書も、デザイン本も
読んでみるといいよ。それなら井の中の蛙にならない。

904 :デフォルトの名無しさん:01/09/02 00:10 ID:75FMiF1Y
>>902 私はCだと思ったけど、ネームスペースないし。
Cを勉強している者です。Cプログラミング診断室で
プリプロセッサのことが載っています。いい本がないって。
#誰の本の悪口言ってるのか分かりますが(^_^;
それで、プリプロセッサのノウハウを勉強することがいい本とか
ページとかないでしょうか?
グーグルとかで検索すればたくさんヒットしますが、自分自身
プリプロセッサのノウハウがないので、どれを参考にしたらいいのか
わかりません。
皆様、プリプロセッサを勉強するいい方法なり、書籍、ページなど
ご存知ないでしょうか。よろしくお願いします。

905 :デフォルトの名無しさん:01/09/02 00:27 ID:oK1onob.
>>904
Q and A読んだ見たら?

906 :デフォルトの名無しさん:01/09/02 00:27 ID:.f/mjsDI
>>904
C++とか、Cでも今時のならプリプロに頼ることはほとんどないと思うけど。
デバッグしにくくなるだけだから素直にコード書いた方がいいよ。

907 :デフォルトの名無しさん:01/09/02 00:44 ID:75FMiF1Y
>905-906 レスありがとうございます。
Q and Aって{「C言語Q&A」 工学社 竹田仰著 }のことですか?
検索したらそれっぽいのはこれくらいでした。
>906 たしかにデバッグがしんどいですね。それなら別に勉強しなくて
いいのかな。

908 :デフォルトの名無しさん:01/09/02 01:02 ID:XnpnvR/g
>>906
> C++とか、Cでも今時のならプリプロに頼ることはほとんどないと思うけど。
マクロを多用しすぎるのは問題だけど、マクロを使うとすっきり書けるコードも
あるよ。

MFC の IMPLEMENT_RUNTIMECLASS() とか ATL の MESSAGE_HANDLER() なんかは
マクロ使った方がマシな例。

909 :デフォルトの名無しさん:01/09/02 02:16 ID:ElAtzxTU
>>907
まず>>1を読め。

>>908
templateで解決するような。後者はinlineじゃダメなの?

910 :デフォルトの名無しさん :01/09/02 07:05 ID:4iR.eRxY
K&R の演習1-6なんですけど
getchar() != EOFという式の値が0か1であることを確認せよ.

アンサーブックの方では
#include <stdio.h>

main()
{
int c;
while(c = getchar() != EOF)
printf("%d\n", c);
printf("%d - at EOF\n", c);
}
ってなってて,最後のprintf("%d - at EOF\n", c);のat EOFの部分が謎なんですが
どういう意味でしょう?atなんて文字は今まで見たことがないのですが.

(c = getchar()) != EOF,が入力から受け取ったのをcに入れて,それがEOFじゃないなら云々.
で,この
c = getchar() != EOFが,優先順位が変わって,入力されたのがEOFであるかないかで真か偽が
cに入ると思うのですけど,解答をみたら上記の通りでした.
わかる人,いましたら解説してくださいませ.

911 :sage:01/09/02 07:20 ID:PvZGbwyU
> c = getchar() != EOFが,優先順位が変わって,入力されたのが
> EOFであるかないかで真か偽がcに入ると思うのですけど,
これであってます。
c = (getchar() != EOF) と同じことで、真か偽がcに入ります。
それで c が0か1であることを printf で表示して確認している

> ってなってて,最後のprintf("%d - at EOF\n", c);のat EOFの部分が謎なんですが
> どういう意味でしょう?atなんて文字は今まで見たことがないのですが.
実際に実行すればわかると思うけど、- at EOF の部分は特殊文字でも無い。
英語でEOFで、ってこと。

912 :デフォルトの名無しさん:01/09/02 08:13 ID:4iR.eRxY
910です.
3時間近くなんだろうなんだろうと考え込んでいましたが,自分はめちゃくちゃ
ドキュソだったことがわかりました....
""で囲まれているのだから
(0か1) - at EOF
って表示させているだけですね...

表示させられれば一瞬できずいたのかも知れませんが,EOFってキーボード
からの入力はできないものでしょうか.

913 :デフォルトの名無しさん:01/09/02 08:29 ID:PvZGbwyU
>>912
Control-D だよ(←これって環境依存だっけ?)

914 :デフォルトの名無しさん:01/09/02 08:47 ID:4iR.eRxY
重ね重ねありがとうございます.
Windows2000SP2のDOS窓を使っていて,Controlといろいろ同時押しを
したらzキーで
Press any Key to continue
と終了時のメッセージが出てくれました.

915 :sage:01/09/02 14:02 ID:O1AzBlvw
>>913
環境依存だ

916 :デフォルトの名無しさん:01/09/02 17:49 ID:YF/HkYq6

ポインタ変数自体の確保領域は何処ですか?ヒープですか?
ヒープに取ったオブジェクト中でポインタを宣言したら、それの確保領域
は当然ヒープでしょうか?

917 :デフォルトの名無しさん:01/09/02 18:31 ID:pMnOmo0k
>>916
場所による。Cには何も魔法はないよ。関数の中に書いたら他の変数と同じく
スタック上。ヒープというのは謎だが。

918 :sage:01/09/02 18:40 ID:O1AzBlvw
>>916
ヒープでもいいし、静的領域でもいいし、スタックでもいいよ。
メモリ上にも取られないことあるしね。

二行目以降よくわからんが
宣言と定義、動的な確保の違いについてよく理解してないなら
一度、参考書を読み直すといいよ。

がんばれ

919 :デフォルトの名無しさん:01/09/02 18:41 ID:tx6ZtRyQ
ポインタ変数だって普通の変数と一緒じゃないの?
宣言の仕方によってそれ相応の場所になるのでは?
べつにポインタだからって特別な場所ってわけでもないし。

920 :デフォルトの名無しさん:01/09/02 19:05 ID:YF/HkYq6
オブジェクトで宣言したポインタ変数は
オブジェクトが消滅するのと同時に消えるのですか

921 :デフォルトの名無しさん:01/09/02 19:30 ID:TAJZb8DM
>>916 >>920
ここは C のスレだぞ?
お前 C++ の話してないか?

922 :sage:01/09/02 20:52 ID:O1AzBlvw
構造体と読み替えれば、意味は通じるけどな。
C++かもしれんな。

CだろうがC++だろうが同時に消えるよ。
だが、ポインタが示す先オブジェクトについては、
明示的にそういうプログラムを書かない限り、消えない。

C++の話しをするなら別スレにおいで。

923 :デフォルトの名無しさん:01/09/02 22:01 ID:1arUuIGk
多次元配列の受け渡しについてなのですが
#include <stdio.h>

void func(int *a[4][5]){
printf("%d\n",a[3][1]);
}

int main(void)
{
int i[3][4][5];

i[2][3][1]=100;
func(i[2]);
printf("%d",i[2][3][1]);
return 0;
}
このようなコードでも動作はするのですが
警告を出さないためにはどのように書けば良いのでしょうか?

924 :デフォルトの名無しさん:01/09/02 22:45 ID:JF5GVKf2
> void func(int *a[4][5]){
< void func(int a[4][5]){

925 :デフォルトの名無しさん:01/09/02 23:18 ID:.f0adP9o
void func(int *a[4][5])



void func(int (*a)[5])

926 :デフォルトの名無しさん:01/09/02 23:21 ID:.f0adP9o
もしくは

void func(int a[][5])

927 :デフォルトの名無しさん:01/09/02 23:53 ID:1arUuIGk
おかげで正しく動作するようになりました。
ありがとうございます。
本を読んでも良くわからなかったので助かりました。

928 :デフォルトの名無しさん:01/09/03 21:51 ID:eo6BxHkY
保存する最大数が不確定な場合のデータ保存ってどうしたらいいんですか?
何しろ最大数が不明なので、グローバルでint[10000];とかはやりたくないし・・・。
都合よく増えた分だけ拡張可能な領域確保は、どうしたら良いのでしょうか?

929 :デフォルトの名無しさん:01/09/03 22:05 ID:eIvnaQUI
>>928
realloc とか。

930 :デフォルトの名無しさん:01/09/03 22:07 ID:H0Bpee16
>>928
リスト構造体、ヒープ確保&解放。

931 :(-_-)さん:01/09/03 22:17 ID:xWB.yE86
char 型の配列に格納されている文字列 "Hikky" から
" h "がひとつ、 " i "がひとつ、 " k "がふたつ、 " y "がひとつ、のように
アルファベット毎の個数を数えたいんだけど、
なんかいい方法ありますか?

932 :デフォルトの名無しさん:01/09/03 22:26 ID:t.4suHxk
>>931
まぁ高速化はいろいろあるけど。基本は数えるんだな。
#include <stdio.h>

int n[256];

main()
{
    char *p = "Hikky";
    int i;
    
    while (*p) {
        n[*p++ & 0xff]++;
    }
    
    for (i = 0; i < 256; i++) {
        if (n[i]) {
            printf("%c: %d\n", i, n[i]);
        }
    }
    
    return 0;
}

933 :sage:01/09/03 22:29 ID:Lup6D7xc
static int hg[26+1] = {0,};
char *p = "Hikky";
while (*p) {
if (isalpha(*p)) hg[toupper(*p)-'A']++;
p++;
}

934 :sage:01/09/03 22:30 ID:Lup6D7xc
一行抜けた。うごくからいいか。

935 :デフォルトの名無しさん:01/09/03 22:31 ID:VgjKZNGY
main(int argc,char *argv[])って言うのと・・・
main(int argc,char **argv)の意味の違いはなんですか?

936 :(-_-)さん:01/09/03 22:35 ID:xWB.yE86
>>932-934
見た感じ、正直よくわかりませんが、解読してみます。ありがとうございました。

937 :sage:01/09/03 22:37 ID:Lup6D7xc
>>935
どっちもかわらん

938 :名無の初心者:01/09/03 22:41 ID:yeQeWlso
ある関数1(func1)をライブラリ化しようかと考えています。
そこで、その関数1に渡す引数の型や数を固定したいのです。
しかし、その関数1の中で使用する関数2(func2)の引数の数が、
ランダムであるため、関数1の引数の数が固定できずに困っています。
関数2はユーザが定義し、そのアドレスを関数1に渡しています。
具体的には

void func1(void (*func2)(), int *a, int *b,....) {
func2(a, b,.....);
}

void func2(int *a, int *b,.....(数はランダム)) {

}

main(){
func1(func2, a, b, .....);
}

func1の引数の型を固定したいのです。(他の対策法でも構いません。)
なにかよい方法はないでしょうか。

939 :デフォルトの名無しさん:01/09/03 22:44 ID:yPx0fR8.
struct {
int hoge;
char foo[0];
};
配列の大きさが0の配列とはどういう意味があるのでしょうか?

940 :sage:01/09/03 22:45 ID:Lup6D7xc
>>938
stdarg.h
を調べとけ。

VBで扱っているようなvariant型の仕組みもついでに調べとけ。

941 :sage:01/09/03 22:46 ID:Lup6D7xc
>>939
参考書の可変長構造体の項を調べとけ。
載ってないなら、その本は焼いて捨ててヨシ。

942 :名無しの初心者:01/09/03 23:24 ID:JSIp0FKI
>>940
さがしていたものがズバリ見つかりました。
本当に有難うございました。
今後のためにもvariant型というのも頭に入れておきます。

943 :名無しの初心者:01/09/04 01:25 ID:aYttRhdQ
938ですがもう一つ質問お願いします。
void func1(char *format, ...(可変数引数)
{
func2( ...)←ココに受け取った可変数引数をすべて渡すにはどうしたらいいでしょうか?
}
具体的な取り出し方は
void func1(char *format, ...){
va_list ap;
char *p=format;
int si;
double sd;

va_start(ap, format);
while(*p){
switch(*p) {
case 'd': si=va_arg(ap, int);break;
case 'f': sd=va_arg(ap, double);brea;
}
p++;
}
va_end(ap);

呼び出し方は
func1("ddfd", 3, 2, 6.4, -1);
のように呼び出しています。

944 :デフォルトの名無しさん:01/09/04 01:41 ID:acuYbFiA
Cでは、配列そのものを関数に渡すことはできない仕様になっている。
だから、いつも必ず、先頭要素へのポインタを渡して、配列本体にアクセスしてもらうしかない。

charへのポインタの配列を渡すには、
charへのポインタのポインタを渡すしかないということ。

それで、char **argcということになるんだが、
簡便的にchar *argc[]という表記法でもよいことになっている。

両者に実質的な違いはない。

945 :944:01/09/04 01:41 ID:acuYbFiA
944は >>935

946 :sage:01/09/04 01:51 ID:VbosVW6E
>>943
func2を、書式を伝えるための引数+va_list 型引数を受け取るようにすればよい

vsprintfなんかの実装がそれだ。

void func2(char *format, va_list ap);

func1で引数の解析をせず、func2ですべて行うようにするのがポイントなんだが、
943のやろうとしてるfunc1とfunc2の役割によっては、そう行かないかもしれないね。

947 :名無しの初心者:01/09/04 02:28 ID:aYttRhdQ
>>946さん
またお返事ありがとうございました。
946さんのおっしゃるようにfunc2で解析するようにしてみます。
それでなんとか目的は達成できそうです。
ってちょっと難しそうですが・・・
946さんには心から感謝いたします。

948 :デフォルトの名無しさん:01/09/04 07:58 ID:ZHeJzkIE
#define _(a) a & a

if (from < _(a) < to ) {
:
}

こーゆー使い方ってダサい?

949 :デフォルトの名無しさん:01/09/04 08:11 ID:xADXB3S6
for(ever)を思い出す

950 :デフォルトの名無しさん:01/09/04 08:21 ID:2wbT/ats
>>949
僕お子様なんでそれ知らないんだけど、

#define ever ;;

てなことっすか? おもろいっす。

951 :デフォルトの名無しさん:01/09/04 08:34 ID:ovWsf9ZU
for(;_;) でワラタことがある

952 :デフォルトの名無しさん:01/09/04 11:56 ID:DASKlEA.
誰か次スレ立てろ

953 :946ではないけど、:01/09/04 12:02 ID:bgFq5l0E
>>947
老婆心ながら一言言わせてもらうと、可変引数の関数の引数すべてを別の可変
引数に渡す一般な方法はない。

ただ、用途を限定すれば不可能ではない。
例えば>>943の例では、func1()の中で第1引数の長さを知ることで、その値が
実際の引数の数と違っていることはあるかもしれないが、一応幾つの引数が渡
されたかを別の手段で知ることができる。v[fs]printf()でもフォーマット引
数(%d, %sなど)の数を数えることで、引数の数を解決してる。別の方法として
は、必ず第2引数にfunc1()に渡した引数の数を指定させると言うのも一つの手。

ただ、これらはあくまで、個別のルールを作り込んでの可変引数の受け渡しな
ので、実際に渡している引数の数や型が違ったときに何が起こるかは分からな
いし、コンパイラも指摘してはくれないので十分注意のこと。

954 :名無しの初心者:01/09/04 17:31 ID:8SeVGOiw
>>953さん
可変引数の型(intやdouble)も渡さないといけないのでかなりややこしくなりそうです。
自分一人が使うには問題ないですが、他の人が使うことを考えると・・・
もっとよく考えてみます。

レスありがとうございました。老婆心でもうれしいです。

955 :デフォルトの名無しさん:01/09/04 23:09 ID:B/j8Xxas
>>952
なぜおまえが立てない?

956 :sage:01/09/06 21:15
>>954
見た感じ数値型だけ渡せればよいようなので、

func2(double d[]);

にしちゃいなさい。

957 :デフォルトの名無しさん:01/09/06 22:29
#include <stdio.h>
#include <stdlib.h>

struct test{
  int a, double b;
};

void keep(struct test **f, int I){
  struct test *g;
  g = (struct test *)malloc(sizeof(struct test)*I);
  *f = g;
}

int main(){
  int i;
  struct test *tester;

  keep(&tester, I);

  for(i=0;i<I;i++){
    tester[i].a = i;
    tester[i].b = (double)(i)*0.1;
  }

  exit(0);

}

みたいにやると
tester[0].a
tester[0].b
tester[1].a
tester[1].b
...
の順番でにメモリに格納されますよね?それを
tester.a[0]
tester.a[1]
...
tester.b[0]
tester.b[1]
...
のようにするにはどうしたらいいですか?

958 :957:01/09/06 22:48
ごめんなさい新スレ逝ってきます

959 :デフォルトの名無しさん:01/09/06 22:55
プログラミング言語 Cアンサー・ブック 第2版

ってどうなんですか?
K&Rってかいてあるけど
ANSI学びたい人でも買いですかね?
あとこれがあったら
プログラミング言語 第2版
本体はいらないっすか?

960 :デフォルトの名無しさん:01/09/06 22:59
新スレへどうぞ

http://piza2.2ch.net/test/read.cgi?bbs=tech&key=999617524

961 :デフォルトの名無しさん:01/09/06 23:13
>>960
よく読んでないけど、アンサーブックってあれでしょ?
プログラミング言語Cにある問題の解答集でしょ?
だからプログラミング言語Cがなくちゃしゃーないっしょ
アンサーブックは別にいらない人もいるだろうし

962 :デフォルトの名無しさん:01/09/06 23:13
あ・・間違えた
>>960じゃなくて>>959
スマソ

963 :デフォルトの名無しさん:01/09/09 15:17
合計体重と平均をもとめるのにwhileをつかえということなのでこう書いたのですが、No.1しかでないいんです
それに、合計体重、平均体重までいかないんです。9999で終了するのですが・・・
なにがまちがってるのでしょうか?

#include<stdio.h>
#define MAX 1000
int main (void)
{
int i=0;
int sum=0;
int ary[MAX];

puts("整数を入力してください。");

while(i<MAX)
{
printf("No.%d:",i+1);
scanf("%d",&ary[i]);
if(ary[i]==9999)
{
i++;
break;
}
sum+=ary[i+1];
}
if(i>1)
printf("合計体重は%dで平均体重は%.1fです。\n",sum,(double)sum/(i-1));

return(0);
}

964 :デフォルトの名無しさん:01/09/09 15:24
>>963
入出力と平均計算をごっちゃにするのは良くないよ
input()
output()
weight_average()
に分けて、もう一度作り直せ

965 :デフォルトの名無しさん:01/09/09 15:31
>>964
レスありがとうございます。
エラー的なものがあればそれもききたいのですが・・。
まぁ3つに分けて作る方向でがんばりますね。

966 :デフォルトの名無しさん:01/09/09 16:46
>>965
>sum+=ary[i+1];
ここがおかしい。
i の動きをよーく追ってみよう。

967 :デフォルトの名無しさん:01/09/09 18:54
>>966
ありがとうございます
[i++]ですね。
おまけにscanf("%d",&ary[i]);の%dを%.1fにしたほうがいいですかね。

968 :仕様書書かないさん:01/09/13 00:18
>>957
struct test{
  int *a, double *b;
};

keepで
tester.a=mallocの戻り
tester.b=mallocの戻り

すると
tester.a[i]
tester.b[i]
のようにアクセスできる。

275 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)