小编Lun*_*din的帖子

getop()中的澄清

在Dennis Ritchie的"C编程语言"一书中,在getopop函数中,他声明s [1] ='\ 0'为什么他会在索引1上结束数组?有什么意义和需要?

在后面的部分,他确实使用了数组的其他部分..

int getch(void);
void ungetch(int);

/* getop: get next character or numeric operand */
int getop(char s[])
{
    int i, c;
    while ((s[0] = c = getch()) == ' ' || c == '\t')
        ;
    s[1] = '\0';

    if (!isdigit(c) && c != '.')
        return c; /* not a number */

    i = 0;
    if (isdigit(c)) /* collect integer part */
        while (isdigit(s[++i] = c = getch()))
            ;

    if (c == '.') /* collect fraction …
Run Code Online (Sandbox Code Playgroud)

c kernighan-and-ritchie

4
推荐指数
1
解决办法
586
查看次数

如何在Code :: Blocks中使用C11标准

就像标题所说,我需要code::blocks与之合作C11,我无法弄清楚如何去做.

我去了settings=> compiler settings=> Other options我添加-std=c11并尝试了-std=gnu11,两者似乎都没有用.

我编译gcc-5.2然后我更改了默认编译器(gcc-4.9)仍然没有结果.


当我尝试编译以下程序时:

#include<stdio.h>

int main(void){
    int arr[] = {0,1,2,3,4};

    for(int i=0;i<5;i++){
        printf("%d ",arr[i]);
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我得到以下内容:

|6|error: ‘for’ loop initial declarations are only allowed in C99 or C11 mode|
Run Code Online (Sandbox Code Playgroud)

但如果我在终端(ubuntu 15.04,64BIT,gcc-5.2)中这样做:

./install/gcc-5.2.0/bin/gcc5.2 program.c -o program
Run Code Online (Sandbox Code Playgroud)

似乎工作正常.

我的问题是,如何code::blocks与之合作c11

c codeblocks c11 gcc5.2

4
推荐指数
1
解决办法
1万
查看次数

为什么它以十六进制表示法显示?

我试图做变量位算术ab.当我反转时a,其值为0xAF,结果显示为8位数.与其他显示为2位数的人不同.

我不知道为什么会发生这种情况,但是猜测它与%x显示方式和小端有关?

这是我的代码:

#include <stdio.h>
int main()
{
    int a = 0xAF; // 10101111
    int b = 0xB5; // 10110101

    printf("%x \n", a & b); // a & b = 10100101
    printf("%x \n", a | b); // a | b = 10111111
    printf("%x \n", a ^ b); // a ^ b = 00011010
    printf("%x \n", ~a); // ~a = 1....1 01010000
    printf("%x \n", a << 2);// a << 2 = 1010111100 
    printf("%x …
Run Code Online (Sandbox Code Playgroud)

c

4
推荐指数
1
解决办法
128
查看次数

什么是"误报"?

我注意到以下关于理解严格别名的代码:

uint32_t
swap_words( uint32_t arg )
{
    U32*     in = (U32*)&arg;
    uint16_t lo = in->u16[0];
    uint16_t hi = in->u16[1];

    in->u16[0] = hi;
    in->u16[1] = lo;

    return (in->u32);
}
Run Code Online (Sandbox Code Playgroud)

据作者说,

使用GCC 4.0编译时启用-Wstrict-aliasing = 2标志的上述源 将生成警告.这个警告是误报的一个例子.允许这种类型的强制转换,并生成相应的代码(见下文).清楚地记录了-Wstrict-aliasing = 2可能返回误报.

我想知道什么是误报,我应该在别名变量时注意它吗?


以下是上面提到的"适当的代码(见下文)",如果它是相关的:

-fstrict-aliasing -O3 -Wstrict-aliasing -std=c99在GNU C 4.0.0版(Apple Computer,Inc.build 5026)上编译(powerpc-apple-darwin8),

swap_words:
  stw r3,24(r1)  ; Store arg
  lhz r0,24(r1)  ; Load hi
  lhz r2,26(r1)  ; Load lo
  sth r0,26(r1)  ; Store result[1] = hi …
Run Code Online (Sandbox Code Playgroud)

c gcc compiler-warnings gcc-warning

4
推荐指数
1
解决办法
1413
查看次数

stm32 SPI + DMA

我尝试使用DMA通道使用SPI发送数据.当我在没有DMA的情况下发送一切都没问题,但是用DMA确实是错误的.当我调试我的程序时,SPI DR寄存器始终为0.我想使用dma循环模式一直发送我的数组.有我的代码GPIO INIT:

GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(SPI_PERIPH_CLOCK, ENABLE);
RCC_AHBPeriphClockCmd(GPIO_PERIPH_CLOCK, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

GPIO_PinAFConfig(GPIOB, AF_PIN_SOURCE, GPIO_AF);

GPIO_InitStructure.GPIO_Pin = GPIO_PIN_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOB, &GPIO_InitStructure);
Run Code Online (Sandbox Code Playgroud)

SPI INIT

SPI_I2S_DeInit(SPI1);

SPI_InitTypeDef SPI_InitStructure;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStructure);

SPI_Cmd(SPI1, ENABLE);
Run Code Online (Sandbox Code Playgroud)

DMA INIT:

    DMA_InitTypeDef dma;
    DMA_DeInit(DMA1_Channel1);
    DMA_StructInit(&dma);

    dma.DMA_PeripheralBaseAddr = (uint32_t)&SPI1->DR;
    dma.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    dma.DMA_PeripheralDataSize …
Run Code Online (Sandbox Code Playgroud)

c embedded spi stm32 dma

4
推荐指数
1
解决办法
2452
查看次数

_Noreturn in a c in c:error:expected specifier-qualifier-list before'_Noreturn'

我正在尝试编译一段包含_Noreturn的代码:

#ifndef SOMEHEADER_H
#define SOMEHEADER_H

#include <stdalign.h>
#include <stdbool.h>
#include <stdint.h>

extern struct s {

    _Noreturn void (*somenoreturnfunc)(bool);
} svar;

#endif
Run Code Online (Sandbox Code Playgroud)

这给了我:

error: expected specifier-qualifier-list before '_Noreturn' 上: _Noreturn void (*somenoreturnfunc)(bool);

所以我从这里尝试了这个建议:

#ifndef SOMEHEADER_H
#define SOMEHEADER_H

#include <stdalign.h>
#include <stdbool.h>
#include <stdint.h>

#include "noreturn.h"

extern struct s {

    noreturn void (*somenoreturnfunc)(bool);
} svar;

#endif
Run Code Online (Sandbox Code Playgroud)

noreturn.h:

#ifndef NO_RETURN_H
#define NO_RETURN_H
#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L
#define noreturn _Noreturn
#elif defined(__GNUC__)
#define noreturn __attribute__((noreturn))
#else
#define noreturn
#endif
#endif …
Run Code Online (Sandbox Code Playgroud)

c gcc c11 noreturn

4
推荐指数
1
解决办法
184
查看次数

如何在 Visual Studio 中包含头文件和源文件文件夹

我正在使用 Visual Studio (2017),我需要以下内容。

我有一个文件夹,代码生成器在其中放置了从正式模型获得的 .h 和 .c 文件。这个文件夹不是我控制的,比如我不能在里面写,但它是由另一个团队成员更新的。

通过使用 /I 编译器选项(或项目属性中的其他包含目录),我设法在我的 VS 项目中导入了所有生成的头文件。我应该做的是将这个生成的代码集成到一个特定的平台,这意味着我必须在目标平台上编译生成的代码和集成代码。问题是,编译器无法解析生成代码的生成函数定义,因为它只能看到 .h 文件。我得到的是链接错误(外部符号未解析)

为了解决这个问题,我手动添加了现有的.c文件,一一添加。此解决方案带来的明显问题是

  • 手工钻孔工作
  • 生成新文件时,我需要手动导入新文件

问题是:有没有可以设置的选项来指定源文件的路径而不是一一传递?

注意:仅将生成的代码复制并粘贴到 VS 项目文件夹中是不可接受的解决方案。

谢谢

c visual-studio

4
推荐指数
1
解决办法
2495
查看次数

提取无符号32位整数的上下字

要提取无符号32位整数的高位字和低位字,并将每个字存储在单独的uint16_t变量中,我执行如下操作(nbr是无符号的32位整数):

uint16_t lower_word = (uint16_t) nbr & 0x0000FFFF;  // mask desired word
uint16_t upper_word = (uint16_t) ((nbr & 0xFFFF0000) >> 16); // right-shift after masking
Run Code Online (Sandbox Code Playgroud)

显式转换为uint16_t是不必要的吗?还有什么其他更有效的方法,如果有的话,你建议获得所需的结果而不是这种方法吗?

c cpu-word uint32 uint16

4
推荐指数
2
解决办法
331
查看次数

括号是否始终被视为函数调用?

我正在看此页面:https : //en.cppreference.com/w/c/language/operator_precedence

引起我注意的是,括号运算符的唯一描述是函数调用。这是否意味着该表达式x = a * (b+c)-(d*e)具有两个函数调用?

我搜索了C语法C标准,但找不到任何支持或矛盾的内容。

c operator-precedence

4
推荐指数
1
解决办法
145
查看次数

为什么需要“ -lpthread”?

所以我的问题是:为什么在编译命令末尾需要“ -lpthread”?

为什么此命令起作用:

gcc -o name name.c -lpthread
Run Code Online (Sandbox Code Playgroud)

但这不会:

gcc -o name name.c
Run Code Online (Sandbox Code Playgroud)

我在我的C代码中使用了pthread.h库。
我已经在网上寻找一些答案,但并没有真正找到可以理解的答案

c gcc compilation pthreads

4
推荐指数
2
解决办法
76
查看次数