我正在编写一个相当大而复杂的数据分析程序,我已经达到了我认为是时候为程序构建GUI的时候了.所以我的问题是:
我应该使用哪个GUI工具包?
我对编码和构建GUI完全陌生,并且非常感谢可以提供的任何指导.它不一定是世界上最简单的工具包,我学得很快.但是,它确实需要能够执行以下操作(如果不是所有这些对于任何给定的工具包都可能是非常基本的,但我认为将所有这些放在那里以防万一是好的).
它必须允许我直接绘制到屏幕上,以便我可以将图形(光谱确实),图形和类似的东西放在用户看到.我需要能够收集他们点击上述光谱的位置信息.我需要能够显示文本并从用户那里获取文本输入.它需要能够生成菜单(你知道文件,编辑等).如果它有一些内置的小部件用于生成会很方便的表(虽然我可以克服缺乏,如果我可以直接绘制到屏幕).它需要能够弹出警告,对话框,保存和打开框等.这就是它,当我把它们写出来时,大多数这些看起来非常基本,但我不想让GUI部分编码和然后意识到II需要用不同的工具包重写它.
应该注意的是,我用C++编写了这个程序,并且我不想用C或其他东西编写GUI部分,因此工具包需要支持C++.
此外,跨平台工具包优于单个平台工具包.但是,如果它必须是单个平台工具包,那么我更希望它适用于Linux.
最后,我会优先考虑将开源工具包改为封闭源工具包.
除此之外,我无法想到要添加的任何内容.提前感谢您的时间和答案.
嗯基于答案,我将看看Qt和wxWidgets,看看哪个更吸引我.我可以接受多个答案,但我不能,因为我正在看两件事,只接受其中一个答案是不公平的,也许在一两个星期后我就看了工具包并想通了出来我想用.
我有许多小块数据,我希望能够将其推入一个更大的数据类型.假设,假设这是一个日期和时间.显而易见的方法是通过像这样的位字段.
struct dt
{
unsigned long minute :6;
unsigned long hour :5;
unsigned long day :5;
unsigned long month :4;
unsigned long year :12;
}stamp;
Run Code Online (Sandbox Code Playgroud)
现在让我们假装这个东西是有序的,这样首先声明的东西比后面声明的东西具有更高的重要性,所以如果我用变量的第一个字母表示位,它看起来像:
mmmmmm|hhhhh|ddddd|mmmm|yyyyyyyyyyyy
Run Code Online (Sandbox Code Playgroud)
最后,让我假装我只是声明一个unsigned long并使用mask将它拆分并移动来做同样的事情.
unsigned long dateTime;
Run Code Online (Sandbox Code Playgroud)
这是我的问题:
在计算机需要做什么方面,以下方法是访问分钟,小时等等的方法吗?或者是否存在编译器/计算机与位字段一起使用的一些棘手方法.
unsigned minutes = stamp.minutes;
//versus
unsigned minutes = ((dateTime & 0xf8000000)>>26;
Run Code Online (Sandbox Code Playgroud)
和
unsigned hours = stamp.hours;
//versus
unsigned hours = ((dateTime & 0x07C00000)>>21;
Run Code Online (Sandbox Code Playgroud)
等等
本质上,我有一个伽马探测器系统,每个探测器被分成4个晶体,如果只有2个晶体发生碰撞,我们可以确定该对晶体是垂直于还是平行于产生伽马射线的反应平面。在为此编写逻辑的过程中,我最后编写了一个庞大而丑陋的switch语句组合,这些语句在每个检测器中检查晶体编号的组合(在整个检测器及其晶体阵列中都是唯一的)。这是代码,包括相关功能。
//The Parallel and Perpendicular designations are used in addition to the Double
//designation for the 90 degree detectors if we get a diagonal scatter in those detectors
//then we use the Double designation
enum ScatterType{Single, Double, Triple, Quadruple, Parallel, Perpendicular};
ScatterType EventBuffer::checkDoubleGamma(int det)
{
int num1=evList[crysList[0]].crystalNum;
int num2=evList[crysList[1]].crystalNum;
switch(det)
{
case 10: //first of the 90 degree detectors
if( (num1==40 && num2==41) || //combo 1
(num1==41 && num2==40) || //combo 1 reverse
(num1==42 && num2==43) || //combo 2
(num1==43 …Run Code Online (Sandbox Code Playgroud) 我是物理专业的研究生,我正在编写一些代码来分类几百千兆字节的数据,并在我要求时返回那些数据.这是诀窍,我知道没有很好的方法来排序和搜索这种数据.
我的数据基本上由大量数字组成.这些集合中可以包含1到n个数字(尽管在99.9%的集合中,n小于15),并且这些集合大约有1.5到20亿(不幸的是,这个大小排除了强力搜索).
我需要能够指定一个具有k个元素的集合,并且每个集合都包含k + 1个或更多元素,其中包含返回给我的指定子集.
简单示例:
假设我的数据有以下几组:
(1,2,3)
(1,2,3,4,5)
(4,5,6,7)
(1,3,8,9)
( 5,8,11)
如果我要提出请求(1,3),我会得到集合:(1,2,3),(1,2,3,4,5)和(1,3,8,9).
请求(11)将返回集合:(5,8,11).
请求(1,2,3)将返回集:(1,2,3)和(1,2,3,4,5)
请求(50)将不返回任何集:
到现在为止,模式应该清晰.这个例子和我的数据之间的主要区别在于,没有我的数据的集合更大,用于集合的每个元素的数字从0到16383(14位)运行,并且还有许多集合.
如果它很重要我用C++编写这个程序虽然我也知道java,c,一些程序集,一些fortran和一些perl.
有没有人有任何关于如何解决这个问题的线索?
编辑:
回答几个问题并添加几点:
1.)数据不会改变.这一切都是在一长串运行中进行的(每个运行分为2个gig文件).
2.)至于存储空间.原始数据占用大约250千兆字节.我估计在处理和剥离了许多我不感兴趣的无关元数据后,我可以将其降低到36到48千兆字节,具体取决于我决定保留多少元数据(没有索引).另外,如果在我初始处理数据时遇到了相同的设置,我可能会通过添加重复事件的计数器来进一步压缩数据,而不是简单地一遍又一遍地重复事件.
3.)处理集内的每个数字实际上包含至少两个数字14位用于数据本身(检测到的能量)和7位用于元数据(检测器编号).所以我需要每个数字至少三个字节.
4.)我的"虽然在99.9%的集合中,n小于15"但评论具有误导性.在初步浏览一些数据块时,我发现我有多达22个数字的集合,但中位数是每组5个数字,平均值是每组6个数字.
5.)虽然我喜欢构建指向文件的索引的想法,但我有点怀疑,因为对于涉及多个数字的请求,我留下了半慢的任务(至少我认为它很慢)找到集合列表共有的所有指针,即找到给定数量的集合的最大公共子集.
6.)就我可用的资源而言,在我获得系统上的原始数据(我在该系统上的配额的剩余部分)后,我可以获得大约300个空间.该系统是一个双处理器服务器,具有2个四核amd和16 GB的内存.
7.)是0可以发生,它是数据采集系统的工件,但它可以发生.
首先,我为这个简单问题的漫长导致道歉.
我正在实现一个类,它在空间填充曲线上作为非常长的1维索引,或者表示索引对应的笛卡尔坐标的n元组.
class curvePoint
{
public:
friend class curveCalculate;
//Construction and Destruction
curvePoint(): point(NULL), dimensions(0) {}
virtual ~curvePoint(){if(point!=NULL) delete[] point;}
//Mutators
void convertToIndex(){ if(isTuple()) calc(this); }
void convertToTuple(){ if(isIndex()) calc(this); }
void setTuple(quint16 *tuple, int size);
void setIndex(quint16 *index, int size);
void setAlgorithm(curveType alg){algorithm = alg;}
//Inspectors
bool isIndex(){return current==Index;}
bool isTuple(){return current==Tuple;}
size_t size(){return dimensions;}
quint16 operator[](size_t index);
enum curveType{HilbertCurve, ZCurve, GrayCodeCurve};
enum status{Index, Tuple};
private:
curveCalculate calc;
curveType algorithm;
quint16 *point;
size_t dimensions;
status current;
};
Run Code Online (Sandbox Code Playgroud)
(点指向 …
我正在编写一些处理数据的代码.用户可以选择许多处理函数组,然后将这些处理函数应用于数据集.我想在不同的地方实现所有这些组,但由于它们都采用相同的参数并且所有类似的事情我希望它们具有共同的接口.
作为一个优秀的小型c ++程序员,我首先想到的是简单地使用多态.只需使用所需的接口创建一些抽象类,然后从中派生每组处理对象.当我想到另一个皱纹时,我的希望很快就破灭了.这些数据集是巨大的,导致所讨论的函数被称为数十亿次.虽然动态查找相当便宜,但据我所知,它比标准函数调用慢得多.
我目前解决这个问题的想法是使用函数指针,方式如下:
void dataProcessFunc1(mpz_class &input){...}
void dataProcessFunc2(mpz_class &input){...}
...
class DataProcessInterface
{
...
void (*func1)(mpz_class);
void (*func2)(mpz_class);
...
}
Run Code Online (Sandbox Code Playgroud)
使用某种构造函数或某些东西来设置指向正确事物的指针.
所以我想我的问题是:这是一个好方法吗?还有另外一种方法吗?或者我应该学会停止担心并喜欢动态查找?
我正在写一个数据采集系统.该系统既可以处理来自信号数字化仪的快速数据,也可以缓慢控制/监控诸如探测器的高压系统.慢速控制系统每秒读取一次电压并将其写入数据结构.
在写入磁盘之前,每个事件都标记有其检测器的电压.为此,事件处理线程读取慢速控制/监视线程写入的结构.
如果在电压读取后X微秒发生的事件被标记为前一秒的电压读取并不重要:我是否需要使用互斥锁来保护结构中的数据结构或原子变量?
我有代码,我正在努力加快.首先,我使用了SSE内在函数并获得了显着的收益.我现在正试图看看我是否可以用AVX内在函数做类似的事情.代码本质上需要两个数组,根据需要添加或减去它们,对结果进行平方,然后将所有这些方块加在一起.
下面是使用sse intrinsics的代码的简化版本:
float chiList[4] __attribute__((aligned(16)));
float chi = 0.0;
__m128 res;
__m128 nres;
__m128 del;
__m128 chiInter2;
__m128 chiInter;
while(runNum<boundary)
{
chiInter = _mm_setzero_ps();
for(int i=0; i<maxPts; i+=4)
{
//load the first batch of residuals and deltas
res = _mm_load_ps(resids+i);
del = _mm_load_ps(residDeltas[param]+i);
//subtract them
nres = _mm_sub_ps(res,del);
//load them back into memory
_mm_store_ps(resids+i,nres);
//square them and add them back to chi with the fused
//multiply and add instructions
chiInter = _mm_fmadd_ps(nres, nres, chiInter);
}
//add the 4 intermediate …Run Code Online (Sandbox Code Playgroud) 我正在编写一个共享库供 python 调用。由于这是我第一次使用 python 的ctypes模块,并且几乎是我第一次编写共享库,我一直在编写 C 和 python 代码来调用库的函数。
最重要的是,我放入了一些计时代码,发现虽然 C 程序对库的大多数调用都非常快,但第一个调用很慢,实际上比它的 Python 对应程序慢得多。这与我的预期背道而驰,希望有人能告诉我原因。
这是我的 C 库中头文件的精简版本。
typedef struct MdaDataStruct
{
int numPts;
int numDists;
float* data;
float* dists;
} MdaData;
//allocate the structure
void* makeMdaStruct(int numPts, int numDist);
//deallocate the structure
void freeMdaStruct(void* strPtr);
//assign the data array
void setData(void* strPtr, float* divData);
Run Code Online (Sandbox Code Playgroud)
这是调用函数的 C 程序:
int main(int argc, char* argv[])
{
clock_t t1, t2;
t1=clock();
long long int diff;
//test the allocate function
t1 = clock(); …Run Code Online (Sandbox Code Playgroud) 我正在为一种类型的输入文件编写解析器。输入文件如下所示:
[CalculationBlock]
CalculationTitle="Test Parser Input System" , MatchingRadius=25.0, StepSize=0.01,ProblemType=RelSchroedingerEqn
MaxPartialWaveJ=800, SMatConv=10E-8
PartialWaveConv= 10E-8, SmallValueLimit = 10E-8
PotentialRadType=HeavyIon
[end]
Run Code Online (Sandbox Code Playgroud)
从本质上讲,它分为多个块,[BlockName]每个块以开头,然后在其中包含一组命名参数。命名的参数可以用','或'\n'字符分隔。
使用上面给出的不完整的输入文件,我想为其编写一个解析器,以作为更完整的输入文件的起点。我这样做了,但是解析器有一个缺点,我不确定该如何解决。它与参数顺序无关。例如,如果用户将参数放在失败PartialWaveConv= 10E-8之前SMatConv=10E-8。
我简要地考虑了枚举块中参数的每个可能顺序,但是由于存在n!n个参数值对的置换,因此我将其丢弃。所以我的问题是:有没有办法使解析器与参数顺序无关?
我写的玩具解析器如下,如果是业余爱好者,我深表歉意,这是我的第一次尝试boost,更不用说了boost.spirit。
#include<string>
#include<iostream>
#include<cstdlib>
#include<fstream>
#include<boost/config/warning_disable.hpp>
#include<boost/spirit/include/qi.hpp>
#include<boost/spirit/include/phoenix_core.hpp>
#include<boost/spirit/include/phoenix_operator.hpp>
#include<boost/spirit/include/phoenix_object.hpp>
#include<boost/fusion/include/adapt_struct.hpp>
#include<boost/fusion/include/io.hpp>
#include<boost/spirit/include/support_istream_iterator.hpp>
namespace blocks
{
namespace qi = boost::spirit::qi;
namespace ascii = boost::spirit::ascii;
namespace phoenix = boost::phoenix;
struct CalcBlock
{
std::string calculationTitle;
float matchingRad;
float stepSize;
std::string problemType; …Run Code Online (Sandbox Code Playgroud) 我正在写一个B-link树及其伴随的子类,如数据页类和节点类等.
我想知道有没有办法保护节点和页面的公共接口,这样只有b-link树类本身才能访问它们,而不会同时将页面和节点的私有方法暴露给b-link类?
IE我已经想过简单地将页面和节点的"公共"界面更改为受保护的类别,然后将B-link树声明为朋友,但是这使得b-link树可以访问我想要保留的私有方法私人的.
我编写了一个程序来处理以big-endian格式写入磁盘的一些数据,因此程序需要交换字节才能执行其他操作.在分析代码后,我发现我的字节交换功能占用了30%的执行时间.所以我想,我怎么能加快速度呢?所以我决定写一小块内联汇编.
我想取代这个:
void swapTwoByte(char* array, int numChunks)
{
for(int i= (2*numChunks-1); i>=0; i-=2)
{
char temp=array[i];
array[i]=array[i-1];
array[i-1]=temp;
}
}
Run Code Online (Sandbox Code Playgroud)
有了这个:
void swapTwoByte(int16* array, int numChunks)
{
for(int i= (numChunks-1); i>=0; --i)
{
asm("movw %1, %%ax;"
"rorw %%ax;"
"rorw %%ax;"
"rorw %%ax;"
"rorw %%ax;"
"rorw %%ax;"
"rorw %%ax;"
"rorw %%ax;"
"rorw %%ax;"
"movw %%ax, %0;"
: "=r" ( array[i] )
: "r" (array[i])
:"%ax"
);
}
}
Run Code Online (Sandbox Code Playgroud)
这是预期的工作,但这是很多旋转操作.
所以这是我的问题:根据这个来源, rorw可以采用两个操作数,而在gas sytax中,源操作数应该是要旋转的位数,但每次我尝试用类似的东西替换8个旋转权限的列表
".set rotate, 0x0008"
"rorw rotate, %%ax"
Run Code Online (Sandbox Code Playgroud)
我收到一个汇编错误说明:
"Error: …Run Code Online (Sandbox Code Playgroud) 我有一个multiprocessing.pool.map用于做一些工作的 python 脚本。随着它的进行,它会将内容打印到stdout,对于错误,它会打印到stderr。我决定为每个流都有一个单独的日志文件会很好,经过一些思考后,我应该像这样运行它:
time ./ecisSearch.py 58Ni.conf 4 1 > >(tee stdout.log) 2> >(tee stderr.log >&2)
Run Code Online (Sandbox Code Playgroud)
这为我提供了日志文件并将输出保留在适当的流上。然而问题来了。如果我在没有重定向的情况下运行它,我会得到这个:
$ time ./ecisSearch.py 58Ni.conf 4 1
2015-01-09 14:42:37.524333: This job will perform 4 fit(s) //this is stdout
2015-01-09 14:42:37.524433: Threaded mapping of the fit function onto the starting point input set is commencing //this is stdout
2015-01-09 14:42:37.526641: Starting run #: 0 //this is stdout
2015-01-09 14:42:37.527018: Starting run #: 1 //this is stdout
2015-01-09 14:42:37.529124: Starting run …Run Code Online (Sandbox Code Playgroud)