VC++ CLR で 静的フィールドに Stopwatch を定義したい(改)

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
さお

VC++ CLR で 静的フィールドに Stopwatch を定義したい(改)

#1

投稿記事 by さお » 2年前

やりたい事は
hファイルでもcppファイルでも
Stopwatchを使えるようにしたいです。

以下コードです。

コード:

//-------------------------------------------------------------
//MyForm.h
//-------------------------------------------------------------
#pragma once

namespace hoge {

using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;	
using namespace System::Diagnostics;//←ここを追加
//以下略

#pragma endregion//この直下に定義	
Stopwatch^sw = gcnew Stopwatch();//ここに記述
//このグローバル変数は異常なし
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
sw->Start();
//ここも異常なし
}
//以下略
//-------------------------------------------------------------
//MyForm.cpp
//-------------------------------------------------------------
#include "MyForm.h"

using namespace hoge;

[STAThreadAttribute]
int main(array<System::String ^> ^args) {
	//MyForm ^fm = gcnew MyForm();
	//fm->ShowDialog();

	Application::EnableVisualStyles();
	Application::SetCompatibleTextRenderingDefault(false);
	Application::Run(gcnew MyForm());
	return 0;
}

void abc() {
	sw->Start();
        //エラー	識別子 "sw" が定義されていません。
}
 
hファイルに
Stopwatch^sw = gcnew Stopwatch();
を記述しエラーなし

sw->Start();

hファイルでは
正常
cppファイルでは
エラー 識別子 "sw" が定義されていません。

それと
cppファイルに
Stopwatch^sw = gcnew Stopwatch();
を記述し
エラー C3145 'sw': グローバルまたは静的変数は、マネージ 型 'System::Diagnostics::Stopwatch ^' を含むことはできません

YuO
記事: 941
登録日時: 9年前
住所: 東京都世田谷区

Re: VC++ CLR で 静的フィールドに Stopwatch を定義したい(改)

#2

投稿記事 by YuO » 2年前

さお さんが書きました:やりたい事は
hファイルでもcppファイルでも
Stopwatchを使えるようにしたいです。
シングルトンクラスがStopwatchを持つなり,Stopwatchの静的フィールドを持つクラスを作ればよいです。
さお さんが書きました:

コード:

#pragma endregion//この直下に定義	
Stopwatch^sw = gcnew Stopwatch();//ここに記述
この位置は,クラスの定義の内部ではないですか。

とりあえず,設計から見直すことをお薦めしますし,そもそもC++/CLIはC++ではないので,
  • ネイティブのC++のプログラムを作りたいのであれば,C++/CLIではなくC++を使う
  • CLIの世界のプログラムを作りたいのであれば,C++/CLIではなくC#やVisual Basicを使う
ことをお薦めします。
C++/CLIはネイティブとマネージの世界を結びつけるときに強みを発揮するのであって,それだけで作るには制約が大きすぎます。

Math

Re: VC++ CLR で 静的フィールドに Stopwatch を定義したい(改)

#3

投稿記事 by Math » 2年前

Windows10,VS2017Community,C++/CLI  開発者用コマンドプロンプト 使用

f1.cpp ひとつに全プログラムを書いています。
これでグローバルにアクセス出来ると思います。

コード:

rem コンパイル後リンク
cl /clr f1.cpp
rem 実行結果
f1.exe
f1.cpp

コード:

