C言語の中のローカル変数が、
初期化されていない状態だと、値は不確定です(0ではない)。
初期化されていない状態での読み込みを操作しないように!
特にpointer型、NULLじゃなくてもfreeしないで(プログラムがしんちゃう。。。)
文字列は最後「0」に入れると、きれいにprintできる。
strlen()にも0の前の長さで出る。
(特にchar *を要注意、最後が0じゃないとstrlen()算出したlengthは不正確になる)
C言語の中のローカル変数が、
初期化されていない状態だと、値は不確定です(0ではない)。
初期化されていない状態での読み込みを操作しないように!
特にpointer型、NULLじゃなくてもfreeしないで(プログラムがしんちゃう。。。)
文字列は最後「0」に入れると、きれいにprintできる。
strlen()にも0の前の長さで出る。
(特にchar *を要注意、最後が0じゃないとstrlen()算出したlengthは不正確になる)
JavaScriptにはpromiseが要注意!!!
あなたの呼び出し関数は、レスポンスはpromise型ですか?
こういった場合、promiseが返却されただけで、実行は実は終わってませんよ!
Javaの同期処理と違うので、
promise.then()を使うか、await promiseを使うか
必ずお忘れてはいけません。
ーーーーーーーーーーーーーーーーーー
永井さん発、今唐がメンテナンスしておるAAASWatchの閾値分析プログラム(名前は「wAnalyzer」)、何回も静かに死んでました。
サービス化して、自動再起動の対策もしたのになぜ死んじゃっただろう?
ログからもエラー出力一切なかったです。
今ようやく気づいたのは、promiseを放置したから、実際mqtt subscribe成功したかどうかはログから見えません、とのこと。つまり、subscribeしたけど、成功はしていない、というケースの処理は漏れていました。
今一度手元のソースコードチェックしたほうがいいです。
これからも関数の戻り値を意識してやりましょう。
C言語の中のローカル変数が、
初期化されていない状態だと、値は不確定です(0ではない)。
初期化されていない状態での読み込みを操作しないように!
特にpointer型、NULLじゃなくてもfreeしないで(プログラムがしんちゃう。。。)
文字列は最後「0」に入れると、きれいにprintできる。
strlen()にも0の前の長さで出る。
(特にchar *を要注意、最後が0じゃないとstrlen()算出したlengthは不正確になる)
pointer型変数が出たら、設定(SET)時にチェックを忘れないこと。
①該当変数はメモリalloc済んだか?(ちゃんと内容を入れる空間があるか?)
②該当変数は使用後どこでfreeしたのか?(leakはしてないよね?)
③=を使用してないよね(memcpyじゃないと値が中身反映されないよ)
④どうしても=&変数の場合、変数の作用域をチェック!(作用域超えたらメモリは回収されて消えちゃうよ)
ついつい忘れちゃうよな・・
2の補足、もう一つの形態:
①戻り値の関数型を定義
typedef IFCS_SMS_CMD_RETURN_E(*SMS_COMMAND_EXECUTE_FUNC_ENTRY)(char *);
※該当型はstructの中でも利用できる
typedef struct
{
uint8* command_name;
SMS_COMMAND_EXECUTE_FUNC_ENTRY execute_func;
char *execute_params;
} IFCS_SMS_CMD_T;
②戻り値の関数を声明(&実装)
IFCS_SMS_CMD_RETURN_E testDummyCommandExecute(char *parameters);
③関数を戻り値にする関数を声明(&実装)
SMS_COMMAND_EXECUTE_FUNC_ENTRY testReturnFunc()
{
return testDummyCommandExecute;
}
④実際に使用
int main()
{
SMS_COMMAND_EXECUTE_FUNC_ENTRY func1 = testReturnFunc();
printf("func1=%d", func1("test"));
return 0;
}
自分はC言語、大学の時ちゃんと勉強してたつもりですが、ほぼ10年たってた今、忘れたことが多く、もしくは最初から触れていない知識(実践的にあまり使ってないため)もあるため、わからないことがすごく多いと感じております。
そんな初心者同様な私が、これからコーディングしていくうちの問題点と対策をメモしようと思っています。
他の人にも役に立てると幸いです。
随時更新します。
ーーーーーーーーーーーーーーーーーーーーーーー
1.char[] arrayを別のpointer char *変数に渡したあと、
char chararr[10] = "test";
char *charp = chararr; // &は不要、array自体がアドレス
printf("%s", charp) → はエラーになる
正解は
printf("%s", (char *)charp);
2.関数を戻り値にしたい時
①戻り値の関数を声明(&実装)
int testDummyCommandExecute(char *parameters);
②戻り値の関数型を定義
typedef int(*execute_func)(char *);
③関数を戻り値にする関数を声明(&実装)
execute_func testReturnFunc()
{
return testDummyCommandExecute;
}
④実際に使用
int main()
{
int(*func1)(char *) = testReturnFunc();
printf("func1=%d", func1("test"));
}
JavaScriptにはpromiseが要注意!!!
あなたの呼び出し関数は、レスポンスはpromise型ですか?
こういった場合、promiseが返却されただけで、実行は実は終わってませんよ!
Javaの同期処理と違うので、
promise.then()を使うか、await promiseを使うか
必ずお忘れてはいけません。
ーーーーーーーーーーーーーーーーーー
永井さん発、今唐がメンテナンスしておるAAASWatchの閾値分析プログラム(名前は「wAnalyzer」)、何回も静かに死んでました。
サービス化して、自動再起動の対策もしたのになぜ死んじゃっただろう?
ログからもエラー出力一切なかったです。
今ようやく気づいたのは、promiseを放置したから、実際mqtt subscribe成功したかどうかはログから見えません、とのこと。つまり、subscribeしたけど、成功はしていない、というケースの処理は漏れていました。
今一度手元のソースコードチェックしたほうがいいです。
これからも関数の戻り値を意識してやりましょう。