Iwao myds

dev.mish.work へ移行しました.

この画面は、簡易表示です

VC

fopen と sopen

_tfopen と _tsopen の mode の関係がわからなかったので,コードを抜粋
(VS8)\VC\crt\src\_open.c より
  /* First mode character must be ‘r’, ‘w’, or ‘a’. */
  switch (*mode) {
    case _T(‘r’):
      modeflag = _O_RDONLY;
      streamflag |= _IOREAD;
      break;
    case _T(‘w’):
      modeflag = _O_WRONLY | _O_CREAT | _O_TRUNC;
      streamflag |= _IOWRT;
      break;
    case _T(‘a’):
      modeflag = _O_WRONLY | _O_CREAT | _O_APPEND;
      streamflag |= _IOWRT;
      break;
    default:
      _VALIDATE_RETURN((“Invalid file open mode”,0), EINVAL, NULL);
    }

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。


C2146

次の様なコードで,C2146 , C2065


  private: System::Void Form1_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) {
    Size cr = this->ClientSize ;
    Point lt = Point(cr.Width/3*1,cr.Height/3*1) ;
    Point rb = Point(cr.Width/3*2,cr.Height/3*2) ;
    array<Point>^ pts = gcnew array<Point>(5) ;
    {
      pts->SetValue(gcnew Point(lt.X,lt.Y),0) ;
      pts->SetValue(gcnew Point(lt.X,rb.Y),1) ;
      pts->SetValue(gcnew Point(rb.X,rb.Y),2) ;
      pts->SetValue(gcnew Point(rb.X,lt.Y),3) ;
      pts->SetValue(gcnew Point(lt.X,lt.Y),4) ;
      }
    e->Graphics->DrawLines(gcnew Pen(Color::Red),pts) ;
    }
  private: System::Void Form1_SizeChanged(System::Object^ sender, System::EventArgs^ e) {
    this->Invalidate() ;
    }


—— ビルド開始: プロジェクト: DrwLines, 構成: Debug Win32 ——
コンパイルしています…
DrwLines.cpp
c:\…\drwlines\Form1.h(75) : error C2146: 構文エラー : ‘;’ が、識別子 ‘cr’ の前に必要です。
c:\…\drwlines\Form1.h(75) : error C2065: ‘cr’ : 定義されていない識別子です。
c:\…\drwlines\Form1.h(76) : error C2228: ‘.Width’ の左側はクラス、構造体、共用体でなければなりません
型は ”unknown-type” です。
c:\…\drwlines\Form1.h(76) : error C2228: ‘.Height’ の左側はクラス、構造体、共用体でなければなりません
型は ”unknown-type” です。
c:\…\drwlines\Form1.h(77) : error C2228: ‘.Width’ の左側はクラス、構造体、共用体でなければなりません
型は ”unknown-type” です。
c:\…\drwlines\Form1.h(77) : error C2228: ‘.Height’ の左側はクラス、構造体、共用体でなければなりません
型は ”unknown-type” です。
ビルドログは “file://c:\…\DrwLines\Debug\BuildLog.htm” に保存されました。
DrwLines – エラー 6、警告 0
========== ビルド: 0 正常終了、1 失敗、2 更新、0 スキップ ==========


Drawing::Size とすることにより通る様になるが,イマイチどの様に書くべきかが理解できてない.
DrawLines についても,よくわかってない.array<Point>^ の array って何?
ここの説明がわかりやすい.


pts->SetValue(gcnew Point(lt.X,lt.Y),0) ; の gcnew はいらない?
関数の引数の const ~ & はどこへ?


printf や CString::Format の “%10.3f” の様な形式
  String::Format で “{0,10:F3}”


C:\…\HelpPnt.hxx(72) : error C3083: ‘Drawing’: ‘::’ の左側のシンボルには、型を指定しなければなりません
C:\…\HelpPnt.hxx(72) : error C2039: ‘Point’ : ‘System’ のメンバではありません。
C:\…\HelpPnt.hxx(72) : error C2065: ‘Point’ : 定義されていない識別子です。
#using <System.Drawing.dll> を追加

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。


CLI

今度は,C++/CLI .
以前作成した MFC プロジェクト MemStt を変更.
  Release 版プロジェクトのプロパティで,
    「構成プロパティ」-「全般」-「共通言語ランタイム…」を「/clr」に.
      ビルドすると確かにファイルサイズは大きくなる.
  Debug 版だと,
    cl : コマンド ライン error D8016 : コマンド ライン オプション ‘/RTC1’ と ‘/clr’ は同時に指定できません
      正しい対応方法はわからないが,vcproj をエディタで開いて,BasicRuntimeChecks=”3″ を削除.


Form クラスに MemoryStatusAry を確保すると,
  c:\~\Form1.h(26) : error C4368: ‘MemSA’ をマネージ ‘MemSF::Form’ のメンバとして定義できません。
    MemoryStatusAry* MemSA とすることで対応?

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。

  • カテゴリー:

