相关疑难解决方法(0)

"static const"vs"#define"vs"enum"

在C中的以下陈述中哪一个更好用?

static const int var = 5;
Run Code Online (Sandbox Code Playgroud)

要么

#define var 5
Run Code Online (Sandbox Code Playgroud)

要么

enum { var = 5 };
Run Code Online (Sandbox Code Playgroud)

c constants

550
推荐指数
12
解决办法
33万
查看次数

什么是"断言"功能?

我一直在研究OpenCV教程并且遇到了这个assert功能; 它有什么作用?

c c++ assert

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

C语言中setjmp和longjmp的实际用法

任何人都可以解释我究竟在哪里setjmp(),longjmp()功能可以在嵌入式编程中实际使用?我知道这些是用于错误处理的.但我想知道一些用例.

c

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

在Doxygen中引用参数的正确方法是什么?

我有一个功能的以下Doxygen文档:

/**
  @brief Does interesting things

  @param[in]  pfirst The first parameter: a barrel full of monkeys

  @pre
    "pfirst" must have been previously passed through BarrelFiller()
*/
Run Code Online (Sandbox Code Playgroud)

请注意,这pfirst是一个参数,并在前提条件中引用它.

我在这里用引号包围它,因为我想从文本的其余部分中脱颖而出.但是这样做会很好,Doxygen会强调命令,最好将它链接到参数定义.有没有办法做到这一点?

如果只使用默认配置(或其微小的改动)就会发生这种情况会特别好.

doxygen

56
推荐指数
2
解决办法
2万
查看次数

我应该返回0或1以获得成功的功能吗?

可能重复:
C代码中的错误处理您应该在C中
使用失败的函数调用返回什么值?

我总是用0,但其没有真正可读if,while

我应该退回1吗?为什么主要功能return 0成功?

c boolean

50
推荐指数
2
解决办法
9万
查看次数

不透明的C结构:它们应该如何声明?

我已经看到以下两种在C API中声明不透明类型的样式.使用一种风格而不是另一种风格有明显的优势吗?

选项1

// foo.h
typedef struct foo * fooRef;
void doStuff(fooRef f);

// foo.c
struct foo {
    int x;
    int y;
};
Run Code Online (Sandbox Code Playgroud)

选项2

// foo.h
typedef struct _foo foo;
void doStuff(foo *f);

// foo.c
struct _foo {
    int x;
    int y;
};
Run Code Online (Sandbox Code Playgroud)

c struct coding-style typedef opaque-pointers

46
推荐指数
2
解决办法
3万
查看次数

您应该在C中使用失败的函数调用返回什么值?

可能重复:
C代码中的错误处理

假设你有一个功能:

int MightWork(){
  // if it works
  return x;

  // if it fails
  return y;

}
Run Code Online (Sandbox Code Playgroud)

x和y应该是什么?

因为我有另一个功能:

if (MightWork){
  // do stuff #1
}else{
  // do stuff #2
}
Run Code Online (Sandbox Code Playgroud)

我知道对于这个特定的例子,使用返回值1将使第二个代码块"do stuff#1"并且使用返回值0将第二个代码块带到"do stuff#2"

我的问题是C中首选的样式是什么?函数的返回值0表示成功,其他任何值表示失败吗?或相反亦然?或者0以下的值?

我想确保我用当前的样式编写我的C代码.谢谢!

c

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

处理C中错误的样式?

可能重复:
C代码中的错误处理

大家好.我正在使用C进行一些小项目,我知道如何,因为它没有专门的错误处理结构,我必须用额外的条件块污染我的算法.我的问题是你更喜欢如何处理错误,并说明原因.我在两种方式之间挣扎......如果你有第三种方式,发布它.谢谢.

///////////////////////////////////////////
// method 1

// stuff that can go wrong;

if (test1 == failed)
{
    // print error;
    // exit;
}
else
{
    // more stuff that can go wrong;

    if (test2 == failed)
    {
        // print error;
        // exit;
    }
    else
    {
        // ... and so on...
    }
}

