【初心者歓迎】C/C++室 Ver.41【環境依存OK】
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2007/08/06(月) 23:26:08ただしその場合、質問者は必ず、環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.40【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1184717430/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0002987
2007/08/06(月) 23:28:56int 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の問題の気がしてきました。
レスどうもでした。
0003デフォルトの名無しさん
2007/08/06(月) 23:29:47何をしたら動かなくなったのかが知りたいな。
できればfopenとかの戻り値をチェックして欲しい。
ってか、ローカル変数でかいYO!って落ちじゃないよな?
0004デフォルトの名無しさん
2007/08/06(月) 23:45:20Rs,Hn,Odds,Poll,Poll_S,Poll_T
を、まずmallocで確保しようぜ?
それでダメだったらまた来いよ。
0005デフォルトの名無しさん
2007/08/06(月) 23:54:220006デフォルトの名無しさん
2007/08/07(火) 00:00:50> 従って、ヌルポインタはprintf()の引数として処理できない。
できるよ。
printf("%p\n", (void*)0);
0007デフォルトの名無しさん
2007/08/07(火) 00:38:420008デフォルトの名無しさん
2007/08/07(火) 00:46:050009デフォルトの名無しさん
2007/08/07(火) 00:51:410010デフォルトの名無しさん
2007/08/07(火) 01:04:50どちらとも言えない。 NULL 使うんなら対応するヘッダのインクルードを忘れずに。
あとは↓を見て自分なりの答えをどうぞ。
http://www.kouno.jp/home/c_faq/c5.html
0011デフォルトの名無しさん
2007/08/07(火) 02:21:49C++ では NULL は 0 と定義されているとは限らない。処理系定義。
だから、NULL と書いておけば、処理系によっては
int n = NULL;
と書いた時にエラーか警告を出してくれるかもしれない。
0012デフォルトの名無しさん
2007/08/07(火) 02:29:11好みの問題だから、どっちでもいいよ。
0013デフォルトの名無しさん
2007/08/07(火) 02:49:37エラーは出せない。
0014デフォルトの名無しさん
2007/08/07(火) 03:29:10C でも同じだろ。
0015デフォルトの名無しさん
2007/08/07(火) 03:38:15C は 0 か ((void*)0) だっしょ。
C++ は完全に処理系定義だったはず。
C99 で変わってたら知らんが。
0016デフォルトの名無しさん
2007/08/07(火) 03:52:070017デフォルトの名無しさん
2007/08/07(火) 05:10:270018デフォルトの名無しさん
2007/08/07(火) 07:21:45って話を何年か前に見た記憶があるんだけど、どこで見たんだか思い出せない
0019デフォルトの名無しさん
2007/08/07(火) 07:42:53って話を何日か前に見た記憶があるんだけど、どこで見たんだか思い出せる
0020デフォルトの名無しさん
2007/08/07(火) 07:53:17とりあえず、 C99 では処理系定義。
0021デフォルトの名無しさん
2007/08/07(火) 10:57:05BCC32にて、ユニットテストを行うコンソールアプリを製作してるのですが
下記のように関数[AssertEqueal]が呼ばれてた場合、
[AssertEqueal]内でソースファイル内での行数を取得することは可能なのでしょうか?
可能ならばその方法を教えていただきたいのですが
void main()
{
AssertEqueal( a , b );
}
0022デフォルトの名無しさん
2007/08/07(火) 11:10:590023デフォルトの名無しさん
2007/08/07(火) 11:12:26AssertEquealはマクロ関数で実装して。
0024デフォルトの名無しさん
2007/08/07(火) 12:13:37ありがとうございます、無事実装できましたー
0025デフォルトの名無しさん
2007/08/07(火) 16:12:310026デフォルトの名無しさん
2007/08/07(火) 16:25:030027デフォルトの名無しさん
2007/08/07(火) 16:32:41ついでに文字列化演算子 # もな
0028デフォルトの名無しさん
2007/08/07(火) 16:44:140029デフォルトの名無しさん
2007/08/07(火) 16:56:310030デフォルトの名無しさん
2007/08/07(火) 17:17:36便利なもん?
0031デフォルトの名無しさん
2007/08/07(火) 17:29:210032デフォルトの名無しさん
2007/08/07(火) 17:36:19何するもん?
0033デフォルトの名無しさん
2007/08/07(火) 17:46:47つまりは
assert( 条件 )
って風に書いて、この条件がfalseになったらそこで止めてくれるってことでよろしい?
でもリリースにするとどうなるの?勝手に何かに置き換わってくれる?
0034デフォルトの名無しさん
2007/08/07(火) 17:56:240035デフォルトの名無しさん
2007/08/07(火) 18:01:18NDEBUG が #define されていると assert は何もしない。
NDEBUG が #define されてなければ、条件が false だったら abort する。
0036デフォルトの名無しさん
2007/08/07(火) 18:02:070037デフォルトの名無しさん
2007/08/07(火) 18:04:15どうもありがとう
0038デフォルトの名無しさん
2007/08/07(火) 18:18:530039デフォルトの名無しさん
2007/08/07(火) 18:26:280040デフォルトの名無しさん
2007/08/07(火) 18:34:51Win+IDEとかで開発してるとデバッガが起動してくれたほうが何かと便利なので、
abort()ってあんま便利じゃない希ガス
my_abort() { char **nullpo = 0; *nullpo = "ガッ"; }
みたいなの作って、強引にSEGV起こしてデバッガ起動させたほうが便利かも
例外も、スローされた場所が分からないという意味では、微妙に役に立たない
面があるよね、C++だと
0041デフォルトの名無しさん
2007/08/07(火) 18:44:34マクロで__FILE__と__LINE__を引数に取る例外クラスを作ればいいかと思う。
前に適当に作ったんだけど実際に使ったことがないので使い勝手はなんともいえん
JavaのprintStackTraceみたいのがあればいいけどね
0042デフォルトの名無しさん
2007/08/07(火) 18:58:12Visual Studioだと、assertも引っかかったときや
例外が投げられた時点でデバッガに移れるぞ。
スタックの状態はassertやthrow式の時点のものが見れる。
0043デフォルトの名無しさん
2007/08/07(火) 19:26:30スタックトレース見れるとそうでないとでは随分違うよね。
>>42
ああ、そうだっけか。なら、同じかな。
SEGVだとデバッガがインストールされていない場合でもDr.ワトソン経由で
コアダンプが吐かれるのがいいかなとも思うけど。
0044デフォルトの名無しさん
2007/08/07(火) 19:34:57struct 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__)
こいつを引数にとるとか。
0045デフォルトの名無しさん
2007/08/07(火) 19:51:12ttp://0xcc.net/blog/archives/000067.html
移植性も糞もないがw
0046デフォルトの名無しさん
2007/08/07(火) 20:52:56表示されないんですが、表示させる設定はあるのでしょうか?
0047デフォルトの名無しさん
2007/08/07(火) 20:54:460048デフォルトの名無しさん
2007/08/07(火) 20:55:33環境は?
0049デフォルトの名無しさん
2007/08/07(火) 21:07:53各ソートの詳細な動きを見たいんですが、エラーではないと思いますが
下のソースを実行すると0123485679から上が表示されないんです。
説明が下手ですいません。
0050デフォルトの名無しさん
2007/08/07(火) 21:09:310051デフォルトの名無しさん
2007/08/07(火) 21:09:33ttp://www1.cts.ne.jp/~clab/hsample/Sort/Sort1.html
0052デフォルトの名無しさん
2007/08/07(火) 21:10:480053デフォルトの名無しさん
2007/08/07(火) 21:13:10VS2005 Expressとかがタダで使える時代に
0054デフォルトの名無しさん
2007/08/07(火) 21:24:550055デフォルトの名無しさん
2007/08/07(火) 21:55:51何言ってるのか分からんが、ShowDataのところを以下に書き換えたらどうだ
void ShowData(int x[ ], int n)
{
int i;
for (i = 0; i < n ; i++)
printf("%d ", x[i]);
putchar('\n');
}
0056デフォルトの名無しさん
2007/08/07(火) 22:21:51C言語の話なのですが同じ型の
二つの構造体をビット演算子で
比較することは不可能なのでしょうか。
職場でさっきやってみたら
コンパイルエラー。。。
0057デフォルトの名無しさん
2007/08/07(火) 22:27:15http://www.codeguru.com/cpp/w-p/system/threading/article.php/c10317/
0058デフォルトの名無しさん
2007/08/07(火) 22:28:19ビット演算子は比較するためのものではありません
0059デフォルトの名無しさん
2007/08/07(火) 22:34:16#そりゃ、算術演算も究極的にはビット演算だけどさ
0060デフォルトの名無しさん
2007/08/07(火) 22:39:59ビット演算で比較というのもナシではないけどね。
0061デフォルトの名無しさん
2007/08/07(火) 22:46:35LSI C-86は使ったことも無くESPしてみるけど、DOSコンパイルなの?
表示行が多くて、始めに出力した内容がDOS窓を上にスクロールしてもみえません。とか?
006256
2007/08/07(火) 23:29:26少しスレを荒れさせてしまったようで申し訳ありません。
struct point {
int a;
int b;
・
・
・
int z;
};
思想としては上記のような型の2つの変数があった場合
メンバa同士で論理積(AND)演算を行う
メンバb同士を論理積(AND)演算を行う
・
・
・
メンバz同士を論理積(AND)演算を行う
という処理が冗長な感じがして
全く同じ構造体の型=全く同じビットパターンでは無いか?
ならば丸ごと論理積(AND)演算は実行できないだろうか?
と思った次第でございます。
0063デフォルトの名無しさん
2007/08/07(火) 23:32:350064デフォルトの名無しさん
2007/08/07(火) 23:35:31もしint aとかが1ビットしか使っていなければビットフィールドを使う手もある。
とはいっても、量によっては結局何行か必要になるわけだが・・・
0065デフォルトの名無しさん
2007/08/07(火) 23:36:39{
char *pa = a;
const char *pb = b;
size_t i;
for (i = 0; i < n; i++) {
*pa++ &= *pb++;
}
}
みたいなのを作って使うとか。
0066デフォルトの名無しさん
2007/08/07(火) 23:52:05でも構造体にはパディングが入る可能性があるので
規格上は動作が保証されない。
やっぱメンバごとに比較するのがよいと思われ。
0067デフォルトの名無しさん
2007/08/07(火) 23:54:46left.a && left.aと
left.b && left.bと
...
それぞれの関係がわからない・・・
a-zまでをさらにまた&&で結合させるの?
006856
2007/08/08(水) 00:15:37>>67さん
論理積と書いてしまって混乱させてしまったようですが
ビットAND演算子(&)を想定しています。
構造体Aのメンバa-zは
フラグ(0x01 or 0x00)として意味を持ち
それに大して構造体Bで用意したメンバa-z(0x01 or 0x00)
を各メンバ同士ビットAND演算子(&)で演算を行って
フラグを残したり、落としたりという処理をしたかったりしてました。
0069デフォルトの名無しさん
2007/08/08(水) 00:19:07007056
2007/08/08(水) 00:20:19思えば同じ型の構造体でも丸ごと代入は許されていない
ことを考えれば丸ごとビット演算もちょっと無理な話であることは
少々考えればわかることでした。。。
アドバイスくださった皆様どうもありがとうございました /平伏
0071デフォルトの名無しさん
2007/08/08(水) 00:23:550072デフォルトの名無しさん
2007/08/08(水) 00:31:10>思えば同じ型の構造体でも丸ごと代入は許されていない
普通にできるけど。
--
struct {int a; int b;} a = {1, 2}, b;
b = a;
0073デフォルトの名無しさん
2007/08/08(水) 00:31:35構造体丸ごとの代入は許されてるよん。
代入しか許されてないけど。
007456
2007/08/08(水) 00:44:30→ググッたら普通に出てきた。。。
無知で申し訳ないです
0075デフォルトの名無しさん
2007/08/08(水) 05:24:03hoge
)
みたいな関数についてなんですが、
なんでstr != nullで動くんですか?
文字列の終わりはnullじゃなくて、¥0じゃないんですか?
nullは無効なメモリアドレスで、
¥0とは違う意味じゃないんですか?
0076デフォルトの名無しさん
2007/08/08(水) 05:37:27だから、文字列の終わりを判定するコードじゃないんだろう。
0077デフォルトの名無しさん
2007/08/08(水) 05:45:48strは文字配列へのポインタで、
まさにstrが無効なメモリアドレスでない間ループを回すコードじゃないのか?
strの型を確認してみるんだ。
0078デフォルトの名無しさん
2007/08/08(水) 07:07:03#define null '\0'
であれば、件のコードは
while (*str != null) {...}
のはずなので、ほぼ間違いなく「正しいコード」だろう。
ただ、nullではなくNULLだろうな。
0080デフォルトの名無しさん
2007/08/08(水) 09:04:05はっきり言ってこんなに楽で自由で高収入のアルバイトは
ありません。私も経験者ですので自信があります。
下記のサイトに詳しく説明してあります。
http://www2.atpages.jp/nicl1216/
0081デフォルトの名無しさん
2007/08/08(水) 09:28:530082デフォルトの名無しさん
2007/08/08(水) 10:33:240083デフォルトの名無しさん
2007/08/08(水) 10:48:590084デフォルトの名無しさん
2007/08/08(水) 13:25:12見た目と声がレディなら、アソコはどうなっていても構いません。
>>82
86歳はルックスの面で少し厳しいと思いますが、
熟女の魅力と魅力的な声があれば大丈夫かと思います。
>>83
年は関係ありませんし、結婚願望はない方が好ましいですね。
ただし、見た目と声は(´∀`*)でないとダメです。
0085デフォルトの名無しさん
2007/08/08(水) 13:25:380086DEFORTの名無し
2007/08/08(水) 20:27:50知っている人がいたら教えて♪
0087DEFORTの名無し
2007/08/08(水) 20:30:160088デフォルトの名無しさん
2007/08/08(水) 20:32:360089デフォルトの名無しさん
2007/08/08(水) 20:49:290090デフォルトの名無しさん
2007/08/08(水) 20:51:20WindowsXP?
0091デフォルトの名無しさん
2007/08/08(水) 21:05:57あほすぎで笑うとこですよね?
0092デフォルトの名無しさん
2007/08/08(水) 21:14:130093デフォルトの名無しさん
2007/08/08(水) 21:17:270094デフォルトの名無しさん
2007/08/08(水) 23:24:39%d や %s などの呼び方が書籍によって「変換指定子」や「変換仕様」と違い、
どんな条件で変わっているのか調べても判らず困っています。
これはどちらか間違っているのでしょうか?
0095デフォルトの名無しさん
2007/08/08(水) 23:29:51「変換仕様」や「変換指定」は % で始まり「変換指定子」で終わる全体を表す。
0096デフォルトの名無しさん
2007/08/08(水) 23:34:13あなたが間違っています。
0097デフォルトの名無しさん
2007/08/08(水) 23:35:23言語: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を使うべきなのか。。。
0099デフォルトの名無しさん
2007/08/08(水) 23:48:46http://www.ipa.go.jp/security/rfc/RFC3174JA.html
0100デフォルトの名無しさん
2007/08/08(水) 23:54:48情報アリガト。
でも、これってRFCで示されたSHA1の実装例ですよね?
RHEL4の標準ライブラリで実現できないかなーと思っているのです。
opensslコマンドや、sha1sumコマンドで実現できるのは分かっているのですが、
自プロセス内で、標準(?)関数を使ってSHA1のハッシュ値を得たいのです。
ワガママですみません。
010197
2007/08/08(水) 23:57:40libssl.aをリンクすれば良いのですが、
libgnutils-openssl.soとかあるので、共有ライブラリで何とかならんのかなーと。
0102デフォルトの名無しさん
2007/08/09(木) 00:03:41こだわる理由がわからん。
0103デフォルトの名無しさん
2007/08/09(木) 00:04:360104デフォルトの名無しさん
2007/08/09(木) 00:06:30http://mist.suenaga.cse.nagoya-u.ac.jp/document/sha_8h-source.html
0105デフォルトの名無しさん
2007/08/09(木) 00:08:29C++っすね。。。
ちなみに、偉大なるgoogle先生によると
http://www.google.co.jp/codesearch?q=package%3Asha1&hl=ja
この辺が出てくるのですが。。
0106デフォルトの名無しさん
2007/08/09(木) 00:10:051個のファイルに全プログラムを書いてるとか?
0107デフォルトの名無しさん
2007/08/09(木) 00:18:55いえいえ。
もし既に標準ライブラリとしてRHEL4で提供しているのであれば、それを使った方が良いと思ってるのです。
javaでもメッセージダイジェストのクラスjava.security.MessageDigestがありますし。
できれば標準で提供されているものに乗っかりたいかなと。
Cとjavaではそもそも思想が違うと言われたらそうかも知れませんが。。。
0108デフォルトの名無しさん
2007/08/09(木) 00:23:160109デフォルトの名無しさん
2007/08/09(木) 00:30:48そう?
0110デフォルトの名無しさん
2007/08/09(木) 00:33:06C言語で、以下のものを作成したのですが、
int *name[] = {
"satou",
"takahashi",
"suzuki",
};
この時に*name[]に入った配列の数を知るにはどうしたら良いでしょうか。
(上記の場合、自分では「それぞれの文字列の先頭のポインタが3つ入っている」という認識です)
0111デフォルトの名無しさん
2007/08/09(木) 00:33:420112デフォルトの名無しさん
2007/08/09(木) 00:37:03配列の数を知る事が出来ました。
ありがとうございます。
0113デフォルトの名無しさん
2007/08/09(木) 00:38:10char * name[] = { "hoge", "hogehoge", "hogehogehoge" };
sizeof ( name ) / sizeof ( char * )で3が得られる。
0114デフォルトの名無しさん
2007/08/09(木) 00:38:47char *じゃ無くて?
[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
0115デフォルトの名無しさん
2007/08/09(木) 00:39:460116デフォルトの名無しさん
2007/08/09(木) 00:41:550117110です
2007/08/09(木) 00:47:09[satouへのポインタ]
[takahashiへのポインタ]
[suzukiへのポインタ]
…
でしたので、数が増えた場合の事を考えて、
int型で宣言した方が良いと思い、
int型で宣言しました。
この辺りが曖昧でして。申し訳ありません。
0118デフォルトの名無しさん
2007/08/09(木) 00:50:060119デフォルトの名無しさん
2007/08/09(木) 00:52:05数がいくら増えようが、char *もint *も必要とするメモリは変わりない。
ってか、name[]に256を超えるポインタを格納することを考えてintにしたのか?
だとしたら激しく勘違いしているぞ。
0120100です
2007/08/09(木) 00:54:21int型に変更してコンパイルしてみたところ
大量のwarningが出ました。
(エラー内容:warning initialization incompatible pointer type)
お騒がせして申し訳ありません。
0121デフォルトの名無しさん
2007/08/09(木) 00:56:05ポインタが指し示す値の型がintならint*を使うしcharならchar*を使う
指し示した先の型が表せる値の範囲は違ってもポインタ自体のサイズはint*でもchar*でも同じ
0122110です。
2007/08/09(木) 00:58:30char型の配列を、
name[] ={...}内に入っている分を確保するという事で良いでしょうか。
0123デフォルトの名無しさん
2007/08/09(木) 00:59:34は、文字列リテラルと呼ばれるものです。環境にもよりますが、
書き込み不可のメモリ領域に確保されます。
で、これはchar型の配列、末尾が'\0'として表現されています。
なので、
char *name[] = {"satoru", "takahashi"."suzuki"};
の意味は、
1.書き込み不可領域に確保されている"satoru"、"takahashi"、"suzuki"の3つの文字列リテラルがある。
2.要素数3、でchar型へのポインタの配列(name)がスタック(?)に確保され、各ポインタは、
1.の"satoru"、"takahashi"、"suzuki"それぞれの先頭の一文字のアドレスを指すように初期化される
です。
117はCにおける文字列の表現方法について基本が分かっていません。がんばってちょ。
基本を理解するのは意外と難しいです。
0124デフォルトの名無しさん
2007/08/09(木) 01:01:07だから、下の二つはnameで確保するメモリは同じ。
char * name[] = { "a", "b" };
char * name[] = { "aaaaaaaaaa", "bbbbbbbbbb" };
0125110です
2007/08/09(木) 01:15:45丁寧なご説明ありがとうございます。
ずっとこの部分でエラーを吐いていて、
うまく動かず悩んでいたのですが、やっと動きました。
どうしてエラーが出ていたのかも理解できました(と思います…)。
ありがとうございました。
012646
2007/08/09(木) 04:02:22>>始めに出力した内容がDOS窓を上にスクロールしてもみえません。とか?
そのとおりです。何か対処法がありましたらぜひ教えてくださいよろしくお願いします。
0127デフォルトの名無しさん
2007/08/09(木) 04:06:270128デフォルトの名無しさん
2007/08/09(木) 07:55:37所謂DOS窓を縦に引き伸ばしてみては如何でしょうか。
或いは、リダイレクトでファイルに落としてエディタで見るとか、
パイプラインでmoreに繋いで見るとか。
って、どう見ても言語ネタじゃないね。
0129デフォルトの名無しさん
2007/08/09(木) 11:02:45うちのUbuntu系のLinuxには /usr/lib/libssl.so があるんだぜ。
0130デフォルトの名無しさん
2007/08/09(木) 11:34:48ワロタwwプログラミング以前の問題だなw
0131デフォルトの名無しさん
2007/08/09(木) 13:18:070132デフォルトの名無しさん
2007/08/09(木) 13:22:16出力をテキストファイルにリダイレクトするとか
bcc32 -Etest.txt test.cpp > result.txt
0133デフォルトの名無しさん
2007/08/09(木) 16:49:44ファイル保存のダイアログを出して、適当なところに保存して
また別にfopen("test.txt", "w");
で保存すると、保存ダイアログが出てたフォルダに保存されてしまうのですが
これを、実行ファイルと同じフォルダに保存するようにしたいんですけど
どうすればいいでしょうか?
0134デフォルトの名無しさん
2007/08/09(木) 17:13:510135デフォルトの名無しさん
2007/08/09(木) 17:20:44つまりユーザはダイアログで保存ディレクトリも含めて保存先を指定したのに
それを*無視*して実行ファイルと同じディレクトリに*無理やり*保存したい
ってこと?
ユーザ権限について調べてみるといいと思うよ
Unixは言うに及ばず、WindowsであってもVistaでは厳しくなったようだから
0136135
2007/08/09(木) 17:24:09> また別にfopen("test.txt", "w");
> で保存すると、
と書いてあるから、ユーザに指定させたのとは無関係に、プログラムが
勝手にこしらえるファイルの話か?
だったら、自分で実行ファイルのディレクトリを取得して、
フルパスで指定汁。カレントがどこだか分からないのだから。
とは言え、パーミッションには注意。Unixならもともとそういう設計は論外な。
0137デフォルトの名無しさん
2007/08/09(木) 17:27:59>>135
アドバイスありがとうございます。
ダイアログで保存するものと、fopenで保存するものは別のものなんです。
ただダイアログを出さないで保存したいなと思いまして。
ただ単に、fopenのみのプログラムだと実行ファイルのところに保存できたのですが
ダイアログ→fopen の順序で実行したらダイアログで保存したフォルダに一緒に保存されてしまったんです。
カレントディレクトリを実行ファイルのあるディレクトリにすればいいとは思ったんですけど
やり方がわかりませんでした。
0138デフォルトの名無しさん
2007/08/09(木) 17:29:460139デフォルトの名無しさん
2007/08/09(木) 17:31:32OFN_NOCHANGEDIR
0140デフォルトの名無しさん
2007/08/09(木) 17:32:31ってやると、argv[0]に実行ファイル名が入るよ
0141デフォルトの名無しさん
2007/08/09(木) 17:37:02この場合、そのことに何の意味が?
まさか、argv[0]に必ずフルパスが入っているなんて能天気なことを想像してたりしませんよね?
0142デフォルトの名無しさん
2007/08/09(木) 17:44:13フルパスが入るようにコマンドラインを入力するんだよ
大丈夫か?
0143デフォルトの名無しさん
2007/08/09(木) 17:45:26アプリの都合でアプリの存在するディレクトリにこしらえるファイルのために
何でユーザがアプリの起動方法を指図されなければならないのだろうか
0144133
2007/08/09(木) 17:48:56>>139さん
のやり方で解決いたしました。
他にも色々な案を出してもらったので一つ一つ試していきたいと思います。
ありがとうございました!
0145デフォルトの名無しさん
2007/08/09(木) 17:49:280146デフォルトの名無しさん
2007/08/09(木) 17:50:46それじゃ、カレントがexeのディレクトリと同じじゃないと
意味無いよ。確実にexeが存在するのと同じ場所にファイルを作りたいなら
フルパス指定するしかない。
0147デフォルトの名無しさん
2007/08/09(木) 17:58:50_splitpath()で分解して
sprintf()で結合とかどう?
0148デフォルトの名無しさん
2007/08/09(木) 18:09:560149デフォルトの名無しさん
2007/08/09(木) 18:23:43VistaのUACではまるかも。
そこに至るまでの道のりは長いだろうけどね。
0150デフォルトの名無しさん
2007/08/09(木) 18:29:170151デフォルトの名無しさん
2007/08/09(木) 18:38:38北極行くのに南極経由するような人なんだから触れてやるな
0152デフォルトの名無しさん
2007/08/09(木) 18:56:11「さも」の使い方がおかしい
0154デフォルトの名無しさん
2007/08/09(木) 19:50:02C#のスレでまったく同じ質問があったな、しかも同じ日
どっかの課題かなにかなのだろうか
0155デフォルトの名無しさん
2007/08/09(木) 19:51:140156デフォルトの名無しさん
2007/08/09(木) 20:16:590157デフォルトの名無しさん
2007/08/09(木) 20:17:540158デフォルトの名無しさん
2007/08/09(木) 20:21:21解決の仕方も解決した時刻も違うから
同じ人とは思えないなあ
質問者に種あかししてほしいとこだが
0159デフォルトの名無しさん
2007/08/09(木) 20:36:300160デフォルトの名無しさん
2007/08/09(木) 20:40:440161デフォルトの名無しさん
2007/08/09(木) 23:17:50開発って難しいですか?
0162デフォルトの名無しさん
2007/08/09(木) 23:21:060163デフォルトの名無しさん
2007/08/10(金) 01:35:4999年から?
void func(int n){
int array[n];
:
}
とか。。。
0164デフォルトの名無しさん
2007/08/10(金) 01:36:200165デフォルトの名無しさん
2007/08/10(金) 01:37:50個人的にはその仕様はうれしい。
0166デフォルトの名無しさん
2007/08/10(金) 01:44:37ここを参考
http://seclan.dll.jp/c99d/c99d04.htm#dt19990719
0167デフォルトの名無しさん
2007/08/10(金) 01:49:430168デフォルトの名無しさん
2007/08/10(金) 08:39:010169デフォルトの名無しさん
2007/08/10(金) 08:51:480170デフォルトの名無しさん
2007/08/10(金) 09:01:380171デフォルトの名無しさん
2007/08/10(金) 09:01:53C と C++ 用にそれぞれ専用スレがあるだろ。問題があれば誘導すればいい。
0172デフォルトの名無しさん
2007/08/10(金) 09:18:08とりあえず自分が考えた方法だと、
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をした方が、倍以上高速になることを発見したからです。
それとも、もっと効率の良い方法はありますか?
0173デフォルトの名無しさん
2007/08/10(金) 09:25:090174デフォルトの名無しさん
2007/08/10(金) 10:44:50ifstream ifs("dir_name");
if ( ifs.fail() ) { return 0; }
if ( ifs.isDirectory() ) { }
みたいに標準ライブラリだけで
ディレクトリか否かを判定することってでけますか?
あと、ディレクトリ内にある全ファイルの名前取得みたいなことは
標準ライブラリだけででけますか?
0175デフォルトの名無しさん
2007/08/10(金) 10:50:52pubsetbuf()でバッファでかく取っとくと、一般には速くなると期待されるんだが、
gccの少なくとも古いバージョンでは、open済みのstreambufに
pubsetbuf()を実行しても、何食わぬ顔をして元のバッファを使うようだ。
mmap()したポインタをstrstreamにそのまま突っ込むのが多分一番速いが、
移植性に欠ける上にstrstreamがdeprecatedなのがネックだな。
stringstreamのstrメンバを使うとせっかくmmap()したものを
わざわざコピーしてしまうし、
stringstreamのpubsetbuf()も有効とは限らないようだ。
(少なくともVC++では平然とシカトされる)
>>173
それ記述が簡単でいいんだが、少なくとも
VC++のostream実装とかだと、大して速く無さそうなんだよな。
sgetc()/snextc()と、sputc()使って1文字ずつコピーしてるし
微妙に無駄の多いコードになってるんで、
下手すりゃ手書き1文字コピー回したしたほうがまだ速いかもしれん。
0176デフォルトの名無しさん
2007/08/10(金) 10:52:02どっちもだめ
ディレクトリのないファイルシステムもあるんで、CやC++の標準は
ディレクトリがらみを一切扱っていないはず
0177デフォルトの名無しさん
2007/08/10(金) 10:57:35C99はCであって、
互換性がないのはCとC++
0178漏れが書かなくてもきっと誰かが書く
2007/08/10(金) 10:58:24そこでboostですよ。
0179デフォルトの名無しさん
2007/08/10(金) 11:12:01無論そんなことは知っているが、>>174は「標準ライブラリだけ」と
2度も強調しているんだし、非標準の方法があることぐらいは知ってて
聞いてるんだろ
0180175
2007/08/10(金) 11:23:23> stringstreamのpubsetbuf()も有効とは限らない
そもそもpubsetbuf()を入力を食わせるのに使えるはずがないな
0181デフォルトの名無しさん
2007/08/10(金) 11:26:26>178の名前欄。
つーか、>176はなんで「扱っていないはず」なんて曖昧なままにしておくのだろう。
調べれば直ぐに答が出ることなのに。
0182デフォルトの名無しさん
2007/08/10(金) 11:28:03すまん、扱っていないことは知っている
理由のほうが推測だ
0183デフォルトの名無しさん
2007/08/10(金) 11:35:59なるほど、それは失敬。そしてその推測は妥当だろう。
実際、CP/Mやtronにはディレクトリがない。
0184デフォルトの名無しさん
2007/08/10(金) 11:42:45わけわからんところもあるよな
0185デフォルトの名無しさん
2007/08/10(金) 11:50:070186174
2007/08/10(金) 11:53:44レスありがとです。
標準ライブラリにディレクトリ絡みがまったくないのでおかしいなぁ
とは思ってたんですが、そんな理由があったとは。。
ソースを他環境に持ってたとき、すぐコンパイルできないとイヤだなと思って
できるだけ標準でやる方法を探してたんですが、
>>178さんの仰るとおり、こりゃおとなしくboost使っといたほうがいいですね。
0187デフォルトの名無しさん
2007/08/10(金) 12:06:280188デフォルトの名無しさん
2007/08/10(金) 12:09:270189デフォルトの名無しさん
2007/08/10(金) 12:31:53の時
*(p++)
がさす値はoですか?
0190デフォルトの名無しさん
2007/08/10(金) 12:34:48*(p++) の値は 'h' になります
0191デフォルトの名無しさん
2007/08/10(金) 12:37:41*(p++) の値は 'g' にもなります
0192デフォルトの名無しさん
2007/08/10(金) 12:37:420193デフォルトの名無しさん
2007/08/10(金) 12:38:252ch に書き込むより早く分かる。
0194デフォルトの名無しさん
2007/08/10(金) 12:44:010195デフォルトの名無しさん
2007/08/10(金) 12:52:10^^;;
0196デフォルトの名無しさん
2007/08/10(金) 12:53:03p が指す値と
式 *(p++) の値を混同してないか?
0197デフォルトの名無しさん
2007/08/10(金) 12:53:46ちなみに
*pには何が代入されているんですか?
0198デフォルトの名無しさん
2007/08/10(金) 13:01:580199デフォルトの名無しさん
2007/08/10(金) 13:02:370200デフォルトの名無しさん
2007/08/10(金) 13:09:34やっぱり長期休暇は頻度もスケールも一回り違うかな。
0201デフォルトの名無しさん
2007/08/10(金) 13:36:080202デフォルトの名無しさん
2007/08/10(金) 15:01:04ギャルゲーとかで「フラグをたてる」ていうんですが
フラグというのはビットなんですか?
0203デフォルトの名無しさん
2007/08/10(金) 15:03:07ビットじゃないフラグも当然ある
0204デフォルトの名無しさん
2007/08/10(金) 15:07:07「立てる」か「倒す」かだからビットだろうなぁという気はする。
0205デフォルトの名無しさん
2007/08/10(金) 15:10:540206デフォルトの名無しさん
2007/08/10(金) 15:22:380207デフォルトの名無しさん
2007/08/10(金) 15:26:46boolは大抵intかcharで実装されている罠。
0208デフォルトの名無しさん
2007/08/10(金) 15:27:55立ち過ぎてて困るから
1ビット分けてあげるぞ
0209デフォルトの名無しさん
2007/08/10(金) 19:04:06仮に追加依存ファイルのパスを~/xxx/includeとすれば
.bash_profileではexport CDPATH="$CDPATH":"~/xxx/include/"のようにして環境変数を設定し
シェル上でcd includeと打てばカレントパスが意図通りに変化するところまでは設定しています
ここから、このパス下にあるtest.hppを#include <test.hpp>のように指定しているファイル
~/main.cppを
コンパイルする目的で~/下でg++ main -I includeと打ったのですが
コンパイラからはtest.hppが見付からないというエラーが返ってきます
正しくはどのように指定するべきなのでしょうか?
0210デフォルトの名無しさん
2007/08/10(金) 19:13:01-I~/xxx/include
ってやれば?
0211デフォルトの名無しさん
2007/08/10(金) 19:15:55何がしたいのか良く分からないけど、普通に-I~/xxx/include/とか書くとか
ていうか、そもそも-Iの後ろにスペースあるのはOKだっけ?
0212デフォルトの名無しさん
2007/08/10(金) 19:39:34それら二点に気を付けて打てば通りました
助言ありがとうございました
0213デフォルトの名無しさん
2007/08/10(金) 19:45:54相対パスでもいけるけど、「ソースがある場所からの」相対パスであることに注意
0214213
2007/08/10(金) 19:47:00すまん、俺自身あやふやになってきた。忘れてくれ
0215デフォルトの名無しさん
2007/08/10(金) 19:53:16たぶんコンパイラ実行時の作業ディレクトリかなんかからの相対パスになると思うけど・・・。
いつもmakefileコピペ改変でやっちまうから、俺も記憶があやふやだ・・・
0216デフォルトの名無しさん
2007/08/10(金) 20:29:01Makefileに-Ipathと書いておいて、ln -s どっかの/pathとかよくやる。
0217デフォルトの名無しさん
2007/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++にはないようなので。
0218デフォルトの名無しさん
2007/08/10(金) 22:50:17instanceof は dynamic_cast
いちおう typeid もあるけど
0219デフォルトの名無しさん
2007/08/10(金) 22:52:33funcをHogeの仮想関数にする(必要に応じて純粋仮想関数にする)。
そして、FooとBarがそれぞれオーバーライドする。
instanceofとかisとかがある言語でも、
そんな書き方よりこういう仮想関数でやる方法が普通だぞ。
0220デフォルトの名無しさん
2007/08/10(金) 23:00:22void func(const Foo& foo);
void func(const Bar& bar);
...
0221デフォルトの名無しさん
2007/08/11(土) 00:26:580222デフォルトの名無しさん
2007/08/11(土) 10:54:08基底クラスが派生クラスの面倒までみるべきではないよ
0223デフォルトの名無しさん
2007/08/11(土) 13:04:07funcはHogeのメンバ関数じゃ無い、とかそんな状況な気もする
0224デフォルトの名無しさん
2007/08/11(土) 13:54:380225デフォルトの名無しさん
2007/08/11(土) 16:49:10単に基底クラスに面倒見さそうとしてるわけじゃないんじゃない?というだけの話で。
0226デフォルトの名無しさん
2007/08/11(土) 18:31:47本当のクラスでは捕まえられない。
#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"); }
}
0227デフォルトの名無しさん
2007/08/11(土) 20:52:010228デフォルトの名無しさん
2007/08/12(日) 06:43:010229デフォルトの名無しさん
2007/08/12(日) 07:11:10struct 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"); }
}
0230デフォルトの名無しさん
2007/08/12(日) 08:44:07struct 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"); } };
ダントツでこれが一番いいんだけどなぁ
0231デフォルトの名無しさん
2007/08/12(日) 08:45:400232デフォルトの名無しさん
2007/08/13(月) 09:30:33VC8Express (cl v14.00.50727.762 for 80x86)で、
void main(void){main();}
を、
cl /MD stackov.cpp
でコンパイルして実行しても、黙って落ちるだけで、_invoke_watsonされない
そういう例外って、なにかしらダイアログ出して落ちるものとばかり思っていたのに
昔からこんなでしたっけ、これってこういうもん?
0233デフォルトの名無しさん
2007/08/13(月) 10:19:390234デフォルトの名無しさん
2007/08/13(月) 11:51:22…たときに、アプリケーションエラーって出ないのが
デバッガから起動すれば、ちゃんと
Stack overflow - code c00000fd (first chance)
って捕捉されるんだけど…。
0235デフォルトの名無しさん
2007/08/13(月) 12:08:260236デフォルトの名無しさん
2007/08/13(月) 12:10:47if (!isspace(ch) && !iscntrl(ch))
break;
という文なのですが、
何故かbreakされてしまいます。
chがスペースでないときかつchが制御文字でないとき
にbreakされるはずなのですが、条件式間違っているでしょうか?
0237デフォルトの名無しさん
2007/08/13(月) 12:14:01検出する方法は別にあるんだろうな、あるんだろうね
0238デフォルトの名無しさん
2007/08/13(月) 12:26:17動かない断片を提示されてもなんとも言えませんが。
症状を再現できる最低限のロジックを提示してみてください。
0239デフォルトの名無しさん
2007/08/13(月) 12:33:45chか、iscntrl()の挙動が直感に反しているのでは
printf("%x: %d, %d\n",ch,isspace(ch),iscntrl(ch));
をifの前に置いてみては。
0240デフォルトの名無しさん
2007/08/13(月) 12:41:07気になって試した
どうもスタックのサイズによるみたい
void main(void){
char cc[4096];
main();
}
とすればダイアログはでる。
(アセンブラ見ると、__chkstk の呼び出しが追加されてる)
ただし、VCのオプション的にはスタックサイズが4Kより小さいときでも、
/Gs0 とか付ければいけそうに思えるし、実際アセンブラリストに
__chkstk の名前でてるんだけどダイアログはでない。謎。
0241デフォルトの名無しさん
2007/08/13(月) 12:44:01失礼です。
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))
の段階で止まってしまって、ブレイクしたのかなと思って。
0242デフォルトの名無しさん
2007/08/13(月) 12:50:440243デフォルトの名無しさん
2007/08/13(月) 13:42:25関数名から推測して
static int skip_space(void)
を呼び出す上位関数に問題があるんじゃないか?例えば
int main(void) {
int ch;
for(;;) {
if(-1 == (ch = skip_space())) break;
putc(ch,stdout);
}
return 0;
}
とか。
0244デフォルトの名無しさん
2007/08/13(月) 14:16:01ちなみに (!isspace(ch) && !iscntrl(ch))
な文字コードってどんなのが当てはまりますかね?
0245デフォルトの名無しさん
2007/08/13(月) 14:38:10空白文字でも制御文字でもない文字。
まぁ、大抵の可読文字が該当する罠。
0246デフォルトの名無しさん
2007/08/13(月) 16:49:05自分馬鹿だorz
ほんと皆さん電波な質問して申し訳有りません
二徹して疲れたので寝ます
0247デフォルトの名無しさん
2007/08/13(月) 18:57:05src/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 \
0248247
2007/08/13(月) 19:03:44の最初の行で
multiple target pattern stop
とmakeがエラーになるんですが、
これはどうすれば解決するんでしょうか?
test.dと.oのルールを同じ行で定義しているのが問題かと思ってわけてみたり
test.d(つまり自分自身)のルールを定義しているのが問題かた思ってtest.dを消してみましたが
解決しませんでした
0249デフォルトの名無しさん
2007/08/13(月) 19:48:51C: とか H: とか
代わりに /cygdrive/c/ や /cygdrive/h/ を使うと大丈夫とかいうことらしい
0250247
2007/08/13(月) 20:15:55そのようにしたらmakeのエラーは消えdebugができるようになりました
しかし今度は
Invalid project path: Include path not found (\cygdrive\\root\usr\src\boost)
のような警告がでてきましが、これなら実害ないので我慢します
助言ありがとうございました
0251デフォルトの名無しさん
2007/08/14(火) 06:40:57{
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で判定出来るのは理解出来るのですが。
0252デフォルトの名無しさん
2007/08/14(火) 07:26:45当然、ヌル終端文字列は後者を末尾に持つ
0253デフォルトの名無しさん
2007/08/14(火) 07:27:29思いっきりバグ、もしくはコピペミスだろ。
0254デフォルトの名無しさん
2007/08/14(火) 07:27:4412行目の'\0'と24行目のNULLなら別物だし、
比較も代入もしていないが
0255デフォルトの名無しさん
2007/08/14(火) 07:37:240256デフォルトの名無しさん
2007/08/14(火) 07:40:160257デフォルトの名無しさん
2007/08/14(火) 07:41:58{}が対応してないな。
0258デフォルトの名無しさん
2007/08/14(火) 07:54:200259デフォルトの名無しさん
2007/08/14(火) 08:15:31(⌒─-⌒) EXILE!EXILE!
〃((´・ω・`)) ミ ○
((´・ω・`)) O((´・ω・`))
Oヽ( )〃ノO
∪⌒∪
""" "" " """ "" " """ "" " ""
0260デフォルトの名無しさん
2007/08/14(火) 09:55:22>>240 ありです、それかもな感じ 何かがひらめいた予感 ちょっと調べてみます
>>235 ちなみに、WinMainでやってみても、なんもいわれんかったのです;
0261デフォルトの名無しさん
2007/08/14(火) 12:54:16コンパイルできるソースをもってきてください。
それから処理系によって'\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文字以上になると
スタックオーバーで動作は不定になる。うまく動いてもそれは運がいいだけ。
0262251
2007/08/14(火) 13:07:510263デフォルトの名無しさん
2007/08/14(火) 13:12:150264デフォルトの名無しさん
2007/08/14(火) 13:12:430265デフォルトの名無しさん
2007/08/14(火) 13:21:55class 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
}
0266デフォルトの名無しさん
2007/08/14(火) 13:24:090267デフォルトの名無しさん
2007/08/14(火) 13:29:50まぁそう言わんと。
>>265
EffectiveC++を読むことをお勧めしておきます。
0268デフォルトの名無しさん
2007/08/14(火) 13:47:53初心者だからです。例えば、以下の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
このあたりですか?
ttp://www002.upp.so-net.ne.jp/ys_oota/effec/chapter6.htm#36kou
265のclass Aのhoge(int)はhogeImplのようにするこで解決できました。ありがとうございます。
0269デフォルトの名無しさん
2007/08/14(火) 14:09:57hoge という名前の関数は B に 1 個あるので、それ以上辿って A まで探しには行かない
で、見つかった hoge() は引数が一致しないのでエラー
C++ と Java が一緒だと思ってるのが間違い
0270デフォルトの名無しさん
2007/08/14(火) 14:12:39>hoge という名前の関数は B に 1 個あるので、それ以上辿って A まで探しには行かない
なるほど。すっきりしました。ありがとうございます。
0271デフォルトの名無しさん
2007/08/14(火) 16:26:39PlaySoundを使う方法は簡単にできたのですが、wavファイルを実行ファイルに組み込むことはできるのでしょうか?
できるなら、方法や資料を教えて頂けませんか?
宜しくお願いします。
0272デフォルトの名無しさん
2007/08/14(火) 16:44:380273デフォルトの名無しさん
2007/08/14(火) 16:46:190274デフォルトの名無しさん
2007/08/14(火) 16:47:420275271
2007/08/14(火) 17:15:30本当に助かりました。ありがとうございます。
0276デフォルトの名無しさん
2007/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
0277デフォルトの名無しさん
2007/08/14(火) 20:24:53そんなサイトあったのか、本買っちゃったよ
0278デフォルトの名無しさん
2007/08/14(火) 20:34:59テンプレートパラメータの制限は関数とクラスで微妙に違う。
ただ、パラメータを常に指定するなら↓で同じことができるはず。
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);
0279デフォルトの名無しさん
2007/08/14(火) 20:44:54そのサイトはヒント程度だぞ。何やら勘違いに近い記述も見られるし、本は読むべき。
0280デフォルトの名無しさん
2007/08/14(火) 20:56:11関数テンプレートの場合、完全な特殊化はできるが部分特殊化は出来ない。
代わりに関数オーバーロードが使える。
0281276
2007/08/14(火) 21:48:52テンプレート引数を汎用関数のtraitsとして利用したかったのですが…
変数の型を態々書くくらいなら関数オブジェクトとして作る方が良さそうですね
0283デフォルトの名無しさん
2007/08/15(水) 03:27:58コレは他人が装ってる釣りか?
ちょっと釣られて見ますよ
0284デフォルトの名無しさん
2007/08/15(水) 04:00:47while(1){
sub( *++p );
}
というコードは頻出するが、単独の文
*++p;
は間接参照の文が無意味である。(ポインタpをインクリメントした後で、ポインタが示す値を参照し、値を捨てる)
って言う文があるのですが、
「単独の文
*++p;
は間接参照の文が無意味である。」
ってどう意味なのでしょうか?
実例を挙げていただけないでしょうか。
0285デフォルトの名無しさん
2007/08/15(水) 04:12:51間接参照演算子「*」
間接参照はポインタの先を「*」で参照すること。
int main(){
int a=10;
int *p=&a;
*p; /* <- この文意味ないべ? */
return 0;
}
0286デフォルトの名無しさん
2007/08/15(水) 05:07:32分かりました。
自分、日本語読む力が無いなぁ。
0287デフォルトの名無しさん
2007/08/15(水) 05:31:19これおかしいな。
ここで例としてあげるべきなのは *p++ であって *++p ではない。
そもそも * と 前置 ++/-- とは優先順位が同じだ。
0288デフォルトの名無しさん
2007/08/15(水) 07:12:56内容がひどいのでさらしておこう。
http://www.nurs.or.jp/~sug/soft/tora/tora6.htm
0289デフォルトの名無しさん
2007/08/15(水) 08:09:10>というコードは頻出するが
こらこら、副作用があるコードを関数呼び出しで書いちゃ遺憾。
もしこのサイトにあるように頻出するとしたら、よっぽど腐った環境だ。
つーか、このサイト管理者、頭大丈夫か?
http://www.nurs.or.jp/~sug/soft/index.htm
0290デフォルトの名無しさん
2007/08/15(水) 08:21:09未定義動作でもあるまいし。
コーディングスタイルの話としても、
宗教戦争になる程度のこうじゃないといけないとは言えない内容だな。
0291デフォルトの名無しさん
2007/08/15(水) 08:29:14その「sub()がマクロだったら」と考えてみてくれ。
いつ仕様変更でそのようなことになっても大丈夫なように副作用を発生させないのは常識だ。
0292デフォルトの名無しさん
2007/08/15(水) 08:35:04マクロってなんなのかしらないけど
0293デフォルトの名無しさん
2007/08/15(水) 08:43:51#define sub(x) (x < 0 ? -x : x)
0294デフォルトの名無しさん
2007/08/15(水) 08:44:08>こらこら、副作用があるコードを関数呼び出しで書いちゃ遺憾。
どいう意味?
0295デフォルトの名無しさん
2007/08/15(水) 08:56:22なるほど、マクロって絶対値ってことか
0296デフォルトの名無しさん
2007/08/15(水) 08:58:230297デフォルトの名無しさん
2007/08/15(水) 09:11:47いや、違うでしょ?
0298デフォルトの名無しさん
2007/08/15(水) 09:12:45そうだね。でもここは君の居る所じゃないんだ。そろそろママの所に行っておいで
0299デフォルトの名無しさん
2007/08/15(水) 09:14:250300デフォルトの名無しさん
2007/08/15(水) 09:21:19そうだね。でもここは君の居る所じゃないんだ。そろそろママの所に行っておいで
0301デフォルトの名無しさん
2007/08/15(水) 09:27:400302デフォルトの名無しさん
2007/08/15(水) 09:30:090303デフォルトの名無しさん
2007/08/15(水) 09:30:30そうだね。でもここは君の居る所じゃないんだ。そろそろママの所に行っておいで
0305デフォルトの名無しさん
2007/08/15(水) 09:36:37そうだね。でもここは君の居る所じゃないんだ。そろそろママの所に行っておいで
0306292
2007/08/15(水) 09:38:05プライドを傷つけてごめんね
0307デフォルトの名無しさん
2007/08/15(水) 09:42:16どれだけそいつに時間とレスを割く必要があるか分かるだろう?
そんなレベルの低い奴が来ると釣りかと思う。
0309デフォルトの名無しさん
2007/08/15(水) 09:49:39>それだったら*++pではない場合にもいえてしまうんじゃないの?
いくらなんでもマジとは思えん(だから>>293もスルーしたんだろう)。
0310デフォルトの名無しさん
2007/08/15(水) 09:50:25みんな馬鹿で、お前だけが正しいことを言ってる。
誰もお前の頭の良さについていけなくて、悔しさのあまり暴れてるだけなんだよ。
だからママの所に行っておいで。
0311デフォルトの名無しさん
2007/08/15(水) 09:52:13>どれだけそいつに時間とレスを割く必要があるか分かるだろう?
って
>そうだね。でもここは君の居る所じゃないんだ。そろそろママの所に行っておいで
の事かwアホじゃね?
0312デフォルトの名無しさん
2007/08/15(水) 09:53:52日本語でおk
0313デフォルトの名無しさん
2007/08/15(水) 09:53:590315デフォルトの名無しさん
2007/08/15(水) 09:55:59その辺が低脳。全て293のレスだと思ってやがる。
0316デフォルトの名無しさん
2007/08/15(水) 09:57:26見苦しい言い訳
0317デフォルトの名無しさん
2007/08/15(水) 09:57:57あああなたでしたかごめんなさいね
0318307
2007/08/15(水) 09:58:34マクロも知らない初心者の来る所じゃないんだと思っている奴が、
わざわざマクロも知らない初心者に答えるわけがないだろう。
0321デフォルトの名無しさん
2007/08/15(水) 10:00:14バカなんだからバカにされたくらいでレス繰り返さなくてもいいのに
0322デフォルトの名無しさん
2007/08/15(水) 10:01:24フィーリングで分かるなら空気くらい読めるだろ?
0323デフォルトの名無しさん
2007/08/15(水) 10:02:590325デフォルトの名無しさん
2007/08/15(水) 10:03:55初心者に答えるわけがない なんてレスの無駄だから偉そうに宣言しなくてもいいよw
答えないんじゃなくて答えられないんだろ
0327デフォルトの名無しさん
2007/08/15(水) 10:18:32かもしれないけど、なにしろ何がどう「いえてしまう」のか
まるでわからん文章だからなぁ。
0331デフォルトの名無しさん
2007/08/15(水) 10:26:15別にこのケースは何の問題も無いわな
スタイルとして自分がそう心がけているというだけの話なら
ご立派ですねで終わりだが
実にどうでもいい
0332292
2007/08/15(水) 10:26:21むしろ適切であったとしてもまともにこたえる気はなさそうにおもえる
0333デフォルトの名無しさん
2007/08/15(水) 10:27:23煽り返す厨房か
0334309
2007/08/15(水) 10:44:58今は問題無いからいいって考えはどうかと思うぞ。後々の仕様変更に耐えられるコードを書く方がいい。
もっとも今回は副作用で問題が出るマクロにするのが一番悪いが。
>>332
>まともにこたえる気はなさそうにおもえる
何でそう思ったか知らんが結局質問は「副作用があるコードを関数呼び出しで書いちゃ遺憾って言ってるけど、それって*++pではない場合にもいえなくない?」って事か?
0335デフォルトの名無しさん
2007/08/15(水) 10:49:04話題がループするが、sub()がマクロなら問題だからするべきではないという話だろ。
件のサイトではsub()が何か提示されていないのだから、問題がないとは言えない。
0336292
2007/08/15(水) 10:54:44*++pってなんですか?
0337デフォルトの名無しさん
2007/08/15(水) 11:00:13マクロにsub()なんて名前をつけてるのならそっちのが問題じゃね
マクロは大文字で目立たせるのが基本だし
subはサブルーチンのサブだろう
ま、標準ライブラリの一部の関数はマクロで実装することも許されているけどな
0338デフォルトの名無しさん
2007/08/15(水) 11:13:27死ね
0339デフォルトの名無しさん
2007/08/15(水) 11:32:32C++でコンテナからイテレータを取り出すときに、iterator とconst_iterator とを
区別するのはどうやっているんでしょうか?
std::vector<>::iterator begin();
と
std::vector<>::const_iterator begin() cons;
のように、同じ関数でiterator を返したりconst_iterator を返したりしたいんですが、上手くいかない……
0340339
2007/08/15(水) 11:40:56暑くて頭がボケてたみたい……
0341デフォルトの名無しさん
2007/08/15(水) 11:42:17で意味をなす単項subってどんなマクロ(関数)なんだろ
0342デフォルトの名無しさん
2007/08/15(水) 11:46:15<*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$は問題だらけだね。
0343デフォルトの名無しさん
2007/08/15(水) 11:48:41きっとこんなのだよ。
#define sub(x) putchar(x)
0344デフォルトの名無しさん
2007/08/15(水) 12:04:17そうだな。実際最悪だろ。
0345デフォルトの名無しさん
2007/08/15(水) 12:06:280346デフォルトの名無しさん
2007/08/15(水) 12:08:02実際、それが問題になることがあって、
min,maxを定義しないようにするための NOMINMAX というマクロが存在する
0347デフォルトの名無しさん
2007/08/15(水) 12:08:48実際そのマクロの存在の為に、VC6の<algorithm>にはstd::max, std::minがない。
これはC++の移植性において、由々しき問題である。
0348デフォルトの名無しさん
2007/08/15(水) 12:10:11今となっては
0349デフォルトの名無しさん
2007/08/15(水) 12:10:29Effective C++でも第1項でいきなり問題視してるじゃん。
0350デフォルトの名無しさん
2007/08/15(水) 12:41:160351デフォルトの名無しさん
2007/08/15(水) 12:50:00Windows Vista買ったら、Borland C++5.01のダイアログエデイタが正常に動作しません。
Xpマシンもありますがどうすればいいでしょうか?
1.プログラムはXpマシンで作成してコピーする。
2.ダイアログの部分だけXpマシンで作成してコピーする。
3.Vistaで動作する開発環境を買って移植する。
0352デフォルトの名無しさん
2007/08/15(水) 12:57:030353デフォルトの名無しさん
2007/08/15(水) 14:18:31ttp://kamaitachi.blogdns.net/cgi-bin/izna/manage/img0351.jpg
これか。別にそんなに問題視はしてないように見えるが。
0354デフォルトの名無しさん
2007/08/15(水) 14:21:040355デフォルトの名無しさん
2007/08/15(水) 14:47:210356デフォルトの名無しさん
2007/08/15(水) 14:56:090357デフォルトの名無しさん
2007/08/15(水) 15:01:510358デフォルトの名無しさん
2007/08/15(水) 15:14:410359デフォルトの名無しさん
2007/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 みたいに () 使おう。
0360デフォルトの名無しさん
2007/08/15(水) 18:29:58p が volatile int* であっても
*++p; と書いて、pがdereferenceされることは保証されてないだろ。
0361デフォルトの名無しさん
2007/08/15(水) 19:14:24すまん、よくわからんのだが「p が deference されることは保証されない」のは、特に
*++p;
に言える、と言ってる?それとも、
*p;
でも同様だと言ってる?
0362デフォルトの名無しさん
2007/08/15(水) 19:24:20とりあえず volatile な *p; については
http://c0x.coding-guidelines.com/6.7.3.html
の 1488-1489 辺りで「最適化で削除しちゃいかんよ」ってな事になってるが。
もっといえば
volatile int x;
x;
でも一緒。
0363デフォルトの名無しさん
2007/08/15(水) 20:19:08const volatile int x;
x;
でも処理系は x の読み出しを削除してはいけないし、
x の値を何かに使う場合複数回の読み出しで同じ値だと仮定してもいけない。
この場合の const は「書き込めません」っていう意味だ。
0364デフォルトの名無しさん
2007/08/16(木) 07:37:42char *q;
p = "hoge" + 1;
q = "hoge"[1];
この場合pはoになることは正しいですよね。
pにはhのアドレスが代入される訳ですから。
んでqの場合は配列じゃないので、
char x[] = "hoge";
int r = x[1];
なら正しくrにはoが代入されますけれど、
q = "hoge"[1];とかいても警告は出ますし、
無意味な値が代入されるけれどもコンパイルはされてしまいます。
どうしてコンパイルエラーにならないんでしょうか?
0365デフォルトの名無しさん
2007/08/16(木) 07:55:01はポインタだが、
"hoge"[1]
はポインタではない。
0366デフォルトの名無しさん
2007/08/16(木) 08:01:25なんでコンパイル出来るのか?
が疑問なんです。
0367デフォルトの名無しさん
2007/08/16(木) 08:04:43char* p = 定数;
ならわかる?
0368デフォルトの名無しさん
2007/08/16(木) 08:13:50>pにはhのアドレスが代入される訳ですから。
間違い。
0369デフォルトの名無しさん
2007/08/16(木) 08:20:38C言語だと、整数からポインタへの代入は警告止まりになる。
C++ だとエラーになる。
0370デフォルトの名無しさん
2007/08/16(木) 08:38:00char* p = 定数;
いや、もちろんポインタに数値をキャストしなくても
代入出来ることは知ってます。
q = "hoge"[1];
ってコンパイラはどういう風に解釈するんですか?
>>368
>pにはhのアドレスが代入される訳ですから。
え、じゃ文字列の先頭のアドレスで正しいですか?
0371デフォルトの名無しさん
2007/08/16(木) 08:42:22"hoge"+1なんだから、当然'o'ヘのポインタだ。
0372デフォルトの名無しさん
2007/08/16(木) 08:43:32hのアドレス=文字列の先頭のアドレス
代入は+1が行われたあとだろ?
だからすでにアドレスが変わってる
0373デフォルトの名無しさん
2007/08/16(木) 08:45:27q = "hoge"[1];
と
static const char x[] = "hoge";
q = x[1];
は大体同じ。
0374デフォルトの名無しさん
2007/08/16(木) 08:59:29すいません、勘違いしてました。
>>371,373
えっと自分が聞きたいのは、
char *q = "hoge"[1];
という文がなぜコンパイル出来るかってことなんです。
char q [] ="hoge";
char *p = "hoge";
はあきらかに違うのに
char *q = "hoge"[1];
がコンパイル出来るとまるでこの二つが同じように錯覚してしまって
間違いの元になるんじゃないかって思ったんです。
んで、そういう事が出来るのはきっと何か理由があるに違いないと思ったんです。
0375デフォルトの名無しさん
2007/08/16(木) 09:05:40文法上問題がないから警告止まりでコンパイルされるだけ。
0376デフォルトの名無しさん
2007/08/16(木) 09:08:16> char *p = "hoge";
> はあきらかに違うのに
> char *q = "hoge"[1];
> がコンパイル出来るとまるでこの二つが同じように錯覚してしまって
> 間違いの元になるんじゃないかって思ったんです。
なぜ二つが同じように錯覚するの?
0377デフォルトの名無しさん
2007/08/16(木) 09:27:30ほんとだ。
char *x = "hoge";
p = x[1];
がコンパイル出来る。
x 0x85fd8
p 0x6f
pのアドレスってどこから出てきたんだろう?
0378デフォルトの名無しさん
2007/08/16(木) 09:28:33= の右辺に書かれた T 型の文字リテラルは T 型の static 配列と同じです
= の右辺に書かれた T 型の配列は T 型の配列の先頭要素を指す「Tのポインタ型」になります
理由としてはっつーか便利だし〜みたいな?
0379デフォルトの名無しさん
2007/08/16(木) 09:31:29'o' に決まってるだろう。
0380デフォルトの名無しさん
2007/08/16(木) 09:36:05m9(^Д^)プギャー
0381デフォルトの名無しさん
2007/08/16(木) 09:39:47一応言っておくけど0x6fはアドレスじゃないよ
'o'に対応するアスキーコード
http://c-production.com/special/03090704.html
0382デフォルトの名無しさん
2007/08/16(木) 10:00:58初期化内容としてのみ解釈される。定数"hoge"は実行時には存在しない。
pの場合、実行時に定数"hoge"をメモリ上に用意して、そのポインタを利用する。
なので同じように見えても右辺の意味がまったく違う。
もともとqは以下のように記述すべきものだったんだろうけど、
char q[] = {'h', o'', g'', 'e', '\0'};
不便なので、利便性のために
char q[] = "hoge";
という書き方も受け入れるようになっただけ。
結果的にpとqの右辺が似ているけど、たまたま。
0383デフォルトの名無しさん
2007/08/16(木) 10:07:36p[] = "hooge"
は同じだろ
0384デフォルトの名無しさん
2007/08/16(木) 10:11:42本気で言ってるのか
0385デフォルトの名無しさん
2007/08/16(木) 10:20:58別物
0386デフォルトの名無しさん
2007/08/16(木) 10:44:01どっちもセミコロンが無いからエラーになる→同じこと
ってオチは無しだぞw
0387デフォルトの名無しさん
2007/08/16(木) 10:49:20>>364未満だな
0388デフォルトの名無しさん
2007/08/16(木) 10:49:570389デフォルトの名無しさん
2007/08/16(木) 10:52:180390デフォルトの名無しさん
2007/08/16(木) 11:30:57auto char *p = "hoge";
auto char p[] = "hoge";
…
}
とした時の挙動からして違うことは判るだろ
0391デフォルトの名無しさん
2007/08/16(木) 11:48:08char *p2 = "hoge";
p1[1] = 'a';
p2[1] = 'a'; // <=
0392デフォルトの名無しさん
2007/08/16(木) 12:16:13{1000,100,10}[0] もいけたらいいのに
0393デフォルトの名無しさん
2007/08/16(木) 12:24:01#include <stdio.h>
#include <string.h>
int main() {
printf("%d\n", (int[]){1,3,5,7,9}[1]);
}
0394デフォルトの名無しさん
2007/08/16(木) 12:33:57こんな事出来るんだ。
知らんかった。
0395デフォルトの名無しさん
2007/08/16(木) 12:49:24うは、いけるんやwありがと
0396デフォルトの名無しさん
2007/08/16(木) 21:01:080397デフォルトの名無しさん
2007/08/16(木) 21:45:240398768
2007/08/16(木) 22:36:050399デフォルトの名無しさん
2007/08/16(木) 22:38:180400デフォルトの名無しさん
2007/08/16(木) 22:57:51GCCしか使ってないから知らんのだけど。
0401デフォルトの名無しさん
2007/08/16(木) 23:02:56Comeau
0402デフォルトの名無しさん
2007/08/16(木) 23:06:000403デフォルトの名無しさん
2007/08/16(木) 23:06:010404デフォルトの名無しさん
2007/08/16(木) 23:20:100405デフォルトの名無しさん
2007/08/16(木) 23:20:510406デフォルトの名無しさん
2007/08/16(木) 23:22:13中の人が言ったんだっけか。
0407デフォルトの名無しさん
2007/08/16(木) 23:29:510408デフォルトの名無しさん
2007/08/16(木) 23:35:470409デフォルトの名無しさん
2007/08/17(金) 00:35:35x^2みたいなのを、綺麗に表示するためのライブラリがほしいのです。
できれば、ソース公開している奴で、無ければソースは無くてもいいのですが
とにかく、アプリに組み込んで開発できる奴がいいです。
ちなみに、開発環境はVC++2005、WinXPProを想定しています。
動作環境も同様にXPProです。
よろしくお願いします。
0410デフォルトの名無しさん
2007/08/17(金) 04:48:29ググっただけなんで、中身はシラネ。
http://www.vector.co.jp/soft/win95/prog/se363439.html
0411デフォルトの名無しさん
2007/08/17(金) 05:26:10全く使いこなせてないので、
他人のソース読んでて、使いこなせていると凄く羨ましいんですけれど。
0412デフォルトの名無しさん
2007/08/17(金) 05:27:470413デフォルトの名無しさん
2007/08/17(金) 05:37:520414デフォルトの名無しさん
2007/08/17(金) 05:49:500415デフォルトの名無しさん
2007/08/17(金) 06:14:34グラフィックまわりをいじって変な画面効果とか作るのが楽しいかも
上達が見てわかるし
0416デフォルトの名無しさん
2007/08/17(金) 08:06:25エンディアンと変数型のバイト幅を意識すること。
算術シフトと論理シフトを意識すること。
コツっていうとこんぐらい?
フラグ的な使い方の話だったら、
必要になった時だけ使うのが良いんじゃないかなぁ。
0417デフォルトの名無しさん
2007/08/17(金) 08:08:28論理演算、真理値表、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を求める式を導き出せれば一歩前進。
0418デフォルトの名無しさん
2007/08/17(金) 09:16:08ビット演算は大事ですからね。
精進します。
>>417
グヌヌ。
難しいぞ。分かんないっす。
0419デフォルトの名無しさん
2007/08/17(金) 09:22:070420デフォルトの名無しさん
2007/08/17(金) 09:29:14こうですか?
0421デフォルトの名無しさん
2007/08/17(金) 10:04:580422デフォルトの名無しさん
2007/08/17(金) 11:18:41int bar;
bar = (unsigned int)foo & 0x0fffffff;
という事をしょっちゅうしているプログラムがあるんですけど、
どういう意図を持ってこの処理をしてるんでしょうか?
最初は、int型の変数をunsigned int型にキャストしてint型の変数に代入すると、
例えば-5が代入されてたら4294967291になるのかなぁと思ってたんですが、
そういう訳でもないみたいですし。
0423デフォルトの名無しさん
2007/08/17(金) 11:21:44意図については、そのプログラムを書いた人に聞くのが一番!
あと、もう少し基礎を勉強したほうが良いよ
0424デフォルトの名無しさん
2007/08/17(金) 20:27:31int* a=(int*)malloc(sizeof(int)*10);
if(a==NULL)
みたいにしてポインタが有効かチェクしますよね?
二次元の配列を作る目的で
int** b=(int*)malloc(sizeof(int*)*10);
とやったら、この時も
if(b==NULL)
で、bが有効なポインタかどうか判断していいんですか?
0425デフォルトの名無しさん
2007/08/17(金) 20:31:190426デフォルトの名無しさん
2007/08/17(金) 21:12:36if(b==(void**)0)
0427デフォルトの名無しさん
2007/08/17(金) 22:36:27#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;
}
0428デフォルトの名無しさん
2007/08/17(金) 23:01:35キャストしたらダメだろ。
意味変わる。
0429デフォルトの名無しさん
2007/08/17(金) 23:07:24それでもいいけど、(b&~c)^aの方がシンプルだろう。
0430デフォルトの名無しさん
2007/08/18(土) 01:15:04>>411
最低限の論理学の勉強をする。
ド・モルガンの法則とかは必須。
0431デフォルトの名無しさん
2007/08/18(土) 07:42:18だから
ポインタへのポインタが"NULL"かどうかは
(void**)0で調べないといけない
0432デフォルトの名無しさん
2007/08/18(土) 08:20:03>だから
いいえ。
0433デフォルトの名無しさん
2007/08/18(土) 10:12:01世界中のJavaを使える人のコンピューターに対する理解度の高さの平均は、
どっちが高いですか?
0434デフォルトの名無しさん
2007/08/18(土) 10:16:530435デフォルトの名無しさん
2007/08/18(土) 10:18:08スレ違い
0436DEFORTの名無し
2007/08/18(土) 13:41:52MinGWつかってみたけど微妙
0437デフォルトの名無しさん
2007/08/18(土) 13:47:020438デフォルトの名無しさん
2007/08/18(土) 14:28:500x0fffffff でマスクってことは、下位28ビットが欲しいってだけじゃね。
あと、unsigned int へのキャストは無駄だな。
0439デフォルトの名無しさん
2007/08/18(土) 15:32:58どこからそんなデマを仕入れてきた?
0440デフォルトの名無しさん
2007/08/18(土) 16:02:210441デフォルトの名無しさん
2007/08/18(土) 16:06:100442デフォルトの名無しさん
2007/08/18(土) 20:10:13特定のコマンドを実行するようにしたいのですが、どのよう記述したら良いでしょうか?
具体的にはXSIとゆう3DCGソフトの「アニメーションエディタ/編集/オリジナルコマンド」
を自動実行させたいのですが、、、
宜しくお願いします。
0443デフォルトの名無しさん
2007/08/18(土) 20:13:480444デフォルトの名無しさん
2007/08/18(土) 20:16:440445デフォルトの名無しさん
2007/08/19(日) 00:24:050446デフォルトの名無しさん
2007/08/19(日) 00:43:34intとかlongとか(負数はあり得ないので、unsignedでしょうか)
あと、Windowsの32ビット環境では、intとlongはまったく同じ型として扱っても問題ないですか?
0447デフォルトの名無しさん
2007/08/19(日) 00:45:47ウィンドウメニュー内の特定のメニュー項目が選択されたときって、
たぶん、WM_COMMANDとかのウィンドウメッセージが飛ぶと思うんだけど、
その具体的なパラメタを調べて、アクティブとかのイベント関係なく
直接呼んじゃだめなの?
もし、アクティブになると同時って条件をつけたいなら、
1)ウィンドウをアクティブにする
2)ウィンドウメッセージを送信する
っていうだけの簡単なプログラムを作るとか。
0448デフォルトの名無しさん
2007/08/19(日) 01:13:18特定の型には決まっていない。整数ならいい。
負の数になったら未定義動作。
int と long は違う型です。
0449デフォルトの名無しさん
2007/08/19(日) 01:30:05おもしろいIDでた
0450デフォルトの名無しさん
2007/08/19(日) 01:32:340451デフォルトの名無しさん
2007/08/19(日) 01:34:41>特定の型には決まっていない。整数ならいい。
C++の言語仕様の詳細は知らないけど、VCならsize_tでいいんじゃね
http://msdn2.microsoft.com/en-us/library/t48aek43(VS.80).aspx
http://msdn2.microsoft.com/en-us/library/ms859258.aspx
>int と long は違う型です。
これもVC(x86)の範囲内で同じようにつかえるかって質問なら、問題ないと思うけど
http://msdn2.microsoft.com/en-us/library/ms859270.aspx
0452デフォルトの名無しさん
2007/08/19(日) 01:36:23この板ID無いが。
0453デフォルトの名無しさん
2007/08/19(日) 01:57:33operator new 関数の第1引数は VC に限らず size_t 。
でもそれと new 式の配列要素数を表す式の型とは別。
サイズが同じだろうがなんだろうが int と long は違う型。
まったく同じ型として扱うのには問題がある。
0454デフォルトの名無しさん
2007/08/19(日) 03:13:14ごめん、1点分からないので、教えていただきたい。
とりあえず、>>446はVCの利用上(実装上)の制限が知りたいんじゃないの、
と思ったので、その観点だけで書いたのは自分の思い込みで、それで意見が
すれ違うのは仕方ないんだけど、
>特定の型には決まっていない。整数ならいい。
>でもそれと new 式の配列要素数を表す式の型とは別。
の箇所。
そうはいっても、ソースをコンパイルしてバイナリに落とす以上、コンパイラ定義かも
しれないけど、具体的な値の有効範囲ってかならずあるんじゃないの?
実際、MSDNの配列定義のサイズ指定の箇所では
0以上の整数型、ただしMicrosoft仕様では... としてsize_tに言及してるわけだし。
それにoperator new 関数の第1引数がsize_tに決まってるなら、size_t以上の値を
記述して受け入れてくれるコンパイラがありそうにないので、
その意味でも「整数ならいい」ってのはあいまいな感じがする。
なので、「整数ならいい」ってのは純粋に言語仕様の話として語っているのか、
それとも、コンパイラの実装やソース記述上の制限を語る場合でも同じ回答
になるのか、気になって眠れなくなりそうなんで、正確なところが知りたいんだけど。
0455デフォルトの名無しさん
2007/08/19(日) 03:20:37________
/ |
/__ |
/ /. |-―‐.
/ \ / |
/ ./ |
ノ ヽ__」
|
.―┼‐フ
|/
/|/ ̄ ̄ ̄\
//| |
| |
| (二X
0456デフォルトの名無しさん
2007/08/19(日) 03:39:56現行の規格ではだいたい >>453 みたいなことしか言えない。ある意味
これが正確なところ。
new とは別に、各処理系が定めるべきいろいろな数値の上限の中に
「オブジェクトのサイズ」というのがある。配列オブジェクトもこの制限を
うけるので、値の範囲はこれに基づくとも言える。これについて規格が
最低限のガイドラインとして提示しているのは 262144 。
まだ規格化はされてないけどこんな話もある。
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#624
0457デフォルトの名無しさん
2007/08/19(日) 04:45:36仕様自身は結局釈然としない部分があるけど、
>>448,453の回答が正確で誠実な回答というのは理解できた。
リンク先は策定中の次期規格?
また、膨大な項目が...
現状でさえ、もうついていけないくらいややこしいのに。
0458デフォルトの名無しさん
2007/08/19(日) 12:35:03int WINAPI Winmain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC)
}
ChangeWindowMode(TRUE);
if(DxLib_Init()==-1)return(-1);
DrawBox(0, 0, 120, 65535, TRUE);
WaitKey();
DxLib_End();
return(0);
}
というプログラム書くとエラー出るのはなぜでしょうか?ちなみに
14さいからはじめるリアルに動くゲーム物理プログラミング教室C言語編
という本に載ってます。
0459デフォルトの名無しさん
2007/08/19(日) 12:38:390460458
2007/08/19(日) 12:40:14エラー E2190 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 4: 不要な }
エラー E2190 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 4: 不要な }
エラー E2303 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 5: 型名が必要
エラー E2356 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 5: 'ChangeWindowMode(int)' の再宣言で型が一致していない
エラー E2344 C:\Users\shiro\Desktop\MyC\プロジェクトに追加すべきファイル_BCC用\DxLib\DxLib.h 1017: 一つ前の 'ChangeWindowMode(int)' の定義位置
エラー E2063 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 5: 不正な初期化
エラー E2293 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 5: ) が必要
エラー E2040 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 6: 宣言が正しく終了していない
エラー E2303 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 7: 型名が必要
エラー E2356 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 7: 'DrawBox(int,int,int,int,int,int)' の再宣言で型が一致していない
エラー E2344 C:\Users\shiro\Desktop\MyC\プロジェクトに追加すべきファイル_BCC用\DxLib\DxLib.h 1519: 一つ前の 'DrawBox(int,int,int,int,int,int)' の定義位置
エラー E2063 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 7: 不正な初期化
エラー E2293 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 7: ) が必要
エラー E2040 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 11: 宣言が正しく終了していない
エラー E2190 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 12: 不要な }
*** 16 errors in Compile ***
** error 1 ** deleting Debug\dxtest.obj
です。
ちなみに今日勉強したばかりでさぱりとわかりません
0461デフォルトの名無しさん
2007/08/19(日) 12:41:460462デフォルトの名無しさん
2007/08/19(日) 12:42:050463デフォルトの名無しさん
2007/08/19(日) 12:42:214行目を穴があくまでじっくり見ろ、その教科書とひたすら比較しろ。
それでわからなかったらもっかいおいで。
0464デフォルトの名無しさん
2007/08/19(日) 12:45:460465デフォルトの名無しさん
2007/08/19(日) 12:46:33int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC)
{
ChangeWindowMode(TRUE);
if(DxLib_Init()==-1)return(-1);
DrawBox(0, 0, 0, 120, 65535, TRUE);
WaitKey();
DxLib_End();
return(0);
}
0466デフォルトの名無しさん
2007/08/19(日) 12:49:38こっちのがいいかも分からんね
0467458
2007/08/19(日) 13:11:31まだ
Fatal: ファイル VORBISFILE_STATIC.LIB が開けません
と出ます。
>>464
まったくおっしゃるとおりです
0468デフォルトの名無しさん
2007/08/19(日) 13:59:36エラーの通りvorbisfile_static.libってファイルが見つからないんだろ。
あとは環境が分からないと何も言えないと思う。
自分の開発環境を検索ワードに入れて、
(「vorbisfile_static.lib VC++」とか「vorbisfile_static.lib BCC」とか)
その辺でググって見たらどうよ?
0469デフォルトの名無しさん
2007/08/19(日) 15:14:220470デフォルトの名無しさん
2007/08/19(日) 15:55:17それをソースと同じディレクトリにコピー
というか「このフォルダのファイルを全てコピー」みたいなフォルダなかったか?
0471230
2007/08/19(日) 23:24:29-std=c++98というコンパイラオプションというのがあるらしいのですが
ぐぐってもよく分かりませんでした。
誰か教えてください。
0472471
2007/08/19(日) 23:25:320473デフォルトの名無しさん
2007/08/19(日) 23:42:300474デフォルトの名無しさん
2007/08/19(日) 23:48:120475471
2007/08/19(日) 23:49:450476デフォルトの名無しさん
2007/08/19(日) 23:51:50まるちか?2ちゃんではマルチポストは叩かれるですよ
せめて、主とする、質問したスレを付記
機嫌が良ければ、そこにヒント書きますから
0477デフォルトの名無しさん
2007/08/19(日) 23:56:08ツリーコントロールのアイテムの文字列が長いときに
横スクロールにせず、文字列を折り返すことってできますでしょうか?
0478デフォルトの名無しさん
2007/08/20(月) 01:12:13訳あって utf-8 環境で行うことになりました。
euc-jp 環境で作ったファイルを utf-8 環境に持ってきて、
iconvで文字コードを変更し、コンパイル、実行すると、出力(日本語)が文字化けてしまいます。
utf-8 環境に持ってきた euc-jp のファイルを、
文字コードをそのままにして、端末の表示文字コードを utf-8 から euc-jp に変更した上で、コンパイル、実行すると、正しく表示されます。
これななぜでしょうか?
curses が utf-8に対応していないとかってありますか?
0479デフォルトの名無しさん
2007/08/20(月) 01:14:08ソース文字セットと実行文字セットは別。
gcc のオプション -finput-charset と -fexec-charset を参照すべし。
0480デフォルトの名無しさん
2007/08/20(月) 01:15:56curses 関係あるのか?
puts("あいうえお") とかで試せばわかると思うけど。
0481デフォルトの名無しさん
2007/08/20(月) 01:20:45>480の言うように標準出力に出力してみてその時点で文字化けしているならgccのオプションなどを調節。
その上でcurses使うと化けるのなら、cursesの設定か何か、その辺りの調査。
0482デフォルトの名無しさん
2007/08/20(月) 01:36:080483デフォルトの名無しさん
2007/08/20(月) 01:42:230484デフォルトの名無しさん
2007/08/20(月) 01:48:550485デフォルトの名無しさん
2007/08/20(月) 02:10:18どうもです
XSIではコマンドを実行する際にエディタのIDのような物が必要で、
エディタウィンドウを複数開いている時には、コマンド実行前に
その時アクティブなウィンドウのIDを取得する必要があります。
WM_ACTIVATEとかを使えば良いのでしょうか?
0486デフォルトの名無しさん
2007/08/20(月) 02:24:33あれ使えるソフト作るのって大変なんでしょうか?
AVIutlみたいなソフトって個人では簡単に作れないんですかね?
どの辺勉強したらいいんでしょうか?
0487デフォルトの名無しさん
2007/08/20(月) 02:27:35>>479,480,481
さんを参考にして少しいじってみました。
まず、480さんの言うように、単純に puts("あいうえお") を行うプログラムを書き実行してみました。
すると、”-finput-charset=utf-8 -fexec-charset=utf-8”が有る無しに関わらず、文字化けしませんでした。
次に、cursesのコンパイルを、”-finput-charset=utf-8 -fexec-charset=utf-8”を付けて実行してみたところ、やはり文字化けが発生しました。
0488デフォルトの名無しさん
2007/08/20(月) 02:43:20utf-8だと端末上での漢字の幅がバイト長と単純に一致しなくなるし
naiveな実装だと色々問題起きそう
0489デフォルトの名無しさん
2007/08/20(月) 03:30:44std::printf はもちろん、名前空間のない ::printf も使えてしまいます。
BCB2006だと逆に、<stdio.h>をインクルードすると
::printf を使えますが、 std::printf も使えます。
どちらが正しいのでしょうか。また、正しくない方を正しくする方法はありますか?
0490デフォルトの名無しさん
2007/08/20(月) 04:18:35http://www.hakodate-ct.ac.jp/~tokai/tokai/gtkmm/etc/p3.htm
というサイトがあったので、
・-lncurses ではなくて -lncursesw をリンクする
・#include <locale.h>
・setlocale( LC_ALL, "" );
を取り入れたところとりあえず、euc-jp 環境のファイルを utf-8 環境に持ってきて、
このファイルの文字コードを utf-8 に変えてコンパイルし実行すると、
文字化けしない ・・・というのは達成できました。
しかし、私は UNIX(LINUX) にあるような SLコマンド のクマAA バージョンを作って遊んでいたのですが、
euc-jp環境とutf-8環境では少し動きが変わってしまいました。
その動きの変わってしまう場所が、euc-jp環境で苦労して改良したところなので、
かなりショックです。
まぁ、なんとか解決策があればいいのですが、
私の知識ではちょっとつらいかも知れません。
0491デフォルトの名無しさん
2007/08/20(月) 07:47:38;
こんなのあるのね
びっくり
0492デフォルトの名無しさん
2007/08/20(月) 09:25:050493デフォルトの名無しさん
2007/08/20(月) 09:27:330494デフォルトの名無しさん
2007/08/20(月) 09:31:18カウンタが要るときはfor使うかもしらんけど
0495デフォルトの名無しさん
2007/08/20(月) 09:46:09<cstdio> で std::printf が、 <stdio.h> で ::printf が使えるようになることになっている。
1つのヘッダで両方が使えるようになることは保証されない。
0496デフォルトの名無しさん
2007/08/20(月) 18:43:51メモリ4GBもあるので、デバッグ中にbad_allocが投げられることは今まで一度もありません。
投げられた際の動作をデバッグしたいのですが、そういうときはどうすればいいでしょうか。
敢えてメモリを消費したりするんですか?
↑ではbad_allocのことですが、他にもWindowsのAPI関数が失敗したときとかも、
ちゃんと自分が書いた処理が動作するか確かめたいんですが。
0497デフォルトの名無しさん
2007/08/20(月) 19:07:290498デフォルトの名無しさん
2007/08/20(月) 19:37:17適当にラップして失敗に相当する結果を返せばいいべ
0499デフォルトの名無しさん
2007/08/20(月) 20:47:050500デフォルトの名無しさん
2007/08/20(月) 21:09:140501デフォルトの名無しさん
2007/08/20(月) 21:11:150502デフォルトの名無しさん
2007/08/20(月) 21:30:04ありがとうございます。
このページ
http://ash.jp/code/unitbl21.htm
の、UTF-8の欄のような値を出力する方法ってありますか?
0503デフォルトの名無しさん
2007/08/20(月) 22:23:300504デフォルトの名無しさん
2007/08/20(月) 22:26:44http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#456
によると、
> Including the header <cxxx> declares a C name in namespace std.
> Including the header <xxx.h> declares a C name in namespace std (effectively by including
> <cxxx>), then imports it into the global namespace with an individual using declaration.
ということで、xxx.h だと std とグローバル両方で宣言されるというのが規格の意図らしい。
なので、BCB2006 の挙動は(それだけ見ると)規格に合致している。
が、現実的には
> If you want to assuredly declare a C name in the global namespace, include <xxx.h>.
> You may or may not also get the declaration in namespace std.
> If you want to assuredly declare a C name in namespace std, include <cxxx>.
> You may or may not also get the declaration in the global namespace.
ということで、>495 が妥当な仮定。
規格もこの現状を追認する形での修正が提案されている。
>502
自分がやりたいと思っていることをもうちょい正確に表現して欲しい。
文字が表示されて欲しいのか、文字コードが表示されて欲しいのかどっち?
入力として考えているのはどんなデータ?外部から与えられる文字列か、文字列リテラルか。文字コードは?
0505504
2007/08/20(月) 22:28:320506デフォルトの名無しさん
2007/08/21(火) 02:01:29>>499
バグでそんな値(もっとでかい、0x40000000とか)を与えたことがあるけど、
無理に仮想記憶拡大して確保しようとして、システムが実質操作不能になるだけだった
0507デフォルトの名無しさん
2007/08/21(火) 02:33:09Win2000の頃は2G制限とかあった記憶があるけど、今はどうなんだろ。
0508デフォルトの名無しさん
2007/08/21(火) 03:06:41以下は単なる思いつき。
1. プログラムの改造が可能なら、自分用の一定量しか領域確保できないメモリマネージャを作る。
2. メモリ取得APIをフックして自力で制限する。
3. SetProcessWorkingSetSizeを指定して、同時にスワップを小さくする。
0509デフォルトの名無しさん
2007/08/21(火) 05:28:56もうだめだぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁ
0510デフォルトの名無しさん
2007/08/21(火) 05:38:16さっさと人生やり直せ。
0511デフォルトの名無しさん
2007/08/21(火) 08:15:521関数1000行なら窓から投げ捨てろ
0512デフォルトの名無しさん
2007/08/21(火) 08:40:460513デフォルトの名無しさん
2007/08/21(火) 09:28:25foo->CopyArray(hoge);
Cfoo:Cfoo()
{
float m_array = new float[100];
}
void Cfoo:CopyArray( float arg[])
{
arg = m_array;
}
配列のコピーをしたいとき、
上のように配列の名前(=先頭のポインタ?)
だけコピーするだけではダメなようなのですが、なぜですか?
for(int i=0;i<100;i++)
arg[i]=m_array[i];
}
のように中身を一つずつきちんとコピーしないとダメなんでしょうか?
0514デフォルトの名無しさん
2007/08/21(火) 09:37:170515デフォルトの名無しさん
2007/08/21(火) 09:43:120516デフォルトの名無しさん
2007/08/21(火) 09:47:540517デフォルトの名無しさん
2007/08/21(火) 11:12:35>float hoge = new float[100];
コンパイルできるコードを提示しなさい。
>arg = m_array;
それは、仮引き数にメンバ変数の値を代入しているだけなので、仮引き数の寿命とともに無に帰します。
0518デフォルトの名無しさん
2007/08/21(火) 11:13:18そんなコードを書く香具師は野垂れ死に値すると思います。
0519513
2007/08/21(火) 11:55:54>>517
>コンパイルできるコードを提示しなさい。
float* hoge = new float[100];
でした。
>それは、仮引き数にメンバ変数の値を代入しているだけなので、仮引き数の寿命とともに無に帰します。
というわけで、分かっておられると思いますが渡してるのはポインタでして
寿命は関係あるんですかね?
>>514
これもちょっと理屈が分かりません。
なぜ配列に別名をつけてることになるんですか?
配列の名前って先頭のポインタをさしてるんじゃなかったでしょうか?
>>518
一行で済むのでforで要素を一つずつコピーするよりは>>515>>516はいいかなと思ったんですが、
どうして>>515はダメなんですか?
0520デフォルトの名無しさん
2007/08/21(火) 12:04:44>寿命は関係あるんですかね?
その仮引き数の寿命は、その関数を抜けるまでです。
ポインタがポイントしている先のことは言及していませんね。
もう少し、ポインタ変数と言うものを理解しておいた方が良さそうです。
>なぜ配列に別名をつけてることになるんですか?
ポインタ変数にポインタ変数の値を代入するだけでは、
ポイント先の複写は行なわれません。
もう少し、ポインタ変数(ry
>どうして>>515はダメなんですか?
どうしてダメじゃないと思うんですか?
0521デフォルトの名無しさん
2007/08/21(火) 12:06:18> どうして>>515はダメなんですか?
float配列ならば動くけど、一般のオブジェクトの配列なら破滅的。
たとえば、string配列をmemcpyしたらどうなると思う?
0522デフォルトの名無しさん
2007/08/21(火) 12:17:400523デフォルトの名無しさん
2007/08/21(火) 12:24:46>ポインタ変数にポインタ変数の値を代入するだけでは、
>ポイント先の複写は行なわれません。
いま気づきました。狂ってました。すいません。
要するに考え方として
「呼ぶ側で作った配列を渡してm_arrayの中身をコピーして貰ってくる」んじゃなくて
「ポインタを渡してm_arrayの先頭のアドレスだけ貰ってくる」っていうような
感じの書き方はできないんですかね?
呼ぶ側で、m_arrayの先頭のアドレスとサイズだけ分かれば
中身にアクセスできそうに思うのですが。
例えば、クラスメンバで持っているprivateな普通のオブジェクトインスタンスのポインタなんかの場合は
わざわざ中身をコピーしないでアドレスだけGet〜とかで貰って使ったりするじゃないですか?
>どうしてダメじゃないと思うんですか?
試したらとりあえずうまくいったんで・・・
>>521
わかりません。floatでは一応動きましたが、なんでダメなんでしょうか。
サイズ指定した範囲をコピーすればうまく動くと思うのですが。
0524デフォルトの名無しさん
2007/08/21(火) 12:29:27> 「ポインタを渡してm_arrayの先頭のアドレスだけ貰ってくる」っていうような
> 感じの書き方はできないんですかね?
なんでできないと思うの?
0525デフォルトの名無しさん
2007/08/21(火) 12:31:36書き方が分からないんで
そういう書き方が出来るなら教えてください、
ってことなんですが。
0526デフォルトの名無しさん
2007/08/21(火) 12:34:010527デフォルトの名無しさん
2007/08/21(火) 12:35:28class hoge {
char *str;
int length;
};
main() {
hoge* v1, v2;
v1 = new hoge;
v1->str = new char[100];
memcpy(v2, v1, sizeof(hoge));
strcpy(v1->str, "v1");
strcpy(v2->str, "v2");
printf("v1.str is %s.\nv2.str is %s", v1->str, v2->str);
}
0528デフォルトの名無しさん
2007/08/21(火) 12:41:40>中身にアクセスできそうに思うのですが。
思いついて下のようにやったらうまくいったようなのですが、
これってなんか危険だったりしますか?
float* hoge = new float[100];
hoge = foo->GetArray();
Cfoo:Cfoo() {
float m_array = new float[100];
}
float* Cfoo:GetArray(){return m_array;}
0529デフォルトの名無しさん
2007/08/21(火) 12:47:45最初のnew float[100]で確保したメモリはどうやって解放するんだい?
0530デフォルトの名無しさん
2007/08/21(火) 12:52:23配列のコピーをしたいんじゃなかったのか?
0531デフォルトの名無しさん
2007/08/21(火) 12:58:48理解にしばらく時間を要します。
脳のクロックが著しく劣っているのですいません。
>>529
これでもうまくいったっぽいですが、これならOKですか?
float* hoge;
hoge = foo->GetArray();
Cfoo:Cfoo() {
m_array = new float[100];
}
float* Cfoo:GetArray(){return m_array;}
>>530
すいません、コピーというか、m_arrayの中身を
どうにかして呼ぶ側で使えれば何でも良かったのですが。
0532デフォルトの名無しさん
2007/08/21(火) 13:00:550533デフォルトの名無しさん
2007/08/21(火) 13:02:09巧くいってない巧くいってない。
>>531
だから、なんでコードの断片載せるんだって。
で、なんでまたfooはポインタなんだ?
0534デフォルトの名無しさん
2007/08/21(火) 13:03:27足し算などは同じ。超越関数などは速い可能性が高い。
しかし、他の方への変換が入ったりすると遅くなることもある。
結論:一概には言えない。
0535デフォルトの名無しさん
2007/08/21(火) 13:06:070536513
2007/08/21(火) 13:14:09やりたいことはCfooのメンバとしてもってるfloatの配列m_arrayの中身を
コピーするなりポインタを貰うなり、どういう方法があるのか分かりませんが
正しい方法で使いたいってことなんですが。
元の中身を書き換える必要はありません。知れればいいです。
で、とりあえず531で動いてますが、これは危険でしょうか。
要素数は別個貰うなりすれば分かるので
その範囲内だけアクセスするなら大丈夫そうなんですが、ダメですか。
0537デフォルトの名無しさん
2007/08/21(火) 13:16:58特に問題はないんじゃないの
0538デフォルトの名無しさん
2007/08/21(火) 13:28:14そうですか。ではひとまずこれでやっときます。
どうもお騒がせしました。
0539デフォルトの名無しさん
2007/08/21(火) 13:36:29それ以前に、Cfooを何故ポインタにしているかを知りたいんだが。
0540デフォルトの名無しさん
2007/08/21(火) 13:52:240541513
2007/08/21(火) 13:53:03>書き換えないなら戻り値はfloat *ではなくconst float *にするべきだな。
なるほど。
>Cfooを何故ポインタにしているかを知りたいんだが。
特に理由はないですが、
newしたCfooのポインタをメンバとして持ってるだけです。
ポインタで持ってるほうがいろいろ別のクラスに連れまわしたりするとき便利かなと。
むしろなぜそこが気になるのか知りたいんですが。
0542デフォルトの名無しさん
2007/08/21(火) 14:03:17>むしろなぜそこが気になるのか知りたいんですが。
半ば個人的な興味だ。無条件にnewしたがるJava出身者が身近にいるもんでね。
# しかも、悪いことにdeleteする癖はついてないと来たもんだw
0543513
2007/08/21(火) 14:06:22はい、まさに私のことです。
0544デフォルトの名無しさん
2007/08/21(火) 14:10:560545デフォルトの名無しさん
2007/08/21(火) 14:16:01BCB使いもnewする癖が‥‥
0546デフォルトの名無しさん
2007/08/21(火) 15:40:21C++的にはスマートポインタを使え、ということになるんだが
いずれにせよ常にownershipを意識している必要はあるね
0547デフォルトの名無しさん
2007/08/21(火) 16:02:26# オブジェクトは全てグローバルに管理されているとしたら、それはそれで難だけど。
0548デフォルトの名無しさん
2007/08/21(火) 16:03:31VCL使ってると確かにnew癖つくなw
0549デフォルトの名無しさん
2007/08/21(火) 18:22:210550デフォルトの名無しさん
2007/08/21(火) 21:25:000551デフォルトの名無しさん
2007/08/21(火) 22:27:070552デフォルトの名無しさん
2007/08/22(水) 00:16:080553デフォルトの名無しさん
2007/08/22(水) 04:50:100554デフォルトの名無しさん
2007/08/22(水) 10:37:520555デフォルトの名無しさん
2007/08/22(水) 12:21:10char string[] ="Hello,World";
char copystring[13];
stringcopy (string,copystring);
printf("%s¥n",copystring);
return 0;
}
void stringcopy (char *buff,char *copy){
int i = 0;
while(buff[i]){
copy[i] = buff[i];
i++;
}
copy[i] = '¥0';
}
でwhile(buff[i]){…}を
for(i=0;buff[i] == 0;i++)
copy[i] = buff[i];
とすると動かないんですけれど、何故ですか?
0556デフォルトの名無しさん
2007/08/22(水) 12:25:250557デフォルトの名無しさん
2007/08/22(水) 12:29:42printf("loop %d\n",i);
copy[i] = buff[i];
}
ってやってみたら、なにか気づくかも
0558デフォルトの名無しさん
2007/08/22(水) 12:36:13for(i=0;buff[i] != 0;i++)
ってすると動くぞ!
0559デフォルトの名無しさん
2007/08/22(水) 12:49:13Container.h:9: an anonymous union cannot have function members
Container.h:26: abstract declarator `<無名 class>' used as declaration
Container.h:26: anonumous 名前空間の集合体は static でなければなりません
0560デフォルトの名無しさん
2007/08/22(水) 12:50:45すいません、間違えて「書き込む」ボタン押してしまいました。
Containerというクラス名をAAというクラス名にしたら、
AA.h:9: an anonymous union cannot have function members
AA.h:26: abstract declarator `<無名 class>' used as declaration
AA.h:26: anonumous 名前空間の集合体は static でなければなりません
というエラーが出てきたのですが、このエラーの意味が理解できません。
教えてください。
0561デフォルトの名無しさん
2007/08/22(水) 13:12:060562デフォルトの名無しさん
2007/08/22(水) 13:16:23最初のエラーだけとってみれば
無名共用体には関数メンバを持つことができない
というエラー。
だから名前だけじゃなくて何か意味または構造が変わるような修正をしてると
思うけど、情報が不足してるのでこれ以上のことは分からない。
0563デフォルトの名無しさん
2007/08/22(水) 13:42:53自己解決しました。
ContainerからAAに名前を変えたときに、
#ifndef CONTAINER
#define CONTAINER
#include "Container.h"
#endif
も
#ifndef AA
#define AA
#include "AA.h"
#endif
としていたためにエラーが出ていました。
情報の足りない質問で申し訳ありませんでした。m(_ _)m
0564デフォルトの名無しさん
2007/08/22(水) 13:51:53まあ、解決したのはよかったけど、
そもそものソースの構造がおかしいんじゃないのか?
普通は Container.h の中で全体を
Container.h
-----------------
#ifndef CONTAINER
#define CONTAINER
〜
#endif
-----------------
としてくくるんであって、includeする側では、二重取り込み防止マクロなんて書かないだろ。
0565でいびす
2007/08/22(水) 16:08:55その時、読込んだ値を文字として認識できるか
調べたいのですが、やり方を教えてもらえませんか?
ループしながら、1文字づつ調べたいです。
ちなみに、文字列には半角の日本語と全角の日本語が混在しています。
お願いします。
0566デフォルトの名無しさん
2007/08/22(水) 16:23:15_ismbbprint
あたり使えるか調べて見れ
0567でいびす
2007/08/22(水) 16:51:43_ismbbprintは使えませんでした。
ビルドが通らなかったです。
0568デフォルトの名無しさん
2007/08/22(水) 16:55:130569デフォルトの名無しさん
2007/08/22(水) 16:59:270570でいびす
2007/08/22(水) 17:04:29古いプログラムをカスタマイズする事になったので使ってます。
0572デフォルトの名無しさん
2007/08/22(水) 17:23:180574デフォルトの名無しさん
2007/08/22(水) 17:25:49無理やり使ったが、今にして思えばひでえ出来だった
0575デフォルトの名無しさん
2007/08/22(水) 19:20:050576デフォルトの名無しさん
2007/08/22(水) 19:22:180577デフォルトの名無しさん
2007/08/22(水) 19:42:580578デフォルトの名無しさん
2007/08/22(水) 19:45:100579デフォルトの名無しさん
2007/08/22(水) 20:49:37new ヘッダじゃなくて eh.h で宣言されてたんだっけ。
bad_alloc は VC5 で宣言されてたっけ?
0580デフォルトの名無しさん
2007/08/22(水) 21:01:23VCだと昔から日本語対応の関数はあって、どこかのバージョンで
_ismbXXXX のようなマルチバイト系関数であることを明示するような
関数名になったはず。
それがVC++5.0かどうか知らないが、でもだから対応する関数はあるはず。
で、ぐぐると以下のサイトに適度に古そうな関数名がならんでいるので
試してはどうだろうか。
ttp://www.geocities.co.jp/SiliconValley-Bay/7437/c/is.htm
0581デフォルトの名無しさん
2007/08/22(水) 21:08:46というのは余計なお世話か。
0582デフォルトの名無しさん
2007/08/22(水) 21:12:02だいたいVC++5.0の時代のアプリにShift_JIS以外使ってるとも思えないけど。
0583でいびす
2007/08/22(水) 21:14:170584デフォルトの名無しさん
2007/08/22(水) 22:09:240585デフォルトの名無しさん
2007/08/22(水) 22:13:510586デフォルトの名無しさん
2007/08/22(水) 22:20:15clにそれらしいオプションが見当たらないからできんのかと思ってた
0587デフォルトの名無しさん
2007/08/22(水) 22:24:34どうやって指定するの?
0588デフォルトの名無しさん
2007/08/22(水) 22:31:21おれもきになる
0589デフォルトの名無しさん
2007/08/22(水) 22:40:08これを関数の引数に渡すときはhogeのポインタを渡した方が
hoge自体を値渡しするより動作は速いですか?
0590デフォルトの名無しさん
2007/08/22(水) 22:41:32iteratorを渡せ
0591デフォルトの名無しさん
2007/08/22(水) 22:43:220592デフォルトの名無しさん
2007/08/22(水) 22:45:330593デフォルトの名無しさん
2007/08/22(水) 22:48:03void swap_ptr(int *a, int *b) { int tmp = *a; *a = *b; *b = tmp; }
void swap_ref(int &a, int &b) { int tmp = a; a = b; b = tmp; }
main() { int m = 1, n = 2; swap_ptr(&m, &n); swap_ref(m, n); }
swap_ref()がリファレンス渡し。
この場合は入出力引数だが、入力だけでいいんならconstつけろ。
0594デフォルトの名無しさん
2007/08/22(水) 22:50:19サンクスコ
0595デフォルトの名無しさん
2007/08/22(水) 22:55:22サンクスコ
0596デフォルトの名無しさん
2007/08/22(水) 23:12:21C++コンパイルできんのか
マネージドじゃないと無理かな
0597デフォルトの名無しさん
2007/08/22(水) 23:37:33このitrが指してる要素の中身のアドレスを取りたいときは
どうやって書けばいいんですか?
CHoge* p_hoge;
p_hoge = &itr;
とか書いたら怒られました。
0598デフォルトの名無しさん
2007/08/22(水) 23:40:540599デフォルトの名無しさん
2007/08/22(水) 23:42:12vectorなら鼻からbegin()/end()を使わず、
&v[0]と&v[0] + v.size()でポインタを得て、
それをイテレータとしても使うという手もある。
0600デフォルトの名無しさん
2007/08/22(水) 23:42:39出来ました。サンクスコ
0601デフォルトの名無しさん
2007/08/23(木) 01:12:400602デフォルトの名無しさん
2007/08/23(木) 01:13:32エンコードの指定は出来ないが、
BOMが付いてればUnicode LE/BEやUTF-8はそれで判定する。
BOMがなければANSI文字コードとみなしている。
javacやunix系のコンパイラはUTF-8にBOMが付いてると処理してくれないものが多く、
双方で利用しようとすると結構めんどい。
0603デフォルトの名無しさん
2007/08/23(木) 01:13:530604デフォルトの名無しさん
2007/08/23(木) 01:49:46そんなことしてもコンストラクタから飛んでくる例外は止まらないぜ。
0605デフォルトの名無しさん
2007/08/23(木) 01:50:200606デフォルトの名無しさん
2007/08/23(木) 11:14:46それなりに移植性考えたらC++のソースにBOMつけるとかありえんわな
で、当然boostのソースにはそんなもんついてないし、一部のヘッダにLatin-1な
人名が入ってるから、VC++8.0でコンパイルすると色々苦情を言ってくんのな
0607デフォルトの名無しさん
2007/08/24(金) 22:47:56Cには無く、C++では使用出来るようなことを幅広く説明している書籍でお勧めのものはありますでしょうか。
発売年や価格、本自体の厚さなど数多くありすぎて、どういうものを購入すればいいのか分かりません。
近くに本屋さんはあるのですがプログラム関係は少ないですのでネット通販で買おうかと考えております。
それ故、内容が確認できず判断が・・orz
0608デフォルトの名無しさん
2007/08/24(金) 22:50:210609デフォルトの名無しさん
2007/08/24(金) 22:58:28あまりに斬新過ぎる見解でワロタ
それはそうと、wxWidgetsのWindowProcって、ウィンドウクラスのインスタンス
見つけるのにわざわざグローバルなハッシュテーブル引いてんだな、なんだこりゃ
せめてWin32ならGetWindowLongPtr()使ってくれよ
なんかそうできない技術的理由があんのか
ATLみたいなサンクに書き換えたら、そんだけで激高速化すんじゃね?
0610デフォルトの名無しさん
2007/08/24(金) 23:15:45結局この本は必要…通読する対象ではない気がする、字引的にほぼ全部載ってる
http://www.amazon.co.jp/dp/475611895X
0611デフォルトの名無しさん
2007/08/25(土) 00:31:15いったい一秒に何回メッセージが来て、
グローバルハッシュを引くのに何ナノ秒
余分にかかるというんだ?
0612デフォルトの名無しさん
2007/08/25(土) 00:37:41グローバルハッシュを引くのに何ナノ秒
余分にかかる
0613デフォルトの名無しさん
2007/08/25(土) 00:38:15includeファイルに.hが付いていないことや、標準入出力に<<、>>を使うこと、
「::」の存在など何もかもが新鮮だったあの頃・・・
いまだに初心者の域を抜けられぬ現状orz
0614デフォルトの名無しさん
2007/08/25(土) 00:40:430615デフォルトの名無しさん
2007/08/25(土) 00:43:250616デフォルトの名無しさん
2007/08/25(土) 01:44:24・caseのラベル(厳密にいえば通常のラベルと変わらない)
・クラス継承
・コンストラクタの初期化子(?)
・条件演算子の一部
など、よくこれだけ機能を持たせられたと思うものだ。
さらに、ストリームにビットシフト演算子を使うなんて、どこのアホが考えたかと思う。
演算子オーバーロードを見せつけるための演出としか思われない。
さらに、マニピュレータだって?printf系の方がよっぽどうまく素早く整形できるわ。
あんなのC++委員会の遊びにすぎんよ。
もっとも、Cよりは便利なので使わせていただいていますけどね。
0617デフォルトの名無しさん
2007/08/25(土) 02:07:29Cより便利だから使ってあげているだけなんだからねっ!
0618デフォルトの名無しさん
2007/08/25(土) 02:11:220619デフォルトの名無しさん
2007/08/25(土) 02:11:29iostreamとマニピュレータの登場は、標準化委員会の発足より古いはず。
D&Eによれば入出力に演算子を使うのはDoug McIlroy、
マニピュレータはAndrew Koenigのアイデアだそう。
0620デフォルトの名無しさん
2007/08/25(土) 04:31:27printf 風マニピュレータを作らなかったのは C++ の汚点だな。
0621デフォルトの名無しさん
2007/08/25(土) 06:21:380622デフォルトの名無しさん
2007/08/25(土) 10:13:32作るの忘れてた
0623デフォルトの名無しさん
2007/08/25(土) 10:32:350624デフォルトの名無しさん
2007/08/25(土) 10:37:060625デフォルトの名無しさん
2007/08/25(土) 11:05:14なにか問題ありますか?
0626デフォルトの名無しさん
2007/08/25(土) 11:09:57コンテナアダプタには clear() が用意されて無いけど何か理由があるんでしょうか.
0627デフォルトの名無しさん
2007/08/25(土) 11:55:330628デフォルトの名無しさん
2007/08/25(土) 12:00:580629デフォルトの名無しさん
2007/08/25(土) 12:13:160630デフォルトの名無しさん
2007/08/25(土) 12:15:02これはひどいwwwwwww
0631デフォルトの名無しさん
2007/08/25(土) 12:27:56そんなエサで俺様が釣られるかクマー
0632デフォルトの名無しさん
2007/08/25(土) 13:55:48別に問題ない。
寧ろ、参照渡しでもらったものをポインタ渡しするほうがおかしいし、
参照渡しでもらったものを値渡ししてしまったら意味が違ってしまう。
0633デフォルトの名無しさん
2007/08/25(土) 15:43:54プリンタジョブとかに queue を使ったとして、
ジョブを全部破棄とかすることあるだろうに。
0634デフォルトの名無しさん
2007/08/25(土) 16:01:420635デフォルトの名無しさん
2007/08/25(土) 16:12:47としろ、ということか。
0636デフォルトの名無しさん
2007/08/25(土) 17:14:260637デフォルトの名無しさん
2007/08/25(土) 17:16:04new(&q) std::queue<T>;
冗談だよ、冗談。
0638デフォルトの名無しさん
2007/08/25(土) 17:24:210639デフォルトの名無しさん
2007/08/25(土) 17:40:570640デフォルトの名無しさん
2007/08/25(土) 17:47:210641デフォルトの名無しさん
2007/08/25(土) 18:26:24これ、Cだとエラーなんだが、C++ではコンパイルできる
何で?
0642デフォルトの名無しさん
2007/08/25(土) 19:11:390643デフォルトの名無しさん
2007/08/25(土) 19:19:25やっぱりそういうこと?
ストラウストラップの本とK&RとCの規格書調べたんだけど、それらしい記述を
見つけられなかったんだけど、どこかに明記されている?
0644デフォルトの名無しさん
2007/08/25(土) 19:26:250645デフォルトの名無しさん
2007/08/25(土) 19:51:03642じゃないけど
C言語はJIS X 3010の.5.16代入演算子
代入式は、代入後の左オペランドの値を持つが、左辺値ではない。
C++は手元にあるのが15年前のARM日本語版しかないけど、5.17代入演算子
代入演算子の結果は、代入が行われた後に左のオペランドに格納してある値である。従って、結果も左辺値である。
Cの規格書って何を調べたの?
0646デフォルトの名無しさん
2007/08/25(土) 19:54:07>>642
0647デフォルトの名無しさん
2007/08/25(土) 19:58:03脳内
0648デフォルトの名無しさん
2007/08/25(土) 20:23:22>>644
型と右辺値左辺値は別の段階の話。
0649デフォルトの名無しさん
2007/08/25(土) 20:33:340650デフォルトの名無しさん
2007/08/25(土) 22:36:12>>645
同じ規格書の同じとこ読んだんだけど、
代入式:
条件式
単項式 代入演算子 代入式
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ってなってたから、代入式ってのは上の3行目(波線部分)の代入式
のことを言ってるのかと勘違いしてた
単項式 代入演算子 代入式
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
これ全体を代入式と言ってるのか
とすれば x = 1 という代入式の結果は左辺値ではないということに
なるか
代入式は、代入後の左オペランドの値を持つが、左辺値ではない
と書いてあるけど、代入式の結果は と書いてくれたほうがクリアになるなあ
~~~~~~~~~~~~~~~~~
BNF記法が分かってなかった
>>648
なるほど
C++のほうはEffectiveにも参照を返すと書いてあるから
理解できた
C++の規格書も買うかな
0651デフォルトの名無しさん
2007/08/25(土) 22:42:130652デフォルトの名無しさん
2007/08/25(土) 22:46:24知ってるかもしれないが、JISの規格書なら以下で参照できる。
日本工業標準調査会
ttp://www.jisc.go.jp/index.html
C JISX3010
C++ JISX3014
検索できないのは最悪だけど。
0653デフォルトの名無しさん
2007/08/25(土) 22:49:36調べ物するときは同じ内容について
色々な本に目を通してるんだけど、
結局、規格書に明記されてると確信に変わる
んで安心できる
禿の本ってEffectiveのこと?
結構高度だから必要に応じて関連する項目を
潰していこうと思ってる
0654デフォルトの名無しさん
2007/08/25(土) 22:52:34最初、Cの規格書もそこを見てたんだけど
検索できなくて疲れるから買ってしまった
0655デフォルトの名無しさん
2007/08/25(土) 22:59:440656デフォルトの名無しさん
2007/08/25(土) 23:52:51代入式の結果が左辺値か右辺値かは、構文から
決定できる問題ではないので、構文を記した部分は関係ないぞ。
0657デフォルトの名無しさん
2007/08/26(日) 03:47:09Hoge::Hoge(){
//落ちる場合1
CFoo foo = CFoo(age,sage);
m_vecFoo.push_back(foo);
//落ちる場合2
CFoo foo;
foo = CFoo(age,sage);
m_vecFoo.push_back(foo);
//落ちない場合
CFoo* foo = new CFoo(age,sage);
m_vecFoo.push_back(*foo)
}
あるクラスCFooについて、newでインスタンスを生成した場合は落ちないんですが、
newを使わないで直接生成した場合(そういうのをなんていうのか知りませんが)
push_backの行で落ちてしまいます。一応どの場合もコンパイルは通ってます。
原因がまったく分からないのでエスパーしてください^^;お願いします。
デバッグ結果:xutilityファイル内↓
inline void __CLR_OR_THIS_CALL _Container_base::_Orphan_all() const
{ // orphan all iterators
_Lockit _Lock(_LOCK_DEBUG);
if (_Myfirstiter != _IGNORE_MYITERLIST)
{
for (_Iterator_base **_Pnext = (_Iterator_base **)&_Myfirstiter;
*_Pnext != 0; *_Pnext = (*_Pnext)->_Mynextiter)
(*_Pnext)->_Mycont = 0; ←この辺でとまってる模様
*(_Iterator_base **)&_Myfirstiter = 0;
}
0658657
2007/08/26(日) 03:53:14CFoo foo(age,sage);
m_vecFoo.push_back(foo);
ちなみに、push_backをコメントアウトして飛ばせば一応落ちないで動いてるようなので
落ちているのはpush_backの行みたいです。
0659デフォルトの名無しさん
2007/08/26(日) 05:25:40ちゃんとコピーコンストラクタでディープコピーしてるかとか。
0660デフォルトの名無しさん
2007/08/26(日) 09:15:04すいません。力尽きて寝てました。
実際のCFooはでかいのでそのまま貼ることはできませんが、
・コンストラクタの引数にポインタ型がある
・メンバにもポインタ型がある
・引数つきで生成されること前提なのでデフォルトコンストラクタとか作ってない
・唯一書いてある引数ありのコンストラクタは、メンバを初期化リストで初期化せずに
コンストラクタの中身で初期化してる
・単純なGet〜みたいな関数はヘッダに直接書いてある
この辺がなにか関係してるでしょうか?
0661デフォルトの名無しさん
2007/08/26(日) 09:36:450662デフォルトの名無しさん
2007/08/26(日) 09:39:420663デフォルトの名無しさん
2007/08/26(日) 09:43:44>659の質問に答えたまえ。
コピーコンストラクタを設けていないのなら、C++を初歩から勉強しなおせ。
0664デフォルトの名無しさん
2007/08/26(日) 09:51:360665デフォルトの名無しさん
2007/08/26(日) 10:28:29Effective C++とかEffective STLとか
0666657
2007/08/26(日) 10:35:13コピーコンストラクタなるものをきちんと実装しないと
値渡ししたりするときに問題が発生しやすいらしいので
m_vecFooにはポインタを渡すことにしました。
0667デフォルトの名無しさん
2007/08/26(日) 10:38:42参照先を複製してコピーするのが深いコピー
0668デフォルトの名無しさん
2007/08/26(日) 10:52:14なぜpush_backの段階で落ちてるんでしょうか?
二重でdeleteされてるわけでもないし、理屈がわかりません。
0669デフォルトの名無しさん
2007/08/26(日) 10:52:280670デフォルトの名無しさん
2007/08/26(日) 10:56:260671657
2007/08/26(日) 10:59:13>値渡ししたりするときに問題が発生しやすいらしいので
訂正ですが、ポインタのメンバを持ってるクラスの
コピーコンストラクタをきちんと実装してない場合、
”値渡しする段階”で問題がでるのではなくて、
”後始末の段階”で二重のdeleteが起きたりするので危険なんですよね?
なんでpush_backしただけで落ちるんでしょうか?
どんな可能性が考えられますか?
0672デフォルトの名無しさん
2007/08/26(日) 11:10:13本当に push_back の行で落ちてるのかどうか確認してみた方がいいんじゃない?
0673デフォルトの名無しさん
2007/08/26(日) 11:13:40CFoo foo = CFoo(age, sage);
CFoo bar = foo;
とりあえずこのコードで落ちたりしないか?
0674デフォルトの名無しさん
2007/08/26(日) 11:23:30>CFoo foo;
>foo = CFoo(age,sage);
これをちゃんと動かしたいなら、代入演算子も定義しとけ。
0675デフォルトの名無しさん
2007/08/26(日) 11:38:52CFoo foo = CFoo(age, sage);
CFoo bar = foo;
としたらpush_backをコメントアウトしても落ちました。
ってことはやっぱりコピーコンストラクタなるものが
きちんと実装されてないのが原因っぽいです。
でも実装してないときはコンパイラが勝手に作ってくれるんじゃないんですか?
で、勝手に作られたものでは”破棄時”に問題がでるので、
自分でうまく実装しないと危険ってだけなんじゃないんでしょうか?
0676デフォルトの名無しさん
2007/08/26(日) 11:39:52それはもちろんだが、その前に、解放済みの動的資源を参照するオブジェクト
ができてしまうことがマズイだろ
0677657
2007/08/26(日) 11:43:25一時オブジェクトが解放される段階で落ちてるみたいです。
0678デフォルトの名無しさん
2007/08/26(日) 11:44:10式の結果が左辺値になるか右辺値になるかは構文ではなく
言語の仕様ということか
それなら黙って認めるしかないから明白だ
0679デフォルトの名無しさん
2007/08/26(日) 11:47:02>自分でうまく実装しないと危険ってだけなんじゃないんでしょうか?
その「危険」の内容が、落ちるってことだ。
0680デフォルトの名無しさん
2007/08/26(日) 11:49:39自プロセスのスレッド数を
CreateToolhelp32Snapshot、Process32First、Process32Next
使ってスレッド数を出力するだけのプログラムで
なんでcntThreadsの値が8になるんだ?
CreateThreadとかしてないのに・・・
0681デフォルトの名無しさん
2007/08/26(日) 12:00:100682デフォルトの名無しさん
2007/08/26(日) 12:09:32お前がアホだから
0683デフォルトの名無しさん
2007/08/26(日) 12:11:020684デフォルトの名無しさん
2007/08/26(日) 12:11:39せめて
ttp://www.microsoft.com/technet/sysinternals/default.mspx
あたりのツール使って、実際のスレッド数をまず確かめてはどうか?
0685デフォルトの名無しさん
2007/08/26(日) 12:11:470686デフォルトの名無しさん
2007/08/26(日) 12:11:530687デフォルトの名無しさん
2007/08/26(日) 12:27:41確かに自分で数えればいいんだが、
パフォーマンスログでスレッド数見ると
自分で立ち上げたスレッド数以上立ち上がってて
たまに増減するんだよね。
0688デフォルトの名無しさん
2007/08/26(日) 12:28:330689デフォルトの名無しさん
2007/08/26(日) 12:36:370690デフォルトの名無しさん
2007/08/26(日) 13:03:42さっぱり分からん
大規模なものだと、だいたいフォルダごとに纏められていて総数数百、数千のファイルがあるが
どのような感じでそんな構造をつくっていけばいいのかさっぱりです。
Webにはどこも同じような、内容ばかりポリモを動物を使っての説明w
結局みんな大規模なものはかけないのかな?
0691デフォルトの名無しさん
2007/08/26(日) 13:07:390692デフォルトの名無しさん
2007/08/26(日) 13:09:43大規模っつーことで複数人での開発を想定するが
個人的にはプロセスやDLL等の境界で切ってあるほうがずっとやりやすかったかな
切らないんなら、適切にスタブを作るのが常套かと思う
Facadeなどの下に隠すのも良い
画面がいっぱいあるだけの良くある業務系なら、それぞれの画面に飛べるように
なっていて、それぞれが独立していれば概ね問題は無い
まあ所詮ケースバイケースで王道は無いだろ
「銀の弾丸はない」のだと知れ
0693デフォルトの名無しさん
2007/08/26(日) 13:10:030694デフォルトの名無しさん
2007/08/26(日) 13:20:38オーディオデータとか動画扱ってる場合とかWindowsが勝手にスレッド作る場合はよくあるお
0695デフォルトの名無しさん
2007/08/26(日) 13:25:54>でも実装してないときはコンパイラが勝手に作ってくれるんじゃないんですか?
各メンバのコピーコンストラクタを呼び出す、というコピーコンストラクタを作ってくれる。
同様に代入の場合は各メンバに対しoperator=を呼ぶ。
メンバにポインタがある場合ポインタがコピーされるだけで、ポインタが指す先は複製されない。
0696デフォルトの名無しさん
2007/08/26(日) 13:30:15基本型だけならデフォのコンストラクタで問題ないことも多い
ポインタ生のままで保持せずにboost::shared_ptrでくるんだりしてれば
適切に参照カウント処理してくれる
そうでないならちと考えろってこった
0697デフォルトの名無しさん
2007/08/26(日) 13:31:27私が言いたいのはWebで恰もC++知ってますみたいな講座書いてる奴の大半は
動物ポリモみたいなことかいてるだけで実用的なことは一切出来ないのかな?
と思っただけですよ
0698デフォルトの名無しさん
2007/08/26(日) 13:33:05つーかどうでもいい
動物ポリモは確かにくだらねぇしオリジナリティはねぇな
0699デフォルトの名無しさん
2007/08/26(日) 13:37:160700デフォルトの名無しさん
2007/08/26(日) 13:39:500701デフォルトの名無しさん
2007/08/26(日) 13:42:37精進するよ
0702デフォルトの名無しさん
2007/08/26(日) 13:44:29動物ポリモみたいなこと書いてないで君もさっさと大規模なもの作れる頭持つか諦めなさい。
0703デフォルトの名無しさん
2007/08/26(日) 13:50:52スレ汚しすまそ
0704デフォルトの名無しさん
2007/08/26(日) 14:26:550705デフォルトの名無しさん
2007/08/26(日) 14:30:57C++ 講座
で検索してみなよ
どこもおなじようなことしか書いてないからw
0706デフォルトの名無しさん
2007/08/26(日) 14:35:060707デフォルトの名無しさん
2007/08/26(日) 14:41:55実際はC++の文法だけしか理解できていない可能性高し
0708デフォルトの名無しさん
2007/08/26(日) 14:42:57チラシの裏にでも書いてろよ。
0709デフォルトの名無しさん
2007/08/26(日) 14:45:450710デフォルトの名無しさん
2007/08/26(日) 14:54:36実際はC++の文法ですら理解できていない可能性高し
0711デフォルトの名無しさん
2007/08/26(日) 14:56:11Webのしかも言語自体の解説に何期待してんだか
0712デフォルトの名無しさん
2007/08/26(日) 14:57:08遊びの延長や使い捨てや自分専用で作るのと
公開するソフトを作るのではかかる手間が桁違いだろ
0713デフォルトの名無しさん
2007/08/26(日) 15:06:54具体的にいうとboost関係の人達
0714デフォルトの名無しさん
2007/08/26(日) 15:23:490715デフォルトの名無しさん
2007/08/26(日) 15:25:40そうか?
以前正規表現を使いたくてboostを使ったが速度でイマイチだったから
自前で実装したけど?
0716デフォルトの名無しさん
2007/08/26(日) 15:30:47そうか?
以前正規表現を使いたくてお前のを使ったが速度でイマイチだったから
自前で実装したけど?
0717デフォルトの名無しさん
2007/08/26(日) 15:32:200718デフォルトの名無しさん
2007/08/26(日) 16:38:43チューニングはしてないよ
0719デフォルトの名無しさん
2007/08/26(日) 17:18:010720デフォルトの名無しさん
2007/08/26(日) 18:59:25oven::random_shuffle( vec, _1 * rnd() ); // std::random_shuffle( vec.begin, vec.end, _1 * rnd() );
std::random_shuffleの乱数生成関数オブジェクトにboost::uniform_01を使ってみたんですが
なんかうまくばらけてくれませぬ
というわけでstd::random_shuffle用のいい乱数発生方法を教えてください
0721デフォルトの名無しさん
2007/08/26(日) 20:48:44これが一番典型的な例
____ progress_
|← reject| boostの中の人 display ユーザー
. ̄.|| ̄ ̄ ┗(^o^ )┳(^o^ )┳(^o^ )┛≡=-
|| ┏┗ ┗┗ ┏┗ ≡=-
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
0722デフォルトの名無しさん
2007/08/26(日) 20:58:05boostの中で平均的に評価されているものが、他との比較でreject扱いになって
初めて「boostなんてたいしたことない」になる。
0723デフォルトの名無しさん
2007/08/26(日) 22:35:06まるで役に立たないprogress_displayと
すごく役に立つprogress_timerが同居しています
そんな兄弟いますよね
0724デフォルトの名無しさん
2007/08/26(日) 23:18:30アラビア語リテラルの入った.ccのソース(MySQL)のコンパイルが出来ません。
error C3209: '・ァル館・' : Unicode 識別子は現在サポートされていません。
というエラーが表示されます。(ソースUTF8の場合)
秀丸でShift-JISにしたり、UTF8にしたりしたのですが、どちらもエラーでした。
VSのエディターではShift-JISの場合、アラビア語が文字化けもなく表示されます。
(UTF8では文字化けして表示されます。)
2時間くらいググッても分かりませんでした。
この問題の解決法を教えてください。
エロイ人お願い!
0725デフォルトの名無しさん
2007/08/26(日) 23:21:48VC が UTF-8 を認識できてないんだろ。どうやるのか知らんけど。
Shift_JIS でアラビア語が扱えないのは確実。
0726デフォルトの名無しさん
2007/08/26(日) 23:26:420727デフォルトの名無しさん
2007/08/26(日) 23:29:28VS2005なら大丈夫のはずだが
リテラルはワイド文字なのか?
そうだと仮定すると、ソース修正して
16進でUnicodeのコードポイントを記述してやるのが一番手早い
Perlか何かを使えば簡単だろ
0728724
2007/08/26(日) 23:45:35>>725
アドバイス、�d。
どこで聞けば分かりそうですか?ご存じでしたら教えてください。
オプションやらヘルプやら一通り見てみたのですが、分かりませんでした。
>>726
ちょっと難しそうです。�d。
>>727
> BOMつきUTF-8ってVS2003で食えたっけ
BOMつきかどうかを確認する方法をご存じでしたら教えてください。
> リテラルはワイド文字なのか?
リテラルはワイド文字です。
確かにソース修正が一番簡単ですね。
ただ、ソースの下の方を見てみたら、ヒンディ語・ヘブライ語・・・と限りなく続いてますので、結構大変かも。
0729デフォルトの名無しさん
2007/08/26(日) 23:51:04BOMを確認したければファイルの先頭をバイナリエディタで見てみろ。
BOMつきでなければ、VS2005でも食えない。
ワイド文字リテラルなら、話は簡単だな。
手でやらずに簡単なフィルタープログラムを書いて、機械的に変換してしまえ。
そんなら多国語でも関係ない。
0730デフォルトの名無しさん
2007/08/26(日) 23:55:03分母150 試行回数100000で繰り返すとなるお!
助けて!
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int i,j,dom,cnt,max,ret,k;
int ch;
int array[128];
int over, less;
long int times;
i = j = k = dom = cnt = times = max = 0;
printf("input dominator >");
scanf("%d", &dom);
printf("input times >");
scanf("%ld", ×);
0731730続き
2007/08/26(日) 23:55:39k = 0;
over = less = 0;
while(getchar() != '\n');
printf("dominator = %d times = %d\n", dom, times);
sleep(1);
srand(time(NULL));
for(i=0; i<times; i++){
cnt++;
ret = rand() % dom;
if(ret == 7){
array[k] = cnt / 100;
array[k]++;
k++;
array[k] = -1;
printf("%d\n", cnt);
if(cnt > max){
max = cnt;
}
if(cnt > dom){
over++;
}
else{
less++;
}
cnt = 0;
}
}
0732730続き
2007/08/26(日) 23:56:15for(j=0; j<array[i]; j++){
printf("*");
}
printf("\n");
}
printf("MAX = %d\n", max);
printf("OVER = %d ELSE =%d\n", over, less);
printf("%d/%d\n", over+less, times);
printf("%f\n", times / (double)(over + less));
printf("Retry ? (y/n) >");
ch = getchar();
if(ch == 'y' || ch == 'Y'){
goto LOOP;
}
return 0;
}
0733730
2007/08/26(日) 23:56:54助けてお!
0734デフォルトの名無しさん
2007/08/27(月) 00:00:330737デフォルトの名無しさん
2007/08/27(月) 00:04:27ざっとみだけど
>int array[128];
が足りてないだけじゃないの?
0738デフォルトの名無しさん
2007/08/27(月) 00:06:54メモリをケチるな!
array[128] → array[2048]
期待値は (1/150)*100000=666.67
0739730
2007/08/27(月) 00:10:46これで勝てるお!
0740730
2007/08/27(月) 00:11:550741730
2007/08/27(月) 00:14:06ありがとお!
0742730
2007/08/27(月) 00:17:43さっぱりわからなかったのに
すぐ回答がきたお
どうしたらそうなれるかお?
0743デフォルトの名無しさん
2007/08/27(月) 00:20:17毎日2時間、電灯のヒモでボクシング。これを1年続けること。
0744デフォルトの名無しさん
2007/08/27(月) 00:21:02アーバンチャンピオンと
スパルタンXで鍛えてるはず
0745デフォルトの名無しさん
2007/08/27(月) 00:26:58100000回×(1/150)=666.67回 kがインクリメントされるわけだから
array[k]はarray[668]って式で参照される可能性があるわけで
array[128]と宣言したのではあきらかに足りないってことなんではないかと>期待値云々
こういう実行時に入力される値に依存するような大きさの配列はメモリの動的確保で扱うべきだとは思うけどね
0746724
2007/08/27(月) 01:39:46ファイルの先頭にBOM(というか、ZERO WIDTH NON-BREAKING SPACE。ef bb bfの3バイト)を付加したら
無事、オンパイルできました。
0747デフォルトの名無しさん
2007/08/27(月) 01:42:28いや、ファイル先頭にある場合、つまりBOMである限り、
それはBOMであってZERO WIDTH NON-BREAKING SPACEとは言わないんだ。
0748724
2007/08/27(月) 02:02:45添削ありが�d。
WikipediaのUTF-8(http://ja.wikipedia.org/wiki/UTF-8)のところに記述がありました。
> プロトコルが常にUTF-8である事を強制しているものである場合はBOMを禁止するべきで、
> この場合ファイル先頭のBOMは "ZERO WIDTH NO-BREAK SPACE" と見なされる。
> 逆にプロトコルがそれを保証しない場合BOMは禁止されずファイル先頭のそれはBOMと見なされる。(http://tools.ietf.org/html/rfc3629#section-6)
2文目ですね。
0749デフォルトの名無しさん
2007/08/27(月) 10:40:280750デフォルトの名無しさん
2007/08/27(月) 15:06:25自分で複数ファイルのプログラムを作ったとき、
たとえば、mian.c , sub.c , sub.h という3つのソースファイル
からなるプログラムの場合、
$ gcc main.c sub.c
としますよね。
でも#include<stdio.h>などでは、
stdio.hにはプロトタイプ宣言しか無くて、printf( );とかの定義が無いはずなのに
$ gcc main.c stdio.c
などとしなくてもいいのはなぜですか?
0751デフォルトの名無しさん
2007/08/27(月) 15:09:050752デフォルトの名無しさん
2007/08/27(月) 15:11:520753デフォルトの名無しさん
2007/08/27(月) 15:17:5210MB前後のテキストデータをmallocしたポインタ読み込んで、区切り文字単位に編集・分解していった場合と、
stringに読み込んでからvector<string>に編集・分解していった場合で、
処理時間が前者が約25秒、後者が約60秒掛かったのですが、こんなもんなんですかね。
0754デフォルトの名無しさん
2007/08/27(月) 15:28:490755デフォルトの名無しさん
2007/08/27(月) 15:34:020756デフォルトの名無しさん
2007/08/27(月) 15:36:15vector<string>版も意外に速いなw
STLコンテナは基本的に値を保持するんで、その場合はstringのインスタンスを
コピーしまくることになる
ポインタだけで操作すれば格段に速いのは当たり前だ
vector<>が遅いというよりはメンバのコピーに時間がかかっているだけなので、
そこが性能のボトルネックになっているのなら、
vector<char*>でポインタを保持するなり
vector<int>でインデクスを保持するなりするとよいだろう
0758デフォルトの名無しさん
2007/08/27(月) 16:01:38i = (char*)malloc(sizeof(char) * 256);
でメモリ領域を確保したのですが、256バイト以上使用することができます。
なぜでしょうか?教えてください
0759デフォルトの名無しさん
2007/08/27(月) 16:03:02たまたま
0760デフォルトの名無しさん
2007/08/27(月) 16:07:29本来アクセスしちゃいけないところにアクセスしてるだけ
CはC#などとは違ってそんな事しても例外は発生しないし
たまたま何のエラーも出ない事がある
だからってそんな事やってたらきっとそのうちクラッシュするよ
0761デフォルトの名無しさん
2007/08/27(月) 16:10:57一般的にmallocは、予めOSから確保しておいたでっかいメモリの塊から
必要な分だけを切り分けて自身の戻り値にしている(残りは次回以降のmallocなどで使う)。
理由は、OSのメモリ確保処理が大抵大容量の確保に向いていて小回りが利かないから。
そういうわけでその256バイトの後ろにも、OSから見れば
アプリケーションが確保した(実態はmallocが抱えていたり
他のmallocなどの呼出で使われている)メモリ空間が広がっている。
だから一見256バイトの後ろも読み書きできるように見えるというわけ。
0762デフォルトの名無しさん
2007/08/27(月) 16:16:24勉強になりました。
ありがとうございます。
0763デフォルトの名無しさん
2007/08/27(月) 16:19:050764デフォルトの名無しさん
2007/08/27(月) 20:10:51現在UNIX環境でコンソールベースのプログラムを組んでいるのですが
CUIからメニューの操作、カーソル操作の為のエスケープシーケンスに悩んでおります
コンソールベースのプログラム自体あまり組んだ事ないのですが
CUIからメニュー操作というのは可能なのでしょうか?
0765デフォルトの名無しさん
2007/08/27(月) 20:16:050766デフォルトの名無しさん
2007/08/27(月) 20:27:24こんなのでいいなら簡単にできるけど
エスケープシーケンスの設定が済んでいることが前提
#include <stdio.h>
int main(void){
int i, x, y;
printf("\x1b[2J"); // clear screen
for(i=1;i<=9;i++){
x=i;
y=(i%2)+1;
printf("\x1b[%d;%dH", y, x); // cursor move
printf("%d", i);
}
return 0;
}
0767デフォルトの名無しさん
2007/08/27(月) 20:31:350768デフォルトの名無しさん
2007/08/27(月) 20:34:390769デフォルトの名無しさん
2007/08/27(月) 20:52:360770デフォルトの名無しさん
2007/08/27(月) 20:56:120771デフォルトの名無しさん
2007/08/27(月) 21:25:47ありがとうございます
0772デフォルトの名無しさん
2007/08/27(月) 22:44:37有難うございます。
ncursesについて詳しく調べて見たいと思います。
エスケープシーケンスからの操作なのですが、設定とはどう行うかご教授願えないでしょうか?
検索しても見つからなくてorz
0773デフォルトの名無しさん
2007/08/27(月) 22:51:24UNIX環境なら使うターミナルを選ぶだけかな…
MS-Windows環境なら ansi.sys を読み込ませる
0774デフォルトの名無しさん
2007/08/27(月) 22:53:34TERM環境変数
普通はシェルの初期化スクリプトなどで設定するが、
普通にシェルを操作できてるんなら、まあ大丈夫だろう
0775デフォルトの名無しさん
2007/08/27(月) 23:01:57えー。それって、Windows環境で、DOS-Exeを動かす場合だけでそ。
0776デフォルトの名無しさん
2007/08/27(月) 23:12:20有難うございます。
凄く勉強になります。
ご教授して頂いた所を詳しく調べてみたいと思います。
0777デフォルトの名無しさん
2007/08/27(月) 23:48:42bashとかでもあるよ。
0778デフォルトの名無しさん
2007/08/27(月) 23:54:030779デフォルトの名無しさん
2007/08/27(月) 23:58:100780デフォルトの名無しさん
2007/08/28(火) 03:00:09VC++2005Express,WinXP Pro環境で,
コンソールアプリケーション上でWM_TIMERを使いたいのですが,
調べてみると不可視ウィンドウを作れば良いと書かれていました.
そこで,以下のようなウィンドウを生成しているのですが,うまく動きません.
ご教授いただけないでしょうか?
HWND Create(){
WNDCLASS wcHide;
HWND hwndHide;
// ウィンドウクラス
wcHide.style = 0;
wcHide.lpfnWndProc = (WNDPROC)MWndProc;
wcHide.cbClsExtra = 0;
wcHide.cbWndExtra = 0;
wcHide.hInstance = (HINSTANCE)GetModuleHandle(NULL);
wcHide.hIcon = NULL;
wcHide.hCursor = NULL;
wcHide.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcHide.lpszMenuName = NULL;
wcHide.lpszClassName = "";
hwndHide = CreateWindow ( wcHide.lpszClassName, "", WS_DISABLE, CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT, HWND_DESKTOP, NULL, wcHide.hInstance, 0);
}
0781780
2007/08/28(火) 03:01:24{
switch ( iMessage ) {
case WM_CREATE:
SetTimer(hWnd , 5000 , 1 , NULL);
return 0;
case WM_TIMER:
printf("test\n");
return 0;
}
return 0;
}
とりあえず,5秒毎に"test"を出力できるようにしたいのですが,
よろしくお願いします.
0782デフォルトの名無しさん
2007/08/28(火) 03:04:49うまく動かないってのはどんな状況?
0783780
2007/08/28(火) 03:20:40間違えて使っていました.ありがとうございます.
>うまく動かないってのはどんな状況?
何も表示されずに終了してしまいます.
以下を試してみましたが何も表示されませんでした.
・main文でCreate()を呼び出した後にwhile(1)やsleepをはさんでみる
・WndProc()関数の最初にprintfでチェッカーをはさむ
よろしくお願いいたします.
0784デフォルトの名無しさん
2007/08/28(火) 03:23:52メッセージループはあるか?
なければググれ
0785デフォルトの名無しさん
2007/08/28(火) 03:32:35RegisterClassしてない。
SetTimerの第2引数と第3引数が逆とか、
ウィンドウプロシージャで自分で処理しないメッセージをDefWindowProc()に渡してない。
0787780
2007/08/28(火) 04:42:09>>785
ありがとうございました.
ご指摘の通り,メッセージループ,RegisterClass,DefWindowProc()
全てを書いたところ,意図した動きをしました.
お世話になりました.
0788デフォルトの名無しさん
2007/08/28(火) 05:41:34・外部ハードからデータを所得(配列に格納)し、そのデータ長に数値計算を施し結果を画面上に表示させたい
この動作で、随時変化しているデータ長の所得・数値計算・グラフ描画、
この3つを同時?(なるべくリアルタイムにあるデータ長の数値計算結果をグラフ描画)したいんだけど、
こういう場合ってどんな風に処理・流れにさせればいいの?
例えば、マルチスレッド(出来るかどうかよくわかりませんが)を使って
データ所得→計算→描画
|
→データ所得→計算→描画
|
→データ所得→計算→描画
こんな感じで計算させつつデータを所得。描画させつつ計算。みたいに出来ますか?
0789デフォルトの名無しさん
2007/08/28(火) 05:56:440790デフォルトの名無しさん
2007/08/28(火) 06:00:160791788
2007/08/28(火) 06:06:240792デフォルトの名無しさん
2007/08/28(火) 08:23:36データ所得→計算→描画→データ所得→計算→描画
で十分じゃね?
データ取得に時間掛かるならデータ取得部分だけ別スレッドで回した方がいいけど。
0793デフォルトの名無しさん
2007/08/28(火) 18:09:000794デフォルトの名無しさん
2007/08/28(火) 22:40:45出来る出来ないで言えば、出来ると思う。
どっちかいうと、例えばデータをファイルに書き込んでるなら、
データ書き込みとデータ読み出しの排他処理してるだろうから、
あんまり頻繁に読み出しに行くとデータ更新を阻害しそうで
そっちの方が怖い。
0795デフォルトの名無しさん
2007/08/28(火) 22:47:05ファイルに書き戻したりしてないように見えるけど
0796デフォルトの名無しさん
2007/08/28(火) 23:53:55呼び出した行でプロセスが停止してしまいます。
エラーも何も帰ってこず、前の行のprintfは呼ばれて、次の行のprintfは呼ばれていないという
状況です。_msize()の説明を見ると、動的確保されていない領域でも
エラーが帰ってくるみたいですが…
こういった症状聞いたことある方いませんか?
VC6でデバッグビルドです。よろしくお願いします。
0797デフォルトの名無しさん
2007/08/29(水) 00:09:090798796
2007/08/29(水) 00:11:550799デフォルトの名無しさん
2007/08/29(水) 00:13:31今環境がないので試せないですが、if ( p == NULL ) とかで見てみます
0800デフォルトの名無しさん
2007/08/29(水) 00:14:120801デフォルトの名無しさん
2007/08/29(水) 00:16:09違うんですか?
0802デフォルトの名無しさん
2007/08/29(水) 00:17:380803デフォルトの名無しさん
2007/08/29(水) 00:19:45_msizeの戻り値を参照してるところで止まってる訳でもなく、
_msize自体で止まるので、引数として渡してやったポインタがNULLなのかと思ったのですが
0804デフォルトの名無しさん
2007/08/29(水) 00:25:12NULLに対する対処くらいしていてもよさそうだけど
0805デフォルトの名無しさん
2007/08/29(水) 00:31:07よく読んでみれば、
この関数は、パラメータを検証します。memblock が null ポインタの場合、
「パラメータの検証」に説明されているように、_msize は無効なパラメータ ハンドラを
呼び出します。エラーが処理されると、この関数は errno を EINVAL に設定し、-1 を返します。
とのことなので、-1が返ってくるようですね。
ぬるぽってヌルポインタ(Javaとかだとヌル参照例外)のことですよね?
引数のポインタがNULLでも動くなら、>>797は何について仰ってるのでしょうか?
0806デフォルトの名無しさん
2007/08/29(水) 00:31:26試しに_msizeの引数にNULL入れたら、Assert出て落ちた。
VS2005 Standard Edition
「止まる」というのは、関数から戻って来ないのか、不正終了するのか、どっち?
0807デフォルトの名無しさん
2007/08/29(水) 00:35:000808デフォルトの名無しさん
2007/08/29(水) 00:37:28というのは、Windowsのサービスとして動かしてるのです。
サービスでも普通のプログラムと同じようになんかダイアログでて
落ちるのなら前者の関数から戻ってきてないのだと思いますが、
出なくて静かに落ちるなら、タスクマネージャからプロセスが生きてるか確認しないとわからないかも
>>796のそこで止まるというのは、_msizeを挟んで呼び出し前と呼び出し後を
ログに吐かせたときに、呼び出し前までしか吐かれてなかったのです。
Assert出て落ちるのなら、プロセスが静かに死んでそうな気がしてきました。
0809デフォルトの名無しさん
2007/08/29(水) 00:39:320810デフォルトの名無しさん
2007/08/29(水) 00:40:170811デフォルトの名無しさん
2007/08/29(水) 00:49:13免罪符にゃならんが。
そこら辺分からんと答えよう無いしな。
0812デフォルトの名無しさん
2007/08/29(水) 00:49:15NULLじゃないけど
IsBadReadPtrに引っかかるポインタとか
0813デフォルトの名無しさん
2007/08/29(水) 06:40:310814デフォルトの名無しさん
2007/08/29(水) 13:31:03本当によく読んでるのか?
> _msize は無効なパラメータ ハンドラを呼び出します。
無効なパラメータ ハンドラが何やるかしってるか?
> 無効なパラメータが見つかると、C ランタイムは、
> 現在割り当てられている無効なパラメータ ハンドラを呼び出します。
> 既定により無効とされているパラメータが見つかった場合、
> ワトソン博士のクラッシュ レポートが起動します。
> 実行中のアプリケーションはクラッシュし、分析用のクラッシュ ダンプを
> Microsoft に提供するかどうかをユーザーに求めるメッセージが表示されます。
> デバッグ モードでは、無効なパラメータが見つかるとアサーション エラーになります。
0815デフォルトの名無しさん
2007/08/29(水) 20:48:30現在VC++ 2005 Express Editionで開発中で、所謂多重定義の問題にハマっています
Formアプリで、複数のFormをどんどん遷移していくような感じなのですが
イメージとしては、ATMのような、各画面1クリックでどんどん進むようなので、それぞれの画面が
個別のFormとして作られています。
(Form1がForm2を作って、Form2が3を・・のような)
で、聞きたい事は、VC++2005ExpEditでは、Formを作ると、そのclassの定義がすべてForm1.h
のように、ヘッダファイルに書かれてしまいます。
このとき、Form1とForm2で相互にincludeしたい場合、多重includeガードをしても、定義のせいで
リンクがエラーになり、コンパイルが通りません。
いちいちForm1.hの中身を.cppにコピペし、宣言のみを.hに書き直すようなことをしなければいけないのでしょうか
うまい回避方法があれば教えてください。
(長文すみません)
0816デフォルトの名無しさん
2007/08/29(水) 21:58:450817デフォルトの名無しさん
2007/08/29(水) 22:02:030818デフォルトの名無しさん
2007/08/29(水) 22:25:54このstringを1行ごとに読み込んで処理したいのですが、どのようにすればいいでしょうか?
tokenが使えないので、ちょっと苦労しています。一旦とってきたstringをcharに変えるのも、どうかなぁ……って気がしますし、
できれば、stringのままで一行ごとの読み込みがやりたいんですが、やり方を教えてください。
VC++2005 WinXPHomeです。
0819デフォルトの名無しさん
2007/08/29(水) 22:32:430820デフォルトの名無しさん
2007/08/29(水) 23:01:37#ifndef Form1_H
#define Form1_H
#include "Form2.h"
class Form1 : public Form
{
};
#endif
----------------------
#ifndef Form2_H
#define Form2_H
#include "Form1.h" //Form1.hからincludeされた場合はForm1_Hが定義済みなのでインクルードガードで無視される
class Form2 : public Form
{
};
#endif
こんな感じで書かれてればエラー出ないと思うんだが‥‥
0821デフォルトの名無しさん
2007/08/29(水) 23:48:130822デフォルトの名無しさん
2007/08/29(水) 23:51:540823デフォルトの名無しさん
2007/08/29(水) 23:52:29std::istringstreamとstd::getline(std::stringを引数にとるほう)はだめ?
0824デフォルトの名無しさん
2007/08/29(水) 23:56:08意味がイマイチわからんかったが、
istringstream と >>
じゃだめか?
0825デフォルトの名無しさん
2007/08/29(水) 23:58:58あ
そっちじゃなきゃだめだわ
(大域のgetline か basic_istream<> の istream)
0826デフォルトの名無しさん
2007/08/29(水) 23:59:07boost, boost-sandbox or pstade使ってもいいなら良い方法があるんだけどいいかな? by boost厨
0827デフォルトの名無しさん
2007/08/29(水) 23:59:32basic_istream<> の getline ○
0828デフォルトの名無しさん
2007/08/30(木) 00:04:46C++のunionにメソッドを置おけること、昨日知ったよ、orz
これって常識?
0829デフォルトの名無しさん
2007/08/30(木) 00:12:39structはよく見るけどね
0830デフォルトの名無しさん
2007/08/30(木) 00:12:400831デフォルトの名無しさん
2007/08/30(木) 00:17:44自身で使ったことがないし、他人が使っているのを見たこともないし。
0832デフォルトの名無しさん
2007/08/30(木) 00:25:36Widget();
という文があったら、Widgetのオブジェクトを(デフォルトコンストラクタで)作成して、
次の行に逝く前にすぐ消される(デストラクタが呼ばれる)と思います。
んじゃ、こういう場合はどうだろうと思い、↓を書いてみました。
Widget *w = &Widget();
「Widget() はこの行でデストラクタが呼ばれ消えてしまうので、ポインタwは無効になるだろう」と考え、
考え通り、すぐデストラクタが呼ばれました。
んじゃ、参照はどうだろうと・・・
Widget &w = Widget();
自分の考えとは違ってすぐにデストラクタが呼ばれず、この関数(またはブロック)を抜けるところでデストラクタが呼ばれました。
参照だと何か特殊なんですかね・・・
0833デフォルトの名無しさん
2007/08/30(木) 00:29:150834デフォルトの名無しさん
2007/08/30(木) 00:34:16ファイル全てのアドレスを割り当てたらまずいですよね・・?
やはりマッピングアドレスを動的に変化させる仕組みが必要でしょうか?
そうすると編集時に問題になってしまいそうですが、何かセオリーみないなモノはあるのでしょうか?
0835デフォルトの名無しさん
2007/08/30(木) 00:39:33const参照なら標準規格でも明文化された規定になっている。
(知っている人は少ないかもしれないが)
けれど、非const参照の初期化に一時インスタンスの使用はできないことになっている。
一時インスタンスは右辺値だが、非const参照の初期化には左辺値が要求されるため。
最近のVC++やg++ではエラーになる。
どうせお前が使っているのはBorand C++だろう。窓から投げ捨てろ。
0836デフォルトの名無しさん
2007/08/30(木) 00:40:16参照は一時オブジェクトを捕まえておける
関数の戻り値とかもおっけー
0837836
2007/08/30(木) 00:40:530838デフォルトの名無しさん
2007/08/30(木) 01:04:15thx istringstreamでいってみます。
0839デフォルトの名無しさん
2007/08/30(木) 12:51:44別にForm1の定義がまるまる欲しいわけじゃないでそ。
Form *createForm2();
みたいな生成関数があれば大抵足りるんじゃないの。
0840デフォルトの名無しさん
2007/08/30(木) 13:45:38ガードは試してみたんですが、「定義」が.hに書かれているので・・
>>839
まったくそのとおりなんですが
VCを使うと、デフォルトでヘッダファイルに定義が書かれているんですよ
なので、どうしたものだろうかと
やっぱり、いちいち自分でヘッダファイルに書いてある定義をcppに持っていって、ヘッダファイルでの
宣言は改めて書くようにしないとダメなんでしょうか
0841デフォルトの名無しさん
2007/08/30(木) 15:06:39BCCタンを悪く言うと痛い目にあうお(#^ω^)ビキビキ
0842デフォルトの名無しさん
2007/08/30(木) 15:56:48警告は出るがな
0843デフォルトの名無しさん
2007/08/30(木) 16:09:45form2.h では、#include "form1.h"のかわりに、
class Form1;
と書いとけ。
これで、Form1* ほげほげって書けるようになる。
form1.h でも同様にする。
form1.cpp, form2.cpp では、両方のヘッダファイルをincludeする。
0844デフォルトの名無しさん
2007/08/30(木) 21:06:59このコンパイルをプログラム側からSystem()関数で行った場合に、
プログラム側でコンパイルでエラーが出たかどうかを判断できないのでしょうか?
具体的には System(bcc32 helloworld.c); の返り値とかで判断できないものでしょうか?
0845844
2007/08/30(木) 21:07:400846デフォルトの名無しさん
2007/08/30(木) 21:30:340847844
2007/08/30(木) 21:33:22そうですか、意外とプログラム側から分かる情報は少ないんですね。。。
どうしようかな・・・
0848デフォルトの名無しさん
2007/08/30(木) 21:38:26お前には無理
お前のプログラム側から分かる情報なんて皆無
0849デフォルトの名無しさん
2007/08/30(木) 21:42:46コンパイルに失敗したかどうかは分かるんじゃない?
エラーが出たのかどうかは分からんが。
BCCのsystem()は良く知らん。
gccのなら、↓でcommandの終了コード取れたと思うけど。
status = system("command");
if(WIFEXITED(status))
exit_code = WEXITSTATUS(status);
0850844
2007/08/30(木) 22:02:00manpageを見る限りだと、<sys/types.h>と<sys/wait.h>の二つをインクルードするみたいなのですが、
これをコンパイルしたところ、sys/wait.hをオープンできないというエラーがでます。
何故でしょうか・・・;;
ちなみにそのWEITSTATUSの返り値はint型でいいのでしょうか?
0851デフォルトの名無しさん
2007/08/30(木) 22:04:070852デフォルトの名無しさん
2007/08/30(木) 22:06:34テトリスとかどうかなと思ってるんですが
0853デフォルトの名無しさん
2007/08/30(木) 22:33:300854デフォルトの名無しさん
2007/08/30(木) 22:36:06テトリス
0855デフォルトの名無しさん
2007/08/30(木) 22:48:33いや、ちょっと待ち。
BCCはWindowsの話じゃないのか?
gccはUNIXとかLinuxの話で。
WEXITSTATUSがBCCでも存在するか知らんのだが。
0856デフォルトの名無しさん
2007/08/30(木) 22:49:26なぜなら、manpage は bcc じゃないから。
戻り値よりも、obj ファイルや exe ファイルが生成されてるかどうかを見た方が楽なんじゃないか。
0857デフォルトの名無しさん
2007/08/30(木) 22:51:43テトリス
0858844
2007/08/31(金) 00:21:14それだとコンパイルするたびに、objファイルを消さないといけないですよね。
コンパイル前にobjファイルとexeファイルを消すプログラムにすれば済む話かもしれないですけど・・・
0859デフォルトの名無しさん
2007/08/31(金) 00:25:282ch専用ブラウザ機能付きテトリス
セルフコンパイル機能付きテトリス
英日翻訳機能付きテトリス
OCR機能付きテトリス
人工無能機能付きテトリス
0860デフォルトの名無しさん
2007/08/31(金) 00:27:18エスパーすると君が本当に必要なのは make および makefile に関する知識だ
0861デフォルトの名無しさん
2007/08/31(金) 00:31:020862デフォルトの名無しさん
2007/08/31(金) 00:40:19インストール不可なんでしょうか?
うまく行ったかなと思ったら、最後の最後でレジストリの
書き込みに失敗しましたとかって出てしまいました。
他のバージョンのVCとかは一切インストールしていない
状態です。
0863デフォルトの名無しさん
2007/08/31(金) 00:42:020864862
2007/08/31(金) 00:53:42レスありがとうございます。
Win2Kのインストールから、もう一度やり直してみます・・・orz
サービスパック(SP4)入れる前にVCをインストールした方が
良かったのかな・・・?
0865デフォルトの名無しさん
2007/08/31(金) 01:05:29//typedef int link;
class link {};
int main(){
link l;
}
g++4.1.2で怒られました。コンパイラ不信になりそうです。
変数名をNULLにするような常識外れなのかもしれませんが、
こういう名前空間の衝突はどこを見れば予想できますか?
0866デフォルトの名無しさん
2007/08/31(金) 01:08:56君のレベルではコンパイラのバグなど、コンパイラ側の問題に遭遇することは無い。
コンパイルエラーはすべてコンパイラのせいではなく、自分が悪いのだと認識したほうがいい。
0867デフォルトの名無しさん
2007/08/31(金) 01:13:28エラーメッセージを見れば予想できるよ。
0868デフォルトの名無しさん
2007/08/31(金) 01:26:280869デフォルトの名無しさん
2007/08/31(金) 01:30:10自分の作ったクラスとか関数をすべて自分の名前空間に入れれば衝突を気にせずに済むよ
0870デフォルトの名無しさん
2007/08/31(金) 01:31:03標準ヘッダをインクルードしたらグローバルにunistd.hがぶちまけられる、
ってのはバグでなくてもショックでした。
>>867
初お目見得のエラーメッセージって初心者キラーなもので…。
class hoge{ link l; };
: error: ‘link’ does not name a type
危なそうな名前は回避するしかないんですかね。気をつけます。
0871デフォルトの名無しさん
2007/08/31(金) 01:36:49あなるほど、ちと面倒ですがそうします。皆さんありがとう。
0872デフォルトの名無しさん
2007/08/31(金) 04:29:23名前空間というものが無いCの関数として公開されたAPIを用いて実装されてるわけで、
たとえ標準Cの関数だけをstd名前空間に入れてもそいつらが使ってるAPI関数はそのままグローバルに残り
そりゃ凄い規模の汚染が発生していることだろう。
VCのIDE上でグローバル名前空間::からの入力予想をかけたらその凄まじさがよくわかる。
ただ大文字で始まるようなものは少ないんで、
「クラスの名前は先頭大文字でキャメル」とかそれなりに一般的な命名規則使ってれば遭遇しにくく
知らずに有効なコーディングルールを使ってるとかえって危ない場合ってあるんだなぁとかそういうことを思った。
0873デフォルトの名無しさん
2007/08/31(金) 09:46:13>>868
http://msdn.microsoft.com/msdnmag/issues/0300/c/
0874デフォルトの名無しさん
2007/08/31(金) 11:12:27A のコンストラクタで仮想関数テーブルを初期化する処理は必要ない、無駄だ、ということか。なるほど。
0875デフォルトの名無しさん
2007/08/31(金) 11:28:51ネットワーク上のPCのディレクトリを指定したいのですが、
記述の仕方を教えてください。
0876デフォルトの名無しさん
2007/08/31(金) 11:30:360877デフォルトの名無しさん
2007/08/31(金) 11:50:48\\servername\sharename
0878デフォルトの名無しさん
2007/08/31(金) 12:04:140879デフォルトの名無しさん
2007/08/31(金) 13:11:18何故でしょうか?読み込むテキストはUTF-8で書いてあります
0880デフォルトの名無しさん
2007/08/31(金) 13:25:50それがサポートされていれば、の話だがな
0881デフォルトの名無しさん
2007/08/31(金) 13:31:46試しましたがダメでした
0882デフォルトの名無しさん
2007/08/31(金) 13:36:17これが読めなかったのか
janapeseとかいうlocaleを使っているところを見ると、VC++か?
なら、C++localeに任せるのは諦めろ。
VC++はUTF-8なlocaleをサポートしていない。
0883デフォルトの名無しさん
2007/08/31(金) 13:38:14ありがとうございました
0884デフォルトの名無しさん
2007/08/31(金) 13:42:01BoostにもUTF-8コード変換のファセットがあるんだが、
対象がUCS-4だからWindowsのwchar_tでは使えないだろう。
それならおそらく自作するしかない。誰か作っているかもしれないが。
http://www.boost.org/libs/serialization/doc/codecvt.html
0885デフォルトの名無しさん
2007/08/31(金) 13:49:05汎用的なcodecvt<>のセットがどっかにあるんなら俺も欲しいな
boost::iostreams::codeconverterとかはpublicなデストラクタを備える
codecvt<>実装を要求するんで、VC++標準のcodecvt<>は使えないしな
iconvあたりを使ってデッチあげる手もあると思うが、状態をmbstate_tで
管理しなければならない辺りが悩ましげだし、wchar_tのバイト数が決まってないのも
やっぱ面倒だよな
0886デフォルトの名無しさん
2007/08/31(金) 14:25:44ttp://tricklib.com/cxx/ex/babel/
0887デフォルトの名無しさん
2007/08/31(金) 15:04:43警告がでるんですが、この関数の新しいバージョンってありますか?
探したけど見つかりませんでした
0888デフォルトの名無しさん
2007/08/31(金) 16:52:120889デフォルトの名無しさん
2007/08/31(金) 17:30:31#pragma warning( disable : 4996 )で消しました
0890デフォルトの名無しさん
2007/08/31(金) 17:38:19#pragma warning(push)
#pragma warning(disabel:4996)
#pragma warning(pop)
#endif
0891デフォルトの名無しさん
2007/08/31(金) 23:16:38これって何してるのですか?
0892デフォルトの名無しさん
2007/08/31(金) 23:20:320893デフォルトの名無しさん
2007/08/31(金) 23:27:590894デフォルトの名無しさん
2007/08/31(金) 23:32:10があるときに
basic_string<char>
ってするだけで
basic_string<char, std::char_traits<char> >
ってするのと一緒になるという手抜きができますよってこと?
0895デフォルトの名無しさん
2007/08/31(金) 23:59:190896デフォルトの名無しさん
2007/09/01(土) 00:05:08EUC出力したいのですけど何か参考になる
URLとかないでしょうか?
0897デフォルトの名無しさん
2007/09/01(土) 00:13:150898デフォルトの名無しさん
2007/09/01(土) 00:23:060899デフォルトの名無しさん
2007/09/01(土) 00:28:17コード変換はストリームの管轄ではない。>>879-886
でも、basic_ostream<char>だとcodecvtは使われないのか?
locale関係に挫折したら、邪道だけどストリームバッファを
作成して書き込み前の瀬戸際で変換をかけるという手もあると思う。
0900デフォルトの名無しさん
2007/09/01(土) 10:26:32なんでここまで大がかりになるのかよーわからん。
C++の言語設計ポリシーがきもいのが原因なんだろうけどさー
0901デフォルトの名無しさん
2007/09/01(土) 11:52:33究極的にそれができるから、C/C++が好きだ
美しくスマートに書くのは確かにめんどいが
0902!omikuji
2007/09/01(土) 12:47:390903デフォルトの名無しさん
2007/09/01(土) 14:51:04もっと勉強してから読むか
0904デフォルトの名無しさん
2007/09/01(土) 15:06:260905デフォルトの名無しさん
2007/09/01(土) 16:33:13に、JIS<->Unicodeのcodecvtファセット実装例が載っているんだが、
mbstate_tを使わない場合(この実装例では使ってない。つか、mbstate_tなんて
処理系毎の実装詳細に属する代物だから、事実上使えないだろう)、
結局独自のストリーム型を定義するハメになるようだな。
無論wcout等の既存のストリームをimbue()することなんて出来やしない。
これじゃわざわざcodecvtとしてコード変換層を実装する意味はありはしない。
無駄とも思える複雑さを導入していながらこのていたらく。
C++のlocale, streamまわりの設計は本当に糞だな(実装の質も糞だが)。
0906デフォルトの名無しさん
2007/09/01(土) 18:38:25コピーコンストラクタをちゃんと書いてないとコピーできないよね。
なんかもっといい方法ってあるんだろうか。。
0907デフォルトの名無しさん
2007/09/01(土) 22:00:090908デフォルトの名無しさん
2007/09/01(土) 22:58:170909デフォルトの名無しさん
2007/09/01(土) 22:59:49組み込みでも使えるな
0910デフォルトの名無しさん
2007/09/02(日) 01:52:58これはどういう時に呼び出される命令なんでしょうか?
0911デフォルトの名無しさん
2007/09/02(日) 01:56:590912デフォルトの名無しさん
2007/09/02(日) 02:08:48別の関数とかクラスが内部で使ってる場合もあるんですかね?
0913デフォルトの名無しさん
2007/09/02(日) 02:13:570914デフォルトの名無しさん
2007/09/02(日) 02:14:39そりゃ、メモリコピーなんて非常に基本的な機能だからいろんなところで使われてるだろう。
0915デフォルトの名無しさん
2007/09/02(日) 02:15:580916デフォルトの名無しさん
2007/09/02(日) 02:17:41どうしよう
0917デフォルトの名無しさん
2007/09/02(日) 02:18:060918デフォルトの名無しさん
2007/09/02(日) 02:30:05今やってみたら原因がわかった気がします
ありがとうございました
0919デフォルトの名無しさん
2007/09/02(日) 04:18:43VC++6でwindows コンソールアプリを作っていますが
たとえば
int nA;
nA = 0;
while(1){
print("count=%d",nA++);
Sleep(500);
}
でカウンタ値を表示しますが
マウスをコンソールにあわせると、タイトルバーに「選択」とでて処理が止まってしまいます
これをやめさせるにはどーしたらよいでしょう?
0920デフォルトの名無しさん
2007/09/02(日) 04:28:44コンソールウィンドウの「簡易編集モード」をオフにするとか。
あれ?マウスカーソル持って行っただけで選択になったっけ?
0921デフォルトの名無しさん
2007/09/02(日) 04:30:260922デフォルトの名無しさん
2007/09/02(日) 04:48:44マウスを持っていって置くだけでなります
0923919
2007/09/02(日) 04:54:02ありがとうございます
「簡易編集モード」でぐぐったら、プロパティで変えられるんですね
変えたらならなくなりましたが
このウィンドウだけ、プログラム上から変える方法はあるんでしょうか?
0924デフォルトの名無しさん
2007/09/02(日) 05:16:22さぁね。あとはこっち↓行けば?
Win32API質問箱 Build56
http://pc11.2ch.net/test/read.cgi/tech/1186989201/
0925デフォルトの名無しさん
2007/09/02(日) 07:33:160926デフォルトの名無しさん
2007/09/02(日) 07:58:40コンパイラは基本的に.NETの中間言語 (CIL)を吐き(一部生の機械語もあり)、
実行には.NET Frameworkなどが必要になる。
所定の構文に従って書けば、C#など.NET言語で使えるクラスも書けるし、
参照設定すれば.NETのライブラリだって使えるしで、
お得なようで、ネイティブと.NET両方の苦悩を抱え込んで面倒くささも倍増。
それが/clrオプションで使えるC++/CLI。
C++/CLI について語ろうぜ Part2
http://pc11.2ch.net/test/read.cgi/tech/1142147319/l50
0927デフォルトの名無しさん
2007/09/02(日) 10:47:36「置く」なんてオレ語を使うからややこしくなる。
クリックしているんじゃないの?
クリックすることを「置く」なんて言っても通じないよ。
0928デフォルトの名無しさん
2007/09/02(日) 10:57:460929デフォルトの名無しさん
2007/09/02(日) 11:00:040930デフォルトの名無しさん
2007/09/02(日) 11:06:05置く→アクティブで窓の上
で、アクティブにするのにクリックしたんだと思ったが違うのか
0931デフォルトの名無しさん
2007/09/02(日) 11:15:04それだ
0932デフォルトの名無しさん
2007/09/02(日) 11:17:560933デフォルトの名無しさん
2007/09/02(日) 11:34:080934デフォルトの名無しさん
2007/09/02(日) 12:42:480935デフォルトの名無しさん
2007/09/02(日) 12:46:110936デフォルトの名無しさん
2007/09/02(日) 12:47:150937デフォルトの名無しさん
2007/09/02(日) 19:08:55大文字でもなくマクロではないと思うし、処理系の拡張なら__interfaceという感じになってそうですし、
VC++だと色が変わるので、予約語だと思ったんですが。
でもWikipediaとかの予約語一覧にも載ってない…
0938デフォルトの名無しさん
2007/09/02(日) 19:17:370939デフォルトの名無しさん
2007/09/02(日) 19:20:410940デフォルトの名無しさん
2007/09/02(日) 19:23:320941デフォルトの名無しさん
2007/09/02(日) 19:25:450942デフォルトの名無しさん
2007/09/02(日) 19:27:140943デフォルトの名無しさん
2007/09/02(日) 19:28:410944デフォルトの名無しさん
2007/09/02(日) 19:29:390945デフォルトの名無しさん
2007/09/02(日) 19:30:430946デフォルトの名無しさん
2007/09/02(日) 19:39:520947デフォルトの名無しさん
2007/09/02(日) 19:41:16"interface" という語は C++ の予約語ではなく、
該当する COM ヘッダーの中で "struct" として #defined されます
(C++ では、構造体が標準でプライベートではなくパブリックの継承とアクセスを使用することを除けば、クラスと構造体は同じであることを思い出してください)。
http://msdn.microsoft.com/library/ja/jpdnguion/htm/msdn_drguion020298.asp
0948デフォルトの名無しさん
2007/09/02(日) 19:43:530949デフォルトの名無しさん
2007/09/02(日) 19:52:22Code Projectなんかがヘビーなコンポーネントを公開しているのはほとんど海外組み
0950デフォルトの名無しさん
2007/09/02(日) 20:30:520951デフォルトの名無しさん
2007/09/02(日) 21:52:22C言語でtelnetした後に続けてサーバーに出力を自動で送信する方法はありませんか?
エミュレータと通信してましてエミュレータと接続した後に
エミュレータ上のモニターに対してコマンドを送りたいです
具体的には
system("telnet 127.0.0.1 5556");
した後にqというコマンドをエミュレータのモニターに送りたいのですが
スレッドが一つだと処理がtelnetから動かず
スレッドを二つにして
system("q");
と入力を行うとエミュレータでなくDOS上でqが行われるようでうまく動きません
0952デフォルトの名無しさん
2007/09/02(日) 21:58:19っ popen
0953デフォルトの名無しさん
2007/09/02(日) 21:58:300954デフォルトの名無しさん
2007/09/02(日) 22:01:30そういう場合はexpectを使え、ということになっている
0955デフォルトの名無しさん
2007/09/02(日) 22:12:000956デフォルトの名無しさん
2007/09/02(日) 22:12:29おれなんて文法理解するだけで精一杯だよ
0957デフォルトの名無しさん
2007/09/02(日) 22:15:500958デフォルトの名無しさん
2007/09/02(日) 22:16:34OSはWinXP
エミュレータはQEMU
エミュレータ上のOSはDebian
Cの開発環境はVisualStdioを使っています
そしてWinXP上のC言語とQEMUで通信しております
0959デフォルトの名無しさん
2007/09/02(日) 22:17:24・簡単なアプリを作る→その肉付けをしていき内容を濃くする
・簡単なアプリを作る→簡単なアプリを作る
・高度なアプリを作る→半年後見直すと自分で組んだプログラムが恥ずかしく感じ組みなおす
・高度なアプリを作る→挫折する
これらを繰り返していくうちに身に付くから、今できることをやるだけで色んな知識を覚えていくよ
0960デフォルトの名無しさん
2007/09/02(日) 22:36:39>>959
もともと発想力がないからか、自分で課題が思い浮かばないけど
とりあえず持ってる参考書は全て読んで、サンプルだけでも動かして
ちょこっと変更したりすることをしばらく続けて見ようと思う
いまはイテレーターアダプタと格闘中。
0961デフォルトの名無しさん
2007/09/02(日) 22:43:14多分勘違いしてはる
system()はコマンドを実行するようなモノであって、
線路(パイプ、FILE*など含む)に送信する働きはない
試作では、send(),recv()かなんかを使うことになるのでは
そっからはやり方はいろいろあるけど、自力で見出していくのでは
0962デフォルトの名無しさん
2007/09/02(日) 22:46:05例えばTeraTermを使っていいなら、自動運転用マクロ言語内蔵だから接続先からの特定のキーワードを待って
それに対して一定の反応を返すことくらいちょちょいのぱーだよ。
0963デフォルトの名無しさん
2007/09/02(日) 23:05:08ソケット開いてtelnet話せばいいだけだろ
なんでそんな単純な事も解からないんだ
氏ねよw
0964デフォルトの名無しさん
2007/09/02(日) 23:08:25サンプルだけ動かして
「俺、C++できるよ」
なんて言ってるような奴にはならないでね
0965デフォルトの名無しさん
2007/09/02(日) 23:10:29system関数は使えないんですね・・・
recv()考えて見ます
>962
それはちょっと使えそうにないので他の手を考えてみます
0966デフォルトの名無しさん
2007/09/02(日) 23:11:21まだ初期段階だから先は長いと思ってる
まあ仕事でC++使えば一気に向上するとは思うけど
0967デフォルトの名無しさん
2007/09/02(日) 23:12:27詳細はよくわからんが、connectしてデータをsendすればいいだけではないの??
0968デフォルトの名無しさん
2007/09/02(日) 23:26:00URGデータの処理とか考えなけりゃね。
0969デフォルトの名無しさん
2007/09/02(日) 23:28:07そうかログイン処理が必要だな
こりゃ失礼
0970デフォルトの名無しさん
2007/09/02(日) 23:34:45せめてライブラリ使うかexpectに汁っての
下らない仕事のためにtelnetを喋るTCPクライアントをわざわざ手書きするなんて
ナンセンス極まりない
0971デフォルトの名無しさん
2007/09/02(日) 23:46:27そのくらいの軽務なら、connect(), recv()でいいんじゃないかと思った
CreateThreadはできるけど、system()がわからない。
きっと、IPC(広義の)の初心者さんなんだ ヒントくらいでいいんじゃまいかとw
0972デフォルトの名無しさん
2007/09/02(日) 23:54:37どうせ暇なニート学生だろ?
0973デフォルトの名無しさん
2007/09/02(日) 23:59:550974デフォルトの名無しさん
2007/09/03(月) 00:01:342chが動画サイトめぐりだろ
身分があるだけでニートとかわらんだろw
0975デフォルトの名無しさん
2007/09/03(月) 00:08:38そもそも telnet を使う必要が無いんじゃないか?
0976デフォルトの名無しさん
2007/09/03(月) 00:10:10プログラムを読もうと思っていたのですが難しすぎて分かりません
みなさんはある程度文法の勉強をしてからどのようにして勉強していきましたか?
0977デフォルトの名無しさん
2007/09/03(月) 00:13:360978デフォルトの名無しさん
2007/09/03(月) 00:15:51Cなら簡単に1万行ぐらいまでなら
読めるようになる方法がある。読めない文法だけ
飛ばしてたぶん処理追えるようにはなるとは思う
環境ちょっと限定になるけどな
0979デフォルトの名無しさん
2007/09/03(月) 00:16:17必要に迫られれば、驚くほどの速度で習得可能
文法の次はアルゴリズムの勉強がお勧め
アルゴリズムに関する説明(自然言語)を元にC言語ソースにする
これが結構難しい
0980デフォルトの名無しさん
2007/09/03(月) 00:18:200981デフォルトの名無しさん
2007/09/03(月) 00:20:37モジュールバラしテクニックを身に着けるといいよ。
単純にどこで処理が範囲かわかったら
あとは改造する楽しいよ。
0982デフォルトの名無しさん
2007/09/03(月) 00:25:40ある程度うまい書き方とか定石なども学びたいと思いまして
今コーディングの本を読んでいるのですがいきなり書いてそれに慣れてしまうと
ものすごい危険なコードを何の意識もなく書いてしまったりしてしまうのかと思いまして
>>979
今読んでいる本が終わったらアルゴリズムの本も読んでみようと思います
0983デフォルトの名無しさん
2007/09/03(月) 00:30:13最初から完璧なコードが書けるなどと思うな
最初は誰でもつたないんだ
それを気にせずコード書け
書かなきゃいつまでたっても上手くはならん
0984デフォルトの名無しさん
2007/09/03(月) 00:33:16と言っても読みながら書かないと理解できないような内容だから
読もうとしてる内に書く経験も積むことになるが
0985デフォルトの名無しさん
2007/09/03(月) 00:34:260987デフォルトの名無しさん
2007/09/03(月) 00:38:12何でもいいから動くもの作らんと、モチベーション維持が大変だ
目標があってC言語勉強したんだろうから、目標までの道のりを
考えて一歩ずつ進むしかないよ。
といいつつも、俺はなんもしてないな。
0988デフォルトの名無しさん
2007/09/03(月) 00:41:22ぶっちゃけCは向いてないよあまり
0989デフォルトの名無しさん
2007/09/03(月) 00:42:45大学とか専門学校で出される課題のようなプログラムを作るといいよ
ここには宿題スレもある事だし
0990デフォルトの名無しさん
2007/09/03(月) 00:44:16ただし作った奴以外には読めない使えない代物になるけど
0991デフォルトの名無しさん
2007/09/03(月) 00:46:46人に薦められた本が君に適している確率はかなり低いよ。
マスターしたけりゃ立ち読みして読みやすいと感じた本を読め。
仮にその本が結局ハズレでも、その次に選ぶ本はより君に適しているはず。
0992デフォルトの名無しさん
2007/09/03(月) 00:52:56どうやれば市販のソフトのようなものが作れるかもよく分からない状況で
みなさんvisual studioとか使ってるんですか?
>>991
はいわかりました
0993デフォルトの名無しさん
2007/09/03(月) 00:55:13VC++とVC#だけだけど
0994デフォルトの名無しさん
2007/09/03(月) 00:58:05>>993
どのようなアプリをつくったんですか?
公開できるようなものではないと思いますがw
0995デフォルトの名無しさん
2007/09/03(月) 01:00:37【初心者歓迎】C/C++室 Ver.42【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1188748806/l50
0996デフォルトの名無しさん
2007/09/03(月) 01:02:260997デフォルトの名無しさん
2007/09/03(月) 01:03:47馬鹿にしてんのか
0998992
2007/09/03(月) 01:07:49994は僕じゃないです
0999デフォルトの名無しさん
2007/09/03(月) 01:13:491000デフォルトの名無しさん
2007/09/03(月) 01:14:1010011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。