小编Aus*_*ley的帖子

CPUID的内在函数如信息?

考虑到我用C++编写代码,如果可能的话,我想使用类似内在函数的解决方案来阅读有关硬件的有用信息,我的顾虑/注意事项是:

  • 我不太了解汇编,只是获得这种信息是一项相当大的投资(尽管它看起来像CPU只是翻转值和读取寄存器.)
  • asm(英特尔和AT&T)至少有两种流行的语法,所以它是碎片化的
  • 奇怪的是,Intrinsics比asm代码更受欢迎和支持
  • 并非现在雷达中的所有编译器都支持内联asm,MSVC 64位是一个; 我担心我会发现其他类似的缺陷,同时深入研究我必须使用的不同编译器的功能集.
  • 考虑到这个交易,我认为对我来说更有效率的是它可以打赌Intrinsics,它应该比任何asm代码更容易.

我要回答的最后一个问题是:如何用内在函数做类似的事情?因为我没有找到除CPUID操作码以外的任何东西来获取这种信息.

c++ intrinsics cpuid

15
推荐指数
5
解决办法
7205
查看次数

在电影院里坐人

这是基于我读到的关于大型软件公司提出的谜题和面试问题的文章,但它有一个转折...

一般问题:

什么是算法让人们坐在电影院里,以便他们直接坐在他们的朋友旁边而不是他们的敌人旁边.

技术问题:

给定N×M网格,用N*M-1项填充网格.每个项目具有每个其他N*M-2项目的关联布尔值.在N的每一行中,与其他项目直接相邻的项目应该具有另一项的正关联值.然而,列无关紧要,即一个项目可以与其前面的项目"敌人".注意:如果项目A具有B的正关联值,则表示B也具有A的正关联值.对于负关联值,它的作用相同.保证项目与至少一个其他项目有正面关联.此外,在开始将它们放入网格之前,您可以访问所有项目及其关联值.

评论:

我一直在研究这个问题并从昨天开始考虑它,从我发现它让我想起了包装问题以及一些额外的要求.在一些空闲时间里,我试图实现它,但是大群"敌人"坐在一起.我相信大多数情况都必须至少有一对敌人坐在一起,但我的解决方案远非最佳.它实际上看起来好像我已经随机化了它.

就我的实现而言,我做了N = 10,M = 10,项目数= 99,并且对于每个具有随机布尔值的大小为99的数组,该布尔值引用相应项目编号的友谊.这意味着每个项目都有一个与他们自己相对应的友谊值,我只是忽略了这个值.

我打算稍后再尝试重新实现这个,我会发布代码.谁能想出一个"好"的方法来做到这一点,以尽量减少敌人之间的座位冲突?

language-agnostic algorithm multidimensional-array

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

0 + 0 + 0 ... + 0!= 0

我有一个程序,它在图表中查找路径并输出累计权重.图中的所有边都具有0到100的单个权重,其形式为浮点数,最多2位小数.

在Windows/Visual Studio 2010上,对于由0权重的边组成的特定路径,它输出正确的总权重0.但是在Linux/GCC上,程序说该路径的权重为2.35503e-38.我有很多关于浮动引起的疯狂错误的经验,但是0 + 0什么时候会等于0以外的任何东西?

我能想到的唯一一件事是导致这个问题是程序确实将一些权重视为整数,并使用隐式强制将它们添加到总数中.但是0 + 0.0f仍然等于0.0f!作为一个快速修复,我将总数降低到0,当时小于0.00001,这足以满足我的需求.但是什么vodoo导致了这个?

注意:我100%确信图中没有任何权重超出我提到的范围,并且此特定路径中的所有权重都为0.

编辑:详细说明,我已经尝试从文件中读取权重并在代码中手动设置它们等于0.0f除了将它们添加到总数之外,没有对它们执行任何其他操作.

c++ floating-point

11
推荐指数
2
解决办法
1158
查看次数

