Dec 29

return语句引起的栈错误 不指定

felix021 @ 2008-12-29 20:28 [IT » 程序设计] 评论(1) , 引用(0) , 阅读(6022) | Via 本站原创
被牛逼哄哄的Snoopy雷到了。

事情是这样的,今天打开 http://acm.whu.edu.cn/woj 检查oak的运行情况
发现在status的第二页有好多个submit都处于Running状态
ssh到服务器上去看了一下,发现Judge在Compile OK以后就挂掉了。
有一堆Stack的信息,但是看不太懂~

DEBUG了一阵,定位到了错误:在判断Restricted_Function的那个函数里面。
加入了调试代码以后的大概结构是这样的:
......
bool Restricted_Function(){
    char f[30], ...;
    ......
    cout << "DEBUG 1" << endl;
    return false;
}

......

bool WOJ_JUDGE(){
    ......
    cout << "DEBUG 0“ << endl;
    if(Restricted_Function(){
        cout << "DEBUG 2" << endl;
        return RF;
    }
    cout << "DEBUG 2" << endl;
    ......
}

然后发现非常神奇地,程序输出的是
引用
DEBUG 0
DEBUG 1
然后跟上一堆程序出现错误的信息。
于是我就懵了,居然一个return语句也能出现错误?

然后请教snoopy大牛,经过一番七荤八素的DEBUG以后,终于找到了症结所在:
原来在Restricted_Function里面定义的那个char f[30]空间太小了
由于是分配在栈空间里面的,所以在运行的时候,出现了少量越界写入的情况
在程序返回的时候,由于返回地址等被未预料到的字符覆盖了,于是就出现了上述问题。

一个return语句也能"出错",暴露出这样严重的内存使用问题
——可能存在于任何地方,写程序的时候务必要小心啊!

同时,通过这种方式"定位"到的错误点,未必就是错误真正发生的地方!
Dec 29

MySQL的事务功能 不指定

felix021 @ 2008-12-29 18:06 [IT » 数据库] 评论(0) , 引用(0) , 阅读(6306) | Via 本站原创
据说MySQL是从v4.0开始支持事务(Transaction)的,一直没去试过。
今天心血来潮,于是就玩了一下。

首先,mysql里面有一个状态量叫做 autocommit ,默认值是1
也就是说,当你提交一个SQL语句以后,这条语句会被立即执行并修改数据库内容(如果有必要的话)。

所以如果你想要开始一个事务,那么首先应该把这个东东设置为0,有这么几种方法:
  1. 提交SQL语句 START TRANSACTION;
  2. 提交SQL语句 BEGIN;
  3. 提交SQL语句 SET AUTOCOMMIT=0;
  4. (PHP) mysqli_autocommit($conn, false);

然后就可以开始进行你想做的数据库修改了,比如INSERT, UPDATE, DELETE

修改完以后,如果返回的结果有不对劲的地方,OK,试试
  1. 提交SQL语句 ROLLBACK;
  2. 或者(PHP) mysqli_rollback($conn);
然后你就会发现数据库好像根本没有操作过似的
(其实仔细观察的话会发现auto_increment那个字段的max值变大了-____-)

如果一切OK,那么就用这个:
  1. 提交SQL语句 COMIIT;
  2. 或者(PHP) mysqli_commit($conn);
注意,在提交COMMIT以后,数据库的改动就正式写到硬盘,不能撤销啦。

给俩例子吧:

a. 在MySQL命令行下进行的操作
mysql> use t;
mysql> CREATE TABLE `test`(`id` int primary key auto_increment, `name` char(50));
mysql> START TRANSACTION;
mysql> INSERT INTO `test` VALUES (NULL, 'a');
mysql> COMMIT;   #或者  mysql> ROLLBACK;
mysql> SELECT * FROM `test`;
看看效果如何?

OK,再来个PHP版本的:
<?php

$conn = new mysqli("localhost", "root", "123456", "t");

$conn->autocommit(false);

$res = $conn->query("INSERT INTO `test` VALUES(NULL, 'a')");

if($res)
    $conn->commit();
else
    $conn->rollback();

$conn->close();
?>
Dec 29

活在两个数字的世界里 不指定

felix021 @ 2008-12-29 10:59 [IT » 程序设计] 评论(1) , 引用(0) , 阅读(5646) | Via 本站原创
#include<iostream>
using namespace std;

char l[] = "Felix021";

void print(char a){
    for(int i = 7; i >= 0; --i){
        cout << ((a >> i ) & 1);
    }
}

int main(){
    for(int i = 0; l[i]; ++i){
        print(l[i]);
    }
    cout << endl;
    return 0;
}
Dec 27

Javascript onblur事件 不指定

felix021 @ 2008-12-27 11:38 [IT » 网络] 评论(0) , 引用(0) , 阅读(5597) | Via 本站原创
修改模板的时候希望能在 搜索框 实现这样一种效果:
默认显示内容为Search... ;鼠标点击激活后自动清空; 失去焦点以后如果内容为空,重置为Search...

记得IE有个onFocusOut事件,试了一下,确实OK
但是,非常遗憾地,FireFox没有这个事件。
又是Google又是Baidu,然后发现自己犯了Shability:
原来还有一个onBlur事件,就是用来作这件事情的。
<input type="text" value="Search..." onfocus="if(this.value=='Search...')this.value='';" onblur="if(this.value=='')this.value='Search...';"/>
Dec 23
发现听到这些语句的频率越来越高,而且我总是不能马上反应过来
每次都以为现在病毒事业蒸蒸日上,已经大规模入侵手机操作系统了呢

然后一听描述就是
哎呀,有个autorun.inf
哎呀,打不开了手机了,弹出“打开方式”对话框
哎呀,文件找不到了,但是空间显示还是那么多

汗ing...

解决办法:

资源管理器 -> "工具"菜单 -> "文件夹选项..." -> "查看"选项卡 ->
去掉 "隐藏受保护的操作系统文件(推荐)"前面的勾勾
然后下面选择 "显示所有隐藏文件和文件夹"
点击确定,然后看看文件出来没?

打开命令提示符: 开始->运行->输入 cmd 回车
然后应该会看到一个黑黑的窗口,光标闪动。
看看你的手机/MP3分配到了哪个盘,比如说是F
输入 F:  (有个冒号),然后回车
然后输入 dir /a 回车
Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.

C:\Documents and Settings\ooxx>F:

F:\>dir /a
驱动器 F 中的卷是 Nokia ooxx
卷的序列号是 1234-5678

F:\ 的目录

2003-01-01  00:00    <DIR>          Music
2008-12-23  10:44    <DIR>          Photos
2008-12-23  10:44    <DIR>          视频
               0 个文件              0 字节
               2 个目录  1,060,593,664 可用字节

看到最后一列了不?就是你手机/MP3上的所有文件吧
依次输入
引用
attrib -s -r -h 文件名

然后再看看MP3,文件是不是出来了?
Dec 21

更换Blog模板 oh yeah! 不指定

felix021 @ 2008-12-21 05:41 [IT » 其他] 评论(3) , 引用(0) , 阅读(6207) | Via 本站原创
把bo-blog搭建到了whuacm的服务器上
但是不想让首页看起来让人觉得陌生
于是花了几个小时,以whuacm主页的css为参照
把原先那个模板的css乱改一通
然后就变成这样了
看起来很简洁的吧?
于是自己也换上^_^

提供下载吧(才83K),更新版,修正了一些错误,更漂亮了点儿~
下载文件 (已下载 1316 次)
Dec 20
做校赛的报名系统,插入队伍的时候要考虑队名是否重复,于是想到了使用MySQL的正则表达式。
以前虽然一直知道MySQL有正则表达式,但是因为有LIKE在,所以一直还不需要用它。
正好这次有了机会,就去试试吧。

MySQL的关键字 REGEXP 允许在SQL语句中匹配忽略大小写的POSIX正则表达式。
其实MySQL的文档里面写得非常详细了,给出了很多的例子,可以在这里看到
http://dev.mysql.com/doc/refman/5.1/zh/regexp.html

这里主要是记录一下在PHP里面还需要进行怎样的处理:
其实很简单,两个函数:

1。preg_quote()
转义正则表达式中的特殊字符,详情参见 http://cn.php.net/preg_quote
这本来是PHP为PCRE的正则表达式准备的,不过这里也是可以用的。

2。mysql_real_escape_string()
这个函数是用来转义特殊的SQL字符,同时也可以防止SQL注入攻击。
PHP文档的说明为:
本函数将 unescaped_string 中的特殊字符转义,并计及连接的当前字符集,因此可以安全用于 mysql_query()。
它有一个兄弟,mysql_escape_string(),不过不能针对当前字符集进行处理,所以不够安全
另外如果使用mysqli的话,也可以使用mysqli_real_escape_string()。

综合起来就是这样:
$team_name = mysql_real_escape_string(preg_quote($team_name));
$query = " SELECT * FROM `teams` WHERE `team_name` REGEXP '{$team_name}' ";
然后再ooxx地去查询吧。。。
Dec 17

Ubuntu变慢了。 不指定

felix021 @ 2008-12-17 14:12 [IT » 操作系统] 评论(0) , 引用(0) , 阅读(5010) | Via 本站原创
最近发现可爱的Intrepid速度变得非常慢,慢到不可理喻。
打开终端都需要等好久
firefox的页面就像PPT一样地给我脸色看
VirtualBox里面的WinXP就压根不给我面子了
打字的时候通常我可以在按完一系列按键以后
再看着汉字一个一个冒出来
就像回到了我可爱的上一台小黑装着Win2k Advanced Server的那个时候。

百度和google告诉我,有人也遇到过这种问题
于是按照他的解决方案把~/.scim删掉,但是没用。

于是我试着把Compiz-Fusion的Desktop Cube特效关掉
启用Desktop Plane.

于是一切都解决了。
看来以后还是少折腾Intel的GMA X3100吧。
分页: 57/103 第一页 上页 52 53 54 55 56 57 58 59 60 61 下页 最后页 [ 显示模式: 摘要 | 列表 ]