C/C++のトラブル集

C/C++のトラブル集

http://tessy.org/wiki/index.php?C%2FC%2B%2B%A4%CE%A5%C8%A5%E9%A5%D6%A5%EB%BD%B8

メモ

メモに全部突っ込んで書いていたら,まさかの「サイズがデカすぎて処理できませんエラー」がサーバから返されてしまった.しょうがないので,C/C++系のトラブルだけこっちに移すことにした.

argcとargv

int main(int argc, char **argv)
  • が一般的な宣言
  • arguments count(argc), arguments value(argv)と覚えよう

sizeof

  • sizeof()の返り値
    OSWindows XPFreeBSD
    コンパイラVS 2008VS 2005.NET 2003VS6gcc(C)gcc(C++)cc(C)cc(C++)
    char1
    unsigned char1
    short2
    int4
    long int4
    float4
    double8

ダイアログをMFCダイアログから呼び出すと反応が異様に遅い.

  • C:\WINDOWS\WinSxS\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700\msvcr80.dll
  • を読み出そうとして遅くなってるっぽ.
  • 何故,読み出すようになったのか・・・それだけが分からないよ.

:未解決?

CTimeを使わずに時間を取得する

  • time.hを使う
    struct tm *timeinfo;
    time_t	timer;
    timer    = time(NULL);
    timeinfo = localtime(&timer);
    strftime(buffer, length, "%m%d-%H%M%S", timeinfo);
  • もっと短い時間(ミリ秒とか)を取得する場合はGetTickCount()とかを使うべし.

floatとdoubleの違いについて

C++のprivateなポインタ変数をreturnで外に出す

  • クラスでprivateで宣言したポインタ変数を,return でクラスの外に出すと,何も問題なく編集出来てしまう.
    
            
    1. #include <stdlib.h>
    2. #include <stdio.h>
    3.  
    4. class Hoge {
    5.         public :
    6.                 Hoge ( ) {memory = new int; };
    7.                 ~Hoge ( ) {delete memory; };
    8.         private :
    9.                 int * memory;
    10.         public :
    11.                 int * a ( void ) { return memory; }
    12. };
    13.  
    14. int main ( int argc ,  char  **argv ) {
    15.         Hoge *a = new Hoge ( );
    16.         int * b;
    17.         b = a ->a ( );   //←ここで問題なくポインタを取得できる
    18.         *b =  5;     //←ここで変更できてしまう
    19.         return  0;
    20. }
  • private変数をreturnする段階でアウトなんじゃね?と思うんだが,コンパイラも実行時エラーも出ない.
  • ポインタが指す番地の中身は変更できるが、ポインタが指す番地自体は変更できない

enumの定義方法

  • いっつも忘れるので自分用のmemo
    enum 型 {値1, 値2, ... 値N };
  • Example
    enum the_sin {PRIDE, GLUTTONY, GREED, SLOTH, WRATH, ENVY, LUST};

実行時にMSVCR80.DLL (MSVCR80D.DLL?) が無いと言われる

  • OpenCVのデバッグ用ライブラリとリンクした後,実行時に言われた.
  • 以下の2点を修正
    • highguid.libを外した
    • highguid.libをビルドしなおし
  • あとcxcored.libをリンクすると,heapがどうの,と文句を言われた.

ジャンル:OpenCV:未解決?

fatal error C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。

  • プリコンパイル済みヘッダが定義されてるプロジェクトに自身で作ったファイルを追加するとこうなる
  • MFCのダイアログベースのプロジェクトの場合,stdafx.hなるプリコンパイル済みヘッダーが作られる
  • cppファイル側で,ヘッダファイルをincludeする前に
    #include "stdafx.h"
    #include "xxxx.h"
  • としてやればエラーは回避できる
  • プロジェクトのプロパティで「プリコンパイル済みヘッダを利用しない」と定義するのも1つの手

ジャンル:Visual Studio

fatal error C1020: 予期しない #endif です。

  • "stdafx.h"をインクルードすると,それ以前のプリプロセッサ行は無視されるらしい.
  • よって,下記のようにWindowsの場合はインクルードして,それ以外のOSの場合はしないでと言うコードは失敗する
    #ifdef _WIN32
    #include "stdafx.h"
    #endif
  • この場合はstdafx.hへのincludeは諦め,「プリコンパイル済みヘッダを利用しない」と定義する

ジャンル:Visual Studio

fatal error C1033:

  • おそらくテンポラリなエラー
  • Visual Studioでこれが起きる場合,IntelliSenseの更新とかぶって編集が出来ていない可能性があり.

ジャンル:Visual Studio

error C2062: 型 'char' は不要です。

  • smallと言う変数名は予約語
  • RpcNdr.hを(どういう経緯でincludeしたかは知らないが)includeすると,
    #define small char
  • とされている.
  • と言うわけで,変数名smallを使用するとcharを宣言したことになり,上記のエラーが発生する.
  • レアなエラーかも.

ジャンル:Visual Studio

error C2064: 引数を取り込む関数には評価されません。

  • 変数と関数で同じ名前を使用すると発生する
  • 変数が優先されるらしい.
    time_t time;
    time = time(NULL); //関数のtimeが正しく取り扱われない

ジャンル:Visual Studio

error C2059: 構文エラー : サフィックスが無効です。

  • 変数名の最初に数字を用いるとエラーになる.
 int 3DPoints[200]; // <- 変数名の頭に数字は使えない

ジャンル:Visual Studio

error C2065: 'M_PI' : 定義されていない識別子です。

  • M_PIはmath.hで定義されてる円周率
  • しかし,math.hをincludeしただけではdefineされない
  • _USE_MATH_DEFINESをdefineする必要がある
  • ちなみにVC++6では定義されてないとのうわさ.
 #define _USE_MATH_DEFINES  // <-これが一番大事♪
 #include <math.h>
 int main(){
   printf("%f\n", M_PI);
 }

ジャンル:Visual Studio

error C2381: 'exit' : 再定義 ; __declspec(noreturn) が異なります。

error C2679: 二項演算子 '<<' : 型 'const largeNumber' の右オペランドを扱う演算子が見つかりません (または変換できません)。

  • error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'std::string' (or there is no acceptable conversion) [duplicate]
  • cppunitを使ってテストをビルドしようとしたら、このエラーが出た。
  • 下記、assertionを使うと、OStringStreamに << 演算子で出力する。
    
            
    1. template <class T >
    2. struct assertion_traits
    3. { 
    4.     static bool equal (  const T & x ,  const T & y )
    5.     {
    6.         return x == y;
    7.     }
    8.  
    9.     static std :: string toString (  const T & x )
    10.     {
    11.         OStringStream ost;
    12.         ost << x;   // error
    13.         return ost. str ( );
    14.     }
    15. };
  • このOStreingStreamはstd::ostringstream として、Stream.hに定義されている。
  • なので、この operator << を定義する必要がある
  • headerファイル
    std::ostream& operator << (std::ostream& out, const class foo& right);
  • cppファイル
    std::ostream& operator << (std::ostream& out, const class foo& right)
    {
    	out << right.getString();	// 適当な処理を行う
    	return out;
    }
  • 後述するように、ヘッダファイルと実装を切り分けないと、多重定義が発生するので注意。

error C3861: 'min'識別子が見つかりませんでした

  • 'max'も同じく
  • Visual Studio 2005からVisual Studio 2008に変更したら起きた
  • どうやら,min,maxは非標準のマクロだったらしい.
  • std::min, std::maxでリプレースするのが妥当かと.
    std::max(a, b)
  • しかし,それでもダメなときがある.
    error C2780: 'const _Ty &std::max(const _Ty &,const _Ty &,_Pr)' : 3 引数が必要です - 2 が設定されます。
  • 引数にテンプレート関数を使ってる関係で,どうやら,引数の2つが違うtypeだとエラーの模様.
  • 両方の引数の型が違うとこける模様.
    double d = 1.0;
    int i = 0;
    std::max(i, d);  // ←ここでdoubleとintの比較なのでこける
  • ってな具合に.
  • 静的キャストを使って回避しよう
    std::max(1.0, (double)0);

error D8016 : コマンド ライン オプション '/GL' と '/ZI' は同時に指定できません

ジャンル:Visual Studio

warning C4390: プロトタイプされている関数が呼び出されませんでした (変数の定義が意図されていますか?)

  • クラスのコンストラクタが引数が無いのに、空っぽのカッコ付きでコールするとこうなる
    class CHogehoge{
    public:
        CHogehoge() {};
    };
    main(){
        CHogehoge temp(); // ←こいつが警告を引き起こす
        //CHogehoge temp; // 正しくは、カッコ無しで宣言する
    }
  • 参考:コンパイラの警告 (レベル 1) C4930*2

warning C4819:ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。

  • OpenCVをVisual Studio 2005で利用するとこのwarningが出る.
  • cv/cvcompat.h が原因.
  • Visual Studio 2005でcv/compat.hを編集(一文字入力してから消去)してファイルを保存するとwarningが消える.
  • 参考:Visual C++ 2008 Express Edition - OpenCV@Chihara-Lab., 2007-12-07公開, 2012-01-23更新, 2013-03-12閲覧};

