トップページ⇒tech
968コメント340KB

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

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001ジョブス2世NGNG
おれは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 へ
0002ジョブス2世NGNG
独断と偏見で選んだ関連スレだ。

関連スレ
・( ゚Д゚)ノ ギコ猫のプログラム相談室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
0003デフォルトの名無しさんNGNG
こんどのジョブスさんはとてもいい人そうだ。
なんだかほのぼのした。

CでString型を実装するにはどうしたらいいかな?
0004デフォルトの名無しさんNGNG
>>3
無理。
C++使え。
0005デフォルトの名無しさんNGNG
>>3
char *string_alloc(size_t);
void string_free(char *);
char *string_assign(char *, const char *);
char *string_append(char *, const char *);
なんて感じで関数作れば?それ以上は無理。
0006デフォルトの名無しさんNGNG
多倍長演算を扱ったいい本ってないでしょうか?
検索しても中途半端なものしか見つからないので、
よろしくお願いします。
0007デフォルトで能無しさんNGNG
http://www.ansi.org/
ANSIってここっすよね?

CとC++の仕様書読みたいんですが、どこにあるかわかんないです。教えてください。
サーチしてもでてこないし・・・(涙)
0008デフォルトの名無しさんNGNG
http://webstore.ansi.org/ansidocstore/product.asp?sku=ISO%2FIEC+14882%3A1998
これ?C言語はわからない。245ドルって・・・
00097NGNG
どもです。8さん。やっぱ基本から学びたいけど高すぎる!
だれか共同購入しませんか?
0010デフォルトの名無しさんNGNG
C でString実装はちょっぴりめんどいな!
まあ、モドキでいいんだけどね。

ところで、ASCIIコードとかは A〜Z が連続であることが保証
されてるけど、これが保証されていない文字コードなんて
実際のところ世の中に存在するのかね?
0011デフォルトの名無しさんNGNG
質問ですが、

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

} RINGO;

typedef struct
{
int c;
...

} MIKAN;

このエラーが出ないようにする方法はありますか?
0012デフォルトの名無しさんNGNG
>>11
定義の順番逆にすれば?(大爆笑)
0013デフォルトの名無しさんNGNG
>>10
EBCDICは?
0014デフォルトの名無しさんNGNG
あるよ。
typedef struct
{
int c;

} MIKAN;

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

} RINGO;
001510NGNG
>>13
http://www.pleasuresky.co.jp/images/ebcdic.gif

おふー
こんなコード形態があったとわ〜
教えてくれてありがとう
0016デフォルトの名無しさんNGNG
すみません間違えました

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

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

このエラーが出ないようにする方法はありますか?
0017デフォルトの名無しさんNGNG
>>7
共同購入すると安くなるのかな?送料稼げる?近くじゃないと意味ないしね。
多分コピーしようってんだろうけど、それは犯罪だよ。
0018デフォルトの名無しさんNGNG
>>16
ないね。
フツーそういう時はポインタにするんだけど。
もっと根本的な問題はまぁ置いとくとしてもね。
0019デフォルトの名無しさんNGNG
>>11
typedef struct
{
 int a;
 struct _MIKAN b;
} RINGO;

typedef struct _MIKAN
{
 int c;
 ...
} MIKAN;
0020デフォルトの名無しさんNGNG
>>19
コンパイルくらいしとけって。
0021デフォルトの名無しさんNGNG
>>20
ほんとだ、だめか・・・。
002216NGNG
C言語の規定で解決法があるのかなと思ったんですが
どうやらないようですね。あきらめます。ありがとうございました。
0023デフォルトの名無しさんNGNG
>>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;
とか?
0024デフォルトの名無しさんNGNG
>>16
そのような構造を無限マトリョーシカといいます。
00257NGNG
まぁ大いにマズイかんじしますけど。一応Personal UseコピーについてANSIにメールしてみました。>17
つうことでトモダチ募集!!
[email protected]
0026デフォルトの名無しさんNGNG
>>25
だから友達コピは犯罪だって。養子縁組するなら見逃されるかもしれないけどさ。
0027デフォルトの名無しさんNGNG
>>26
穴兄弟になればいいんじゃないか?
0028デフォルトの名無しさんNGNG
>>16
1.この宣言が成立したと仮定する。
 sizeof( RINGO )は、いったいどうなるか(10点)
2.不完全型について述べよ(20点)
3.自己参照構造体について述べよ(20点)
4.相互参照する構造体について、その実現方法について述べよ(50点)
002916NGNG
無限になりますね(汗
実際には構造体のポインタとして使うのですが、
前方参照の問題なので、ポインタにしなくてもいいかと思って…。

MIKAN *b をvoidのポインタとして宣言して、キャストして解決してる
んですが、なんとなく気になったので質問させていただきました。
0030デフォルトの名無しさんNGNG
>>29
だから、ポインタだったらそんなことせんでもよかんべ。
本くらい読めよ。大抵の本には載ってると思うが。
0031デフォルトの名無しさんNGNG
>>25
うーむ、養子になってもアナログコピーマシンを使わないとダメ
みたいだな。まぁがんばれよ。
http://www.bunka.go.jp/8/2/VIII-2-C.html
00327NGNG
>>26 ANSI準拠とか言って本売ってるとこいっぱいあるし・・やっぱいいんじゃないの?
商用の際は特別に申告&追加料金払えとかパッと見て書いてないし>本家
つまり自分が2MBの文書を定価245�jで買って、赤の他人に(安く)再販するのはOKじゃないかと。
(そのあたりをメールで聞いてみた)
00337NGNG
>>31 どもです。WEBからDL購入らしいです。>アナログコピー
0034デフォルトの名無しさんNGNG
>>29
そらよ。
typedef struct MIKAN *pMIKAN;
typedef struct
{
int a;
pMIKAN *b;
} RINGO;

typedef struct
{
int c;
RINGO d;
} MIKAN;
0035デフォルトの名無しさんNGNG
今度の土曜にC言語検定の2級、3級のテストなんですけど
どんなのがでそうですか?
0036デフォルトの名無しさんNGNG
>>32
しかし、全くすごい発想だな。
メールで聞くだけハナクソくらいの救いはあるが。
0037デフォルトの名無しさんNGNG
clock()の精度って上げられないですか?
せめて10倍ぐらいに。
00387>36NGNG
死ね
0039デフォルトの名無しさんNGNG
>>37
カーネルパラメータを変更して再コンパイル。
0040デフォルトの名無しさんNGNG
>>37
timeGetTime()使え。
004137NGNG
サンクス
0042だるだるNGNG
C言語で人工生命とか人工知能のプログラムを
作ろうかと思いますが、これは一般的ですかね?
AI,ALとかを作ることに適している言語って
あるんですかね?(聞いたことがあるが忘れました)
0043デフォルトの名無しさんNGNG
>>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; };
0044デフォルトの名無しさんNGNG
>>42
ネタか?

そっち方面は門外漢なんで最近はどうか知らないが、前は
Prolog か LISP が定番だったけどな。
0045デフォルトの名無しさんNGNG
>>44
おもんない
0046デフォルトの名無しさんNGNG
前スレで可変個の引数についての話があったけど、
_beginthreadex()で渡す、引数リストってどうやって
作成するんですか?
0047デフォルトの名無しさんNGNG
>>46
K&R読んだ?(大爆笑)
0048デフォルトの名無しさんNGNG
>>47
旧Perl板にでも帰れ。
0049K&RってNGNG
インチキでしょ?
0050デフォルトの名無しさんNGNG
>>46
http://www.pro.or.jp/~fuji/mybooks/cdiag/cdiag.8.5.html
超有名な「Cプログラミング診断室」より。
ここは一通り目を通しておこう
0051眠い…NGNG
>>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;
}
0052デフォルトの名無しさんNGNG
>>43
_ 始まりはシステム予約などで使用される。
サンプルでも使用すべきでない。
0053デフォルトの名無しさんNGNG
#ifndef _MYPROJ_H
#define _MYPROJ_H
:
:
:
#endif

も同じレベルで逝ってよしってことでよろしく
0054QNGNG
すみません、別スレで質問したのですが、どなたも答えてくれなかったもので...。
Visual Studio6を使ってるんですが、MS-DOSプロンプトで
cl 〜.c
のように入力してもコンパイルできません。他のコンパイラでコンパイル
したものを実行することはできるのですが。
どなたか分かりますでしょうか。
0055デフォルトの名無しさんNGNG
>>54
path
0056デフォルトの名無しさんNGNG
>>54
だから、どんなエラーが出るかくらい書けよ。
0057ジョル.ビブズ(偽者)NGNG
ビル.ジョブズさんって普段何してはるひとなん?
ちょっと興味あり(はあと)
0058ジョブス2世NGNG
>>57
> ビル.ジョブズさんって普段何してはるひとなん?
普通のサラリーマンプログラマです。

プログラムに詰まったり、コンパイル中にここを見てます。
0059アイズNGNG
スケジュールを作るプログラムを作りたいのですが。
登録、修正、削除、表示、検索が行えるように。
YYYY/MM/DD,HH:MM
月日、時刻、内容
ってかんじで。
ます、なにから考えればいいですかね?
0060>>59NGNG
スケジュール
0061デフォルトの名無しさんNGNG
>>59
プログラマー以外の職業への転職、もしくは就職
0062デフォルトの名無しさんNGNG
駄目スレになりつつあるな・・
0063デフォルトの名無しさんNGNG
>>52
>>53
そうかな〜?
外に見えなきゃいいんじゃないのかな〜?
>>43
のは、見えてそうだけど。
0064デフォルトの名無しさんNGNG
>>63
53はUUIDを噛ませろって言ってんじゃねぇーの。
0065デフォルトの名無しさんNGNG
>>59
日付と時間をおさめる構造体
この構造体と予定を納める双方向リスト(を実現する構造体)
双方向リストから登録、修正、削除、表示、検索を行う関数
C++だといいのにね・・・
0066デフォルトの名無しさんNGNG
>>64
_ で始まる名前はやめろっていってるんじゃ?
0067デフォルトの名無しさんNGNG
大した話じゃないし,実際動いているから問題ないんだけど
スタイルについて疑問に思っていたので質問.
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ではこう書けたんだけど.
0068デフォルトの名無しさんNGNG
>>67
ユーザーによる構造体メンバへの直接アクセスを避けたい
場合とかでは普通のテクニックだと思います。
ハンドル指向(?)の徹底という意味で、
良いコーティングスタイル事だと思います。
0069デフォルトの名無しさんNGNG
>>67 >>68
ほう、これ知らなかったよ。

参考にしとこう。
0070デフォルトの名無しさんNGNG
ハンドルにするなら*なんか書かせんなよ.
0071デフォルトの名無しさんNGNG
つーか気に入る様に勝手にtypedefすりゃいいじゃん。>70
厨房?
0072デフォルトの名無しさんNGNG
>>67
そんなところは無いようだが、どの変が処理系依存だと思ってるんだ?
0073出張あさはかマンNGNG
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]は何につかうのだろ・・?
0074デフォルトの名無しさんNGNG
CSVファイルを編集するソフトを作ってみたいのですが
何かよいサンプルはありませんか。
0075デフォルトの名無しさんNGNG
>>73
EOF用
0076デフォルトの名無しさんNGNG
>>73
> unsignedなのに配列の大きさが[1 + 256]なのも
> 良くわかんないです・・・・
is系は0〜255までの文字とEOFの257種類を判定しなければいけない為
0077出張あさはかマンNGNG
>>75,>>76
と、すると
EOFが返ってきそうなものは符号付で来るのかな・・・

ちょっと確かめて見ます。
有難うございます。
0078出張あさはかマンNGNG
int getc(FILE *fp)とか、すべてint表記でした。
すると(_ctype_-1)[n]は、やはり(_ctype_)[n-1]と
結果は同じになるということですね。

納得。
さんくすです。
007967NGNG
ありがとう.意見が聞けて良かったよ.
ポインタを意識させるかどうかは最初迷ったけど,考えた結果どっちでも
いいような事だと分かったんだ.だから,標準ライブラリのFILE構造体の
扱いにならってこうしたんだ.それ以来このパターンではずっとこのやり方だよ.
処理系依存かもしれないと思ってた個所は先に書いた通り,構造体定義の場所に
ついて.>>74は暗に俺に向かって言ってるのかも知れないけど,言語とか
はっきりしないのでパスするね.
0080デフォルトの名無しさんNGNG
>>79
Cの仕様をちゃんと理解した方がいいと思われ.
0081デフォルトの名無しさんNGNG
さぁ、もうすぐ夏休みだ!!!!!!!!!!!!!
プログラム板のみんな気を引き締めろ!!!!!!!!!!!!
0082デフォルトの名無しさんNGNG
>>80
激しく同意
0083( ´∀`)さんNGNG
quick sortを自前で作ったら
データ数20万を0.6秒でソートできたよ!
qsort使ったら2.6秒くらい。

誰か ほめて!!
0084デフォルトの名無しさんNGNG
>>83
対象データは?
0085デフォルトの名無しさんNGNG
>>83
これより速い?
http://www.mars.dti.ne.jp/~a-wada/qsortlib.html
0086ビル・ジョブスNGNG
>>83
どうせオンメモリーだろ!
件数増えるとメモリーへのロード時間がネックになるだろ!
オレ様の場合は、MapViewOfFile駆使して、
10万件だろうが、100万件だろうが、
ほぼ同じスピードでソートできるロジック
もってるぜ!
0087デフォルトの名無しさんNGNG
>>86
それはスラッシングでは・・・
0088デフォルトの名無しさんNGNG
へなへなへな。仮想記憶の立場は....
それとも窓系ってそこまでヘボなの?
0089ビル・ジョブスNGNG
スループットを追求するなら、仮想記憶させない
配慮が必要だ。
アーキテクチャーを味方に付けるのだよ。
お前らに言っても分からないと思うけど。
0090デフォルトの名無しさんNGNG
>>86 と >>89 で、なんか言ってること矛盾してない?
0091ビル・ジョブスNGNG
どこがだよ!ボケ!
0092ビルは嫌いだがジョブズはまあいいかNGNG
おまえなあ。MapViewOfFile or mmapが裏で何やってるかを把握
してから出直しな。
0093デフォルトの名無しさんNGNG
>>86
なぜにこーゆー口調の奴ってばドキュソてんこもりなの?
009490NGNG
オンメモリをMapViewOfFileに変えた所で、
結局裏で仮想記憶が働くのは一緒。(>>86)
で、>>89で「仮想記憶させない配慮〜」とか言ってるから。
わかった?
009588NGNG
>>89
確かにそんなマヌケで曖昧な意見言われてもわからん。
今更キャッシュラインサイズにあわせたストライピングなんて
ガイシュツもいい所の話をだしたら、流石に一同ズッこけるか
ら、面白いネタ期待してるよ。
0096ビル・ジョブスNGNG
そっかー、お前らみたいなヤツらが居るから、
迷惑なくらい遅いソフトがまかりとおるわけね。
仮想アドレスと仮想記憶って別物だよな。
仮想アドレスにアクセスした時にオブジェクトが
存在しないと、Page Faultするよな。
ここで仮想記憶が動くわけだ。
最初の1回目に動くのは当たり前だ!
お前らみたいに数10MBも一気にアロケートして
Faultしまくりおバカに、mmapを…などと言われたく
ないんだよ。
もーWIN32使わないでくれ!
死んでくれ!>>92
0097デフォルトの名無しさんNGNG
まー、仮想記憶システムの完成度によるよね >メモリマップの有効性
お馬鹿キャッシュなら仮想記憶もダメ→依存してるメモリマップもダメ
っていう図式ができる。
ビルの言ってることも間違いではない。口が悪いけど。
0098  NGNG
レベルの低い質問で恐縮ですが
Visual C++ のprofessional EditionとStandard Editionの違いを
教えてください。
009988NGNG
>>97
口が悪いとか何とかの以前の問題で間違ってるよ。
マッピングは仮想アドレス空間に一度invalid状態でファイル
全体を割り当て、ページフォルトをつかって実際の読み込みに
入るんだから。そうじゃなきゃどのタイミングで読み込むか
教えてくれ。だからこそ最初に「窓系ってそこまでヘボなの?」
って聞いたのだよ。
0100デフォルトの名無しさんNGNG
というか窓林檎野郎も技術屋の端くれだったら馬鹿みたいに
吠えてないで、自分の方式のほうが圧倒的に速い、という事
を定量的に実証して見せれば良いだけジャンか。なんでその
程度できん?

そもそもUNIXプログラマならmmap使った処理は一般的なもの
で、なにも特別な方法ではないのだよ。
#圧倒的に高速には88の理由からならんが。
010188NGNG
>>100
その通りっす。でかすぎるファイルの一部を弄るときなんかに多用します。
あと、極端に大域的にランダムアクセスになるような場合、小領域での"分
割リード"に比べれば有利です。

ただし、sorting のように全体をスパースする場合は....って一々言わな
くても分るよね。
010283@( ´∀`)さんNGNG
>>84
ただのint

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

>>86
もっと分からん!
オンメモリー?たぶん!
010383@( ´∀`)さんNGNG
こんな感じ。

#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;
}
0104チト気を付けようNGNG
>>99
あのー良くよんだほうがいいですよ。
ビルも一回目は…、って言ってるじゃん!
それはそうと、ビルジョブスって、このスレの
創設者じゃない?
だとすると、雲の上の人だよ。
0105デフォルトの名無しさんNGNG
>>103
どんなデータもソートできるように、比較をコールバックで行った
りmemcpy()的な方法で交換したりしている分、qsort()は不利かもし
れない。
その辺の条件そろえてなお速かったらほめてやるよ。
0106デフォルトの名無しさんNGNG
>>103
この程度の関数を qsort() と比較してはいけません。

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

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

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

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

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

ただし、単純に read() を mmap() に書き換えたら速くなるという話
ではなく、性能を出すにはデータ構造やロジックに関して、注意深い設
計が必要です。ソートでは入出力の回数を少なくするため、いかにメモ
リアクセスを局所化するかが肝ですね。
0107デフォルトの名無しさんNGNG
>>103
なんでint決め打ちなのにxorbネんて使うかね.xor知ってよっぽどうれしかったのかな.
pivot選択少しくらい工夫しろよ.
0108デフォルトの名無しさんNGNG
unsigned shortを引数にもつ関数にunsigned shortの変数codeを
渡すと、
A(code);
は問題ないのですが、
A(code | 1);
とすると仮引数と実引数が異なると警告が出るのですが
なぜでしょうか。|を使うと型が変更されるのでしょうか?
0109デフォルトの名無しさんNGNG
>>108
汎整数拡張について調べてみて。
0110デフォルトの名無しさんNGNG
>>108
1はintだから。
0111108NGNG
>>109,110
早い反応アリガトウございます。
0112デフォルトの名無しさんNGNG
てゆーかー、unsigned shortなんて引数にする意味ないのよ。
0113君もチト気をつけようNGNG
>>104
どう考えたってファイルのマッピングの仕組みをビルが勘違いしていたのは間違いないぞ。
ていうかいちいち「!」つけるなよ。まるっきりビルだぞ(w
#ああ、こういったときのために sage 以下が欲しいなあ。
0114デフォルトの名無しさんNGNG
結局>>87が真理か…
0115デフォルトの名無しさんNGNG
>>114
なわけねーだろ.
0116( ´∀`)さんNGNG
qsortと同じ汎用性を持たせたら
予想どうり負けたじゃん!
ライブラリ関数には勝てないってことか…

そんなqsortの中身を見てみたいんだけど、
見れないのかな?
0117デフォルトの名無しさんNGNG
>>116
見たけりゃ見れるさ.
0118108NGNG
>>112
どうしてなんですか。教えてください。
0119ビル・ジョブスNGNG
>>113>>114
オレは勘違いもしていないし、間違ってもいない。
コアな部分は作った経験が無いと分からないんだよな!
上記2名はVRとかSHでいいから、簡単なボードを
自作でもして、仮想記憶コードを作ってみろよ!
まぁ、多重仮想記憶モードのASIDの使い方で
頭がハゲるだろうな。
偉そうこいといて、無理だって言うなら、
即刻コンピューターやめな!このタコが!
0120君もチト気をつけようNGNG
>>119
まあそのくらいにしとき。
少なくとも俺はx86とMIPSでの仮想記憶コードの作成
経験があるよ。
0121デフォルトの名無しさんNGNG
>>119, >>120
そんな簡単なことで威張るなよ。馬鹿馬鹿しい。
0122デフォルトの名無しさんNGNG
>>116
VC++ 使ってるなら CRT ソースコードをインストールしましょう。QSORT.C という
名前で qsort のソースがインストールされます。ソース非公開のライブラリを使っ
ている場合には、フリーの UNIX のソースコードを参照するのも手です。

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

>>119
騙りかな? なんにせよ、技術的な中身がない書き込みは sage で頼みます。
ただでさえ夏休みに入って、板のレベル下がってるんですから。
0123ビル・ジョブスNGNG
>>120
どうせ、HALかOALでエクセプションハンドリングを
ちょこっと書いただけだろ。
そりゃ仮想記憶コードとは言わないぜ!
あっ、明日、渋谷でデートだ!A.I.観るんだった!
お風呂はいろーっと。
もう、2chつまんねーなー…
0124デフォルトの名無しさんNGNG
なんか引き際の見苦しいやっちゃなあ。
ビルってこんなにしょうもない奴だったの?
0125>>124NGNG
"悔しい"の間違いでは…
彼女居ないからって僻むなよ…
まず痩せろよ!デブ!
0126デフォルトの名無しさんNGNG
>>123
linuxの仮想記憶部分見れば一発じゃん。
もうすこし面白い煽りしてくれよ。つーことでさげ。
0127君もチト気をつけよう NGNG
>>126
これは放置でしょう。
もう既に技術ネタでは勝てないことを自分でアピールしてるくらいだから。
普段なら空白下げで隙間空けてから仕切り直すところだけど、この時期は
無駄だろうなあ。