VC 7 で error C2664 std::vector

VC 6 では通っていたが,VC 7 でエラーとなってそのままだったコード.
std::vector <void*> voidPtrs(1024,NULL) ;


c:\Program Files\Microsoft Visual Studio .NET\Vc7\include\vector(124) : error C2664:
‘std::vector >::_Construct_n’ : 2 番目の引数を ‘int’ から ‘void *const & ‘ に変換できません。
理由: ‘int’ から ‘void *const ‘ へは変換できません。
整数型からポインタ型への変換には reinterpret_cast、C スタイル キャストまたは関数スタイル キャストが必要です。
c:\Program Files\Microsoft Visual Studio .NET\Vc7\include\vector(109) :
コンパイルされたクラスのテンプレートのインスタンス化 ‘void std::vector<_Ty,_Ax>::_Construct(_Iter,int,std::_Int_iterator_tag)’ の参照を確認してください
with
[
_Ty=void *,
_Ax=std::allocator,
_Iter=int
]
c:\~\~.cpp(206) : コンパイルされたクラスのテンプレートのインスタンス化
‘std::vector<_Ty,_Ax>::vector(_Iter,int)’ の参照を確認してください
with
[
_Ty=void *,
_Ax=std::allocator,
_Iter=int
]


(void*) とすることで通るみたい.
std::vector <void*> voidPtrs(1024,(void*)NULL) ;

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。


MFC と STL – 2

Xml_E で,MFC を使用しない様に変更中.
XML のデータを用意して,以下の様に単純に 100 個の配列にコピーする時間を計測しようとした.
   ElapseTick et ;
   CArray xmlAry ;                   // std::vector xmlAry ;
   for (int index=0 ; index<100 ; index++) {
     xmlAry.Add(Xml_Data) ;           // xmlAry.push_back(Xml_Data) ;
     }
   CString etStr = ::ToString(et.GetElapse()/1000.0) ;
   m_CtrlResult.SetWindowText(etStr) ;
データによっては期待した結果(MFC 版と同等またはそれより高速)が出たが,
この SVG を使用してメモリが少ない環境では極端に遅くなってしまった.
そこで,それぞれのサイズを調べてみた.

VC 6 VC 7 VC 8 VC 9 VC 10 VC 8 Debug VC 9 Debug VC 10 Debug VC 8 x64 VC 9 x64 VC 10 x64 VC 9 x64 Debug VC10 x64 Debug Xcode 64 Debug
CString 4 4 4 4 4 4 4 4 8 8 8 8 8
CArray 20 20 20 20 20 20 20 20 40 40 40 40 40
tstring 16 28 28 28 28 32 32 32 40 40 40 48 48 8
vector 16 16 16 24 16 20 20 20 32 48 32 40 40 24
Xml_E 68 92 92 108 92 108 108 108 152 184 152 184 184 72

tstring は,std::string または std::wstring .
vector は, <int> のサイズ.sizeof (std::vector<bool>) は vector<int> などより大きくなることがあるみたい.
Xml_E の MFC 版のデータメンバは,
CString Name , CString Text , CArray<Xml_Attribute,Xml_Attribute> Attribute , CArray<Xml_E,Xml_E> Child .
STL 版は tstring と std::vector に置換えた.

MFC Xml_Attribute 12 4 + 4*2
MFC Xml_E 52 4 + 4*2 + 20*2
STL Xml_Attribute 36 4 + 16*2
STL Xml_E 68 4 + 16*2 + 16*2

2013/04/22
SVG の全要素数は 5,557 ,属性は 19,103 .MFC 版では 518,200 ,STL 版では 1,065,584 となる.
つまり 50 M ~ 100 M 位が一時的に必要となってしまっていた(200 個にした時もあり).


ループ部分を 2 重ループとして,内側を 10 で 10 個の配列が必要となる様に改良.
時間を計測すると環境にもよるがほぼ同等の結果が得られた,
T5400 では MFC 6 秒と STL 3 秒.

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。


MFC と STL

MFC STL
CString::Right など string::substr
LPCTSTR string::c_str
LPTSTR CString::GetBuffer()    -
CString::ReverseFind() string::rfind
   - string::find_last_not_of

Xcode で,#include “..\Test\Test.h” は通らない?
バックスラッシュではなく通常のスラッシュ ‘/’ とすれば OK (VC 6 でも通る).


2013/03/04
CString::GetBuffer() にあたる部分を,string::begin() とすると VC 6 では通る(たまたま通っているだけ).
  #ifdef _MBCS
  {
    // tstring tmpStr = str + _T(“”) ;
    // _tcsrev(tmpStr.begin()) ;
    std::vector tmpStr ;
    tmpStr.resize(str.length()+1) ;
    _tcscpy(&tmpStr[0],str.c_str()) ;
    _tcsrev(&tmpStr[0]) ;
    // ….
    }
  #endif
