#author("2025-05-26T21:01:21+09:00","default:okazaki","okazaki")
#author("2025-05-26T21:02:45+09:00","default:okazaki","okazaki")
#menu(howto/MenuBar)

* howto/C言語 [#l28cc607]
#contents

** 一行メモ [#d6a23889]
- C++, C言語 リファレンス https://ja.cppreference.com/ --  &new{2024-06-25 (火) 13:37:31};
- 不可解な実行時エラーの例 --  &new{2024-11-13 (水) 15:33:49};
 C90規格(-std=c90)だと、double myfunc( int i, struct hoge* g ) があるとき、
 この関数を前方宣言しないまま使うと、コンパイラは int myfunc(int i, ...)
 のような int型を返す、可変引数の関数として扱われるようで、警告やエラーは出さない。
 C99規格では警告してくれる。
   myfunc(int i, ...)を myfunc( int i, struct hoge* g )と思って作っていると、
 実行結果は実に不可解な結果を与える。
- A[NI][NJ][NK][NR][NC]のとき、 A[i][j][k][r][c]は、0番目のA[0][0][0][0][0]から数えて、 i*NJ*NK*NR*NC + j*NK*NR*NC + k*NR*NC + r*NC + c = (((i*NJ+j)*NK+k)*NR+r)*NC+c 番目 である。 --  &new{2025-02-21 (金) 01:44:42};

#comment

** 時間計測 [#wa3a684b]

//--------------------------------------------------------------------------------
 #include  <sys/time.h>
 
     struct timeval  ts, te;
 
     gettimeofday( &ts, NULL );
     ...
     gettimeofday( &te, NULL );
     printf( "gettimeofday: %.6lf sec\n",
              te.tv_sec - ts.tv_sec + ( te.tv_usec - ts.tv_usec ) / 1000000.0 );
 //usec精度、NTPなどの時刻変更の影響を受けうる

//--------------------------------------------------------------------------------
 #include  <time.h>
 
     time_t  ts, te;
 
     ts = time( NULL );
     ...
     te = time( NULL );
     printf( "time: %d sec\n", (int)(te-ts) );
 //sec精度

//--------------------------------------------------------------------------------
 #include  <time.h>
 
     clock_t  ts, te;
 
     ts = clock();
     ...
     te = clock();
     printf( "clock: %.6lf sec\n", (double)( te - ts ) / CLOCKS_PER_SEC );
 //msec以下の精度、I/O待ちなどは含まれない、子プロセスの時間も含まれる

//--------------------------------------------------------------------------------
 #include  <time.h>
 //#define  CLKID   CLOCK_REALTIME
 #define  CLKID   CLOCK_MONOTONIC_RAW  //詳しくはman
 
     struct timespec  ts, te;
     struct timespec  ts, te, tr;
 
     clock_gettime( CLKID, &ts );
     ...
     clock_gettime( CLKID, &te );
     printf( "clock_gettime: %.9lf sec\n",
       (double)( te.tv_sec - ts.tv_sec ) + (double)( te.tv_nsec - ts.tv_nsec )/1000000000 );
 //nsec精度、もっとも正確らしい、
 //CLOCK_MONOTONIC_RAW はNTPなどの時刻変更の影響は受けない、
 //CLOCK_REALTIME は実時間でありNTPなどの影響を受ける
 
    clock_getres( CLKID, &str );
    clock_getres( CLKID, &tr );
    printf( "  resolution: %lf sec  %lf nsec\n",
            (double)str.tv_sec,  (double)str.tv_nsec );  //CLKIDの解像度を表示
            (double)tr.tv_sec,  (double)tr.tv_nsec );  //CLKIDの解像度を表示

//--------------------------------------------------------------------------------
 [cf] python
 import time  #詳しくはマニュアルhttps://docs.python.org/
 
     ts = time.time()
     ...
     te = time.time()
     print( f"time.time: {te-ts:.3f} sec" )
 #処理系によってはsec精度まで
 #他)
 #  time.perf_counter(): もっとも正確らしい、clock_gettime相当らしい
 #  time.process_time(): スリープ時間は含まず
 #  time.monotonic():    OS依存だがclock_gettime(CLOCK_MONOTONIC)相当など
 #  time.time():         OS依存だがgettimeofday相当など
 #  など

//--------------------------------------------------------------------------------


** int, longなどのサイズ [#r86d491f]

|                  |CENTER:C99言語規格        |CENTER:LP64データモデル |CENTER:LLP64データモデル |h
|CENTER: char      | 1byte以上、int以下       |CENTER: --              |CENTER: --               |
|CENTER: int       | 2byte以上                |CENTER: 4byte           |CENTER: 4byte            |
|CENTER: long      | 4byte以上、long long以下 |CENTER: 8byte           |CENTER: 4byte            |
|CENTER: long long | 8byte以上                |CENTER: --              |CENTER: --               |
|CENTER: ポインタ  | --                       |CENTER: 8byte           |CENTER: 8byte            |
|CENTER: 実装例    | --                       |CENTER: Linuxなど       |CENTER: Windowsなど      |

ref. [1] [[C++言語でのint型とlong型とlong long型の違いについて>https://ja.stackoverflow.com/questions/45529/c%E8%A8%80%E8%AA%9E%E3%81%A7%E3%81%AEint%E5%9E%8B%E3%81%A8long%E5%9E%8B%E3%81%A8long-long%E5%9E%8B%E3%81%AE%E9%81%95%E3%81%84%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6]] 
[2] [[cppreference.com 基本型>https://ja.cppreference.com/w/cpp/language/types]]


** 整数のオーバーフローについて知っておく事柄 [#t12b139b]
- INT32-C. 符号付き整数演算がオーバーフローを引き起こさないことを保証する https://www.jpcert.or.jp/sc-rules/c-int32-c.html
- INT02-C. 整数変換のルールを理解する https://www.jpcert.or.jp/sc-rules/c-int02-c.html
- Better C - Goと整数 #golang https://qiita.com/sonatard/items/464a9d45c689386edfe1


** 多次元の配列とポインタとメモリ領域 [#veeaa7ed]
#ref(多次元配列C言語.jpg,left,100%,nowrap)

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS