amobbs.com 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
12
返回列表 发新帖
楼主: 习学发开

开一贴专门答疑C语言问题

  [复制链接]
(4107486)
发表于 2020-4-11 09:41:24 | 显示全部楼层
liansh2002 发表于 2020-4-10 09:05
半精度浮点数,也是IEEE标准格式,某次客户要求使用此格式通讯,折腾了好久。参考一下页面,有详细解释以 ...

OKOK,谢谢谢谢,一直没有找到合适的解决方法
(4056197)
发表于 2020-4-11 23:56:13 来自手机 | 显示全部楼层
太难了,,,
(3937547)
发表于 2020-4-13 08:53:43 来自手机 | 显示全部楼层
追随妹子学习C语言
(3546926)
发表于 2020-4-17 21:24:04 来自手机 | 显示全部楼层
[fly]      感谢分享! [/fly]
(3322236)
发表于 2020-4-20 11:48:54 | 显示全部楼层
#define HOST_IP         "192.168.1.23"
#define HOST_PORT       3456


src\main.cpp:37:25: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
#define HOST_IP         "192.168.1.23"
                         ^
src\main.cpp:66:14: note: in expansion of macro 'HOST_IP'
char* host = HOST_IP;
              ^

这个警告怎么消除?
(3133354)
发表于 2020-4-22 16:16:56 | 显示全部楼层
# define    #和define之间有空格 代表什么意思
(3048573)
发表于 2020-4-23 15:49:57 | 显示全部楼层
你们C语言考多少分
(3045436)
发表于 2020-4-23 16:42:14 | 显示全部楼层
本帖最后由 amenty 于 2020-4-23 16:55 编辑
liu672992381 发表于 2020-3-15 12:56
定义64个位的结构体,这也太麻烦了。前面的我看懂了,但到了这一句不太懂,麻烦再解答一下。
_64bit_type ...


我记得飞思卡尔官方库里有那种专门操作寄存器每一位的宏定义函数?
说的不明白不好意思,我是硬转软,有点不专业。


#include <stdio.h>

long int a=0x1122334455667788;

int iReadBit(int i,int j)
{
    return (a>>((i-1)*8+j-1))&0x01;
}

int main()
{

   
    int iResult = 0;
    iResult = iReadBit(1,4);
    printf("第一字节,第四位的值:%d",iResult);
   
}

自己写了一个,应该没啥问题,数组也是连续存储的,在内存里和长整型应该没区别吧
(2902617)
发表于 2020-4-25 08:22:33 | 显示全部楼层
huy666 发表于 2020-4-20 11:48
#define HOST_IP         "192.168.1.23"
#define HOST_PORT       3456


        编译器警告说这种用法已经被废弃了,不推荐将 char* 直接指向字符串常量。废弃的原因是字符串常量一般会被编译器编译到代码段,而这个 char* host = "xxx"; 会将数据段的指针指向代码段,这样做是不安全的,无意间可能会修改了代码段的内容,而导致程序崩溃。
        可以先在数据中使用  char host[16] = {0}; 开辟一块内存区域,然后使用sprintf()将这个常量字符串复制到 host 字符数组中。
(2901793)
发表于 2020-4-25 08:36:17 | 显示全部楼层
本帖最后由 Tekin 于 2020-4-25 08:38 编辑
oooios 发表于 2020-4-11 08:41
异步回调普及下?

       异步回调需要先将你自己定义的回调函数注册到操作系统中,并告知操作系统这个回调函数的触发条件,这个注册的作用是将你自定义的这个回调函数的函数指针放到操作系统内部的一个列表中。      
      操作系统本质上是一个无限循环,它会不停地轮询查看各种异步事件(比如外部中断、串口中断、定时器中断等等),当操作系统发现你这个注册的回调函数需求的事件发生时(比如收到串口数据中断),它就会取出列表中的这个对应的函数指针,然后在操作系统层面调用你这个函数运行。当你这个回调函数运行完成之后,程序执行流程又回到操作系统,继续无限循环。