ジャンル:OpenCV:OpenCV 1.1:OpenCV 2.0:OpenCV 2.1:Visual Studio

  • Visual Studio 2008 + OpenCV 2.2 ではlegacy/compat.hpp がこのwarningを出す.
  • 上記方法では何故かwarningが消えない.
  • 原因は追求中.
  • 対症療法と根本的な解決方法を1つずつ
  • #pragma を使って warning を 抑制

      
  1. #pragma warning(disable : 4819)
  2. #include <cv.h>
  3. #pragma warning(default: 4819)
  • 正しいファイルをインクルードする
    • OpenCV 2.2 でファイル構造が大幅に変わった.
    • C++インタフェース用のファイルとCインタフェース用のファイルが別々になってる.
    • 旧来の cv.h や cxcore.h のincludeも compatibility として残されている(build\include\opencv 以下のファイル達)
    • それらをincludeすると,上記C4819 warningが発生する.
    • 対応するヘッダファイルを opnecv2 以下から探してくれば良い
      • cxcore.h <-> opencv2/core/core_c.h (Cインタフェース) opencv2/core/core.hpp (C++インタフェース)
      • cv.h <-> opencv2/imgproc/imgproc_c.h (Cインタフェース) opencv2/imgproc/imgproc.hpp (C++インタフェース)
      • highgui.h <-> opencv2/highgui/highgui_c.h (Cインタフェース) opencv2/highgui/highgui.hpp (C++インタフェース)
      • など(あくまでも一例)
  • いずれにしろwarningなだけなんだが.

ジャンル:OpenCV:OpenCV 2.2:Visual Studio

warning C4800: 'int' : ブール値を 'true' または 'false' に強制的に設定します (警告の処理)

  • 原因:intをboolにキャストしている
    
            
    1. bool function ( int number ) {
    2. return  (bool )number; // warning C4800
    3. }
  • int型の変数が0だったらfalse,それ以外の場合はtrueとする場合は多々ある.
  • しかし,intをboolにキャストしてはいけない(厳密には非boolの型どんなものでも)(仕様)
  • 対処
  • キャストするときに != 0 を使うのが一番簡単
    
            
    1. bool function ( int number ) {
    2. return number !=  0;
    3. }
  • cf:コンパイラの警告 (レベル 3) C4800 (C++)

warning LNK4098: defaultlib '*****' は他のライブラリの使用と競合しています。

ジャンル:Visual Studio

warning MSB8012: TargetPath does not match the Library's OutputFile

0xc0150002 アプリケーションを正しく初期化できませんでした

ジャンル:OpenCV:OpenCV 1.1:Visual Studio

OpenCV 1.1でプロセス(プログラム)が終了しなくなる

ジャンル:OpenCV:OpenCV 1.1:Visual Studio:未解決?

関数を使用しただけで,突然大量の「型が定義されていません」エラーが発生する

  • KLTの実装にて起きた.
  • 原因というより,C言語で起きてたので,仕様とも言うべき事態.
  • KLTの本体はC言語で書かれている割に,メインプログラムはC++でコンパイルできる.
  • よって,メインプログラム内の適当な場所で関数をコールすると,それより後で宣言が行われていた場合,宣言が全てエラーになる.
  • 初歩的な・・・

ジャンル:Visual Studio

Visual Studio .NETでプロファイラを使う方法

  • Professional Edition のみ?
  • VC++の場合(多分ほかも同じだと思うけれど)
  1. ビルド(B)→ガイド付き最適化のプロファイル(P)→インストルメント(I)を実行
    • リビルドが行われる
    • Debugモードだとerror D8016が出たので無理かも
  2. ビルド(B)→ガイド付き最適化のプロファイル(P)→インストルメントまたは最適化されたアプリケーションの実行(R)
    • アプリケーションが起動するので,適当に動かす(最適化させたい動作がベスト)
    • アプリケーションを終了する
  3. ビルド(B)→ガイド付き最適化のプロファイル(P)→最適化(O)
    • 実行した情報がカウントして統計される
  4. ツール(T)→Visual Studio 2005 Command Promptを実行
  5. コマンドプロンプト上でコマンドを実行
    C:\Program ... \VC\bin>pgomgr /summary XXXXXX\apli.pgd 
    • XXXXXXにはアプリのReleaseフォルダへのパス
    • apliはソリューションの名前
  6. これでこんな表示が出るはず.長いのでリダイレクト推奨
    Microsoft(R) Profile Guided Optimization Manager 8.00.50727.762
    Copyright (C) Microsoft Corporation. All rights reserved.
    
    PGD ファイル: \XXXXXXXX\apli.pgd  11/20/2008 12:54:52
    モジュールの数: 1  関数の数: 389  Arc の数: 1248  値の数: 18
    
    静的命令: 11054  基本ブロック: 1743  平均 BB サイズ: 6.3
    動的命令: 327756730
    
                                         entry  static       dynamic     %     run
    関数名                               count   instr         instr  total   total
    tSubtractAverage                    307200      93     134351620   41.0   41.0
    shift                              1603470      90      44897160   13.7   54.7
    C2TSI::getInnerProductMap              240     181      35021113   10.7   65.4
    tLowPass                            153600     322      34713600   10.6   76.0
    tPadZero                            307200     122      32070160    9.8   85.8
    CTSI::SearchStartAndEnd                960     118      31556620    9.6   95.4
    CTSI::extractRawColumn              307200      29       8908800    2.7   98.1
    CTSI::getNormMap                       480      58       3699360    1.1   99.2
    CTSI::getTimeSpaceImage               1442     357        977770    0.3   99.5
    _cvGetRow                            40560       9        365040    0.1   99.6
    CTSI::loadImageFromImageFile         20164      23        302460    0.1   99.7
    CTSI::loadImageFromImageFile         20164      11        221804    0.1   99.8
    • 右から3列目のdynamic instrが実行回数
    • 右から2列目の%totalがその関数が実行に要した時間
    • 一番右のrun totalが実行時間の累計和
  7. 次回ビルドするときに何か言われることがあるが,プロファイラをしないなら,リビルドを行ってよい.

ジャンル:Visual Studio

FILE*構造体

int fseek(FILE *fp, long offset, int whence);

  • whenceからoffsetバイト分移動したところに移動する
  • whenceは,
    • ファイルの先頭を表すSEEK_SET
    • 現在位置であるSEEK_CUR
    • 終端位置であるSEEK_END
  • のどれか

void rewind(FILE *fp);

FILE* fopen(const char *filename, const char *mode);

  • filenameとmodeの順番に注意!!

コード要素***が読み取り専用であるため、追加と削除操作は出来ません

  • Visual Studio 2005で発生
  • MFCダイアログボックスにボタンを追加し,イベントハンラを追加しようとしたら発生
  • 原因はncbファイルの破損っぽい.
  • http://blogs.yahoo.co.jp/dpdtp652/837997.html 参照
  • ncbファイルはちなみにintellisenseの情報を保存したファイルっぽい.
  • ソリューションを1度閉じた後,ソリューションと同じフォルダに存在するプロジェクト名.ncbファイルを削除
  • 再びソリューションを開くと問題が解決している

ジャンル:Visual Studio

コード要素***が読み取り専用であるため、追加と削除操作は出来ません VS2010編

  • Visual Studio 2010で発生
  • MFCダイアログボックスにボタンを追加し,イベントハンラを追加しようとしたら発生
  • 原因はインテリセンスの保存されているsdfファイルの模様
  • ソリューションを1度閉じた後,ソリューションと同じフォルダに存在するソリューション名.sdfファイルを削除
  • 再びソリューションを開くと問題が解決している
  • また、だいたいのクラスウィザードのエラーはこれ

ジャンル:Visual Studio

プロジェクトにクラスの追加を行うとVisutal Studioがフリーズする

ジャンル:Visual Studio

CRとLF

  • CRが\rであり,Mac OS(9まで)などで使われていた改行コード
  • LFが\nであり,Unix系のOSなどで使われている改行コード
  • WindowsではCR+LFであり,\r\nで表される

コンソール画面が消えない

  • OpenCV 2.1 にバージョンアップしてから,ときたま実行したプログラムが終了しないときがある
  • OpenCV 2.1 + Visual Studio 2003 でコンソールアプリを作成
  • 実行して,正常終了→Visual Studioの画面が実行モードから編集モードに戻る
  • が,それでもコンソール画面が出たまま
  • 少ない事例だが,今のところOpenCVで生成したウィンドウは消えている
  • Visual Studioを終了させてもダメ
  • 再起動させようにも,残ったコンソール画面が悪さをして再起動できない.
  • OpenCV 2.1でウィンドウを生成して,ウィンドウを破棄(cvDestroyWindow)せずにプログラムだけ止めると,発生する模様.

ジャンル:Visual Studio

Visual Studio でコマンドラインアプリをデバッグする際,引数を指定する方法

  • コマンドラインアプリで,引数により挙動を変えるプログラムをよく作る(私は)
  • ただし,デバッグモードでは,引数なしの状態でしか実行されない
  • プロジェクト(P)→プロジェクトのプロパティ(P)→デバッグ→コマンド引数という欄に引数を指定できる
  • Visual Studio 2008 と 2003で最低限確認した.
  • ウィンドウのレイアウトは違うかも
  • 添付はVisual Studio 2008の画面

https://i-blog.csdnimg.cn/blog_migrate/19357e0129c231abbc2ff269dca0d12d.png

ジャンル:Visual Studio

OpenCV のリポジトリにアクセスしようとしたらユーザ名とパスワードを要求された

  • 本来はOpenCVのリポジトリにuserもpasswordも要らない
  • 最近*5OpenCVのリポジトリが code.ros.org から code.opencv.org に移行した.
    • 更にその昔は CVS でバージョン管理してた時代にはユーザ名があったはずだけれど
  • ちなみにリポジトリ間では互換性(?)が無いので,もう1度 full checkout する必要がある.
  • そして2012年7月26日にOpenCVのリポジトリもSVNからgitに変わった
  • 参考:OpenCV Computer Vision Library ()*6