///参照設定
#using <System.dll>
#using <System.Windows.Forms.dll>
#using <System.Drawing.dll>
#using <System.Data.dll>
///ヘッダーファイル
#include<stdio.h>
///使用名前空間
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
using namespace System::Diagnostics;//←ここを追加

  ref class MyForm : public Form
  {
    public:
           Stopwatch^ sw;
    private:
           Button^ button1;
           TextBox^ txtBox;

    private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
        MyForm::sw->Start();
        this->txtBox->Text = L"Stopwatch Started!";
    }
    public : MyForm()  //コンストラクタ
    {
        this->button1 = gcnew Button();
        this->txtBox = gcnew TextBox();
        this->Text = L"MyForm";

        //MyForm->Size = System::Drawing::Size(300,300);//デフォルト
        this->Location = System::Drawing::Point(100,100);
        this->button1->Location = System::Drawing::Point(30,60);
        this->txtBox ->Location = System::Drawing::Point(30,20);

        this->button1->Text = L"Btn";
        this->txtBox->Text = L"txtBox";

        this->Controls->Add(button1);
        this->Controls->Add(txtBox );
        
        this->button1->Click += gcnew System::EventHandler(this,&MyForm::button1_Click);

        this->sw = gcnew Stopwatch();
    }
   

  };//end class
  //エントリー・ポイント
  int main()
  {
    // メイン ウィンドウを作成して、実行します
    Application::Run(gcnew MyForm());
    return 0;
  }
実行

コード:

D:\z17c\clr\f02>f

D:\z17c\clr\f02>rem コンパイル後リンク

D:\z17c\clr\f02>cl /clr f1.cpp
Microsoft(R) C/C++ Optimizing Compiler Version 19.10.25019
for Microsoft(R) .NET Framework Version 4.07.2101.1
Copyright (C) Microsoft Corporation.  All rights reserved.

f1.cpp
Microsoft (R) Incremental Linker Version 14.10.25019.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:f1.exe
f1.obj

D:\z17c\clr\f02>rem 実行結果

D:\z17c\clr\f02>f1.exe

D:\z17c\clr\f02>f

D:\z17c\clr\f02>rem コンパイル後リンク

D:\z17c\clr\f02>cl /clr f1.cpp
Microsoft(R) C/C++ Optimizing Compiler Version 19.10.25019
for Microsoft(R) .NET Framework Version 4.07.2101.1
Copyright (C) Microsoft Corporation.  All rights reserved.

f1.cpp
Microsoft (R) Incremental Linker Version 14.10.25019.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:f1.exe
f1.obj

D:\z17c\clr\f02>rem 実行結果

D:\z17c\clr\f02>f1.exe

D:\z17c\clr\f02>
画像


さお

Re: VC++ CLR で 静的フィールドに Stopwatch を定義したい(改)

#5

投稿記事 by さお » 2年前

みなさん丁寧なご解答を頂きまことにありがとうございます。
ちゃんと思うとおりにできました。

実はC#にて作ったものを高速化したく
VC++に移植しようと思っていたのです。
C++は低レベル言語だから速いという、にわか知識からのものだったのですが
YuOさんのお話からして
CLRだと移植しても高速化という点においては
無意味なようなので

どうしたらよいか迷っています。
オブジェクト指向で高速化を目指すなら
どうすればいいとかお勧めはありますでしょうか?

ちなみにWindows7とubuntuの最新版のOSはあります。
私はWin32APIかWin64でやってみようかと思っております。
いかがでしょうか?
よろしくお願いいたします。

Math

Re: VC++ CLR で 静的フィールドに Stopwatch を定義したい(改)

#6

投稿記事 by Math » 2年前

.NET Framework 上のプログラムは使用言語による差異はほとんどないわけでC++/CLI で作ってもC#でも同じものが出来ます。
C++/CLIはもうメンテナンスされてないようでC#が主です。VBもVS2015でC#開発責任者が2000万行!で書き直しC#と同等になりました。

.NET Framework はOSとして実装されている(Windowsでは)のですが中間コードでJITで動いてるので(JAVAと同様)機械語で実装されても遅くなります。しかしWindowsの安定化に大きく貢献しています。

でもWindows/CXではCOMに返りましたね(WinRT API)(^^;。Win32APIかWin64にすればはやくなると思いますがOSの仕組みが全く違うので大変ですね(メモリー管理が自動化されてない)
安定化とスピードのトレードオフですね。

さお

Re: VC++ CLR で 静的フィールドに Stopwatch を定義したい(改)

#7

投稿記事 by さお » 2年前

ご返信頂き誠にありがとうございました。


返信

“C言語何でも質問掲示板” へ戻る