我的代码是这样的:
int find_test(int argc, char *argv[])
{
char line[MAX_LINES];
int c, except = 0, found = 0, number = 0;
long lineno = 0;
int i = 0;
while(--argc > 0 && (*++argv)[0] == '-'){
while(c = *++argv[0]){
switch(c){
case 'x':
except = 1;
break;
case 'n':
number = 1;
break;
default:
printf("find:illegal option %c\n", c);
argc = 0;
found = -1;
break;
}
}
}
if(argc != 1){
printf("Usage:find -x -n pattern\n");
}else{
while(getline(line, MAX_LENGTH) > 0){
lineno++;
if((strstr(line, …Run Code Online (Sandbox Code Playgroud) 我知道这个主题有很多问题,但它们似乎都特定于代码.
我有这个功能 -
Point2 ITCS4120::operator* (const Matrix3x3& m, const Point2& p) {
Point2 result;
for(int i=0;i<3;i++) {
result[i] = (m[i][0]*p[0]) + (m[i][1]*p[1]) + (m[i][2]);
}
return result; //error here
}
Run Code Online (Sandbox Code Playgroud)
它在返回语句中给出了一个错误,说"运行时检查失败#2 - 变量'结果'周围的堆栈已损坏."
我看不出那个功能有什么问题.Matrix3x3的阵列只是 -
float array[3][3];
Run Code Online (Sandbox Code Playgroud)
而Point2的数组是
float array [2];
Run Code Online (Sandbox Code Playgroud)
Matrix3x3和Point2类都有这个代码 -
/** Write access for element in row [i] */
inline Scalar* operator[](int i) {return array[i];}
/** Read access for element in row [i] */
inline const Scalar* operator[](int i)const {return array[i];}
Run Code Online (Sandbox Code Playgroud)
这段代码是给我的,我以前做过一些功课,用点,母体和矢量做算术.我的代码通过了所有测试,所以我假设我的Point2 ITCS4120 :: operator*(const Matrix3x3&m,const Point2&p)代码是正确的.但也许我需要以不同的方式使用[]运算符?
我有一个程序,使用执行非常快节奏的Lua脚本调用lua_pcall.似乎程序调用lua脚本的速度太快,事情会崩溃并导致在最随机的地方发生访问冲突.
我尝试过互斥锁,甚至用try/catch启用SEH异常也无济于事.错误功能到位,我正在检查所有适当的返回代码; 问题是pcall内部的实际访问冲突,而不是安全处理的Lua错误.
很多时候中断发生luaV_execute,但有时它在其他随机的地方.我已经检查过以确保推送到堆栈的所有参数都有效.
有没有办法强制Lua在返回之前完成一个调用,或者某种方式确保调用堆栈不会被破坏?
我们在一些英特尔FORTRAN代码中遇到了一些奇怪的崩溃,我最终将这条线跟踪到:
L_F = EXP(-L_B2*L_BETASQ*L_DS)
Run Code Online (Sandbox Code Playgroud)
-L_B2*L_BETASQ*L_DS项的评估值约为-230.碰巧,EXP(-230)的评估值约为1e-100.在所有其他已知情况下,L_DS要小得多,导致EXP的最小(已知)返回约为1e-50,这不会导致错误.
一旦FORTRAN评估条款EXP(-230),您就得到:
forrtl: severe (157): Program Exception - access violation
Image PC Routine Line Source
Run Code Online (Sandbox Code Playgroud)
但没有其他信息.
异常157通常与互操作性有关,并且您无法在FORTRAN中调试EXP,因为它无法找到特定的.c文件 - 这可能意味着EXP在C中实现(我觉得这很令人惊讶).
我的假设是FORTRAN在C中实现了EXP,但是接口不能将小于1e-100的浮点数转换为REAL(4)s.正如我之前认为浮点数和REAL(4)s在字节方面相同,我无法支持这个假设 - 我无法找到任何关于它的东西.
在我关闭这个错误之前,任何人都可以确认或否认我的假设 - 或者向我提供另一个假设吗?
最好的祝福,
麦克风
编辑: 我将把这个问题标记为已回答,因为高绩效标记已回答了当前的问题.
不幸的是,我的假设是不正确的 - 我试图将这个问题陷入困境:
L_ARG = L_B2*L_BETASQ*L_DS
IF (L_ARG .GT. 230.0) THEN
L_F = 0.0
ELSE
L_F = EXP(-L_ARG)
ENDIF
Run Code Online (Sandbox Code Playgroud)
不幸的是,现在(显然)例外发生在L_ARG .GT中.230.0条款.这或者意味着Release模式下的调试比我想象的要糟糕,或者它是某种"存储的"浮点错误(当将float输入到stringstream时,请参阅"浮点无效操作").
当在MSVC 2013,x64 Debug config上运行以下代码时,它会在退出main()函数时显示一个带有此着名错误消息的消息框
"Run-Time Check Failure #2 - Stack around the variable 'tmp' was corrupted.".
Run Code Online (Sandbox Code Playgroud)
我无法回答的问题是:为什么?
请注意,在Release配置上运行时不会出现任何错误消息.(为什么?)
免责声明:这只是一个示例代码,这意味着我试图在其他类(一个基础和几个派生)上使用相同的设计,使用更多的方法和模板参数,并且使用比基本的int*更复杂的数据类型.
#include <iostream>
template <class T>
class base {
public:
base() {
static_cast<T*>(this)->setData();
}
~base() {
static_cast<T*>(this)->destroyData();
}
void print() {
static_cast<T*>(this)->print_int();
}
};
Run Code Online (Sandbox Code Playgroud)
class derived : public base<derived> {
public:
void setData() {
x = new int();
}
void destroyData() {
delete x;
x = nullptr;
}
void print_int() {
std::cout << "x = " << *x << std::endl;
} …Run Code Online (Sandbox Code Playgroud) 我有以下代码将2个十六进制数字转换为字节值:
const char* data= "Some hex string";
unsigned char temp=' ';
sscanf(data, "%2hhx", &temp);
Run Code Online (Sandbox Code Playgroud)
运行它时,我得到一个运行时异常,说
变量temp周围的堆栈已损坏
我究竟做错了什么?AFAIK 2hhx应该将两个字节转换为一个......