我需要在地址 0xDD2 处调用一个函数:
// foo.h
void foo(void) __at(0xDD2);
// foo.c
#include "foo.h"
void foo(void)
{
// some code
}
Run Code Online (Sandbox Code Playgroud)
此代码有效:
#include "foo.h"
void main(void)
{
void (*a)(void) = &foo;
a();
}
Run Code Online (Sandbox Code Playgroud)
然而,这个没有:
#include "foo.h"
void main(void)
{
void (*a)(void) = (void (*)(void))(0x0DD2);
a();
}
Run Code Online (Sandbox Code Playgroud)
编译器 (XC8) 说:main.c:5:: warning: (759) expression generates no code调试器在调试时传递这些行。
我需要第二个(仅通过其地址调用函数)。为什么编译器会优化它?指针赋值有没有错误?更改编译器的优化级别没有帮助。
我正在学习 OpenCV (C++),作为一个简单的实践,我设计了一个简单的效果,使一些图像像素变黑或变白。我希望每个像素最多编辑一次;所以我将所有像素的地址添加到向量中。但这让我的代码变得很慢;专门用于大图像或大量效果。这是我的代码:
void effect1(Mat& img, float amount) // 100 ? amount ? 0
{
vector<uchar*> addresses;
int channels = img.channels();
uchar* lastAddress = img.ptr<uchar>(0) + img.total() * channels;
for (uchar* i = img.ptr<uchar>(0); i < lastAddress; i += channels) addresses.push_back(i); //Fast Enough
size_t count = img.total() * amount / 100 / 2;
for (size_t i = 0; i < count; i++)
{
size_t addressIndex = xor128() % addresses.size(); //Fast Enough, xor128() is a fast random number generator
for (size_t …Run Code Online (Sandbox Code Playgroud)