#余談だが太ってるくらいで彼女できない奴なんているのか?
#俺も太めだが。
0128やっぱり…NGNG
悔しいの? >>127
ピル様の勝ちかな?
0129デフォルトの名無しさんNGNG
ファイル名を入力して
ファイルの大きさ(バイト数)を出力するプログラムって
どうやって作るんですか?
0130デフォルトの名無しさんNGNG
ビルは複数存在してるぜ。
0131デフォルトの名無しさんNGNG
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 試食版です。

よろしくお願いします。
0132デフォルトの名無しさんNGNG
_ctype[]は探すと extern で宣言されていると思いますが、こ
のことからもわかる通り、ライブラリ中にあります。要するに
各キャラクタごとに予め種類分けしたテーブルを参照する訳で
す(単純!)。and を取るのは、各エントリの各ビットが其々の
種類に対応している、というわけです。
0133デフォルトの名無しさんNGNG
>131
>>73-78 も参考にすべし。
0134デフォルトの名無しさんNGNG
>>129
1. プログラムを書いて
2. コンパイルして、
3. 実行する.
だけなんだけど、システム依存だから何でやりたいのか書けよ.
0135129NGNG
FILE * fp;
使うのは分るんだけど。。。
0136129NGNG
>>134
レス有難う。
パソコンでやりたいんだけど。。。
0137デフォルトの名無しさんNGNG
>>129
言語や環境がわからないと答えようも無いな・・・

ハッ! (ゴゴゴゴゴ) 新手の荒らしかッ!
0138129NGNG
>>137
ごめん。。。嵐じゃないです。
c言語です。あと環境はウィンドウズ98です。
0139129NGNG
>>137
怒ったんすか?なにぶん初心者なもんで・・
ゴメンナサイ。
0140デフォルトの名無しさんNGNG
一番肝心なコンパイラが何か書いてないし
0141129NGNG
C machine Version 2.00
とか言ううやつです。。。

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