调整子项大小时,保持scrollviewer的相对滚动条偏移量

我有一个带有网格的滚动查看器作为孩子.我正在更改网格的宽度和高度属性以显示不同的"缩放"级别.网格包含2行,其中包含许多图像列,大小相同.

但是,我希望滚动条的相对位置保持不变.在更改网格大小后,屏幕中心的任何内容仍应位于屏幕中央.

默认"放大"视图:

private void SizeGrid()
{
    grid1.Width = (scrollViewer1.ViewportWidth / 2) * grid1.ColumnDefinitions.Count;
    grid1.Height = (scrollViewer1.ViewportHeight / 2) * grid1.RowDefinitions.Count;        
}
Run Code Online (Sandbox Code Playgroud)

"缩小"观点:

private void scrollViewer1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyboardDevice.IsKeyDown(Key.Insert))
    {
        grid1.Width = (scrollViewer1.ViewportWidth / 2) * grid1.ColumnDefinitions.Count / 5;
        grid1.Height = (scrollViewer1.ViewportHeight / 2) * grid1.RowDefinitions.Count / 3;
    }
}
Run Code Online (Sandbox Code Playgroud)

我做了什么 ......

如果我知道哪个列是关注的(我不想知道这个):

double shiftAmount = (scrollViewer1.ScrollableWidth / (grid1.ColumnDefinitions.Count - columnsOnScreen));
scrollViewer1.ScrollToHorizontalOffset(column * shiftAmount);
Run Code Online (Sandbox Code Playgroud)

如果我不确切知道他们正在看什么列,但我只是想保持相对位置......

double previousScrollRatio = scrollViewer1.HorizontalOffset / scrollViewer1.ScrollableWidth;
//resize grid...
scrollViewer1.ScrollToHorizontalOffset(previousScrollRatio * scrollViewer1.ScrollableWidth);
Run Code Online (Sandbox Code Playgroud)

两种方法都不奏效.如果我以滚动条居中缩小,则滚动条将转到最右侧.任何的想法? …

c# wpf

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

这种语法需要什么类型的解析器?

我有一个语法,我不知道我需要什么类型的解析器来解析它,除了我不相信语法是LL(1).我想我需要一个带有回溯或某种LL(*)的解析器.我想出的语法(可能需要重写)是:

S: Rules
Rules: Rule | Rule Rules
Rule: id '=' Ids
Ids: id | Ids id
Run Code Online (Sandbox Code Playgroud)

我试图生成的语言看起来像这样:

abc = def g hi jk lm
xy = aaa bbb ccc ddd eee fff jjj kkk
foo = bar ha ha 
Run Code Online (Sandbox Code Playgroud)

零个或多个规则,其中包含左侧标识符,后跟等号后跟一个或多个标识符.我认为编写解析器时遇到问题的部分是语法允许规则中的任何数量的id,并且判断新规则何时开始的唯一方法是找到id =,这需要回溯.

对于手写解析器,有没有人知道这种语法的分类和解析的最佳方法?

grammar parsing

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

c ++将字符串转换为void指针

我使用一个具有回调函数的库,其中一个参数是类型void *.(我想让我们发送任何类型的价值.)

我需要传递一个字符串(std::string或者char[]是一个相同的).

我怎样才能做到这一点?

c++ string casting void void-pointers

5
推荐指数
2
解决办法
2万
查看次数

移植WinForms拖放到WPF拖放

我正在将我的程序从WinForms移植到WPF,并遇到了拖放问题.它应该允许从TreeView(它就像文件浏览器)拖动到打开文件的文本框.但是,WPF版本就像自动复制并粘贴了TreeViewItem标题文本.我想我只是混淆了什么?可能是DataObject东西.

功能齐全,相关的WinForms代码:

private void treeView1_MouseMove(object sender, MouseEventArgs e)
{
    if (e.Button != MouseButtons.Left) return;
    TreeNode node = treeView1.GetNodeAt(e.Location);
    if (node != null) treeView1.DoDragDrop(node, DragDropEffects.Move);
}