ビットリバースとポップカウント

  • bit表記した変数(例えば16bitのshort)の中に1がいくつ存在するかをカウントするのがポップカウント
  • bit表記した変数(例えば16bitのshort)のbitの並びを前後逆にするのがビットリバース
  • 10進数16進数2進数ビットリバースポップカウント
    10x0100000001100000001
    20x0200000010010000001
    30x0300000011110000002
    1820xB610110110011011015
    880x5801011000000110103
  • ルックアップテーブルを使うと結構速い。*7*8*9
  • ビット単位で数える/並べ替えると著しく遅い*9*7*8
  • また、マスキングを使った分割統治法もある*10

プリプロセッサ

C言語の文字コード変換について

  • 特に限定してないけれど、基本的にSJIS→UTF-8への変換ができるAPIやライブラリを調べてみた。

::WideCharToMultiByte を使う方法

iconvを使う方法


      
  1. iconv_t ic = iconv_open ( "SJIS" ,  "UTF-8" );
  2. memcpy ( in , utf8 ,  sizeof (utf8 )  );
  3. iconv ( ic ,  &in ,  &in_size ,  &out ,  &out_size );
  4. iconv_close (ic );

ICUを使う方法

std::string内で使える文字列検索関数

  • STLにあるstd::string内にある関数
    find()・・・指定した文字列が、最初に現れる位置を返す
    rfind()・・・指定した文字列が、最後に現れる位置を返す
    find_first_of()・・・指定した文字列の一部の文字が、最初に現れる位置を返す
    find_last_of()・・・指定した文字列の一部の文字が、最後に現れる位置を返す
    find_first_not_of()・・・指定した文字列の一部に含まれない文字が、最初に現れる位置を返す
    find_last_not_of()・・・指定した文字列の一部に含まれない文字が、最後に現れる位置を返す
  • 引用元:C++編(標準ライブラリ) 第1章 string*27

vector でfindする方法


      
  1. #include <algorithm>
  2. #include <vector>
  3.  
  4. std :: vector <int > datas;
  5. int needle;
  6.  
  7. std :: vector <int >:: iterator it = std :: find (datas. begin ( ) , datas. end ( ) , needle );
  8. if (it == datas. end ( ) ) {
  9. //見つからなかった場合
  10. std :: cout  <<  "Not Found"  << std :: endl;
  11. }

‘&’ cannot appear in a constant-expression

  • Visual Studio では通ったが、gccでは通らなかった
    
            
    1. std :: vector <std :: vector <std :: string >>  dataArrayNG // '>' が2つ続くと、gccだと叱られる
    2. std :: vector <std :: vector <std :: string >  > dataArrayOK // これならOK
  • また、gcc で const の宣言と代入を同時に行うと、同じメッセージが出力される*28

sleep について

iostream のフォーマット指定子

  • printfに慣れてしまったので、書式指定がどうもしっくりこない。
  • ゼロ埋め
    cout << setfill('0') << setw(5) << 20 << endl;
  • 16進数、10進数、8進数も使える*30
    cout << oct << 42;
    cout << dec << 42;
    cout << hex << 42;

typedef の順序

  • いつも混乱する*31
    typdef int MyType; 

<< operator のオーバーロード

  • << operator をオーバーロードしたら、error LNK2005 リンクエラーが発生した。*32
  • 宣言と実装をヘッダとCPPで分ける必要がある。

getopt を使おう

すべてのプログラマが読むべき記事10選

クラスのoperatorを定義するときの戻り値の型

  • 実験した上でまとめてるサイト*38
  • 代入演算
    foo& foo::operator = (const foo&);
  • 四則演算
    const foo foo::operator + (const foo&);
  • 四則演算と代入
    foo& foo::operator += (const foo&);
  • 比較演算
    bool foo::operator == (const foo&);
  • などなど
  • クラスの operator を定義するとき、戻り値の型はどうすべきか*38
  • 実験した上で考察されているので、自分が理解する手助けになった

string

  • 文字を消すときはeraseでchar のindex単位で削除できる
    std::string hoge = std::string("foo");
    hoge.erase(0,1);
    std::cout << hoge << std::endl;
  • 実行結果
    oo

Visual Studio でcppunitをビルドするお話

Sleep関数

複数桁数の数字を文字列に変換する

ある型が定義されているか確認する方法

Cコンパイラとプラットフォームを判定する定義済みマクロ

 gccmsvc
64bit (IA64)__ia64___M_IA64
64bit (x86_64)__x86_64___M_X64
32bit (x86)__i386___M_IX86
  • Cコンパイラのプラットフォーム、コンパイラを判別する定義済みマクロ*45*46
  • メジャーなarchitecture/compiler による pre defined macros
  • Alpha, AMD64, ARM, ARM64, Blackfin, Convex, Epiphany, HP/PA RISC, Intel x86, Intel Itanium IA-64, Motorola 68k, MIPS, PowerPC, Pyramid 9810, RS/6000, SPARC, SuperH, SystemZ, TMS320, TMS470
  • こんなアーキテクチャあるんだ・・
  • Pre-defined Compiler Macros / Wiki / Architectures*47

ビット操作

  • ビット操作だけでかなりの数学的に処理を再現できる
  • 特にループが無くビット操作で再現出来ると、くっそ速い。
  • 参考:Bit Twiddling Hacks *48

streamクラスのeof

Error: use of enum ‘AVCodecID’ without previous declaration

C++でvectorの参照渡しを省略可能にする方法


