Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 冲突类型数据定义没有类型或存储类[默认启用]类型默认为';int';_C_Microcontroller - Fatal编程技术网

C 冲突类型数据定义没有类型或存储类[默认启用]类型默认为';int';

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

我在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_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以外的任何参数时,它将愉快地崩溃”

总体而言,设计需要从头开始重新进行。似乎您正在与全世界共享来自驱动程序的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)在访问缓冲区时,您很可能需要针对竞争条件实施保护机制,并且可能需要某种双缓冲。这需要在驱动程序内部实现,而不是在其他地方


确保所有头文件都有“头保护”

这里有很多问题

  • 首先,避免在所有地方使用带有
    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
源文件单独编译,生成的目标文件链接在一起