前两天我在园子里面写了一篇随笔, 说了几个问题, 当时测试用的是WinTC, 后来有几位大侠对
我的说法不是很同意, 我自己也开始对自己动摇了, 于是对那天说的问题中的其中几个问题重新在VC 6
中进行测试, 结果测试发现得出的结果大相径庭, 这也难怪有大侠表示有不同的看法了.............
首先看我在WinTC中测试下面代码的结果:
/*
通过下面的函数测试内存申请的传递机制
1、 voidgetmemory(char **p)函数可以在堆中申请内存,
并可以返回给调用getmemory的函数使用
2、char *getmemory(void) 函数也可将申请的空间供调用
getmemory的函数使用
*/
#include <stdio.h>
#include <stdlib.h>
void getmemory(char **p)
{
if(NULL !=(*p=(char *)malloc(100)))
return ;
}
/* 下面函数测试成功
char *getmemory(void)
{
char *p=NULL;
if(NULL !=(p=(char *)malloc(strlen("hello word")+1)))
return p;
}
*/
int main(int argc, char *argv[])
{
char **p=NULL;
*p=NULL;
getmemory(*p);
strcpy(*p, "hello word!");
printf(*p);
free(p);
getch();
}
结果如图所示:
而我用同样的代码在VC 6中进行测试,得到的结果如下:
我好冤枉啊, 不是我没有进行测试,而是WinTC骗了我, 我有什么办法?
很遗憾, WinTC对C语法的检测没有VC 6.0严格,所以造成了我的判断失误.........
并且有一段代码我在WinTC中测试下面的代码的时候得到的是游离的地址,而在VC6.0测试到达的同样是游离的地址,
下面是我测试的代码:
/*
1.问题描述
假设有一个能装入总体积为T的背包和n件体积分别为w1,w2,…wn的物品,
能否从n件物品中挑选若干件恰好装满背包,即使w1+w2+…+wm=T,
要求找出所有满足上述条件的解。
例如:当T=10,各件物品的体积{1,8,4,3,5,2}时,可找到下列4组解:
(1,4,3,2)
(1,4,5)
(8,2)
(3,5,2)。
2.实现提示
可利用回溯法的设计思想来解决背包问题。首先,将物品排成一列,然后,
顺序选取物品装入背包,若已选取第i件物品后未满,则继续选取第i+1件,
若该件物品“太大”不能装入,则弃之,继续选取下一件,直至背包装满为止。
如果在剩余的物品中找不到合适的物品以填满背包,则说明“刚刚”装入的物品
“不合适”,应将它取出“弃之一边”,继续再从“它之后”的物品中选取,如此
重复,直到求得满足条件的解,或者无解。
由于回溯求解的规则是“后进先出”,自然要用到“栈”。
进一步考虑:如果每件物品都有体积和价值,背包又有大小限制,求解背包中存放物
品总价值最大的问题解---最优解或近似最优解。
*/
#include <stdio.h>
#include <stdlib.h>
int * getmemory(int size)
{
int *p=NULL;
if(0 >= size) return NULL;
if(NULL != (p=(int *)malloc(size * (sizeof(int)))))
return p;
else
return NULL;
}
void assignvalue( int *dest,int size)
{
int i=0;
while(i<size)
{
scanf("%d",dest+1);
++i;
}
}
int main(int argc, char *argv[])
{
int size;
int *number;
number=NULL;
printf("input the total number of the package");
scanf("%d",&size);
printf("Enter the elements in the package");
/*
number=getmemory(size);
if(NULL==number) exit(1);
assignvalue(number,size); */
printf("%d",*number);
getch();
getch();
}
下面是我在WinTC中测试的结果:
而下图是我在VC 6.0中测试的结果:
通过上面的测试,我得到一个经验,最好用与操作系统兼容的编译工具,否则一定会误导人的....
哎, 我真的很无辜啊...........
这不是我想要的结果
本来是想用我上次测试成功的方法来试验一下背包问题,结果被编译器的不同解释给搁浅了,
我原来一直都认为选何种编译器都无关紧要,今天才算是明白了,选个合适的工具还真有关紧要,
本来想在回复里面贴图的但是回复里面不能贴图的;又为了回复只能在这里添加内容了:
为了回复:@hoodlum1980
你这段代码能跑过?好吧,恕我孤陋寡闻。膜拜下。
我的回复里面的代码啊,跑起来的结果:
肯定是跑过的代码,我才会弄上来的。