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