(2892723)
发表于 2020-4-25 11:07:27 | 显示全部楼层
tim4146 发表于 2020-4-8 09:39
在编程过程中,包含了某个.h文件后,就可以使用bool这个变量类型,但是查不到bool这个类型是哪里定义的,我 ...

      可以使用文件搜索搜一下这个 .h 文件在哪里,然后直接用文本编辑器打开看就行了啊。
      不过一般 bool 变量都不会真的用一个 bit 去存储,常用的是用本芯片对应的最短 int 类型。因为即便是最简单的8位单片机,它每条指令也可以一次操作一个字节的数据,没必要再用1个 bit 去处理,若是专门去处理1个 bit 还要用到移位等指令,反而更慢。除非是那种 RAM 资源及其紧张的情况,又或者这款单片机有专门优化过的针对位操作的指令,才会用 bit 来定义 bool 类型。
(2711803)
发表于 2020-4-27 13:22:47 | 显示全部楼层
有没有什么软件可以自动格式化C语言代码,就像go fmt那样?
(2700541)
发表于 2020-4-27 16:30:29 | 显示全部楼层
可用 vscode 加各种C语言插件吧……
(2338310)
发表于 2020-5-1 21:07:40 | 显示全部楼层
可以发布一个通用的单片机框架,类似rthread,就好了。
(2300207)
发表于 2020-5-2 07:42:43 | 显示全部楼层
谢谢!!!!
福利贴阿
(2268103)
发表于 2020-5-2 16:37:47 | 显示全部楼层
本帖最后由 interstellar_tr 于 2020-5-2 17:28 编辑

请教您一个 lwip里面的一个发送数据的问题,

使用lwip发送一个数组,  unsigned char hex_data[] ={0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x10};, 可以发送成功   也可以接收成功

但是如果在 hex_data[] 中增加一个0x00, unsigned char hex_data[] ={0x1, 0x2, 0x3, 0x4, 0x5, 0x00, 0x6, 0x7, 0x8, 0x9, 0x10};   只发送出去了0x1, 0x2, 0x3, 0x4, 0x5,后面的0x00, 0x6, 0x7, 0x8, 0x9, 0x10 没有发送出去

发送的相关代码如下: (相关函数原型在下面)
es->p=pbuf_alloc(PBUF_TRANSPORT, strlen((char*)hex_data),PBUF_POOL);       
pbuf_take(es->p,hex_data,strlen((char*)hex_data));
tcp_client_senddata(tpcb,es); //发送


问题:
1)字符串是以'\0'为结尾标志的,  hex_data[] 出现了0x00,是不是就认为到了结尾,而后面的数据没有发送出去?
2)怎么把 hex_data[]中0x00 后面的内容都发出去?
3)如过有一个数据结构,比如下面的变量 low_t ,怎么样把这个变量low_t变成字符串发送出去 ? ;



volatile low_type  low_t;

typedef struct  //   
{
    unsigned char _indicator_light ;    //
    unsigned char _light_belt      ;    //
}light_type;

typedef struct    //
{
        unsigned short   _status_low_pnp_push            ;/
        light_type       _order_low_light[2]             ;
        unsigned short   _status_laoyice_input[2]    ;             
}low_type;


%%%%%%%%%%%%%%%%%%%%%%%%%下面是相关函数原型%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
相关函数的原型如下
pbuf_alloc(pbuf_layer layer, u16_t length, pbuf_type type)
pbuf_take(struct pbuf *buf, const void *dataptr, u16_t len)

typedef enum {
  PBUF_TRANSPORT,
  PBUF_IP,
  PBUF_LINK,
  PBUF_RAW
} pbuf_layer;

typedef enum {
  PBUF_RAM, /* pbuf data is stored in RAM */
  PBUF_ROM, /* pbuf data is stored in ROM */
  PBUF_REF, /* pbuf comes from the pbuf pool */
  PBUF_POOL /* pbuf payload refers to RAM */
} pbuf_type;

