07/08/06 23:28:56
int errsv = errno;
int i,j,k,t;
int No1,No2;
int Rs[3500][20],Hn[3500]={0};
double u,x,y;
double Odds[3500][20],Poll[3500][20],Poll_S[3500][20],Poll_T[3500][20];
FILE *fpr,*fpw;
printf("%d\n",errsv);
でもとくにないです。
BCCDeveloperの問題の気がしてきました。
レスどうもでした。
3:デフォルトの名無しさん
07/08/06 23:29:47
>>1乙!
何をしたら動かなくなったのかが知りたいな。
できればfopenとかの戻り値をチェックして欲しい。
ってか、ローカル変数でかいYO!って落ちじゃないよな?
4:デフォルトの名無しさん
07/08/06 23:45:20
>>987
Rs,Hn,Odds,Poll,Poll_S,Poll_T
を、まずmallocで確保しようぜ?
それでダメだったらまた来いよ。
5:デフォルトの名無しさん
07/08/06 23:54:22
URLリンク(www.freewebs.com)
6:デフォルトの名無しさん
07/08/07 00:00:50
>>前スレ986
> 従って、ヌルポインタはprintf()の引数として処理できない。
できるよ。
printf("%p\n", (void*)0);
7:デフォルトの名無しさん
07/08/07 00:38:42
printf("%p\n", NULL);
8:デフォルトの名無しさん
07/08/07 00:46:05
>>7 それ、らめぇ
9:デフォルトの名無しさん
07/08/07 00:51:41
NULL で思い出したんだけども C++ って NULL よりも 0 を使う方がいいの?
10:デフォルトの名無しさん
07/08/07 01:04:50
>>9
どちらとも言えない。 NULL 使うんなら対応するヘッダのインクルードを忘れずに。
あとは↓を見て自分なりの答えをどうぞ。
URLリンク(www.kouno.jp)
11:デフォルトの名無しさん
07/08/07 02:21:49
>>9
C++ では NULL は 0 と定義されているとは限らない。処理系定義。
だから、NULL と書いておけば、処理系によっては
int n = NULL;
と書いた時にエラーか警告を出してくれるかもしれない。
12:デフォルトの名無しさん
07/08/07 02:29:11
>>9
好みの問題だから、どっちでもいいよ。
13:デフォルトの名無しさん
07/08/07 02:49:37
>>11
エラーは出せない。
14:デフォルトの名無しさん
07/08/07 03:29:10
>>11
C でも同じだろ。
15:デフォルトの名無しさん
07/08/07 03:38:15
>>14
C は 0 か ((void*)0) だっしょ。
C++ は完全に処理系定義だったはず。
C99 で変わってたら知らんが。
16:デフォルトの名無しさん
07/08/07 03:52:07
あんまり仕様の隙間を縫うような考え方はしない方がいいよ
17:デフォルトの名無しさん
07/08/07 05:10:27
まーたNULLの話題かw
18:デフォルトの名無しさん
07/08/07 07:21:45
ポインタのみに適合するNULLをテンプレートで実装してみたけどどうよ、
って話を何年か前に見た記憶があるんだけど、どこで見たんだか思い出せない
19:デフォルトの名無しさん
07/08/07 07:42:53
ポインタのみに適合するNULLをテンプレートで実装してみたけどどうよ、
って話を何日か前に見た記憶があるんだけど、どこで見たんだか思い出せる
20:デフォルトの名無しさん
07/08/07 07:53:17
>>15
とりあえず、 C99 では処理系定義。
21:デフォルトの名無しさん
07/08/07 10:57:05
教えていただきたいことがあるのですが
BCC32にて、ユニットテストを行うコンソールアプリを製作してるのですが
下記のように関数[AssertEqueal]が呼ばれてた場合、
[AssertEqueal]内でソースファイル内での行数を取得することは可能なのでしょうか?
可能ならばその方法を教えていただきたいのですが
void main()
{
AssertEqueal( a , b );
}
22:デフォルトの名無しさん
07/08/07 11:10:59
__LINE__を使うとか
23:デフォルトの名無しさん
07/08/07 11:12:26
つ __LINE__
AssertEquealはマクロ関数で実装して。
24:デフォルトの名無しさん
07/08/07 12:13:37
>>22,23
ありがとうございます、無事実装できましたー
25:デフォルトの名無しさん
07/08/07 16:12:31
この調子だと __FILE__ も使ってなかったりしないよな。
26:デフォルトの名無しさん
07/08/07 16:25:03
なんすかそれ
27:デフォルトの名無しさん
07/08/07 16:32:41
__FILE__ と __LINE__ はセットだろー
ついでに文字列化演算子 # もな
28:デフォルトの名無しさん
07/08/07 16:44:14
そんなんあるんですか
29:デフォルトの名無しさん
07/08/07 16:56:31
つか、この分だと普通にassert()を知らないんじゃないか
30:デフォルトの名無しさん
07/08/07 17:17:36
assert知ってるけど使ってない
便利なもん?
31:デフォルトの名無しさん
07/08/07 17:29:21
それは知ってるって言わない
32:デフォルトの名無しさん
07/08/07 17:36:19
assert知らないけど使ってる
何するもん?
33:デフォルトの名無しさん
07/08/07 17:46:47
ちょっと自信ないから調べてきた
つまりは
assert( 条件 )
って風に書いて、この条件がfalseになったらそこで止めてくれるってことでよろしい?
でもリリースにするとどうなるの?勝手に何かに置き換わってくれる?
34:デフォルトの名無しさん
07/08/07 17:56:24
そんなん#ifdef _DEBUGとかでくるめばよかろう
35:デフォルトの名無しさん
07/08/07 18:01:18
assert は NDEBUG が #define されてるかどうかで中身が変わる。
NDEBUG が #define されていると assert は何もしない。
NDEBUG が #define されてなければ、条件が false だったら abort する。
36:デフォルトの名無しさん
07/08/07 18:02:07
横からサンクス
37:デフォルトの名無しさん
07/08/07 18:04:15
>>35
どうもありがとう
38:デフォルトの名無しさん
07/08/07 18:18:53
みんな、マニュアル読もうな
39:デフォルトの名無しさん
07/08/07 18:26:28
お前が一番読め
40:デフォルトの名無しさん
07/08/07 18:34:51
abort()ってUnixとかだとコアダンプを吐いて終了するのが普通だけど
Win+IDEとかで開発してるとデバッガが起動してくれたほうが何かと便利なので、
abort()ってあんま便利じゃない希ガス
my_abort() { char **nullpo = 0; *nullpo = "ガッ"; }
みたいなの作って、強引にSEGV起こしてデバッガ起動させたほうが便利かも
例外も、スローされた場所が分からないという意味では、微妙に役に立たない
面があるよね、C++だと
41:デフォルトの名無しさん
07/08/07 18:44:34
>40
マクロで__FILE__と__LINE__を引数に取る例外クラスを作ればいいかと思う。
前に適当に作ったんだけど実際に使ったことがないので使い勝手はなんともいえん
JavaのprintStackTraceみたいのがあればいいけどね
42:デフォルトの名無しさん
07/08/07 18:58:12
>>40
Visual Studioだと、assertも引っかかったときや
例外が投げられた時点でデバッガに移れるぞ。
スタックの状態はassertやthrow式の時点のものが見れる。
43:デフォルトの名無しさん
07/08/07 19:26:30
>>41
スタックトレース見れるとそうでないとでは随分違うよね。
>>42
ああ、そうだっけか。なら、同じかな。
SEGVだとデバッガがインストールされていない場合でもDr.ワトソン経由で
コアダンプが吐かれるのがいいかなとも思うけど。
44:デフォルトの名無しさん
07/08/07 19:34:57
>>41
struct pos_info {
const char* file;
int line;
pos_info(const char* file, int line) : file(file), line(line) { }
};
#define POS_INFO pos_info(__FILE__, __LINE__)
こいつを引数にとるとか。
45:デフォルトの名無しさん
07/08/07 19:51:12
gccだとバックトレース取れるみたいだな
URLリンク(0xcc.net)
移植性も糞もないがw
46:デフォルトの名無しさん
07/08/07 20:52:56
すれ違いかもしれませんが、行数の多いものをコンパイルすると一定以上の上部行数が
表示されないんですが、表示させる設定はあるのでしょうか?
47:デフォルトの名無しさん
07/08/07 20:54:46
意味がわからないが、moreをパイプとか
48:デフォルトの名無しさん
07/08/07 20:55:33
一定以上の上部行数って何のよ。エラーメッセージ?
環境は?
49:デフォルトの名無しさん
07/08/07 21:07:53
環境はwindowsXPでCPadとLSI C-86を使っています。
各ソートの詳細な動きを見たいんですが、エラーではないと思いますが
下のソースを実行すると0123485679から上が表示されないんです。
説明が下手ですいません。
50:デフォルトの名無しさん
07/08/07 21:09:31
printf("%d",rand())
51:デフォルトの名無しさん
07/08/07 21:09:33
このぺーじのを参考にしています。
URLリンク(www1.cts.ne.jp)
52:デフォルトの名無しさん
07/08/07 21:10:48
そのぺーじは参考にしてはいけません。
53:デフォルトの名無しさん
07/08/07 21:13:10
つーか今時LSI C-86か
VS2005 Expressとかがタダで使える時代に
54:デフォルトの名無しさん
07/08/07 21:24:55
原始人なんですいません
55:デフォルトの名無しさん
07/08/07 21:55:51
そこのソース酷いなww
何言ってるのか分からんが、ShowDataのところを以下に書き換えたらどうだ
void ShowData(int x[ ], int n)
{
int i;
for (i = 0; i < n ; i++)
printf("%d ", x[i]);
putchar('\n');
}
56:デフォルトの名無しさん
07/08/07 22:21:51
携帯から失礼します。
C言語の話なのですが同じ型の
二つの構造体をビット演算子で
比較することは不可能なのでしょうか。
職場でさっきやってみたら
コンパイルエラー。。。
57:デフォルトの名無しさん
07/08/07 22:27:15
別にwindowsでもバックトレースは取れるべ
URLリンク(www.codeguru.com)
58:デフォルトの名無しさん
07/08/07 22:28:19
ビット演算子で比較って何よ。
ビット演算子は比較するためのものではありません
59:デフォルトの名無しさん
07/08/07 22:34:16
なんだか、intならビット演算で比較ができるとでもいいたそうな56だなー
#そりゃ、算術演算も究極的にはビット演算だけどさ
60:デフォルトの名無しさん
07/08/07 22:39:59
アセンブリ言語的には TEST 命令があるから
ビット演算で比較というのもナシではないけどね。
61:デフォルトの名無しさん
07/08/07 22:46:35
>>46
LSI C-86は使ったことも無くESPしてみるけど、DOSコンパイルなの?
表示行が多くて、始めに出力した内容がDOS窓を上にスクロールしてもみえません。とか?
62:56
07/08/07 23:29:26
家についた>>56です。
少しスレを荒れさせてしまったようで申し訳ありません。
struct point {
int a;
int b;
・
・
・
int z;
};
思想としては上記のような型の2つの変数があった場合
メンバa同士で論理積(AND)演算を行う
メンバb同士を論理積(AND)演算を行う
・
・
・
メンバz同士を論理積(AND)演算を行う
という処理が冗長な感じがして
全く同じ構造体の型=全く同じビットパターンでは無いか?
ならば丸ごと論理積(AND)演算は実行できないだろうか?
と思った次第でございます。
63:デフォルトの名無しさん
07/08/07 23:32:35
地道に1個ずつやるしかない。
64:デフォルトの名無しさん
07/08/07 23:35:31
>>62
もしint aとかが1ビットしか使っていなければビットフィールドを使う手もある。
とはいっても、量によっては結局何行か必要になるわけだが・・・
65:デフォルトの名無しさん
07/08/07 23:36:39
void memand(void *a, const void *b, size_t n)
{
char *pa = a;
const char *pb = b;
size_t i;
for (i = 0; i < n; i++) {
*pa++ &= *pb++;
}
}
みたいなのを作って使うとか。
66:デフォルトの名無しさん
07/08/07 23:52:05
それでいいならmemcmpでいいだろ。
でも構造体にはパディングが入る可能性があるので
規格上は動作が保証されない。
やっぱメンバごとに比較するのがよいと思われ。
67:デフォルトの名無しさん
07/08/07 23:54:46
論理積? &&の方?、
left.a && left.aと
left.b && left.bと
...
それぞれの関係がわからない・・・
a-zまでをさらにまた&&で結合させるの?
68:56
07/08/08 00:15:37
56です。
>>67さん
論理積と書いてしまって混乱させてしまったようですが
ビットAND演算子(&)を想定しています。
構造体Aのメンバa-zは
フラグ(0x01 or 0x00)として意味を持ち
それに大して構造体Bで用意したメンバa-z(0x01 or 0x00)
を各メンバ同士ビットAND演算子(&)で演算を行って
フラグを残したり、落としたりという処理をしたかったりしてました。
69:デフォルトの名無しさん
07/08/08 00:19:07
一つの変数に複数のフラグを持たせるか、そういう関数作るが一番いいと思う。
70:56
07/08/08 00:20:19
56です。
思えば同じ型の構造体でも丸ごと代入は許されていない
ことを考えれば丸ごとビット演算もちょっと無理な話であることは
少々考えればわかることでした。。。
アドバイスくださった皆様どうもありがとうございました /平伏
71:デフォルトの名無しさん
07/08/08 00:23:55
bitset.hのような話?
72:デフォルトの名無しさん
07/08/08 00:31:10
>>70
>思えば同じ型の構造体でも丸ごと代入は許されていない
普通にできるけど。
--
struct {int a; int b;} a = {1, 2}, b;
b = a;
73:デフォルトの名無しさん
07/08/08 00:31:35
>>70
構造体丸ごとの代入は許されてるよん。
代入しか許されてないけど。
74:56
07/08/08 00:44:30
構造体丸ごとの代入
→ググッたら普通に出てきた。。。
無知で申し訳ないです
75:デフォルトの名無しさん
07/08/08 05:24:03
while (str != null) {
hoge
)
みたいな関数についてなんですが、
なんでstr != nullで動くんですか?
文字列の終わりはnullじゃなくて、¥0じゃないんですか?
nullは無効なメモリアドレスで、
¥0とは違う意味じゃないんですか?
76:デフォルトの名無しさん
07/08/08 05:37:27
違う意味だね。
だから、文字列の終わりを判定するコードじゃないんだろう。
77:デフォルトの名無しさん
07/08/08 05:45:48
>>75
strは文字配列へのポインタで、
まさにstrが無効なメモリアドレスでない間ループを回すコードじゃないのか?
strの型を確認してみるんだ。
78:デフォルトの名無しさん
07/08/08 07:07:03
もし
#define null '\0'
であれば、件のコードは
while (*str != null) {...}
のはずなので、ほぼ間違いなく「正しいコード」だろう。
ただ、nullではなくNULLだろうな。
79:デフォルトの名無しさん
07/08/08 08:34:24
>>76
>>77
>>78
わかりました!
80:デフォルトの名無しさん
07/08/08 09:04:05
在宅アルバイトならチャットレディがオススメ。
はっきり言ってこんなに楽で自由で高収入のアルバイトは
ありません。私も経験者ですので自信があります。
下記のサイトに詳しく説明してあります。
URLリンク(www2.atpages.jp)
81:デフォルトの名無しさん
07/08/08 09:28:53
36歳独身男性でも応募できますか?
82:デフォルトの名無しさん
07/08/08 10:33:24
86歳♀ですが応募できますか?
83:デフォルトの名無しさん
07/08/08 10:48:59
21歳独身男性結婚する気なしでも応募できますか?
84:デフォルトの名無しさん
07/08/08 13:25:12
>>81
見た目と声がレディなら、アソコはどうなっていても構いません。
>>82
86歳はルックスの面で少し厳しいと思いますが、
熟女の魅力と魅力的な声があれば大丈夫かと思います。
>>83
年は関係ありませんし、結婚願望はない方が好ましいですね。
ただし、見た目と声は(´∀`*)でないとダメです。
85:デフォルトの名無しさん
07/08/08 13:25:38
3チャイです。キリンさんが好きです、でもゾウさんの方がもぉっと好きで~す♪
86:DEFORTの名無し
07/08/08 20:27:50
ちょっと質問したいんだがどこかのサイトに無料のCのコンパイラないかな
知っている人がいたら教えて♪
87:DEFORTの名無し
07/08/08 20:30:16
これはスレちがい?
88:デフォルトの名無しさん
07/08/08 20:32:36
MinGWとかVisualC++2005ExpressEditionとか
89:デフォルトの名無しさん
07/08/08 20:49:29
gcc
90:デフォルトの名無しさん
07/08/08 20:51:20
OSくらい書こうや
WindowsXP?
91:デフォルトの名無しさん
07/08/08 21:05:57
>>86-87
あほすぎで笑うとこですよね?
92:デフォルトの名無しさん
07/08/08 21:14:13
DEFORT じゃなくて DEFAULT だよな
93:デフォルトの名無しさん
07/08/08 21:17:27
W
94:デフォルトの名無しさん
07/08/08 23:24:39
いくつかのC言語の初心者向けの書籍をいくつか読んで気になった事があるのですが、
%d や %s などの呼び方が書籍によって「変換指定子」や「変換仕様」と違い、
どんな条件で変わっているのか調べても判らず困っています。
これはどちらか間違っているのでしょうか?
95:デフォルトの名無しさん
07/08/08 23:29:51
「変換指定子」は d とか s とか変換方式を表す文字のみを指す。
「変換仕様」や「変換指定」は % で始まり「変換指定子」で終わる全体を表す。
96:デフォルトの名無しさん
07/08/08 23:34:13
>>94
あなたが間違っています。
97:デフォルトの名無しさん
07/08/08 23:35:23
OS:RHEL4
言語:C
やりたいこと:
#include <openssl/sha.h>
unsigned char *SHA1(const unsigned char *d, unsigned long n, unsigned char *md);
こいつを使いたい。
これって、.soに定義されてないの?/usr/lib/libssl.aにしかない?
EVP_xxxを使うべきなのか。。。
98:94
07/08/08 23:41:28
>>95
ありがとうございます、助かります。
99:デフォルトの名無しさん
07/08/08 23:48:46
>>97
URLリンク(www.ipa.go.jp)
100:デフォルトの名無しさん
07/08/08 23:54:48
>>99
情報アリガト。
でも、これってRFCで示されたSHA1の実装例ですよね?
RHEL4の標準ライブラリで実現できないかなーと思っているのです。
opensslコマンドや、sha1sumコマンドで実現できるのは分かっているのですが、
自プロセス内で、標準(?)関数を使ってSHA1のハッシュ値を得たいのです。
ワガママですみません。
101:97
07/08/08 23:57:40
追記。
libssl.aをリンクすれば良いのですが、
libgnutils-openssl.soとかあるので、共有ライブラリで何とかならんのかなーと。
102:デフォルトの名無しさん
07/08/09 00:03:41
わざわざ面倒なことしてライブラリ使わんでも、それコピって使えばいいと思うが・・・
こだわる理由がわからん。
103:デフォルトの名無しさん
07/08/09 00:04:36
ソースがでかくなるのやじゃないですか?
104:デフォルトの名無しさん
07/08/09 00:06:30
sha.h みつけた
URLリンク(mist.suenaga.cse.nagoya-u.ac.jp)
105:デフォルトの名無しさん
07/08/09 00:08:29
>>104
C++っすね。。。
ちなみに、偉大なるgoogle先生によると
URLリンク(www.google.co.jp)
この辺が出てくるのですが。。
106:デフォルトの名無しさん
07/08/09 00:10:05
>>103
1個のファイルに全プログラムを書いてるとか?
107:デフォルトの名無しさん
07/08/09 00:18:55
>>106
いえいえ。
もし既に標準ライブラリとしてRHEL4で提供しているのであれば、それを使った方が良いと思ってるのです。
javaでもメッセージダイジェストのクラスjava.security.MessageDigestがありますし。
できれば標準で提供されているものに乗っかりたいかなと。
Cとjavaではそもそも思想が違うと言われたらそうかも知れませんが。。。
108:デフォルトの名無しさん
07/08/09 00:23:16
変態!変態!変態!!
109:デフォルトの名無しさん
07/08/09 00:30:48
>>108
そう?
110:デフォルトの名無しさん
07/08/09 00:33:06
すみません、どなたか教えて頂けないでしょうか。
C言語で、以下のものを作成したのですが、
int *name[] = {
"satou",
"takahashi",
"suzuki",
};
この時に*name[]に入った配列の数を知るにはどうしたら良いでしょうか。
(上記の場合、自分では「それぞれの文字列の先頭のポインタが3つ入っている」という認識です)
111:デフォルトの名無しさん
07/08/09 00:33:42
sizeof name / sizeof name[0]
112:デフォルトの名無しさん
07/08/09 00:37:03
>>111
配列の数を知る事が出来ました。
ありがとうございます。
113:デフォルトの名無しさん
07/08/09 00:38:10
えっと、なぜint *?
char * name[] = { "hoge", "hogehoge", "hogehogehoge" };
sizeof ( name ) / sizeof ( char * )で3が得られる。
114:デフォルトの名無しさん
07/08/09 00:38:47
int *の配列なのが気になるが・・・
char *じゃ無くて?
[mona@fedora7 tmp]$ cat test.c
#include <stdio.h>
int main(int argc, char **argv){
int *name[] = {
"satou",
"takahashi",
"suzuki",
};
printf("%d\n", sizeof(name) / sizeof(int *));
return 0;
}
[mona@fedora7 tmp]$ gcc test.c
[mona@fedora7 tmp]$ ./a.out
3
115:デフォルトの名無しさん
07/08/09 00:39:46
みんな、簡単な問題だと思って、レスが早いよ!!
116:デフォルトの名無しさん
07/08/09 00:41:55
別スレに来たのかとおもた
117:110です
07/08/09 00:47:09
自分の認識ではname[]へは、
[satouへのポインタ]
[takahashiへのポインタ]
[suzukiへのポインタ]
…
でしたので、数が増えた場合の事を考えて、
int型で宣言した方が良いと思い、
int型で宣言しました。
この辺りが曖昧でして。申し訳ありません。
118:デフォルトの名無しさん
07/08/09 00:50:06
皆様突っ込みどうぞ
119:デフォルトの名無しさん
07/08/09 00:52:05
>>117
数がいくら増えようが、char *もint *も必要とするメモリは変わりない。
ってか、name[]に256を超えるポインタを格納することを考えてintにしたのか?
だとしたら激しく勘違いしているぞ。
120:100です
07/08/09 00:54:21
すみません、ソース見てみたらchar型で宣言してました。
int型に変更してコンパイルしてみたところ
大量のwarningが出ました。
(エラー内容:warning initialization incompatible pointer type)
お騒がせして申し訳ありません。
121:デフォルトの名無しさん
07/08/09 00:56:05
>>117
ポインタが指し示す値の型がintならint*を使うしcharならchar*を使う
指し示した先の型が表せる値の範囲は違ってもポインタ自体のサイズはint*でもchar*でも同じ
122:110です。
07/08/09 00:58:30
↑すみません>>120 = >>110です。
char型の配列を、
name[] ={...}内に入っている分を確保するという事で良いでしょうか。
123:デフォルトの名無しさん
07/08/09 00:59:34
"satoru"
は、文字列リテラルと呼ばれるものです。環境にもよりますが、
書き込み不可のメモリ領域に確保されます。
で、これはchar型の配列、末尾が'\0'として表現されています。
なので、
char *name[] = {"satoru", "takahashi"."suzuki"};
の意味は、
1.書き込み不可領域に確保されている"satoru"、"takahashi"、"suzuki"の3つの文字列リテラルがある。
2.要素数3、でchar型へのポインタの配列(name)がスタック(?)に確保され、各ポインタは、
1.の"satoru"、"takahashi"、"suzuki"それぞれの先頭の一文字のアドレスを指すように初期化される
です。
117はCにおける文字列の表現方法について基本が分かっていません。がんばってちょ。
基本を理解するのは意外と難しいです。
124:デフォルトの名無しさん
07/08/09 01:01:07
違う。char *を{...}の中にある要素数だけ配列として確保する。
だから、下の二つはnameで確保するメモリは同じ。
char * name[] = { "a", "b" };
char * name[] = { "aaaaaaaaaa", "bbbbbbbbbb" };
125:110です
07/08/09 01:15:45
皆様へ
丁寧なご説明ありがとうございます。
ずっとこの部分でエラーを吐いていて、
うまく動かず悩んでいたのですが、やっと動きました。
どうしてエラーが出ていたのかも理解できました(と思います…)。
ありがとうございました。
126:46
07/08/09 04:02:22
>>61書き込みを遅くなりまして申し訳ありませんでした。
>>始めに出力した内容がDOS窓を上にスクロールしてもみえません。とか?
そのとおりです。何か対処法がありましたらぜひ教えてくださいよろしくお願いします。
127:デフォルトの名無しさん
07/08/09 04:06:27
どんだけ~
128:デフォルトの名無しさん
07/08/09 07:55:37
>>126
所謂DOS窓を縦に引き伸ばしてみては如何でしょうか。
或いは、リダイレクトでファイルに落としてエディタで見るとか、
パイプラインでmoreに繋いで見るとか。
って、どう見ても言語ネタじゃないね。
129:デフォルトの名無しさん
07/08/09 11:02:45
>>97
うちのUbuntu系のLinuxには /usr/lib/libssl.so があるんだぜ。
130:デフォルトの名無しさん
07/08/09 11:34:48
>>126
ワロタwwプログラミング以前の問題だなw
131:デフォルトの名無しさん
07/08/09 13:18:07
左上のアイコン右クリック>規定値>レイアウト>画面バッファのサイズ>高さ を増やすとか
132:デフォルトの名無しさん
07/08/09 13:22:16
>>126
出力をテキストファイルにリダイレクトするとか
bcc32 -Etest.txt test.cpp > result.txt
133:デフォルトの名無しさん
07/08/09 16:49:44
ファイル入出力で質問です。
ファイル保存のダイアログを出して、適当なところに保存して
また別にfopen("test.txt", "w");
で保存すると、保存ダイアログが出てたフォルダに保存されてしまうのですが
これを、実行ファイルと同じフォルダに保存するようにしたいんですけど
どうすればいいでしょうか?
134:デフォルトの名無しさん
07/08/09 17:13:51
カレントディレクトリを実行ファイルのあるディレクトリにすればいいんじゃないの?
135:デフォルトの名無しさん
07/08/09 17:20:44
>>133
つまりユーザはダイアログで保存ディレクトリも含めて保存先を指定したのに
それを*無視*して実行ファイルと同じディレクトリに*無理やり*保存したい
ってこと?
ユーザ権限について調べてみるといいと思うよ
Unixは言うに及ばず、WindowsであってもVistaでは厳しくなったようだから
136:135
07/08/09 17:24:09
ああ、
> また別にfopen("test.txt", "w");
> で保存すると、
と書いてあるから、ユーザに指定させたのとは無関係に、プログラムが
勝手にこしらえるファイルの話か?
だったら、自分で実行ファイルのディレクトリを取得して、
フルパスで指定汁。カレントがどこだか分からないのだから。
とは言え、パーミッションには注意。Unixならもともとそういう設計は論外な。
137:デフォルトの名無しさん
07/08/09 17:27:59
>>134
>>135
アドバイスありがとうございます。
ダイアログで保存するものと、fopenで保存するものは別のものなんです。
ただダイアログを出さないで保存したいなと思いまして。
ただ単に、fopenのみのプログラムだと実行ファイルのところに保存できたのですが
ダイアログ→fopen の順序で実行したらダイアログで保存したフォルダに一緒に保存されてしまったんです。
カレントディレクトリを実行ファイルのあるディレクトリにすればいいとは思ったんですけど
やり方がわかりませんでした。
138:デフォルトの名無しさん
07/08/09 17:29:46
GetModuleFileName()でexeのファイル名を取れ
139:デフォルトの名無しさん
07/08/09 17:31:32
>>133
OFN_NOCHANGEDIR
140:デフォルトの名無しさん
07/08/09 17:32:31
int main(int argc, char *argv[])
ってやると、argv[0]に実行ファイル名が入るよ
141:デフォルトの名無しさん
07/08/09 17:37:02
>>140
この場合、そのことに何の意味が?
まさか、argv[0]に必ずフルパスが入っているなんて能天気なことを想像してたりしませんよね?
142:デフォルトの名無しさん
07/08/09 17:44:13
>>141
フルパスが入るようにコマンドラインを入力するんだよ
大丈夫か?
143:デフォルトの名無しさん
07/08/09 17:45:26
>>142
アプリの都合でアプリの存在するディレクトリにこしらえるファイルのために
何でユーザがアプリの起動方法を指図されなければならないのだろうか
144:133
07/08/09 17:48:56
みなさんありがとうございます。
>>139さん
のやり方で解決いたしました。
他にも色々な案を出してもらったので一つ一つ試していきたいと思います。
ありがとうございました!
145:デフォルトの名無しさん
07/08/09 17:49:28
argvやカレントディレクトリに仮定を置くのは糞デザイン
146:デフォルトの名無しさん
07/08/09 17:50:46
>>144
それじゃ、カレントがexeのディレクトリと同じじゃないと
意味無いよ。確実にexeが存在するのと同じ場所にファイルを作りたいなら
フルパス指定するしかない。
147:デフォルトの名無しさん
07/08/09 17:58:50
GetModuleFileName()でフルパスを得て
_splitpath()で分解して
sprintf()で結合とかどう?
148:デフォルトの名無しさん
07/08/09 18:09:56
ダメ
149:デフォルトの名無しさん
07/08/09 18:23:43
exeと同じフォルダに書き込もうとか思っていると、
VistaのUACではまるかも。
そこに至るまでの道のりは長いだろうけどね。
150:デフォルトの名無しさん
07/08/09 18:29:17
何をさも自分が苦労したからって
151:デフォルトの名無しさん
07/08/09 18:38:38
>>150
北極行くのに南極経由するような人なんだから触れてやるな
152:デフォルトの名無しさん
07/08/09 18:56:11
>>150
「さも」の使い方がおかしい
153:133
07/08/09 19:02:17
すいません。だめでしたね。
>>147
の様な処理で分解してstrcatで結合して
それっぽい動きになりました。
154:デフォルトの名無しさん
07/08/09 19:50:02
ファイルダイアログで選択して別ファイルに保存、、、
C#のスレでまったく同じ質問があったな、しかも同じ日
どっかの課題かなにかなのだろうか
155:デフォルトの名無しさん
07/08/09 19:51:14
ただのマルチだろ
156:デフォルトの名無しさん
07/08/09 20:16:59
いや、だって言語違うぜ?
157:デフォルトの名無しさん
07/08/09 20:17:54
右も左も分からないんだろう
158:デフォルトの名無しさん
07/08/09 20:21:21
うーん、向うはC#のソース出してたし
解決の仕方も解決した時刻も違うから
同じ人とは思えないなあ
質問者に種あかししてほしいとこだが
159:デフォルトの名無しさん
07/08/09 20:36:30
ファイルダイアログなんてよくある質問じゃん。
160:デフォルトの名無しさん
07/08/09 20:40:44
全部同じ奴だろ
161:デフォルトの名無しさん
07/08/09 23:17:50
包茎を短時間で修正するプログラムの
開発って難しいですか?
162:デフォルトの名無しさん
07/08/09 23:21:06
包茎と短時間と修正の定義次第
163:デフォルトの名無しさん
07/08/10 01:35:49
いつから配列の定義の要素数に変数が使えるようになったん?
99年から?
void func(int n){
int array[n];
:
}
とか。。。
164:デフォルトの名無しさん
07/08/10 01:36:20
C99 から
165:デフォルトの名無しさん
07/08/10 01:37:50
やぱり。即レスども。
個人的にはその仕様はうれしい。
166:デフォルトの名無しさん
07/08/10 01:44:37
>>165
ここを参考
URLリンク(seclan.dll.jp)
167:デフォルトの名無しさん
07/08/10 01:49:43
longjmpするとリークする可能性があるから、気をつけたまへ
168:デフォルトの名無しさん
07/08/10 08:39:01
C99とC/C++は互換性無いから別スレに分けた方がいいと思う。
169:デフォルトの名無しさん
07/08/10 08:51:48
可変引数マクロは非C99処理系にも是非輸入して欲しい
170:デフォルトの名無しさん
07/08/10 09:01:38
素直にC99使えば
171:デフォルトの名無しさん
07/08/10 09:01:53
>>168
C と C++ 用にそれぞれ専用スレがあるだろ。問題があれば誘導すればいい。
172:デフォルトの名無しさん
07/08/10 09:18:08
stringstreamに、ファイル(ifstream)の中身を書くよい方法はありますか?
とりあえず自分が考えた方法だと、
std::ifstream ifs(...);
std::stringstream ss;
while (!ifs.eof())
{
char buf[1024];
ifs.read(buf, 1024);
ss.write(buf, ifs.gcount());
}
こんな感じです。こんなことをする理由は、
ifstreamからstd::getlineをして1行ずつ処理するプログラムなのですが、
stringstreamに全部入れた後、std::getlineをした方が、倍以上高速になることを発見したからです。
それとも、もっと効率の良い方法はありますか?
173:デフォルトの名無しさん
07/08/10 09:25:09
>>172 ss << ifs.rdbuf();
174:デフォルトの名無しさん
07/08/10 10:44:50
ifstream ifs("dir_name");
if ( ifs.fail() ) { return 0; }
if ( ifs.isDirectory() ) { }
みたいに標準ライブラリだけで
ディレクトリか否かを判定することってでけますか?
あと、ディレクトリ内にある全ファイルの名前取得みたいなことは
標準ライブラリだけででけますか?
175:デフォルトの名無しさん
07/08/10 10:50:52
>>172
pubsetbuf()でバッファでかく取っとくと、一般には速くなると期待されるんだが、
gccの少なくとも古いバージョンでは、open済みのstreambufに
pubsetbuf()を実行しても、何食わぬ顔をして元のバッファを使うようだ。
mmap()したポインタをstrstreamにそのまま突っ込むのが多分一番速いが、
移植性に欠ける上にstrstreamがdeprecatedなのがネックだな。
stringstreamのstrメンバを使うとせっかくmmap()したものを
わざわざコピーしてしまうし、
stringstreamのpubsetbuf()も有効とは限らないようだ。
(少なくともVC++では平然とシカトされる)
>>173
それ記述が簡単でいいんだが、少なくとも
VC++のostream実装とかだと、大して速く無さそうなんだよな。
sgetc()/snextc()と、sputc()使って1文字ずつコピーしてるし
微妙に無駄の多いコードになってるんで、
下手すりゃ手書き1文字コピー回したしたほうがまだ速いかもしれん。
176:デフォルトの名無しさん
07/08/10 10:52:02
>>174
どっちもだめ
ディレクトリのないファイルシステムもあるんで、CやC++の標準は
ディレクトリがらみを一切扱っていないはず
177:デフォルトの名無しさん
07/08/10 10:57:35
>>168
C99はCであって、
互換性がないのはCとC++
178:漏れが書かなくてもきっと誰かが書く
07/08/10 10:58:24
>>176
そこでboostですよ。
179:デフォルトの名無しさん
07/08/10 11:12:01
>>178
無論そんなことは知っているが、>>174は「標準ライブラリだけ」と
2度も強調しているんだし、非標準の方法があることぐらいは知ってて
聞いてるんだろ
180:175
07/08/10 11:23:23
ごめんあほなこと書いた
> stringstreamのpubsetbuf()も有効とは限らない
そもそもpubsetbuf()を入力を食わせるのに使えるはずがないな
181:デフォルトの名無しさん
07/08/10 11:26:26
>>179
>178の名前欄。
つーか、>176はなんで「扱っていないはず」なんて曖昧なままにしておくのだろう。
調べれば直ぐに答が出ることなのに。
182:デフォルトの名無しさん
07/08/10 11:28:03
>>181
すまん、扱っていないことは知っている
理由のほうが推測だ
183:デフォルトの名無しさん
07/08/10 11:35:59
>>182
なるほど、それは失敬。そしてその推測は妥当だろう。
実際、CP/Mやtronにはディレクトリがない。
184:デフォルトの名無しさん
07/08/10 11:42:45
まぁ一方ではsignal()なんかが標準だし
わけわからんところもあるよな
185:デフォルトの名無しさん
07/08/10 11:50:07
大丈夫、signal()は内容が規定されていないから存在しない環境では何もしなければいいから。
186:174
07/08/10 11:53:44
>>176
レスありがとです。
標準ライブラリにディレクトリ絡みがまったくないのでおかしいなぁ
とは思ってたんですが、そんな理由があったとは。。
ソースを他環境に持ってたとき、すぐコンパイルできないとイヤだなと思って
できるだけ標準でやる方法を探してたんですが、
>>178さんの仰るとおり、こりゃおとなしくboost使っといたほうがいいですね。
187:デフォルトの名無しさん
07/08/10 12:06:28
なんだboost厨の自演か
188:デフォルトの名無しさん
07/08/10 12:09:27
やっぱりブーストがいちばんですね^^
189:デフォルトの名無しさん
07/08/10 12:31:53
char *p = "hogehoge";
の時
*(p++)
がさす値はoですか?
190:デフォルトの名無しさん
07/08/10 12:34:48
いいえ
*(p++) の値は 'h' になります
191:デフォルトの名無しさん
07/08/10 12:37:41
いいえ
*(p++) の値は 'g' にもなります
192:デフォルトの名無しさん
07/08/10 12:37:42
はい、トムはペンです
193:デフォルトの名無しさん
07/08/10 12:38:25
出力してみりゃ分かることだろうに。
2ch に書き込むより早く分かる。
194:デフォルトの名無しさん
07/08/10 12:44:01
*(++p) オヌヌメ
195:デフォルトの名無しさん
07/08/10 12:52:10
*next(p)
^^;;
196:デフォルトの名無しさん
07/08/10 12:53:03
>>189は
p が指す値と
式 *(p++) の値を混同してないか?
197:デフォルトの名無しさん
07/08/10 12:53:46
有り難うございます。
ちなみに
*pには何が代入されているんですか?
198:デフォルトの名無しさん
07/08/10 13:01:58
*pには何も代入されていないと思いますが。
199:デフォルトの名無しさん
07/08/10 13:02:37
夏・・・
200:デフォルトの名無しさん
07/08/10 13:09:34
最近は季節に関係なく年中馬鹿が湧く、と考えていたけど、
やっぱり長期休暇は頻度もスケールも一回り違うかな。
201:デフォルトの名無しさん
07/08/10 13:36:08
出力してみりゃわかることをうだうだと質問してからに・・・
202:デフォルトの名無しさん
07/08/10 15:01:04
ちょっとしつもんします
ギャルゲーとかで「フラグをたてる」ていうんですが
フラグというのはビットなんですか?
203:デフォルトの名無しさん
07/08/10 15:03:07
ビットなフラグはビットフラグ
ビットじゃないフラグも当然ある
204:デフォルトの名無しさん
07/08/10 15:07:07
「立てる」っていう表現をするようなフラグなら、
「立てる」か「倒す」かだからビットだろうなぁという気はする。
205:デフォルトの名無しさん
07/08/10 15:10:54
死亡フラグは立てるのに倒れてしまう件
206:デフォルトの名無しさん
07/08/10 15:22:38
私生活では全くフラグが立たない件について
207:デフォルトの名無しさん
07/08/10 15:26:46
>>204
boolは大抵intかcharで実装されている罠。
208:デフォルトの名無しさん
07/08/10 15:27:55
>>206
立ち過ぎてて困るから
1ビット分けてあげるぞ
209:デフォルトの名無しさん
07/08/10 19:04:06
cygwinまたはlinuxの環境下でコンパイラに追加依存ファイルの検索パスを与えようとしています
仮に追加依存ファイルのパスを~/xxx/includeとすれば
.bash_profileではexport CDPATH="$CDPATH":"~/xxx/include/"のようにして環境変数を設定し
シェル上でcd includeと打てばカレントパスが意図通りに変化するところまでは設定しています
ここから、このパス下にあるtest.hppを#include <test.hpp>のように指定しているファイル
~/main.cppを
コンパイルする目的で~/下でg++ main -I includeと打ったのですが
コンパイラからはtest.hppが見付からないというエラーが返ってきます
正しくはどのように指定するべきなのでしょうか?
210:デフォルトの名無しさん
07/08/10 19:13:01
CDPATH はその名前の通り cd コマンドにしか効かないんじゃない?
-I~/xxx/include
ってやれば?
211:デフォルトの名無しさん
07/08/10 19:15:55
CDPATHはcdに関係するだけでコンパイラには関係ないんじゃないか?
何がしたいのか良く分からないけど、普通に-I~/xxx/include/とか書くとか
ていうか、そもそも-Iの後ろにスペースあるのはOKだっけ?
212:デフォルトの名無しさん
07/08/10 19:39:34
なるほどフルパスで指定しないと駄目なんですね、あと' 'が入ってても駄目と
それら二点に気を付けて打てば通りました
助言ありがとうございました
213:デフォルトの名無しさん
07/08/10 19:45:54
>>212
相対パスでもいけるけど、「ソースがある場所からの」相対パスであることに注意
214:213
07/08/10 19:47:00
あ、-Iオプションで指定する場合はそうじゃないか?
すまん、俺自身あやふやになってきた。忘れてくれ
215:デフォルトの名無しさん
07/08/10 19:53:16
-Iオプションは相対パスでもいけるハズ。
たぶんコンパイラ実行時の作業ディレクトリかなんかからの相対パスになると思うけど・・・。
いつもmakefileコピペ改変でやっちまうから、俺も記憶があやふやだ・・・
216:デフォルトの名無しさん
07/08/10 20:29:01
相対パスでOK。
Makefileに-Ipathと書いておいて、ln -s どっかの/pathとかよくやる。
217:デフォルトの名無しさん
07/08/10 22:46:58
クラスの実際の型に応じた処理を簡単に書く方法はありますか?
例えば、基本クラス Hoge を継承するクラス Foo と Bar があるとして、
void func(const Hoge &hoge)
{
// hoge が Foo の時の処理
// hoge が Bar の時の処理
}
というのを簡潔に書きたいのですが。普通にdynamic_castを使って(ダウンキャストの例外呼ばれたくないのでポインタで)
{
if ((const Foo *p = dynamic_cast<const Foo *>(&hoge)) != NULL)
...;
else if ((const Bar *p = dynamic_cast<const Bar *>(&hoge)) != NULL)
...;
}
とやる方法と、try...catchの変な使い方で
{
try {
throw hoge;
} catch (const Foo &foo) {
...;
} catch (const Bar &bar) {
...;
}
}
っていうのも思いついたんですが、こんな書き方はしないですよね。実際はどういう書き方が普通でしょうか。
instanceofとかisとかC++にはないようなので。
218:デフォルトの名無しさん
07/08/10 22:50:17
そのクラスに virtual 関数を作ればいいんじゃないの?
instanceof は dynamic_cast
いちおう typeid もあるけど
219:デフォルトの名無しさん
07/08/10 22:52:33
>>217
funcをHogeの仮想関数にする(必要に応じて純粋仮想関数にする)。
そして、FooとBarがそれぞれオーバーライドする。
instanceofとかisとかがある言語でも、
そんな書き方よりこういう仮想関数でやる方法が普通だぞ。
220:デフォルトの名無しさん
07/08/10 23:00:22
>>217
void func(const Foo& foo);
void func(const Bar& bar);
...
221:デフォルトの名無しさん
07/08/11 00:26:58
Lisp じゃないから。
222:デフォルトの名無しさん
07/08/11 10:54:08
>>217
基底クラスが派生クラスの面倒までみるべきではないよ
223:デフォルトの名無しさん
07/08/11 13:04:07
>>222
funcはHogeのメンバ関数じゃ無い、とかそんな状況な気もする
224:デフォルトの名無しさん
07/08/11 13:54:38
func から Hoge の仮想関数呼べばいいだけだよ
225:デフォルトの名無しさん
07/08/11 16:49:10
あぁ、いや。
単に基底クラスに面倒見さそうとしてるわけじゃないんじゃない?というだけの話で。
226:デフォルトの名無しさん
07/08/11 18:31:47
その、try...catchの変な使い方、だが、結局投げてるのはHoge型だから
本当のクラスでは捕まえられない。
#include <stdio.h>
struct B{virtual ~B(){}};
struct D1:B{};
struct D2:B{};
int main(){
B *b = new D1;
try{ throw *b; }
catch( D1 &){ puts("D1"); }
catch( D2 &){ puts("D2"); }
catch( B & ){ puts("B"); }
}
227:デフォルトの名無しさん
07/08/11 20:52:01
ダブルディスパッチ使えばいいじゃん。
228:デフォルトの名無しさん
07/08/12 06:43:01
それなにぬねの
229:デフォルトの名無しさん
07/08/12 07:11:10
#include <stdio.h>
struct B { virtual ~B(){} virtual void Throw() { throw this; } };
struct D1 : public B { virtual void Throw() { throw *this; } };
struct D2 : public B { virtual void Throw() { throw *this; } };
int main(){
B *b = new D1;
try{ b->Throw(); }
catch( D1 &){ puts("D1"); }
catch( D2 &){ puts("D2"); }
catch( B & ){ puts("B"); }
}
230:デフォルトの名無しさん
07/08/12 08:44:07
#include <stdio.h>
struct B { virtual ~B(){} virtual void Func() { puts("B"); } };
struct D1 : public B { virtual void Func() { puts("D1"); } };
struct D2 : public B { virtual void Func() { puts("D2"); } };
ダントツでこれが一番いいんだけどなぁ
231:デフォルトの名無しさん
07/08/12 08:45:40
そりゃそうだ。
232:デフォルトの名無しさん
07/08/13 09:30:33
基本に戻るような質問
VC8Express (cl v14.00.50727.762 for 80x86)で、
void main(void){main();}
を、
cl /MD stackov.cpp
でコンパイルして実行しても、黙って落ちるだけで、_invoke_watsonされない
そういう例外って、なにかしらダイアログ出して落ちるものとばかり思っていたのに
昔からこんなでしたっけ、これってこういうもん?
233:デフォルトの名無しさん
07/08/13 10:19:39
スタックオーバーフローで落ちるだけじゃないの?
234:デフォルトの名無しさん
07/08/13 11:51:22
うん。まさに、スタックオーバーフローで落ち…
…たときに、アプリケーションエラーって出ないのが
デバッガから起動すれば、ちゃんと
Stack overflow - code c00000fd (first chance)
って捕捉されるんだけど…。
235:デフォルトの名無しさん
07/08/13 12:08:26
コンソールアプリだからじゃないのかな。
236:デフォルトの名無しさん
07/08/13 12:10:47
int ch = ' '
if (!isspace(ch) && !iscntrl(ch))
break;
という文なのですが、
何故かbreakされてしまいます。
chがスペースでないときかつchが制御文字でないとき
にbreakされるはずなのですが、条件式間違っているでしょうか?
237:デフォルトの名無しさん
07/08/13 12:14:01
gcc gdbではSIGSEGVでstack over flowにならんのだけど
検出する方法は別にあるんだろうな、あるんだろうね
238:デフォルトの名無しさん
07/08/13 12:26:17
>>236
動かない断片を提示されてもなんとも言えませんが。
症状を再現できる最低限のロジックを提示してみてください。
239:デフォルトの名無しさん
07/08/13 12:33:45
iscntrl()はロケールに依存するとされるし、
chか、iscntrl()の挙動が直感に反しているのでは
printf("%x: %d, %d\n",ch,isspace(ch),iscntrl(ch));
をifの前に置いてみては。
240:デフォルトの名無しさん
07/08/13 12:41:07
>>232
気になって試した
どうもスタックのサイズによるみたい
void main(void){
char cc[4096];
main();
}
とすればダイアログはでる。
(アセンブラ見ると、__chkstk の呼び出しが追加されてる)
ただし、VCのオプション的にはスタックサイズが4Kより小さいときでも、
/Gs0 とか付ければいけそうに思えるし、実際アセンブラリストに
__chkstk の名前でてるんだけどダイアログはでない。謎。
241:デフォルトの名無しさん
07/08/13 12:44:01
>>238,239
失礼です。
IDEでソースコードを読んでるんですが、動きが気になったので
static int
skip_space(void)
{
int ch ;
for (;;){
if ((ch = getc(stdin)) < 0)
return -1; /* end-of-file */
if (!isspace(ch) && !iscntrl(ch))
break;
}
return ch;
}
chに'¥t'や' 'を代入して/*if ((ch = getc(stdin)) < 0) return -1; */
として、ステップオーバーしていったのですが、
> if (!isspace(ch) && !iscntrl(ch))
の段階で止まってしまって、ブレイクしたのかなと思って。
242:デフォルトの名無しさん
07/08/13 12:50:44
誰か、エスパー頼む
243:デフォルトの名無しさん
07/08/13 13:42:25
>>241
関数名から推測して
static int skip_space(void)
を呼び出す上位関数に問題があるんじゃないか?例えば
int main(void) {
int ch;
for(;;) {
if(-1 == (ch = skip_space())) break;
putc(ch,stdout);
}
return 0;
}
とか。
244:デフォルトの名無しさん
07/08/13 14:16:01
ははぁ、成る程!
ちなみに (!isspace(ch) && !iscntrl(ch))
な文字コードってどんなのが当てはまりますかね?
245:デフォルトの名無しさん
07/08/13 14:38:10
>>244
空白文字でも制御文字でもない文字。
まぁ、大抵の可読文字が該当する罠。
246:デフォルトの名無しさん
07/08/13 16:49:05
すいませんわかりました。
自分馬鹿だorz
ほんと皆さん電波な質問して申し訳有りません
二徹して疲れたので寝ます
247:デフォルトの名無しさん
07/08/13 18:57:05
eclipse with CDTが生成したmakefile用の依存リストで
src/test.d src/test.o: ../src/test.cpp \
H:/root/usr/src/boost/boost/shared_ptr.hpp \
H:/root/usr/src/boost/boost/config.hpp \
248:247
07/08/13 19:03:44
(ミスして送信しちまったorz 続き)
の最初の行で
multiple target pattern stop
とmakeがエラーになるんですが、
これはどうすれば解決するんでしょうか?
test.dと.oのルールを同じ行で定義しているのが問題かと思ってわけてみたり
test.d(つまり自分自身)のルールを定義しているのが問題かた思ってtest.dを消してみましたが
解決しませんでした
249:デフォルトの名無しさん
07/08/13 19:48:51
インクルードパスにドライブ名が入ってるとだめらしい
C: とか H: とか
代わりに /cygdrive/c/ や /cygdrive/h/ を使うと大丈夫とかいうことらしい
250:247
07/08/13 20:15:55
>>249
そのようにしたらmakeのエラーは消えdebugができるようになりました
しかし今度は
Invalid project path: Include path not found (\cygdrive\\root\usr\src\boost)
のような警告がでてきましが、これなら実害ないので我慢します
助言ありがとうございました
251:デフォルトの名無しさん
07/08/14 06:40:57
char *parse( char *buff )
{
int c;
int at = 0;
while( (c = getchar()) != EOF ) {
if( isdigit( c ) ) {
buff[at++] = c;
} else if( isspace( c ) ) {
if( at == 0 ) {
continue;
} else {
buff[at] = '¥0';
return buff;
}
}
}
int main( void )
{
char buff[256];
int i;
for(i=0;i<256;i++)
buff[i] = 0;
char *s;
while( (s = parse( buff )) != NULL ) {
printf( "read %s¥n", s );
}
}
というプログラムなのですが、
これって¥0とNULLが同じってことですよね。
buffはただのchar型の配列のはずなのになぜ¥0がNULLになるんでしょうか?
char *buff[256]ならNULLで判定出来るのは理解出来るのですが。
252:デフォルトの名無しさん
07/08/14 07:26:45
NULLはヌルポインタ、\0はヌル文字
当然、ヌル終端文字列は後者を末尾に持つ
253:デフォルトの名無しさん
07/08/14 07:27:29
parse内のgetcharがEOFだった時、何を返すんだ?
思いっきりバグ、もしくはコピペミスだろ。
254:デフォルトの名無しさん
07/08/14 07:27:44
どこの\0とどこのNULLだ?
12行目の'\0'と24行目のNULLなら別物だし、
比較も代入もしていないが
255:デフォルトの名無しさん
07/08/14 07:37:24
parseからNULL返って来ないな
256:デフォルトの名無しさん
07/08/14 07:40:16
お前ら朝から優しいな
257:デフォルトの名無しさん
07/08/14 07:41:58
あーそうか、parseが切れてるのか。
{}が対応してないな。
258:デフォルトの名無しさん
07/08/14 07:54:20
朝から結構人がいてワロタw
259:デフォルトの名無しさん
07/08/14 08:15:31
こんな感じで隠れてる
(⌒─-⌒) EXILE!EXILE!
〃((´・ω・`)) ミ ○
((´・ω・`)) O((´・ω・`))
Oヽ( )〃ノO
∪⌒∪
""" "" " """ "" " """ "" " ""
260:デフォルトの名無しさん
07/08/14 09:55:22
亀ですが
>>240 ありです、それかもな感じ 何かがひらめいた予感 ちょっと調べてみます
>>235 ちなみに、WinMainでやってみても、なんもいわれんかったのです;
261:デフォルトの名無しさん
07/08/14 12:54:16
>>251
コンパイルできるソースをもってきてください。
それから処理系によって'\0'とNULLは同じじゃない。
#define NULL ((void *)0)
と定義してあったら違う型。
#define NULL 0
と定義してあったら同じ型として扱える。
'\0'は、int型の整数だから後者の処理系なら比較できてしまう。
~~~~~
しかし、もともとNULLはヌルポインタ(どこも指していないポインタ)を意味しているので
'\0'(整数)とNULL(ポインタ)の比較をしているソースは窓から放り投げろ。
推測だが、char *parse(char *buff)
の最後の方は、こんなふうになってるんだろう。
buff[at] = '\0';
return buff;
}
}
}
return NULL;
}
それから、buff[256]はスタックオーバーしていて不定な値だ。
*buff[256]なんてどこを指しているかわかりゃしない。NULLじゃない。
このプログラムは、文字数を判定していないから、'\0'を入れて256文字以上になると
スタックオーバーで動作は不定になる。うまく動いてもそれは運がいいだけ。
262:251
07/08/14 13:07:51
どうやってソースを窓から放り投げるんだ・・・?
263:デフォルトの名無しさん
07/08/14 13:12:15
ソースを窓から放り投げるを開始するには、まず窓を開けます。
264:デフォルトの名無しさん
07/08/14 13:12:43
バッファオーバーフローであってスタックオーバーフローとは(ry
265:デフォルトの名無しさん
07/08/14 13:21:55
なぜこれがコンパイルエラーになるのですか?
class A
{
public:
void hoge(int i) { MessageBox(NULL, _T("A"), _T("hoge(int)"), 0);}
virtual void hoge() = 0;
};
class B : public A
{
public:
void hoge() { MessageBox(NULL, _T("B"), _T("hoge()"), 0); }
};
int _tmain(int argc, TCHAR **argv)
{
B b;
b.hoge(1); // コンパイルエラー C2660
}
266:デフォルトの名無しさん
07/08/14 13:24:09
なんでそんなこともわからないのですか?
267:デフォルトの名無しさん
07/08/14 13:29:50
>>266
まぁそう言わんと。
>>265
EffectiveC++を読むことをお勧めしておきます。
268:デフォルトの名無しさん
07/08/14 13:47:53
>>266
初心者だからです。例えば、以下のJavaのソースはコンパイルが通るので、C++でも同様のことが可能かを考えています。
public class Test1 {
public static void main(String[] args) {
B b = new B();
b.hoge(1);
}
}
abstract class A {
public void hoge(int i) {System.out.println("A : hoge(int)");}
public abstract void hoge();
}
class B extends A {
public void hoge() {System.out.println("B : hoge()");}
}
>>267
このあたりですか?
URLリンク(www002.upp.so-net.ne.jp)
265のclass Aのhoge(int)はhogeImplのようにするこで解決できました。ありがとうございます。
269:デフォルトの名無しさん
07/08/14 14:09:57
>>265,268
hoge という名前の関数は B に 1 個あるので、それ以上辿って A まで探しには行かない
で、見つかった hoge() は引数が一致しないのでエラー
C++ と Java が一緒だと思ってるのが間違い
270:デフォルトの名無しさん
07/08/14 14:12:39
>>269
>hoge という名前の関数は B に 1 個あるので、それ以上辿って A まで探しには行かない
なるほど。すっきりしました。ありがとうございます。
271:デフォルトの名無しさん
07/08/14 16:26:39
wavファイルの再生について質問があります。
PlaySoundを使う方法は簡単にできたのですが、wavファイルを実行ファイルに組み込むことはできるのでしょうか?
できるなら、方法や資料を教えて頂けませんか?
宜しくお願いします。
272:デフォルトの名無しさん
07/08/14 16:44:38
とりあえずC/C++とは関係ない
273:デフォルトの名無しさん
07/08/14 16:46:19
実行ファイルの種類による
274:デフォルトの名無しさん
07/08/14 16:47:42
PlaySound リソース でぐぐれば?
275:271
07/08/14 17:15:30
PlaySoundでできるとは思っていませんでした。
本当に助かりました。ありがとうございます。
276:デフォルトの名無しさん
07/08/14 19:59:40
関数テンプレートの特殊化ってできないんですか?
もしできないのなら、いずれ出来るようになる見込はありますか?
template <typename T, typename U> void func(T&) {}
template <typename T> void func<T,int>(T& u) {}
error : partial specialization `Func<T, int>' of function template
277:デフォルトの名無しさん
07/08/14 20:24:53
>>268
そんなサイトあったのか、本買っちゃったよ
278:デフォルトの名無しさん
07/08/14 20:34:59
>>276
テンプレートパラメータの制限は関数とクラスで微妙に違う。
ただ、パラメータを常に指定するなら↓で同じことができるはず。
template <typename T, typename U> class func_object {
explicit func_object(T&) { ... }
};:
template <typename T> class func<T, int> {
explicit func_object(T& u) { ... }
};
使い方
func_object<A,B>(x);
func_object<C,int>(y);
279:デフォルトの名無しさん
07/08/14 20:44:54
>>277
そのサイトはヒント程度だぞ。何やら勘違いに近い記述も見られるし、本は読むべき。
280:デフォルトの名無しさん
07/08/14 20:56:11
>>276
関数テンプレートの場合、完全な特殊化はできるが部分特殊化は出来ない。
代わりに関数オーバーロードが使える。
281:276
07/08/14 21:48:52
やっぱ無理なんすか
テンプレート引数を汎用関数のtraitsとして利用したかったのですが…
変数の型を態々書くくらいなら関数オブジェクトとして作る方が良さそうですね
282:261
07/08/14 23:00:51
>>264
え?スタックオーバーフローなんて一言も言ってませんがなにか?
~~~~~~
283:デフォルトの名無しさん
07/08/15 03:27:58
>>282
コレは他人が装ってる釣りか?
ちょっと釣られて見ますよ
284:デフォルトの名無しさん
07/08/15 04:00:47
演算子の優先順位についての注意。インクリメント(++)/デクリメント(-- --)演算子と間接参照演算子(*) の優先順位は、間接参照の方が低い。だから、
while(1){
sub( *++p );
}
というコードは頻出するが、単独の文
*++p;
は間接参照の文が無意味である。(ポインタpをインクリメントした後で、ポインタが示す値を参照し、値を捨てる)
って言う文があるのですが、
「単独の文
*++p;
は間接参照の文が無意味である。」
ってどう意味なのでしょうか?
実例を挙げていただけないでしょうか。
285:デフォルトの名無しさん
07/08/15 04:12:51
>>284
間接参照演算子「*」
間接参照はポインタの先を「*」で参照すること。
int main(){
int a=10;
int *p=&a;
*p; /* <- この文意味ないべ? */
return 0;
}
286:デフォルトの名無しさん
07/08/15 05:07:32
ああ、そういう意味だったんですか。
分かりました。
自分、日本語読む力が無いなぁ。
287:デフォルトの名無しさん
07/08/15 05:31:19
>>284
これおかしいな。
ここで例としてあげるべきなのは *p++ であって *++p ではない。
そもそも * と 前置 ++/-- とは優先順位が同じだ。
288:デフォルトの名無しさん
07/08/15 07:12:56
>>284
内容がひどいのでさらしておこう。
URLリンク(www.nurs.or.jp)
289:デフォルトの名無しさん
07/08/15 08:09:10
>sub( *++p );
>というコードは頻出するが
こらこら、副作用があるコードを関数呼び出しで書いちゃ遺憾。
もしこのサイトにあるように頻出するとしたら、よっぽど腐った環境だ。
つーか、このサイト管理者、頭大丈夫か?
URLリンク(www.nurs.or.jp)
290:デフォルトの名無しさん
07/08/15 08:21:09
別に書いていいだろう。
未定義動作でもあるまいし。
コーディングスタイルの話としても、
宗教戦争になる程度のこうじゃないといけないとは言えない内容だな。
291:デフォルトの名無しさん
07/08/15 08:29:14
>>290
その「sub()がマクロだったら」と考えてみてくれ。
いつ仕様変更でそのようなことになっても大丈夫なように副作用を発生させないのは常識だ。
292:デフォルトの名無しさん
07/08/15 08:35:04
それだったら*++pではない場合にもいえてしまうんじゃないの?
マクロってなんなのかしらないけど
293:デフォルトの名無しさん
07/08/15 08:43:51
なんだ、ただのもの知らずか。たとえばこんなの。
#define sub(x) (x < 0 ? -x : x)
294:デフォルトの名無しさん
07/08/15 08:44:08
>>289
>こらこら、副作用があるコードを関数呼び出しで書いちゃ遺憾。
どいう意味?
295:デフォルトの名無しさん
07/08/15 08:56:22
>>293
なるほど、マクロって絶対値ってことか
296:デフォルトの名無しさん
07/08/15 08:58:23
そうだよ。でもここは君の居る所じゃないんだ。そろそろママの所に行っておいで
297:デフォルトの名無しさん
07/08/15 09:11:47
>>296
いや、違うでしょ?
298:デフォルトの名無しさん
07/08/15 09:12:45
>>297
そうだね。でもここは君の居る所じゃないんだ。そろそろママの所に行っておいで
299:デフォルトの名無しさん
07/08/15 09:14:25
初心者歓迎とかスレタイにあるのに何やってるの
300:デフォルトの名無しさん
07/08/15 09:21:19
>>299
そうだね。でもここは君の居る所じゃないんだ。そろそろママの所に行っておいで
301:デフォルトの名無しさん
07/08/15 09:27:40
恥ずかしいからってそんな連投しなくてもいいのに
302:デフォルトの名無しさん
07/08/15 09:30:09
あんああんあんああんあん
303:デフォルトの名無しさん
07/08/15 09:30:30
>>301
そうだね。でもここは君の居る所じゃないんだ。そろそろママの所に行っておいで
304:292
07/08/15 09:35:28
>>300,>>303
あなたの相手は僕でしょ?
305:デフォルトの名無しさん
07/08/15 09:36:37
>>304
そうだね。でもここは君の居る所じゃないんだ。そろそろママの所に行っておいで
306:292
07/08/15 09:38:05
マクロも知らなかった初心者に指摘されたのが悔しかったの?
プライドを傷つけてごめんね
307:デフォルトの名無しさん
07/08/15 09:42:16
マクロも知らない初心者の来る所じゃないんだ。
どれだけそいつに時間とレスを割く必要があるか分かるだろう?
そんなレベルの低い奴が来ると釣りかと思う。
308:292
07/08/15 09:45:23
>>307
マクロ知らないとは書き添えたけど質問したわけではありません
あなたの勇み足では?
309:デフォルトの名無しさん
07/08/15 09:49:39
>>306の言ってる指摘ってひょっとするとコレ?
>それだったら*++pではない場合にもいえてしまうんじゃないの?
いくらなんでもマジとは思えん(だから>>293もスルーしたんだろう)。
310:デフォルトの名無しさん
07/08/15 09:50:25
>>308
みんな馬鹿で、お前だけが正しいことを言ってる。
誰もお前の頭の良さについていけなくて、悔しさのあまり暴れてるだけなんだよ。
だからママの所に行っておいで。
311:デフォルトの名無しさん
07/08/15 09:52:13
>>307
>どれだけそいつに時間とレスを割く必要があるか分かるだろう?
って
>そうだね。でもここは君の居る所じゃないんだ。そろそろママの所に行っておいで
の事かwアホじゃね?
312:デフォルトの名無しさん
07/08/15 09:53:52
>>311
日本語でおk
313:デフォルトの名無しさん
07/08/15 09:53:59
>>311アホですね
314:292
07/08/15 09:55:13
>>309
>>293のこれだけのレスをみれば、意図的にスルーしているとはとても…
315:デフォルトの名無しさん
07/08/15 09:55:59
>>314
その辺が低脳。全て293のレスだと思ってやがる。
316:デフォルトの名無しさん
07/08/15 09:57:26
>>315
見苦しい言い訳
317:デフォルトの名無しさん
07/08/15 09:57:57
>>315
あああなたでしたかごめんなさいね
318:307
07/08/15 09:58:34
どうせ俺の事も>>293だと思って勇み足で回答したとでも言いたいんだろう?
マクロも知らない初心者の来る所じゃないんだと思っている奴が、
わざわざマクロも知らない初心者に答えるわけがないだろう。
319:292
07/08/15 09:58:49
>>317は僕です
しっかり名乗ります!
320:292
07/08/15 10:00:03
>>318
マクロくらいわかるよw
フィーリングでね
321:デフォルトの名無しさん
07/08/15 10:00:14
どう見ても292の方が見苦しい言い訳。
バカなんだからバカにされたくらいでレス繰り返さなくてもいいのに
322:デフォルトの名無しさん
07/08/15 10:01:24
>>320
フィーリングで分かるなら空気くらい読めるだろ?
323:デフォルトの名無しさん
07/08/15 10:02:59
>>295はうまい荒らしだったな
324:292
07/08/15 10:03:36
あ、ずっと安価間違ってた
>>291さんでした
325:デフォルトの名無しさん
07/08/15 10:03:55
>>318
初心者に答えるわけがない なんてレスの無駄だから偉そうに宣言しなくてもいいよw
答えないんじゃなくて答えられないんだろ
326:309
07/08/15 10:16:16
結局>>306の言ってる指摘ってのはコレな訳?
>それだったら*++pではない場合にもいえてしまうんじゃないの?
327:デフォルトの名無しさん
07/08/15 10:18:32
>>326
かもしれないけど、なにしろ何がどう「いえてしまう」のか
まるでわからん文章だからなぁ。
328:309
07/08/15 10:19:46
>>326
意味わからんよなー
329:309
07/08/15 10:23:07
>>326
多分、>>289から続く
>副作用があるコードを関数呼び出しで書いちゃ遺憾。
について言ってるんだと思う。
330:329=309
07/08/15 10:25:08
アンカーミス。>>327ね。
後、>>328誰だw
331:デフォルトの名無しさん
07/08/15 10:26:15
マクロに放り込むんだり引数の評価順に左右されるような場合はマズいけど
別にこのケースは何の問題も無いわな
スタイルとして自分がそう心がけているというだけの話なら
ご立派ですねで終わりだが
実にどうでもいい
332:292
07/08/15 10:26:21
適切な日本語ではなかったけど、脳の衰え始めている先輩方には難しかったかな?
むしろ適切であったとしてもまともにこたえる気はなさそうにおもえる
333:デフォルトの名無しさん
07/08/15 10:27:23
2chで煽るのだけが生き甲斐の厨房に
煽り返す厨房か
334:309
07/08/15 10:44:58
>>331
今は問題無いからいいって考えはどうかと思うぞ。後々の仕様変更に耐えられるコードを書く方がいい。
もっとも今回は副作用で問題が出るマクロにするのが一番悪いが。
>>332
>まともにこたえる気はなさそうにおもえる
何でそう思ったか知らんが結局質問は「副作用があるコードを関数呼び出しで書いちゃ遺憾って言ってるけど、それって*++pではない場合にもいえなくない?」って事か?
335:デフォルトの名無しさん
07/08/15 10:49:04
>>331
話題がループするが、sub()がマクロなら問題だからするべきではないという話だろ。
件のサイトではsub()が何か提示されていないのだから、問題がないとは言えない。
336:292
07/08/15 10:54:44
皆さんの話がかみ合ってないかもしれないので整理しましょう
*++pってなんですか?
337:デフォルトの名無しさん
07/08/15 11:00:13
>>335
マクロにsub()なんて名前をつけてるのならそっちのが問題じゃね
マクロは大文字で目立たせるのが基本だし
subはサブルーチンのサブだろう
ま、標準ライブラリの一部の関数はマクロで実装することも許されているけどな
338:デフォルトの名無しさん
07/08/15 11:13:27
>>336
死ね
339:デフォルトの名無しさん
07/08/15 11:32:32
すみません、教えてください。
C++でコンテナからイテレータを取り出すときに、iterator とconst_iterator とを
区別するのはどうやっているんでしょうか?
std::vector<>::iterator begin();
と
std::vector<>::const_iterator begin() cons;
のように、同じ関数でiterator を返したりconst_iterator を返したりしたいんですが、上手くいかない……
340:339
07/08/15 11:40:56
ごめん、忘れてください。超間抜けなこと聞いた。
暑くて頭がボケてたみたい……
341:デフォルトの名無しさん
07/08/15 11:42:17
while(1) sub( *++p );
で意味をなす単項subってどんなマクロ(関数)なんだろ
342:デフォルトの名無しさん
07/08/15 11:46:15
>>337
<*grep*>:319:crt/src/minmax.h:21:#define max(a,b) (((a) > (b)) ? (a) : (b))
<*grep*>:333:crt/src/stdlib.h:166:#define __max(a,b) (((a) > (b)) ? (a) : (b))
<*grep*>:340:crt/src/stdlib.h:472:#define max(a,b) (((a) > (b)) ? (a) : (b))
<*grep*>:342:crt/src/v2tov3.h:71:#define max(a,b) (((a) > (b)) ? (a) : (b))
<*grep*>:387:include/minmax.h:21:#define max(a,b) (((a) > (b)) ? (a) : (b))
<*grep*>:399:include/stdlib.h:146:#define __max(a,b) (((a) > (b)) ? (a) : (b))
<*grep*>:406:include/stdlib.h:424:#define max(a,b) (((a) > (b)) ? (a) : (b))
<*grep*>:603:PlatformSDK/Include/WinDef.h:177:#define max(a,b) (((a) > (b)) ? (a) : (b))
なるほど、標準ライブラリにないmax()系がこんなにあるとはM$は問題だらけだね。
343:デフォルトの名無しさん
07/08/15 11:48:41
>>341
きっとこんなのだよ。
#define sub(x) putchar(x)
344:デフォルトの名無しさん
07/08/15 12:04:17
>>342
そうだな。実際最悪だろ。
345:デフォルトの名無しさん
07/08/15 12:06:28
マクロは名前空間にもくるめないしなあ
346:デフォルトの名無しさん
07/08/15 12:08:02
>>342
実際、それが問題になることがあって、
min,maxを定義しないようにするための NOMINMAX というマクロが存在する
347:デフォルトの名無しさん
07/08/15 12:08:48
>>342
実際そのマクロの存在の為に、VC6の<algorithm>にはstd::max, std::minがない。
これはC++の移植性において、由々しき問題である。
348:デフォルトの名無しさん
07/08/15 12:10:11
まあVC6はそれ以前に色々ダメすぎだけどな
今となっては
349:デフォルトの名無しさん
07/08/15 12:10:29
>>342
Effective C++でも第1項でいきなり問題視してるじゃん。
350:デフォルトの名無しさん
07/08/15 12:41:16
Effective C++(笑)
351:デフォルトの名無しさん
07/08/15 12:50:00
質問です。
Windows Vista買ったら、Borland C++5.01のダイアログエデイタが正常に動作しません。
Xpマシンもありますがどうすればいいでしょうか?
1.プログラムはXpマシンで作成してコピーする。
2.ダイアログの部分だけXpマシンで作成してコピーする。
3.Vistaで動作する開発環境を買って移植する。
352:デフォルトの名無しさん
07/08/15 12:57:03
マルチ死ね
353:デフォルトの名無しさん
07/08/15 14:18:31
>>349
URLリンク(kamaitachi.blogdns.net)
これか。別にそんなに問題視はしてないように見えるが。
354:デフォルトの名無しさん
07/08/15 14:21:04
問題視しまくりじゃないか。
355:デフォルトの名無しさん
07/08/15 14:47:21
ここで言う「マクロと関数に名前の区別」というような点は問題視してない
356:デフォルトの名無しさん
07/08/15 14:56:09
確かに>337が指摘しているような「大文字ではない」ことについてはなんら言及されていないね。
357:デフォルトの名無しさん
07/08/15 15:01:51
>>349は>>342宛なんだから、「ここで言う」はmaxマクロに対応させないと。
358:デフォルトの名無しさん
07/08/15 15:14:41
なるほど。確かにそっちはそうだな。
359:デフォルトの名無しさん
07/08/15 18:25:13
今北産業。
>>284
> 「単独の文
> *++p;
> は間接参照の文が無意味である。」
> ってどう意味なのでしょうか?
> 実例を挙げていただけないでしょうか。
無意味でない例なら出せる。
volatile int* p;
とか宣言されていて、p が実はメモリマップド I/O
で読むだけでも意味がある場合がある。
>>293
> #define sub(x) (x < 0 ? -x : x)
sub(a+b) とかでおかしくなるから >>342 みたいに () 使おう。
360:デフォルトの名無しさん
07/08/15 18:29:58
>>359
p が volatile int* であっても
*++p; と書いて、pがdereferenceされることは保証されてないだろ。
361:デフォルトの名無しさん
07/08/15 19:14:24
>>360
すまん、よくわからんのだが「p が deference されることは保証されない」のは、特に
*++p;
に言える、と言ってる?それとも、
*p;
でも同様だと言ってる?
362:デフォルトの名無しさん
07/08/15 19:24:20
>>360
とりあえず volatile な *p; については
URLリンク(c0x.coding-guidelines.com)
の 1488-1489 辺りで「最適化で削除しちゃいかんよ」ってな事になってるが。
もっといえば
volatile int x;
x;
でも一緒。
363:デフォルトの名無しさん
07/08/15 20:19:08
更にいうと
const volatile int x;
x;
でも処理系は x の読み出しを削除してはいけないし、
x の値を何かに使う場合複数回の読み出しで同じ値だと仮定してもいけない。
この場合の const は「書き込めません」っていう意味だ。
364:デフォルトの名無しさん
07/08/16 07:37:42
char *p;
char *q;
p = "hoge" + 1;
q = "hoge"[1];
この場合pはoになることは正しいですよね。
pにはhのアドレスが代入される訳ですから。
んでqの場合は配列じゃないので、
char x[] = "hoge";
int r = x[1];
なら正しくrにはoが代入されますけれど、
q = "hoge"[1];とかいても警告は出ますし、
無意味な値が代入されるけれどもコンパイルはされてしまいます。
どうしてコンパイルエラーにならないんでしょうか?
365:デフォルトの名無しさん
07/08/16 07:55:01
"hoge" + 1
はポインタだが、
"hoge"[1]
はポインタではない。
366:デフォルトの名無しさん
07/08/16 08:01:25
それは分かるんですけれども、
なんでコンパイル出来るのか?
が疑問なんです。
367:デフォルトの名無しさん
07/08/16 08:04:43
>>364
char* p = 定数;
ならわかる?
368:デフォルトの名無しさん
07/08/16 08:13:50
>>366
>pにはhのアドレスが代入される訳ですから。
間違い。
369:デフォルトの名無しさん
07/08/16 08:20:38
>>364
C言語だと、整数からポインタへの代入は警告止まりになる。
C++ だとエラーになる。
370:デフォルトの名無しさん
07/08/16 08:38:00
>>367,369
char* p = 定数;
いや、もちろんポインタに数値をキャストしなくても
代入出来ることは知ってます。
q = "hoge"[1];
ってコンパイラはどういう風に解釈するんですか?
>>368
>pにはhのアドレスが代入される訳ですから。
え、じゃ文字列の先頭のアドレスで正しいですか?
371:デフォルトの名無しさん
07/08/16 08:42:22
>>370
"hoge"+1なんだから、当然'o'ヘのポインタだ。
372:デフォルトの名無しさん
07/08/16 08:43:32
>>370
hのアドレス=文字列の先頭のアドレス
代入は+1が行われたあとだろ?
だからすでにアドレスが変わってる
373:デフォルトの名無しさん
07/08/16 08:45:27
>>370
q = "hoge"[1];
と
static const char x[] = "hoge";
q = x[1];
は大体同じ。
374:デフォルトの名無しさん
07/08/16 08:59:29
>>372
すいません、勘違いしてました。
>>371,373
えっと自分が聞きたいのは、
char *q = "hoge"[1];
という文がなぜコンパイル出来るかってことなんです。
char q [] ="hoge";
char *p = "hoge";
はあきらかに違うのに
char *q = "hoge"[1];
がコンパイル出来るとまるでこの二つが同じように錯覚してしまって
間違いの元になるんじゃないかって思ったんです。
んで、そういう事が出来るのはきっと何か理由があるに違いないと思ったんです。
375:デフォルトの名無しさん
07/08/16 09:05:40
特に理由はない。
文法上問題がないから警告止まりでコンパイルされるだけ。
376:デフォルトの名無しさん
07/08/16 09:08:16
> char q [] ="hoge";
> char *p = "hoge";
> はあきらかに違うのに
> char *q = "hoge"[1];
> がコンパイル出来るとまるでこの二つが同じように錯覚してしまって
> 間違いの元になるんじゃないかって思ったんです。
なぜ二つが同じように錯覚するの?
377:デフォルトの名無しさん
07/08/16 09:27:30
>>375
ほんとだ。
char *x = "hoge";
p = x[1];
がコンパイル出来る。
x 0x85fd8
p 0x6f
pのアドレスってどこから出てきたんだろう?
378:デフォルトの名無しさん
07/08/16 09:28:33
>>374
= の右辺に書かれた T 型の文字リテラルは T 型の static 配列と同じです
= の右辺に書かれた T 型の配列は T 型の配列の先頭要素を指す「Tのポインタ型」になります
理由としてはっつーか便利だし~みたいな?
379:デフォルトの名無しさん
07/08/16 09:31:29
>>377
'o' に決まってるだろう。
380:デフォルトの名無しさん
07/08/16 09:36:05
>>377
m9(^Д^)プギャー
381:デフォルトの名無しさん
07/08/16 09:39:47
>>377
一応言っておくけど0x6fはアドレスじゃないよ
'o'に対応するアスキーコード
URLリンク(c-production.com)
382:デフォルトの名無しさん
07/08/16 10:00:58
qはそれ自身が配列であり、右辺の"hoge"はコンパイラに対する
初期化内容としてのみ解釈される。定数"hoge"は実行時には存在しない。
pの場合、実行時に定数"hoge"をメモリ上に用意して、そのポインタを利用する。
なので同じように見えても右辺の意味がまったく違う。
もともとqは以下のように記述すべきものだったんだろうけど、
char q[] = {'h', o'', g'', 'e', '\0'};
不便なので、利便性のために
char q[] = "hoge";
という書き方も受け入れるようになっただけ。
結果的にpとqの右辺が似ているけど、たまたま。
383:デフォルトの名無しさん
07/08/16 10:07:36
*p = "hooge"
p[] = "hooge"
は同じだろ
384:デフォルトの名無しさん
07/08/16 10:11:42
>>383
本気で言ってるのか
385:デフォルトの名無しさん
07/08/16 10:20:58
>>383
別物
386:デフォルトの名無しさん
07/08/16 10:44:01
>>383
どっちもセミコロンが無いからエラーになる→同じこと
ってオチは無しだぞw
387:デフォルトの名無しさん
07/08/16 10:49:20
>>383
>>364未満だな
388:デフォルトの名無しさん
07/08/16 10:49:57
型名もないしな
389:デフォルトの名無しさん
07/08/16 10:52:18
フフ
390:デフォルトの名無しさん
07/08/16 11:30:57
void foo() {
auto char *p = "hoge";
auto char p[] = "hoge";
…
}
とした時の挙動からして違うことは判るだろ
391:デフォルトの名無しさん
07/08/16 11:48:08
char p1[] = "hoge";
char *p2 = "hoge";
p1[1] = 'a';
p2[1] = 'a'; // <=
392:デフォルトの名無しさん
07/08/16 12:16:13
Perlの無名配列みたいに
{1000,100,10}[0] もいけたらいいのに
393:デフォルトの名無しさん
07/08/16 12:24:01
C99
#include <stdio.h>
#include <string.h>
int main() {
printf("%d\n", (int[]){1,3,5,7,9}[1]);
}
394:デフォルトの名無しさん
07/08/16 12:33:57
>>393
こんな事出来るんだ。
知らんかった。
395:デフォルトの名無しさん
07/08/16 12:49:24
>>393
うは、いけるんやwありがと
396:デフォルトの名無しさん
07/08/16 21:01:08
配列として認識されるのか…すげー
397:デフォルトの名無しさん
07/08/16 21:45:24
これでC99準拠のコンパイラがもっと増えてくれれば
398:768
07/08/16 22:36:05
C99、便利だけどC言語としてみるとキモい・・・
399:デフォルトの名無しさん
07/08/16 22:38:18
C++と同期とって進化してくれれば歓迎なんだけどな。
400:デフォルトの名無しさん
07/08/16 22:57:51
C99準拠のコンパイラって少ないの?
GCCしか使ってないから知らんのだけど。
401:デフォルトの名無しさん
07/08/16 23:02:56
>>400
Comeau
402:デフォルトの名無しさん
07/08/16 23:06:00
前使ってた Borland C++ 5.5.1 は C99 非準拠だったな.
403:デフォルトの名無しさん
07/08/16 23:06:01
ICC
404:デフォルトの名無しさん
07/08/16 23:20:10
VC++ のやつが無視しやがってるから広まらないのかな。
405:デフォルトの名無しさん
07/08/16 23:20:51
C99はDと同じ運命をたどればいいんだよ
406:デフォルトの名無しさん
07/08/16 23:22:13
VC++はC++コンパイラだからC99対応しないよ、ってMSの
中の人が言ったんだっけか。
407:デフォルトの名無しさん
07/08/16 23:29:51
確かにVC++8.0で試すと凄い勢いでエラー出るな
408:デフォルトの名無しさん
07/08/16 23:35:47
まあ、C99 使うくらいなら C++ 使うってのは確かだが
409:デフォルトの名無しさん
07/08/17 00:35:35
数式を画面に表示させるためのライブラリって無いでしょうか?
x^2みたいなのを、綺麗に表示するためのライブラリがほしいのです。
できれば、ソース公開している奴で、無ければソースは無くてもいいのですが
とにかく、アプリに組み込んで開発できる奴がいいです。
ちなみに、開発環境はVC++2005、WinXPProを想定しています。
動作環境も同様にXPProです。
よろしくお願いします。
410:デフォルトの名無しさん
07/08/17 04:48:29
>>409
ググっただけなんで、中身はシラネ。
URLリンク(www.vector.co.jp)
411:デフォルトの名無しさん
07/08/17 05:26:10
ビット演算がうまくなるコツってないですかね?
全く使いこなせてないので、
他人のソース読んでて、使いこなせていると凄く羨ましいんですけれど。
412:デフォルトの名無しさん
07/08/17 05:27:47
才能ないよ諦めた方がいい
413:デフォルトの名無しさん
07/08/17 05:37:52
コラー!
414:デフォルトの名無しさん
07/08/17 05:49:50
自虐し過ぎ
415:デフォルトの名無しさん
07/08/17 06:14:34
>>411
グラフィックまわりをいじって変な画面効果とか作るのが楽しいかも
上達が見てわかるし
416:デフォルトの名無しさん
07/08/17 08:06:25
>>411
エンディアンと変数型のバイト幅を意識すること。
算術シフトと論理シフトを意識すること。
コツっていうとこんぐらい?
フラグ的な使い方の話だったら、
必要になった時だけ使うのが良いんじゃないかなぁ。
417:デフォルトの名無しさん
07/08/17 08:08:28
>>411
論理演算、真理値表、2進数⇔16進数変換。
この辺のキーワードを調べ使いこなせるようになるとずっと違うと思うよ。
例えばこんなの。
a b c r
0 0 0 0
0 0 1 0
0 1 0 1
0 1 1 0
1 0 0 x
1 0 1 x
1 1 0 0
1 1 1 1
こいつからrを求める式を導き出せれば一歩前進。
418:デフォルトの名無しさん
07/08/17 09:16:08
皆さんアドバイス有り難うございます。
ビット演算は大事ですからね。
精進します。
>>417
グヌヌ。
難しいぞ。分かんないっす。
419:デフォルトの名無しさん
07/08/17 09:22:07
プッ ヘボすぎ
420:デフォルトの名無しさん
07/08/17 09:29:14
~(a^c)&b
こうですか?
421:デフォルトの名無しさん
07/08/17 10:04:58
タンクローリーを運転する人に見えたのは俺だけでいい。
422:デフォルトの名無しさん
07/08/17 11:18:41
int foo;
int bar;
bar = (unsigned int)foo & 0x0fffffff;
という事をしょっちゅうしているプログラムがあるんですけど、
どういう意図を持ってこの処理をしてるんでしょうか?
最初は、int型の変数をunsigned int型にキャストしてint型の変数に代入すると、
例えば-5が代入されてたら4294967291になるのかなぁと思ってたんですが、
そういう訳でもないみたいですし。
423:デフォルトの名無しさん
07/08/17 11:21:44
>>422
意図については、そのプログラムを書いた人に聞くのが一番!
あと、もう少し基礎を勉強したほうが良いよ
424:デフォルトの名無しさん
07/08/17 20:27:31
動的な配列を作る時は
int* a=(int*)malloc(sizeof(int)*10);
if(a==NULL)
みたいにしてポインタが有効かチェクしますよね?
二次元の配列を作る目的で
int** b=(int*)malloc(sizeof(int*)*10);
とやったら、この時も
if(b==NULL)
で、bが有効なポインタかどうか判断していいんですか?
425:デフォルトの名無しさん
07/08/17 20:31:19
はい
426:デフォルトの名無しさん
07/08/17 21:12:36
>>424
if(b==(void**)0)
427:デフォルトの名無しさん
07/08/17 22:36:27
>>424
#include<stdio.h>
#include<stdlib.h>
#define X_SIZE 15
#define Y_SIZE 10
int main(void){
int x, y;
int **b;
b=malloc(sizeof(int*)*Y_SIZE);
if(b==NULL) exit(1);
b[0]=malloc(sizeof(int)*X_SIZE*Y_SIZE);
if(b[0]==NULL) exit(1);
for(y=1;y<Y_SIZE;y++) b[y]=&b[0][y*X_SIZE];
for(y=0;y<Y_SIZE;y++)
for(x=0;x<X_SIZE;x++) b[y][x]=y*X_SIZE+x;
for(y=0;y<Y_SIZE;y++){
for(x=0;x<X_SIZE;x++) printf(" %3d", b[y][x]);
printf("\n");
}
free(b[0]);
free(b);
return 0;
}
428:デフォルトの名無しさん
07/08/17 23:01:35
>>426
キャストしたらダメだろ。
意味変わる。
429:デフォルトの名無しさん
07/08/17 23:07:24
>>420
それでもいいけど、(b&~c)^aの方がシンプルだろう。
430:デフォルトの名無しさん
07/08/18 01:15:04
a^b&~c ってなところか。
>>411
最低限の論理学の勉強をする。
ド・モルガンの法則とかは必須。
431:デフォルトの名無しさん
07/08/18 07:42:18
#define NULL (void*)0
だから
ポインタへのポインタが"NULL"かどうかは
(void**)0で調べないといけない
432:デフォルトの名無しさん
07/08/18 08:20:03
>#define NULL (void*)0
>だから
いいえ。
433:デフォルトの名無しさん
07/08/18 10:12:01
世界中のC言語を使える人のコンピューターに対する理解度の高さの平均と、
世界中のJavaを使える人のコンピューターに対する理解度の高さの平均は、
どっちが高いですか?
434:デフォルトの名無しさん
07/08/18 10:16:53
マルチ死ね
435:デフォルトの名無しさん
07/08/18 10:18:08
>>433
スレ違い
436:DEFORTの名無し
07/08/18 13:41:52
ひさしぶりぶり
MinGWつかってみたけど微妙
437:デフォルトの名無しさん
07/08/18 13:47:02
またお前か
438:デフォルトの名無しさん
07/08/18 14:28:50
>>422
0x0fffffff でマスクってことは、下位28ビットが欲しいってだけじゃね。
あと、unsigned int へのキャストは無駄だな。
439:デフォルトの名無しさん
07/08/18 15:32:58
>>431
どこからそんなデマを仕入れてきた?
440:デフォルトの名無しさん
07/08/18 16:02:21
脳内
441:デフォルトの名無しさん
07/08/18 16:06:10
新聞
442:デフォルトの名無しさん
07/08/18 20:10:13
ある特定のウィンドウがアクティブになった時に、そのウィンドウのメニュー内の
特定のコマンドを実行するようにしたいのですが、どのよう記述したら良いでしょうか?
具体的にはXSIとゆう3DCGソフトの「アニメーションエディタ/編集/オリジナルコマンド」
を自動実行させたいのですが、、、
宜しくお願いします。
443:デフォルトの名無しさん
07/08/18 20:13:48
C/C++じゃなくてスクリプトで書けば?
444:デフォルトの名無しさん
07/08/18 20:16:44
C/C++の勉強すれば分かるよ
445:デフォルトの名無しさん
07/08/19 00:24:05
WSHとかの領域になるんかな?あっちの詳細を全部知ってるわけではないけれども
446:デフォルトの名無しさん
07/08/19 00:43:34
new int[n]; ← このnのところは、何の型で渡すのか決められてますか?
intとかlongとか(負数はあり得ないので、unsignedでしょうか)
あと、Windowsの32ビット環境では、intとlongはまったく同じ型として扱っても問題ないですか?
447:デフォルトの名無しさん
07/08/19 00:45:47
>>442
ウィンドウメニュー内の特定のメニュー項目が選択されたときって、
たぶん、WM_COMMANDとかのウィンドウメッセージが飛ぶと思うんだけど、
その具体的なパラメタを調べて、アクティブとかのイベント関係なく
直接呼んじゃだめなの?
もし、アクティブになると同時って条件をつけたいなら、
1)ウィンドウをアクティブにする
2)ウィンドウメッセージを送信する
っていうだけの簡単なプログラムを作るとか。
448:デフォルトの名無しさん
07/08/19 01:13:18
>>446
特定の型には決まっていない。整数ならいい。
負の数になったら未定義動作。
int と long は違う型です。
449:デフォルトの名無しさん
07/08/19 01:30:05
スレリンク(musicjf板:72番)
おもしろいIDでた
450:デフォルトの名無しさん
07/08/19 01:32:34
わざわざ他板のを持ってこなくてもいいんだよ
451:デフォルトの名無しさん
07/08/19 01:34:41
>>448,446
>特定の型には決まっていない。整数ならいい。
C++の言語仕様の詳細は知らないけど、VCならsize_tでいいんじゃね
URLリンク(msdn2.microsoft.com)(VS.80).aspx
URLリンク(msdn2.microsoft.com)
>int と long は違う型です。
これもVC(x86)の範囲内で同じようにつかえるかって質問なら、問題ないと思うけど
URLリンク(msdn2.microsoft.com)
452:デフォルトの名無しさん
07/08/19 01:36:23
>>450
この板ID無いが。
453:デフォルトの名無しさん
07/08/19 01:57:33
>>451
operator new 関数の第1引数は VC に限らず size_t 。
でもそれと new 式の配列要素数を表す式の型とは別。
サイズが同じだろうがなんだろうが int と long は違う型。
まったく同じ型として扱うのには問題がある。
454:デフォルトの名無しさん
07/08/19 03:13:14
>>453
ごめん、1点分からないので、教えていただきたい。
とりあえず、>>446はVCの利用上(実装上)の制限が知りたいんじゃないの、
と思ったので、その観点だけで書いたのは自分の思い込みで、それで意見が
すれ違うのは仕方ないんだけど、
>特定の型には決まっていない。整数ならいい。
>でもそれと new 式の配列要素数を表す式の型とは別。
の箇所。
そうはいっても、ソースをコンパイルしてバイナリに落とす以上、コンパイラ定義かも
しれないけど、具体的な値の有効範囲ってかならずあるんじゃないの?
実際、MSDNの配列定義のサイズ指定の箇所では
0以上の整数型、ただしMicrosoft仕様では... としてsize_tに言及してるわけだし。
それにoperator new 関数の第1引数がsize_tに決まってるなら、size_t以上の値を
記述して受け入れてくれるコンパイラがありそうにないので、
その意味でも「整数ならいい」ってのはあいまいな感じがする。
なので、「整数ならいい」ってのは純粋に言語仕様の話として語っているのか、
それとも、コンパイラの実装やソース記述上の制限を語る場合でも同じ回答
になるのか、気になって眠れなくなりそうなんで、正確なところが知りたいんだけど。