gpt4 book ai didi

c - const 参数的目的不是避免错误

转载 作者:太空宇宙 更新时间:2023-11-04 00:34:29 25 4
gpt4 key购买 nike

<分区>

我正在使用仅支持 C90 的 keil C51 C 编译器对 8051 微 Controller 进行编程。

我想通过UART发送一个字节的数据,函数如下:

void Uart_send(char data){
//...
}

使用 1:

char a = 123;
Uart_send(a); //work great

使用 2:

Uart_send(123);//doesn't work, but no error or warning from compiler

在后一种情况下,发送了 1 个字节,但不是正确的值 (123)。

如果我将代码更改为:

void Uart_send(const char data){
//...
}

然后一切正常。

根据我的理解和互联网上的几个来源,“const”的唯一目的是防止函数更改其参数(换句话说,防止程序员错误地更改参数)。那为什么我的第二种方法不行呢?

编辑:这是我的完整代码:

串口.h

typedef struct {
char Buffer[10];
char *p;
char Ready;
void (*Load)(char Data);
void (*Transmit)();
void (*Flush)();
} _uart;
extern _uart UART;

串口.c

#include "UART.h"
#include <reg51.h>

#define EOF 0x00
/*
0000_0000: EOF
0000_0001: countdown
1xxx_xxxx: primary time set
1xxx_xxxx: secondary time set
0111_xxxx: set phase

*/
#define Wait() for(i = 0; i < 3; ++i)
void Load(const char Data){
*UART.p = Data;
if(Data == EOF){
UART.Ready = 1;
}
++UART.p;
}
void Transmit(){
int i;
char *p;
p = UART.Buffer;
while(1){
SBUF = *p;
while(~TI);
TI = 0;
Wait();//make sure slave finish process data before sending next byte
if(*p == EOF) break;//we are done
++p;
}
UART.Flush();
}
void Flush(){
UART.p = UART.Buffer;
UART.Ready = 0;
}
_uart UART = {
{EOF, EOF, EOF, EOF, EOF, EOF, EOF, EOF, EOF, EOF},
UART.Buffer, 0,
Load,
Transmit,
Flush
};

主.c

#include "UART.h"
//.....
UART.Load(123);
UART.Load(0x00); //0x00 = EOF
UART.Transmit();

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com