【初心者歓迎】C/C++室 Ver.39【環境依存OK】
1 :
デフォルトの名無しさん :
2007/06/25(月) 12:01:46
3 :
ちんこ :2007/06/25(月) 12:33:43
乙
チン腰ね
5 :
デフォルトの名無しさん :2007/06/25(月) 13:26:07
/ / / ヽ ヽ /^ 7 / // i /| .ト、 !ハ . ,′// }. |ハト、{ヽ! ヽ! ヽト/ハ ! ! 三 | / / | ハ ,=、 =、 ☆ | | _| / ミ /ノ,, ,, ___ ,, | ! j| \ /三L」 ミ / 二コ、ヽ . _ .ノ ,イ / . ′ X/ .| | ミ / xく | > ┬ イリ. / / // \ | |__ / .!斗―/.! / ./ /__{ .{_ __ / ̄ヽj 从| トイヽ_/{ { ∧  ̄_ {___人 / /` .。ノ ___ \ //∨ } \< / ′ ※亠‐┐ 〉 //ミ ノ_人 \{ { j!| }|/!
6 :
デフォルトの名無しさん :2007/06/25(月) 15:08:41
C言語 XP Borland C++ Compiler 5.5 ファイルから別のファイルに内容をコピーする場合 コピー元のファイルを開いて中身を配列に格納してコピー元のファイルを閉じ、 コピー先をファイルを開いて配列に格納した内容をコピー先に送ってコピー先のファイルを閉じる ってやり方でOKでしょうか? それともコピー元とコピー先のファイルを一緒に開いて直接コピーする事は可能ですか?
同時にオープンしてても大丈夫
>>6 と言うかメモリに収まりきらない巨大なファイルをコピーする場合は
同時にオープンするしかないでしょ。
seekg()とかでちょっとずつコピーする事もできるけど現実的じゃないし。
9 :
デフォルトの名無しさん :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);
fclose()も忘れずにな それから"a"で開いてるのはどうして?
>>9 ・引数の数チェック汁
・fgetc()はgetc()と機能は同じだがfgetc()のほうが速いことはまずない
fputc()も同様
まぁどっちもファイルコピーに使うには遅すぎだが
・つかファイルをコピーしたいんならバイナリで開け
・開けなかった時はperror()を使うと処理系定義のエラーメッセージを出してくれる
12 :
デフォルトの名無しさん :2007/06/25(月) 15:46:45
>>10 w+ に変更しますた
>>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;
}
- if(argc != 2){ + if (argc != 3) { それと while((ch = fgetc(fp2)) != EOF) putchar(ch); の前に rewind(fp2); 入れろ
windows、C++Builderです。 バックアップソフトを作りたいと思ってます。 フォルダの中身を、違うパーティションにコピーするだけです。 ’曜日’と’時間’だけ、タイムテーブルのようなものに 記録しておいて、時間が来たらコピーする。ということを 永久に繰り返します。 月曜日は、5:00と13:00と18時 火曜日は、5:00 水曜日は、3:00 ・・・ など、曜日によって回数も様々です。 どういう仕組みを使うのが、良いでしょうか? time_t current; time(¤t); で、1秒ごとに時刻を取得して比較してたら 大変ですよね。
基本的にはタイマー設定すると思うけど。
>>15 1.次のバックアップまでの時間に応じてチェックする間隔を変更する(時間に応じて2時間、30分、5分、1分のように)
2.Windows付属のスケジューラを使う
3.多少の誤差は気にせず指定時間までSleep
18 :
デフォルトの名無しさん :2007/06/25(月) 16:27:43
RHEL3環境で、gcc(ver 2.95.3であると思われます) c++で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型を出力する方法はないでしょうか? 教えてください。
>>18 つ str[i].c_str()
つか、君の読んでる本には載ってないのか?
20 :
デフォルトの名無しさん :2007/06/25(月) 16:32:52
>>18 です。
追記です。
出力に●や彡を出力したいので、charではうまくいかず、
stringを使っています。
%sがchar*だからstringの出力ができないと思うのですが、
%sの代わりの変換指定子が分かりません。
お願いします。
21 :
デフォルトの名無しさん :2007/06/25(月) 16:34:39
>>18 です。
>>19 さんの書き込み見る前に
>>20 を書き込んでしまいました。
今試して見ます。
ありがとうございます。
>>18 - string str[2]
+ string str[3];
>>20 >>19 を嫁
c_str()はconst char*を返すから%sでいい
23 :
デフォルトの名無しさん :2007/06/25(月) 16:38:53
文字列の表示に変換指定子の「%s」を使っての ひらがな、カタカナ、漢字などの全角文字の表示に問題なかったのですが 実際は半角英数字以外使ってはいけないとかあるのでしょうか? 初心者向けの書籍だとみな半角の英語を使って説明されているので 全角文字でも問題がないのかどうか判断に困っています。
試してOKだったけど、どうなの?って話だろうに。
>>23 char* なら、ASCII だろうと多バイト文字列だろうと問題ナス。
>>12 その場合
char ch;
は間違い。
int ch;
にすべし。
27 :
24 :2007/06/25(月) 17:03:40
ああ、「問題なかった」と言ってるんだから「試せ」も糞も無いな ごめん 実際には ・その特定のエンコーディングのソースをコンパイラが処理できるか ・実際に表示(端末に出力)した際に、その特定のエンコーディングの文字列を 端末が表示できるか といった問題が関係してくる まあ日本語に対応したOSや端末で、日本語に対応したコンパイラを使っている 分には通常問題が無いが、 例えばEUC-JPやISO-2022-JPやUTF-8なソースをVC++は食えない 最近のgccは-finput-charsetだの-fexec-charsetだのを適切に指定することで 多国語に対応する
28 :
デフォルトの名無しさん :2007/06/25(月) 17:07:16
>>18 です。
>>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*を入れているのでいけると思ったのですが。
これはなぜでしょうか?
>>28 >>22 で指摘したのに……
配列str[]のサイズは2ではなく3にしろ
なんでダメかというと char*にconst char *はそのままでは代入できないからだ const char *s[3]; とするか(こっちが推奨)、 s[0] = const_cast<char*>(str[0].c_str()); とでも汁(こっちは非推奨)
31 :
デフォルトの名無しさん :2007/06/25(月) 17:11:53
>>29 さん
すみません、これは単純な書きミスでした。
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();
としてます。
33 :
デフォルトの名無しさん :2007/06/25(月) 17:17:48
>>30 さん
ありがとうございます。
やってみたらできました。
みなさんありがとうございました。
# 書き込む前に新しいレスがあるかリロードでチェックしなくてはいけませんね。
# 何か自分が書き込むタイミングが一歩遅いようで。申し訳ないです。
>>32 char *s = "hello";
と犯罪性は同じだと思うけど。
でもこれは合法だしな未だに。
35 :
23 :2007/06/25(月) 17:20:24
>>25 >>27 詳しい説明ありがとうございます、
助かるとともに勉強になります。
>>36 〃〃∩ _, ,_
⊂⌒( `Д´) < ヤダヤダ!
`ヽ_つ ⊂ノ
ジタバタ
main で catch(...) ってどう思います? 例外がキャッチされなかった場合、 デストラクタが実行されるかどうかは未定義で、 実際 g++ だと実行されなかったりします。 それを考えると、main で catch(...) しといた方が 安全なのかな・・・とか思うのですが。
#include<stdio.h> #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」となってしまいます。 どこがおかしいのでしょうか。 よろしくお願いします。
>>39 マンドクセーからちゃんと読んでないが
> i=sizeof(p);
sizeof(p)はポインタpのサイズ(4とか)が分かるだけだ。
pが指してる文字列の長さを測りたいのなら、strlen()を使え。
sizeof(p) → strlen(p) s-(i-1) → s-i exit(1); が凄い気になるが・・・。 NULL 返したのでいいんじゃないかな。 for 使ってないあたりも読みづらい。
それ以外にもバグはあるけど、 まあそれは自分で確認してくれ。
環境はC++です 今日自分の作ったサブルーティンを上司がチェックしたみたいなんですが この構造体はインパラメータだから値渡しにしろ と言ってきました。 サブルーティンの引数に構造体を渡すときに値渡しって使いますか? このサブルーティンで使っている構造体のサイズは決して小さくはありませんし、 自分的には構造体のサイズが小さくても値渡しは使わないと思っていたので ちょっと衝撃的でした。
場合による
>>44 const参照渡しをしててそう言われたんなら上司を鼻で笑ってやれ
constのつかないポインタ渡しでもしてたんなら君も悪い
つうか値渡しでどうやって受け取るんだ
48 :
47 :2007/06/25(月) 21:48:37
あぁ読み込みパラメータね 勘違いした ごめんよ
const ポインタ渡しするのが普通だな。 小さい構造体の場合は別な事もあるけど、 まあ場合によるな。
50 :
44 :2007/06/25(月) 22:21:39
>>46 上司を鼻で笑ってやったら首になりました。
貰ってやって下さい。
>>50 うちに来い。Cだが、ひどいデスマも無い。
残業代は0だけど・・・
>>16-17 15です。
曜日、時間でのバックアップの件でしたが、
お礼遅れてすみません。sleepで行きます。
ありがとうございました。
あ、C++ だったか。 大きな構造体って時点で C かと思ってしまってた。
C++です。 struct S { int a; int b; int c; }; という定義の構造体があったとして、 S s = {0}; と書いた場合、b と c が 0 になることは保証されますか?
されます。
8.5.1p7 に書いてあるね。 int() すなわち 0 で初期化される。
C++Builderです。 builderのウィンドウで、タブ(Astandard,Additional,Win32,System,,,) ってありますが、こういうことする場合は、どんな部品を 使用すればよいでしょうか?
61 :
60 :2007/06/26(火) 01:03:49
タブをクリックしたら、なにか表示させたり、 追加、削除もしたいんです。 よろしくお願いします。
>>38 あんたの思ってるとおり、しといたほうが安全だよ。
その前に std::exception は別でキャッチしてエラー表示してね。
変な状態のままデストラクタが呼ばれたら、 それはそれで危険という気もしなくもない。 どっちがいいのかね?
例外と言えば、例外指定って使ってる? 俺は使ってない。
正常にインスタンスができたかどうかフラグ持っておけばいいんじゃないか
まあ、たとえ例外が起きても メンバ変数が変にならないように気をつけるべきということで、 キャッチされても問題ないように作るべき、なのかな?
最適化の問題で使わない方がいいという話もあるのか。なるほど。
標準ライブラリで std::exception::what だけ例外的に例外指定を持ってるのは、 catch 中で別の例外起こされたら面倒だからかな?
>>67 確かに健全な関係ではないけど、
無視できないんだよなあ。
例外指定を普通使わない以上、
どの関数がどんな例外を投げるか
パッと見分からないことも多いし、
思わぬ例外を投げられたらそれは
ミステリアスな攻撃と思われてもしゃーない気がするよ。
全ての関数が例外を投げる可能性があるって感覚で
プログラムを組むのがいいのかね。
>>71 安全側に倒すという意味で、そう思ってかかってもいいだろう。
思わぬ例外を投げられてもきちんと動作するように書くべきだし、
極力そう書くことができるように言語や標準ライブラリが整備されている。
>>70 標準ライブラリの中でも throw() はいろんな関数についてるよ。
型付で指定してるのはグローバルな operator new () ぐらいかな?
>>73 あ、そうなんだ。
std::exception::what はオーバーライドすることがあるから
目立つってだけのことか。
>>72 Joel タンが例外嫌いなのも、そのあたりが気持ち悪いからなんだろうな。
でも、標準ライブラリやキーワードが例外投げる以上、
無視するわけにもいかないと思うんだけどね・・・。
>>75 あの話は戻り値についてもいっしょだろ。
ただ単に戻り値でのチェックに慣れているから、
戻り値をチェックしていないコードのほうが見つけやすいって話。
例外に慣れてしまえば、例外安全でないコードは同じぐらい
簡単に見つけられる。ただし現状では、↑の理由で他の人に
伝わらないことが多い。
敢えて言い切ってみたけど、ホントのところはちょっと自信が無い。
新しい言語をデザインするなら、 try ブロックじゃなくって
nothrow ブロックを作ればいいんじゃないかと思う。
「オレはここでは例外が飛ばないと仮定して書くぜ」っていう
ブロックね。
どうなんかねえ。 例外をうっかり無視するコードより、 戻り値をうっかり無視するコードの方が危険性は高いと 個人的には思うんだけど。
つーかC++の例外が糞で使いにくいだけ
例外は「うっかり無視」できないのがいいんだよ。
そうそう。
例外は戻り値と違って発生源や内容の概要が簡単に特定できるから エラー→復旧っていう処理に使いやすい エラーしたら即一連の処理を中断するだけなら戻り値でもいいけど エラー内容によってstrategyパターンを使って処理を色々と変えるなら 例外の方がやりやすい と思ったんだけどどうかな? 軽く試してみてちょっと良いかもって思っただけで使い続けられるとは限らないけど
std::fstream のコンストラクタに渡すファイル(パス)文字列って、 ネイティブなフォーマットのものなの?それとも POSIX 準拠じゃなきゃいけない?たとえば UNIX では /home/hoge/test.txt で Windows では C:\home\hoge\test.txt ? どういうフォーマットのパス文字列を取りうるかに関する 規約って定められてるの??
POSIX かんけーねー。 処理系で好きに決めりゃいいべさ。
そうか・・・標準の C++ のライブラリではそこまでは 決められていないんだね。 boost::filesystem では native/ portable が厳密に切り分けられていたので、 fopen や fstream でもそうなってるのかと思った。
>>82 const char*なのが困り物
たとえばVC++8.0ではlocale依存の方法でUTF-16に変換する
それ以前ではコードページ依存の方法でUTF-16に変換する
いずれにせよ、NTFSのUTF-16なパスを正しく扱えるとは言いがたい
UTF-16なパス名をちゃんと扱いたければ、fstreamを捨てて
カスタムのストリームバッファを作れという話になるだろう
86 :
デフォルトの名無しさん :2007/06/26(火) 21:17:53
ofstreamやifstreamでファイルを開くとき、 ios::binary指定というのは、意味があるのでしょうか? コンパイラはg++です。 いままでとくに指定してもしなくても結果は同じになりました。
>>86 UNIX系は関係ない。
WIndowsはstd::endlや\nを書き込むと0x0d0x0aになって書き込まれ
読むときは0x0d0aが0x0aになる。
88 :
デフォルトの名無しさん :2007/06/26(火) 21:26:02
ios::binaryしない奴は死ねっていつも思う。
>>86 テキストファイルを特別扱いする(というよりC++としては特別扱いしなければならない)環境も結構ある
有名どころではDOS/Windows系のテキストファイルでは改行コードがCR+LFになっていることが挙げられる
そういう環境では、テキストファイル特有の処理を行わせたくないときに、バイナリモードを指定する必要がある
逆にUnix関係では大抵違いがないが、移植性向上のために必要に応じバイナリモードを意識的に使うのは良いことだ
Unixとかでもワイド文字ストリームなら、文字コード変換をどうするかで
テキストモードとバイナリモードの違いが表れるはず
90 :
デフォルトの名無しさん :2007/06/26(火) 23:37:20
while(!feof(fp1)){ ch = fgetc(fp1) if(!feof(fp1) fputc(ch,temp); } ファイルの中身を別のファイルにコピーする場合の例題に書かれていたコードなんですが whileの式で(!feof(fp1))と記述されているにもかかわらず何故さらにif(!feof(fp1)と書いているのは何故なんでしょうか? 何か意味があるんですか? whileの式でファイルの末端にきたらループ終了なのでifの式は必要ないように思えるんですが
>>90 意味以前にその例題、コンパイルできるか?
>>90 fgetc()で読みに行ってみないとEOFだとわからんことがあるから。
その場合、whileの条件式の時点ではEOFではないと判断して
読みに行ってみたらEOFだった(読めませんでした)というカタチになるので
下のチェックが要る。
だがこんなのは糞コード。
while ((ch = getc(fp)) != EOF) putc(ch, temp);
とするがよい。
>>94 int型と比較した時、EOFと同じ値のバイトが存在する可能性があるから
とても初歩的な質問ですが short i; long k; float f; double d; としたときに @ (f+15)/(long)(d-15) A k+20.0 B (int)d/i の型(double,longなど…)はどうなるでしょうか? こういう場合は計算式の中でもっとも高精度な変数の型になると理解すればいいのでしょうか?
>>95 あ、chがcharだと仮定しているわけね。
それならば、単にint chと宣言して
>>92 のコードで良い。
というかgetc()の戻り値をcharで受け取る奴がアホ
C++でのバイナリファイルの読み書きは、ifstreamのreadとか、ofstreamのwriteを使うんですよね。 気になったのは、どちらも char * を指定するところです。freadは void * だったと思うんですが。。。 ifs.read(reinterpret_cast<char *>(&hoge), sizeof(unsigned)); という感じで、毎回キャストしないといけないんですか?
>>100 残念ながらキャストが必要。
毎回キャストするのが嫌なら、適当な関数で包め。
別にfread使っても一向にかまわないわけだし。 適材適所。
freadはvoid*の代わりに、サイズと数の2つを指定するだろう
fread()/fwrite()は(Unixの)read()/write()のインタフェース 真似れば良かったのにな
105 :
デフォルトの名無しさん :2007/06/27(水) 10:16:53
データがBIG ENDIANかLITTLE ENDIANのどちらかで 単純に&hogeで受け取れない場合もあるし。 つまり、CPUとデータの並びが逆の場合。 今回みたいに並びが合ってるのなら、union使えばいいんじゃないか?
ネットワークを跨ぐとか、別PCでもそのファイルを r/w するのならエンディアン気にするけど… たかだか、同じPC内で完結するのならそのまま保存するよね?
そりゃファイル仕様に因るべさ。
ああ、先にファイル仕様があって(当然エンディアンも明示されてて)それを 読む→(なんかする)→(書く) なら、それに従うしかないね。
109 :
デフォルトの名無しさん :2007/06/27(水) 12:14:06
>>87-89 なるほど、ではテキストでないときには、
ios::binaryを付けるようにします。
110 :
デフォルトの名無しさん :2007/06/27(水) 14:39:49
基底クラスのポインタを継承クラスの動的配列でオーバーライドすることはできませんか? class 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
111 :
110 :2007/06/27(水) 15:02:56
オーバーライドの意味間違ってますね。 何と呼んで良いのか分からないですが、領域確保? とにかくnewするという意味です。
無理するなら↓ ((Deriv *)((char *)test + sizeof(Deriv) * i))->show(); もしくは↓ ((Deriv *)test)[i].show();
114 :
110 :2007/06/27(水) 15:51:45
>>112 ,113
ありがとうございます。
なんとなく分かりました。
new Deriv[num]が失敗してるのではなく、
forループのなかでのindexの指定が間違ってるということですね。
*testがBase型のポインタなので
test[i]はtest[0]からBaseを基準にアドレスを進めることになるのか。
>>113 さんの方法で動きましたけど、
そもそもこういう状況が必要になる設計はまずいでしょうか?
>>114 一般的にはまずい。
でも、テンプレートを使って下のようにやればできないことはない。
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_;
...
};
基底クラスへのポインタの配列を作って、
それぞれに対してまたオブジェクトを作っていくのが、
まあ一番安全なのかね。
メモリ管理が複雑になるという点では、
安全とは言えんかもしれんが。
>>115 はちょっと感動したよ。
下記を左側の数字のキー値で、ソートしたいです。 (8,x),(2,y),(3,z)・・・ ソートして、 (2,y),(3,z),(8,x)・・・ を出力。(int,std::string)の形です。 どういうデータで扱って、どのような方法がよいでしょうか。 mapとか自動でソートされるみたいですが、 自分で比較して並べ替えたいです。 よろしくお願いします。
int, std::string をメンバに持つ構造体の配列? それなら構造体で < 演算子をオーバーロードするか 比較関数を定義するかすれば std::sort でソートできるけど。
訂正お願いします。
×キー値で、ソート
○キーでソート
>>118 ごめんなさい。
「(int,std::string)」
これは、余計でした。(数字,文字列) なんです。
どのデータに入れて、どんな風に処理するのか知りたいです。
>>119 std::vectorに、キーを入れてソートするんでしょうか?
対応する値は、どうやって対応させて出力を。。。
何がしたいのかよく分からない。 int 値はキーで、std::string はキーに対応する値? std::map を使うのがベストだと思うけど、 std::map を使わない理由は何かあるの?
>>117 とりあえず、すんごい単純で愚直な方法。
#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;
}
>>121 (数字,文字列),,,,
をキーでソートするんですが、どんなデータに格納して
どんな処理をするのか知りたかったんです。
>>122 プログラムも、書いていただきありがとうございます。
数分しかたってないのに。(汗
中身がstd::pairのstd::vectorですか。
typedefの使い方もすごい勉強になります。
ありがとうございました。
125 :
119 :2007/06/27(水) 19:10:32
ちっ、プログラムを書いてみたけどstd::pairとstructの違いだけで殆ど同じだから貼るのやめよ。
>>124 (数字,文字列) 全体がキーなの?
じゃ、それに対応する値もあるの?
それとも set みたいにキー=値なの?
そして、数字が同じ時には文字列も比較するの?
と、質問攻めになってしまった。
結局ポインタって何に使うんですか? 違った名前の変数で同じ値を参照できるってことですか? でも同じアドレスの値を参照するだけならわざわざポインタの方の変数を作る必要は無い気が・・・・ ていうかそもそもいろんなソースコードを見ててもポインタを使ってるのはあまり見かけませんが・・・・
>>127 C はポインタが無ければ配列も関数に渡せない言語です。
ポインタ使いまくりw ポインタを理解していないみたいだが君も知らない内に使ってるよ
ポインタより似たような文法上の特徴を持つC++のイテレータの方から覚えた方がいいかもね 概念としては似たようなもんだし、イテレータ理解できるならポインタも理解できるようになるか どうしてもポインタが駄目ならC++でイテレータから入るのも十分ありだよ
ポインタの概念を理解できないレベルでイテレータを理解できるか疑問
イテレータ自体がデータをポインタライクに扱うようなもんだしなぁ
ポインタのノリでイテレータが使うとそれはそれでバグの元に・・・
アドレスがどうのという話が無いぶんイテレータの方が簡単だと思うな 概念的な話より、何が出来るかの方が理解しやすいだろう
抽象概念を理解できない香具師にはどっちみち理解できない罠。
ポインタがわからない→Javaへ行く Javaのダメプログラマがまた一人。
>>127 a = 5; /* aに対応する箱に5を入れる */
b = a; /* bに対応する箱に、aに対応する箱から取り出した値を入れる */
おんなじaでも式の右辺と左辺ではぜんぜん意味が違うのだが、それを理解してるかな?
物を入れるには箱が必要で、Cで箱そのものを値として取り回すための
仕掛けがポインタだ。
どういう時に必要になるかはいずれ分かる。
Cでのポインタの必要性が特に大きいのは、配列や左辺値を渡す手段が 他に存在しないから。関数は全部値渡しだし。 参照渡しが存在するならポインタの必要性は大分減るが、リストや木のような 配列より複雑なデータ構造を扱うようになれば、ポインタの有用性が自然に 理解できるだろう。
>>127 関数とのデータ受け渡し時に構造体とかそのまま実体渡すとコピーされるのでメモリの無駄だし速度的にもデメリットがある
それに不定なサイズのデータを扱おうと思ったらポインタ使うと思うが。
141 :
デフォルトの名無しさん :2007/06/28(木) 14:42:29
vc++2005で警告レベルを/W4にした時、 stlのアルゴリズム使って代入処理とかイテレータを用いたコンテナの初期化とかすると > xutility(1685) : warning C4244: '+=' : '__int64' から '__w64 unsigned int' への変換です。 > データが失われる可能性があります。 とかコンパイラ様が仰られて出力窓がカオスになって困るのでこれをどうにかしたい訳ですが こういうのは#includeディレクティブの羅列全体に(つまりxutilityを使ってるライブラリ全体を) #pragma warning(disable:4244)と #pragma warning(default:4244)やpush, pop使って抑制を適用しちゃっていいんでしょうか? 一応、ライブラリ以外の部分ではちゃんと/W4で警告が行われますし問題ないと思うんですが なんか良い解決法ってございませんかね?
>>141 __w64 は 64 ビットにするんじゃなくて、
32 ビット環境でコンパイルする時にも
もし 64 ビットにしたとしても整合性が取れるかチェックするだけ。
つまり、__w64 unsigned int は 32 ビット環境では 32 ビット符号無し整数型になる。
__int64 は 64 ビット符号付き整数型だから、
そこから 32 ビット符号無し整数型への暗黙変換で警告が出るのは当たり前。
それで本当に大丈夫なのかをまず確認した方がいい。
boost::serialization ってクロスプラットフォームで 使ってもおk?つまりできたファイルはプラットフォームを またいで移動してもおk?たとえば endian の異なる プラットフォームに持っていっても安全?
>>142 なるほど、助言をヒントに
使用するされているイテレータの差の型にsize_tを指定して定義すればあっさりと消えました
どうもです><
>>144 > イテレータの差の型
difference_typeのことならstd::size_tよりも
符号付のstd::ptrdiff_tのほうがいい。
it = begin();
it2 = begin();
++it2;
このときit2 - itは1になるはずで、it - it2は-1になるべきだから。
>>143 あれの出力形式にはいろいろあって、
バイナリは知らないけど、xmlなら間違いなくできる。
147 :
デフォルトの名無しさん :2007/06/28(木) 17:51:43
API の話ではないが、質問していいですか。 _tprintf(_T("あいう")); とするとコンソールに正常に表示されないのですが、 どのようにしたら正常に表示できるでしょうか?
148 :
デフォルトの名無しさん :2007/06/28(木) 18:00:43
setlocale(LC_ALL, ""); でできた。
イテレータの差ならiterator_traits<hoge_iterator>::difference_typeだろ。
板違いで流れてきましたw 01011010みたいに 日付が4桁4桁になってる 8桁の数字一覧の出力方法教えてください
>>128-140 関数内で宣言した変数はほかへは渡せないから、同じ中身を参照できるポインタを使って
ほかの関数内でも関数内で変更した変数を渡せるようにするのがポインタですか?
自分で書いててわけがわからない文だな・・・・
とりあえずまだまだ自分は未熟なのがわかったのでまた最初から勉強しなおします!
>>150 それは、西暦101年10月10日か、01年1月10日10時なのか、1月1日10時10分なのか、101日目、10時10分なのか、
或いはそれ以外の表現なの?
そもそも一覧とはなんなの?
お客様の中にESP能力者の方は・・
%04d%02d%02d
同じ内容の関数を、マルチスレッドで動かして ログファイルに処理内容を、追加書き込みで 書き出してます。 std::ofstream ofs( FileName.c_str(), std::ios::out|std::ios::app); ofs << message; 結構、同じタイミングで書き込むときあると思うのですが、 排他処理したほうがいいでしょうか? そもそも"ファイルが壊れる"っていうのは、どんな壊れ方があるのでしょうか? 真っ白になっちゃうのか、混ぜこぜで書き込みされる。などですか?
>>155 混ざります。しかも、通常バッファリングされるので行の途中でもお構いなしに混ざることになります。
運が悪いと、書き込んだ筈の分がロストしたり以前の分がロストしたりするかもしれません。
俺の認識な。 ファイルが壊れる = ファイルアクセスに失敗してしまう。 居るように見えて実体が居なかったりする等 マルチスレッドのロギングで、同期取ってない場合 出力が途中で差し込まれたようなデータ列になる等、意図してないフォーマットで出力されてしまう
>>156 混ざるのは、構わないと思ってたのですが
無くなるときもあるんですか。
じゃあ、ファイルロックとかで、ロックするようにします。
ありがとうございました。
>>157 ふむふむです。勉強になります。
ありがとうございます。
>>157 もみもみです。あぁ〜ん♪
感じちゃう?
>>155 使っているlibc++がマルチスレッド対応してるなら(今時なら普通してると思うが)
istream/ostreamの関数呼び出しの単位で排他してくれてるはずだ。
つまり、例えばあるスレッドでoperator<<()が呼ばれた場合、その間は
streambufがロックされるので、streambufの内部状態が壊されることが無い。
ヘルプなどのドキュメントに明記されていないなら、ソースを読むんだね。
ただ、排他はあくまで関数呼び出し単位なので、例えば
ofs << n << ":" << s << endl;
のようなことをやっているコードでは、operator<<()が4回呼ばれている間に
他のスレッドからの出力が割り込む可能性は当然あって、その場合は
出力がぐじゃぐじゃになる。
それを避けたければ、常に1行単位で出力関数を呼ぶようにするとよいだろう。
無論自前で排他をするという手もあるが。
バッファリングはどーなのよ
>>162 バッファリングを管理しているのはstreambufで、これがstdioのFILEの対応物。
i/ostreamはstreambufへのポインタを保持しており、排他はstreambuf自体を
ロックするような形でやっていることが多いはずだ。
つかソース嫁よ。
結局スレッドセーフなカスタムストリームを実装するしか無いなね…orz
無いなね
OTL
>>163 別に聞いたわけじゃない。
>>161 のように排他してもバッファリングしてたら意味無いだろ、と
アンダーバーで始まる関数 _stprintf_s みたいにアンダーバーで始まる関数があるのですが、 アンダーバーで始まる関数には何がしの意味があってアンダーバーをつけてるのですか? たとえば、MSによって拡張されたことを示すために付けられたとか
バッファへの操作込みで排他処理されてるんじゃないのか?
って前の _ か 標準じゃないやつにつけるべ
MS は独自の拡張関数に _ つけるよね。
>>168 アンダーバーから始まる名前は処理系のために予約されている
と規格で決められている
>>169 バッファリングされる場合、実際にファイルに書き出されるのはどのタイミングか判って言ってる?
それが何か関係あるの?
バッファ単位での実書き出し最中に、別スレッド側のバッファ操作はどうなるか
失敗するー だから入出力関数の戻り値は常にチェックしてけって話ですか?
同じバッファ使って操作するわけじゃなくて、 別々のバッファで操作しようとしてるの?
そりゃ別スレッドなんだからバッファは違うだろう
同じファイルに追記するだけなら、 別スレッドで同じオブジェクトを共有して 操作したんでいいんじゃないの?
OS管理下のファイル本体 ↑↓ OS管理下のバッファ ↑↓ ライブラリ管理下のバッファ なんとなくライブラリ管理下のバッファの排他がかかってればうまくいきそうだが…
スレッドセーフ版のライブラリを名乗るからには そうなってんじゃないの?
>>167 バッファリングされていようが、何の問題もないよ。
脳内の想像でいい加減なことを言っていないで、ソースを読むかせめて
実験したらどう?
>>172 _snprintf() と snprintf() の挙動の違いにしょんぼりした。
今のgnustdc++ってMT safeなんかな? VC++だと、basic_ostream<>::sentryを利用して排他制御をやってるんだが、 3.4.4ぐらいのgccだと、何もやってないように見えるな。
もしかして
>>167 は、同じostreamオブジェクトに複数スレッドから
書き込むのではなく、
同じファイルに複数スレッドから別々のostreamオブジェクト経由で書き込むという
状況を想定してたのか?
無論、その場合はostream内部で排他制御しても何の意味も無いぞ。
>>186 >同じファイルに複数スレッドから別々のostreamオブジェクト経由で書き込む
こっちのほうが複雑な排他制御になりそうだな…
ログ出力のように行レベルではアトミックであって欲しい&必ず追加書きって ケースを想定するなら、 例えばUnixだと、O_APPENDでopen()してwrite()一発で1行を書き込むように している限りは、マルチスレッドだろうがマルチプロセスだろうが、 何の排他制御も要らない。
189 :
デフォルトの名無しさん :2007/06/29(金) 20:46:52
Visual C++ 2005を使用しています。 xmlの書式で書かれたデータがint型の配列に入っているとします。 その配列から、xmlのあるタグ(例えば<script>という文字列)が あるかどうかを検索したいと思います。 この場合、どのような方法がお勧め(簡単な実装、早い検索)でしょうか? 以下のいずれかを考えていますが、どうでしょうか? (1) memcmp()を使いながら、<Script>に対応する数字を探していく (2) string型に変更し、string.find()で探す そのほかにお勧めの方法はあるならご教授願います。 (2)をすべきなら、どのようにint→stringに変換するのでしょうか?atoiを使うので しょうか?
> xmlの書式で書かれたデータがint型の配列に入っているとします。 ここから既にイミワカンネェ
どうやって読み出してきたら、int型配列になるんだ? ひょっとして、UCS4なのか?
192 :
デフォルトの名無しさん :2007/06/29(金) 21:05:29
xml形式のデータがint型の配列に返ってくるメソッドがあるのです。 void method(int *value) というメソッドを使うと、valueの中にxmlが返ってくるケースがあります。 xmlデータじゃないのも返ってくるのでint の配列で返ってくるのだと 思います。 すいませんが、教えていただけないでしょうか?
エスパー募集中☆
intにどうやってxmlを入れるんだ?
>>192 だから、その int 配列の中にどういう形式で文字列が入ってるんだ? と。
>>191 の言うように UNICODE (しかも32ビットの UCS4)なのか。
コード体系によってその "<script>" だって表現の方法が変わってしまうから、
そこが分からなければ意味がないし(というかそれこそがこの問題の本質)、
そこを君が述べていないので「ESP」とか言われてしまうのだよ、と。
無理矢理入れます。処女マンコ犯すように
xmlを扱うなら専用ライブラリ使う、もしくは作るべし
199 :
デフォルトの名無しさん :2007/06/29(金) 21:22:18
ご返信ありがとうございます。 "<?xml" だったら "60 63 120 109 108"とそれぞれの値が int型の配列に入っております。 String型でデータをもらえればいいのですが、メソッドの仕様の 関係上、int配列でしか受け取れません。
もはや釣りにしか見えん
なんで言葉で説明しようとするのかね。 データをそのまま貼り付ければいいのに。
とりあえず文字列形式に変換してから、 ライブラリ通して解析すべき
203 :
199 :2007/06/29(金) 21:23:59
Asciiコードで入っております。 みなさんを混乱させる状況にしてしまってすいません。
>>199 漢字が入ってる場合はどういう具合に返ってくる?
文字化けして返ってきます。
ってか、漢字ってこの話で関係あるのか?
208 :
199 :2007/06/29(金) 21:27:41
返ってくるデータに漢字は含まれないのでわかりません・・・ みなさんを怒らせてしまってすいません。int→stringの文字列 変換を行うことを考えて実装してみます。 本当にすいませんでした。
失礼しちゃうわ!
>>207 エンコーディングを判別したかったんだが。
XMLライブラリを使うんなら必要なことだろ。
asciiって言ってるじゃん。
まあ本人がもういいつってんだからどうでもいいやな。
>>212 だから、Asciiだから漢字は含まれていないし、
含まれていたらどうなるか分かりませんって言ってるんでしょ。
VCのデバッガで見て言ってたんじゃないかな
216 :
199 :2007/06/29(金) 21:35:06
たびたび出てきてすいません。 205は私は書いておりません。ASCII文字です。 215さんのおっしゃるとおり、デバッグで確認して 回答していました。
失礼しちゃうわ!
191が指摘しているとおりなのだが、 intが4バイトならUTF-32、2バイトならUTF-16と見なして構わないはず。 そのまま適当なXMLのライブラリへ投げてしまえ。
> xml形式のデータがint型の配列に返ってくるメソッドがあるのです。 > "<?xml" だったら "60 63 120 109 108"とそれぞれの値が > int型の配列に入っております。 もしかして、単にテキストファイルを読み込んで各文字(ASCII)のコードを int型の配列に格納しているだけ? 1行ずつとか、ファイル全体とか。XMLの構造に関係なく。
質問です。 配列の要素数をキーボードからの入力によって定めさせたい場合、どのような方法があるでしょうか。 int n; int a[n]; という宣言だとa[n]の宣言がエラーになってしまい、scanfによってnの値を決定した後にa[n]を宣言してみてもやはり「そこで宣言は出来ない」とエラーになってしまいます。 どなたかよろしくお願いします。
int *a; nを読み込む。 a = (int*)malloc(sizeof(int)*n);
222 :
199 :2007/06/29(金) 21:42:18
219さんのおっしゃる通りでした。xmlなどの概念を理解せずに 使用してしまって混乱を招いてしまったようです。 >もしかして、単にテキストファイルを読み込んで各文字(ASCII)のコードを >int型の配列に格納しているだけ? >1行ずつとか、ファイル全体とか。XMLの構造に関係なく。 この場合、XMLのライブラリを使えるのでしょうか?
>>220 CかC++か、どっちだい
Cならmalloc/freeで検索
C++ならnew/deleteで検索、もしくはstd::vectorで検索
でもそのレベルだとnを十分大きく取るって解決策の方が
いいかもしれない
>>222 もし非ASCII文字が入っていないなら、
>>219 の言うとおりにやればいい。
と言いたい所だが、sizeof(wchar_t) != sizeof(int)のときに、
int配列をそのまま処理してくれるXMLライブラリってあるのかな。
俺は知らない。
ただ、非ASCII文字が無いのなら、stringなりchar配列に変換するのは
難しいことでも何でもない。受け取ったint配列の値をそのまま
突っ込んでいくだけだからな。
>>199 とりあえずXMLのライブラリを探してきて、その仕様を調べること。
仕様を見て理解できないようなら、まずはC言語の基本とかXMLについてもっと勉強すること。
226 :
199 :2007/06/29(金) 21:47:54
みなさん、本当にありがとうございました (1) XMLのライブラリを調べる、勉強する (2) int型配列をStringに変換することを考える で、がんばってみたいと思います。ありがとうございました。
100年後にまた会えるといいな
真面目にやれば数日後だと思うけど、まあ頑張れ
ところでさっきからStringといっているのが気になるが、 もしかして.NET FrameworkのSystem.Stringのことか? それならUnmanagedMemoryStream + StreamReader + UTF32Encoding 必要ならそれにXmlTextReaderでいいような気がする。
>>168 です。
お前ら、ありがトン。
アンダーバーで始まる関数:
アンダーバーから始まる名前は処理系のために予約されている。
そして、これを利用してMS は独自の拡張関数の名前の最初に_ つけている。
ということだな。
違うよ?
>>231 230でないけど何が違うか教えてください
>ということだな。 違うよ?
「処理系のために」ではないだろ。
ハード的なクリックでは無くソフト側で移動・クリック・入力の繰り返しをさせるプログラムを作りたいのですが MSDNの見方がよく分からなくてmouse_eventを使うかもしれないという程度しかわかりませんでした・・・ 使えるAPI・サンプルなどがあったら教えてください よろしくお願いします
SendInput
237 :
デフォルトの名無しさん :2007/06/30(土) 09:01:14
質問です!! C言語のボーランドでコンパイルしたら元のメモ帳と、コンパイル後のファイルとって感じでいくつか手元にファイルできますよね。 そのとき作ったメモ帳が消えてしまったのですが(プログラムの実行はできる状態)。 コンパイル後のファイルからもとのメモ帳ってもう見ることができないのでしょうか・・・? わかる方よろしくお願いします。
メモ帳って何だ?
239 :
デフォルトの名無しさん :2007/06/30(土) 09:03:12
んと、メモ帳にmainやらintやら打ち込んで、ボーランドでコンパイルしてコマンドプロンプトで実行って形でやってます。 そのとき書き込んだメモ帳です。
先ず最初に、「メモ(すなわちファイル)」と「メモ帳(アプリ)」を区別するところからはじめる必要がありそうだ。 で、あんたはその「メモ」をなんて名前で保存したんだ? そいつはコマンドプロンプトでdirしても見えないのかい?
241 :
デフォルトの名無しさん :2007/06/30(土) 09:15:54
dir でも見えないし、元の場所からは特に動かしてないので・・・ お恥ずかしながら消しちゃったみたいなんです・・・・ コンパイルの逆、みたいなことってできないのでしょうか?
243 :
デフォルトの名無しさん :2007/06/30(土) 09:23:43
う・・・・orz ありがとうございました。
>>234 >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の方も処理系て訳されてるし。
一応逆コンパイラはあるけど、 元のコードがそのまま出てくるわけじゃないからなあ。
デコンパイラでぐぐれ
スレッドで、複数の引数を受け取りたいとき、 std::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; の要領で、できました。 よろしくお願いします。
>>247 たぶんスレッドに引数渡してるところがおかしい。
>>247 ・C言語の形式のキャストではなく、C++のキャストを使ったほうがいい。
・コール元からThread()に渡したstd::vector<std::string>オブジェクトの寿命は大丈夫?
・vec[0]を見たいなら、std::cout << vec[0]; で良いんじゃない?
>>248 複数渡したいとき、構造体か配列などなどとあったので。。。
正直よくわからないです。すみません。
>>249 ・C++のキャスト検索してみます。
・std::vector<std::string>オブジェクトの寿命ですか、
良く、無いものを参照して、プログラム止まります。
同じ症状なので、これかもしれません!
・vec[0]で、大丈夫ですか。了解しました。
ありがとうございました。
>>250 >>249 が指摘してるが、多分スタック上に確保したvectorのアドレスそのまま
渡してるだろ。それじゃクラッシュするのは当たり前だ。
>>250 ごめん、まちがえた。
× vec[0]
○ (*vec)[0]
//void* のポインタキャスト行ったりきたり実験
std::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は使用しなくなると自動的に、
開放しちゃうっていう、あれのことでよかったでしょうか?
なぜ新訂版More Effcitive C++の訳本は糞なのでしょうか?
255 :
247 :2007/06/30(土) 20:39:16
vector、map、pairなど、いろいろあると思いますが、 こういうの使いたいときは、どうすればよいでしょうか? 自動で開放してくれなくても、いいので 構造体使うのが、わかりやすいですか。
>>253 > vectorは使用しなくなると自動的に、
> 開放しちゃうっていう、あれのことでよかったでしょうか?
ほんとに意味を分かって言ってる?
Javaなどのガベージコレクションと勘違いしないか?
ここで問題にしてるのは、C/C++で関数(またはブロック)内で宣言した変数は
その関数(またはブロック)を抜けると破棄されるということ。
いつの間にか勝手に消えるわけじゃない。
使用しなくなったら開放、って理解でいいと思うよ。 考えるな感じるんだ。
>>255 vector, map, pairなどはそれぞれ特徴が異なる。
データ同士の意味的なつながりとか、検索/更新の方法や性能など。
複雑なデータの管理をするときに、その使用方法にあったデータ構造を選択すればいい。
単にいくつかの型が異なるデータをひとまとめにして扱いたいだけなら
構造体でいい。
あぁ〜ん!感じちゃう♪
260 :
247 :2007/06/30(土) 21:12:13
何を突っ込もうとしてたんだ、>290にw
262 :
247 :2007/07/01(日) 06:54:52
>>258 255って、自分でした。
構造体でよかったですか。ありがとうございます。
template<class T> inline void ZeroMem(T& dest) { memset(&dest, 0x00, sizeof(T)); }; っていうのを作ったんですがこれって危険でしょうか?
めっちゃ危険
265 :
263 :2007/07/01(日) 10:19:58
用途はwinapiで使う構造体の初期化です 一応実際のものは、POD以外渡すとコンパイルエラーになるようにboost::type_traitsとか作って 細工してあります
>>265 クラスの中に、newなどで確保済みポインタがあったらどうするんだい?
それはそういうのを渡さないように気をつけるとしか。。。 でもそんな事いったらmemsetも使えませんし MSG msg; msg.hwnd = 0; msg.wParam = 0; とか打っていくのが面倒なんで考えたので 初期化済みかどうかを判別する方法があればいいのですが
>>267 MSG msg = {0}; // 全部 0 で初期化
msg = MSG(); // 全部 0 を代入
そういう手があったんですね、トンクスです
何がトンクスど、トランクスか
こんなことも知らない奴がboost::type_traitsとか使ってんの蚊 釣りかと思った
一年ほど前に使った記憶はありますが boostやpstadeと格闘している間、 構造体の初期化なんて殆ど使わなかったので忘れていました ま、実質知らないのと同じですね^^^;
^^^何だこれは3つ目小僧か
どうしてC++にはコンストラクタとデストラクタがあって デコンストラクタはないのなぜ?
>>274 デコンストラクタって何ですか?デストラクタと同じものではないですか?
Con structor De structor
con-struct-erとde-struct-erだから 説明になっていないけど
デコンストラクタ = デストラクタ って考えちゃダメなの? 名前が違うだけやん
15秒で4レスついてるw
すみません int a[] = new int[10]; int *b = new int[10]; みたいに確保したときって delete a; delete a[]; delete b; delete b[]; それぞれ解放の仕方で動作おかしくなりますか?
delete a; アウト delete a[]; アウト delete b; アウト delete b[]; アウト
これもアウトだ。 int a[] = new int[10];
>>275 デコンストラクタは脱構築です
ただの破壊ではありません
ポストモダンなのです
たぶん
>>285 それは禁句だよ。
new[]してdeleteのような正しくないのに環境によっては動くものを
正しい方法だと思ってしまう可能性がある。
配列のnew deleteは T* v = new T[n]; delete [] v; でおkなはず
いやここでstd::vectorとか言い出してやる。
valarrayの事も時々でいいから思い出してあげてください
>>286 今回はそれ以前の話。コンパイルできないのがダメ。
shared_arrayでいいんジャマイカ
いつものパターン: 書く → ビルド → エラーの数が100を超え(ry → (´・ω・`) → 少しずつ直していく → コンパイラ通過 → \(^o^)/ →実行時エラー → /(^o^)\ナンテコッタイ
delete b; は正常に動作する。 今回に限ってはメモリリークを起こさない。 ただ、b[1]〜b[9]のデストラクタが呼び出されないので、 プリミティブ型以外では動作保証ができない。 いかなる場合においても、new[]で確保したら、かならずdelete[]で解放すること。 だったっけ?
>>291 たまにはscoped_arrayのことも思い出してあげてください……。
>>293 デストラクタがあったらメモリの開放に失敗して落ちる環境がほとんど。
delete bで開放するのいいけど その後メモリ取ろうdeleteした近辺にnewなんかされると 悲惨なことになるぞw
>delete bで開放するのいいけど 良くない
言語的にだめなのは分かるんだけど PODの場合で new[]で確保したのをdeleteでシメた場合に 実際に不具合があるような実装って おおいの?
結論としては色々とややこしいから最初は配列なんか使わずにコンテナつかっとけってこと?
>>300 でも
const char *bad_words[] = { "fxxk", "pxxsy", "axxl", "cxxt", ... };
みたいなのは配列が便利じゃね?
>>299 すくないとか言ったら使いそうだから言わない。
>>302 いや、実は見たこと無いから聞いてみたんだけど(ボソッ)
見たことないけど、 将来デバッグモードで変なことするコンパイラが 出てくる可能性もなくはないと思う。
>>299 それは実装に不具合があるわけじゃねーぞ。
>>305 落ちるとかバグるとかそういう環境は多かったりするのか?
という話なわけで。
>>305 いや勿論そういう意味じゃなくて、
メモリが解放されなかったり
ヒープが壊れたり
無限ループに陥ったり
ハードディスクが初期化されたり
といった問題が生じるかどうか、という意味
>>301 new[]で確保するのでなければ別に構わないと思う。
>>307 そんな問題が生じたこともないし生じるようにも思わないが生じる可能性はある。
int a[] = new int[10]; 何が問題なの?
そもそもコンパイラ通らないだろ
まずコンパイルしてからなんか家w
int a[] =(int[]) new int[10];
C、C++の基本的なことは勉強してきました。 それで簡単なGUIアプリから作ってみたいのですがVisual C++とDelphiで迷っています。 DelphiだとPascalを勉強しなければいけないそうですが大変でしょうか? C、C++が無駄になりそうで怖いですが。 C++を勉強してきた場合、Visual C++のほうがいいでしょうか?
コンパイルエラー
>>315 C/C++ 勉強したなら VC++ 使えば?
そしてうっかりCLRアプリケーションのプロジェクトを選択して C++/CLIを勉強する羽目に。
>>315 どれくらいのレベルか知らないが、勉強のためVC++をススメておく
DelphiでもCやC++で勉強してきた基礎は無駄にならないと思うけどね
Delphi には将来性が・・・
int *a[] = new int[10];
int *a[|] = new int[00];
int **a = new int*[10] for( int i = 0; i < 10; ++i ) a[i] = new int; for( int i = 0; i < 10; ++i ) delete a[i]; delete [] a;
int (*a)[10] = new int[10][10]; delete[] a;
delete[] you;
Segmentation fault (core dumped)
std::vector<int> a(10);
std::vector<inpo> you(10);
329 :
デフォルトの名無しさん :2007/07/01(日) 17:10:26
struct A { int x; };みたいなのをA a;と宣言してこれを std::cout << a;のようにした時にメンバであるxの値を出力するように変換関数を定義したいんですが どうすれば良いんでしょう? operator std::string();とやってみましたが変換できないようです
>>329 operator << (std::ostream&, A const&)
std::ostream& operator<<(std::ostream& os, A& a) { os << a.x; return a; } A内で上の関数をfriend宣言しておく
>>329 cout << static_cast<std::string>(a);
とやるか、
std::ostream& operator<<(std::ostream& os, const A& a) { return os << a.x; }
でも定義汁
>>334 ここまで必要になるか分からないけど、
class A {
public:
virtual void print(std::ostream &os);
};
std::ostream& operator<<(std::ostream& os, const A& a) { a.print(os); return os; }
とやった方が、もしかしたらいいかもしれない。
こうすると継承クラスでprintを再定義できる。
336 :
334 :2007/07/01(日) 18:02:45
>>335 なるほど継承ですか、実行時の多態性については意識し取りませんでした
確かにこの振る舞いをもたせたいのが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;
}
…しかし鶏を捌くのに牛刀をなんとやらですね
実際に使うとなればここまでする必要も出てきそうな気もせんでも無いですが
この場合のNVIって何の意味があるの・・・?
最近おぼえて使いたくなったんだろ。気にするな。
NVI ってなんですか?
NVI=non virtual interface のこと。つまり↓
struct 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 の場合、インターフェイスが変更される可能性は全く無くて、無駄に複雑にしてるだけだと思う。
そもそも値型のクラスの継承はあまり宜しくない
値型のクラス???
Value classの事 ・publicなデストラクタとコピーコンストラクタと代入演算子を持ち ・デストラクタを含め仮想関数を持たなくて ・具象クラスであり抽象クラスでない ・スタック上や他のクラスのメンバとしてインスタンス化される とまぁおおよそ組み込み型のように振舞えるものでこういうのは継承じゃなくて委譲を使うべきらしいけど、 実際のところはそれが妥当なのか場合によるからよくわかんねけど 俺は複雑な構造体を継承してえらい目にあったので「あまり宜しくない」と思うようになった ちなみに出展はmore effective C++あたりだったと思う
345 :
341 :2007/07/01(日) 19:23:42
>>344 Value classなんて初めて知った。
全部が全部ってわけじゃないけど、ほとんどは
>>344 のいうとおりだろうね。
ただ、サンプルプログラムでそういうことを考えちゃうと
バーチャルなデストラクタや、privateなoperator =を書く必要が出てきて
全体的に焦点がぼやけてしまいまふ。
>>341 ではとりあえずそういうことは無視させてもらいますた^^
>>344 そんな区別意味無いだろ。
public なデストラクタが virtual じゃないクラスを継承したのが間違いだったんじゃないの?
value class って用語も検索結果が日本語ページ多すぎで胡散臭いし。
つうかそういうクラスはそもそも継承を前提に作ってないだろ 他言語ならsealedクラスになってるタイプのクラス
で
>>342 に戻ると
良いサンプルってやっぱ難しいんだね
複雑なものを扱うためのテクニックを簡単なサンプルで見せても 無意味にしか見えんからのう
とりあえず、NVIならこの程度のサンプルでも十分通用するね
NVIってExceptional C++で勉強しましたか?
Exceptional C++―47のクイズ形式によるプログラム問題と解法 Exceptional C++ Style―40のクイズ形式によるプログラム問題と解法=スタイル編 Exceptional C++ Style―40のクイズ形式によるプログラム問題と解法=スタイル編 これって何が違うんでしたっけ?
354 :
デフォルトの名無しさん :2007/07/02(月) 00:12:21
4バイトint型 num = 10,000,000の16バイト表現を、 ビッグエンディアンで char型 d[10]のd[5]〜d[8]の各要素に格納したいと思っております。 numを表現する4バイトそれぞれの値を取得するためには どうすればいいのでしょうか? char *p = (char *)num; // numのポインタを取得 d[5] = p; // 1Byte分の値を取得 p++; // charのポインタなので1Byte分ポインタを変更 とやることを考えたのですが、pの値がおかしな値になります。 どのようにコーディングするとよいでしょうか?
char *p = (char*)# の間違いだと思うのだがどうよ
たびたび、すみません。 スレッドに複数の引数を渡したい者です。 //スレッド関数 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さんが言ってたのは、このことかなぁと思って、今は、引数渡さない方法でやってますが。 上記のプログラムに、手を加えてエラーで無い方法ないでしょうか。
あっ、CameraThreadは、ほんとの関数名でした。 Thread_fに、訂正お願いします。
>>356 だから、スタック上のオブジェクトのポインタをスレッド関数に渡すなと。
呼び出し側のコンテキストが平然と進行しつづけてスコープ抜けた瞬間に
無効になっちゃうだろが。
malloc()やnewでフリーストア上にオブジェクトを確保して、その
ポインタを渡すんだな。無論渡されたスレッド側で不要になったら
破棄すること。
本当はC++使ってるんなら、スレッドをラップするクラスを作るのが良いが
それはまあいい。
359 :
354 :2007/07/02(月) 00:23:58
>355 ご指摘どおりです。 char *p = (char *)# // numのポインタを取得 d[5] = *p; // 1Byte分の値を取得 p++; // charのポインタなので1Byte分ポインタを変更 d[6] = *p; p++; ・・・ としているのですが、値が正常にとれません・・・
>>358 レスありがとうございます。
new演算子は、Dataをでしょうか?
Data *datalist = new Data[N];
これで処理してます。
>>360 それなら、そのdetalistをそのまんま(void*にキャストして)渡せばいい
>>361 data=datalist[i];
これを、なくして
handle[i] =(HANDLE) _beginthread(CameraThread,0, (void *)&datalist[i]);
ということですよね。
これでも、同じ症状です。
dataにコピーしてから、渡すとエラーが消えるかも、
と思って入れたおまじないの処理なんです。
>>362 ちょっとまて
意味わかんなくなってきた
スレッドをN個起動してて、i番目のスレッドにdatalist[i]を渡したいのか
だがそれだと、datalist[]の破棄はどうする?
いつどこで誰がやってるんだ?
今日ここで俺がやる
メインの方で、スレッドの処理が終わるのを、待ってからです。 スレッドが終わるまで待ちます。 for (int i=n; i>0; i--){ while(WaitForMultipleObjects(n, (CONST HANDLE *)handle,TRUE, 500) == WAIT_TIMEOUT){//タイムアウトなのでループ} } delete data;
>>365 datalist じゃないのか? delete [] じゃないのか?
>>365 その i でまわしてる for ループは何のつもり?
WaitForMultipleObjects() で全部待つんだろ?
あと、戻り値はちゃんとチェックしろよ。
(CONST HANDLE *) とかいうキャストも要らんだろ?
っていうか前のコードから要らないキャスト多すぎだ。
お手数かけてすみません。 delete datalist; です。
>>365 よくわからんが、メモリバリアを_beginthreadex()の前後あたりに
挿入すると状況が改善されるかも
>>368 それじゃダメだ。 delete [] 使え。理由は聞かずにちょっと前のログを見ろ。
while(WaitForMultipleObjects(n, (CONST HANDLE *)handle,TRUE, 500) == WAIT_TIMEOUT){} スレッドが終わったっていう合図以外は、ここでループしてます。 タイムアウト以外というコメント不正確でした。 forで、n回繰り返すと、n個のスレッドが終了するのを待ったことになります。 delete datalist []; deleteの使い方理解していないので、 ちょっと時間掛かるかもです。構文エラーとか出てきます。
構わんよ、おつまみみたいでみんな喜んでるみたいだし
delete [] datalist; ああ、反対でした。 同じエラー出てきました。
>>371 > forで、n回繰り返すと、n個のスレッドが終了するのを待ったことになります。
WaitForMultipleObjects() の第3引数は BOOL fWaitAll で TRUE の時は
その呼び出しで全部待つ。戻り値にはエラーもある。仕様をちゃんと見て使え。
delete [] datalist;
コンパイル通りました。
-ElnvalidPointerクラスの例外を生成しました。
-'無効なポインタ操作'
-プロセスは停止しています。・・・・
やっぱり、これが出てきてしまいます。。。
スレッド1個(n=1,N=1)にすると、大丈夫なんですよね。
あと、
>>356 で、Sleepの次i++が入ってまずが
頭がおかしくなって、入力してしまったのかもしれません。
すみません。
疲れてるなら休めば?スッキリしてないと頭の回転悪いよ
ぶっちゃけそのレベルで メダパニとラリホーかけられてちゃ どんな間違いやってても不思議じゃないな
>>374 ありがとうございます。
WaitForMultipleObjectsで、苦労したんですが
なんか思い出だしてきました。
結局、スレッドの方では、なんにもしてないので、
newで渡すのがだめな気がしてきました。
379 :
378 :2007/07/02(月) 02:14:02
今日は、ちょっとギブアップします。 ありがとうございました。
>>315 間取ってC++Builder使えばいいんじゃね?
>>332 A内でfriend宣言しておかないとA.aのように参照した場合
もしaがprivateやprotectedだった場合エラーになる。
>>381 この場合はstructで全部publicだから要らんと言われてただけでしょ
383 :
378 :2007/07/02(月) 10:18:40
378です。 シンプルなプログラムを別に作って、 new演算子でも大丈夫なこと確認しました。 それで、本物の方のプログラムの方をGUIの部品とか 1個ずつはずしていって、シンプルなプログラムに近づけていったところ。。。 (6時間後・・・) void __fastcall TForm1::Button17Click(TObject *Sender) { //なにもしないボタンです。これから実装します。 } ボタン17を削除して、またボタン作ったら なぜか閉じるボタンで、ポインタエラーがでなくなりました。 ということで、new演算子で渡しても大丈夫みたいです。 ありがとうございました。
384 :
デフォルトの名無しさん :2007/07/02(月) 13:07:16
VC7でswitch内で switch (val) { //コメント //コメント case 1: 〜〜 break; } こんな感じでcaseの上に複数コメントがあるブロックが多いと、 デバッグの時のブレークポイントや、実行時の位置が おかしくなることがあるみたいなんですが、どこかに詳細な 報告はありませんか? 検証が甘いですが、VC2005でも同じ現象が起こるみたいです。
int (*a)[] = new int[10];
質問です。 Foo::Foo() : m1(), m2(), m3() {} このようなFooクラスのコンストラクタにおいてm2のコンストラクタが例外を投げたとき、 既に初期化が完了していたm1のデストラクタが呼ばれることは「C++の規格で保障」されているのでしょうか? VC++2005で確認した限りではその通りの動作をするようですが…
保証されてる。 Foo::Foo() try : m1(), m2(), m3() { } catch(...) { } みたいにしてキャッチすることもできるけど、 例外は必ず再送出される。
388 :
386 :2007/07/03(火) 17:51:16
>>387 ありがとうございます。
> Foo::Foo() try : m1(), m2(), m3() { } catch(...) { }
そういえば function-try block なんて見たのは久々^^;
コンストラクタが失敗して例外を投げたときって、 中途半端にコンストラクトされた状態だと思うんだけど、 デストラクタは呼ばれないわけだよね? メモリリークの原因にならないのかな?
if(pMem){ delete pMem; } でおk
>>389 ちゃんと自分で例外をキャッチして開放してくだちぃ。
それが嫌なら vector とかスマートポインタとか使ってデストラクタに任せてくだちぃ。
>デストラクタは呼ばれないわけだよね? catchしたら呼べばいいじゃん。
>>390 deleteはNULL渡したら勝手に無視してくれなかったっけ?
してくれる。
仕様上は無視することになってるが、 昔の VC++ あたりはしてくれなかった記憶がある。
そうだっけ? もしそうなら、そのときはその仕様がまだなかったんじゃないか
>>396 VC6 あたりまでそうだったと思う。
この仕様があるかどうか微妙な時代かもしれん。
SAFE_DELETEの利点は変数にぬるぽを代入してくれる点 解放後にアクセスしようとすると素直に落ちてくれる
ニートで暇だからプログラミングの練習でもするかとゲームを作り始めたのですが いきなり挫折しました。かれこれ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);
とりあえず、fgetsはEOFなんか返さないってば。
>>401 ありがとうございます。
・・・orz
混乱していたから別ファイルで作ったのを
コピペ改変していました。
なんでこんなミスばっかりやらかすんだろな・・。俺は。
だからニートなんだろ
すみません。mallocって確保したメモリのポインタが返ってくるのですが、 このポインタって確保したメモリのどこを指しているのですか? このポインタ指しているところの規定ってあるのですか?あればどんな規定?
0アドレスって凄い誤解されそうな・・・。
char *p = malloc(size); とすれば、 p[0] 〜 p[size - 1] のメモリをアクセスできることが保証され、 p + size が無効なアドレスにならないことが保証されている。
何となく思ったことなんですが、 char *s = "hoge"; は char s[] = "hoge"; と違って、中身を書き換えたりしたらダメなんですよね。じゃあ、最初から const char *s = "hoge"; としておいた方が、間違って書き換えちゃったりしたらコンパイル時にエラーになって、 深夜のデバッグ作業突入を防げるような気がするんですが、これはいい考えですか? それとも、気をつければいいだけですか?
>>408 とてもいい考えアル
と、effective c++あたりに書いてあった希ガス
>>408 char *s = "hoge";
char s2[] = "hage";
s = s2;
s[1] = 'i';
constをつけるとこれもできなくなる。やらないと思うけど。
const char* const s ="hoge"; にすれば s++ とかも防げるぜ! 以下修飾子の位置について終わりのない議論が始まります
>>408 少なくとも自分は条件反射的にconstつけてる
結論出たので終了
414 :
デフォルトの名無しさん :2007/07/04(水) 01:05:17
今日wstring型ってのを知ったのですが、 wstring a[2]; a[0] = L"あああああ"; a[1] = L"いいいいい"; wcout << a[0] << endl; wcout << a[1] << endl; ってやっても何も出力されません。 なぜでしょうか?教えてください。 ググっても良い資料が見つからない、、、。
415 :
デフォルトの名無しさん :2007/07/04(水) 01:06:39
>>414 です。
”何も”ではなく空白行が2行出力されます。
wcout locale imbue でググるんだ!
string
横レスだが、MacOSX GCC 4.0.1 だと locale に何渡しても runtime_error になるな。
Javaの静的初期化メソッドみたいなもの、C++にありましたっけ? たとえば、 class hoge { static int num[100]; //この配列を0-99まで初期化したい } hoge::int num[100]; といったとき、どう書くのが一番スマートですか? (num[100]={0, 1, 2...} とやるのはなしとして) コンストラクタ内で初期化しようとすると インスタンスを生成するたびに何度も同じ処理が 繰り返されることになるので無駄だし…… 初期化処理が既に終わっているかどうかを示す フラグを追加するとかでしょうか。
今考えたけど、こういうゴリ押しができなくもないな。 friend しなくても通ったけど、これって規格的にお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(); }
この程度で充分じゃね? class hoge { static int num[100]; }; int hoge::num[100]; static int initialize() { for (....) { ... } } static int initializer = initialize(); ファイルスコープのstaticが嫌いならnamespace{}でも。
関数を friend にする必要があるね。 個人的には戻り値 int が必要になるのが気持ち悪い。
>>421 うわー、その手がありましたか。
絶対忘れないように今すぐそれ使って何か書いてきます。
ありがとうございました。
class CStaticInt { 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`)
scanf("%s",str); if(strcmp(str," ")==0) printf("空白文字"); これで入力された文字が空白かどうか調べようとすると strcmpが0とならずprintfが実行されません。 これってどこがダメなのでしょうか?
>>425 入力が半角空白1文字じゃないんだろう。
else で puts(str) してみれば?
>>426 う〜ん、なんか動かしてみると
scanfが空白文字を読み込んでないみたいな動作をするというか、
半角空白を入力すると入力が終了せず延々と入力を促すようになるのです。
だからif文の後もelse文も実行されない感じでしょうか。
%s は空白を飛ばすから当然そうなる。
>>428 そうなのですかorz
では文字列を入力するという処理で空白文字が入力されたか
というのを調べるには↓みたいにするしかないですか?
fgets(str,N-1,stdin);
if(str[0]==' ')
printf("空白文字");
strstr()
>>429 どういう仕様にしたいのかが今ひとつ分からんから何とも言えんなあ。
" hoge " とか "hoge hoge hoge" とか入力された場合どうしたいのかな?
>>431 char 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 紛らわしいこと書いてすみません、仕様は上記のような感じでした。
if(str[i][0]==' ') break; でした。書き間違い。
>>434 それは考慮してなかった…。
コマンドラインでの入力が「半角スペース+Enter」の場合のみ
入力を打ち切るという仕様だと思います。
>>435 あと、" hoge " と入力された時、
最初と最後の空白をどうするのかという問題もある。
437 :
デフォルトの名無しさん :2007/07/04(水) 17:09:55
TCHAR buf[100]; cin >> buf; ってすると UNICODE 版でコンパイルするとエラーになるのですが、 cin の TCHAR バージョンってないのでしょうか?
自分で作るしかなかったと思う。 #ifdef UNICODE_ wistream& tcin = wcin; #else istream& tcin = cin; #endif
>>404 から
>>407 さんへ、有難うございました。
すいません
>>407 の
>p + size が無効なアドレスにならないことが保証されている。
これ意味の解らないのですが、p + sizeのアドレスって、
確保されたメモリの次アドレス(確保外)が無効なアドレスにならないてことですよね。
なぜ、確保外の次のアドレスを無効なアドレスにならないことを保証しなければならないのですか?
ポインタ変数でループする際の終端として使えるようにするため。
>>439 の訂正
誤:これ意味の解らないのですが、
正:これの理由が解らないのですが、
>>440 有難うございました。
つまり、これに使うためにってことですね。
for( char* ptr = p; p != ptr; ptr++){}
>>407 さんと
>>440 さんのおかげで少し賢くこうなりました、ぺこり
それだといきなりループが終わるw C++ やってりゃ分かると思うけど、 algorithm でやってるあーいう処理ね。
あいやー、いきなりループが終わるんですか、ガクブル、どうすれば良いんですか
こんな感じ #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); }
c++で全角と半角を格納している配列から一文字ずつ読んで 標準出力させたいんですが、全角の1文字目と半角を区別することができません。 string str = "あイウ()"; for (int i = 0;i<=100;i++) { printf("%c",str[i]); } こうすると半角は正しく出力されますが、半角が出ません。 どうしたらいいですか?
>>446 色々方法はある。
_mbclenを使うとか、wstringやUNICODEにするとか。
> 半角は正しく出力されますが、半角が出ません どっちなんだよ?
>>445 有難うございます、あす、これとmallocの知識を引っさげて学校で自慢してきます
451 :
445 :2007/07/04(水) 21:34:47
>>447 なるほど。書いてもらったやつで調べてみたら
できそうですね。ありがとうございます。
あと少し教えてください。
「_mbclen」のアンダーバーは何を意味しているんですか?
それとアンマネージドというのは.NETの機能を
使わなければいいんですよね?
MFC、ATL、SDK、WINDOWS APIとかその辺の区別が全く理解できなくて・・・。
>>448 すいません。「全角が出ません」の間違いです。
>>451 処理系オリジナルのものと言う証。
下線で始まる名前は、処理系のために予約されている。
454 :
デフォルトの名無しさん :2007/07/04(水) 21:59:18
C++初心者です。型変換のことで教えてください。 main(){ 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)もやはりキャストなのでしょうか?コンストラクタの呼び出しとは言わない? ネットやいろんな本を見ても、このあたり、はっきり書いてないのです。
>>453 わかりました。ありがとうございました。
>>454 >この「int()」は何ですか?キャスト演算子ですよね?それとも値生成演算子?
int のコンストラクタの呼び出しによるテンポラリオブジェクトの作成。
>このT(2)は、変換コンストラクタの呼び出しですよね?キャストとは呼ばない?
T のコンストラクタの呼び出しによるテンポラリオブジェクトの作成。
>このstatic_cast<T>(2)はキャストだけど、実はT(2)と同じですよね。
多分同じ。
457 :
454 :2007/07/04(水) 22:20:46
>>456 さん、早速ありがとうございます。
intのようなC言語からある型の場合も、コンストラクタ、オブジェクトという概念で
考えるのですかぁ。C++では、intなどの型もクラスのような感じ?
C++本やネットでは、int()は(C風の)キャストだという記述が多いですが、
「コンストラクタ呼び出しによるテンポラリオブジェクトの作成」は、
別な言い方をすれば「キャスト」と同じこと、という理解で良いのでしょうか?
static_cast<T>(2)はT(2)と規格上同じだし、(T)2、と書くことも出来るから考えると。
キャストは引数を複数取れないから基本的には別のもの。 引数が 1 つの場合は同じようになるだけで。
規格票の 5.2.3 明示的型変換(関数的記法) によれば、 この記法とキャストは同等だと書いてありますね。
460 :
454 :2007/07/04(水) 22:40:00
型がクラスの場合は、
引数1つだとキャストと同じ表記だけどキャストとは別もののコンストラクタ呼び出し、
というのは、納得です。
じゃあ、例えばintの場合、Cでは「 (int)3.14」はキャストですよね?
C++では、「(int)3.14」はコンストラクタ呼び出しであって、キャストではないということ?
それとも、「(int)3.14」はキャストだけど「int(3.14)」はコンストラクタ呼び出し?
と、ここで
>>459 さんもコメントどうもです。
とすると、意味合いとしてはキャストと、このコンストラクタ呼び出しは同じってこと?
それとも、記法としては同じであって、でも意味合いとしては別もの、ということ?
同じものの違う表記法というだけみたいですね。
462 :
デフォルトの名無しさん :2007/07/04(水) 22:47:33
>>408 char *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);
と全く同義なので自由に書き換えられる。
もちろん、呼び出し元の関数と調和をはかるように。
463 :
454 :2007/07/04(水) 22:51:48
昨日、本屋で「C++の設計と進化」を立ち読みしたです。 索引で見つけた「コンストラクタの表記」を引いてみると、 クラス型名(式)の表記によってコンストラクタを式中でも使えるようになった、 というようなことが書いてあり、さらには、この表記は、 キャストの表記と同じだ、とも書いてありました。 でも、コンストラクタの表記とキャストは同一だという説明はなく、 このあたりは、はっきりとは書かれていなかったです。 C++の本は、新しい4つのキャスト演算子については必ず説明がありますが、 オブジェクトの初期化とコピーコンストラクター以外の コンストラクタの呼び出し(とテンポラリオブジェクトの作成)については、 ほとんど説明がないですねぇ。。
465 :
454 :2007/07/04(水) 23:00:56
>>460 459ではあれだけで終わっているが、
実際のところ、5.2.3には続きがあって、括弧の中の式の並びが複数ある場合、
コンストラクタを呼び出して一時オブジェクトを作ると規定されている。
歴史的には、コンストラクタを呼んでクラスの一時オブジェクトを作る構文として
導入されたのが最初で、後にそれを一般化して全ての型に対して使えるようになった。
(C++の設計と進化に書いてあるとおり)
その際、組込型では型変換演算子と同じ効力を持たせたという次第。
また、1つしか引数を取らないコンストラクタは、そのクラス型への型変換を提供する。
だから454でのstatic_cast<T>(2)は結局コンストラクタ呼出として機能する。
(あと型変換演算子の話もしたいが省略)
C++は、型変換を即ち新しいオブジェクトが作り出されることと捉えているように思われる。
すると、コンストラクタ呼出と型変換の境界が非常に曖昧になっているも納得がいく。
(int*)p はできるけど int*(p) はできないってところとか、 本当に細かい文法的な違いはあるね。
468 :
454 :2007/07/04(水) 23:34:42
>>466 ちょっと判ったような気になりました。ありがとう。
ついでにもう一つ。これから変換関数、変換演算子を勉強しようとしているところですが、
この2つ、同じものですよね?呼び方が違うだけで。
>>467 そーですね。単一名称(単純名称)でないとだめ、という説明はよく見ます。
typedefすれば大丈夫、ともよく書いてある。
469 :
454 :2007/07/04(水) 23:49:26
いま、JIS3014を検索してみました。 「変換関数」はたくさん出てきます。 「変換演算子」というのは該当無しで、 「型変換演算子」は、dynamic_cast, static_cast, reinterpret_cast, const_cast のことを指すのですね。 ネットでググると、変換関数の意味で「変換演算子」を使っているページが たくさんヒットするんですが、これらはみんな間違ってるのかな。 というか、JIS3014、おもしろい。絶対的な信頼があるから、 間違いを疑う必要もないしね。
間違いはないけど、コンパイラが対応してないこともw export とかほとんど対応してないし。
>>462 初心者騙して楽しいか?
> 同じ文字列リテラル(ダブルクォーテーションで括った文字列)は、
> コンパイラに特別指定しない限り同じ領域を指すポインタである。
そんなことは決まってない。
> そして、この構文は静的変数(グローバル変数か、スタティック変数)にだけ許される。
自動変数でも配列要素数の省略は使える。
質問です。 Microsoft Visual C++ 2005 Express Editionにおいて、 C++のアプリケーションを作っています。 コンパイル後の.exeファイルのプロパティで バージョン情報や会社名などが表示されるタブが出ません。 ソリューションエクスプローラ中にはAssemblyInfo.cppという、 AssemblyTitleAttributeなどが配置されたファイルが自動生成されています。 しかし、反映されません。(検索などではC#で作成され、csの場合のみ反映されるらしい) 対処法か代替案を持っていらっしゃる方はおりませんか?
474 :
デフォルトの名無しさん :2007/07/05(木) 09:03:52
実行環境はWindows環境、開発環境はVS6.0です。 メールを送りたいのですが一般的な既存ライブラリは存在しているのでしょうか? イメージしているのはWinsockに依存したライブラリですが 普通はそのままSMTPを喋るものなのでしょうか? 受信は必要なく、OB25Pも問題ありません。
Windowsで一般的といえばMAPIだろうな 俺は使いたくないけどw
basp21.dll
Windowsで簡単に見た目もいけてるGUIを作るにはどんな方法があるでしょうか? ちなみに過去にチャレンジしたこと ・C++/CLR コントロールは豊富だが、OfficeとかVSにあるようなフローティングメニューが見つからないので中断 日本語の資料が少なくて困る 既存のリソース(DLLなど)と組み合わせるときに DLLのほうの仕様を変えないとうまく動かないor非常にめんどくさいの2択になる あと変な拡張構文がキモい ・MFC デフォルトのコントロール数が貧弱だが、資料も多いし、 Win32APIをラッピングしてある程度のものが多くわかりやすい。 VS2005で作成するとManifestでうんぬんとうざいのでスタティックリンクできないプロジェクトだとだるい。 ・C++Builder GUIのデザインをするには最強だと思うが、本体が生きてるのか死んでるのかよくわからんのと 重い、謎のバグがいつまでも取れない、というのがネック。 未だに6を使ってる人が多い。 VCと一緒に入れるとデバッガが正常に動かない可能性がある? ・WTL 何がいいのかさっぱり
CEGUI
>>479 SWINGとかAWT継承すれば?
C++じゃなくなるけど
SwingとかAWTをJNI通してC++から使うっていう意味?
SQING や AWT がイケてるとは思えないけどw
ロジック部分を C++ で書いて ユーザインターフェイスは C# で書く。 C# からアンマネージドなDLL呼び出せるし。 だめ?
FrameworkもJREも無しですませたい
486 :
デフォルトの名無しさん :2007/07/05(木) 12:52:35
すみません stringのfindは、またはの検索できませんか たとえば"あい"または"大塚"または"愛" とかです
487 :
デフォルトの名無しさん :2007/07/05(木) 12:53:34
str.find("あい"|"大塚"|"愛") でいいんでしょうか
なんで試さないの?
>>486-487 str.find("あい") != string::npos ||
str.find("大塚") != string::npos ||
str.find("愛") != string::npos
正規表現ライブラリを使ったほうがいいかもね。
490 :
デフォルトの名無しさん :2007/07/05(木) 13:01:18
>>499 ヒットする、またはヒットする、ってやるんですね
サンクス わかりました
491 :
デフォルトの名無しさん :2007/07/05(木) 13:02:37
でも、番号がわからないような気が・・正規表現ライブラリを調べてみます!
場所が欲しかったら代入してやればいい if ((pos = str.find("あい")) != string::npos || (pos = str.find("大塚")) != string::npos || (pos = str.find("愛")) != string::npos) { // みつかった } else { // みつからへん }
ライセンスキーを入力->立ち上がる これをやりたんです。 ・キーの発行は手作業で。 ・アプリ側ですること、ライセンスキーを認証するdllを作成。 こんなこと想像してます。解説しているページや 簡単に実現できるツールなどありませんか。
494 :
472 :2007/07/05(木) 15:53:44
>> 同じ文字列リテラル(ダブルクォーテーションで括った文字列)は、 >> コンパイラに特別指定しない限り同じ領域を指すポインタである。 > >そんなことは決まってない。 そうでない処理系を挙げてくれ。 > >> そして、この構文は静的変数(グローバル変数か、スタティック変数)にだけ許される。 > >自動変数でも配列要素数の省略は使える。 どんな例か試しに書いてくれ。
VCとか。 C89(ANSI-C)以前の人は、自動変数で int hoge[]={1,2,3};式の初期化が出来ないとか言い張ることあるよね。
>>495 Visual C++では、コンパイラオプション/GFを指定しないと
同一文字列リテラルが同じ領域を共有するようにならない。
(なお/O1や/O2などの最適化オプションを指定すると暗黙の内に/GFも指定されたことになる)
ローカル変数での配列でもchar s[] = "hoge";や
char s[] = {'h', 'o', 'g', 'e', '\0'};のように書くことは可能。
このように静的変数や大域変数と同じ構文。
少なくともANSI/ISO Cではできることになっているし、
PC用のコンパイラなら今時できないものを見つけるほうが難しい。
>>495 ===== 同じ文字列リテラルが違う領域を指す例 =====
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;
}
>>495 わざわざ無知を晒しに出てこなくてもよかったのにね。
まあ聞くは一時の恥、聞かぬは一生の恥と言うし、 495はいい勉強になったということでいいじゃないか。
502 :
474 :2007/07/06(金) 01:01:18
皆様回答ありがとうございます。 BASP21はタイムリーですね。自演ではないです。 調べてみたところSMTP-AUTHに対応してなさそうな感じでしたので MAPIをもう少し調べてみようと思います。 ありがとうございました。
503 :
493 :2007/07/06(金) 02:01:09
>>501 1.大量のライセンスキーのデータベースが入っていて、マッチング。
2.それとも、秘密の値を一つだけ持っていて、
数学的になにか計算して、(ハッシュなど)マッチング。
一番目ってキーの数が多かったら、大変ですよね。ぬー。
ということは、数学のなにかを使って、やるんでしょうか?
たとえば、ウィンドウズだと、どんな感じでしょうか。
ライセンスキーをソートした状態で持っておけば、2分検索が使えるよ。
だいたいはアルゴリズムで、 ブラックリストデータベースも利用、かなー。 MSのは、公開鍵認証とハッシュがどーの、という話があったけどねー
オンライン認証じゃないのか
507 :
493 :2007/07/06(金) 10:40:35
>>504-505 たくさんの大量のライセンスキーを
用意して、ただマッチングがわかりやすいです。
オンライン認証もいいですね。
>MSのは、公開鍵認証とハッシュがどーの、という話があったけどねー
ハッシュ、公開鍵、秘密鍵、独自の計算方法、を使うんですか。
難しそうなので、うまいアルゴリズムは、徐々に考えていこうと思います。
興味があったので、勉強のために質問させていただきました。
ありがとうございました。
MSの場合はデータベースを使ってるに決まってるだろ。
509 :
495 :2007/07/06(金) 21:41:30
検証してANSI-Cでは動的配列等の初期化ができると分かって来て見たら非難誹謗の嵐だ。 わざわざお礼を言おうと思ったが、そんな非礼な人間に感謝の気持ちなどなくなった。 そうだよ。俺はANSI-C以前からC使いだった。 C++を黎明期から覚えて使い始めてからは、string系クラスが活躍してくれて 外的・静的配列以外に初期化子を使う必要もなかったからな。 君らが古いコードをメンテする憂き目に遭うことを祈ってるよ。
どんな理由があろうが捨て台詞は格好悪いから辞めた方がいいって
511 :
495 :2007/07/06(金) 21:50:05
ああ、ちなみに俺は『夜中までデバッグしたくなかったら』という前提で 文字列リテラルは同じポインタを参照するって意味で書いたんだぜ。 その辺は文脈嫁。 それから、C/C++の教本を読んでる暇があったら職を探せよ(w
512 :
495 :2007/07/06(金) 21:53:19
漢字もろくに書けないゆとりに説教されるとはな。 辞める→止める、やめる 適当にアラスカ。
なんだこのオッサン 年甲斐もなく2chで火病かよ 一生やってろ
514 :
デフォルトの名無しさん :2007/07/06(金) 21:58:22
俺をあげつらったやつら、特に学生よ、昔のコードには int a[100] = { 0 }; なんて構文はなかったんだぜ。 就職先のコンパイラが古かったら、解けないバグに悩まされろよ。
515 :
495 :2007/07/06(金) 21:59:34
日々のストレスで頭がおかしくなったんだよ。 そっとしといてやれ。
>>514 古いコンパイラでその構文が通らなければエラーになるだけなので
解けないバグも糞も無いんだが……
そんなに悔しかったのか
519 :
495 :2007/07/06(金) 22:03:08
そっとしてくれないのはまさに君じゃあないか
>>516 火病だろうがなんだろうが、アラシがいると皆楽しそうだなあ。ふふっ
期待してるんじゃないのか?
こりゃC99の話とかしたらおもしろそうだな
521 :
495 :2007/07/06(金) 22:07:05
>>518 そうだな。例えば君が車の免許を取ったとする。
10年後に、君の知らない新しい規則で捕まったとしよう。
それは悔しくないか?
100歩譲って仕方ないとしても、
見ず知らずの人間から「そんなことも知らんバカがいる」
と言われて悔しくない奴がいるかい?
技術者なら仕様の更新くらい把握しとけよ
この業界の人間ならまず己を恥じるけどな アンテナ張らなくなったら終わりだぞ
昔から半導体のプロセス技術で仕事をしていて、 年々プロセスが細くなってきて、昔は気にもしなかったような トンネル効果やらリーク電流やらに悩まされるような感じか
>>521 つーか技術者なら、まず自分の無知を恥じろよ。
で、どういうカタチであれ知識を教えてもらったことを有難いと思えよ。
ま、アンタの場合、恥じるべきは自分の無知よりむしろ
年甲斐も無いDQNさだろうな。
もっぺん自分のレス読みかえせよ。
>>495 は人にものを尋ねる態度か?
簡単に自分に確かめられることなのに、自分で確かめようともせずに
まるでケンカ越しで偉そうに聞いてたよな。
一体何様のつもりなんだか。
>>521 悔しいのはわかるが、それをばねに勉強するなど
その気持ちをほかの方向へ向ける手もあるだろうに。
527 :
495 :2007/07/06(金) 22:17:10
>>520 complex型とか色々増えたんだろ。
確か、enumも面倒くさい仕様になったんだよな。
全く知らないわけじゃないが、不要な機能も多そうだ。
C言語仕様で遊んでる奴らは、もっと基本に返って欲しいぜ。
自分が最近の仕様に疎いという自己認識があるんなら
最初から
>>462 みたいに偉そうに書かなきゃいいのに
初心者相手と思ってやったんならなおタチ悪いぞ
enum で何か大きく変わったっけ? 最後にコンマつけても良くなった程度じゃない?
530 :
495 :2007/07/06(金) 22:25:49
ほら、説教オタが集まってきた。
これだから嵐はやめられん。
>>523 お前は常にアンテナを張っているといえるのか?
>>524 それは『道具を作る』側の悩みだろ。現場だから悩みは直ぐ分かるぜ。
俺は言語を作ってるわけじゃない『道具を使ってる』側だから、勝手に変えられるのもこまるんだぜ。
>>525 そうさ、お礼をするつもりだったのさ。
その後は前に書いたとおりだ。二度も言わせるな。
人にモノを尋ねる態度じゃないと思ったら
答えなきゃいいじゃないか。それか無視すればいいんじゃね?
君の知識で答えられるとは思えないがな。実は今日初めて知った仕様じゃないのかい(w
>>526 そのつもり。
無視すればいいんじゃね? どうみても過剰反応の荒しなんだが。
532 :
495 :2007/07/06(金) 22:28:11
>>529 ほーら。こう言う人もいる。
分かる奴はenum談義でもしてやれよ。ほら。さあさあ。
いまどきノーヘルで捕まって悔しがる馬鹿っているのか? そのレベルだろ
534 :
495 :2007/07/06(金) 22:31:35
>>531 過剰反応じゃなきゃ嵐とは言えネー。
そして君は無視してなーい(藁)
>>534 漏れは楽しんでるからどんどん過剰反応してくれ
536 :
495 :2007/07/06(金) 22:34:16
>>533 これだけ例えが分からん奴も珍しい。
心から軽蔑してやるぜ。
何を今更、ってたとえ話だろ。
文字通りの老害だね。 釣りじゃなければ
>>537 原付に乗っていきがっている中学生と似たようなもんだ、ということかと思った。
免許持ってるおっさんだと仮定して話してしまった よく読んだら免許持ってるともおっさんだとも言ってないな 今は反省してる。
>521 なるほど。プログラマも更新必須の免許制に白って話だな。 んで、更新場で5000円はらって、「今度のC++09では〜こういう変更が〜」 みたいな話をありがたくちょうだいしろ、と。
>>521 法律は法律だろ…。
知らなかったなんて言い訳が通用するはずもない。
悔しいとか関係ないし。
自分で例えにもなってない例えを出しておいて、
よく他人に「例えが分からん」とか言えたものだな。
つーかC99ならまだしもC89なんて何年前の話だ
こいつの下についてる奴は哀れだな 普段から嬉々として間違ったことばかり言ってるが 「××さんそこはこうですよ」とか突っ込むと 逆切れして仕事にならんから適当な按配に放置されてると見た
545 :
523 :2007/07/06(金) 23:00:35
ってか、未来のコンパイラで使える技術と、
今の多くのコンパイラで使える技術ってちょっと違わないか?
>>495 の内容は、コンパイルして確認できる程度のものだろ。
>検証してANSI-Cでは動的配列等の初期化ができると分かって来て見たら非難誹謗の嵐だ。 規格に当たれば済むことを、いい加減な検証で分かった気になるとは。 >わざわざお礼を言おうと思ったが、そんな非礼な人間に感謝の気持ちなどなくなった。 例を言うのに「わざわざ」なんて副詞をつけるくらいなら最初から言わない方がましだ。 >そうだよ。俺はANSI-C以前からC使いだった。 別に珍しくもないが、普通は今時のコンパイラに触れているうちに理解するもんだ。 >C++を黎明期から覚えて使い始めてからは、string系クラスが活躍してくれて string系? std::stringに類似品があったっけ? std::basic_stringのことか? >外的・静的配列以外に初期化子を使う必要もなかったからな。 無知蒙昧極まれり。 >君らが古いコードをメンテする憂き目に遭うことを祈ってるよ。 憂き目? まさか。温故知新と言う言葉はご存じないかな?
548 :
495 :2007/07/06(金) 23:33:34
>>538 文字通りの老害だね。
そういう君の方が年上で無知だったりして。
2chで無意味なことを言う奴だ。
>>541 何言ってんの?免許制?そりゃあいい。
仕事だけじゃなく、きちんと新しい仕様を勉強する公な時間がとれるぜ。
君らも仕事するようになったら、アンテナ張るのが限界になることが分かるぜ、学生、失業者。
>>542 お前にゃ『例え』という概念も理解し難いらしい。
この例えが不適切だったと思う奴はちょっとレスしてみろ。
>>543 新しい仕様は受け入れるよ。そろそろ新しいC言語の教本を読む頃だ。
だが、K&R C言語の第2版でさえ、やはり自動変数の初期化子は
目の上のたんこぶ扱いだったようだ。
ゆとり世代がループ内で自動(配列)変数の初期化子なんか使われたら困るぜ。
>>544 安心しろ。会社ははけ口にならんからここに毒を吐いてるんだ。
アンテナ張るのも辛い職場ってどんだけブラックなんですか
技術者として新技術の吸収が無理だと分かったら、そいつはもうそこまでだぜ このおっさんは汎用機と心中するしかないCOBOLerと一緒だな 周囲はゆとりと学生だけなんだ、自分は悪くないんだ、仕事やってりゃ皆こうなんだ、 と思い込もうとしてるんだね 実に哀れだね
>>548 (´・ω・`)⊃旦 < 毎日お疲れ様です、お茶ドウゾ。
自分で試さずに「試しに書いてくれ」ってまるでゆとり世代のようだな
553 :
495 :2007/07/06(金) 23:51:42
>>545 君は自分の無知を自覚しようとしない奴だ。
ソクラテスはそういう事を何と言ったか知ってるか?
>>546 今日コンパイルしたのさ。
>>547 仕事中に新しい機能を覚える時間とそれを検証する時間をくれるなら進んでやるぜ。
社長は君かい(笑)
>string系? std::stringに類似品があったっけ? std::basic_stringのことか?
世の中にはSTLしかないと思っている奴を発見した。
しかも、wstringすら知らない奴もいたもんだ。
それから温故知新の使い方が逆だ。
君の使い方は『古いことを知り、かつ新しい事を知るべきだ』という意味にしかとれないが、
本当の意味は
『新しいことを知るには、古いことを知っておく事も重要だ』という意味。
やれやれ。ゆとり君=
>>547 。
>>553 が憂き目の意味を理解してるかどうかが気になる
どんどん香ばしくなっていくな
556 :
495 :2007/07/07(土) 00:03:14
>>550 そういうなよ、ゆとり。
それより、採用試験に向けて、人と目を合わせて話す練習をした方がいいよ。
>>551 サンキュー
>>552 そのときは思いもよらなかったからさ。
今日は仕事が一区切りつけたから検証できたんだ。
>>554 つらい体験
>>555 そう言うなよゾロ目
全員が無視されたら嵐は自然といなくなるんだぜ?
すごく・・・不毛です・・・
>>556 憂き目って、単につらいだけじゃなくて悲しいといったニュアンスも入るんだけど理解してる?
それでいて使い方が逆とか言ってる?
憂うっていうのは残念
まだやってんのか? 勉強の時間が取れないって割には暇なんだな。
いつから三つの数字をぞろ目と言うようになったのだろう……
>>553 > 仕事中に新しい機能を覚える時間とそれを検証する時間をくれるなら進んでやるぜ
こういう人多いんだよねぇ
・プライベートで自己啓発しようという考えが無い
・新しいことにチャレンジして新しい技術を仕事と共に身につけようという考えも無い
・自分に時間的余裕が無いのは上が悪いせいだ
ま、どうぞ勝手に腐ってくださいとしか
土曜日だからってはしゃぎすぎだろ。 そろそろ寝ろよおっさん。
>>561 それはふつうに言うんでないか?
ちんちろりんとかサイコロ3つ使うけど
565 :
495 :2007/07/07(土) 00:28:19
>君らが古いコードをメンテする憂き目に遭うことを祈ってるよ。
>>558 よし答えてやろう。
憂き目がつらい体験というのはおおよそ間違ってないのではないかな。
それとも、『つらく悲しい経験』(goo辞書から抜粋)とでも答えてほしかったのかな?
そして、学生や就職浪人なんぞの世代が古いコードをメンテしたとき、
コンパイラは当時の同じバージョンの処理系で
コンパイルするのが常套ではないか?
もちろん、新しいコンパイラを使っても構わないが、動くように直すより、当時の規格に沿って
メンテした方が遥かに楽な場合が多いだろう。
そして、私の憎む君らが、知るべくもない仕様に基づいたバグにはまり、
(悲しく)つらい体験をするのを祈っているのだよ。
何か変?
ANSI以前のCで自動変数の配列を直接初期化できないのはまだ有名なほうだと思う。
567 :
495 :2007/07/07(土) 00:34:10
>>560 眠いと勉強ははかどらないが、悪口ならいくらでもでてくるからなあ。
>>562 おやおや。私がまるで何も勉強してないとでも。
はい。腐るときは勝手に腐るのでいちいち構わなくてもいいですよ。
自称自己啓発君。
>>562 君がせめて鬱で自殺しませんように(爆
>>563 さっき言っただろう。
嵐の敵はみんなの無視。
眠くなったら寝るから気にするな。
>>566 んだな。
つうかそれ、もし対応して無いコンパイラを使ったら、コンパイル通らないだけ
じゃん。で、エラーメッセージが出力される。
全然困らんぞ。
ほんとうに昔のソースでは、確信犯的にリテラルを書き換えていることがあるが、
そっちのがまだ困るだろね。
ま、それに気づけば、コード書き換えるなり-fwritable-stringsを指定するなり
すればいいわけだが。
>>565 「メンテする憂き目」じゃなくて、
メンテする際につらい体験をするのを祈ってるって話だったのか
みんなこんなおっさん弄ってあげるなんて親切だなあ
571 :
495 :2007/07/07(土) 01:14:31
>>568 古いANSI-C(K&R第2版の頃な)で
void foo {
int a[100] = {0};
...
}
とでも書いてみたまえ。コンパイルは通るがaの要素がa[0]以外全てランダム値で
深刻なバグに発展するかもしれんね?
つまりだね。たかが一つ昔の仕様を回避したところで、
反証にはならんのですね。
それを何を偉そうに「全然困らんぞ」だって?
自分で気づいて直すならまだマシだが、納品後にクレームの電話。待ちますか?
納品後ってコンパイル通ったらすぐ納品しちゃうの?そんなに切羽詰った職場なの?
573 :
495 :2007/07/07(土) 01:28:59
>>572 ハイハイ。君の言ってる事は
「お前は何時何分地球が何回、回ったときに納品した?」
というレベル。
あっちでママが呼んでますよー。『そろそろ寝なさい』だって。ププ
574 :
495 :2007/07/07(土) 01:31:27
もう厨房しか居ないし、寝るかな。 また明日ー。俺が気に入らなかったら削除依頼でも出しときな。
明日も来る気ですかw おっさん忙しいんじゃなかったのかw
Kusakabe と毛色は違うが同類だな
削除依頼ワラタ 削除したいのはお前だけだって
よっぽど自分の間違いを「なかったこと」にしたいんだろうなぁ。 こういう責任の自覚がない香具師が下らん犯罪の元仁になったりするんだ。 くわばらくわばら
新しい仕様はC++には取り入れられないのかな?
新しい仕様はC++には取り入れられないのかな?
新しい仕様はC++には取り入れられないのかな?
新しい仕様はC++には取り入れられないのかな?
>>524 そんな問題とは違うだろ
新しいルールは後から参加してきた守銭奴によって政治的に作られるんだから
自然の法則に従って限界に達して出てきた障害とは一緒にするな
585 :
495 :2007/07/07(土) 10:55:13
なんだ。捨て台詞しかないのか。ツマラン
windowsのSIZEとかPOINTとかRECTの構造体で、 メンバの型をtemplate構文を使うことにより自由に決められるやつってありますか? こういうのって絶対誰もが考えると思うんだけどWTLにすらなくて・・・ 自力で実装するしかないんでしょうか?(´・ω・`)
はあ?
>>586 あるよ。ほら。
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();}
};
今作ったからバグってるかも知れないけど。
環境依存すらOKのスレで、 古いANSI-Cが前提となっている理由が理解できない。 それは君の勉強不足だろうと。
やっぱ無いんですね・・・ とりあえずsizeは参考にさせてもらいます 仕方ないのでboostとか使ってSTL対応の格好いいのを作っちゃうことにします(`・ω・´) いざ出来ても動作が重いとかサイズを食うとかで結局使わない感バリバリですが…
つうかWin32APIに渡す時点で構造体サイズは結局そこに合わせなきゃいけないから RECT<float>とかしたところでたいした意味はない
結局変換の時に一時オブジェクト生成する分オーバーヘッドになるだけですか… それでもAPIに渡すまででポータブルに扱う分には役立つだろうと思ったけどあまり意味無いですね(´・ω・`)
>>593 >589程度のクラスなら、どうせ最適化で消えるだろうからどんどん使えば?
size, point, rect辺りの綺麗にまとまったテンプレートクラスにして公開してくれたら
積極的に使ってあげるよ。
C++の質問があります。 map<int, FUNC> MAP; キーをint型、値を関数ポインタで、関数ポインタに関しては、他のクラスのメンバ関数も セット出来るようにしたいのですが、FUNCの定義の仕方がイマイチ分かりません。 御願いします。
>>595 メンバ関数ポインタを他のクラスのも使えるようにするってあーた・・・・
thisポインタをどうやって区別するつもり?
boost::function
仮想関数へのポインタなら、基底クラスの関数ポインタを使っとけば大丈夫。
オーバーロードされたコンストラクタについて質問です。 class A { int data; public: A(int x, int y){ data = x+y; } A(int x){ A(x, 0); } }; のような感じで、2つ目のコンストラクタは1つ目のコンストラクタを内部で呼んでいるのですが、 うまく値が入りません。 (これは例なので簡単にしてありますが、実際はもっと複雑なことをしています) コンストラクタの中で別のコンストラクタを呼ぶことはできないんでしょうか? いちおうコンパイルは通るのですが。
できない。 A(x, 0)は単に一時オブジェクトを作る式となるだけ。 元のオブジェクトとは何の関係も持たない。
何でデストラクタは単体で呼べるのにコンストラクタは呼べないの?
604 :
601 :2007/07/07(土) 23:42:02
なるほどそういう意味ですか。 ではどうするのがスマートなやりかたでしょうか? 初期化用の関数を作ってそれぞれのコンストラクタから呼ぶのがいいんでしょうか?
結局それが一番だよ。
>>603 placement new を使えば単体でコンストラクタを実行することはできる。
でもコンストラクタの中で自身に対して使っても正しい意味は成さない。
デストラクタだって、デストラクタの中から自身に対して呼んだりしちゃいけない。
deleteするとき、与えられたポインタの型が元のポインタの型ではなかった場合でも、正常に削除できますか? int *int_ptr = new int; void *void_ptr = reinterpret_cast<void *>(int_ptr); ... delete void_ptr;
PODならmalloc/freeでいいんでないの。
>>607 deleteでは、オブジェクトのデストラクタを呼んだ後
メモリを確保する必要があって
そのデストラクタが正しく呼べるなら違うポインタ型にしてもOk。
みなさんデストラクタの戻り値はチェックしていますか?
僕はコンストラクタの戻り値もチェックしてまつよ(`・ω・´)
615 :
デフォルトの名無しさん :2007/07/08(日) 01:13:30
C++を始めてする人にオススメという本はないでしょうか 自分はC言語を少し齧った程度で、オブジェクト指向の意味すらわかりません
>>615 メイヤーの「Eiffelオブジェクト指向入門」がオススメ
>>616 教えてくれてありがとうございます、明日辺り早速本屋で探してこようと思います
おいおい
619 :
617 :2007/07/08(日) 01:40:38
>>618 おいおいとか言われたら不安になるじゃないかぁーーー!!
>>617 俺もその本は持っているが、とても実践向きじゃない。
十数年前はオブジェクト指向なんて言葉自体珍しかったから、名前だけで買ってしまった。
Eiffel(エッフェル)なんて、謎の言語を覚える気なら敢えて止めはしない。
オブジェクト指向理解のためなら、JavaかC#あたりのほうがとっつきやすい。 C++はいろいろ細かいルールが多すぎて焦点がぼける感がある。
細かいルール云々というよりC++はマルチパラダイムなために、 オブジェクト指向に限らないというのが逆に理解のネックになるのかもな。 初心者だった頃先輩に薦められてModernC++Designを読んだときは一気に挫折しかけたwww
SADでも必死に会社に行っている人 [メンタルヘルス]
>>607 "デストラクタ virtual" でぐぐれ
>>620 そのサイトは間違いを指摘しても直さないから余りお勧めできないが。
C の勉強を K&R だけでやった。 C++ というかオブジェクト指向の入門を C Magazine の 連載だったと思う A級B型C++ だけでやった。 あとはテクニック本をよみつつ、本当に疑問に思った仕様は おおもとの仕様書(規格書)にあたる。
不明=別にどっちでもいいよって事だな えぴの記事は内容は古いけど初心者がC++の深遠を覗くにはいいと思うし あとC++プライマーとか普通の入門書を一冊手元においておけばどんなページでも役に立つと思うぜ
VC++とWin32APIプログラミングの違いが分かりません(´・ω・`)
ワープロと小論文の違いがわかりませんと言われても困る。
VC++使ってるけど Win32 API なんてほとんど使わないなぁ。
俺ライブラリとかATLとかその他公開されているライブラリにラップして使ってる人が殆どだと思う
638 :
デフォルトの名無しさん :2007/07/08(日) 13:28:24
10年前にVC++6.0使ってたんだけど、 今はWindowsでのC++開発環境って何がメジャーなの? VC++2007ってありますか?
残念ながらVS2008になりそうです
>>638 「VC++」でぐぐるとVisual Studio 2005のページが出てくるから、とりあえずそこ読んでおけ
cygwin/gcc/g++ mingw
コンパイル時に数が決まっている要素の数をカウントしたいんですが、
elementofマクロの話?
すみません。途中で送信されてしまったようです。 コンパイル時に数が決まっている要素(あるクラスを継承しているクラス)の数をカウントしたいんですが、 マクロの様なものを単純にコピペするだけでカウントするにはどうすればいいんでしょうか。
詳細が分からんと何も言えん
あるクラスを継承しているクラスの総数を知りたい? それはリンク段階でしか判らないこと無いか?
同一ソースコードに書いてあるので、コンパイル時にコードを下へ逐次見ていくだけで機械的にカウントできます。
今boost::preprocessorを使ってもがいてます...
649 :
デフォルトの名無しさん :2007/07/08(日) 16:46:40
VC++1.51をWIN98で使ってるんですが、DOSのプログラムを組んで走らせると ハングする事が多いです。BCC5.5でコンパイルすると問題無く動くのですが。 1.51でDLL16使うのはWIN95までしか対応してないのでしょうか。
>>649 IDE自体はWin9x/NT系で動かすとハングしやすいな。
デバッグ実行は特にめろめろだが、
作ったプログラムが単体でハングするならそれはあなたの作ったバグ。
builderで、警告が100個超えたら、 「エラーあるいは警告が多すぎる」と、最後にエラーが出てきました。 警告の上限の数は、決まってますか?
C言語でputchar('a');みたいに'あ'を出力するにはどうすれば良いでしょうか? ググってみたら #include <stdio.h> #include <wchar.h> int main(void) { putwchar(L'あ'); return 0; } こうかと思ったのですが、どうも違うようでよく分からないですorz
printf("あ");
Visual C++ 2008 になったら tr1 とかも実装されるのかな。 C99 互換モードとかもつくのかな。
>>653 書いた後でそう言われそうだと思ったけど、
そういう意味じゃなくて、
int hoge='a';
putchar(hoge);
こういう感じで'あ'を扱うにはどうしたら良いでしょうか?
a と あ って全然違うだろ。1バイトと2バイトだし
UTF-8 なら3バイト。
>>656 char hoge="あ";
putchar(hoge);
wint_t hoge='あ'; putwchar(hoge);
>>659 それなら、
char hoge[]="あ";
にしないとまずいだろ。
あまりにもひどい流れだ
>>660 自分もそうやるのかと思ったんですが、
それだと何も表示されないです。(VC++2005で)
ぬるぽ
666
ロケール?
あはなぁ・・・・
文字型を文字列で初期化できるわけねーだろ
>>652 ↓で良いが、例えば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;
}
wchar_t を使う事は根本的な解決になってるんだろうか。
>>652 #include <stdio.h>
#include <wchar.h>
#include <locale.h>
int main(void)
{
setlocale(LC_ALL, "");
putwchar(L'あ');
return 0;
}
Visual C++ 2005だとこれだけではバグってだめみたいだけど。
>>670 ,
>>672 ありがとうございます。
ちょっとbcc入れるのに手こずってました。
bccだと無事に動くっぽいですが、VCではダメなんですね。
しかしこれって単純に出来るものかと思ってたら、
意外と上手いこといかないものなんですね><
>>673 VC++でも以前のバージョンなら問題なく動くんだがな
Visual Studio 2005買うか迷う 早く2007か2008発売してくれたらいいんだけどな…
今買うのはいかにも時期が悪いだろう バグ持ちだしな(SPでも直ってねぇし)
おれはEclipse派
あれだけ難しいと思ってた「C言語ポインタ完全制覇」が今なんとなく読んだら 全部スラスラと理解できてワロタ 昔買った本読み返すとあぁ俺ちゃんと成長してると実感できてうれしいなw
ちょうどあるから読んでみよっと
Modernはいまだに7割くらいしか理解できん…
>675 2008は4Q(多分12月ごろ)。MSDNにすれば?
すみませんが質問です。 ある関数のバイナリを表示するプログラムを作ったのですが思ったとおりに表示されません。 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コンパイラです。 根本的な間違いの指摘、もしくは強引な方法でうまく表示させる方法を教えてください。
>>682 そこまでできてるんなら char を unsigned char にすればいけそうな気はするね。
でも、移植性のあるコードじゃないことは理解しておけよ。
684 :
682 :2007/07/09(月) 01:36:30
pの型を char → unsigned char
ついでに、%2.2Xは%Xで大丈夫な希ガス
687 :
682 :2007/07/09(月) 01:39:53
ミスりました。
>>683 ありがとうございます。
解決できました。
移植性のないコードであることは百も承知でございます。
cl.exeでコンパイルするとうまくC3のret命令で終わらなかったです。
ただ、アセンブリの勉強のために作ったので自らの環境で動けば問題なしです。
ご丁寧にどうもありがとうございました。
688 :
デフォルトの名無しさん :2007/07/09(月) 01:45:28
1byte文字、2byte文字が混ざった文字列から、 1文字ずつ読み込んで、これが1byteか2byteか判定するにはどうしたら良いでしょうか? お願いします。
txtから数字を読み込んでバブルソートするプログラムを組みたいのですが (数字は一行ずつ記述された状態) 出来ればそのあとさらに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(
gccだと型そのままでも %02hhX にすれば問題なく表示できるんだが bccでも同じなのかどうかは知らない まぁ、バイナリ扱うなら unsigned char にしとくほうが良いだろうけど
>>689 フォーマットが固定ならfscanfで読み込んでfprintfで出力すれば良いだけだと思うけど
fgetsで読み込みたいなら読み込んだ奴をstrtolするかsscanfにかければいいし
カレーが食べたいよ
>>678 遅レスだけど、俺もスラスラ読めて、さらには
「JAVAだとどうだとか、ほっといたれや」
とまで思ったりして、はじめ読んだときは「なるほどな〜」と
思ってたのに、今じゃ文句までつけやがる俺。
どんどんひねくれていく自分に嫌気がさす。
>>682 func と fend がメモリ上で連続する保証はあるの?
696 :
デフォルトの名無しさん :2007/07/09(月) 14:14:04
age
sage
おしえてください (VC++ 6.0 MFC) エディットコントロールに複数行の文字列を表示させた時、 その時のスクロールの位置を一番下の行にしたいのですが、うまくいきません。 m_editMsg.SetWindowText( m_strLog ); m_editMsg.SetScrollPos( SB_VERT, m_editMsg.GetScrollLimit( SB_VERT ) ); この処理を行うと、スクロールバー自体は一番下の行に移動した様な表示になるのですが、 表示される文字列データは、先頭部分が表示されてしまいます。 どうしたらいいのか教えて下さい。お願いします。
エディットは、キャレットの位置を動かせ EM_SETSEL 使えばいいかな。
>>687 関数間が NOP (90h) で埋められてるなら
NOP が出てくるまで・・・と出来そうな気はするけど、
コードの途中で境界合わせに NOP が出てこない保証もないし、
ダメかなあ・・・。
>>700 定義順に関数アドレスが並ぶ保証はどこにもないよ
>>700 関数間がNOPで埋められる保証もどこにも無いよ。
>>704 「関数間が NOP (90h) で埋められてるなら」
という条件付きで話してる事に、そう言われても・・・
この手の板にはよくあること
関数のアドレスが、ジャンプテーブルだったりするのも よくある話。
C++だけではGUIって作れない? API勉強しないとだめ?
>>708 「C++だけ」ってのが「標準C++ライブラリだけ」ってことならyesだな
>>709 ありがとう。さすがにCUIばっかりで飽きてきちゃったからAPI勉強してみる(`・ω・´)
>>709 否定形の問いかけに対して安易にyesと答えてはいけないw
>>705 VC2005だとそうなっては無かったから、
結構多くのコンパイラでその仮定は間違っているんじゃ無いの? と思っただけ。
どっちにしても
>>700 はあんまり意味無さそうだね。
>>707 vc8のインラインアセンブラだと
× call printf
○ call dword ptr [printf]
○ call test_func
○ call dword ptr [test_func]
(test_funcは同じオブジェクト内の自作関数)
じゃないとうまく動かなかった。
不思議なような、そうでもないような。うーん。
call printfがだめなのは、ランタイムDLLを使っているからという可能性は無い?
>>714 That's right ! そのとおりだった!
ってか、前にMTでテストしたはずだったんだけどな・・・orz
関数最後のサブルーチンコールはジャンプで実装する最適化もあるぞ。
>>712 昔の VC6 くらいそうなってなかったかなあ。
2005もDebugとReleaseで違うしな
質問です。 基本的にMFCのDoc-Viewを用いたプログラムです。自分で生成した特定の ウィンドウのスナップショットを、画像に保存したいのですが、どのようなアプローチで 進めたらいいのか悩んでいます。 1. 非アクティブまたは非表示な場合でも、フレームを含めたウィンドウ全体を 画像として取得するような手段はあるのでしょうか? 2. 1.が不可能なら、非アクティブまたは非表示で、ウィンドウの内容(例えばCViewの 中身)のみを取得する手段はあるのでしょうか? XP VC2005 SP1
fgets(str,N-1,stdin); printf("%d",(int)strlen(str)); ↑な感じのコードを書いて実行させると、 【実行画面】 >hoge 5 となるのですが、これってどうなっているのでしょうか?
hogeの後に改行文字がくっついてて、それも数えられてるから
あぁ、改行文字を読み込んでたのか!
ヌル文字は入れないはずなのになんでかと思ったら…。
>>721 サンクスです!
>>718 2005だとRelease,Debugとも基本的にNOPは使ってないよ。
char str[10]="piyo"; これでstrが指す場所を"yo"にしたいのですが、 どうすれば良いでしょうか?
>>725 char *str2 = &str[2];
>>725 文字列をコピーしたいってより、yoの場所まで移動させたいのです。
array[i++]=strtol(str,&err,0);
これを繰り返し行う際にstrをstrから任意のバイト分進めた値にして
文字列を完全に走査、数値格納したいのです。
そのstrは配列だからそもそも指すとかそういう表現はしない &str[2]とかstr+2好きなように表記すればよか これが気持ち悪いなら別途charへのポインタ用意して char *p=str; とした後に読み進めたいバイト分だけp+=2みたいにインクリメントすればいい
char* p = &str[2]; でいいんじゃね
str[i]2
>>727 strtol の使い方が知りたかっただけなんだね
#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;
}
733 :
732 :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;
}
#define N 256
どなたかC++に詳しい方、教えてください。今日、はまりました。 以下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); };
呼び出し側のコードはどうなってんの
NUMばっか出てきてとか見づれーんだよ。もっと考えて書けよドカスが
>classc->func(NUM_2);をコールするとClassC::func(int, NUM)
理由は
>>737 だ
ClassCでfunc(int,NUM)を宣言しちゃったから、ClassAのfunc(int,NUM)が見えなくなってる。
あとvirtualな関数にデフォルトパラメータつけるな
>>737 >>738 >>739 見づらくてすいません。
C++にそんな仕様があるとは知りませんでした。
ありがとうございました。
参考までに
>あとvirtualな関数にデフォルトパラメータつけるな
は何故でしょうか?
デフォルトパラメータは静的な型に依存する class 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と表示される だった筈
>>741 なるほど。納得しました。
ありがとうございます。
744 :
デフォルトの名無しさん :2007/07/11(水) 10:08:49
>>188 PHPアプリとCアプリとログ出力先を共通化という
無茶な事を要求されているときも
行単位の一発書き込みなら大丈夫かな?
2プロセス立ち上げてそれぞれ適当に書き込みをさせて
100万回くらいテストしたんだけど これで混ざんなかったから
多分大丈夫だよね?
>>744 「行単位の一発書き込み」がシステムコールレベルでそうなっているなら大丈夫。
具体的には、(直接的または間接的に)O_APPENDでopen()されており、write()
一発で1行を書き込んでいるなら大丈夫。
それから少しでもズレるならダメ。
Win32の場合、O_APPENDに相当する機能がCreateFile()に存在しないので、
*必ず*排他が必須になるようだ。
質問失礼します。 シャノンの符号化法による符号語生成プログラムと、 表計算ソフトを用いた符号語生成の違いについて説明して頂けないでしょうか? よろしくお願いします。
>>746 表計算ソフトを用いた符号語生成って、何のことか教えて。
>>743 ちなみに741の問題を回避するためにもNVIパターンが使えるぞ。
749 :
デフォルトの名無しさん :2007/07/12(木) 08:23:23
すみません string型でファイル名を持っているとき、それをオープンしようとすると エラーが出ます。char型にするにはどうすれば良いですか?
750 :
749 :2007/07/12(木) 08:26:48
自己解決しました
つc_str()
752 :
デフォルトの名無しさん :2007/07/12(木) 08:27:49
ありがとうございました
753 :
デフォルトの名無しさん :2007/07/12(木) 08:51:04
ファイルを読み込むとき、終端で必要以上のサイズを 読み込むと配列が最後まで埋まってしまいます どうすれば実データのみ読めますか?? fp.read(str,N); とすると strのサイズはNになります
何使って読み込んでるの? fp の型は?
755 :
デフォルトの名無しさん :2007/07/12(木) 09:04:02
fstream fp ("filename", ios::in | ios::binary ); なんですけど、fp.read(str,N); の戻り値は、istream 型です どうすればサイズがわかりますか??
756 :
755 :2007/07/12(木) 09:24:03
自己解決しました fp.gcount();で読み込みサイズが出ました
757 :
デフォルトの名無しさん :2007/07/12(木) 13:10:42
すみません サイズの小さいファイルをクローズしようとするとエラーが出ます 開いてから閉じるまでの期間が短すぎる為だと思います どうしたらいいでしょうか?
>>757 エラーメッセージ貼れ。できれば問題を再現できるソースもな。
759 :
デフォルトの名無しさん :2007/07/12(木) 13:22:08
>>758 すみません
fstream fp ("filename", ios::in | ios::binary );で開いたファイルが
閉じられているかどうかを調べる方法はないですか?
760 :
デフォルトの名無しさん :2007/07/12(木) 13:27:08
failbit で状態が調べられるんですけど、 close()した時点でwindowsからエラーが出てしまいます そのため状態は取得できません・・・
761 :
デフォルトの名無しさん :2007/07/12(木) 13:34:06
コンパイラを変えたらエラー出ません 無視して別のコンパイラ使います
763 :
デフォルトの名無しさん :2007/07/12(木) 14:10:00
649>> はメモリモデルをHUGEにしてみよう。
1〜136の昇順に並んでる数字の列をランダムな順に並び替えたい
数列をstd::vector<T>の形で用意してやれば std::random_shuffle()で終了〜 やっぱC++って最高だろ?そうだろ、そうだといえよコラ
>>764 136って…麻雀?
#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;
}
>>765 配列でも構いやせんぜ、旦那。
int value[135];
:
:
std::random_shuffle(value, value + 135);
135?
VC++を使ってます class A{ char *buf[] = { "数学", "英語", "理科" }; }; と書くと .\prac.cpp(6) : error C2059: 構文エラー : '{' .\prac.cpp(6) : error C2334: '{' の前に予期しないトークンがありました。関数の本体は無視されます って出ちゃうんですがクラスの中でポインタを初期化しちゃいけないって言う決まりみたいなのがあるんでしょうか?
メンバ変数ならコンストラクタで初期化しろ
間違えた staticでconstな整数型以外はダメ
class A { char *buf[3]; public: A() { buf[0] = "数学"; buf[1] = "英語"; buf[2] = "理科"; } }; こうなるんかな? なんかダサイぞ
>>775 試しにそれ実行したら
なんかすごいエラー出ますた
メモリ確保してないのに代入するとあぼん
std::vector<std::string>使えよ
これでどう? class A { char *buf[3]; public: A() { buf[0] = new "数学"; buf[1] = new "英語"; buf[2] = new "理科"; } };
入門書読めば解決
インデント表現するために全角スペース使ってるからだろ。
>>779 >>775 はコピペしたせいで全角空白が認識されてしまったみたいです。
プラグラムの内容とは関係なかったです
長々と申し訳ないです
ありがとうございます
const付けとけよ
class A { const char * const buf[3]; public: A() : buf(...) {} }; こうしたい場合、bufはどうやって初期化すればいいの?
配列リテラルでは初期化できないはずだから、他に定義したポインタを持ってきて初期化することになるのでは
配列は初期化リストが使えないから無理なんじゃねw
#include <iostream> class 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); } あんまり意味が無いどころか臭ってくるけどこんな感じで
790 :
デフォルトの名無しさん :2007/07/14(土) 09:09:48
すいません質問です。 static 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 } }; これって配列なのでしょうか? どういうふうに解釈すれば良いんでしょうか?
そのコード書いたやつに聞けよ。
オマエはEmacsのソース読んでて、 わからなかったらRMSに聞きに行くのか? オマエはLinuxのカーネル読んでて、 わからなかったらリーナスに聞きに行くのか? オマエはMINIXのソース読んでて、 わからなかったらタネンバウムに聞きに行くのか? オマエはWindowsのAPIが わからなかったらゲイツに聞きに行くのか? おまえはDarwinのソース読んでて分からなかったら アビに聞きに行くのか? オマエはC言語がわからなかったら、 カーニハンとリッチーに聞きに行くのか?
>>790 頭わるいなぁ・・・ struct s_keywords の配列以外のなにものでもない 一行がひとつの struct s_keywords だよ
なんでバカなのにえらそうなんだ 煽りはスルーしろよ もちろんこのレスも
なんでダイレクトな回答を書かずに ねちねちどうでもいい話する香具師が多いんだ
char str[256]; ifstream in1("data.txt"); while(in1.getline(str, sizeof(str)) > 0){ if(str == "aaa") cout << str << endl; } 上のような感じでdata.txtファイルに”aaa”という一行があればそれを出力、というプログラムを書きたいんですが "aaa"という行があってもなぜか何も出力せずに終わってしまいます。 if文をコメントアウトした場合全行出力されたのですが char型配列の比較部分に問題があるんでしょうか? どなたか教えてください
strcmp
C++ならstd::string使いなさいな
>>798 >if(str == "aaa")
直感的に打ち込みましたって感じだな。
やってることは
strという配列の先頭アドレスと
無名なconst charであり中身が"aaa"である文字列の先頭アドレスを比較しているだけで
常に結果は偽である意味不明なコードなんだが。
char型から勉強したなら if(str[i] == 'a' && str[i+1] == 'a' str[i+2] == 'a') まず、こういうのを考えると思うんだけど Javaから入ったとかかな
訂正 if(str[i] == 'a' && str[i+1] == 'a' && str[i+2] == 'a')
ないない。 intの比較がi==hでいけて、 Cの文字列はchar *hoge="str"だ、と習ったら、 文字列の比較はhoge=="str"でいけると思うって。
std::stringクラスならそういう比較も出来るのにね
808 :
デフォルトの名無しさん :2007/07/14(土) 17:35:43
stringの機能つかいたいんですけど ファイルから一行読み込んでいきなりstrinに入れられませんか? そういう入力がないような
#include <iostream> #include <string> #include <fstream> int main() { std::ifstream ifs("test.txt"); std::string buf; std::getline(ifs, buf); std::cout << buf; } こんな感じで割りと簡単に出来る
810 :
デフォルトの名無しさん :2007/07/14(土) 17:55:50
811 :
808 :2007/07/14(土) 18:06:38
あのー間違ってバイナリをgetlineで読み込むと止まらなくなってしまいます バイナリのときは開かないようにするにはどうしたらいいですか?
それならstring使わずにchar型の配列なり使って #include <iostream> #include <fstream> int main() { std::ifstream ifs("test.txt"); char buf[10]; ifs.getline( buf, sizeof(buf) ); std::cout << buf; } のようにして一行の最大文字数を限定するとか
813 :
808 :2007/07/14(土) 18:17:34
binaryで開いてから、 NULL 文字 (バイナリ値で 0) が 入っていたらバイナリ、いなければテキストとすればいいんでしょうか? そしてからテキストモードで開き直す
814 :
デフォルトの名無しさん :2007/07/14(土) 18:19:37
>>812 それだと当初の目的と違ってしまいます....
いきなりstringにいれたいんです
815 :
808 :2007/07/14(土) 18:44:08
80Kバイトまで読み込んで、バイナリで0が現れなければテキスト としたらサンプルをすべて判別できましたよ
816 :
デフォルトの名無しさん :2007/07/14(土) 19:04:47
貼り付けておきますね でもすべてで有効ではないようです int 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;}
ここでUTF-16の登場です
818 :
デフォルトの名無しさん :2007/07/14(土) 19:51:07
C言語の勉強したいんですが初めて使う本とソフトは何がいいですか?プログラムは何もやったこと無くてPCの知識は0です。 猫でもわかるC言語と猫でもわかるwindowプログラムの本を買って、Microsoft visual studio 2005 Professinal edition というのをインストールしてみました。 ソフトのほう種類がたくさんあってこの時点で何がなんだかわからないんですがソフトはこれであってますか?
819 :
デフォルトの名無しさん :2007/07/14(土) 20:07:55
>>818 初心者は、BCC developerとc++ (STL)をやったほうが良いですよ
cで出来る事はc++でより簡単にできます
嘘を嘘とry
マジレスすると PCの基本的なことを知らないままプログラム書いていると とんでもないヘボなことしてて気付かない糞プログラマになるよ 多少回り道だと思っても基本はおろそかにしないでくれ給へ
>>818 本もソフトもそれでいいよ、でも
>Microsoft visual studio 2005 Professinal edition というのをインストールしてみました
これは有料ソフトじゃねーの?
ExpressEditionなら無料であった気がするけど
ていうかPC初心者でプログラミング未経験ならCは薦めない
理由は?
825 :
デフォルトの名無しさん :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バイトくらいで繰り返すと、エラーで止まります
826 :
デフォルトの名無しさん :2007/07/14(土) 20:33:30
fq.close()の終了前に、オープンしようとしてエラーになると思うのですが・・・
低水準すぎて、やりたいことができるようになるまでの道のりが遠いだろう。 とは言え、何を薦められるかというと、難しいところだが。
delete str
829 :
デフォルトの名無しさん :2007/07/14(土) 20:37:02
>>828 strとは関係ないとおもうんですけど・・・
閉じる処理が完了する前に次へいってしまう所では?
HSPからすべてがはじまる・・・!
>>825 「エラーが出て止まる」の意味が分からん
どういうエラーが出るの?
while(1){ str 生成、fn 生成 { fstream fq(fn,ios::out);if(!fq)return 0; fq <<str<<endl; } } これでおk?
833 :
デフォルトの名無しさん :2007/07/14(土) 20:45:08
>>831 すべての処理が終わる前に、return 0をしてしまいます
別名ファイルを出力用に生成しますから通常はエラーにならないはず
834 :
デフォルトの名無しさん :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になりました
何だそりゃ めちゃくちゃ訳わかんねぇ つか怪しすぎ
まさか同じ秒だと同じファイル名を生成していましたとかいう 下らねぇ落ちじゃねぇだろうな
837 :
デフォルトの名無しさん :2007/07/14(土) 21:11:54
ファイル生成部分 char 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++; です 一回ごとに変わります
似たような問題を経験したことあるけどclear(0)したらバグんなくなったよ なんでバグらなくなったのかわからんし、それに効くかもわからんけどw
839 :
デフォルトの名無しさん :2007/07/15(日) 02:48:47
16進文字列を、0から15の数値へ変換するにはどうしたら良いですか?
strtolとか。 sscanfで書式%xで読み出す
841 :
デフォルトの名無しさん :2007/07/15(日) 02:58:57
サンクス 自分でやってみました cが16進文字のとき、x= e>64?e-55:e-48が数値です・・・
ASCIIコード依存のプログラムはあんまり書く癖つけないほうがいいかも かく言う俺も高速化のためには良く使うんだけど
#if #error でも仕込んどけばいい。
844 :
デフォルトの名無しさん :2007/07/15(日) 03:20:33
「16進文字列」という用語を、0-9,a-fと理解したか、 0xabcと受け止めたかだな
845 :
デフォルトの名無しさん :2007/07/15(日) 03:22:47
最近boost始めようと思い立った次第ですが、
http://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に対応してないようですし……
847 :
デフォルトの名無しさん :2007/07/15(日) 03:27:56
こんな感じか? int 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;}
848 :
デフォルトの名無しさん :2007/07/15(日) 03:31:03
boostが標準で入っているコンパイラはないのでは? C++ならどれでも使えるのでは?テンプレートがコンパイルできれば
cygwinで選べばプリコンパイル済みのが入るよ
850 :
デフォルトの名無しさん :2007/07/15(日) 03:42:06
newとvectorとintとstatic intでは確保できる配列数に違いがありますか??
C/C++で食うつもりなら大半は制御系逝きだからなぁ 書き換え可能な静的配列は利用制限があるんじゃないの?
制御系なら何だというのか?その理由は静的か動的かで変わるのか?
確保できるメモリって意味でしょ。 static constなメモリ領域はマスクROMに焼ける
returnって何? 関数じゃないよね。
関数から戻る、戻り値を指定する文のためのキーワード。
struct Point { int 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に置き換えられたとしても、スコープの関係上おかしくないんですか?
うん
>>845 これなら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;
}
>>858 int f(int n) { return n; }
printf("%d\"n, f(1));
がおかしくなるとお思いか?
>859 >うん 何故ですか? offsetPoint.xとoffsetPoint.yが通用するのは 関数SizeToPointの中だけじゃないんですか? どういう風に評価されるんですか?
>>861 >int f(int n) { return n; }
>printf("%d¥"n, f(1));
コレは納得できるんです。
だってこの場合は数を返しているから。
返しているのは「値」であって「変数」じゃないというのは判ってるんだね。 じゃあ、返り値がstructである場合も、返しているのは「値」だというのはわかるかい?
>>864 >返しているのは「値」であって「変数」じゃないというのは判ってるんだね。
はい。
>じゃあ、返り値がstructである場合も、返しているのは「値」だというのはわかるかい?
ここなんですよ。
この理屈なら構造体変数offsetPointにも値がないと説明がつかないですよね。
ならoffsetPointの値は何という話になりますよね。
locationの値がoffsetPointに渡されてるんだろ
>>866 >x, y の値の組み合わせだろ。
仮にx,yの組み合わせが返ってきたとしても、
そもそもその組み合わせである構造体offsetPointが通用するのは
関数SizeToPointの中だけでmain関数からは構造体としては見えないんじゃないんですか?
>>868 変数 offsetPoint が通用するのは関数 SizeToPoint() の中だけだが、
その戻り値は違う。
>>868 mainから見えてるのはoffsetPoint変数じゃない
Point構造体は見えてる
具体的にアドレス表示させて見ると違うってわかるかも
戻り値のアドレスは取れんのじゃないか?
>>869 >変数 offsetPoint が通用するのは関数 SizeToPoint() の中だけだが、
>その戻り値は違う。
>>870 >mainから見えてるのはoffsetPoint変数じゃない
>Point構造体は見えてる
>>871 >具体的にアドレス表示させて見ると違うってわかるかも
そうなんですか?
まぁ納得できました。
そういえば昔コンパイルされたプログラムの中では局所変数の名前の情報は失われる
って書いてあった本を読んだ事が有るような無いような。
>>873 名前の情報とかいうのはイマイチずれてるな。
戻り値のアドレスを取得しようとしたんですけれど 良く分からなくてダメでした。 どうしてダメなんですか? コンピューターの中のデータは全部メモリに格納されていて アドレスがついているんじゃないんですか?
もう「戻り値のアドレス」なんて話は忘れろ。 Cの関数は「値」を返す、それだけ。 「値」、つまり1とか2とかに、アドレスがあるわけないだろ(厳密にはどこかに記録されているけど)。
で、戻り値が整数なら、整数がその「値」だし 浮動小数や構造体なら、それぞれ別の「値」を持つだけ。
なんか連投してるが で、もちろん、「実装としては一般的にどうする」というのはある。 構造体を返す場合は隠れた第一引数でアドレスを渡す、とか。 でも、そんな事は普通は気にするべきじゃない。
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; } 逆に、問題になりそうなパターンを考えてみるとか
・(C++の)参照を返す関数以外の関数呼び出しは右辺値式ではない ・&演算子はオペランドとして左辺値式を要求する ・メンバ演算子はオペランドとして左辺値式を要求しない ってだけだろ
882 :
881 :2007/07/15(日) 12:09:55
typoった ×・(C++の)参照を返す関数以外の関数呼び出しは右辺値式ではない ○・(C++の)参照を返す関数以外の関数呼び出しは左辺値式ではない
Borland C++ Compiler 5.5です。 Cでは、Javaのlengthメソッドのような、配列の長さを取得する手段はありますか?
sizeof(array) / sizeof(*array)
885 :
883 :2007/07/15(日) 14:28:33
ありがとうございます! for文がかけなくて困ってました。
Cのプログラムをjava風にvoid main()って書くのはいけないことなの?
intを返すべきと昔から決まってます
そうなのかーthx
>>880 関数*SizeToPointの第一引数struct Point offsetPointはコピーなのに、
return &offsetPoint; としても問題ないんですか?
コピーは関数を抜けたら消えると思うんですけど
>>890 問題あるよ。
コンパイルエラーにならないし、動いちゃうことも多いから気をつけるべき
893 :
デフォルトの名無しさん :2007/07/15(日) 22:00:10
HWND LPCSTR LPSTR DWORDという変数にはどういった意味があるんでしょうか? DLLを使いたいんですけど、()内に入ってます
C++ なら const 参照で受ければ テンポラリオブジェクトのアドレスを取得できるね。
>>893 もの凄い勢いで typedef について調べるんだ
897 :
デフォルトの名無しさん :2007/07/15(日) 22:12:15
>>893 の意味が気になって10秒ごとのリロードしてます。
HWND LPCSTR LPSTR DWORDが何なのかを教えてください。ペコリ、ペコリ
うぜえ。 ググれや。
HWND →ウィンドウハンドル LPCSTR →NULL終端の変更不可な8ビット文字列へのポインタ(const char*) LPSTR →NULL終端の8ビット文字列へのポインタ(char*) DWORD →32ビット符号なし整数(unsigned int)
>>897 typdefを知らないならこうしてるもんだとでも思え↓
#define LPCSTR char *
#define DWORD unsigned long
おーーーーっ、リロードしまくりの甲斐がありました。誠に有難うございました。 なんで、そんなめんどくさい別名を付けてるんですか? HWNDには本名ないのですか? 無いのにC言語で使えるって変じゃないですか?
>>901 定義はincludeフォルダをgrepしろよ。
別名をつけるのは意味的に分かりやすくするためだよ。
いつもいつも素で書いてたら意味不明になってくるだろうが
>>901 処理系依存の部分をラップして移植性を高めるため。
例えばintが何ビットかは(殆どが32ビットだが)仕様で定められているわけではない。
DWORDの場合などは実際の型を隠蔽することで32ビット値であることを保障してるわけだ。
これ以上はググれ。
実際には隠蔽し切れてないし元の型が何であるかを無視はできないけどな
905 :
デフォルトの名無しさん :2007/07/15(日) 23:19:47
すみません、grepってはじめて知りました。 LPCSTR →NULL終端の変更不可な8ビット文字列へのポインタ(const char*) LPSTR →NULL終端の8ビット文字列へのポインタ(char*) DWORD →32ビット符号なし整数(unsigned int) 今のWinの場合は()の中が本体だけど、本体は将来変わる可能性あり、でも、 →から(の前の定義は変えないよということですね。 どうも、どうも。
Cにはクラスがなかったからだよ
HINSTANCEの定義 DECLARE_HANDLE (HINSTANCE) #define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name つまり typedef struct HINSTANCE__ { int unsed; } HINSTANCE; となるんだけど、なんのためにこんなことしてるの?
>>907 HINSTANCE hi = ...
HDC hd = hi; // これをエラーにしたい。
>>908 その場合、単純に
struct HINSTANCE__; typedef struct HINSTANCE__ *HINSTANCE;
じゃダメなんかな?
それでは前方宣言しかしてないのでは
そうだねぇ。不完全型の扱いがヘボいコンパイラでもあったんじゃね? VOID を typedef してる時代だからな。
いや、それで問題ない。それどころか、これで十分なはず
>>910 ポインタだけ使うから前方宣言だけで十分なのに構造体の定義まで
与えてるのが要らないってことだろ。
914 :
912 :2007/07/16(月) 01:37:39
すまん。途中で送信してしまった。 typedef struct HINSTANCE__ *HINSTANCE;
915 :
910 :2007/07/16(月) 01:51:59
ああ、そうかorz あとはもうサイズ合わせの用途くらいしか思いつかない
time_t time(time_t *t); みたいなもんか
しつもんです。 他のところでは 0x70000000 と16進数が使われているのに 一部分だけ 0 << 28 と書いてあります。 どうして作者は 0<< 0x1c としなかったのでしょうか?
各所わかりやすい方で書いてるんだと思うよ
1 << 28 だろー ビットシフトの右側の値は 16 進数にする理由がない。
>909 エラーにしたいのは、STRICTが定義されているときだけ。 だったはず。
現在ゲーム木を作っていて、 あるクラスオブジェクトをノードに持たせるか、 クラスオブジェクトに枝を持たせるかで悩んでいます。 定石があれば教えてください。 class A{ : }; class Node{ A a; 長男を指す枝構造体へのポインタ; : } とするか、 class Edge{ : } class A{ : 長男を指す枝クラス(Edge)へのポインタ } を迷っています。おかしなこと言ってないといいんだけど……。
>>923 どっちでも同じことができるんだから、あとは本人以外に判別不能。好きにしろ。
>>923 クラスオブジェクト自身が子ノードの情報を持つ必要があるなら枝を持たせる。
そうでなければノードに持たせる。
>>924 オブジェクトとデータ構造はなるだけ分けたいから、自分なら前者かなぁ
927 :
926 :2007/07/16(月) 03:29:19
重箱だがC++にクラスオブジェクトは無いよな
あるクラスのオブジェクトと読み替えてあげようぜ
そういうときは インスタンスとか エンティティとか ふさわしい表現があるだろ
実体はこの文脈ではどうなんだろう? オブジェクトの方がいいような気がする。個人的には。
C++的にはインスタンスと言う方が多い気がする ていうかオブジェクトという単語は意味が多すぎて
>インスタンス >「オブジェクト」とほぼ同義語のように用いられることが多いが、 >実際にメモリ上に配置されたデータの集合という意味合いが強く、 >データの実体をより具体的・直接的に捕らえた用語である。 だそうだ
ライブラリを作る作業は「リンク」って表現しますか?
>>923 Stroustrupの「プログラミング言語C++」の用語で言うと
前者が非侵入的リスト、後者が侵入的リストに相当するのかな。
どっちも設計としてはあり得る。
非侵入的リストは汎用的にするなら普通はstd::list<>のようなテンプレートに
なるだろうし、
侵入的リストの場合は、リンク部分を独立した型にして、それを包含させるか
継承するか、という形にするのが普通だとは思うが。
BSDのsys/queue.hのようなものはマクロをつかってCで侵入的リストを
実現している好例だ。
Windowsでも、winnt.hに似たような代物がある。
937 :
デフォルトの名無しさん :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); }
938 :
デフォルトの名無しさん :2007/07/16(月) 15:24:59
(*pf)の戻り値か、sの値をみればいいですか?
939 :
デフォルトの名無しさん :2007/07/16(月) 16:01:36
>>937 です
どうやら、解凍が終わるまで停止するようです
940 :
デフォルトの名無しさん :2007/07/16(月) 21:38:13
vectorにファイル名とポイント持たせられますか? 既に存在していればそれを使いなければ追加したいんですが? map とかの方がいいですか?
>>940 日本語でおk。
えーと。エスパーしてみると、
君の言うようにstd::map<>やstd::set<>向きの仕事だと思う。
たぶんね。
942 :
デフォルトの名無しさん :2007/07/16(月) 21:56:43
map<string, fstream> m; m.insert (pair<string, fstream>("filename", fp)); とするとエラーになります なぜでしょうか
943 :
デフォルトの名無しさん :2007/07/16(月) 21:59:36
string fname[1000]; fstream fpoint[1000]; とやって多めに確保して地味にやっていきます・・・
>>940 Vector・mapはだめ、リンクリストが最適だよ
>>942 そりゃ、fstreamはコピーができないからだ
STLコンテナは要素がコピー可能であることを要求する
ポインタを使うんだね
946 :
デフォルトの名無しさん :2007/07/16(月) 22:06:49
map<string, fstream*> m; m.insert (pair<string, fstream*>(str, &fp)); でいいんでしょうか?
>>946 それでもよいのだが、そうする場合はfpの寿命管理に気をつけろ。
出来ればナマのstd::fstream*ではなく、boost::shared_ptr<std::fstream>などを
使うのが良いだろう。
948 :
946 :2007/07/16(月) 22:20:48
サンクス
ヘルパーあるんだからstd::make_pair使おうよ。
950 :
デフォルトの名無しさん :2007/07/16(月) 23:07:28
あのファイルの出力用オープンが失敗するんですけど 原因はわかりますか?? 出来るやつと出来ないやつがあります 空き容量は十分にあります
951 :
デフォルトの名無しさん :2007/07/16(月) 23:08:57
失敗するやつはSleepで休んでからでも失敗します
952 :
デフォルトの名無しさん :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
953 :
デフォルトの名無しさん :2007/07/16(月) 23:20:33
エスパー降臨キボンヌ 地震きたー
954 :
デフォルトの名無しさん :2007/07/16(月) 23:39:40
ファイルを確実に閉じたり開いたり出来る方法ないですか? closeもopenもうまくいきません
956 :
デフォルトの名無しさん :2007/07/17(火) 00:00:34
VisualStudio.NET 2003 C++ XP SDK( MFCなどは使わず) 質問です システムのミキサーの音量設定をプログラムから調整するにはどんなAPIを使ったらいいんでしょうか?。どなたかお願いします。m(__)m
なんでコンパイラやらOSやらが頑張って表示してくれてるエラーメッセージを さっくり無視するんだろうねえ
>>954 普通に書けばうまくいくよ
君の書いたコードが悪い
>>954 VC++8.0で日本語を含むファイルが開けないのなら、ロケールを設定汁
ウムラウトとかを含むファイルが開けないのなら、stdioやfstreamを
使うのは断念してCreateFileW()を使え
961 :
デフォルトの名無しさん :2007/07/17(火) 00:20:02
同時に開ける数に制限があるとか 46個開くと次が駄目です
962 :
956 :2007/07/17(火) 00:26:31
>>961 なんでそんなに同時に開く必要がある?
よほど大きいファイルを扱うんでなければメモリ上で処理すれば良いだけだと思うんだけど
何かそれ以外の制約でもあるんか?
965 :
964 :2007/07/17(火) 00:39:56
と思ったけど、やっぱ質問者な気がしてきた すまん
966 :
デフォルトの名無しさん :2007/07/17(火) 00:46:42
全部で20ギガのテキストなんです・・・ それを約1000個のファイルに種類分けしたいんです・・ でも、CreateFileつかったら48個以上いけました!! 1000個同時に開けるかは不明です・・
967 :
デフォルトの名無しさん :2007/07/17(火) 00:50:46
基本的にwindowsの関数の方が優れているんですかね???
?
969 :
デフォルトの名無しさん :2007/07/17(火) 00:56:03
>>968 CやC++の標準関数は安定してそうだけど実はwindowsXPの関数(API)の方が
いいんですかね??ってことですよ
windowsのユーザーは多いし、アップデートも頻繁だし
>>969 安定してるとか、そういうことじゃないから。
C/C++ のライブラリ関数は OS の API を利用して作られている。
>>969 ま、ケースバイケースだな。
標準関数は移植性が高いが、仕様が限定的で不便なこともある。出来ることも
限られている。
ファイルをあまり開けなかったりするのは、まあCランタイムの実装都合だな。
多分ファイル構造体配列をstaticに保持しており、その中の開きスロットを
見つけて使うような実装なんだろう。
一応FOPEN_MAXという定数が定められており、それを越えるファイルをstdioでは
同時に扱うことは保障されないと思っていい。
(STLじゃなくて)C++の標準ライブラリ(ifstreamやstringなど)の豊富な説明が載ったWebサイトはありますか? それとも、本を買って調べるべきですか?
974 :
デフォルトの名無しさん :2007/07/17(火) 02:18:07
windowsXPのコマンドプロンプトから、bcc32を使ってコンパイルしています。 const char a[] = "●○"; cout << char[1]; と出力させようとすると、おかしな表示になります。 日本語 出力 const wchar_t a = L"●○"; wcout.imbue( locale("japanese") ); wcout << char[1]; としても駄目です。どうすれば良いでしょうか?
char[1]じゃない。 a[1]だorz
976 :
974 :2007/07/17(火) 02:58:20
自己解決しました。 char *a[] = {"●","○"}; cout << a[1]; としたらできました。 ポインタで指定した文字列なら、普通に出力できる??? なんでだ。
978 :
デフォルトの名無しさん :2007/07/17(火) 18:58:35
cコンパイラってすべてwindows APIを利用しているんですか?? アセンブラに翻訳してwindowsの機能は使わずcpuの機能を使っているのかとおもいました
API使ってるのはファイル操作とかOS依存の部分だけ。
980 :
デフォルトの名無しさん :2007/07/17(火) 19:18:09
サンクス
質問です。 int main (){ int i = 0xFFF, i1; unsigned char *ch = (char *)&i; i1 = *ch; printf ("i1=%X¥n",i1); return; } このi1の値が0xFFになるはずなのですが、 0にしかなりません。 どうしてでしょうか?
>>981 >このi1の値が0xFFになるはずなのですが
そんなこと決まってないよ。環境依存。環境は?
> unsigned char *ch = (char *)&i; この辺で何か変なことが起こってるんじゃないかと想像 unsigned char *ch = (unsigned char *)&i; にしたらどうなる?
とりあえず俺はFFになった。
>>981 実はビッグエンディアンとか
環境はなに?
そもそも > unsigned char *ch = (char *)&i; ではコンパイルできないんですが@VC2005 >unsigned char *ch = (unsigned char *)&i; ならちゃんとコンパイルでき結果もFFになりますが…
>986 どーせ拡張子がcppというオチ
あ、そっか。 MacでPower PCだからならないのか。 Power PCってビックエンディアンだから。 すいませんでした。
というか、printf中の\n(U+5C, U+6E)が¥n(U+A5, U+6E)になるのは、結構 書き込み環境としても珍しくない?
990 :
デフォルトの名無しさん :2007/07/17(火) 22:57:06
VC++で純粋なC++プログラミングはできますか? STLやらBOOSTやらがやりたいです。
2005ならlambdaも普通に使えるよ よかったね^^
992 :
デフォルトの名無しさん :2007/07/17(火) 23:04:58
整数かどうかを判別する関数はisdigit()ですが、実数かどうかを判別する関数はないのでしょうか?
isdigit()は整数じゃなくて、(10進数の)数字かどうか判定する関数じゃね?
994 :
デフォルトの名無しさん :2007/07/17(火) 23:13:38
ということはisdigit(12)でもisdigit(0.34)でも10進数であれば1が返ってくるという感じですか?
isdigit(x) は '0' <= x && x <= '9'と意味的に等価。 引数の「文字」が、'0' - '9'の範囲にあれば真。 12とか0.34がこの範囲に入るコードは見たことがないな。
>>992 それがやりたいなら、こんな感じかなぁ
bool is_digit(int x) {return false; }
bool is_digit(float x) {return true; }
bool is_digit(double x) {return true; }
...
boostのtype_traitsにもっといいのがあるよ。
996
999 :
デフォルトの名無しさん :2007/07/17(火) 23:47:41
やりたいこととしては、char配列の中の文字が数値であれば整数or実数どちらなのかを調べたい なんです。
1000だったらC++が崩壊して Cが復権!!
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。