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

■掲示板に戻る■ ■過去ログ倉庫めにゅーに戻る■
C言語なら、オレに聞け! <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]
のようにアクセスできる。



2ちゃんねるは、ここのサーバを使ってるです。。。