装 A 卡平日死机的来由是 ATI Powerplay自动节能技术?

本人禁用 s205 驱动自带的 powerplay 后真正是政通人和了不少.
还有此外网友也展现了仿佛的情状.
澳门美高梅手机网站,此外还要在 “Alienware电源管理” 中的 “cpu情势”
设置为固定值,那样会更好有的.可是好几意况,比如我操作 vs2008
的历程中如故会不时重启.

引言 – 为寻一颗超新星

本人禁用了虚拟内存,好象那样也易于重启.

  澳门美高梅手机网站 1

装 360
杀毒–360有惊无险警卫好象不太会,也会促成平常重启.难道是因为她俩集团不大用
Intel 的东西?

为要寻一颗明星
        徐志摩 1924年12月1日《晨报六周年纪念增刊》

我骑著一匹拐腿的瞎马,

向著黑夜里加鞭;——

向著黑夜里加鞭,

我跨著一匹拐腿的瞎马。//

我冲入这黑绵绵的昏夜,

为要寻一颗明星;——

为要寻一颗明星,

我冲入这黑茫茫的荒野。//

累坏了,累坏了我胯下的牲口,

那明星还不出现;——

那明星还不出现,

累坏了,累坏了马鞍上的身手。//

这回天上透出了水晶似的光明,

荒野里倒著一只牲口,

黑夜里躺著一具尸首。——

这回天上透出了水晶似的光明!//