だそうです。
0142131NGNG
>>132
>>133
ありがとうございました。
う〜ん、_ctype[] の中を見ることはできなさそうですね。残念。
0143デフォルトの名無しさんNGNG
>>141
なんだか分からんが、fopen()、fseek()してftell()で調べるのが
どこでも動いていんじゃないかな。パフォーマンスは悪いが。
0144デフォルトの名無しさんNGNG
>>142
ええ?なんで?ソースに書いてあるんじゃないの?
もしないなら、プログラム書いて配列先頭から順番に
出力してみたら?
0145デフォルトの名無しさんNGNG
MFC使えるならCFileのGetLength()でもええし
0146デフォルトの名無しさんNGNG
MFC使えるならCFileのGetLength()でもええし
0147デフォルトの名無しさんNGNG
GetFileSizeとかいうAPIがあったと思う.
0148デフォルトの名無しさんNGNG
>>144
ソースはなかったと思う。
ライブラリを逆汗するという方法もある。(藁
0149デフォルトの名無しさんNGNG
一つ教えてくらはい。
enumって無条件にintになるじゃないですか?(あってる?)
それをcharとか割り当てサイズを変えたいのですが。。。
あくまでも、enumにこだわっています。
0150デフォルトの名無しさんNGNG
>>149
-fshort-enums が使えるんじゃない?(大爆笑)
0151デフォルトの名無しさんNGNG
コムパイルオプチョンですか。。却下。

こういうふうに書きてぇ〜>ANSI C改革!
typedef char enum {
hoge,
hage,
hige
}hhh;
0152デフォルトの名無しさんNGNG
>>151
C++使えば?
http://www.interq.or.jp/jazz/iijima/primer/comment/enum.html
0153デフォルトの名無しさんNGNG
>>152
意味不明な指摘だな...

>>151
enumはintと同じ扱いだから例えば255以下が保証できるなら勝手にchar配列
にとりゃいいんだよ。キャストしないとwarningはでるだろうけどね.
0154ジョル.ビブズ(偽者)NGNG
あのちょっと参考に聞かせてほしいのです。
自分は、C言語を一応使えるようになった(と、思っている)レベルなんですが
さまざまな長さの行を持つテキストファイルを1行づつreadしてmallocした領域
に放り込んで、各行をポインタのチェーンで結んでやって行を移動できるようにしたい
んですが(テキストエディタの基本構造を作成してるんです)小規模なファイルなら
問題なく動作するんですが、極端に大きいファイルだと使い物にならないくらいに遅い
んですが、これを回避する方法はあるのでしょうか?
0155デフォルトの名無しさんNGNG
極端に大きいとないんじゃないか?メモリを増やすんだな。
0156デフォルトの名無しさんNGNG
>>152
そのURLがあったんで意味不明なんだが、C++を使うというのは
正しい指摘だな.
operator intとかoperator =を使えば少しおもしろいかもな.
0157デフォルトの名無しさんNGNG
一発で全部(もしくはチャンク全体)を読み込んで、リンクリストはその後一気に作る。
くらいか。
0158ジョル.ビブズ(偽者)NGNG
154の続き
で、思いついたのは巨大なファイルの一部だけをメモリに乗せておいて
メモリの範囲外を参照されたときにファイルを読み直しするように
すればOKか?と思ったのですがテキストエディタを作った事のある
方にお聞きしたいんですが「考え方」として合っていますか?
0159デフォルトの名無しさんNGNG
>>158
UNIX系なら何も考えないとそうなってるんだが.
0160ジョル.ビブズ(偽者)NGNG
>>159
あっそうか!
そうですよね!うーん自分であれこれ考えるより
素直に仮想記憶にお任せするしかないのかなあ?
0161デフォルトの名無しさんNGNG
>>159
大きいってどのくらいのファイル?
ただ単にプログラムがしょぼくて処理が遅くなってるだけでは?
0162デフォルトの名無しさんNGNG
>>161
極端っていうわけだから実メモリの数百倍以上じゃないか?
0163 NGNG
>>160
そうやって諦めちゃうから、メモリばっかり食う
アプリが出来ちゃうんだよね。

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

行の先頭のファイル位置だけを、メモリブロックに保存。
編集した行だけをメモリブロックに、もしそれが足りないなら
一時ファイルに書き出しておく・・
最後に保存するときに、全ての順番を整えます・・
0164デフォルトの名無しさんNGNG
おいおい malloc はシステムコールじゃないぜよ。
ブレークアドレスとかって知らんか?
0165デフォルトの名無しさんNGNG
C++は、もう破滅寸前。
ここらでSTLに挫折した、全体の95%相当のプログラマが
不買運動を起こし、消滅します。

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

http://piza.2ch.net/test/read.cgi?bbs=tech&key=995820118&ls=100
0166デフォルトの名無しさんNGNG
>>165
板違いだが反応してやろう。
STLが分からなければ、自分で同様な動作をする
クラステンプレートを設計してみな。listあたりが楽、
一通り出来たらSTLと動作を比較して、違いをソース
レベルで検証する。さすればSTLに対する理解がドーン
と深まる。
0167デフォルトの名無しさんNGNG
多体問題とかの物理の微分方程式を近似計算で数値的に解いてるんだけど
グラフィカルにみてみたい。コンソールでの知識しかないから、VCコンパ
イラのVisualな部分に頼れない。DOS窓で何とかならないものか?
0168デフォルトの名無しさんNGNG
VCならDialogベースで直接落書きしてみたら?
mainからのプログラムでないとわからん、つうのならJavaが楽なんだけど
0169デフォルトの名無しさんNGNG
ある変数のん番目のビットが0か1かを判断するマクロを作って
ください。自分ではよくわからないのでお願いします。
自分でやれなどのレスはご遠慮します。宿題は自分でやれってのも
ご遠慮ください。まともな返答以外はレスはいりません。
0170デフォルトの名無しさんNGNG
あ & (1 << ん)
0171デフォルトの名無しさんNGNG
>>169
「宿題は自分でやれ」以上にまともな返答はこの板にはないYO!(藁
0172デフォルトの名無しさんNGNG
弊社のソフトウェアを買って下さい。自分はよくわかりませんがお願いします。
説明をしろなどの返事はご遠慮します。営業なんだから営業やれってのもご遠慮ください。
色よい返答以外はいりません。

こんな営業が来たら蹴り返します。
0173デフォルトの名無しさんNGNG
>>172
つーかそんなやつ生かして返さないYO!
0174デフォルトの名無しさんNGNG
科学計算のプログラムについて書かれてる本などはないでしょうか。
0175 NGNG
>>174
Numerical Recipes
0176デフォルトの名無しさんNGNG
ジョブスよぉ
オナーニは一日に何回するんだ?
0177ジョブスNGNG
>>176
5回だ。
0178デフォルトの名無しさんNGNG
3次の2次方程式を解くプログラムってどう作ればいいんですか?
0179デフォルトの名無しさんNGNG
何次だよっ!
0180デフォルトの名無しさんNGNG
>>178
aX^3+bX^2+cX+d=0
を解くプログラムで
a=0の時の場合訳を考えろよ。
普通なら2次方程式の解を解くプログラムに振り分けるわな。
0181174NGNG
Numerical Recipes ってどんなことが書いてあるんですか?
アマゾンとかあんまり内容が書いてなくて買うのが不安なんですが。
学校の図書館にも置いてなかったし。
0182176NGNG
FreeBSD98からGCC使ってコンパイルしたいんだけど
具体的にどうやってやるか方法を掲載して在る所教えて。
0183デフォルトの名無しさんNGNG
>>177
少ないな.
0184ビル・ジョブスNGNG
よーゴミ野郎はとっととこのスレから出て行きな!
2ch出禁だな!ターコ!
でも仮想記憶のコードはお前らンコ以下のガキ
にはレベルが合わないよな。オレが悪かったよ。
さーて、そんな方程式簡単に解けるだろ!
マスマティカとか使えよ。
0185デフォルトの名無しさんNGNG
>>1 がホントならCで答えてやれよ.
0186デフォルトの名無しさんNGNG
どーせ使えねんだろ、マスしかかいたことねーくせに.
0187175NGNG
>>181
http://www.nr.com/
http://www.ulib.org/webRoot/Books/Numerical_Recipes/bookcpdf.html
とか見れば大体内容がわかるかも.
ちなみに原書と日本語訳では内容が若干異なるので注意.
概ね以下の構成でいろんな分野のアルゴリズムを解説してある.
1.アルゴリズム解説
2.ソースリスト提示
3.参考文献
図書館に買ってもらえば?
0188  NGNG
enum って必要なのか?

俺的には理解不能だし、いらない。
0189デフォルトの名無しさんNGNG
>>188
あればあったで便利な機能だよ。
いちいち定数に自分で数字を振りたくないときとか。
0190デフォルトの名無しさんNGNG
>>188
C-FAQ的話題だけど、
シンボルの列挙は記述が楽。デバッガでシンボル名が見える。
列挙使わないとすると、
#define hage 0
#define mage 1
#define sage 2
とか書いていくの?
これでhageを1に変更したい場合とか、
全部書き換えなきゃならないじゃん。
(perlやsedとかで自動生成する、みたいな反論は無しにしてね。)
0191デフォルトの名無しさんNGNG
それに列挙体ならまとめて書けるし。
enum {hage, mage, sage};
0192デフォルトの名無しさんNGNG
それこそ#defineと同じで
「無くても書けるがあった方が便利」
なシロモノだろ<列挙体
0193デフォルトの名無しさんNGNG
なにがいいたいのかよくわからん>192
0194デフォルトの名無しさんNGNG
enumはdefineと違ってローカルスコープをもてるからいいね。
C++ならばこれが重要になってくる。
0195デフォルトの名無しさんNGNG
>>194
同意。

加えて enum だと switch - case に漏れが無いかを、コンパイラや lint で
チェックできるのも便利かな。
0196デフォルトの名無しさんNGNG
>>188
実社会でホザく前にここでお勉強できてよかったね・・・
0197デフォルトの名無しさんNGNG
Visual C++でMFC使ってるんだけど、CBrushクラスで四角とか円とか描画すると
黒い境界が出るのはなんとかならないかな?あと、中身を塗りつぶさない方法も
わからない!四角形だったらCPenクラス使って線引くだけでいいんだけど、円は
かなり厳しい!まさか円の方程式使って一点一点描画するわけにもいかないし。
0198デフォルトの名無しさんNGNG
BSTRをcharに変換する方法を教えてください
0199デフォルトの名無しさんNGNG
>>198
WideCharToMultiByteあたりで変換すればよし
0200デフォルトの名無しさんNGNG
>>199
うそでしょ?
0201デフォルトの名無しさんNGNG
C言語の8進数表記が許せないです。
やつは危険すぎます。
いくらジョブズでも、いまさら8進数表記を
無くす訳にはいかなでしょうから、
せめて、なぜ、2進数表記すらないC言語で、
8進数が、しかもあんな危険な表記方法で
実装されているのか、理由を教えてください。
納得の行く理由があるのなら
多少は腹の虫も治まるかも知れないので。
0202デフォルトの名無しさんNGNG
言語は悪くない、知らなかったやつが悪い
0203デフォルトの名無しさんNGNG
>>201
8進数使わなきゃイーだろ。
0204デフォルトの名無しさんNGNG
つい0でパディングしてしまいます。
0205shigeNGNG

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

はエラーにってしまいますがアドレスszMojiを返したい場合にはどうすればいいのでしょうか。
やりたい事は解って頂けると思いますが・・・・
0207206NGNG
×はエラーにってしまいますが
○はエラーになってしまいますが
0208デフォルトの名無しさんNGNG
>>207
ローカル変数へのポインタを返してはいけない。
0209デフォルトの名無しさんNGNG
const char* ReturnMoji()
{
return "Hello,world!";
}
0210デフォルトの名無しさんNGNG
>>209
そんなことしても、なんも面白くないと思うが
せめて
const char* ReturnMoji(){
const static char* szMoji = "Hello,world!";
return szMoji;
}
0211206NGNG
なるほど、constですか。
グローバル変数を使うところでした。
ありがとうございました。
0212デフォルトの名無しさんNGNG
constじゃなくてstaticに注目されたし。
その前に210より209に注目されたし。
0213デフォルトの名無しさんNGNG
ていうか>>209-210は煽り。
0214デフォルトの名無しさんNGNG
>>208
ローカルでもstaticならokだろ、ゴルァ.
0215デフォルトの名無しさんNGNG
>>210
>const static char* szMoji = "Hello,world!";
staticにする意味無し

static const char szMoji[] = "Hello,world!";
なら意味もあるが
0216デフォルトの名無しさんNGNG
>>215
一からやり直した方がいいと思われ.
0217デフォルトの名無しさんNGNG
>>216
なぜに??
0218デフォルトの名無しさんNGNG
209や215はなんも間違ってないだろ。
やり直したほうがいいのは210=212。

209のようなコード書いて、コードをレビューする人間に
つっこまれたことは俺もある。
0219デフォルトの名無しさんNGNG
210と212は別人だね…。大変失礼。
逝ってきます。。
0220shigeNGNG
馬鹿が..............いる。
0221デフォルトの名無しさんNGNG
>>220
なぜに??
0222ジョル.ビブズ(偽者)NGNG
ほんもののビル.ジョブズ氏はもうこないんですか?
ファンだったのにぃ(めそめそ)
0223無能な姦理人@Shiri-QNGNG
□□□□■□□□□□■□□□□□□□□□□□□□□□□□□□□□
□□□■■□□□□□■□□□□□□□■■■■■■■■■■■■□□
□□■■□□□□□■■■■■■□□□□□□□□□□□□□■■□□
□■■□□■□□□■□□□□■□□□□□□□□□□□□■■□□□
□□■□■■□□■■■□□■■□□□□□□□□□□□■■□□□□
□□□■■□□■■□■■■■□□□□□□□□□□□■■□□□□□
□□■■□□□□□□□■■□□□□□□□□□□□■■□□□□□□
□□■□□□■□□□■■■■□□□□□□□□□□■□□□□□□□
□■■■■■■□□■■□□■■□□□□□□□□□■□□□□□□□
□□□□■□□□■■□□□□■■□□□□□□□□■□□□□□□□
□□■□■□■□□□□■■□□□□□□□□□□□■□□□□□□□
□□■□■□■□□□□□■■□□□□□□□□□□■□□□□□□□
□■■□■□■□□□□□□□□□□□□□□□□□■□□□□□□□
□■□□■□□□□■■■□□□□□□□□□□□□■□□□□□□□
□□□□■□□□□□□■■■□□□□□□□□□□■□□□□□□□
□□□□■□□□□□□□□■■□□□□□□■■■■□□□□□□□





続きはコチラです
http://www.geocities.com/entry_k/main/main01.html
0224デフォルトの名無しさんNGNG
const static char* szMoji = "Hello,world!"
と
static const char szMoji[] = "Hello,world!";
の違いってなんですか?

前者は「静的なポインタ変数」が変更不可能
後者は「変更不可能な文字配列=文字列リテラル」が静的
であってます?
0225デフォルトの名無しさんNGNG
前者は"Hello,world!"のアドレスを、
わざわざ静的なポインタにいれて値を返しているから無意味
ポインタにstaticが無くても"Hello,world!"が静的に確保されるので
一時的なポインタで良いものにstaticを付ける必要はない
0226デフォルトの名無しさんNGNG
>>225
なるほど、納得
Cのコードが読めていないのかと思った。ロジックでしたか。
0227デフォルトの名無しさんNGNG
別人だけど225を補足すると、
結論として、 >>206 のような「用途」には、 >>209 の方法がよいということね。

>アドレスszMojiを返したい場合にはどうすればいいのでしょうか
こういう、アドレスを〜 という書き方をしているせいで、static
云々の話になってしまったのかもしれないね。
0228デフォルトの名無しさんNGNG
>>199
198 ありがとうございました
0229デフォルトの名無しさんNGNG
>>222
来てもいいけど、今度は論理で勝負して欲しいもんだな。
定量評価せい、といわれても無視する上、匿名版でプライベート
自慢する寒さに気付かないようでは、単なるスレ上の障害物だ。
0230デフォルトの名無しさんNGNG
C言語とは直接関係無いかもしれませんが……。

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

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

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


先日、setjmp と longjmp の勉強をしていて、似たような状況になりました。
setjmp のある関数がリターンした後、longjmp をすると暴走する、とあったので、
ためしにやってみたのです。
longjmp の記述がある関数が無限ループになったらしく、そこに printf があって、
それをファイルにリダイレクトさせて実行していました。
ハードディスクがカリカリと音を立てて止まりません。ヤバイと思いDOS窓を強制終了させました。
で、300MBのテキストファイルが出来上がりました(笑)。
0231デフォルトの名無しさんNGNG
>>230
自分で試せ、ぼけっ。
0232デフォルトの名無しさんNGNG
平方根を高速に求める方法ってありますか?
あと立方根とかも?
0233デフォルトの名無しさんNGNG
extern float x, y;
y = sqrtf(x);
y = powf(x, 1/3.0f);
0234デフォルトの名無しさんNGNG
>>233
なぜにextern?
0235デフォルトの名無しさんNGNG
値が不定になるから.
0236デフォルトの名無しさんNGNG
powf()より速い実装どっかにありませんか?
0237デフォルトの名無しさんNGNG
powf()の実装って決まってるのですか?
0238デフォルトの名無しさんNGNG
powf()はMSよりボーランドが速いね。
0239デフォルトの名無しさんNGNG
>>238
本当?
0240デフォルトの名無しさんNGNG
フツー仕様は決まっても実装が決まっているものなんてないぞ。
0241デフォルトの名無しさんNGNG
>>240
そうは言っても、公開されているCの標準ライブラリの実装はほとんど
アルゴリズム集って言ってもいいくらい実装が同じだよね。
0242デフォルトの名無しさんNGNG
ちなみに、P.J.Plaugerの"The Standard C Library"は、
その名のとおり、C Standard Library内部の実装の解説本で、
K&Rと同じくらい有名な本。
読んでない人は読むべし本。
0243デフォルトの名無しさんNGNG
>>241
そりゃ元が同じだからじゃねーのか?
別に実装方法が決まってるわけじゃない。ま、的外れなだけで言いたいことは分かるが。
0244ななしNGNG
atoiってなんですか?
0245デフォルトの名無しさんNGNG
>244
A と I です。
引数を渡すと A と I の文字コードを足した数が返されます。

つーかネタであげんなや。まじで。
0246デフォルトの名無しさんNGNG
>>236
コプロに値を送るだけなので高速化しようがない
四則演算一回やるのと同じで、
値が決め打ちでもない限りアルゴリズムもへったくれもない
0247>>244NGNG
Ascii TO Integerさ。数字を数値に変換するのさ。
0248デフォルトの名無しさんNGNG
>>246
コプロってフツーpowは持ってなくない?
0249デフォルトの名無しさんNGNG
つか atoi みて思ったんだけど、
なんで itoa ってあるんだろ?
使うやつなんているの?

現役の人に聞きたいです。
0250デフォルトの名無しさんNGNG
>>249sprintfよりitoaのが短いから(藁
0251デフォルトの名無しさんNGNG
>>240
元が同じだからじゃない。
Cの標準ライブラリはアルゴリズムとして定着しているからだよ。
0252251NGNG
>>243 だった。
0253デフォルトの名無しさんNGNG
>>249 ベンダの独自関数だろ C99にはあるのか?
ANSI X3.159-1989 のCには少なくともそんな関数ないぞ?
0254デフォルトの名無しさんNGNG
えっと、他スレでも一度質問したんですが、
調べても結局わからなかったので・・・

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

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

どなたかわかる方いらっしゃいましたら、
どうかご教授おねがいします。m( _ _ )m
0255デフォルトの名無しさんNGNG
>>254
無理です。普通の DLL にはそもそもその情報が含まれていません。
0256249NGNG
>250

なるほど(w

>253

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

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

でもどちらにしろ意味ないね(w
0257254NGNG
>255

ということは一つのDLLごとに
そのDLLのための構造体などを処理系側で
用意しないといけないということですか?・・・
0258デフォルトの名無しさんNGNG
atokってなんですか?
0259デフォルトの名無しさんNGNG
>>257 DLLとかヘッダファイルを一緒に流通させるとか。
COMにすれば?
0260デフォルトの名無しさんNGNG
>>258 そうか!
atokの名前の意味に始めて気がついたよ
0261254NGNG
>259
えっと、COMがよくわからないんですが、
DLLってCOMが必ず含まれているんですか?
(なんか表現変ですね・・・)
0262デフォルトの名無しさんNGNG
>>260
阿波・徳島の略です。
0263デフォルトの名無しさんNGNG
じゃあ呼び名は「エー・トゥ・ケー」でいいんか?
昔「あとく」か「あとき」とかで口論した覚えがある(藁
0264デフォルトの名無しさんNGNG
そういや「えいとく」ってのもあったな。
Cと関係なくてスマソ
0265デフォルトの名無しさんNGNG
>>263-264
あの〜、>>262はマジレスなんですが…
0266デフォルトの名無しさんNGNG
>>265
Ascii To 漢字 じゃないの?
マジレスと言いつつネタだったらすまんが
0267デフォルトの名無しさんNGNG
現在ではAdvanced Technology of Kana-kanji transgferてなアナグラムが
公式だけど、これは後付。元はAscii to Kanaと阿波徳島のダブルミーニング。
0268デフォルトの名無しさんNGNG
浮動小数点と固定小数点ってなにが違うんですか?精度とかも違うんでしょうか?
0269デフォルトの名無しさんNGNG
#include <stdio.h>

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

ConHell.exe - エラー 1、警告 0
が出て,実行でません! プロジェクトの設定を変えたりしているのですが、
よく分かりません。解決方法教えてください。 お願いします。
0270デフォルトの名無しさんNGNG
>>269
コンソールアプリケーションで作ったか?
0271あああNGNG
C言語の関数(ソース付き)を集めたサイトってあります?
無かったら作ろうと思うんだけどどう思う?
0272デフォルトの名無しさんNGNG
>271
フリーで商用利用もおっけーな事を保証してくれるなら作ってくれ
0273デフォルトの名無しさんNGNG
フリーと謳いつつ他人のソースのパクリがあったりすると厄介だな
0274デフォルトの名無しさんNGNG
>>270
コンソールアプリケーションでつくりました。
1.新規作成のプロジェクトでWin32ConsoleApplicationを選択。
2.空のプロジェクトでリターン。
3.新規作成でC++ソースファイルにて、フェイル名を入力して。
です。
 なにか、問題があるのですか? それとも、設定方法とか、よろしくお願いします。
0275デフォルトの名無しさんNGNG
>>269
何故エラーメッセージもヘルプも読まない?

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

debugビルドなのに最適化オプションが指定されてるように見えるが。
0276あああNGNG
法律的に難しかったりするんすか?
流石に会社のライブラリを公開しようとは思わないけどさ。
ニーズはあるでしょ?
0277デフォルトの名無しさんNGNG
>>271
ここに作ってくれよ。いいものならみんな協力してくれるぞ。
0278デフォルトの名無しさんNGNG
>>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

お願いします。
0279なんでやねんNGNG
>>278
>外部シンボル "_WinMain@16" は未解決です

ってコンソールアプリじゃないやん!
02801NGNG
>>279
本当に。笑えた。
0281デフォルトの名無しさんNGNG
>>278
"Win32"Consoleにしたからじゃない?
ソースを"MSDEVで開く"で開いて、そのままコンパイルしてみ。
0282デフォルトの名無しさんNGNG
>>270さん、275さん、279さん、281さん他のみなさま、大変ご迷惑をおかけしまして
申し訳ありませんでした・・・・m(__)m
まじめに、"Win32"Console”でソースプログラムを作っておりました・・・・
全て、解決しました!
先ほど,VC++あんしん入門とC++デバック技術の本(計6699円)を購入してまいりました。
こんごは、上記なような、おろかな質問をしないよう、精進してまいりたいとおもいます。
今後とも、宜しくお願い申し上げます。 Mr.℃氏ロート
0283デフォルトの名無しさんNGNG
というか、その程度の物、コマンドラインでコンパイルすりゃいいじゃん。
0284デフォルトの名無しさんNGNG
いやだー、夏厨多すぎるー!
0285デフォルトの名無しさんNGNG
age
0286デフォルトの名無しさんNGNG
自作のルーチンなのに企業ベースにちょっと似てるから
告訴なんてされると嫌だな。
0287デフォルトの名無しさんNGNG
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);
}
}
}
どこがまずい?
0288デフォルトの名無しさんNGNG
>>287
ぱっと見た限りだと *cp4++=*cp1++ の場所がまずそう
0289デフォルトの名無しさんNGNG
strcpy(cp3,cp4);
strcpy(cp4+strlen(cp3),cp3+m);
何がしたいのか説明してくれ(;´Д`)
0290デフォルトの名無しさんNGNG
いや、やりたいことすら推理させ、かつ間違いを探す・・・
こういうゲームは大好きだな。
0291デフォルトの名無しさんNGNG
>>287
Cだとこういう無国籍かつ意味不明なコード
良く見るからやだね〜ったら、やだね〜
0292デフォルトの名無しさんNGNG
このくらいのレベルだとフローチャート書けってのもわかるなぁ
0293デフォルトの名無しさんNGNG
>>291
perlよりマシだけど…
0294デフォルトの名無しさんNGNG
>>287
コメント等から予想できるコードと、実際のコード違いが、
あまりにも大き過ぎるので、何をやりたいか、全く把握できません。
取り敢えず、与える文字列(cp1,cp2,cp3)と、それに応じて、
変化する文字列(cp3,cp4)の結果の例をいくつか上げて下さい。
0295こうか?NGNG
for(; n>=m; n--,*cp4++=*cp1++) {
 if(memcmp(cp1,cp2,m)==0) {
  strcpy(cp4,cp3);
  cp1 += m; /*strlen(cp2);*/
  cp4 += strlen(cp3);
 }
}
02962chの夏、厨房の夏NGNG
288の言うとおり
*cp4++=*cp1++ はヤバイ
ttp://www.catnet.ne.jp/kouno/c_faq/c3.html#0
を熟読せよ。
コンパイラを信じて可読性のあるコードにしたほうが
デバッグが楽。
*cp4++=*cp1++ は分けて表示したほうが吉。
0297デフォルトの名無しさんNGNG
>>296
C FAQよんだけど「*cp4++=*cp1++ はヤバイ」の理由がわかりません。
解説お願いします。
0298デフォルトの名無しさんNGNG
>>296
なにか勘違いしてると思われ。
0299デフォルトの名無しさんNGNG
>>297
逆に質問
なぜヤバくないと思うのかを教えて
0300デフォルトの名無しさんNGNG
>>299
>>296 のページに「*a++=*b++」って書き方がまずいって書いてあるんでしょ?
でも、自分はどこにそれが書いてあるのかわかりません。
どこが該当個所か教えてください。
0301デフォルトの名無しさんNGNG
>>299
演算順序気にしてるんだろ
つーか、それよりもそんなところにあってあふれねーか?
って方が気になるがな。
0302デフォルトの名無しさんNGNG
「*cp4++=*cp1++」に演算子の評価順序は関係ないっしょ。
>>296 は知ったかしてるだけ。
0303デフォルトの名無しさんNGNG
じゃあこのコードってマズイの?
char *strcpy(char s1, const s2)
{
  while( *s1++ = *s2++)
    ;
  return s2;
}
0304デフォルトの名無しさんNGNG
>>303
間違えた
> char *strcpy(char s1, const s2)
char *strcpy(char *s1, const char *s2)
0305煽りのようだがマジレスNGNG
>>300
つーかコードの文字列そのものが資料に見当たらないってだけで
思考が止まってしまう野郎にプログラミングの資格なし。
つーか人工、自然言語問わず語学全般絶対無理。
おとなしくドカチンかライン工でもしてるのが吉。
0306デフォルトの名無しさんNGNG
>>305
ドカチンでもいいから、どこが該当個所か教えてよ。ねえ?
0307デフォルトの名無しさんNGNG
>>306
だーかーらー、a++=b++なんて書き方すると
処理の順序が直感的にわかりにくいだろ?
そんなバグの温床になるような書き方するなつってんだよ!ヴォケ!
0308デフォルトの名無しさんNGNG
>>307
結局、思わせぶりに持ち出したC FAQは、なんの関係も無かった
わけね。トホホ
0309デフォルトの名無しさんNGNG
>>307
そりゃあんたがバカなだけだ。
0310デフォルトの名無しさんNGNG
>>307
結局わかりにくいってだけなの?
問題ないんだよね?
0311デフォルトの名無しさんNGNG
*a++ = *b++; ← これ。
好き嫌いはあるだろうけど、Cだとイデオムだと思う。
こういう書き方をヘタってのは言い過ぎだと思うよ。
0312デフォルトの名無しさんNGNG
じゃ結論は、>>296 がバカってことで。
0313デフォルトの名無しさんNGNG
(゚д゚)ハァ?>>309
わかり易い=技術が低いとか思ってないか?
人をバカ呼ばわりするヒマあったらてめぇのソースに
コメントでも付けてろ、この腐れ厨房が。逝ってよし!
0314デフォルトの名無しさんNGNG
>>313
ほっときゃいーじゃん。これ以上いじめてもかわいそうだよ。
0315307=313NGNG
ここでも読んで少しは勉強しろよ。ドキュソ厨房が(怒
http://www.pro.or.jp/~fuji/mybooks/cdiag/index.html#appendix
0316ソープNGNG
高いね。
0317デフォルトの名無しさんNGNG
>>315
で、そこのリンク先には「わかりやすいプログラムを書こう」とは言っているが
「*a++ = *b++;はわかりにくい」とは言っていないね。

*a++ = *b++;はCでは慣用句であり、無理に書く必要はないが、
知っといた方がいい。
0318デフォルトの名無しさんNGNG
ちなみにMSのCRTのソースより
memcpy
while (count--) {
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
これはvoid *で受けてるからか

strcpy
while( *cp++ = *src++ )
;
でした
0319デフォルトの名無しさんNGNG
わからない ってのと、わかるけどやらない ってのは
別物だぜ、>>307
0320デフォルトの名無しさんNGNG
C99フルサポートした処理系って未だでないの?
0321デフォルトの名無しさんNGNG
>>320
ないよ。
0322デフォルトの名無しさんNGNG
http://www.ucatv.ne.jp/~spitznao/itimatu.htm
0323デフォルトの名無しさんNGNG
↑クリック無用
0324デフォルトの名無しさんNGNG
今日はバカが一人紛れ込んでるのでクリックには注意して下さい。
0325デフォルトの名無しさんNGNG
>>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 ) ; }
0326デフォルトの名無しさんNGNG
#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と出てきます。
ポインタに代入する値をいろいろ変えてみたのですが、
必ず配列の最初と同じ値が出ます。
ただの偶然ですか?
0327326NGNG
スマソ。
×*(pa + i) = (i + 1) * 10;
○*pa = (i + 1) * 10;
です。
0328デフォルトの名無しさんNGNG
a[3]とs[3]がスタック上にどう取られてるかによる
s[0],s[1],s[2],a[0],a[1],a[2]
になってるとすると最後の*ps=s[3]はa[0]の所を指してるだけ
0329デフォルトの名無しさんNGNG
>>325
偶然と言えば偶然だし、必然と言えば必然。
なんでそうなるのか知りたければ、
printf ( "\n%d %d %d %d\n", a, s, pa, ps ) ;
の1行を最後に追加すれば、その理由が見えてきます。
0330学生NGNG
editに文字列吐かせたら\nじゃ改行しなかった。
調べたら\r\nだそうで・・・。Windowsだからこうなるんですよね?
0331デフォルトの名無しさんNGNG
個人的にウケたのでここで紹介age
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=996739281&st=6&to=6&nofirst=true
0332デフォルトの名無しさんNGNG
>>330
APIスレの方がいいのでは?
Winだからそうなるんですけど。
0333デフォルトの名無しさんNGNG
>>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--;
  }
 }
}
0334デフォルトの名無しさんNGNG
ハミング距離を求めるコードを書いているのですが
うまい具合に記述することが出来ません。
どなたか綺麗に記述した例を示してくれませんか?
0335334NGNG
自己解決しました。
0336デフォルトの名無しさんNGNG
>>333
駄目じゃん。
0337学生NGNG
>>332
やっぱりWinだからですか。ありがとー。

ちなみに、ジョブスは何て答えるか興味があって
あえてここで聞いてみました。
0338デフォルトの名無しさんNGNG
void test(char str[])
{
printf("test : %s\n", str);
}

なぜ str[] みたいな書き方がOKなんですか?
0339デフォルトの名無しさんNGNG
>>337
ジョブスうんぬん以前の問題だろ。そのくらい適当なプログラム
作って確かめられるだろーが。
0340デフォルトの名無しさんNGNG
>>338
そういう仕様だからです。
0341デフォルトの名無しさんNGNG
質問させてもらいます。
下のコードのmain関数内でポインタ変数char* heapを確保して
それをSetArray関数に渡してSetArray内でヒープ領域にメモリを確保したいのですが
エラーがでました。
よく考えたらheapを渡す時点でheapが実態をどこも指してないのが理由という事に気づきました。
では、このような事がしたい時にはどうすればよいのでしょうか?

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

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

void SetArray(char* pointer)
{
  pointer = new char[128];
  strcpy(pointer,"できるかな?");
}
0342デフォルトの名無しさんNGNG
ポインタのポインタ。
SetArray に「何が」渡されているのか考えてみよう。

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

void SetArray(char** pointer)
{
*pointer = new char[128];
strcpy(*pointer,"できるかな?");
}
0343デフォルトの名無しさんNGNG
void SetArray(char*&pointer)
{
pointer = new char[128];
strcpy(pointer,"できるかな?");
}

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

C++だったらこうも書ける。
つか文字列クラス使え。
0344デフォルトの名無しさんNGNG
むむむぅポインタのポインタですか・・・・・・
もう混乱してきましたがこれからよく考えて消化したいと思います。
ありがとうございました。
0345デフォルトの名無しさんNGNG
>>343さん
それです。私が調べているうちに発見したのは。
これまた混乱してきましたが併せて消化させてもらいたいと思います。
またまたありがとうございました。
0346デフォルトの名無しさんNGNG
バグのもとだから絶対やめとけよ.
0347デフォルトの名無しさんNGNG
すみません
Cで1京の階乗(10,000,000,000,000,000!)の概算をしたいのですが
高速に計算する方法がみつからなくて詰まっています。
精度は 6 桁 で ?.???e?? 形式で出力したいです。

30万! 程度までは求められたのですが、ループしていたのでは
焼け石に水のようです。どうか宜しくご教示お願いいたします。
0348デフォルトの名無しさんNGNG
>>347
近似値でいいなら「スターリングの公式」で検索してみな。
0349347NGNG
>>348
ありがとうございます。
数学は弱いので理解できるか不安ですが
がんばってみます。
0350347NGNG
解けました!
0351デフォルトの名無しさんNGNG
>>347
ところで、何に使うの?
0352デフォルトの名無しさんNGNG
ベンチマークでは?
0353デフォルトの名無しさんNGNG
宿題じゃねーのか?
0354デフォルトの名無しさんNGNG
夏休み?
0355デフォルトの名無しさんNGNG
構造体のアライメントの隙間にデータを格納する 方法を教えてください。
0356デフォルトの名無しさんNGNG
>>355
なんのためにそんなことすんの?
0357355NGNG
>>356
メモリの節約のためです。
0358デフォルトの名無しさんNGNG
>>357
コンパイラのマニュアルを読んで、構造体の隙間を詰める
オプションが無いか調べてください。
0359孫悟空NGNG
>>355
使ってるコンパイラのコンパイルオプションにアライメント指定オプションがないか、
調べれ
#pragmaプリプロセッサ命令も調べてみれ
0360デフォルトの名無しさんNGNG
>>355
つーか、隙間が出来ないように宣言に工夫しろ。
0361デフォルトの名無しさんNGNG
>>360
どーやって?
0362デフォルトの名無しさんNGNG
>>361
ビット構造体
0363デフォルトの名無しさんNGNG
>>361
ワード境界に気を配って、char,int,charなんて並べないようにするとか。
あと、最近のコンパイラは賢くてかってに並び替えるから心配するな。
0364361NGNG
>>362
あーそーですか。
0365デフォルトの名無しさんNGNG
>あと、最近のコンパイラは賢くてかってに並び替えるから心配するな。

メジャーなコンパイラは並べ替えなんてやってないよ。
0366デフォルトの名無しさんNGNG
>>365
そう?
まあそうしたら自分で気をつけるんだね。
0367デフォルトの名無しさんNGNG
>>366
適当なこといって「そう?」かよ。
0368デフォルトの名無しさんNGNG
フォルダのファイル一覧、テキスト化したいので
簡単に取得する方法教えてくださいな。
0369デフォルトの名無しさんNGNG
>>368
dir >hoge.txt
0370デフォルトの名無しさんNGNG
ls > tmp.txt
0371デフォルトの名無しさんNGNG
>>368
system("command.com dir > dir.txt")
0372デフォルトの名無しさんNGNG
言われればごもっとも。
0373デフォルトの名無しさんNGNG
でもリダイレクトか。卑怯だね。
Perlのglobみたいなん無いの?
0374デフォルトの名無しさんNGNG
>>373
卑怯でも何でも、いちばん簡単で確実な手法を取るのは当然のこと。
これが確実じゃない環境(シェルがないとか)なら別の方法を考えるが。
0375デフォルトの名無しさんNGNG
>>373
シェルスクリプトじゃ常套句だけど。

for i in `ls`;do
echo $i
done
0376370NGNG
>>369-371
^^;
0377デフォルトの名無しさんNGNG
まあ、U**X だったらこれ。
man opendir
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/opendir.3.html
0378デフォルトの名無しさんNGNG
if(a == 3 || ++b == 10)
見たいな場合に、もしa == 3だったら++b == 10の判定はおこなわれないので
しょうか?
0379デフォルトの名無しさんNGNG
>>378
おこなわれません。
0380379NGNG
>>379
本当ですか?
0381デフォルトの名無しさんNGNG
>>380
それが仕様です。
0382デフォルトの名無しさんNGNG
http://homepage2.nifty.com/katuya/index.html
0383デフォルトの名無しさんNGNG
>>382
危険です。
0384デフォルトの名無しさんNGNG
>>380
おこなってほしい人はパスカルをつかいましょう。
DelphiやKylixをどうぞ。
0385デフォルトの名無しさんNGNG
>>384
なんでそーなる。ちょっと書き方を変えればすむ話じゃないか
0386デフォルトの名無しさんNGNG
ていうか条件判断式に副作用のある演算子を書くやつを俺は信用しない。
そんなやつは何使わせても一緒だ。
0387デフォルトの名無しさんNGNG
>>386
問題提起として書いただけでは。本人だってどうなるかわからんから
一応聞いてみただけだろ。そんなことも考えないやつだって
いるし、そういう奴の方が問題だよ。
0388デフォルトの名無しさんNGNG
関数の引数はいくつぐらいまでなら許されるのでしょうか?
1つの関数の引数を減らすためだけに構造体を使うのもどうかと思うので。
0389デフォルトの名無しさんNGNG
>388
特にこれといった数はないので必要なら好きなだけ渡せばいい。

ただ、それらの引数郡(の一部)が
頻繁に他の関数にも渡されているなら再考の余地あり。
その場合は構造体にして渡すか
初期化関数などで一度だけ渡すようにする。
0390デフォルトの名無しさんNGNG
絵を表示したいんだけど、やはりWindowsプログラミングの知識が必要
ですか?Windows使ってるんで。
2重振り子の様子みたいなのを書いてみたいんだけど、数値だけ計算して
もつまらないので。
LinuxってやつのGUIの方が楽なんでしょうか。
0391デフォルトの名無しさんNGNG
>>390
C言語でやりたいというならどっちでも同じ。
0392デフォルトの名無しさんNGNG
>>390
それならJAVAがお薦めです。
0393デフォルトの名無しさんNGNG
>>390
それならVBがお勧めです
0394デフォルトの名無しさんNGNG
今後のことも考えるならGLとか。
0395デフォルトの名無しさんNGNG
>>390
それならDelphiがオススメです。
0396デフォルトの名無しさんNGNG
>>390
それならCocoaがオススメです。
0397デフォルトの名無しさんNGNG
>>390
それならjavascriptがお勧めっす。
0398デフォルトの名無しさんNGNG
>>390
それならHSPがお奨めです。
0399デフォルトの名無しさんNGNG
>>398
いや、それだけはお奨めしません。
0400398NGNG
>>399
why?
0401デフォルトの名無しさんNGNG
先が無いからでしょう
0402デフォルトの名無しさんNGNG
>>401
Javaにもないでしょ。
0403デフォルトの名無しさんNGNG
>>402
まだ企業によっては潰しが効く。
面接で HSP 使えマース。なんていったらただのアホでしょ。
0404デフォルトの名無しさんNGNG
C言語で(C++でのお話も聞きたいけど)、<< や >> 演算子に対して、
扱おうとする整数型のビット数以上のビットシフトをやらせようと
したときの結果は処理系とか環境に依存しますか?
0405デフォルトの名無しさんNGNG
>>404
普通は0になるけど、どうなんだろ。
0406デフォルトの名無しさんNGNG
その状況を見てその中身を数値として
書き換えるべくファイルに戻したいと
言う時
(たとえば
   1 2 3 4
 A=[ 5 6 7 8 ]
   9 10 11 12
 と言うような3行4列の行列)
はどんな命令(fget? fput?)
を使えばいいのでしょうか?
ファイルの行列の記述の仕方も含めてお教え下さい。
0407お厨腐人NGNG
>>404
不貞。
やだ!奥様がそんなことなさるお方とは思いませんでしたわ!
見損ないましてよ!
0408デフォルトの名無しさんNGNG
>>406
まず適切に質問をする能力を身に付けてくれ。
>その状況を見てその中身を
「その」って何だ?

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

1 2 3 4
4 5 6 7
9 10 11 12
」
ということか?
0409デフォルトの名無しさんNGNG
>>407
うっそだー。
0410406NGNG
>>408
そのとうりだ。
0411デフォルトの名無しさんNGNG
>>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);
0412デフォルトの名無しさんNGNG
激しく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);
0413デフォルトの名無しさんNGNG
>>411
s/&bnsp;/ /g

あと、書換えることを考えると、最大桁数が8桁と仮定すると
> fprintf(fp, "%d ", a[i][j]);
fprintf(fp, "%8d ", a[i][j]);
とかの方がいいかもしれない
0414406NGNG
うむ、ごくろうであった。
0415デフォルトの名無しさんNGNG
>>414
じゃ、書き換えは自分で考えてくれ
0416デフォルトの名無しさんNGNG
>>413
どうも。読み込みの方はよろしく。
fscanf 版と strtok 版で(笑
0417デフォルトの名無しさんNGNG
>>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
と表示する。
0418406NGNG
うむ、よきにはからえ。
0419デフォルトの名無しさんNGNG
>>400
いやぁ、前にちょっとHSPのスレを煽って見たんだけど
他の言語と違って確実に厨な反応をするんだよね。

どうでもいいのでsage
0420デフォルトの名無しさんNGNG
>>417
gcc (cygwin) と bcc32 でも同じだった。
64bit OS だと違ったりするかね。
0421お厨腐人NGNG
>>409
あら、あたくしK&R両先生の御教えにすがることしかできない
か弱いお厨の女ですのに…そんな言い方…、酷い…。
どうぞ K&R2nd(共立出版.邦訳) p253をごらんになって
くださいまし……
0422デフォルトの名無しさんNGNG
>>412
俺、持ってない。かいつまんで教えてくれるとすごい幸せ。
0423422NGNG
あ、422は>>421に対するレスね
さっき首つろうとして失敗したからだな、多分
0424 NGNG
何処で質問していいかわからないのでここで質問させてもらいます。
PC,デジタル時計。。。問わず、1秒ってどのようにカウントしてるんですか?
ある一定の条件下である一定の処理を規定回数実行したら1秒なんでしょうか?
0425デフォルトの名無しさんNGNG
>>424
sleep(1); とか。
精度はどのくらいほしいんだい?
0426424NGNG
>sleep(1); とか。
例えばそのsleep(1)で呼び出しても、まさか人間みたく感覚で時間を
カウントして実行結果を返すわけじゃないですよね?
その実際に時間を生成する仕組みが知りたいんです。
0427デフォルトの名無しさんNGNG
>>424
水晶発振体の振動回数を元にしています。いわゆるクォーツ。
http://www.hyperdyne.co.jp/~oohashi/work/inet2/03time/03time.shtml
0428デフォルトの名無しさんNGNG
>>426
そりゃーあんた、おおもとを辿れば、時計見てるんだよ。
0429奈々資産NGNG
マザーボードに小型のGショックが内蔵されてるのかと思った
0430デフォルトの名無しさんNGNG
>>426

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

上記と原理は一緒、腕時計の場合は歯車をまわすが、
PCの場合、内部カウンタをカウントUPする。
0431デフォルトの名無しさんNGNG
その水晶発振体は時計を見て振動している。
0432お厨腐人NGNG
>>422=423
上掲書 p253 A7.8 シフト演算子 の項に
>右演算数が負であったり、左側の式の型のビット長より大きいか等しい場合、
>結果は不定となる。
とあるのですわ。
0433デフォルトの名無しさんNGNG
>>432
ありがと。
>右演算数が負であったり
ここの部分は右ビットシフト、左ビットシフト関係なくなのかな?
ずっと(int)-4 >> 1 は(int)-2だと思ってたけどそうじゃない
ってこともあるのかな。
0434デフォルトの名無しさんNGNG
>>433
うむ。 2147483646 になる処理系があっても悪くはない。
…俺は見たこと無いけど。

Javaだと >> << は算術シフトと決まってるみたいだね。
0435お厨腐人NGNG
>>433
揚げ足とりみたいになって恐縮なのですけれど…
>右演算数が負
というのは x >> -1 と書いても
それが x << 1 と処理される保証はない、ということを
仰りたいのだと思いますわ。
符号付整数(で、その値が負であるとき)の右シフトの結果については、
>>結果は処理系に依存する
と、書いておられますわ。
0436433NGNG
>>435
ありがと。あ、右ってそういうことね。わかった。
0437デフォルトの名無しさんNGNG
とある関数内の変数宣言で
static int a,b,c
だと変な動作になるのに、
使わない変数dを加えて
static int a,b,c,d
で宣言するとちゃんと動くようになりました。
dは一度も使わない変数です。

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

これってどういうことでしょう?
ド素人厨房なんで意味わからない質問でスマソ
0438デフォルトの名無しさんNGNG
>>437
その関数のソースを書いてくれないとどうにもならん。
0439デフォルトの名無しさんNGNG
>>437
初心者によくある現象だね。
0440( ゚Д゚)ウボァー!NGNG
>>439
たとえばどんなとき?
0441デフォルトの名無しさんNGNG
>>440
メモリを破壊しているとき
0442437NGNG
>>438
ヘタレなんでそんな・・・

>>439
>>441
メモリを破壊しないようにするためには
どういうことに注意していればいいですか?
0443デフォルトの名無しさんNGNG
>>442
メモリを破壊しないように注意するんだよ。
ポインタがvalidなとこを指しているかどうかだけ気をつけりゃいーんだよ。
0444437NGNG
>>443
validってなんですか?
0445デフォルトの名無しさんNGNG
valid=有効
和英引け
443は正確な意味をわからずに,この単語を使っていると思われ
0446437NGNG
>>445
サンクス
0447デフォルトの名無しさんNGNG
和英にゃ載ってらんだろ。
445は正確な意味をわからずに,この単語を使っていると思われ
0448455NGNG
しまった
0449デフォルトの名無しさんNGNG
読みこんだファイルが何バイトか知りたい
ときってひとつずつ数えていかなきゃダメ?
0450デフォルトの名無しさんNGNG
カンマと改行区切りの文字列を渡すと、
みためにきれいになるように(カンマの位置がすべてそろうように)
整形する関数をつくれば良いのではないでしょーか。

"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

こんな関数作って〜〜
0451デフォルトの名無しさんNGNG
文字列を整形するの?
整形した文字列を出力するの?
0452デフォルトの名無しさんNGNG
>>450
まず最初に文字列を走査して、
各列(カンマ区切り)の最長単語長を見つける。
一文字ずつ見ていって , が出るまでカウントを増やせば良い。
例えば、
a[0] = 5 // cobol = 5
a[1] = 7 // fortran = 7
a[2] = 4 // perl = 4

次に、また文字列を走査、同じように一文字ずつ見ていく。
また単語の長さをカウントしておく。
次の文字が区切り文字だったら、
その列の最長単語長-現在の単語長分だけ空白を入れる。
0453デフォルトの名無しさんNGNG
a[0] ←最初、単語の数は分かっていないのでは。
0454452NGNG
>>453
仕様として決め打ち、あるいは3パス(笑
0455デフォルトの名無しさんNGNG
>>449
fseek でファイルの最後に飛んで、それから ftell を呼べば
良いと思う
0456デフォルトの名無しさんNGNG
>>449
UNIX系だったら man stat すれ。
0457デフォルトの名無しさんNGNG
>>449
「読みこんだファイルが何バイトか知りたい 」
読み込み済みのファイルだったら、サイズは自明だと思うが…
0458デフォルトの名無しさんNGNG
>>452-454
最初は、各行の1番目の単語について最長単語長を調べる。
つぎに、各行の2        〃

配列を確保する必要は全く無い。
0459デフォルトの名無しさんNGNG
makeモドキを作ろうとしています。
そこで、ファイルの時間を取得して、
比較するにはどうすればいいんでしょう?
取得はとりあえずstat/fstatでするとして、
比較の方法がわかりません
0460459NGNG
time_t型の比較の方法がわかればいいんですが。
typedef long time_t;
となってるので、そのままlong値で比較して良いものでしょうか?
0461デフォルトの名無しさんNGNG
>>460
平林雅英著 新ANSI C言語辞典によると、
普通に比較演算子で比較してもいいらしい。
0462デフォルトの名無しさんNGNG
>>457
え?どうすりゃいいの?
たとえば、今から「aborn」っていうファイルが何バイト
か知りたいゼ!っていうときは。
厨房でスマソ
0463デフォルトの名無しさんNGNG
>>462
ちゃんと>>455,>>456に書いてあるだろ。
0464デフォルトの名無しさんNGNG
>>462
それは「読み込んだファイル」とは言わないだろ。
0465 NGNG
C言語を勉強中の後輩にヤル気が起きないので困っています。(;´Д`)
0466デフォルトの名無しさんNGNG
Cを勉強中の後輩(男)に犯る気が起きて困っています。(;´Д`)
0467デフォルトの名無しさんNGNG
しつもんします
-------------------
char age[10];
char sage;

scanf("%s", age);
scanf("%c", &sage);
--------------------
ってやると2回目のscanfが実行されてないような気がするのですが…
ひょっとして1回目のscanfでリターンすると%cでそれを入れてしまうのでしょうか?
0468デフォルトの名無しさんNGNG
>>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);

のほうが安全。
0469468NGNG
sscanf のところをミスった。

sscanf(linebuff, "%s", age);
ね。
0470460NGNG
ありがとうございます。
うまくいきました。
0471デフォルトの名無しさんNGNG
非国民がー。
0472462NGNG
>>463
スマソ。よく見てなかった。
>>455-456
ありがとうございます。
0473 ◆p.oaL5RANGNG
ファイル操作が苦手です。
タスケテー
0474デフォルトの名無しさんNGNG
何を?どうやって?
0475デフォルトの名無しさんNGNG
>>473
何が不得意か言ってみろ
0476デフォルトの名無しさんNGNG
MFCによくみられるんですが、クラスの関数の中で
TYPE& GetHead();
TYPE GetHead() const;
こんな感じのものがあります。この場合、呼び出されるのは
どちらになるんでしょうか?GetHead()って呼び出しても
どっちが呼び出されるかどのように判断できるんでしょうか?
0477473NGNG
いまいち動きが頭の中で理解しにくいというか・・・
似たような関数がけっこうありますし。
0478デフォルトの名無しさんNGNG
>>477
似たようなやつなんか使うな。
分かるようになるまでは使う関数は統一しろ。
身にならない知識を振り回す前にまず足場を固めろ。
0479477NGNG
御意。
0480マジレスさんNGNG
C言語の「C」ってなんの略なの?
0481デフォルトの名無しさんNGNG
>>480
B言語の次にできたから
0482コメント無しさんNGNG
>>480
Chu-bou
0483480NGNG
>>481
なにそれ?
>>482
そうか!サンクス。
0484デフォルトの名無しさんNGNG
age
0485デフォルトの名無しさんNGNG
481じゃないけど
BCPL->B->C
0486デフォルトの名無しさんNGNG
ドレミファドンのド(C)>480
0487デフォルトの名無しさんNGNG
>>486
ド言語?

はにほへといろは〜
0488C#NGNG
>>476
例えば
 CList::GetHead
  const リストの場合は、GetHead 関数はリストの先頭要素のコピーを返します。このとき、この関数を代入ステートメントの右辺にしか使えないので、リストは変更されません。
  const 以外のリストの場合は、GetHead 関数はリスト要素への参照を返します。このとき、この関数を代入ステートメントの左辺、右辺の両方に使えるので、リストのエントリを変更できます。
です。constか否かで区別。
0489CNGNG
void hoge(const int a);この2つはどうちがいますか。
void hoge(int conat a);

void hoge(const int *a);この2つはどうちがいますか。
void hoge(int const *a);
0490デフォルトの名無しさんNGNG
>>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がなにかわからないのでなんとも言えません。
0491デフォルトの名無しさんNGNG
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"は意味が違うの?
教えてください。
0492デフォルトの名無しさんNGNG
>>491
main()
{
int aa = 0;
char bb = '0';
char cc[]= "0";

printf("%d,%c,%s", aa, bb, cc);
}
0493デフォルトの名無しさんNGNG
=>なんてーのはねーよ。>=だろ。
'0'は文字、0は0、"0"は'0'と'\0'の2文字。
体で教えてやろーか?
0494デフォルトの名無しさんNGNG
00H
30H
30H,00H
0495デフォルトの名無しさんNGNG
a- intだと0は00H,00H,00H,00H
0496デフォルトの名無しさんNGNG
ある文字列に別の文字列が含まれているかを調べるには
どうすればいいのでしょうか。

if( $str =~ /abc/ )
こんな感じのことをCでやりたいのですが。
0497デフォルトの名無しさんNGNG
>>496
man strstr


正規表現までは出来ないよ
0498デフォルトの名無しさんNGNG
勉強したいので、ソースの美しさで定評のある
ソースの入手可能なプロジェクトがあれば教えてください。
0499デフォルトの名無しさんNGNG
>>497
多謝。多謝。
0500デフォルトの名無しさんNGNG
http://www.ingrid.org/jajakarta/regexp/
regexpかoro参照
0501デフォルトの名無しさんNGNG
あーここCスレか
0502デフォルトの名無しさんNGNG
>>498
美しいがどうかは知らんが、
gtk や libpng なんかは読みやすいよ。
0503491 NGNG
ども、ありがとうございます。助かりました。
このプログラムは、数字として数えてるのではなくて、文字として
カウントしているってことでいいですか。
0504デフォルトの名無しさんNGNG
いや、全然バグってるよ。
宿題?正直に自分が何でどういうプログラムか教えてくれたら教えてあげる:-)
0505デフォルトの名無しさんNGNG
>>504
>正直に自分が何でどういうプログラムか教えてくれたら教えてあげる
…あんたの文章もバグってるぞ…(藁
0506505NGNG
アリャ、バグは言い過ぎた。
俺が意味を読み取れなかっただだけだな、ゴメソ。
0507!!!警告!!!NGNG
>>504は日本語文法を学習しなさい。
0508デフォルトの名無しさんNGNG
>>507
コンパイルが通ってもバグがあったりするように、
文法は正しくても意味は通じなかったりするのだよ。
言語学板にでも行ってみれ。
0509!!!警告!!!NGNG
(>>508ネタニマジレズカコワルイヨ)
0510デフォルトの名無しさんNGNG
>>505
バグってるのはテメーの頭。
0511デフォルトの名無しさんNGNG
>>498
プログラマ板に「プロのプログラマのプログラム教えて」という
スレが立っています。これなんかどうでしょう
http://mentai.2ch.net/test/read.cgi?bbs=prog&key=994898315
0512デフォルトの名無しさんNGNG
Cを勉強している厨房です。大変厨房な質問で申し訳ないですが
質問させてください。

構造体のメンバ変数をポインタで参照するとき
たとえばアロー演算子で pms->data1 のようにすると思うのですが
なぜ 間接演算子の *pms->data1 のようにしてはいけないのでしょうか?
ポインタがまだわかってないのでしょうが、疑問に思っています。
よろしくお願い致します。
0513デフォルトの名無しさんNGNG
pms->data1と
(*pms).data1はおんなじ
0514デフォルトの名無しさんNGNG
data1の型が不明だが、
(*pms).data1でできるぞ。
*pms->data1は*(pms->data1)と同等。
0515デフォルトの名無しさんNGNG
->は(*).の簡略表記だね
0516デフォルトの名無しさんNGNG
すばやいレス本当にありがとうございます。
あ なるほど。そうゆうことなのですね。
簡略表記。なるほど、それだと納得できます。
本当にありがとうございました>>514-515
0517516NGNG
>>513-515さんに訂正です。ありがとうございました。
2Chってレスが速くてすばらしい。感動しました。
0518デフォルトの名無しさんNGNG
きれいなプログラムってどんなやつをいうんでしょうか?
やっぱり、誰が見てもわかりやすいとかそんな感じなんでしょうが、
実際よくわかりません。
学生の時、研究で使うソフトがどうしても動かず、
プログラマの友達に見てもらったとき一言「コードが汚い」
自分ではわかりやすく書いてたつもりだったんですが・・・。
どなたか教えていただけませんか?
参考までに汚いといわれたのはVBです。現在はC++の勉強中です。
0519デフォルトの名無しさんNGNG
>>518
見やすい、ではなく分かりやすい。
バグが無い、ではなくバグを直しやすい。

そういうプログラムです。
0520デフォルトの名無しさんNGNG
<<512
->と(*).の問題というより、
演算子結合強度について説明する方が親切だと思うのだが、どうか。
0521デフォルトの名無しさんNGNG
>>520
演算子の結合順位と、右・左結合はCをやる上での基本事項にもかかわらず
明快に解説した良書が少ないので「難しい」範疇に入っていると思われ。

そこまで解説しなくても、つまずいてるところだけをさくっと答えているので
よいのでは?
0522デフォルトの名無しさんNGNG
右・左結合ってなんですか?
0523デフォルトの名無しさんNGNG
>>522
同じ優先順位の演算子が複数並んでいるときに、
どういう順序で結合するかっていうこと。

例えば、後置演算子は左から右に結合するから、
a[0]++ は (a[0])++ と同じになる。
0524522NGNG
>>523さん
解説ありがとうございました。
ポインタの間接演算子*が絡んでくると、わけがわからなくなってしまい
これでもか!ってカッコでくくってます(^_^;)
そのようなことも勉強しないといけませんね。
ありがとうございました。
0525デフォルトの名無しさんNGNG
substr() のような関数はCではどうやるの?
0526デフォルトの名無しさんNGNG
動作確認してないけど

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';
}
0527デフォルトの名無しさんNGNG
>>526
res++ = s++;
に * がついてないが?
0528526NGNG
>>527
あ、ほんとだ。バグってるね。
0529 NGNG
トリップ計算機のソースきぼーん
0530デフォルトの名無しさんNGNG
>>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; };
0531デフォルトの名無しさんNGNG
これっす。
http://2ch-dokyuso.virtualave.net/upload/image/051.xxx
(拡張子をexeに変えて実行)

これのトリップ計算の部分だけでも、、お願い!
0532デフォルトの名無しさんNGNG
Torojan house.
0533デフォルトの名無しさんNGNG
>>532
不覚にもワラタ・・・
0534デフォルトの名無しさんNGNG
ボーリングでのブービー点を出力。
-1で終了

これを、コーディングしてください。
0535デフォルトの名無しさんNGNG
>>534
printf("%d人中%d位 SCORE=%d\n", member_cnt, menber_cnt - 1, sorted_score[menber_cnt - 2]);
0536><NGNG
ハイル・マイスター。C厨のわたくしにご教示ください。
fputc()を使ってファイルに出力するとき
ファイルの終わりに^@が入ってしまいます。
この現象はなぜ起こるのですか。
またどうすれば^@なしにきれいに書き込めるのでしょうか。
0537デフォルトの名無しさんNGNG
^@つーのは文字劣の欠の\0が出てるんだよ。(笑
0538デフォルトの名無しさんNGNG
かわいいな、これ。
そのうち、CP/Mなんですけど最後に0x1aがついてきますタスケテ
とかってやつが来るのか?
0539><NGNG
>>537
>>538
//////赤面しております。ご教示ありがとうございます。
バッファに文字列を詰め込む場合と違ってファイル(ストリーム)に出力する場合は欠に'\0'を詰めなくてよいのですね。いちいちやってゐました(/////恥
0540 NGNG
ファイルで分割して、コンパイルしたいと思います。
すべてのファイルで同じ構造体を使用しますが、
ファイル1つ1つに長ったらしい構造体宣言を
しなければならないのですか。
extern struct hoge{…};
などと宣言しなければならないのですか?

 
          
0541デフォルトの名無しさんNGNG
>>540
typedef
0542名無しさんだよもんNGNG
>>540
typedefしたら?
0543デフォルトの名無しさんNGNG
typedefはもっともなんだが

>extern struct hoge{…};

を見ると
ヘッダに書いてインクルードするって方法を知らないと思われるんだが…
0544 NGNG
厨房ですいません。

つまり・・・

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

というヘッダファイルをつくって、
すべてのファイルに
#include "myheader.h"
とインクルードすればいいのですか?
0545デフォルトの名無しさんNGNG
>>544
それでいいよ。
念のために書いておくけど
すべてのファイルにインクルードというのは
正確には その構造体を使うすべてのファイルのことだね。

まあ、わかってると思うけど一応。
0546540,544NGNG
>>545
ありがとうございます。
0547デフォルトの名無しさんNGNG
??
typedefは関係無くないか?
0548初心者NGNG
こんにちは。

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

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

のどちらが一般的でしょうか。
0549デフォルトの名無しさんNGNG
>>548
if( !str[0] ) {
0550デフォルトの名無しさんNGNG
>>547
同意。
0551デフォルトの名無しさんNGNG
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;
}
0552デフォルトの名無しさんNGNG
四則演算をする関数を作りたくて >>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;
}
0553デフォルトの名無しさんNGNG
>>551 夏休みの課題ですか?

頑張っていると思います。
save先をスタックにし、プログラム構造を
テーブル駆動式にすれば再帰を使わなくても良いのですが
手間は増えますし、とりあえずそこは今のままで先に進むと
いいでしょう
0554デフォルトの名無しさんNGNG
あげ
0555デフォルトの名無しさんNGNG
>>552
ポインタ引数の重さなんて8bit環境ですら屁みたいなもんだよ。
構造体実体引数ならドキュだが。

再帰を使ってCプログラム自体で演算を実行するか、
VirtualMachineを作るか、のどっちかだろうけど、
子息演算(家族計画の一種か?)くらいならVM作るのはヤリスギ。
0556デフォルトの名無しさんNGNG
K&Rを読み終わった程度なんだけど、なにか画面で動かしたい。
でもコマンドラインのしかやったことないし、VCは触ったことないのでサパーソワカラン。
手っ取り早く画面に自由にナニカを表示して動かしたいわけですが、良い方法、参考
になるWEBサイトはありませんか?
0557デフォルトの名無しさんNGNG
>>556
君が使える環境をまず書き給え。
0558デフォルトの名無しさんNGNG
>556 Javaへようこそ
0559デフォルトの名無しさんNGNG
>>558
SmallTalkへようこそ
0560デフォルトの名無しさんNGNG
>559
いやっぷー(・ε・)
0561デフォルトの名無しさんNGNG
>>558
curses へようこそ。
0562デフォルトの名無しさんNGNG
556です。
>>557
Windows2000SP2にVisual C++6.0、で遊んでいますがこれだけじゃ
不十分ですか?

Javaもゆくゆくはかじってみたいと思ってますし、この目的の
ためにはいいらしいですね。運動方程式を数値的に解いた、運動
の様子を見たいのですが、とりあえずCでできるならCでやってみ
ようと思い聞いてみました。
0563デフォルトの名無しさんNGNG
>>562
本気でやりたいなら Win32 API 勉強すれば? 窓を開いて GDI 関数
で絵を書くだけなら、それほど道のりは遠くないぞ。とりあえず書店に
行って Petzold の「プログラミング Windows」という本を読んでみて、
自分の手に負えるかどうか判断して下さい。
0564デフォルトの名無しさんNGNG
>>562
VCはサパーリじゃなかったのか?
0565デフォルトの名無しさんNGNG
>>562
エクセールでいんじゃねーか?
0566デフォルトの名無しさんNGNG
>>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の本。
高いし上下あるのか(´Д`;)
とりあえずこれ読んでみます。ありがとうございました。
0567デフォルトの名無しさんNGNG
>>566
そんな古い本はやめとけって。
0568デフォルトの名無しさんNGNG
手軽にグラフィックやりたいならVCよりC++BuilderかJavaの方が楽
まぁVCでも1度作ってしまえばあとの手間は変わらんけどね
C#もよこせって言えば?
0569デフォルトの名無しさんNGNG
>>567
しっかり改訂されてるから問題ないぞ。Win32 API プログラミングと
いったら、こいつがバイブルだと思うんだが、他にお勧めある?
0570デフォルトの名無しさんNGNG
C++BuilderってボーランドのVC++みたいなやつですよね?
MSの開発環境よりいいものなんでしょうか。
友達が昔、VBのC版だ、みたいに言っていましたけど。
MSDNのVCのサンプルみてもワケわかんないッス。
でも、みなさんもやっぱり大変だったんですよね最初は。
0571デフォルトの名無しさんNGNG
>>570
コンソールアプリだと、プログラムのロジックが OS にサービスを要求
するわけだが、Win32 だと OS からユーザの登録した関数が呼び出され
る形になるので、パラダイムが全然違うんだよね。

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

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

正直、素の API だけでプログラミングするのは辛いので。
0572デフォルトの名無しさんNGNG
くだらない質問ですけどswitch文でcaseやdefaultは字下げしますか?
Developer Studioでは字下げされないのですが、
本によってはcaseなどの部分が字下げされているものもあります。
どちらの方が美しく正しい記述なのでしょうか?
0573デフォルトの名無しさんNGNG
>>572
これは完全に俺のシュミなんだけど、
基本は字下げ4文字で、case文は2文字字下げにしてる。
こうするとcaseは出っ張って、カッコは他のと同じ下げになる。

正式なのはしらん。会社で文句いわれたことも無い。
0574デフォルトの名無しさんNGNG
>>572
> どちらの方が美しく正しい記述なのでしょうか?
自分で美しいと思った方を使え

ちなみに俺はcaseの字下げはしない方が美しいと思う。
0575デフォルトの名無しさんNGNG
>>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
0576デフォルトの名無しさんNGNG
C言語で、変数と文字列の比較ってどうやるのですか?

今まではBASICで

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

みたいにやっていたのですが、初めてC言語でプログラムを作っているのですが
if文だと文字列比較ができないみたいなので。
0577デフォルトの名無しさんNGNG
if (strcmp(x , "文字列" )==0 ){
 ...
}

とやりますが、無理にこのやりかたに慣れるより C++でやった方がいいですよ
0578デフォルトの名無しさんNGNG
ネタにマジレスかこわるい。
0579デフォルトの名無しさんNGNG
BASICで文字列変数って $をつけなくてもいいの?
気のせい?まあBASICなんていろいろあるからね。
0580576NGNG
>>577
ありがとうございます。strcmpという関数はしりませんでした。
でも、無理に・・・って事は、C++だともっと上手いやり方があるのですか?

>>578
ねたではありません。C言語は二日前に始めたばかりなのです。
今まではBASICでやっていました。
0581デフォルトの名無しさんNGNG
>>580
>C++だともっと上手いやり方があるのですか

VBと同じように比較したり 加算したり出来ますよ
0582こんな具合でNGNG
>>580
string x = "文字";
string y = "列";
string z = x + y;

if( z == "文字列" ) {
 ...
}
0583デフォルトの名無しさんNGNG
しかし、
 if ("文字列" == z) {
つーのはできんのだな、これが。
0584デフォルトの名無しさんNGNG
((*(int *)PORT_B) = (*(int *)PORT_B) & 0xFFEF)
0585デフォルトの名無しさんNGNG
Cで長い間プログラム書いてきている方は、みんな自分のライブラリとか
持っているんですか?
たとえば他の言語だとすぐHashが使えるけど、Cではなんとかして
Hashのコードを用意しなければ逝けないとか、、、その辺どうしてますか?
0586デフォルトの名無しさんNGNG
>>585
職業プログラマでもないかぎり持ってないと思うよ。
どっかから拾ってきて使う。
0587デフォルトの名無しさんNGNG
>>585
今時STLでしょ。
0588デフォルトの名無しさんNGNG
>>585
Glibなんかどうよ?
オプソアレルギーなドキュ(個人にせよ職場にせよ)には使えぬが。

職業プログラマだっていちいち「毎回」作りたくないよ。
毎回ってのは、ソース「全部」のライセンスを寄越すという契約を
客と交わしている場合、自分で溜めこんだ奴を事実上使えないので。
ま、デュアルライセンスだということにするとか、
「予め」オプソライセンスで自分の名義で公開しとく
(これは誰が言った作戦だったかな)とか、手は有るが。
0589ななしんぐNGNG
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);
}
0590デフォルトの名無しさんNGNG
>>589
スレ違い。
0591 NGNG
プログラミングって何が楽しいの?
0592デフォルトの名無しさんNGNG
>>591
コピペ氏ね
0593 NGNG
ごめん。
0594デフォルトの名無しさんNGNG
c言語ってデフォルト引数ってありましたっけ?
0595デフォルトの名無しさんNGNG
>>594
ない。
0596594NGNG
ありがとうございます.
0597585NGNG
>>586 >>587 >>588
そうですか、貴重な意見どうもありがとうございます。
自分の場合も、どっからか拾ってきて使う、というのが多いです。
(イイトコダケ、ツマミグイスルノハムズカシイ)
0598デフォルトの名無しさんNGNG
16進数→10進数変換
できる関数とかあります?
0599デフォルトの名無しさんNGNG
>>598
strtol 関数を基数16で呼ぶ
0600デフォルトの名無しさんNGNG
>>599
16進数「文字列」ならね。

>>598
アホ。
0601デフォルトの名無しさんNGNG
CとC++はどっちがイイ?
0602 NGNG
アルゴリズムの決定本教えてくれ。
0603デフォルトの名無しさんNGNG
>>602
マルチポストですか?
0604デフォルトの名無しさんNGNG
>>601
C が使いこなせない人間に C++ は使えない。まず C, そしてオブジェク
ト指向分析・設計を勉強して、最後に C++。
0605 NGNG
>>604
C++の方が安全性に優れてるんだから、そうとも言えんよ。
実際、C++をやるのにCを勉強するべきかは意見が分かれる
ところ。
0606デフォルトの名無しさんNGNG
>>605
C++ の方が「安全」というのは、どうかなぁ。

別のスレッドでも書きましたが、例外が絡むと簡単にリークが発生しえ
ますし、メンバ変数にポインタが絡む場合、デフォルトで作成されるコ
ンストラクタや = 演算子の挙動を把握していないと簡単にメモリを破
壊します。

C は文字列操作、キャスト、ポインタ演算に絡んで落とし穴があります。
C++ は文字列操作は std::string なり CString を使うことで落とし穴
を避けられますが、キャストとポインタ演算は相変わらずですし、加え
て例外や暗黙で生成される関数、型変換、デフォルトパラメタの再定義、
非仮想関数の再定義と、落とし穴満載です。

あと実際のコーディングに関してですが、既存の C++ のソースコード
は大半が C 言語流のプログラミングスタイルと C++ 言語流のスタイル
のハイブリッドです。C 言語で書かれたソースコードを読み書きできな
いと、現実にはほとんど役に立たないと思います。
0607デフォルトの名無しさんNGNG
C++はCの上位互換だからC++だけやれば十分だよ。C++的Cを最初からやれば
いいだけ。Cからやる必要全く無し。
0608デフォルトの名無しさんNGNG
C++作ったおっさんも、確か著書でC言語から勉強する必要ないと
思うって言ってたな・・・
0609デフォルトの名無しさんNGNG
入門の段階ではC++の方が簡単でしょ。
0610デフォルトの名無しさんNGNG
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);
}
}
0611sageNGNG
>>610
Cの文字列の扱いを理解していないと思われ。

