質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.45%
Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Q&A

1回答

2025閲覧

'sprintf': This function or variable may be unsafe. というエラー

yasu2711

総合スコア7

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

0グッド

0クリップ

投稿2020/04/11 06:49

編集2020/04/11 09:00

前提・実現したいこと

RS485通信を使ってインバータの制御を行うシステムを開発しております。
COM4ポートを開放して、送信データを作成して書き込みを行います。
このような機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

34行目 sprintf(szCommand, "00FB10000");
'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
45行目 sprintf(szTx, "\5%s%02X", szCommand, nSum);
'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

該当のソースコード

ソースコード

Visual

1#include <stdio.h> 2#include <windows.h> 3using namespace std; 4int main(int) { 5 HANDLE hCom; // 通信ハンドル 6 DCB hDcb; // 通信設定用の構造体 7 COMMTIMEOUTS hTim; // タイムアウト設定用の構造体 8 char szTx[0x10]; // 送信バッファ 9 char szRx[0x10]; // 受信バッファ 10 char szCommand[0x10];// コマンド 11 DWORD nTx, nRx; // バッファサイズ格納用 12 int nSum; // サムコード計算用 13 BOOL bRet; 14 int nRet; 15 unsigned int i; 16 //?????COM4ポートをオープンする ???? 17 hCom = CreateFile(L"COM4", (GENERIC_READ | GENERIC_WRITE), 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 18 if (hCom != INVALID_HANDLE_VALUE) { 19 //???? COM4ポートの通信設定をする ???? 20 GetCommState(hCom, &hDcb); // 現在の通信情報を取得 21 hDcb.DCBlength = sizeof(DCB); // 構造体サイズ設定 22 hDcb.BaudRate = 19200; // 通信速度=19200bps 23 hDcb.ByteSize = 8; // データ長=8bit 24 hDcb.Parity = 2; // 偶数パリティ 25 hDcb.StopBits = 2; // ストップビット=2bit 26 bRet = SetCommState(hCom, &hDcb); // 変更した通信情報の設定 27 if (bRet == TRUE) { 28 //???? COM1ポートのタイムアウト設定をする ???? 29 GetCommTimeouts(hCom, &hTim); // 現状のタイムアウト値取得 30 hTim.WriteTotalTimeoutConstant = 1000; // 書込みタイムアウト1秒 31 hTim.ReadTotalTimeoutConstant = 1000; // 読込みタイムアウト1秒 32 SetCommTimeouts(hCom, &hTim); // 変更したタイムアウト値設定 33 //???? 局番1のインバータをネットワーク運転モードに切り換えるコマンドを設定 ???? 34 sprintf(szCommand, "00FB10000"); // 送信データ(NET運転書込み) 35 nTx = strlen(szCommand); // 送信データサイズ 36 //???? サムコードを生成する ???? 37 nSum = 0; // サムデータ初期化 38 for (i = 0; i < nTx; i++) { 39 nSum += szCommand[i]; // サムコードを計算 40 nSum &= (0xff); // データをマスク 41 } 42 //???? 送信データを生成する ???? 43 memset(szTx, 0, sizeof(szTx)); // 送信バッファ初期化 44 memset(szRx, 0, sizeof(szRx)); // 受信バッファ初期化 45 sprintf(szTx, "\5%s%02X", szCommand, nSum);// ENQコード+送信データ+サムコード 46 nTx = 1 + nTx + 2; // ENQコード数+送信データ数+サムコード数 47 nRet = WriteFile(hCom, szTx, nTx, &nTx, NULL); 48 //???? 送信 ???? 49 if (nRet != 0) { 50 nRet = ReadFile(hCom, szRx, sizeof(szRx), &nRx, NULL); 51 //???? 受信 ???? 52 if (nRet != 0) { 53 //???? 受信データを表示する ???? 54 for (i = 0; i < nRx; i++) { 55 printf("%02X ", (BYTE)szRx[i]);// 受信データをコンソール出力 56 // アスキーコードを16進数で表示します。'0'の場合30と表示します。 57 } 58 printf("\n\r"); 59 } 60 } 61 } 62 CloseHandle(hCom); // 通信ポートを閉じる 63 } 64}

試したこと

「sprintf」を「sprintf_s」を変更しましたが、エラーは解消されませんでした。
sprintf_s(szCommand, "00FB10000");
sprintf_s(szTx, "\5%s%02X", szCommand, nSum);

おわかりの方いらっしゃいましたらお教えください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/04/11 07:06

このままではコードが読めないので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
yasu2711

2020/04/11 07:38

失礼いたしました。枠の中にコードを貼り付けました。おわかりでしたらお教えください。
asm

2020/04/11 08:09

再現しません。 使用しているコンパイラのバージョンの提示と ソースの保存忘れor別のソースファイルを編集していないか確認をお願いします。
pepperleaf

2020/04/11 08:14

> &nTx(LPDWORD) のように定義しました こんな書き方、ありました? あるいは、別のエラーがでませんか? 変更したソースとコンパイルしたソースが別という事はありませんか?
yasu2711

2020/04/11 08:34

失礼いたしました。デバッグを再度行いましたら、別のエラーが出ておりました。 エラーは 38行目 for (i = 0; i < nTx; i++) { 54行目 for (i = 0; i < nRx; i++) { '<': signed と unsigned の数値を比較しようとしました。 でした。nTxとnRxのデータ型をintからDWORDに変えたからでしょうか。 34行目と45行目のsprintfのエラーは継続しております。
pepperleaf

2020/04/11 08:38

質問は編集できるので、最新の状況に更新しましょう。 そこで、発生してるエラーもそのまま、のせましょう。
pepperleaf

2020/04/11 09:55

> 'sprintf': This function or variable may be unsafe. は、sprintf_s()を使えば、なくなると思いますが。 ただ、sprintf()に較べ、引数が増えてます。注意を。または、"_CRT_SECURE_NO_WARNINGS"の定義を追加。
yasu2711

2020/04/11 11:31

ありがとうございました。"_CRT_SECURE_NO_WARNINGS"の定義を追加して解決いたしました。また、よろしくお願いいたします。
guest

回答1

0

sprintf_s(バッファ,バッファの大きさ,"フォーマット",...)
です。printfの関数名を変えるだけじゃダメ

投稿2020/04/11 10:30

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.45%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問