{  
:  http://music.163.com/\#/song?id=5276735  }

s205 有合法中文上有驱动下载了!

 

http://support1.lenovo.com.cn/lenovo/wsi/Modules/Driverdownload.aspx?SearchType=1&LogicType=0&MachineId=9711&SN=&IsBackPage=false&IsSeachOne=true&typename=IdeaPad+S205

前言 – 有点扯


  C基本是程序生涯的入门语言. 虽说简单, 但已经断层了. 估计是老式吧.

http://itbbs.pconline.com.cn/diy/8464198.html

做事中也就在网络层框架会映入眼帘有些C的影子. 自己用C开发久了, 发现C一个害处是 当一个类型超越2千行 x 10 时候用C协作

3850,3870的教义ATI显卡易黑屏死机重启的无所不包解决方案
[复制本帖链接]
倪孜
发表于 2008-04-14 22:01:49
[此帖被浏览 14975 次,回复 74 次]
最后由 倪孜 于 2008-04-14 22:10:18 修改
宣称:此帖转自CHIPHELL论坛genouswhy兄弟为我们带来的佛法
我一向为此故障烦恼,最先觉得是电源功率不够大的问题,换了额定400W的或者一如既往死机蓝屏,直到见到此帖经实验。完全可以一定是此原因。再一次的感恩戴德genouswhy兄弟

这多少个难受. C风格是个随机的英雄主义表现.

ATI显卡易黑屏死机重启的无微不至解决方案
相信广大使用ATI显卡的爱人都有过黑屏死机的经验,很多到最后都是无可奈何给自己显卡降频使用,以求玩个心安,不过自己花了那多钱却连个公版的默认频率都跑不落实,我想每个A饭的心头都不好受,所以这几天我做了有些试行,也算是有了有的经验,在此和豪门大快朵颐。
首先,造成A卡频繁易死机重启的最大元凶,即是POWERPLAY,这些当然出发点是很好的成效,假如在体制不是很好的卡上就改为了一颗定时炸弹。
POWERPLAY将显卡的3D应用分为了4种状态:启动,一般选拔,高清播放1,高清播放2,分别对应BIOS中state1,state2,state3,state4
我们的显卡正常情形下,都是高居一般采取的动静,即2D选取和低负载3D游戏的时候,显卡降频降电压以达到省电的目标,高负载3D游戏的时候全速运转。
只要一块显卡用料十足,芯片和显存的体制都非凡好,这种POWERPLAY设置是一点一滴没有问题的,可是很遗憾,市面上很多牌子的显卡并从未那么好的用料和体裁,包括最大牌的蓝宝石。
现今自家以自家自己的蓝宝石HD3870海外版为例,详细表达一下本人的显卡怎样从一先导默认频率打游戏,甚至开QQ宠物都会死机,到前些天超频至850,2400都足以安静运行。
先贴一下这块显卡的默认BIOS

但是 实际的生活如dota, 大家不是 hero 而只是 那些小兵, 时来运转会成为顶级兵. 哈哈.

2008-4-14 00:20
我们得以看出,尽管默认频率和公版一样,可是默认电压却不是公版的1.327V,低了0.027V。
在默认的BIOS下,我第一就赶上了打3D游戏半路死机,具体表现为先鼠标定住,声音延续,接着声音也定住,然后就黑屏重启。于是自己先在玩耍打了大体上的时候切出去看了下温度,才60度,所以就裁撤了散热的题材。
这儿我就想是否是由于玩耍负载不平均,POWERPLAY频繁切换造成了死机,于是自己就将low
3d和high 3d的频率都调成一样,并且降低了运行效用

但这不首要, 爱好就好.

2008-4-14 00:20
刷了那个BIOS后,果然游戏再也从没死机了,不过自己心灵探究,假如真是POWERPLAY的题目,那超频是不是应该不影响稳定呢,而且想想自己花了
13XX,最终落个降频使用,心里其实是难过啊,于是将频率超到了800,2300,但是很欠好,能开机,却过不了3DMARK。
这时忽然注意到这么些卡的默认电压为1.3,于是一发誓,加到和公版一样1.327V,同时继续稳中有升频率

  生活不断眼前的苟且 … …

2008-4-14 00:20
加了电压果然提升了显卡的平稳,愉快地由此3DMARK06

   好那大家最先,看看这些关于C基础的活化石. 真想问 <<C程序设计>> 那门课你真正学好了啊?

2008-4-14 00:20
分数不是很高,让各位见笑了。
时至前几天,在那个BIOS下打一整天沉重召唤4和特等11,都再也没暴发过死机,本以为这块显卡终于被我搞定。什么人知道在两次很偶尔的意况下,我打开了QQ宠物,同时去点击Q宠的食谱,在菜单弹出的时候,死机又发生了。因为这是在2d的操作中,所以自己第一想到的就是会不会是CPU超过头了?(黑盒
OC
200*16),于是把CPU降回默认频率,同时鉴于POWERPLAY的缘由,使我对Intel的精打细算方案杯弓蛇影,就把
总监L ‘N’ QUITE也共同关了。重启之后重新挑衅Q宠菜单,结果依旧是,死机。
这下我就盲目了,可以吗,这自己就把所有东西都过来成初期状态吧,于是将老的显卡BIOS刷回去,再度开机。嘿,本次果然不死了。难道是显卡的题目?但是这显卡运行3D游戏如此高负荷之下都不死机,却在大家的无所谓
QQ菜单下就嗝屁了?为了搞了解这么些业务,我打开了RIVA
TUNER,然后不停的去点QQ菜单,结果令我大吃一斤。

 

2008-4-14 00:20
从监察中得以观看,在点击QQ菜单的时候,GPU居然也有不小的载重,而且以此负载已经抢先了2D的限量,显卡驱动需要调用low
3D的效能来搪塞它才行(QQ果然牛啊)。
好了,领会了这么些道理,当初缘何会死机的因由就很了然了,罪魁祸首同样是POWERPLAY,因为QQ菜单的弹出都是一下子的事(从督察中得以很清晰的观望),所以POWERPLAY会以连忙的进度在2D-LOW3D-2D之间切换,由于自身当初的LOW
3D频率是超频的,所以就径直促成了不平静死机(这和最初阶游戏里死机是一个道理)。
OK,到了此处,我已经到头搞了然了,我这块显卡,只要在可比大的效用或者电压跨度上开展POWERPLAY频繁切换,就会死机(比如游戏负载不均,某些软件菜单使用了3D功效),假诺POWERPLAY切换之后一贯保持频率和电压稳定运转,就算是超频,也不会死机(比如常时间的3D游戏)。
总括完了,最后的缓解方案就是,以LOW
3D为跳板,让POWERPLAY各种频率和电压的跨度都在能平稳运行的限制内,这样,即便再三切换频率也不会死机,又可以超频使用,算是完美解决了问题,附上自己最后利用的BIOS

正文 – 有点难

最后我还想再评论一下蓝宝的那块卡,应该是由此缩水的公版,因为既然ATI能设计出POWERPLAY,这肯定是通过严俊测试的,所以我想公版卡应该不会有其一题目,不过现在那么多非公卡容易死机,只好算得板卡创建商降低了设计要求,做消费电子的仇敌都应当都知道,什么叫新款?新款就是降本钱。虽然价格也低了,但最起码要能稳定运行是不,超频能力也不奢求了,最终让许三人花了钱还要降频才能用,实在是令人心寒了些。
写了那么多,有这么些都是废话,我也只是想把自己的一对经验告知大家,希望对我们能有点扶助,谢谢

1.  int i = 0; ++i 一直继承会什么?


我们先看这样的测试代码

正当是一个 ati 驱动的古怪安装情势,供参考:

#include <stdio.h>
#include <stdlib.h>

/*
 * 测试 int 的最大值
 */
int main(void) {
    int id = 0x7fffffff;

    printf("-1 = %x\n", -1);
    printf("id = %d\n", id);
    ++id;
    printf("id = %d\n", id);
    id += 0x7fffffff;
    printf("id = %d\n", id);
    id += 0x7fffffff;
    printf("id = %d\n", id);

    system("pause");
    return 0;
}

win7下安装:
在设施管理器中点击显卡,更新驱动手动更新,选取从列表或指定地点设置,下一步,搜索指定地点,浏览找到相应系统的driver这么些目录下,选W7_INF这个文件,选hd3600,没有经过微软认证的,点击仍旧延续就安装上了。

你能算清楚测试结果吧, 倘使可以证实你电脑组成原文学的很好. 运行截图如下

二、安装ATI催化剂
设置完驱动,直接运行CCC目录中的Setup.exe就可以了。

澳门美高梅手机网站 2

使得装置格局:
1、安装.NET framework 2.0 (安装CCC用)
2、到官方网站www.amd.com.cn下载最新的驱动(现在是10.4);
3、双击驱动安装文件,会自行举办解压缩,当指示您举办设置时,请退出;
4、右键点“我的总结机”–“管理”–“”设备管理器–找到“显示卡”一项,右键黄***色的问号项,选“更新驱动程序”–点
否 暂时不–下一步,
  
选用“从列表或指定地方设置(高级)”,下一步—采用“不要搜索,我要接纳自己安装的驱动程序” 
下一步    
   点
“从磁盘安装”—单击“浏览”;地方指向“C:\ATI\Support\10-4_agp-hotfix_xp32_dd_ccc\Packages\Drivers\Display\XP_INF”
   拔取“CX-98771”  点“打开”—确定,然后接纳“ATI radeon HD 3600 Series” 
点 “下一步” 
–现身警示,点“是”,一番动作后,就设置好驱动了。重新开动后就可以了

从而 我们取得 int i = 0; ++i 一直延续的 会是
0->INT_MAX->INT_MIN->0 这样循环的.  例如 skynet 存在这多少个利用不当

AGP版HD3600显卡采纳了被动式散热设计,搭配了512MB的GDDR2显存,主旨/显存频率为594/725MHz,其行使了双槽设计,相对来讲更加占有机箱空间。

        int id = __sync_add_and_fetch(&(ss->alloc_id), 1);
        if (id < 0) {
            id = __sync_and_and_fetch(&(ss->alloc_id), 0x7fffffff);
        }

类似的:

原作者希望 再从 0起头 , 但却忘了

amd hd 6470xp的显卡驱动哪儿有?

2011-3-24 20:47

提问者:guozhen8808
| 浏览次数:1899次

 

2011-3-25 11:02

最佳答案

不知道就别乱误导别人,现在HD6470 只有win7的,没有XP,但是你下载WIN7驱动,实际里面是有XP的驱动的。
方法如下:
首先下载win7的驱动,然后解压到指定文件夹,里面有个Packages/Drivers/Display/XP_INF
这个就是XP的显卡驱动,但是由于现在是推WIN7驱动,所以在安装的时候并没有做XP安装的连接,如果要装的话,只能手动安装,就是查找硬件,然后指定安装目录安装

http://ideapad.zol.com.cn/46/160\_455992.html

 

AHCI情势下启动XP不蓝屏,本人尝试多种艺术的亲身经历与我们享用!有详实图解!
澳门美高梅手机网站 3

此帖对”联想IdeaPad“的评论

做为一个War3一级业余玩家,买了Y460后重要的本来是装上War3操作起来。

俗话说”生命在于操作”
,可当我意识WIN7下War3在运转一些dota,真三等RPG游戏时竟然会有不流利的觉得,当然SOLO对战很通畅。

本人领悟这是由于War3与WIN7不太配合的关联,于是,在探望大量”WIN7和XP双系统”帖子后,我控制,果断地装双系统!

观察帖子中都写得很简单,我觉得这是件很容易的事,

不过我错了,

自身查看了过多的帖子,也尝尝了不少情势,却都失败了,。

最初始我是想制作集成SATA驱动的系统盘,然后刻碟安装,

结果在AHCI形式下怎么都读不出碟,切换来IDE形式可以读出,我只得在IDE形式下安装,装是装好了,但装好后在XP下怎么都装不上AHCI驱动,下了诸四个版本都不行,

自我很烦心,也很无奈,这时候看到有帖子上说一向用winpe可以在AHCI格局下安装,就不存在装好后再去装驱动的问题了,于是我又来品尝,

如何老毛桃winpe,ylmf
winpe,我都试了,还弄了个U盘做了开行盘,不过都特别!!

自己用做好winpe的起步U盘将BIOS指导形式改为USB
HDD启动到winpe后,发现根本就读不出其他磁盘!

在我就要彻底的时候,我又在网上听说有个什么样“雨林木风 ghost xp sp3
纯净版”是永葆SATA驱动的,间接设置就足以。

本身又下来刻了盘,

在AHCI情势下仍然不得以安装,在IDE模式下可以安装,安装好后,BIOS切回AHCI情势,然后再进XP,蓝屏,,,,

万恶的蓝屏啊,,是很蓝很蓝的这种蓝,,,1天内我早已看了累累次了,,,真的看到想把电脑砸了,,,

自我心里特别气啊,花了自身那么多功夫看贴啄磨,又花了自我那么多功夫去下那些下充足,还用了3张CD一个U盘,结果到底依旧。。。。正剧啊。。。

愤懑了半天后,我主宰接受喜剧,面对现实,IDE就IDE吧,大不断我不切AHCI不进WIN7了,,

自身起来很镇静的装置其他驱动和常用软件,可是我在联想官网下驱动的时候仍旧无意中在Y460的XP补丁的“补丁程序”中,

意识有一个AHCI驱动!! 大小只有279.68KB,揭橥时间是10-03-18

自我困惑了,为啥win7 32位和win7
64位的AHCI驱动都位居“主板及芯片组”目录下,而XP的却放在这吗,而且大小惟有200多K

虽然我曾经尝试过在IDE情势下进XP后安装的各种AHCI驱动,甚至也按照某些达人的右键采取第IDE第2个通道,然后更新驱动再手动选到目录。都特别。

不过我要么抱着试一试的心气下下来装了,装了后重启进BIOS改回AHCI,然后选取WINDOWS
XP,,,,毅然的按下了回车键,

自家常有都不敢抬头,   因为自己, 已经害怕这绚丽的黑色~

没悟出!没悟出!。。见证奇迹的天天到了,,,,WINDOWS XP
,它仍旧起先读条了!!!!!!!!!!!!!

 

好了诸位不佳意思,实在是太鸡动了,所以说了那样多,接下去该说些重点,也让这些也准备装双系统的仇人可以吸取我的训诫,少走点弯路!

先附上联想官网XP下AHCI驱动的图
澳门美高梅手机网站 4

倘使不亮堂怎么进到该处的恋人,我直接给个下载链接地址好了

http://driverdl.lenovo.com.cn/lenovo/DriverFilesUploadFloder/32130/AHCI.exe

下载下来是个压缩包文件,解压后没有EXE安装文件,直接进到PREPARE目录下运作INSTALL.CMD脚本就足以了
澳门美高梅手机网站 5

运作完后就设置好了,很快,安装好后IDE控制器已经不是事先的有6个了,现在只有1个,如图
澳门美高梅手机网站 6

对了,既然说到这顺便Y460在XP下装独显HD5650驱动也说说,记得一定要先在BIOS下把彰显切换成独显,默认是集显的。

要不然,怎么装驱动都装不上来,HD5650这始终是一个风流的叹号!

使得的话就在联想官网下就好了,不过安装前必须要先装个.NET framework 2.0

再有不要一贯点setup文件安装,我这样装了几遍都报错装不上,我最终是在配备管理器里右键点显卡接下来更新驱动程序再到下的驱动里去选装好的。

对象文件在Intel\Packages\Drivers\Display\XP_INF目录下,详细见下图
澳门美高梅手机网站 7

好了,大概就说这么多了,我给我们大快朵颐自己战败和成功的长河,是期望能对和自家一样不是太懂的情侣有所援救,少走弯路。

谢谢我们能耐心看完自家的帖子,谢谢!

#define INT_MIN     (-2147483647 - 1) // minimum (signed) int value
#define INT_MAX       2147483647    // maximum (signed) int value

对此 signed  MAX + MIN = -1 , 因为总结机中 正数从0起头, 负数从-1初步.

 

2. 添加双引号 的宏用法

看下边代码

// 添加双引号的宏
#ifdef _API_MEM
#   define  STRINIFY_(S)    #S
#   define  STRINIFY(S)     STRINIFY_(S)
#   include STRINIFY(_API_MEM)
#   undef   STRINIFY
#   undef   STRINIFY_
#endif

多少工程中接纳方面代码, 来动态的导入头文件. 核心在于 STRINIFY_ 和
STRINIFY 六个宏使用. 我们测试一下

#include <stdio.h>
#include <stdlib.h>

#   define  STRINIFY_(S)    #S
#   define  STRINIFY(S)     STRINIFY_(S)

#define _API_MEM api.h

// 测试添加双引号宏
int main(void) {

    puts(STRINIFY_(_API_MEM));
    puts(STRINIFY(_API_MEM));

    system("pause");
    return 0;
}

运作结果是

澳门美高梅手机网站 8

经过那些意识, 假如直接用 STRINIFY_ 不会将参数举行了. 这也是一个C行业淫荡的技能了. 可是觉得大巧若拙 

个人觉得 最好做法是

#define _API_MEM "api.h"

#ifdef _API_MEM
#    include _API_MEM
#endif

 

3. 除了sizeof, 其实还有 offsetof

一向看例子

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>

#define UDP_ADDRESS_SIZE 19 // ipv6 128bit + port 16 bit + 1 byte type

struct write_buffer {
    struct write_buffer* next;
    void* buffer;
    char* ptr;
    int sz;
    bool userobject;
    uint8_t udp_address[UDP_ADDRESS_SIZE];
};

/*
 * 测试 宏 offsetof
 */
int main(int argc, char* argv[]) {

    printf("offsetof(struct write_buffer, udp_address[0]) = %d\n", offsetof(struct write_buffer, udp_address[0]));
    printf("offsetof(struct write_buffer, udp_address) = %d\n", offsetof(struct write_buffer, udp_address));

    system("pause");
    return 0;
}

运作的结果如下

澳门美高梅手机网站 9

透过地点 可以知晓 offsetof 其实总括的是结构体中字段的偏移量. 关于结构体的内存总括基础力量, 必须要了然的. 洞悉内存结构很紧要.

事实上 offsetof 是 stddef.h 中定义的一个 宏 如下

#define offsetof(s,m) ((size_t)&(((s*)0)->m))

是不是很清爽. 就是如此, 没事简单的.

实际上下面代码还带有一个 关于 数组的 细节 . int a[10];  &a[0] == a
== &a 地址是均等的.

 

4. 哪些社团一个只好在堆上分配结构体?

//堆上 声明结构体
struct request_open {
    int id;
    int port;
    uintptr_t opaque;
    char host[];
};

尽管地点这样, 加了[], 表示不完全类型. 只好在堆上分配内存. 使用方法.

struct request_open *open = malloc(sizeof(struct request_open) + sizeof(char) * 19);

这种社团相似在底部库会看见. 一些老的程序员喜欢这样写

//堆上 声明结构体
struct request_open {
    int id;
    int port;
    uintptr_t opaque;
    char host[0];
};

//堆上 声明结构体
struct request_open {
    int id;
    int port;
    uintptr_t opaque;
    char host[1];
};

因为老的编译器不襄助 char host[]; 前边标准加了. 后来没改过习惯.

 

5. 哪些组织一个在栈上开头化的指针变量

说的不得了了解, 依然这么问, 下边定义的序列怎么解.

struct cstring_data {
    char* cstr;                                 //保存字符串的内容
    uint32_t hash;                                //字符串hash,如果是栈上的保存大小
    uint16_t type;                                //主要看 _INT_STRING_* 宏,默认0表示临时串
    uint16_t ref;                                //引用的个数, 在 type == 0时候才有用
};

typedef struct _cstring_buffer {
    struct cstring_data* str;
} cstring_buffer[1];                            //这个cstring_buffer是一个在栈上分配的的指针类型

下边也是底层库中会碰到一个技巧.

当声明cstring_buffer cb; 后.能够直接cb->str调用它,

当 cb 传入到 函数中. 如故可以 cb->str. 可以领略为这多少个值是栈上的然则足以当指针变量用法去使用. 看下边也许好理解

typedef struct _jmp_buf { 
    int _jb[_JBLEN + 1]; 
} jmp_buf[1];

以此是 setjmp.h 里的一条龙定义,把一个 struct 定义成一个数组。

这样,在声明 jmp_buf
的时候,可以把多少分配到仓库上。不过作为参数传递的时候则作为一个指针. 

扩展一下读书了然可以看下面. 应该可以明白为啥如此搞.

//特殊的数组 声明结构体
#define _INT_STRING_ONSTACK        (4)                //标识 字符串分配在栈上
                                                //0 潜在 标识,这个字符串可以被回收,游离态

#define _INT_ONSTACK            (128)            //栈上内存大小

struct cstring_data {
    char* cstr;                                 //保存字符串的内容
    uint32_t hash;                                //字符串hash,如果是栈上的保存大小
    uint16_t type;                                //主要看 _INT_STRING_* 宏,默认0表示临时串
    uint16_t ref;                                //引用的个数, 在 type == 0时候才有用
};

typedef struct _cstring_buffer {
    struct cstring_data* str;
} cstring_buffer[1];                            //这个cstring_buffer是一个在栈上分配的的指针类型

/*
 * v : 是一个变量名
 *
 * 构建一个 分配在栈上的字符串.
 * 对于 cstring_buffer 临时串,都需要用这个 宏声明创建声明,
 * 之后可以用 CSTRING_CLOSE 关闭和销毁这个变量,防止这个变量变成临时串
 */
#define CSTRING_BUFFER(v) \
    char v##_cstring[_INT_ONSTACK] = { '\0' }; \
    struct cstring_data v##_cstring_data = { v##_cstring, 0, _INT_STRING_ONSTACK, 0 }; \
    cstring_buffer v; \
    v->str = &v##_cstring_data;

 

6. 那么些年总有个align字段进行内存对齐

/*字节对齐的类型Align,为了优化CPU读取*/
typedef union {
    long        l_dummy;
    double      d_dummy;
    void        *p_dummy;
} Align;

/*标志大小,默认是4字节*/
#define MARK_SIZE       (4)
/*内存块头结点,双向链表结点size,filename,line都是为了调试添加的调试信息.prev和next是双向链表的核心*/
typedef struct {
    int         size;
    char        *filename;
    int         line;
    Header      *prev;
    Header      *next;
    unsigned char       mark[MARK_SIZE];
} HeaderStruct;

/*Align类型的字节大小*/
#define ALIGN_SIZE      (sizeof(Align))
/*这是个不错的技巧,求最小的n使得n*ALIGN_SIZE>=val成立,n,val,ALIGN_SIZE都属于自然数*/
#define revalue_up_align(val)   ((val) ? (((val) - 1) / ALIGN_SIZE + 1) : 0)
/*将HeaderStruct按照Align划分,找到最小的n,使得n*ALIGN_SIZE>=sizeof(HeaderStruct),在自然数集中*/
#define HEADER_ALIGN_SIZE       (revalue_up_align(sizeof(HeaderStruct)))

/*实现了memory.h接口中Header不完全类型,Align是对齐用的,内存结构的头结点.链表链接的主要结点*/
union Header_tag {
    HeaderStruct        s;
    Align               u[HEADER_ALIGN_SIZE];
};

 主要看 union Headr_tag 中 Align结构. 保证不同机器上内存是对齐的. 相比较古老了. 特别底层的库会晤到.

 

7.  可变参数宏, 这个事

平等直接看上面工程中用的示范

//4.0 控制台打印错误信息, fmt必须是双引号括起来的宏
#ifndef CERR
#define CERR(fmt, ...) \
    fprintf(stderr,"[%s:%s:%d][error %d:%s]" fmt "\r\n",\
         __FILE__, __func__, __LINE__, errno, strerror(errno),##__VA_ARGS__)
#endif/* !CERR */

//4.1 控制台打印错误信息并退出, t同样fmt必须是 ""括起来的字符串常量
#ifndef CERR_EXIT
#define CERR_EXIT(fmt,...) \
    CERR(fmt,##__VA_ARGS__),exit(EXIT_FAILURE)
#endif/* !ERR */

#ifndef IF_CERR
/*
 *4.2 if 的 代码检测
 *
 * 举例:
 *        IF_CERR(fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP), "socket create error!");
 * 遇到问题打印日志直接退出,可以认为是一种简单模板
 *    code : 要检测的代码 
 *  fmt     : 必须是""括起来的字符串宏
 *    ...     : 后面的参数,参照printf
 */
#define IF_CERR(code, fmt, ...)    \
    if((code) < 0) \
        CERR_EXIT(fmt, ##__VA_ARGS__)
#endif //!IF_CERR

#ifndef IF_CHECK
/*
 * 是上面IF_CERR 的简化版很好用
 */
#define IF_CHECK(code) \
    if((code) < 0) \
        CERR_EXIT(#code)
#endif // !IF_CHECK

这 传说中的 3颗痣, 就是可变参数宏的一切o(∩_∩)o

 

8. 简练的谢幕. 仍然宏

一个数什么和0相比较,真的是 == 吗. 其实好的思绪是概念阀值.

//3.0 浮点数据判断宏帮助, __开头表示不希望你使用的宏
#define __DIFF(x, y)                ((x)-(y))                      //两个表达式做差宏
#define __IF_X(x, z)                ((x)<z&&(x)>-z)                //判断宏,z必须是宏常量
#define EQ(x, y, c)                 EQ_ZERO(__DIFF(x,y), c)        //判断x和y是否在误差范围内相等

//3.1 float判断定义的宏
#define _FLOAT_ZERO               (0.000001f)                      //float 0的误差判断值
#define EQ_FLOAT_ZERO(x)          __IF_X(x,_FLOAT_ZERO)            //float 判断x是否为零是返回true
#define EQ_FLOAT(x, y)            EQ(x, y, _FLOAT_ZERO)            //判断表达式x与y是否相等

谢幕吧 : [

  先生布置一个学业, 问学生, 看见那些晾衣杆吗. 何人能帮我测试出中度来.

一个同班自告奋勇的把晾衣杆放倒了. 测试出长度 为 1.5m.

  先生把她骂了一顿, 我要的是惊人, 不是长度.

]

//5.0 获取数组长度,只能是数组类型或""字符串常量,后者包含'\0'
#ifndef LEN
#define LEN(arr) \
    (sizeof(arr)/sizeof(*(arr)))
#endif/* !ARRLEN */

 

后记 – 认真做容易的

  错误是在所难免的, 欢迎吐槽互换.
 … 还有下半辈子的苟且.  哈哈, 可是在变化, 这会变得有意思, O(∩_∩)O哈哈~

 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website