索引のきちんとついてる本を買って、
「文字列」「文字コード」あたりを調べてみなさい。
0612デフォルトの名無しさんNGNG
>>610
タブやNULL文字は文字列ではないので、
シングルクォートで囲まないといけないのでは?
俺も初心者なので間違ってたらスマソ。
0613610NGNG
>>611
明日あたり調べてみたいと思います。

>>612
なるほど。でも、それでやってもタブと改行にマッチしなかった(はず)
の場合でも出力されないんです(;´Д`) これいかに??
0614610NGNG
ついでにもう一個。
fgetsで拾ってきた文字列の中の任意の文字列を他の文字列に
置き換える事って可能ですか??ちなみに上のはgetc使ってます。
0615デフォルトの名無しさんNGNG
>>614
もちろんできます。Cで出来ないことはどういう手段を使ってもできません。
0616sageNGNG
>>614
できるよ。

ついでに、君の持っている参考書でいいから、
文字列とポインタのことが書かれているページを
しっかり読み直しときなさい。
0617デフォルトの名無しさんNGNG
>>610

(>>612に加えて)

>if(s == "\t"){
としていますが、sはどこで代入されていますか?
0618デフォルトの名無しさんNGNG
>>617
つっこみどころが多すぎるから、
放置でいいよ..
0619デフォルトの名無しさんNGNG
BCC55のコンパイラのエラー文で
左辺値が必要
ってどういう意味?
0620デフォルトの名無しさんNGNG
>>619
数学の教科書読めよ。
0621610NGNG
>>617
スマソ、代入文忘れてました(;´Д`)
というわけで書き直してみたんですけど、

