openSUSE: could not find 'kfmclient executable' 解决办法
解决办法: 重新安装 konqueror.
解决办法: 重新安装 konqueror.
这里推荐两个很酷的在线编译器: http://codepad.org/ http://ideone.com/ 这两个都非常酷, 个人更喜欢codepad,可以一边编辑代码一边查看结果; ideone也很酷,功更能与codepad基本一样,最酷的是它的代码可以直接链接到StackOverflow
由于Matlab软件默认的CPU是Intel的,所以AMD处理器的用户在安装 Matlab 后初次运行会自动关闭,可采取以下方式进行解决: (1) 假设matlab安装在C盘,确认c:\matlab7\bin\win32下有 atlas_athlon.dll文件 (2) 在“我的电脑”上点击右键中的“属性”,在“高级”中点“环境 变量” (3) 在“系统变量”中点“新建”,输入 变量名:BLAS_VERSION 变量值:c:\matlab7\bin\win32\atlas_athlon.dll 另外,顺便要说一下这个BLAS环境变量,这是BasicLinear AlgebraSubroutines的缩写,就是“基础线性几何子程序”的意思。 如果你的CPU是P3的话,要用到C:\Matlab7\bin\win32下的atlas_PIII.dll动态链接库,相应地,P2的话对应atlas_PII.dll,所以设置环境变量的时候要和自己的CPU对应。
2010(32位和64位版本) http://download.autodesk.com/akdlm/esd/dlm/objectarx/ObjectARX_2010_Win_64_and_32Bit.exe 2009(32位和64位版本) http://download.autodesk.com/esd/objectarx/2009/ObjectARX_2009_Win_64_and_32Bit.exe 2008 32位版本: http://download.autodesk.com/esd/objectarx/2008/ObjectARX_2008_32Bit.exe 64位版本: http://download.autodesk.com/esd/objectarx/2008/ObjectARX_2008_64Bit.exe 2007 -Core http://download.autodesk.com/esd/objectarx/2007/Arx_Core.exe -SDK http://download.autodesk.com/esd/objectarx/2007/Arx_All.exe 2006 -Core http://download.autodesk.com/WebPub/autocad/oarx2006/Arx_Core.exe -SDK http://download.autodesk.com/WebPub/autocad/oarx2006/Arx_All.exe 2005 -Core http://download.autodesk.com/WebPub/Developer/autocad/Arx_Core2005.exe -SDK http://download.autodesk.com/WebPub/Developer/autocad/Arx_All2005.exe 2004 -Core http://download.autodesk.com/WebPub/autocad/oarx/arx_core.exe -SDK http://download.autodesk.com/WebPub/autocad/oarx/arx_sdk.exe 2002 -Core http://download.autodesk.com/pub/objectarx/objectarx_2002/K030.arx.plus.core.zip -SDK http://download.autodesk.com/pub/objectarx/objectarx_2002/K030.arx.plus.all.zip 2000 -Core http://download.autodesk.com/pub/objectarx/ObjectArxCore.exe -SDK http://download.autodesk.com/pub/objectarx/ObjectArxSDK.exe R14 -SDK http://download.autodesk.com/Pub/developer/sdk/obarxsdk.exe
VC6.0插件强烈推荐!!! 文章出处:DIY部落(http://www.diybl.com/course/3_program/c++/cppjs/20090403/163918.html) Visual Assist(强烈推荐) http://www.wholetomato.com/ VA从5.0一直到现在的VAX,功能越来越强大,除了以前版本中的自动识别各种关键字,系统函数,成员变量,自动给出输入提示,自动更正大小写错误,自动标示错误等等以外,最新的版本中还在WorkSpace窗口中加入一个VA View,可以更方便的查找工程中的文件、类和变量。 WndTabs(强烈推荐) http://www.wndtabs.com/ WndTabs主要是在编辑窗口中显示了所有已经打开的文件,在VC中能够更方便的操作这些文件,比如修改文件属性,copy文件路径、文件名等,并且还开放源代码,你要是愿意的话,可以添加自己很兴趣的功能。 LineCounter http://www.wndtabs.com/ 用来统计整个工程的代码行数,包括总行数、代码行数、注释行数、空行数等,并且对多个工程一起统计时,不会把相同的文件计算多次. Spelly http://www.wndtabs.com/ 一个拼写检查的插件,可以对整个文件或所选部分进行拼写检查,支持C/C++/C#, VB, Fortran 和HTML。 SourceStyler C++ http://www.sourcestyler.com/ 此插件是针对C++的一个格式化工具,可以针对自己的编码习惯,选择一种编码风格,也可以自己定义,而且定义非常详细,有表达式、指针、模板、类、枚举等十几种,肯定能满足你的需要。 Numega BoundsChecker(强烈推荐) 下载:百度一下…… 是针对Visual C++6.0应用程序的最为全面的错误检测工具。BoundsChecker 能自动指出静态,堆栈内存错误和资源泄漏问题。 BoundsChecker 能够校验最新的 Windows APIs,包括 ActiveX, DirectX, OLE/COM, ODBC等等。能够发现与 Windows 平台兼容性。 BCGControlBar Library 下载:百度一下…… 非常好的一套应用于vc6的界面扩展类库,轻松的作出 vc2003 的界面。并且给了各种界面例子,如vc.net、outlook、更换皮肤等等。 Comment Wizard 下载:百度一下…… Visual C++插件,提供了Visual C++源代码注解标准化与自动化功能。在它的帮助下,您可快速创建标头文件信息注解,文件中模块注解, C++处理方式,以及C语言功能与历史校正功能注解,等等。 文章出处:DIY部落(http://www.diybl.com/course/3_program/c++/cppjs/20090403/163918.html)
一、英文名称 堆和栈是C/C++编程中经常遇到的两个基本概念。先看一下它们的英文表示: 堆――heap 栈――stack 二、从数据结构和系统两个层次理解 在具体的C/C++编程框架中,这两个概念并不是并行的。深入到汇编级进行研究就会发现,栈是机器系统提供的数据结构,而堆是由C/C++函数库提供的。这两个概念可以从数据结构和系统两个层次去理解: 1、从数据结构层次理解,栈是一种先进后出的线性表,只要符合先进后出的原则的线性表都是栈。至于采用的存储方式(实现方式)是顺序存储(顺序栈)还是链式存储(链式栈)是没有关系的。堆则是二叉树的一种,有最大堆最小堆,排序算法中有常用的堆排序。 2、从系统层次理解,栈是系统为运行的程序分配的先进后出的存储区域。在学习bootloader时知道,在上电后初始化阶段要为各个工作模式下分 配堆栈,这里的堆栈实际上就是指stack,堆栈的说法只是因为历史的原因。在执行函数时,函数内部局部变量的存储单元可以在栈上创建(针对CISC架构 而言,RISC架构下,局部变量的存储单元是在寄存器上创建),函数执行结束时这些存储单元自动被释放。堆是系统管理的可以被程序利用的全局存储空间,动 态内存分配就是从堆上分配。 具体地说,现在计算机(串行执行机制),都直接在代码层次支持栈这种数据结构。这体现在,有专门的寄存器指向栈所在的地址,有专门的机器指令完成数据入栈 出栈的操作。比如ARM指令中的stmfd和ldmfd。因为栈内存分配运算内置于处理器的指令集中,所以效率很高,但是支持的数据有限,一般是整数、指 针、浮点数等系统直接支持的数据类型,并不直接支持其他的数据结构。在CISC中,对子程序的调用就是利用栈来完成的。C/C++中的自动变量也是直接利 用栈的例子,这就是为什么当函数返回时,该函数的自动变量失效的原因(因为栈恢复了调用前的状态)。在RISC下,这些都是通过寄存器来完成的。这些留待 第二部分总结中详细阐述。 和栈不同,堆的数据结构并不是由系统(无论是机器系统还是操作系统)支持的,而是由函数库提供的。基本的malloc/free函数维护了一套内部的堆数 据结构。当程序使用这些函数去获得新的内存空间时,这套函数首先试图从内部堆中寻找可用的内存空间。如果没有可用的内存空间,则试图利用系统调用来动态增 加程序数据段的内存大小,新分配得到的空间首先被组织进内部堆中去,然后再以适当的形式返回给调用者。当程序释放分配的内存空间时,这片内存空间被返回内 存堆结构中,可能会被适当的处理(比如和其他空闲空间合并成更大的空闲空间),以更适合下一次内存分配申请。这套复杂的分配机制实际上相当于一个内存分配 的缓冲池(cache),使用这套机制有如下原因: 1、系统调用可能不支持任意大小的内存分配。有些系统的系统调用只支持固定大小及其倍数的内存请求(按页分配),这样的话对于大量的小内存分类来说会造成浪费 2、系统调用申请内存可能是代价昂贵的,因为这可能涉及到用户态和核心态的转换 3、没有管理的内存分配在大量复杂内存的分配释放操作下很容易造成内存碎片 总结: 1、栈是系统提供的功能,特点是快速高效,缺点是有限制,数据不灵活;而堆是函数库提供的功能,特点是灵活方便,数据适应面广泛,但是效率有一定降低 2、栈是系统数据结构,对于进程/线程是唯一的;堆是函数库内部数据结构,不一定唯一,不同堆分配的内存无法互相操作 3、栈空间分静态分配和动态分配两种。静态分配是编译器完成的,比如自动变量(auto)的分配。动态分配由alloc函数完成。栈的动态分配无需释放 (是自动的),也就没有释放函数。为可移植的程序起见,栈的动态分配操作是不被鼓励的!堆空间的分配总是动态的,虽然程序结束时所有的数据空间都会被释放 回系统,但是精确的申请内存/释放内存匹配是良好程序的基本要素 三、从系统层次再次细化分析 下面从系统的层次对堆和栈再次进行细致的对比,以更好的理解这两个概念。 1、申请方式 stack:系统自动分配。 heap:程序员自己申请,指明大小。 2、申请后系统响应 stack:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。 heap:首先 应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链 表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正 确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。 3、申请大小的限制 stack:在ARM中,stack预先设置好。在start.S中,可以有四种不同的栈:满栈递增,满栈递减,空栈递增,空栈递减。常用的是满栈递减,就是向下(低地址)方向生长。如果分析bootloader的stack设置部分,这个很容易理解。 heap:是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。 4、申请效率比较 stack:由系统自动分配,速度较快。但程序员是无法控制的。 heap:由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便。 5、存储内容 stack:在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各 个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。当本次函数调用结束后,局部变量先出栈,然后是 参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。 heap:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。 6、存取效率比较 stack:在运行时刻赋值,存取效率高。 heap:在编译时就确定,存取效率不如stack。 因为栈是由系统分配,更为确切的说,这就与CPU是RISC架构还是CISC架构密切相关的。在两种不同指令集体系结构中,对待内存分配的处理上是明显不 同的。在RISC架构下,原则之一就是尽量少访问内存,而代之以寄存器解决。所以寄存器的数目要明显多于CISC架构的寄存器。而堆是由函数库来提供的, 与系统的关系就远了。 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 简单的可以理解为: heap:是由malloc之类函数分配的空间所在地。地址是由低向高增长的。 stack:是自动分配变量,以及函数调用的时候所使用的一些空间。地址是由高向低减少的。 预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放 4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放 5、程序代码区—存放函数体的二进制代码。 ...
在讲述柔性数组成员之前,首先要介绍一下不完整类型(incomplete type)。不完整类型是这样一种类型,它缺乏足够的信息例如长度去描述一个完整的对象。 6.2.5 Types incomplete types (types that describe objects but lack information needed to determine their sizes). C与C++关于不完整类型的语义是一样的。 基本上没有什么书介绍过不完整类型,很多人初次遇到这个概念时脑袋会一片空白。事实上我们在实际的工程设计中经常使用不完整类型,只不过不知道有这么个概念而已。前向声明就是一种常用的不完整类型: class base; struct test; base和test只给出了声明,没有给出定义。不完整类型必须通过某种方式补充完整,才能使用它们进行实例化,否则只能用于定义指针或引用,因为此时实例化的是指针或引用本身,不是base或test对象。 一个未知长度的数组也属于不完整类型: extern int a[]; extern不能去掉,因为数组的长度未知,不能作为定义出现。不完整类型的数组可以通过几种方式补充完整才能使用,大括号形式的初始化就是其中一种方式: int a[] = { 10, 20 }; 柔性数组成员(flexible array member)也叫伸缩性数组成员,它的出现反映了C程序员对精炼代码的极致追求。这种代码结构产生于对动态结构体的需求。在日常的编程中,有时候需要在结构体中存放一个长度动态的字符串,一般的做法,是在结构体中定义一个指针成员,这个指针成员指向该字符串所在的动态内存空间,例如: struct test { int a; double b; char *p; }; p指向字符串。这种方法造成字符串与结构体是分离的,不利于操作,如果把字符串跟结构体直接连在一起,不是更好吗?于是,可以把代码修改为这样: char a[] = “hello world”; struct test *PntTest = ( struct test* )malloc( sizeof( struct test ) + strlen( a ) + 1 ); strcpy( PntTest + 1, a ); 这样一来,( char* )( PntTest + 1 )就是字符串“hello world”的地址了。这时候p成了多余的东西,可以去掉。但是,又产生了另外一个问题:老是使用( char* )( PntTest + 1 )不方便。如果能够找出一种方法,既能直接引用该字符串,又不占用结构体的空间,就完美了,符合这种条件的代码结构应该是一个非对象的符号地址,在结构体的尾部放置一个0长度的数组是一个绝妙的解决方案。不过,C/C++标准规定不能定义长度为0的数组,因此,有些编译器就把0长度的数组成员作为自己的非标准扩展,例如: ...
下面的程序可以用来测试是大端序还是小端序: /* * How can I determine whether a machine'sbyte orderis big-endian or little-endian? * */ #include <stdio.h> int main(int argc, char const *argv[]) { /* method 1 */ int x = 1; if(*(char *)&x == 1) printf("little-endian\n"); else printf("big-endian\n"); /* method 2 */ { union { int i; char c[sizeof(int)]; } unx; unx.i = 1; if(unx.c[0] == 1) printf("little-endian\n"); else printf("big-endian\n"); } return 0; } 什么是大端序/小端序啊? 出处是“爱丽丝梦游仙境”里的鸡蛋的吃法,从小端开始吃还是从大端开始吃,如下图: 参考: wikipedia
(1)编辑/etc/inetd.conf, 去掉ssh前的# (2)编辑/etc/rc.conf 确保有这一行 sshd_enable="yes" (3)最后配置sshd(守护进程),编辑文件 /etc/ssh/sshd_config, 在文件后加入下面的三行 PermitRootLogin yes #允许root PermitEmptyPasswords no #不允许空密码 PasswordAuthentication yes #认证 (4)激活sshd服务: root# /etc/rc.d/sshd restart
在ubuntu上修改swap分区大小按下面的步骤进行: cd /host/ubuntu/disks/ sudo swapoff swap.disk sudo rm swap.disk sudo dd if=/dev/zero of=swap.disk bs=1M count=1k (创建1G的swap, 这步比较慢,1G=bs * count) sudo mkswap -f swap.disk sudo swapon /host/ubuntu/disks/swap.disk 最后运行free命令,可以看到swap分区已经改成1G。