我让Virtual Box 3.2正常运行,在64位Windows 7主机中模拟32位Windows XP.然后我升级到VirtualBox 4.0.4,一切似乎都有效(在我安装了一些东西之后 - USB2.0支持,Guest Additions).
然后我恢复了在3.2版本下拍摄的快照,现在我已经丢失了所有内容.我收到错误消息:
The selected virtual machine is *inaccessible*. Please inspect the error message shown
below and press the **Refresh** button if you want to repeat the accessibility check:
Could not find an open hard disk with UUID {b0e666ef-1041-415a-8329-876b337e1958}.
Result Code:
VBOX_E_OBJECT_NOT_FOUND (0x80BB0001)
Component:
VirtualBox
Interface:
IVirtualBox {d2de270c-1d4b-4c9e-843f-bbb9b47269ff}
Run Code Online (Sandbox Code Playgroud)
我尝试从vdi文件创建一个新的虚拟机,但在加载时会锁定WINDOWS\System32\DRIVERS\lfsfilt.sys.我尝试重新安装版本3.2,但我得到了完全相同的问题.
我的VirtualBox.xml目录中有一个文件.VirtualBox,以及各种文件(Virtual Dell.xml,Virtual Dell.xml-prev等).VirtualBox\Machines\Virtual Dell.
请帮忙!如何恢复虚拟机?
最新版本的Qt安装了gdb版本7.1.这有一个恼人的错误:它评估某些完全有效的表达式为<unavailable synchronous data>.显然这已在gdb版本7.2中修复,所以我下载了最新的gdb.exe并将其复制到Qt\pythongdb\gdb-i686-pc-mingw32.exe.唉,这并不成功:枚举被评估为<anonymous enum>而不是(比如说)myHelpfulEnumVal,(void*)p并被评估为void*而不是(比如说)cbf56e0.所以我恢复了gdb版本7.1.
有没有人知道我还需要做些什么才能将gdb 7.2与Qt Creator集成?或者它还没有实现呢?
我在Windows 7下使用minGW.
我已经按照Stephen Chu的建议做了更新,现在正在使用Qt Creator 2.2和gdb 7.2.它似乎工作正常.但是我必须弄清楚如何告诉Qt Creator在哪里找到gdb,因为这样做的方式已经改变了:转到Tools -> Options -> Tool Chains.您应该看到(至少,我在Windows下使用mingw)Auto-detected列表和Manual列表.该Manual列表包含一个项目:
MinGW from Simulator Qt for MinGW 4.4 (Qt SDK)
单击此按钮gdb,您可以在该Debugger:字段中输入路径.就我而言,这是
C:\Qt\qtcreator-2.1.81\pythongdb\gdb-i686-pc-mingw32.exe
HTH
我QTreeWidget有一个专栏.它的项目有一个复选框,一个图标和文本.如果用户在项目中单击,我想知道是否单击了该图标.如何找到图标的位置和大小QTreeWidgetItem?
更新以添加:这是我的最终解决方案的代码,如webclectic所要求的.
首先,我进行了分类,QItemDelegate以便我可以访问每个部分的坐标QTreeWidgetItem(复选框,图标和文本).这是头文件:
#include <QItemDelegate>
class MyItemDelegate : public QItemDelegate
{
Q_OBJECT
public:
explicit MyItemDelegate (MyTreeWidget *parent)
: QItemDelegate (parent), ParentView (parent) { }
~MyItemDelegate() { }
void GetRects (const QModelIndex &index, QRect& CheckBox, QRect& Icon, QRect& Text) const ;
private:
MyTreeWidget* ParentView ;
} ;
Run Code Online (Sandbox Code Playgroud)
这是源文件:
void MyItemDelegate::GetRects (const QModelIndex &index, QRect& CheckBox, QRect& Icon, QRect& Text) const
{
QStyleOptionViewItem option = ParentView -> viewOptions() ;
CheckBox = rect (option, …Run Code Online (Sandbox Code Playgroud) 我可以声明一个指向尚未定义的类的指针,如下所示:
class A ;
A* p ;
Run Code Online (Sandbox Code Playgroud)
但是我如何为嵌套类做这个呢?我想做这个:
class A ;
class A::B ; // error: 'B' in class 'A' does not name a type
A::B* p ;
Run Code Online (Sandbox Code Playgroud)
但它没有编译(使用g ++ 4.5.2).有没有办法让这项工作?
gcc 4.7.2中存在MinGW的已知错误,该错误导致this在同一类中涉及虚拟和非虚拟继承的某些情况下将无效指针传递给虚函数.详细信息在此Bugzilla页面上.
这个错误让我感到困惑,我需要为我正在编写的Qt应用程序修复它.Bugzilla页面中有一个补丁,但是如何获得包含此补丁的工作版本?据我所知,GNU下载页面仅提供原始的错误版本.4.7.2之后的下一版gcc是4.8.0,我无法使用,因为它与我的Qt库不兼容.
应用补丁后,我是否必须从源代码构建gcc?如果可以的话,我当然希望避免这种情况!
编辑添加:我现在已将此交叉发布到GNU ARM Embedded Toolchain站点,因为我相当确定这是一个链接器错误。
另外,我注意到当第一个程序段适合 ELF 文件的第一页时(即它在其页内的起始偏移量 >= ELF 标头中的字节数)似乎会发生这种情况。在这种情况下,段错误地向下扩展到文件的开头。这可以解释为什么如果起始地址的页内偏移量从 0x80 减少到 0x40,问题就会消失。
我正在为 ARM Cortex M0 实现一个独立的操作系统,但我的链接器有一个奇怪的问题。这是我的源文件OS.c,经过精简以说明问题:
int EntryPoint (void) { return 99 ; }
Run Code Online (Sandbox Code Playgroud)
这是我的链接器脚本文件OS.ld,只需将所有代码分配给从以下位置开始的区域0x10080:
MEMORY
{
NVM (rx) : ORIGIN = 0x10080, LENGTH = 0x1000
}
SECTIONS
{
.text 0x10080 :
{
OS.o (.text)
} > NVM
}
Run Code Online (Sandbox Code Playgroud)
我编译并链接它:
arm-none-eabi-gcc.exe -march=armv6-m -mthumb -c OS.c
arm-none-eabi-gcc.exe -oOS.elf -Xlinker --script=OS.ld OS.o -nostartfiles -nodefaultlibs
Run Code Online (Sandbox Code Playgroud)
现在,当我用 列出程序段时readelf OS.elf -l,我得到:
Elf …Run Code Online (Sandbox Code Playgroud) 我有一个嵌入式项目,需要在某个时候写入地址 0。所以我很自然地尝试:
*(int*)0 = 0 ;
Run Code Online (Sandbox Code Playgroud)
但是在优化级别 2 或更高级别,gcc 编译器会搓手说,“这是未定义的行为!我可以做我喜欢做的事!哇哈哈!” 并向代码流发出无效指令!
这是我的源文件:
void f (void)
{
*(int*)0 = 0 ;
}
Run Code Online (Sandbox Code Playgroud)
这是输出列表:
.file "bug.c"
.text
.p2align 4,,15
.globl _f
.def _f; .scl 2; .type 32; .endef
_f:
LFB0:
.cfi_startproc
movl $0, 0
ud2 <-- Invalid instruction!
.cfi_endproc
LFE0:
.ident "GCC: (i686-posix-dwarf-rev0, Built by MinGW-W64 project) 7.3.0"
Run Code Online (Sandbox Code Playgroud)
我的问题是:为什么有人会这样做?像这样破坏代码可能会带来什么好处?当然,显而易见的做法是发出警告并继续编译?
我知道编译器可以这样做,我只是想知道编译器作者的动机。我花了两天时间和四个工程样本来追踪这个问题,所以我有点生气。
编辑添加:我已经通过使用汇编语言解决了这个问题。所以我不是在寻找解决方案。我只是好奇为什么有人会认为这种编译器行为是个好主意。
以下代码无法编译;g++ 7.3.0 with--std=c++17给出了错误信息
constexpr 函数 'constexpr const C operator+(const C&, int)' 的无效返回类型 'const C'
注意:'C' 不是文字,因为 'C' 有一个非平凡的析构函数
#include <string>
using namespace std ;
struct C
{
C (std::string s) : s (s) { }
std::string s ;
} ;
constexpr const C operator+ (const C& x, int y) // <-- Error here
{
return C ("C int") ;
}
int main()
{
C c ("abc") ;
printf ("%s\n", (c + 99).s.c_str()) ;
}
Run Code Online (Sandbox Code Playgroud)
好吧,好吧。但是如果我添加一个看似无关的模板规范到operator+:
template<typename …Run Code Online (Sandbox Code Playgroud) 如果我指定-std=c++0x为g ++,那么我不能#include <iostream>.我收到以下错误消息(mingw下的g ++ 4.4.0):
In file included from c:\qt\2010.05\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/bits/postypes.h:42,
from c:\qt\2010.05\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/iosfwd:42,
from c:\qt\2010.05\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/ios:39,
from c:\qt\2010.05\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/ostream:40,
from c:\qt\2010.05\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/iostream:40,
from f.cpp:1:
c:\qt\2010.05\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/cwchar:159: error: '::swprintf' has not been declared
c:\qt\2010.05\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/cwchar:166: error: '::vswprintf' has not been declared
Run Code Online (Sandbox Code Playgroud)
有什么想法吗?这是在最新的g ++中修复的吗?(如果是这样,有人知道如何将最新的g ++纳入Qt吗?)
我有一个用C++ Builder 6编写的软件(是的,我知道它非常过时,我不打算重写它).它做了大量的数字运算,需要几分钟才能完成.我希望接口在这些计算过程中能够响应.我记得在Delphi中有一个非常简单的解决方案 - 调用form/app的特殊方法,但我不记得它是什么.有什么建议?
我有一个奇怪的浮点问题.
背景:
我正在为一个带有大整数算术协处理器的8位处理器实现一个双精度(64位)IEEE 754浮点库.为了测试这个库,我将我的代码返回的值与Intel的浮点指令返回的值进行比较.这些并不总是一致的,因为英特尔的浮点单元在内部以80位格式存储值,具有64位尾数.
示例(全部以十六进制):
X = 4C816EFD0D3EC47E:
偏置指数= 4C8(真指数= 1C9),尾数= 116EFD0D3EC47E
Y = 449F20CDC8A5D665:
偏差指数= 449(真指数= 14A),尾数= 1F20CDC8A5D665
计算X*Y.
尾数的乘积是10F5643E3730A17FF62E39D6CDB0,当舍入到53(十进制)位时为10F5643E3730A1(因为7FF62E39D6CDB0的最高位为零).所以结果中的正确尾数是10F5643E3730A1.
但如果使用64位尾数进行计算,则10F5643E3730A17FF62E39D6CDB0向上舍入为10F5643E3730A1800,再次舍入为53位时变为10F5643E3730A2.最低有效数字已从1更改为2.
总结一下:我的库返回正确的尾数10F5643E3730A1,但英特尔硬件返回(正确)10F5643E3730A2,因为它的内部64位尾数.
问题:
现在,这是我不明白的事情:有时英特尔硬件会在尾数中返回10F5643E3730A1!我有两个程序,一个Windows控制台程序和一个Windows GUI程序,都是由Qt使用g ++ 4.5.2构建的.控制台程序按预期返回10F5643E3730A2,但GUI程序返回10F5643E3730A1.他们使用相同的库函数,它有三个指令:
fldl -0x18(%ebp)
fmull -0x10(%ebp)
fstpl 0x4(%esp)
Run Code Online (Sandbox Code Playgroud)
并且这三个指令在两个程序中计算不同的结果.(我已经在调试器中逐步完成了它们.)在我看来,这可能是Qt在其GUI启动代码中配置FPU的方法,但我找不到任何关于此的文档.有谁知道这里发生了什么?
当我这样做时,我的编译器抱怨.虽然没有可见的错误消息,但会出现3个错误:
#include <stdlib.h>
#include <vector>
#include <string>
#include "ParseException.h"
#include "CycleFoundException.h"
#include "UnknownTargetException.h"
using namespace std;
class Maker
{
private:
vector<Node> storage;
public:
Maker(string file) throw (ParseException, CycleFoundException, UnknownTargetException);
vector<string> makeTarget(string targetName);
};
struct Node
{
string target;
vector<string> dependencies;
string command;
int discoverytime;
int finishtime;
int visited;
Node* next;
};
Run Code Online (Sandbox Code Playgroud)
编译器不喜欢我的vector<Node> storage声明.当我这样做时vector<int> storage,它编译没有抱怨.在另一个类中声明一个类的对象是错误的吗?我觉得这没关系.