2016年7月6日星期三

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) )

没有评论:

发表评论