struct tcp_client_struct
{
        u8 state;               //
        struct tcp_pcb *pcb;    //
        struct pbuf *p;         //
};

struct pbuf {
  struct pbuf *next;
  void *payload;
  u16_t tot_len;

  u16_t len;
  u8_t /*pbuf_type*/ type;

  u8_t flags;
  u16_t ref;
};

struct tcp_client_struct *es;
(2168506)
发表于 2020-5-3 20:17:44 | 显示全部楼层
hi40t1 发表于 2020-4-27 13:22
有没有什么软件可以自动格式化C语言代码,就像go fmt那样?

      indent
(2168326)
发表于 2020-5-3 20:20:44 | 显示全部楼层
1)字符串是以'\0'为结尾标志的,  hex_data[] 出现了0x00,是不是就认为到了结尾,而后面的数据没有发送出去?
     是
2)怎么把 hex_data[]中0x00 后面的内容都发出去?
   不要strlen,用sizeof
3)如过有一个数据结构,比如下面的变量 low_t ,怎么样把这个变量low_t变成字符串发送出去 ? ;
   强转(unsigned char *)lowt_t + 长度 (sizeof(low_t))
(2120011)
发表于 2020-5-4 09:45:59 | 显示全部楼层
wgainn 发表于 2020-5-3 20:20
1)字符串是以'\0'为结尾标志的,  hex_data[] 出现了0x00,是不是就认为到了结尾,而后面的数据没有发送出 ...

非常感谢!

五一假期快乐!
(1854051)
发表于 2020-5-7 11:38:39 | 显示全部楼层
有人指导答疑,太好了
(563981)
发表于 6 天前 | 显示全部楼层
带返回值的宏如何定义?
1)编译器IAR,芯片M0

代码功能大致如下: channel是一个ADC的通道,相当于函数里的形参,需要返回ADC->RESULT
使用函数很容易。

下面的代码只是表达我的意思,当然是不正确的。
(ADC->CR0,ADC->ICR,ADC->SGLSTART ,ADC->IFR_f.SGLIF,ADC->RESULT是单片机寄存器)

#define Test(channel)             \
{ADC->CR0 = (channel<<4) ; \
  ADC->ICR = 0;                       \
  ADC->SGLSTART = 1u;                      \
  while(0 == ADC->IFR_f.SGLIF);          \
return ADC->RESULT;                          \
}
(464008)
发表于 5 天前 | 显示全部楼层
zhikunWang 发表于 2020-5-22 09:59
带返回值的宏如何定义?
1)编译器IAR,芯片M0

C语言的如果要宏给出一个值,那么宏一定要是一个表达式(只有表达式才有值,语句或语句块是没有值的)。
像你这个需要在宏中运行这么多语句并且需要返回值的,可以使用 inline 内联函数来完成。
(461865)
发表于 5 天前 | 显示全部楼层
Tekin 发表于 2020-5-23 13:46
C语言的如果要宏给出一个值,那么宏一定要是一个表达式(只有表达式才有值,语句或语句块是没有值的)。
...

编译器需要开启C++才能支持内联函数,有些编译器还不支持C++。
C语言里基本只有三元运算符在宏里能返回值了: a>b?a:b
哎,我期望前面再执行几句话再返回值
(452262)
发表于 5 天前 | 显示全部楼层
本帖最后由 Tekin 于 2020-5-23 17:04 编辑

如果编译器不支持inline,那只能用变通的方法了,在语句块中将这个要读出的值赋值给一个全局或局部中间变量,然后再从这个中间变量中读取返回值。

#define Test(channel)  do {  \
       ......        \
       midd_var =  ADC->RESULT; \
} while(0)
友情提示:标题不合格、重复发帖,将会被封锁ID。详情请参考:论坛通告:封锁ID、获得注册邀请码、恢复被封ID、投诉必读
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子论坛 ( 公安交互式论坛备案:44190002001997 粤ICP备09047143号-1 )

GMT+8, 2020-5-28 22:39

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表