我想_Bool
在我的系统上找到定义,因此对于缺少它的系统,我可以实现它.我在这里和其他网站上看到过各种各样的定义,但是想要检查系统的最终定义.
轻微的问题,因为我找不到_Bool定义的地方甚至stdbool.h
mussys@debmus:~$ find /usr/include/* -name stdbool.h
/usr/include/c++/4.3/tr1/stdbool.h
Run Code Online (Sandbox Code Playgroud)
而grep
对于_Bool
上/usr/include/*
和/usr/include/*/*
不要么找到它.
那它在哪里?
我在C中编写了一组数据结构和函数,其中一些使用_Bool数据类型.当我开始时,该项目将是纯粹的C.现在我正在研究使用基于C++的GUI工具包并将后端代码放入库中.
但是,在编译C++ GUI时,编译器会发出以下错误:
ISO C++ forbids declaration of '_Bool' with no type
我最初以为我可以搜索和替换_Bool
,以bool
创造:
/* mybool.h */
#ifndef MYBOOL_H
#define MYBOOL_H
typedef _Bool bool;
#endif /* MYBOOL_H */
Run Code Online (Sandbox Code Playgroud)
然后在任何使用_Bool的标头中
#ifdef __cplusplus
extern "C" {
#else
#include "mybool.h"
#endif
/* rest of header... */
Run Code Online (Sandbox Code Playgroud)
直到我意识到这将使用一个布尔(C _Bool)数据类型编译库,并使用另一个(C++ bool)链接库.实际上,这可能无关紧要,但从理论上讲,它可能确实存在(可能会有一些模糊的系统,这样做会导致宇宙向内翻).
我想我可以使用一个int并使用0表示false,将1表示为true,并使用类似的方法对其进行类型设置typedef int mybool
,但它似乎没有吸引力.
有没有更好/惯用/标准的方法来做到这一点?
我刚刚决定改变所有变量unsigned
,int
并在重新编译有问题的代码时受到此警告消息的欢迎:
freespace_state.c:203: warning: assuming that the loop is not infinite
Run Code Online (Sandbox Code Playgroud)
有问题的一行:
for (x = startx; x <= endx; ++x, ++xptr)
Run Code Online (Sandbox Code Playgroud)
这个循环是60行代码(包括空格/括号等),并且goto
在其中有一个,并且至少出现一次continue
.
在这种情况下,我认为我很欣赏GCC假设这个循环不是无限的,因为它永远不应该无限循环.
GCC试图在这里告诉我什么?
警告的语法几乎暗示警告应该在某些其他警告的范围内进行,但在该背景下没有警告.
[编辑] 这完全是我自己的错.我从这里的一个问题偷了一些优化和警告选项而没有真正理解它们,并且从此忘记了它们.
请参阅Mark Rushakoff的回答,此外,我还习惯-Wunsafe-loop-optimizations
明确警告GCC是否对循环做出假设.请参阅http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
我想建立一个共享库.GNU/Linux是开发和目标平台.C是实现语言.
我无法决定如何设置构建系统并继续围绕三个选项,每个选项都有很多不喜欢的理由:
我无法决定去哪.我会选择一个,开始工作然后遇到问题,并决定其他系统更好.我卡住了卡住了.有人可以解释一下这可能有助于我解决这个问题吗?
我想使用waf构建一个共享库,因为它看起来比GNU autotools更容易,更简洁.
到目前为止,我实际上有几个与我开始写的wscript有关的问题:
VERSION='0.0.1'
APPNAME='libmylib'
srcdir = '.'
blddir = 'build'
def set_options(opt):
opt.tool_options('compiler_cc')
pass
def configure(conf):
conf.check_tool('compiler_cc')
conf.env.append_value('CCFLAGS', '-std=gnu99 -Wall -pedantic -ggdb')
def build(bld):
bld.new_task_gen(
features = 'cc cshlib',
source = '*.c',
target='libmylib')
Run Code Online (Sandbox Code Playgroud)
包含的行source = '*.c'
不起作用.我必须指定每个.c文件而不是使用通配符吗?
我怎样才能启用调试版本(目前wscript正在使用调试版本CFLAGS,但我想让最终用户选择它).
计划将库源放在子目录中,以及在每个子目录中使用lib的程序.
我需要模拟Fluxbox窗口管理器的窗口放置策略.
作为一个粗略的指南,可视化随机大小的窗口一次一个地填满屏幕,其中每个窗口的粗略大小导致屏幕上平均80个窗口,而没有任何窗口与另一个窗口重叠.
如果您的系统上安装了Fluxbox和Xterm,您可以尝试使用xwinmidiarptoy BASH脚本来查看我想要发生的事情的粗略原型.请参阅我写过的xwinmidiarptoy.txt说明,解释它的作用以及如何使用它.
重要的是要注意窗口将关闭,并且关闭先前占用的窗口的空间再次可用于放置新窗口.
该算法需要是一个在线算法处理数据"以串行方式逐个处理,即按照输入被提供给算法的顺序,而不需要从一开始就提供整个输入."
Fluxbox窗口放置策略有三个我想模拟的二元选项:
Windows构建水平行或垂直列(可能)
Windows从左到右或从右到左放置
Windows从上到下或从下到上放置
目标算法与窗口放置算法之间的差异
坐标单位不是像素.将放置块的网格将是128 x 128个单位.此外,放置区域可以通过放置在网格内的边界区域进一步收缩.
为什么算法有问题?
它需要在音频应用程序中运行到实时线程的最后期限.
此刻我只关心获得快速算法,不关心实时线程的含义以及编程带来的所有障碍.
虽然算法永远不会放置一个与另一个重叠的窗口,但是用户将能够放置和移动某些类型的块,将存在重叠的窗口.用于存储窗口和/或空闲空间的数据结构需要能够处理这种重叠.
到目前为止,我有两个选择,我已经建立了松散的原型:
1)Fluxbox放置算法的一个端口到我的代码中.
问题是,当我尝试使用该算法放置256块的最坏情况时,客户端(我的程序)被踢出音频服务器(JACK).该算法在放置第256个窗口时对已经放置的块列表执行超过14000次完整(线性)扫描.
为了演示这一点,我创建了一个名为text_boxer-0.0.2.tar.bz2的程序,该程序将文本文件作为输入并将其排列在ASCII框中.问题make
来构建它.有点不友好,使用--help
(或任何其他无效选项)的命令行选项列表.您必须使用该选项指定文本文件.
2)我的替代方法.
仅部分实现,该方法对矩形空闲未使用空间的每个区域使用数据结构(窗口列表可以完全分离,并且不需要用于测试该算法).数据结构充当双向链表中的节点(具有排序插入),并且包含左上角的坐标以及宽度和高度.
此外,每个块数据结构还包含四个链接,这四个链接连接到四个边中的每一个上的每个紧邻(触摸)块.
重要规则:每个块每侧只能触摸一个块.这是一种特定于算法存储空闲未使用空间的方法的规则,并且不会影响实际窗口可能相互接触的数量.
这种方法的问题是,它非常复杂.我已经实现了直接的情况,其中1)从块的一个角去除空间,2)分割相邻的块以便遵守重要的规则.
不太直接的情况,其中要移除的空间只能在一列或一排框中找到,只是部分实现 - 如果要移除的一个块完全适合宽度(即列)或高度(即然后出现问题.甚至没有提到这个事实,它只检查一个框宽的列,并排一个框高.
我已经用C语言实现了这个算法 - 我正在使用这个项目的语言(我几年没有使用过C++,在把注意力都集中在C开发之后使用它很不舒服,这是一个爱好).实现是700多行代码(包括大量空行,支撑线,注释等).该实现仅适用于水平行+左右+上下放置策略.
所以我要么添加一些方法来使这些+700行代码适用于其他7个放置策略选项,或者我将不得不为其他7个选项复制那些+700行代码.这些都不具吸引力,第一,因为现有代码足够复杂,第二,因为膨胀.
由于缺少功能,该算法甚至不能在实时最坏情况下使用它,因此我仍然不知道它实际上是否比第一种方法更好或更差.
该算法的C实现的当前状态是freespace.c.我用它gcc -O0 -ggdb freespace.c
来构建,并以xterm大小运行它至少至少124 x 60个字符.
那里还有什么?
我撇去并打折: …
考虑以下两点struct
:
struct a
{
int a;
};
struct b
{
struct a a_struct;
int b;
};
Run Code Online (Sandbox Code Playgroud)
以下实例struct b
:
struct b b_struct;
Run Code Online (Sandbox Code Playgroud)
这个条件:
if (&b_struct == (struct b*)&b_struct.a_struct)
printf("Yes\n");
Run Code Online (Sandbox Code Playgroud)
C标准是否要求始终评估为真?
我的程序是用C语言编写的Linux,并且有许多函数,它们具有不同的返回值模式:
1)一次或两次n
成功和-1
失败的回报.
2)一些0
成功和-1
失败的回报.
3)成功时返回1,失败时返回0(我通常使用布尔类型).
4)指针返回0
失败(我通常使用spurn NULL
).
我的混乱出现在前三个 - 返回指针的函数总是0
在失败时返回,这很容易.
第一个选项通常涉及返回长度的函数,该长度可能只是正数.
第二个选项通常涉及命令行处理函数,但我不确定它是否正确,或许更好的值是EXIT_SUCCESS和EXIT_FAILURE?
第三个选项适用于在条件内调用方便且自然的函数,我通常使用int
值1和0 来模拟布尔类型.
尽管这一切似乎相当明智的,我仍然觉得哪里的区域,这是不太清楚或明显为当我创建的功能,或风格是在使用时,我想用它来使用的风格.
那么在决定返回类型时,如何为我的方法增加清晰度呢?
我的程序正在读取包含设置文件的各种文本行的文本文件.有些线路可能变得非常大.目前缓冲区大小为4096个字符.某些线路可能会超出此范围,无论是通过恶意还是由于程序中运行的各种因素.
当前的例程编写起来相当繁琐,现在我想扩展文件的可能内容,这将需要更多这些繁琐的重复代码.(这适用于设置类型文件,由name value
对和偶尔的节标题组成.由于多个精度,某些数值需要作为字符串读取).
我想要的主要是读取没有缓冲区溢出的任意长度行.我刚刚发现getline可以为我做到这一点,但是,为了天堂的缘故,还有一个图书馆可以为我做这一切繁琐的工作吗?
编辑:
我不希望被迫=
在名称和值之间放置一个符号,空格应该足以作为分隔符.
广泛使用,我的意思是该库应该在流行的Linux发行版的标准包中提供.
我知道libconfig但是我的要求似乎完全矫枉过正.
问题是:给定一个整数val1
找到最高位集(最高有效位)的位置然后,给定第二个整数,val2
找到从第一个整数产生的位置左侧的未设置位的连续区域.width
指定必须在邻接中找到的最小未设置位数(即width
,其中没有一个的零).
这是我的解决方案的C代码:
#include <limits.h> /* for CHAR_BIT - number of bits in a char */
typedef unsigned int t;
unsigned const t_bits = sizeof(t) * CHAR_BIT;
_Bool test_fit_within_left_of_msb( unsigned width,
t val1, /* integer to find MSB of */
t val2, /* integer to find width zero bits in */
unsigned* offset_result)
{
unsigned offbit = 0; /* 0 starts at high bit */
unsigned msb = 0;
t mask; …
Run Code Online (Sandbox Code Playgroud)