-
在KEIL的TARGET的OPTION里可以直接定义宏,而不是在源文件里定义宏,这样直接条件编译出不同的版本。
-
辛昕说的说这个初始化严重依赖编译器及平台,所以在移植诸如UC/OS之类的东东时,这个问题经常会出现,如果一点一点地找出哪个地方需要初始化而编译器没有做,无疑是大海捞针,(尤其是在做移植工作时),可以推荐个我自认为比较轻松的方法,上电后,写段程序,将RAM数据全部清零。
-
收下,再看.
-
和notepad++一样,也是留有编译器的接口,个人也是觉得UEStudio要强一些.
-
我觉得辛昕的写法有问题,辛昕是想知道浮点数在机器里存的时候究竟是个啥东东,
我觉得有两个办法,
一个是用联合,把一个浮点数和一个长整或字符串联系在一起,
一个是用强制类型转换比如
#include
int main(void)
{
float a = 17.625;
ungined char *p=(ungined char *) &a;
printf(\"%x%x%x%x\n\",*p,*(p+1),*(p+2),*(p+3)); return 0;
}
至于
printf(\"%x\n\",a);
本身就不规范.很难说会编译成什么结果
[ 本帖最后由 能圈就圈 于 2012-1-17 16:24 编辑 ]
-
对不起呀,插一句,最终到手的多少?
-
我也被搅晕了,下午写的那个 1.0-(2.0-3.0)-(4.0-5.0)-(6.0-7.0)-(8.0-9.0)-(10.0-11.0)又想当然了.
刚才谈得奇偶问题时,一下又想到应该是这样
11.0-(10.0-(...........-(2-1)))))))
这样下午那版程程序是对的,是我反而改错了.
-
如果只是处理字符型和整型,应该还是比较简单的.
我试着写一下这个函数:
void MemSet(void *p,int c,size_t n,int size)
{
if(size==sizeof(char))
memset(p,c,n)
else
{
int i = n / size;
int *pi=(int *) p;
whie( i-- )
{
*pi++=c;
}
}
}
调用的时候用如下方式:
int a[10];
char b[10];
MemSet( a, 3, sizeof(a), sizeof( a[0] ) );
MemSet( b, 3, sizeof(b), sizeof( b[0] ) );
不过,上述函数比真正的memset多了个参数.至于想做到和memset同样参数个数,
个人认为是实现不了的.
很容易,可以扩充到处理字符型,短整和长整.
-
这个题目也比我想象的要复杂,如果数组的类型是局限于char和int,那应该没啥问题,如果加上float啥的就不好办,C的函数都是传值调用,无法知道传进去的数是啥类型.
-
上午大概看一下眼,发现辛昕贴的程序完全和和事先给出的题意不搭界,还没来得及回贴,
下午辛昕又贴出了个修正版,觉得还是有问题,其实辛昕完全没有写出题目是啥,就开始编程序
所以我也无法给出辛昕写的程序到底对还是不对,从程序的流程来看,计算的结果是:
array[lenght-1]运算符(array[lenght-2]运算符[lenght-3])运算符.................
也就是 1.0-(2.0-3.0)-(4.0-5.0)-(6.0-7.0)-(8.0-9.0)-(10.0-11.0)
但是输出时为啥不这样写而输出成11.0-10.0+9.0-8.0........(尽管结果是一样的)
在上午的版本中,还考虑了输入个数的奇偶问题,下午的也消失了.
比如,如果是偶数个数时,结果是 1.0-2.0,而程序输出成了2.0-1.0 is -1.0了.
-
楼上的貌似答错题了,人家问得是2012年来了,你却回答是世界日如果来了(好象网上有好多卖船票的).
如果世界末日来了,我该干嘛干嘛
楼下的,你最爱看哪份报纸?
-
辛昕说得很对,是我又疏忽了,那我再出道题,编写一个类似memset的函数,能实现我们所想要的正确的结果?
-
那我想当然了,这样的话
memset(a,3,sizof(a));
应该没啥问题呀?
-
int a[8]; memset(a,0,sizeof(a));//如果你试过了这样写,查完内存单元你会回来骂我......是的,它没问题。它为什么没问题?瞎猫撞上死耗子。
--因为在很多的编译器实现中,会提前将内存清零,所以说只要不越界,人工清不清零,或部分清零,效果都是一样的.
--sizeof(a)是指组a的元素个数,而不是占用的字节数,要想实现编程者的本意,我觉得可这么写 sizeof(a) *sizeof(a[0],
如果嫌这样写烦,可以定义成宏,比如
#define SizeOf(x) sizeof(x)*sizeof(x[0])
这样
memset(a,0,SizeOf(a));//就OK了
[ 本帖最后由 能圈就圈 于 2012-1-10 15:21 编辑 ]
-
辛昕这个程序着实不短,这次我采用直接在原程序中加注的办法来挑刺,不然的话,实在不好对照/*practise 8.4*//*题目:定义一个函数,其参数是一个字符串,返回该字符串中的单词数。单词以空格或标点符号来分隔,假设字符串不含单双引号,也就是说不存在像isn't这样的词。定义第二个函数,它的第一个参数是一个字符串,第二个参数是一个数组,该函数将第一个字符串变元分割成单词,把这些单词存储在第二个数组变元中,最后返回这些单词。第三个函数,其参数是一个字符串,返回该字符串中的字母数。使用这些函数实现一个程序,从键盘读入含有文本的字符串,输出文本中的所有单词,输出顺序按照单词字母数由短到长。*//*关于 isalpha()*/#include#include#include#include#define increment 10#define WORDLEN 10int account(char *pstring); //统计词数void get_words(char pstring[],char* pwords[]); //拆分成词项,存入pwords[]int Get_length(char str[]);char** arrangement(char* pwords[],int);int main(void){int capacity = 20;int count = 0;char *pstring = NULL;char *temp = NULL;int words = 0;char **pwords = NULL;char **buffer = NULL;int position = 0;int number = 0;pstring = (char *)malloc(capacity * sizeof(char));printf(\"Enter a string:\n\");do{if(count == capacity){capacity += increment;temp = (char *)malloc(capacity * sizeof(char));if(!temp){printf(\"Allocation failed.\n\");return -1;}if(!pstring){for(int i = 0;i < count;i++)*(temp + i) = *(pstring + i);pstring = temp;free(temp);}}}while((*(pstring + count++) = getchar()) != '\n'); /*结束字符串*/*(pstring + count) = 0;/*统计词数*/words = account(pstring);/*根据词数分配数组容纳词数*/pwords = (char **)malloc(words * sizeof(char *));/*为每个词分配空间*/for(int n = 0; n < words;n++)pwords[n] = (char*)malloc(WORDLEN*sizeof(char));//当年的恶习,这个小写,我半天没看出原来是个宏//看来这个正确版本和那个错误版本都是我写的,不是参考答案get_words(pstring,pwords);pwords = arrangement(pwords,words);//圈注,这个地方也有点危险,象pwords这种由malloc赋值的指针,在free之前赋值都是隐患,尽管在这个地方是自己赋值给了自己//圈注,稳妥的写法还是 arrangement(pwords,words);/*这一部分属于一开始写程序时,一个阶段一个阶段检查已有结果时所用*//*结果最后忘了关闭测试。另外是,number先赋值为1,而在其后输出的时候*//*又用的先使用再加1,这种做法不好,所以我选择初始化为0,然后先加加再使用*/for(number = 0;number < words;number++)printf(\"%s\n\",pwords[number]);// number = 1;/*从题目出发,这一部分是没用的*//*但我忘记了打问号那一句的作用和意义*/buffer = (char **)malloc(words * sizeof(char *));buffer[0] = pwords[0];//?????for(int k = 1;k < words;k++){for(int j= 0;j <= position;j++) {if(!strcmp(buffer[j],pwords[k])) break; if(j == position && strcmp(buffer[j],pwords[k]))buffer[++position] = pwords[k]; }}/*看到这一部分,才会想起这是用来剔除重复的单词,所以上面的那个输出是用来测试是否读取正确的*//*但上述代码并未实现该功能*/for(int l = 0;l < position;l++)printf(\"%s\n\",buffer[l]);free(pwords);pwords = NULL;free(buffer);buffer = NULL;return 0;}int account(char *pstring){int count = 0;char flag = 0;int i = 0;/*for(unsigned int i = 0; i < strlen(pstring);i++) //过去我真的是干了太多这种事//圈注:象上边写的 i < strlen(pstring) ;从语法来看尽管没错,但是每判一次循环条件,就要调用一次 strlen(pstring)函数,
//大大增加了运行时的负担(尤其是对实时,嵌入式系统而言// 正确的方法是,将strlen(pstring)先赋值给某个临时变量,或者改为,for(i=strlen(pstring)-1;i>=0;)//过去,我一直以为是99和ansi的区别,但刚刚看的C和指针,//即应该把定义放在所有语句之前。//我怀疑我是不是弄错了?{if(!isalpha(*(pstring + i)) && isalpha(*(pstring + i + 1)) )count++;}if(isalpha(*(pstring)) )//????count++;*//*这种计数方法,使得这个程序弱不禁风*//*这样的输入就能让它报废:a big big, (space)de *//*合理的方法应该是按顺序遍历整个字符串,逢字母开始坐标志,隔了一个以上的非字母,再碰到字母,计数*//*充分考虑几种可能的输入情况:\" I am a big big girl\"\"I am a big big girl, in the big big world\"\"I am a big big girl.\"*/while(*(pstring + i) != '\0'){if(isalpha(*(pstring + i++))){if(!flag)flag = 1;}else{if(flag){count++;flag = 0;}}}//圈注,上边这段话明显有问题,具体分析我就不写了,下边改为正确的写法,对比一下.while(*(pstring + i) != '\0'){if(isalpha(*(pstring + i++))){if(!flag){flag = 1;count++;}}elseflag = 0;}//圈注,上边的flag=的1和0最好定义成一个有名字意义的宏,这样不容易搞错./*下面这一段居然是画蛇添足?!!*///if(isalpha(*(pstring+i)) && !flag)// count++;return count;}void get_words(char pstring[],char* pwords[]){int count = 0;int i = -1; //这里是为了配合后边的“先加再用”,让i从零开始,但是,赋值为-1是否有什么危险呢?int j = 0;/* while(pstring != '\0'){if(!isalpha(pstring)){i++;continue;}j = 0; while(isalpha(pstring))pwords[count][j++] = pstring[i++];pwords[count++][j] = '\0';}*/ /*原来的写法很蠢,其实可以while,不用if*//*改完了,花了半个小时修正,发现其实没进步多少,还是要两个循环变量*/while(pstring[++i] != '\0'){ if(isalpha(pstring))pwords[count][j++] = pstring;else if(j/*strlen(pwords[count])*/){ pwords[count++][j] = '\0';j = 0;}//printf(\"length of %d is %d\n\",count,strlen(pwords[count]));/*这里有个很奇怪的问题,为什么pwords[count]的长度总是17?????*/}}int Get_length(char str[]){int length = 0;while(str[length] != '\0')length++;return length;}char** arrangement(char* pwords[],int words){char* temp = NULL;temp = (char *)malloc(WORDLEN * sizeof(char));//圈注,上边这个temp只是用来临时交换 pwords[j] 和 pwords的指针变量,,这里却给它分配了WORDLEN字符变量的空间,简直是莫名其妙//char temp[WORDLEN];for(int i = 0;i < words;i++){for(int j = 0;j < words;j++){if(Get_length(pwords) < Get_length(pwords[j])){temp = pwords[j];//续前圈注,这里对temp赋值,把malloc分配给它的空间丢了,副作用是产生内存泄露,这也说明对temp分配空间毫无道理pwords[j] = pwords;pwords = temp;}}//free(temp);// = NULL;}//free(temp);return pwords;}
-
圈哥,我来告诉你真相吧,你不要吐血就成,其实事情很简单...... [/quote]
吐血是没有,因为还是没搞明白咋出来的那一堆反斜杆
[quote]因为在圈哥回的第四贴以前,我不知道该咋办......
这个地方也没搞明白,和回第四个贴子有啥关系?
来谈最后那个问题,既然是要编程序处理,当然是操作简单最为重要
辛昕的思路是对的,我来稍细化一下,在C里有个库函数(名字我记不清了,辛昕可以自己查一下),
能遍历指定文件夹的所有文件,这样可以将所有要处理的源程序拷到一个文件夹
2,3步可以合并,找到符合条件的行和修改放在一起.
这样流程图大体是这样
while(有需要处理的文件)
{
打开该文件;
while(读入一行)
{
调那个函数(判断并修改);
}
该文件处理完毕,存盘并关闭该文件;
}
当前文件夹的所有文件已处理完毕,提示并退出;
-
昨天回完这个贴子,已经12点,关于"之前那个莫名其妙的/,没予给更多的分析,只是简更的猜测是"排板或编译器的原因吗?"就去洗洗睡了.早上起来,又重新考虑了这个问题,觉得应该是这么一回事:这里似图情景再现一下哈:辛昕有一次在写程序时,需要输出类似这样一句话 这是一个".于是他敲下如一下段代码:printf("这是一个".\n"); //代码1结果,他发现编译出错,很正常,编译器把第二个(字符串里的)的"当成与第一个"匹配的字符串结束的那个"了当然,这难不倒辛昕同学,他把字符串的的"之前加了个转义符\,成为如下代码printf("这是一个\".\n");//代码2这时,得到了想要的结果,问题OK了,可是他又发现在程序里还有类似代码1那些的代码行.怎么办呢?一句句的修改,真够烦的.当然,这也难不倒辛昕同学,这是他又发现IDE(或者用的某个专业的编辑器)里不是有全部替换功能吗?于是,他将程序里所有的"替换成了\",这时,杯具了,不仅字符串里的"变成的\",前后那两个"也变成了\",出来这样的结果printf(\"这是一个\".\n\");//代码3当然,辛昕修改以后,会重新编译程序,当然,编译会出错,很快辛昕同学发现问题出在那了,他很懊悔(这时,我不知道他会用什么方法),修改了错误,最终问题解决了可是辛昕在替换当前文件里的"成\"时,误用了某种选项,将他的所有的C源程序(应该都是放在某个文件夹里)里,的"都替换成了\",然后辛昕干别的去了.写到这里,我突然意识到,辛昕同学目前的性格不适合去干某项维护服务器的工作(比如银行啥的),不然的话,你懂的哈.以上内容,纯属虚构,切勿对号入座哈.可是,到现在,我还有疑惑,辛昕同学在贴习题一时,我就发现这个问题("前总有个/,很刺激眼球,我当时就是不说,现在拿来救急了),辛昕自己怎么还是没注意呢?好了,辛昕同学出了这么多题,我也来出个题:编写一个函数,将 代码3 转成 代码2也就是字符串 printf(\"这是一个\".\n\");转换成字符串 printf("这是一个\".\n");写这样的一个函数很有现实意义,辛昕同学可以这个基础上写个程序.将以前修改坏了的那些源程序,一次全都改好.
-
呵呵,赞一个,的确是写得不错,可是还是有点疑问:
printf(\"Enter a integer you want to transform.\n\");
为啥"之前总有个反斜杆符\呢?
只要是这种地方,之前的习题一,二,三,四,貌似都有,
当时是放过了,现在只好提出来了:是排板或编译器的原因吗?
可是这个明显不符合C的语法,编译的时候也应该是通不过的呀
-
可是你应该问:为啥要加个L呢?不加不也一样吗?:lol
-
20L表示长整型数 20