标题:这个错在哪里??
只看楼主
施熠
Rank: 2
来 自:南京
等 级:论坛游民
帖 子:69
专家分:29
注 册:2012-2-4
结帖率:100%
已结贴  问题点数:20 回复次数:7 
这个错在哪里??
#include "stdio.h"
void printchars(char,int);
void mian()
{
    int i;
    for(i=1;i<=20;i++)
    {
        printchars(" ",20+i);
        printchars("*",2*(21-i)-i);
        printf("\n");
    }
}
void printchars(char c,int n)
{
    int i;
    for(i=1;i<=n;i++)
    putchars(c);
}
搜索更多相关主题的帖子: void include 
2012-03-22 16:41
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:10 
你好像学了不少时间,看来没什么进步。平时都学什么去了?

授人以渔,不授人以鱼。
2012-03-22 16:45
施熠
Rank: 2
来 自:南京
等 级:论坛游民
帖 子:69
专家分:29
注 册:2012-2-4
得分:0 
回复 2楼 TonyDeng
我在上学,而且不是电脑专业的,所以平时很少有太多时间去看C语言,只有在上课时,才能很好的学习C语言
2012-03-22 16:48
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
你这里有两个问题需要学习,你愿意学就照着我说的做吧:
1.编程必须一定懂得看编译报告,把编译器给你的错误信息或警告信息抄出来,教你看。
2.学会替换代码分析问题,你做完第一步后再告诉你。

授人以渔,不授人以鱼。
2012-03-22 16:52
feng1990
Rank: 2
等 级:论坛游民
帖 子:5
专家分:26
注 册:2010-8-28
得分:10 
#include "stdio.h"
void printchars(char,int);
int  main()
{
    int i;
    for(i=1;i<=20;i++)
    {
        printchars(' ',20+i);
        printchars('*',2*(21-i)-i);
        printf("\n");
    }
    return 0;
}
void printchars(char c,int n)
{
    int i;
    for(i=1;i<=n;i++)
    putchar(c);
}
2012-03-22 16:53
施熠
Rank: 2
来 自:南京
等 级:论坛游民
帖 子:69
专家分:29
注 册:2012-2-4
得分:0 
回复 4楼 TonyDeng
哦哦,我知道了。。但是,怎么替换???
2012-03-25 22:22
施熠
Rank: 2
来 自:南京
等 级:论坛游民
帖 子:69
专家分:29
注 册:2012-2-4
得分:0 
回复 5楼 feng1990
谢谢
2012-03-25 22:23
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
以下是引用施熠在2012-3-25 22:22:59的发言:

哦哦,我知道了。。但是,怎么替换???

现在模仿编译器的操作:

首先它找到函数原型,就是如下这个
void printchars(char,int);
根据这样的声明,它知道每当要调用函数时,将依据什么来检查。

然后下面是你的调用代码:
printchars(" ",20+i);
printchars("*",2*(21-i)-i);

对每一个参数,都要比较,把" "和"*"代入到(char,int)中的char位置,很明显,函数定义指定要求char,但你传入的是字符串char*(双引号是字符串,单引号是字符),不符合要求,因此编译器拒绝这样的调用,指出错误,停止编译。这样开头错误,导致后面的一系列代码都跟着受影响,因此,后面的错误信息你基本上不用看了,先解决这个,因为后面的错误或警告信息,很可能是这个引起的。解决这个之后,后面如果还有错误或警告,就依次从前面开始解决,直到没有任何错误和警告为止。

这就类似于数学中的代入法,“代数”是代表某些实际数值,诸如F=ma这样的,表示F和ma是等价的,在出现F的地方,可以把F替换为ma。编程也一样。比如在你这个程序中,如果使用printf("%s", printchars('*', 20+i))这样的调用代码,也是如此替换,你会看到printchars()函数返回的是void,与printf()要求的char*不符,因此也是错的,如果希望要写出那样的调用代码,就必须把printchars()函数的定义写成返回char*而不是void。

授人以渔,不授人以鱼。
2012-03-25 22:36



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-363990-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.122076 second(s), 7 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved