我需要一个可以在Linux和Windows中清除屏幕的功能.为此,我想知道是否有一些说明可以告诉我我正在使用的操作系统.我搜索了解决方案,我找到了以下代码:
void clear_screen()
{
#ifdef WINDOWS
std::system ( "CLS" );
#else
// Assume POSIX
std::system("clear");
#endif
}
Run Code Online (Sandbox Code Playgroud)
这个功能有两个问题:
我不明白.
- > for #ifdef WINDOWS,WINDOWS定义在哪里?
此代码适用于Linux,但在Windows中不起作用.
注意 :
我正在使用Windows XP.
我不想要任何非标准功能......比如"诅咒"
我找不到报告“冗余空检查”(RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE)的检测器的名称,有人知道它是什么吗?谷歌搜索只给了我大量的项目报告......
@NotNull自从我使用 JetBrains注释工具(它在字节码中插入空检查)以来,我遇到了很多错误。
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>findbugs-maven-plugin</artifactId>
<version>2.5.2</version>
<configuration>
<omitVisitors>???WhatIsTheDetectorsName???</omitVisitors>
</configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)
提前致谢
我正在尝试启动并运行一个小型BMP085气压计项目.我希望能够在不同的操作模式(MODE_PRESSURE和MODE_ALT)之间切换.我有MODE_PRESSURE并MODE_ALT定义为const int.
const int MODE_PRESSURE = 1; // display pressure and temp
const int MODE_ALT = 2; // display altitude relative to sea level
int mode; // stores the current mode
void setup {
mode = MODE_PRESSURE;
}
void loop {
// Read mode button and set mode accordingly
int buttonPressed = readButtons();
switch(buttonPressed) {
case BTN_MODE:
if(mode == MODE_PRESSURE) { mode = MODE_ALT; }
if(mode == MODE_ALT) { mode = MODE_PRESSURE; }
Serial.println(mode); …Run Code Online (Sandbox Code Playgroud) 从这样的代码开始
void lib_memset( unsigned char *dest, unsigned char c, unsigned int n)
{
while(n--)
{
*dest=c;
dest++;
}
}
Run Code Online (Sandbox Code Playgroud)
使用llvm作为交叉编译器
clang -Wall -m32 -emit-llvm -fno-builtin --target=arm-none-eabi -c lib_memset.c -o lib_memset.bc
opt -std-compile-opts -strip-debug -march=arm -mcpu=mpcore -mtriple=arm-none-eabi lib_memset.bc -o lib_memset.opt.bc
llc -march=arm -mcpu=mpcore -disable-simplify-libcalls lib_memset.opt.bc -o lib_memset.opt.s
llc -march=arm -mcpu=mpcore -disable-simplify-libcalls lib_memset.bc -o lib_memset.s
Run Code Online (Sandbox Code Playgroud)
当使用优化器时,它会检测并用真实的memset替换它
lib_memset:
push {r11, lr}
mov r3, r1
mov r11, sp
cmp r2, #0
beq .LBB0_2
mov r1, r2
mov r2, r3
bl __aeabi_memset
.LBB0_2: @ %while.end …Run Code Online (Sandbox Code Playgroud) 下列
#include <iostream>
unsigned short int stringCompare ( char * s1, char * s2 )
{
// returns 1 if the character arrays s1 and s2 are equal;
// returns 0 otherwise
while (*s1 && (*s1++ == *s2++));
return (!(*s1) && !(*s2));
}
int main ()
{
char str1 [] = "americano";
char str2 [] = "americana";
std::cout << stringCompare(str1,str2);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
打印1,意味着我的函数的逻辑是不正确的.我想明白为什么.让我解释一下我的逻辑:
while (*s1 && (*s1++ == *s2++))
Run Code Online (Sandbox Code Playgroud)
同时递增指针s1,s2只要s1不等于,'\0'并且s1 …
我正在学习K&R书.目前我正在阅读函数getop(),第78页.我理解代码,但我需要澄清两件事.
getop()的代码如下:
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 part */
while (isdigit(s[++i] …Run Code Online (Sandbox Code Playgroud) SO 上的各种受人尊敬的高代表用户一直坚持认为读取具有不确定值的变量“始终是 UB”。那么在 C 标准中究竟在哪里提到了这一点?
很明显,不确定的值可能是未指定的值或陷阱表示:
3.19.2
indeterminate value 不确定值
或未指定值或陷阱表示3.19.3
未指定值
本国际标准对在任何情况下选择哪个值没有强加要求的相关类型的有效值
注:未指定值不能是陷阱表示。3.19.4
陷阱表示
不需要表示对象类型值的对象表示
同样很明显,读取陷阱表示会调用未定义的行为,6.2.6.1:
某些对象表示不需要表示对象类型的值。如果对象的存储值具有这样的表示形式并且被没有字符类型的左值表达式读取,则行为未定义。如果这种表示是由没有字符类型的左值表达式修改对象的全部或任何部分的副作用产生的,则行为是未定义的。50) 这种表示称为陷阱表示。
但是,不确定的值不一定包含陷阱表示。事实上,陷阱表示对于使用二进制补码的系统来说是非常罕见的。
C 标准中的哪个地方实际上说读取不确定的值会调用未定义的行为?
我在看C11的非规范性附件J,发现这确实被列为UB的一个案例:
具有自动存储期限的对象的值在不确定时使用(6.2.4、6.7.9、6.8)。
但是,列出的部分是无关紧要的。6.2.4 仅说明有关生命周期和变量值何时变得不确定的规则。类似地,6.7.9 是关于初始化并说明变量的值如何变得不确定。6.8 似乎几乎无关紧要。这些部分都没有包含任何规范性文本,说明访问不确定的值会导致 UB。这是附件 J 中的缺陷吗?
然而,在 6.3.2.1 中有一些关于左值的相关规范文本:
如果左值指定了一个自动存储持续时间的对象,该对象可以使用寄存器存储类声明(从未获取其地址),并且该对象未初始化(未使用初始化程序声明,并且在使用之前未对其进行赋值) ),行为未定义。
但这是一种特殊情况,它仅适用于从未被取地址的自动存储期变量。我一直认为 6.3.2.1 的这一部分是关于不确定值(不是陷阱表示)的唯一 UB 情况。但人们一直坚持“它总是UB”。那么具体是在哪里提到的呢?
我从分析工具中收到以下警告,Composite expression assigned to a wider essential type
这是代码:
uint32_t result;
uint8_t resolution;
result = 1U << resolution;
Run Code Online (Sandbox Code Playgroud)
我尝试了以下方法:
#define SHIFT_BY_ONE (uint8_t)1
result = SHIFT_BY_ONE << resolution;
Run Code Online (Sandbox Code Playgroud)
但这会引发此警告,Shift left of signed quantity (int)
所以我想我无法正确理解该问题。如何解决此错误?
(常见问题解答-此问题不断出现)
我假设读者知道指针算法是如何工作的。
int arr[3] = {1,2,3};
int* ptr = arr;
...
*(ptr + i) = value;
Run Code Online (Sandbox Code Playgroud)
老师/ C书籍不断告诉我,我不应该*(ptr + i)像上面的示例那样使用,因为“指针支持数组样式索引”,而我应该使用它ptr[i] = value;。那里没有论据-更容易阅读。
但是从C标准来看,我什么都没有找到,叫做“数组样式索引”。实际上,运算符[]并不期望任何一个操作数都是数组,而是指针或整数!
6.5.2.1数组下标
约束条件
其中一个表达式的类型应为“完成对象类型的指针”,另一个表达式的类型应为整数,结果的类型应为“ type ”。
为什么数组下标运算符不期望数组?标准错了吗?我的老师/ C书困惑了吗?
c arrays pointer-arithmetic subscript-operator array-indexing
在为PIC微控制器编写固件时想到了这个问题。
我知道有两种方法可以初始化微控制器中的寄存器。举例来说,如果我们将端口初始化为输出,则一种方法是编写如下命令,并将其分配1给TRISx寄存器中的每个位
方法1
TRISX = 0xFF;
Run Code Online (Sandbox Code Playgroud)
可以通过单独分配位来完成同一件事。
方法2
_TRISX0 = 1;
_TRISX1 = 1;
_TRISX2 = 1;
...
_TRISX7 = 1;
Run Code Online (Sandbox Code Playgroud)
我的问题是,编译器会否将其视为相同,并且完成这两个操作所花费的时间是相同的?还是方法1占用一个时钟周期,而方法2占用8个时钟周期(我的意思是慢8倍)?
我尝试阅读X16编译器指南,但找不到任何提示。