【问题标题】:function contains unnamed parameter函数包含未命名参数
【发布时间】:2016-10-17 08:13:38
【问题描述】:

我是一个新程序员,我的程序是关于点亮 LED 的,可能是 C 语言中最简单的,但它总是有 _'Delay10ms':function contains unnamed parameter,希望有人帮我解决它。 这是我的话:

#include<reg51.h>
#include<intrins.h>
#define GPIO_LED P2

void Delay10ms(unsigned char time)
{
    unsigned char i,j;
    for(i=1;i<110*time;i++)
       for(j=1;j<110;j++);
}

void main()
{
    unsigned char n,i,j;
    GPIO_LED=0X01;
    while(1)
    {
        for(n=0;n<7;n++)
        {
            GPIO_LED=_crol_(GPIO_LED,1);
            Delay10ms(50);
        }

        for(n=0;n<7;n++)
        {
            GPIO_LED=_cror_(GPIO_LED,1);
            Delay10ms(50);
        }
    }
}

【问题讨论】:

  • 你为什么使用char作为你的变量?
  • 如果你在编程 C,为什么你有 C++ 标签?尽管有一些共同的语法,但 C 和 C++ 是非常不同的语言。

标签: c++ c keil


【解决方案1】:

&lt;reg51.h&gt;&lt;intrins.h&gt; 可能包含标准库。其中一个库包含标准头函数time(),它返回当前系统时间。因为您的函数参数的名称是time,IDE 可能无法弄清楚您对它的含义,因此它会为您提供错误/警告。尝试重命名您的变量。

另外,main() 的返回类型从来都不是void (C++),请使用int

【讨论】:

  • C 标准允许 main 的返回类型为 void。在这种情况下肯定是正确的。
  • @2501 对,我将这个问题作为 C++ 问题回答,因为它有 C++ 标签。
  • time 作为参数并在函数体中使用与time() 完全消除歧义。 time 参数优先于time() 函数(函数体中不能再使用time() 函数)。 - C 语言。
  • @2501 在当前 C11 版本的 C 标准 main (我的重点)具有返回类型 intstackoverflow.com/a/18721336/646887
  • @MartinBonner 当然。当前的 C 标准,5.1.2.2.1 §1 或以其他一些实现定义的方式。。使用 void main 在微控制器中很常见:electronics.stackexchange.com/questions/55767/… 这涵盖了您问题的理论和实践部分。
【解决方案2】:

很久没玩c了,不过你的代码看起来不错,可能是名字冲突(“时间”)

但还有一些问题: - 为什么你使用 char (unsigned char = 0..255) 而不是经典的 int?这将使代码更具可读性。 - 您认为您的计时器在多任务操作系统上的可靠性如何?

我会实现这样一个功能(如果它不存在)

void MyDelay (unsigned int delay_time)
{    
    start = MyOs.GiveMeTheTime()
    while (MyOs.GiveMeTheTime() - start < delay_time)
    {};
}

MyOs 和 GiveMeTheTime 是我选择的名称。您必须找出您的系统上有哪些功能可用,我敢肯定,它们是可用的。

我想,您尝试编写任何类似树莓派的程序。也许这个链接可以帮助:

Example Which Provides Accurate uS Timing

【讨论】:

  • 这并没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker。 - From Review
  • @Hayt:对不起,为什么答案不适合这个问题?可能的错误是名称冲突。这种方式在多任务系统上不可靠,有一个例子,如何避免这种情况。什么与问题不符?
  • @am2 这是一个答案,但可能是一个不好的(而且没有用)答案-您指出的错误只是一个猜测(reg51.h 或 @987654330 中可能没有time @ (如果你想检查,你可以在谷歌上找到它们)),你提出的解决方法在这里可能不合适,因为 OP 的代码针对微控制器,可能没有操作系统,其中“循环”是“标准”方式延迟(如果没有操作系统,则不能依赖基于操作系统的功能)。
  • @Holt:猜测,当然,你只能猜测,如果有那么多信息?代码的语法是正确的,不是吗?我不知道您使用哪种微控制器,但我所知道的至少有一个计时器和库,例如 f.e.阿杜伊诺playground.arduino.cc/Code/ElapsedMillis。他们中的任何一个都有一个操作系统,f.e.覆盆子,odroid ...在我看来,通过循环执行此操作是完全错误的方法。随心所欲,但如果其他人可能有自己的经历,那就太好了。
  • @am2 这个问题缺少信息,这是肯定的,但如果是这种情况,您应该发表评论询问更多细节,而不是“猜测”答案。我从不说带有定时器库的微控制器不存在——但那些没有的也存在。你不能假设因为 RPi / Odroid / Arduino 捆绑了很多东西(硬件和软件),所以每个微控制器也有这些。就拿基于 Cortex-M3 的 STM32 来说吧,这些都被广泛使用(在工业上),直到去年,唯一的处理方法是循环,即使是现在,你也不得不依赖定时器而不是简单的系统时钟.
猜你喜欢
  • 2016-07-26
  • 1970-01-01
  • 2010-09-29
  • 2022-11-14
  • 2021-10-19
  • 2023-04-04
  • 1970-01-01
  • 2015-03-27
  • 1970-01-01
相关资源
最近更新 更多