山口屋~活動日誌~

私生活で主な出来事をピックアップ

n端子対網の線路定数行列

2009-08-11 21:00:32 | 工学
n端子対網(二端子のうち片方は接地)の中が多数の導体で構成され、回路定数行列を直接求めることができないときは、一端子ずつ1A電流源(二端子のうち片方は接地)をつないで各端子間の電圧を見る。

すると、線路直列インピーダンス行列、線路並列アドミタンス行列の両方を含んだインピーダンス行列が得られる。この逆行列を取ってアドミタンス行列とすると、線路直列インピーダンス行列、線路並列アドミタンス行列の成分がわかる。

文字列を数値に変換

2009-08-11 03:25:20 | ソフトウェア開発
C言語の文字列変換関数では、
・int atoi(const char *s)
・long int atol(const char *s)
・double atof(const char *s)
が知られているが、

エラーチェックするなら以下の関数のほうがよい
・long int strtol(const char *s, char **endptr, int radix);
・unsigned long int strtoul(const char *s, char **endptr, int radix);
・double strtod(const char *s, char **endptr);

strtol()
オーバーフローを起こした場合にはLONG_MAXLが、アンダーフローを起こした場合にはLONG_MINが返る。また、大域変数errnoにERANGEが設定される。第3引数には変換後の基数を指定する。

strtoul()
オーバーフローを起こした場合にはULONG_MAXが返る。また、大域変数errnoにERANGEが設定される。第3引数には変換後の基数を指定する。

strtod()
オーバーフローを起こした場合にはプラスまたはマイナスのHUGE_VALが、アンダーフローを起こした場合には0が返る。また、大域変数errnoにERANGEが設定される。


戻り値を見ても、正常に変換できたのかを判断しにくいため、実行前に大域変数errnoに0を設定しておき、実行後に0かどうかにより判断することもできる。



/* 大域変数errnoに0を設定 */
errno = 0;
/* 文字列をlong int型に変換 */
value = strtol(buff, &endptr, 0);
/* 完全に変換できたかのチェック */
if ((errno != 0) || (*endptr != '\0'))
{
printf("変換できませんでした\n");
}
else
{
printf("%s --> %ld\n", buff, value);
}