【初心者歓迎】C/C++室 Ver.39【環境依存OK】
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2007/06/25(月) 12:01:46ただしその場合、質問者は必ず、環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.38【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1180877635/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0002デフォルトの名無しさん
2007/06/25(月) 12:04:060003ちんこ
2007/06/25(月) 12:33:430004デフォルトの名無しさん
2007/06/25(月) 12:36:120005デフォルトの名無しさん
2007/06/25(月) 13:26:07/^ 7 / // i /| .ト、 !ハ .
,′// }. |ハト、{ヽ! ヽ! ヽト/ハ ! !
三 | / / | ハ ,=、 =、 ☆ | |
_| / ミ /ノ,, ,, ___ ,, | ! j|
\ /三L」 ミ / 二コ、ヽ . _ .ノ ,イ / . ′
X/ .| | ミ / xく | > ┬ イリ. / /
// \ | |__ / .!斗―/.! / ./ /__{
.{_ __ / ̄ヽj 从| トイヽ_/{ { ∧
 ̄_ {___人 / /` .。ノ ___ \
//∨ } \< / ′ ※亠‐┐ 〉
//ミ ノ_人 \{ { j!| }|/!
0006デフォルトの名無しさん
2007/06/25(月) 15:08:41ファイルから別のファイルに内容をコピーする場合
コピー元のファイルを開いて中身を配列に格納してコピー元のファイルを閉じ、
コピー先をファイルを開いて配列に格納した内容をコピー先に送ってコピー先のファイルを閉じる
ってやり方でOKでしょうか?
それともコピー元とコピー先のファイルを一緒に開いて直接コピーする事は可能ですか?
0007デフォルトの名無しさん
2007/06/25(月) 15:11:170008デフォルトの名無しさん
2007/06/25(月) 15:25:43と言うかメモリに収まりきらない巨大なファイルをコピーする場合は
同時にオープンするしかないでしょ。
seekg()とかでちょっとずつコピーする事もできるけど現実的じゃないし。
0009デフォルトの名無しさん
2007/06/25(月) 15:28:02同時にファイルを開く場合、書き方としてはこれで大丈夫でしょうか?
FILE *fp1,*fp2;
char ch;
if((fp1 = fopen(argv[1],"r")) == NULL){
printf("ファイルを開くことが出来ません\n");
exit(1);
}
if((fp2 = fopen(argv[2],"a")) == NULL){
printf("ファイルを開くことが出来ません\n");
exit(1);
}
while((ch = fgetc(fp1)) != EOF){
fputc(ch,fp2);
0010デフォルトの名無しさん
2007/06/25(月) 15:35:53それから"a"で開いてるのはどうして?
0011デフォルトの名無しさん
2007/06/25(月) 15:42:42・引数の数チェック汁
・fgetc()はgetc()と機能は同じだがfgetc()のほうが速いことはまずない
fputc()も同様
まぁどっちもファイルコピーに使うには遅すぎだが
・つかファイルをコピーしたいんならバイナリで開け
・開けなかった時はperror()を使うと処理系定義のエラーメッセージを出してくれる
0012デフォルトの名無しさん
2007/06/25(月) 15:46:45>>11 今日、ファイル入ったばかりでまだバイナリまでいってないんす・・・
でこんな感じで書いてみたのですが、何故かコピー先のファイルから結果が表示されない・・・どちて?
int main(int argc,char *argv[])
{
FILE *fp1,*fp2;
char ch;
if(argc != 2){
printf("使用法:<プログラム名> <コピー元ファイル名> <コピー先ファイル名>\n");
exit(1);
}
if((fp1 = fopen(argv[1],"r")) == NULL){
printf("ファイルを開くことが出来ません\n");
exit(1);
}
if((fp2 = fopen(argv[2],"w+")) == NULL){
printf("ファイルを開くことが出来ません\n");
exit(1);
}
while((ch = fgetc(fp1)) != EOF)
if(fputc(ch,fp2) == EOF){
printf("ファイル書き込みエラー\n");
exit(1);
}
fclose(fp1);
while((ch = fgetc(fp2)) != EOF) putchar(ch);
fclose(fp2);
return 0;
}
0013デフォルトの名無しさん
2007/06/25(月) 15:49:49+ if (argc != 3) {
それと
while((ch = fgetc(fp2)) != EOF) putchar(ch);
の前に
rewind(fp2);
入れろ
0014デフォルトの名無しさん
2007/06/25(月) 15:52:27できました
ありがとうごぜいます
0015デフォルトの名無しさん
2007/06/25(月) 16:12:16バックアップソフトを作りたいと思ってます。
フォルダの中身を、違うパーティションにコピーするだけです。
’曜日’と’時間’だけ、タイムテーブルのようなものに
記録しておいて、時間が来たらコピーする。ということを
永久に繰り返します。
月曜日は、5:00と13:00と18時
火曜日は、5:00
水曜日は、3:00
・・・
など、曜日によって回数も様々です。
どういう仕組みを使うのが、良いでしょうか?
time_t current;
time(¤t);
で、1秒ごとに時刻を取得して比較してたら
大変ですよね。
0016デフォルトの名無しさん
2007/06/25(月) 16:14:420017デフォルトの名無しさん
2007/06/25(月) 16:17:101.次のバックアップまでの時間に応じてチェックする間隔を変更する(時間に応じて2時間、30分、5分、1分のように)
2.Windows付属のスケジューラを使う
3.多少の誤差は気にせず指定時間までSleep
0018デフォルトの名無しさん
2007/06/25(月) 16:27:43c++でcursesを使ったプログラミングをしているのですが、
string str[2]
str[0] = "hoge0";
str[1] = "hoge1";
str[2] = "hoge2";
for(int i=0; i<3; ++i){
printf("%s\n",str[i]);
refresh();
sleep(1);
}
のように行うことで出力したいのですがうまくコンパイルできません。
stirng型を出力する方法はないでしょうか?
教えてください。
0019デフォルトの名無しさん
2007/06/25(月) 16:31:49つ str[i].c_str()
つか、君の読んでる本には載ってないのか?
0020デフォルトの名無しさん
2007/06/25(月) 16:32:52追記です。
出力に●や彡を出力したいので、charではうまくいかず、
stringを使っています。
%sがchar*だからstringの出力ができないと思うのですが、
%sの代わりの変換指定子が分かりません。
お願いします。
0022デフォルトの名無しさん
2007/06/25(月) 16:35:08- string str[2]
+ string str[3];
>>20
>>19を嫁
c_str()はconst char*を返すから%sでいい
0023デフォルトの名無しさん
2007/06/25(月) 16:38:53ひらがな、カタカナ、漢字などの全角文字の表示に問題なかったのですが
実際は半角英数字以外使ってはいけないとかあるのでしょうか?
初心者向けの書籍だとみな半角の英語を使って説明されているので
全角文字でも問題がないのかどうか判断に困っています。
0024デフォルトの名無しさん
2007/06/25(月) 16:42:18ためせ
0025デフォルトの名無しさん
2007/06/25(月) 17:01:14>>23
char* なら、ASCII だろうと多バイト文字列だろうと問題ナス。
0026デフォルトの名無しさん
2007/06/25(月) 17:02:42その場合
char ch;
は間違い。
int ch;
にすべし。
002724
2007/06/25(月) 17:03:40ごめん
実際には
・その特定のエンコーディングのソースをコンパイラが処理できるか
・実際に表示(端末に出力)した際に、その特定のエンコーディングの文字列を
端末が表示できるか
といった問題が関係してくる
まあ日本語に対応したOSや端末で、日本語に対応したコンパイラを使っている
分には通常問題が無いが、
例えばEUC-JPやISO-2022-JPやUTF-8なソースをVC++は食えない
最近のgccは-finput-charsetだの-fexec-charsetだのを適切に指定することで
多国語に対応する
0028デフォルトの名無しさん
2007/06/25(月) 17:07:16>>19さん
のように行ったらできました。ありがとうございました。
私の使っている、「やさしいC++」にはc_str()は載ってませんでした。
これが分かった上でもうひとつお聞きしたいのですが、
string str[2];
str[0] = "hoge0";
str[1] = "hoge1";
str[2] = "hoge2";
char* s[2];
s[0] = str[0].c_str();
s[1] = str[1].c_str();
s[2] = str[2].c_str();
が行えません。
char*にchar*を入れているのでいけると思ったのですが。
これはなぜでしょうか?
0029デフォルトの名無しさん
2007/06/25(月) 17:08:28>>22で指摘したのに……
配列str[]のサイズは2ではなく3にしろ
0030デフォルトの名無しさん
2007/06/25(月) 17:10:00char*にconst char *はそのままでは代入できないからだ
const char *s[3];
とするか(こっちが推奨)、
s[0] = const_cast<char*>(str[0].c_str());
とでも汁(こっちは非推奨)
0031デフォルトの名無しさん
2007/06/25(月) 17:11:53すみません、これは単純な書きミスでした。
string str[3];
str[0] = "●";
str[1] = "●●";
str[2] = "●●●";
char* s[3];
s[0] = str[0].c_str();
s[1] = str[1].c_str();
s[2] = str[2].c_str();
としてます。
0032デフォルトの名無しさん
2007/06/25(月) 17:16:47非推奨っつーか、やっちゃだめ
0033デフォルトの名無しさん
2007/06/25(月) 17:17:48ありがとうございます。
やってみたらできました。
みなさんありがとうございました。
# 書き込む前に新しいレスがあるかリロードでチェックしなくてはいけませんね。
# 何か自分が書き込むタイミングが一歩遅いようで。申し訳ないです。
0034デフォルトの名無しさん
2007/06/25(月) 17:18:39char *s = "hello";
と犯罪性は同じだと思うけど。
でもこれは合法だしな未だに。
0036デフォルトの名無しさん
2007/06/25(月) 17:21:18そんな負の遺産も使っちゃダメ。
0037デフォルトの名無しさん
2007/06/25(月) 17:23:44〃〃 _, ,_
⊂⌒( `Д´) < ヤダヤダ!
`ヽ_つ ⊂ノ
ジタバタ
0038デフォルトの名無しさん
2007/06/25(月) 17:54:43例外がキャッチされなかった場合、
デストラクタが実行されるかどうかは未定義で、
実際 g++ だと実行されなかったりします。
それを考えると、main で catch(...) しといた方が
安全なのかな・・・とか思うのですが。
0039デフォルトの名無しさん
2007/06/25(月) 18:03:13#include<stdlib.h>
char *search_r(char *s,char *p){
char *x;
int i;
x=p;
i=sizeof(p);
while(1){
p=x;
if(*s=='\0')exit(1);
while(*s==*p){
if(*s=='\0')exit(1);
s++;
p++;
}
if(*p=='\0')break;
s++;
}
return s-(i-1);
}
int main(){
char *x;
x=search_r("konbanhasensei","hasen");
printf("%s",x);
return 0;
}
文字列pから文字列sを検索するプログラム
このプログラムで結果を 「hasensei」と表示したいのですが「sensei」となってしまいます。
どこがおかしいのでしょうか。
よろしくお願いします。
0040デフォルトの名無しさん
2007/06/25(月) 18:08:15マンドクセーからちゃんと読んでないが
> i=sizeof(p);
sizeof(p)はポインタpのサイズ(4とか)が分かるだけだ。
pが指してる文字列の長さを測りたいのなら、strlen()を使え。
0041デフォルトの名無しさん
2007/06/25(月) 18:08:25s-(i-1) → s-i
exit(1); が凄い気になるが・・・。
NULL 返したのでいいんじゃないかな。
for 使ってないあたりも読みづらい。
0042デフォルトの名無しさん
2007/06/25(月) 18:11:37>>41
ありがとうございます。
0043デフォルトの名無しさん
2007/06/25(月) 18:19:29まあそれは自分で確認してくれ。
0044デフォルトの名無しさん
2007/06/25(月) 21:19:09今日自分の作ったサブルーティンを上司がチェックしたみたいなんですが
この構造体はインパラメータだから値渡しにしろ
と言ってきました。
サブルーティンの引数に構造体を渡すときに値渡しって使いますか?
このサブルーティンで使っている構造体のサイズは決して小さくはありませんし、
自分的には構造体のサイズが小さくても値渡しは使わないと思っていたので
ちょっと衝撃的でした。
0045デフォルトの名無しさん
2007/06/25(月) 21:25:180046デフォルトの名無しさん
2007/06/25(月) 21:25:36const参照渡しをしててそう言われたんなら上司を鼻で笑ってやれ
constのつかないポインタ渡しでもしてたんなら君も悪い
0047デフォルトの名無しさん
2007/06/25(月) 21:47:18004847
2007/06/25(月) 21:48:37勘違いした ごめんよ
0049デフォルトの名無しさん
2007/06/25(月) 21:56:24小さい構造体の場合は別な事もあるけど、
まあ場合によるな。
0051デフォルトの名無しさん
2007/06/25(月) 22:24:29早っ!
0052デフォルトの名無しさん
2007/06/25(月) 22:24:49うちに来い。Cだが、ひどいデスマも無い。
残業代は0だけど・・・
0053デフォルトの名無しさん
2007/06/25(月) 22:43:5715です。
曜日、時間でのバックアップの件でしたが、
お礼遅れてすみません。sleepで行きます。
ありがとうございました。
0054デフォルトの名無しさん
2007/06/25(月) 23:02:28C++ならconst参照だろ
0055デフォルトの名無しさん
2007/06/25(月) 23:03:36大きな構造体って時点で C かと思ってしまってた。
0056デフォルトの名無しさん
2007/06/25(月) 23:07:00struct S {
int a;
int b;
int c;
};
という定義の構造体があったとして、
S s = {0};
と書いた場合、b と c が 0 になることは保証されますか?
0057デフォルトの名無しさん
2007/06/25(月) 23:09:310058デフォルトの名無しさん
2007/06/25(月) 23:16:54int() すなわち 0 で初期化される。
0059デフォルトの名無しさん
2007/06/25(月) 23:24:54ありがとです。
0060デフォルトの名無しさん
2007/06/26(火) 01:00:48builderのウィンドウで、タブ(Astandard,Additional,Win32,System,,,)
ってありますが、こういうことする場合は、どんな部品を
使用すればよいでしょうか?
006160
2007/06/26(火) 01:03:49追加、削除もしたいんです。
よろしくお願いします。
0062デフォルトの名無しさん
2007/06/26(火) 02:34:19あんたの思ってるとおり、しといたほうが安全だよ。
その前に std::exception は別でキャッチしてエラー表示してね。
0063デフォルトの名無しさん
2007/06/26(火) 05:55:44それはそれで危険という気もしなくもない。
どっちがいいのかね?
0064デフォルトの名無しさん
2007/06/26(火) 06:36:20俺は使ってない。
0065デフォルトの名無しさん
2007/06/26(火) 08:37:350066デフォルトの名無しさん
2007/06/26(火) 08:41:34メンバ変数が変にならないように気をつけるべきということで、
キャッチされても問題ないように作るべき、なのかな?
0067デフォルトの名無しさん
2007/06/26(火) 08:55:33http://www.boost.org/more/generic_exception_safety.html
http://boost.cppll.jp/HEAD/more/generic_exception_safety.html
「まるで例外は、正しいコードに対するミステリアスな攻撃であり、
我々が自らをその攻撃から守らなければいけないようなものであると
見なされているかのようである。 言うまでもなく、これはエラー捕捉との
健全な関係に繋がらない!」
0068デフォルトの名無しさん
2007/06/26(火) 09:00:32boost や標準ライブラリの方針によれば、使わないほうがいいってことになる。
http://www.boost.org/more/lib_guide.htm#Exception-specification
0069デフォルトの名無しさん
2007/06/26(火) 09:08:140070デフォルトの名無しさん
2007/06/26(火) 09:17:40catch 中で別の例外起こされたら面倒だからかな?
0071デフォルトの名無しさん
2007/06/26(火) 09:23:55確かに健全な関係ではないけど、
無視できないんだよなあ。
例外指定を普通使わない以上、
どの関数がどんな例外を投げるか
パッと見分からないことも多いし、
思わぬ例外を投げられたらそれは
ミステリアスな攻撃と思われてもしゃーない気がするよ。
全ての関数が例外を投げる可能性があるって感覚で
プログラムを組むのがいいのかね。
0072デフォルトの名無しさん
2007/06/26(火) 09:35:26安全側に倒すという意味で、そう思ってかかってもいいだろう。
思わぬ例外を投げられてもきちんと動作するように書くべきだし、
極力そう書くことができるように言語や標準ライブラリが整備されている。
0073デフォルトの名無しさん
2007/06/26(火) 09:36:45標準ライブラリの中でも throw() はいろんな関数についてるよ。
型付で指定してるのはグローバルな operator new () ぐらいかな?
0074デフォルトの名無しさん
2007/06/26(火) 09:44:20あ、そうなんだ。
std::exception::what はオーバーライドすることがあるから
目立つってだけのことか。
0075デフォルトの名無しさん
2007/06/26(火) 09:46:24Joel タンが例外嫌いなのも、そのあたりが気持ち悪いからなんだろうな。
でも、標準ライブラリやキーワードが例外投げる以上、
無視するわけにもいかないと思うんだけどね・・・。
0076デフォルトの名無しさん
2007/06/26(火) 10:26:57あの話は戻り値についてもいっしょだろ。
ただ単に戻り値でのチェックに慣れているから、
戻り値をチェックしていないコードのほうが見つけやすいって話。
例外に慣れてしまえば、例外安全でないコードは同じぐらい
簡単に見つけられる。ただし現状では、↑の理由で他の人に
伝わらないことが多い。
敢えて言い切ってみたけど、ホントのところはちょっと自信が無い。
新しい言語をデザインするなら、 try ブロックじゃなくって
nothrow ブロックを作ればいいんじゃないかと思う。
「オレはここでは例外が飛ばないと仮定して書くぜ」っていう
ブロックね。
0077デフォルトの名無しさん
2007/06/26(火) 10:31:57例外をうっかり無視するコードより、
戻り値をうっかり無視するコードの方が危険性は高いと
個人的には思うんだけど。
0078デフォルトの名無しさん
2007/06/26(火) 10:35:190079デフォルトの名無しさん
2007/06/26(火) 10:35:240080デフォルトの名無しさん
2007/06/26(火) 10:43:090081デフォルトの名無しさん
2007/06/26(火) 11:55:16エラー→復旧っていう処理に使いやすい
エラーしたら即一連の処理を中断するだけなら戻り値でもいいけど
エラー内容によってstrategyパターンを使って処理を色々と変えるなら
例外の方がやりやすい
と思ったんだけどどうかな?
軽く試してみてちょっと良いかもって思っただけで使い続けられるとは限らないけど
0082デフォルトの名無しさん
2007/06/26(火) 14:05:12ネイティブなフォーマットのものなの?それとも POSIX
準拠じゃなきゃいけない?たとえば UNIX では /home/hoge/test.txt
で Windows では C:\home\hoge\test.txt ?
どういうフォーマットのパス文字列を取りうるかに関する
規約って定められてるの??
0083デフォルトの名無しさん
2007/06/26(火) 14:39:34処理系で好きに決めりゃいいべさ。
0084デフォルトの名無しさん
2007/06/26(火) 14:48:09決められていないんだね。 boost::filesystem では
native/ portable が厳密に切り分けられていたので、
fopen や fstream でもそうなってるのかと思った。
0085デフォルトの名無しさん
2007/06/26(火) 14:51:43const char*なのが困り物
たとえばVC++8.0ではlocale依存の方法でUTF-16に変換する
それ以前ではコードページ依存の方法でUTF-16に変換する
いずれにせよ、NTFSのUTF-16なパスを正しく扱えるとは言いがたい
UTF-16なパス名をちゃんと扱いたければ、fstreamを捨てて
カスタムのストリームバッファを作れという話になるだろう
0086デフォルトの名無しさん
2007/06/26(火) 21:17:53ios::binary指定というのは、意味があるのでしょうか?
コンパイラはg++です。
いままでとくに指定してもしなくても結果は同じになりました。
0087デフォルトの名無しさん
2007/06/26(火) 21:23:21UNIX系は関係ない。
WIndowsはstd::endlや\nを書き込むと0x0d0x0aになって書き込まれ
読むときは0x0d0aが0x0aになる。
0088デフォルトの名無しさん
2007/06/26(火) 21:26:020089デフォルトの名無しさん
2007/06/26(火) 21:27:15テキストファイルを特別扱いする(というよりC++としては特別扱いしなければならない)環境も結構ある
有名どころではDOS/Windows系のテキストファイルでは改行コードがCR+LFになっていることが挙げられる
そういう環境では、テキストファイル特有の処理を行わせたくないときに、バイナリモードを指定する必要がある
逆にUnix関係では大抵違いがないが、移植性向上のために必要に応じバイナリモードを意識的に使うのは良いことだ
Unixとかでもワイド文字ストリームなら、文字コード変換をどうするかで
テキストモードとバイナリモードの違いが表れるはず
0090デフォルトの名無しさん
2007/06/26(火) 23:37:20ch = fgetc(fp1)
if(!feof(fp1) fputc(ch,temp);
}
ファイルの中身を別のファイルにコピーする場合の例題に書かれていたコードなんですが
whileの式で(!feof(fp1))と記述されているにもかかわらず何故さらにif(!feof(fp1)と書いているのは何故なんでしょうか?
何か意味があるんですか?
whileの式でファイルの末端にきたらループ終了なのでifの式は必要ないように思えるんですが
0091デフォルトの名無しさん
2007/06/26(火) 23:44:12意味以前にその例題、コンパイルできるか?
0092デフォルトの名無しさん
2007/06/26(火) 23:45:19fgetc()で読みに行ってみないとEOFだとわからんことがあるから。
その場合、whileの条件式の時点ではEOFではないと判断して
読みに行ってみたらEOFだった(読めませんでした)というカタチになるので
下のチェックが要る。
だがこんなのは糞コード。
while ((ch = getc(fp)) != EOF) putc(ch, temp);
とするがよい。
0093デフォルトの名無しさん
2007/06/27(水) 00:12:20バイナリファイルを操作する場合は>>90の方がよい
0094デフォルトの名無しさん
2007/06/27(水) 00:13:20なぜ?
0095デフォルトの名無しさん
2007/06/27(水) 00:16:51int型と比較した時、EOFと同じ値のバイトが存在する可能性があるから
0096デフォルトの名無しさん
2007/06/27(水) 00:17:02short i;
long k;
float f;
double d;
としたときに
�@ (f+15)/(long)(d-15)
�A k+20.0
�B (int)d/i
の型(double,longなど…)はどうなるでしょうか?
こういう場合は計算式の中でもっとも高精度な変数の型になると理解すればいいのでしょうか?
0097デフォルトの名無しさん
2007/06/27(水) 00:17:55あ、chがcharだと仮定しているわけね。
それならば、単にint chと宣言して>>92のコードで良い。
0098デフォルトの名無しさん
2007/06/27(水) 00:21:04整数拡張、型の昇格
0099デフォルトの名無しさん
2007/06/27(水) 00:23:000100デフォルトの名無しさん
2007/06/27(水) 02:13:04気になったのは、どちらも char * を指定するところです。freadは void * だったと思うんですが。。。
ifs.read(reinterpret_cast<char *>(&hoge), sizeof(unsigned)); という感じで、毎回キャストしないといけないんですか?
0101デフォルトの名無しさん
2007/06/27(水) 02:27:57残念ながらキャストが必要。
毎回キャストするのが嫌なら、適当な関数で包め。
0102デフォルトの名無しさん
2007/06/27(水) 04:13:44適材適所。
0103デフォルトの名無しさん
2007/06/27(水) 09:36:590104デフォルトの名無しさん
2007/06/27(水) 09:42:16真似れば良かったのにな
0105デフォルトの名無しさん
2007/06/27(水) 10:16:53単純に&hogeで受け取れない場合もあるし。
つまり、CPUとデータの並びが逆の場合。
今回みたいに並びが合ってるのなら、union使えばいいんじゃないか?
0106デフォルトの名無しさん
2007/06/27(水) 10:26:23たかだか、同じPC内で完結するのならそのまま保存するよね?
0107デフォルトの名無しさん
2007/06/27(水) 10:41:330108デフォルトの名無しさん
2007/06/27(水) 10:49:46読む→(なんかする)→(書く) なら、それに従うしかないね。
0109デフォルトの名無しさん
2007/06/27(水) 12:14:06なるほど、ではテキストでないときには、
ios::binaryを付けるようにします。
0110デフォルトの名無しさん
2007/06/27(水) 14:39:49class Base{
public:
Base(){val0=0;};
virtual ~Base(){};
virtual void show(void){cout << val0 << endl;}
int val0;
};
class Deriv:public Base{
public:
Deriv(){val1 = 1;};
virtual ~Deriv(){};
virtual void show(void){cout << val1 << endl;}
int val1;
};
int main(int argc, char *argv[]) {
Base *test;
int num = 10;
test = new Deriv[num];
for(int i=0;i<num;i++)
test[i].show();
}
を実行すると,main()の中のfor文2回目のループ(i=1)で
0x0041e12c でハンドルされていない例外が発生しました : 0xC0000005: 場所 0x00000005 を読み込み中にアクセス違反が発生しました。 。
というエラーが出ます。
test[0]は無事Derivにオーバーライドできていますが,test[1]以降が不可能なようです。
何か良い方法はないでしょうか?
環境:WindowsXP + VisualC++ Ver.7
0111110
2007/06/27(水) 15:02:56何と呼んで良いのか分からないですが、領域確保?
とにかくnewするという意味です。
0112デフォルトの名無しさん
2007/06/27(水) 15:11:45BaseとDerivのメモリ上の大きさが違うのに、配列でどう動けと。
0113デフォルトの名無しさん
2007/06/27(水) 15:34:55((Deriv *)((char *)test + sizeof(Deriv) * i))->show();
もしくは↓
((Deriv *)test)[i].show();
0114110
2007/06/27(水) 15:51:45ありがとうございます。
なんとなく分かりました。
new Deriv[num]が失敗してるのではなく、
forループのなかでのindexの指定が間違ってるということですね。
*testがBase型のポインタなので
test[i]はtest[0]からBaseを基準にアドレスを進めることになるのか。
>>113さんの方法で動きましたけど、
そもそもこういう状況が必要になる設計はまずいでしょうか?
0115デフォルトの名無しさん
2007/06/27(水) 16:28:34一般的にはまずい。
でも、テンプレートを使って下のようにやればできないことはない。
template<class T>
class poly_array {
template<class U>
poly_array(U *ptr, int array_size) : ptr_(ptr), size_(sizeof(U)) ... {...}
T *get(int i) {return (T *)((char *)ptr_ + size_ * i); }
private:
T *ptr_;
size_t ptr_size_;
...
};
0116デフォルトの名無しさん
2007/06/27(水) 16:34:21それぞれに対してまたオブジェクトを作っていくのが、
まあ一番安全なのかね。
メモリ管理が複雑になるという点では、
安全とは言えんかもしれんが。
>>115 はちょっと感動したよ。
0117デフォルトの名無しさん
2007/06/27(水) 17:51:04(8,x),(2,y),(3,z)・・・
ソートして、
(2,y),(3,z),(8,x)・・・
を出力。(int,std::string)の形です。
どういうデータで扱って、どのような方法がよいでしょうか。
mapとか自動でソートされるみたいですが、
自分で比較して並べ替えたいです。
よろしくお願いします。
0118デフォルトの名無しさん
2007/06/27(水) 17:58:37それなら構造体で < 演算子をオーバーロードするか
比較関数を定義するかすれば
std::sort でソートできるけど。
0119デフォルトの名無しさん
2007/06/27(水) 18:00:21つ[std::vector]
0120デフォルトの名無しさん
2007/06/27(水) 18:12:57×キー値で、ソート
○キーでソート
>>118
ごめんなさい。
「(int,std::string)」
これは、余計でした。(数字,文字列) なんです。
どのデータに入れて、どんな風に処理するのか知りたいです。
>>119
std::vectorに、キーを入れてソートするんでしょうか?
対応する値は、どうやって対応させて出力を。。。
0121デフォルトの名無しさん
2007/06/27(水) 18:19:20int 値はキーで、std::string はキーに対応する値?
std::map を使うのがベストだと思うけど、
std::map を使わない理由は何かあるの?
0122デフォルトの名無しさん
2007/06/27(水) 18:22:08とりあえず、すんごい単純で愚直な方法。
#include <iostream>
#include <string>
#include <vector>
#include <utility>
#include <algorithm>
typedef std::pair<int,std::string> nspair;
bool cmp(const nspair& a, const nspair& b) { return a.first < b.first; }
int main()
{
int n;
std::string s;
std::vector<nspair> vec;
while (std::cin >> n >> s)
vec.push_back(nspair(n,s));
sort(vec.begin(), vec.end(), cmp);
for (std::vector<nspair>::iterator i = vec.begin(); i != vec.end(); ++i)
std::cout << '(' << i->first << ',' << i->second << ')' << std::endl;
}
0123デフォルトの名無しさん
2007/06/27(水) 18:25:51つboost::ptr_vector
0124デフォルトの名無しさん
2007/06/27(水) 18:41:02(数字,文字列),,,,
をキーでソートするんですが、どんなデータに格納して
どんな処理をするのか知りたかったんです。
>>122
プログラムも、書いていただきありがとうございます。
数分しかたってないのに。(汗
中身がstd::pairのstd::vectorですか。
typedefの使い方もすごい勉強になります。
ありがとうございました。
0125119
2007/06/27(水) 19:10:320126デフォルトの名無しさん
2007/06/27(水) 21:01:34(数字,文字列) 全体がキーなの?
じゃ、それに対応する値もあるの?
それとも set みたいにキー=値なの?
そして、数字が同じ時には文字列も比較するの?
と、質問攻めになってしまった。
0127デフォルトの名無しさん
2007/06/27(水) 21:30:26違った名前の変数で同じ値を参照できるってことですか?
でも同じアドレスの値を参照するだけならわざわざポインタの方の変数を作る必要は無い気が・・・・
ていうかそもそもいろんなソースコードを見ててもポインタを使ってるのはあまり見かけませんが・・・・
0128デフォルトの名無しさん
2007/06/27(水) 21:32:29C はポインタが無ければ配列も関数に渡せない言語です。
0129デフォルトの名無しさん
2007/06/27(水) 21:34:24ポインタを理解していないみたいだが君も知らない内に使ってるよ
0130デフォルトの名無しさん
2007/06/27(水) 22:04:33scanfを使ったことはないのかい?
0131デフォルトの名無しさん
2007/06/27(水) 22:08:35概念としては似たようなもんだし、イテレータ理解できるならポインタも理解できるようになるか
どうしてもポインタが駄目ならC++でイテレータから入るのも十分ありだよ
0132デフォルトの名無しさん
2007/06/27(水) 22:54:190133デフォルトの名無しさん
2007/06/27(水) 23:05:180134デフォルトの名無しさん
2007/06/27(水) 23:08:520135デフォルトの名無しさん
2007/06/27(水) 23:10:27概念的な話より、何が出来るかの方が理解しやすいだろう
0136デフォルトの名無しさん
2007/06/27(水) 23:25:390137デフォルトの名無しさん
2007/06/28(木) 00:07:25Javaのダメプログラマがまた一人。
0138デフォルトの名無しさん
2007/06/28(木) 00:17:46a = 5; /* aに対応する箱に5を入れる */
b = a; /* bに対応する箱に、aに対応する箱から取り出した値を入れる */
おんなじaでも式の右辺と左辺ではぜんぜん意味が違うのだが、それを理解してるかな?
物を入れるには箱が必要で、Cで箱そのものを値として取り回すための
仕掛けがポインタだ。
どういう時に必要になるかはいずれ分かる。
0139デフォルトの名無しさん
2007/06/28(木) 00:47:44他に存在しないから。関数は全部値渡しだし。
参照渡しが存在するならポインタの必要性は大分減るが、リストや木のような
配列より複雑なデータ構造を扱うようになれば、ポインタの有用性が自然に
理解できるだろう。
0140デフォルトの名無しさん
2007/06/28(木) 01:14:41関数とのデータ受け渡し時に構造体とかそのまま実体渡すとコピーされるのでメモリの無駄だし速度的にもデメリットがある
それに不定なサイズのデータを扱おうと思ったらポインタ使うと思うが。
0141デフォルトの名無しさん
2007/06/28(木) 14:42:29stlのアルゴリズム使って代入処理とかイテレータを用いたコンテナの初期化とかすると
> xutility(1685) : warning C4244: '+=' : '__int64' から '__w64 unsigned int' への変換です。
> データが失われる可能性があります。
とかコンパイラ様が仰られて出力窓がカオスになって困るのでこれをどうにかしたい訳ですが
こういうのは#includeディレクティブの羅列全体に(つまりxutilityを使ってるライブラリ全体を)
#pragma warning(disable:4244)と
#pragma warning(default:4244)やpush, pop使って抑制を適用しちゃっていいんでしょうか?
一応、ライブラリ以外の部分ではちゃんと/W4で警告が行われますし問題ないと思うんですが
なんか良い解決法ってございませんかね?
0142デフォルトの名無しさん
2007/06/28(木) 14:47:55__w64 は 64 ビットにするんじゃなくて、
32 ビット環境でコンパイルする時にも
もし 64 ビットにしたとしても整合性が取れるかチェックするだけ。
つまり、__w64 unsigned int は 32 ビット環境では 32 ビット符号無し整数型になる。
__int64 は 64 ビット符号付き整数型だから、
そこから 32 ビット符号無し整数型への暗黙変換で警告が出るのは当たり前。
それで本当に大丈夫なのかをまず確認した方がいい。
0143デフォルトの名無しさん
2007/06/28(木) 14:53:54使ってもおk?つまりできたファイルはプラットフォームを
またいで移動してもおk?たとえば endian の異なる
プラットフォームに持っていっても安全?
0144デフォルトの名無しさん
2007/06/28(木) 15:32:13なるほど、助言をヒントに
使用するされているイテレータの差の型にsize_tを指定して定義すればあっさりと消えました
どうもです><
0145デフォルトの名無しさん
2007/06/28(木) 17:04:11> イテレータの差の型
difference_typeのことならstd::size_tよりも
符号付のstd::ptrdiff_tのほうがいい。
it = begin();
it2 = begin();
++it2;
このときit2 - itは1になるはずで、it - it2は-1になるべきだから。
0146デフォルトの名無しさん
2007/06/28(木) 17:25:10あれの出力形式にはいろいろあって、
バイナリは知らないけど、xmlなら間違いなくできる。
0147デフォルトの名無しさん
2007/06/28(木) 17:51:43_tprintf(_T("あいう"));
とするとコンソールに正常に表示されないのですが、
どのようにしたら正常に表示できるでしょうか?
0148デフォルトの名無しさん
2007/06/28(木) 18:00:430149デフォルトの名無しさん
2007/06/28(木) 22:02:180150デフォルトの名無しさん
2007/06/28(木) 23:31:4001011010みたいに
日付が4桁4桁になってる
8桁の数字一覧の出力方法教えてください
0151デフォルトの名無しさん
2007/06/29(金) 00:53:49関数内で宣言した変数はほかへは渡せないから、同じ中身を参照できるポインタを使って
ほかの関数内でも関数内で変更した変数を渡せるようにするのがポインタですか?
自分で書いててわけがわからない文だな・・・・
とりあえずまだまだ自分は未熟なのがわかったのでまた最初から勉強しなおします!
0152デフォルトの名無しさん
2007/06/29(金) 07:50:22それは、西暦101年10月10日か、01年1月10日10時なのか、1月1日10時10分なのか、101日目、10時10分なのか、
或いはそれ以外の表現なの?
そもそも一覧とはなんなの?
0153デフォルトの名無しさん
2007/06/29(金) 09:46:270154デフォルトの名無しさん
2007/06/29(金) 09:48:430155デフォルトの名無しさん
2007/06/29(金) 13:59:10ログファイルに処理内容を、追加書き込みで
書き出してます。
std::ofstream ofs( FileName.c_str(), std::ios::out|std::ios::app);
ofs << message;
結構、同じタイミングで書き込むときあると思うのですが、
排他処理したほうがいいでしょうか?
そもそも"ファイルが壊れる"っていうのは、どんな壊れ方があるのでしょうか?
真っ白になっちゃうのか、混ぜこぜで書き込みされる。などですか?
0156デフォルトの名無しさん
2007/06/29(金) 14:04:07混ざります。しかも、通常バッファリングされるので行の途中でもお構いなしに混ざることになります。
運が悪いと、書き込んだ筈の分がロストしたり以前の分がロストしたりするかもしれません。
0157デフォルトの名無しさん
2007/06/29(金) 14:06:54ファイルが壊れる = ファイルアクセスに失敗してしまう。 居るように見えて実体が居なかったりする等
マルチスレッドのロギングで、同期取ってない場合
出力が途中で差し込まれたようなデータ列になる等、意図してないフォーマットで出力されてしまう
0158デフォルトの名無しさん
2007/06/29(金) 14:07:57混ざるのは、構わないと思ってたのですが
無くなるときもあるんですか。
じゃあ、ファイルロックとかで、ロックするようにします。
ありがとうございました。
0159デフォルトの名無しさん
2007/06/29(金) 14:09:19ふむふむです。勉強になります。
ありがとうございます。
0160デフォルトの名無しさん
2007/06/29(金) 14:12:02もみもみです。あぁ〜ん♪
感じちゃう?
0161デフォルトの名無しさん
2007/06/29(金) 14:24:45使っているlibc++がマルチスレッド対応してるなら(今時なら普通してると思うが)
istream/ostreamの関数呼び出しの単位で排他してくれてるはずだ。
つまり、例えばあるスレッドでoperator<<()が呼ばれた場合、その間は
streambufがロックされるので、streambufの内部状態が壊されることが無い。
ヘルプなどのドキュメントに明記されていないなら、ソースを読むんだね。
ただ、排他はあくまで関数呼び出し単位なので、例えば
ofs << n << ":" << s << endl;
のようなことをやっているコードでは、operator<<()が4回呼ばれている間に
他のスレッドからの出力が割り込む可能性は当然あって、その場合は
出力がぐじゃぐじゃになる。
それを避けたければ、常に1行単位で出力関数を呼ぶようにするとよいだろう。
無論自前で排他をするという手もあるが。
0162デフォルトの名無しさん
2007/06/29(金) 14:25:360163デフォルトの名無しさん
2007/06/29(金) 14:28:01バッファリングを管理しているのはstreambufで、これがstdioのFILEの対応物。
i/ostreamはstreambufへのポインタを保持しており、排他はstreambuf自体を
ロックするような形でやっていることが多いはずだ。
つかソース嫁よ。
0164デフォルトの名無しさん
2007/06/29(金) 14:31:060165デフォルトの名無しさん
2007/06/29(金) 14:35:550166デフォルトの名無しさん
2007/06/29(金) 14:36:410167デフォルトの名無しさん
2007/06/29(金) 14:51:26別に聞いたわけじゃない。
>>161のように排他してもバッファリングしてたら意味無いだろ、と
0168デフォルトの名無しさん
2007/06/29(金) 14:56:17_stprintf_s みたいにアンダーバーで始まる関数があるのですが、
アンダーバーで始まる関数には何がしの意味があってアンダーバーをつけてるのですか?
たとえば、MSによって拡張されたことを示すために付けられたとか
0169デフォルトの名無しさん
2007/06/29(金) 14:59:440170デフォルトの名無しさん
2007/06/29(金) 15:03:59ttp://www.microsoft.com/japan/msdn/security/demo/runtime.aspx
0171デフォルトの名無しさん
2007/06/29(金) 15:05:18標準じゃないやつにつけるべ
0172デフォルトの名無しさん
2007/06/29(金) 15:07:110173デフォルトの名無しさん
2007/06/29(金) 15:16:35アンダーバーから始まる名前は処理系のために予約されている
と規格で決められている
0174デフォルトの名無しさん
2007/06/29(金) 15:25:35バッファリングされる場合、実際にファイルに書き出されるのはどのタイミングか判って言ってる?
0175デフォルトの名無しさん
2007/06/29(金) 15:31:430176デフォルトの名無しさん
2007/06/29(金) 15:33:570177デフォルトの名無しさん
2007/06/29(金) 15:37:59だから入出力関数の戻り値は常にチェックしてけって話ですか?
0178デフォルトの名無しさん
2007/06/29(金) 15:39:21別々のバッファで操作しようとしてるの?
0179デフォルトの名無しさん
2007/06/29(金) 15:47:230180デフォルトの名無しさん
2007/06/29(金) 15:49:43別スレッドで同じオブジェクトを共有して
操作したんでいいんじゃないの?
0181デフォルトの名無しさん
2007/06/29(金) 15:58:37↑↓
OS管理下のバッファ
↑↓
ライブラリ管理下のバッファ
なんとなくライブラリ管理下のバッファの排他がかかってればうまくいきそうだが…
0182デフォルトの名無しさん
2007/06/29(金) 16:00:15そうなってんじゃないの?
0183デフォルトの名無しさん
2007/06/29(金) 16:59:25バッファリングされていようが、何の問題もないよ。
脳内の想像でいい加減なことを言っていないで、ソースを読むかせめて
実験したらどう?
0184デフォルトの名無しさん
2007/06/29(金) 17:18:33_snprintf() と snprintf() の挙動の違いにしょんぼりした。
0185デフォルトの名無しさん
2007/06/29(金) 17:24:42VC++だと、basic_ostream<>::sentryを利用して排他制御をやってるんだが、
3.4.4ぐらいのgccだと、何もやってないように見えるな。
0186デフォルトの名無しさん
2007/06/29(金) 17:29:58書き込むのではなく、
同じファイルに複数スレッドから別々のostreamオブジェクト経由で書き込むという
状況を想定してたのか?
無論、その場合はostream内部で排他制御しても何の意味も無いぞ。
0187デフォルトの名無しさん
2007/06/29(金) 17:34:42>同じファイルに複数スレッドから別々のostreamオブジェクト経由で書き込む
こっちのほうが複雑な排他制御になりそうだな…
0188デフォルトの名無しさん
2007/06/29(金) 17:49:39ケースを想定するなら、
例えばUnixだと、O_APPENDでopen()してwrite()一発で1行を書き込むように
している限りは、マルチスレッドだろうがマルチプロセスだろうが、
何の排他制御も要らない。
0189デフォルトの名無しさん
2007/06/29(金) 20:46:52xmlの書式で書かれたデータがint型の配列に入っているとします。
その配列から、xmlのあるタグ(例えば<script>という文字列)が
あるかどうかを検索したいと思います。
この場合、どのような方法がお勧め(簡単な実装、早い検索)でしょうか?
以下のいずれかを考えていますが、どうでしょうか?
(1) memcmp()を使いながら、<Script>に対応する数字を探していく
(2) string型に変更し、string.find()で探す
そのほかにお勧めの方法はあるならご教授願います。
(2)をすべきなら、どのようにint→stringに変換するのでしょうか?atoiを使うので
しょうか?
0190デフォルトの名無しさん
2007/06/29(金) 20:49:38ここから既にイミワカンネェ
0191デフォルトの名無しさん
2007/06/29(金) 20:56:43ひょっとして、UCS4なのか?
0192デフォルトの名無しさん
2007/06/29(金) 21:05:29void method(int *value)
というメソッドを使うと、valueの中にxmlが返ってくるケースがあります。
xmlデータじゃないのも返ってくるのでint の配列で返ってくるのだと
思います。
すいませんが、教えていただけないでしょうか?
0193デフォルトの名無しさん
2007/06/29(金) 21:12:220194デフォルトの名無しさん
2007/06/29(金) 21:16:380195デフォルトの名無しさん
2007/06/29(金) 21:20:22だから、その int 配列の中にどういう形式で文字列が入ってるんだ? と。
>>191の言うように UNICODE (しかも32ビットの UCS4)なのか。
コード体系によってその "<script>" だって表現の方法が変わってしまうから、
そこが分からなければ意味がないし(というかそれこそがこの問題の本質)、
そこを君が述べていないので「ESP」とか言われてしまうのだよ、と。
0196デフォルトの名無しさん
2007/06/29(金) 21:20:270197デフォルトの名無しさん
2007/06/29(金) 21:21:27xmlで入ってます。
0198デフォルトの名無しさん
2007/06/29(金) 21:22:010199デフォルトの名無しさん
2007/06/29(金) 21:22:18"<?xml" だったら "60 63 120 109 108"とそれぞれの値が
int型の配列に入っております。
String型でデータをもらえればいいのですが、メソッドの仕様の
関係上、int配列でしか受け取れません。
0200デフォルトの名無しさん
2007/06/29(金) 21:22:340201デフォルトの名無しさん
2007/06/29(金) 21:22:57データをそのまま貼り付ければいいのに。
0202デフォルトの名無しさん
2007/06/29(金) 21:23:48ライブラリ通して解析すべき
0203199
2007/06/29(金) 21:23:59みなさんを混乱させる状況にしてしまってすいません。
0204デフォルトの名無しさん
2007/06/29(金) 21:24:23漢字が入ってる場合はどういう具合に返ってくる?
0205デフォルトの名無しさん
2007/06/29(金) 21:24:420206デフォルトの名無しさん
2007/06/29(金) 21:25:03文字化けじゃわからんから、実例で示せ
0207デフォルトの名無しさん
2007/06/29(金) 21:27:330208199
2007/06/29(金) 21:27:41みなさんを怒らせてしまってすいません。int→stringの文字列
変換を行うことを考えて実装してみます。
本当にすいませんでした。
0209デフォルトの名無しさん
2007/06/29(金) 21:28:290210デフォルトの名無しさん
2007/06/29(金) 21:29:20エンコーディングを判別したかったんだが。
XMLライブラリを使うんなら必要なことだろ。
0211デフォルトの名無しさん
2007/06/29(金) 21:30:100212デフォルトの名無しさん
2007/06/29(金) 21:31:09漢字は文字化けするとも言ってるが。
0213デフォルトの名無しさん
2007/06/29(金) 21:32:170214デフォルトの名無しさん
2007/06/29(金) 21:32:20だから、Asciiだから漢字は含まれていないし、
含まれていたらどうなるか分かりませんって言ってるんでしょ。
0215デフォルトの名無しさん
2007/06/29(金) 21:32:330216199
2007/06/29(金) 21:35:06205は私は書いておりません。ASCII文字です。
215さんのおっしゃるとおり、デバッグで確認して
回答していました。
0217デフォルトの名無しさん
2007/06/29(金) 21:35:450218デフォルトの名無しさん
2007/06/29(金) 21:38:01intが4バイトならUTF-32、2バイトならUTF-16と見なして構わないはず。
そのまま適当なXMLのライブラリへ投げてしまえ。
0219デフォルトの名無しさん
2007/06/29(金) 21:38:19> "<?xml" だったら "60 63 120 109 108"とそれぞれの値が
> int型の配列に入っております。
もしかして、単にテキストファイルを読み込んで各文字(ASCII)のコードを
int型の配列に格納しているだけ?
1行ずつとか、ファイル全体とか。XMLの構造に関係なく。
0220デフォルトの名無しさん
2007/06/29(金) 21:38:29配列の要素数をキーボードからの入力によって定めさせたい場合、どのような方法があるでしょうか。
int n;
int a[n];
という宣言だとa[n]の宣言がエラーになってしまい、scanfによってnの値を決定した後にa[n]を宣言してみてもやはり「そこで宣言は出来ない」とエラーになってしまいます。
どなたかよろしくお願いします。
0221デフォルトの名無しさん
2007/06/29(金) 21:40:02nを読み込む。
a = (int*)malloc(sizeof(int)*n);
0222199
2007/06/29(金) 21:42:18使用してしまって混乱を招いてしまったようです。
>もしかして、単にテキストファイルを読み込んで各文字(ASCII)のコードを
>int型の配列に格納しているだけ?
>1行ずつとか、ファイル全体とか。XMLの構造に関係なく。
この場合、XMLのライブラリを使えるのでしょうか?
0223デフォルトの名無しさん
2007/06/29(金) 21:42:21CかC++か、どっちだい
Cならmalloc/freeで検索
C++ならnew/deleteで検索、もしくはstd::vectorで検索
でもそのレベルだとnを十分大きく取るって解決策の方が
いいかもしれない
0224デフォルトの名無しさん
2007/06/29(金) 21:45:24もし非ASCII文字が入っていないなら、>>219の言うとおりにやればいい。
と言いたい所だが、sizeof(wchar_t) != sizeof(int)のときに、
int配列をそのまま処理してくれるXMLライブラリってあるのかな。
俺は知らない。
ただ、非ASCII文字が無いのなら、stringなりchar配列に変換するのは
難しいことでも何でもない。受け取ったint配列の値をそのまま
突っ込んでいくだけだからな。
0225デフォルトの名無しさん
2007/06/29(金) 21:45:58とりあえずXMLのライブラリを探してきて、その仕様を調べること。
仕様を見て理解できないようなら、まずはC言語の基本とかXMLについてもっと勉強すること。
0226199
2007/06/29(金) 21:47:54(1) XMLのライブラリを調べる、勉強する
(2) int型配列をStringに変換することを考える
で、がんばってみたいと思います。ありがとうございました。
0227デフォルトの名無しさん
2007/06/29(金) 21:49:540228デフォルトの名無しさん
2007/06/29(金) 21:50:560229デフォルトの名無しさん
2007/06/29(金) 22:01:06もしかして.NET FrameworkのSystem.Stringのことか?
それならUnmanagedMemoryStream + StreamReader + UTF32Encoding
必要ならそれにXmlTextReaderでいいような気がする。
0230デフォルトの名無しさん
2007/06/29(金) 22:04:48お前ら、ありがトン。
アンダーバーで始まる関数:
アンダーバーから始まる名前は処理系のために予約されている。
そして、これを利用してMS は独自の拡張関数の名前の最初に_ つけている。
ということだな。
0231デフォルトの名無しさん
2007/06/29(金) 22:06:120232デフォルトの名無しさん
2007/06/29(金) 22:14:24230でないけど何が違うか教えてください
0233デフォルトの名無しさん
2007/06/30(土) 00:58:49違うよ?
0234デフォルトの名無しさん
2007/06/30(土) 04:16:480235デフォルトの名無しさん
2007/06/30(土) 07:22:32MSDNの見方がよく分からなくてmouse_eventを使うかもしれないという程度しかわかりませんでした・・・
使えるAPI・サンプルなどがあったら教えてください
よろしくお願いします
0236デフォルトの名無しさん
2007/06/30(土) 08:39:510237デフォルトの名無しさん
2007/06/30(土) 09:01:14質問です!!
C言語のボーランドでコンパイルしたら元のメモ帳と、コンパイル後のファイルとって感じでいくつか手元にファイルできますよね。
そのとき作ったメモ帳が消えてしまったのですが(プログラムの実行はできる状態)。
コンパイル後のファイルからもとのメモ帳ってもう見ることができないのでしょうか・・・?
わかる方よろしくお願いします。
0238デフォルトの名無しさん
2007/06/30(土) 09:02:160239デフォルトの名無しさん
2007/06/30(土) 09:03:12そのとき書き込んだメモ帳です。
0240デフォルトの名無しさん
2007/06/30(土) 09:11:39で、あんたはその「メモ」をなんて名前で保存したんだ? そいつはコマンドプロンプトでdirしても見えないのかい?
0241デフォルトの名無しさん
2007/06/30(土) 09:15:54お恥ずかしながら消しちゃったみたいなんです・・・・
コンパイルの逆、みたいなことってできないのでしょうか?
0242デフォルトの名無しさん
2007/06/30(土) 09:22:53それは無理。
0243デフォルトの名無しさん
2007/06/30(土) 09:23:43ありがとうございました。
0244デフォルトの名無しさん
2007/06/30(土) 11:32:14>17.4.3.1.2
>Each name that begins with an underscore is reserved to the implementation for use as a name in the global namespace.
implementationだから処理系でいいんじゃない?
JISの方も処理系て訳されてるし。
0245デフォルトの名無しさん
2007/06/30(土) 11:37:12元のコードがそのまま出てくるわけじゃないからなあ。
0246デフォルトの名無しさん
2007/06/30(土) 11:46:100247デフォルトの名無しさん
2007/06/30(土) 18:46:38std::vector<std::string>で渡したいと思ってます。
//スレッド関数
void Thread(void* vector){
std::vector<std::string> *vec=(std::vector<std::string>*)vector; //エラーでません。正しい?
vec->clear(); //コンパイルできても、例外がどうのと出て止まります。vec.clear()のつもりです
printf("%d",*vec[0].c_str()); //これだめです
}
○vectorの関数push_buck(),insert(),clear()など、使用したり、
vec[0]、、、の中の値が知りたいのですが、方法ありますでしょうか。
○vec.clear()とかしたいので、左辺にvecのままにして、いろいろ試しました。
std::vector<std::string> vec=(std::vector<std::string>)vector;
これは、コンパイルできませんでした。右辺がおかしいみたいです。どうすれば。。。
----------------------------------------------------------------
○構造体の場合:
vectorがstd::vectorではなく、自分で作った構造体の場合は、
Data *data = (Data *)vector;
data->hoge;
の要領で、できました。
よろしくお願いします。
0248デフォルトの名無しさん
2007/06/30(土) 18:53:01たぶんスレッドに引数渡してるところがおかしい。
0249デフォルトの名無しさん
2007/06/30(土) 18:54:17・C言語の形式のキャストではなく、C++のキャストを使ったほうがいい。
・コール元からThread()に渡したstd::vector<std::string>オブジェクトの寿命は大丈夫?
・vec[0]を見たいなら、std::cout << vec[0]; で良いんじゃない?
0250デフォルトの名無しさん
2007/06/30(土) 19:08:19複数渡したいとき、構造体か配列などなどとあったので。。。
正直よくわからないです。すみません。
>>249
・C++のキャスト検索してみます。
・std::vector<std::string>オブジェクトの寿命ですか、
良く、無いものを参照して、プログラム止まります。
同じ症状なので、これかもしれません!
・vec[0]で、大丈夫ですか。了解しました。
ありがとうございました。
0251デフォルトの名無しさん
2007/06/30(土) 19:54:57>>249が指摘してるが、多分スタック上に確保したvectorのアドレスそのまま
渡してるだろ。それじゃクラッシュするのは当たり前だ。
0252デフォルトの名無しさん
2007/06/30(土) 19:56:01ごめん、まちがえた。
× vec[0]
○ (*vec)[0]
0253デフォルトの名無しさん
2007/06/30(土) 20:32:10std::vector<std::string> vec2;
vec2.push_back("hoge" );
void *vo=(void *)&vec2; //void*型、準備OK
//ここから、スレッドの関数で受け取ってから、std::vector<std::string>に戻す。
std::vector<std::string> *vec=(std::vector<std::string> *)vo;//キャストしました。
std::vector<std::string> vec3=*vec;
cout << vec3[0].c_str()<< endl;
cout << (*vec)[0].c_str()<< endl;//おまけ。std::vector<std::string>にしなくても、これでもいい。
これは、正常に動きました。キャストの仕方とか大丈夫みたいなので、
参照しようと思ったデータが無いみたいです。
>>251
>多分スタック上に確保したvectorのアドレスそのまま
>渡してるだろ。それじゃクラッシュするのは当たり前だ。
スタック?検索すると、
”処理中のデータや戻りアドレスなどを一時的に退避する場合に使うことが多い”
ってありました。
vectorは使用しなくなると自動的に、
開放しちゃうっていう、あれのことでよかったでしょうか?
0254デフォルトの名無しさん
2007/06/30(土) 20:38:100255247
2007/06/30(土) 20:39:16こういうの使いたいときは、どうすればよいでしょうか?
自動で開放してくれなくても、いいので
構造体使うのが、わかりやすいですか。
0256デフォルトの名無しさん
2007/06/30(土) 20:42:28> vectorは使用しなくなると自動的に、
> 開放しちゃうっていう、あれのことでよかったでしょうか?
ほんとに意味を分かって言ってる?
Javaなどのガベージコレクションと勘違いしないか?
ここで問題にしてるのは、C/C++で関数(またはブロック)内で宣言した変数は
その関数(またはブロック)を抜けると破棄されるということ。
いつの間にか勝手に消えるわけじゃない。
0257デフォルトの名無しさん
2007/06/30(土) 20:51:30考えるな感じるんだ。
0258デフォルトの名無しさん
2007/06/30(土) 20:57:05vector, map, pairなどはそれぞれ特徴が異なる。
データ同士の意味的なつながりとか、検索/更新の方法や性能など。
複雑なデータの管理をするときに、その使用方法にあったデータ構造を選択すればいい。
単にいくつかの型が異なるデータをひとまとめにして扱いたいだけなら
構造体でいい。
0259デフォルトの名無しさん
2007/06/30(土) 20:57:170261デフォルトの名無しさん
2007/07/01(日) 03:24:350263デフォルトの名無しさん
2007/07/01(日) 10:16:49memset(&dest, 0x00, sizeof(T));
};
っていうのを作ったんですがこれって危険でしょうか?
0264デフォルトの名無しさん
2007/07/01(日) 10:18:020265263
2007/07/01(日) 10:19:58一応実際のものは、POD以外渡すとコンパイルエラーになるようにboost::type_traitsとか作って
細工してあります
0266デフォルトの名無しさん
2007/07/01(日) 10:30:09クラスの中に、newなどで確保済みポインタがあったらどうするんだい?
0267デフォルトの名無しさん
2007/07/01(日) 10:36:33でもそんな事いったらmemsetも使えませんし
MSG msg;
msg.hwnd = 0;
msg.wParam = 0;
とか打っていくのが面倒なんで考えたので
初期化済みかどうかを判別する方法があればいいのですが
0268デフォルトの名無しさん
2007/07/01(日) 10:39:35MSG msg = {0}; // 全部 0 で初期化
msg = MSG(); // 全部 0 を代入
0269デフォルトの名無しさん
2007/07/01(日) 10:42:440270デフォルトの名無しさん
2007/07/01(日) 10:44:030271デフォルトの名無しさん
2007/07/01(日) 10:44:04釣りかと思った
0272デフォルトの名無しさん
2007/07/01(日) 10:56:34boostやpstadeと格闘している間、
構造体の初期化なんて殆ど使わなかったので忘れていました
ま、実質知らないのと同じですね^^^;
0273デフォルトの名無しさん
2007/07/01(日) 10:58:340274デフォルトの名無しさん
2007/07/01(日) 12:48:20デコンストラクタはないのなぜ?
0275デフォルトの名無しさん
2007/07/01(日) 12:53:36デコンストラクタって何ですか?デストラクタと同じものではないですか?
0276デフォルトの名無しさん
2007/07/01(日) 12:53:41De structor
0277デフォルトの名無しさん
2007/07/01(日) 12:53:49説明になっていないけど
0278デフォルトの名無しさん
2007/07/01(日) 12:53:51名前が違うだけやん
0279デフォルトの名無しさん
2007/07/01(日) 12:55:190280デフォルトの名無しさん
2007/07/01(日) 13:00:42int a[] = new int[10];
int *b = new int[10];
みたいに確保したときって
delete a;
delete a[];
delete b;
delete b[];
それぞれ解放の仕方で動作おかしくなりますか?
0281デフォルトの名無しさん
2007/07/01(日) 13:06:03delete a[]; アウト
delete b; アウト
delete b[]; アウト
0282デフォルトの名無しさん
2007/07/01(日) 13:08:16int a[] = new int[10];
0283デフォルトの名無しさん
2007/07/01(日) 13:08:56デコンストラクタは脱構築です
ただの破壊ではありません
ポストモダンなのです
たぶん
0284デフォルトの名無しさん
2007/07/01(日) 13:09:01「デコンストラクタ」はただの誤用だろ。
と思ったらこんなところにも。
http://msdn2.microsoft.com/ja-jp/library/sxbac7x8(vs.80).aspx
原文はちゃんと destructor なのにね。
http://msdn2.microsoft.com/en-us/library/sxbac7x8(vs.80).aspx
いちおう deconstruct という言葉も存在するらしい。
http://ja.wikipedia.org/wiki/%E8%84%B1%E6%A7%8B%E7%AF%89
0285デフォルトの名無しさん
2007/07/01(日) 13:09:570286デフォルトの名無しさん
2007/07/01(日) 13:38:11それは禁句だよ。
new[]してdeleteのような正しくないのに環境によっては動くものを
正しい方法だと思ってしまう可能性がある。
0287デフォルトの名無しさん
2007/07/01(日) 13:40:29T* v = new T[n];
delete [] v;
でおkなはず
0288デフォルトの名無しさん
2007/07/01(日) 13:46:310289デフォルトの名無しさん
2007/07/01(日) 13:48:110290デフォルトの名無しさん
2007/07/01(日) 13:49:43今回はそれ以前の話。コンパイルできないのがダメ。
0291デフォルトの名無しさん
2007/07/01(日) 13:50:450292デフォルトの名無しさん
2007/07/01(日) 14:00:49書く → ビルド → エラーの数が100を超え(ry → (´・ω・`) → 少しずつ直していく
→ コンパイラ通過 → \(^o^)/ →実行時エラー → /(^o^)\ナンテコッタイ
0293デフォルトの名無しさん
2007/07/01(日) 14:03:35は正常に動作する。
今回に限ってはメモリリークを起こさない。
ただ、b[1]〜b[9]のデストラクタが呼び出されないので、
プリミティブ型以外では動作保証ができない。
いかなる場合においても、new[]で確保したら、かならずdelete[]で解放すること。
だったっけ?
0294デフォルトの名無しさん
2007/07/01(日) 14:10:41たまにはscoped_arrayのことも思い出してあげてください……。
0295デフォルトの名無しさん
2007/07/01(日) 14:15:44いや違う。
未定義動作でFA。
0296デフォルトの名無しさん
2007/07/01(日) 14:29:41デストラクタがあったらメモリの開放に失敗して落ちる環境がほとんど。
0297デフォルトの名無しさん
2007/07/01(日) 14:33:54その後メモリ取ろうdeleteした近辺にnewなんかされると
悲惨なことになるぞw
0298デフォルトの名無しさん
2007/07/01(日) 14:35:24良くない
0299デフォルトの名無しさん
2007/07/01(日) 14:39:20PODの場合で
new[]で確保したのをdeleteでシメた場合に
実際に不具合があるような実装って
おおいの?
0300デフォルトの名無しさん
2007/07/01(日) 14:39:430301デフォルトの名無しさん
2007/07/01(日) 14:41:50でも
const char *bad_words[] = { "fxxk", "pxxsy", "axxl", "cxxt", ... };
みたいなのは配列が便利じゃね?
0302デフォルトの名無しさん
2007/07/01(日) 14:42:36すくないとか言ったら使いそうだから言わない。
0303デフォルトの名無しさん
2007/07/01(日) 14:43:38いや、実は見たこと無いから聞いてみたんだけど(ボソッ)
0304デフォルトの名無しさん
2007/07/01(日) 14:45:28将来デバッグモードで変なことするコンパイラが
出てくる可能性もなくはないと思う。
0305デフォルトの名無しさん
2007/07/01(日) 14:46:140306デフォルトの名無しさん
2007/07/01(日) 14:47:44落ちるとかバグるとかそういう環境は多かったりするのか?
という話なわけで。
0307デフォルトの名無しさん
2007/07/01(日) 14:48:13いや勿論そういう意味じゃなくて、
メモリが解放されなかったり
ヒープが壊れたり
無限ループに陥ったり
ハードディスクが初期化されたり
といった問題が生じるかどうか、という意味
0308デフォルトの名無しさん
2007/07/01(日) 14:51:56new[]で確保するのでなければ別に構わないと思う。
0309デフォルトの名無しさん
2007/07/01(日) 14:56:57そんな問題が生じたこともないし生じるようにも思わないが生じる可能性はある。
0310デフォルトの名無しさん
2007/07/01(日) 15:10:03何が問題なの?
0311デフォルトの名無しさん
2007/07/01(日) 15:12:320312デフォルトの名無しさん
2007/07/01(日) 15:12:34コンパイルエラー
0313デフォルトの名無しさん
2007/07/01(日) 15:13:580314デフォルトの名無しさん
2007/07/01(日) 15:15:370315デフォルトの名無しさん
2007/07/01(日) 15:21:46それで簡単なGUIアプリから作ってみたいのですがVisual C++とDelphiで迷っています。
DelphiだとPascalを勉強しなければいけないそうですが大変でしょうか?
C、C++が無駄になりそうで怖いですが。
C++を勉強してきた場合、Visual C++のほうがいいでしょうか?
0316デフォルトの名無しさん
2007/07/01(日) 15:21:520317デフォルトの名無しさん
2007/07/01(日) 15:23:32C/C++ 勉強したなら VC++ 使えば?
0318デフォルトの名無しさん
2007/07/01(日) 15:26:37C++/CLIを勉強する羽目に。
0319デフォルトの名無しさん
2007/07/01(日) 15:27:10どれくらいのレベルか知らないが、勉強のためVC++をススメておく
DelphiでもCやC++で勉強してきた基礎は無駄にならないと思うけどね
0320デフォルトの名無しさん
2007/07/01(日) 15:27:410321デフォルトの名無しさん
2007/07/01(日) 15:29:130322デフォルトの名無しさん
2007/07/01(日) 15:29:480323デフォルトの名無しさん
2007/07/01(日) 15:32:27for( int i = 0; i < 10; ++i )
a[i] = new int;
for( int i = 0; i < 10; ++i )
delete a[i];
delete [] a;
0324デフォルトの名無しさん
2007/07/01(日) 15:33:57delete[] a;
0325デフォルトの名無しさん
2007/07/01(日) 15:35:190326デフォルトの名無しさん
2007/07/01(日) 15:40:560327デフォルトの名無しさん
2007/07/01(日) 15:52:250328デフォルトの名無しさん
2007/07/01(日) 15:53:190329デフォルトの名無しさん
2007/07/01(日) 17:10:26std::cout << a;のようにした時にメンバであるxの値を出力するように変換関数を定義したいんですが
どうすれば良いんでしょう?
operator std::string();とやってみましたが変換できないようです
0330デフォルトの名無しさん
2007/07/01(日) 17:16:120331デフォルトの名無しさん
2007/07/01(日) 17:16:22os << a.x;
return a;
}
A内で上の関数をfriend宣言しておく
0332デフォルトの名無しさん
2007/07/01(日) 17:17:310333デフォルトの名無しさん
2007/07/01(日) 17:20:35cout << static_cast<std::string>(a);
とやるか、
std::ostream& operator<<(std::ostream& os, const A& a) { return os << a.x; }
でも定義汁
0334デフォルトの名無しさん
2007/07/01(日) 17:28:57ttp://www.higlab.k.dendai.ac.jp/~numata/index.php?C%2B%2B%A5%E1%A5%E2#w5403b76
なるほどオーバーロードとfriendの複合技ですか、さらにostreamを戻す事で連結も可能と…
かなり使えそうな方法ですね、助言ありがとうございました!
0335デフォルトの名無しさん
2007/07/01(日) 17:40:54ここまで必要になるか分からないけど、
class A {
public:
virtual void print(std::ostream &os);
};
std::ostream& operator<<(std::ostream& os, const A& a) { a.print(os); return os; }
とやった方が、もしかしたらいいかもしれない。
こうすると継承クラスでprintを再定義できる。
0336334
2007/07/01(日) 18:02:45なるほど継承ですか、実行時の多態性については意識し取りませんでした
確かにこの振る舞いをもたせたいのがAだけに限るわけではないですしね
とりあえず参考にしてNVI使ってこうやってみました
// 構造体A周辺の定義
struct Base {
public: void print(std::ostream& os) const { _print(os); }
private: virtual void _print(std::ostream& os) const =0;
};
struct A : public Base {
private: void _print (std::ostream& os) const { os << x; }
public: int x;
};
std::ostream& operator<<(std::ostream& os, const Base & base)
{ base.print(os); return os; }
// 使用例
#include <iostream>
int main() {
A a;
a.x = 1;
std::cout << a;
}
…しかし鶏を捌くのに牛刀をなんとやらですね
実際に使うとなればここまでする必要も出てきそうな気もせんでも無いですが
0337デフォルトの名無しさん
2007/07/01(日) 18:27:370338デフォルトの名無しさん
2007/07/01(日) 18:29:470339デフォルトの名無しさん
2007/07/01(日) 18:35:35ってなんですか?
0340デフォルトの名無しさん
2007/07/01(日) 18:40:110341デフォルトの名無しさん
2007/07/01(日) 18:49:35struct Hoge {
void hage(T1 arg1, T2 arg2) {_hage(arg1, arg2); }
protected:
virtual void _hage(T1 arg1, T2 arg2) = 0;
};
下位クラスには_hageを継承してもらう。
なぜこんなことをするのか)
公開仮想インターインターフェイスが果たす目的は以下の二つ(と言われてる^^)
1. 使う人に使い方(インターフェイス)を提供する
2. 派生クラスに「こういうふうにメソッドを継承して下さい」とカスタマイズの規約を提供している
たとえば、NVIを使わず下位クラスがhageをそのまま継承してしまうと
Hoge#_hageのインターフェイスを変更したときに下位クラスすべてのメソッドを書き直す必要があるんだけど、
もしNVIを採用していればそういうことにはならない。
逆にインターフェイスを変更せず、実装メソッドの方だけを変更することもできる。
>>336の場合、インターフェイスが変更される可能性は全く無くて、無駄に複雑にしてるだけだと思う。
0342デフォルトの名無しさん
2007/07/01(日) 18:52:310343デフォルトの名無しさん
2007/07/01(日) 18:54:580344デフォルトの名無しさん
2007/07/01(日) 19:11:16・publicなデストラクタとコピーコンストラクタと代入演算子を持ち
・デストラクタを含め仮想関数を持たなくて
・具象クラスであり抽象クラスでない
・スタック上や他のクラスのメンバとしてインスタンス化される
とまぁおおよそ組み込み型のように振舞えるものでこういうのは継承じゃなくて委譲を使うべきらしいけど、
実際のところはそれが妥当なのか場合によるからよくわかんねけど
俺は複雑な構造体を継承してえらい目にあったので「あまり宜しくない」と思うようになった
ちなみに出展はmore effective C++あたりだったと思う
0345341
2007/07/01(日) 19:23:42Value classなんて初めて知った。
全部が全部ってわけじゃないけど、ほとんどは>>344のいうとおりだろうね。
ただ、サンプルプログラムでそういうことを考えちゃうと
バーチャルなデストラクタや、privateなoperator =を書く必要が出てきて
全体的に焦点がぼやけてしまいまふ。
>>341ではとりあえずそういうことは無視させてもらいますた^^
0346デフォルトの名無しさん
2007/07/01(日) 19:29:32そんな区別意味無いだろ。
public なデストラクタが virtual じゃないクラスを継承したのが間違いだったんじゃないの?
value class って用語も検索結果が日本語ページ多すぎで胡散臭いし。
0347デフォルトの名無しさん
2007/07/01(日) 21:00:20ググったらこんなページを見付けたが、こういう話だろう。
http://www.ogis-ri.co.jp/otc/hiroba/technical/CppDesignNote/
0348デフォルトの名無しさん
2007/07/01(日) 21:09:43他言語ならsealedクラスになってるタイプのクラス
0349デフォルトの名無しさん
2007/07/01(日) 21:29:11良いサンプルってやっぱ難しいんだね
0350デフォルトの名無しさん
2007/07/01(日) 21:33:35無意味にしか見えんからのう
0351デフォルトの名無しさん
2007/07/01(日) 22:17:490352デフォルトの名無しさん
2007/07/01(日) 22:18:380353デフォルトの名無しさん
2007/07/01(日) 22:22:03Exceptional C++ Style―40のクイズ形式によるプログラム問題と解法=スタイル編 Exceptional C++ Style―40のクイズ形式によるプログラム問題と解法=スタイル編
これって何が違うんでしたっけ?
0354デフォルトの名無しさん
2007/07/02(月) 00:12:21ビッグエンディアンで
char型 d[10]のd[5]〜d[8]の各要素に格納したいと思っております。
numを表現する4バイトそれぞれの値を取得するためには
どうすればいいのでしょうか?
char *p = (char *)num; // numのポインタを取得
d[5] = p; // 1Byte分の値を取得
p++; // charのポインタなので1Byte分ポインタを変更
とやることを考えたのですが、pの値がおかしな値になります。
どのようにコーディングするとよいでしょうか?
0355デフォルトの名無しさん
2007/07/02(月) 00:14:59の間違いだと思うのだがどうよ
0356デフォルトの名無しさん
2007/07/02(月) 00:17:24スレッドに複数の引数を渡したい者です。
//スレッド関数
void Thread_f(void* StructData){
//何にもしないスレッド StructDataは、下で出てくるData構造体
}
メインのほうで、スレッド作成
Data data; //Dataっていう複数の引数を渡すための構造体
for(int i=0;i<n;i++){
data=datalist[i];//datalistは、Data構造体のポインタ配列 代入してから渡してます
handle[i] =(HANDLE) _beginthread(CameraThread,0, (void *)&data);
Sleep(3000); i++;
//スレッド立ち上げてる間に、全部スレッド側で全部datalist[n]になってしまうので。
//ちょっとSleepしました。すごいダメな処理です。すみません。
}
n=1のときは、エラーでないです。
nが2より大きいと、動くことは動きますが、×(ウィンドウの閉じるボタン)
で閉じると、
-ElnvalidPointerクラスの例外を生成しました。
-'無効なポインタ操作'
-プロセスは停止しています。・・・・
というエラーがでます。
”同じポインタを 2 回破棄したり,すでに破棄したポインタを参照したりすると出る”
とネットの掲示板でありました。
同じ関数のスレッドに、それぞれ違うdataを渡したいときは、スレッド関数に引数渡さないほうがいいですか?
248さんが言ってたのは、このことかなぁと思って、今は、引数渡さない方法でやってますが。
上記のプログラムに、手を加えてエラーで無い方法ないでしょうか。
0357デフォルトの名無しさん
2007/07/02(月) 00:21:55Thread_fに、訂正お願いします。
0358デフォルトの名無しさん
2007/07/02(月) 00:23:23だから、スタック上のオブジェクトのポインタをスレッド関数に渡すなと。
呼び出し側のコンテキストが平然と進行しつづけてスコープ抜けた瞬間に
無効になっちゃうだろが。
malloc()やnewでフリーストア上にオブジェクトを確保して、その
ポインタを渡すんだな。無論渡されたスレッド側で不要になったら
破棄すること。
本当はC++使ってるんなら、スレッドをラップするクラスを作るのが良いが
それはまあいい。
0359354
2007/07/02(月) 00:23:58ご指摘どおりです。
char *p = (char *)# // numのポインタを取得
d[5] = *p; // 1Byte分の値を取得
p++; // charのポインタなので1Byte分ポインタを変更
d[6] = *p;
p++;
・・・
としているのですが、値が正常にとれません・・・
0360デフォルトの名無しさん
2007/07/02(月) 00:32:53レスありがとうございます。
new演算子は、Dataをでしょうか?
Data *datalist = new Data[N];
これで処理してます。
0361デフォルトの名無しさん
2007/07/02(月) 00:34:23それなら、そのdetalistをそのまんま(void*にキャストして)渡せばいい
0362デフォルトの名無しさん
2007/07/02(月) 00:42:56data=datalist[i];
これを、なくして
handle[i] =(HANDLE) _beginthread(CameraThread,0, (void *)&datalist[i]);
ということですよね。
これでも、同じ症状です。
dataにコピーしてから、渡すとエラーが消えるかも、
と思って入れたおまじないの処理なんです。
0363デフォルトの名無しさん
2007/07/02(月) 00:46:27ちょっとまて
意味わかんなくなってきた
スレッドをN個起動してて、i番目のスレッドにdatalist[i]を渡したいのか
だがそれだと、datalist[]の破棄はどうする?
いつどこで誰がやってるんだ?
0364デフォルトの名無しさん
2007/07/02(月) 00:48:210365デフォルトの名無しさん
2007/07/02(月) 00:55:11スレッドが終わるまで待ちます。
for (int i=n; i>0; i--){
while(WaitForMultipleObjects(n, (CONST HANDLE *)handle,TRUE, 500) == WAIT_TIMEOUT){//タイムアウトなのでループ}
}
delete data;
0366デフォルトの名無しさん
2007/07/02(月) 00:57:35datalist じゃないのか? delete [] じゃないのか?
0367デフォルトの名無しさん
2007/07/02(月) 01:03:11その i でまわしてる for ループは何のつもり?
WaitForMultipleObjects() で全部待つんだろ?
あと、戻り値はちゃんとチェックしろよ。
(CONST HANDLE *) とかいうキャストも要らんだろ?
っていうか前のコードから要らないキャスト多すぎだ。
0368デフォルトの名無しさん
2007/07/02(月) 01:04:02delete datalist;
です。
0369デフォルトの名無しさん
2007/07/02(月) 01:04:48よくわからんが、メモリバリアを_beginthreadex()の前後あたりに
挿入すると状況が改善されるかも
0370デフォルトの名無しさん
2007/07/02(月) 01:05:24それじゃダメだ。 delete [] 使え。理由は聞かずにちょっと前のログを見ろ。
0371デフォルトの名無しさん
2007/07/02(月) 01:27:44スレッドが終わったっていう合図以外は、ここでループしてます。
タイムアウト以外というコメント不正確でした。
forで、n回繰り返すと、n個のスレッドが終了するのを待ったことになります。
delete datalist [];
deleteの使い方理解していないので、
ちょっと時間掛かるかもです。構文エラーとか出てきます。
0372デフォルトの名無しさん
2007/07/02(月) 01:29:110373デフォルトの名無しさん
2007/07/02(月) 01:29:40ああ、反対でした。
同じエラー出てきました。
0374デフォルトの名無しさん
2007/07/02(月) 01:36:17> forで、n回繰り返すと、n個のスレッドが終了するのを待ったことになります。
WaitForMultipleObjects() の第3引数は BOOL fWaitAll で TRUE の時は
その呼び出しで全部待つ。戻り値にはエラーもある。仕様をちゃんと見て使え。
0375デフォルトの名無しさん
2007/07/02(月) 01:43:53コンパイル通りました。
-ElnvalidPointerクラスの例外を生成しました。
-'無効なポインタ操作'
-プロセスは停止しています。・・・・
やっぱり、これが出てきてしまいます。。。
スレッド1個(n=1,N=1)にすると、大丈夫なんですよね。
あと、>>356で、Sleepの次i++が入ってまずが
頭がおかしくなって、入力してしまったのかもしれません。
すみません。
0376デフォルトの名無しさん
2007/07/02(月) 01:47:270377デフォルトの名無しさん
2007/07/02(月) 01:51:18メダパニとラリホーかけられてちゃ
どんな間違いやってても不思議じゃないな
0378デフォルトの名無しさん
2007/07/02(月) 02:02:34ありがとうございます。
WaitForMultipleObjectsで、苦労したんですが
なんか思い出だしてきました。
結局、スレッドの方では、なんにもしてないので、
newで渡すのがだめな気がしてきました。
0379378
2007/07/02(月) 02:14:02ありがとうございました。
0380デフォルトの名無しさん
2007/07/02(月) 09:25:30間取ってC++Builder使えばいいんじゃね?
0381デフォルトの名無しさん
2007/07/02(月) 09:42:53A内でfriend宣言しておかないとA.aのように参照した場合
もしaがprivateやprotectedだった場合エラーになる。
0382デフォルトの名無しさん
2007/07/02(月) 09:55:23この場合はstructで全部publicだから要らんと言われてただけでしょ
0383378
2007/07/02(月) 10:18:40シンプルなプログラムを別に作って、
new演算子でも大丈夫なこと確認しました。
それで、本物の方のプログラムの方をGUIの部品とか
1個ずつはずしていって、シンプルなプログラムに近づけていったところ。。。
(6時間後・・・)
void __fastcall TForm1::Button17Click(TObject *Sender)
{
//なにもしないボタンです。これから実装します。
}
ボタン17を削除して、またボタン作ったら
なぜか閉じるボタンで、ポインタエラーがでなくなりました。
ということで、new演算子で渡しても大丈夫みたいです。
ありがとうございました。
0384デフォルトの名無しさん
2007/07/02(月) 13:07:16switch (val)
{
//コメント
//コメント
case 1:
〜〜
break;
}
こんな感じでcaseの上に複数コメントがあるブロックが多いと、
デバッグの時のブレークポイントや、実行時の位置が
おかしくなることがあるみたいなんですが、どこかに詳細な
報告はありませんか?
検証が甘いですが、VC2005でも同じ現象が起こるみたいです。
0385デフォルトの名無しさん
2007/07/02(月) 14:12:080386デフォルトの名無しさん
2007/07/03(火) 17:39:39Foo::Foo() : m1(), m2(), m3() {}
このようなFooクラスのコンストラクタにおいてm2のコンストラクタが例外を投げたとき、
既に初期化が完了していたm1のデストラクタが呼ばれることは「C++の規格で保障」されているのでしょうか?
VC++2005で確認した限りではその通りの動作をするようですが…
0387デフォルトの名無しさん
2007/07/03(火) 17:44:42Foo::Foo() try : m1(), m2(), m3() { } catch(...) { }
みたいにしてキャッチすることもできるけど、
例外は必ず再送出される。
0388386
2007/07/03(火) 17:51:16ありがとうございます。
> Foo::Foo() try : m1(), m2(), m3() { } catch(...) { }
そういえば function-try block なんて見たのは久々^^;
0389デフォルトの名無しさん
2007/07/03(火) 18:04:46中途半端にコンストラクトされた状態だと思うんだけど、
デストラクタは呼ばれないわけだよね?
メモリリークの原因にならないのかな?
0390デフォルトの名無しさん
2007/07/03(火) 18:07:50でおk
0391デフォルトの名無しさん
2007/07/03(火) 18:09:32ちゃんと自分で例外をキャッチして開放してくだちぃ。
それが嫌なら vector とかスマートポインタとか使ってデストラクタに任せてくだちぃ。
0392デフォルトの名無しさん
2007/07/03(火) 18:12:42catchしたら呼べばいいじゃん。
0393デフォルトの名無しさん
2007/07/03(火) 18:12:52deleteはNULL渡したら勝手に無視してくれなかったっけ?
0394デフォルトの名無しさん
2007/07/03(火) 18:13:120395デフォルトの名無しさん
2007/07/03(火) 18:13:59昔の VC++ あたりはしてくれなかった記憶がある。
0396デフォルトの名無しさん
2007/07/03(火) 18:20:11もしそうなら、そのときはその仕様がまだなかったんじゃないか
0397デフォルトの名無しさん
2007/07/03(火) 18:21:03なんてググると、DirectXあたりで
#define SAFE_DELETE(p) { if(p) { delete (p); (p)=NULL; } }
こんなマクロが出てきたりするからてっきり勘違いしていた。
0398デフォルトの名無しさん
2007/07/03(火) 18:24:56VC6 あたりまでそうだったと思う。
この仕様があるかどうか微妙な時代かもしれん。
0399デフォルトの名無しさん
2007/07/03(火) 21:20:22解放後にアクセスしようとすると素直に落ちてくれる
0400デフォルトの名無しさん
2007/07/03(火) 21:28:18いきなり挫折しました。かれこれ4時間ほど睨めっこしてるのですが
どこに間違いがあるのか検討つきません。ご教示お願いします。
環境はコンパイラはBoland C++ 5.5 + BolandDeveloper 1.221
WinアプリケーションでDXライブラリです。(多分環境は関係無いんでしょうが)
メッセージはint型はchar *型に変換出来ないと出ます。
一部抜粋
FILE *fp;
char *file_name="map1.txt",buf[99];
char* p;
char* q;
if((fp=fopen(file_name,"r"))==NULL)return-1;
このぎょうです。→ while((fgets(buf,sizeof(buf),fp))!=EOF){
j=0;
p=strtok(buf,",");
map_data[i][j]=atoi(p);
j++;
while(p!=NULL){
p=strtok(NULL,",");
if(p!=NULL){
map_data[i][j]=atoi(p);
j++;
}
}
i++;
}
fclose(fp);
0401デフォルトの名無しさん
2007/07/03(火) 21:32:580402デフォルトの名無しさん
2007/07/03(火) 21:39:19ありがとうございます。
・・・orz
混乱していたから別ファイルで作ったのを
コピペ改変していました。
なんでこんなミスばっかりやらかすんだろな・・。俺は。
0403デフォルトの名無しさん
2007/07/03(火) 21:39:500404デフォルトの名無しさん
2007/07/03(火) 22:38:48このポインタって確保したメモリのどこを指しているのですか?
このポインタ指しているところの規定ってあるのですか?あればどんな規定?
0405デフォルトの名無しさん
2007/07/03(火) 22:42:38最初(0アドレス)を指してる。
0406デフォルトの名無しさん
2007/07/03(火) 22:47:070407デフォルトの名無しさん
2007/07/03(火) 22:49:05p[0] 〜 p[size - 1] のメモリをアクセスできることが保証され、
p + size が無効なアドレスにならないことが保証されている。
0408デフォルトの名無しさん
2007/07/03(火) 23:27:47char *s = "hoge"; は
char s[] = "hoge"; と違って、中身を書き換えたりしたらダメなんですよね。じゃあ、最初から
const char *s = "hoge"; としておいた方が、間違って書き換えちゃったりしたらコンパイル時にエラーになって、
深夜のデバッグ作業突入を防げるような気がするんですが、これはいい考えですか?
それとも、気をつければいいだけですか?
とてもいい考えアル
と、effective c++あたりに書いてあった希ガス
0410デフォルトの名無しさん
2007/07/03(火) 23:37:22char *s = "hoge";
char s2[] = "hage";
s = s2;
s[1] = 'i';
constをつけるとこれもできなくなる。やらないと思うけど。
0411デフォルトの名無しさん
2007/07/03(火) 23:43:50にすれば
s++
とかも防げるぜ!
以下修飾子の位置について終わりのない議論が始まります
0412デフォルトの名無しさん
2007/07/03(火) 23:45:27少なくとも自分は条件反射的にconstつけてる
0413デフォルトの名無しさん
2007/07/03(火) 23:46:110414デフォルトの名無しさん
2007/07/04(水) 01:05:17wstring a[2];
a[0] = L"あああああ";
a[1] = L"いいいいい";
wcout << a[0] << endl;
wcout << a[1] << endl;
ってやっても何も出力されません。
なぜでしょうか?教えてください。
ググっても良い資料が見つからない、、、。
0415デフォルトの名無しさん
2007/07/04(水) 01:06:39”何も”ではなく空白行が2行出力されます。
0416デフォルトの名無しさん
2007/07/04(水) 01:07:36でググるんだ!
0417デフォルトの名無しさん
2007/07/04(水) 01:23:300418デフォルトの名無しさん
2007/07/04(水) 01:25:590419デフォルトの名無しさん
2007/07/04(水) 01:53:39たとえば、
class hoge {
static int num[100]; //この配列を0-99まで初期化したい
}
hoge::int num[100];
といったとき、どう書くのが一番スマートですか?
(num[100]={0, 1, 2...} とやるのはなしとして)
コンストラクタ内で初期化しようとすると
インスタンスを生成するたびに何度も同じ処理が
繰り返されることになるので無駄だし……
初期化処理が既に終わっているかどうかを示す
フラグを追加するとかでしょうか。
0420デフォルトの名無しさん
2007/07/04(水) 02:04:49friend しなくても通ったけど、これって規格的におkなの?
#include <iostream>
class hoge {
private:
static const int SIZE = 10;
private:
struct static_init {
static_init() {
for(int i = 0; i < SIZE; ++i) {
num[i] = i;
}
}
};
public:
static void show() {
for(int i = 0; i < SIZE; ++i) {
std::cout << num[i] << std::endl;
}
}
private:
static int num[SIZE];
static static_init static_init_;
};
int hoge::num[hoge::SIZE];
hoge::static_init hoge::static_init_;
int main() {
hoge::show();
}
0421デフォルトの名無しさん
2007/07/04(水) 02:17:42class hoge {
static int num[100];
};
int hoge::num[100];
static int initialize() {
for (....) {
...
}
}
static int initializer = initialize();
ファイルスコープのstaticが嫌いならnamespace{}でも。
0422デフォルトの名無しさん
2007/07/04(水) 02:24:58個人的には戻り値 int が必要になるのが気持ち悪い。
0423デフォルトの名無しさん
2007/07/04(水) 02:36:10うわー、その手がありましたか。
絶対忘れないように今すぐそれ使って何か書いてきます。
ありがとうございました。
0424デフォルトの名無しさん
2007/07/04(水) 02:56:23{
public:
CStaticInt(void)
{
for( int i = 0; i < 100; i++ )
a[i] = 0;
}
~CStaticInt(void){}
static CStaticInt* GetInst( void ) {
static CStaticInt obj;
return &obj;
}
int a[100];
};
こういうのもどう?
んで、CStaticInt::GetInst()->a[0]でアクセスする
マクロ化すれば使用に耐えられなくも無い…かもしれん('A`)
0425デフォルトの名無しさん
2007/07/04(水) 12:45:31if(strcmp(str," ")==0)
printf("空白文字");
これで入力された文字が空白かどうか調べようとすると
strcmpが0とならずprintfが実行されません。
これってどこがダメなのでしょうか?
0426デフォルトの名無しさん
2007/07/04(水) 12:47:49入力が半角空白1文字じゃないんだろう。
else で puts(str) してみれば?
0427デフォルトの名無しさん
2007/07/04(水) 13:02:37う〜ん、なんか動かしてみると
scanfが空白文字を読み込んでないみたいな動作をするというか、
半角空白を入力すると入力が終了せず延々と入力を促すようになるのです。
だからif文の後もelse文も実行されない感じでしょうか。
0428デフォルトの名無しさん
2007/07/04(水) 13:11:210429デフォルトの名無しさん
2007/07/04(水) 13:16:38そうなのですかorz
では文字列を入力するという処理で空白文字が入力されたか
というのを調べるには↓みたいにするしかないですか?
fgets(str,N-1,stdin);
if(str[0]==' ')
printf("空白文字");
0430デフォルトの名無しさん
2007/07/04(水) 13:20:540431デフォルトの名無しさん
2007/07/04(水) 13:42:00どういう仕様にしたいのかが今ひとつ分からんから何とも言えんなあ。
" hoge " とか "hoge hoge hoge" とか入力された場合どうしたいのかな?
0432デフォルトの名無しさん
2007/07/04(水) 14:08:13char str[N][N];
int i;
for(i=0;i<MAX;i++){
printf("文字列入力:");
fgets(str[i],N-1,stdin);
if(str[0]==' ') break;
}
こんな感じで空白文字が入力されたら入力を打ち切る仕様にしたいのです。
だから"hoge hoge hoge"の場合はそのまま文字列として格納です。
>>430
紛らわしいこと書いてすみません、仕様は上記のような感じでした。
0433デフォルトの名無しさん
2007/07/04(水) 14:10:00でした。書き間違い。
0434デフォルトの名無しさん
2007/07/04(水) 14:12:14" hoge " はどうなの?
0435デフォルトの名無しさん
2007/07/04(水) 15:15:03それは考慮してなかった…。
コマンドラインでの入力が「半角スペース+Enter」の場合のみ
入力を打ち切るという仕様だと思います。
0436デフォルトの名無しさん
2007/07/04(水) 15:19:33あと、" hoge " と入力された時、
最初と最後の空白をどうするのかという問題もある。
0437デフォルトの名無しさん
2007/07/04(水) 17:09:55cin >> buf;
ってすると UNICODE 版でコンパイルするとエラーになるのですが、
cin の TCHAR バージョンってないのでしょうか?
0438デフォルトの名無しさん
2007/07/04(水) 17:13:46#ifdef UNICODE_
wistream& tcin = wcin;
#else
istream& tcin = cin;
#endif
0439デフォルトの名無しさん
2007/07/04(水) 18:37:17すいません
>>407の
>p + size が無効なアドレスにならないことが保証されている。
これ意味の解らないのですが、p + sizeのアドレスって、
確保されたメモリの次アドレス(確保外)が無効なアドレスにならないてことですよね。
なぜ、確保外の次のアドレスを無効なアドレスにならないことを保証しなければならないのですか?
0440デフォルトの名無しさん
2007/07/04(水) 18:46:510441デフォルトの名無しさん
2007/07/04(水) 18:48:26誤:これ意味の解らないのですが、
正:これの理由が解らないのですが、
0442デフォルトの名無しさん
2007/07/04(水) 18:55:36有難うございました。
つまり、これに使うためにってことですね。
for( char* ptr = p; p != ptr; ptr++){}
>>407 さんと >>440さんのおかげで少し賢くこうなりました、ぺこり
0443デフォルトの名無しさん
2007/07/04(水) 19:15:40C++ やってりゃ分かると思うけど、
algorithm でやってるあーいう処理ね。
0444デフォルトの名無しさん
2007/07/04(水) 20:59:340445デフォルトの名無しさん
2007/07/04(水) 21:01:14#include <stdio.h>
#include <stdlib.h>
void fill(int *begin, int *end, int first, int step) {
int *p;
int n = first;
for(p = begin; p != end; p++, n += step) {
*p = n;
}
}
int sum(int *begin, int *end) {
int *p;
int n = 0;
for(p = begin; p != end; p++) {
n += *p;
}
return n;
}
#define SIZE 5
int main() {
int *p = malloc(sizeof (int) * SIZE);
if(p == NULL) { return EXIT_FAILURE; }
fill(p, p + SIZE, 0, 1);
printf("%d\n", sum(p, p + SIZE));
free(p);
}
0446デフォルトの名無しさん
2007/07/04(水) 21:05:50標準出力させたいんですが、全角の1文字目と半角を区別することができません。
string str = "あイウ()";
for (int i = 0;i<=100;i++)
{
printf("%c",str[i]);
}
こうすると半角は正しく出力されますが、半角が出ません。
どうしたらいいですか?
0447デフォルトの名無しさん
2007/07/04(水) 21:12:41色々方法はある。
_mbclenを使うとか、wstringやUNICODEにするとか。
0448デフォルトの名無しさん
2007/07/04(水) 21:26:22どっちなんだよ?
0449デフォルトの名無しさん
2007/07/04(水) 21:32:50有難うございます、あす、これとmallocの知識を引っさげて学校で自慢してきます
0450デフォルトの名無しさん
2007/07/04(水) 21:33:27他にこのスレ見てるやつもいるかもなw
0451445
2007/07/04(水) 21:34:47なるほど。書いてもらったやつで調べてみたら
できそうですね。ありがとうございます。
あと少し教えてください。
「_mbclen」のアンダーバーは何を意味しているんですか?
それとアンマネージドというのは.NETの機能を
使わなければいいんですよね?
MFC、ATL、SDK、WINDOWS APIとかその辺の区別が全く理解できなくて・・・。
0452デフォルトの名無しさん
2007/07/04(水) 21:35:45すいません。「全角が出ません」の間違いです。
0453デフォルトの名無しさん
2007/07/04(水) 21:44:47処理系オリジナルのものと言う証。
下線で始まる名前は、処理系のために予約されている。
0454デフォルトの名無しさん
2007/07/04(水) 21:59:18main(){ int iv; iv=int(3.14); }
この「int()」は何ですか?キャスト演算子ですよね?それとも値生成演算子?
また、
class T { int miv; public: T(int iv=0):miv(iv){} };
main(){ T oa; oa=T(2); }
このT(2)は、変換コンストラクタの呼び出しですよね?キャストとは呼ばない?
さらに、main()を次のように書き換えると、
main(){ T oa; oa=static_cast<T>(2); }
このstatic_cast<T>(2)はキャストだけど、実はT(2)と同じですよね。
じゃあ、T(2)もやはりキャストなのでしょうか?コンストラクタの呼び出しとは言わない?
ネットやいろんな本を見ても、このあたり、はっきり書いてないのです。
0455デフォルトの名無しさん
2007/07/04(水) 22:00:47わかりました。ありがとうございました。
0456デフォルトの名無しさん
2007/07/04(水) 22:06:07>この「int()」は何ですか?キャスト演算子ですよね?それとも値生成演算子?
int のコンストラクタの呼び出しによるテンポラリオブジェクトの作成。
>このT(2)は、変換コンストラクタの呼び出しですよね?キャストとは呼ばない?
T のコンストラクタの呼び出しによるテンポラリオブジェクトの作成。
>このstatic_cast<T>(2)はキャストだけど、実はT(2)と同じですよね。
多分同じ。
0457454
2007/07/04(水) 22:20:46intのようなC言語からある型の場合も、コンストラクタ、オブジェクトという概念で
考えるのですかぁ。C++では、intなどの型もクラスのような感じ?
C++本やネットでは、int()は(C風の)キャストだという記述が多いですが、
「コンストラクタ呼び出しによるテンポラリオブジェクトの作成」は、
別な言い方をすれば「キャスト」と同じこと、という理解で良いのでしょうか?
static_cast<T>(2)はT(2)と規格上同じだし、(T)2、と書くことも出来るから考えると。
0458デフォルトの名無しさん
2007/07/04(水) 22:23:22引数が 1 つの場合は同じようになるだけで。
0459デフォルトの名無しさん
2007/07/04(水) 22:27:09この記法とキャストは同等だと書いてありますね。
0460454
2007/07/04(水) 22:40:00引数1つだとキャストと同じ表記だけどキャストとは別もののコンストラクタ呼び出し、
というのは、納得です。
じゃあ、例えばintの場合、Cでは「 (int)3.14」はキャストですよね?
C++では、「(int)3.14」はコンストラクタ呼び出しであって、キャストではないということ?
それとも、「(int)3.14」はキャストだけど「int(3.14)」はコンストラクタ呼び出し?
と、ここで>>459さんもコメントどうもです。
とすると、意味合いとしてはキャストと、このコンストラクタ呼び出しは同じってこと?
それとも、記法としては同じであって、でも意味合いとしては別もの、ということ?
0461デフォルトの名無しさん
2007/07/04(水) 22:46:330462デフォルトの名無しさん
2007/07/04(水) 22:47:33char *s = "hoge";
は、書き換えたりしない(書き換えられないとは違う)。
同じ文字列リテラル(ダブルクォーテーションで括った文字列)は、
コンパイラに特別指定しない限り同じ領域を指すポインタである。
深夜までデバッグしたくなければ書き換えるのはやめれ。
従って、("hoge"[2] == 'g')
は、真になる。参照する方はやりたい放題。
関数内での
char s[] = "hoge";
はありえないと思うのだが、検証した?
char s[]というのはポインタではなく、要素数を省略した配列なので、
まず、要素数が決まる `= { ... }' という構文が必要。
そして、この構文は静的変数(グローバル変数か、スタティック変数)にだけ許される。
例えば、static char s[] = { 'h', 'o', 'g', 'e', '\0' };
これなら別の値に自由に変更可。
例外として、引数がある
void hogege(char hoge[]);
これは
void hogege(char *hoge);
と全く同義なので自由に書き換えられる。
もちろん、呼び出し元の関数と調和をはかるように。
0463454
2007/07/04(水) 22:51:48索引で見つけた「コンストラクタの表記」を引いてみると、
クラス型名(式)の表記によってコンストラクタを式中でも使えるようになった、
というようなことが書いてあり、さらには、この表記は、
キャストの表記と同じだ、とも書いてありました。
でも、コンストラクタの表記とキャストは同一だという説明はなく、
このあたりは、はっきりとは書かれていなかったです。
C++の本は、新しい4つのキャスト演算子については必ず説明がありますが、
オブジェクトの初期化とコピーコンストラクター以外の
コンストラクタの呼び出し(とテンポラリオブジェクトの作成)については、
ほとんど説明がないですねぇ。。
0464デフォルトの名無しさん
2007/07/04(水) 22:57:01http://www.jisc.go.jp/app/JPS/JPSO0020.html
C++ の規格番号は X3014 です。
0466デフォルトの名無しさん
2007/07/04(水) 23:17:00459ではあれだけで終わっているが、
実際のところ、5.2.3には続きがあって、括弧の中の式の並びが複数ある場合、
コンストラクタを呼び出して一時オブジェクトを作ると規定されている。
歴史的には、コンストラクタを呼んでクラスの一時オブジェクトを作る構文として
導入されたのが最初で、後にそれを一般化して全ての型に対して使えるようになった。
(C++の設計と進化に書いてあるとおり)
その際、組込型では型変換演算子と同じ効力を持たせたという次第。
また、1つしか引数を取らないコンストラクタは、そのクラス型への型変換を提供する。
だから454でのstatic_cast<T>(2)は結局コンストラクタ呼出として機能する。
(あと型変換演算子の話もしたいが省略)
C++は、型変換を即ち新しいオブジェクトが作り出されることと捉えているように思われる。
すると、コンストラクタ呼出と型変換の境界が非常に曖昧になっているも納得がいく。
0467デフォルトの名無しさん
2007/07/04(水) 23:24:01本当に細かい文法的な違いはあるね。
0468454
2007/07/04(水) 23:34:42ちょっと判ったような気になりました。ありがとう。
ついでにもう一つ。これから変換関数、変換演算子を勉強しようとしているところですが、
この2つ、同じものですよね?呼び方が違うだけで。
>>467
そーですね。単一名称(単純名称)でないとだめ、という説明はよく見ます。
typedefすれば大丈夫、ともよく書いてある。
0469454
2007/07/04(水) 23:49:26「変換関数」はたくさん出てきます。
「変換演算子」というのは該当無しで、
「型変換演算子」は、dynamic_cast, static_cast, reinterpret_cast, const_cast
のことを指すのですね。
ネットでググると、変換関数の意味で「変換演算子」を使っているページが
たくさんヒットするんですが、これらはみんな間違ってるのかな。
というか、JIS3014、おもしろい。絶対的な信頼があるから、
間違いを疑う必要もないしね。
0470デフォルトの名無しさん
2007/07/05(木) 00:18:30export とかほとんど対応してないし。
0471デフォルトの名無しさん
2007/07/05(木) 00:35:03初心者騙して楽しいか?
> 同じ文字列リテラル(ダブルクォーテーションで括った文字列)は、
> コンパイラに特別指定しない限り同じ領域を指すポインタである。
そんなことは決まってない。
> そして、この構文は静的変数(グローバル変数か、スタティック変数)にだけ許される。
自動変数でも配列要素数の省略は使える。
0472デフォルトの名無しさん
2007/07/05(木) 04:58:00Microsoft Visual C++ 2005 Express Editionにおいて、
C++のアプリケーションを作っています。
コンパイル後の.exeファイルのプロパティで
バージョン情報や会社名などが表示されるタブが出ません。
ソリューションエクスプローラ中にはAssemblyInfo.cppという、
AssemblyTitleAttributeなどが配置されたファイルが自動生成されています。
しかし、反映されません。(検索などではC#で作成され、csの場合のみ反映されるらしい)
対処法か代替案を持っていらっしゃる方はおりませんか?
0473デフォルトの名無しさん
2007/07/05(木) 05:13:07こっちで聞いた方がいいと思う
Visual Studio 2005スレ Part21
http://pc11.2ch.net/test/read.cgi/tech/1180692040/
0474デフォルトの名無しさん
2007/07/05(木) 09:03:52メールを送りたいのですが一般的な既存ライブラリは存在しているのでしょうか?
イメージしているのはWinsockに依存したライブラリですが
普通はそのままSMTPを喋るものなのでしょうか?
受信は必要なく、OB25Pも問題ありません。
0475デフォルトの名無しさん
2007/07/05(木) 09:38:14Windowsで一般的といえばMAPIだろうな
俺は使いたくないけどw
0476デフォルトの名無しさん
2007/07/05(木) 09:42:200477デフォルトの名無しさん
2007/07/05(木) 10:46:02そういえばそんなのもあったね。
0478デフォルトの名無しさん
2007/07/05(木) 11:05:27ttp://www.hi-ho.ne.jp/babaq/basp21.html
2007年6月29日更新
タイムリーすぎてワロス
まさか自演じゃないだろうな
0479デフォルトの名無しさん
2007/07/05(木) 11:31:25ちなみに過去にチャレンジしたこと
・C++/CLR
コントロールは豊富だが、OfficeとかVSにあるようなフローティングメニューが見つからないので中断
日本語の資料が少なくて困る
既存のリソース(DLLなど)と組み合わせるときに
DLLのほうの仕様を変えないとうまく動かないor非常にめんどくさいの2択になる
あと変な拡張構文がキモい
・MFC
デフォルトのコントロール数が貧弱だが、資料も多いし、
Win32APIをラッピングしてある程度のものが多くわかりやすい。
VS2005で作成するとManifestでうんぬんとうざいのでスタティックリンクできないプロジェクトだとだるい。
・C++Builder
GUIのデザインをするには最強だと思うが、本体が生きてるのか死んでるのかよくわからんのと
重い、謎のバグがいつまでも取れない、というのがネック。
未だに6を使ってる人が多い。
VCと一緒に入れるとデバッガが正常に動かない可能性がある?
・WTL
何がいいのかさっぱり
0480デフォルトの名無しさん
2007/07/05(木) 11:40:110481デフォルトの名無しさん
2007/07/05(木) 11:56:50SWINGとかAWT継承すれば?
C++じゃなくなるけど
0482デフォルトの名無しさん
2007/07/05(木) 12:21:140483デフォルトの名無しさん
2007/07/05(木) 12:22:060484デフォルトの名無しさん
2007/07/05(木) 12:36:44ユーザインターフェイスは C# で書く。
C# からアンマネージドなDLL呼び出せるし。
だめ?
0485デフォルトの名無しさん
2007/07/05(木) 12:43:300486デフォルトの名無しさん
2007/07/05(木) 12:52:35stringのfindは、またはの検索できませんか
たとえば"あい"または"大塚"または"愛"
とかです
0487デフォルトの名無しさん
2007/07/05(木) 12:53:34でいいんでしょうか
0488デフォルトの名無しさん
2007/07/05(木) 12:56:490489デフォルトの名無しさん
2007/07/05(木) 12:58:48str.find("あい") != string::npos ||
str.find("大塚") != string::npos ||
str.find("愛") != string::npos
正規表現ライブラリを使ったほうがいいかもね。
0490デフォルトの名無しさん
2007/07/05(木) 13:01:18ヒットする、またはヒットする、ってやるんですね
サンクス わかりました
0491デフォルトの名無しさん
2007/07/05(木) 13:02:370492デフォルトの名無しさん
2007/07/05(木) 13:07:19if ((pos = str.find("あい")) != string::npos ||
(pos = str.find("大塚")) != string::npos ||
(pos = str.find("愛")) != string::npos) {
// みつかった
} else {
// みつからへん
}
0493デフォルトの名無しさん
2007/07/05(木) 14:22:14これをやりたんです。
・キーの発行は手作業で。
・アプリ側ですること、ライセンスキーを認証するdllを作成。
こんなこと想像してます。解説しているページや
簡単に実現できるツールなどありませんか。
0495デフォルトの名無しさん
2007/07/05(木) 23:58:22>> コンパイラに特別指定しない限り同じ領域を指すポインタである。
>
>そんなことは決まってない。
そうでない処理系を挙げてくれ。
>
>> そして、この構文は静的変数(グローバル変数か、スタティック変数)にだけ許される。
>
>自動変数でも配列要素数の省略は使える。
どんな例か試しに書いてくれ。
0496デフォルトの名無しさん
2007/07/06(金) 00:04:06C89(ANSI-C)以前の人は、自動変数で
int hoge[]={1,2,3};式の初期化が出来ないとか言い張ることあるよね。
0497デフォルトの名無しさん
2007/07/06(金) 00:08:04Visual C++では、コンパイラオプション/GFを指定しないと
同一文字列リテラルが同じ領域を共有するようにならない。
(なお/O1や/O2などの最適化オプションを指定すると暗黙の内に/GFも指定されたことになる)
ローカル変数での配列でもchar s[] = "hoge";や
char s[] = {'h', 'o', 'g', 'e', '\0'};のように書くことは可能。
このように静的変数や大域変数と同じ構文。
少なくともANSI/ISO Cではできることになっているし、
PC用のコンパイラなら今時できないものを見つけるほうが難しい。
0498デフォルトの名無しさん
2007/07/06(金) 00:12:14===== 同じ文字列リテラルが違う領域を指す例 =====
gcc -c b.c
gcc a.c b.o
/*----- a.c -----*/
#include<stdio.h>
char *p_hello(void);
int main(void){
printf("%s %s\n", "hello", p_hello());
printf("%p %p\n", "hello", p_hello());
return 0;
}
/*----- b.c -----*/
char *p_hello(void){
return "hello";
}
----- 実行結果 -----
hello hello
00403000 00403020
===== 自動変数で配列要素数の省略 =====
#include<stdio.h>
int main(void){
int i, data[]={0,1,2,3,4,5,6,7,8,9};
for(i=0;i<sizeof(data)/sizeof(data[0]);i++)
printf("%d\n", data[i]);
return 0;
}
0499デフォルトの名無しさん
2007/07/06(金) 00:22:06わざわざ無知を晒しに出てこなくてもよかったのにね。
0500デフォルトの名無しさん
2007/07/06(金) 00:28:25495はいい勉強になったということでいいじゃないか。
0501デフォルトの名無しさん
2007/07/06(金) 00:38:17至極簡単だと思うけど…
0502474
2007/07/06(金) 01:01:18BASP21はタイムリーですね。自演ではないです。
調べてみたところSMTP-AUTHに対応してなさそうな感じでしたので
MAPIをもう少し調べてみようと思います。
ありがとうございました。
0503493
2007/07/06(金) 02:01:091.大量のライセンスキーのデータベースが入っていて、マッチング。
2.それとも、秘密の値を一つだけ持っていて、
数学的になにか計算して、(ハッシュなど)マッチング。
一番目ってキーの数が多かったら、大変ですよね。ぬー。
ということは、数学のなにかを使って、やるんでしょうか?
たとえば、ウィンドウズだと、どんな感じでしょうか。
0504デフォルトの名無しさん
2007/07/06(金) 02:25:490505デフォルトの名無しさん
2007/07/06(金) 02:45:47ブラックリストデータベースも利用、かなー。
MSのは、公開鍵認証とハッシュがどーの、という話があったけどねー
0506デフォルトの名無しさん
2007/07/06(金) 06:36:310507493
2007/07/06(金) 10:40:35たくさんの大量のライセンスキーを
用意して、ただマッチングがわかりやすいです。
オンライン認証もいいですね。
>MSのは、公開鍵認証とハッシュがどーの、という話があったけどねー
ハッシュ、公開鍵、秘密鍵、独自の計算方法、を使うんですか。
難しそうなので、うまいアルゴリズムは、徐々に考えていこうと思います。
興味があったので、勉強のために質問させていただきました。
ありがとうございました。
0508デフォルトの名無しさん
2007/07/06(金) 11:17:240509495
2007/07/06(金) 21:41:30わざわざお礼を言おうと思ったが、そんな非礼な人間に感謝の気持ちなどなくなった。
そうだよ。俺はANSI-C以前からC使いだった。
C++を黎明期から覚えて使い始めてからは、string系クラスが活躍してくれて
外的・静的配列以外に初期化子を使う必要もなかったからな。
君らが古いコードをメンテする憂き目に遭うことを祈ってるよ。
0510デフォルトの名無しさん
2007/07/06(金) 21:46:420511495
2007/07/06(金) 21:50:05文字列リテラルは同じポインタを参照するって意味で書いたんだぜ。
その辺は文脈嫁。
それから、C/C++の教本を読んでる暇があったら職を探せよ(w
0512495
2007/07/06(金) 21:53:19辞める→止める、やめる
適当にアラスカ。
0513デフォルトの名無しさん
2007/07/06(金) 21:56:33年甲斐もなく2chで火病かよ
一生やってろ
0514デフォルトの名無しさん
2007/07/06(金) 21:58:22int a[100] = { 0 };
なんて構文はなかったんだぜ。
就職先のコンパイラが古かったら、解けないバグに悩まされろよ。
0515495
2007/07/06(金) 21:59:34そのつもりだぜ?
0516デフォルトの名無しさん
2007/07/06(金) 22:00:17そっとしといてやれ。
0517デフォルトの名無しさん
2007/07/06(金) 22:01:08古いコンパイラでその構文が通らなければエラーになるだけなので
解けないバグも糞も無いんだが……
0518デフォルトの名無しさん
2007/07/06(金) 22:01:080519495
2007/07/06(金) 22:03:08火病だろうがなんだろうが、アラシがいると皆楽しそうだなあ。ふふっ
期待してるんじゃないのか?
0520デフォルトの名無しさん
2007/07/06(金) 22:03:320521495
2007/07/06(金) 22:07:05そうだな。例えば君が車の免許を取ったとする。
10年後に、君の知らない新しい規則で捕まったとしよう。
それは悔しくないか?
100歩譲って仕方ないとしても、
見ず知らずの人間から「そんなことも知らんバカがいる」
と言われて悔しくない奴がいるかい?
0522デフォルトの名無しさん
2007/07/06(金) 22:08:150523デフォルトの名無しさん
2007/07/06(金) 22:10:18アンテナ張らなくなったら終わりだぞ
0524デフォルトの名無しさん
2007/07/06(金) 22:11:59年々プロセスが細くなってきて、昔は気にもしなかったような
トンネル効果やらリーク電流やらに悩まされるような感じか
0525デフォルトの名無しさん
2007/07/06(金) 22:12:53つーか技術者なら、まず自分の無知を恥じろよ。
で、どういうカタチであれ知識を教えてもらったことを有難いと思えよ。
ま、アンタの場合、恥じるべきは自分の無知よりむしろ
年甲斐も無いDQNさだろうな。
もっぺん自分のレス読みかえせよ。
>>495は人にものを尋ねる態度か?
簡単に自分に確かめられることなのに、自分で確かめようともせずに
まるでケンカ越しで偉そうに聞いてたよな。
一体何様のつもりなんだか。
0526デフォルトの名無しさん
2007/07/06(金) 22:16:09悔しいのはわかるが、それをばねに勉強するなど
その気持ちをほかの方向へ向ける手もあるだろうに。
0527495
2007/07/06(金) 22:17:10complex型とか色々増えたんだろ。
確か、enumも面倒くさい仕様になったんだよな。
全く知らないわけじゃないが、不要な機能も多そうだ。
C言語仕様で遊んでる奴らは、もっと基本に返って欲しいぜ。
0528デフォルトの名無しさん
2007/07/06(金) 22:19:12最初から>>462みたいに偉そうに書かなきゃいいのに
初心者相手と思ってやったんならなおタチ悪いぞ
0529デフォルトの名無しさん
2007/07/06(金) 22:19:51最後にコンマつけても良くなった程度じゃない?
0530495
2007/07/06(金) 22:25:49これだから嵐はやめられん。
>>523
お前は常にアンテナを張っているといえるのか?
>>524
それは『道具を作る』側の悩みだろ。現場だから悩みは直ぐ分かるぜ。
俺は言語を作ってるわけじゃない『道具を使ってる』側だから、勝手に変えられるのもこまるんだぜ。
>>525
そうさ、お礼をするつもりだったのさ。
その後は前に書いたとおりだ。二度も言わせるな。
人にモノを尋ねる態度じゃないと思ったら
答えなきゃいいじゃないか。それか無視すればいいんじゃね?
君の知識で答えられるとは思えないがな。実は今日初めて知った仕様じゃないのかい(w
>>526
そのつもり。
0531デフォルトの名無しさん
2007/07/06(金) 22:26:54どうみても過剰反応の荒しなんだが。
0532495
2007/07/06(金) 22:28:11ほーら。こう言う人もいる。
分かる奴はenum談義でもしてやれよ。ほら。さあさあ。
0533デフォルトの名無しさん
2007/07/06(金) 22:30:16そのレベルだろ
0534495
2007/07/06(金) 22:31:35過剰反応じゃなきゃ嵐とは言えネー。
そして君は無視してなーい(藁)
0535デフォルトの名無しさん
2007/07/06(金) 22:32:37漏れは楽しんでるからどんどん過剰反応してくれ
0536495
2007/07/06(金) 22:34:16これだけ例えが分からん奴も珍しい。
心から軽蔑してやるぜ。
0537デフォルトの名無しさん
2007/07/06(金) 22:35:550538デフォルトの名無しさん
2007/07/06(金) 22:38:21釣りじゃなければ
0539デフォルトの名無しさん
2007/07/06(金) 22:40:12原付に乗っていきがっている中学生と似たようなもんだ、ということかと思った。
0540デフォルトの名無しさん
2007/07/06(金) 22:44:37よく読んだら免許持ってるともおっさんだとも言ってないな
今は反省してる。
0541デフォルトの名無しさん
2007/07/06(金) 22:45:14なるほど。プログラマも更新必須の免許制に白って話だな。
んで、更新場で5000円はらって、「今度のC++09では〜こういう変更が〜」
みたいな話をありがたくちょうだいしろ、と。
0542デフォルトの名無しさん
2007/07/06(金) 22:50:41法律は法律だろ…。
知らなかったなんて言い訳が通用するはずもない。
悔しいとか関係ないし。
自分で例えにもなってない例えを出しておいて、
よく他人に「例えが分からん」とか言えたものだな。
0543デフォルトの名無しさん
2007/07/06(金) 22:53:160544デフォルトの名無しさん
2007/07/06(金) 22:58:16普段から嬉々として間違ったことばかり言ってるが
「××さんそこはこうですよ」とか突っ込むと
逆切れして仕事にならんから適当な按配に放置されてると見た
0546デフォルトの名無しさん
2007/07/06(金) 23:07:24今の多くのコンパイラで使える技術ってちょっと違わないか?
>>495の内容は、コンパイルして確認できる程度のものだろ。
0547デフォルトの名無しさん
2007/07/06(金) 23:23:29規格に当たれば済むことを、いい加減な検証で分かった気になるとは。
>わざわざお礼を言おうと思ったが、そんな非礼な人間に感謝の気持ちなどなくなった。
例を言うのに「わざわざ」なんて副詞をつけるくらいなら最初から言わない方がましだ。
>そうだよ。俺はANSI-C以前からC使いだった。
別に珍しくもないが、普通は今時のコンパイラに触れているうちに理解するもんだ。
>C++を黎明期から覚えて使い始めてからは、string系クラスが活躍してくれて
string系? std::stringに類似品があったっけ? std::basic_stringのことか?
>外的・静的配列以外に初期化子を使う必要もなかったからな。
無知蒙昧極まれり。
>君らが古いコードをメンテする憂き目に遭うことを祈ってるよ。
憂き目? まさか。温故知新と言う言葉はご存じないかな?
0548495
2007/07/06(金) 23:33:34そういう君の方が年上で無知だったりして。
2chで無意味なことを言う奴だ。
>>541
何言ってんの?免許制?そりゃあいい。
仕事だけじゃなく、きちんと新しい仕様を勉強する公な時間がとれるぜ。
君らも仕事するようになったら、アンテナ張るのが限界になることが分かるぜ、学生、失業者。
>>542
お前にゃ『例え』という概念も理解し難いらしい。
この例えが不適切だったと思う奴はちょっとレスしてみろ。
>>543
新しい仕様は受け入れるよ。そろそろ新しいC言語の教本を読む頃だ。
だが、K&R C言語の第2版でさえ、やはり自動変数の初期化子は
目の上のたんこぶ扱いだったようだ。
ゆとり世代がループ内で自動(配列)変数の初期化子なんか使われたら困るぜ。
>>544
安心しろ。会社ははけ口にならんからここに毒を吐いてるんだ。
0549デフォルトの名無しさん
2007/07/06(金) 23:36:400550デフォルトの名無しさん
2007/07/06(金) 23:40:36このおっさんは汎用機と心中するしかないCOBOLerと一緒だな
周囲はゆとりと学生だけなんだ、自分は悪くないんだ、仕事やってりゃ皆こうなんだ、
と思い込もうとしてるんだね
実に哀れだね
0551デフォルトの名無しさん
2007/07/06(金) 23:43:48(´・ω・`)⊃旦 < 毎日お疲れ様です、お茶ドウゾ。
0552デフォルトの名無しさん
2007/07/06(金) 23:49:410553495
2007/07/06(金) 23:51:42君は自分の無知を自覚しようとしない奴だ。
ソクラテスはそういう事を何と言ったか知ってるか?
>>546
今日コンパイルしたのさ。
>>547
仕事中に新しい機能を覚える時間とそれを検証する時間をくれるなら進んでやるぜ。
社長は君かい(笑)
>string系? std::stringに類似品があったっけ? std::basic_stringのことか?
世の中にはSTLしかないと思っている奴を発見した。
しかも、wstringすら知らない奴もいたもんだ。
それから温故知新の使い方が逆だ。
君の使い方は『古いことを知り、かつ新しい事を知るべきだ』という意味にしかとれないが、
本当の意味は
『新しいことを知るには、古いことを知っておく事も重要だ』という意味。
やれやれ。ゆとり君=>>547。
0554デフォルトの名無しさん
2007/07/06(金) 23:55:420555デフォルトの名無しさん
2007/07/06(金) 23:57:120556495
2007/07/07(土) 00:03:14そういうなよ、ゆとり。
それより、採用試験に向けて、人と目を合わせて話す練習をした方がいいよ。
>>551
サンキュー
>>552
そのときは思いもよらなかったからさ。
今日は仕事が一区切りつけたから検証できたんだ。
>>554
つらい体験
>>555
そう言うなよゾロ目
全員が無視されたら嵐は自然といなくなるんだぜ?
0557デフォルトの名無しさん
2007/07/07(土) 00:05:030558デフォルトの名無しさん
2007/07/07(土) 00:09:45憂き目って、単につらいだけじゃなくて悲しいといったニュアンスも入るんだけど理解してる?
それでいて使い方が逆とか言ってる?
0559デフォルトの名無しさん
2007/07/07(土) 00:14:540560デフォルトの名無しさん
2007/07/07(土) 00:20:56勉強の時間が取れないって割には暇なんだな。
0561デフォルトの名無しさん
2007/07/07(土) 00:20:580562デフォルトの名無しさん
2007/07/07(土) 00:21:58> 仕事中に新しい機能を覚える時間とそれを検証する時間をくれるなら進んでやるぜ
こういう人多いんだよねぇ
・プライベートで自己啓発しようという考えが無い
・新しいことにチャレンジして新しい技術を仕事と共に身につけようという考えも無い
・自分に時間的余裕が無いのは上が悪いせいだ
ま、どうぞ勝手に腐ってくださいとしか
0563デフォルトの名無しさん
2007/07/07(土) 00:23:33そろそろ寝ろよおっさん。
0564デフォルトの名無しさん
2007/07/07(土) 00:24:07それはふつうに言うんでないか?
ちんちろりんとかサイコロ3つ使うけど
0565495
2007/07/07(土) 00:28:19>>558
よし答えてやろう。
憂き目がつらい体験というのはおおよそ間違ってないのではないかな。
それとも、『つらく悲しい経験』(goo辞書から抜粋)とでも答えてほしかったのかな?
そして、学生や就職浪人なんぞの世代が古いコードをメンテしたとき、
コンパイラは当時の同じバージョンの処理系で
コンパイルするのが常套ではないか?
もちろん、新しいコンパイラを使っても構わないが、動くように直すより、当時の規格に沿って
メンテした方が遥かに楽な場合が多いだろう。
そして、私の憎む君らが、知るべくもない仕様に基づいたバグにはまり、
(悲しく)つらい体験をするのを祈っているのだよ。
何か変?
0566デフォルトの名無しさん
2007/07/07(土) 00:31:110567495
2007/07/07(土) 00:34:10眠いと勉強ははかどらないが、悪口ならいくらでもでてくるからなあ。
>>562
おやおや。私がまるで何も勉強してないとでも。
はい。腐るときは勝手に腐るのでいちいち構わなくてもいいですよ。
自称自己啓発君。>>562君がせめて鬱で自殺しませんように(爆
>>563
さっき言っただろう。
嵐の敵はみんなの無視。
眠くなったら寝るから気にするな。
0568デフォルトの名無しさん
2007/07/07(土) 00:35:46んだな。
つうかそれ、もし対応して無いコンパイラを使ったら、コンパイル通らないだけ
じゃん。で、エラーメッセージが出力される。
全然困らんぞ。
ほんとうに昔のソースでは、確信犯的にリテラルを書き換えていることがあるが、
そっちのがまだ困るだろね。
ま、それに気づけば、コード書き換えるなり-fwritable-stringsを指定するなり
すればいいわけだが。
0569デフォルトの名無しさん
2007/07/07(土) 00:38:05「メンテする憂き目」じゃなくて、
メンテする際につらい体験をするのを祈ってるって話だったのか
0570デフォルトの名無しさん
2007/07/07(土) 00:39:260571495
2007/07/07(土) 01:14:31古いANSI-C(K&R第2版の頃な)で
void foo {
int a[100] = {0};
...
}
とでも書いてみたまえ。コンパイルは通るがaの要素がa[0]以外全てランダム値で
深刻なバグに発展するかもしれんね?
つまりだね。たかが一つ昔の仕様を回避したところで、
反証にはならんのですね。
それを何を偉そうに「全然困らんぞ」だって?
自分で気づいて直すならまだマシだが、納品後にクレームの電話。待ちますか?
0572デフォルトの名無しさん
2007/07/07(土) 01:17:420573495
2007/07/07(土) 01:28:59ハイハイ。君の言ってる事は
「お前は何時何分地球が何回、回ったときに納品した?」
というレベル。
あっちでママが呼んでますよー。『そろそろ寝なさい』だって。ププ
0574495
2007/07/07(土) 01:31:27また明日ー。俺が気に入らなかったら削除依頼でも出しときな。
0575デフォルトの名無しさん
2007/07/07(土) 01:32:07おっさん忙しいんじゃなかったのかw
0576デフォルトの名無しさん
2007/07/07(土) 02:03:040577デフォルトの名無しさん
2007/07/07(土) 02:26:42削除したいのはお前だけだって
0578デフォルトの名無しさん
2007/07/07(土) 04:20:16こういう責任の自覚がない香具師が下らん犯罪の元仁になったりするんだ。
くわばらくわばら
0579デフォルトの名無しさん
2007/07/07(土) 05:51:350580デフォルトの名無しさん
2007/07/07(土) 05:51:490582デフォルトの名無しさん
2007/07/07(土) 05:52:020583デフォルトの名無しさん
2007/07/07(土) 10:19:27そんな問題とは違うだろ
新しいルールは後から参加してきた守銭奴によって政治的に作られるんだから
自然の法則に従って限界に達して出てきた障害とは一緒にするな
0584デフォルトの名無しさん
2007/07/07(土) 10:23:09http://www.open-std.org/jtc1/sc22/wg21/
0585495
2007/07/07(土) 10:55:130586デフォルトの名無しさん
2007/07/07(土) 11:04:21メンバの型をtemplate構文を使うことにより自由に決められるやつってありますか?
こういうのって絶対誰もが考えると思うんだけどWTLにすらなくて・・・
自力で実装するしかないんでしょうか?(´・ω・`)
0587デフォルトの名無しさん
2007/07/07(土) 11:07:040588デフォルトの名無しさん
2007/07/07(土) 11:10:46いい加減ネタも尽きて来たしな。
>>586
ないね。俺も考えたことあるけど。
0589デフォルトの名無しさん
2007/07/07(土) 11:29:17あるよ。ほら。
template<typename T>class size
{
T width_;
T height_;
public:
size() : width_(), height_() {}
size(T width, T height) : width_(width), height_(height) {}
size(const size & foo) : width_(foo.width()), height_(foo.height()) {}
size & operator=(const size & foo) {width_ = foo.width(); height_ = foo.height(); return * this;}
bool operator==(const size & foo) const {return width() == foo.width() && height() == foo.height();}
T width() const {return width_;}
T height() const {return height_;}
T area() const {return width() * height();}
};
今作ったからバグってるかも知れないけど。
0590デフォルトの名無しさん
2007/07/07(土) 13:03:31古いANSI-Cが前提となっている理由が理解できない。
それは君の勉強不足だろうと。
0591デフォルトの名無しさん
2007/07/07(土) 13:18:15とりあえずsizeは参考にさせてもらいます
仕方ないのでboostとか使ってSTL対応の格好いいのを作っちゃうことにします(`・ω・´)
いざ出来ても動作が重いとかサイズを食うとかで結局使わない感バリバリですが…
0592デフォルトの名無しさん
2007/07/07(土) 13:22:47RECT<float>とかしたところでたいした意味はない
0593デフォルトの名無しさん
2007/07/07(土) 13:29:28それでもAPIに渡すまででポータブルに扱う分には役立つだろうと思ったけどあまり意味無いですね(´・ω・`)
0594デフォルトの名無しさん
2007/07/07(土) 13:32:55>589程度のクラスなら、どうせ最適化で消えるだろうからどんどん使えば?
size, point, rect辺りの綺麗にまとまったテンプレートクラスにして公開してくれたら
積極的に使ってあげるよ。
0595デフォルトの名無しさん
2007/07/07(土) 21:38:05map<int, FUNC> MAP;
キーをint型、値を関数ポインタで、関数ポインタに関しては、他のクラスのメンバ関数も
セット出来るようにしたいのですが、FUNCの定義の仕方がイマイチ分かりません。
御願いします。
0596デフォルトの名無しさん
2007/07/07(土) 21:40:05メンバ関数ポインタを他のクラスのも使えるようにするってあーた・・・・
thisポインタをどうやって区別するつもり?
0597デフォルトの名無しさん
2007/07/07(土) 21:40:200598デフォルトの名無しさん
2007/07/07(土) 21:46:26つBoost.Bind
0599デフォルトの名無しさん
2007/07/07(土) 21:47:360600デフォルトの名無しさん
2007/07/07(土) 21:49:570601デフォルトの名無しさん
2007/07/07(土) 23:36:29class A
{
int data;
public:
A(int x, int y){
data = x+y;
}
A(int x){
A(x, 0);
}
};
のような感じで、2つ目のコンストラクタは1つ目のコンストラクタを内部で呼んでいるのですが、
うまく値が入りません。
(これは例なので簡単にしてありますが、実際はもっと複雑なことをしています)
コンストラクタの中で別のコンストラクタを呼ぶことはできないんでしょうか?
いちおうコンパイルは通るのですが。
0602デフォルトの名無しさん
2007/07/07(土) 23:39:16A(x, 0)は単に一時オブジェクトを作る式となるだけ。
元のオブジェクトとは何の関係も持たない。
0603デフォルトの名無しさん
2007/07/07(土) 23:41:010604601
2007/07/07(土) 23:42:02ではどうするのがスマートなやりかたでしょうか?
初期化用の関数を作ってそれぞれのコンストラクタから呼ぶのがいいんでしょうか?
0605デフォルトの名無しさん
2007/07/07(土) 23:47:290606デフォルトの名無しさん
2007/07/07(土) 23:47:43placement new を使えば単体でコンストラクタを実行することはできる。
でもコンストラクタの中で自身に対して使っても正しい意味は成さない。
デストラクタだって、デストラクタの中から自身に対して呼んだりしちゃいけない。
0607デフォルトの名無しさん
2007/07/08(日) 00:13:21int *int_ptr = new int;
void *void_ptr = reinterpret_cast<void *>(int_ptr);
...
delete void_ptr;
0608デフォルトの名無しさん
2007/07/08(日) 00:24:200609デフォルトの名無しさん
2007/07/08(日) 00:38:01deleteでは、オブジェクトのデストラクタを呼んだ後
メモリを確保する必要があって
そのデストラクタが正しく呼べるなら違うポインタ型にしてもOk。
0610デフォルトの名無しさん
2007/07/08(日) 00:48:130611デフォルトの名無しさん
2007/07/08(日) 00:49:47基本中の基本
0612デフォルトの名無しさん
2007/07/08(日) 00:56:120613デフォルトの名無しさん
2007/07/08(日) 00:56:440614デフォルトの名無しさん
2007/07/08(日) 00:59:010615デフォルトの名無しさん
2007/07/08(日) 01:13:30自分はC言語を少し齧った程度で、オブジェクト指向の意味すらわかりません
0616デフォルトの名無しさん
2007/07/08(日) 01:19:40メイヤーの「Eiffelオブジェクト指向入門」がオススメ
0617デフォルトの名無しさん
2007/07/08(日) 01:27:51教えてくれてありがとうございます、明日辺り早速本屋で探してこようと思います
0618デフォルトの名無しさん
2007/07/08(日) 01:39:110620デフォルトの名無しさん
2007/07/08(日) 01:41:25ttp://www.asahi-net.or.jp/~yf8k-kbys/
少し古いけど初心者が勉強するには十分
0621デフォルトの名無しさん
2007/07/08(日) 01:49:14全俺が感動した
0622デフォルトの名無しさん
2007/07/08(日) 02:04:16俺もその本は持っているが、とても実践向きじゃない。
十数年前はオブジェクト指向なんて言葉自体珍しかったから、名前だけで買ってしまった。
Eiffel(エッフェル)なんて、謎の言語を覚える気なら敢えて止めはしない。
0623デフォルトの名無しさん
2007/07/08(日) 02:24:20C++はいろいろ細かいルールが多すぎて焦点がぼける感がある。
0624デフォルトの名無しさん
2007/07/08(日) 02:37:45オブジェクト指向に限らないというのが逆に理解のネックになるのかもな。
初心者だった頃先輩に薦められてModernC++Designを読んだときは一気に挫折しかけたwww
0625デフォルトの名無しさん
2007/07/08(日) 07:30:410626デフォルトの名無しさん
2007/07/08(日) 07:57:28"デストラクタ virtual" でぐぐれ
0627デフォルトの名無しさん
2007/07/08(日) 08:41:03そのサイトは間違いを指摘しても直さないから余りお勧めできないが。
0628デフォルトの名無しさん
2007/07/08(日) 09:14:02http://www.asahi-net.or.jp/~yf8k-kbys/newcpp0.html
と
http://www.geocities.jp/ky_webid/cpp/language/index.html
補足に使ってるページ
http://www.cmagazine.jp/src/kinjite/cpp/index.html
http://homepage2.nifty.com/well/Index.html
http://www.scl.kyoto-u.ac.jp/scl/appli/appli_manual/SUNWspro/WS6U2/ja/manuals/stdlib/user_guide/general/index.htm
http://www.s34.co.jp/cpptechdoc/
0629デフォルトの名無しさん
2007/07/08(日) 09:44:26>http://www.asahi-net.or.jp/~yf8k-kbys/newcpp0.html
>627
>http://www.geocities.jp/ky_webid/cpp/language/index.html
不明。
>補足に使ってるページ
>http://www.cmagazine.jp/src/kinjite/cpp/index.html
ダメダメ。
>http://homepage2.nifty.com/well/Index.html
>http://www.scl.kyoto-u.ac.jp/scl/appli/appli_manual/SUNWspro/WS6U2/ja/manuals/stdlib/user_guide/general/index.htm
>http://www.s34.co.jp/cpptechdoc/
不明。
0630デフォルトの名無しさん
2007/07/08(日) 09:55:37C++ というかオブジェクト指向の入門を C Magazine の
連載だったと思う A級B型C++ だけでやった。
あとはテクニック本をよみつつ、本当に疑問に思った仕様は
おおもとの仕様書(規格書)にあたる。
0631デフォルトの名無しさん
2007/07/08(日) 10:02:40暇そうなのにね
0632デフォルトの名無しさん
2007/07/08(日) 10:05:09えぴの記事は内容は古いけど初心者がC++の深遠を覗くにはいいと思うし
あとC++プライマーとか普通の入門書を一冊手元においておけばどんなページでも役に立つと思うぜ
0633デフォルトの名無しさん
2007/07/08(日) 10:06:09仕様とパラダイムは違うからねぇ
0634デフォルトの名無しさん
2007/07/08(日) 10:39:280635デフォルトの名無しさん
2007/07/08(日) 10:51:090636デフォルトの名無しさん
2007/07/08(日) 11:12:100637デフォルトの名無しさん
2007/07/08(日) 11:44:440638デフォルトの名無しさん
2007/07/08(日) 13:28:24今はWindowsでのC++開発環境って何がメジャーなの?
VC++2007ってありますか?
0639デフォルトの名無しさん
2007/07/08(日) 13:30:390640デフォルトの名無しさん
2007/07/08(日) 13:41:35「VC++」でぐぐるとVisual Studio 2005のページが出てくるから、とりあえずそこ読んでおけ
0641デフォルトの名無しさん
2007/07/08(日) 13:44:19mingw
0642デフォルトの名無しさん
2007/07/08(日) 15:24:330643デフォルトの名無しさん
2007/07/08(日) 15:29:090644デフォルトの名無しさん
2007/07/08(日) 15:47:34コンパイル時に数が決まっている要素(あるクラスを継承しているクラス)の数をカウントしたいんですが、
マクロの様なものを単純にコピペするだけでカウントするにはどうすればいいんでしょうか。
0645デフォルトの名無しさん
2007/07/08(日) 16:01:430646デフォルトの名無しさん
2007/07/08(日) 16:18:54それはリンク段階でしか判らないこと無いか?
0647デフォルトの名無しさん
2007/07/08(日) 16:36:310648デフォルトの名無しさん
2007/07/08(日) 16:37:280649デフォルトの名無しさん
2007/07/08(日) 16:46:40ハングする事が多いです。BCC5.5でコンパイルすると問題無く動くのですが。
1.51でDLL16使うのはWIN95までしか対応してないのでしょうか。
0650デフォルトの名無しさん
2007/07/08(日) 16:58:25IDE自体はWin9x/NT系で動かすとハングしやすいな。
デバッグ実行は特にめろめろだが、
作ったプログラムが単体でハングするならそれはあなたの作ったバグ。
0651デフォルトの名無しさん
2007/07/08(日) 18:10:53「エラーあるいは警告が多すぎる」と、最後にエラーが出てきました。
警告の上限の数は、決まってますか?
0652デフォルトの名無しさん
2007/07/08(日) 19:26:18ググってみたら
#include <stdio.h>
#include <wchar.h>
int main(void)
{
putwchar(L'あ');
return 0;
}
こうかと思ったのですが、どうも違うようでよく分からないですorz
0653デフォルトの名無しさん
2007/07/08(日) 19:27:390654デフォルトの名無しさん
2007/07/08(日) 19:27:52C99 互換モードとかもつくのかな。
0655デフォルトの名無しさん
2007/07/08(日) 19:28:17コンパイラ次第
0656デフォルトの名無しさん
2007/07/08(日) 19:31:01書いた後でそう言われそうだと思ったけど、
そういう意味じゃなくて、
int hoge='a';
putchar(hoge);
こういう感じで'あ'を扱うにはどうしたら良いでしょうか?
0657デフォルトの名無しさん
2007/07/08(日) 19:36:280658デフォルトの名無しさん
2007/07/08(日) 19:37:190659デフォルトの名無しさん
2007/07/08(日) 19:39:29char hoge="あ";
putchar(hoge);
0660デフォルトの名無しさん
2007/07/08(日) 19:39:44コンパイルエラー
0661デフォルトの名無しさん
2007/07/08(日) 19:40:43putwchar(hoge);
0662デフォルトの名無しさん
2007/07/08(日) 19:40:44それなら、
char hoge[]="あ";
にしないとまずいだろ。
0663デフォルトの名無しさん
2007/07/08(日) 19:43:250664デフォルトの名無しさん
2007/07/08(日) 19:48:08自分もそうやるのかと思ったんですが、
それだと何も表示されないです。(VC++2005で)
0665デフォルトの名無しさん
2007/07/08(日) 19:56:050666デフォルトの名無しさん
2007/07/08(日) 19:56:430667デフォルトの名無しさん
2007/07/08(日) 20:02:530668デフォルトの名無しさん
2007/07/08(日) 20:06:590669デフォルトの名無しさん
2007/07/08(日) 20:16:320670デフォルトの名無しさん
2007/07/08(日) 20:22:14↓で良いが、例えばVC++8.0(VS2005)ではバグによって何も表示されない。
wchar_tやロケールまわりをまともに使える処理系か確認するこった。
#include <stdio.h>
#include <wchar.h>
#include <locale.h>
int main(void)
{
setlocale(LC_CTYPE, "");
putwchar(L'あ');
return 0;
}
0671デフォルトの名無しさん
2007/07/08(日) 20:29:350672デフォルトの名無しさん
2007/07/08(日) 21:06:30#include <stdio.h>
#include <wchar.h>
#include <locale.h>
int main(void)
{
setlocale(LC_ALL, "");
putwchar(L'あ');
return 0;
}
Visual C++ 2005だとこれだけではバグってだめみたいだけど。
0673デフォルトの名無しさん
2007/07/08(日) 21:23:41ありがとうございます。
ちょっとbcc入れるのに手こずってました。
bccだと無事に動くっぽいですが、VCではダメなんですね。
しかしこれって単純に出来るものかと思ってたら、
意外と上手いこといかないものなんですね><
0674デフォルトの名無しさん
2007/07/08(日) 21:25:33VC++でも以前のバージョンなら問題なく動くんだがな
0675デフォルトの名無しさん
2007/07/08(日) 21:39:11早く2007か2008発売してくれたらいいんだけどな…
0676デフォルトの名無しさん
2007/07/08(日) 21:41:47バグ持ちだしな(SPでも直ってねぇし)
0677デフォルトの名無しさん
2007/07/08(日) 22:26:220678デフォルトの名無しさん
2007/07/08(日) 22:50:56全部スラスラと理解できてワロタ
昔買った本読み返すとあぁ俺ちゃんと成長してると実感できてうれしいなw
0679デフォルトの名無しさん
2007/07/08(日) 22:52:440680デフォルトの名無しさん
2007/07/08(日) 22:55:050681デフォルトの名無しさん
2007/07/08(日) 23:54:542008は4Q(多分12月ごろ)。MSDNにすれば?
0682デフォルトの名無しさん
2007/07/09(月) 01:30:28ある関数のバイナリを表示するプログラムを作ったのですが思ったとおりに表示されません。
source:
#include <stdio.h>
int func(void)//この関数のバイナリを表示したい。
{
return 0x12345678;
}
void fend(void){}//func関数の終わりをこの関数のアドレスから求める。
int main(void)
{
char *p;
char i;
p = (char *)func;//func関数のアドレスをchar型のポインタへ代入。
for(i=1; p<(char *)fend; i++) {
printf("%2.2X ", *p++);//func関数のバイナリを1バイトごとに表示。
if(!(i%16)) putchar('\n');//とりあえず16バイトごとに改行。
}
return 0;
}
result:
55 FFFFFF8B FFFFFFEC FFFFFFB8 78 56 34 12 5D FFFFFFC3
55 8B EC B8 78 56 34 12 5D C3と表示されるのを期待していたのですがうまくいきません。
コンパイラはBorlandコンパイラです。
根本的な間違いの指摘、もしくは強引な方法でうまく表示させる方法を教えてください。
0683デフォルトの名無しさん
2007/07/09(月) 01:34:30そこまでできてるんなら char を unsigned char にすればいけそうな気はするね。
でも、移植性のあるコードじゃないことは理解しておけよ。
0685デフォルトの名無しさん
2007/07/09(月) 01:37:000686デフォルトの名無しさん
2007/07/09(月) 01:38:460687682
2007/07/09(月) 01:39:53>>683
ありがとうございます。
解決できました。
移植性のないコードであることは百も承知でございます。
cl.exeでコンパイルするとうまくC3のret命令で終わらなかったです。
ただ、アセンブリの勉強のために作ったので自らの環境で動けば問題なしです。
ご丁寧にどうもありがとうございました。
0688デフォルトの名無しさん
2007/07/09(月) 01:45:281文字ずつ読み込んで、これが1byteか2byteか判定するにはどうしたら良いでしょうか?
お願いします。
0689デフォルトの名無しさん
2007/07/09(月) 01:48:08(数字は一行ずつ記述された状態)
出来ればそのあとさらにtxtに出力したいです
fgetsに関する記述方法がいまいち理解できないです
この後にどのような記述をすればいいのでしょうか
#include<stdio.h>
#include<stdlib.h>
#define swap(type,x,y) do{type t=x;x=y;y=t;}while(0)
int bubble(int a[],int n)
{
int i,j;
for(i=0;i<n-1;i++){
for(j=n-1;j>i;j--){
if(a[j-1]>a[j]){
swap(int,a[j-1],a[j]);
}
}
}
}
int main(void)
{
FILE *fp;
if((fp=fopen("data.txt","r"))==NULL){
printf("file open失敗\n");
exit(1);
}
while(fgets(
0690デフォルトの名無しさん
2007/07/09(月) 01:49:02bccでも同じなのかどうかは知らない
まぁ、バイナリ扱うなら unsigned char にしとくほうが良いだろうけど
0691デフォルトの名無しさん
2007/07/09(月) 01:56:53フォーマットが固定ならfscanfで読み込んでfprintfで出力すれば良いだけだと思うけど
fgetsで読み込みたいなら読み込んだ奴をstrtolするかsscanfにかければいいし
0692デフォルトの名無しさん
2007/07/09(月) 02:08:140693デフォルトの名無しさん
2007/07/09(月) 04:08:03遅レスだけど、俺もスラスラ読めて、さらには
「JAVAだとどうだとか、ほっといたれや」
とまで思ったりして、はじめ読んだときは「なるほどな〜」と
思ってたのに、今じゃ文句までつけやがる俺。
どんどんひねくれていく自分に嫌気がさす。
0694デフォルトの名無しさん
2007/07/09(月) 07:03:58func と fend がメモリ上で連続する保証はあるの?
0695デフォルトの名無しさん
2007/07/09(月) 08:13:30ない。でも>>687
0696デフォルトの名無しさん
2007/07/09(月) 14:14:040697デフォルトの名無しさん
2007/07/09(月) 14:15:090698デフォルトの名無しさん
2007/07/09(月) 15:40:00エディットコントロールに複数行の文字列を表示させた時、
その時のスクロールの位置を一番下の行にしたいのですが、うまくいきません。
m_editMsg.SetWindowText( m_strLog );
m_editMsg.SetScrollPos( SB_VERT, m_editMsg.GetScrollLimit( SB_VERT ) );
この処理を行うと、スクロールバー自体は一番下の行に移動した様な表示になるのですが、
表示される文字列データは、先頭部分が表示されてしまいます。
どうしたらいいのか教えて下さい。お願いします。
0699デフォルトの名無しさん
2007/07/09(月) 16:24:14EM_SETSEL 使えばいいかな。
0700デフォルトの名無しさん
2007/07/09(月) 16:44:31関数間が NOP (90h) で埋められてるなら
NOP が出てくるまで・・・と出来そうな気はするけど、
コードの途中で境界合わせに NOP が出てこない保証もないし、
ダメかなあ・・・。
0701デフォルトの名無しさん
2007/07/09(月) 16:58:25定義順に関数アドレスが並ぶ保証はどこにもないよ
0702デフォルトの名無しさん
2007/07/09(月) 17:12:31ありがとうございます。調べてみます。
0703デフォルトの名無しさん
2007/07/09(月) 17:51:57?
0704デフォルトの名無しさん
2007/07/09(月) 18:17:06関数間がNOPで埋められる保証もどこにも無いよ。
0705デフォルトの名無しさん
2007/07/09(月) 19:37:39「関数間が NOP (90h) で埋められてるなら」
という条件付きで話してる事に、そう言われても・・・
0706デフォルトの名無しさん
2007/07/09(月) 19:42:300707デフォルトの名無しさん
2007/07/09(月) 19:43:36よくある話。
0708デフォルトの名無しさん
2007/07/09(月) 20:06:18API勉強しないとだめ?
0709デフォルトの名無しさん
2007/07/09(月) 20:09:33「C++だけ」ってのが「標準C++ライブラリだけ」ってことならyesだな
0710デフォルトの名無しさん
2007/07/09(月) 20:19:22ありがとう。さすがにCUIばっかりで飽きてきちゃったからAPI勉強してみる(`・ω・´)
0711デフォルトの名無しさん
2007/07/09(月) 20:34:28否定形の問いかけに対して安易にyesと答えてはいけないw
0712デフォルトの名無しさん
2007/07/09(月) 20:56:37VC2005だとそうなっては無かったから、
結構多くのコンパイラでその仮定は間違っているんじゃ無いの? と思っただけ。
どっちにしても>>700はあんまり意味無さそうだね。
0713デフォルトの名無しさん
2007/07/09(月) 21:24:20vc8のインラインアセンブラだと
× call printf
○ call dword ptr [printf]
○ call test_func
○ call dword ptr [test_func]
(test_funcは同じオブジェクト内の自作関数)
じゃないとうまく動かなかった。
不思議なような、そうでもないような。うーん。
0714デフォルトの名無しさん
2007/07/09(月) 21:32:180715デフォルトの名無しさん
2007/07/09(月) 21:40:08That's right ! そのとおりだった!
ってか、前にMTでテストしたはずだったんだけどな・・・orz
0716デフォルトの名無しさん
2007/07/09(月) 23:51:370717デフォルトの名無しさん
2007/07/10(火) 00:19:18昔の VC6 くらいそうなってなかったかなあ。
0718デフォルトの名無しさん
2007/07/10(火) 09:55:260719デフォルトの名無しさん
2007/07/10(火) 21:51:23基本的にMFCのDoc-Viewを用いたプログラムです。自分で生成した特定の
ウィンドウのスナップショットを、画像に保存したいのですが、どのようなアプローチで
進めたらいいのか悩んでいます。
1. 非アクティブまたは非表示な場合でも、フレームを含めたウィンドウ全体を
画像として取得するような手段はあるのでしょうか?
2. 1.が不可能なら、非アクティブまたは非表示で、ウィンドウの内容(例えばCViewの
中身)のみを取得する手段はあるのでしょうか?
XP VC2005 SP1
0720デフォルトの名無しさん
2007/07/10(火) 22:07:13printf("%d",(int)strlen(str));
↑な感じのコードを書いて実行させると、
【実行画面】
>hoge
5
となるのですが、これってどうなっているのでしょうか?
0721デフォルトの名無しさん
2007/07/10(火) 22:12:050722デフォルトの名無しさん
2007/07/10(火) 22:14:58ヌル文字は入れないはずなのになんでかと思ったら…。
>>721サンクスです!
0723デフォルトの名無しさん
2007/07/10(火) 23:00:522005だとRelease,Debugとも基本的にNOPは使ってないよ。
0724デフォルトの名無しさん
2007/07/10(火) 23:24:29これでstrが指す場所を"yo"にしたいのですが、
どうすれば良いでしょうか?
0725デフォルトの名無しさん
2007/07/10(火) 23:25:23strcpy(str, "yo");
0726デフォルトの名無しさん
2007/07/10(火) 23:28:13char *str2 = &str[2];
0727デフォルトの名無しさん
2007/07/10(火) 23:31:52文字列をコピーしたいってより、yoの場所まで移動させたいのです。
array[i++]=strtol(str,&err,0);
これを繰り返し行う際にstrをstrから任意のバイト分進めた値にして
文字列を完全に走査、数値格納したいのです。
0728デフォルトの名無しさん
2007/07/10(火) 23:39:50&str[2]とかstr+2好きなように表記すればよか
これが気持ち悪いなら別途charへのポインタ用意して
char *p=str;
とした後に読み進めたいバイト分だけp+=2みたいにインクリメントすればいい
0729デフォルトの名無しさん
2007/07/10(火) 23:41:26でいいんじゃね
0730デフォルトの名無しさん
2007/07/10(火) 23:44:480731デフォルトの名無しさん
2007/07/10(火) 23:46:04strtol の使い方が知りたかっただけなんだね
#include<stdio.h>
#include<stdlib.h>
int main(void){
long value[100];
char str[]="100 200 300 400 500 x 600 777";
char *ptr=str, *endptr;
int i, value_num=0;
for(value_num=0;value_num<100;value_num++){
value[value_num]=strtol(ptr, &endptr, 10);
if(ptr==endptr) break;
ptr=endptr;
}
for(i=0;i<value_num;i++){
printf("%ld\n", value[i]);
}
return 0;
}
0732デフォルトの名無しさん
2007/07/10(火) 23:47:28なるほど、ありがとうございます。
それを参考にちょっと今から思った通り出きるか作ってみます。
0733732
2007/07/11(水) 00:34:56>>731さんのものを参考に、一行にある複数数字(途中非数字あり)
を格納して表示するプログラムを作ってみました。
これってあと直すところとかどうでしょうか?
>12 32 aaa43jfie55 32
たとえば入力が上のようなら、
12,32,43,55,32が配列に格納されて表示される仕様です。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 256
int main(void){
long value[N];
char str[N];
char *ptr=str, *endptr;
int i, value_num=0,l;
fgets(str,N,stdin);
l=strlen(str)-1;
for(i=0;i<l;i++){
if(strtol(ptr, &endptr, 10)!=0)
value[value_num++]=strtol(ptr,&endptr,10);
ptr=++endptr;
}
for(i=0;i<value_num;i++){
printf("%ld\n", value[i]);
}
return 0;
}
0734デフォルトの名無しさん
2007/07/11(水) 00:37:080735デフォルトの名無しさん
2007/07/11(水) 00:37:13申し訳ない、>>731さんも激しくありがとうございます。
0736デフォルトの名無しさん
2007/07/11(水) 01:01:54以下ClassAに、オーバロードしたfunc()という関数が2つがあるとします。
ClassAを継承したClassBをnewし、classb->func(NUM_2);をコールすると、期待通りに
ClassA::func(NUM)がコールされるのですが、(1)だけオーバライドしたClassCを
newし、classc->func(NUM_2);をコールするとClassC::func(int, NUM)がコールされて
しまいます。
期待した動作はClassA::func(NUM)がコールされる事でした。
これはC++の仕様なのでしょうか。コンパイラがどういう論理でenumを使用した関数の
オーバライド/オーバロードを解決しているのかご存知の方、ご教示お願いします。
enum NUM { NUM_1, NUM_2, NUM_3 };
class ClassA {
virtual int func(int a, NUM b = NUM_1); // ←(1)
virtual int func(NUM a = NUM_1); // ←(2)
};
class ClassB : public ClassA
{
// ClassAの(1),(2)はオーバライドしていないクラス
};
class ClassC : public ClassA
{
// ClassAの(1)だけをオーバライド
int func(int a, NUM b = NUM_1);
};
0737デフォルトの名無しさん
2007/07/11(水) 01:03:170738デフォルトの名無しさん
2007/07/11(水) 01:06:120739デフォルトの名無しさん
2007/07/11(水) 01:12:08>classc->func(NUM_2);をコールするとClassC::func(int, NUM)
理由は>>737だ
ClassCでfunc(int,NUM)を宣言しちゃったから、ClassAのfunc(int,NUM)が見えなくなってる。
あとvirtualな関数にデフォルトパラメータつけるな
0740デフォルトの名無しさん
2007/07/11(水) 01:58:14>>738
>>739
見づらくてすいません。
C++にそんな仕様があるとは知りませんでした。
ありがとうございました。
参考までに
>あとvirtualな関数にデフォルトパラメータつけるな
は何故でしょうか?
0741デフォルトの名無しさん
2007/07/11(水) 02:10:29class B{
virtual void foo(int a=300){std::cout << a;}
}
class D{
void foo(int a=100){std::cout << a;}
}
B* pb = new D();
pb->foo(); //300と表示される
D* pd = new D();
pd->(foo); //100と表示される
だった筈
0742デフォルトの名無しさん
2007/07/11(水) 02:11:50> pd->(foo);
モチツケ
0743デフォルトの名無しさん
2007/07/11(水) 02:24:20なるほど。納得しました。
ありがとうございます。
0744デフォルトの名無しさん
2007/07/11(水) 10:08:49PHPアプリとCアプリとログ出力先を共通化という
無茶な事を要求されているときも
行単位の一発書き込みなら大丈夫かな?
2プロセス立ち上げてそれぞれ適当に書き込みをさせて
100万回くらいテストしたんだけど これで混ざんなかったから
多分大丈夫だよね?
0745デフォルトの名無しさん
2007/07/11(水) 10:52:14「行単位の一発書き込み」がシステムコールレベルでそうなっているなら大丈夫。
具体的には、(直接的または間接的に)O_APPENDでopen()されており、write()
一発で1行を書き込んでいるなら大丈夫。
それから少しでもズレるならダメ。
Win32の場合、O_APPENDに相当する機能がCreateFile()に存在しないので、
*必ず*排他が必須になるようだ。
0746デフォルトの名無しさん
2007/07/11(水) 14:55:19シャノンの符号化法による符号語生成プログラムと、
表計算ソフトを用いた符号語生成の違いについて説明して頂けないでしょうか?
よろしくお願いします。
0747デフォルトの名無しさん
2007/07/11(水) 16:23:30表計算ソフトを用いた符号語生成って、何のことか教えて。
0748デフォルトの名無しさん
2007/07/11(水) 21:59:26ちなみに741の問題を回避するためにもNVIパターンが使えるぞ。
0749デフォルトの名無しさん
2007/07/12(木) 08:23:23string型でファイル名を持っているとき、それをオープンしようとすると
エラーが出ます。char型にするにはどうすれば良いですか?
0750749
2007/07/12(木) 08:26:480751デフォルトの名無しさん
2007/07/12(木) 08:26:590752デフォルトの名無しさん
2007/07/12(木) 08:27:490753デフォルトの名無しさん
2007/07/12(木) 08:51:04読み込むと配列が最後まで埋まってしまいます
どうすれば実データのみ読めますか??
fp.read(str,N); とすると strのサイズはNになります
0754デフォルトの名無しさん
2007/07/12(木) 08:58:000755デフォルトの名無しさん
2007/07/12(木) 09:04:02なんですけど、fp.read(str,N); の戻り値は、istream 型です
どうすればサイズがわかりますか??
0756755
2007/07/12(木) 09:24:03fp.gcount();で読み込みサイズが出ました
0757デフォルトの名無しさん
2007/07/12(木) 13:10:42サイズの小さいファイルをクローズしようとするとエラーが出ます
開いてから閉じるまでの期間が短すぎる為だと思います
どうしたらいいでしょうか?
0758デフォルトの名無しさん
2007/07/12(木) 13:12:24エラーメッセージ貼れ。できれば問題を再現できるソースもな。
0759デフォルトの名無しさん
2007/07/12(木) 13:22:08すみません
fstream fp ("filename", ios::in | ios::binary );で開いたファイルが
閉じられているかどうかを調べる方法はないですか?
0760デフォルトの名無しさん
2007/07/12(木) 13:27:08close()した時点でwindowsからエラーが出てしまいます
そのため状態は取得できません・・・
0761デフォルトの名無しさん
2007/07/12(木) 13:34:060762デフォルトの名無しさん
2007/07/12(木) 13:50:530763デフォルトの名無しさん
2007/07/12(木) 14:10:000764デフォルトの名無しさん
2007/07/12(木) 14:31:120765デフォルトの名無しさん
2007/07/12(木) 14:34:01std::random_shuffle()で終了〜
やっぱC++って最高だろ?そうだろ、そうだといえよコラ
0766デフォルトの名無しさん
2007/07/12(木) 15:33:55136って…麻雀?
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
int hairetsu[136],i,j,k;
srand((unsigned)time(NULL));
for(i=0;i<136;i++)hairetsu[i]=i;
for(i=0;i<136;i++)j=rand()%136,k=hairetsu[i],hairetsu[i]=hairetsu[j],hairetsu[j]=k;
for(i=0;i<136;i++){printf("%4d",hairetsu[i]);if(i%17==0)printf("\n");}
return 0;
}
0767デフォルトの名無しさん
2007/07/12(木) 15:40:55配列でも構いやせんぜ、旦那。
int value[135];
:
:
std::random_shuffle(value, value + 135);
0768デフォルトの名無しさん
2007/07/12(木) 15:58:150769デフォルトの名無しさん
2007/07/12(木) 22:48:12class A{
char *buf[] = { "数学", "英語", "理科" };
};
と書くと
.\prac.cpp(6) : error C2059: 構文エラー : '{'
.\prac.cpp(6) : error C2334: '{' の前に予期しないトークンがありました。関数の本体は無視されます
って出ちゃうんですがクラスの中でポインタを初期化しちゃいけないって言う決まりみたいなのがあるんでしょうか?
0770デフォルトの名無しさん
2007/07/12(木) 22:50:46静的整数メンバ以外はダメ
0771デフォルトの名無しさん
2007/07/12(木) 22:51:230772デフォルトの名無しさん
2007/07/12(木) 22:51:50わかりました
ありがとうございます
0773デフォルトの名無しさん
2007/07/12(木) 22:52:00staticでconstな整数型以外はダメ
0774デフォルトの名無しさん
2007/07/12(木) 22:52:29了解です
ありがとうございます
0775デフォルトの名無しさん
2007/07/12(木) 23:13:09char *buf[3];
public:
A() {
buf[0] = "数学";
buf[1] = "英語";
buf[2] = "理科";
}
};
こうなるんかな? なんかダサイぞ
0776デフォルトの名無しさん
2007/07/12(木) 23:35:03試しにそれ実行したら
なんかすごいエラー出ますた
0777デフォルトの名無しさん
2007/07/12(木) 23:40:140778デフォルトの名無しさん
2007/07/12(木) 23:42:410779デフォルトの名無しさん
2007/07/12(木) 23:44:51class A {
char *buf[3];
public:
A() {
buf[0] = new "数学";
buf[1] = new "英語";
buf[2] = new "理科";
}
};
0780デフォルトの名無しさん
2007/07/12(木) 23:46:170781デフォルトの名無しさん
2007/07/12(木) 23:47:290782デフォルトの名無しさん
2007/07/12(木) 23:49:19<..>使ったことありません,oTZ
0783デフォルトの名無しさん
2007/07/12(木) 23:50:28>>775はコピペしたせいで全角空白が認識されてしまったみたいです。
プラグラムの内容とは関係なかったです
長々と申し訳ないです
ありがとうございます
0784デフォルトの名無しさん
2007/07/13(金) 00:06:530785デフォルトの名無しさん
2007/07/13(金) 00:11:17const char * const buf[3];
public:
A() : buf(...) {}
};
こうしたい場合、bufはどうやって初期化すればいいの?
0786デフォルトの名無しさん
2007/07/13(金) 00:24:380787デフォルトの名無しさん
2007/07/13(金) 00:28:000788デフォルトの名無しさん
2007/07/13(金) 00:28:48class A {
static const char* const buf[3];
public:
A() {}
void operator()(std::ostream& os) {
os << buf[0] << buf[1] << buf[2] << std::endl;
}
};
const char* const A::buf[3] = {"nullpo","nul","aa"};
int main() {
A a;
a(std::cout);
}
あんまり意味が無いどころか臭ってくるけどこんな感じで
0789デフォルトの名無しさん
2007/07/13(金) 09:45:56これはひどい
0790デフォルトの名無しさん
2007/07/14(土) 09:09:48static struct s_keywords funcs[] = {
{ "+", FTYPE(FTYPE_SYS, FTYPE_ANY_ARGS), KW_ADD },
{ "-", FTYPE(FTYPE_SYS, FTYPE_ANY_ARGS), KW_SUB },
{ "*", FTYPE(FTYPE_SYS, FTYPE_ANY_ARGS), KW_TIMES },
{ "/", FTYPE(FTYPE_SYS, FTYPE_ANY_ARGS), KW_QUOTIENT },
{ "divide", FTYPE(FTYPE_SYS, 2), KW_DIVIDE },
{ ">", FTYPE(FTYPE_SYS, 2), KW_GT },
{ "<", FTYPE(FTYPE_SYS, 2), KW_LT },
{ NULL, -1, -1 }
};
これって配列なのでしょうか?
どういうふうに解釈すれば良いんでしょうか?
0791デフォルトの名無しさん
2007/07/14(土) 09:21:330792デフォルトの名無しさん
2007/07/14(土) 09:51:11わからなかったらRMSに聞きに行くのか?
オマエはLinuxのカーネル読んでて、
わからなかったらリーナスに聞きに行くのか?
オマエはMINIXのソース読んでて、
わからなかったらタネンバウムに聞きに行くのか?
オマエはWindowsのAPIが
わからなかったらゲイツに聞きに行くのか?
おまえはDarwinのソース読んでて分からなかったら
アビに聞きに行くのか?
オマエはC言語がわからなかったら、
カーニハンとリッチーに聞きに行くのか?
0793デフォルトの名無しさん
2007/07/14(土) 10:09:41ほんと間抜けな回答だなぁ・・・
0794デフォルトの名無しさん
2007/07/14(土) 10:15:12頭わるいなぁ・・・
struct s_keywords の配列以外のなにものでもない
一行がひとつの struct s_keywords だよ
0795デフォルトの名無しさん
2007/07/14(土) 10:19:14トンです。
本あさくってたら、解説してありました。
>>791
まじ、センスねぇ。
0796デフォルトの名無しさん
2007/07/14(土) 10:20:40煽りはスルーしろよ
もちろんこのレスも
0797デフォルトの名無しさん
2007/07/14(土) 10:23:11ねちねちどうでもいい話する香具師が多いんだ
0798デフォルトの名無しさん
2007/07/14(土) 12:49:46ifstream in1("data.txt");
while(in1.getline(str, sizeof(str)) > 0){
if(str == "aaa")
cout << str << endl;
}
上のような感じでdata.txtファイルに”aaa”という一行があればそれを出力、というプログラムを書きたいんですが
"aaa"という行があってもなぜか何も出力せずに終わってしまいます。
if文をコメントアウトした場合全行出力されたのですが
char型配列の比較部分に問題があるんでしょうか?
どなたか教えてください
0799デフォルトの名無しさん
2007/07/14(土) 12:51:15文字列の比較方法を勉強しよう
0800デフォルトの名無しさん
2007/07/14(土) 12:54:040801デフォルトの名無しさん
2007/07/14(土) 12:54:35ありがとうございます
勉強してきます
0802デフォルトの名無しさん
2007/07/14(土) 13:09:340803デフォルトの名無しさん
2007/07/14(土) 16:15:15>if(str == "aaa")
直感的に打ち込みましたって感じだな。
やってることは
strという配列の先頭アドレスと
無名なconst charであり中身が"aaa"である文字列の先頭アドレスを比較しているだけで
常に結果は偽である意味不明なコードなんだが。
0804デフォルトの名無しさん
2007/07/14(土) 16:24:09if(str[i] == 'a' && str[i+1] == 'a' str[i+2] == 'a')
まず、こういうのを考えると思うんだけど
Javaから入ったとかかな
0805デフォルトの名無しさん
2007/07/14(土) 16:25:23if(str[i] == 'a' && str[i+1] == 'a' && str[i+2] == 'a')
0806デフォルトの名無しさん
2007/07/14(土) 16:25:42intの比較がi==hでいけて、
Cの文字列はchar *hoge="str"だ、と習ったら、
文字列の比較はhoge=="str"でいけると思うって。
0807デフォルトの名無しさん
2007/07/14(土) 16:32:310808デフォルトの名無しさん
2007/07/14(土) 17:35:43ファイルから一行読み込んでいきなりstrinに入れられませんか?
そういう入力がないような
0809デフォルトの名無しさん
2007/07/14(土) 17:40:20#include <string>
#include <fstream>
int main() {
std::ifstream ifs("test.txt");
std::string buf;
std::getline(ifs, buf);
std::cout << buf;
}
こんな感じで割りと簡単に出来る
0810デフォルトの名無しさん
2007/07/14(土) 17:55:50サンクス
0811808
2007/07/14(土) 18:06:38バイナリのときは開かないようにするにはどうしたらいいですか?
0812デフォルトの名無しさん
2007/07/14(土) 18:14:23#include <iostream>
#include <fstream>
int main() {
std::ifstream ifs("test.txt");
char buf[10];
ifs.getline( buf, sizeof(buf) );
std::cout << buf;
}
のようにして一行の最大文字数を限定するとか
0813808
2007/07/14(土) 18:17:34入っていたらバイナリ、いなければテキストとすればいいんでしょうか?
そしてからテキストモードで開き直す
0814デフォルトの名無しさん
2007/07/14(土) 18:19:37それだと当初の目的と違ってしまいます....
いきなりstringにいれたいんです
0815808
2007/07/14(土) 18:44:08としたらサンプルをすべて判別できましたよ
0816デフォルトの名無しさん
2007/07/14(土) 19:04:47int binchk(char *name){
fstream fp(name,ios::in|ios::binary);if(!fp)return 1;
int i,j,n=1;char t[4096];
for(i=0;i<20;i++){
fp.read(t,4096);n=fp.gcount();
if(n<1)return 0;
for(i=0;i<n;i++)if(t[i]==0)return 1;}
return 0;}
0817デフォルトの名無しさん
2007/07/14(土) 19:05:120818デフォルトの名無しさん
2007/07/14(土) 19:51:07猫でもわかるC言語と猫でもわかるwindowプログラムの本を買って、Microsoft visual studio 2005 Professinal edition というのをインストールしてみました。
ソフトのほう種類がたくさんあってこの時点で何がなんだかわからないんですがソフトはこれであってますか?
0819デフォルトの名無しさん
2007/07/14(土) 20:07:55初心者は、BCC developerとc++ (STL)をやったほうが良いですよ
cで出来る事はc++でより簡単にできます
0820デフォルトの名無しさん
2007/07/14(土) 20:09:390821デフォルトの名無しさん
2007/07/14(土) 20:15:03PCの基本的なことを知らないままプログラム書いていると
とんでもないヘボなことしてて気付かない糞プログラマになるよ
多少回り道だと思っても基本はおろそかにしないでくれ給へ
0822デフォルトの名無しさん
2007/07/14(土) 20:15:57本もソフトもそれでいいよ、でも
>Microsoft visual studio 2005 Professinal edition というのをインストールしてみました
これは有料ソフトじゃねーの?
ExpressEditionなら無料であった気がするけど
0823デフォルトの名無しさん
2007/07/14(土) 20:25:390824デフォルトの名無しさん
2007/07/14(土) 20:29:520825デフォルトの名無しさん
2007/07/14(土) 20:32:24ファイルポインタが使用中か判定できませんか?
while(1){
str 生成、fn 生成
fstream fq(fn,ios::out);if(!fq)return 0;
fq <<str<<endl;
fq.close();
}
という動作を1Kバイトくらいで繰り返すと、エラーで止まります
0826デフォルトの名無しさん
2007/07/14(土) 20:33:300827デフォルトの名無しさん
2007/07/14(土) 20:34:10とは言え、何を薦められるかというと、難しいところだが。
0828デフォルトの名無しさん
2007/07/14(土) 20:35:520829デフォルトの名無しさん
2007/07/14(土) 20:37:02strとは関係ないとおもうんですけど・・・
閉じる処理が完了する前に次へいってしまう所では?
0830デフォルトの名無しさん
2007/07/14(土) 20:37:420831デフォルトの名無しさん
2007/07/14(土) 20:38:05「エラーが出て止まる」の意味が分からん
どういうエラーが出るの?
0832デフォルトの名無しさん
2007/07/14(土) 20:41:41str 生成、fn 生成
{
fstream fq(fn,ios::out);if(!fq)return 0;
fq <<str<<endl;
}
}
これでおk?
0833デフォルトの名無しさん
2007/07/14(土) 20:45:08すべての処理が終わる前に、return 0をしてしまいます
別名ファイルを出力用に生成しますから通常はエラーにならないはず
0834デフォルトの名無しさん
2007/07/14(土) 20:46:33#include <windows.h>
while(1){
str 生成、fn 生成
fstream fq(fn,ios::out);if(!fq)return 0;
fq <<str<<endl;
fq.close();
if(fq.fail())Sleep(1000);
}
でokになりました
0835デフォルトの名無しさん
2007/07/14(土) 21:07:12めちゃくちゃ訳わかんねぇ
つか怪しすぎ
0836デフォルトの名無しさん
2007/07/14(土) 21:08:13下らねぇ落ちじゃねぇだろうな
0837デフォルトの名無しさん
2007/07/14(土) 21:11:54char fn[9];fn[8]='\0';
s=m;
for(i=0;i<8;i++)
{fn[7-i]=s%10+'0';s/=10;}
fstream fq(fn,ios::out);if(!fq)return 0;m++;
です 一回ごとに変わります
なんでバグらなくなったのかわからんし、それに効くかもわからんけどw
0839デフォルトの名無しさん
2007/07/15(日) 02:48:470840・∀・)っ-○◎●
2007/07/15(日) 02:51:22sscanfで書式%xで読み出す
0841デフォルトの名無しさん
2007/07/15(日) 02:58:57自分でやってみました
cが16進文字のとき、x= e>64?e-55:e-48が数値です・・・
0842・∀・)っ-○◎●
2007/07/15(日) 03:04:58かく言う俺も高速化のためには良く使うんだけど
0843デフォルトの名無しさん
2007/07/15(日) 03:07:330844デフォルトの名無しさん
2007/07/15(日) 03:20:330xabcと受け止めたかだな
0845デフォルトの名無しさん
2007/07/15(日) 03:22:47http://boost.cppll.jp/HEAD/libs/lambda/doc/ar01s08.html
掲載の、
boost::function<int(int, int)> f = _1 + _2;
boost::function<int&(int&)> g = (_1 += 10);
int i = 1, j = 2;
f(i); // returns 3
g(i); // sets i to = 11;
をコンパイルできるフリーのコンパイラはご存じでしょうか?
OSはWindowsでお願いします。
VC Express付属のVC8もCygwin付属のgcc3.4.4もダメでしたし、
BCC5.5.1に至ってはそもそもlambdaに対応してないようですし……
0846・∀・)っ-○◎●
2007/07/15(日) 03:27:34http://engineering.meta-comm.com/boost-regression/1_34_0/user/function_release.html
0847デフォルトの名無しさん
2007/07/15(日) 03:27:56int char_su(char c){
return c>64?c-55:c-48;}
int str_su(char *c){
int n,k,sum=0;
for(n=0;c[n]!='\0';n++);
for(k=0;k<n;k++)sum+=c[k]<<(4*(n-k));
return sum;}
0848デフォルトの名無しさん
2007/07/15(日) 03:31:03C++ならどれでも使えるのでは?テンプレートがコンパイルできれば
0849・∀・)っ-○◎●
2007/07/15(日) 03:33:500850デフォルトの名無しさん
2007/07/15(日) 03:42:060851デフォルトの名無しさん
2007/07/15(日) 03:49:370852・∀・)っ-○◎●
2007/07/15(日) 04:03:20書き換え可能な静的配列は利用制限があるんじゃないの?
0853デフォルトの名無しさん
2007/07/15(日) 04:23:330854デフォルトの名無しさん
2007/07/15(日) 04:28:45fの呼び出し間違ってるぞ
0855・∀・)っ-○◎●
2007/07/15(日) 04:35:42static constなメモリ領域はマスクROMに焼ける
0856デフォルトの名無しさん
2007/07/15(日) 08:07:08関数じゃないよね。
0857デフォルトの名無しさん
2007/07/15(日) 08:17:240858デフォルトの名無しさん
2007/07/15(日) 10:28:04int x;
int y;
};
struct Point SizeToPoint(struct Point offsetPoint, int width, int height){
offsetPoint.x = offsetPoint.x + width;
offsetPoint.y = offsetPoint.y + height;
return offsetPoint;
}
int main (){
struct Point location = {100,100};
printf(
"rectangle¥n¥t"
"left= %d:top%d¥n¥t"
"right=%d:bottom=%d¥n",
location.x,location.y,SizeToPoint(location,200,40).x,SizeToPoint(location,200,40).y
);
return 0;
}
こんなプログラムが有ったとして、
なぜ、SizeToPoint(location,200,40).x,SizeToPoint(location,200,40).yのような書き方が許されるの?
これがoffsetPoint.xとoffsetPoint.yに置き換えられたとしても、スコープの関係上おかしくないんですか?
0859デフォルトの名無しさん
2007/07/15(日) 10:29:250860デフォルトの名無しさん
2007/07/15(日) 10:29:28これならg++ 3.4.4(Cygwin付属)やg++ 4.1.1、VC++ 8でコンパイル・実行できたぞ。
#include <iostream>
#include <boost/function.hpp>
#include <boost/lambda/lambda.hpp>
int main()
{
namespace bll = boost::lambda;
using bll::_1;
using bll::_2;
boost::function<int(int, int)> f = _1 + _2;
boost::function<int&(int&)> g = bll::ret<int&>(_1 += 10);
int i = 1, j = 2;
std::cout << f(i, j) << '\n'; // returns 3
std::cout << g(i) << '\n'; // sets i to = 11;
std::cout << i << std::endl;
}
0861デフォルトの名無しさん
2007/07/15(日) 10:32:59int f(int n) { return n; }
printf("%d\"n, f(1));
がおかしくなるとお思いか?
0862デフォルトの名無しさん
2007/07/15(日) 10:35:14>うん
何故ですか?
offsetPoint.xとoffsetPoint.yが通用するのは
関数SizeToPointの中だけじゃないんですか?
どういう風に評価されるんですか?
0863デフォルトの名無しさん
2007/07/15(日) 10:38:31>int f(int n) { return n; }
>printf("%d¥"n, f(1));
コレは納得できるんです。
だってこの場合は数を返しているから。
0864デフォルトの名無しさん
2007/07/15(日) 10:43:59じゃあ、返り値がstructである場合も、返しているのは「値」だというのはわかるかい?
0865デフォルトの名無しさん
2007/07/15(日) 10:52:58>返しているのは「値」であって「変数」じゃないというのは判ってるんだね。
はい。
>じゃあ、返り値がstructである場合も、返しているのは「値」だというのはわかるかい?
ここなんですよ。
この理屈なら構造体変数offsetPointにも値がないと説明がつかないですよね。
ならoffsetPointの値は何という話になりますよね。
0866デフォルトの名無しさん
2007/07/15(日) 10:54:48x, y の値の組み合わせだろ。
0867デフォルトの名無しさん
2007/07/15(日) 10:59:450868デフォルトの名無しさん
2007/07/15(日) 11:04:20>x, y の値の組み合わせだろ。
仮にx,yの組み合わせが返ってきたとしても、
そもそもその組み合わせである構造体offsetPointが通用するのは
関数SizeToPointの中だけでmain関数からは構造体としては見えないんじゃないんですか?
0869デフォルトの名無しさん
2007/07/15(日) 11:07:52変数 offsetPoint が通用するのは関数 SizeToPoint() の中だけだが、
その戻り値は違う。
0870デフォルトの名無しさん
2007/07/15(日) 11:09:01mainから見えてるのはoffsetPoint変数じゃない
Point構造体は見えてる
0871デフォルトの名無しさん
2007/07/15(日) 11:11:390872デフォルトの名無しさん
2007/07/15(日) 11:18:160873デフォルトの名無しさん
2007/07/15(日) 11:18:25>変数 offsetPoint が通用するのは関数 SizeToPoint() の中だけだが、
>その戻り値は違う。
>>870
>mainから見えてるのはoffsetPoint変数じゃない
>Point構造体は見えてる
>>871
>具体的にアドレス表示させて見ると違うってわかるかも
そうなんですか?
まぁ納得できました。
そういえば昔コンパイルされたプログラムの中では局所変数の名前の情報は失われる
って書いてあった本を読んだ事が有るような無いような。
0874デフォルトの名無しさん
2007/07/15(日) 11:31:35ですよねーw
0875デフォルトの名無しさん
2007/07/15(日) 11:37:08名前の情報とかいうのはイマイチずれてるな。
0876デフォルトの名無しさん
2007/07/15(日) 11:46:44良く分からなくてダメでした。
どうしてダメなんですか?
コンピューターの中のデータは全部メモリに格納されていて
アドレスがついているんじゃないんですか?
0877デフォルトの名無しさん
2007/07/15(日) 11:54:24Cの関数は「値」を返す、それだけ。
「値」、つまり1とか2とかに、アドレスがあるわけないだろ(厳密にはどこかに記録されているけど)。
0878デフォルトの名無しさん
2007/07/15(日) 11:56:06浮動小数や構造体なら、それぞれ別の「値」を持つだけ。
0879デフォルトの名無しさん
2007/07/15(日) 11:58:47で、もちろん、「実装としては一般的にどうする」というのはある。
構造体を返す場合は隠れた第一引数でアドレスを渡す、とか。
でも、そんな事は普通は気にするべきじゃない。
0880デフォルトの名無しさん
2007/07/15(日) 12:04:28offsetPoint.x = offsetPoint.x + width;
offsetPoint.y = offsetPoint.y + height;
return &offsetPoint;
}
int main (){
struct Point location = {100,100};
printf(
"rectangle\n\t"
"left= %d:top%d\n\t"
"right=%d:bottom=%d\n",
location.x,location.y,SizeToPoint(location,200,40)->x,SizeToPoint(location,200,40)->y
);
return 0;
}
逆に、問題になりそうなパターンを考えてみるとか
0881デフォルトの名無しさん
2007/07/15(日) 12:06:21・&演算子はオペランドとして左辺値式を要求する
・メンバ演算子はオペランドとして左辺値式を要求しない
ってだけだろ
0882881
2007/07/15(日) 12:09:55×・(C++の)参照を返す関数以外の関数呼び出しは右辺値式ではない
○・(C++の)参照を返す関数以外の関数呼び出しは左辺値式ではない
0883デフォルトの名無しさん
2007/07/15(日) 14:13:18Cでは、Javaのlengthメソッドのような、配列の長さを取得する手段はありますか?
0884デフォルトの名無しさん
2007/07/15(日) 14:21:580885883
2007/07/15(日) 14:28:33for文がかけなくて困ってました。
0886デフォルトの名無しさん
2007/07/15(日) 14:29:340887デフォルトの名無しさん
2007/07/15(日) 14:31:200888デフォルトの名無しさん
2007/07/15(日) 14:32:110889デフォルトの名無しさん
2007/07/15(日) 15:23:56Core 2 Duoはやっぱりもっさりだった スレの住人がニヤニヤしながら、お前を待ってるぞ。
今、住人はhttp://pc11.2ch.net/test/read.cgi/jisaku/1182676928/ に居る、早く来い。
0890デフォルトの名無しさん
2007/07/15(日) 16:22:43関数*SizeToPointの第一引数struct Point offsetPointはコピーなのに、
return &offsetPoint; としても問題ないんですか?
コピーは関数を抜けたら消えると思うんですけど
0891デフォルトの名無しさん
2007/07/15(日) 16:33:040892デフォルトの名無しさん
2007/07/15(日) 16:35:25問題あるよ。
コンパイルエラーにならないし、動いちゃうことも多いから気をつけるべき
0893デフォルトの名無しさん
2007/07/15(日) 22:00:10DLLを使いたいんですけど、()内に入ってます
0894デフォルトの名無しさん
2007/07/15(日) 22:05:31テンポラリオブジェクトのアドレスを取得できるね。
0895デフォルトの名無しさん
2007/07/15(日) 22:07:21とりあえず変数じゃない
0896デフォルトの名無しさん
2007/07/15(日) 22:08:34もの凄い勢いで typedef について調べるんだ
0897デフォルトの名無しさん
2007/07/15(日) 22:12:15HWND LPCSTR LPSTR DWORDが何なのかを教えてください。ペコリ、ペコリ
0898デフォルトの名無しさん
2007/07/15(日) 22:20:56ググれや。
0899デフォルトの名無しさん
2007/07/15(日) 22:21:56LPCSTR →NULL終端の変更不可な8ビット文字列へのポインタ(const char*)
LPSTR →NULL終端の8ビット文字列へのポインタ(char*)
DWORD →32ビット符号なし整数(unsigned int)
0900デフォルトの名無しさん
2007/07/15(日) 22:22:00typdefを知らないならこうしてるもんだとでも思え↓
#define LPCSTR char *
#define DWORD unsigned long
0901デフォルトの名無しさん
2007/07/15(日) 22:33:08なんで、そんなめんどくさい別名を付けてるんですか?
HWNDには本名ないのですか? 無いのにC言語で使えるって変じゃないですか?
0902デフォルトの名無しさん
2007/07/15(日) 22:41:15定義はincludeフォルダをgrepしろよ。
別名をつけるのは意味的に分かりやすくするためだよ。
いつもいつも素で書いてたら意味不明になってくるだろうが
0903デフォルトの名無しさん
2007/07/15(日) 22:50:39処理系依存の部分をラップして移植性を高めるため。
例えばintが何ビットかは(殆どが32ビットだが)仕様で定められているわけではない。
DWORDの場合などは実際の型を隠蔽することで32ビット値であることを保障してるわけだ。
これ以上はググれ。
0904デフォルトの名無しさん
2007/07/15(日) 22:51:590905デフォルトの名無しさん
2007/07/15(日) 23:19:47LPCSTR →NULL終端の変更不可な8ビット文字列へのポインタ(const char*)
LPSTR →NULL終端の8ビット文字列へのポインタ(char*)
DWORD →32ビット符号なし整数(unsigned int)
今のWinの場合は()の中が本体だけど、本体は将来変わる可能性あり、でも、
→から(の前の定義は変えないよということですね。
どうも、どうも。
0906デフォルトの名無しさん
2007/07/16(月) 00:41:190907デフォルトの名無しさん
2007/07/16(月) 00:56:52DECLARE_HANDLE (HINSTANCE)
#define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name
つまり
typedef struct HINSTANCE__ {
int unsed;
} HINSTANCE;
となるんだけど、なんのためにこんなことしてるの?
0908デフォルトの名無しさん
2007/07/16(月) 01:00:14HINSTANCE hi = ...
HDC hd = hi; // これをエラーにしたい。
0909デフォルトの名無しさん
2007/07/16(月) 01:04:45その場合、単純に
struct HINSTANCE__; typedef struct HINSTANCE__ *HINSTANCE;
じゃダメなんかな?
0910デフォルトの名無しさん
2007/07/16(月) 01:31:590911デフォルトの名無しさん
2007/07/16(月) 01:34:17VOID を typedef してる時代だからな。
0912デフォルトの名無しさん
2007/07/16(月) 01:34:340913デフォルトの名無しさん
2007/07/16(月) 01:35:07ポインタだけ使うから前方宣言だけで十分なのに構造体の定義まで
与えてるのが要らないってことだろ。
0914912
2007/07/16(月) 01:37:39typedef struct HINSTANCE__ *HINSTANCE;
0915910
2007/07/16(月) 01:51:59あとはもうサイズ合わせの用途くらいしか思いつかない
0916デフォルトの名無しさん
2007/07/16(月) 01:53:200917デフォルトの名無しさん
2007/07/16(月) 02:28:47他のところでは
0x70000000
と16進数が使われているのに
一部分だけ
0 << 28
と書いてあります。
どうして作者は
0<< 0x1c
としなかったのでしょうか?
0918デフォルトの名無しさん
2007/07/16(月) 02:30:54>>791
0919デフォルトの名無しさん
2007/07/16(月) 02:31:020920デフォルトの名無しさん
2007/07/16(月) 02:31:44>>792
0921デフォルトの名無しさん
2007/07/16(月) 02:32:13ビットシフトの右側の値は 16 進数にする理由がない。
0922デフォルトの名無しさん
2007/07/16(月) 03:07:53エラーにしたいのは、STRICTが定義されているときだけ。
だったはず。
0923デフォルトの名無しさん
2007/07/16(月) 03:13:36あるクラスオブジェクトをノードに持たせるか、
クラスオブジェクトに枝を持たせるかで悩んでいます。
定石があれば教えてください。
class A{
:
};
class Node{
A a;
長男を指す枝構造体へのポインタ;
:
}
とするか、
class Edge{
:
}
class A{
:
長男を指す枝クラス(Edge)へのポインタ
}
を迷っています。おかしなこと言ってないといいんだけど……。
0924デフォルトの名無しさん
2007/07/16(月) 03:19:22どっちでも同じことができるんだから、あとは本人以外に判別不能。好きにしろ。
0925デフォルトの名無しさん
2007/07/16(月) 03:27:59クラスオブジェクト自身が子ノードの情報を持つ必要があるなら枝を持たせる。
そうでなければノードに持たせる。
0926デフォルトの名無しさん
2007/07/16(月) 03:28:32オブジェクトとデータ構造はなるだけ分けたいから、自分なら前者かなぁ
0928デフォルトの名無しさん
2007/07/16(月) 05:54:580929デフォルトの名無しさん
2007/07/16(月) 06:35:190930デフォルトの名無しさん
2007/07/16(月) 06:58:32インスタンスとか
エンティティとか
ふさわしい表現があるだろ
0931デフォルトの名無しさん
2007/07/16(月) 08:46:32オブジェクトの方がいいような気がする。個人的には。
0932デフォルトの名無しさん
2007/07/16(月) 11:32:20ていうかオブジェクトという単語は意味が多すぎて
0933デフォルトの名無しさん
2007/07/16(月) 12:01:08>「オブジェクト」とほぼ同義語のように用いられることが多いが、
>実際にメモリ上に配置されたデータの集合という意味合いが強く、
>データの実体をより具体的・直接的に捕らえた用語である。
だそうだ
0934デフォルトの名無しさん
2007/07/16(月) 12:02:540935デフォルトの名無しさん
2007/07/16(月) 12:06:49Stroustrupの「プログラミング言語C++」の用語で言うと
前者が非侵入的リスト、後者が侵入的リストに相当するのかな。
どっちも設計としてはあり得る。
非侵入的リストは汎用的にするなら普通はstd::list<>のようなテンプレートに
なるだろうし、
侵入的リストの場合は、リンク部分を独立した型にして、それを包含させるか
継承するか、という形にするのが普通だとは思うが。
BSDのsys/queue.hのようなものはマクロをつかってCで侵入的リストを
実現している好例だ。
Windowsでも、winnt.hに似たような代物がある。
0936デフォルトの名無しさん
2007/07/16(月) 12:47:05ありがとうございました。
自分のプログラムと検討してみます。
0937デフォルトの名無しさん
2007/07/16(月) 15:23:54#include <windows.h>
typedef int (__stdcall *FNC)(const HWND , LPCSTR , LPSTR , const DWORD);
main(){
HMODULE hd = (HMODULE)LoadLibrary("UNZIP32.DLL");
if (hd== NULL) return 0;
FNC pf = (FNC)GetProcAddress(hd,"UnZip");
if (pf == NULL) return 0;
char c[]="aaa.zip",s[16];
(*pf)(NULL, c, s, sizeof(s));
FreeLibrary(hd);
}
0938デフォルトの名無しさん
2007/07/16(月) 15:24:590939デフォルトの名無しさん
2007/07/16(月) 16:01:36どうやら、解凍が終わるまで停止するようです
0940デフォルトの名無しさん
2007/07/16(月) 21:38:13既に存在していればそれを使いなければ追加したいんですが?
map とかの方がいいですか?
0941デフォルトの名無しさん
2007/07/16(月) 21:43:01日本語でおk。
えーと。エスパーしてみると、
君の言うようにstd::map<>やstd::set<>向きの仕事だと思う。
たぶんね。
0942デフォルトの名無しさん
2007/07/16(月) 21:56:43map<string, fstream> m;
m.insert (pair<string, fstream>("filename", fp));
とするとエラーになります
なぜでしょうか
0943デフォルトの名無しさん
2007/07/16(月) 21:59:36fstream fpoint[1000];
とやって多めに確保して地味にやっていきます・・・
0944デフォルトの名無しさん
2007/07/16(月) 22:01:26Vector・mapはだめ、リンクリストが最適だよ
0945デフォルトの名無しさん
2007/07/16(月) 22:02:59そりゃ、fstreamはコピーができないからだ
STLコンテナは要素がコピー可能であることを要求する
ポインタを使うんだね
0946デフォルトの名無しさん
2007/07/16(月) 22:06:49m.insert (pair<string, fstream*>(str, &fp));
でいいんでしょうか?
0947デフォルトの名無しさん
2007/07/16(月) 22:08:59それでもよいのだが、そうする場合はfpの寿命管理に気をつけろ。
出来ればナマのstd::fstream*ではなく、boost::shared_ptr<std::fstream>などを
使うのが良いだろう。
0948946
2007/07/16(月) 22:20:480949デフォルトの名無しさん
2007/07/16(月) 22:53:500950デフォルトの名無しさん
2007/07/16(月) 23:07:28原因はわかりますか??
出来るやつと出来ないやつがあります
空き容量は十分にあります
0951デフォルトの名無しさん
2007/07/16(月) 23:08:570952デフォルトの名無しさん
2007/07/16(月) 23:15:24成功するファイル名
AUDJPY-2002-03.txt
AUDJPY-2002-04.txt
CHFJPY-2002-03.txt
CHFJPY-2002-04.txt
失敗するファイル名
AUDJPY-2002-11.txt
AUDJPY-2003-03.txt
AUDJPY-2003-09.txt
CHFJPY-2002-11.txt
CHFJPY-2003-03.txt
CHFJPY-2003-09.txt
0953デフォルトの名無しさん
2007/07/16(月) 23:20:33地震きたー
0954デフォルトの名無しさん
2007/07/16(月) 23:39:40closeもopenもうまくいきません
0955デフォルトの名無しさん
2007/07/16(月) 23:40:20ソースうp
0956デフォルトの名無しさん
2007/07/17(火) 00:00:34質問です
システムのミキサーの音量設定をプログラムから調整するにはどんなAPIを使ったらいいんでしょうか?。どなたかお願いします。m(__)m
0957デフォルトの名無しさん
2007/07/17(火) 00:05:04さっくり無視するんだろうねえ
0958デフォルトの名無しさん
2007/07/17(火) 00:06:26APIスレ池
0959デフォルトの名無しさん
2007/07/17(火) 00:08:20普通に書けばうまくいくよ
君の書いたコードが悪い
0960デフォルトの名無しさん
2007/07/17(火) 00:17:31VC++8.0で日本語を含むファイルが開けないのなら、ロケールを設定汁
ウムラウトとかを含むファイルが開けないのなら、stdioやfstreamを
使うのは断念してCreateFileW()を使え
0961デフォルトの名無しさん
2007/07/17(火) 00:20:020963デフォルトの名無しさん
2007/07/17(火) 00:38:11なんでそんなに同時に開く必要がある?
よほど大きいファイルを扱うんでなければメモリ上で処理すれば良いだけだと思うんだけど
何かそれ以外の制約でもあるんか?
0964デフォルトの名無しさん
2007/07/17(火) 00:38:510965964
2007/07/17(火) 00:39:56すまん
0966デフォルトの名無しさん
2007/07/17(火) 00:46:42それを約1000個のファイルに種類分けしたいんです・・
でも、CreateFileつかったら48個以上いけました!!
1000個同時に開けるかは不明です・・
0967デフォルトの名無しさん
2007/07/17(火) 00:50:460968デフォルトの名無しさん
2007/07/17(火) 00:52:580969デフォルトの名無しさん
2007/07/17(火) 00:56:03CやC++の標準関数は安定してそうだけど実はwindowsXPの関数(API)の方が
いいんですかね??ってことですよ
windowsのユーザーは多いし、アップデートも頻繁だし
0970デフォルトの名無しさん
2007/07/17(火) 00:58:34安定してるとか、そういうことじゃないから。
C/C++ のライブラリ関数は OS の API を利用して作られている。
0971デフォルトの名無しさん
2007/07/17(火) 01:02:03ま、ケースバイケースだな。
標準関数は移植性が高いが、仕様が限定的で不便なこともある。出来ることも
限られている。
ファイルをあまり開けなかったりするのは、まあCランタイムの実装都合だな。
多分ファイル構造体配列をstaticに保持しており、その中の開きスロットを
見つけて使うような実装なんだろう。
一応FOPEN_MAXという定数が定められており、それを越えるファイルをstdioでは
同時に扱うことは保障されないと思っていい。
0972デフォルトの名無しさん
2007/07/17(火) 02:11:16それとも、本を買って調べるべきですか?
0973デフォルトの名無しさん
2007/07/17(火) 02:17:25こことか?
http://pc11.2ch.net/test/read.cgi/tech/1170343752/1-10
0974デフォルトの名無しさん
2007/07/17(火) 02:18:07const char a[] = "●○";
cout << char[1];
と出力させようとすると、おかしな表示になります。
日本語 出力
const wchar_t a = L"●○";
wcout.imbue( locale("japanese") );
wcout << char[1];
としても駄目です。どうすれば良いでしょうか?
0975デフォルトの名無しさん
2007/07/17(火) 02:19:32a[1]だorz
0976974
2007/07/17(火) 02:58:20char *a[] = {"●","○"};
cout << a[1];
としたらできました。
ポインタで指定した文字列なら、普通に出力できる??? なんでだ。
0977デフォルトの名無しさん
2007/07/17(火) 03:03:56マルチバイト文字列だから。
0978デフォルトの名無しさん
2007/07/17(火) 18:58:35アセンブラに翻訳してwindowsの機能は使わずcpuの機能を使っているのかとおもいました
0979デフォルトの名無しさん
2007/07/17(火) 19:12:300980デフォルトの名無しさん
2007/07/17(火) 19:18:090981デフォルトの名無しさん
2007/07/17(火) 22:13:50int main (){
int i = 0xFFF, i1;
unsigned char *ch = (char *)&i;
i1 = *ch;
printf ("i1=%X¥n",i1);
return;
}
このi1の値が0xFFになるはずなのですが、
0にしかなりません。
どうしてでしょうか?
0982デフォルトの名無しさん
2007/07/17(火) 22:19:36>このi1の値が0xFFになるはずなのですが
そんなこと決まってないよ。環境依存。環境は?
0983デフォルトの名無しさん
2007/07/17(火) 22:20:13この辺で何か変なことが起こってるんじゃないかと想像
unsigned char *ch = (unsigned char *)&i;
にしたらどうなる?
0984デフォルトの名無しさん
2007/07/17(火) 22:22:010985デフォルトの名無しさん
2007/07/17(火) 22:22:16実はビッグエンディアンとか
環境はなに?
0986デフォルトの名無しさん
2007/07/17(火) 22:26:41> unsigned char *ch = (char *)&i;
ではコンパイルできないんですが@VC2005
>unsigned char *ch = (unsigned char *)&i;
ならちゃんとコンパイルでき結果もFFになりますが…
0987デフォルトの名無しさん
2007/07/17(火) 22:28:34どーせ拡張子がcppというオチ
0988デフォルトの名無しさん
2007/07/17(火) 22:28:59MacでPower PCだからならないのか。
Power PCってビックエンディアンだから。
すいませんでした。
0989デフォルトの名無しさん
2007/07/17(火) 22:30:27書き込み環境としても珍しくない?
0990デフォルトの名無しさん
2007/07/17(火) 22:57:06STLやらBOOSTやらがやりたいです。
0991デフォルトの名無しさん
2007/07/17(火) 22:58:23よかったね^^
0992デフォルトの名無しさん
2007/07/17(火) 23:04:580993デフォルトの名無しさん
2007/07/17(火) 23:08:250994デフォルトの名無しさん
2007/07/17(火) 23:13:380995デフォルトの名無しさん
2007/07/17(火) 23:19:55引数の「文字」が、'0' - '9'の範囲にあれば真。
12とか0.34がこの範囲に入るコードは見たことがないな。
0996デフォルトの名無しさん
2007/07/17(火) 23:31:35それがやりたいなら、こんな感じかなぁ
bool is_digit(int x) {return false; }
bool is_digit(float x) {return true; }
bool is_digit(double x) {return true; }
...
boostのtype_traitsにもっといいのがあるよ。
0997デフォルトの名無しさん
2007/07/17(火) 23:37:550998デフォルトの名無しさん
2007/07/17(火) 23:39:27>>996
>>992のチェックしたいのは型でなく文字列じゃないか?
0999デフォルトの名無しさん
2007/07/17(火) 23:47:411000デフォルトの名無しさん
2007/07/17(火) 23:51:29Cが復権!!
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。