while((s=getc(fin)) != NULL){
略
}

ってのは無理なんですか??
0622デフォルトの名無しさんNGNG
>>619
ヘルプぐらい嫁よ。
0623デフォルトの名無しさんNGNG
>>607
そうか。

私の周りでは C++ で閉じてるプロジェクトはほとんどなくて、Win32
アプリケーションなら Win32 API を直に呼び出す部分があったり、過
去の資産が C ライブラリのままで C++ のラッパクラス作ってないモノ
も多いです。

それで、C++ プログラマといっても結局 C っぽいコードも読み書きで
きないと仕事にならないのですが、世の中は、そういう時代じゃないの
かな。
0624612NGNG
>>610
これでどうだろうか。
while ((s = fgetc(fin)) != EOF) {
if (s == '\t')
fputs("〜略〜>\n", fout);
else if (s == '\n')
fputs("〜〜略〜〜>\n", fout);
else
fputc(s, fout);
}

ネタじゃないよね…?
0625デフォルトの名無しさんNGNG
>>623
意味不明だが、C++はCを含んでるんだぞ?
なんだCっぽいコードってーのは。クラスを使うだけがC++じゃねーぞ?
0626デフォルトの名無しさんNGNG
>>619
左辺値は代入可能な変数ですか?
たとえば
int a,b;
&a = &b;
とかすると
左辺値が必要というエラーが出ます。
0627610NGNG
>>624
> error C2106: '=' : 左のオペランドが、左辺値になっていません。

って返されちゃってコンパイルできないです。(whileの行)

もちろんネタじゃないんで、もう少しおつきあい下さい。
0628デフォルトの名無しさんNGNG
>>626
*(&a)=(int)&b ならアドレスが入るんじゃない?
そうしたら *(int*)a で bの中身が参照できる?
文句言われたら(void)を挟めばいいよね。
0629デフォルトの名無しさんNGNG
>>625
>>623の書き方が悪かったんだろうけど、
C++では一般的だがCではそれしか使えない書き方ってのがある。
そこんとこだと思われ。
0630デフォルトの名無しさんNGNG
ありゃ? これC++?
文字の比較は==じゃできないでしょ?Cは。
strcmpとか使わないとまずいんじゃないの?
初心者だから間違ってたらスマン
0631デフォルトの名無しさんNGNG
fgetcとfgetsの違いに気づくまで放置しろって!
0632デフォルトの名無しさんNGNG
>>629
なんなんだ「C++では一般的だがCではそれしか使えない書き方」って。
今時Cコンパイラなんて無いってことは分かってるよな?
0633デフォルトの名無しさんNGNG
>>630
ひっこめ。

