一个小函数引起的思考

var a = [];
for(var i = 0;i<10;i++){
	a[i] = function(){
		console.log(i)
	}
	a[0]()//0,1,2,3,4,5,6,7,8,9;console.log(a[i])
}
a[0]()//10

console.log(a[i])你会发现,打印出来的全部是function(){console.log(i)},也就是说在函数执行前,每个函数的i并没有解析

但是当在外面执行的时候,其实函数执行的时候i已经变成了10,当函数console.log(i)的时候i是10;那么你也许会问明明循环中已经定义好了a[6]= function(){console.log(6)}嘛,其实不是这样的,当在函数执行之前是不会读取函数体中的变量的,也就是说,循环了那么多次,定义了那么多的函数,函数体中的变量一直是i,只有在调用的时候才会寻找i的值

当在里面执行的时候,i是随着循环走的,每循环一次i就变化一次,所以在里面执行的时候函数中的i就是当前循环的i的值,这也就可以解释为什么在函数体内,a[0]()可以有那么多的值,因为还是上面的道理,当一次循环执行到a[0]()的时候,这个时候就开始为函数寻找函数里面的值到底是谁,结果自然而然就是当前循环的i的值嘛,当再一次接着循环的时候还是一样的道理.....

<think>好的,我现在要解决用户提到的Keil编译器中的警告“warning C209: '_delay': too few actual parameters”。首先,我需要理解这个警告的具体含义。这个警告通常出现在调用函数时实际传递的参数数量少于函数声明或定义时所需的参数数量。也就是说,用户在代码中调用了某个函数,但提供的参数不够,导致编译器报错。 接下来,我需要考虑可能的原因。首先,用户可能在调用函数时拼写错误,比如函数名错误,导致编译器找不到正确的函数声明,从而误判参数不足。其次,函数声明或定义中的参数列表与实际调用时的参数数量不一致,比如函数定义需要两个参数,但调用时只传了一个。另外,如果函数声明(比如头文件中的原型)和定义不一致,也可能引发此问题。还有一种可能是使用了过时的函数声明,特别是在使用旧版库或代码迁移时,函数参数可能发生了变化,但声明未更新。 然后,我需要一步步思考解决方案。首先,检查函数调用处的参数数量是否正确。比如用户提到的_delay函数,如果其定义是void _delay(unsigned int ms),那么调用时必须传入一个unsigned int类型的参数,如_delay(100)。如果用户写成_delay(),就会触发这个警告。 其次,核对函数声明和定义是否一致。如果头文件中的函数原型是void _delay(unsigned int ms);,而实现时参数类型或数量不同,比如void _delay(),就会导致不匹配。需要确保两者完全一致。 另外,检查是否有函数名拼写错误。例如,用户可能误写为_delay(),而正确的函数名可能是delay_,或者存在大小写错误,如Delay。这种情况下,编译器可能找不到正确函数,而假设一个隐式声明,导致参数不匹配的警告。 还需要考虑是否遗漏了必要的头文件。如果函数_delay是在某个头文件中声明的,但用户没有包含该头文件,编译器可能根据调用处的参数推测函数原型,如果后续链接时发现实际函数参数不同,就会报错。因此,确认包含正确的头文件很重要。 此外,如果使用了函数指针或宏定义,也可能导致类似问题。需要检查是否有宏替换改变了函数名或参数数量。例如,某个宏可能将_delay(ms)展开为其他函数调用,如果宏定义不正确,也可能引发参数错误。 最后,如果问题依旧存在,可能需要查看编译器文档或社区讨论,确认是否有已知的bug或特定配置问题。比如某些编译器选项可能影响函数参数的检查严格程度,调整这些选项可能解决问题,但通常不建议这样做,而应优先修正代码。 总结解决方案步骤:1.检查函数调用的参数数量;2.核对函数声明和定义的一致性;3.确认函数名拼写正确;4.包含必要的头文件;5.检查宏定义和函数指针的使用;6.查阅编译器文档或寻求社区支持。</think>### Keil编译器函数参数不足警告(C209)解决方案 当Keil编译器提示`warning C209: '_delay': too few actual parameters`时,表明函数调用时传入的参数数量少于函数定义或声明中要求的参数数量。以下是逐步排查和解决方法: --- #### **步骤1:检查函数调用的参数数量** - **问题示例**: ```c // 函数定义 void _delay(unsigned int ms) { /* ... */ } // 错误调用(缺少参数) _delay(); ``` - **解决方法**: 确保调用函数时传递的参数数量与定义一致。例如,若函数定义需要一个`unsigned int`参数,调用时应改为: ```c _delay(100); // 传入一个整数参数 ``` --- #### **步骤2:核对函数声明与定义的一致性** - **问题场景**: 函数在头文件中的**声明**与源文件中的**定义**参数不一致。 ```c // 头文件声明 void _delay(unsigned int ms, char mode); // 声明需要两个参数 // 源文件定义 void _delay(unsigned int ms) { /* ... */ } // 定义仅一个参数 ``` - **解决方法**: 统一声明和定义的参数列表,确保数量和类型完全匹配。 --- #### **步骤3:检查函数名拼写错误** - **问题原因**: 若函数名拼写错误(如`_delay`误写为`_dealy`),编译器可能因找不到正确函数而发出隐式声明警告,导致参数不匹配。 - **解决方法**: 仔细核对函数名,确保调用、声明、定义完全一致。 --- #### **步骤4:确认包含必要的头文件** - **问题场景**: 未包含函数声明的头文件,导致编译器隐式推断参数类型。 - **解决方法**: 在调用函数前,添加正确的头文件包含指令: ```c #include "delay.h" // 包含_delay函数的声明 ``` --- #### **步骤5:检查宏或条件编译干扰** - **问题示例**: 宏定义可能替换函数名或参数: ```c #define _delay() custom_delay(100) // 宏定义导致参数被固定 ``` - **解决方法**: 检查代码中是否有宏替换或条件编译(如`#ifdef`)干扰了函数调用。 --- #### **步骤6:查阅编译器文档或社区支持** 若上述步骤未解决问题,可参考以下资源: 1. **Keil官方文档**:查看[C209警告的详细说明](https://www.keil.com/support/man/docs/c51/c51_le_warningc209.htm)[^1]。 2. **社区讨论**:搜索类似案例,例如Stack Overflow上的[Keil参数传递问题](https://stackoverflow.com/questions/tagged/keil)。 --- ### 相关问题 1. **如何避免Keil编译器的隐式函数声明警告?** 答:始终在调用函数前声明或定义函数,并包含正确的头文件。 2. **Keil中函数名正确但仍报参数错误,可能是什么原因?** 答:检查是否因条件编译(如`#ifdef`)导致函数声明被跳过。 3. **如何调试Keil中的函数调用栈错误?** 答:使用调试器逐步执行代码,观察参数传递和函数跳转是否符合预期。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值