1 :
ジョブス2世 :
2001/07/12(木) 12:29
こんどのジョブスさんはとてもいい人そうだ。 なんだかほのぼのした。 CでString型を実装するにはどうしたらいいかな?
5 :
デフォルトの名無しさん :2001/07/12(木) 13:22
>>3 char *string_alloc(size_t);
void string_free(char *);
char *string_assign(char *, const char *);
char *string_append(char *, const char *);
なんて感じで関数作れば?それ以上は無理。
6 :
デフォルトの名無しさん :2001/07/12(木) 14:01
多倍長演算を扱ったいい本ってないでしょうか? 検索しても中途半端なものしか見つからないので、 よろしくお願いします。
7 :
デフォルトで能無しさん :2001/07/12(木) 20:31
8 :
デフォルトの名無しさん :2001/07/12(木) 21:15
どもです。8さん。やっぱ基本から学びたいけど高すぎる! だれか共同購入しませんか?
10 :
デフォルトの名無しさん :2001/07/12(木) 23:03
C でString実装はちょっぴりめんどいな! まあ、モドキでいいんだけどね。 ところで、ASCIIコードとかは A〜Z が連続であることが保証 されてるけど、これが保証されていない文字コードなんて 実際のところ世の中に存在するのかね?
11 :
デフォルトの名無しさん :2001/07/12(木) 23:20
質問ですが、 typedef struct { int a; MIKAN b; //エラー } RINGO; typedef struct { int c; ... } MIKAN; このエラーが出ないようにする方法はありますか?
12 :
デフォルトの名無しさん :2001/07/12(木) 23:21
13 :
デフォルトの名無しさん :2001/07/12(木) 23:22
14 :
デフォルトの名無しさん :2001/07/12(木) 23:22
あるよ。 typedef struct { int c; } MIKAN; typedef struct { int a; MIKAN b; //エラーにならんぜ } RINGO;
15 :
10 :2001/07/12(木) 23:25
16 :
デフォルトの名無しさん :2001/07/12(木) 23:25
すみません間違えました typedef struct { int a; MIKAN b; //エラー } RINGO; typedef struct { int c; RINGO d; } MIKAN; このエラーが出ないようにする方法はありますか?
17 :
デフォルトの名無しさん :2001/07/12(木) 23:26
>>7 共同購入すると安くなるのかな?送料稼げる?近くじゃないと意味ないしね。
多分コピーしようってんだろうけど、それは犯罪だよ。
18 :
デフォルトの名無しさん :2001/07/12(木) 23:28
>>16 ないね。
フツーそういう時はポインタにするんだけど。
もっと根本的な問題はまぁ置いとくとしてもね。
19 :
デフォルトの名無しさん :2001/07/12(木) 23:29
>>11 typedef struct
{
int a;
struct _MIKAN b;
} RINGO;
typedef struct _MIKAN
{
int c;
...
} MIKAN;
20 :
デフォルトの名無しさん :2001/07/12(木) 23:31
21 :
デフォルトの名無しさん :2001/07/12(木) 23:37
22 :
16 :2001/07/12(木) 23:41
C言語の規定で解決法があるのかなと思ったんですが どうやらないようですね。あきらめます。ありがとうございました。
23 :
デフォルトの名無しさん :2001/07/12(木) 23:50
>>22 つーか、無限?
RINGO r;
r.b.d.b.d.b.d.b.d.b.d.b.d.b.d.b.d.b.d.b.d.a = 123;
とか?
>>16 そのような構造を無限マトリョーシカといいます。
25 :
7 :2001/07/12(木) 23:57
まぁ大いにマズイかんじしますけど。一応Personal UseコピーについてANSIにメールしてみました。>17
つうことでトモダチ募集!!
[email protected]
26 :
デフォルトの名無しさん :2001/07/12(木) 23:59
>>25 だから友達コピは犯罪だって。養子縁組するなら見逃されるかもしれないけどさ。
27 :
デフォルトの名無しさん :2001/07/13(金) 00:00
>>16 1.この宣言が成立したと仮定する。
sizeof( RINGO )は、いったいどうなるか(10点)
2.不完全型について述べよ(20点)
3.自己参照構造体について述べよ(20点)
4.相互参照する構造体について、その実現方法について述べよ(50点)
29 :
16 :2001/07/13(金) 00:05
無限になりますね(汗 実際には構造体のポインタとして使うのですが、 前方参照の問題なので、ポインタにしなくてもいいかと思って…。 MIKAN *b をvoidのポインタとして宣言して、キャストして解決してる んですが、なんとなく気になったので質問させていただきました。
30 :
デフォルトの名無しさん :2001/07/13(金) 00:07
>>29 だから、ポインタだったらそんなことせんでもよかんべ。
本くらい読めよ。大抵の本には載ってると思うが。
31 :
デフォルトの名無しさん :2001/07/13(金) 00:09
32 :
7 :2001/07/13(金) 00:14
>>26 ANSI準拠とか言って本売ってるとこいっぱいあるし・・やっぱいいんじゃないの?
商用の際は特別に申告&追加料金払えとかパッと見て書いてないし>本家
つまり自分が2MBの文書を定価245jで買って、赤の他人に(安く)再販するのはOKじゃないかと。
(そのあたりをメールで聞いてみた)
33 :
7 :2001/07/13(金) 00:17
>>31 どもです。WEBからDL購入らしいです。>アナログコピー
34 :
デフォルトの名無しさん :2001/07/13(金) 00:17
>>29 そらよ。
typedef struct MIKAN *pMIKAN;
typedef struct
{
int a;
pMIKAN *b;
} RINGO;
typedef struct
{
int c;
RINGO d;
} MIKAN;
今度の土曜にC言語検定の2級、3級のテストなんですけど どんなのがでそうですか?
36 :
デフォルトの名無しさん :2001/07/13(金) 00:52
>>32 しかし、全くすごい発想だな。
メールで聞くだけハナクソくらいの救いはあるが。
37 :
デフォルトの名無しさん :2001/07/13(金) 01:34
clock()の精度って上げられないですか? せめて10倍ぐらいに。
38 :
7>36 :2001/07/13(金) 01:44
死ね
>>37 カーネルパラメータを変更して再コンパイル。
41 :
37 :2001/07/13(金) 02:05
サンクス
42 :
だるだる :2001/07/13(金) 09:45
C言語で人工生命とか人工知能のプログラムを 作ろうかと思いますが、これは一般的ですかね? AI,ALとかを作ることに適している言語って あるんですかね?(聞いたことがあるが忘れました)
>>28 16ではないが、合ってる?
> 1.この宣言が成立したと仮定する。
> sizeof( RINGO )は、いったいどうなるか(10点)
sizeof(RINGO) == sizeof(a) + sizeof(MIKAN)
正確にはパディングが入る可能性があるので
sizeof(RINGO) => sizeof(a) + sizeof(MIKAN)
> 2.不完全型について述べよ(20点)
定義されていない、または定義途中の型
> 3.自己参照構造体について述べよ(20点)
C-FAQ 1.14参照
http://www.catnet.ne.jp/kouno/c_faq/c1.html#0 > 4.相互参照する構造体について、その実現方法について述べよ(50点)
typedef struct _a_t a_t;
typedef struct _b_t b_t;
struct _a_t { b_t *b; };
struct _b_t { a_t *b; };
44 :
デフォルトの名無しさん :2001/07/13(金) 10:29
>>42 ネタか?
そっち方面は門外漢なんで最近はどうか知らないが、前は
Prolog か LISP が定番だったけどな。
45 :
デフォルトの名無しさん :2001/07/13(金) 15:38
46 :
デフォルトの名無しさん :2001/07/13(金) 18:31
前スレで可変個の引数についての話があったけど、 _beginthreadex()で渡す、引数リストってどうやって 作成するんですか?
49 :
K&Rって :2001/07/13(金) 20:50
インチキでしょ?
50 :
デフォルトの名無しさん :2001/07/13(金) 21:56
51 :
眠い… :2001/07/13(金) 23:04
>>46 > _beginthreadex()で渡す、引数リストってどうやって
> 作成するんですか?
struct hoge{
int para1;
int para2;
int para3;
};
foo(){
struct hoge hogehoge;
DWORD t_id;
_beginthreadex(NULL, 0, thread_func, (void*)&hogehoge, 0, &t_id);
}
unsigned thread_func(void *param){
struct hoge *p;
p = (struct hoge *)param;
}
>>43 _ 始まりはシステム予約などで使用される。
サンプルでも使用すべきでない。
#ifndef _MYPROJ_H #define _MYPROJ_H : : : #endif も同じレベルで逝ってよしってことでよろしく
54 :
Q :2001/07/14(土) 00:42
すみません、別スレで質問したのですが、どなたも答えてくれなかったもので...。 Visual Studio6を使ってるんですが、MS-DOSプロンプトで cl 〜.c のように入力してもコンパイルできません。他のコンパイラでコンパイル したものを実行することはできるのですが。 どなたか分かりますでしょうか。
55 :
デフォルトの名無しさん :2001/07/14(土) 00:52
>>54 だから、どんなエラーが出るかくらい書けよ。
57 :
ジョル.ビブズ(偽者) :2001/07/16(月) 05:12
ビル.ジョブズさんって普段何してはるひとなん? ちょっと興味あり(はあと)
>>57 > ビル.ジョブズさんって普段何してはるひとなん?
普通のサラリーマンプログラマです。
プログラムに詰まったり、コンパイル中にここを見てます。
59 :
アイズ :2001/07/17(火) 00:12
スケジュールを作るプログラムを作りたいのですが。 登録、修正、削除、表示、検索が行えるように。 YYYY/MM/DD,HH:MM 月日、時刻、内容 ってかんじで。 ます、なにから考えればいいですかね?
60 :
>>59 :2001/07/17(火) 00:25
スケジュール
>>59 プログラマー以外の職業への転職、もしくは就職
駄目スレになりつつあるな・・
64 :
デフォルトの名無しさん :2001/07/17(火) 08:54
>>63 53はUUIDを噛ませろって言ってんじゃねぇーの。
65 :
デフォルトの名無しさん :2001/07/17(火) 09:48
>>59 日付と時間をおさめる構造体
この構造体と予定を納める双方向リスト(を実現する構造体)
双方向リストから登録、修正、削除、表示、検索を行う関数
C++だといいのにね・・・
>>64 _ で始まる名前はやめろっていってるんじゃ?
67 :
デフォルトの名無しさん :2001/07/19(木) 01:06
大した話じゃないし,実際動いているから問題ないんだけど スタイルについて疑問に思っていたので質問. Cの構造体の宣言の仕方について自分がよくやるパターンで, 具体例を挙げると例えばCSVのトークナイザを作る時に csv.h typedef struct _CSV CSV; CSV *csv_new(char *filename); char *csv_getvalue(CSV *cp); ... csv.c #include "csv.h" struct _CSV { ... }; CSV *csv_new(char *filename) { ... } みたいな感じにする.で、これを使うファイルからは, #include "csv.h" としてる.つまり,typedefとインターフェイスだけ外に見せるっていうやり方. 外部から構造体の中身について触る必要がない場合,いつもこういうやり方を してるんだけど,これってなんていうか,まともなやり方? 知りたいのは,こういう場合構造体定義もヘッダに書くべきなのか, 上記のようなやり方がまかりとおるかどうかは処理系依存なのかどうかとか. 今まで見てきたソースだと,大抵構造体定義もヘッダに出してるから どうなのかなーと思った. 一応LinuxでのgccとHP-UXのccではこう書けたんだけど.
>>67 ユーザーによる構造体メンバへの直接アクセスを避けたい
場合とかでは普通のテクニックだと思います。
ハンドル指向(?)の徹底という意味で、
良いコーティングスタイル事だと思います。
70 :
デフォルトの名無しさん :2001/07/19(木) 03:10
ハンドルにするなら*なんか書かせんなよ.
つーか気に入る様に勝手にtypedefすりゃいいじゃん。>70 厨房?
72 :
デフォルトの名無しさん :2001/07/19(木) 09:44
>>67 そんなところは無いようだが、どの変が処理系依存だと思ってるんだ?
73 :
出張あさはかマン :2001/07/19(木) 10:34
gnu newlibを解析してるつもりの人です。 こんなとこを見つけたのですが ------------ ctype.h ------------ ... #define _U 01 #define _L 02 #define _C 040 ... #define isalpha(c) ((_ctype_+1)[(unsigned)(c)]&(_U|_L)) ... ------------ ctype_.c ------------ #include ctypes.h ... _CONST char _ctype_[1 + 256] = { 0, _C,_C,_C,_C,_C,_C,_C,_C, ... } ------------ と書いてあったんですが、 (_ctype_ + 1)[n]って、_ctype_[n + 1]と同意なのでしょうか? もしそうだとして、unsignedなのに配列の大きさが[1 + 256]なのも 良くわかんないです・・・・ _ctypes_[0]は何につかうのだろ・・?
74 :
デフォルトの名無しさん :2001/07/19(木) 11:38
CSVファイルを編集するソフトを作ってみたいのですが 何かよいサンプルはありませんか。
75 :
デフォルトの名無しさん :2001/07/19(木) 12:04
>>73 > unsignedなのに配列の大きさが[1 + 256]なのも
> 良くわかんないです・・・・
is系は0〜255までの文字とEOFの257種類を判定しなければいけない為
77 :
出張あさはかマン :2001/07/19(木) 14:11
>>75 ,
>>76 と、すると
EOFが返ってきそうなものは符号付で来るのかな・・・
ちょっと確かめて見ます。
有難うございます。
int getc(FILE *fp)とか、すべてint表記でした。 すると(_ctype_-1)[n]は、やはり(_ctype_)[n-1]と 結果は同じになるということですね。 納得。 さんくすです。
79 :
67 :2001/07/19(木) 21:25
ありがとう.意見が聞けて良かったよ.
ポインタを意識させるかどうかは最初迷ったけど,考えた結果どっちでも
いいような事だと分かったんだ.だから,標準ライブラリのFILE構造体の
扱いにならってこうしたんだ.それ以来このパターンではずっとこのやり方だよ.
処理系依存かもしれないと思ってた個所は先に書いた通り,構造体定義の場所に
ついて.
>>74 は暗に俺に向かって言ってるのかも知れないけど,言語とか
はっきりしないのでパスするね.
80 :
デフォルトの名無しさん :2001/07/20(金) 03:02
>>79 Cの仕様をちゃんと理解した方がいいと思われ.
さぁ、もうすぐ夏休みだ!!!!!!!!!!!!! プログラム板のみんな気を引き締めろ!!!!!!!!!!!!
quick sortを自前で作ったら データ数20万を0.6秒でソートできたよ! qsort使ったら2.6秒くらい。 誰か ほめて!!
85 :
デフォルトの名無しさん :2001/07/21(土) 02:52
86 :
ビル・ジョブス :2001/07/21(土) 03:37
>>83 どうせオンメモリーだろ!
件数増えるとメモリーへのロード時間がネックになるだろ!
オレ様の場合は、MapViewOfFile駆使して、
10万件だろうが、100万件だろうが、
ほぼ同じスピードでソートできるロジック
もってるぜ!
へなへなへな。仮想記憶の立場は.... それとも窓系ってそこまでヘボなの?
89 :
ビル・ジョブス :2001/07/21(土) 04:10
スループットを追求するなら、仮想記憶させない 配慮が必要だ。 アーキテクチャーを味方に付けるのだよ。 お前らに言っても分からないと思うけど。
91 :
ビル・ジョブス :2001/07/21(土) 04:24
どこがだよ!ボケ!
おまえなあ。MapViewOfFile or mmapが裏で何やってるかを把握 してから出直しな。
>>86 なぜにこーゆー口調の奴ってばドキュソてんこもりなの?
94 :
90 :2001/07/21(土) 04:34
オンメモリをMapViewOfFileに変えた所で、
結局裏で仮想記憶が働くのは一緒。(
>>86 )
で、
>>89 で「仮想記憶させない配慮〜」とか言ってるから。
わかった?
95 :
88 :2001/07/21(土) 04:35
>>89 確かにそんなマヌケで曖昧な意見言われてもわからん。
今更キャッシュラインサイズにあわせたストライピングなんて
ガイシュツもいい所の話をだしたら、流石に一同ズッこけるか
ら、面白いネタ期待してるよ。
96 :
ビル・ジョブス :2001/07/21(土) 05:32
そっかー、お前らみたいなヤツらが居るから、
迷惑なくらい遅いソフトがまかりとおるわけね。
仮想アドレスと仮想記憶って別物だよな。
仮想アドレスにアクセスした時にオブジェクトが
存在しないと、Page Faultするよな。
ここで仮想記憶が動くわけだ。
最初の1回目に動くのは当たり前だ!
お前らみたいに数10MBも一気にアロケートして
Faultしまくりおバカに、mmapを…などと言われたく
ないんだよ。
もーWIN32使わないでくれ!
死んでくれ!
>>92
まー、仮想記憶システムの完成度によるよね >メモリマップの有効性 お馬鹿キャッシュなら仮想記憶もダメ→依存してるメモリマップもダメ っていう図式ができる。 ビルの言ってることも間違いではない。口が悪いけど。
98 :
:2001/07/21(土) 08:32
レベルの低い質問で恐縮ですが Visual C++ のprofessional EditionとStandard Editionの違いを 教えてください。
99 :
88 :2001/07/21(土) 08:51
>>97 口が悪いとか何とかの以前の問題で間違ってるよ。
マッピングは仮想アドレス空間に一度invalid状態でファイル
全体を割り当て、ページフォルトをつかって実際の読み込みに
入るんだから。そうじゃなきゃどのタイミングで読み込むか
教えてくれ。だからこそ最初に「窓系ってそこまでヘボなの?」
って聞いたのだよ。
というか窓林檎野郎も技術屋の端くれだったら馬鹿みたいに 吠えてないで、自分の方式のほうが圧倒的に速い、という事 を定量的に実証して見せれば良いだけジャンか。なんでその 程度できん? そもそもUNIXプログラマならmmap使った処理は一般的なもの で、なにも特別な方法ではないのだよ。 #圧倒的に高速には88の理由からならんが。
101 :
88 :2001/07/21(土) 09:11
>>100 その通りっす。でかすぎるファイルの一部を弄るときなんかに多用します。
あと、極端に大域的にランダムアクセスになるような場合、小領域での"分
割リード"に比べれば有利です。
ただし、sorting のように全体をスパースする場合は....って一々言わな
くても分るよね。
こんな感じ。 #include <stdlib.h> #include <stdio.h> #include <time.h> #define NELEM 10000 void mysort(int* pn, int nLen) { switch(nLen) { case 0: case 1: return; case 2: if(0){ case 3: (pn[0] < pn[1]) || (pn[0]^=pn[1]^=pn[0]^=pn[1]); (pn[1] < pn[2]) || (pn[1]^=pn[2]^=pn[1]^=pn[2]); } (pn[0] < pn[1]) || (pn[0]^=pn[1]^=pn[0]^=pn[1]); return; default: { int* pnH = pn; int n = nLen, nn; int nPiv = *pn, nVal, nPos, nNumS, nNumL, nNumE; nVal = pn[ nPos = nNumE = 1 ]; nNumS = nNumL = 0; while(--n){ if(nVal < nPiv){ pn[nNumS++] = nVal; nVal = pn[++nPos]; continue; } if(nVal > nPiv){ pn[nn]^=nVal^=pn[nn = nLen-1-nNumL++]^=nVal; continue; } nNumE++; nVal = pn[++nPos]; } pn += nNumS; for(n = 0; n++ < nNumE; *pn++ = nPiv); mysort(pn-nNumE-nNumS, nNumS); mysort(pn, nNumL); return; } } } int main() { int n, an[NELEM+1]; clock_t tStr, tFin; srand(time(NULL)); for(n = 0; n < NELEM; an[n++] = rand()); tStr = clock(); mysort(an, NELEM); tFin = clock(); printf("\n[time:%f]\n", (double)(tFin - tStr)/CLOCKS_PER_SEC); return 0; }
104 :
チト気を付けよう :2001/07/21(土) 11:05
>>99 あのー良くよんだほうがいいですよ。
ビルも一回目は…、って言ってるじゃん!
それはそうと、ビルジョブスって、このスレの
創設者じゃない?
だとすると、雲の上の人だよ。
>>103 どんなデータもソートできるように、比較をコールバックで行った
りmemcpy()的な方法で交換したりしている分、qsort()は不利かもし
れない。
その辺の条件そろえてなお速かったらほめてやるよ。
106 :
デフォルトの名無しさん :2001/07/21(土) 13:04
>>103 この程度の関数を qsort() と比較してはいけません。
- 単なる int 配列のソートしかできない。
- ソート条件は固定。
- ソートする要素に重複する値が無いことを前提としている(重複す
る値があると nLen == 3のときに xor の結果として 0 で上書き
されてしまう)。
- ソート済みのデータを与えたときに、処理時間が最悪のケース
O(n^2) になってしまう。
- 再帰を使っているので、メモリ不足時のエラーハンドリングが難
しい。
汎用的に書かず、エラーハンドリングや最悪のケースを避けるため
の配慮もしなければ、そりゃ多少は速くなりますが、代償として実
用性を失うことになります。
あと mmap() 云々は、またちょっと別の話ですね。巨大なデータを
整列させる場合には、データの読み書き部分がクリティカルパスに
なることがあります。UNIX の場合、伝統的なファイル入力のシステ
ムコールは read() ですが、これを使うと
1. デバイスからデータを kernel 中のバッファキャッシュに読み込む
2. kernel からバッファキャッシュから read() を呼び出したプロセ
スのメモリ空間にデータをコピー
と 2 度のコピーが発生します。mmap() だとこれが 1 度で済むので、
メモリの使用効率も CPU 負荷も下がることが期待されます。
ただし、単純に read() を mmap() に書き換えたら速くなるという話
ではなく、性能を出すにはデータ構造やロジックに関して、注意深い設
計が必要です。ソートでは入出力の回数を少なくするため、いかにメモ
リアクセスを局所化するかが肝ですね。
107 :
デフォルトの名無しさん :2001/07/21(土) 13:38
>>103 なんでint決め打ちなのにxorなんて使うかね.xor知ってよっぽどうれしかったのかな.
pivot選択少しくらい工夫しろよ.
108 :
デフォルトの名無しさん :2001/07/21(土) 13:47
unsigned shortを引数にもつ関数にunsigned shortの変数codeを 渡すと、 A(code); は問題ないのですが、 A(code | 1); とすると仮引数と実引数が異なると警告が出るのですが なぜでしょうか。|を使うと型が変更されるのでしょうか?
109 :
デフォルトの名無しさん :2001/07/21(土) 13:52
111 :
108 :2001/07/21(土) 13:57
>>109 ,110
早い反応アリガトウございます。
112 :
デフォルトの名無しさん :2001/07/21(土) 14:16
てゆーかー、unsigned shortなんて引数にする意味ないのよ。
>>104 どう考えたってファイルのマッピングの仕組みをビルが勘違いしていたのは間違いないぞ。
ていうかいちいち「!」つけるなよ。まるっきりビルだぞ(w
#ああ、こういったときのために sage 以下が欲しいなあ。
115 :
デフォルトの名無しさん :2001/07/21(土) 18:43
qsortと同じ汎用性を持たせたら 予想どうり負けたじゃん! ライブラリ関数には勝てないってことか… そんなqsortの中身を見てみたいんだけど、 見れないのかな?
117 :
デフォルトの名無しさん :2001/07/21(土) 21:11
118 :
108 :2001/07/21(土) 21:11
119 :
ビル・ジョブス :2001/07/21(土) 21:19
>>113 >>114 オレは勘違いもしていないし、間違ってもいない。
コアな部分は作った経験が無いと分からないんだよな!
上記2名はVRとかSHでいいから、簡単なボードを
自作でもして、仮想記憶コードを作ってみろよ!
まぁ、多重仮想記憶モードのASIDの使い方で
頭がハゲるだろうな。
偉そうこいといて、無理だって言うなら、
即刻コンピューターやめな!このタコが!
>>119 まあそのくらいにしとき。
少なくとも俺はx86とMIPSでの仮想記憶コードの作成
経験があるよ。
122 :
デフォルトの名無しさん :2001/07/21(土) 21:41
123 :
ビル・ジョブス :2001/07/21(土) 21:42
>>120 どうせ、HALかOALでエクセプションハンドリングを
ちょこっと書いただけだろ。
そりゃ仮想記憶コードとは言わないぜ!
あっ、明日、渋谷でデートだ!A.I.観るんだった!
お風呂はいろーっと。
もう、2chつまんねーなー…
なんか引き際の見苦しいやっちゃなあ。 ビルってこんなにしょうもない奴だったの?
125 :
>>124 :2001/07/21(土) 22:30
"悔しい"の間違いでは… 彼女居ないからって僻むなよ… まず痩せろよ!デブ!
>>123 linuxの仮想記憶部分見れば一発じゃん。
もうすこし面白い煽りしてくれよ。つーことでさげ。
>>126 これは放置でしょう。
もう既に技術ネタでは勝てないことを自分でアピールしてるくらいだから。
普段なら空白下げで隙間空けてから仕切り直すところだけど、この時期は
無駄だろうなあ。
#余談だが太ってるくらいで彼女できない奴なんているのか?
#俺も太めだが。
129 :
デフォルトの名無しさん :2001/07/22(日) 06:36
ファイル名を入力して ファイルの大きさ(バイト数)を出力するプログラムって どうやって作るんですか?
130 :
デフォルトの名無しさん :2001/07/22(日) 08:32
ビルは複数存在してるぜ。
131 :
デフォルトの名無しさん :2001/07/22(日) 10:24
Cを始めて半年の初心者です。 「is〜」関数(マクロ)について教えて下さい。 例えば、isdigit 関数なのですが、 ヘッダ ctype.h に次のように定義されています。 extern const unsigned char _ctype[]; #define _DGT_P 0x4 /* digit */ #define isdigit(c) ((_ctype[(c)+1] & _DGT_P) != 0) これでなぜ (c) が数字かどうか判定できるのか、いまいち理解できません。 ・_ctype[] とは何か? この外部変数の実態定義がどこにもありません ・_ctype[(c)+1] とは、具体的に何か? ・なぜ 4 とビットANDをとるだけで数字かどうか判定できるのか? 他の is〜関数も似たような定義になっています。 このコンパイラは LSI C-86 Ver.3.30 試食版です。 よろしくお願いします。
132 :
デフォルトの名無しさん :2001/07/22(日) 10:51
_ctype[]は探すと extern で宣言されていると思いますが、こ のことからもわかる通り、ライブラリ中にあります。要するに 各キャラクタごとに予め種類分けしたテーブルを参照する訳で す(単純!)。and を取るのは、各エントリの各ビットが其々の 種類に対応している、というわけです。
133 :
デフォルトの名無しさん :2001/07/22(日) 12:56
134 :
デフォルトの名無しさん :2001/07/22(日) 15:56
>>129 1. プログラムを書いて
2. コンパイルして、
3. 実行する.
だけなんだけど、システム依存だから何でやりたいのか書けよ.
135 :
129 :2001/07/22(日) 15:58
FILE * fp; 使うのは分るんだけど。。。
136 :
129 :2001/07/22(日) 16:01
>>134 レス有難う。
パソコンでやりたいんだけど。。。
>>129 言語や環境がわからないと答えようも無いな・・・
ハッ! (ゴゴゴゴゴ) 新手の荒らしかッ!
138 :
129 :2001/07/22(日) 16:11
>>137 ごめん。。。嵐じゃないです。
c言語です。あと環境はウィンドウズ98です。
139 :
129 :2001/07/22(日) 16:20
>>137 怒ったんすか?なにぶん初心者なもんで・・
ゴメンナサイ。
一番肝心なコンパイラが何か書いてないし
141 :
129 :2001/07/22(日) 16:32
C machine Version 2.00 とか言ううやつです。。。 開発環境 PC-AT互換機にてVisualC++ Ver6.0+旧Ver だそうです。
142 :
131 :2001/07/22(日) 16:36
>>132 >>133 ありがとうございました。
う〜ん、_ctype[] の中を見ることはできなさそうですね。残念。
143 :
デフォルトの名無しさん :2001/07/22(日) 16:53
>>141 なんだか分からんが、fopen()、fseek()してftell()で調べるのが
どこでも動いていんじゃないかな。パフォーマンスは悪いが。
>>142 ええ?なんで?ソースに書いてあるんじゃないの?
もしないなら、プログラム書いて配列先頭から順番に
出力してみたら?
MFC使えるならCFileのGetLength()でもええし
146 :
デフォルトの名無しさん :2001/07/22(日) 21:38
MFC使えるならCFileのGetLength()でもええし
GetFileSizeとかいうAPIがあったと思う.
148 :
デフォルトの名無しさん :2001/07/22(日) 23:38
>>144 ソースはなかったと思う。
ライブラリを逆汗するという方法もある。(藁
149 :
デフォルトの名無しさん :2001/07/23(月) 00:05
一つ教えてくらはい。 enumって無条件にintになるじゃないですか?(あってる?) それをcharとか割り当てサイズを変えたいのですが。。。 あくまでも、enumにこだわっています。
>>149 -fshort-enums が使えるんじゃない?(大爆笑)
151 :
デフォルトの名無しさん :2001/07/23(月) 00:27
コムパイルオプチョンですか。。却下。 こういうふうに書きてぇ〜>ANSI C改革! typedef char enum { hoge, hage, hige }hhh;
153 :
デフォルトの名無しさん :2001/07/23(月) 00:41
>>152 意味不明な指摘だな...
>>151 enumはintと同じ扱いだから例えば255以下が保証できるなら勝手にchar配列
にとりゃいいんだよ。キャストしないとwarningはでるだろうけどね.
あのちょっと参考に聞かせてほしいのです。 自分は、C言語を一応使えるようになった(と、思っている)レベルなんですが さまざまな長さの行を持つテキストファイルを1行づつreadしてmallocした領域 に放り込んで、各行をポインタのチェーンで結んでやって行を移動できるようにしたい んですが(テキストエディタの基本構造を作成してるんです)小規模なファイルなら 問題なく動作するんですが、極端に大きいファイルだと使い物にならないくらいに遅い んですが、これを回避する方法はあるのでしょうか?
155 :
デフォルトの名無しさん :2001/07/23(月) 01:22
極端に大きいとないんじゃないか?メモリを増やすんだな。
156 :
デフォルトの名無しさん :2001/07/23(月) 01:25
>>152 そのURLがあったんで意味不明なんだが、C++を使うというのは
正しい指摘だな.
operator intとかoperator =を使えば少しおもしろいかもな.
一発で全部(もしくはチャンク全体)を読み込んで、リンクリストはその後一気に作る。 くらいか。
154の続き で、思いついたのは巨大なファイルの一部だけをメモリに乗せておいて メモリの範囲外を参照されたときにファイルを読み直しするように すればOKか?と思ったのですがテキストエディタを作った事のある 方にお聞きしたいんですが「考え方」として合っていますか?
159 :
デフォルトの名無しさん :2001/07/23(月) 01:32
>>158 UNIX系なら何も考えないとそうなってるんだが.
>>159 あっそうか!
そうですよね!うーん自分であれこれ考えるより
素直に仮想記憶にお任せするしかないのかなあ?
161 :
デフォルトの名無しさん :2001/07/23(月) 01:49
>>159 大きいってどのくらいのファイル?
ただ単にプログラムがしょぼくて処理が遅くなってるだけでは?
162 :
デフォルトの名無しさん :2001/07/23(月) 02:14
>>161 極端っていうわけだから実メモリの数百倍以上じゃないか?
163 :
:2001/07/23(月) 02:19
>>160 そうやって諦めちゃうから、メモリばっかり食う
アプリが出来ちゃうんだよね。
mallocは、システムコールと言えども、結構時間かかるから
頻繁に行うのばダメです。
行の先頭のファイル位置だけを、メモリブロックに保存。
編集した行だけをメモリブロックに、もしそれが足りないなら
一時ファイルに書き出しておく・・
最後に保存するときに、全ての順番を整えます・・
おいおい malloc はシステムコールじゃないぜよ。 ブレークアドレスとかって知らんか?
165 :
デフォルトの名無しさん :2001/07/23(月) 04:38
166 :
デフォルトの名無しさん :2001/07/23(月) 06:38
>>165 板違いだが反応してやろう。
STLが分からなければ、自分で同様な動作をする
クラステンプレートを設計してみな。listあたりが楽、
一通り出来たらSTLと動作を比較して、違いをソース
レベルで検証する。さすればSTLに対する理解がドーン
と深まる。
167 :
デフォルトの名無しさん :2001/07/23(月) 12:39
多体問題とかの物理の微分方程式を近似計算で数値的に解いてるんだけど グラフィカルにみてみたい。コンソールでの知識しかないから、VCコンパ イラのVisualな部分に頼れない。DOS窓で何とかならないものか?
VCならDialogベースで直接落書きしてみたら? mainからのプログラムでないとわからん、つうのならJavaが楽なんだけど
169 :
デフォルトの名無しさん :2001/07/23(月) 13:23
ある変数のん番目のビットが0か1かを判断するマクロを作って ください。自分ではよくわからないのでお願いします。 自分でやれなどのレスはご遠慮します。宿題は自分でやれってのも ご遠慮ください。まともな返答以外はレスはいりません。
あ & (1 << ん)
>>169 「宿題は自分でやれ」以上にまともな返答はこの板にはないYO!(藁
弊社のソフトウェアを買って下さい。自分はよくわかりませんがお願いします。 説明をしろなどの返事はご遠慮します。営業なんだから営業やれってのもご遠慮ください。 色よい返答以外はいりません。 こんな営業が来たら蹴り返します。
>>172 つーかそんなやつ生かして返さないYO!
174 :
デフォルトの名無しさん :2001/07/23(月) 14:51
科学計算のプログラムについて書かれてる本などはないでしょうか。
175 :
:2001/07/23(月) 15:12
ジョブスよぉ オナーニは一日に何回するんだ?
178 :
デフォルトの名無しさん :2001/07/23(月) 18:12
3次の2次方程式を解くプログラムってどう作ればいいんですか?
179 :
デフォルトの名無しさん :2001/07/23(月) 19:26
何次だよっ!
180 :
デフォルトの名無しさん :2001/07/23(月) 20:16
>>178 aX^3+bX^2+cX+d=0
を解くプログラムで
a=0の時の場合訳を考えろよ。
普通なら2次方程式の解を解くプログラムに振り分けるわな。
181 :
174 :2001/07/23(月) 20:55
Numerical Recipes ってどんなことが書いてあるんですか? アマゾンとかあんまり内容が書いてなくて買うのが不安なんですが。 学校の図書館にも置いてなかったし。
182 :
176 :2001/07/23(月) 21:45
FreeBSD98からGCC使ってコンパイルしたいんだけど 具体的にどうやってやるか方法を掲載して在る所教えて。
183 :
デフォルトの名無しさん :2001/07/23(月) 23:22
184 :
ビル・ジョブス :2001/07/23(月) 23:58
よーゴミ野郎はとっととこのスレから出て行きな! 2ch出禁だな!ターコ! でも仮想記憶のコードはお前らンコ以下のガキ にはレベルが合わないよな。オレが悪かったよ。 さーて、そんな方程式簡単に解けるだろ! マスマティカとか使えよ。
185 :
デフォルトの名無しさん :2001/07/24(火) 00:27
186 :
デフォルトの名無しさん :2001/07/24(火) 00:28
どーせ使えねんだろ、マスしかかいたことねーくせに.
188 :
:2001/07/24(火) 02:30
enum って必要なのか? 俺的には理解不能だし、いらない。
>>188 あればあったで便利な機能だよ。
いちいち定数に自分で数字を振りたくないときとか。
190 :
デフォルトの名無しさん :2001/07/24(火) 02:42
>>188 C-FAQ的話題だけど、
シンボルの列挙は記述が楽。デバッガでシンボル名が見える。
列挙使わないとすると、
#define hage 0
#define mage 1
#define sage 2
とか書いていくの?
これでhageを1に変更したい場合とか、
全部書き換えなきゃならないじゃん。
(perlやsedとかで自動生成する、みたいな反論は無しにしてね。)
191 :
デフォルトの名無しさん :2001/07/24(火) 02:45
それに列挙体ならまとめて書けるし。 enum {hage, mage, sage};
それこそ#defineと同じで 「無くても書けるがあった方が便利」 なシロモノだろ<列挙体
なにがいいたいのかよくわからん>192
enumはdefineと違ってローカルスコープをもてるからいいね。 C++ならばこれが重要になってくる。
>>194 同意。
加えて enum だと switch - case に漏れが無いかを、コンパイラや lint で
チェックできるのも便利かな。
>>188 実社会でホザく前にここでお勉強できてよかったね・・・
197 :
デフォルトの名無しさん :2001/07/24(火) 16:01
Visual C++でMFC使ってるんだけど、CBrushクラスで四角とか円とか描画すると 黒い境界が出るのはなんとかならないかな?あと、中身を塗りつぶさない方法も わからない!四角形だったらCPenクラス使って線引くだけでいいんだけど、円は かなり厳しい!まさか円の方程式使って一点一点描画するわけにもいかないし。
198 :
デフォルトの名無しさん :2001/07/27(金) 00:24
BSTRをcharに変換する方法を教えてください
199 :
デフォルトの名無しさん :2001/07/27(金) 10:59
>>198 WideCharToMultiByteあたりで変換すればよし
200 :
デフォルトの名無しさん :2001/07/27(金) 11:29
C言語の8進数表記が許せないです。 やつは危険すぎます。 いくらジョブズでも、いまさら8進数表記を 無くす訳にはいかなでしょうから、 せめて、なぜ、2進数表記すらないC言語で、 8進数が、しかもあんな危険な表記方法で 実装されているのか、理由を教えてください。 納得の行く理由があるのなら 多少は腹の虫も治まるかも知れないので。
言語は悪くない、知らなかったやつが悪い
203 :
デフォルトの名無しさん :2001/07/27(金) 12:27
204 :
デフォルトの名無しさん :2001/07/27(金) 12:48
つい0でパディングしてしまいます。
/ / / | / / / / / | | | | / / / フ | | | | | | / τ | | | | | | |/_ ─- τ | | | | | | イ (。@)ヽ ノ /⌒ヽ ∠___ || | | |ノ| x ー─ ノ //^) | ∠___ | | | |ノ | X _( /__ノ__ノ ∠_____ | | | (| X | | | | ヽ X | | | | 冫ーヽ X | | | | 冫 x| )| | /⌒ ─────- | | / | | /⌒ モグリの私がこんなことを言うのも何だがね、アセンブラの知識をひけらかし、 | | __/⌒ 厨房に信仰され悦に入っているジジイと、VBで糞ツールをつくってばらまく厨房なんざ 私たちRubyユーザから見ればどちらも同じ様な物だがね まあ助かりたいと言うなら一千万頂きますよ、それで助かるんだ安いもんでしょう? 企業の一千万なんて軽いもんでしょう、だが君らには二千万払ってもらうがね
206 :
デフォルトの名無しさん :2001/07/27(金) 16:58
char* ReturnMoji() {     char szMoji[256] = "Hello,world!";     return szMoji; } はエラーにってしまいますがアドレスszMojiを返したい場合にはどうすればいいのでしょうか。 やりたい事は解って頂けると思いますが・・・・
207 :
206 :2001/07/27(金) 16:59
×はエラーにってしまいますが ○はエラーになってしまいますが
>>207 ローカル変数へのポインタを返してはいけない。
const char* ReturnMoji() { return "Hello,world!"; }
>>209 そんなことしても、なんも面白くないと思うが
せめて
const char* ReturnMoji(){
const static char* szMoji = "Hello,world!";
return szMoji;
}
211 :
206 :2001/07/27(金) 17:59
なるほど、constですか。 グローバル変数を使うところでした。 ありがとうございました。
constじゃなくてstaticに注目されたし。 その前に210より209に注目されたし。
214 :
デフォルトの名無しさん :2001/07/27(金) 18:39
>>208 ローカルでもstaticならokだろ、ゴルァ.
>>210 >const static char* szMoji = "Hello,world!";
staticにする意味無し
static const char szMoji[] = "Hello,world!";
なら意味もあるが
209や215はなんも間違ってないだろ。 やり直したほうがいいのは210=212。 209のようなコード書いて、コードをレビューする人間に つっこまれたことは俺もある。
210と212は別人だね…。大変失礼。 逝ってきます。。
馬鹿が..............いる。
ほんもののビル.ジョブズ氏はもうこないんですか? ファンだったのにぃ(めそめそ)
□□□□■□□□□□■□□□□□□□□□□□□□□□□□□□□□
□□□■■□□□□□■□□□□□□□■■■■■■■■■■■■□□
□□■■□□□□□■■■■■■□□□□□□□□□□□□□■■□□
□■■□□■□□□■□□□□■□□□□□□□□□□□□■■□□□
□□■□■■□□■■■□□■■□□□□□□□□□□□■■□□□□
□□□■■□□■■□■■■■□□□□□□□□□□□■■□□□□□
□□■■□□□□□□□■■□□□□□□□□□□□■■□□□□□□
□□■□□□■□□□■■■■□□□□□□□□□□■□□□□□□□
□■■■■■■□□■■□□■■□□□□□□□□□■□□□□□□□
□□□□■□□□■■□□□□■■□□□□□□□□■□□□□□□□
□□■□■□■□□□□■■□□□□□□□□□□□■□□□□□□□
□□■□■□■□□□□□■■□□□□□□□□□□■□□□□□□□
□■■□■□■□□□□□□□□□□□□□□□□□■□□□□□□□
□■□□■□□□□■■■□□□□□□□□□□□□■□□□□□□□
□□□□■□□□□□□■■■□□□□□□□□□□■□□□□□□□
□□□□■□□□□□□□□■■□□□□□□■■■■□□□□□□□
続きはコチラです
http://www.geocities.com/entry_k/main/main01.html
224 :
デフォルトの名無しさん :2001/07/28(土) 01:09
const static char* szMoji = "Hello,world!" と static const char szMoji[] = "Hello,world!"; の違いってなんですか? 前者は「静的なポインタ変数」が変更不可能 後者は「変更不可能な文字配列=文字列リテラル」が静的 であってます?
前者は"Hello,world!"のアドレスを、 わざわざ静的なポインタにいれて値を返しているから無意味 ポインタにstaticが無くても"Hello,world!"が静的に確保されるので 一時的なポインタで良いものにstaticを付ける必要はない
>>225 なるほど、納得
Cのコードが読めていないのかと思った。ロジックでしたか。
227 :
デフォルトの名無しさん :2001/07/28(土) 01:30
別人だけど225を補足すると、
結論として、
>>206 のような「用途」には、
>>209 の方法がよいということね。
>アドレスszMojiを返したい場合にはどうすればいいのでしょうか
こういう、アドレスを〜 という書き方をしているせいで、static
云々の話になってしまったのかもしれないね。
228 :
デフォルトの名無しさん :2001/07/28(土) 01:38
>>222 来てもいいけど、今度は論理で勝負して欲しいもんだな。
定量評価せい、といわれても無視する上、匿名版でプライベート
自慢する寒さに気付かないようでは、単なるスレ上の障害物だ。
230 :
デフォルトの名無しさん :2001/07/29(日) 13:30
C言語とは直接関係無いかもしれませんが……。 fputs を無限ループ内に記述し実行した場合、最終的にどうなってしまうのですか? (実行環境は Windows98のDOS窓とした場合) 1.「ディスクがいっぱいです〜」と Windows からメッセージが出る。 2.ブルースクリーンになる。 3.ブルースクリーンにならずハングアップする。 4.プログラムは異常終了するが、Windows には影響なし。 5.その他。 経験された事のある方いましたら教えて下さい。 先日、setjmp と longjmp の勉強をしていて、似たような状況になりました。 setjmp のある関数がリターンした後、longjmp をすると暴走する、とあったので、 ためしにやってみたのです。 longjmp の記述がある関数が無限ループになったらしく、そこに printf があって、 それをファイルにリダイレクトさせて実行していました。 ハードディスクがカリカリと音を立てて止まりません。ヤバイと思いDOS窓を強制終了させました。 で、300MBのテキストファイルが出来上がりました(笑)。
232 :
デフォルトの名無しさん :2001/07/29(日) 16:38
平方根を高速に求める方法ってありますか? あと立方根とかも?
233 :
デフォルトの名無しさん :2001/07/29(日) 16:59
extern float x, y; y = sqrtf(x); y = powf(x, 1/3.0f);
234 :
デフォルトの名無しさん :2001/07/29(日) 17:02
235 :
デフォルトの名無しさん :2001/07/29(日) 17:15
値が不定になるから.
236 :
デフォルトの名無しさん :2001/07/29(日) 21:17
powf()より速い実装どっかにありませんか?
237 :
デフォルトの名無しさん :2001/07/29(日) 21:44
powf()の実装って決まってるのですか?
238 :
デフォルトの名無しさん :2001/07/29(日) 22:09
powf()はMSよりボーランドが速いね。
239 :
デフォルトの名無しさん :2001/07/29(日) 22:34
240 :
デフォルトの名無しさん :2001/07/30(月) 02:26
フツー仕様は決まっても実装が決まっているものなんてないぞ。
241 :
デフォルトの名無しさん :2001/07/30(月) 02:32
>>240 そうは言っても、公開されているCの標準ライブラリの実装はほとんど
アルゴリズム集って言ってもいいくらい実装が同じだよね。
242 :
デフォルトの名無しさん :2001/07/30(月) 02:40
ちなみに、P.J.Plaugerの"The Standard C Library"は、 その名のとおり、C Standard Library内部の実装の解説本で、 K&Rと同じくらい有名な本。 読んでない人は読むべし本。
243 :
デフォルトの名無しさん :2001/07/30(月) 03:34
>>241 そりゃ元が同じだからじゃねーのか?
別に実装方法が決まってるわけじゃない。ま、的外れなだけで言いたいことは分かるが。
244 :
ななし :2001/07/30(月) 06:50
atoiってなんですか?
>244 A と I です。 引数を渡すと A と I の文字コードを足した数が返されます。 つーかネタであげんなや。まじで。
>>236 コプロに値を送るだけなので高速化しようがない
四則演算一回やるのと同じで、
値が決め打ちでもない限りアルゴリズムもへったくれもない
Ascii TO Integerさ。数字を数値に変換するのさ。
>>246 コプロってフツーpowは持ってなくない?
つか atoi みて思ったんだけど、 なんで itoa ってあるんだろ? 使うやつなんているの? 現役の人に聞きたいです。
250 :
デフォルトの名無しさん :2001/07/30(月) 12:01
>>249 sprintfよりitoaのが短いから(藁
251 :
デフォルトの名無しさん :2001/07/30(月) 12:08
>>240 元が同じだからじゃない。
Cの標準ライブラリはアルゴリズムとして定着しているからだよ。
252 :
251 :2001/07/30(月) 12:10
>>249 ベンダの独自関数だろ C99にはあるのか?
ANSI X3.159-1989 のCには少なくともそんな関数ないぞ?
えっと、他スレでも一度質問したんですが、 調べても結局わからなかったので・・・ ある、インタプリタ(後でコンパイラにする予定)を作っているんですが、 その言語にDLLをロードする関数をいれたいんです。 それで、その関数を使うために、 そのDLLの関数の引数、返される値の型情報を 動的に取り出すにはどうしたらいいんでしょう? どなたかわかる方いらっしゃいましたら、 どうかご教授おねがいします。m( _ _ )m
255 :
デフォルトの名無しさん :2001/07/30(月) 12:37
>>254 無理です。普通の DLL にはそもそもその情報が含まれていません。
>250 なるほど(w >253 なんだ、ANSIで定義されてなかったのか・・ atoiあるからてっきり。 おれが使ってんのはVC。 調べたらBCCもあった。 でもどちらにしろ意味ないね(w
257 :
254 :2001/07/30(月) 12:44
>255 ということは一つのDLLごとに そのDLLのための構造体などを処理系側で 用意しないといけないということですか?・・・
atokってなんですか?
>>257 DLLとかヘッダファイルを一緒に流通させるとか。
COMにすれば?
>>258 そうか!
atokの名前の意味に始めて気がついたよ
261 :
254 :2001/07/30(月) 13:21
>259 えっと、COMがよくわからないんですが、 DLLってCOMが必ず含まれているんですか? (なんか表現変ですね・・・)
じゃあ呼び名は「エー・トゥ・ケー」でいいんか? 昔「あとく」か「あとき」とかで口論した覚えがある(藁
そういや「えいとく」ってのもあったな。 Cと関係なくてスマソ
>>265 Ascii To 漢字 じゃないの?
マジレスと言いつつネタだったらすまんが
現在ではAdvanced Technology of Kana-kanji transgferてなアナグラムが 公式だけど、これは後付。元はAscii to Kanaと阿波徳島のダブルミーニング。
268 :
デフォルトの名無しさん :2001/07/30(月) 15:49
浮動小数点と固定小数点ってなにが違うんですか?精度とかも違うんでしょうか?
269 :
デフォルトの名無しさん :2001/07/30(月) 18:35
#include <stdio.h> int main(void) { printf("Hello World!\n"); return 0; } を実行したら・・・・ -------------------構成: ConHell - Win32 Debug-------------------- コンパイル中... コマンド ラインのエラー D2016 : コマンド ライン オプション '/ZI' と '/O1' は同時に指定できません cl.exe の実行エラー ブラウザ データベースを作成中... ConHell.exe - エラー 1、警告 0 が出て,実行でません! プロジェクトの設定を変えたりしているのですが、 よく分かりません。解決方法教えてください。 お願いします。
270 :
デフォルトの名無しさん :2001/07/30(月) 18:37
>>269 コンソールアプリケーションで作ったか?
271 :
あああ :2001/07/30(月) 18:56
C言語の関数(ソース付き)を集めたサイトってあります? 無かったら作ろうと思うんだけどどう思う?
>271 フリーで商用利用もおっけーな事を保証してくれるなら作ってくれ
フリーと謳いつつ他人のソースのパクリがあったりすると厄介だな
274 :
デフォルトの名無しさん :2001/07/30(月) 19:35
>>270 コンソールアプリケーションでつくりました。
1.新規作成のプロジェクトでWin32ConsoleApplicationを選択。
2.空のプロジェクトでリターン。
3.新規作成でC++ソースファイルにて、フェイル名を入力して。
です。
なにか、問題があるのですか? それとも、設定方法とか、よろしくお願いします。
>>269 何故エラーメッセージもヘルプも読まない?
>-------------------構成: ConHell - Win32 Debug--------------------
>コマンド ラインのエラー D2016 : コマンド ライン オプション '/ZI' と '/O1' は同時に指定できません
debugビルドなのに最適化オプションが指定されてるように見えるが。
276 :
あああ :2001/07/30(月) 20:12
法律的に難しかったりするんすか? 流石に会社のライブラリを公開しようとは思わないけどさ。 ニーズはあるでしょ?
277 :
デフォルトの名無しさん :2001/07/30(月) 20:51
>>271 ここに作ってくれよ。いいものならみんな協力してくれるぞ。
278 :
デフォルトの名無しさん :2001/07/30(月) 23:10
>>275 F1でエラーメッセージをみたんだけど・・・・
で、最適化オプションを無効とかにすると、下記のエラーメッセージがでるんです。
なにか、インストール時にしくじったのでしょうか? 「・・・・DLLは現在使用されています」とかいうので、無視してインストールしちゃったんですけど!
--------------------構成: ConHell - Win32 Debug--------------------
コンパイル中...
ConHello.cpp
リンク中...
LIBCD.lib(wincrt0.obj) : error LNK2001: 外部シンボル "_WinMain@16" は未解決です
Debug/ConHell.exe : fatal error LNK1120: 外部参照 1 が未解決です。
link.exe の実行エラー
ConHell.exe - エラー 2、警告 0
お願いします。
279 :
なんでやねん :2001/07/30(月) 23:15
>>278 >外部シンボル "_WinMain@16" は未解決です
ってコンソールアプリじゃないやん!
280 :
1 :2001/07/30(月) 23:19
281 :
デフォルトの名無しさん :2001/07/30(月) 23:19
>>278 "Win32"Consoleにしたからじゃない?
ソースを"MSDEVで開く"で開いて、そのままコンパイルしてみ。
282 :
デフォルトの名無しさん :2001/07/31(火) 00:24
>>270 さん、275さん、279さん、281さん他のみなさま、大変ご迷惑をおかけしまして
申し訳ありませんでした・・・・m(__)m
まじめに、"Win32"Console”でソースプログラムを作っておりました・・・・
全て、解決しました!
先ほど,VC++あんしん入門とC++デバック技術の本(計6699円)を購入してまいりました。
こんごは、上記なような、おろかな質問をしないよう、精進してまいりたいとおもいます。
今後とも、宜しくお願い申し上げます。 Mr.℃氏ロート
283 :
デフォルトの名無しさん :2001/07/31(火) 00:28
というか、その程度の物、コマンドラインでコンパイルすりゃいいじゃん。
いやだー、夏厨多すぎるー!
285 :
デフォルトの名無しさん :2001/07/31(火) 22:51
age
286 :
デフォルトの名無しさん :2001/07/31(火) 23:55
自作のルーチンなのに企業ベースにちょっと似てるから 告訴なんてされると嫌だな。
287 :
デフォルトの名無しさん :2001/08/01(水) 00:59
void lreplace( char *cp1, /*調べられる文字列*/ char *cp2, /*置き換えられる文字列*/ char *cp3, /*置き換える文字列*/ char *cp4) /*結果を格納する領域*/ { long n=strlen(cp1); long m=strlen(cp2); for(; n>=m; n--,*cp4++=*cp1++) { if(memcmp(cp1,cp2,m)==0) { strcpy(cp3,cp4); strcpy(cp4+strlen(cp3),cp3+m); } } } どこがまずい?
>>287 ぱっと見た限りだと *cp4++=*cp1++ の場所がまずそう
strcpy(cp3,cp4); strcpy(cp4+strlen(cp3),cp3+m); 何がしたいのか説明してくれ(;´Д`)
いや、やりたいことすら推理させ、かつ間違いを探す・・・ こういうゲームは大好きだな。
>>287 Cだとこういう無国籍かつ意味不明なコード
良く見るからやだね〜ったら、やだね〜
このくらいのレベルだとフローチャート書けってのもわかるなぁ
>>287 コメント等から予想できるコードと、実際のコード違いが、
あまりにも大き過ぎるので、何をやりたいか、全く把握できません。
取り敢えず、与える文字列(cp1,cp2,cp3)と、それに応じて、
変化する文字列(cp3,cp4)の結果の例をいくつか上げて下さい。
for(; n>=m; n--,*cp4++=*cp1++) { if(memcmp(cp1,cp2,m)==0) { strcpy(cp4,cp3); cp1 += m; /*strlen(cp2);*/ cp4 += strlen(cp3); } }
296 :
2chの夏、厨房の夏 :2001/08/01(水) 13:06
297 :
デフォルトの名無しさん :2001/08/01(水) 15:13
>>296 C FAQよんだけど「*cp4++=*cp1++ はヤバイ」の理由がわかりません。
解説お願いします。
299 :
デフォルトの名無しさん :2001/08/01(水) 15:17
>>297 逆に質問
なぜヤバくないと思うのかを教えて
300 :
デフォルトの名無しさん :2001/08/01(水) 15:24
>>299 >>296 のページに「*a++=*b++」って書き方がまずいって書いてあるんでしょ?
でも、自分はどこにそれが書いてあるのかわかりません。
どこが該当個所か教えてください。
>>299 演算順序気にしてるんだろ
つーか、それよりもそんなところにあってあふれねーか?
って方が気になるがな。
「*cp4++=*cp1++」に演算子の評価順序は関係ないっしょ。
>>296 は知ったかしてるだけ。
じゃあこのコードってマズイの? char *strcpy(char s1, const s2) { while( *s1++ = *s2++) ; return s2; }
>>303 間違えた
> char *strcpy(char s1, const s2)
char *strcpy(char *s1, const char *s2)
>>300 つーかコードの文字列そのものが資料に見当たらないってだけで
思考が止まってしまう野郎にプログラミングの資格なし。
つーか人工、自然言語問わず語学全般絶対無理。
おとなしくドカチンかライン工でもしてるのが吉。
>>305 ドカチンでもいいから、どこが該当個所か教えてよ。ねえ?
307 :
デフォルトの名無しさん :2001/08/01(水) 16:26
>>306 だーかーらー、a++=b++なんて書き方すると
処理の順序が直感的にわかりにくいだろ?
そんなバグの温床になるような書き方するなつってんだよ!ヴォケ!
>>307 結局、思わせぶりに持ち出したC FAQは、なんの関係も無かった
わけね。トホホ
310 :
デフォルトの名無しさん :2001/08/01(水) 16:44
>>307 結局わかりにくいってだけなの?
問題ないんだよね?
*a++ = *b++; ← これ。 好き嫌いはあるだろうけど、Cだとイデオムだと思う。 こういう書き方をヘタってのは言い過ぎだと思うよ。
313 :
デフォルトの名無しさん :2001/08/01(水) 17:10
(゚д゚)ハァ?
>>309 わかり易い=技術が低いとか思ってないか?
人をバカ呼ばわりするヒマあったらてめぇのソースに
コメントでも付けてろ、この腐れ厨房が。逝ってよし!
>>313 ほっときゃいーじゃん。これ以上いじめてもかわいそうだよ。
315 :
307=313 :2001/08/01(水) 17:13
高いね。
>>315 で、そこのリンク先には「わかりやすいプログラムを書こう」とは言っているが
「*a++ = *b++;はわかりにくい」とは言っていないね。
*a++ = *b++;はCでは慣用句であり、無理に書く必要はないが、
知っといた方がいい。
ちなみにMSのCRTのソースより memcpy while (count--) { *(char *)dst = *(char *)src; dst = (char *)dst + 1; src = (char *)src + 1; } これはvoid *で受けてるからか strcpy while( *cp++ = *src++ ) ; でした
わからない ってのと、わかるけどやらない ってのは
別物だぜ、
>>307
320 :
デフォルトの名無しさん :2001/08/01(水) 23:22
C99フルサポートした処理系って未だでないの?
321 :
デフォルトの名無しさん :2001/08/01(水) 23:47
↑クリック無用
今日はバカが一人紛れ込んでるのでクリックには注意して下さい。
>>295 試してないからミスってるかもしれんが、こんなところだろう。
void lreplace ( char *cp1, char *cp2, char *cp3, char *cp4 ) {
size_t l, m, n ;
n = strlen ( cp1 ) + 1 ;
m = strlen ( cp2 ) ;
l = strlen ( cp3 ) ;
if ( m ) {
for ( ; n > m ; n--, *cp4++ = *cp1++ ) {
if ( memcmp ( cp1, cp2, m ) == 0 ) {
memcpy ( cp4, cp3, l ) ;
n -= m ;
cp1 += m ;
cp4 += l ; } } }
memcpy ( cp4, cp1, n ) ; }
326 :
デフォルトの名無しさん :2001/08/02(木) 04:54
#include<stdio.h> main() { int a[3], s[3], i; int *pa, *ps; pa = a; ps = s; for(i = 0;i < 3;i++,pa++,ps++){ *(pa + i) = (i + 1) * 10; *ps = *pa; printf("%d,", *ps); } printf("%d", *ps); } こんなプログラムを作りました。 最後のprintfは配列の大きさを超えているのでおかしなプログラムと いうところまではいいのですが、これを実行すると 10、20、30、10と出てきます。 ポインタに代入する値をいろいろ変えてみたのですが、 必ず配列の最初と同じ値が出ます。 ただの偶然ですか?
327 :
326 :2001/08/02(木) 04:55
スマソ。 ×*(pa + i) = (i + 1) * 10; ○*pa = (i + 1) * 10; です。
a[3]とs[3]がスタック上にどう取られてるかによる s[0],s[1],s[2],a[0],a[1],a[2] になってるとすると最後の*ps=s[3]はa[0]の所を指してるだけ
>>325 偶然と言えば偶然だし、必然と言えば必然。
なんでそうなるのか知りたければ、
printf ( "\n%d %d %d %d\n", a, s, pa, ps ) ;
の1行を最後に追加すれば、その理由が見えてきます。
330 :
学生 :2001/08/02(木) 15:27
editに文字列吐かせたら\nじゃ改行しなかった。 調べたら\r\nだそうで・・・。Windowsだからこうなるんですよね?
331 :
デフォルトの名無しさん :2001/08/02(木) 17:32
>>330 APIスレの方がいいのでは?
Winだからそうなるんですけど。
>>287 こういうことをしたかったのか?
void lreplace(
const char *cp1, /*調べられる文字列*/
const char *cp2, /*検索する文字列*/
const char *cp3, /*置換する文字列*/
char *cp4) /*結果を格納する領域*/
{
long n=strlen(cp1);
long m=strlen(cp2);
long l=strlen(cp3);
while( n>=m ) {
if(memcmp(cp1,cp2,m)==0) {
memcpy(cp4,cp3,l);
cp4+=l;
cp1+=m;
n-=m;
} else {
*cp4++=*cp1++;
n--;
}
}
}
334 :
デフォルトの名無しさん :2001/08/02(木) 20:45
ハミング距離を求めるコードを書いているのですが うまい具合に記述することが出来ません。 どなたか綺麗に記述した例を示してくれませんか?
自己解決しました。
337 :
学生 :2001/08/03(金) 08:12
>>332 やっぱりWinだからですか。ありがとー。
ちなみに、ジョブスは何て答えるか興味があって
あえてここで聞いてみました。
338 :
デフォルトの名無しさん :2001/08/03(金) 18:04
void test(char str[]) { printf("test : %s\n", str); } なぜ str[] みたいな書き方がOKなんですか?
>>337 ジョブスうんぬん以前の問題だろ。そのくらい適当なプログラム
作って確かめられるだろーが。
341 :
デフォルトの名無しさん :2001/08/03(金) 21:32
質問させてもらいます。 下のコードのmain関数内でポインタ変数char* heapを確保して それをSetArray関数に渡してSetArray内でヒープ領域にメモリを確保したいのですが エラーがでました。 よく考えたらheapを渡す時点でheapが実態をどこも指してないのが理由という事に気づきました。 では、このような事がしたい時にはどうすればよいのでしょうか? 色々調べたら 「*&」 というものが関係ありそうなところまでは調べたのですが・・・・ よろしくお願いします。 main() {   char* heap;   SetArray(heap); } void SetArray(char* pointer) {   pointer = new char[128];   strcpy(pointer,"できるかな?"); }
342 :
デフォルトの名無しさん :2001/08/03(金) 21:51
ポインタのポインタ。 SetArray に「何が」渡されているのか考えてみよう。 main() { char* heap; SetArray(&heap); } void SetArray(char** pointer) { *pointer = new char[128]; strcpy(*pointer,"できるかな?"); }
void SetArray(char*&pointer) { pointer = new char[128]; strcpy(pointer,"できるかな?"); } main() { char* heap; SetArray(heap); } C++だったらこうも書ける。 つか文字列クラス使え。
むむむぅポインタのポインタですか・・・・・・ もう混乱してきましたがこれからよく考えて消化したいと思います。 ありがとうございました。
>>343 さん
それです。私が調べているうちに発見したのは。
これまた混乱してきましたが併せて消化させてもらいたいと思います。
またまたありがとうございました。
346 :
デフォルトの名無しさん :2001/08/03(金) 22:53
バグのもとだから絶対やめとけよ.
347 :
デフォルトの名無しさん :2001/08/04(土) 04:37
すみません Cで1京の階乗(10,000,000,000,000,000!)の概算をしたいのですが 高速に計算する方法がみつからなくて詰まっています。 精度は 6 桁 で ?.???e?? 形式で出力したいです。 30万! 程度までは求められたのですが、ループしていたのでは 焼け石に水のようです。どうか宜しくご教示お願いいたします。
>>347 近似値でいいなら「スターリングの公式」で検索してみな。
349 :
347 :2001/08/04(土) 04:55
>>348 ありがとうございます。
数学は弱いので理解できるか不安ですが
がんばってみます。
解けました!
351 :
デフォルトの名無しさん :2001/08/04(土) 08:48
ベンチマークでは?
宿題じゃねーのか?
354 :
デフォルトの名無しさん :2001/08/04(土) 12:50
夏休み?
355 :
デフォルトの名無しさん :2001/08/04(土) 13:58
構造体のアライメントの隙間にデータを格納する 方法を教えてください。
357 :
355 :2001/08/04(土) 14:58
358 :
デフォルトの名無しさん :2001/08/04(土) 15:04
>>357 コンパイラのマニュアルを読んで、構造体の隙間を詰める
オプションが無いか調べてください。
>>355 使ってるコンパイラのコンパイルオプションにアライメント指定オプションがないか、
調べれ
#pragmaプリプロセッサ命令も調べてみれ
>>355 つーか、隙間が出来ないように宣言に工夫しろ。
361 :
デフォルトの名無しさん :2001/08/04(土) 17:43
363 :
デフォルトの名無しさん :2001/08/04(土) 17:52
>>361 ワード境界に気を配って、char,int,charなんて並べないようにするとか。
あと、最近のコンパイラは賢くてかってに並び替えるから心配するな。
364 :
361 :2001/08/04(土) 17:52
>あと、最近のコンパイラは賢くてかってに並び替えるから心配するな。 メジャーなコンパイラは並べ替えなんてやってないよ。
366 :
デフォルトの名無しさん :2001/08/04(土) 18:54
>>365 そう?
まあそうしたら自分で気をつけるんだね。
368 :
デフォルトの名無しさん :2001/08/04(土) 21:40
フォルダのファイル一覧、テキスト化したいので 簡単に取得する方法教えてくださいな。
369 :
デフォルトの名無しさん :2001/08/04(土) 21:41
ls > tmp.txt
>>368 system("command.com dir > dir.txt")
372 :
デフォルトの名無しさん :2001/08/04(土) 21:43
言われればごもっとも。
373 :
デフォルトの名無しさん :2001/08/04(土) 21:44
でもリダイレクトか。卑怯だね。 Perlのglobみたいなん無いの?
>>373 卑怯でも何でも、いちばん簡単で確実な手法を取るのは当然のこと。
これが確実じゃない環境(シェルがないとか)なら別の方法を考えるが。
>>373 シェルスクリプトじゃ常套句だけど。
for i in `ls`;do
echo $i
done
378 :
デフォルトの名無しさん :2001/08/05(日) 14:32
if(a == 3 || ++b == 10) 見たいな場合に、もしa == 3だったら++b == 10の判定はおこなわれないので しょうか?
379 :
デフォルトの名無しさん :2001/08/05(日) 14:43
380 :
379 :2001/08/05(日) 15:11
381 :
デフォルトの名無しさん :2001/08/05(日) 15:11
382 :
デフォルトの名無しさん :2001/08/05(日) 15:22
383 :
デフォルトの名無しさん :2001/08/05(日) 16:24
384 :
デフォルトの名無しさん :2001/08/05(日) 16:43
>>380 おこなってほしい人はパスカルをつかいましょう。
DelphiやKylixをどうぞ。
385 :
デフォルトの名無しさん :2001/08/05(日) 17:27
>>384 なんでそーなる。ちょっと書き方を変えればすむ話じゃないか
ていうか条件判断式に副作用のある演算子を書くやつを俺は信用しない。 そんなやつは何使わせても一緒だ。
387 :
デフォルトの名無しさん :2001/08/05(日) 17:43
>>386 問題提起として書いただけでは。本人だってどうなるかわからんから
一応聞いてみただけだろ。そんなことも考えないやつだって
いるし、そういう奴の方が問題だよ。
388 :
デフォルトの名無しさん :2001/08/05(日) 23:53
関数の引数はいくつぐらいまでなら許されるのでしょうか? 1つの関数の引数を減らすためだけに構造体を使うのもどうかと思うので。
>388 特にこれといった数はないので必要なら好きなだけ渡せばいい。 ただ、それらの引数郡(の一部)が 頻繁に他の関数にも渡されているなら再考の余地あり。 その場合は構造体にして渡すか 初期化関数などで一度だけ渡すようにする。
390 :
デフォルトの名無しさん :2001/08/06(月) 02:10
絵を表示したいんだけど、やはりWindowsプログラミングの知識が必要 ですか?Windows使ってるんで。 2重振り子の様子みたいなのを書いてみたいんだけど、数値だけ計算して もつまらないので。 LinuxってやつのGUIの方が楽なんでしょうか。
391 :
デフォルトの名無しさん :2001/08/06(月) 02:13
>>390 C言語でやりたいというならどっちでも同じ。
393 :
デフォルトの名無しさん :2001/08/06(月) 09:03
今後のことも考えるならGLとか。
395 :
デフォルトの名無しさん :2001/08/06(月) 09:44
396 :
デフォルトの名無しさん :2001/08/06(月) 09:48
397 :
デフォルトの名無しさん :2001/08/06(月) 10:34
>>390 それならjavascriptがお勧めっす。
398 :
デフォルトの名無しさん :2001/08/06(月) 10:46
399 :
デフォルトの名無しさん :2001/08/06(月) 11:14
400 :
398 :2001/08/06(月) 11:15
先が無いからでしょう
402 :
デフォルトの名無しさん :2001/08/06(月) 13:40
>>402 まだ企業によっては潰しが効く。
面接で HSP 使えマース。なんていったらただのアホでしょ。
404 :
デフォルトの名無しさん :2001/08/06(月) 15:20
C言語で(C++でのお話も聞きたいけど)、<< や >> 演算子に対して、 扱おうとする整数型のビット数以上のビットシフトをやらせようと したときの結果は処理系とか環境に依存しますか?
405 :
デフォルトの名無しさん :2001/08/06(月) 15:44
406 :
デフォルトの名無しさん :2001/08/06(月) 15:54
その状況を見てその中身を数値として 書き換えるべくファイルに戻したいと 言う時 (たとえば 1 2 3 4 A=[ 5 6 7 8 ] 9 10 11 12 と言うような3行4列の行列) はどんな命令(fget? fput?) を使えばいいのでしょうか? ファイルの行列の記述の仕方も含めてお教え下さい。
>>404 不貞。
やだ!奥様がそんなことなさるお方とは思いませんでしたわ!
見損ないましてよ!
>>406 まず適切に質問をする能力を身に付けてくれ。
>その状況を見てその中身を
「その」って何だ?
「下のようなm行n列の行列をファイルに
読み書きするとしたらどうすれば良いか?
1 2 3 4
4 5 6 7
9 10 11 12
」
ということか?
409 :
デフォルトの名無しさん :2001/08/06(月) 16:33
410 :
406 :2001/08/06(月) 16:35
>>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);
激しく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);
>>411 s/&bnsp;/ /g
あと、書換えることを考えると、最大桁数が8桁と仮定すると
> fprintf(fp, "%d ", a[i][j]);
fprintf(fp, "%8d ", a[i][j]);
とかの方がいいかもしれない
414 :
406 :2001/08/06(月) 16:47
うむ、ごくろうであった。
>>413 どうも。読み込みの方はよろしく。
fscanf 版と strtok 版で(笑
417 :
デフォルトの名無しさん :2001/08/06(月) 17:02
>>409 すくなくとも VC++ では
int a() { return 0x12345678; }
int b() { return 32; }
int main(int argc, char* argv[]){
printf("%d %X %X\n", sizeof(int), a() << b(), a() >> b());
return 0;
}
とやると
4 12345678 12345678
と表示する。
418 :
406 :2001/08/06(月) 17:04
うむ、よきにはからえ。
>>400 いやぁ、前にちょっとHSPのスレを煽って見たんだけど
他の言語と違って確実に厨な反応をするんだよね。
どうでもいいのでsage
>>417 gcc (cygwin) と bcc32 でも同じだった。
64bit OS だと違ったりするかね。
>>409 あら、あたくしK&R両先生の御教えにすがることしかできない
か弱いお厨の女ですのに…そんな言い方…、酷い…。
どうぞ K&R2nd(共立出版.邦訳) p253をごらんになって
くださいまし……
>>412 俺、持ってない。かいつまんで教えてくれるとすごい幸せ。
あ、422は
>>421 に対するレスね
さっき首つろうとして失敗したからだな、多分
424 :
:2001/08/06(月) 18:30
何処で質問していいかわからないのでここで質問させてもらいます。 PC,デジタル時計。。。問わず、1秒ってどのようにカウントしてるんですか? ある一定の条件下である一定の処理を規定回数実行したら1秒なんでしょうか?
>>424 sleep(1); とか。
精度はどのくらいほしいんだい?
>sleep(1); とか。 例えばそのsleep(1)で呼び出しても、まさか人間みたく感覚で時間を カウントして実行結果を返すわけじゃないですよね? その実際に時間を生成する仕組みが知りたいんです。
>>426 そりゃーあんた、おおもとを辿れば、時計見てるんだよ。
マザーボードに小型のGショックが内蔵されてるのかと思った
431 :
デフォルトの名無しさん :2001/08/06(月) 18:49
その水晶発振体は時計を見て振動している。
>>422 =423
上掲書 p253 A7.8 シフト演算子 の項に
>右演算数が負であったり、左側の式の型のビット長より大きいか等しい場合、
>結果は不定となる。
とあるのですわ。
>>432 ありがと。
>右演算数が負であったり
ここの部分は右ビットシフト、左ビットシフト関係なくなのかな?
ずっと(int)-4 >> 1 は(int)-2だと思ってたけどそうじゃない
ってこともあるのかな。
>>433 うむ。 2147483646 になる処理系があっても悪くはない。
…俺は見たこと無いけど。
Javaだと >> << は算術シフトと決まってるみたいだね。
>>433 揚げ足とりみたいになって恐縮なのですけれど…
>右演算数が負
というのは x >> -1 と書いても
それが x << 1 と処理される保証はない、ということを
仰りたいのだと思いますわ。
符号付整数(で、その値が負であるとき)の右シフトの結果については、
>>結果は処理系に依存する
と、書いておられますわ。
>>435 ありがと。あ、右ってそういうことね。わかった。
437 :
デフォルトの名無しさん :2001/08/08(水) 19:14
とある関数内の変数宣言で static int a,b,c だと変な動作になるのに、 使わない変数dを加えて static int a,b,c,d で宣言するとちゃんと動くようになりました。 dは一度も使わない変数です。 何度もd入れたり消したりしてみたんで これがエラーが消える原因には間違いないです。 これってどういうことでしょう? ド素人厨房なんで意味わからない質問でスマソ
>>437 その関数のソースを書いてくれないとどうにもならん。
440 :
( ゚Д゚)ウボァー! :2001/08/08(水) 22:59
441 :
デフォルトの名無しさん :2001/08/08(水) 23:18
442 :
437 :2001/08/08(水) 23:22
>>442 メモリを破壊しないように注意するんだよ。
ポインタがvalidなとこを指しているかどうかだけ気をつけりゃいーんだよ。
444 :
437 :2001/08/08(水) 23:32
valid=有効 和英引け 443は正確な意味をわからずに,この単語を使っていると思われ
446 :
437 :2001/08/08(水) 23:44
和英にゃ載ってらんだろ。 445は正確な意味をわからずに,この単語を使っていると思われ
しまった
449 :
デフォルトの名無しさん :2001/08/09(木) 02:13
読みこんだファイルが何バイトか知りたい ときってひとつずつ数えていかなきゃダメ?
450 :
デフォルトの名無しさん :2001/08/09(木) 02:18
カンマと改行区切りの文字列を渡すと、 みためにきれいになるように(カンマの位置がすべてそろうように) 整形する関数をつくれば良いのではないでしょーか。 "c,c++,java\nbasic,pascal,ruby\ncobol,fortran,perl\n" このまま表示すると c,c++,java basic,pascal,ruby cobol,fortran,perl となる。これを整形関数に通すと "c____,c++____,java\nbasic,pascal_,ruby\ncobol,fortran,perl\n" となる。(_は空白文字) c____,c++____,java basic,pascal_,ruby cobol,fortran,perl こんな関数作って〜〜
文字列を整形するの? 整形した文字列を出力するの?
>>450 まず最初に文字列を走査して、
各列(カンマ区切り)の最長単語長を見つける。
一文字ずつ見ていって , が出るまでカウントを増やせば良い。
例えば、
a[0] = 5 // cobol = 5
a[1] = 7 // fortran = 7
a[2] = 4 // perl = 4
次に、また文字列を走査、同じように一文字ずつ見ていく。
また単語の長さをカウントしておく。
次の文字が区切り文字だったら、
その列の最長単語長-現在の単語長分だけ空白を入れる。
453 :
デフォルトの名無しさん :2001/08/09(木) 02:38
a[0] ←最初、単語の数は分かっていないのでは。
>>453 仕様として決め打ち、あるいは3パス(笑
>>449 fseek でファイルの最後に飛んで、それから ftell を呼べば
良いと思う
>>449 UNIX系だったら man stat すれ。
>>449 「読みこんだファイルが何バイトか知りたい 」
読み込み済みのファイルだったら、サイズは自明だと思うが…
458 :
デフォルトの名無しさん :2001/08/09(木) 03:20
>>452 -454
最初は、各行の1番目の単語について最長単語長を調べる。
つぎに、各行の2 〃
配列を確保する必要は全く無い。
459 :
デフォルトの名無しさん :2001/08/09(木) 05:58
makeモドキを作ろうとしています。 そこで、ファイルの時間を取得して、 比較するにはどうすればいいんでしょう? 取得はとりあえずstat/fstatでするとして、 比較の方法がわかりません
460 :
459 :2001/08/09(木) 06:04
time_t型の比較の方法がわかればいいんですが。 typedef long time_t; となってるので、そのままlong値で比較して良いものでしょうか?
461 :
デフォルトの名無しさん :2001/08/09(木) 07:34
>>460 平林雅英著 新ANSI C言語辞典によると、
普通に比較演算子で比較してもいいらしい。
462 :
デフォルトの名無しさん :2001/08/09(木) 08:05
>>457 え?どうすりゃいいの?
たとえば、今から「aborn」っていうファイルが何バイト
か知りたいゼ!っていうときは。
厨房でスマソ
>>462 それは「読み込んだファイル」とは言わないだろ。
465 :
:2001/08/09(木) 12:00
C言語を勉強中の後輩にヤル気が起きないので困っています。(;´Д`)
Cを勉強中の後輩(男)に犯る気が起きて困っています。(;´Д`)
467 :
デフォルトの名無しさん :2001/08/09(木) 15:07
しつもんします ------------------- char age[10]; char sage; scanf("%s", age); scanf("%c", &sage); -------------------- ってやると2回目のscanfが実行されてないような気がするのですが… ひょっとして1回目のscanfでリターンすると%cでそれを入れてしまうのでしょうか?
468 :
デフォルトの名無しさん :2001/08/09(木) 15:14
>>467 その通りです。
char linebuff[1024];
char age[10];
char sage;
fgets(linebuff, sizeof(linebuff), stdin);
sscanf("%s", age);
fgets(linebuff, sizeof(linebuff), stdin);
sscanf("%c", &sage);
のほうが安全。
469 :
468 :2001/08/09(木) 15:15
sscanf のところをミスった。 sscanf(linebuff, "%s", age); ね。
470 :
460 :2001/08/09(木) 22:05
ありがとうございます。 うまくいきました。
471 :
デフォルトの名無しさん :2001/08/09(木) 22:22
非国民がー。
472 :
462 :2001/08/09(木) 22:27
ファイル操作が苦手です。 タスケテー
何を?どうやって?
476 :
デフォルトの名無しさん :2001/08/09(木) 23:00
MFCによくみられるんですが、クラスの関数の中で TYPE& GetHead(); TYPE GetHead() const; こんな感じのものがあります。この場合、呼び出されるのは どちらになるんでしょうか?GetHead()って呼び出しても どっちが呼び出されるかどのように判断できるんでしょうか?
いまいち動きが頭の中で理解しにくいというか・・・ 似たような関数がけっこうありますし。
>>477 似たようなやつなんか使うな。
分かるようになるまでは使う関数は統一しろ。
身にならない知識を振り回す前にまず足場を固めろ。
御意。
480 :
マジレスさん :2001/08/09(木) 23:17
C言語の「C」ってなんの略なの?
484 :
デフォルトの名無しさん :2001/08/10(金) 02:30
age
481じゃないけど BCPL->B->C
486 :
デフォルトの名無しさん :2001/08/10(金) 03:34
ドレミファドンのド(C)>480
488 :
C# :2001/08/10(金) 08:15
>>476 例えば
CList::GetHead
const リストの場合は、GetHead 関数はリストの先頭要素のコピーを返します。このとき、この関数を代入ステートメントの右辺にしか使えないので、リストは変更されません。
const 以外のリストの場合は、GetHead 関数はリスト要素への参照を返します。このとき、この関数を代入ステートメントの左辺、右辺の両方に使えるので、リストのエントリを変更できます。
です。constか否かで区別。
489 :
C :2001/08/10(金) 11:50
void hoge(const int a);この2つはどうちがいますか。 void hoge(int conat a); void hoge(const int *a);この2つはどうちがいますか。 void hoge(int const *a);
490 :
デフォルトの名無しさん :2001/08/10(金) 11:59
>>489 void hoge(const int *a);
void hoge(int const *a);
これは同じです。int * const aとすれば違いますが。
void hoge(const int a);
void hoge(int conat a);
これはconatがなにかわからないのでなんとも言えません。
491 :
デフォルトの名無しさん :2001/08/11(土) 15:34
include<stdio.h> int main(void) { int i,c; int cnt[10] = {0}; while(1){ c = getchar(); if(c==EOF)break; if(c => '0' && c <='9') cnt[10 - '0']++; } puts("数字の出現回数"); for(i = 0;i<10;i++) printf("%d %d",i,cnt[i]); return 0; } 上のif(c => '0' && c <='9')で構文エラーって言われちゃうんだけど どこがだめなの?後、'0'と0と"0"は意味が違うの? 教えてください。
>>491 main()
{
int aa = 0;
char bb = '0';
char cc[]= "0";
printf("%d,%c,%s", aa, bb, cc);
}
=>なんてーのはねーよ。>=だろ。 '0'は文字、0は0、"0"は'0'と'\0'の2文字。 体で教えてやろーか?
00H 30H 30H,00H
a- intだと0は00H,00H,00H,00H
496 :
デフォルトの名無しさん :2001/08/11(土) 17:30
ある文字列に別の文字列が含まれているかを調べるには どうすればいいのでしょうか。 if( $str =~ /abc/ ) こんな感じのことをCでやりたいのですが。
497 :
デフォルトの名無しさん :2001/08/11(土) 17:32
>>496 man strstr
正規表現までは出来ないよ
498 :
デフォルトの名無しさん :2001/08/11(土) 17:33
勉強したいので、ソースの美しさで定評のある ソースの入手可能なプロジェクトがあれば教えてください。
499 :
デフォルトの名無しさん :2001/08/11(土) 17:38
あーここCスレか
>>498 美しいがどうかは知らんが、
gtk や libpng なんかは読みやすいよ。
503 :
491 :2001/08/11(土) 21:09
ども、ありがとうございます。助かりました。 このプログラムは、数字として数えてるのではなくて、文字として カウントしているってことでいいですか。
504 :
デフォルトの名無しさん :2001/08/11(土) 22:25
いや、全然バグってるよ。 宿題?正直に自分が何でどういうプログラムか教えてくれたら教えてあげる:-)
>>504 >正直に自分が何でどういうプログラムか教えてくれたら教えてあげる
…あんたの文章もバグってるぞ…(藁
アリャ、バグは言い過ぎた。 俺が意味を読み取れなかっただだけだな、ゴメソ。
>>507 コンパイルが通ってもバグがあったりするように、
文法は正しくても意味は通じなかったりするのだよ。
言語学板にでも行ってみれ。
511 :
デフォルトの名無しさん :2001/08/12(日) 02:49
512 :
デフォルトの名無しさん :2001/08/13(月) 01:10
Cを勉強している厨房です。大変厨房な質問で申し訳ないですが 質問させてください。 構造体のメンバ変数をポインタで参照するとき たとえばアロー演算子で pms->data1 のようにすると思うのですが なぜ 間接演算子の *pms->data1 のようにしてはいけないのでしょうか? ポインタがまだわかってないのでしょうが、疑問に思っています。 よろしくお願い致します。
pms->data1と (*pms).data1はおんなじ
data1の型が不明だが、 (*pms).data1でできるぞ。 *pms->data1は*(pms->data1)と同等。
->は(*).の簡略表記だね
516 :
デフォルトの名無しさん :2001/08/13(月) 01:15
すばやいレス本当にありがとうございます。
あ なるほど。そうゆうことなのですね。
簡略表記。なるほど、それだと納得できます。
本当にありがとうございました
>>514 -515
517 :
516 :2001/08/13(月) 01:16
>>513 -515さんに訂正です。ありがとうございました。
2Chってレスが速くてすばらしい。感動しました。
518 :
デフォルトの名無しさん :2001/08/13(月) 06:45
きれいなプログラムってどんなやつをいうんでしょうか? やっぱり、誰が見てもわかりやすいとかそんな感じなんでしょうが、 実際よくわかりません。 学生の時、研究で使うソフトがどうしても動かず、 プログラマの友達に見てもらったとき一言「コードが汚い」 自分ではわかりやすく書いてたつもりだったんですが・・・。 どなたか教えていただけませんか? 参考までに汚いといわれたのはVBです。現在はC++の勉強中です。
519 :
デフォルトの名無しさん :2001/08/13(月) 06:49
>>518 見やすい、ではなく分かりやすい。
バグが無い、ではなくバグを直しやすい。
そういうプログラムです。
<<512 ->と(*).の問題というより、 演算子結合強度について説明する方が親切だと思うのだが、どうか。
521 :
デフォルトの名無しさん :2001/08/13(月) 10:10
>>520 演算子の結合順位と、右・左結合はCをやる上での基本事項にもかかわらず
明快に解説した良書が少ないので「難しい」範疇に入っていると思われ。
そこまで解説しなくても、つまずいてるところだけをさくっと答えているので
よいのでは?
522 :
デフォルトの名無しさん :2001/08/13(月) 11:32
右・左結合ってなんですか?
523 :
デフォルトの名無しさん :2001/08/13(月) 12:43
>>522 同じ優先順位の演算子が複数並んでいるときに、
どういう順序で結合するかっていうこと。
例えば、後置演算子は左から右に結合するから、
a[0]++ は (a[0])++ と同じになる。
524 :
522 :2001/08/13(月) 13:00
>>523 さん
解説ありがとうございました。
ポインタの間接演算子*が絡んでくると、わけがわからなくなってしまい
これでもか!ってカッコでくくってます(^_^;)
そのようなことも勉強しないといけませんね。
ありがとうございました。
substr() のような関数はCではどうやるの?
526 :
デフォルトの名無しさん :2001/08/13(月) 15:01
動作確認してないけど void substr(const char* s, unsigned int offset, unsigned int length, char* res) { if( offset >= strlen(s) ) { *res = '\0'; return; } s += offset; while( *s != '\0' && length-- > 0 ) { res++ = s++; } *res = '\0'; }
>>526 res++ = s++;
に * がついてないが?
529 :
:2001/08/13(月) 21:43
トリップ計算機のソースきぼーん
530 :
デフォルトの名無しさん :2001/08/13(月) 21:50
>>529 こんなの?
d.HH = a.HH -b.HH; /* -23〜+23*/
d.MM = a.MM -b.MM; /* -59〜 59*/
d.SS = a.SS -b.SS; /* -59〜 59*/
if( 0 > d.SS ){ d.SS = d.SS+60; d.MM = d.MM -1; };
if( 0 > d.MM ){ d.MM = d.MM+60; d.HH = d.HH -1; };
if( 0 > d.HH ){ d.HH = d.HH+24; d.DD = d.DD -1; };
532 :
デフォルトの名無しさん :2001/08/13(月) 23:11
Torojan house.
534 :
デフォルトの名無しさん :2001/08/14(火) 15:29
ボーリングでのブービー点を出力。 -1で終了 これを、コーディングしてください。
>>534 printf("%d人中%d位 SCORE=%d\n", member_cnt, menber_cnt - 1, sorted_score[menber_cnt - 2]);
536 :
>< :2001/08/14(火) 21:48
ハイル・マイスター。C厨のわたくしにご教示ください。 fputc()を使ってファイルに出力するとき ファイルの終わりに^@が入ってしまいます。 この現象はなぜ起こるのですか。 またどうすれば^@なしにきれいに書き込めるのでしょうか。
537 :
デフォルトの名無しさん :2001/08/14(火) 22:22
^@つーのは文字劣の欠の\0が出てるんだよ。(笑
538 :
デフォルトの名無しさん :2001/08/14(火) 22:57
かわいいな、これ。 そのうち、CP/Mなんですけど最後に0x1aがついてきますタスケテ とかってやつが来るのか?
539 :
>< :2001/08/15(水) 22:34
>>537 >>538 //////赤面しております。ご教示ありがとうございます。
バッファに文字列を詰め込む場合と違ってファイル(ストリーム)に出力する場合は欠に'\0'を詰めなくてよいのですね。いちいちやってゐました(/////恥
540 :
:2001/08/17(金) 21:25
ファイルで分割して、コンパイルしたいと思います。 すべてのファイルで同じ構造体を使用しますが、 ファイル1つ1つに長ったらしい構造体宣言を しなければならないのですか。 extern struct hoge{…}; などと宣言しなければならないのですか?
542 :
名無しさんだよもん :2001/08/17(金) 21:49
typedefはもっともなんだが >extern struct hoge{…}; を見ると ヘッダに書いてインクルードするって方法を知らないと思われるんだが…
544 :
:2001/08/17(金) 22:08
厨房ですいません。 つまり・・・ --- myheader.h --- typedef struct{...} Foo; typedef struct{...] Hoge; --- EOF --- というヘッダファイルをつくって、 すべてのファイルに #include "myheader.h" とインクルードすればいいのですか?
>>544 それでいいよ。
念のために書いておくけど
すべてのファイルにインクルードというのは
正確には その構造体を使うすべてのファイルのことだね。
まあ、わかってると思うけど一応。
546 :
540,544 :2001/08/17(金) 22:19
?? typedefは関係無くないか?
548 :
初心者 :2001/08/18(土) 10:09
こんにちは。 char 配列変数 str[x] の中が空かどうかを判定する場合、 1. if ( strlen( str ) == 0 ) { 2. if ( strcmp( str, "" ) == 0 ) { のどちらが一般的でしょうか。
549 :
デフォルトの名無しさん :2001/08/18(土) 10:18
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; }
四則演算をする関数を作りたくて
>>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;
}
>>551 夏休みの課題ですか?
頑張っていると思います。
save先をスタックにし、プログラム構造を
テーブル駆動式にすれば再帰を使わなくても良いのですが
手間は増えますし、とりあえずそこは今のままで先に進むと
いいでしょう
554 :
デフォルトの名無しさん :2001/08/19(日) 19:22
あげ
>>552 ポインタ引数の重さなんて8bit環境ですら屁みたいなもんだよ。
構造体実体引数ならドキュだが。
再帰を使ってCプログラム自体で演算を実行するか、
VirtualMachineを作るか、のどっちかだろうけど、
子息演算(家族計画の一種か?)くらいならVM作るのはヤリスギ。
556 :
デフォルトの名無しさん :2001/08/19(日) 23:49
K&Rを読み終わった程度なんだけど、なにか画面で動かしたい。 でもコマンドラインのしかやったことないし、VCは触ったことないのでサパーソワカラン。 手っ取り早く画面に自由にナニカを表示して動かしたいわけですが、良い方法、参考 になるWEBサイトはありませんか?
>556 Javaへようこそ
>559 いやっぷー(・ε・)
562 :
デフォルトの名無しさん :2001/08/20(月) 00:44
556です。
>>557 Windows2000SP2にVisual C++6.0、で遊んでいますがこれだけじゃ
不十分ですか?
Javaもゆくゆくはかじってみたいと思ってますし、この目的の
ためにはいいらしいですね。運動方程式を数値的に解いた、運動
の様子を見たいのですが、とりあえずCでできるならCでやってみ
ようと思い聞いてみました。
>>562 本気でやりたいなら Win32 API 勉強すれば? 窓を開いて GDI 関数
で絵を書くだけなら、それほど道のりは遠くないぞ。とりあえず書店に
行って Petzold の「プログラミング Windows」という本を読んでみて、
自分の手に負えるかどうか判断して下さい。
566 :
デフォルトの名無しさん :2001/08/20(月) 01:50
手軽にグラフィックやりたいならVCよりC++BuilderかJavaの方が楽 まぁVCでも1度作ってしまえばあとの手間は変わらんけどね C#もよこせって言えば?
>>567 しっかり改訂されてるから問題ないぞ。Win32 API プログラミングと
いったら、こいつがバイブルだと思うんだが、他にお勧めある?
C++BuilderってボーランドのVC++みたいなやつですよね? MSの開発環境よりいいものなんでしょうか。 友達が昔、VBのC版だ、みたいに言っていましたけど。 MSDNのVCのサンプルみてもワケわかんないッス。 でも、みなさんもやっぱり大変だったんですよね最初は。
>>570 コンソールアプリだと、プログラムのロジックが OS にサービスを要求
するわけだが、Win32 だと OS からユーザの登録した関数が呼び出され
る形になるので、パラダイムが全然違うんだよね。
最初は戸惑うと思うが、処理の流れと代表的なコントロール・メッセー
ジを一通り押さえれば見通しが利くようになるよ。
あと、Win32 API の知識と処理の流れに関する大まかな知識は必須で、
いくつか API のみでプログラムを書いて勉強することを勧めるけど、
実際のプログラムを組む段階になったら適当なクラスライブラリを使っ
た方が良い。
正直、素の API だけでプログラミングするのは辛いので。
572 :
デフォルトの名無しさん :2001/08/20(月) 12:16
くだらない質問ですけどswitch文でcaseやdefaultは字下げしますか? Developer Studioでは字下げされないのですが、 本によってはcaseなどの部分が字下げされているものもあります。 どちらの方が美しく正しい記述なのでしょうか?
573 :
デフォルトの名無しさん :2001/08/20(月) 12:40
>>572 これは完全に俺のシュミなんだけど、
基本は字下げ4文字で、case文は2文字字下げにしてる。
こうするとcaseは出っ張って、カッコは他のと同じ下げになる。
正式なのはしらん。会社で文句いわれたことも無い。
>>572 > どちらの方が美しく正しい記述なのでしょうか?
自分で美しいと思った方を使え
ちなみに俺はcaseの字下げはしない方が美しいと思う。
576 :
デフォルトの名無しさん :2001/08/20(月) 16:30
C言語で、変数と文字列の比較ってどうやるのですか? 今まではBASICで if x = "文字列" then... みたいにやっていたのですが、初めてC言語でプログラムを作っているのですが if文だと文字列比較ができないみたいなので。
if (strcmp(x , "文字列" )==0 ){ ... } とやりますが、無理にこのやりかたに慣れるより C++でやった方がいいですよ
ネタにマジレスかこわるい。
579 :
デフォルトの名無しさん :2001/08/20(月) 16:38
BASICで文字列変数って $をつけなくてもいいの? 気のせい?まあBASICなんていろいろあるからね。
580 :
576 :2001/08/20(月) 16:41
>>577 ありがとうございます。strcmpという関数はしりませんでした。
でも、無理に・・・って事は、C++だともっと上手いやり方があるのですか?
>>578 ねたではありません。C言語は二日前に始めたばかりなのです。
今まではBASICでやっていました。
>>580 >C++だともっと上手いやり方があるのですか
VBと同じように比較したり 加算したり出来ますよ
>>580 string x = "文字";
string y = "列";
string z = x + y;
if( z == "文字列" ) {
...
}
しかし、 if ("文字列" == z) { つーのはできんのだな、これが。
584 :
デフォルトの名無しさん :2001/08/21(火) 09:37
((*(int *)PORT_B) = (*(int *)PORT_B) & 0xFFEF)
585 :
デフォルトの名無しさん :2001/08/21(火) 23:19
Cで長い間プログラム書いてきている方は、みんな自分のライブラリとか 持っているんですか? たとえば他の言語だとすぐHashが使えるけど、Cではなんとかして Hashのコードを用意しなければ逝けないとか、、、その辺どうしてますか?
>>585 職業プログラマでもないかぎり持ってないと思うよ。
どっかから拾ってきて使う。
>>585 Glibなんかどうよ?
オプソアレルギーなドキュ(個人にせよ職場にせよ)には使えぬが。
職業プログラマだっていちいち「毎回」作りたくないよ。
毎回ってのは、ソース「全部」のライセンスを寄越すという契約を
客と交わしている場合、自分で溜めこんだ奴を事実上使えないので。
ま、デュアルライセンスだということにするとか、
「予め」オプソライセンスで自分の名義で公開しとく
(これは誰が言った作戦だったかな)とか、手は有るが。
589 :
ななしんぐ :2001/08/22(水) 01:26
C初心者なんですけど 以下のプログラムでオラクルのDBに繋ごうと思ってるんですけど なかなかうまくいきません。 何か間違ってる部分とか、インクルードされてるファイルで何が 起こってる事が予想されるか誰か教えてください #include <sys/types.h> #include <sys/stat.h> #include <dirent.h> #include <sqlcpr.h> /* オラクルライブラリ */ #include <sqlca.h> /* オラクルライブラリ */ #include <sqlda.h> /* オラクルライブラリ */ #include <stdio.h> #include <string.h> int CountOfData; /* データ数 */ int main( ) { FILE *fp; int ii, chk ; /* DB接続 */ chk = CMNconnectDB( cCMN_DB_USER, cCMN_DB_PASSWORD, 0, &result ); if( chk != cCMN_OK ) { /* 接続エラー */ sprintf ( gMBuf, cCMNCONERR, cMYNAME, chk ); CMNsetMessage ( cCMN_MAINTENANCE_MSG, gMBuf ); exit(-1); } EXEC SQL BEGIN DECLARE SECTION; int CountOfData; /* データ数 */ EXEC SQL END DECLARE SECTION; EXEC SQL SELECT COUNT(*) INTO :CountOfData FROM CMN_TD_CRE ; if( sqlca.sqlcode != 0 ) { /* データベース参照失敗 */ printf("データベース参照失敗!\n"); exit(1); } printf("CRE_DT = %d\n",CountOfData); }
591 :
:2001/08/22(水) 03:16
プログラミングって何が楽しいの?
593 :
:2001/08/22(水) 03:22
ごめん。
c言語ってデフォルト引数ってありましたっけ?
ありがとうございます.
>>586 >>587 >>588 そうですか、貴重な意見どうもありがとうございます。
自分の場合も、どっからか拾ってきて使う、というのが多いです。
(イイトコダケ、ツマミグイスルノハムズカシイ)
598 :
デフォルトの名無しさん :2001/08/22(水) 20:43
16進数→10進数変換 できる関数とかあります?
600 :
デフォルトの名無しさん :2001/08/22(水) 20:57
601 :
デフォルトの名無しさん :2001/08/22(水) 21:02
CとC++はどっちがイイ?
602 :
:2001/08/22(水) 21:07
アルゴリズムの決定本教えてくれ。
>>601 C が使いこなせない人間に C++ は使えない。まず C, そしてオブジェク
ト指向分析・設計を勉強して、最後に C++。
605 :
:2001/08/22(水) 22:22
>>604 C++の方が安全性に優れてるんだから、そうとも言えんよ。
実際、C++をやるのにCを勉強するべきかは意見が分かれる
ところ。
>>605 C++ の方が「安全」というのは、どうかなぁ。
別のスレッドでも書きましたが、例外が絡むと簡単にリークが発生しえ
ますし、メンバ変数にポインタが絡む場合、デフォルトで作成されるコ
ンストラクタや = 演算子の挙動を把握していないと簡単にメモリを破
壊します。
C は文字列操作、キャスト、ポインタ演算に絡んで落とし穴があります。
C++ は文字列操作は std::string なり CString を使うことで落とし穴
を避けられますが、キャストとポインタ演算は相変わらずですし、加え
て例外や暗黙で生成される関数、型変換、デフォルトパラメタの再定義、
非仮想関数の再定義と、落とし穴満載です。
あと実際のコーディングに関してですが、既存の C++ のソースコード
は大半が C 言語流のプログラミングスタイルと C++ 言語流のスタイル
のハイブリッドです。C 言語で書かれたソースコードを読み書きできな
いと、現実にはほとんど役に立たないと思います。
C++はCの上位互換だからC++だけやれば十分だよ。C++的Cを最初からやれば いいだけ。Cからやる必要全く無し。
C++作ったおっさんも、確か著書でC言語から勉強する必要ないと 思うって言ってたな・・・
入門の段階ではC++の方が簡単でしょ。
610 :
デフォルトの名無しさん :2001/08/23(木) 00:53
C歴2ヶ月ほどの者ですが、 今、csv形式のファイルからhtml形式のファイルを作るプログラムと思っています。 元のファイルのカンマ(あるいはタブ)があったら、そこにテーブルタグを入れようと 思って、if文で分岐を作り、カンマ・改行・その他で動作を分けようとしたのですが 思いどおりに動いてくれません。どこがいけないのでしょうか?? 以下ソース(sは文字列を格納する変数、fin・foutはそれぞれ読み込み・書き込み用 ファイルのポインタです。) while(getc(fin) !=NULL){ if(s == "\t"){ fputs("〜略〜">\n",fout); } else if(s == "\0"){ fputs("〜〜略〜〜">\n",fout); } else{ fputs(s,fout); } }
611 :
sage :2001/08/23(木) 00:59
>>610 Cの文字列の扱いを理解していないと思われ。
索引のきちんとついてる本を買って、
「文字列」「文字コード」あたりを調べてみなさい。
612 :
デフォルトの名無しさん :2001/08/23(木) 01:00
>>610 タブやNULL文字は文字列ではないので、
シングルクォートで囲まないといけないのでは?
俺も初心者なので間違ってたらスマソ。
613 :
610 :2001/08/23(木) 01:05
>>611 明日あたり調べてみたいと思います。
>>612 なるほど。でも、それでやってもタブと改行にマッチしなかった(はず)
の場合でも出力されないんです(;´Д`) これいかに??
614 :
610 :2001/08/23(木) 01:09
ついでにもう一個。 fgetsで拾ってきた文字列の中の任意の文字列を他の文字列に 置き換える事って可能ですか??ちなみに上のはgetc使ってます。
>>614 もちろんできます。Cで出来ないことはどういう手段を使ってもできません。
616 :
sage :2001/08/23(木) 01:14
>>614 できるよ。
ついでに、君の持っている参考書でいいから、
文字列とポインタのことが書かれているページを
しっかり読み直しときなさい。
>>610 (
>>612 に加えて)
>if(s == "\t"){
としていますが、sはどこで代入されていますか?
>>617 つっこみどころが多すぎるから、
放置でいいよ..
619 :
デフォルトの名無しさん :2001/08/23(木) 01:39
BCC55のコンパイラのエラー文で 左辺値が必要 ってどういう意味?
620 :
デフォルトの名無しさん :2001/08/23(木) 01:43
>>617 スマソ、代入文忘れてました(;´Д`)
というわけで書き直してみたんですけど、
while((s=getc(fin)) != NULL){
略
}
ってのは無理なんですか??
622 :
デフォルトの名無しさん :2001/08/23(木) 01:49
>>607 そうか。
私の周りでは C++ で閉じてるプロジェクトはほとんどなくて、Win32
アプリケーションなら Win32 API を直に呼び出す部分があったり、過
去の資産が C ライブラリのままで C++ のラッパクラス作ってないモノ
も多いです。
それで、C++ プログラマといっても結局 C っぽいコードも読み書きで
きないと仕事にならないのですが、世の中は、そういう時代じゃないの
かな。
624 :
612 :2001/08/23(木) 01:53
>>610 これでどうだろうか。
while ((s = fgetc(fin)) != EOF) {
if (s == '\t')
fputs("〜略〜>\n", fout);
else if (s == '\n')
fputs("〜〜略〜〜>\n", fout);
else
fputc(s, fout);
}
ネタじゃないよね…?
>>623 意味不明だが、C++はCを含んでるんだぞ?
なんだCっぽいコードってーのは。クラスを使うだけがC++じゃねーぞ?
>>619 左辺値は代入可能な変数ですか?
たとえば
int a,b;
&a = &b;
とかすると
左辺値が必要というエラーが出ます。
627 :
610 :2001/08/23(木) 02:02
>>624 > error C2106: '=' : 左のオペランドが、左辺値になっていません。
って返されちゃってコンパイルできないです。(whileの行)
もちろんネタじゃないんで、もう少しおつきあい下さい。
628 :
デフォルトの名無しさん :2001/08/23(木) 02:04
>>626 *(&a)=(int)&b ならアドレスが入るんじゃない?
そうしたら *(int*)a で bの中身が参照できる?
文句言われたら(void)を挟めばいいよね。
>>625 >>623 の書き方が悪かったんだろうけど、
C++では一般的だがCではそれしか使えない書き方ってのがある。
そこんとこだと思われ。
ありゃ? これC++? 文字の比較は==じゃできないでしょ?Cは。 strcmpとか使わないとまずいんじゃないの? 初心者だから間違ってたらスマン
fgetcとfgetsの違いに気づくまで放置しろって!
>>629 なんなんだ「C++では一般的だがCではそれしか使えない書き方」って。
今時Cコンパイラなんて無いってことは分かってるよな?
>>630 *文字*の比較ならできるよ。単なる整数値だから。
>>628 >>626 は単なる例です。
>>619 を読んだだけでは詳細はわからないので
あんなことをすると「左辺値が必要です」っていうエラーがでるので
同じようなことをしていませんか?
っていう意味です。
>>627 ヘルプでキーワードでC2106を引けよ。
638 :
デフォルトの名無しさん :2001/08/23(木) 02:17
>>633 sの型はchar型です。
getcで一文字づつ拾ってって比較ってやり方でできますよね??
それが楽なやり方かどうかは別として。
int じゃないの?
640 :
612 :2001/08/23(木) 02:22
sがポインタになってるとか…。
はい、intじゃないです。 今きづいたんですが、左辺がポインタになってなかったっすね(;´Д`) でもまだ期待どおり動いてくれないんで、精進してみます。 厨房な質問につきあって下さったみなさん、本当にありがとうございました。 またそのうち来るかもしんないっす・・・。
まさか関数名とか?
>>641 まずいって・・・
int fgetc( FILE* );
だからね。
ポインタに代入しちゃダメだよ。
>>641 ポインタでなくていいんですけど・・・
intにする必要はあるが。
そのうちって意外と早かったみたいっすね(;´Д`) はやとちりスマソ。 while(getc(fin) !=NULL){ を while((*s = getc(fin))!=EOF){ にしてみたら近い動きしたもんで・・・。
646 :
デフォルトの名無しさん :2001/08/23(木) 02:39
��
>>623 Cのライブラリの知識が必要になったら勉強すりゃいいじゃん。
みんながみんな必要になるわけでもないし。
Cっぽいコードってのがいまいちわからんけど、例えばC++
使う上でC言語の知識が必要なら、それはC++の解説書にも
書いてあるべきことでしょ。逆にC++使う上で不必要なC言語
の知識もあるわけで、C++やるのにC言語からってのはおかしな
話だよ。C++の勉強とは、C言語から拡張された部分だけの勉強で
はないのですよ?あくまでC++を習得したいのであればC++を
初歩からやればいいし、C言語を習得したいor仕事で必要ならC言語
を勉強したらよいのでは?
>>647 でもさぁ、C++の参考書ってCがわかってる人
(Cをかじったことのある人)向けに書いてあるのばっかじゃない?
>>648 同意。Cからやらないと意味わからないやつばっかり。
必要なCの知識もみっちり教えてくれる親切なC++本ないのかな
カンマが検出されるまで一文字ずつ調べるという方法では 2バイト文字を使ったときにそこで偽カンマを検出することがあるけど なんかいい対処方法無いですか? 自分は610ではないです、一応。
>>649 そもそも「C++ を使うと不要になる C の知識」ってあるのか?
>>651 Cの文字列の扱いは忘れてしまいたい。(T_T)
653 :
610 :2001/08/23(木) 03:39
>>650 漏れも同じとこで詰まってます(;´Д`)
fscanfだと比較できないし、getcで得ると2バイト文字対応できないし・・・。
どなたかいい解決方法ないですか??
>>651 setjmp()
あとはポインタを直接いじってリスト操作、とかの機会は減るね。
減るだけでなくなるわけじゃないので、分かってないとダメだが。
>>652 VC++ だと char[] に加えて CString, CComBSTR, _bstr_t とか
増えたり。笑えん。
わりい・・ 656が出してたね・・・
>>654 書き方がまずかったか? 意味が良くわからんので、補足希望。
>>656 -657
ありがとうございます、とりあえずそのページでもよく読んでみたいと思います。
661 :
デフォルトの名無しさん :2001/08/23(木) 08:20
オブジェクトを使うだけならCを詳しく知る必要は、 無いかもしれない。しかし、低級なクラスライブラリ を作るようなことをするには、Cは必須。
>>661 > 低級なクラスライブラリを作るようなことをするには、Cは必須。
そうだね。そして、低レベルの処理をする場合はアセンブラは必須だね。
663 :
デフォルトの名無しさん :2001/08/23(木) 18:09
為になるC言語ソースのあるページない? 大きいサイトでも小さいサイトでもいいっす。
664 :
デフォルトの名無しさん :2001/08/23(木) 18:10
為にならなくても実用的なのも教えてほしいっす。
667 :
デフォルトの名無しさん :2001/08/23(木) 19:01
中級、上級者用のサイトが知りたいage
668 :
_ :2001/08/23(木) 21:50
669 :
デフォルトの名無しさん :2001/08/23(木) 21:57
>>661 -662
何をそんなにムキになっているのか分からんが。いきなり C++ やって
挫折するも良し、C やって遠回りしたと後悔するも良し。これから勉強
するヤツには好きにやらせておけば良いじゃない。
>>670 同意。
おれはCやってC++勉強中だけど、
なにげにCの知識かなり役に立ってる。
でも、C++だけでもよかったかなってとこもあるし、
やっぱり好きにしろって感じかな?
つーか、何か必要なときは調べればよし
672 :
:2001/08/23(木) 23:14
だから「プログラミング言語C++第3版」でも、そこは議論が分かれる ところと言っているのだ。
>>671 分からんやつだな。だからC++ってのはCを含んでんだよ。C++にないCってのは
ほとんどANSI以前のC、過去の遺物ってやつだってばさ。
#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にコピーできるようになるでしょうか?
>>674 そんなんわかってるよ・・・
C++からはじめてもできないことないでしょ?
>>676 Cなんかやる必要ねーってんだろがゴラァ。
>>675 ポインタpがどこを指していると思ってるんだ?
>>675 >printf("%s",p);
フォーマットが間違ってる。つーか危ない。
正しくは
printf("%c",*p);
それと、NULL != '\0' だから
>while( *Xa != NULL ){
while(* Xa != '\0' ){
あと、 p はfncの ローカルの配列にしたほうがいい。
メモリ領域破壊してる。
つーか、strcpy使えって。
680 :
デフォルトの名無しさん :2001/08/23(木) 23:46
>>671 君こそムキになってないかね。
指名されて批判されたと勘違いしたのかな?
一意見として書き込んだだけだが。
681 :
680 :2001/08/23(木) 23:48
>>675 ごめん。
コピーするやつなのに、結果返さないとね。
/*
p : コピーされる領域のポインタ
cp: コピーもとの文字列のポインタ
*/
int my_strcpy( char* p, const char* cp ){
while( cp != '\0' )
*(p++) = *(cp++);
*p = '\0';
return 0;
}
>>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);
}
}
>>683 そうか・・・
ネタだったのか・・・
鬱だ・・・
>>680 指名された覚えはないけど。誰かと勘違いしてない?
っつーか、すこし冷静になってくれ。熱くなりすぎ。
>>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;
}
何がやりたい、メモリ破壊プログラムか
>>685 ネタじゃないよ、更新したら新しくレスが付いていただけですから。
ご勘弁を。
まず、ポインタについて理解してください。 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; } わかりました?
>>688 メモリ破壊好きでやってませんよ。(泣
任意文字列「abcdefghijklmnopqrstu」
から(任意文字)例g から(任意個)例3文字までを取得 ghi
とするプログラムを書きたいんですが、どうも
>>687 の
下記エラー理由が分からないと前に進まない気が、。
>>691 ありがとうございます。さっそく見てみます。
>>690 初心者相手に丁寧な解説で、好感が持てるけど…
ちょっとおかしなところがあるんで軽くツッコミ。
>*(p++) = *(Xa++);
これだと双方インクリメントしてから中身を代入することになる。
(*++p = *++Xa; と同じ。つまり先頭文字はコピーされない。)
*p++ = *Xa++; とするべき。
あと
>return 0;
これはいらない。 void func でいいと思う。
無条件に0を返されたって、使い道ないし。
>>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との相違点です。
これを実行させると、空白しか返ってきません、なぜなんでしょうか?
>>692 なんでもいいんだけどさ、
変なエラーとか言う前に、エラーの意味調べる癖つけた方がいいぞ。
それでもわからないときにまたここに来なさい。
#include <stdio.h> void fnc(const char*);//(1) char buf[1024]; //(2) char *p; //(3) void main(void){ char *Xa="abcdefghijkl"; p=buf; fnc(Xa); printf("2:%s:",p); } void fnc(const char* Xa){ int i; printf("1:%s,%s:\n",Xa,p); i=0; while( *Xa != '\0' ){ *p++ = *Xa++;i++; printf("1:%d,%s,%s\n",i,Xa,p); } *p= '\0'; return 0; } --------------------------------- C:\>tes2 1:abcdefghijkl,: 1:1,bcdefghijkl,: 1:2,cdefghijkl,: 1:3,defghijkl,: 1:4,efghijkl,: 1:5,fghijkl,: 1:6,ghijkl,: 1:7,hijkl,: 1:8,ijkl,: 1:9,jkl,: 1:10,kl,: 1:11,l,: 1:12,,: 2:: C:\> なんでコピーされないんだろう?
697 :
デフォルトの名無しさん :2001/08/24(金) 01:16
とある計算を行い、答をdouble型で返す関数を作ったところ -1.#IND00e+000 のような不可解な値が返ってきました 原因に心当たりのある方はアドバイスをいただけないでしょうか? 素人くさくてスイマセン ちなみに、ちゃんとした値が返ってくるコトも当然あります VC++6を使ってます〜
p=buf; printf("%x\n", p); fnc(Xa); printf("%x\n", p); printf("2:%s:",p); を試してみなさい。
>>693 事故レス
え…偉そうに書いてまちがっとる…。
>*(p++) = *(Xa++);
は
>*p++ = *Xa++;
と同じで、
>*++p = *++Xa;
とはならんのね…。エラソウニイッテゴメンネ
>>690
>>693 ちょいと。
>これだと双方インクリメントしてから中身を代入することになる
そんなことはないですよ。
構文が実行されてからインクリメントされるはずです。
>>698 ありがとうございます。
そっか、
p=buf;
がPublicで、アドレス指定されていない為に、アドレスが違ってきて空白なんすね?(多分)
main と fnc それぞれに有効に任意のアドレス指定する方法ってどうすのですか?
>>701 698のが十分なヒントになっていると思ったが、そうでもないみたいなので、
test1.c, test2.cのそれぞれのmain()の
printf("%s",p);
を
printf("%s",buf);
として試してみなさい。bufへのコピーができていることが分かるはず。
あとは698のヒントをよく理解すること。pがfnc()復帰後どこ挿してるのか。
704 :
じみー :2001/08/24(金) 03:12
Cというよりアルゴリズムの問題でしょうが 次のようなプログラムを書こうとしたのですが 例えば8月23日の8:00から9月4日の間の経過時間を出す 自分で考えたのですが月をまたがるとややこしく どうしても良い方法が思いつきません。 どうかヒントでも何でも良いのでお力をお貸しください。
705 :
じみー :2001/08/24(金) 03:18
方法がわかりました くだらない質問を書いてしまいすいませんでした。TT
>>705 自分で解決できたなら、その方法を書きなさい。
2ちゃんでマナーを言っても仕方ないけど、
普通のところはそれがマナーとされている。
>>エ糞死すと
CはJavaとは違う。
直接、メモリを扱うことを常に頭に入れてください。
つか、本読め。
>>693 忙しかったんで、読めてなかった・・・
スマソ
709 :
:2001/08/24(金) 19:31
俺はまだ初心者だが、 *p++これとか後置型だからなにやら処理された後 インクリメントされるのと違うんですか??
710 :
名無しさん :2001/08/24(金) 19:50
初めてのプログラミング言語としてC言語を勉強しようと思うのですが C専門の書籍も買おうと思っていますが、C MAGAZINEのバックナンバーを 4月号からまとめて購入するって言うのもありでしょうか?
Cmaga買うより専門の入門書買ったほうがずっといい
>>697 > 1.#IND00e+000
浮動小数点数として「不定」な値。
例えば log(-1.0) などの結果。
713 :
名無しさん :2001/08/24(金) 21:02
C MAGAZINEて駄目?
う〜ん、どうしよう。。。 ドキュソな自分にとっては4月号からまとめて買うのもありかな。
716 :
:2001/08/25(土) 01:41
CマガってC/C++以外の記事の方が多くないかい?
C言語から始めたが、Cマガ読んだことないよ。
>>716 CマガのCはComputerのCってことになってるんだYO。
Windows NT MagagineはNew Technologyだっていってたけど Win2KでたらWindows 2000 Magagineに改名したYO
720 :
デフォルトの名無しさん :2001/08/25(土) 13:47
age
きっとそのうちXPマガジンになるね
723 :
デフォルトの名無しさん :2001/08/25(土) 15:27
#include <stdio.h> struct pen { int aaa; char bbb; int ccc; }; main() { int count; struct pen p[1], *point; point = p; p[0].aaa = 1; p[0].bbb = 'a'; p[0].ccc = 10; p[1].aaa = 2; p[1].bbb = 'b'; p[1].ccc = 20; for(count = 0; count <= 1; count++){ printf("p[%d].a = %d\n", count, p[count].aaa); printf("p[%d].b = %c\n", count, p[count].bbb); printf("p[%d].c = %d\n", count, p[count].ccc); printf("p[%d].a = %d\n", count, point->aaa); printf("p[%d].b = %c\n", count, point->bbb); printf("p[%d].b = %d\n", count, point->ccc); point++; printf("\n"); } return 0; } 実行結果: p[0].aaa = 1 p[0].bbb = a p[0].ccc = 10 p[0].aaa = 1 p[0].bbb = a p[0].ccc = 10 p[1].aaa = 1 p[1].bbb = b p[1].ccc = 20 p[1].aaa = 1 p[1].bbb = b p[1].ccc = 20 セグメントエラー(coreを出力しました) 何故 p[1].aaa が 1 になるのか、core を吐いてこけるのか、 分かりません。教えてください。
724 :
デフォルトの名無しさん :2001/08/25(土) 15:36
>>723 p[1].aaa = 2;
p[1].bbb = 'b';
p[1].ccc = 20;
でメモリー破壊起こしているから何が起こるか誰も予想がつかんよ。
いろいろな環境、異なるベンダで試してみぃ。
725 :
デフォルトの名無しさん :2001/08/25(土) 16:29
>>725 ネタは sage で書けよ。しかも面白くないし。
struct pen p[2], *point; にすればいいのでは? pen 構造体ひとつ分しか確保してないから問題発生かと。
>>723 どう考えてもネタ。
>セグメントエラー(coreを出力しました)
あたりまえ。
729 :
デフォルトの名無しさん :2001/08/25(土) 18:54
質問です。 char* pointer = NULL; pointer = getenv("KANNKYOU"); や pointer = crypt("hoge","aa"); とした時にこのpointerの指し示す場所は具体的に何処ですか? コード領域でなければスタック変数上でも無いですよね? いったい何処に??とても疑問に思いました。お願いします。
getenvは環境変数領域上のアドレスを返すから、その内容を変更しちゃダメらしい。 OSが使ってるのを弄ったらまずいってことか。 cryptは関数自体わからないっす
731 :
デフォルトの名無しさん :2001/08/25(土) 20:49
>>709 心配するな。キミの言う通り。
693が間違ってるだけ。
>>730 OSによるけど、フツーのUNIX系なら弄っても問題ないよ。自プロセスが困るだけで。
733 :
デフォルトの名無しさん :2001/08/25(土) 23:06
C++ってCのスーパーセットなの?
735 :
デフォルトの名無しさん :2001/08/25(土) 23:26
C初心者です。最近数値計算をCで作らなきゃならなくて 色々勉強してるものです。 unsigned int a: として、a に正の大きな値を入れます。それから printf("a=%ld\n",a); ってやると、−xxxxx というように負の値として表示されてしまいます。 MSBを符号ビットとして扱うかどうかという問題 だというとこまではわかったのですが、上のように 大きな正の値をそのまま表示させるにはどうすれば いいでしょうか? また計算機は内部で unsigned int で用意された a をどう扱ってるのでしょう? 質問内容まとまりなくてスマソ。
736 :
デフォルトの名無しさん :2001/08/25(土) 23:28
%u
737 :
729 :2001/08/25(土) 23:30
レスありがとうございます。 getenvの事は良くわかりました。 ではcryptはどうなんでしょうか? どこに文字列を収納しているのですか?
ライブラリが持っている静的領域。
あ、当たり前の事だった・・・・・ サンキュー
740 :
デフォルトの名無しさん :2001/08/25(土) 23:44
741 :
デフォルトの名無しさん :2001/08/25(土) 23:48
>>733 >>740 も「大体」と言ってるように、完全なスーパーセットではない。
『プログラミング言語 C++』の付録Bあたりを読んでくれ。
これが最後の書き込みになっちゃうのかな…。
>>736 printfの問題だったんですね。
マニュアルあたりますです。どうもです。
743 :
デフォルトの名無しさん :2001/08/26(日) 00:29
てst
mallocで割り当てられたメモリサイズを知る方法ってありますか? char c1[100],*c2; c2 = malloc(200); としたとき、c1はsizeof(c1)で100と分かるんだけど、 c2が200であると調べるにはどうしたらいいんだか・・・
>744 ない。mallocの呼び出し元で管理しとかないといけない
>>744 malloc()のソース追えば分かるんじゃない?
747 :
初心者A :2001/08/26(日) 01:56
C言語を始めようと思うのですが、 C言語を始めるには何のソフトが必要ですか?あと他にも何か必要な物はありますか? 習いには行かないで独学で基本だけでもマスターしようと思うのですが難しいでしょうか?
了解しました。 都合のいい方法でもないかと考えてましたが甘かったようですね。 とりあえず適当に自作してみます。
749 :
NOS-TAL-GIA :2001/08/26(日) 02:56
>744 見てるかどうかしりまへんが… 使っているコンパイラによりますが "_msize()" という関数を探してみてくださいな もしかするとあるかもね ---- 無理矢理にでも知りたい場合 かなり強引でコンパイラに依存しますが void *block=malloc(123); の様に確保した場合 ((size _t *)block)[-1] でサイズを取得できる場合があります 古いOS等では大方この方法が効きます
>>747 まぁWebを見る機械は持ってるようだから、i-modeとかだと厳しいかも知れんがとりあえずは検索したら?
Webで済まないなら本だな。しかし、今時Cから始めなくてもC++からやりゃいいから「プログラミング言語C++」買え。
PCを持ってたらGNU/LinuxかFreeBSDかなにかをダウンロードしてきてインストすればg++がロハで使えるよ。
>>750 C++からはじめるのには賛成だが、いきなり「プログラミング言語C++」
は読めんと思うぞ。プログラムのプの字も知らんのだろ。
それにC++の本て、C言語知ってる人向けのがほとんどだから、
そういった理由でC言語も少しかじる必要があるかもしれん。
>>747 プログラミングなんてもともと習うもんじゃないぞ。とにかく本やソースを読むし
かない。まー、要所要所で聞いてもかまわんが、なるべく自分で調べて自分で
コード書いてみるしかない。本にいくら金かけられるかだと思うぞ。(高いのが多いのだ)
C++からはやめといたほうがいいんじゃないかなあ・・・
>>753 その議論は、白熱するからやめといた方が。好きにやらせておきなよ。
>>750 世の中には
1. いきなりC++やるべし。
2. そのまえにC言語を押さえておいた方が良い。
3. さらにC言語の前にPASCALやっておいた方が良い。
4. C++の前にCとオブジェクト指向について勉強しておいた方が
良い。SMALLTALKやっとけ。
とか、いろいろ薦める人間がいる。当人のプログラミング経験や環境、
目標、そして資質によって最適解は変わるから、好きな方法でやって
くれ。一つの方法で挫折したら、別の方法を試せば良いだけ。
ちなみにC++の言語仕様はCに比べると巨大で全体を把握するのは難
しい、C++のクラス周りの仕様はオブジェクト指向を理解せずに文法
面から意味を把握しようとすると挫折しがち、というのは事実。だから
C++から勉強するのが良くないかというと、それは別の話ね。
755 :
デフォルトの名無しさん :01/08/26 13:52
つーか、C++やるにあたり、Cの知識はあったらちょいと楽、程度。 基本的に別物って考えてもらわないと困るザンスよ
756 :
デフォルトの名無しさん :01/08/26 14:19
関数ungetc( int c , FILE *stream )についての質問です。 cをstreamに押し戻すとは、どういうことなのかイメージできません。 特に『押し戻す』という点が良く分かりません。教えて下さい。
だから、C++に含まれないCの知識なんていらんのだって。
758 :
デフォルトの名無しさん :01/08/26 14:27
>>756 入力文字を保管するバッファを関数外部に用意しておいて、
ungetch(c, fp) では、c をそのバッファに保管し、
次に getch(fp) する時には、まずバッファ内の c を取り出して返し、
バッファが空になったら、入力ストリーム fp から文字を読み込む。
というようにして、あたかも
>cをstreamに押し戻す
かのように動作しているのが、ungetch()。
この際だからK&R買っては?
上記以外にも malloc() や printf() なんかの仕組みも載ってて
勉強になるよ。
760 :
デフォルトの名無しさん :01/08/26 14:55
でも
>>747 は
>C言語を始めようと思うのですが、
と言ってるんだよ。C++と言ってるんじゃないだ。
だからC++は特に意識せず、Cを習うべし。
>>756 実際にファイルに何か書くわけではないけれど、入力バッファ
にcを書き込んで、直後のgetc等ではそのcが読み込まれると言
うことだよ。(だから、バッファのサイズを超えてはungetc
出来ないと思う。)
全然意味ないコードだけど
#include <stdio.h> /*getc, ungetc*/
#include <ctype.h> /*islower, toupper */
int main(int argc, char* argvp[]){
unsigned int ch;
do{
ch=getc(stdin);
if(islower(ch))
ungetc(toupper(ch), stdin);
else
putc(ch, stdout);
}while(EOF != ch);
return 0;
}
Cのバイブルは「プログラミング言語C 第2版」 C++のは「プログラミング言語C++ 第3版」 ただいきなり読めるかはその人による。
重複れす、すんませんでした。 それに全然インデントしてないコード、お見苦しいものを 失礼しました。
でも、今から始めるのにC++を避けてあえてC言語を 学ぶメリットなんてあるんかなぁ・・・。仕事とかで 必要ってならともかく、学生が身に付けようってんなら C++でしょう、このご時世。 C++の準備としてCやるならともかく・・・・。
764 :
デフォルトの名無しさん :01/08/26 15:06
Macで使えるフリーのCコンパイラを御存知ですか? 1つだけハーベストCというのを持っているのですが、使い方が よく分かりません。
765 :
デフォルトの名無しさん :01/08/26 15:13
>>763 絶対数で言えばC++よりCの方が使用されてる事例の方が多い。
これからのことを考慮に入れても、C++とCどっちやろうかな〜なんて
漠然と考えている程度なら、どう考えてもCを学んだ方が良い。
>>763 結局は『選択の自由』とは思う。彼の動機がなんなのか
は知らないけれど、例えばrubyの本とか見てて、拡張がC
で説明されていればCに入って行くと思う。
それから、本人がC++書いてるつもりでもvalarrayとかvector
使わないでint[128]なんてやって悶々と無駄な事やってる
人見ると悲しくなってくる。
仕事になるとCのみってことあるじゃん。
そこで new int[128]が通らなくて迷う前にCはCとして
覚えていても良いかも。
>>759 ungetch ぢゃなくて ungetc のこと聞いてんだろ。(苦笑
>>756 ungetc なら、 FILE構造体 は
そのファイルの何文字目まで読んだかを記憶する変数を持ってるから、
その値を1文字分戻すってことをやっているんだと思う。
768 :
デフォルトの名無しさん :01/08/26 15:46
769 :
デフォルトの名無しさん :01/08/26 15:50
>>768 言葉どおりの質問なら答えはYesだが、
行間も読むと答えはNoとなる。
771 :
デフォルトの名無しさん :01/08/26 16:31
分かってないなー > & 770
>>770 煽りでなければ、情報のソースを出してくれ。
773 :
デフォルトの名無しさん :01/08/26 16:35
>>765 は言語の話してたんだろ。それで
>>770 はコンパイラのこと言ってる。
もう、そこで食い違いじゃないか。
774 :
デフォルトの名無しさん :01/08/26 16:36
>>772 多分C/C++コンパイラはある、とか言いそうだ。
今はCからC++に移りつつあるよ。まだCの方が多くてもね。 CよりC++の方がすぐれた言語なんだから当然よ。
776 :
デフォルトの名無しさん :01/08/26 16:41
そうするとC/C++じゃないC++専用ってあるのか
>>775 その優れたと言われる新しい所ほど実際には使われてないんだよな。
というより、使う方が大変だよ。いや、使い切ってる例を知りたいよ。
779 :
デフォルトの名無しさん :01/08/26 16:45
>>775 C++はこれからも少しずつ進化していくだろうね。
一方のCはというと、既に言語としては完成している。
これらをメリットと捉えるか、デメリットと捉えるか。
目的によってだいぶ変わるだろうね。
ただ一ついえることは、C++に移りつつある、なんてことは
断じてない。
C++ができないからって必死だな…(藁
>>776 まず、本当に速度が必要な部分てのはそうそう無い。
本当に必要な場合でもフツーアルゴリズムをまともにすれば解決する。
それでもダメな本当に必要な部分はCで書いてもダメ。
ほんとそうだよ。> 780 おれはC++でどーしようか、突き詰めて考えてたら鬱になるよ。 あのSTLどうやってホントに使おうか迷うよ。 えっと、algorithmとかfunctionだっけ? あれ本気で使って、テンプレートだなんだと組み合わせて、 あーだどーだでOOPだなんて、さっさと昔ながらのやり方した ほうがよっぽど良いように思うよ。
783 :
デフォルトの名無しさん :01/08/26 18:16
C++はCより難しいって言って、Cを初心者に勧めてる人がいるけどさ、 入門レベルではC++の方が簡単でしょ。 stringとか参照を使えば、ポインタの概念を知らなくても一通りプログラム を組めるしさ。 もしかするとポインタ(参照)を使わざるをえないJavaより簡単かもしれない。 ポインタを理解してないで「C++を使える」とは言えないけど、ポインタやクラス のような難しい部分は、プログラムそのもの慣れてからマスターすればいいよね。
784 :
デフォルトの名無しさん :01/08/26 18:24
>>783 ポインタやクラスを理解しないでC++って学習できるかな?
少なくとも、一番最初に学ぶべきポイントをすっ飛ばしては
慣れるも何もないと思うんだけど、どうよ? ↓
785 :
デフォルトの名無しさん :01/08/26 18:29 ID:Rb2DRqs2
16bit BMP画像(モノクロデータ)の作成について Image画像(現在、UNIXのXウィンドウで表示している)をBMP画像(ウィンドウズの環境で表示)に変換するプログラムを作っているのですがうまくいきません。 Image画像はピクセル値2バイトのモノクロデータ(カラーテーブル有り)ですが、BMP画像に変換するとカラー色がついてしまいます。 原因は、カラーテーブルが使われていないようです。 (16bit以上はカラーテーブルが使われないようですが、使うことはできないのですか?) やっぱり、BITMAPINFOHEADER構造体の指定が間違っているのでしょうか?
787 :
デフォルトの名無しさん :01/08/26 18:41 ID:Svg5Z2ms
>>784 ポインタやクラスの学習はC++の学習に含まれています。
788 :
デフォルトの名無しさん :01/08/26 18:47 ID:Svg5Z2ms
VisualC言語なんてあるか? MFCだってDirectXだってC++。 もう世の中C++よ。
789 :
デフォルトの名無しさん :01/08/26 18:48 ID:gEEpQCFI
なんかCよりC++のレスが多いね
あんたがたのC++の知識は分かったからここから出て行って下さい。 C++関連スレなら山ほどあるだろ。
>>783 話が微妙にずれてるね。
>>783 が書いてるのは
プログラミング自体の初心者で「変数って何ですか」のレベルの人
間が、変数や制御構造などの概念を理解するまで。
の話だよね。
それなら個人的には「C, C++ どっちでも大差ない、むしろ変数の型や
#include を気にせずに済む Perl でも使った方が良いよ」と思う。
むしろ問題はその先で、Hello World から実用的なプログラムを組める
ようになるまでの段差じゃないかな? C なら
「プログラミング言語C」
「エキスパートCプログラミング」
それにアルゴリズムとデータ構造を解説した本を一冊読めば、まぁ合格
というところだが、C++ だと
「プログラミング言語C++」
「Effective C++」
「More Effective C++」
「憂鬱なプログラマのためのオブジェクト指向開発講座」
「デザインパターン」
程度まで理解しないと、実用的なコードは書けないし読めない。道のり
は遠いよ。
792 :
デフォルトの名無しさん :01/08/26 19:06 ID:1gb.tnZw
ぶっちゃけた話C++はC言語を含んでるんだから、C言語なんてもの いらんのと違うか?なにもC++やるのにすべての機能知ってる必要 ないし、自分の使いこなせる部分だけひろってけばC++は十分使える のだ。
>>792 あのー、コンパイラの数と質がぜんぜんちがうんですけど。。
>792 それでSTLとかMFCとか使ってバンバンコード書くんだろ? それはそれでいいんだが、Cとはやってる事が違うんだよ。
>>792 C++ コンパイラを作るのは C コンパイラを作るよりも数段難しいし、
C++ のオーバーヘッドが許容できない実行環境も存在する。
796 :
デフォルトの名無しさん :01/08/26 19:25 ID:pP2VgnkE
C言語なら、オレに聞け! <5> と書いてありますが、スレ違いですか? 16bit BMP画像(モノクロデータ)の作成について Image画像(現在、UNIXのXウィンドウで表示している)をBMP画像(ウィンドウズの環境で表示)に変換するプログラムを作っているのですがうまくいきません。 Image画像はピクセル値2バイトのモノクロデータ(カラーテーブル有り)ですが、BMP画像に変換するとカラー色がついてしまいます。 原因は、カラーテーブルが使われていないようです。 (16bit以上はカラーテーブルが使われないようですが、使うことはできないのですか?) やっぱり、BITMAPINFOHEADER構造体の指定が間違っているのでしょうか?
>>795 Cで書いてたのをC++にしたからってオーバーヘッドなんて無いよ。
速度が重要な時に論理的に美しく書こうとしてCでは無かった構造(継承とか)使うと
そうもなるけどね。
>>796 環境に依存しすぎる質問は無視されやすいから
もう少し質問をスタンダードなものに噛み砕いてから
もう一度書こう。
799 :
796 :01/08/26 19:48 ID:pP2VgnkE
なんか微妙にスレ違いな議論だけど、基本的に
>>792 に同意だな。
C++ でいわゆるオブジェクト指向と関係ないものを揚げても
(1) 型保障リンケージ
(2) 強力な型チェック
(3) 関数テンプレート
(4) 関数オーバロード
(5) デフォルト引数
(6) 局所変数をブロックの途中で定義できる
これらの機能使うだけでも C から C++ に移行する価値は十分あると思われ。
>>797 仮想関数などのオーバーヘッドは当然ですが、それがなくてもランタイ
ム環境の仕事が増えます。
C++ では例外が飛んできたときに自動変数のデストラクタを呼ぶ必要
があるけど、そのための追跡コードとか、実行時型識別のためのコー
ドとか。
802 :
:01/08/26 20:39 ID:7dBbEFak
fcloseにNULLって渡してもいいものなのでしょうか?
>>801 ランタイム環境の仕事ってなに?Cのコード持ってきた時に何が呼ばれるっての?
例外とかRTTIとかもCのコードなら関係ねーと思うけど。
あったとしてもゴミでしょ。
805 :
800 :01/08/26 21:38 ID:T2mfBZtY
>>801 例外や実行時型チェックを禁止してオーバヘッドを回避する
コンパイルオプションは大抵の処理系にあるはず。
C++ も C 譲りの効率重視の言語であることに変わりはない。
807 :
800 :01/08/26 21:54 ID:T2mfBZtY
>>806 要らないとまでは言わないけど、C++ が使える環境では積極的に使うべきだろう
ということ。
>>807 話が噛み合ってなかったか。
かなり脱線してるけど
>>801 は元々
>>792 で「C++はC言語を含んでるんだか
ら、C言語なんてものいらん」と書かれていたことに対する反論なんです。主張は
次の二つ。
まずは、C++はCのスーパーセットだけど、コンパイラやランタイム環境を提供
する側からするとC++はCよりも手間がかかる。だから、実装が容易なC言語に
も意味がある。
もう一つは、C++もフルスペックで使うと、リソースが厳しい環境では性能上の
問題が出る。そこでぎりぎりまで絞ると結局Cと大差ないから、それならCでも良
いだろう(もちろん Embedding C++ って選択肢もあるけど、これが使えるかどう
かは場合によるので、素のCも選択肢に残しておいて欲しい)。
C++使える環境なら積極的に使えというのは同意だけど、C++処理系が提供さ
れていてもCの処理系ほど枯れていない場合も多いので、何でもかんでもC++と
はいかないのが現実。
809 :
800 :01/08/26 22:17 ID:/iAV1yEw
>>782 STLとOOPはあまり関係無いと思うが。
811 :
800 :01/08/26 22:55 ID:kIMgTLjk
ついでだから、もうちょっと書くと。 前言を翻すようだけど C++ 勉強する人は いきなり C++ からやるのではなくて、 やはり最初は基本として C の文法を頭に叩き込んでから C++ に入ってほしい。 C++ だけやってるやつはどうも信頼できない気がする。まぁ、単にオレが C++ の 前に C をやってたせいかもしれないけどね。 その場合でもコンパイルは(C++ が使える環境なら)型チェックが強力な C++ で 行った方がよいとは思うけどね。 ただ C も型保障リンケージくらいは導入してほしい、てのもあるのだが。
>>811 型保証リンクなんて全然いらないね。ヘッダファイルを使えば済む。
それより、変数宣言だけでも好きな場所でさせてくれ。
ところでC言語でWindowsプログラミングってできるんですか?
今さらだけどさ、CはC++に含まれてるからCはやんなくていい!!ってのは やっぱ違うと思う。 C++では使えるけど、Cでは使えない事ってかなりあるんだから、 Cを知っておくに越したことはないと思う。 Cマガ投稿する時とか困らないようにな(w
WinAPIってC言語から呼び出す事を前提に作ってるんじゃなかったけ?
プラットホームがWindowsなら、Cから入る意味はほとんどない。 Cは、読める程度でよい。 C++が一通りできれば、Cは読める。 C++は入門には敷居が高いって声が相変わらずあるけど、 入門レベルでは、むしろC++のほうが簡単である。
>>816 ふつうC++はCのライブラリもリンクできるようになっている。
818に追加 WinAPIは、処理系が対応すれは、言語にかかわらず呼び出せる。
>>817 プログラミング言語の習得と、各プラットホームでのプログラミング
技術の習得は別だよ。
Cプログラミングが一通りできるからといって、すぐに通信関係のプロ
グラムを書けるわけではないし、UNIX プログラマが Win32 に鞍替え
するなら Win32 に関する勉強が必要になる。
あと「入門レベル」というのが曖昧なので、もう少し詳しくかいた方が
良いと思うよ。
>>820 べつに、全てのプラットホームで全てのジャンルのプログラミング
スキルを身につける話をしてるわけじゃない。
そんなことは現実的でもないし。
Windowsでプログラムを学ぼうすると、いろいろ選択肢があるが
CかC++に限定して、どちらが良いかということなら、
Cから入るメリットはない。
>>816 APIの呼び出し形式はPASCAL形式なので、
C前提ってわけではない。
# int PASCAL WinMain()とかって見覚えないかな
824 :
800 :01/08/27 01:30 ID:gDY6k4QU
>>821 > Windowsでプログラムを学ぼうすると、いろいろ選択肢があるが
> CかC++に限定して、どちらが良いかということなら、
> Cから入るメリットはない。
う〜ん、そういういきなりGUI から入るやつが微妙に信頼できないのだよね。
Win 環境でプログラムする場合でも、まずはアルゴリズムの勉強から入るはず
でしょ。とすると、最初はコマンドラインのプログラムから入って基本を身に
つけるべきだと思う。C の標準ライブラリの使い方も知らんやつに Win API が
マトモに使えるとは、ましてや MFC が使いこなせるとは思えない。
オレの考えが古いのかもしれんが。
>>824 そういう書き方をすると、C++ってGUI用の言語みたいじゃん。
UIで、CとC++の使いどころを分けるのって認識が間違ってるよ。
826 :
800 :01/08/27 01:54 ID:gDY6k4QU
>>825 なるほど、そういやそうだな。ま、
>>817 が Win やるなら C やらなくて
よいみたいなこと言ったから…。
ともかく C++ から入る人でも C の標準ライブラリはマスタしてほしいし、
C だけでできること、できないことをきちんと区別できるようになってほしい。
>>823 PASCAL とついてるから C 前提ではない、というのも短絡な気が少々。
コールゲートあたりにあわせたんじゃ?とも考えられるような気もしますけど。
>>826 >なるほど、そういやそうだな。ま、
>>817 が Win やるなら C やらなくて
>よいみたいなこと言ったから…。
自分の勘違いを人のせいにすんなよ。
俺は、コンパイラとか、各種の資源の状況から「Windowsでやるなら」って
言ったの。
829 :
800 :01/08/27 05:22 ID:OdbfeXSk
>>828 > 俺は、コンパイラとか、各種の資源の状況から「Windowsでやるなら」って
> 言ったの。
それは悪かった。それについては同意。
でも「C は読める程度でよい」とか、「入門レベルでは C++ の方が簡単」と
いう点では、やはり賛成しかねるな。
C/C++ が実行効率重視の言語であることは、C++ でその比重が多少他の要素に
移ったとは言え、依然として第一の目的であることに変わりはない。
だから入門者に、低レベルの文字列操作やポインタより先に string クラス
とかを教えることは、使えない C++ プログラマを量産することにしかならない
と思う。
入門者には練習問題として string クラスを作らせるべきだ、と言うならわかるが。
>>828 議論がかみ合ってない、っていうか議論になってないね。
Windows固有の話ならスレ違いっていうのがまずあるけど、
それを別にしても、828の主張は他人と議論するそれではない。
「入門レベルって何?」ってところも明確にしていないし、
>>784 ,
>>787 で触れられているポインタの話だって、クラスとかそこから派生させる
事を考えると必要不可欠。
「そんなのは入門レベルじゃない。」って主張するかもしれないけど、
じゃあそれがどれほどCと違っているのかはこれもまでの説明からは不明。
ただ、WindowでGUIプログラムを学ぼうとすると、C++(むしろVC++&Win方言)
が必須という点には同意。これはオレの経験からの話だけど、通信系でWinAPI
を直で叩いていた頃には、Unix上での知識&Cプログラムで十分だったけど、
Windowsが提供する枠組みの中で、特にGUI系のプログラムを作る場合には、
C++は不可避だし、
>>820 の言う通り、Windowsがどう動いているのかと言う勉
強は必要。ただ、これらがCに比べて簡単かと言われると同意しかねる。
(すでに
>>828 が言う入門レベルではないかもしれないが、、、)
まずは、「入門レベルって何?」ってところからはっきりさせて欲しい。
両方やれよ。 どっちか片方なんてケチくさいこと言うな。
もしかして
>>828 って、プログラミング初心者はまず VC++ / MFC を使うのが
近道、と主張してるんだろうか?
833 :
デフォルトの名無しさん :01/08/28 12:37 ID:qhPN40nM
1文字:a,b,c,d,e,f,g............x,y,z 2文字:aa,ab,ac,ad,..............xx,xy,xz 3文字:aaa,aab,aac,aad,...aaz,aba,abb,acc.....azy,azz,baa,bab........xxx ...... n文字:..... とn文字までの全てのアルファベット(小文字のみ)の組み合わせの文字列を作りたいのですがどうすればいいのでしょうか? char Moji[] = "abcdefghijklmnopqrstuvwxyz"; //26文字 int main(int argc,char* argv[]) {   int loop1,loop2,loop3,loop4.....loopn;   for (loop1 = 0;loop1 <25;loop1++){     printf("%c%c",Moji[loop1*2],Moji[loop1*2+1]);     for (loop2 = 0;loop2 <25;loop2++){       printf("%c%c",Moji[loop2*2],Moji[loop2*2+1]);       for (loop3 = 0;loop3 <25;loop3++){         printf("%c%c",Moji[loop3*2],Moji[loop3*2+1]);         for (loop4 = 0;loop4 <25;loop4++){           printf("%c%c",Moji[loop4*2],Moji[loop4*2+1]);           ........                 for (loopn = 0;loopn <25;loopn++){                   printf("%c%c",Moji[loopn*2],Moji[loopn*2+1]); 以下処理続く と、すればできない事も無いですが明らかに賢くないですよね・・・・ その上これだと1〜n文字の文字列を作るのではなくn文字の文字列だけしか作れません。 Create_Moji(int n);のような関数をつくるには どうすればいいのでしょうか?お願いします。
834 :
デフォルトの名無しさん :01/08/28 13:22 ID:3vVKFA1E
>>833 Create_Moji(int n);
↓
Create_Moji(int n,char* lpStr);
で考えた方がいいのでは。
STLが使えるならstd::stringを使う。
>>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()は宿題
>>835 それだと、n文字のものしか作れないと思われ
>>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);
}
}
驚くほどスマートなコードですなぁ。 ありがとうございました。 これから解読(理解)させてもらいます。(w
ID変わっちゃいました。833=838です。
840 :
デフォルトの名無しさん :01/08/28 16:57 ID:qhPN40nM
># conv26()は宿題 ∩ ∧_∧ | | / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ( ´Д`)// < 先生! 宿題解りませ〜ん / / \_____________ ずっと考えてましたが解りません。a-zを26進数で考えればいい というのは理解できましたが具体的にコーディングしようとすると・・・・ ヒープ領域を使ってみたり色々しましたが解りませんでした。 conv26()についてもう少し具体的に教えて頂けないでしょうか。 よろしくお願いします。
841 :
デフォルトの名無しさん :01/08/28 17:13 ID:PsZ1SeyA
Borland C++ Compiler 5.5と
Borland C++ Compiler 5.5 環境ファイル/パス設定プログラム(
http://cmaga.zdnet.co.jp/setbcc.html )を
落として設定を終えました。
…が、上記サイトの『「ちょっと」使ってみる』で行き詰ってしまいました。
OSはw2kなのですがMS-DOSプロンプトて2kには無いんですよね?
何かいい方法を教えてください。お願いします。
842 :
デフォルトの名無しさん :01/08/28 17:14 ID:u7V458JA
最大、最小値、中央値を出したいのですが、わかりません。 なにが足りないのでしょうか? 教えてください。 /*sk2-11 */ #include <stdio.h> main() { int score, i, j, n=0, data[100], work; do{ printf("%d件目のデータを入力してください。(終了時は-99999)",n+1); scanf("%d", &score); if(score!=-99999){ data[n++]=score; } }while(score!=-99999); for(i=0; i<n-1 ;i++){ for(j=i+1; j<n; j++){ if(data[i]<data[j]){ work=data[i]; data[i]=data[j]; data[j]=work; } }
844 :
デフォルトの名無しさん :01/08/28 17:55 ID:G/nWj5eY
>>833 再起呼び出しではだめですか?
#include <stdio.h>
#include <string.h>
char Moji[] = "abcdefghijklmnopqrstuvwxyz"; //26文字
void make_moji( int n, int depth, char * tMoji )
{
char ttMoji[32]; //最大31文字までとしよう
int i;
if(depth>n) {
tMoji[n] = '\0';
printf("%s\n", tMoji);
return;
}
strncpy(ttMoji, tMoji, depth);
for(i=0; i<26; i++) {
ttMoji[depth-1] = Moji[i];
make_moji(n, depth+1, ttMoji);
}
}
int main(int argc,char* argv[])
{
int n;
char tMoji[32]; //最大31文字までとしよう
n=10; //10文字としよう
tMoji[0] = '\0';
make_moji(n, 1, tMoji);
return 0;
}
でもこれってまさかスパムメール作成に使うんじゃないですよね?
>>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系文字コード以外への対応は宿題ということで…。
>>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;
}
> MS-DOSプロンプトて2kには無いんですよね? あります。コマンドプロンプトとよばれていますが...
> なにが足りないのでしょうか? > 教えてください。 こちらもいくつか質問をしたい、それによって回答するかしないかの判断を行う 問1:このソースは自分で考えたものですか? 問2:以下のアルゴリズムが行っている処理を一言で述べてください。 (あなたの提示したソースの下の部分です) > for(i=0; i<n-1 ;i++){ > for(j=i+1; j<n; j++){ > if(data[i]<data[j]){ > work=data[i]; > data[i]=data[j]; > data[j]=work; > } > } > }
849 :
デフォルトの名無しさん :01/08/28 18:42 ID:TagcTmmE
再帰を使った基数変換は終了条件にたどり着いてから 出力を開始すれば逆順にならないよ。 ゼロ埋め(このばあい 'a' 埋め)でちょっと美しくない処理を してるけど、↓を作ってみた。 #include <stdio.h> #include <math.h> void dec2nnn(int dec, int cardinal) { if((dec / cardinal) == 0) printf("%c", dec%cardinal + 'a'); else{ dec2nnn(dec/cardinal, cardinal); printf("%c", dec%cardinal + 'a'); } } void Create_Moji(int n) { int i, j, k, max; for(i=1; i<=n; i++){ printf("[%d文字] ", i); max = pow(26, i); for(j = 0; j<i; j++) printf("a"); printf(", "); for(j = 1; j < max; j++){ for(k=pow(26, i-1); j<=k-1; k=k/26) printf("a"); dec2nnn(j, 26); printf(", "); } printf("\n"); } } int main() { Create_Moji(3); return 0; }
>>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);
}
∩ ∧_∧ | | / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ( ´Д`)// < 先生達の事は絶対忘れません / / \_____________ みなさんありがとうございました。でも、どれもなかなか難しいですね。 ようやく、2,3個理解する事ができたような気がしてる最中です。 残りも含めてアルゴリズムを自分のものにしようと思います。
852 :
デフォルトの名無しさん :01/08/29 01:33 ID:SkRUP4ao
グレースケール(16Bit)のBMP画像を作りたいのですが、うまくいきません。 如何すればよいですか?
>>852 そんなことできるの?
パレット持ってないと駄目っぽい気がするけど。
>>852 16bitグレースケールなんてマニアックな仕様、まず使えるかどうか調べてから使え。
少なくともそんなもんサポートしてるビデオカードはほとんど無いと思われ。
855 :
852 :01/08/29 03:27 ID:SkRUP4ao
>>853 カラーテーブルは自分で指定しているのですが、使われていない見たいです。
(16bit以上では、普通はカラーテーブルを持たないらしいですね。)
>>854 ビデオカードは問題あるの?
UNIXのXウィンドウでは、綺麗にでました。
普通のビデオだとRGB(0,0,0)〜(255,255,255)相当になると思うけど 16bitグレースケールだと(65535,65535,65535)になるのか? 単純に考えると各カラー16bit対応のビデオが要りそう。 フルカラー相当だと48bit必要。って合ってるかこれ?
>>856 あってるとおもう。
>>855 のいうようにきれいにでたからといって、
ライブラリーの段階で下位8ビットは無視して上位8ビットだけ表示している可能性もあるので、
それが本当に16ビットで表示されているかどうかはハードに依存するはず。
858 :
852 :01/08/30 02:20 ID:.Z520LV6
>>857 さん、
あなたの言う通りだと思います。
たぶん、表示の際には、8bitに丸められていると思います。
医療用のならあるかもしれん、高いと思うが
>>859 医療用じゃなくてもフツーのSGIのマシンは12bit以上とかあるよ。
フルカラーなら8bitでも分からないけどモノクロでも12bitあれば
まぁ十分じゃないかな。
861 :
:01/08/30 23:52 ID:cl5gnins
C++って何て読むの?
862 :
デフォルトの名無しさん :01/08/30 23:54 ID:EkMPJ/Yg
?
しいぷらすぷらす
シープラプラ
865 :
デフォルトの名無しさん :01/08/31 01:44 ID:6a8y9j3k
1よりも read.c を ハックしまくってる #6411にでも聞け ヤツが書いた部分はかなり職人だと思ったり。
867 :
デフォルトの名無しさん :01/08/31 21:22 ID:7zNmzfnI
いつもお世話になっています。 頭爆発しそうです。質問させて頂きます。 ポインタへのポインターを動的に確保するには例えば char **NewStr = NULL; NewStr = (char**)malloc( sizeof(char**) *7 ); という具合にすればいいのでしょうか?なんか頭が混乱してしまって。 お願いします。
868 :
デフォルトの名無しさん :01/08/31 21:34 ID:7zNmzfnI
ひろゆきってこんなにクズな野郎とは思わなかった。
>>868 すいません誤爆です。しかも上げてしまった。
すいませんでした。
>>867 解決しました。ポインタのポインタになるとややこしくていけませんね。
お騒がせしてもうしわけありませんでした。
>> char **string_array = (char **)malloc( sizeof(char *) * 10); string_array[0] = "blah blah"; string_array[1] = "sigh sigh";
872 :
sage :01/08/31 23:45 ID:Rxk6Y1v6
↑つっこむべき?
>>872 別に問題はないね。エラーチェックは無いけど。
874 :
sage :01/09/01 00:21 ID:WPZOqF8E
ならいいや。 間違いではないし。うん
C++ ちんこぷらぷら
876 :
デフォルトの名無しさん :01/09/01 01:10 ID:LeyymvoY
ポインタへのポインタってややこしいですね。慣れるしかないのでしょうか? ポインタって[]のシンタックスシュガーとからむと死にそうになりますね。 例えば char **NewStr = NULL;; NewStr = (char**)malloc( sizeof(char*) * 7 ); *NewStr = (char*)malloc( sizeof( char ) * 256 ); *NewStr = "ABCDEFGHIJKLMNOPQRSTU"; printf( "%s\n" , &*NewStr[0] ); printf( "%s\n" , NewStr[0] ); printf( "%s\n" , *(NewStr + 0 ) ); printf( "%s\n" , &NewStr[0][0] ); で全部同じ表示しますよね。プロの皆さんってこうゆう場合でも すらすら読めるものでしょうか? 私は一生すらすら読めそうにない(T_T)
877 :
sage :01/09/01 01:14 ID:WPZOqF8E
↑ これもつっこまないでおくよ。あるいみ間違いでもないし。
>>877 つっこんで下さいよ。勉強になるし(T_T)
頭混乱しまくって死にそうです。
879 :
sage :01/09/01 01:32 ID:WPZOqF8E
>>878 char **NewStr = NULL;;
NewStr = (char**)malloc( sizeof(char*) * 7 );
*NewStr = (char*)malloc( sizeof( char ) * 256 );
printf("%x\n", *NewStr);/*(゜д゜)<ナンダコノヤロー*/
*NewStr = "ABCDEFGHIJKLMNOPQRSTU";
printf("%x\n", *NewStr);/*(゜д゜)<ミテンナヨ*/
printf( "%s\n" , &*NewStr[0] );
printf( "%s\n" , NewStr[0] );
printf( "%s\n" , *(NewStr + 0 ) );
printf( "%s\n" , &NewStr[0][0] );
とりあえずこれやっとけ。
で、じっくり考えとけ。
880 :
デフォルトの名無しさん :01/09/01 01:35 ID:LeyymvoY
>>879 ありがとうございます。がんばって、考えてみます。
パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人
パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好き パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人
>>876 > *NewStr = (char*)malloc( sizeof( char ) * 256 );
> *NewStr = "ABCDEFGHIJKLMNOPQRSTU";
本題と関係ないが、これだと *NewStr に割り当てたメモリがリーク
する。
strcpy(NewStr[0], "ABCD...");
パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人
なーんか、不気味だな。(w
変な目つきで静観してる連中は見ないことにしよう。
>>880 *NewStr = (char *)malloc...
*NewStr = "ABC...
下のところ、const char * なので少し注意したほうがいいです。
厳密にコンパイルすると警告がでます。そんなところで。
慣れれば大したことないよ。 がんばれっ。
886 :
デフォルトの名無しさん :01/09/01 01:57 ID:LeyymvoY
>>883 レスありがとうございます〜。そうなんですか。
うう 難しいですね。文字列リテラルはどこかに確保された
char型の配列で、式中では先頭ポインタに読み替えられるから
、、、、えっと、たしかに文字列を代入してることにはならないって
理解でいいのでしょうか????うう難しい。
ポインタまではいけそうだと思ったんですがポインタへのポインタ
になったとたん訳がわからなくなってしまいました。
こつとかあるのかな。とほほ。
887 :
パンティーはいたまま排便、好きな人 :01/09/01 01:57 ID:OK9pI4Co
パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人 パンティーはいたまま排便、好きな人
>>886 レスありがとうございます。がんばります!
ですが、今日のところは休みます。皆様、おやすみなさいです。
(char **)NewStr -----> (char *)の配列 を指す NewStr[0] はこの配列の 0 番目、型は char * NewStr[1] はこの配列の 1 番目、型は char * ... NewStr[0] = "ABCDEFG"; strcpy( NewStr[0], "ABCDEFG"); 上はすでにある文字列リテラル "ABCDEFG" のアドレスを代入 下はNewStr[0]の指すアドレスに "ABCDEFG" をコピー 動きがちがうのでちうい。 下は NewStr[0] が malloc などで使える領域を指していないと コアダンプします。
890 :
sage :01/09/01 02:23 ID:WPZOqF8E
>>886 その認識であってる。
ポインタの本質についてしっかり理解していこう。
ポインタへのポインタへのポインタ
>>889 -891 レスありがとうございます。
2次元配列は「配列の配列」と言うのをきちんと理解してない
のが混乱してた原因だったのかもです。
2次元配列が式中では「intの配列」へのポインタに読み替えられるという事が
アドレスをすべて表示する実験でやっとわかりました。
第一次元?のhoge[0][]はどこかに別のところにスタックを確保してるのだと誤解してました。
単に配列への先頭のポインタ?なんですね。
実験して気づいたのですが、hoge[3][3]の時、hoge[0][8];とかやっても要素にアクセス
できますね。やっちゃいけないんでしょうが(^_^;
893 :
デフォルトの名無しさん :01/09/01 16:35 ID:uXCDEcwM
2行2列の場合 hanya[1][0] == hanya[0][2] で、けっきょく同じことだったと思う。 別にアクセス違反じゃないので、大丈夫(だったと思う。) ちょっと変わったやり方だけど。
894 :
デフォルトの名無しさん :01/09/01 16:43 ID:uXCDEcwM
とりあえず入門書読んだがいまいち根本から 理解してない、とかもっとCを掘り下げたいって人は 「Cプログラミング専門過程」藤原博文 技術評論社 なんていいのではないかと。「Cプログラミング診断室」の著者 です。けっこうたたかれてるみたいだけど^^;。 入門書の次に読む本としてはなかなかだと思います。 メモリの動作を詳しく見ているので、ポインタとか理解深まる のではないかと。
895 :
894 :01/09/01 16:46 ID:uXCDEcwM
あ・・字間違っとる、スマソ 専門過程→専門課程
896 :
デフォルトの名無しさん :01/09/01 17:46 ID:MI8SfqKo
>>895 レスありがとうございます。
Cプログラミング診断室は熟読しました。面白いですね。
ネットで無料で読めるなんて驚きです。
「Cプログラミング専門課程」も興味あります。どんな本か知らなかった
のですが、そうですか。読んでみます。
叩かれてるってのが気になりますが、今の私では何で叩かれてるか
理解できないと思うのでいいかな。(笑)
897 :
デフォルトの名無しさん :01/09/01 18:24 ID:GmO3PIyE
プログラミング作法については、みなさん自分のやり方というのが あるので、その辺で衝突するのでしょうか。 C診断室に、たしか1つの関数の長さは60行ぐらいとか書いてあった と思いますが、60行という制限は短すぎるという人もちらほら。
>>897 なるほど。確か100行言ったら恥ずかしいと思えとか書いてましたね。
あのおかげで関数を短くして分けるくせはつきました。
899 :
デフォルトの名無しさん :01/09/01 22:08 ID:ddv07fY2
久々に思い出したよ。最長不倒関数(vv 関数が長いと確かに恥ずかしい。 が、漏れはプログラマやってること自体がそもそも恥ずかしいな。
>>897 1000行でももれなく把握できる、と断言できるなら1000行でもいいでしょ。
だけどそんな人は一握りしかいないし普通の人は馬鹿だから
60行程度に収めとけば馬鹿がメンテすることになっても
まあ大丈夫かなという目安かと。
901 :
デフォルトの名無しさん :01/09/01 22:27 ID:OpA/UgtQ
902 :
デフォルトの名無しさん :01/09/01 23:14 ID:23xXAcjE
903 :
デフォルトの名無しさん :01/09/01 23:46 ID:Fd.AZCp.
>>896 藤原本が叩かれるのは、基礎的な内容を大げさに書いているからだよ。
彼の本を遊びで読むのは良いが、それに信じ込まないようにね。
慣れたら多くの本や多くのコードを読みましょう。規格書も、デザイン本も
読んでみるといいよ。それなら井の中の蛙にならない。
>>902 私はCだと思ったけど、ネームスペースないし。
Cを勉強している者です。Cプログラミング診断室で
プリプロセッサのことが載っています。いい本がないって。
#誰の本の悪口言ってるのか分かりますが(^_^;
それで、プリプロセッサのノウハウを勉強することがいい本とか
ページとかないでしょうか?
グーグルとかで検索すればたくさんヒットしますが、自分自身
プリプロセッサのノウハウがないので、どれを参考にしたらいいのか
わかりません。
皆様、プリプロセッサを勉強するいい方法なり、書籍、ページなど
ご存知ないでしょうか。よろしくお願いします。
>>904 C++とか、Cでも今時のならプリプロに頼ることはほとんどないと思うけど。
デバッグしにくくなるだけだから素直にコード書いた方がいいよ。
907 :
デフォルトの名無しさん :01/09/02 00:44 ID:75FMiF1Y
>905-906 レスありがとうございます。 Q and Aって{「C言語Q&A」 工学社 竹田仰著 }のことですか? 検索したらそれっぽいのはこれくらいでした。 >906 たしかにデバッグがしんどいですね。それなら別に勉強しなくて いいのかな。
908 :
デフォルトの名無しさん :01/09/02 01:02 ID:XnpnvR/g
>>906 > C++とか、Cでも今時のならプリプロに頼ることはほとんどないと思うけど。
マクロを多用しすぎるのは問題だけど、マクロを使うとすっきり書けるコードも
あるよ。
MFC の IMPLEMENT_RUNTIMECLASS() とか ATL の MESSAGE_HANDLER() なんかは
マクロ使った方がマシな例。
910 :
デフォルトの名無しさん :01/09/02 07:05 ID:4iR.eRxY
K&R の演習1-6なんですけど getchar() != EOFという式の値が0か1であることを確認せよ. アンサーブックの方では #include <stdio.h> main() { int c; while(c = getchar() != EOF) printf("%d\n", c); printf("%d - at EOF\n", c); } ってなってて,最後のprintf("%d - at EOF\n", c);のat EOFの部分が謎なんですが どういう意味でしょう?atなんて文字は今まで見たことがないのですが. (c = getchar()) != EOF,が入力から受け取ったのをcに入れて,それがEOFじゃないなら云々. で,この c = getchar() != EOFが,優先順位が変わって,入力されたのがEOFであるかないかで真か偽が cに入ると思うのですけど,解答をみたら上記の通りでした. わかる人,いましたら解説してくださいませ.
911 :
sage :01/09/02 07:20 ID:PvZGbwyU
> c = getchar() != EOFが,優先順位が変わって,入力されたのが > EOFであるかないかで真か偽がcに入ると思うのですけど, これであってます。 c = (getchar() != EOF) と同じことで、真か偽がcに入ります。 それで c が0か1であることを printf で表示して確認している > ってなってて,最後のprintf("%d - at EOF\n", c);のat EOFの部分が謎なんですが > どういう意味でしょう?atなんて文字は今まで見たことがないのですが. 実際に実行すればわかると思うけど、- at EOF の部分は特殊文字でも無い。 英語でEOFで、ってこと。
912 :
デフォルトの名無しさん :01/09/02 08:13 ID:4iR.eRxY
910です. 3時間近くなんだろうなんだろうと考え込んでいましたが,自分はめちゃくちゃ ドキュソだったことがわかりました.... ""で囲まれているのだから (0か1) - at EOF って表示させているだけですね... 表示させられれば一瞬できずいたのかも知れませんが,EOFってキーボード からの入力はできないものでしょうか.
>>912 Control-D だよ(←これって環境依存だっけ?)
重ね重ねありがとうございます. Windows2000SP2のDOS窓を使っていて,Controlといろいろ同時押しを したらzキーで Press any Key to continue と終了時のメッセージが出てくれました.
915 :
sage :01/09/02 14:02 ID:O1AzBlvw
916 :
デフォルトの名無しさん :01/09/02 17:49 ID:YF/HkYq6
ポインタ変数自体の確保領域は何処ですか?ヒープですか? ヒープに取ったオブジェクト中でポインタを宣言したら、それの確保領域 は当然ヒープでしょうか?
>>916 場所による。Cには何も魔法はないよ。関数の中に書いたら他の変数と同じく
スタック上。ヒープというのは謎だが。
918 :
sage :01/09/02 18:40 ID:O1AzBlvw
>>916 ヒープでもいいし、静的領域でもいいし、スタックでもいいよ。
メモリ上にも取られないことあるしね。
二行目以降よくわからんが
宣言と定義、動的な確保の違いについてよく理解してないなら
一度、参考書を読み直すといいよ。
がんばれ
ポインタ変数だって普通の変数と一緒じゃないの? 宣言の仕方によってそれ相応の場所になるのでは? べつにポインタだからって特別な場所ってわけでもないし。
920 :
デフォルトの名無しさん :01/09/02 19:05 ID:YF/HkYq6
オブジェクトで宣言したポインタ変数は オブジェクトが消滅するのと同時に消えるのですか
922 :
sage :01/09/02 20:52 ID:O1AzBlvw
構造体と読み替えれば、意味は通じるけどな。 C++かもしれんな。 CだろうがC++だろうが同時に消えるよ。 だが、ポインタが示す先オブジェクトについては、 明示的にそういうプログラムを書かない限り、消えない。 C++の話しをするなら別スレにおいで。
923 :
デフォルトの名無しさん :01/09/02 22:01 ID:1arUuIGk
多次元配列の受け渡しについてなのですが #include <stdio.h> void func(int *a[4][5]){ printf("%d\n",a[3][1]); } int main(void) { int i[3][4][5]; i[2][3][1]=100; func(i[2]); printf("%d",i[2][3][1]); return 0; } このようなコードでも動作はするのですが 警告を出さないためにはどのように書けば良いのでしょうか?
> void func(int *a[4][5]){ < void func(int a[4][5]){
925 :
デフォルトの名無しさん :01/09/02 23:18 ID:.f0adP9o
void func(int *a[4][5]) ↓ void func(int (*a)[5])
926 :
デフォルトの名無しさん :01/09/02 23:21 ID:.f0adP9o
もしくは void func(int a[][5])
927 :
デフォルトの名無しさん :01/09/02 23:53 ID:1arUuIGk
おかげで正しく動作するようになりました。 ありがとうございます。 本を読んでも良くわからなかったので助かりました。
928 :
デフォルトの名無しさん :01/09/03 21:51 ID:eo6BxHkY
保存する最大数が不確定な場合のデータ保存ってどうしたらいいんですか? 何しろ最大数が不明なので、グローバルでint[10000];とかはやりたくないし・・・。 都合よく増えた分だけ拡張可能な領域確保は、どうしたら良いのでしょうか?
930 :
デフォルトの名無しさん :01/09/03 22:07 ID:H0Bpee16
char 型の配列に格納されている文字列 "Hikky" から " h "がひとつ、 " i "がひとつ、 " k "がふたつ、 " y "がひとつ、のように アルファベット毎の個数を数えたいんだけど、 なんかいい方法ありますか?
>>931 まぁ高速化はいろいろあるけど。基本は数えるんだな。
#include <stdio.h>
int n[256];
main()
{
char *p = "Hikky";
int i;
while (*p) {
n[*p++ & 0xff]++;
}
for (i = 0; i < 256; i++) {
if (n[i]) {
printf("%c: %d\n", i, n[i]);
}
}
return 0;
}
933 :
sage :01/09/03 22:29 ID:Lup6D7xc
static int hg[26+1] = {0,}; char *p = "Hikky"; while (*p) { if (isalpha(*p)) hg[toupper(*p)-'A']++; p++; }
934 :
sage :01/09/03 22:30 ID:Lup6D7xc
一行抜けた。うごくからいいか。
935 :
デフォルトの名無しさん :01/09/03 22:31 ID:VgjKZNGY
main(int argc,char *argv[])って言うのと・・・ main(int argc,char **argv)の意味の違いはなんですか?
>>932 -934
見た感じ、正直よくわかりませんが、解読してみます。ありがとうございました。
937 :
sage :01/09/03 22:37 ID:Lup6D7xc
938 :
名無の初心者 :01/09/03 22:41 ID:yeQeWlso
ある関数1(func1)をライブラリ化しようかと考えています。 そこで、その関数1に渡す引数の型や数を固定したいのです。 しかし、その関数1の中で使用する関数2(func2)の引数の数が、 ランダムであるため、関数1の引数の数が固定できずに困っています。 関数2はユーザが定義し、そのアドレスを関数1に渡しています。 具体的には void func1(void (*func2)(), int *a, int *b,....) { func2(a, b,.....); } void func2(int *a, int *b,.....(数はランダム)) { } main(){ func1(func2, a, b, .....); } func1の引数の型を固定したいのです。(他の対策法でも構いません。) なにかよい方法はないでしょうか。
939 :
デフォルトの名無しさん :01/09/03 22:44 ID:yPx0fR8.
struct { int hoge; char foo[0]; }; 配列の大きさが0の配列とはどういう意味があるのでしょうか?
940 :
sage :01/09/03 22:45 ID:Lup6D7xc
>>938 stdarg.h
を調べとけ。
VBで扱っているようなvariant型の仕組みもついでに調べとけ。
941 :
sage :01/09/03 22:46 ID:Lup6D7xc
>>939 参考書の可変長構造体の項を調べとけ。
載ってないなら、その本は焼いて捨ててヨシ。
>>940 さがしていたものがズバリ見つかりました。
本当に有難うございました。
今後のためにもvariant型というのも頭に入れておきます。
943 :
名無しの初心者 :01/09/04 01:25 ID:aYttRhdQ
938ですがもう一つ質問お願いします。 void func1(char *format, ...(可変数引数) { func2( ...)←ココに受け取った可変数引数をすべて渡すにはどうしたらいいでしょうか? } 具体的な取り出し方は void func1(char *format, ...){ va_list ap; char *p=format; int si; double sd; va_start(ap, format); while(*p){ switch(*p) { case 'd': si=va_arg(ap, int);break; case 'f': sd=va_arg(ap, double);brea; } p++; } va_end(ap); 呼び出し方は func1("ddfd", 3, 2, 6.4, -1); のように呼び出しています。
944 :
デフォルトの名無しさん :01/09/04 01:41 ID:acuYbFiA
Cでは、配列そのものを関数に渡すことはできない仕様になっている。 だから、いつも必ず、先頭要素へのポインタを渡して、配列本体にアクセスしてもらうしかない。 charへのポインタの配列を渡すには、 charへのポインタのポインタを渡すしかないということ。 それで、char **argcということになるんだが、 簡便的にchar *argc[]という表記法でもよいことになっている。 両者に実質的な違いはない。
945 :
944 :01/09/04 01:41 ID:acuYbFiA
946 :
sage :01/09/04 01:51 ID:VbosVW6E
>>943 func2を、書式を伝えるための引数+va_list 型引数を受け取るようにすればよい
vsprintfなんかの実装がそれだ。
void func2(char *format, va_list ap);
func1で引数の解析をせず、func2ですべて行うようにするのがポイントなんだが、
943のやろうとしてるfunc1とfunc2の役割によっては、そう行かないかもしれないね。
>>946 さん
またお返事ありがとうございました。
946さんのおっしゃるようにfunc2で解析するようにしてみます。
それでなんとか目的は達成できそうです。
ってちょっと難しそうですが・・・
946さんには心から感謝いたします。
#define _(a) a & a if (from < _(a) < to ) { : } こーゆー使い方ってダサい?
for(ever)を思い出す
>>949 僕お子様なんでそれ知らないんだけど、
#define ever ;;
てなことっすか? おもろいっす。
for(;_;) でワラタことがある
誰か次スレ立てろ
>>947 老婆心ながら一言言わせてもらうと、可変引数の関数の引数すべてを別の可変
引数に渡す一般な方法はない。
ただ、用途を限定すれば不可能ではない。
例えば
>>943 の例では、func1()の中で第1引数の長さを知ることで、その値が
実際の引数の数と違っていることはあるかもしれないが、一応幾つの引数が渡
されたかを別の手段で知ることができる。v[fs]printf()でもフォーマット引
数(%d, %sなど)の数を数えることで、引数の数を解決してる。別の方法として
は、必ず第2引数にfunc1()に渡した引数の数を指定させると言うのも一つの手。
ただ、これらはあくまで、個別のルールを作り込んでの可変引数の受け渡しな
ので、実際に渡している引数の数や型が違ったときに何が起こるかは分からな
いし、コンパイラも指摘してはくれないので十分注意のこと。
>>953 さん
可変引数の型(intやdouble)も渡さないといけないのでかなりややこしくなりそうです。
自分一人が使うには問題ないですが、他の人が使うことを考えると・・・
もっとよく考えてみます。
レスありがとうございました。老婆心でもうれしいです。
>>954 見た感じ数値型だけ渡せればよいようなので、
func2(double d[]);
にしちゃいなさい。
#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] ... のようにするにはどうしたらいいですか?
ごめんなさい新スレ逝ってきます
959 :
デフォルトの名無しさん :01/09/06 22:55
プログラミング言語 Cアンサー・ブック 第2版 ってどうなんですか? K&Rってかいてあるけど ANSI学びたい人でも買いですかね? あとこれがあったら プログラミング言語 第2版 本体はいらないっすか?
960 :
デフォルトの名無しさん :01/09/06 22:59
961 :
デフォルトの名無しさん :01/09/06 23:13
>>960 よく読んでないけど、アンサーブックってあれでしょ?
プログラミング言語Cにある問題の解答集でしょ?
だからプログラミング言語Cがなくちゃしゃーないっしょ
アンサーブックは別にいらない人もいるだろうし
962 :
デフォルトの名無しさん :01/09/06 23:13
963 :
デフォルトの名無しさん :01/09/09 15:17
合計体重と平均をもとめるのにwhileをつかえということなのでこう書いたのですが、No.1しかでないいんです それに、合計体重、平均体重までいかないんです。9999で終了するのですが・・・ なにがまちがってるのでしょうか? #include<stdio.h> #define MAX 1000 int main (void) { int i=0; int sum=0; int ary[MAX]; puts("整数を入力してください。"); while(i<MAX) { printf("No.%d:",i+1); scanf("%d",&ary[i]); if(ary[i]==9999) { i++; break; } sum+=ary[i+1]; } if(i>1) printf("合計体重は%dで平均体重は%.1fです。\n",sum,(double)sum/(i-1)); return(0); }
>>963 入出力と平均計算をごっちゃにするのは良くないよ
input()
output()
weight_average()
に分けて、もう一度作り直せ
965 :
デフォルトの名無しさん :01/09/09 15:31
>>964 レスありがとうございます。
エラー的なものがあればそれもききたいのですが・・。
まぁ3つに分けて作る方向でがんばりますね。
>>965 >sum+=ary[i+1];
ここがおかしい。
i の動きをよーく追ってみよう。
967 :
デフォルトの名無しさん :01/09/09 18:54
>>966 ありがとうございます
[i++]ですね。
おまけにscanf("%d",&ary[i]);の%dを%.1fにしたほうがいいですかね。
968 :
仕様書書かないさん :
01/09/13 00:18 >>957 struct test{
int *a, double *b;
};
keepで
tester.a=mallocの戻り
tester.b=mallocの戻り
すると
tester.a[i]
tester.b[i]
のようにアクセスできる。