【初心者歓迎】C/C++室 Ver.43【環境依存OK】

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2007/11/02(金) 19:47:10
ファイルのダウンロードって全部落とさないと他のアプリからは読み込み不可能で良いんじゃないの?
あと分割するなら初めに書き込む位置決めておけばいいし
953デフォルトの名無しさん:2007/11/02(金) 19:56:11
954デフォルトの名無しさん:2007/11/02(金) 20:32:27
struct Base {
 Base(void) { ::printf("Base"); }
};
struct Member {
 Member(void) { ::printf("Member"); }
};
struct Derived : public Base
{
 Derived(void) { ::printf("Derived"); }
 Member mem_;
};
これ実行したら分かるかもしれない。
955デフォルトの名無しさん:2007/11/02(金) 20:45:24
じゃなくて、実体化させたら分かるかも、だね。ごめん。
956デフォルトの名無しさん:2007/11/02(金) 20:50:00
すいませんOS書くの忘れてました。Linuxです

>>949
先ほど書店でBoost.Asioの解説読んでました。これ使うとだいぶ楽になりそうです
でもhttp1.0や1.1の実装は自分でやらないといけないんですね

>>952
理由はわかりませんが、gethostbyname、getservbynameあたりの関数がスレッドセーフではないと定義されているんです

明日にでも本屋行ってBoostライブラリの書籍買って試してみます
957デフォルトの名無しさん:2007/11/02(金) 20:51:18
今すぐboostのsnapshotを落して試せばいいと思うよ
本のサンプルコードはサポートページで配布してるし
958デフォルトの名無しさん:2007/11/02(金) 20:52:36
HTTPとかは実装のサンプルソース入ってなかったっけ?
959デフォルトの名無しさん:2007/11/02(金) 21:01:02
>>951
間単にいうともし派生クラス(CChild)のtest()が呼ばれたら
恐いことになる可能性があるから。基底クラス部分の初期化
の最中は、派生クラスの部分の初期化はまだ行われて
おらず、基底クラス部分の初期化時に派生クラスでオーバーライド
されたメンバー関数の呼び出しが可能だとしたら、まだ初期化されて
いない派生クラスのメンバーにアクセスしてしまう危険があるから。

960デフォルトの名無しさん:2007/11/02(金) 21:15:57
>>951
CChild としては未だコンストラクトされてないから。
「コンストラクトされていないが関数だけは呼べる」
ということで呼ばせてくれた方が良かったと俺は思うけど。

そんなとこだけ安全>>利便としてくれても嬉しくない。
961デフォルトの名無しさん:2007/11/02(金) 21:16:03
>>951
基底クラスのコンストラクタが実行されるとき、
まだ派生クラスオブジェクトは存在しない(作られていない)ので、
派生クラスでオーバーライドしたほうの関数が呼ばれるのはおかしいという理屈に基づいている。

そして>>959が書いたように現実的な視線での理由もある。
962デフォルトの名無しさん:2007/11/02(金) 21:17:03
>>938
コンパイラは何を使っている?
963938:2007/11/02(金) 21:17:59
BCCですよ
964デフォルトの名無しさん:2007/11/02(金) 21:23:40
>>963
BCCにもバージョンがたくさんあり、その都度STLのデベロッパが違って
たりして混乱するんだが。

最新版は5.9.2だよ。
965938:2007/11/02(金) 21:32:08
>>964
5.5.1です でもコンパイラが違っていても、NKFでUTF8に変換して、それをwindows APIで
wchar_t、wstringに変換すれば確実ではないですか?
966デフォルトの名無しさん:2007/11/02(金) 21:36:38
ちょっと気になったんだけど>>938は何のプログラムを書いてるのかな。
もしかしてShiftJISのファイルを読み込んでstd::wstringに入れて扱いたいだけなのに、
「なんだかよく分からないけど動かないからNKFを通したら動いた」
みたいな事になってるんじゃないかと心配なんだ…。
967デフォルトの名無しさん:2007/11/02(金) 21:38:38
日本語ファイルの形式によらずにwstringにいれたいんです
968デフォルトの名無しさん:2007/11/02(金) 21:40:05
いれちゃダメ♪
969デフォルトの名無しさん:2007/11/02(金) 21:42:11
テキストエディタ作っている人は自前でコード判定しているんですか?
970デフォルトの名無しさん:2007/11/02(金) 21:53:20
>>956
そのスレッドセーフでない二つの関数は、既に非推奨になっている。
getaddrinfoを使え。
971デフォルトの名無しさん:2007/11/02(金) 21:55:46
HTTPクライアントなんてリクエストヘッダ送信するだけなんだから簡単ジャマイカ
972デフォルトの名無しさん:2007/11/02(金) 21:57:26
>>959
なるほど。
逆にJavaは、派生クラスのものも含めてメンバ変数の初期化が(未定義であってもその型に応じたものが自動的に)行われるから、コンストラクタの中でオーバーライド後の関数を呼んでしまっても平気
ってことですね?
ありがとうございました