昨日立ち読みした方法に改良.確かこんなんだったと思う.

2013/03/07
VC 7 でコンパイルすると,
  c:\…\Test.cpp(45) : error C2664: ‘_tcsrev’ :
    1 番目の引数を ‘std::basic_string::iterator’ から ‘char *’ に変換できません。

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。


_T(‘C’)

_T(“String”) の様な文字列の場合の動作は理解していたつもりでいたが,…
文字の場合も,同様に _T(‘C’) とはすぐ思いつかなかった.
7 bit の文字範囲で処理している時はあまり関係ないが,半角カナなどを扱う所でちょっと引っかかったので.
当然と言えば当然だが,ちょっと勘違いしてた.

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。


error C2065 _lpa

T2OLE を利用したら,
——————–構成: Test – Win32 Debug——————–
コンパイル中…
Test.cpp
C:\…\Test.cpp(81) : error C2065: ‘_lpa’ : 定義されていない識別子です。
C:\…\Test.cpp(81) : error C2440: ‘=’ : ‘char *’ から ‘int’ に変換することはできません。(新しい動作 ; ヘルプを参照)
この変換には reinterpret_cast, C スタイル キャストまたは関数スタイルのキャストが必要です。
C:\…\Test.cpp(81) : error C2065: ‘_convert’ : 定義されていない識別子です。
cl.exe の実行エラー
Test.exe – エラー 3、警告 0

USES_CONVERSION; の指定がないとこれらのエラーが出力される.
テクニカル ノート 59


他に,今回テストに利用したサンプルで IID_PPV_ARGS が未定義となった.
動作確認が目的なので,c:\…\v7.0A\Include\ObjBase.h より対象部分の数行をコピーして利用.
COM のコーディング プラクティス

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。


operator[]

以下の様なコードで,配列の要素として書き戻す部分がうまく機能してなかった.
BOOL d3D_PgonsA::SetUniqueName (void) {
  { // 空の場合 “Pgons_0x” を設定
    for (int index=0 ; index<this->GetCount() ; index++) {
      d3D_Pgons1 pgons = (*this)[index] ;
      CString name = pgons.GetName().c_str() ;
      if (name.IsEmpty()) {
        name.Format(_T(“Pgons1_%03d”),index+1) ;
        pgons.SetName(name) ;
        (*this)[index] = pgons ;
        continue ;
        }
      }
    }
  // …
  }
原因は, d3D_Pgons1& operator[] (const int index) が定義されてなかったためだが,未だによくわかってない.

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。


MemStat.hxx

Xcode や VC , W Mobile で可能な様にコードを書いてみた.


#ifndef MemStat_hxx
#define MemStat_hxx
//
#ifdef _WIN32
  typedef __int64 i64 ;
  typedef unsigned __int64 ui64 ;
#else
  typedef long long i64 ;
  typedef unsigned long long ui64 ;
#endif
//
#ifdef __APPLE_CC__
  #include <mach/mach.h>
#endif
#ifdef _WIN32
  #include <Windows.h>
  #include <WinBase.h>
#endif
//
class MemoryStatus {
public:

} ;
//

{
  P_Free = P_Total = 0 ;
  #ifdef __APPLE_CC__
  {
    unsigned int count = 0 ;
    mach_port_t host_port = ::mach_host_self() ;
    host_basic_info_data_t hb_info;
    {
      count = HOST_BASIC_INFO_COUNT ;
      ::host_info(host_port,HOST_BASIC_INFO,(host_info_t)&hb_info,&count) ;
      }
    vm_statistics_data_t vm_info;
    {
      count = HOST_VM_INFO_COUNT;
      ::host_statistics(host_port,HOST_VM_INFO,(host_info_t)&vm_info,&count) ;
      }
    P_Free = vm_info.free_count * vm_page_size ;
    P_Total = hb_info.max_mem ;
    }
  #endif
  #ifdef _WIN32
  #if !defined(_WIN32_WCE) && (_MFC_VER >= 0x700)
  {
    MEMORYSTATUSEX memStat ;
    memset(&memStat,0,sizeof(MEMORYSTATUSEX)) ;
    memStat.dwLength= sizeof(MEMORYSTATUSEX) ;
    ::GlobalMemoryStatusEx(&memStat) ;
    P_Free = memStat.ullAvailPhys ;
    P_Total = memStat.ullTotalPhys ;
    }
  #else
  {
    MEMORYSTATUS memStat ;
    memset(&memStat,0,sizeof(MEMORYSTATUS)) ;
    memStat.dwLength= sizeof(MEMORYSTATUS) ;
    ::GlobalMemoryStatus(&memStat) ;
    P_Free = memStat.dwAvailPhys ;
    P_Total = memStat.dwTotalPhys ;
    }
  #endif
  #endif
  }
//
#endif


ファイルは,UTF-8 と言うか,シフトJIS の設定で,7 bit の範囲の文字のみ使用.
改行は,CR+LF としている.

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。



top