C 冲突类型数据定义没有类型或存储类[默认启用]类型默认为';int';
我在main.c文件中有一个名为slave_buffer的指针作为全局变量,如下所示:C 冲突类型数据定义没有类型或存储类[默认启用]类型默认为';int';,c,microcontroller,C,Microcontroller,我在main.c文件中有一个名为slave_buffer的指针作为全局变量,如下所示: l_u8 *slave_buffer = 0; slave_buffer = lld_response_buffer; slave_buffer[1] = 0x12; slave_buffer[2] = 0x34; 在我的主函数中,我将值放入缓冲区,如下所示: l_u8 *slave_buffer = 0; slave_buffer = lld_response_buffer; slave_buff
l_u8 *slave_buffer = 0;
slave_buffer = lld_response_buffer;
slave_buffer[1] = 0x12;
slave_buffer[2] = 0x34;
在我的主函数中,我将值放入缓冲区,如下所示:
l_u8 *slave_buffer = 0;
slave_buffer = lld_response_buffer;
slave_buffer[1] = 0x12;
slave_buffer[2] = 0x34;
我在另一个名为uart.c的源文件中声明并定义了lld_响应_缓冲区
extern l_u8 lld_response_buffer[10];
l_u8 lld_response_buffer[10];
我已经在主文件中包含了文件uart.c
但是当我构建我的项目时,我可以看到以下错误
conflicting types for 'slave_buffer' (data definition has no type or storage class [enabled by default] type defaults to 'int' in declaration of 'slave_buffer' [-Wimplicit-int]) initialization makes integer from pointer without a cast [enabled by default]
而下标值既不是数组,也不是指针,也不是向量
,在我将值放入slave_缓冲区的位置
以下是完整的main.c文件:
#include "derivative.h" include peripheral declarations
#include <stdio.h>
#include "uart.h"
#include "uart.c"
#define LED0_TOGGLE OUTPUT_TOGGLE(PORT_C,16)
#define LED0_OFF OUTPUT_CLEAR(PORT_C,16)
#define LED0_ON OUTPUT_SET(PORT_C,16)
/**********************************************************************************************
* Global variables
**********************************************************************************************/
l_u8 ret;
l_u8 i;
l_u8 LED_counter;
l_u8 *slave_buffer = 0;
slave_buffer = lld_response_buffer;
void application_timer_FTM0()
{
SIM_SCGC |= SIM_SCGC_FTM0_MASK;
FTM0_SC |= FTM_SC_PS(7);
FTM0_C0SC |= FTM_CnSC_CHIE_MASK;
FTM0_C0SC |= FTM_CnSC_MSA_MASK;
FTM0_C0V = FTM_CnV_VAL(391) ;
FTM0_SC |= FTM_SC_CLKS(1);
NVIC_ICPR |= 1 << ((INT_FTM0-16)%32);
NVIC_ISER |= 1 << ((INT_FTM0-16)%32);
}
void GPIO_Init()
{
CONFIG_PIN_AS_GPIO(PORT_C,16,OUTPUT);
LED0_OFF;
}
int main(void)
{
l_u8 i, ret;
l_u8 vector_number;
Clk_Init();
GPIO_Init();
ret = l_sys_init();
ret = l_ifc_init(LI0);
vector_number = INT_UART0 -16;
NVIC_ICPR |= 1 << (vector_number%32);
NVIC_ISER |= 1 << (vector_number%32);
application_timer_FTM0();
for(;;)
{
slave_buffer[0] = 2;
slave_buffer[1] = 0x12;
slave_buffer[2] = 0x34;
uart_tx_response();
}
return 0;
}
void FTM0_IRQHandler()
{
if (1==((FTM0_C0SC & FTM_CnSC_CHF_MASK)>>FTM_CnSC_CHF_SHIFT) )
{
(void)FTM0_C0SC;
FTM0_C0SC ^= FTM_CnSC_CHF_MASK;
FTM0_C0V = FTM0_C0V + 391 ;
if (LED_counter>=50){
LED0_TOGGLE;
LED_counter = 0;
}
LED_counter++;
}
}
uart.c文件中的一些函数中使用了*response\u buffer,这里有很多问题
l_u8 *response_buffer = 0;
extern l_u8 lld_response_buffer[10];
l_u8 lld_response_buffer[10];
response_buffer = lld_response_buffer;
- 首先,避免在所有地方使用带有
的通心粉。这是非常糟糕的做法,也是你所有问题的原因extern
- 如果您选择意大利面编程设计,那么至少
extern l_u8 lld_response_buffer[10]代码>需要在h文件中,而不是在c文件中
- 然后在文件范围中有一个赋值:
slave\u buffer=lld\u response\u buffer代码>。这不是初始化,因此不能将其放置在那里。不能在文件范围内执行代码,只能初始化变量
- 无论出于什么原因,都不应该包含c文件。这没有意义,会导致链接器错误
- 函数后的空括号是过时的样式。它不应该在C中使用(但在C++中可以使用)。它的意思是“这个函数接受任何参数,当您给它除void以外的任何参数时,它将愉快地崩溃”
extern
和包含的c文件。然后添加:
// in uart.h:
l_u8* get_response_buffer (void);
// in uart.c:
l_u8* get_response_buffer (void)
{
return lld_response_buffer;
}
在main中的函数中,添加slave_buffer=get_response_buffer()代码>。main.c仅包括“uart.h”
但如前所述,如果这是一个UART rx缓冲区,您不应该将其喷到整个程序中,1)因为它不属于整个程序,2)在访问缓冲区时,您很可能需要针对竞争条件实施保护机制,并且可能需要某种双缓冲。这需要在驱动程序内部实现,而不是在其他地方
确保所有头文件都有“头保护”这里有很多问题
- 首先,避免在所有地方使用带有
extern
的通心粉。这是非常糟糕的做法,也是你所有问题的原因
- 如果您选择意大利面编程设计,那么至少
extern l_u8 lld_response_buffer[10]代码>需要在h文件中,而不是在c文件中
- 然后在文件范围中有一个赋值:
slave\u buffer=lld\u response\u buffer代码>。这不是初始化,因此不能将其放置在那里。不能在文件范围内执行代码,只能初始化变量
- 无论出于什么原因,都不应该包含c文件。这没有意义,会导致链接器错误
- 函数后的空括号是过时的样式。它不应该在C中使用(但在C++中可以使用)。它的意思是“这个函数接受任何参数,当您给它除void以外的任何参数时,它将愉快地崩溃”
总体而言,设计需要从头开始重新进行。似乎您正在与全世界共享来自驱动程序的UART缓冲区。如果是这样,就不要这样做
要使当前程序使用快速修复程序(不推荐),应删除extern
和包含的c文件。然后添加:
// in uart.h:
l_u8* get_response_buffer (void);
// in uart.c:
l_u8* get_response_buffer (void)
{
return lld_response_buffer;
}
在main中的函数中,添加slave_buffer=get_response_buffer()代码>。main.c仅包括“uart.h”
但如前所述,如果这是一个UART rx缓冲区,您不应该将其喷到整个程序中,1)因为它不属于整个程序,2)在访问缓冲区时,您很可能需要针对竞争条件实施保护机制,并且可能需要某种双缓冲。这需要在驱动程序内部实现,而不是在其他地方
确保您的所有头文件都有“头保护”是的,问题已经解决,我的编译器现在没有错误。我定义了以下内容
l_u8 *slave_buffer = 0;
slave_buffer = lld_response_buffer;
在我的主函数中,而不是作为全局变量
这可以用一个小例子来解释
例如,考虑我的.C文件
#include <stdio.h>
#include "extern.h"
int x;
x=10;
int main()
{
print();
printf("\n X in the file extern_main.c is %d",x);
return 0;
}
编译main.c文件将产生与中所示相同的错误
如果在main函数中给x一个值,而不是全局定义它并全局初始化它,它将不会抛出错误,如下所示
#include <stdio.h>
#include "extern.c"
void print();
int main()
{
int x;
x=10;
print();
printf("\n X in the file extern_main.c is %d",x);
return 0;
}
是的,问题解决了,我的编译器现在没有错误了。我定义了以下内容
l_u8 *slave_buffer = 0;
slave_buffer = lld_response_buffer;
在我的主函数中,而不是作为全局变量
这可以用一个小例子来解释
例如,考虑我的.C文件
#include <stdio.h>
#include "extern.h"
int x;
x=10;
int main()
{
print();
printf("\n X in the file extern_main.c is %d",x);
return 0;
}
编译main.c文件将产生与中所示相同的错误
如果在main函数中给x一个值,而不是全局定义它并全局初始化它,它将不会抛出错误,如下所示
#include <stdio.h>
#include "extern.c"
void print();
int main()
{
int x;
x=10;
print();
printf("\n X in the file extern_main.c is %d",x);
return 0;
}
请提供一个重新创建相同错误消息的。注意单词complete。这意味着示例必须按原样编译,并且只给出与您询问的相同的错误消息。数组不是指针。在一个地方,你说它是一个数组;在一个地方,你说它是一个指针。尽管它们密切相关,但它们并不相同。这会引起危险信号:“我已经在主文件中包含了文件uart.c。”通常只包含标题,.c
源文件单独编译,生成的目标文件链接在一起