我正在寻找一种方法来在运行时区分配备新ARM处理器的设备(如iPhone 3GS和一些iPod 3G)以及配备旧ARM处理器的设备.我知道我可以使用uname()来确定设备型号,但由于只有部分iPod接触3G的ARM处理器得到了提升,这还不够.
因此,我正在寻找其中一个:
提前致谢 :)
我在C项目中遇到了以下构造,我将其移植到C++;
enum TestEnum
{
A=303,
B=808
} _TestEnum;
int foo()
{
_TestEnum = B;
}
Run Code Online (Sandbox Code Playgroud)
在使用GCC进行编译并查看生成的代码时,我得到:
nils@doofnase ~ $ gcc -std=c90 -O2 -c ./test.c -o test.o
nils@doofnase ~ $ size test.o
text data bss dec hex filename
59 0 0 59 3b test.o
Run Code Online (Sandbox Code Playgroud)
因此使用零字节数据或BSS段.
另一方面,如果我用C++编译,我得到:
nils@doofnase ~ $ g++ -std=c++11 -O2 -c ./test.c -o test.o
nils@doofnase ~ $ size test.o
text data bss dec hex filename
59 0 4 63 3f test.o
Run Code Online (Sandbox Code Playgroud)
我看到BSS中分配了四个字节的存储空间,正如我所料.
此外,在C项目中,枚举定义实际上位于头文件中,该头文件包含在多个c文件中.该项目编译和链接就好了.当编译并链接为C++时,编译器会抱怨_TestEnum是在多个对象中定义的(就这样!).
这里发生了什么?我在看一些古老的C语言特例吗?
编辑:为了完整起见,这是gcc版本:
nils@doofnase ~ $ gcc …Run Code Online (Sandbox Code Playgroud) 我不时浏览网页,寻找有趣的算法和数据结构,放入我的技巧包中.一年前,我遇到了Soft Heap数据结构并了解了近乎排序.
这背后的想法是,如果您可以接受排序算法作弊的事实,则可以打破基于比较的排序的O(n log n)障碍.你得到一个几乎排序的列表,但你也必须忍受一些错误.
我在测试环境中使用了算法,但从未找到它们的用途.
所以问题是:有没有人在实践中使用过近排序?如果是这样的应用程序?你能想到一个近距离排序是正确的用例吗?
我喜欢为VS.NET和GCC免费提供代码警告,我喜欢让我的代码准备好64位.
今天我写了一个小模块来处理内存缓冲区,并通过文件样式的接口提供对数据的访问(例如,你可以读取字节,写字节,搜索等).
作为当前读取位置和大小的数据类型,我使用size_t,因为这似乎是最自然的选择.我绕过警告,它也应该在64位工作.
以防万一:我的结构看起来像这样:
typedef struct
{
unsigned char * m_Data;
size_t m_CurrentReadPosition;
size_t m_DataSize;
} MyMemoryFile;
Run Code Online (Sandbox Code Playgroud)
签名size_t似乎没有在实践中定义.Google代码搜索证明了这一点.
现在我处于两难境地:我想检查增加size_t的溢出因为我必须处理用户提供的数据,第三方库将使用我的代码.但是,对于溢出检查,我必须知道符号.它在实施中产生了巨大的差异.
那么 - 我应该如何在平台和编译器独立的方式编写这样的代码?
我可以检查size_t运行或编译时的签名吗?这将解决我的问题.或者也许size_t首先不是最好的主意.
有任何想法吗?
编辑:我正在寻找C语言的解决方案!
假设我在[0,1]范围内有一个浮点数,我想量化并将其存储在无符号字节中.听起来很简单,但事实上它很复杂:
显而易见的解决方案如下:
unsigned char QuantizeFloat(float a)
{
return (unsigned char)(a * 255.0f);
}
Run Code Online (Sandbox Code Playgroud)
这种方法到目前为止我得到的所有数字都是0到255,但整数的分布并不均匀.该函数仅255在a完全正确时才返回1.0f.不是一个好的解决方案
如果我做适当的舍入,我只是转移问题:
unsigned char QuantizeFloat(float a)
{
return (unsigned char)(a * 255.0f + 0.5f);
}
Run Code Online (Sandbox Code Playgroud)
这里的结果0只覆盖浮动范围的一半,而不是任何其他数字.
如何使用相等的浮点范围分布进行量化?理想情况下,如果我量化均匀分布的随机浮点数,我希望获得相等的整数分布.
有任何想法吗?
顺便说一句:我的代码也在C中,问题与语言无关.对于非C的人:只是假设,float以int转换截断浮动.
编辑:因为我们在这里有一些困惑:我需要一个映射,将最小的输入float(0)映射到最小的unsigned char,并将我的范围(1.0f)的最高浮点数映射到最高的无符号字节(255).
我想知道是否以及如何直接从win32(旧的C-API)控制RS-232握手线.
我想与外部硬件接口,两条简单的数据线就足以满足我的需求.
那么 - 是否有一个win32 API可以让我读写四个状态行的状态?在正常的串行通信中,握手线由UART自动驱动(如果启用了硬件握手).
我记得在DOS下它是微不足道的.只需要直接对UART进行编程.这个功能在某种程度上在win32中存活了吗?
对于FFT函数,我需要以位反转的方式对数组内的元素进行置换或混洗.这是FFT的常见任务,因为两个大小的FFT函数的大多数功能要么以位反转的方式期望或返回它们的数据.
例如,假设数组有256个元素,我想用它的位反转模式交换每个元素.这是两个例子(二进制):
Element 00000001b should be swapped with element 10000000b
Element 00010111b should be swapped with element 11101000b
Run Code Online (Sandbox Code Playgroud)
等等.
任何想法如何快速,更重要:就地?
我已经有一个执行此交换的功能.写一个并不难.由于这是DSP中常见的操作,我觉得有更聪明的方法比我非常简洁的循环更好.
有问题的语言是C,但任何语言都可以.
我正在寻找一个简单易学的C或C++跨平台gui库.
简而言之,我只需要以下功能:
目标平台将是Win32和Linux.MacOS很高兴,但目前并不重要.
我为什么要寻找最小的东西?我不想花太多时间为一个非常小的应用程序学习一个庞大而全面的抽象系统.越容易,越精益越好.
有什么建议?
我对从FFT获得的结果感到困惑,并希望得到任何帮助.
我正在使用FFTW 3.2.2但是与其他FFT实现(在Java中)得到了类似的结果.当我采用正弦波的FFT时,结果的缩放取决于波的频率(Hz) - 具体而言,它是否接近整数.当频率接近整数时,得到的值非常小,当频率在整数之间时,它们的数量级要大一些.该图显示了对应于不同频率的波频率的FFT结果中的尖峰幅度.这是正确的吗??
我检查了FFT的逆FFT等于原始正弦波乘以样本数,它是.FFT的形状似乎也是正确的.
如果我正在分析单个正弦波,那就不会那么糟糕了,因为无论高度如何,我都可以在FFT中寻找尖峰.问题是我想分析正弦波的总和.如果我正在分析正弦波的总和,例如440 Hz和523.25 Hz,那么只有523.25 Hz的正弦波峰值出现.另一个的尖峰非常小,看起来像是噪音.必须有一些方法来使这项工作,因为在Matlab中它确实有效 - 我在两个频率上得到类似大小的尖峰.如何更改下面的代码以均衡不同频率的缩放?
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <fftw3.h>
#include <cstdio>
using namespace std;
const double PI = 3.141592;
/* Samples from 1-second sine wave with given frequency (Hz) */
void sineWave(double a[], double frequency, int samplesPerSecond, double ampFactor);
int main(int argc, char** argv) {
/* Args: frequency (Hz), samplesPerSecond, ampFactor */
if (argc != 4) return -1;
double frequency = atof(argv[1]);
int samplesPerSecond = atoi(argv[2]);
double …Run Code Online (Sandbox Code Playgroud) 对于我正在研究的项目,我必须通过I2C与多功能芯片通信.我可以通过I2C/dev/i2c-1接口从linux用户空间执行此操作.
但是,似乎司机正在同时与同一芯片通话.这导致我的I2C_SLAVE访问失败,其中错误的值为EBUSY.好吧 - 我可以通过ioctl I2C_SLAVE_FORCE覆盖它.我尝试过,它的确有效.我的命令到达芯片.
问题:这样做是否安全?我确信我写的地址范围永远不会被任何内核驱动程序访问.但是,我不确定强制I2C通信是否会混淆某些内部状态机左右.(我不是那样进入I2C,我只是使用它......)
供参考,硬件事实:
OS: Linux Architecture: TI OMAP3 3530 I2C-Chip: TWL4030 (does power, audio, usb and lots of other things..)
c ×4
arm ×2
c++ ×2
embedded ×2
fft ×2
algorithm ×1
enums ×1
fftw ×1
frameworks ×1
handshaking ×1
i2c ×1
integer ×1
iphone ×1
ipod-touch ×1
linux ×1
neon ×1
quantization ×1
rounding ×1
serial-port ×1
size-t ×1
sorting ×1
winapi ×1