假设我正在使用以下C片段:
void inc(int *num) {*num++;}
void dec(int *num) {*num--;}
void f(int var) {
inc(&var);
dec(&var);
}
Run Code Online (Sandbox Code Playgroud)
通过使用静态分析器,我希望能够判断var的值在函数执行期间是否没有改变.我知道我必须自己保持状态(这是编写一个Clang检查器的重点),但是我遇到麻烦得到这个变量的唯一引用.
例如:如果我使用以下API
void MySimpleChecker::checkPostCall(const CallEvent &Call,
CheckerContext &C) const {
SymbolRef MyArg = Call.getArgSVal(0).getAsSymbol();
}
Run Code Online (Sandbox Code Playgroud)
我希望它在我的检查器上下文中返回指向此符号表示的指针.但是,我总是以这种方式使用它来进入MyArg 0.对于回调前和后回调中的inc和dec函数都会发生这种情况.
我在这里错过了什么?我出错了什么概念?
注意:我目前正在阅读Clang CFE Internals Manual,我已经阅读了24小时内如何编写Checker材料.到目前为止我还是找不到答案.
如果是这样,存储和内存占用量是多少?
编辑
我对此做了一些研究,但没有找到有用的信息.该网站http://www.erlang-embedded.com/完全没有帮助.博客文章http://www.1011ltd.com/web/blog/post/embedded_erlang有点帮助,但听到有更多经验的人的答案会很高兴.
编辑2
我打算用于Erlang的硬件具有32Mb的系统FLASH存储空间和512Mb的RAM.它是双核,每核400Mhz.它运行Linux版本2.6.18.
编辑3
我对Erlang感兴趣的动机是解决优雅的并发问题.在我工作的项目中,我们有一些不健壮的复杂中间件软件,很难理解,也很难扩展.当然,您可以在C中编写出色的并发软件,但Erlang似乎是这个问题域的更好工具.
我想创建一个静态分配2 ^ N字节数组的结构,但我不希望此结构的用户将此大小指定为指数.例:
my_stupid_array<char, 32> a1; // I want this!
my_stupid_array<char, 5> a2; // And not this...
Run Code Online (Sandbox Code Playgroud)
如何检查此模板参数是否为2的幂并警告用户有关于此的好消息?
我已经能够通过一个简单的模板检查这个:
template<int N>
struct is_power_of_two {
enum {val = (N >= 1) & !(N & (N - 1))};
};
Run Code Online (Sandbox Code Playgroud)
但是,我无法通过合理的消息警告用户.有任何想法吗?
编辑
修复了模棱两可的例子.
编辑
1确实是2的幂.修好了!:)
编辑
使用BOOST_STATIC_ASSERT,我收到此代码与GCC的编译错误:
template<int N>
struct is_power_of_two {
enum {val = (N >= 1) & !(N & (N - 1))};
BOOST_STATIC_ASSERT(val);
};
Run Code Online (Sandbox Code Playgroud)
错误
..\main.cpp:29:1: error: invalid application of 'sizeof' to incomplete type 'boost::STATIC_ASSERTION_FAILURE<false>'
Run Code Online (Sandbox Code Playgroud)
编辑 …
我正在使用STM32F107芯片在C中进行一些开发,并且在某些时候,当我调用特定函数时,设备开始重置.我没有调试器,我的调试只是串口上的纯文本.
我已经使用了一些其他的微控制器,我可以访问寄存器来查看复位的原因,但我似乎无法找到该器件的等效器件.我知道Cortex-M3的硬件异常,但我不知道其中一个是否被触发,因为当我进入这些处理程序时,我似乎无法通过usart发送文本(可能是因为我的TX功能使用中断?).
所以,我决定在这个设备中询问比我更多经验的人:调试这些情况通常会做些什么?
编辑
其中一个开发人员激活了WWDG监视器,它在我从故障处理程序获取信息之前重置了硬件.由于指向错误位置的指针调用函数,这是一个硬故障.但是,我会保留这个问题,希望有人能提供更多的细节(或关于它的材料),以便从保存的寄存器中指回C代码,比如硬故障(@dwelch的想法).
我正在处理包含专有文件系统的USB存储设备.因此,我需要读取这些设备的512字节块来实现此文件系统的查看器.
我该怎么办呢?使用Delphi有一些材料吗?
简单的问题:我有一个为现有makefile配置的C++项目,它编译得很好.但是,IDE一直在抱怨它无法解析我的大多数符号.
如何配置eclipse以使用我的包含?
我正在使用Gentoo框,我想在不使用root帐户或sudo的情况下创建基于Debian的chroot环境.
这似乎可以使用fakeroot和fakechroot等工具,但到目前为止我还没有取得任何成功.这是我用于Precise的命令:
fakeroot fakechroot /usr/sbin/debootstrap --variant=fakechroot precise ./precise http://archive.ubuntu.com/ubuntu/
Run Code Online (Sandbox Code Playgroud)
它始终失败并出现相同的错误:
I: Installing core packages...
W: Failure trying to run: chroot precise dpkg --force-depends --install /var/cache/apt/archives/base-passwd_3.5.24_amd64.deb
W: See precise/debootstrap/debootstrap.log for details
Run Code Online (Sandbox Code Playgroud)
debootstrap.log的内容是:
dpkg: error while loading shared libraries: libselinux.so.1: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)
我不知道为什么SELinux被拉进来以及为什么它没有正确处理这种依赖.此外,我也试图建立Wheezy和Jessie.同样的错误.
这是怎么回事?版本:
debootstrap的-1.0.67
fakeroot的-1.19
fakechroot-2.17.2
内核3.19.6
我正在使用基于Chromium Embedded项目的Delphi组件.在使用一些Javascript代码在测试HTML中导航以访问Google Maps API时,它会显示启用触摸的设备的控件.
我已经看到这个问题已经在项目的svn中修复了,但是我正在经历地狱来编译那些东西.
但是,如果我访问maps.google.com网站(而不是我使用Javascript测试HTML),我的组件将显示非触摸设备的控件.
所以,我想知道...有没有办法迫使谷歌地图v3 API接受我作为非触摸设备?
编辑:在下面添加用户代理和测试用例.
用户代理:
Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.36 (KHTML, like Gecko) Chrome/12.0.742.53 Safari/534.36
Run Code Online (Sandbox Code Playgroud)
测试用例:
<!DOCTYPE html>
<html>
<head>
<style type="text/css">
html { height: 100% }
body { height: 100%; margin: 0px; padding: 0px }
#map_canvas { height: 100% }
</style>
<script type="text/javascript"
src="http://maps.googleapis.com/maps/api/js?sensor=false&language=pt_BR®ion=BR">
</script>
<script type="text/javascript">
var map;
function initialize() {
var latlng_map = new google.maps.LatLng(-23.510700, -46.602300);
var myOptions_map = {
zoom: 15,
center: latlng_map,
mapTypeId: google.maps.MapTypeId.ROADMAP
}; …Run Code Online (Sandbox Code Playgroud) 我有一个带有二进制Linux 2.6.18的旧设备内核可以正常启动到它的 rootfs。但是,如果我尝试从源代码编译此内核,则生成的内核二进制文件将在引导期间冻结。我没有用于构建当前正常启动的先前内核二进制文件的 .config 文件。
启动冻结,没有提供错误输出。这是启动日志:
Linux version 2.6.18-6.2 (myuser@host) (gcc version 4.2.0 20070124 (prerelease) - BRCM 10ts-20080721) #10 SMP Sun Apr 28 18:25:24 BRT 2013
Fetching vars from bootloader... OK (E,d,B,C)
Detected 512 MB on MEMC0 (strap 0x23430310)
Board strapped at 512 MB, default is 256 MB
Options: sata=1 enet=1 emac_1=1 no_mdio=0 docsis=0 ebi_war=0 pci=1 smp=1
CPU revision is: 0002a044
FPU revision is: 00130001
Primary instruction cache 32kB, physically tagged, 2-way, linesize 64 bytes.
Primary data …Run Code Online (Sandbox Code Playgroud) 我想创建一个使用我的包项目中编译的资源的组件.我的组件将尝试在运行时(在其构造函数中)使用此资源(PNG图像).
我想在我的应用程序的项目中使用它,但是只要组件被创建,我就会得到以下异常:
First chance exception at $7579B9BC. Exception class EResNotFound with message 'Resource xxx not found'. Process yyy.exe (6060)
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么?
编辑
包项目中资源的调用代码如下:
Png.LoadFromResourceName(HInstance, 'png_resource_name');
Run Code Online (Sandbox Code Playgroud)
编辑2
正如David所建议的,我尝试使用函数GetModuleHandle,但是如果我从包的项目或应用程序的项目中调用它,它将始终返回0 .在包的项目中调用的代码是这样的:
PackageModuleHandle := GetModuleHandle(PChar('my_package.bpl'));
Png := TPngImage.Create;
Png .LoadFromResourceName(PackageModuleHandle, 'png_resource_name');
Run Code Online (Sandbox Code Playgroud)
bpl文件的绝对路径也不起作用.
编辑3
基于新答案的新尝试:
PackageModuleHandle := FindClassHInstance(TMyComponent);
Png := TPngImage.Create;
Png .LoadFromResourceName(PackageModuleHandle, 'png_resource_name');
Run Code Online (Sandbox Code Playgroud)
失败也有同样的例外.
编辑4
使用ResourceHacker,如果我正确使用它,资源似乎不在我的bpl文件中.我能做些什么呢?这么简单的功能似乎有这么复杂的问题.
结论
我必须在{$ R*.res}行之后将我的包的.res文件添加到包的.dpr中.像这样:
{$R *.res}
{$R 'my_pacakge.res'}
Run Code Online (Sandbox Code Playgroud)
此外,我必须将my_package.rc文件包含到我的项目中,因此在每次构建之后,资源将被编译到.res.我想这就是诀窍.感谢所有的答案.
delphi ×3
embedded ×2
boot ×1
bootstrapper ×1
c++ ×1
c++11 ×1
chroot ×1
clang ×1
constexpr ×1
cortex-m3 ×1
debian ×1
debugging ×1
eclipse ×1
eclipse-cdt ×1
erlang ×1
filesystems ×1
gentoo ×1
javascript ×1
linux ×1
linux-kernel ×1
stm32 ×1
templates ×1
ubuntu ×1
usb ×1