我最近开始开发一个需要我可视化图形的项目,我正在寻找一种不错的算法来解决这个问题。
我正在绘制的图表模型数据流,因此合理的绘图可以是从左到右或从上到下。当然,它们是有向的并且大多是非循环的——也就是说,可能有一些向后的边缘,但这些比例很小,如果使用 DAG 作为输入基本上会在计算顶点位置之前删除这些边缘,我很乐意在计算顶点位置之前删除这些边缘。提高运行时间。
我在这个项目中使用 C++ 和 Qt,并且已经非常熟悉 Qt 提供的弹性节点和图表场景示例。如果有人看过 KCacheGrind,我想做的就是类似于它的调用图可视化。
我当前的尝试包括一种原始算法,该算法根据每个节点与根的最小距离将其分配给一个层,然后尝试以最小化边缘交叉的方式将节点定位在每个层内。我无法正确实现最后一部分,我相信这个问题是 NP-Hard 的。
我正在寻找的是关于过去使用什么类型的算法来有效解决这个问题的指导。
我正在开发一个涉及逻辑电路仿真的项目(Java 8).这些电路在我用ANTLR v4解析的输入文件中描述.
使用ANTLR的访问者类,我构建了一个Composite结构,它存储了模拟电路所需的所有组件.
// module is an ANTLR parse tree
BLXCircuit mainCircuit = modelGenerator.visit(module);
Run Code Online (Sandbox Code Playgroud)
之后,我将此电路的输入初始化为用户指定的任何内容,但为简单起见,我将它们初始化为false(假设有3个输入):
Map<BLXSocket, Boolean> valueMap = new HashMap<>();
List<BLXSocket> inputs = mainCircuit.getInputSockets();
valueMap.put(inputs.get(0), false);
valueMap.put(inputs.get(1), false);
valueMap.put(inputs.get(2), false);
Run Code Online (Sandbox Code Playgroud)
然后我启动评估者:
BLXEventManager eventManager = new BLXEventManager(valueMap, 500);
eventManager.start();
Run Code Online (Sandbox Code Playgroud)
所有这些在Mac OS X上完美运行,但是当我在Windows或Linux上运行它时,评估只是......通过返回不正确的值而无声地失败.程序优雅地退出,输出错误的计算.
但是,这是我的问题,如果我定义函数:
private static void noAction(BLXSignalReceiver unused) { }
private static void whyDoesThisFixThings(BLXCircuit blxCircuit) {
for (BLXSocket blxSocket : blxCircuit.getInputSockets()) {
blxSocket.getTargets().forEach(Main::noAction);
}
}
Run Code Online (Sandbox Code Playgroud)
在声明之后添加对此函数的调用mainCircuit:
BLXCircuit mainCircuit = modelGenerator.visit(module);
whyDoesThisFixThings(mainCircuit); // why??
Run Code Online (Sandbox Code Playgroud)
那么Windows和Linux都会表现出正确的行为.为什么这可能是?
编辑 …
我想知道(在Python中)迭代给定大小的列表的分区的最佳方法是什么。
举例来说,我们有列表[1,2,3,4,5],我们想要k=3分区。一个糟糕的方法是这样写:
lst = [1,2,3,4,5]
for i in range(1,len(lst)):
for j in range(i+1, len(lst)):
print lst[:i], lst[i:j], lst[j:]
Run Code Online (Sandbox Code Playgroud)
这给
[1], [2], [3,4,5]
[1], [2,3], [4,5]
...
[1,2,3], [4], [5]
Run Code Online (Sandbox Code Playgroud)
但是,如果我以后想遍历k=4分区,则必须添加一个for循环嵌套级别,这在运行时无法完成。理想情况下,我想写一些类似的东西:
for part in partitions([1,2,3,4,5], k):
print part
Run Code Online (Sandbox Code Playgroud)
有谁知道最好的方法吗?
我有兴趣收集一些我可以访问的大量Java代码的统计信息.我感兴趣的一些统计数据可能包括使用某些方法/类的频率,某些包的导入频率等等.
我的第一个想法是使用javaparser,但该库只支持Java 1.5,我的大多数代码都是1.6或更高.
有没有一个库可以从一些Java代码中给我一个准确的AST(也就是说,我能以某种方式问javac吗?),还是有更好的方法来解决这个问题(也许是检查字节码)?
假设我有一个这样的类:
public class Example {
public int TypedProperty { get; set; }
public object UntypedProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
假设有人出现并写道:
var example = new Example
{
TypedProperty = 5,
UntypedProperty = Guid.NewGuid()
}
Run Code Online (Sandbox Code Playgroud)
如果我用 序列化它JsonConvert.SerializeObject(example),我得到
{
"TypedProperty": 5,
"UntypedProperty": "24bd733f-2ade-4374-9db6-3c9f3d97b12c"
}
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想得到这样的东西:
{
"TypedProperty": 5,
"UntypedProperty":
{
"$type": "System.Guid,mscorlib",
"$value": "24bd733f-2ade-4374-9db6-3c9f3d97b12c"
}
}
Run Code Online (Sandbox Code Playgroud)
但TypeNameHandling在这种情况下不起作用。如何(反)序列化非类型化属性?
我正在尝试编写代码来从寄存器中读取,这是我到目前为止所做的:
unsigned int readEBX(void) {
register unsigned int reg asm("ebx");
return reg;
}
Run Code Online (Sandbox Code Playgroud)
该函数似乎正在工作,但它编译成奇怪的东西:
readEBX():
mov eax, ebx
push ebx
pop ebx
ret
Run Code Online (Sandbox Code Playgroud)
为什么要推出那款pop-then-pop ebx?这不是什么都不做?当我替换ebx为另一个寄存器(说eax或ecx),则它产生理智代码(只是一个ret和mov eax, ecx; ret分别地).
看这个例子Godbolt结果.
我正在将应用程序移植到依赖于.settings文件的.NET Core 。不幸的是,我找不到从.NET核心读取它的方法。通常,.csproj将以下行添加到中将生成一个TestSettings类,该类可以让我读取设置。
<ItemGroup>
<None Include="TestSettings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
</None>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
不幸的是,这似乎不再有任何作用。我什至无法验证SettingsSingleFileGenerator运行情况。这个GitHub问题表明这是新.csproj格式的错误,但是没有人提供替代方法。
.settings在.NET Core 中读取文件的正确方法是什么?
所以在过去的几周里,我一直在尝试使用C++ 11中的问题的函数式编程类型解决方案,并且我经常遇到需要一个返回常量值的函数的情况.
在Haskell中,有一个功能
const :: a -> b -> a
const x = \_ -> x
Run Code Online (Sandbox Code Playgroud)
返回一个函数,该函数计算const的原始参数,无论提供给它的参数是什么.我想在C++ 11中创建类似的东西.这种结构对于表示函数中的特殊行为很有用(发送到过滤器的常量函数将保持数据完整).这是我的第一次尝试:
template<class T>
std::function<T(...)> constF(T x) {
return ([x](...) { return x; });
}
Run Code Online (Sandbox Code Playgroud)
这可以自行编译,但任何使用它的尝试都会导致类型不完整的错误.我的第二次尝试是这样的:
template<class T, class... Args>
std::function<T(Args...)> constF(T x) {
return ([x](Args...) { return x; });
}
Run Code Online (Sandbox Code Playgroud)
这更接近,但不允许我提供任何参数,除非我明确说明它们.
auto trueFunc1 = constF(true);
auto trueFunc2 = constF<bool, int>(true);
cout << trueFunc1() << endl; //works
cout << trueFunc1(12) << endl; //doesn't compile
cout << trueFunc2(12) << endl; //works
Run Code Online (Sandbox Code Playgroud)
理想情况下,正确的构造在trueFunc1和trueFunc2之间不会产生任何差异.
这在C++中是否可行?
我有一条用Intel语法编写的指令(使用gas作为汇编程序),看起来像这样:
mov rdx, msg_size
...
msg: .ascii "Hello, world!\n"
.set msg_size, . - msg
Run Code Online (Sandbox Code Playgroud)
但是该mov指令正在汇编到mov 0xe,%rdx,而不是mov $0xe,%rdx我期望的那样。我应该如何编写第一条指令(或的定义msg_size)以获得预期的行为?
我正在为代码生成器编写单元测试,大多数测试将跨几行的输出与一些黄金输出进行比较。目前,我正在比较输出,Assert.AreEqual(string, string)以显示围绕第一个差异的上下文。
不幸的是,这不是很有帮助。理想情况下,我希望获得不同的输出。最好的方法是什么?我目前的计划是将生成的代码写入文件,并调用DIFFTOOLenv var 引用的可执行文件(否则diff.exe为PATH,否则为默认的NUnit行为),并Assert.Fail()使用适当的消息进行调用。
我设法在我的 Windows 7(64 位计算机)上成功构建了 GMP 库。我遵循的步骤是:
./configure --enable_cxx --disable-static --enable-shared --prefix="/c/MinGW"
make
make install
make check
Run Code Online (Sandbox Code Playgroud)
所有测试都成功通过。显然,我正处于可以编译和运行 GMP 程序的地步。但是,当我尝试编译以下程序时:
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <gmp.h>
char *progname;
void print_usage_and_exit ()
{
fprintf (stderr, "usage: %s -q nnn\n", progname);
fprintf (stderr, "usage: %s nnn ...\n", progname);
exit (-1);
}
int main (int argc, char **argv)
{
mpz_t n;
int i;
progname = argv[0];
if (argc < 2)
print_usage_and_exit ();
mpz_init (n);
if (argc == 3 && strcmp (argv[1], "-q") …Run Code Online (Sandbox Code Playgroud) 为什么gcc HEAD 10.0.0 20190和Clang HEAD 9.0.0这两个反对这个计划?
#include <iostream>
void g( int x )
{
std::cout << "Hello g( " << x << " )\n";
}
template <int N>
void g()
{
std::cout << "Hello g<N>( " << N << " )\n";
}
namespace N
{
using ::g;
}
void g( int x = 20 );
template <int N = 10>
void g();
int main()
{
N::g();
N::g<>();
}
Run Code Online (Sandbox Code Playgroud)
例如gcc发出错误
prog.cc: In function 'int main()': …Run Code Online (Sandbox Code Playgroud)