忍者ブログ
暇人おやじの暇なつぶやき
[1] [2] [3]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

■bool値はStringで判定か?

久しぶりのC++である
そのためいろんな事を忘れているようだ
中でもif文による判定を行おうとしたところうまくいかない

どうなるかというと、全てTrueになる
コードはいたってシンプル
bool ^ flg1 =  true;
 if ( flg1) {
  Console::WriteLine("true");
 }
 else
 {
  Console::WriteLine("False");
 };

このコードのbool値であるflg1にfalseをセットしてもコンソールに表示されるのは
true

はて、判定がおかしいのかと思い様々HPを見るtも、構文はおかしくないようだ
そこで色々と試行錯誤して判定部分のコードを次のコードにすることで意図した判定にたどり着いた

 if ( flg1->ToString () ==  flg1->TrueString)

つまりこれは、flg1にセットされている文字列を比較しているわけだが、bool値ってfalseだったらifの判定はfalseを返すものではなかったか???

またif(flg1==true)という比較をいれてもエラーとなる

疑問の余地ありのC++である
PR
■プログラムをテストする

出来上がったプログラムを他のマシンでテストする際に注意する点

通常VC++2008のIDEでのプログラミングはソリューションフォルダに
debugフォルダが生成され、そこに目的のプログラムが生成される

そのため、このプログラムを他のマシンで試そうとコピーしてもっていっても
起動しない
何故ならデバッグ環境ではないから

ではどうするか?

プログラムをrelease環境でビルドするのだ
IDE上部に「Debug」「Release」の切り替えがあるので、これをReleaseにして
ビルドすれば、releaseフォルダに生成されるので、これで他のマシンで確認する
ことが出来るようになる

他のマシン=該当する.NETが入っているマシン

■文字列を整える「PadRight」

入力されたテキストは往々にして文字数が足らないことがある
そんな時にPadRightを使うと、簡単に文字数を整えて、なおかつ文字の右側を
空白でうめてくれるので便利だ

左を埋める場合には「PadLeft」

textBox3->Text = tarMoji->PadRight(10);

tarMojiに「ABC」が入っていたとしよう、この場合textBox3->Textには
「ABC□□□□□□□」(□=スペース)となる
固定長のデータを扱いたい場合には重宝しそうなメソッドである

ホストのデータでx'15'のデータをString型に入れるために
ホストのデータをいったん「@」に変換する
これを行わないと、x'15'は改行になってしまう

その後、「@」をx'15'として出力する
Convert::ToChar を使う

 if (textBox1->Text[wi] == '@')
                     {
                         wData = wData + System::Convert::ToChar(0x15)

■プロセスの起動

前回の日記「ファイル名を指定して実行」ではプロセスを作成して起動するサンプルをMSのページから
拝借した

しかしこれには問題があった

それはプロセスを生成し、そのプロセスから本体(フォーム上のテキストボックス)などに
アクセスできないのである

これを回避するためにはプロセスの実行をコンポーネントから行うと出来るようである
コンポーネントを配置すると、フォーム1に帰属するため、そのコンポーネントからの
起動はフォーム1で把握しているようである

おそらく、自身でprocessを作成しても同じことが可能ではあるとおもわれるが
サンプルコードでは残念ながらできないのはなんともしがたい
■別のプロセスを起動する

タイトルはウインドウズのスタートメニューにある項目ですが、これの実装がサンプルとしてありました
コードは次になります
Process^ myProcess;
myProcess->Start();

プロセスを使うには次の名前空間を定義します
using namespace System::Diagnostics;
using namespace System::ComponentModel;

プロセスを起動する際、最低限必要な項目は「StartInfo->FileName」になります
次のコードはマイドキュメントのフォルダにある「MyFile.doc」を設定します

 // Get the path that stores user documents.
String^ myDocumentsPath = Environment::GetFolderPath( Environment::SpecialFolder::Personal );
myProcess->StartInfo->FileName = String::Concat( myDocumentsPath, "\\MyFile.doc" );


尚、MSのサンプルでは「StartInfo->Verb」が次のように設定されています
myProcess->StartInfo->Verb = "Print";

これはファイルを開いて印刷を指示することになりますので、バッチなどを起動する場合には
この項目は設定しません

プロセスが終了した際に、正常終了したか否かを取得する場合には、イベントを定義します
次のコードはプロセスを新規作成し、イベントを発生させるためのプロパティ「EnableRaisingEvents 」を設定し、イベントを定義しています

            myProcess = gcnew Process;
            myProcess->StartInfo->CreateNoWindow = true;
            myProcess->EnableRaisingEvents = true;
            myProcess->Exited += gcnew System::EventHandler(this, &Form1::myProcess_Exited);

これにより、終了時に「Exited 」イベントである「myProcess_Exited」が発生します

    private: System::Void myProcess_Exited(System::Object^  sender, System::EventArgs^  e)
        {
     String^ ecode = Convert::ToString(myProcess->ExitCode);               MessageBox::Show(ecode,Application::ProductName,MessageBoxButtons::OKCancel,MessageBoxIcon::Asterisk);
            myProcess->Exited->Remove;

        }
イベント発生時、その終了コードをメッセージボックスで確認できます

■文字型の相互変換を行う Byte配列←→String型文字列①

まずString文字列をバイト配列にするにはEncodingクラスの命令GetBytesを利用する
そのためにあらかじめ
Encoding型の変数を定義する
System::Text::Encoding^ sjis;

エンコードはあらかじめ決められた方式があるが、日本語を利用するシフトJISコードなどを定義する場合には
GetEncoding命令で文字コードを与えないとならない

sjis= Encoding::GetEncoding( "shift_jis" );

この変数sjisを利用しByte配列へString型の文字列を変換して格納するには
byte配列の準備
   array<Byte>^b = gcnew array<Byte>(10);
次に、GetBytes命令でByte値を取得する
   b = sjis->GetBytes(sInput);

上記は10Byte分の領域を確保し、sinputの文字列を変換している

実際のコードは
int main(array<System::String ^> ^args)
{
   String^ sInput;
   System::Text::Encoding^ sjis= Encoding::GetEncoding( "shift_jis" );
   sInput = Console::ReadLine();
   array<Byte>^b = gcnew array<Byte>(sInput->Length);
   b = sjis->GetBytes(sInput);
   //sjis->GetBytes(sInput,0,sInput->Length,b,0);
   //array<Byte>^b = {0x00,0x12,0x34,0x56,0xAA,0x55,0xFF};
   Console::WriteLine( HexTest::ToHexString( b ) );
   Console::ReadLine();
   return 0;
}
このような感じである
これは25日のサンプルC++のサンプルで・・・(http://prg40age.blog.shinobi.jp/Entry/55/)を改良して、変換する文字列をコンソールから入力するようにしたものである



忍者ブログ [PR]
カレンダー
08 2024/09 10
S M T W T F S
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
フリーエリア
最新CM
最新TB
プロフィール
HN:
忍者 シオ才
性別:
非公開
バーコード
ブログ内検索