volcanol的工控博客
Email : lilinly225@126.com 索要资料加QQ 点击进入 或 点击左侧的资料分享专用帖

volcanol ---- View OF Linux Can Appreciate Nature OF Linux

天行健,君子以自强不息

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

     前两天我在园子里面写了一篇随笔, 说了几个问题, 当时测试用的是WinTC, 后来有几位大侠对

我的说法不是很同意, 我自己也开始对自己动摇了, 于是对那天说的问题中的其中几个问题重新在VC 6

中进行测试, 结果测试发现得出的结果大相径庭, 这也难怪有大侠表示有不同的看法了.............

首先看我在WinTC中测试下面代码的结果:

View Code
/*
通过下面的函数测试内存申请的传递机制
1、 voidgetmemory(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测试到达的同样是游离的地址,

下面是我测试的代码:

View Code
/*

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
你这段代码能跑过?好吧,恕我孤陋寡闻。膜拜下。

我的回复里面的代码啊,跑起来的结果:

肯定是跑过的代码,我才会弄上来的。

posted on 2011-07-20 22:07  volcanol  阅读(1145)  评论(18编辑  收藏  举报
volcanol ----View OF Linux Can Appreciate Nature OF Linux。