注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

刘邓

每天收获一点点-目标:富足

 
 
 

日志

 
 

ATM错误总结  

2012-03-01 20:17:42|  分类: 总结类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

注:此文件的pdf带目录版以上传CSDN和百度文库待审核通过,即可下载。

下载地址:

百度:http://wenku.baidu.com/view/7d44bec208a1284ac850439d.html

CSDN:http://download.csdn.net/detail/abliudeng/4104310

 

ATM错误总结

error C2265: '<Unknown>' : reference to a zero-sized array is illegal

:引用了一个空的数组,这是违法的

引起原因为未对对象初始化操作

VerObject It;/穿件一个验证对象IT

It = *database.verifyAccount(number,pin,&It)//把It的引用作为参数调

error C2528: 'verobject' : pointer to reference is illegal

:指针作为函数的参数 采取引用掉头的方式是违法的也就是说指针不能作为引用调用的参数传递给函数。必须要用对象的实例才可以。但是有时我们没有具体的对象可供引用,或者为了节省空间,我们可以不声明对象实例,而申请对象

如 Object *object;

在函数调用时采取&object即可

warning C4700: local variable '任意' used without having been initialized 

:就是说局部变量“任意”被使用了但是却没有初始化

ATM里面出现这种问题的原因是:

While(1){}我是在一个无限循环体内部声明的变量,VC++居然把他当局部变量了,当我把变量放到循环体外声明问题就解决了。

*对于这个错误我之前一直纠结在未初始化的问题上,试了很多方法尝试对其初始化,结果发现其实问题出现在local variable上...悲剧。

error C2106: '=' : left operand must be l-value

:就是说赋值语句左边的操作数必须为左值。

那么纠结什么是左值,有左值有没有右值捏?

且看MSDN我的l-value和r-value原文(这里我就不一个一个翻译了,我会把几个比较不常见的术语标注出来,可以下一个有道词典或者金山词霸来用):

L-Value and R-Value Expressions(明白一点就是左值和右值都是标示符)

Visual Basic (Declaration)
Visual Basic (Usage)
C#
C++
J#
JScript

Expressions (表达式)that refer to memory locations are called "l-value" expressions. An l-value represents a storage region's "locator" value, or a "left" value, implying that it can appear on the left of the equal sign (=). L-values are often identifiers(标示符).

Expressions referring to modifiable(可修改的) locations are called "modifiable l-values." A modifiable l-value cannot have an array type, an incomplete type, or a type with the const attribute. //一个可修改的左值不能使一个序列(如数组和向量),或者是有const属性的变量。For structures and unions to be modifiable l-values, they must not have any members with the const attribute.//对于结构体和联合体,以及类来说他们必须没有属性变量const的。 The name of the identifier denotes(表示) a storage location, while the value of the variable is the value stored at that location.

An identifier is a modifiable l-value if it refers to a memory location and if its type is arithmetic, structure, union, or pointer. For example, if ptr is a pointer to a storage region, then *ptr is a modifiable l-value that designates(指向) the storage region to which ptr points.

Any of the following C expressions can be l-value expressions:

//下面的 C 表达式都可以作为左值

An identifier of integral, floating, pointer, structure, or union type

//任意的整形,浮点型,指针,结构体和联合体标示符

A subscript ([ ]) expression that does not evaluate to an array

//一个不是求数组值得下标表达式

//可能有人会对此句话不理解,对于下表实现的操作有取值和求值之分,而作为左值不能使求值表达式作为标示符,只能是取值表达式作为标示符。

A member-selection expression (–> or .)

//一个属性成员选择表达式;对于对象指针则使用->对于对象实体则使用->

A unary-indirection (*) expression that does not refer to an array

//一个间接地取值操作符(*)这里*后面的部分不能使序列(如数组和向量)

//我ATM机模拟器中出现的错误就是*操作符后面使用了向量。

An l-value expression in parentheses

//一个在()里面的左值标示符(废话。。。。)

A const object (a nonmodifiable l-value)

//一个const对象(一个不可变的左值)

//这句话没理解。。。

The term "r-value" is sometimes used to describe the value of an expression and to distinguish(区别) it from an l-value. All l-values are r-values but not all r-values are l-values.

error C2440: '=' : cannot convert from '任意' to '任意1' 

无法把任意的值赋值给任意1.

ATM机里出现的问题的地方是:

我想把指向向量的迭代器的值赋值给一个指向向量元素类型的指针,但是发现报错,让我了解到原来迭代器和指针还是有一定区别的,从网上找到一种这类问题的解决方案:

比如想把迭代器Iterator的值赋值给pointer则可以采用如下表达式:

Pointer=&(*Iterator);

error:expression cannot be evaluated 

:运行时错误,表达式无法评估。

出现这类问题的主要可能情况(我遇到的)是用户在设计自己的调用函数时为了实现引用调用的目的,以传指针调用为手段,把指针作为函数参数使用。然而会很容易出现上述问题。出现这种问题的原因下面的百度知道: http://zhidao.baidu.com/question/349794333.html 理由详细的解释,这个解释不光能解决我们的这个运行时错误,而且对内存泄露有一个非常通俗易懂的解释(感谢回答者):

为什么运行时候,出现error:expression cannot be evaluated

2011-12-2 10:39

提问者:匿名 | 浏览次数:399

