解决 tcsncpy_s.inl 断言(第 24 行)
Solving tcsncpy_s.inl assertion (line 24)
我有一个相当简单的程序,它需要用户以文本字符串的形式输入。我有一个带有编辑框的 CLR 表单,我需要获取该输入并将其传递到我的 class 中,后者只是将其复制到一个成员变量中。
在 Form.h 代码中,处理 TextChanged 事件是...
int textLength = m_userDest->TextLength;
if (textLength > 2 && textLength < 5)
{
// Could be an ICAO code in here
char dest[5];
String^ text = m_userDest->Text->ToUpper();
sprintf_s(dest, 5, "%s", text);
airTraffic.SetUserDest(dest);
}
我的 class (airTraffic) SetUserDest 函数只是
void CAirTraffic::SetUserDest(char* dest)
{
strncpy_s(m_userDest, 5, dest, 5);
}
当这是 运行 我得到这个调试断言时,它不会停留在屏幕上并在几秒钟后自动清除。
Debug Assertion Failed!
Program: ...sual Studio 2010\Projects\FSAirTraffic\Debug\FSAirTraffic.exe
File: f:\dd\vctools\crt_bld\self_x86\crt\tcsncpy_s.inl
Line: 24
Expression: ((_Dst)) != NULL && ((_SizeInBytes)) > 0
我没有 f:\ 驱动器,所以我猜这是一些内部 Microsoft(?) 代码,所以我看不到断言的上下文以及它的确切问题所在。我的机器上没有名为 tcsncpy_s.inl 的文件。
如果我不调用我的 class 函数,那么就没有断言,所以我认为这是问题所在。
但奇怪的是,当我单步执行调试器时,断言会在我退出 TextChanged 事件时发生,其余功能按预期运行(据我所知)。
有人知道问题出在哪里吗?我该如何解决?
我不明白你的代码是如何工作的。您使用 m_userDest
两次,首先它似乎是指向某种结构的指针,可能是 TextBox 控件的句柄:
int textLength = m_userDest->TextLength;
稍后将它传递给 strncpy_s
,它需要一个 char*
,而不是指向某个结构的指针。
void CAirTraffic::SetUserDest(char* dest)
{
strncpy_s(m_userDest, 5, dest, 5);
}
虽然结构可以隐式转换为 char*
,但结构指针不可能这样做。也许涉及到一个智能指针?或者您在不同的 类1?
中出于完全不同的目的使用相同的成员变量名称
无论如何,strncpy_s
正在检查其第一个参数的值并且不喜欢它。
1 请注意,新的 "wisdom" 声明不使用匈牙利符号破坏了以文本形式理解此代码的能力。我们没有 IDE 提供有关变量数据类型的鼠标悬停信息。 应用匈牙利语在现实世界中仍然是一个好主意,尽管有多少 "best practices" 文件反对它。令人惊讶的是,有多少代码样式文档是从纯理论基础编写的。
我有一个相当简单的程序,它需要用户以文本字符串的形式输入。我有一个带有编辑框的 CLR 表单,我需要获取该输入并将其传递到我的 class 中,后者只是将其复制到一个成员变量中。
在 Form.h 代码中,处理 TextChanged 事件是...
int textLength = m_userDest->TextLength;
if (textLength > 2 && textLength < 5)
{
// Could be an ICAO code in here
char dest[5];
String^ text = m_userDest->Text->ToUpper();
sprintf_s(dest, 5, "%s", text);
airTraffic.SetUserDest(dest);
}
我的 class (airTraffic) SetUserDest 函数只是
void CAirTraffic::SetUserDest(char* dest)
{
strncpy_s(m_userDest, 5, dest, 5);
}
当这是 运行 我得到这个调试断言时,它不会停留在屏幕上并在几秒钟后自动清除。
Debug Assertion Failed!
Program: ...sual Studio 2010\Projects\FSAirTraffic\Debug\FSAirTraffic.exe
File: f:\dd\vctools\crt_bld\self_x86\crt\tcsncpy_s.inl
Line: 24
Expression: ((_Dst)) != NULL && ((_SizeInBytes)) > 0
我没有 f:\ 驱动器,所以我猜这是一些内部 Microsoft(?) 代码,所以我看不到断言的上下文以及它的确切问题所在。我的机器上没有名为 tcsncpy_s.inl 的文件。
如果我不调用我的 class 函数,那么就没有断言,所以我认为这是问题所在。
但奇怪的是,当我单步执行调试器时,断言会在我退出 TextChanged 事件时发生,其余功能按预期运行(据我所知)。
有人知道问题出在哪里吗?我该如何解决?
我不明白你的代码是如何工作的。您使用 m_userDest
两次,首先它似乎是指向某种结构的指针,可能是 TextBox 控件的句柄:
int textLength = m_userDest->TextLength;
稍后将它传递给 strncpy_s
,它需要一个 char*
,而不是指向某个结构的指针。
void CAirTraffic::SetUserDest(char* dest)
{
strncpy_s(m_userDest, 5, dest, 5);
}
虽然结构可以隐式转换为 char*
,但结构指针不可能这样做。也许涉及到一个智能指针?或者您在不同的 类1?
无论如何,strncpy_s
正在检查其第一个参数的值并且不喜欢它。
1 请注意,新的 "wisdom" 声明不使用匈牙利符号破坏了以文本形式理解此代码的能力。我们没有 IDE 提供有关变量数据类型的鼠标悬停信息。 应用匈牙利语在现实世界中仍然是一个好主意,尽管有多少 "best practices" 文件反对它。令人惊讶的是,有多少代码样式文档是从纯理论基础编写的。