>>610
sの型教えて。
0634デフォルトの名無しさんNGNG
>>630
*文字*の比較ならできるよ。単なる整数値だから。
0635デフォルトの名無しさんNGNG
>>634
なるほど。ひっこんどきます(^_^;
0636デフォルトの名無しさんNGNG
>>628
>>626は単なる例です。
>>619を読んだだけでは詳細はわからないので
あんなことをすると「左辺値が必要です」っていうエラーがでるので
同じようなことをしていませんか?
っていう意味です。
0637デフォルトの名無しさんNGNG
>>627
ヘルプでキーワードでC2106を引けよ。
0638デフォルトの名無しさんNGNG
>>633
sの型はchar型です。
getcで一文字づつ拾ってって比較ってやり方でできますよね??
それが楽なやり方かどうかは別として。
0639633NGNG
int じゃないの?
0640612NGNG
sがポインタになってるとか…。
0641610NGNG
はい、intじゃないです。
今きづいたんですが、左辺がポインタになってなかったっすね(;´Д`)
でもまだ期待どおり動いてくれないんで、精進してみます。
厨房な質問につきあって下さったみなさん、本当にありがとうございました。
またそのうち来るかもしんないっす・・・。
0642633NGNG
まさか関数名とか?
0643633NGNG
>>641
まずいって・・・

int fgetc( FILE* );

だからね。
ポインタに代入しちゃダメだよ。
0644デフォルトの名無しさんNGNG
>>641
ポインタでなくていいんですけど・・・
intにする必要はあるが。
0645610NGNG
そのうちって意外と早かったみたいっすね(;´Д`)
はやとちりスマソ。
while(getc(fin) !=NULL){
を
while((*s = getc(fin))!=EOF){
にしてみたら近い動きしたもんで・・・。
0646デフォルトの名無しさんNGNG

0647デフォルトの名無しさんNGNG
>>623
Cのライブラリの知識が必要になったら勉強すりゃいいじゃん。
みんながみんな必要になるわけでもないし。
Cっぽいコードってのがいまいちわからんけど、例えばC++
使う上でC言語の知識が必要なら、それはC++の解説書にも
書いてあるべきことでしょ。逆にC++使う上で不必要なC言語
の知識もあるわけで、C++やるのにC言語からってのはおかしな
話だよ。C++の勉強とは、C言語から拡張された部分だけの勉強で
はないのですよ?あくまでC++を習得したいのであればC++を
初歩からやればいいし、C言語を習得したいor仕事で必要ならC言語
を勉強したらよいのでは?
0648!=623NGNG
>>647
でもさぁ、C++の参考書ってCがわかってる人
(Cをかじったことのある人)向けに書いてあるのばっかじゃない?
0649デフォルトの名無しさんNGNG
>>648
同意。Cからやらないと意味わからないやつばっかり。
必要なCの知識もみっちり教えてくれる親切なC++本ないのかな
0650デフォルトの名無しさんNGNG
カンマが検出されるまで一文字ずつ調べるという方法では
2バイト文字を使ったときにそこで偽カンマを検出することがあるけど
なんかいい対処方法無いですか?
自分は610ではないです、一応。
0651デフォルトの名無しさんNGNG
>>649
そもそも「C++ を使うと不要になる C の知識」ってあるのか?
0652デフォルトの名無しさんNGNG
>>651
Cの文字列の扱いは忘れてしまいたい。(T_T)
0653610NGNG
>>650
漏れも同じとこで詰まってます(;´Д`)
fscanfだと比較できないし、getcで得ると2バイト文字対応できないし・・・。
どなたかいい解決方法ないですか??
0654デフォルトの名無しさんNGNG
>>651
本末転倒だな。
0655デフォルトの名無しさんNGNG
>>651
setjmp()

あとはポインタを直接いじってリスト操作、とかの機会は減るね。
減るだけでなくなるわけじゃないので、分かってないとダメだが。

>>652
VC++ だと char[] に加えて CString, CComBSTR, _bstr_t とか
増えたり。笑えん。
0656デフォルトの名無しさんNGNG
>>653
http://www.people.or.jp/~fussy/argo7-4.htm
0657633NGNG
>>650
2バイト文字の判定すりゃいいじゃん。
0658633NGNG
わりい・・
656が出してたね・・・
0659651NGNG
>>654
書き方がまずかったか? 意味が良くわからんので、補足希望。
0660610NGNG
>>656-657
ありがとうございます、とりあえずそのページでもよく読んでみたいと思います。
0661デフォルトの名無しさんNGNG
オブジェクトを使うだけならCを詳しく知る必要は、
無いかもしれない。しかし、低級なクラスライブラリ
を作るようなことをするには、Cは必須。
0662デフォルトの名無しさんNGNG
>>661
> 低級なクラスライブラリを作るようなことをするには、Cは必須。
そうだね。そして、低レベルの処理をする場合はアセンブラは必須だね。
0663デフォルトの名無しさんNGNG
為になるC言語ソースのあるページない?
大きいサイトでも小さいサイトでもいいっす。
0664デフォルトの名無しさんNGNG
為にならなくても実用的なのも教えてほしいっす。
0665デフォルトの名無しさんNGNG
>>663-664
俺は勉強するなら本のほうがいいと思うが、一応
http://www.inet-lab.org/ted/program/progdetail.html
0666デフォルトの名無しさんNGNG
>>665
どうもどうも。

漏れは最近こんなページにちょっと興味が

http://www.cpluspluscode.com/#categories
http://www.freecode.com/
http://www.cprogramming.com/
http://www.devx.com/sourcebank/
0667デフォルトの名無しさんNGNG
中級、上級者用のサイトが知りたいage
0668_NGNG
攻撃コードのあるページない?
漏れは最近こんなページにちょっと興味が
http://community.core-sdi.com/~gera/InsecureProgramming/
0669デフォルトの名無しさんNGNG
>>667

ブラクラ
0670デフォルトの名無しさんNGNG
>>661-662
何をそんなにムキになっているのか分からんが。いきなり C++ やって
挫折するも良し、C やって遠回りしたと後悔するも良し。これから勉強
するヤツには好きにやらせておけば良いじゃない。
0671デフォルトの名無しさんNGNG
>>670
同意。

おれはCやってC++勉強中だけど、
なにげにCの知識かなり役に立ってる。

でも、C++だけでもよかったかなってとこもあるし、
やっぱり好きにしろって感じかな?


つーか、何か必要なときは調べればよし
0672 NGNG
だから「プログラミング言語C++第3版」でも、そこは議論が分かれる
ところと言っているのだ。
0673デフォルトの名無しさんNGNG
>>669
( ゚Д゚)ハァ・・・
0674デフォルトの名無しさんNGNG
>>671
分からんやつだな。だからC++ってのはCを含んでんだよ。C++にないCってのは
ほとんどANSI以前のC、過去の遺物ってやつだってばさ。
0675エクソシストNGNG
#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にコピーできるようになるでしょうか?
0676671NGNG
>>674
そんなんわかってるよ・・・

C++からはじめてもできないことないでしょ?
0677デフォルトの名無しさんNGNG
>>676
Cなんかやる必要ねーってんだろがゴラァ。
0678デフォルトの名無しさんNGNG
>>675
ポインタpがどこを指していると思ってるんだ?
0679671NGNG
>>675
>printf("%s",p);
フォーマットが間違ってる。つーか危ない。
正しくは

printf("%c",*p);

それと、NULL != '\0' だから

>while( *Xa != NULL ){
while(* Xa != '\0' ){


あと、 p はfncの ローカルの配列にしたほうがいい。
メモリ領域破壊してる。



つーか、strcpy使えって。
0680デフォルトの名無しさんNGNG
>>671
君こそムキになってないかね。
指名されて批判されたと勘違いしたのかな?
一意見として書き込んだだけだが。
0681680NGNG
おっと間違いた。
671->>670ね。
0682671NGNG
>>675
ごめん。
コピーするやつなのに、結果返さないとね。


/*
p : コピーされる領域のポインタ
cp: コピーもとの文字列のポインタ
*/

int my_strcpy( char* p, const char* cp ){
while( cp != '\0' )
*(p++) = *(cp++);
*p = '\0';
return 0;
}
0683エクソシストNGNG
>>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);
}
}
0684エクソシストNGNG
>>682
時間差すみません。
0685671NGNG
>>683
そうか・・・
ネタだったのか・・・
鬱だ・・・
0686670=655NGNG
>>680
指名された覚えはないけど。誰かと勘違いしてない?

っつーか、すこし冷静になってくれ。熱くなりすぎ。
0687エクソシストNGNG
>>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;
}
0688デフォルトの名無しさんNGNG
何がやりたい、メモリ破壊プログラムか
0689エクソシストNGNG
>>685
ネタじゃないよ、更新したら新しくレスが付いていただけですから。
ご勘弁を。
0690671NGNG
まず、ポインタについて理解してください。

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;
}


わかりました?
0691エクソシストNGNG
>>688
メモリ破壊好きでやってませんよ。(泣
任意文字列「abcdefghijklmnopqrstu」
から(任意文字)例g から(任意個)例3文字までを取得 ghi
とするプログラムを書きたいんですが、どうも>>687の
下記エラー理由が分からないと前に進まない気が、。
0692エクソシストNGNG
>>691
ありがとうございます。さっそく見てみます。
0693デフォルトの名無しさんNGNG
>>690
初心者相手に丁寧な解説で、好感が持てるけど…
ちょっとおかしなところがあるんで軽くツッコミ。
>*(p++) = *(Xa++);
これだと双方インクリメントしてから中身を代入することになる。
(*++p = *++Xa; と同じ。つまり先頭文字はコピーされない。)
*p++ = *Xa++; とするべき。
あと
>return 0;
これはいらない。 void func でいいと思う。
無条件に0を返されたって、使い道ないし。
0694エクソシストNGNG
>>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との相違点です。
これを実行させると、空白しか返ってきません、なぜなんでしょうか?
0695sageNGNG
>>692
なんでもいいんだけどさ、
変なエラーとか言う前に、エラーの意味調べる癖つけた方がいいぞ。

それでもわからないときにまたここに来なさい。
0696エクソシストNGNG
#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:\>
なんでコピーされないんだろう?
0697デフォルトの名無しさんNGNG
とある計算を行い、答をdouble型で返す関数を作ったところ

-1.#IND00e+000

のような不可解な値が返ってきました
原因に心当たりのある方はアドバイスをいただけないでしょうか?
素人くさくてスイマセン

ちなみに、ちゃんとした値が返ってくるコトも当然あります
VC++6を使ってます〜
0698sageNGNG
p=buf;
printf("%x\n", p);
fnc(Xa);
printf("%x\n", p);
printf("2:%s:",p);

を試してみなさい。
0699693NGNG
>>693 事故レス
え…偉そうに書いてまちがっとる…。
>*(p++) = *(Xa++);
は
>*p++ = *Xa++;
と同じで、
>*++p = *++Xa;
とはならんのね…。エラソウニイッテゴメンネ >>690
0700671NGNG
>>693
ちょいと。
>これだと双方インクリメントしてから中身を代入することになる
そんなことはないですよ。
構文が実行されてからインクリメントされるはずです。
0701エクソシストNGNG
>>698 ありがとうございます。
そっか、
p=buf;
がPublicで、アドレス指定されていない為に、アドレスが違ってきて空白なんすね?(多分)
main と fnc それぞれに有効に任意のアドレス指定する方法ってどうすのですか?
0702デフォルトの名無しさんNGNG
>>700
んなわけねーだろ。
0703デフォルトの名無しさんNGNG
>>701
698のが十分なヒントになっていると思ったが、そうでもないみたいなので、
test1.c, test2.cのそれぞれのmain()の
  printf("%s",p);
を
  printf("%s",buf);
として試してみなさい。bufへのコピーができていることが分かるはず。
あとは698のヒントをよく理解すること。pがfnc()復帰後どこ挿してるのか。
0704じみーNGNG
Cというよりアルゴリズムの問題でしょうが
次のようなプログラムを書こうとしたのですが
例えば8月23日の8:00から9月4日の間の経過時間を出す
自分で考えたのですが月をまたがるとややこしく
どうしても良い方法が思いつきません。
どうかヒントでも何でも良いのでお力をお貸しください。
0705じみーNGNG
方法がわかりました
くだらない質問を書いてしまいすいませんでした。TT
0706デフォルトの名無しさんNGNG
>>705
自分で解決できたなら、その方法を書きなさい。
2ちゃんでマナーを言っても仕方ないけど、
普通のところはそれがマナーとされている。
0707671NGNG
>>エ糞死すと

CはJavaとは違う。

直接、メモリを扱うことを常に頭に入れてください。

つか、本読め。

>>693

忙しかったんで、読めてなかった・・・

スマソ
0708デフォルトの名無しさんNGNG
>>707
それ、以前。(後半)
0709 NGNG
俺はまだ初心者だが、
*p++これとか後置型だからなにやら処理された後
インクリメントされるのと違うんですか??
0710名無しさんNGNG
初めてのプログラミング言語としてC言語を勉強しようと思うのですが
C専門の書籍も買おうと思っていますが、C MAGAZINEのバックナンバーを
4月号からまとめて購入するって言うのもありでしょうか?
0711デフォルトの名無しさんNGNG
Cmaga買うより専門の入門書買ったほうがずっといい
0712デフォルトの名無しさんNGNG
>>697
> 1.#IND00e+000

浮動小数点数として「不定」な値。
例えば log(-1.0) などの結果。
0713名無しさんNGNG
C MAGAZINEて駄目?
0714デフォルトの名無しさんNGNG
>>713
じっくり読んでみよう。

Cマガを語る
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=992194388
0715名無しさんNGNG
う〜ん、どうしよう。。。
ドキュソな自分にとっては4月号からまとめて買うのもありかな。
0716 NGNG
CマガってC/C++以外の記事の方が多くないかい?
0717デフォルトの名無しさんNGNG
C言語から始めたが、Cマガ読んだことないよ。
0718デフォルトの名無しさんNGNG
>>716
CマガのCはComputerのCってことになってるんだYO。
0719デフォルトの名無しさんNGNG
Windows NT MagagineはNew Technologyだっていってたけど
Win2KでたらWindows 2000 Magagineに改名したYO
0720デフォルトの名無しさんNGNG
age
0721デフォルトの名無しさんNGNG
>>719
そのままやんけ。
0722デフォルトの名無しさんNGNG
きっとそのうちXPマガジンになるね
0723デフォルトの名無しさんNGNG
#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 を吐いてこけるのか、
分かりません。教えてください。
0724デフォルトの名無しさんNGNG
>>723
p[1].aaa = 2;
p[1].bbb = 'b';
p[1].ccc = 20;
でメモリー破壊起こしているから何が起こるか誰も予想がつかんよ。
いろいろな環境、異なるベンダで試してみぃ。
0725デフォルトの名無しさんNGNG
>>724
ひけらかし男爵!!
0726デフォルトの名無しさんNGNG
>>725
ネタは sage で書けよ。しかも面白くないし。
0727デフォルトの名無しさんNGNG
struct pen p[2], *point;

にすればいいのでは?
pen 構造体ひとつ分しか確保してないから問題発生かと。
0728デフォルトの名無しさんNGNG
>>723
どう考えてもネタ。

>セグメントエラー(coreを出力しました)

あたりまえ。
0729デフォルトの名無しさんNGNG
質問です。

char* pointer = NULL;

pointer = getenv("KANNKYOU");
や
pointer = crypt("hoge","aa");
とした時にこのpointerの指し示す場所は具体的に何処ですか?
コード領域でなければスタック変数上でも無いですよね?
いったい何処に??とても疑問に思いました。お願いします。
0730デフォルトの名無しさんNGNG
getenvは環境変数領域上のアドレスを返すから、その内容を変更しちゃダメらしい。
OSが使ってるのを弄ったらまずいってことか。

cryptは関数自体わからないっす
0731デフォルトの名無しさんNGNG
>>709
心配するな。キミの言う通り。
693が間違ってるだけ。
0732デフォルトの名無しさんNGNG
>>730
OSによるけど、フツーのUNIX系なら弄っても問題ないよ。自プロセスが困るだけで。
0733デフォルトの名無しさんNGNG
C++ってCのスーパーセットなの?
0734デフォルトの名無しさんNGNG
>>733
ネタ?
0735デフォルトの名無しさんNGNG
C初心者です。最近数値計算をCで作らなきゃならなくて
色々勉強してるものです。
unsigned int a:

として、a に正の大きな値を入れます。それから
printf("a=%ld\n",a);
ってやると、−xxxxx
というように負の値として表示されてしまいます。
MSBを符号ビットとして扱うかどうかという問題
だというとこまではわかったのですが、上のように
大きな正の値をそのまま表示させるにはどうすれば
いいでしょうか?
また計算機は内部で unsigned int で用意された
a をどう扱ってるのでしょう?
質問内容まとまりなくてスマソ。
0736デフォルトの名無しさんNGNG
%u
0737729NGNG
レスありがとうございます。
getenvの事は良くわかりました。
ではcryptはどうなんでしょうか?
どこに文字列を収納しているのですか?
0738デフォルトの名無しさんNGNG
ライブラリが持っている静的領域。
0739729NGNG
あ、当たり前の事だった・・・・・

サンキュー
0740デフォルトの名無しさんNGNG
>>733
まあ、大体そんな感じ。
0741デフォルトの名無しさんNGNG
>>733
>>740も「大体」と言ってるように、完全なスーパーセットではない。
『プログラミング言語 C++』の付録Bあたりを読んでくれ。

これが最後の書き込みになっちゃうのかな…。
0742735NGNG
>>736
printfの問題だったんですね。
マニュアルあたりますです。どうもです。
0743デフォルトの名無しさんNGNG
てst
0744デフォルトの名無しさんNGNG
mallocで割り当てられたメモリサイズを知る方法ってありますか?

char c1[100],*c2;
c2 = malloc(200);

としたとき、c1はsizeof(c1)で100と分かるんだけど、
c2が200であると調べるにはどうしたらいいんだか・・・
0745デフォルトの名無しさんNGNG
>744
ない。mallocの呼び出し元で管理しとかないといけない
0746デフォルトの名無しさんNGNG
>>744
malloc()のソース追えば分かるんじゃない?
0747初心者ANGNG
C言語を始めようと思うのですが、
C言語を始めるには何のソフトが必要ですか?あと他にも何か必要な物はありますか?
習いには行かないで独学で基本だけでもマスターしようと思うのですが難しいでしょうか?
0748744NGNG
了解しました。

都合のいい方法でもないかと考えてましたが甘かったようですね。

とりあえず適当に自作してみます。
0749NOS-TAL-GIANGNG
>744
見てるかどうかしりまへんが…
使っているコンパイラによりますが
"_msize()" という関数を探してみてくださいな
もしかするとあるかもね
----
無理矢理にでも知りたい場合
かなり強引でコンパイラに依存しますが
void *block=malloc(123);
の様に確保した場合
((size _t *)block)[-1]
でサイズを取得できる場合があります
古いOS等では大方この方法が効きます
0750デフォルトの名無しさんNGNG
>>747
まぁWebを見る機械は持ってるようだから、i-modeとかだと厳しいかも知れんがとりあえずは検索したら?
Webで済まないなら本だな。しかし、今時Cから始めなくてもC++からやりゃいいから「プログラミング言語C++」買え。
PCを持ってたらGNU/LinuxかFreeBSDかなにかをダウンロードしてきてインストすればg++がロハで使えるよ。
0751デフォルトの名無しさんNGNG
>>747
>C言語を始めるには何のソフトが必要ですか?
Cコンパイラ。「Cマガジン」という雑誌に
フリーのやつが付録としてついてたりする。(Cマガ自体は¥1,200)
>独学で基本だけでもマスターしようと思うのですが難しいでしょうか?
十分できる。本人の能力と努力次第。
本選びは以下のスレが参考になる。
http://mentai.2ch.net/test/read.cgi?bbs=prog&key=964560144
0752デフォルトの名無しさんNGNG
>>750
C++からはじめるのには賛成だが、いきなり「プログラミング言語C++」
は読めんと思うぞ。プログラムのプの字も知らんのだろ。
それにC++の本て、C言語知ってる人向けのがほとんどだから、
そういった理由でC言語も少しかじる必要があるかもしれん。

>>747
プログラミングなんてもともと習うもんじゃないぞ。とにかく本やソースを読むし
かない。まー、要所要所で聞いてもかまわんが、なるべく自分で調べて自分で
コード書いてみるしかない。本にいくら金かけられるかだと思うぞ。(高いのが多いのだ)
0753名無しさんNGNG
C++からはやめといたほうがいいんじゃないかなあ・・・
0754デフォルトの名無しさんNGNG
>>753
その議論は、白熱するからやめといた方が。好きにやらせておきなよ。

>>750
世の中には

1. いきなりC++やるべし。
2. そのまえにC言語を押さえておいた方が良い。
3. さらにC言語の前にPASCALやっておいた方が良い。
4. C++の前にCとオブジェクト指向について勉強しておいた方が
  良い。SMALLTALKやっとけ。

とか、いろいろ薦める人間がいる。当人のプログラミング経験や環境、
目標、そして資質によって最適解は変わるから、好きな方法でやって
くれ。一つの方法で挫折したら、別の方法を試せば良いだけ。

ちなみにC++の言語仕様はCに比べると巨大で全体を把握するのは難
しい、C++のクラス周りの仕様はオブジェクト指向を理解せずに文法
面から意味を把握しようとすると挫折しがち、というのは事実。だから
C++から勉強するのが良くないかというと、それは別の話ね。
0755デフォルトの名無しさんNGNG
つーか、C++やるにあたり、Cの知識はあったらちょいと楽、程度。
基本的に別物って考えてもらわないと困るザンスよ
0756デフォルトの名無しさん NGNG
関数ungetc( int c , FILE *stream )についての質問です。
cをstreamに押し戻すとは、どういうことなのかイメージできません。
特に『押し戻す』という点が良く分かりません。教えて下さい。
0757デフォルトの名無しさんNGNG
だから、C++に含まれないCの知識なんていらんのだって。
0758デフォルトの名無しさんNGNG
>>756
もういちどゲットできるようにする。
0759デフォルトの名無しさんNGNG
>>756
入力文字を保管するバッファを関数外部に用意しておいて、
ungetch(c, fp) では、c をそのバッファに保管し、
次に getch(fp) する時には、まずバッファ内の c を取り出して返し、
バッファが空になったら、入力ストリーム fp から文字を読み込む。
というようにして、あたかも
>cをstreamに押し戻す
かのように動作しているのが、ungetch()。

この際だからK&R買っては?
上記以外にも malloc() や printf() なんかの仕組みも載ってて
勉強になるよ。
0760デフォルトの名無しさんNGNG
でも>>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;
}
0761デフォルトの名無しさんNGNG
Cのバイブルは「プログラミング言語C 第2版」
C++のは「プログラミング言語C++ 第3版」

ただいきなり読めるかはその人による。
0762760NGNG
重複れす、すんませんでした。
それに全然インデントしてないコード、お見苦しいものを
失礼しました。
0763デフォルトの名無しさんNGNG
でも、今から始めるのにC++を避けてあえてC言語を
学ぶメリットなんてあるんかなぁ・・・。仕事とかで
必要ってならともかく、学生が身に付けようってんなら
C++でしょう、このご時世。
C++の準備としてCやるならともかく・・・・。
0764デフォルトの名無しさんNGNG
Macで使えるフリーのCコンパイラを御存知ですか?

1つだけハーベストCというのを持っているのですが、使い方が
よく分かりません。
0765デフォルトの名無しさんNGNG
>>763
絶対数で言えばC++よりCの方が使用されてる事例の方が多い。
これからのことを考慮に入れても、C++とCどっちやろうかな〜なんて
漠然と考えている程度なら、どう考えてもCを学んだ方が良い。
0766760NGNG
>>763
結局は『選択の自由』とは思う。彼の動機がなんなのか
は知らないけれど、例えばrubyの本とか見てて、拡張がC
で説明されていればCに入って行くと思う。

それから、本人がC++書いてるつもりでもvalarrayとかvector
使わないでint[128]なんてやって悶々と無駄な事やってる
人見ると悲しくなってくる。

仕事になるとCのみってことあるじゃん。
そこで new int[128]が通らなくて迷う前にCはCとして
覚えていても良いかも。
0767デフォルトの名無しさんNGNG
>>759
ungetch ぢゃなくて ungetc のこと聞いてんだろ。(苦笑
>>756
ungetc なら、 FILE構造体 は
そのファイルの何文字目まで読んだかを記憶する変数を持ってるから、
その値を1文字分戻すってことをやっているんだと思う。
0768デフォルトの名無しさんNGNG
これつかえる?
http://developer.intel.com/software/products/compilers/pix/c_head3.gif
0769デフォルトの名無しさんNGNG
>>768
言葉どおりの質問なら答えはYesだが、
行間も読むと答えはNoとなる。
0770デフォルトの名無しさんNGNG
>>765
今時Cコンパイラなんてねーって。
0771デフォルトの名無しさんNGNG
分かってないなー > & 770
0772デフォルトの名無しさんNGNG
>>770
煽りでなければ、情報のソースを出してくれ。
0773デフォルトの名無しさんNGNG
>>765は言語の話してたんだろ。それで>>770はコンパイラのこと言ってる。
もう、そこで食い違いじゃないか。
0774デフォルトの名無しさんNGNG
>>772
多分C/C++コンパイラはある、とか言いそうだ。
0775デフォルトの名無しさんNGNG
今はCからC++に移りつつあるよ。まだCの方が多くてもね。
CよりC++の方がすぐれた言語なんだから当然よ。
0776デフォルトの名無しさんNGNG
>>775
速度は?
0777773NGNG
そうするとC/C++じゃないC++専用ってあるのか
0778773NGNG
>>775
その優れたと言われる新しい所ほど実際には使われてないんだよな。
というより、使う方が大変だよ。いや、使い切ってる例を知りたいよ。
0779デフォルトの名無しさんNGNG
>>775
C++はこれからも少しずつ進化していくだろうね。
一方のCはというと、既に言語としては完成している。

これらをメリットと捉えるか、デメリットと捉えるか。
目的によってだいぶ変わるだろうね。

ただ一ついえることは、C++に移りつつある、なんてことは
断じてない。
0780デフォルトの名無しさんNGNG
C++ができないからって必死だな…(藁
0781デフォルトの名無しさんNGNG
>>776
まず、本当に速度が必要な部分てのはそうそう無い。
本当に必要な場合でもフツーアルゴリズムをまともにすれば解決する。
それでもダメな本当に必要な部分はCで書いてもダメ。
0782773NGNG
ほんとそうだよ。> 780

おれはC++でどーしようか、突き詰めて考えてたら鬱になるよ。
あのSTLどうやってホントに使おうか迷うよ。
えっと、algorithmとかfunctionだっけ?
あれ本気で使って、テンプレートだなんだと組み合わせて、
あーだどーだでOOPだなんて、さっさと昔ながらのやり方した
ほうがよっぽど良いように思うよ。
0783デフォルトの名無しさんNGNG
C++はCより難しいって言って、Cを初心者に勧めてる人がいるけどさ、
入門レベルではC++の方が簡単でしょ。

stringとか参照を使えば、ポインタの概念を知らなくても一通りプログラム
を組めるしさ。
もしかするとポインタ(参照)を使わざるをえないJavaより簡単かもしれない。

ポインタを理解してないで「C++を使える」とは言えないけど、ポインタやクラス
のような難しい部分は、プログラムそのもの慣れてからマスターすればいいよね。
0784デフォルトの名無しさんNGNG
>>783
ポインタやクラスを理解しないでC++って学習できるかな?
少なくとも、一番最初に学ぶべきポイントをすっ飛ばしては
慣れるも何もないと思うんだけど、どうよ? ↓
0785デフォルトの名無しさん01/08/26 18:29ID:Rb2DRqs2
16bit BMP画像(モノクロデータ)の作成について

Image画像(現在、UNIXのXウィンドウで表示している)をBMP画像(ウィンドウズの環境で表示)に変換するプログラムを作っているのですがうまくいきません。
Image画像はピクセル値2バイトのモノクロデータ(カラーテーブル有り)ですが、BMP画像に変換するとカラー色がついてしまいます。
原因は、カラーテーブルが使われていないようです。
(16bit以上はカラーテーブルが使われないようですが、使うことはできないのですか?)
やっぱり、BITMAPINFOHEADER構造体の指定が間違っているのでしょうか?
0786デフォルトの名無しさん01/08/26 18:36ID:5xawU9/M
>>785
スレ違い。
0787デフォルトの名無しさん01/08/26 18:41ID:Svg5Z2ms
>>784
ポインタやクラスの学習はC++の学習に含まれています。
0788デフォルトの名無しさん01/08/26 18:47ID:Svg5Z2ms
VisualC言語なんてあるか?
MFCだってDirectXだってC++。
もう世の中C++よ。
0789デフォルトの名無しさん01/08/26 18:48ID:gEEpQCFI
なんかCよりC++のレスが多いね
0790デフォルトの名無しさん01/08/26 18:53ID:zzJMGaZY
あんたがたのC++の知識は分かったからここから出て行って下さい。
C++関連スレなら山ほどあるだろ。
0791デフォルトの名無しさん01/08/26 18:59ID:3fbgCCw6
>>783
話が微妙にずれてるね。>>783 が書いてるのは

 プログラミング自体の初心者で「変数って何ですか」のレベルの人
 間が、変数や制御構造などの概念を理解するまで。

の話だよね。

それなら個人的には「C, C++ どっちでも大差ない、むしろ変数の型や
#include を気にせずに済む Perl でも使った方が良いよ」と思う。

むしろ問題はその先で、Hello World から実用的なプログラムを組める
ようになるまでの段差じゃないかな? C なら

「プログラミング言語C」
「エキスパートCプログラミング」

それにアルゴリズムとデータ構造を解説した本を一冊読めば、まぁ合格
というところだが、C++ だと

「プログラミング言語C++」
「Effective C++」
「More Effective C++」
「憂鬱なプログラマのためのオブジェクト指向開発講座」
「デザインパターン」

程度まで理解しないと、実用的なコードは書けないし読めない。道のり
は遠いよ。
0792デフォルトの名無しさん01/08/26 19:06ID:1gb.tnZw
ぶっちゃけた話C++はC言語を含んでるんだから、C言語なんてもの
いらんのと違うか?なにもC++やるのにすべての機能知ってる必要
ないし、自分の使いこなせる部分だけひろってけばC++は十分使える
のだ。
0793デフォルトの名無しさん01/08/26 19:11ID:UgfBg/w6
>>792
あのー、コンパイラの数と質がぜんぜんちがうんですけど。。
0794デフォルトの名無しさん01/08/26 19:12ID:JomjwhzY
>792
それでSTLとかMFCとか使ってバンバンコード書くんだろ?
それはそれでいいんだが、Cとはやってる事が違うんだよ。
0795デフォルトの名無しさん01/08/26 19:21ID:23IWzhMA
>>792
C++ コンパイラを作るのは C コンパイラを作るよりも数段難しいし、
C++ のオーバーヘッドが許容できない実行環境も存在する。
0796デフォルトの名無しさん01/08/26 19:25ID:pP2VgnkE
C言語なら、オレに聞け! <5> と書いてありますが、スレ違いですか?

16bit BMP画像(モノクロデータ)の作成について

Image画像(現在、UNIXのXウィンドウで表示している)をBMP画像(ウィンドウズの環境で表示)に変換するプログラムを作っているのですがうまくいきません。
Image画像はピクセル値2バイトのモノクロデータ(カラーテーブル有り)ですが、BMP画像に変換するとカラー色がついてしまいます。
原因は、カラーテーブルが使われていないようです。
(16bit以上はカラーテーブルが使われないようですが、使うことはできないのですか?)
やっぱり、BITMAPINFOHEADER構造体の指定が間違っているのでしょうか?
0797デフォルトの名無しさん01/08/26 19:33ID:bFSG.ukQ
>>795
Cで書いてたのをC++にしたからってオーバーヘッドなんて無いよ。
速度が重要な時に論理的に美しく書こうとしてCでは無かった構造(継承とか)使うと
そうもなるけどね。
0798デフォルトの名無しさん01/08/26 19:36ID:1i8tqCTs
>>796
環境に依存しすぎる質問は無視されやすいから
もう少し質問をスタンダードなものに噛み砕いてから
もう一度書こう。
079979601/08/26 19:48ID:pP2VgnkE
>>798
すいません。
わかりました。
0800デフォルトの名無しさん01/08/26 20:13ID:YSpgd2FA
なんか微妙にスレ違いな議論だけど、基本的に >>792 に同意だな。
C++ でいわゆるオブジェクト指向と関係ないものを揚げても

(1) 型保障リンケージ
(2) 強力な型チェック
(3) 関数テンプレート
(4) 関数オーバロード
(5) デフォルト引数
(6) 局所変数をブロックの途中で定義できる

これらの機能使うだけでも C から C++ に移行する価値は十分あると思われ。
0801デフォルトの名無しさん01/08/26 20:18ID:qOGvKvts
>>797
仮想関数などのオーバーヘッドは当然ですが、それがなくてもランタイ
ム環境の仕事が増えます。

C++ では例外が飛んできたときに自動変数のデストラクタを呼ぶ必要
があるけど、そのための追跡コードとか、実行時型識別のためのコー
ドとか。
0802 01/08/26 20:39ID:7dBbEFak
fcloseにNULLって渡してもいいものなのでしょうか?
0803デフォルトの名無しさん01/08/26 21:08ID:xAvBmpd.
>>802
マニュアルを読んでください。
0804デフォルトの名無しさん01/08/26 21:26ID:y4vgeGlc
>>801
ランタイム環境の仕事ってなに?Cのコード持ってきた時に何が呼ばれるっての?
例外とかRTTIとかもCのコードなら関係ねーと思うけど。
あったとしてもゴミでしょ。
080580001/08/26 21:38ID:T2mfBZtY
>>801
例外や実行時型チェックを禁止してオーバヘッドを回避する
コンパイルオプションは大抵の処理系にあるはず。

C++ も C 譲りの効率重視の言語であることに変わりはない。
0806デフォルトの名無しさん01/08/26 21:49ID:8vO3bCFk
>>805
だから C 言語なんて要らない、と?
080780001/08/26 21:54ID:T2mfBZtY
>>806
要らないとまでは言わないけど、C++ が使える環境では積極的に使うべきだろう
ということ。
0808デフォルトの名無しさん01/08/26 22:14ID:8vO3bCFk
>>807
話が噛み合ってなかったか。

かなり脱線してるけど >>801 は元々 >>792 で「C++はC言語を含んでるんだか
ら、C言語なんてものいらん」と書かれていたことに対する反論なんです。主張は
次の二つ。

まずは、C++はCのスーパーセットだけど、コンパイラやランタイム環境を提供
する側からするとC++はCよりも手間がかかる。だから、実装が容易なC言語に
も意味がある。

もう一つは、C++もフルスペックで使うと、リソースが厳しい環境では性能上の
問題が出る。そこでぎりぎりまで絞ると結局Cと大差ないから、それならCでも良
いだろう(もちろん Embedding C++ って選択肢もあるけど、これが使えるかどう
かは場合によるので、素のCも選択肢に残しておいて欲しい)。

C++使える環境なら積極的に使えというのは同意だけど、C++処理系が提供さ
れていてもCの処理系ほど枯れていない場合も多いので、何でもかんでもC++と
はいかないのが現実。
080980001/08/26 22:17ID:/iAV1yEw
>>808
うん、同意です。
0810デフォルトの名無しさん01/08/26 22:42ID:oX28S3OM
>>782
STLとOOPはあまり関係無いと思うが。
081180001/08/26 22:55ID:kIMgTLjk
ついでだから、もうちょっと書くと。

前言を翻すようだけど C++ 勉強する人は いきなり C++ からやるのではなくて、
やはり最初は基本として C の文法を頭に叩き込んでから C++ に入ってほしい。
C++ だけやってるやつはどうも信頼できない気がする。まぁ、単にオレが C++ の
前に C をやってたせいかもしれないけどね。

その場合でもコンパイルは(C++ が使える環境なら)型チェックが強力な C++ で
行った方がよいとは思うけどね。

ただ C も型保障リンケージくらいは導入してほしい、てのもあるのだが。
0812デフォルトの名無しさん01/08/26 22:58ID:ZfNWoqwQ
>>811
型保証リンクなんて全然いらないね。ヘッダファイルを使えば済む。
それより、変数宣言だけでも好きな場所でさせてくれ。
0813デフォルトの名無しさん01/08/26 23:07ID:9zk6TrLQ
ところでC言語でWindowsプログラミングってできるんですか?
0814デフォルトの名無しさん01/08/26 23:11ID:oFIkZVhA
>>813
できるよ。
0815デフォルトの名無しさん01/08/26 23:53ID:1sqowans
今さらだけどさ、CはC++に含まれてるからCはやんなくていい!!ってのは
やっぱ違うと思う。
C++では使えるけど、Cでは使えない事ってかなりあるんだから、
Cを知っておくに越したことはないと思う。
Cマガ投稿する時とか困らないようにな(w
0816デフォルトの名無しさん01/08/27 00:02ID:n/Vu4WNc
WinAPIってC言語から呼び出す事を前提に作ってるんじゃなかったけ?
0817デフォルトの名無しさん01/08/27 00:02ID:INo6JfbM
プラットホームがWindowsなら、Cから入る意味はほとんどない。
Cは、読める程度でよい。
C++が一通りできれば、Cは読める。

C++は入門には敷居が高いって声が相変わらずあるけど、
入門レベルでは、むしろC++のほうが簡単である。
0818デフォルトの名無しさん01/08/27 00:03ID:INo6JfbM
>>816
ふつうC++はCのライブラリもリンクできるようになっている。
0819デフォルトの名無しさん01/08/27 00:06ID:INo6JfbM
818に追加
 WinAPIは、処理系が対応すれは、言語にかかわらず呼び出せる。
0820デフォルトの名無しさん01/08/27 00:13ID:/84EBIzA
>>817
プログラミング言語の習得と、各プラットホームでのプログラミング
技術の習得は別だよ。

Cプログラミングが一通りできるからといって、すぐに通信関係のプロ
グラムを書けるわけではないし、UNIX プログラマが Win32 に鞍替え
するなら Win32 に関する勉強が必要になる。

あと「入門レベル」というのが曖昧なので、もう少し詳しくかいた方が
良いと思うよ。
0821デフォルトの名無しさん01/08/27 00:26ID:INo6JfbM
>>820
べつに、全てのプラットホームで全てのジャンルのプログラミング
スキルを身につける話をしてるわけじゃない。
そんなことは現実的でもないし。

Windowsでプログラムを学ぼうすると、いろいろ選択肢があるが
CかC++に限定して、どちらが良いかということなら、
Cから入るメリットはない。
0822デフォルトの名無しさん01/08/27 00:38ID:/84EBIzA
>>821
SDK か MFC か、という話?
0823デフォルトの名無しさん01/08/27 00:47ID:pgWYs8fA
>>816
APIの呼び出し形式はPASCAL形式なので、
C前提ってわけではない。
# int PASCAL WinMain()とかって見覚えないかな
082480001/08/27 01:30ID:gDY6k4QU
>>821
> Windowsでプログラムを学ぼうすると、いろいろ選択肢があるが
> CかC++に限定して、どちらが良いかということなら、
> Cから入るメリットはない。

う〜ん、そういういきなりGUI から入るやつが微妙に信頼できないのだよね。
Win 環境でプログラムする場合でも、まずはアルゴリズムの勉強から入るはず
でしょ。とすると、最初はコマンドラインのプログラムから入って基本を身に
つけるべきだと思う。C の標準ライブラリの使い方も知らんやつに Win API が
マトモに使えるとは、ましてや MFC が使いこなせるとは思えない。

オレの考えが古いのかもしれんが。
0825デフォルトの名無しさん01/08/27 01:43ID:INo6JfbM
>>824
そういう書き方をすると、C++ってGUI用の言語みたいじゃん。
UIで、CとC++の使いどころを分けるのって認識が間違ってるよ。
082680001/08/27 01:54ID:gDY6k4QU
>>825
なるほど、そういやそうだな。ま、>>817 が Win やるなら C やらなくて
よいみたいなこと言ったから…。

ともかく C++ から入る人でも C の標準ライブラリはマスタしてほしいし、
C だけでできること、できないことをきちんと区別できるようになってほしい。
0827デフォルトの名無しさん01/08/27 03:07ID:iVLWrpEM
>>823
PASCAL とついてるから C 前提ではない、というのも短絡な気が少々。
コールゲートあたりにあわせたんじゃ?とも考えられるような気もしますけど。
0828デフォルトの名無しさん01/08/27 04:18ID:INo6JfbM
>>826
>なるほど、そういやそうだな。ま、>>817 が Win やるなら C やらなくて
>よいみたいなこと言ったから…。

自分の勘違いを人のせいにすんなよ。
俺は、コンパイラとか、各種の資源の状況から「Windowsでやるなら」って
言ったの。
082980001/08/27 05:22ID:OdbfeXSk
>>828
> 俺は、コンパイラとか、各種の資源の状況から「Windowsでやるなら」って
> 言ったの。

それは悪かった。それについては同意。
でも「C は読める程度でよい」とか、「入門レベルでは C++ の方が簡単」と
いう点では、やはり賛成しかねるな。

C/C++ が実行効率重視の言語であることは、C++ でその比重が多少他の要素に
移ったとは言え、依然として第一の目的であることに変わりはない。
だから入門者に、低レベルの文字列操作やポインタより先に string クラス
とかを教えることは、使えない C++ プログラマを量産することにしかならない
と思う。

入門者には練習問題として string クラスを作らせるべきだ、と言うならわかるが。
0830デフォルトの名無しさん01/08/27 05:35ID:6h0gcybg
>>828
議論がかみ合ってない、っていうか議論になってないね。
Windows固有の話ならスレ違いっていうのがまずあるけど、
それを別にしても、828の主張は他人と議論するそれではない。
「入門レベルって何?」ってところも明確にしていないし、>>784,>>787
で触れられているポインタの話だって、クラスとかそこから派生させる
事を考えると必要不可欠。
「そんなのは入門レベルじゃない。」って主張するかもしれないけど、
じゃあそれがどれほどCと違っているのかはこれもまでの説明からは不明。

ただ、WindowでGUIプログラムを学ぼうとすると、C++(むしろVC++&Win方言)
が必須という点には同意。これはオレの経験からの話だけど、通信系でWinAPI
を直で叩いていた頃には、Unix上での知識&Cプログラムで十分だったけど、
Windowsが提供する枠組みの中で、特にGUI系のプログラムを作る場合には、
C++は不可避だし、>>820の言う通り、Windowsがどう動いているのかと言う勉
強は必要。ただ、これらがCに比べて簡単かと言われると同意しかねる。
(すでに>>828が言う入門レベルではないかもしれないが、、、)

まずは、「入門レベルって何?」ってところからはっきりさせて欲しい。
0831デフォルトの名無しさん01/08/27 09:00ID:WSIwDgS6
両方やれよ。
どっちか片方なんてケチくさいこと言うな。
0832デフォルトの名無しさん01/08/27 15:52ID:3Bh1bjXY
もしかして >>828 って、プログラミング初心者はまず VC++ / MFC を使うのが
近道、と主張してるんだろうか?
0833デフォルトの名無しさん01/08/28 12:37ID: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);のような関数をつくるには
どうすればいいのでしょうか?お願いします。
0834デフォルトの名無しさん01/08/28 13:22ID:3vVKFA1E
>>833
Create_Moji(int n);
    ↓
Create_Moji(int n,char* lpStr);
で考えた方がいいのでは。

STLが使えるならstd::stringを使う。
0835デフォルトの名無しさん01/08/28 14:00ID: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()は宿題
0836デフォルトの名無しさん01/08/28 14:19ID:W6L8C4FU
>>835
それだと、n文字のものしか作れないと思われ
0837デフォルトの名無しさん01/08/28 14:44ID: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);
  }
}
0838デフォルトの名無しさん01/08/28 15:26ID:qhPN40nM
驚くほどスマートなコードですなぁ。
ありがとうございました。

これから解読(理解)させてもらいます。(w
0839デフォルトの名無しさん01/08/28 15:28ID:qhPN40nM
ID変わっちゃいました。833=838です。
0840デフォルトの名無しさん01/08/28 16:57ID:qhPN40nM
># conv26()は宿題

             ∩
        ∧_∧   | |   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
       ( ´Д`)//  < 先生! 宿題解りませ〜ん
      /       /     \_____________

ずっと考えてましたが解りません。a-zを26進数で考えればいい
というのは理解できましたが具体的にコーディングしようとすると・・・・
ヒープ領域を使ってみたり色々しましたが解りませんでした。
conv26()についてもう少し具体的に教えて頂けないでしょうか。
よろしくお願いします。
0841デフォルトの名無しさん01/08/28 17:13ID:PsZ1SeyA
Borland C++ Compiler 5.5と
Borland C++ Compiler 5.5 環境ファイル/パス設定プログラム(http://cmaga.zdnet.co.jp/setbcc.html)を
落として設定を終えました。
…が、上記サイトの『「ちょっと」使ってみる』で行き詰ってしまいました。
OSはw2kなのですがMS-DOSプロンプトて2kには無いんですよね?
何かいい方法を教えてください。お願いします。
0842デフォルトの名無しさん01/08/28 17:14ID: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;
}
}
0843デフォルトの名無しさん01/08/28 17:24ID:2hRAXWEY
>>841
あるよ
0844デフォルトの名無しさん01/08/28 17:55ID: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;
}

でもこれってまさかスパムメール作成に使うんじゃないですよね?
0845デフォルトの名無しさん01/08/28 18:00ID: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系文字コード以外への対応は宿題ということで…。
0846デフォルトの名無しさん01/08/28 18:20ID: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;
}
0847デフォルトの名無しさん01/08/28 18:22ID:ign9iVXY
> MS-DOSプロンプトて2kには無いんですよね?
あります。コマンドプロンプトとよばれていますが...
0848デフォルトの名無しさん01/08/28 18:34ID: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;
>     }
>   }
> }
0849デフォルトの名無しさん01/08/28 18:42ID: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;
}
0850デフォルトの名無しさん01/08/28 23:17ID: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);
}
0851デフォルトの名無しさん01/08/29 00:23ID:a/JC9lb2
             ∩
        ∧_∧   | |   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
       ( ´Д`)//  < 先生達の事は絶対忘れません
      /       /     \_____________
みなさんありがとうございました。でも、どれもなかなか難しいですね。
ようやく、2,3個理解する事ができたような気がしてる最中です。
残りも含めてアルゴリズムを自分のものにしようと思います。
0852デフォルトの名無しさん01/08/29 01:33ID:SkRUP4ao
グレースケール(16Bit)のBMP画像を作りたいのですが、うまくいきません。
如何すればよいですか?
0853デフォルトの名無しさん01/08/29 01:38ID:GIhJkjc.
>>852
そんなことできるの?
パレット持ってないと駄目っぽい気がするけど。
0854デフォルトの名無しさん01/08/29 01:39ID:.vw5ElIM
>>852
16bitグレースケールなんてマニアックな仕様、まず使えるかどうか調べてから使え。
少なくともそんなもんサポートしてるビデオカードはほとんど無いと思われ。
085585201/08/29 03:27ID:SkRUP4ao
>>853
カラーテーブルは自分で指定しているのですが、使われていない見たいです。
(16bit以上では、普通はカラーテーブルを持たないらしいですね。)

>>854
ビデオカードは問題あるの?
UNIXのXウィンドウでは、綺麗にでました。
0856デフォルトの名無しさん01/08/29 04:16ID:xEZlTqw2
普通のビデオだとRGB(0,0,0)〜(255,255,255)相当になると思うけど
16bitグレースケールだと(65535,65535,65535)になるのか?
単純に考えると各カラー16bit対応のビデオが要りそう。
フルカラー相当だと48bit必要。って合ってるかこれ?
0857 ◆winntZag 01/08/30 02:02ID:OJtyVZPM
>>856
あってるとおもう。

>>855のいうようにきれいにでたからといって、
ライブラリーの段階で下位8ビットは無視して上位8ビットだけ表示している可能性もあるので、
それが本当に16ビットで表示されているかどうかはハードに依存するはず。
085885201/08/30 02:20ID:.Z520LV6
>>857さん、
あなたの言う通りだと思います。
たぶん、表示の際には、8bitに丸められていると思います。
0859デフォルトの名無しさん01/08/30 05:27ID:MjfilObQ
医療用のならあるかもしれん、高いと思うが
0860デフォルトの名無しさん01/08/30 20:53ID:M.Ld2ZAM
>>859
医療用じゃなくてもフツーのSGIのマシンは12bit以上とかあるよ。
フルカラーなら8bitでも分からないけどモノクロでも12bitあれば
まぁ十分じゃないかな。
0861 01/08/30 23:52ID:cl5gnins
C++って何て読むの?
0862デフォルトの名無しさん01/08/30 23:54ID:EkMPJ/Yg
?
0863デフォルトの名無しさん01/08/30 23:57ID:Esv.WjFE
しいぷらすぷらす
0864デフォルトの名無しさん01/08/31 01:36ID:FMmhIaGI
シープラプラ
0865デフォルトの名無しさん01/08/31 01:44ID:6a8y9j3k
1よりも read.c を ハックしまくってる #6411にでも聞け
ヤツが書いた部分はかなり職人だと思ったり。
0866 ◆yEF18Xi6 01/08/31 01:57ID:SQb0Wr6Y

 
0867デフォルトの名無しさん01/08/31 21:22ID:7zNmzfnI
いつもお世話になっています。
頭爆発しそうです。質問させて頂きます。
ポインタへのポインターを動的に確保するには例えば
char **NewStr = NULL;
NewStr = (char**)malloc( sizeof(char**) *7 );
という具合にすればいいのでしょうか?なんか頭が混乱してしまって。
お願いします。
0868デフォルトの名無しさん01/08/31 21:34ID:7zNmzfnI
ひろゆきってこんなにクズな野郎とは思わなかった。
0869デフォルトの名無しさん01/08/31 21:48ID:7zNmzfnI
>>868 すいません誤爆です。しかも上げてしまった。
すいませんでした。
0870デフォルトの名無しさん01/08/31 22:23ID:7zNmzfnI
>>867 解決しました。ポインタのポインタになるとややこしくていけませんね。
お騒がせしてもうしわけありませんでした。
0871デフォルトの名無しさん01/08/31 23:28ID:7xETyOKM
>>
char **string_array = (char **)malloc( sizeof(char *) * 10);
string_array[0] = "blah blah";
string_array[1] = "sigh sigh";
0872sage01/08/31 23:45ID:Rxk6Y1v6
↑つっこむべき?
0873デフォルトの名無しさん01/09/01 00:13ID:vYeYNb6o
>>872
別に問題はないね。エラーチェックは無いけど。
0874sage01/09/01 00:21ID:WPZOqF8E
ならいいや。
間違いではないし。うん
0875デフォルトの名無しさん01/09/01 00:22ID:8UdnvL3A
C++
ちんこぷらぷら
0876デフォルトの名無しさん01/09/01 01:10ID: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)
0877sage01/09/01 01:14ID:WPZOqF8E
↑
これもつっこまないでおくよ。あるいみ間違いでもないし。
0878デフォルトの名無しさん01/09/01 01:15ID:LeyymvoY
>>877 つっこんで下さいよ。勉強になるし(T_T)
頭混乱しまくって死にそうです。
0879sage01/09/01 01:32ID: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] );

とりあえずこれやっとけ。
で、じっくり考えとけ。
0880デフォルトの名無しさん01/09/01 01:35ID:LeyymvoY
>>879 ありがとうございます。がんばって、考えてみます。
0881パンティーはいたまま排便、好きな人01/09/01 01:38ID:OK9pI4Co
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
0882パンティーはいたまま排便、好きな人01/09/01 01:45ID:OK9pI4Co

パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好き
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
0883デフォルトの名無しさん01/09/01 01:49ID:3D0QdnKM
>>876
> *NewStr = (char*)malloc( sizeof( char ) * 256 );
> *NewStr = "ABCDEFGHIJKLMNOPQRSTU";
本題と関係ないが、これだと *NewStr に割り当てたメモリがリーク
する。

strcpy(NewStr[0], "ABCD...");
0884パンティーはいたまま排便、好きな人01/09/01 01:51ID:OK9pI4Co

パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
0885デフォルトの名無しさん01/09/01 01:52ID:aOy89HzY
なーんか、不気味だな。(w
変な目つきで静観してる連中は見ないことにしよう。
>>880
*NewStr = (char *)malloc...
*NewStr = "ABC...
下のところ、const char * なので少し注意したほうがいいです。
厳密にコンパイルすると警告がでます。そんなところで。
慣れれば大したことないよ。 がんばれっ。
0886デフォルトの名無しさん01/09/01 01:57ID:LeyymvoY
>>883 レスありがとうございます〜。そうなんですか。
うう 難しいですね。文字列リテラルはどこかに確保された
char型の配列で、式中では先頭ポインタに読み替えられるから
、、、、えっと、たしかに文字列を代入してることにはならないって
理解でいいのでしょうか????うう難しい。
ポインタまではいけそうだと思ったんですがポインタへのポインタ
になったとたん訳がわからなくなってしまいました。
こつとかあるのかな。とほほ。
0887パンティーはいたまま排便、好きな人01/09/01 01:57ID:OK9pI4Co
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人
0888デフォルトの名無しさん01/09/01 02:02ID:LeyymvoY
>>886 レスありがとうございます。がんばります!
ですが、今日のところは休みます。皆様、おやすみなさいです。
0889デフォルトの名無しさん01/09/01 02:07ID: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 などで使える領域を指していないと
コアダンプします。
0890sage01/09/01 02:23ID:WPZOqF8E
>>886
その認識であってる。
ポインタの本質についてしっかり理解していこう。
0891デフォルトの名無しさん01/09/01 07:46ID:q8G9lFA6
ポインタへのポインタへのポインタ
0892デフォルトの名無しさん01/09/01 14:21ID:MI8SfqKo
>>889-891 レスありがとうございます。
2次元配列は「配列の配列」と言うのをきちんと理解してない
のが混乱してた原因だったのかもです。
2次元配列が式中では「intの配列」へのポインタに読み替えられるという事が
アドレスをすべて表示する実験でやっとわかりました。
第一次元?のhoge[0][]はどこかに別のところにスタックを確保してるのだと誤解してました。
単に配列への先頭のポインタ?なんですね。
実験して気づいたのですが、hoge[3][3]の時、hoge[0][8];とかやっても要素にアクセス
できますね。やっちゃいけないんでしょうが(^_^;
0893デフォルトの名無しさん01/09/01 16:35ID:uXCDEcwM
2行2列の場合
hanya[1][0] == hanya[0][2]
で、けっきょく同じことだったと思う。
別にアクセス違反じゃないので、大丈夫(だったと思う。)
ちょっと変わったやり方だけど。
0894デフォルトの名無しさん01/09/01 16:43ID:uXCDEcwM
とりあえず入門書読んだがいまいち根本から
理解してない、とかもっとCを掘り下げたいって人は
「Cプログラミング専門過程」藤原博文 技術評論社
なんていいのではないかと。「Cプログラミング診断室」の著者
です。けっこうたたかれてるみたいだけど^^;。
入門書の次に読む本としてはなかなかだと思います。
メモリの動作を詳しく見ているので、ポインタとか理解深まる
のではないかと。
089589401/09/01 16:46ID:uXCDEcwM
あ・・字間違っとる、スマソ
専門過程→専門課程
0896デフォルトの名無しさん01/09/01 17:46ID:MI8SfqKo
>>895 レスありがとうございます。
Cプログラミング診断室は熟読しました。面白いですね。
ネットで無料で読めるなんて驚きです。
「Cプログラミング専門課程」も興味あります。どんな本か知らなかった
のですが、そうですか。読んでみます。
叩かれてるってのが気になりますが、今の私では何で叩かれてるか
理解できないと思うのでいいかな。(笑)
0897デフォルトの名無しさん01/09/01 18:24ID:GmO3PIyE
プログラミング作法については、みなさん自分のやり方というのが
あるので、その辺で衝突するのでしょうか。
C診断室に、たしか1つの関数の長さは60行ぐらいとか書いてあった
と思いますが、60行という制限は短すぎるという人もちらほら。
0898デフォルトの名無しさん01/09/01 20:25ID:MI8SfqKo
>>897なるほど。確か100行言ったら恥ずかしいと思えとか書いてましたね。
あのおかげで関数を短くして分けるくせはつきました。
0899デフォルトの名無しさん01/09/01 22:08ID:ddv07fY2
久々に思い出したよ。最長不倒関数(vv
関数が長いと確かに恥ずかしい。
が、漏れはプログラマやってること自体がそもそも恥ずかしいな。
0900デフォルトの名無しさん01/09/01 22:21ID:TY5fGfOk
>>897
1000行でももれなく把握できる、と断言できるなら1000行でもいいでしょ。
だけどそんな人は一握りしかいないし普通の人は馬鹿だから
60行程度に収めとけば馬鹿がメンテすることになっても
まあ大丈夫かなという目安かと。
0901デフォルトの名無しさん01/09/01 22:27ID:OpA/UgtQ
>>899
2000行以上だったっけ?あれって。
0902デフォルトの名無しさん01/09/01 23:14ID:23xXAcjE
現在の記録は6344行みたい。その関数のソースファイルも
DLできるよ。↓ここで。

http://www.pro.or.jp/~fuji/mybooks/cdiag/index.html

これってC++かな?
0903デフォルトの名無しさん01/09/01 23:46ID:Fd.AZCp.
>>896
藤原本が叩かれるのは、基礎的な内容を大げさに書いているからだよ。
彼の本を遊びで読むのは良いが、それに信じ込まないようにね。
慣れたら多くの本や多くのコードを読みましょう。規格書も、デザイン本も
読んでみるといいよ。それなら井の中の蛙にならない。
0904デフォルトの名無しさん01/09/02 00:10ID:75FMiF1Y
>>902 私はCだと思ったけど、ネームスペースないし。
Cを勉強している者です。Cプログラミング診断室で
プリプロセッサのことが載っています。いい本がないって。
#誰の本の悪口言ってるのか分かりますが(^_^;
それで、プリプロセッサのノウハウを勉強することがいい本とか
ページとかないでしょうか?
グーグルとかで検索すればたくさんヒットしますが、自分自身
プリプロセッサのノウハウがないので、どれを参考にしたらいいのか
わかりません。
皆様、プリプロセッサを勉強するいい方法なり、書籍、ページなど
ご存知ないでしょうか。よろしくお願いします。
0905デフォルトの名無しさん01/09/02 00:27ID:oK1onob.
>>904
Q and A読んだ見たら?
0906デフォルトの名無しさん01/09/02 00:27ID:.f/mjsDI
>>904
C++とか、Cでも今時のならプリプロに頼ることはほとんどないと思うけど。
デバッグしにくくなるだけだから素直にコード書いた方がいいよ。
0907デフォルトの名無しさん01/09/02 00:44ID:75FMiF1Y
>905-906 レスありがとうございます。
Q and Aって{「C言語Q&A」 工学社 竹田仰著 }のことですか?
検索したらそれっぽいのはこれくらいでした。
>906 たしかにデバッグがしんどいですね。それなら別に勉強しなくて
いいのかな。
0908デフォルトの名無しさん01/09/02 01:02ID:XnpnvR/g
>>906
> C++とか、Cでも今時のならプリプロに頼ることはほとんどないと思うけど。
マクロを多用しすぎるのは問題だけど、マクロを使うとすっきり書けるコードも
あるよ。

MFC の IMPLEMENT_RUNTIMECLASS() とか ATL の MESSAGE_HANDLER() なんかは
マクロ使った方がマシな例。
0909デフォルトの名無しさん01/09/02 02:16ID:ElAtzxTU
>>907
まず>>1を読め。

>>908
templateで解決するような。後者はinlineじゃダメなの?
0910デフォルトの名無しさん 01/09/02 07:05ID: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に入ると思うのですけど,解答をみたら上記の通りでした.
わかる人,いましたら解説してくださいませ.
0911sage01/09/02 07:20ID: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で、ってこと。
0912デフォルトの名無しさん01/09/02 08:13ID:4iR.eRxY
910です.
3時間近くなんだろうなんだろうと考え込んでいましたが,自分はめちゃくちゃ
ドキュソだったことがわかりました....
""で囲まれているのだから
(0か1) - at EOF
って表示させているだけですね...

表示させられれば一瞬できずいたのかも知れませんが,EOFってキーボード
からの入力はできないものでしょうか.
0913デフォルトの名無しさん01/09/02 08:29ID:PvZGbwyU
>>912
Control-D だよ(←これって環境依存だっけ?)
0914デフォルトの名無しさん01/09/02 08:47ID:4iR.eRxY
重ね重ねありがとうございます.
Windows2000SP2のDOS窓を使っていて,Controlといろいろ同時押しを
したらzキーで
Press any Key to continue
と終了時のメッセージが出てくれました.
0915sage01/09/02 14:02ID:O1AzBlvw
>>913
環境依存だ
0916デフォルトの名無しさん01/09/02 17:49ID:YF/HkYq6

ポインタ変数自体の確保領域は何処ですか?ヒープですか?
ヒープに取ったオブジェクト中でポインタを宣言したら、それの確保領域
は当然ヒープでしょうか?
0917デフォルトの名無しさん01/09/02 18:31ID:pMnOmo0k
>>916
場所による。Cには何も魔法はないよ。関数の中に書いたら他の変数と同じく
スタック上。ヒープというのは謎だが。
0918sage01/09/02 18:40ID:O1AzBlvw
>>916
ヒープでもいいし、静的領域でもいいし、スタックでもいいよ。
メモリ上にも取られないことあるしね。

二行目以降よくわからんが
宣言と定義、動的な確保の違いについてよく理解してないなら
一度、参考書を読み直すといいよ。

がんばれ
0919デフォルトの名無しさん01/09/02 18:41ID:tx6ZtRyQ
ポインタ変数だって普通の変数と一緒じゃないの?
宣言の仕方によってそれ相応の場所になるのでは?
べつにポインタだからって特別な場所ってわけでもないし。
0920デフォルトの名無しさん01/09/02 19:05ID:YF/HkYq6
オブジェクトで宣言したポインタ変数は
オブジェクトが消滅するのと同時に消えるのですか
0921デフォルトの名無しさん01/09/02 19:30ID:TAJZb8DM
>>916 >>920
ここは C のスレだぞ?
お前 C++ の話してないか?
0922sage01/09/02 20:52ID:O1AzBlvw
構造体と読み替えれば、意味は通じるけどな。
C++かもしれんな。

CだろうがC++だろうが同時に消えるよ。
だが、ポインタが示す先オブジェクトについては、
明示的にそういうプログラムを書かない限り、消えない。

C++の話しをするなら別スレにおいで。
0923デフォルトの名無しさん01/09/02 22:01ID: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;
}
このようなコードでも動作はするのですが
警告を出さないためにはどのように書けば良いのでしょうか?
0924デフォルトの名無しさん01/09/02 22:45ID:JF5GVKf2
> void func(int *a[4][5]){
< void func(int a[4][5]){
0925デフォルトの名無しさん01/09/02 23:18ID:.f0adP9o
void func(int *a[4][5])

↓

void func(int (*a)[5])
0926デフォルトの名無しさん01/09/02 23:21ID:.f0adP9o
もしくは

void func(int a[][5])
0927デフォルトの名無しさん01/09/02 23:53ID:1arUuIGk
おかげで正しく動作するようになりました。
ありがとうございます。
本を読んでも良くわからなかったので助かりました。
0928デフォルトの名無しさん01/09/03 21:51ID:eo6BxHkY
保存する最大数が不確定な場合のデータ保存ってどうしたらいいんですか?
何しろ最大数が不明なので、グローバルでint[10000];とかはやりたくないし・・・。
都合よく増えた分だけ拡張可能な領域確保は、どうしたら良いのでしょうか?
0929デフォルトの名無しさん01/09/03 22:05ID:eIvnaQUI
>>928
realloc とか。
0930デフォルトの名無しさん01/09/03 22:07ID:H0Bpee16
>>928
リスト構造体、ヒープ確保&解放。
0931(-_-)さん01/09/03 22:17ID:xWB.yE86
char 型の配列に格納されている文字列 "Hikky" から
" h "がひとつ、 " i "がひとつ、 " k "がふたつ、 " y "がひとつ、のように
アルファベット毎の個数を数えたいんだけど、
なんかいい方法ありますか?
0932デフォルトの名無しさん01/09/03 22:26ID: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;
}
0933sage01/09/03 22:29ID:Lup6D7xc
static int hg[26+1] = {0,};
char *p = "Hikky";
while (*p) {
if (isalpha(*p)) hg[toupper(*p)-'A']++;
p++;
}
0934sage01/09/03 22:30ID:Lup6D7xc
一行抜けた。うごくからいいか。
0935デフォルトの名無しさん01/09/03 22:31ID:VgjKZNGY
main(int argc,char *argv[])って言うのと・・・
main(int argc,char **argv)の意味の違いはなんですか?
0936(-_-)さん01/09/03 22:35ID:xWB.yE86
>>932-934
見た感じ、正直よくわかりませんが、解読してみます。ありがとうございました。
0937sage01/09/03 22:37ID:Lup6D7xc
>>935
どっちもかわらん
0938名無の初心者01/09/03 22:41ID: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の引数の型を固定したいのです。(他の対策法でも構いません。)
なにかよい方法はないでしょうか。
0939デフォルトの名無しさん01/09/03 22:44ID:yPx0fR8.
struct {
int hoge;
char foo[0];
};
配列の大きさが0の配列とはどういう意味があるのでしょうか?
0940sage01/09/03 22:45ID:Lup6D7xc
>>938
stdarg.h
を調べとけ。

VBで扱っているようなvariant型の仕組みもついでに調べとけ。
0941sage01/09/03 22:46ID:Lup6D7xc
>>939
参考書の可変長構造体の項を調べとけ。
載ってないなら、その本は焼いて捨ててヨシ。
0942名無しの初心者01/09/03 23:24ID:JSIp0FKI
>>940
さがしていたものがズバリ見つかりました。
本当に有難うございました。
今後のためにもvariant型というのも頭に入れておきます。
0943名無しの初心者01/09/04 01:25ID: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);
のように呼び出しています。
0944デフォルトの名無しさん01/09/04 01:41ID:acuYbFiA
Cでは、配列そのものを関数に渡すことはできない仕様になっている。
だから、いつも必ず、先頭要素へのポインタを渡して、配列本体にアクセスしてもらうしかない。

charへのポインタの配列を渡すには、
charへのポインタのポインタを渡すしかないということ。

それで、char **argcということになるんだが、
簡便的にchar *argc[]という表記法でもよいことになっている。

両者に実質的な違いはない。
094594401/09/04 01:41ID:acuYbFiA
944は >>935な
0946sage01/09/04 01:51ID:VbosVW6E
>>943
func2を、書式を伝えるための引数+va_list 型引数を受け取るようにすればよい

vsprintfなんかの実装がそれだ。

void func2(char *format, va_list ap);

func1で引数の解析をせず、func2ですべて行うようにするのがポイントなんだが、
943のやろうとしてるfunc1とfunc2の役割によっては、そう行かないかもしれないね。
0947名無しの初心者01/09/04 02:28ID:aYttRhdQ
>>946さん
またお返事ありがとうございました。
946さんのおっしゃるようにfunc2で解析するようにしてみます。
それでなんとか目的は達成できそうです。
ってちょっと難しそうですが・・・
946さんには心から感謝いたします。
0948デフォルトの名無しさん01/09/04 07:58ID:ZHeJzkIE
#define _(a) a & a

if (from < _(a) < to ) {
:
}

こーゆー使い方ってダサい?
0949デフォルトの名無しさん01/09/04 08:11ID:xADXB3S6
for(ever)を思い出す
0950デフォルトの名無しさん01/09/04 08:21ID:2wbT/ats
>>949
僕お子様なんでそれ知らないんだけど、

#define ever ;;

てなことっすか? おもろいっす。
0951デフォルトの名無しさん01/09/04 08:34ID:ovWsf9ZU
for(;_;) でワラタことがある
0952デフォルトの名無しさん01/09/04 11:56ID:DASKlEA.
誰か次スレ立てろ
0953946ではないけど、01/09/04 12:02ID:bgFq5l0E
>>947
老婆心ながら一言言わせてもらうと、可変引数の関数の引数すべてを別の可変
引数に渡す一般な方法はない。

ただ、用途を限定すれば不可能ではない。
例えば>>943の例では、func1()の中で第1引数の長さを知ることで、その値が
実際の引数の数と違っていることはあるかもしれないが、一応幾つの引数が渡
されたかを別の手段で知ることができる。v[fs]printf()でもフォーマット引
数(%d, %sなど)の数を数えることで、引数の数を解決してる。別の方法として
は、必ず第2引数にfunc1()に渡した引数の数を指定させると言うのも一つの手。

ただ、これらはあくまで、個別のルールを作り込んでの可変引数の受け渡しな
ので、実際に渡している引数の数や型が違ったときに何が起こるかは分からな
いし、コンパイラも指摘してはくれないので十分注意のこと。
0954名無しの初心者01/09/04 17:31ID:8SeVGOiw
>>953さん
可変引数の型(intやdouble)も渡さないといけないのでかなりややこしくなりそうです。
自分一人が使うには問題ないですが、他の人が使うことを考えると・・・
もっとよく考えてみます。

レスありがとうございました。老婆心でもうれしいです。
0955デフォルトの名無しさん01/09/04 23:09ID:B/j8Xxas
>>952
なぜおまえが立てない?
0956sageNGNG
>>954
見た感じ数値型だけ渡せればよいようなので、

func2(double d[]);

にしちゃいなさい。
0957デフォルトの名無しさんNGNG
#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]
...
のようにするにはどうしたらいいですか?
0958957NGNG
ごめんなさい新スレ逝ってきます
0959デフォルトの名無しさんNGNG
プログラミング言語 Cアンサー・ブック 第2版

ってどうなんですか?
K&Rってかいてあるけど
ANSI学びたい人でも買いですかね?
あとこれがあったら
プログラミング言語 第2版
本体はいらないっすか?
0960デフォルトの名無しさんNGNG
新スレへどうぞ

http://piza2.2ch.net/test/read.cgi?bbs=tech&key=999617524
0961デフォルトの名無しさんNGNG
>>960
よく読んでないけど、アンサーブックってあれでしょ?
プログラミング言語Cにある問題の解答集でしょ?
だからプログラミング言語Cがなくちゃしゃーないっしょ
アンサーブックは別にいらない人もいるだろうし
0962デフォルトの名無しさんNGNG
あ・・間違えた
>>960じゃなくて>>959
スマソ
0963デフォルトの名無しさんNGNG
合計体重と平均をもとめるのに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);
}
0964デフォルトの名無しさんNGNG
>>963
入出力と平均計算をごっちゃにするのは良くないよ
input()
output()
weight_average()
に分けて、もう一度作り直せ
0965デフォルトの名無しさんNGNG
>>964
レスありがとうございます。
エラー的なものがあればそれもききたいのですが・・。
まぁ3つに分けて作る方向でがんばりますね。
0966デフォルトの名無しさんNGNG
>>965
>sum+=ary[i+1];
ここがおかしい。
i の動きをよーく追ってみよう。
0967デフォルトの名無しさんNGNG
>>966
ありがとうございます
[i++]ですね。
おまけにscanf("%d",&ary[i]);の%dを%.1fにしたほうがいいですかね。
0968仕様書書かないさんNGNG
>>957
struct test{
  int *a, double *b;
};

keepで
tester.a=mallocの戻り
tester.b=mallocの戻り

すると
tester.a[i]
tester.b[i]
のようにアクセスできる。
レス数が950を超えています。1000を超えると書き込みができなくなります。