【初心者歓迎】C/C++室 Ver.43【環境依存OK】
952 :
デフォルトの名無しさん:2007/11/02(金) 19:47:10
ファイルのダウンロードって全部落とさないと他のアプリからは読み込み不可能で良いんじゃないの?
あと分割するなら初めに書き込む位置決めておけばいいし
struct Base {
Base(void) { ::printf("Base"); }
};
struct Member {
Member(void) { ::printf("Member"); }
};
struct Derived : public Base
{
Derived(void) { ::printf("Derived"); }
Member mem_;
};
これ実行したら分かるかもしれない。
じゃなくて、実体化させたら分かるかも、だね。ごめん。
すいませんOS書くの忘れてました。Linuxです
>>949 先ほど書店でBoost.Asioの解説読んでました。これ使うとだいぶ楽になりそうです
でもhttp1.0や1.1の実装は自分でやらないといけないんですね
>>952 理由はわかりませんが、gethostbyname、getservbynameあたりの関数がスレッドセーフではないと定義されているんです
明日にでも本屋行ってBoostライブラリの書籍買って試してみます
今すぐboostのsnapshotを落して試せばいいと思うよ
本のサンプルコードはサポートページで配布してるし
HTTPとかは実装のサンプルソース入ってなかったっけ?
>>951 間単にいうともし派生クラス(CChild)のtest()が呼ばれたら
恐いことになる可能性があるから。基底クラス部分の初期化
の最中は、派生クラスの部分の初期化はまだ行われて
おらず、基底クラス部分の初期化時に派生クラスでオーバーライド
されたメンバー関数の呼び出しが可能だとしたら、まだ初期化されて
いない派生クラスのメンバーにアクセスしてしまう危険があるから。
>>951 CChild としては未だコンストラクトされてないから。
「コンストラクトされていないが関数だけは呼べる」
ということで呼ばせてくれた方が良かったと俺は思うけど。
そんなとこだけ安全>>利便としてくれても嬉しくない。
>>951 基底クラスのコンストラクタが実行されるとき、
まだ派生クラスオブジェクトは存在しない(作られていない)ので、
派生クラスでオーバーライドしたほうの関数が呼ばれるのはおかしいという理屈に基づいている。
そして
>>959が書いたように現実的な視線での理由もある。
963 :
938:2007/11/02(金) 21:17:59
BCCですよ
>>963 BCCにもバージョンがたくさんあり、その都度STLのデベロッパが違って
たりして混乱するんだが。
最新版は5.9.2だよ。
965 :
938:2007/11/02(金) 21:32:08
>>964 5.5.1です でもコンパイラが違っていても、NKFでUTF8に変換して、それをwindows APIで
wchar_t、wstringに変換すれば確実ではないですか?
ちょっと気になったんだけど
>>938は何のプログラムを書いてるのかな。
もしかしてShiftJISのファイルを読み込んでstd::wstringに入れて扱いたいだけなのに、
「なんだかよく分からないけど動かないからNKFを通したら動いた」
みたいな事になってるんじゃないかと心配なんだ…。
967 :
デフォルトの名無しさん:2007/11/02(金) 21:38:38
日本語ファイルの形式によらずにwstringにいれたいんです
いれちゃダメ♪
969 :
デフォルトの名無しさん:2007/11/02(金) 21:42:11
テキストエディタ作っている人は自前でコード判定しているんですか?
>>956 そのスレッドセーフでない二つの関数は、既に非推奨になっている。
getaddrinfoを使え。
HTTPクライアントなんてリクエストヘッダ送信するだけなんだから簡単ジャマイカ
>>959 なるほど。
逆にJavaは、派生クラスのものも含めてメンバ変数の初期化が(未定義であってもその型に応じたものが自動的に)行われるから、コンストラクタの中でオーバーライド後の関数を呼んでしまっても平気
ってことですね?
ありがとうございました
C++はスピード優先や、Cとの互換性も考えてそうなってるんでしょうね。おもしろいです
973 :
972:2007/11/02(金) 22:00:07
>>973 Effective C++読むと良いよ
>>938 それだと入力がUTF-8/16のようなUnicodeなファイルでは、
情報の欠落が発生することになるだろ。
wchar_tが8バイト位ある環境なら大丈夫じゃね
977 :
938:2007/11/02(金) 22:31:09
>>947をみて下さい
UTF8に変換して読み込むことにしましたよ
978 :
デフォルトの名無しさん:2007/11/02(金) 23:23:28
初心者です。Visual C++ 2005 Express Editionのフォームアプリケーションです。
RS232Cから受信したデータによって画像の切り替えをしたいのですが
どのように記述すればよいですか?このままだとReadFileが無視されます。
//Form1.h
(省略)
#pragma endregion
private: System::Void Form1_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) {
//変数宣言やら初期設定やら
//画像のビットマップを生成する
Bitmap^ bmap=gcnew Bitmap("../yakyuu/img/3.bmp");
Bitmap^ clr=gcnew Bitmap("../yakyuu/img/white.bmp");
//4x4の画像を描画する
for(int i=0;i<4;i++)
for(int j=0;j<4;j++){
int X=10+i*310;
int Y=10+170*j;
gr->DrawImage(bmap,X,Y);
}
while(1){
ReadFile(hc, &data, 1, &dwRead, NULL);
if(data==END)
break;
if(data>=1 && data<=16)
gr->DrawImage(clr,10+((data-1)%4)*310,10+((data-1)/4)*170);
}
}
>>977 nkfってUTF-16LEの出力ってできないの?
UTF-16LEのファイルを読み込めば、わざわざMultiByteToWideCharで変換する必要もない。
読み込みには、std::ifstreamでバイナリモードを使えばいい。改行の扱いが問題になるが。
Paintイベントのハンドラでそういう処理はしない。
なぜなのかは本とか学習サイトとかドキュメントとか読んで把握してください。
(↑これサボって先へは一歩も進めないので、ちゃんとやるように)
スレッドを使うのは技術的にまだ難しいだろうから、
タイマーで定期的に読んでImageに書いて Invalidate、Updateし、
Paint では(描画済みの) Image をDrawImage する、等。
981 :
938:2007/11/02(金) 23:36:34
サンクス 次に対応してます やってみます
-w16 -w16B0 UTF16 コードを出力する。 (Big Endian / BOM 無し)
-w16B UTF16 コードを出力する。 (Big Endian / BOM 有り)
-w16L UTF16 コードを出力する。 (Little Endian / BOM 有り)
-w16L0 UTF16 コードを出力する。 (Little Endian / BOM 無し)
encodingのauto-detectionに関しては俺も知りたいな。
Mozillaのソースとか読むと良いのかな?
マルチプラットフォームでライセンス緩めの適当なライブラリがあると有難いんだが。
Windows限定だと、MLangでコードページ50932を指定すると
JIS, EUC-JP, CP932の自動認識はしてくれるようだね。
>>973 まぁJavaの場合はnullか0かfalseで初期化されてるから、少なくともゴミ値を読んで暴走するようなことはない
NullPointerExceptionが起きるくらい
すんませーん、↓みて、フォームに画像の表示はできたんですよ。
Visual C++ 2005 Express Editionを用いた易しい画像処理(1)―原画像を読み込み、RGBとCMYの三色に分解する
http://homepage3.nifty.com/ishidate/vcpp05_g1/vcpp05_g1.htm そんでもって、ウィンドウにも表示してみたいなぁと思って貼り付けたんですが、ビルドできない。
フォームの方にあった、↓も貼り付けてみたけど、
using namespace System::Drawing;
こんなエラー↓がでました。
.\TestWin.cpp(7) : error C2653: 'System' : 識別子がクラス名でも名前空間名でもありません。
.\TestWin.cpp(7) : error C2871: 'Drawing' : この名前を指定された名前空間は存在しません。
環境はVC++ 2005 Expressっす。
CLI、.NET Frameworkがらみはドトネトスレへどうぞ
>>984 「CLRなんとか」という種類のプロジェクトを作れ。
>>986 やってみるっすー
>>985 そういや、bitmapクラスってドトネトみたいね。
eclipseしか使ったことないもんで、新しい環境は右も左もわけわかめやね。
988 :
938:2007/11/03(土) 00:15:25
バグあるけど、UTF16LEで読みできたよ
#include <windows.h>
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
typedef int (__stdcall *FNC)(LPCSTR);
typedef void (__stdcall *FND)(LPCTSTR ,LPCTSTR );
main(){
locale::global(locale("japanese"));
setlocale(LC_ALL, "japanese");
HINSTANCE hd = LoadLibrary("nkf32.DLL");
FNC SetNkfOption=(FNC)GetProcAddress(hd,"SetNkfOption");
FND NkfFileConvert = (FND)GetProcAddress(hd,"NkfFileConvert2");
SetNkfOption("-w16L0 -X -Lu -d");
NkfFileConvert("file","templary");
fstream fp("templary",ios::in | ios::binary );
wchar_t *wbuf= new wchar_t [1024*1024*5];
int n=0;
while(!fp.eof()){
fp.read(( char * ) &(wbuf[n]), 1024 );
n+=1024;}
wcout<<wbuf<<endl;
}
992 :
デフォルトの名無しさん:2007/11/03(土) 00:26:48
fp.read(( char * ) &buf, 1024 );
は何文字読み込んだのかどうやってわかりますか? freadはバイトが帰ってきますが
>>992 std::istream::gcount()
を呼ぶか、
かわりにstd::istream::readsome()
を使う
どうでもいい事かもしれないけど &buf に不安を感じた
995 :
デフォルトの名無しさん:2007/11/03(土) 00:31:08
>>989 スーパーありがとう!
ドトネトの説明にもGDI+のbitmapをカプセル化してあるって書いてあるね!
GDI+のチュートリアルかなんか探してみるっさ!
.
.
.
1000ならジュースでも飲むか
1001 :
1001:
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。