#include "stdafx.h"

#include <iostream>

using namespace std;

char *GetMemory(char *p,int num)

{

    p = (char*)malloc(sizeof(char) * num);

        return p;

}

int main(int argc, char* argv[])

{

    char *str = NULL;

    GetMemory(str,6);

    strcpy(str,"Hello");

    cout << str << endl;

    cout << *str << endl;

    cout << &str << endl;

    //printf("Hello World!\n");

    return 0;

}

我来帮他解答

2011-12-2 11:14

满意回答

问题出在你的GetMemory函数上,你虽然将str传入要求GetMemory分配内存空间,但是在GetMemory结束后,你分配的空间其实被释放掉了,因此,必须将GetMemory参数1改成char **p

然后里面变成*p=(char*)malloc(sizeof(char)*num),调用的时候是GetMemory(&str,6) 

顺便解释一下为啥吧!

你在主函数定义了一个指针str,但是没有给它分配,所以str指向是一个无效的地址,然后你的子函数参数1分配了一个指针char *p,这个指针的所有权是子函数的,当你调用子函数的时候,str的值被复制到了p中,此时p同样也是一个无效的指针,当调用malloc,p会分配到一段有效内存空间,但是str仍然指向的是无效空间啊(strp地址是不一样的,只给p分配了),所以当子函数结束后,p作为参数变量,肯定会被销毁,那么你这段内存虽然分配了,但是却使用不了(内存泄漏了)。所以正确的方法是用二级指针,让p成为指向指针的指针!*p将指向str的内存地址,那么对*p分配,就是对str分配了!

回答者: isip_ty | 四级采纳率:47%

擅长领域: C/C++

error C2362: initialization of 'tmp' is skipped by 'goto Restart'

:对变量tmp的初始化被goto Restart;覆盖了,无法得到实现。

在我的ATM机里我使用了一个C++非常有“争议的操作”GOTO,在设置lable后可以实现从上往下的条件或者非条件转移(这点和汇编很像,但是C++好像不能网上跳),为了实现望山跳转从头开始,我使用了

While1

{

...

.........

......

Rsstart:

}

然后我在寻其中的一个判断语句的后面加入goto Restrat就可以实现跳转,但是问题出现了就是说如果在这个判断语句下面定义的一个变量就无法得到初始化或者有效声明。

解决方法:把tmp的声明放到循环体外,或者goto语句前。

Unhandled exception at 0x00d913d1 in a任意.exe: 0xC0000005: Access violation writing location 0x00000190

:在执行任意.exe是出现错误:对内存地址 0x000000190的非法写入。

出现原因:

在类成员函数的参数定义了指针val但是却没有为指针初始化,指向一个空的地址。解决的方法是在函数内部对其进行操作时比如想把这个参数值作为变量赋值给类成员指针p

则应该为:

P=&*val);//正确

P=val //报错

原因:当若改变一个指针的值就应该用指向指针的指针**p.

更多解释参见百度知道:http://zhidao.baidu.com/question/202198524.html

warning C4172: returning address of local variable or temporary

:返回一个局部变量或者是临时变量

问题出现在:VerObject *Database::verifyAccount(string val1,string val2,VerObject verobject)//错误

改正后VerObject *Database::verifyAccount(string val1,string val2,VerObject  *verobject)//正确

这是C++新手非常任意出现的一个问题:参数调用问题。

参数调用三种方式:

1.穿值调用,你把一个值作为参数给了函数,函数在内部使用它或者变化它,但其实实际上函数使用的是你传递参数的一个副本,不会对你传入的数值进行修改

2.传引用调用,把一个值以传引用调用给了函数,那么函数内部进行操作的将不再是对象副本而是就是我们穿的的那个对象。也就是说如果在函数内对其进行了变化操作,那么返回以后主程序中的这个值也就改变了。

3.传地址调用,把指向值得指针传递给函数,结果和传引用调用一样,会变化传递的值。

我要进行的操作是:

1.在主函数main里面声明一个空的对象object

2.object作为参数传给验证函数

3.通过验证函数的操作,为对象object赋值。然后再传递给主函数里面的object

这个操作我花了很长时间来完成,中间出现了很多问题(主要是我太水...)问题描述如下:

1.就是直接把声明的对象作为参数进行传值调用,因为上面的warning,使得主函数理得object没有变化,依旧是空。

2.查了下觉得应该使用传引用调用,然后又因为我申请的是对象指针,所以在对对象指针进行传引用调用的时候,系统返回上面讲到的error C2528: 'verobject' : pointer to reference is illegal即指针的引用调用时违法的。

3.最后的解决方法是采用了第三种调用方式。经过实践在需求清晰(传递的值到底要不要变)的情况下使用第一种和第三种更为好用。

C4102: '任意' : unreferenced label

:任意为未引用的标签。

在使用goto语句操作时,需要指定跳转的标签,但是好像是无法跳到goto语句的前方的只能往下跳,而如果你把标签“任意”设置在了goto前就会出现这个错误。

解决方法,

while(1)

{

//假设原程序你希望跳转到这一行

....

....goto lable

....

....

Lable:i=0;//i=0为纯无用的句子,为了提供一个“;”不然报错

}

先写这么多吧。

 


  评论这张
 
阅读(330)| 评论(3)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018