【初心者歓迎】C/C++室 Ver.41【環境依存OK】 at TECH
[2ch|▼Menu]
1:デフォルトの名無しさん
07/08/06 23:26:08
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.40【環境依存OK】
スレリンク(tech板)
【アップローダー】(質問が長い時はココ使うと便利)
URLリンク(kansai2channeler.hp.infoseek.co.jp)

2:987
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
動かない断片を提示されてもなんとも言えませんが。
症状を再現できる最低限のロジックを提示してみてください。


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4988日前に更新/231 KB
担当:undef