textbox[i].DragDrop += (o, ee) =>
{
     if (ee.Data.GetDataPresent(typeof(TreeNode)))
     {
         TreeNode node = (TreeNode)ee.Data.GetData(typeof(TreeNode));   
         ((Textbox)o).Text = File.ReadAllLines(pathRoot + node.Parent.FullPath);
         ...
Run Code Online (Sandbox Code Playgroud)

应该做同样事情的WPF代码:

private void TreeView_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    TreeViewItem item = e.Source as TreeViewItem;
    if (item != null)
    {
        DataObject dataObject = new DataObject();
        dataObject.SetData(DataFormats.StringFormat, GetFullPath(item));
        DragDrop.DoDragDrop(item, dataObject, DragDropEffects.Move);
    }
}

//textbox[i].PreviewDrop …
Run Code Online (Sandbox Code Playgroud)

.net c# wpf winforms

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

使用g ++进行ifstream错误但使用Visual Studio进行编译

我一直在使用Visual Studio来处理我正在进行的项目,尽管它也必须在Linux上使用GCC进行编译.我已经完成了我的项目并运行良好,但我将文件发送到我的Linux shell并且我收到一个错误的代码:

std::ifstream input(s);
Run Code Online (Sandbox Code Playgroud)

这给了我一个错误,说没有匹配的功能.sstd::string的方式.任何人都可以告诉我为什么它在Visual Studio下运行而不是GCC,即使我正在查看ifstream的文档?也许是旧版GCC?

编辑:GCC版本是4.2.1确切的错误是:

error: no matching function for call to 'std::basic_ifstream<char,  
std::char_traits<char>>::basic_ifstream(std::string&)'
Run Code Online (Sandbox Code Playgroud)

编辑2:相关代码:

std::string s = "";
if(argc == 2)
    s = argv[1];
else{
    std::cout << "Bad filename?" << std::endl;
    return 1;
}
std::ifstream input(s);
Run Code Online (Sandbox Code Playgroud)

c++ compiler-errors g++ visual-studio

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

为什么ShowGridLines这么慢?

我注意到启用ShowGridLinesa Grid会导致巨大的性能损失.

我有Grid一个ScrollViewer.当我手动滚动时,应用程序运行正常.但是,如果我以编程方式滚动,使用计时器顺利滚动,它运行非常慢ShowGridLines.

ShowGridLines 关闭,滚动在小于1/2的第二完成按预期方式.随着ShowGridLines ,滚动需要2-5秒,抽搐不可预知.

为什么会ShowGridLines造成这样的性能损失?手动滚动时为什么不这样做?有没有解决的办法?

.net c# wpf performance

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

找到给定范围内的所有A ^ x

我需要找到所有单项的形式的X是评估时范围内从mn.可以肯定地说,基数A大于1,功率X大于2,并且只需要使用整数.例如,在50到100的范围内,解决方案将是:

2^6
3^4
4^3
Run Code Online (Sandbox Code Playgroud)

我解决这个问题的第一个尝试就是强行执行所有组合AX使其"有意义".然而,当在大范围内用于非常大的数字时,这变得太慢,因为这些解决方案在更密集的处理中被使用.这是代码:

def monoSearch(min, max):
    base = 2
    power = 3

    while 1:
        while base**power < max:
            if base**power > min:
                print "Found " + repr(base) + "^" + repr(power) + "   = " + repr(base**power)    
            power = power + 1
        base = base + 1
        power = 3
        if base**power > max:
            break
Run Code Online (Sandbox Code Playgroud)

我可以base**power通过将值保存在临时变量中来删除一个,但我认为这不会产生重大影响.我也想知道使用对数是否更好或者是否有一个封闭的表单表达式.我愿意接受任何优化或替代方案来寻找解决方案.

python algorithm optimization

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