*1  float vs. double, 2005-08-08公開, 2009-08-15更新, 2013-03-12閲覧
*2  コンパイラの警告 (レベル 1) C4930, 2007-11更新, 2013-08-22閲覧
*3  【VC++】OpenCVのヘッダが C4819ワーニングを出してウザい! « 吟遊詩人の戯言, 2009-07-14公開, 2013-03-12閲覧
*4  How do I fix warning MSB8012 in a static library project in Visual C++ 2010? - Stack Overflow, 2013-06-01投稿, 2013-06-01回答, 2014-11-30閲覧
*5  詳しくはいつだか覚えてないけれど
*6  OpenCV Computer Vision Library (), 2012-04-30投稿, 2013-03-26閲覧
*7  Best Algorithm for Bit Reversal ( from MSB->LSB to LSB->MSB) in C - Stack Overflow, 2012-11-26閲覧
*8  ビットリバース - sileの日記, 2012-11-26閲覧
*9  ビットを数える・探すアルゴリズム, 2004-05-04公開, 2012-09-01更新, 2013-05-09閲覧
*10  ビットリバース - 簡潔なQ, 2012-11-26閲覧
*11  Man page of cpp, 1993-04-30公開, 2013 -03-11更新, 2013-03-12閲覧
*12  16.3 プリプロセッサ cpp, 2013-03-12閲覧
*13  C言語のプリプロセスのメモ(Hishidama's C pre-process Memo), 2006-10-30更新, 2015-01-13閲覧
*14  its55 lab ≫ C++でShift-JISをUTF-8に変換する, 2008-06-11公開, 2013-03-26閲覧
*15  its55 lab ≫ C++でUTF-8をShift-JISに変換する, 2008-06-25公開, 2013-03-26閲覧
*16  WideCharToMultiByte 関数 - msdn, 2013-03-26閲覧
*17  MultiByteToWideChar 関数 - msdn, 2013-03-26閲覧
*18  GetTextCharset 関数 - msdn, 2013-03-26閲覧
*19  IsTextUnicode 関数 - msdn, 2013-03-26閲覧
*20  文字コードの変換ライブラリ | プログラマーズ雑記帳, 2011-11-24公開, 2013-03-26閲覧
*21  LinuxのC言語で Shift-JIS と UTF-8 の相互変換 - かおるんダイアリー , 2010-03-12公開, 2013-03-26閲覧
*22  ICU Shift_JISとUTF-8の変換 - Faith and Brave - C++で遊ぼう, 2010-03-18公開, 2013-03-26閲覧
*23  ICU - International Components for Unicode, 2013-03-26閲覧
*24  C/C++あれこれ/文字コード変換ライブラリICUのサンプル(UTF-8→SJIS)です。 - 笑猫酒家, 2010-04-29公開, 2012-08-08修正, 2013-03-26閲覧
*25  utf 8 - C++ UTF-8 output with ICU - Stack Overflow, 2010-04-29投稿, 2013-03-26閲覧
*26  ICU による文字コード変換ライブラリ - yanoの日記, 2010-08-22公開, 2013-03-26閲覧
*27  C++編(標準ライブラリ) 第1章 string, 2013-04-10更新, 2013-04-16閲覧
*28  Cannot appear constant-expression? - yukimiの成長記, 2009-04-08公開, 2013-04-16閲覧
*29  時間測定関数の性能(分解能と最大値)のまとめ, 2013-08-22閲覧
*30  C++ の iostream フォーマット指定早見表, 2012-04-13公開, 2013-08-22閲覧
*31  typedefの使い方, 2013-08-22閲覧
*32  c++ - overloading << for my class - Stack Overflow, 2011-08-20投稿, 2013-08-28閲覧
*33  向川康博, getoptによるオプション解析, 1998-08-18公開, 2004-06-16更新, 2014-06-30閲覧
*34  すべてのプログラマが読むべき記事10選 | POSTD, 2014-06-27公開, 2014-06-30閲覧
*35  Javin Paul, 10 Articles Every Programmer Must Read, 2014-05-13公開, 2014-06-30閲覧
*36  David Goldberg, What Every Computer Scientist Should Know About Floating-Point Arithmetic, 1991-03公開, 2014-06-30閲覧
*37  Ulrich Drepper, What Every Programmer Should Know About Memory, 2007-11-21公開, 2014-06-30閲覧
*38  クラスの operator を定義するとき、戻り値の型はどうすべきか, 2012-04-07更新, 2014-11-30閲覧
*39  CppUnit - C++ port of JUnit | SourceForge.net, 2008-02-20更新(v1.12.1), 2014-11-30閲覧
*40  skmk, Visual Studio C++でCppUnitをビルドできない、そんなとき | skmks, 2011-01-25公開, 2011-04-16更新, 2014-11-30閲覧
*41  επιστημη(えぴすてーめー), 連載 C++開発者のための単体テスト入門:第2回 C++アプリケーションの効率的なテスト手法(CppUnit編) (1/4) - @IT, 2007-08-17更新, 2014-11-30閲覧
*42  What is the proper #include for the function 'sleep' in C? - Stack Overflow, 2013-02-11投稿, 2013-02-11回答, 2014-04-18更新, 2014-11-30閲覧
*43  Alternative to itoa() for converting integer to string C++? - Stack Overflow, 2008-10-23投稿, 2008-10-23回答, 2013-05-07更新
*44  c++ - How to check if a datatype is "defined" with typedef - Stack Overflow, 2010-08-18投稿, 2010-08-18回答, 2014-12-01閲覧
*45  Jonathan de Boyne Pollard, FGA: Predefined macros in C/C++ that tell you what the target processor is., 2014-05-12閲覧
*46  定義済みマクロ, VS2013, 2014-05-12閲覧
*47  Pre-defined Compiler Macros / Wiki / Architectures, 2014-07-11更新, 2014-09-25閲覧
*48  Sean Eron Anderson, Bit Twiddling Hacks, 2014-08-04閲覧
*49  【C/C++】 streamクラスのeofメンバ: 日々此精進, 2009-12-12公開, 2015-01-13閲覧
*50  Build problems for openCV 2.4.1 with Ubuntu 12.04 LTS - OpenCV Q&A Forum, OpenCV 2.4.1, Ubuntu 12.04, 2013-04-28投稿, 2014-11-21更新, 2015-06-09閲覧
*51  Install OpenCV 2.4 on Ubuntu 12.04 « So Tired !_!, OpenCV 2.4, Ubuntu 12.04, 2012-07-17公開, 2015-06-09閲覧
*52  OpenCV Lover: Install Opencv 2.3.1 on Ubuntu 12.04 Precise Pangolin, OpenCV 2.3.1, Ubuntu 12.04, 2015-06-09閲覧
*53  How to install FFmpeg on Debian? - Super User, 2011-05-21投稿, 2015-01-16更新, 2015-06-09閲覧
*54  shnya_mさんはTwitterを使っています: "@uchumik ディフォルト引数取るってことは、, g++ 4.4, 2013-02-27公開, 2015-06-09閲覧
*55  gist:5048103, 2013-02-27公開, 2015-06-10閲覧

添付ファイル: filecommand-line-argument.png 112379件 [詳細]
/* Result Sets Interface */ #ifndef SQL_CRSR # define SQL_CRSR struct sql_cursor { unsigned int curocn; void *ptr1; void *ptr2; unsigned int magic; }; typedef struct sql_cursor sql_cursor; typedef struct sql_cursor SQL_CURSOR; #endif /* SQL_CRSR */ /* Thread Safety */ typedef void * sql_context; typedef void * SQL_CONTEXT; /* Object support */ struct sqltvn { unsigned char *tvnvsn; unsigned short tvnvsnl; unsigned char *tvnnm; unsigned short tvnnml; unsigned char *tvnsnm; unsigned short tvnsnml; }; typedef struct sqltvn sqltvn; struct sqladts { unsigned int adtvsn; unsigned short adtmode; unsigned short adtnum; sqltvn adttvn[1]; }; typedef struct sqladts sqladts; static struct sqladts sqladt = { 1,1,0, }; /* Binding to PL/SQL Records */ struct sqltdss { unsigned int tdsvsn; unsigned short tdsnum; unsigned char *tdsval[1]; }; typedef struct sqltdss sqltdss; static struct sqltdss sqltds = { 1, 0, }; /* File name & Package Name */ struct sqlcxp { unsigned short fillen; char filnam[16]; }; static struct sqlcxp sqlfpn = { 15, "store_ngskip.pc" }; static unsigned int sqlctx = 2697803; static struct sqlexd { unsigned long sqlvsn; unsigned int arrsiz; unsigned int iters; unsigned int offset; unsigned short selerr; unsigned short sqlety; unsigned int occurs; short *cud; unsigned char *sqlest; char *stmt; sqladts *sqladtp; sqltdss *sqltdsp; unsigned char **sqphsv; unsigned long *sqphsl; int *sqphss; short **sqpind; int *sqpins; unsigned long *sqparm; unsigned long **sqparc; unsigned short *sqpadto; unsigned short *sqptdso; unsigned int sqlcmax; unsigned int sqlcmin; unsigned int sqlcincr; unsigned int sqlctimeout; unsigned int sqlcnowait; int sqfoff; unsigned int sqcmod; unsigned int sqfmod; unsigned int sqlpfmem; unsigned char *sqhstv[12]; unsigned long sqhstl[12]; int sqhsts[12]; short *sqindv[12]; int sqinds[12]; unsigned long sqharm[12]; unsigned long *sqharc[12]; unsigned short sqadto[12]; unsigned short sqtdso[12]; } sqlstm = {13,12}; /* SQLLIB Prototypes */ extern sqlcxt (/*_ void **, unsigned int *, struct sqlexd *, struct sqlcxp * _*/); extern sqlcx2t(/*_ void **, unsigned int *, struct sqlexd *, struct sqlcxp * _*/); extern sqlbuft(/*_ void **, char * _*/); extern sqlgs2t(/*_ void **, char * _*/); extern sqlorat(/*_ void **, unsigned int *, void * _*/); /* Forms Interface */ static int IAPSUCC = 0; static int IAPFAIL = 1403; static int IAPFTL = 535; extern void sqliem(/*_ unsigned char *, signed int * _*/); typedef struct { unsigned short len; unsigned char arr[1]; } VARCHAR; typedef struct { unsigned short len; unsigned char arr[1]; } varchar; /* CUD (Compilation Unit Data) Array */ static short sqlcud0[] = {13,4130,1,0,0, 5,0,0,0,0,0,27,60,0,0,4,4,0,1,0,1,97,0,0,1,97,0,0,1,97,0,0,1,10,0,0, 36,0,0,2,0,0,32,64,0,0,0,0,0,1,0, 51,0,0,3,0,0,32,80,0,0,0,0,0,1,0, 66,0,0,4,0,0,31,115,0,0,0,0,0,1,0, 81,0,0,5,71,0,4,120,0,0,1,0,0,1,0,2,97,0,0, 100,0,0,6,174,0,3,159,0,0,7,7,0,1,0,1,97,0,0,1,97,0,0,1,97,0,0,1,97,0,0,1,97,0, 0,1,97,0,0,1,0,0,0, 143,0,0,7,143,0,3,189,0,0,4,4,0,1,0,1,97,0,0,1,97,0,0,1,97,0,0,1,0,0,0, 174,0,0,8,0,0,29,229,0,0,0,0,0,1,0, 189,0,0,9,0,0,31,232,0,0,0,0,0,1,0, 204,0,0,10,0,0,31,258,0,0,0,0,0,1,0, 219,0,0,11,229,0,3,322,0,0,12,12,0,1,0,1,97,0,0,1,3,0,0,1,97,0,0,1,97,0,0,1,97, 0,0,1,97,0,0,1,97,0,0,1,3,0,0,1,97,0,0,1,97,0,0,1,97,0,0,1,0,0,0, }; /****************************************************************************** 受発注連携クライアント DB処理 mod:2018/5/21 SQLエラー時にabortするよう修正 mod:2019/10/7 発注データ内容不正時の処理追加 ******************************************************************************/ #include <sys/types.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <string.h> /*** add 2019/10/7 start ***/ #include <errno.h> /*** add 2019/10/7 end ***/ #include <sqlda.h> #include <sqlcpr.h> #include "logging.h" #include "bj_onl_trn_client.h" #include "store.h" /*** add 2019/10/7 start ***/ #include "config.h" /*** add 2019/10/7 end ***/ /* procコマンドでエラーが表示されるため _DEBUG_のときのみインクルードする */ #ifdef _DEBUG_ #include "trace.h" #else #define _TRACE_(level, body) #endif /****************************************************************************** ホスト変数 ******************************************************************************/ char dbname[DB_NAME_LEN+1]; char username[DB_USERNAME_LEN+1]; char password[DB_PASSWORD_LEN+1]; char process_name[LEN_PG_ID+1]; struct odr_trn_head trn_head; struct odr_trn_mei trn_mei; /****************************************************************************** sqlca ******************************************************************************/ #include <sqlca.h> /****************************************************************************** 初期化 返り値 0 : OK -1 : エラー ******************************************************************************/ int store_initialize() { _TRACE_(10, ("username [%s] password [%s] dbname [%s]" , username, password, dbname)); /* データベースへの接続 */ /* EXEC SQL CONNECT :username IDENTIFIED BY :password USING :dbname; */ { struct sqlexd sqlstm; sqlstm.sqlvsn = 13; sqlstm.arrsiz = 4; sqlstm.sqladtp = &sqladt; sqlstm.sqltdsp = &sqltds; sqlstm.iters = (unsigned int )10; sqlstm.offset = (unsigned int )5; sqlstm.cud = sqlcud0; sqlstm.sqlest = (unsigned char *)&sqlca; sqlstm.sqlety = (unsigned short)4352; sqlstm.occurs = (unsigned int )0; sqlstm.sqhstv[0] = (unsigned char *)username; sqlstm.sqhstl[0] = (unsigned long )21; sqlstm.sqhsts[0] = ( int )21; sqlstm.sqindv[0] = ( short *)0; sqlstm.sqinds[0] = ( int )0; sqlstm.sqharm[0] = (unsigned long )0; sqlstm.sqadto[0] = (unsigned short )0; sqlstm.sqtdso[0] = (unsigned short )0; sqlstm.sqhstv[1] = (unsigned char *)password; sqlstm.sqhstl[1] = (unsigned long )41; sqlstm.sqhsts[1] = ( int )41; sqlstm.sqindv[1] = ( short *)0; sqlstm.sqinds[1] = ( int )0; sqlstm.sqharm[1] = (unsigned long )0; sqlstm.sqadto[1] = (unsigned short )0; sqlstm.sqtdso[1] = (unsigned short )0; sqlstm.sqhstv[2] = (unsigned char *)dbname; sqlstm.sqhstl[2] = (unsigned long )21; sqlstm.sqhsts[2] = ( int )21; sqlstm.sqindv[2] = ( short *)0; sqlstm.sqinds[2] = ( int )0; sqlstm.sqharm[2] = (unsigned long )0; sqlstm.sqadto[2] = (unsigned short )0; sqlstm.sqtdso[2] = (unsigned short )0; sqlstm.sqphsv = sqlstm.sqhstv; sqlstm.sqphsl = sqlstm.sqhstl; sqlstm.sqphss = sqlstm.sqhsts; sqlstm.sqpind = sqlstm.sqindv; sqlstm.sqpins = sqlstm.sqinds; sqlstm.sqparm = sqlstm.sqharm; sqlstm.sqparc = sqlstm.sqharc; sqlstm.sqpadto = sqlstm.sqadto; sqlstm.sqptdso = sqlstm.sqtdso; sqlstm.sqlcmax = (unsigned int )100; sqlstm.sqlcmin = (unsigned int )2; sqlstm.sqlcincr = (unsigned int )1; sqlstm.sqlctimeout = (unsigned int )0; sqlstm.sqlcnowait = (unsigned int )0; sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); } _TRACE_(0, ("sqlcode : %d", sqlca.sqlcode)); if(sqlca.sqlcode < 0) { log_printf(LOG_ERROR, "Database connect error %s%", sqlca.sqlerrm.sqlerrmc); /* EXEC SQL ROLLBACK RELEASE; */ { struct sqlexd sqlstm; sqlstm.sqlvsn = 13; sqlstm.arrsiz = 4; sqlstm.sqladtp = &sqladt; sqlstm.sqltdsp = &sqltds; sqlstm.iters = (unsigned int )1; sqlstm.offset = (unsigned int )36; sqlstm.cud = sqlcud0; sqlstm.sqlest = (unsigned char *)&sqlca; sqlstm.sqlety = (unsigned short)4352; sqlstm.occurs = (unsigned int )0; sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); } return -1; } return 0; } /****************************************************************************** 終了 返り値 0 : OK ******************************************************************************/ int store_terminate() { _TRACE_(10, ("")); /* データベースからの切断 */ /* EXEC SQL ROLLBACK WORK RELEASE; */ { struct sqlexd sqlstm; sqlstm.sqlvsn = 13; sqlstm.arrsiz = 4; sqlstm.sqladtp = &sqladt; sqlstm.sqltdsp = &sqltds; sqlstm.iters = (unsigned int )1; sqlstm.offset = (unsigned int )51; sqlstm.cud = sqlcud0; sqlstm.sqlest = (unsigned char *)&sqlca; sqlstm.sqlety = (unsigned short)4352; sqlstm.occurs = (unsigned int )0; sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); } return 0; } /****************************************************************************** トランザクションの開始 返り値 0 : OK ******************************************************************************/ int store_begin(char *trn_file_id) { _TRACE_(10, ("")); log_printf(LOG_INFO, "START TRN_FILE_ID=%s", trn_file_id); /* 発注キュー及び発注トランヘッダ用ホスト変数の初期化 */ memset(&trn_head, 0, sizeof(trn_head)); /* トランファイルIDをホスト変数へ格納 */ strncpy(trn_head.trn_file_id, trn_file_id, LEN_TRN_FILE_ID); return 0; } /*** add 2019/10/7 start ***/ /****************************************************************************** 発注データINSERTエラー時の処理 ******************************************************************************/ int store_ins_error(char *buffer, size_t size) { char timestamp_buf[18]; FILE *temp_file = NULL; char temp_filename[PATH_MAX]; _TRACE_(10, ("")); _TRACE_(10, ("trn_file_id [%s]", trn_head.trn_file_id)); /* EXEC SQL ROLLBACK WORK; */ { struct sqlexd sqlstm; sqlstm.sqlvsn = 13; sqlstm.arrsiz = 4; sqlstm.sqladtp = &sqladt; sqlstm.sqltdsp = &sqltds; sqlstm.iters = (unsigned int )1; sqlstm.offset = (unsigned int )66; sqlstm.cud = sqlcud0; sqlstm.sqlest = (unsigned char *)&sqlca; sqlstm.sqlety = (unsigned short)4352; sqlstm.occurs = (unsigned int )0; sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); } memset(timestamp_buf, 0, sizeof(timestamp_buf)); memset(temp_filename, 0, sizeof(temp_filename)); /* EXEC SQL SELECT TO_CHAR(SYSTIMESTAMP,'YYYYMMDDHH24MISSFF3') INTO :timestamp_buf FROM DUAL; */ { struct sqlexd sqlstm; sqlstm.sqlvsn = 13; sqlstm.arrsiz = 4; sqlstm.sqladtp = &sqladt; sqlstm.sqltdsp = &sqltds; sqlstm.stmt = "select TO_CHAR(SYSTIMESTAMP,'YYYYMMDDHH24MISSFF3') into :\ b0 from DUAL "; sqlstm.iters = (unsigned int )1; sqlstm.offset = (unsigned int )81; sqlstm.selerr = (unsigned short)1; sqlstm.sqlpfmem = (unsigned int )0; sqlstm.cud = sqlcud0; sqlstm.sqlest = (unsigned char *)&sqlca; sqlstm.sqlety = (unsigned short)4352; sqlstm.occurs = (unsigned int )0; sqlstm.sqhstv[0] = (unsigned char *)timestamp_buf; sqlstm.sqhstl[0] = (unsigned long )18; sqlstm.sqhsts[0] = ( int )0; sqlstm.sqindv[0] = ( short *)0; sqlstm.sqinds[0] = ( int )0; sqlstm.sqharm[0] = (unsigned long )0; sqlstm.sqadto[0] = (unsigned short )0; sqlstm.sqtdso[0] = (unsigned short )0; sqlstm.sqphsv = sqlstm.sqhstv; sqlstm.sqphsl = sqlstm.sqhstl; sqlstm.sqphss = sqlstm.sqhsts; sqlstm.sqpind = sqlstm.sqindv; sqlstm.sqpins = sqlstm.sqinds; sqlstm.sqparm = sqlstm.sqharm; sqlstm.sqparc = sqlstm.sqharc; sqlstm.sqpadto = sqlstm.sqadto; sqlstm.sqptdso = sqlstm.sqtdso; sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); } if(sqlca.sqlcode < 0) { log_printf(LOG_ERROR, "Database session error%s%", sqlca.sqlerrm.sqlerrmc); abort(); } else { /* TEMPファイル出力 */ sprintf(temp_filename, "%s_%s.TEMP.%s" , get_config()->log_file , get_config()->process_name , timestamp_buf); temp_file = fopen(temp_filename, "ab+"); if(temp_file == NULL) { log_printf(LOG_ERROR, "TEMP file open error : [%s] %s(%d)",temp_filename, strerror(errno), errno); abort(); } fwrite(buffer, size, 1, temp_file); fclose(temp_file); log_printf(LOG_WARN, "SKIP TRN_FILE_ID=%s TEMP_FILE=%s", trn_head.trn_file_id, temp_filename); } return 0; } /*** add 2019/10/7 end ***/ /****************************************************************************** 仕上げの処理(発注トランヘッダテーブルと発注キューテーブルの登録) 返り値 0 : OK -1 : エラー ******************************************************************************/ int store_finish() { int retry_count = 0; BOOL sqldone = NO; _TRACE_(10, ("")); /* 発注トランヘッダテーブルへINSERT */ while(!sqldone) { /* EXEC SQL INSERT INTO BJ_T_ODR_TRN_HEAD (TRN_FILE_ID,HCHIKU_HEAD,TENBAN_HEAD, RCV_DATE,RCV_TIME,REC_RGST_DT,REC_RGST_PG_ID,REC_RGST_ID) VALUES (:trn_head.trn_file_id,:trn_head.hchiku_head,:trn_head.tenban_head ,:trn_head.rcv_date,:trn_head.rcv_time,systimestamp,:process_name,:process_name); */ { struct sqlexd sqlstm; sqlstm.sqlvsn = 13; sqlstm.arrsiz = 7; sqlstm.sqladtp = &sqladt; sqlstm.sqltdsp = &sqltds; sqlstm.stmt = "insert into BJ_T_ODR_TRN_HEAD (TRN_FILE_ID,HCHIKU_HEA\ D,TENBAN_HEAD,RCV_DATE,RCV_TIME,REC_RGST_DT,REC_RGST_PG_ID,REC_RGST_ID) values\ (:b0,:b1,:b2,:b3,:b4,systimestamp,:b5,:b5)"; sqlstm.iters = (unsigned int )1; sqlstm.offset = (unsigned int )100; sqlstm.cud = sqlcud0; sqlstm.sqlest = (unsigned char *)&sqlca; sqlstm.sqlety = (unsigned short)4352; sqlstm.occurs = (unsigned int )0; sqlstm.sqhstv[0] = (unsigned char *)(trn_head.trn_file_id); sqlstm.sqhstl[0] = (unsigned long )129; sqlstm.sqhsts[0] = ( int )0; sqlstm.sqindv[0] = ( short *)0; sqlstm.sqinds[0] = ( int )0; sqlstm.sqharm[0] = (unsigned long )0; sqlstm.sqadto[0] = (unsigned short )0; sqlstm.sqtdso[0] = (unsigned short )0; sqlstm.sqhstv[1] = (unsigned char *)(trn_head.hchiku_head); sqlstm.sqhstl[1] = (unsigned long )3; sqlstm.sqhsts[1] = ( int )0; sqlstm.sqindv[1] = ( short *)0; sqlstm.sqinds[1] = ( int )0; sqlstm.sqharm[1] = (unsigned long )0; sqlstm.sqadto[1] = (unsigned short )0; sqlstm.sqtdso[1] = (unsigned short )0; sqlstm.sqhstv[2] = (unsigned char *)(trn_head.tenban_head); sqlstm.sqhstl[2] = (unsigned long )6; sqlstm.sqhsts[2] = ( int )0; sqlstm.sqindv[2] = ( short *)0; sqlstm.sqinds[2] = ( int )0; sqlstm.sqharm[2] = (unsigned long )0; sqlstm.sqadto[2] = (unsigned short )0; sqlstm.sqtdso[2] = (unsigned short )0; sqlstm.sqhstv[3] = (unsigned char *)(trn_head.rcv_date); sqlstm.sqhstl[3] = (unsigned long )9; sqlstm.sqhsts[3] = ( int )0; sqlstm.sqindv[3] = ( short *)0; sqlstm.sqinds[3] = ( int )0; sqlstm.sqharm[3] = (unsigned long )0; sqlstm.sqadto[3] = (unsigned short )0; sqlstm.sqtdso[3] = (unsigned short )0; sqlstm.sqhstv[4] = (unsigned char *)(trn_head.rcv_time); sqlstm.sqhstl[4] = (unsigned long )10; sqlstm.sqhsts[4] = ( int )0; sqlstm.sqindv[4] = ( short *)0; sqlstm.sqinds[4] = ( int )0; sqlstm.sqharm[4] = (unsigned long )0; sqlstm.sqadto[4] = (unsigned short )0; sqlstm.sqtdso[4] = (unsigned short )0; sqlstm.sqhstv[5] = (unsigned char *)process_name; sqlstm.sqhstl[5] = (unsigned long )18; sqlstm.sqhsts[5] = ( int )0; sqlstm.sqindv[5] = ( short *)0; sqlstm.sqinds[5] = ( int )0; sqlstm.sqharm[5] = (unsigned long )0; sqlstm.sqadto[5] = (unsigned short )0; sqlstm.sqtdso[5] = (unsigned short )0; sqlstm.sqhstv[6] = (unsigned char *)process_name; sqlstm.sqhstl[6] = (unsigned long )18; sqlstm.sqhsts[6] = ( int )0; sqlstm.sqindv[6] = ( short *)0; sqlstm.sqinds[6] = ( int )0; sqlstm.sqharm[6] = (unsigned long )0; sqlstm.sqadto[6] = (unsigned short )0; sqlstm.sqtdso[6] = (unsigned short )0; sqlstm.sqphsv = sqlstm.sqhstv; sqlstm.sqphsl = sqlstm.sqhstl; sqlstm.sqphss = sqlstm.sqhsts; sqlstm.sqpind = sqlstm.sqindv; sqlstm.sqpins = sqlstm.sqinds; sqlstm.sqparm = sqlstm.sqharm; sqlstm.sqparc = sqlstm.sqharc; sqlstm.sqpadto = sqlstm.sqadto; sqlstm.sqptdso = sqlstm.sqtdso; sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); } if(sqlca.sqlcode < 0) { log_printf(LOG_ERROR, "Database insert BJ_T_ODR_TRN_HEAD error%s%", sqlca.sqlerrm.sqlerrmc); /*** mod 2019/10/7 start ***/ /* EXEC SQL ROLLBACK WORK;*/ /* if (retry_count < MAX_SQL_RETRY) {*/ /* sleep(SQL_RETRY_TIMER);*/ /* retry_count++;*/ /* } else {*/ /* abort();*/ /* }*/ if (retry_count < MAX_INS_RETRY) { sleep(SQL_RETRY_TIMER); retry_count++; } else { return -1; } /*** mod 2019/10/7 end ***/ } else { sqldone = YES; } } /* 発注キューテーブルへINSERT */ retry_count = 0; sqldone = NO; while(!sqldone) { /* EXEC SQL INSERT INTO BJ_T_HAT_QUETBL (TRN_FILE_ID,TENBAN_HEAD,PROC_FLG,REC_RGST_DT,REC_RGST_PG_ID,REC_RGST_ID) VALUES (:trn_head.trn_file_id,:trn_head.tenban_head,'0',systimestamp,:process_name,:process_name); */ { struct sqlexd sqlstm; sqlstm.sqlvsn = 13; sqlstm.arrsiz = 7; sqlstm.sqladtp = &sqladt; sqlstm.sqltdsp = &sqltds; sqlstm.stmt = "insert into BJ_T_HAT_QUETBL (TRN_FILE_ID,TENBAN_HEAD,\ PROC_FLG,REC_RGST_DT,REC_RGST_PG_ID,REC_RGST_ID) values (:b0,:b1,'0',systimest\ amp,:b2,:b2)"; sqlstm.iters = (unsigned int )1; sqlstm.offset = (unsigned int )143; sqlstm.cud = sqlcud0; sqlstm.sqlest = (unsigned char *)&sqlca; sqlstm.sqlety = (unsigned short)4352; sqlstm.occurs = (unsigned int )0; sqlstm.sqhstv[0] = (unsigned char *)(trn_head.trn_file_id); sqlstm.sqhstl[0] = (unsigned long )129; sqlstm.sqhsts[0] = ( int )0; sqlstm.sqindv[0] = ( short *)0; sqlstm.sqinds[0] = ( int )0; sqlstm.sqharm[0] = (unsigned long )0; sqlstm.sqadto[0] = (unsigned short )0; sqlstm.sqtdso[0] = (unsigned short )0; sqlstm.sqhstv[1] = (unsigned char *)(trn_head.tenban_head); sqlstm.sqhstl[1] = (unsigned long )6; sqlstm.sqhsts[1] = ( int )0; sqlstm.sqindv[1] = ( short *)0; sqlstm.sqinds[1] = ( int )0; sqlstm.sqharm[1] = (unsigned long )0; sqlstm.sqadto[1] = (unsigned short )0; sqlstm.sqtdso[1] = (unsigned short )0; sqlstm.sqhstv[2] = (unsigned char *)process_name; sqlstm.sqhstl[2] = (unsigned long )18; sqlstm.sqhsts[2] = ( int )0; sqlstm.sqindv[2] = ( short *)0; sqlstm.sqinds[2] = ( int )0; sqlstm.sqharm[2] = (unsigned long )0; sqlstm.sqadto[2] = (unsigned short )0; sqlstm.sqtdso[2] = (unsigned short )0; sqlstm.sqhstv[3] = (unsigned char *)process_name; sqlstm.sqhstl[3] = (unsigned long )18; sqlstm.sqhsts[3] = ( int )0; sqlstm.sqindv[3] = ( short *)0; sqlstm.sqinds[3] = ( int )0; sqlstm.sqharm[3] = (unsigned long )0; sqlstm.sqadto[3] = (unsigned short )0; sqlstm.sqtdso[3] = (unsigned short )0; sqlstm.sqphsv = sqlstm.sqhstv; sqlstm.sqphsl = sqlstm.sqhstl; sqlstm.sqphss = sqlstm.sqhsts; sqlstm.sqpind = sqlstm.sqindv; sqlstm.sqpins = sqlstm.sqinds; sqlstm.sqparm = sqlstm.sqharm; sqlstm.sqparc = sqlstm.sqharc; sqlstm.sqpadto = sqlstm.sqadto; sqlstm.sqptdso = sqlstm.sqtdso; sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); } if(sqlca.sqlcode < 0) { log_printf(LOG_ERROR, "Database insert BJ_T_HAT_QUETBL error%s%", sqlca.sqlerrm.sqlerrmc); /*** mod 2019/10/7 start ***/ /* EXEC SQL ROLLBACK WORK;*/ /* if (retry_count < MAX_SQL_RETRY) {*/ /* sleep(SQL_RETRY_TIMER);*/ /* retry_count++;*/ /* } else {*/ /* abort();*/ /* }*/ if (retry_count < MAX_INS_RETRY) { sleep(SQL_RETRY_TIMER); retry_count++; } else { return -1; } /*** mod 2019/10/7 end ***/ } else { sqldone = YES; } } return 0; } /****************************************************************************** トランザクションのコミット 返り値 0 : OK -1 : エラー ******************************************************************************/ int store_commit() { int retry_count = 0; BOOL sqldone = NO; _TRACE_(10, ("")); /* トランザクションのコミット */ while(!sqldone) { /* EXEC SQL COMMIT WORK; */ { struct sqlexd sqlstm; sqlstm.sqlvsn = 13; sqlstm.arrsiz = 7; sqlstm.sqladtp = &sqladt; sqlstm.sqltdsp = &sqltds; sqlstm.iters = (unsigned int )1; sqlstm.offset = (unsigned int )174; sqlstm.cud = sqlcud0; sqlstm.sqlest = (unsigned char *)&sqlca; sqlstm.sqlety = (unsigned short)4352; sqlstm.occurs = (unsigned int )0; sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); } if(sqlca.sqlcode < 0) { log_printf(LOG_ERROR, "Database commit error%s%", sqlca.sqlerrm.sqlerrmc); /* EXEC SQL ROLLBACK WORK; */ { struct sqlexd sqlstm; sqlstm.sqlvsn = 13; sqlstm.arrsiz = 7; sqlstm.sqladtp = &sqladt; sqlstm.sqltdsp = &sqltds; sqlstm.iters = (unsigned int )1; sqlstm.offset = (unsigned int )189; sqlstm.cud = sqlcud0; sqlstm.sqlest = (unsigned char *)&sqlca; sqlstm.sqlety = (unsigned short)4352; sqlstm.occurs = (unsigned int )0; sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); } if (retry_count < MAX_SQL_RETRY) { retry_count++; sleep(SQL_RETRY_TIMER); } else { abort(); } } else { sqldone = YES; } } log_printf(LOG_INFO, "END TRN_FILE_ID=%s", trn_head.trn_file_id); return 0; } /****************************************************************************** トランザクションのアボート 返り値 0 : OK ******************************************************************************/ int store_abort() { _TRACE_(10, ("")); /* トランザクションのアボート */ /* EXEC SQL ROLLBACK WORK; */ { struct sqlexd sqlstm; sqlstm.sqlvsn = 13; sqlstm.arrsiz = 7; sqlstm.sqladtp = &sqladt; sqlstm.sqltdsp = &sqltds; sqlstm.iters = (unsigned int )1; sqlstm.offset = (unsigned int )204; sqlstm.cud = sqlcud0; sqlstm.sqlest = (unsigned char *)&sqlca; sqlstm.sqlety = (unsigned short)4352; sqlstm.occurs = (unsigned int )0; sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); } log_printf(LOG_INFO, "ABORT TRN_FILE_ID=%s", trn_head.trn_file_id); return 0; } /****************************************************************************** 発注データ(ヘッダ部)処理 返り値 0 : OK ******************************************************************************/ int store_add_head(interm_head_def *interm_head) { _TRACE_(10, ("")); /* 値のホスト変数への格納 */ memcpy(trn_head.hchiku_head, interm_head->hchiku, LEN_HCHIKU); memcpy(trn_head.tenban_head, interm_head->tenban, LEN_TENBAN); memcpy(trn_head.rcv_date, interm_head->rcv_date, LEN_RCV_DATE); memcpy(trn_head.rcv_time, interm_head->rcv_time, LEN_RCV_TIME); return 0; } /****************************************************************************** 発注データ(データ部)処理 返り値 0 : OK ******************************************************************************/ int store_add_data(interm_data_def *intinterm_data) { _TRACE_(10, ("")); /* 発注トラン明細用ホスト変数の初期化 */ memset(&trn_mei, 0, sizeof(trn_mei)); /* 値のホスト変数への格納 */ trn_mei.seq_no = intinterm_data->seq_no; memcpy(trn_mei.hchiku, intinterm_data->hchiku, LEN_HCHIKU); memcpy(trn_mei.tenban, intinterm_data->tenban, LEN_TENBAN); memcpy(trn_mei.hat_date, intinterm_data->hat_date, LEN_HAT_DATE); return 0; } /****************************************************************************** 発注データ(データ部)のTEXT部処理 返り値 0 : OK -1 : エラー ******************************************************************************/ int store_add_detail(interm_detail_def *interm_detail) { int retry_count = 0; BOOL sqldone = NO; _TRACE_(10, ("")); /* 値のホスト変数への格納 */ memcpy(trn_mei.hatsk_cd, interm_detail->hatsk_cd, LEN_HATSK_CD); memcpy(trn_mei.shohin_cd, interm_detail->shohin_cd, LEN_SHOHIN_CD); trn_mei.hat_baisu =interm_detail-> hat_baisu; memcpy(trn_mei.pop_kbn, interm_detail->pop_kbn, LEN_POP_KBN); memcpy(trn_mei.hat_type, interm_detail->hat_type, LEN_HAT_TYPE); /* 発注トラン明細テーブルへINSERT */ while(!sqldone) { /* EXEC SQL INSERT INTO BJ_T_ODR_TRN_MEI (TRN_FILE_ID,SEQ_NO,HCHIKU,TENBAN,HAT_DATE ,HATSK_CD,SHOHIN_CD,HAT_BAISU,POP_KBN,HAT_TYPE ,REC_RGST_DT,REC_RGST_PG_ID,REC_RGST_ID) VALUES (:trn_head.trn_file_id,:trn_mei.seq_no,:trn_mei.hchiku,:trn_mei.tenban,:trn_mei.hat_date ,:trn_mei.hatsk_cd,:trn_mei.shohin_cd,:trn_mei.hat_baisu,:trn_mei.pop_kbn,:trn_mei.hat_type ,systimestamp,:process_name,:process_name); */ { struct sqlexd sqlstm; sqlstm.sqlvsn = 13; sqlstm.arrsiz = 12; sqlstm.sqladtp = &sqladt; sqlstm.sqltdsp = &sqltds; sqlstm.stmt = "insert into BJ_T_ODR_TRN_MEI (TRN_FILE_ID,SEQ_NO,HCHI\ KU,TENBAN,HAT_DATE,HATSK_CD,SHOHIN_CD,HAT_BAISU,POP_KBN,HAT_TYPE,REC_RGST_DT,R\ EC_RGST_PG_ID,REC_RGST_ID) values (:b0,:b1,:b2,:b3,:b4,:b5,:b6,:b7,:b8,:b9,sys\ timestamp,:b10,:b10)"; sqlstm.iters = (unsigned int )1; sqlstm.offset = (unsigned int )219; sqlstm.cud = sqlcud0; sqlstm.sqlest = (unsigned char *)&sqlca; sqlstm.sqlety = (unsigned short)4352; sqlstm.occurs = (unsigned int )0; sqlstm.sqhstv[0] = (unsigned char *)(trn_head.trn_file_id); sqlstm.sqhstl[0] = (unsigned long )129; sqlstm.sqhsts[0] = ( int )0; sqlstm.sqindv[0] = ( short *)0; sqlstm.sqinds[0] = ( int )0; sqlstm.sqharm[0] = (unsigned long )0; sqlstm.sqadto[0] = (unsigned short )0; sqlstm.sqtdso[0] = (unsigned short )0; sqlstm.sqhstv[1] = (unsigned char *)&(trn_mei.seq_no); sqlstm.sqhstl[1] = (unsigned long )sizeof(int); sqlstm.sqhsts[1] = ( int )0; sqlstm.sqindv[1] = ( short *)0; sqlstm.sqinds[1] = ( int )0; sqlstm.sqharm[1] = (unsigned long )0; sqlstm.sqadto[1] = (unsigned short )0; sqlstm.sqtdso[1] = (unsigned short )0; sqlstm.sqhstv[2] = (unsigned char *)(trn_mei.hchiku); sqlstm.sqhstl[2] = (unsigned long )3; sqlstm.sqhsts[2] = ( int )0; sqlstm.sqindv[2] = ( short *)0; sqlstm.sqinds[2] = ( int )0; sqlstm.sqharm[2] = (unsigned long )0; sqlstm.sqadto[2] = (unsigned short )0; sqlstm.sqtdso[2] = (unsigned short )0; sqlstm.sqhstv[3] = (unsigned char *)(trn_mei.tenban); sqlstm.sqhstl[3] = (unsigned long )6; sqlstm.sqhsts[3] = ( int )0; sqlstm.sqindv[3] = ( short *)0; sqlstm.sqinds[3] = ( int )0; sqlstm.sqharm[3] = (unsigned long )0; sqlstm.sqadto[3] = (unsigned short )0; sqlstm.sqtdso[3] = (unsigned short )0; sqlstm.sqhstv[4] = (unsigned char *)(trn_mei.hat_date); sqlstm.sqhstl[4] = (unsigned long )9; sqlstm.sqhsts[4] = ( int )0; sqlstm.sqindv[4] = ( short *)0; sqlstm.sqinds[4] = ( int )0; sqlstm.sqharm[4] = (unsigned long )0; sqlstm.sqadto[4] = (unsigned short )0; sqlstm.sqtdso[4] = (unsigned short )0; sqlstm.sqhstv[5] = (unsigned char *)(trn_mei.hatsk_cd); sqlstm.sqhstl[5] = (unsigned long )9; sqlstm.sqhsts[5] = ( int )0; sqlstm.sqindv[5] = ( short *)0; sqlstm.sqinds[5] = ( int )0; sqlstm.sqharm[5] = (unsigned long )0; sqlstm.sqadto[5] = (unsigned short )0; sqlstm.sqtdso[5] = (unsigned short )0; sqlstm.sqhstv[6] = (unsigned char *)(trn_mei.shohin_cd); sqlstm.sqhstl[6] = (unsigned long )9; sqlstm.sqhsts[6] = ( int )0; sqlstm.sqindv[6] = ( short *)0; sqlstm.sqinds[6] = ( int )0; sqlstm.sqharm[6] = (unsigned long )0; sqlstm.sqadto[6] = (unsigned short )0; sqlstm.sqtdso[6] = (unsigned short )0; sqlstm.sqhstv[7] = (unsigned char *)&(trn_mei.hat_baisu); sqlstm.sqhstl[7] = (unsigned long )sizeof(int); sqlstm.sqhsts[7] = ( int )0; sqlstm.sqindv[7] = ( short *)0; sqlstm.sqinds[7] = ( int )0; sqlstm.sqharm[7] = (unsigned long )0; sqlstm.sqadto[7] = (unsigned short )0; sqlstm.sqtdso[7] = (unsigned short )0; sqlstm.sqhstv[8] = (unsigned char *)(trn_mei.pop_kbn); sqlstm.sqhstl[8] = (unsigned long )3; sqlstm.sqhsts[8] = ( int )0; sqlstm.sqindv[8] = ( short *)0; sqlstm.sqinds[8] = ( int )0; sqlstm.sqharm[8] = (unsigned long )0; sqlstm.sqadto[8] = (unsigned short )0; sqlstm.sqtdso[8] = (unsigned short )0; sqlstm.sqhstv[9] = (unsigned char *)(trn_mei.hat_type); sqlstm.sqhstl[9] = (unsigned long )3; sqlstm.sqhsts[9] = ( int )0; sqlstm.sqindv[9] = ( short *)0; sqlstm.sqinds[9] = ( int )0; sqlstm.sqharm[9] = (unsigned long )0; sqlstm.sqadto[9] = (unsigned short )0; sqlstm.sqtdso[9] = (unsigned short )0; sqlstm.sqhstv[10] = (unsigned char *)process_name; sqlstm.sqhstl[10] = (unsigned long )18; sqlstm.sqhsts[10] = ( int )0; sqlstm.sqindv[10] = ( short *)0; sqlstm.sqinds[10] = ( int )0; sqlstm.sqharm[10] = (unsigned long )0; sqlstm.sqadto[10] = (unsigned short )0; sqlstm.sqtdso[10] = (unsigned short )0; sqlstm.sqhstv[11] = (unsigned char *)process_name; sqlstm.sqhstl[11] = (unsigned long )18; sqlstm.sqhsts[11] = ( int )0; sqlstm.sqindv[11] = ( short *)0; sqlstm.sqinds[11] = ( int )0; sqlstm.sqharm[11] = (unsigned long )0; sqlstm.sqadto[11] = (unsigned short )0; sqlstm.sqtdso[11] = (unsigned short )0; sqlstm.sqphsv = sqlstm.sqhstv; sqlstm.sqphsl = sqlstm.sqhstl; sqlstm.sqphss = sqlstm.sqhsts; sqlstm.sqpind = sqlstm.sqindv; sqlstm.sqpins = sqlstm.sqinds; sqlstm.sqparm = sqlstm.sqharm; sqlstm.sqparc = sqlstm.sqharc; sqlstm.sqpadto = sqlstm.sqadto; sqlstm.sqptdso = sqlstm.sqtdso; sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); } if(sqlca.sqlcode < 0) { log_printf(LOG_ERROR, "Database insert BJ_T_ODR_TRN_MEI error%s%", sqlca.sqlerrm.sqlerrmc); /*** mod 2019/10/7 start ***/ /* EXEC SQL ROLLBACK WORK;*/ /* if (retry_count < MAX_SQL_RETRY) {*/ /* sleep(SQL_RETRY_TIMER);*/ /* retry_count++;*/ /* } else {*/ /* abort();*/ /* }*/ if (retry_count < MAX_INS_RETRY) { sleep(SQL_RETRY_TIMER); retry_count++; } else { return -1; } /*** mod 2019/10/7 end ***/ } else { sqldone = YES; } } return 0; } /****************************************************************************** 締め処理(締め処理用の値を設定する) 返り値 0 : OK ******************************************************************************/ int store_order_closing(char *trn_file_id) { _TRACE_(10, ("")); _TRACE_(10, ("trn_file_id [%s]", trn_file_id)); /* 発注キュー及び発注トランヘッダ用ホスト変数の初期化 */ memset(&trn_head, 0, sizeof(trn_head)); /* トランファイルIDのホスト変数への格納 */ strncpy(trn_head.trn_file_id, trn_file_id, LEN_TRN_FILE_ID); /* それ以外の値へのスペースの格納 */ memset(trn_head.hchiku_head, ' ', LEN_HCHIKU); memset(trn_head.tenban_head, ' ', LEN_TENBAN); memset(trn_head.rcv_date, ' ', LEN_RCV_DATE); memset(trn_head.rcv_time, ' ', LEN_RCV_TIME); return 0; } /****************************************************************************** プログラムIDを設定する ******************************************************************************/ void store_set_process_name(const char *name) { _TRACE_(10, ("name [%s]", name)); /* プログラムIDのホスト変数への格納 */ strncpy(process_name, name, LEN_PG_ID); } /****************************************************************************** データベース名を設定する ******************************************************************************/ void store_set_name(const char *db_name) { _TRACE_(0, ("db_name [%s]", db_name)); /* データベース名のホスト変数への格納 */ strncpy(dbname, db_name, DB_NAME_LEN); } /****************************************************************************** ユーザとパスワードを設定する ******************************************************************************/ void store_set_user(const char *db_user, const char *db_password) { _TRACE_(0, ("db_user [%s]", db_user)); _TRACE_(0, ("db_password [%s]", db_password)); /* ユーザのホスト変数への格納 */ strncpy(username, db_user, DB_USERNAME_LEN); /* パスワードのホスト変数への格納 */ strncpy(password, db_password, DB_PASSWORD_LEN); } oracle转postgre 这个文件怎么改
08-22
源码来自:https://pan.quark.cn/s/7a757c0c80ca 《在Neovim中运用Lua的详尽教程》在当代文本编辑器领域,Neovim凭借其卓越的性能、可扩展性以及高度可定制的特点,赢得了程序开发者的广泛青睐。 其中,Lua语言的融入更是为Neovim注入了强大的活力。 本指南将深入剖析如何在Neovim中高效地运用Lua进行配置和插件开发,助你充分发挥这一先进功能的潜力。 一、Lua为何成为Neovim的优选方案经典的Vim脚本语言(Vimscript)虽然功能完备,但其语法结构与现代化编程语言相比显得较为复杂。 与此形成对比的是,Lua是一种精简、轻量且性能卓越的脚本语言,具备易于掌握、易于成的特点。 因此,Neovim选择Lua作为其核心扩展语言,使得配置和插件开发过程变得更加直观和便捷。 二、安装与设置在Neovim中启用Lua支持通常十分简便,因为Lua是Neovim的固有组件。 然而,为了获得最佳体验,我们建议升级至Neovim的最新版本。 可以通过`vim-plug`或`dein.vim`等包管理工具来安装和管理Lua插件。 三、Lua基础在着手编写Neovim的Lua配置之前,需要对Lua语言的基础语法有所掌握。 Lua支持变量、函数、控制流、表(类似于数组和键值对映射)等核心概念。 它的语法设计简洁明了,便于理解和应用。 例如,定义一个变量并赋值:```lualocal myVariable = "Hello, Neovim!"```四、Lua在Neovim中的实际应用1. 配置文件:Neovim的初始化文件`.vimrc`能够完全采用Lua语言编写,只需在文件首部声明`set runtimepath^=~/.config/nvim ini...
基于STM32 F4的永磁同步电机无位置传感器控制策略研究内容概要:本文围绕基于STM32 F4的永磁同步电机(PMSM)无位置传感器控制策略展开研究,重点探讨在不使用机械式位置传感器的情况下,如何通过算法实现对电机转子位置和速度的精确估算与控制。文中结合STM32 F4高性能微控制器平台,采用如滑模观测器(SMO)、扩展卡尔曼滤波(EKF)或高频注入法等先进观测技术,实现对电机反电动势或磁链的实时估算,进而完成磁场定向控制(FOC)。研究涵盖了控制算法设计、系统建模、仿真验证(可能使用Simulink)以及在嵌入式平台上的代码实现与实验测试,旨在提高电机驱动系统的可靠性、降低成本并增强环境适应性。; 适合人群:具备一定电机控制理论基础和嵌入式开发经验的电气工程、自动化及相关专业的研究生、科研人员及从事电机驱动开发的工程师;熟悉C语言和MATLAB/Simulink工具者更佳。; 使用场景及目标:①为永磁同步电机驱动系统在高端制造、新能源汽车、家用电器等领域提供无位置传感器解决方案的设计参考;②指导开发者在STM32平台上实现高性能FOC控制算法,掌握位置观测器的设计与调试方法;③推动电机控制技术向低成本、高可靠方向发展。; 其他说明:该研究强调理论与实践结合,不仅包含算法仿真,还涉及实际硬件平台的部署与测试,建议读者在学习过程中配合使用STM32开发板和PMSM电机进行实操验证,以深入理解控制策略的动态响应与鲁棒性问题。
先看效果: https://pan.quark.cn/s/21391ce66e01 企业级办公自动化系统,一般被称为OA(Office Automation)系统,是企业数字化进程中的关键构成部分,旨在增强组织内部的工作效能与协同水平。 本资源提供的企业级办公自动化系统包含了详尽的C#源代码,涉及多个技术领域,对于软件开发者而言是一份极具价值的参考资料。 接下来将具体介绍OA系统的核心特性、关键技术以及在实践操作中可能涉及的技术要点。 1. **系统构造** - **三层构造**:大型OA系统普遍采用典型的三层构造,包含表现层、业务逻辑层和数据访问层。 这种构造能够有效分离用户交互界面、业务处理过程和数据存储功能,从而提升系统的可维护性与可扩展性。 2. **C#编程语言** - **C#核心**:作为开发语言,C#具备丰富的类库和语法功能,支持面向对象编程,适用于开发复杂的企业级应用。 - **.NET Framework**:C#在.NET Framework环境中运行,该框架提供了大量的类库与服务,例如ASP.NET用于Web开发,Windows Forms用于桌面应用。 3. **控件应用** - **WinForms**或**WPF**:在客户端,可能会使用WinForms或WPF来设计用户界面,这两者提供了丰富的控件和可视化设计工具。 - **ASP.NET Web Forms/MVC**:对于Web应用,可能会使用ASP.NET的Web Forms或MVC模式来构建交互式页面。 4. **数据库操作** - **SQL Server**:大型OA系统通常采用关系型数据库管理系统,如SQL Server,用于存储和处理大量数据。 - **ORM框架**:如Ent...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值