编程路上3000问

现在的软件都非常智能,一些格式都会自动填写。
如:
编写类的时候,大括号只要按左边,右边就会自动出现,并且形成格式,
编写类的时候,会直接在大括号后加上分号,

2014.11.05夜
怎么进行逐行调试!!!
F5添加断点,或者用鼠标在行号后面单击就会出现红点,
F8运行到断点,
F7进行逐行调试,直到结束,但是不会显示返回的0,这个奇怪

2015.3.3夜
加一行,#include ,main函数的末尾,即return 0 的前面加system(“pause”);就可以当暂停用

对于codeblocks,依次settings -> editor -> syntax highlighting 选择,然后可以改变编辑窗口不同文字的颜色。

2015.3.22夜
添加自己写的头文件,用“”,添加编译器的头文件,用< >;

2015.3.23
Variably modified array at file scope

const int N=100000;
int array[N];

Error: variably modified ‘array’ at file scope

错误原因:在C语言中,const并不意味着constant,而是只读的,如此,N只是存放于内存地址中,可以用汇编改变。

解决办法:#define N 100000 然后:int array[N];即可

对于Leetcode的题目,尤其注意各种++、–的使用,注意不同数据类型赋值有区别(如,bool 只能是1或0),运算时注意溢出。

2015.03.30
今天遇到了sizeof()的问题。
之前没有仔细研究过,潜意识将其与size()函数和length()函数,划等号。
今天一直没有检查出来,经过……然后……最后……终于……解决了。
sizeof()只是返回括号中的类型或对象的大小,而不是具体对象数值的大小。
sizeof(2)==>其实是转换为sizeof(int)==>然后计算,一个int大小为4字节,答案为4.也就是说,不管括号内的具体是什么,都转换为计算其类型,只返回类型的大小就行。

2015.4.1
从网上拷贝了一份比较简单的代码,编译时遇见以下问题:
test_getopt.c:12:3: error: stray ‘\342’ in program
test_getopt.c:12:3: error: stray ‘\200’ in program
test_getopt.c:12:3: error: stray ‘\230’ in program
test_getopt.c:12:3: error: stray ‘\342’ in program
test_getopt.c:12:3: error: stray ‘\200’ in program
test_getopt.c:12:3: error: stray ‘\231’ in program
test_getopt.c:13:4: error: stray ‘\342’ in program
test_getopt.c:13:4: error: stray ‘\200’ in program

出现类似以上问题的原因是,源代码中存在汉语时的字符或标点符号,特别是空格、括号,引号等不易察觉,如“”、,等,小心将其改过来即可!

2015.5.4
编写程序,首先想通思路,然后再动手写代码!
特别注意其中变量的定义的位置,选择局部变量还是全局变量?
在循环中使用的变量,一定分清变量定义的位置,特别小心,必须清楚,每一次循环开始,哪些变量需要重置,哪些变量需要继续使用上一次的值!
否则,虽然思路对了,但是由于变量定义位置的不当,导致出现逻辑错误,难以很快发现!!
切记!

2015.5.7
一点教训:对迭代器进行删除操作时候,特别注意迭代器的变化,查了一下,发现,迭代器添加、删除操作会使原来的迭代器失效,下一次遍历时不能继续使用,所以,需要特别小心迭代器的更新。
可以将原来的迭代器删除操作改为:
vector v;
vector::iterator itr;
原来的:v.erase(itr);
改为:itr=v.erase(itr);
原因是:迭代器的erase()函数,返回删除的迭代器的下一个迭代器,如此,进行迭代器的更新,解决问题。
vector::iterator b;
int x = 3;
for(b=a.begin();b!=a.end();)
{
if(*b==x){
b=a.erase(b);
}else{
b++;
}
}

2015.5.12
忽然发现又到了512这个日子,当年地震还记忆犹新,蓦然回首,7年过去了……

size_t 类型是非负,所以当不幸其取值为负,则换算成一个很大的数,因此要小心陷阱!
一般情况下并不会取到负值,但是在循环判定的时候,往往在边界容易发生越界!!还不易检查!
例如:

for(size_t i=len.size()-1; i >= 0; --i)
        {
            ……
        }

虽然有效的i取值为大于等于0,但是在最后,i=0的时候,先执行循环,然后–i,此时i=-1;但是size_t 为非负,i变成一个很大的数,造成继续循环!!!
应该避免最后那一次的递减运算!
修改为:

for(size_t i=len; i > 0; --i)
        {
            ……
        }

2015.5.14
C++程序调试时出现“Program received signal SIGSEGV,Segmentation fault.”
程序里执行了无效的内存引用。
对于不正确的内存处理,计算机程序可能抛出SIGSEGV。操作系统可能使用信号栈向一个处于自然状态的应用程序通告错误,由此,开发者可以使用它来调试程序或处理错误。
  在一个程序接收到SIGSEGV时的默认动作是异常终止。这个动作也许会结束进程,但是可能生成一个核心文件以帮助调试,或者执行一些其他特定于某些平台的动作。
  一般是程序处理内存越界,如循环的边界溢出等。注意检查边界!

另,[C/C++] 编译error: reference to ‘searchTo’ is ambiguous
编译报错信息。也许是因为一些库中有名为searchTo的函数,与程序中创建的容器实例名称相同。

纠正方法:给容器实例换一个名字。

2015.6.3
对于链表,有些时候并没有单独的head,而是head指向第一个元素的指针,因此,遍历链表时小心!
对于stack,特别注意不能访问出界!当stack为空的时候,不能访问stack的top,因为此时stack为空,根本就没有top,若访问top,会无意中访问非法区域!
切记切记!
2015.6.9
对于vector,按照特定的对象进行排序,需要修改sort函数。
定义比较函数:
bool Compare(const Type1& t1, const Type2& t2)
{
return t1.member > t2.member;
}
然后这样使用:
sort (t.begin(), t.end(), Compare);
具体应用参见leetcode56题:融合区间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值