///////////////////////////////////////////
// method 2

// stuff that can go wrong;

if (test1 == failed)
{
    // print error;
    // exit;
}

// more stuff that can go …
Run Code Online (Sandbox Code Playgroud)

c error-handling coding-style

3
推荐指数
1
解决办法
477
查看次数

STM32如何获得最后的重置状态

我正在使用STM32F427,我想得到最后一次重置的原因.有RCC时钟控制和状态寄存器RCC_CSR有许多复位标志,但我无法获得任何有意义的值.

通过读取该寄存器的值,我只获得0x03,这意味着LSI就绪并且LSI为ON,但是如果我尝试上电,软件复位,低电压等,则不会设置有关复位的标志.我找到了用于获取复位标志的代码片段如下所示,但所有标志仍为0.

if (RCC_GetFlagStatus(RCC_FLAG_SFTRST)) ...
Run Code Online (Sandbox Code Playgroud)

您有什么建议如何获得更好的结果?在读取这些重置标志之前是否需要一些配置?

谢谢

c embedded arm reset stm32

3
推荐指数
2
解决办法
9397
查看次数

C API应该返回值还是错误代码?

我正在写我的第一个C库,我不知道该走哪条路.例如,从某些数据存储中检索字符串值的函数可以是:

int get_value(void * store, char ** result);
Run Code Online (Sandbox Code Playgroud)

要么

char * get_value(void * store, int * error);
Run Code Online (Sandbox Code Playgroud)

我很难有任何客观的理由偏爱一个人而不是另一个人,但不止于此,我不会写那么多C.当存在多个输出参数时,返回错误代码看起来会更加一致,但返回值可能更容易使用?不确定.

关于哪种风格更好以及为什么或仅仅是个人偏好,是否存在普遍共识?

c api-design

3
推荐指数
1
解决办法
151
查看次数

结合使用 assert 和 printf 的最佳实践

我目前正在使用以下语句来获取assertprintf协同工作,有没有更好的方法来做到这一点?

#define ASSERT(x) for(; !(x); assert(x))
#define ALLOC_CHECK(x, ...) ASSERT(x) printf(__VA_ARGS__ "\n");
ALLOC_CHECK(ptr != NULL, "Pointer not initialized");
Run Code Online (Sandbox Code Playgroud)

c

2
推荐指数
1
解决办法
1642
查看次数

从没有中断引脚的传感器读取数据的最佳方法,该措施需要一段时间才能准备好

我正在尝试将压力传感器(MS5803-14BA)与我的电路板(NUCLEO-STM32L073RZ)连接。

根据数据表(第3页),压力传感器需要几毫秒的时间才能准备好读取测量值。对于我的项目,我对转换原始数据大约需要10 ms的最高分辨率感兴趣。

不幸的是,该压力传感器没有任何可用于查看测量准备就绪时间的中断引脚,因此,我暂时解决了在请求新数据后延迟的问题。

我不喜欢当前的解决方案,因为在这10毫秒内,我可以让单片机工作在其他地方(我的板上还连接了其他几个传感器),但是没有任何中断引脚,我不确定这是什么。解决此问题的最佳方法。

我想到了另一个解决方案:使用计时器,该计时器每20秒触发一次,并执行以下操作:

1.a Read the current value stored in the registers (discarding the first value)
1.b Ask for a new value
Run Code Online (Sandbox Code Playgroud)

这样,在下一次迭代中,我只需要读取上一次迭代结束时请求的值即可。

我不喜欢我的测量结果总是20毫秒。直到延迟保持20毫秒,它应该还是可以的,但是如果我需要降低速率,则解决方案的读数“老化”会增加。

您对如何处理还有其他想法吗?

谢谢。

注意:如果您需要查看我当前的实现,请告诉我。

c interrupt stm32 multitasking pressure

2
推荐指数
1
解决办法
665
查看次数