find コマンド
とは、指定した文字列をファイルの中から行単位で検索するためのコマンドであり、
その書式は、
------------------------------------------------------------
| find [/v][/c][/n][/i] "検索文字列" ファイル名... |
-------------------------------------------------------------
となっています。
各オプションは
/v 指定した文字列を含まない行を出力する。/抽取不含指定字符的行
/c 指定した文字列を含む行の数を出力する。/显示包含指定文字的行的个数
/n 出力する行の前に行番号を付ける。/在显示的行前面加上行号
/i 大文字と小文字を区別しないで検索を行う。/检索时不区分大小写
注意:検索文字は必ずダブルクォート記号で囲む必要がある。
なお、findは行単位で検索を行うコマンドあり、2行以上にまたがるような文字列の検索は行えない。
以下の例文見て見ましょう。
ファイル「findTest.txt」
ファイル内容:
===========================
I can use find!
The [find] is so usefully!
Yes! I am so intelligent!
FIND
===========================
2016年7月22日星期五
2016年7月21日星期四
mdlState_setFunction STATE のメモ
mdLsateとはどういう意味でしょうか?
実はイベントです。この状態でどんな処理をします。
JAVAの開発したことがある読者は前端な画面上のイベントと同じ感じる。
JSP画面のスクリプトみたいですね。
MicroStation V8iで:
eventTypeとしては以下の種類になります。「一部」
STATE_DATAPOINT,⇒一般的に左クリックする時
STATE_RESET, ⇒一般的に右クリックする時
STATE_KEYIN, ⇒入力する時
STATE_COMMAND_CLEANUP, ⇒A機能からB機能に変更する時、A機能の情報を削除する必要
STATE_COMPLEX_DYNAMICS,⇒図面作成する中 仮要素から正式要素にある間「ずっと呼び出せます。」
STATE_OOPSFUNCTION
STATE_DRAG_INITS
MdlFunctionP mdlState_setFunction
(
int eventType ,
MdlFunctionP stateFunc ⇒function to call when event happens.
);
mdlState_setFunction(STATE_DATAPOINT, createLabel);
mdlState_setFunction(STATE_RESET, resetLabel);
mdlState_setFunction(STATE_COMPLEX_DYNAMICS,genelatealabel);
沢山なstateがあるが、今まで、以上の有限な物をしています。
実はイベントです。この状態でどんな処理をします。
JAVAの開発したことがある読者は前端な画面上のイベントと同じ感じる。
JSP画面のスクリプトみたいですね。
MicroStation V8iで:
eventTypeとしては以下の種類になります。「一部」
STATE_DATAPOINT,⇒一般的に左クリックする時
STATE_RESET, ⇒一般的に右クリックする時
STATE_KEYIN, ⇒入力する時
STATE_COMMAND_CLEANUP, ⇒A機能からB機能に変更する時、A機能の情報を削除する必要
STATE_COMPLEX_DYNAMICS,⇒図面作成する中 仮要素から正式要素にある間「ずっと呼び出せます。」
STATE_OOPSFUNCTION
STATE_DRAG_INITS
MdlFunctionP mdlState_setFunction
(
int eventType ,
MdlFunctionP stateFunc ⇒function to call when event happens.
);
mdlState_setFunction(STATE_DATAPOINT, createLabel);
mdlState_setFunction(STATE_RESET, resetLabel);
mdlState_setFunction(STATE_COMPLEX_DYNAMICS,genelatealabel);
沢山なstateがあるが、今まで、以上の有限な物をしています。
2016年7月14日星期四
MSElementDescr Symbology 相关GET SET
20160714 メモ:
void mdlElmdscr_setSymbology
(
MSElementDescr* edP ,
UInt32* color ,
Int32* style ,
UInt32* weight ,
UInt32* fillColor
);
Changes the color, weight, and style in the element desciptor pointed to by edP to the values pointed to by color, weight and style. If parameters other than el are NULL, MicroStation does not change the value in element.
この関数でMSElementDescrの色、線種、線幅を変更できます。
引数については、edP以外のはNULLに設定できる。
例:
mdlElmdscr_setSymbology(ww, &color, &style, &weight, NULL);
以下の関数で画層を設定することができます。
mdlElmdscr_setProperties(ww, &level, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
BYLEVEL:
if(_ColorMode == 0) color = COLOR_BYLEVEL;
else color = (UInt32)_Color;
if(_WeightMode == 0) weight = WEIGHT_BYLEVEL;
else weight = (UInt32)_Weight;
if(_StyleMode == 0) style = STYLE_BYLEVEL;
else style = _Style;
mdlElmdscr_setSymbology(ww, &color, &style, &weight, NULL);
もし、COLOR_BYLEVELを利用している場合、色は選択している部品と同じです。
以下の二つ関数はMSElementDescrから持っているシンボロジー・画層を取得する。
mdlElement_getSymbology (&Color,&Weight,&Style,&s->el);
mdlElement_getProperties(&Level,NULL,NULL,NULL,NULL,NULL,NULL,NULL,&s->el);
void mdlElmdscr_setSymbology
(
MSElementDescr* edP ,
UInt32* color ,
Int32* style ,
UInt32* weight ,
UInt32* fillColor
);
Changes the color, weight, and style in the element desciptor pointed to by edP to the values pointed to by color, weight and style. If parameters other than el are NULL, MicroStation does not change the value in element.
この関数でMSElementDescrの色、線種、線幅を変更できます。
引数については、edP以外のはNULLに設定できる。
例:
mdlElmdscr_setSymbology(ww, &color, &style, &weight, NULL);
以下の関数で画層を設定することができます。
mdlElmdscr_setProperties(ww, &level, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
BYLEVEL:
if(_ColorMode == 0) color = COLOR_BYLEVEL;
else color = (UInt32)_Color;
if(_WeightMode == 0) weight = WEIGHT_BYLEVEL;
else weight = (UInt32)_Weight;
if(_StyleMode == 0) style = STYLE_BYLEVEL;
else style = _Style;
mdlElmdscr_setSymbology(ww, &color, &style, &weight, NULL);
もし、COLOR_BYLEVELを利用している場合、色は選択している部品と同じです。
以下の二つ関数はMSElementDescrから持っているシンボロジー・画層を取得する。
mdlElement_getSymbology (&Color,&Weight,&Style,&s->el);
mdlElement_getProperties(&Level,NULL,NULL,NULL,NULL,NULL,NULL,NULL,&s->el);
2016年7月11日星期一
MDL 对话框的常用操作函数
//========================================================
※グーロバルー変数
static DialogBox *_dialogBox=NULL;
今は開いているダイアログを取得すること、
■_dialogBox = mdlDialog_getToolSettings();// 现在的对话框取得
以上のツールセッティングでダイアログを取得することができる。
もし、取得した_dialogBoxはNULLではない場合、以下のメソッドで具体的内容を
取得できます。
------------------------------------------------------------------------
■すべて項目の設定
・Forces the appearance of all items in the Dialog Box specified
by dbP to match their external state.
・通強制規定的DBP,以配合其外部的状態在会話框中的所有項目的外観。
・一般的に以下の場面でよく使います。
○HOOK関数の DITEM_MESSAGE_STATECHANGED
case DITEM_MESSAGE_STATECHANGED:
mdlDialog_itemsSynch(d->db);
○再読み込む
BoolInt mdlDialog_itemsSynch
(
DialogBox* dbP
);
这个包括所有项目。
------------------------------------------------------------------------
■項目によって
例文:
itemP = mdlDialog_itemGetByTypeAndId(d->db, RTYPE_ToggleButton, TOGGLEID_INSERTSYMBOL_OFSSET_X, 0);
if(NULL != itemP)
{
mdlDialog_itemSynch(d->db, itemP->itemIndex);
}
BoolInt mdlDialog_itemSynch
(
DialogBox* dbP ,
int iItem
);
这个单个项目
------------------------------------------------------------------------
■ 定義ファイルでの項目タイプと項目のIDによって、
・Causes a DITEM_MESSAGE_SYNCHRONIZE message to be sent to the dialog
item indicated by itemType and itemId in the Dialog Box indicated by dbP.
例文:
memset(&spnBoxValue, 0, sizeof(ValueUnion));
spnBoxValue.doubleFormat = _HatchSpan;
if( diP = mdlDialog_itemGetByTypeAndId(_dialogBox, RTYPE_SpinBox, SPINBOXID_HatchSpan, 0) )
{
printf(pBuf, "%.1f %s", _HatchSpan, "mm");
mdlDialog_itemSetValue(NULL, doubleType, &spnBoxValue, pBuf, _dialogBox, diP->itemIndex);
mdlDialog_itemSynch(_dialogBox, diP->itemIndex );
}
BoolInt mdlDialog_itemSynchByTypeAndId
(
DialogBox* dbP ,
UInt32 itemType ,
int itemId
);
这个也是单个项目
------------------------------------------------------------------------
■mdlDialog_というMDL関数はダイアログの操作関数ですね。
mdlDialog_item** 項目と関連する関数
set、getもたくさんあります。
MicroStation V8 MDL Function Referenceを参照してください。
まずはダイアログの構成を理解して、自分のダイアログは何の項目を含めているかを
取得して、それに対して、どんなMDL関数を使うかを考えます。
※グーロバルー変数
static DialogBox *_dialogBox=NULL;
今は開いているダイアログを取得すること、
■_dialogBox = mdlDialog_getToolSettings();// 现在的对话框取得
以上のツールセッティングでダイアログを取得することができる。
もし、取得した_dialogBoxはNULLではない場合、以下のメソッドで具体的内容を
取得できます。
------------------------------------------------------------------------
■すべて項目の設定
・Forces the appearance of all items in the Dialog Box specified
by dbP to match their external state.
・通強制規定的DBP,以配合其外部的状態在会話框中的所有項目的外観。
・一般的に以下の場面でよく使います。
○HOOK関数の DITEM_MESSAGE_STATECHANGED
case DITEM_MESSAGE_STATECHANGED:
mdlDialog_itemsSynch(d->db);
○再読み込む
BoolInt mdlDialog_itemsSynch
(
DialogBox* dbP
);
这个包括所有项目。
------------------------------------------------------------------------
■項目によって
例文:
itemP = mdlDialog_itemGetByTypeAndId(d->db, RTYPE_ToggleButton, TOGGLEID_INSERTSYMBOL_OFSSET_X, 0);
if(NULL != itemP)
{
mdlDialog_itemSynch(d->db, itemP->itemIndex);
}
BoolInt mdlDialog_itemSynch
(
DialogBox* dbP ,
int iItem
);
这个单个项目
------------------------------------------------------------------------
■ 定義ファイルでの項目タイプと項目のIDによって、
・Causes a DITEM_MESSAGE_SYNCHRONIZE message to be sent to the dialog
item indicated by itemType and itemId in the Dialog Box indicated by dbP.
例文:
memset(&spnBoxValue, 0, sizeof(ValueUnion));
spnBoxValue.doubleFormat = _HatchSpan;
if( diP = mdlDialog_itemGetByTypeAndId(_dialogBox, RTYPE_SpinBox, SPINBOXID_HatchSpan, 0) )
{
printf(pBuf, "%.1f %s", _HatchSpan, "mm");
mdlDialog_itemSetValue(NULL, doubleType, &spnBoxValue, pBuf, _dialogBox, diP->itemIndex);
mdlDialog_itemSynch(_dialogBox, diP->itemIndex );
}
BoolInt mdlDialog_itemSynchByTypeAndId
(
DialogBox* dbP ,
UInt32 itemType ,
int itemId
);
这个也是单个项目
------------------------------------------------------------------------
■mdlDialog_というMDL関数はダイアログの操作関数ですね。
mdlDialog_item** 項目と関連する関数
set、getもたくさんあります。
MicroStation V8 MDL Function Referenceを参照してください。
まずはダイアログの構成を理解して、自分のダイアログは何の項目を含めているかを
取得して、それに対して、どんなMDL関数を使うかを考えます。
2016年7月8日星期五
20160708共通メソッドで値が戻ってこない
20160708
新規したの関数で値が戻ってこないので、調べたところ、
内部では正しく値が取得できていましたが、
引数に戻す値がセットできないかたちのようなので、
下記のように変更したところ値が返ってくる世になりました。
メソッドは省略に記載しています。
※※修正前※※--------------------------------------
Public Boolint Getinfomation
(
char *size,
char *material
)
{
size = GetIniFile(inifile, key1);
material = GetIniFile(inifile, key2);
return TRUE;
}
※※修正前※※--------------------------------------
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
※※修正後※※--------------------------------------
Public Boolint Getinfomation
(
char *p_size,
char *p_material
)
{
char *size, *material;
size = GetIniFile(inifile, key1);
material = GetIniFile(inifile, key2);
// 引数のcharポインターにメモリの内容をコピー
if (size && p_size) strcpy(p_size, size);
if (material && p_material) strcpy(p_material, material);
return TRUE;
}
※※修正後※※--------------------------------------
以上の問題に対して、よく分かてなくています。
C言語を学んでいくと、納得できていけるかもしれません。
C言語でのね渡しとポインタ渡しと参照渡しについては
まだまだですね。
もし、理解できれば、また本文章を更新します。
私も楽しみます。
勉強しかないなあ!!!
たぶん、 GetIniFile(inifile, key1);でアドレスを変更してしまった。
安全性のために、引数のアドレスはそのまま保留して、
取得された値でけを引数のメモリにコピーします。
strcpyは値のみをコピーします。
新規したの関数で値が戻ってこないので、調べたところ、
内部では正しく値が取得できていましたが、
引数に戻す値がセットできないかたちのようなので、
下記のように変更したところ値が返ってくる世になりました。
メソッドは省略に記載しています。
※※修正前※※--------------------------------------
Public Boolint Getinfomation
(
char *size,
char *material
)
{
size = GetIniFile(inifile, key1);
material = GetIniFile(inifile, key2);
return TRUE;
}
※※修正前※※--------------------------------------
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
※※修正後※※--------------------------------------
Public Boolint Getinfomation
(
char *p_size,
char *p_material
)
{
char *size, *material;
size = GetIniFile(inifile, key1);
material = GetIniFile(inifile, key2);
// 引数のcharポインターにメモリの内容をコピー
if (size && p_size) strcpy(p_size, size);
if (material && p_material) strcpy(p_material, material);
return TRUE;
}
※※修正後※※--------------------------------------
以上の問題に対して、よく分かてなくています。
C言語を学んでいくと、納得できていけるかもしれません。
C言語でのね渡しとポインタ渡しと参照渡しについては
まだまだですね。
もし、理解できれば、また本文章を更新します。
私も楽しみます。
勉強しかないなあ!!!
たぶん、 GetIniFile(inifile, key1);でアドレスを変更してしまった。
安全性のために、引数のアドレスはそのまま保留して、
取得された値でけを引数のメモリにコピーします。
strcpyは値のみをコピーします。
2016年7月6日星期三
20160707
今回の改修については
いろいろの方法を考えていました。
日本のソフトウェアにとって、安全性は第一ですので、
既存な方法を選んだほうがいいですね。
★「しかし、プログラマの私たちは、自分できちんと考えよう!
絶対に自分の頭に読み込でください。」
以下の点を注意しなきゃ!
①グローバル「Global」変数を利用する時、変数はNULLかどうか、
どんなタイミング変更できるか、ちゃんと注意してください。
②グローバル変数を利用してから、ほかのところの影響がないように、
クリアしたほうがいいと思います。
でも、全部とは限らないです。実現方法と現実状況によって、
判断して、どんな風にしますか。。。。
③業務上で、以下の内容をわかりました。
物件設定機能は別のチームの機能ですので、
連携しなければならないです。
連携の方法もいろいろあります。
一番簡単な方法は以下のとおりです。
SettingsIsom.ini⇒
;==============================================================================
;部材の設定で「OK」または「適用」が押されたら、キー入力するコマンド(Secionキーとの組み合わせ)
;物件設定との同期対応 add by LiuBin in 2017.07.07
;==============================================================================
[ISOMDRAFTFLH_OK]⇒部件設定で
ISOMDRAFTFLH SETTINGS⇒呼び出す元のCMDです。
呼び出す元側:
// 部件設定との同期対応 add by LiuBin in 2016.07.06
Private void cmdReadSettingOK(void)
===============================================================================
cmdNumber CMD_ISOMDRAFTFLH_SETTINGS
{
if(DBG0) printf("cmdReadSettingOK()...Start\n");
read_IsomDraft_INI();
// 関連文字を生成
if (g_loc_edp) place_generateElement(g_loc_edp, &g_loc_pt, g_loc_view, XORDRAW, g_xrot);
if(DBG0) printf("cmdReadSettingOK()...End\n");
}
mdlInput_sendKeyin(QSTR_015, 0, 0, NULL);
★QSTR_015:
#define QSTR_015 "mdl silentload SettingsIsom; SettingsIsom open; SettingsIsom Tree 関連文字; SettingsIsom Section=IsomDraftFLH"
やっばり、ファイルで連携すれば、よく使い方法ですね。
iniファイルやXMLファイルなど。。。。。
いろいろの方法を考えていました。
日本のソフトウェアにとって、安全性は第一ですので、
既存な方法を選んだほうがいいですね。
★「しかし、プログラマの私たちは、自分できちんと考えよう!
絶対に自分の頭に読み込でください。」
以下の点を注意しなきゃ!
①グローバル「Global」変数を利用する時、変数はNULLかどうか、
どんなタイミング変更できるか、ちゃんと注意してください。
②グローバル変数を利用してから、ほかのところの影響がないように、
クリアしたほうがいいと思います。
でも、全部とは限らないです。実現方法と現実状況によって、
判断して、どんな風にしますか。。。。
③業務上で、以下の内容をわかりました。
物件設定機能は別のチームの機能ですので、
連携しなければならないです。
連携の方法もいろいろあります。
一番簡単な方法は以下のとおりです。
SettingsIsom.ini⇒
;==============================================================================
;部材の設定で「OK」または「適用」が押されたら、キー入力するコマンド(Secionキーとの組み合わせ)
;物件設定との同期対応 add by LiuBin in 2017.07.07
;==============================================================================
[ISOMDRAFTFLH_OK]⇒部件設定で
ISOMDRAFTFLH SETTINGS⇒呼び出す元のCMDです。
呼び出す元側:
// 部件設定との同期対応 add by LiuBin in 2016.07.06
Private void cmdReadSettingOK(void)
===============================================================================
cmdNumber CMD_ISOMDRAFTFLH_SETTINGS
{
if(DBG0) printf("cmdReadSettingOK()...Start\n");
read_IsomDraft_INI();
// 関連文字を生成
if (g_loc_edp) place_generateElement(g_loc_edp, &g_loc_pt, g_loc_view, XORDRAW, g_xrot);
if(DBG0) printf("cmdReadSettingOK()...End\n");
}
mdlInput_sendKeyin(QSTR_015, 0, 0, NULL);
★QSTR_015:
#define QSTR_015 "mdl silentload SettingsIsom; SettingsIsom open; SettingsIsom Tree 関連文字; SettingsIsom Section=IsomDraftFLH"
やっばり、ファイルで連携すれば、よく使い方法ですね。
iniファイルやXMLファイルなど。。。。。
20160705
①=====================================
C言語で
char *s;
char s[256];
以上のSの区別が何ですか?
答え:
簡単な説明:http://qiita.com/jonichonpa/items/b38b760162a1f778b612
深い説明:http://www9.plala.or.jp/sgwr-t/c/sec10-2.html
②=====================================
今回開発の機能範囲:Isomの共通です。⇒Libです。
業務で問題ないですが、
C言語のメソッドの使い方とC言語のコーディング上の注意点がよくわかりませんでしたので、
たくさん疑問点が出ていたん。
問題点をまとめて、以下にメモしています。
------------------------------------------------------------------------------------------------------------------------
★第一:
------------------------------------------------------------------------------------------------------------------------
変数を使う時、不明なデータを書き込まないように、初期化したほうがいいです。
以下の関数を利用してください。
#include
void * memset( void *str , int chr , size_t len );
■戻り値:strの先頭アドレスを返す。
■説明:
strの先頭から文字chrをlen数分、コピーしてstrの先頭アドレスを返す。
一般的にstrをchrで埋める場合に使用する。
コピー後、末尾にNULLを自動的に設定しない。
■例文:
#include
main() {
char str[] = "ABCDE";
char * adr;
printf( "str=%s\n" , str );/* ABCEF */
memset(( void * )str , ( int )'\0'
, sizeof( str ));
/* strでprintfする */
printf( "str[0]=%c\n" , str[0] );/* NULL */
printf( "str[1]=%c\n" , str[1] );/* NULL */
printf( "str[2]=%c\n" , str[2] );/* NULL */
printf( "str[3]=%c\n" , str[3] );/* NULL */
printf( "str[4]=%c\n\n" , str[4] );/* NULL */
adr = ( char * )memset(( void * )str , ( int )'a'
, sizeof( str ));
/* strでprintfする */
printf( "str[0]=%c\n" , str[0] );/* a */
printf( "str[1]=%c\n" , str[1] );/* a */
printf( "str[2]=%c\n" , str[2] );/* a */
printf( "str[3]=%c\n" , str[3] );/* a */
printf( "str[4]=%c\n\n" , str[4] );/* a */
/* adrでprintfする */
printf( "adr[0]=%c\n" , adr[0] );/* a */
printf( "adr[1]=%c\n" , adr[1] );/* a */
printf( "adr[2]=%c\n" , adr[2] );/* a */
printf( "adr[3]=%c\n" , adr[3] );/* a */
printf( "adr[4]=%c\n" , adr[4] );/* a */
}
■自分の開発ソース:
char underSize[256], borderSize[256], intSize[256];
memset( intSize, 0, sizeof( intSize ));
memset( underSize, 0, sizeof( underSize ));
memset( borderSize, 0, sizeof( borderSize ));
------------------------------------------------------------------------------------------------------------------------
★第二:
------------------------------------------------------------------------------------------------------------------------
char underSize[256], borderSize[256], intSize[256];
sprintf( keyunder, "STRAIGHT_UNDER_SIZE%d", i );
strncpy( intSize, size, strlen(size) - 1 );
以上のメソッドの第一引数は「keyunder」
char keyunder[256]⇒○です。
char *keyunder⇒×です。
配列とポインタの区別を参照してください。
------------------------------------------------------------------------------------------------------------------------
★第三:
------------------------------------------------------------------------------------------------------------------------
strlen
sizeof
区別について:
※※文字列長と配列サイズの使い分け※※
【strlenの形式】
strlen(char *s) ⇒文字列sの長さを調べて返す。
⇒文字列の終端'\0'は長さに含まれない。
⇒漢字などの全角文字の場合、ひと文字で2と数えられる。
例文:
char s1 = "test";
char s2 = "テスト";
文字列長と配列サイズを調べるには:
printf( "%d\n", strlen( s1 ) );
printf( "%d\n", strlen( s2 ) );
printf( "%d\n", sizeof s1 );
printf( "%d\n", sizeof s2 );
実行すると、strlenの結果はs1が4、s2が6、sizeofはs1が5、s2が7となります。
【sizeofの形式】
C言語には、配列要素の数を調べる機能の標準関数はありません。
配列に要素を入れるときに自分で数を数えておいて、その後はそれを使うケースが多いと思いますが、
要素数を知る必要があるときは、サイズを調べる sizeof演算子を使って求めることができます。
配列の「サイズ」と「要素数」は違うので、まずそこを混同しないようにしましょう。
【 sizeof演算子の形式 】
sizeof (型名) 指定した型名のバイトサイズを求める(サイズは環境に依存します)
sizeof 変数名 指定した変数のバイトサイズを求める。変数では()を省ける。
下のような配列があるとすると
int score[] = { 88, 80, 92, 67, 78 };
ouble weight[] = { 56.7, 78.3, 60.2 };
配列の要素数は、「配列のサイズ / ひとつの要素のサイズ」の式で求めることができます。
printf( "scoreの要素数 %d\n", sizeof score/sizeof(int) );
printf( "weightの要素数 %d\n", sizeof weight/sizeof(double) );
scoreの要素数は 5、weightの要素数は 3 と分かります。 下のように、define することもできます。
#define NSCORE ((sizeof score)/(sizeof(int)))
#define NWEIGHT ((sizeof weight)/(sizeof weight[0]))
2つめの define のように、「ひとつの要素のサイズ」は「配列の先頭要素のサイズ」と書くことができます。
------------------------------------------------------------------------------------------------------------------------
★流用できるソース
------------------------------------------------------------------------------------------------------------------------
Public BoolInt startsWith
(
char *pre,
char *str
)
{
size_t lenpre = strlen(pre),
lenstr = strlen(str);
return lenstr < lenpre ? FALSE : strncmp(pre, str, lenpre) == 0;
}
=====================================================================*/
★業務に流用できるソース:
=====================================================================*/
******************INIファイルパスを取得する方法***************:
優先順位は以下のようになります。
「ポインタ:sprintfとstrcpy」
■mdlSystem_expandCfgVar
環境変数を取得できます。
TM_EXEの値は、セッションを起動する度に変わります。
Public char *IniFileCheck
(
char *fileName,
int tmdirFlg
)
{
char s1[MAXFILELENGTH];
char s2[MAXFILELENGTH];
char s3[MAXFILELENGTH];
char iniFile[MAXFILELENGTH];
//'1.今だけ適用 [$(TEMP)\Projects\$(TM_EXE)\$(TM_PROJECTNAME)\]
strcpy( s1, mdlSystem_expandCfgVar("$(TEMP)") );
strcpy( s2, mdlSystem_expandCfgVar("$(TM_EXE)") );
strcpy( s3, mdlSystem_expandCfgVar("$(TM_PROJECTNAME)") );
sprintf( iniFile, "%s\\Projects\\%s\\%s\\%s", s1, s2, s3, fileName );
//'2.設定コマンド実行後は[ProjectFolder]から読む
//'$(TM_PROJECT)\\****.ini
if ( mdlFile_find(s2, iniFile, NULL, NULL) != SUCCESS )
{
strcpy( s3, mdlSystem_expandCfgVar("$(TM_PROJECT)") );
sprintf( iniFile, "%s%s", s3, fileName );
}
//'3.設定コマンド実行前は[MasterFolder]から読む
if ( mdlFile_find(s2, iniFile, NULL, NULL) != SUCCESS )
{
if ( tmdirFlg )
{
//'$(TM_DIR)\\param\\config\****.ini
strcpy( s3,mdlSystem_expandCfgVar("$(TM_DIR)") );
sprintf( iniFile, "%s\\param\\config\\%s", s3, fileName );
}else
{
//'$(TM_APP)\\****.ini
strcpy( s3, mdlSystem_expandCfgVar("$(TM_APP)") );
sprintf( iniFile, "%s\\%s", s3, fileName );
}
}
if ( mdlFile_find(s2, iniFile, NULL, NULL) == SUCCESS )
{
DEBUGPRINTF("[%s]のPath is = {%s}\n", fileName,iniFile);
return iniFile;
}
return NULL;
}
******************INI内容を取得する方法***************:
GetIniFile
GetIniFileAll
GetIniFileValue
以上の方法検索して使って見ましょう。
******************StringListの使い方法***************:
StringList *m = NULL;
m = GetIniFileAll();
以下の方法で取得できる。
listNumber = mdlStringList_size( m );⇒リストサイズを取得できる。
以下のよにLOOPする。値を取得できる。iは0からです。
if ( SUCCESS == mdlStringList_getMember(&mBox, NULL, m, i) )
C言語で
char *s;
char s[256];
以上のSの区別が何ですか?
答え:
簡単な説明:http://qiita.com/jonichonpa/items/b38b760162a1f778b612
深い説明:http://www9.plala.or.jp/sgwr-t/c/sec10-2.html
②=====================================
今回開発の機能範囲:Isomの共通です。⇒Libです。
業務で問題ないですが、
C言語のメソッドの使い方とC言語のコーディング上の注意点がよくわかりませんでしたので、
たくさん疑問点が出ていたん。
問題点をまとめて、以下にメモしています。
------------------------------------------------------------------------------------------------------------------------
★第一:
------------------------------------------------------------------------------------------------------------------------
変数を使う時、不明なデータを書き込まないように、初期化したほうがいいです。
以下の関数を利用してください。
#include
void * memset( void *str , int chr , size_t len );
■戻り値:strの先頭アドレスを返す。
■説明:
strの先頭から文字chrをlen数分、コピーしてstrの先頭アドレスを返す。
一般的にstrをchrで埋める場合に使用する。
コピー後、末尾にNULLを自動的に設定しない。
■例文:
#include
main() {
char str[] = "ABCDE";
char * adr;
printf( "str=%s\n" , str );/* ABCEF */
memset(( void * )str , ( int )'\0'
, sizeof( str ));
/* strでprintfする */
printf( "str[0]=%c\n" , str[0] );/* NULL */
printf( "str[1]=%c\n" , str[1] );/* NULL */
printf( "str[2]=%c\n" , str[2] );/* NULL */
printf( "str[3]=%c\n" , str[3] );/* NULL */
printf( "str[4]=%c\n\n" , str[4] );/* NULL */
adr = ( char * )memset(( void * )str , ( int )'a'
, sizeof( str ));
/* strでprintfする */
printf( "str[0]=%c\n" , str[0] );/* a */
printf( "str[1]=%c\n" , str[1] );/* a */
printf( "str[2]=%c\n" , str[2] );/* a */
printf( "str[3]=%c\n" , str[3] );/* a */
printf( "str[4]=%c\n\n" , str[4] );/* a */
/* adrでprintfする */
printf( "adr[0]=%c\n" , adr[0] );/* a */
printf( "adr[1]=%c\n" , adr[1] );/* a */
printf( "adr[2]=%c\n" , adr[2] );/* a */
printf( "adr[3]=%c\n" , adr[3] );/* a */
printf( "adr[4]=%c\n" , adr[4] );/* a */
}
■自分の開発ソース:
char underSize[256], borderSize[256], intSize[256];
memset( intSize, 0, sizeof( intSize ));
memset( underSize, 0, sizeof( underSize ));
memset( borderSize, 0, sizeof( borderSize ));
------------------------------------------------------------------------------------------------------------------------
★第二:
------------------------------------------------------------------------------------------------------------------------
char underSize[256], borderSize[256], intSize[256];
sprintf( keyunder, "STRAIGHT_UNDER_SIZE%d", i );
strncpy( intSize, size, strlen(size) - 1 );
以上のメソッドの第一引数は「keyunder」
char keyunder[256]⇒○です。
char *keyunder⇒×です。
配列とポインタの区別を参照してください。
------------------------------------------------------------------------------------------------------------------------
★第三:
------------------------------------------------------------------------------------------------------------------------
strlen
sizeof
区別について:
※※文字列長と配列サイズの使い分け※※
【strlenの形式】
strlen(char *s) ⇒文字列sの長さを調べて返す。
⇒文字列の終端'\0'は長さに含まれない。
⇒漢字などの全角文字の場合、ひと文字で2と数えられる。
例文:
char s1 = "test";
char s2 = "テスト";
文字列長と配列サイズを調べるには:
printf( "%d\n", strlen( s1 ) );
printf( "%d\n", strlen( s2 ) );
printf( "%d\n", sizeof s1 );
printf( "%d\n", sizeof s2 );
実行すると、strlenの結果はs1が4、s2が6、sizeofはs1が5、s2が7となります。
【sizeofの形式】
C言語には、配列要素の数を調べる機能の標準関数はありません。
配列に要素を入れるときに自分で数を数えておいて、その後はそれを使うケースが多いと思いますが、
要素数を知る必要があるときは、サイズを調べる sizeof演算子を使って求めることができます。
配列の「サイズ」と「要素数」は違うので、まずそこを混同しないようにしましょう。
【 sizeof演算子の形式 】
sizeof (型名) 指定した型名のバイトサイズを求める(サイズは環境に依存します)
sizeof 変数名 指定した変数のバイトサイズを求める。変数では()を省ける。
下のような配列があるとすると
int score[] = { 88, 80, 92, 67, 78 };
ouble weight[] = { 56.7, 78.3, 60.2 };
配列の要素数は、「配列のサイズ / ひとつの要素のサイズ」の式で求めることができます。
printf( "scoreの要素数 %d\n", sizeof score/sizeof(int) );
printf( "weightの要素数 %d\n", sizeof weight/sizeof(double) );
scoreの要素数は 5、weightの要素数は 3 と分かります。 下のように、define することもできます。
#define NSCORE ((sizeof score)/(sizeof(int)))
#define NWEIGHT ((sizeof weight)/(sizeof weight[0]))
2つめの define のように、「ひとつの要素のサイズ」は「配列の先頭要素のサイズ」と書くことができます。
------------------------------------------------------------------------------------------------------------------------
★流用できるソース
------------------------------------------------------------------------------------------------------------------------
Public BoolInt startsWith
(
char *pre,
char *str
)
{
size_t lenpre = strlen(pre),
lenstr = strlen(str);
return lenstr < lenpre ? FALSE : strncmp(pre, str, lenpre) == 0;
}
=====================================================================*/
★業務に流用できるソース:
=====================================================================*/
******************INIファイルパスを取得する方法***************:
優先順位は以下のようになります。
「ポインタ:sprintfとstrcpy」
■mdlSystem_expandCfgVar
環境変数を取得できます。
TM_EXEの値は、セッションを起動する度に変わります。
Public char *IniFileCheck
(
char *fileName,
int tmdirFlg
)
{
char s1[MAXFILELENGTH];
char s2[MAXFILELENGTH];
char s3[MAXFILELENGTH];
char iniFile[MAXFILELENGTH];
//'1.今だけ適用 [$(TEMP)\Projects\$(TM_EXE)\$(TM_PROJECTNAME)\]
strcpy( s1, mdlSystem_expandCfgVar("$(TEMP)") );
strcpy( s2, mdlSystem_expandCfgVar("$(TM_EXE)") );
strcpy( s3, mdlSystem_expandCfgVar("$(TM_PROJECTNAME)") );
sprintf( iniFile, "%s\\Projects\\%s\\%s\\%s", s1, s2, s3, fileName );
//'2.設定コマンド実行後は[ProjectFolder]から読む
//'$(TM_PROJECT)\\****.ini
if ( mdlFile_find(s2, iniFile, NULL, NULL) != SUCCESS )
{
strcpy( s3, mdlSystem_expandCfgVar("$(TM_PROJECT)") );
sprintf( iniFile, "%s%s", s3, fileName );
}
//'3.設定コマンド実行前は[MasterFolder]から読む
if ( mdlFile_find(s2, iniFile, NULL, NULL) != SUCCESS )
{
if ( tmdirFlg )
{
//'$(TM_DIR)\\param\\config\****.ini
strcpy( s3,mdlSystem_expandCfgVar("$(TM_DIR)") );
sprintf( iniFile, "%s\\param\\config\\%s", s3, fileName );
}else
{
//'$(TM_APP)\\****.ini
strcpy( s3, mdlSystem_expandCfgVar("$(TM_APP)") );
sprintf( iniFile, "%s\\%s", s3, fileName );
}
}
if ( mdlFile_find(s2, iniFile, NULL, NULL) == SUCCESS )
{
DEBUGPRINTF("[%s]のPath is = {%s}\n", fileName,iniFile);
return iniFile;
}
return NULL;
}
******************INI内容を取得する方法***************:
GetIniFile
GetIniFileAll
GetIniFileValue
以上の方法検索して使って見ましょう。
******************StringListの使い方法***************:
StringList *m = NULL;
m = GetIniFileAll();
以下の方法で取得できる。
listNumber = mdlStringList_size( m );⇒リストサイズを取得できる。
以下のよにLOOPする。値を取得できる。iは0からです。
if ( SUCCESS == mdlStringList_getMember(&mBox, NULL, m, i) )
订阅:
博文 (Atom)