24-Prototype

 
     Prototype(原型模式):用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

     该模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。

由于Java提供clone()方法来实现对象的克隆,所以Prototype模式实现一下子变得很简单,具体可以查看参考.此外,还可以应用反射机制来实现之(教材中就是这样).

 

 

<think> 根据错误信息,问题在于函数原型声明缺失或不正确。具体来说: 1. 编译器在调用`ds18b20_read_temp`和`delay_ms`函数之前没有看到它们的原型声明 2. 错误C267表明函数`delay_ms`需要ANSI风格的原型(即带有参数类型的声明) 在C51中,函数在使用前必须进行声明,否则编译器会假设它返回int类型且参数数量可变(K&R风格)。但现代C标准要求使用函数原型(ANSI风格),即指定参数类型。 解决方案: 1. 确保所有函数在使用前都有正确的函数原型声明 2. 在文件顶部或头文件中声明函数原型 ### 修正步骤 #### 1. 添加缺失的函数原型 在文件开头,确保所有函数都有正确的原型声明。例如: ```c // 函数原型声明 float ds18b20_read_temp(void); // 注意:如果没有参数,应明确写void void delay_ms(unsigned int ms); // 带参数类型的声明 ``` #### 2. 修改现有函数声明 如果函数声明是旧式(K&R风格),改为ANSI风格。 错误示例(K&R风格): ```c void delay_ms(ms) unsigned int ms; { // 函数体 } ``` 正确示例(ANSI风格): ```c void delay_ms(unsigned int ms) { // 函数体 } ``` ### 完整修正代码示例 ```c #include <STC8A8K64S4A12.h> #include <intrins.h> // ...(引脚定义和其他宏)... // 函数原型声明 (ANSI风格) void delay_us(unsigned int us); void delay_ms(unsigned int ms); void lcd_write_cmd(unsigned char cmd); void lcd_write_data(unsigned char dat); void lcd_init(void); void lcd_display_str(unsigned char x, unsigned char y, char *str); bit ds18b20_init(void); void ds18b20_write_byte(unsigned char dat); unsigned char ds18b20_read_byte(void); float ds18b20_read_temp(void); // 明确声明为void参数 // ... 其他函数原型 ... // 全局变量声明... void main(void) { // ... 主函数代码 ... } // 函数定义 void delay_ms(unsigned int ms) { // 函数实现... } float ds18b20_read_temp(void) { // 函数实现... } // 其他函数定义... ``` ### 关键点说明 1. **函数原型声明**: - 在调用函数之前,必须提供函数原型 - 原型应包含返回类型、函数名和参数类型 - 如果没有参数,使用`void`明确表示 2. **ANSI风格函数定义**: ```c // 正确:ANSI风格 void delay_ms(unsigned int ms) { // ... } // 错误:K&R风格(会导致C267错误) void delay_ms(ms) unsigned int ms; { // ... } ``` 3. **常见函数原型示例**: ```c // 无参数函数 void lcd_init(void); // 带参数函数 void lcd_display_str(unsigned char x, unsigned char y, char *str); // 返回位类型的函数(C51特有) bit ds18b20_init(void); ``` ### 完整函数实现示例 ```c // 毫秒级延时函数实现 void delay_ms(unsigned int ms) { unsigned int i, j; for (i = 0; i < ms; i++) for (j = 0; j < 113; j++); // 根据主频调整循环次数 } // DS18B20读取温度函数实现 float ds18b20_read_temp(void) { // ... 实现代码 ... return temperature; } ``` ### 其他注意事项 1. **中断函数**: ```c // 中断函数不需要在外部声明,但定义必须正确 void Timer0_ISR(void) interrupt 1 { // ... } ``` 2. **静态函数**: - 如果函数只在当前文件使用,可以声明为`static`,避免与其他文件中的函数名冲突 - 静态函数也需要在使用前声明 ```c static void internal_function(void); // 文件内可见的函数原型 ``` 3. **头文件**: - 如果项目有多个源文件,将函数原型放在头文件中 - 在源文件中包含对应的头文件 ```c // 在my_lcd.h中声明 void lcd_init(void); void lcd_display_str(unsigned char x, unsigned char y, char *str); // 在源文件中包含 #include "my_lcd.h" ``` ### 错误修正总结 1. 错误:`missing function-prototype` - 原因:函数在使用前没有声明 - 解决:添加正确的函数原型声明 2. 错误:`requires ANSI-style prototype` - 原因:函数定义是K&R风格,或者函数原型未指定参数类型 - 解决:使用ANSI风格定义函数,并在原型中明确参数类型 通过以上修改,您的代码应该能够通过编译。如果还有其他函数报类似错误,请检查并添加所有函数的正确原型声明。 §§相关问题§§: 1. ANSI C函数原型和K&R风格函数声明的主要区别是什么? 2. 在C语言中,为什么在使用函数前需要声明函数原型? 3. 如何组织大型嵌入式项目的头文件和函数声明? 4. C51编译器对函数声明和定义有哪些特殊要求? </think>根据您提供的错误信息,问题主要集中在函数原型声明上: ``` WENDUJIANKONG.C(16): warning C206: 'ds18b20_read_temp': missing function-prototype WENDUJIANKONG.C(41): warning C206: 'delay_ms': missing function-prototype WENDUJIANKONG.C(41): error C267: 'delay_ms': requires ANSI-style prototype ``` 这些错误表明编译器在调用函数之前没有找到正确的函数原型声明。让我提供完整的解决方案。 ### 问题分析与解决方案 #### 问题1: 缺少函数原型声明 - **警告 C206**: 表示函数在使用前没有声明原型 - **错误 C267**: 表示函数需要ANSI风格的原型声明(带参数类型) #### 解决方案: 1. 为所有函数添加ANSI风格的原型声明 2. 确保函数声明在使用前 3. 使用`void`明确表示无参数函数 ### 完整修正代码 ```c #include <STC8A8K64S4A12.h> #include <intrins.h> // LCD1602引脚定义 // ...(保持原有的引脚定义不变)... // 函数原型声明(ANSI风格) void delay_us(unsigned int us); void delay_ms(unsigned int ms); void lcd_write_cmd(unsigned char cmd); void lcd_write_data(unsigned char dat); void lcd_init(void); void lcd_display_str(unsigned char x, unsigned char y, char *str); bit ds18b20_init(void); void ds18b20_write_byte(unsigned char dat); unsigned char ds18b20_read_byte(void); float ds18b20_read_temp(void); // 注意使用void表示无参数 void System_Init(void); void Read_Temperature(void); void Motor_Control(void); void Key_Process(void); void Alarm_Check(void); void Display_Info(void); void Save_Threshold(void); void Read_Threshold(void); void I2C_Delay(void); void I2C_Start(void); void I2C_Stop(void); void I2C_SendByte(unsigned char dat); unsigned char I2C_RecvByte(void); void I2C_Ack(bit ack); void AT24C01_WriteByte(unsigned char addr, unsigned char dat); unsigned char AT24C01_ReadByte(unsigned char addr); void PCF8563_WriteByte(unsigned char addr, unsigned char dat); unsigned char PCF8563_ReadByte(unsigned char addr); void PCF8563_Init(void); void PCF8563_ReadTime(void); void PCF8563_SetTime(unsigned char h, unsigned char m, unsigned char s); // 全局变量声明 // ...(保持原有的全局变量声明不变)... // 主函数 void main(void) { // 明确使用void表示无参数 System_Init(); Read_Threshold(); while(1) { // ...主循环代码... } } // 函数实现 void delay_us(unsigned int us) { while (us--) { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } } void delay_ms(unsigned int ms) { unsigned int i, j; for (i = 0; i < ms; i++) for (j = 0; j < 113; j++); } // DS18B20读取温度函数 float ds18b20_read_temp(void) { // 使用void表示无参数 // ...函数实现... } // 其他函数实现保持不变... ``` ### 关键修正点说明 #### 1. 完整的函数原型声明 ```c // 正确:ANSI风格声明 float ds18b20_read_temp(void); // 使用void明确表示无参数 void delay_ms(unsigned int ms); // 带参数类型的声明 // 错误:缺少参数类型或void声明 float ds18b20_read_temp(); // 旧式声明,可能引发警告 void delay_ms(); // 会导致C267错误 ``` #### 2. 函数定义中的void使用 ```c // 正确 float ds18b20_read_temp(void) { // 函数体 } // 错误(可能导致问题) float ds18b20_read_temp() { // 函数体 } ``` #### 3. 主函数声明 ```c // 正确 void main(void) { // ... } // 不推荐 void main() { // ... } ``` ### 常见问题解决 #### 问题:为什么需要函数原型声明? 1. **类型检查**:帮助编译器检查函数调用是否正确 2. **参数转换**:确保参数正确传递 3. **代码组织**:提高代码可读性和可维护性 #### 问题:何时需要函数原型声明? 1. 当函数定义在调用点之后 2. 当函数在另一个源文件中定义 3. 当使用函数指针时 ### 完整函数声明最佳实践 #### 创建头文件(推荐) 创建`wendingjiangkong.h`头文件: ```c // wendingjiangkong.h #ifndef WENDONGJIANKONG_H #define WENDONGJIANKONG_H #include <STC8A8K64S4A12.h> #include <intrins.h> // 引脚定义 // ... // 函数原型声明 void delay_us(unsigned int us); void delay_ms(unsigned int ms); float ds18b20_read_temp(void); // 其他函数声明... #endif ``` #### 在源文件中包含头文件 ```c // wendingjiangkong.c #include "wendingjiangkong.h" // 函数实现 void delay_ms(unsigned int ms) { // 实现 } float ds18b20_read_temp(void) { // 实现 } ``` ### 其他注意事项 1. **中断函数声明**: ```c // 定时器0中断服务函数 void Timer0_ISR(void) interrupt 1 { // 中断处理代码 } ``` 2. **静态函数**: ```c // 文件内可见的静态函数 static void internal_function(void) { // 只能在本文件中调用 } ``` 3. **外部函数声明**: ```c // 声明在其他文件中定义的函数 extern void external_function(void); ``` ### 错误修正总结 1. **警告 C206**:通过添加正确的函数原型声明解决 2. **错误 C267**:确保所有函数声明使用ANSI风格(带参数类型) 3. **良好实践**:使用`void`明确表示无参数函数 4. **代码组织**:使用头文件管理函数声明 这些修改应该能解决您遇到的编译错误。如果还有特定函数的警告或错误,请提供相关代码片段,我可以给出更具体的建议。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值