小编Ale*_*ing的帖子

Qt 图形绘制

我最近开始开发一个需要我可视化图形的项目,我正在寻找一种不错的算法来解决这个问题。

我正在绘制的图表模型数据流,因此合理的绘图可以是从左到右或从上到下。当然,它们是有向的并且大多是非循环的——也就是说,可能有一些向后的边缘,但这些比例很小,如果使用 DAG 作为输入基本上会在计算顶点位置之前删除这些边缘,我很乐意在计算顶点位置之前删除这些边缘。提高运行时间。

我在这个项目中使用 C++ 和 Qt,并且已经非常熟悉 Qt 提供的弹性节点和图表场景示例。如果有人看过 KCacheGrind,我想做的就是类似于它的调用图可视化。

我当前的尝试包括一种原始算法,该算法根据每个节点与根的最小距离将其分配给一个层,然后尝试以最小化边缘交叉的方式将节点定位在每个层内。我无法正确实现最后一部分,我相信这个问题是 NP-Hard 的。

我正在寻找的是关于过去使用什么类型的算法来有效解决这个问题的指导。

c++ qt drawing graph

5
推荐指数
1
解决办法
7752
查看次数

为什么调用虚函数修复错误?

我正在开发一个涉及逻辑电路仿真的项目(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都会表现出正确的行为.为什么这可能是?

编辑 …

java garbage-collection java-8

5
推荐指数
1
解决办法
237
查看次数

遍历Python中的分区

我想知道(在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)

有谁知道最好的方法吗?

python iteration loops list

5
推荐指数
1
解决办法
1213
查看次数

Java语言统计

我有兴趣收集一些我可以访问的大量Java代码的统计信息.我感兴趣的一些统计数据可能包括使用某些方法/类的频率,某些包的导入频率等等.

我的第一个想法是使用javaparser,但该库只支持Java 1.5,我的大多数代码都是1.6或更高.

有没有一个库可以从一些Java代码中给我一个准确的AST(也就是说,我能以某种方式问javac吗?),还是有更好的方法来解决这个问题(也许是检查字节码)?

java parsing

5
推荐指数
1
解决办法
111
查看次数

JSON.net(反)序列化非类型化属性

假设我有一个这样的类:

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在这种情况下不起作用。如何(反)序列化非类型化属性?

.net c# json json.net

5
推荐指数
1
解决办法
2113
查看次数

为什么GCC在使用int foo asm("ebx")将var固定到寄存器时会发出无操作的push/pop?

我正在尝试编写代码来从寄存器中读取,这是我到目前为止所做的:

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为另一个寄存器(说eaxecx),则它产生理智代码(只是一个retmov eax, ecx; ret分别地).

看这个例子Godbolt结果.

c x86 assembly gcc

4
推荐指数
1
解决办法
214
查看次数

如何在.NET Core中使用.settings文件?

我正在将应用程序移植到依赖于.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# msbuild .net-core

4
推荐指数
2
解决办法
9393
查看次数

C++中类似Haskell的`const`

所以在过去的几周里,我一直在尝试使用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++中是否可行?

templates functional-programming c++11

3
推荐指数
1
解决办法
138
查看次数

在GNU中以.intel_syntax区分内存与常量

我有一条用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)以获得预期的行为?

assembly gnu-assembler intel-syntax

2
推荐指数
1
解决办法
518
查看次数

NUnit断言AreEqual字符串差异

我正在为代码生成器编写单元测试,大多数测试将跨几行的输出与一些黄金输出进行比较。目前,我正在比较输出,Assert.AreEqual(string, string)以显示围绕第一个差异的上下文。

不幸的是,这不是很有帮助。理想情况下,我希望获得不同的输出。最好的方法是什么?我目前的计划是将生成的代码写入文件,并调用DIFFTOOLenv var 引用的可执行文件(否则diff.exePATH,否则为默认的NUnit行为),并Assert.Fail()使用适当的消息进行调用。

.net c# nunit nunit-3.0

2
推荐指数
1
解决办法
1759
查看次数

GMP 与 Windows 上的 MinGW

我设法在我的 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)

c gcc gmp ld

1
推荐指数
1
解决办法
4091
查看次数

使用声明:gcc和clang的另一个bug?

为什么gcc HEAD 10.0.0 20190Clang 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)

c++ using-declaration language-lawyer c++17

1
推荐指数
1
解决办法
165
查看次数