【初心者歓迎】C/C++室 Ver.49【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2008/02/20(水) 12:33:41ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.48【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1202141921/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0545デフォルトの名無しさん
2008/02/24(日) 02:37:36for分で体のパーツ数回してデータを読み取ってるんですが、
今は無理してそれを崩してまで使う機能ではないってことですね。
よく機能を理解して使えば楽になる物、ということですね。
答えてくれた方ありがとうございました。
0546デフォルトの名無しさん
2008/02/24(日) 03:26:15メッセージの終わりを\n → \r\n に変えてみたらいけるかも
0547デフォルトの名無しさん
2008/02/24(日) 03:33:50俺はオナニーして発射した後、ティッシュで拭いてる時にコードが閃くよ。
0548546
2008/02/24(日) 03:56:01\nでメッセージの終わりを判断してるとすると、サーバは次のメッセージの受信で
先頭に\0が入ってしまうんではないかと思う
(2回目のメッセージが、"\0JOIN #ircclidev\n"になるんじゃないかな)
0549デフォルトの名無しさん
2008/02/24(日) 04:06:10i<strlen(p)で解決しました。初歩的ミスもいいところだ・・・。
もう一つ質問があるのですが、(どちらかというとこちらが本題ですが)
ISO-2022-JP(いわゆるJISコード)とShiftJISを相互変換するライブラリorサンプルを探しています。
検索してもなかなかしっくり来るものがなく、nkf経由だと上手くISO-2022-JPの制御コード
(KI/KO=0x1B 0x24 0x42/0x1B 0x28 0x42)を取ることが出来ません。
RFCには、特にマルチバイト環境の規定は定められていませんが、日本語IRCサーバは
ISO-2022-JPを使っているところが主流のようです。
0550デフォルトの名無しさん
2008/02/24(日) 04:12:53http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6082.txt
0551デフォルトの名無しさん
2008/02/24(日) 05:11:02iconvじゃだめかい?
0552デフォルトの名無しさん
2008/02/24(日) 05:52:14VC++6.0からVisualStudio2008に移ったんですが、外観が変わりすぎててチンプンカンプン・・・
どこかVisualStudio2008 Exp の解説やってるページとかありませんか?
dllすら読み込めぬ・・・。orz
0553デフォルトの名無しさん
2008/02/24(日) 06:11:510554デフォルトの名無しさん
2008/02/24(日) 10:24:08つまり、ポインタでも、int*とか、char*とかの型がありますが、例えば
myclass*==int*
とかやるとコンパイルエラーになります。でも、myclass1*==myclass2*は、==演算子も
定義してないのに、コンパイルできるし、ちゃんと動きます。
これは、どういう理由でできるんですか?というか、ポインタの比較をする演算子って
どこで定義してるんでしょうか?
変な質問ですいません。
0555デフォルトの名無しさん
2008/02/24(日) 10:27:060556デフォルトの名無しさん
2008/02/24(日) 10:54:10規格上で「できる」と決められている処理ははコンパイラが勝手に処理してくれる、というだけ。
myclass1*==myclass2* は >555 の言うとおり myclass1 と myclass2 に継承関係があるんだろう。
この場合、暗黙の型変換が発生して同じ型になり比較できる、と決まっている。
で、規格で決められている以上のポインタに対する演算を、自前で定義する必要があるケースはまずない。
0557デフォルトの名無しさん
2008/02/24(日) 10:55:39違う型のポインタの比較はダメ
int* a;
double* b;
a == b
をやってみれば意味がわかるんじゃないかな?
0558デフォルトの名無しさん
2008/02/24(日) 12:50:040559デフォルトの名無しさん
2008/02/24(日) 12:52:24配列自体は無理
0560デフォルトの名無しさん
2008/02/24(日) 12:52:270561デフォルトの名無しさん
2008/02/24(日) 12:53:21できる
template <size_t n>
void func((&a)[n]) のように
0562デフォルトの名無しさん
2008/02/24(日) 12:53:390563デフォルトの名無しさん
2008/02/24(日) 12:58:420564デフォルトの名無しさん
2008/02/24(日) 13:14:21ありがとうございます。
たしかにできませんでした。でも、
template <class T, int N>
int func(T a[N])
{
...
}
こういう様に書いても(func()の引数に&を付けても付けなくても)、aは参照扱いになるようです。
aに対して変更を加えると、func()の呼び出し側の元配列にも変更が反映されました。
0565デフォルトの名無しさん
2008/02/24(日) 13:20:120566デフォルトの名無しさん
2008/02/24(日) 13:32:04aは参照でなくてdecayされるからポインタだろ
0567デフォルトの名無しさん
2008/02/24(日) 13:36:59そうか。ポインタですよね。
ポインタをコピーして、その先まで複製してくれるのはありえないですよね。
ありがとうございました。
0568デフォルトの名無しさん
2008/02/24(日) 13:50:24boost::array を使うとか。
0569デフォルトの名無しさん
2008/02/24(日) 16:28:53rand/srand使うしかないですか?
rand/srand使うとしたら、シードによく現在時刻使いますが
現在時刻を取得する方法はtimeしかないですか?
++らしい方法があれば教えてください。
0570デフォルトの名無しさん
2008/02/24(日) 16:30:060571デフォルトの名無しさん
2008/02/24(日) 16:31:57http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/mt.html
ここから持っていけばいいんじゃね
0572デフォルトの名無しさん
2008/02/24(日) 16:32:08Boost.Random
0573デフォルトの名無しさん
2008/02/24(日) 17:06:58という風に文字列と数字を一緒にメッセージ表示出来ましたが、
C++で文字列と数字を一緒にメッセージ表示させるにはどうしたらいいでしょうか?
MessageBox(NULL, "文字列"+123, "test", NULL)
というのは出来ませんでした。
0574デフォルトの名無しさん
2008/02/24(日) 17:09:11JavaScript同様、文字列を連結してから表示すればいい。
0575デフォルトの名無しさん
2008/02/24(日) 17:19:27char msg[20] = "文字列";
char tmp[10];
itoa(123, tmp, 10);
strcat(msg, tmp);
MessageBox(NULL, msg, "test", NULL);
こんな感じですか?
メッセージ毎にこのコードを書くのも面倒臭いのと、
いつも "文字列"+数字 の組み合わせと言うわけでもなく
数字+"文字列"+数字+"文字列" という事もあるため
自作関数でmsgbox(char*, int){}という決め撃ちではやく、
文字列や数字を混同で表示できる方法はないかと考えています。
0576デフォルトの名無しさん
2008/02/24(日) 17:20:07ソース内に日本語を入れるとエラーになるんですが、
どこをどうすればいいのでしょうか?
超初心者です。よろしくお願いします。
0577デフォルトの名無しさん
2008/02/24(日) 17:21:41○ //ああああ
0578デフォルトの名無しさん
2008/02/24(日) 17:22:140579576
2008/02/24(日) 17:27:51/* hello02.c */
#include <stdio.h>
int main()
{
printf("今日はよい天気です。\n");
printf("明日もよい天気でしょう。 \n");
return 0;
}
これなんですけど…
0580デフォルトの名無しさん
2008/02/24(日) 17:30:51どんなエラー?
0581デフォルトの名無しさん
2008/02/24(日) 17:34:42ありがとうございます、Boost 試してみます。
手元の mingw にはなさそうなので、まずはgooって
Boost 環境揃えてみますね。
>>576
・ソースの文字コードを変えてみる
・処理系を変えてみる
0582576
2008/02/24(日) 17:36:23普通に表示されました。
なんか間違ったやりかたしてたみたいです…
申し訳ないです。
0583デフォルトの名無しさん
2008/02/24(日) 17:41:12そのためのsprintf、とだけいっておくけど。
0584デフォルトの名無しさん
2008/02/24(日) 17:48:41sprintfだとメッセージウィンドウは生成されないですよね?
外見としてはMessageBoxの中身に数字や文字列を表示している様な方法がいいんです。
0585デフォルトの名無しさん
2008/02/24(日) 17:54:210586デフォルトの名無しさん
2008/02/24(日) 17:55:05ならsprintfしてMessageboxにいれる処理の関数つくればよくね?
0587デフォルトの名無しさん
2008/02/24(日) 17:56:41二段構えになるのが嫌、というだけの話とエスパー
vsprintf()使って自作ラッパー関数でも書くんだな
0588デフォルトの名無しさん
2008/02/24(日) 17:58:37boost::lexical_cast
を使うと幸せになれると思う
0589デフォルトの名無しさん
2008/02/24(日) 18:04:51失礼しました。printfと勘違いしてました。
sprintfだと文字列に格納できるんですね。
boostは自分にはまだ早そうなので(正規表現使えるのは魅力的ですが)、sprintfでやってみます。
ありがとうございました。
0590デフォルトの名無しさん
2008/02/24(日) 18:05:19効率が悪いのが難点
0591デフォルトの名無しさん
2008/02/24(日) 18:07:23俺も最初それ思いついたけど、連結する数値がたくさんあると見苦しくなるから
std::stringstreamに流し込んで取り出す方がいいんじゃないかなあ。
0592デフォルトの名無しさん
2008/02/24(日) 18:45:34序数で指定しても動きません どのような理由でしょうか?
VC++だと動かないですが、BCCとDMCで動きます
0593デフォルトの名無しさん
2008/02/24(日) 18:47:43FN = (fnc) GetProcAddress(hd, (LPCSTR)4); //序数での指定
このような記述はWindowsXPなら万能ではないんでしょうか?
0594デフォルトの名無しさん
2008/02/24(日) 18:50:46読み込みはしますが、実行時にエラーになります 序数がずれるのかも・・と思い全ての番号で試したのですがだめです
0595デフォルトの名無しさん
2008/02/24(日) 18:52:47CFooから派生したCFooEx0、CFooEx1、CFooEx2、CFooEx3があるとします。
そして、それぞれCJissou0、CJissou1、CJissou2、CJissou3に派生してるとします。
その上、CJissou0、CJissou1はIHoge0を、CJissou2、CJissou3はIHoge1を実装しているとします。
図にするとこんな感じ。
CFoo─CFooEx0┬CJissou0
IHoge0┘
CFoo─CFooEx1┬CJissou1
IHoge0┘
CFoo─CFooEx2┬CJissou2
IHoge1┘
CFoo─CFooEx3┬CJissou3
IHoge1┘
CFooとCFooEx〜は弄らないとして、IHoge〜のインターフェイス関数をCJissou〜に実装します。
で、マネージャー的な物例えば、std::vector<CFoo *> vecにそれぞれの実態を入れて、
CJissou〜の関数を呼びたいのですが呼ぶ際には、
dyanamic_cast<CJissou0 *>(vec[0])->Test();見たいな事をしないといけないと思います。
でもそういう呼び出しだとIHoge〜も意味が無くなってしまうし、数が多くなると厳しくなります。(IHoge〜は数個)
だから、dyanamic_cast<IHoge0 *>(vec[0])->Test();//エラー
見たいな呼び方をしたいのですがどうすればいいのでしょうか?
0596デフォルトの名無しさん
2008/02/24(日) 18:59:37そもそもそのような継承にしてる理由は?
0597デフォルトの名無しさん
2008/02/24(日) 18:59:59CFoo のメンバ関数ならキャストは要らないはず。
IHoge〜 に意味が無くなると言うが、こっちからしたら CFoo や vec の使い方も
ひっくるめて最初からその継承関係の意味がわからん。
0598595
2008/02/24(日) 19:06:570599デフォルトの名無しさん
2008/02/24(日) 19:10:28あるいは、virtual Test()をもつ何かインターフェースに。
0600デフォルトの名無しさん
2008/02/24(日) 19:18:44ダウンキャストすることになるだろうな。
0601デフォルトの名無しさん
2008/02/24(日) 20:05:03もう自前でパースしてるよ
0602592
2008/02/24(日) 20:05:240603デフォルトの名無しさん
2008/02/24(日) 20:10:05車輪の再発明
0604デフォルトの名無しさん
2008/02/24(日) 20:25:220605デフォルトの名無しさん
2008/02/24(日) 20:29:540606デフォルトの名無しさん
2008/02/24(日) 20:58:500607デフォルトの名無しさん
2008/02/24(日) 21:06:120608デフォルトの名無しさん
2008/02/24(日) 21:06:13全てのJIS漢字のJISコードなんて、そうそう覚えられるもんじゃないと思うが。
0609デフォルトの名無しさん
2008/02/24(日) 21:14:12〜
};
class Hoge{
public:
void hoge(Piyo[][256]);
};
void Hoge::hoge(Piyo[][256] piyo){
〜
}
こんな実装をした時に、Hoge::hogeのpiyoを書いておくと'Piyoは未定義のシンボル'と怒られてしまいます。
仮引数をPiyo[][256]だけにすればコンパイルは通りますが、どう使えというのか・・・といった感じです。
コンパイラはBCC5.5を使っています。クラスの2次元配列をできれば「参照」で渡したいのですが、
どうすればいいんでしょうか?
0610デフォルトの名無しさん
2008/02/24(日) 21:15:36void Hoge::hoge(Piyo piyo[][256]) {
しかもこれいわゆる参照渡しの挙動をするが、
正確にはポインタ渡しだし。
0611609
2008/02/24(日) 21:29:18自分でもドン引きです・・・。ありがとうございました
0612デフォルトの名無しさん
2008/02/24(日) 23:16:37cmakeについてのリアルタイム講演が聞けるそうな
0613デフォルトの名無しさん
2008/02/24(日) 23:20:24ReadFile(fp , &(buf[N]) , 1500 , &sz , NULL);
でエラーで止まります bufは十分にとってあります なぜでしょうか
0614デフォルトの名無しさん
2008/02/24(日) 23:24:57bufの宣言がどうなっているかにも拠るが、&(buf[N])をbufにしてみろ。
それで巧くいくなら、お前は馬鹿だ。
0615デフォルトの名無しさん
2008/02/24(日) 23:31:32原因不明ですが、変数の位置変えたらエラーでなくなり一応うごくようになりました
0616デフォルトの名無しさん
2008/02/24(日) 23:34:06単純にバッファオーバーフローしてるだけじゃないのか?
0617デフォルトの名無しさん
2008/02/24(日) 23:36:56別のところから変更しないと直りそうにありません
設計やり直してきます
0618デフォルトの名無しさん
2008/02/24(日) 23:48:580619デフォルトの名無しさん
2008/02/24(日) 23:51:19char buf[NMAX*1500]
なら、&(buf[N*1500])
char buf[NMAX][1500];
なら、&(buf[N][0])
char *buf[NMAX]
for(...) buf[N] = malloc(sizeof(char) * 1500);
なら、buf[N]
0620デフォルトの名無しさん
2008/02/24(日) 23:52:380621デフォルトの名無しさん
2008/02/24(日) 23:55:540622デフォルトの名無しさん
2008/02/24(日) 23:56:41ostr << hoge.str();
}
みたいなやつか。
0623デフォルトの名無しさん
2008/02/25(月) 00:07:210624デフォルトの名無しさん
2008/02/25(月) 00:08:240625デフォルトの名無しさん
2008/02/25(月) 00:09:430626デフォルトの名無しさん
2008/02/25(月) 00:10:45strcpy( &s[5], "000");
は正しいですか
0627デフォルトの名無しさん
2008/02/25(月) 00:14:03やった後、stringオブジェクトは壊れるとおもうけど
0628デフォルトの名無しさん
2008/02/25(月) 00:15:060629デフォルトの名無しさん
2008/02/25(月) 00:15:58規格ではそんな保障はされていません。
0630デフォルトの名無しさん
2008/02/25(月) 00:17:13あっ嘘、s[i]で取得できてもできないと思う
置き換えたいなら、replaceを使いなさい
0631デフォルトの名無しさん
2008/02/25(月) 00:17:23std::stringのことなら、正しくない。
0632デフォルトの名無しさん
2008/02/25(月) 00:21:59int main(){
string str="9999999999";
char *pointer=&str[5];
memcpy( pointer, "000", 3);
str+=(string)"add";
cout<<str;
return 0;}
0633デフォルトの名無しさん
2008/02/25(月) 00:25:35ユーザーは合法的でない方法を使ってもアクセスできませんか?
0634デフォルトの名無しさん
2008/02/25(月) 00:28:12必要のないポインタ操作はやめましょう。
動くか動かないかがプログラムの正しさの判定基準ではありません。
0635デフォルトの名無しさん
2008/02/25(月) 00:28:47あるコンパイラのあるバージョンで動くとしても、規格で保証されていなければ、
他のコンパイラや同じコンパイラの別バージョンでは動かないかもしれない。
それでもいいなら、どうぞ?
今後ずっと同じコンパイラを使い続けて、決して変えないのなら、たぶん問題ないだろう
0636デフォルトの名無しさん
2008/02/25(月) 00:30:23なんのためのクラスだと思う?
0637デフォルトの名無しさん
2008/02/25(月) 01:00:06エラーの通知にはエラーメッセージより例外を使う方がいいと聞いたのですが
オリジナルな例外クラスを投げたり、charを投げまくる仕様にしていいのですか?
例外というと、これ以上の実行に支障が出るときに使うようなイメージがあるのですが実際の現場ではどうなのでしょうか?
0638デフォルトの名無しさん
2008/02/25(月) 01:01:510639デフォルトの名無しさん
2008/02/25(月) 01:14:59パフォーマンスは落ちる。禁止オプションもあるくらいだからな。
特に組み込みでは。。。。。。
0640デフォルトの名無しさん
2008/02/25(月) 01:17:110641デフォルトの名無しさん
2008/02/25(月) 01:20:04好きなように使え。
ただ、エラーメッセージと例外では通知する相手が違うぞ。
エラーメッセージはエンドユーザ、例外はプログラマに通知するもんだ。
ユーザがいきなり「0x00d2345でlogic_error例外が発生しました」とか見せられても訳わからんだろ。
charも投げられるが、標準との整合を考えて投げるのはオリジナルも含めてstd::exception派生のクラスにしとけ。
0642デフォルトの名無しさん
2008/02/25(月) 01:21:41static領域に配置したオブジェクトのメンバなら、コンストラクタで何もしていなければ0になります。
それ以外は不定です。
0643デフォルトの名無しさん
2008/02/25(月) 01:29:37クラスが消滅したらアクセスできなくなると思いますが
つけなくても自動でstaticになりますか
0644デフォルトの名無しさん
2008/02/25(月) 01:50:30なるほど・・・
戻り値でエラーを知らせたり、NULLを返したりという方法もあるのでどういう方法が主流なのかなと思ってまして
自分はたいていの場合
何が起こったのか確認して、何事もなかったかのように受け流してさいごにエラーログを確認する
位のデバッグライト的な使いか確かしてないのですが・・・
■ このスレッドは過去ログ倉庫に格納されています