C++はスピード優先や、Cとの互換性も考えてそうなってるんでしょうね。おもしろいです
973972:2007/11/02(金) 22:00:07
すいません
ttp://www.ne.jp/asahi/yamashita/programming/java/forBeginner.html
ここでJava側の理論を読んでいたのですが

>したがって 基本クラスのコンストラクタから呼ばれるメソッドをオーバーライド した場合,「フィールドが初期化される前にオーバーライドしたメソッドが呼ばれる] 可能性もあるので注意が必要である。
C++と安全性変わってませんね・・・
974デフォルトの名無しさん:2007/11/02(金) 22:12:31
>>973
Effective C++読むと良いよ
975デフォルトの名無しさん:2007/11/02(金) 22:29:43
>>938
それだと入力がUTF-8/16のようなUnicodeなファイルでは、
情報の欠落が発生することになるだろ。
976デフォルトの名無しさん:2007/11/02(金) 22:30:57
wchar_tが8バイト位ある環境なら大丈夫じゃね
977938: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);
}
}
979デフォルトの名無しさん:2007/11/02(金) 23:27:44
>>977
nkfってUTF-16LEの出力ってできないの?
UTF-16LEのファイルを読み込めば、わざわざMultiByteToWideCharで変換する必要もない。
読み込みには、std::ifstreamでバイナリモードを使えばいい。改行の扱いが問題になるが。
980デフォルトの名無しさん:2007/11/02(金) 23:30:37
Paintイベントのハンドラでそういう処理はしない。
なぜなのかは本とか学習サイトとかドキュメントとか読んで把握してください。
(↑これサボって先へは一歩も進めないので、ちゃんとやるように)

スレッドを使うのは技術的にまだ難しいだろうから、
タイマーで定期的に読んでImageに書いて Invalidate、Updateし、
Paint では(描画済みの) Image をDrawImage する、等。
981938: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 無し)
982デフォルトの名無しさん:2007/11/02(金) 23:38:04
encodingのauto-detectionに関しては俺も知りたいな。
Mozillaのソースとか読むと良いのかな?
マルチプラットフォームでライセンス緩めの適当なライブラリがあると有難いんだが。

Windows限定だと、MLangでコードページ50932を指定すると
JIS, EUC-JP, CP932の自動認識はしてくれるようだね。
983デフォルトの名無しさん:2007/11/02(金) 23:50:15
>>973
まぁJavaの場合はnullか0かfalseで初期化されてるから、少なくともゴミ値を読んで暴走するようなことはない
NullPointerExceptionが起きるくらい
984デフォルトの名無しさん:2007/11/03(土) 00:02:44
すんませーん、↓みて、フォームに画像の表示はできたんですよ。

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っす。
985デフォルトの名無しさん:2007/11/03(土) 00:09:04
CLI、.NET Frameworkがらみはドトネトスレへどうぞ
986デフォルトの名無しさん:2007/11/03(土) 00:11:40
>>984
「CLRなんとか」という種類のプロジェクトを作れ。
987デフォルトの名無しさん:2007/11/03(土) 00:14:45
>>986
やってみるっすー

>>985
そういや、bitmapクラスってドトネトみたいね。
eclipseしか使ったことないもんで、新しい環境は右も左もわけわかめやね。
988938: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;
}
989デフォルトの名無しさん:2007/11/03(土) 00:19:28
>>987
ちなみに、そのBitmapクラスなどは、.NET版とは多少異なるがアンマネージ版もあって、
それを使えば.NET Frameworkなしでも使える。
http://msdn2.microsoft.com/en-us/library/ms533798.aspx
990デフォルトの名無しさん:2007/11/03(土) 00:20:53
立てた。
【初心者歓迎】C/C++室 Ver.44【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1194016813/l50
991デフォルトの名無しさん:2007/11/03(土) 00:22:30
>>990
たいへんよくできました。花丸
992デフォルトの名無しさん:2007/11/03(土) 00:26:48
fp.read(( char * ) &buf, 1024 );

は何文字読み込んだのかどうやってわかりますか? freadはバイトが帰ってきますが
993デフォルトの名無しさん:2007/11/03(土) 00:29:37
>>992
std::istream::gcount()
を呼ぶか、
かわりにstd::istream::readsome()
を使う
994デフォルトの名無しさん:2007/11/03(土) 00:31:04
どうでもいい事かもしれないけど &buf に不安を感じた
995デフォルトの名無しさん:2007/11/03(土) 00:31:08
>>993 サンクス
996デフォルトの名無しさん:2007/11/03(土) 00:32:05
>>989
スーパーありがとう!

ドトネトの説明にもGDI+のbitmapをカプセル化してあるって書いてあるね!
GDI+のチュートリアルかなんか探してみるっさ!
997デフォルトの名無しさん:2007/11/03(土) 05:47:37
.
998デフォルトの名無しさん:2007/11/03(土) 05:50:02
.
999デフォルトの名無しさん:2007/11/03(土) 05:50:34
.
1000小倉優子 ◆YUKOH0W58Q :2007/11/03(土) 05:51:05
1000ならジュースでも飲むか
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。