Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 程序不按顺序通过构造函数,从而导致未初始化的变量_C++_Qt_Dll - Fatal编程技术网

C++ 程序不按顺序通过构造函数,从而导致未初始化的变量

C++ 程序不按顺序通过构造函数,从而导致未初始化的变量,c++,qt,dll,C++,Qt,Dll,在使用MSVC 2013 32位,使用Qt5.4在发布模式下编译程序时,我发现了这个问题。到目前为止,调试过程中一切正常,但每次尝试在发行版中运行时都会抛出错误代码:0xc0000409。看起来这通常意味着在某个地方有初始化的变量,所以我通过代码设置断点来查看问题所在。我发现,在我的一个类的构造函数中,如果我在每一行上设置一个断点,它从中间开始,跳过我为该对象初始化变量的地方。代码如下: #ifndef AD5932DDS_H #define AD5932DDS_H #include "adi

在使用MSVC 2013 32位,使用Qt5.4在发布模式下编译程序时,我发现了这个问题。到目前为止,调试过程中一切正常,但每次尝试在发行版中运行时都会抛出错误代码:0xc0000409。看起来这通常意味着在某个地方有初始化的变量,所以我通过代码设置断点来查看问题所在。我发现,在我的一个类的构造函数中,如果我在每一行上设置一个断点,它从中间开始,跳过我为该对象初始化变量的地方。代码如下:

#ifndef AD5932DDS_H
#define AD5932DDS_H

#include "adicyusbusb4.h"
#include <QObject>
#include "picosignal.h"
#include <QLibrary>


class AD5932DDS : public QObject
{
Q_OBJECT
public:
    AD5932DDS(QObject *parent = 0);
    ~AD5932DDS();

private:
    QLibrary *myLib;

    unsigned int handle;

    VendorRequestFunction Vendor_Request;
    DisconnectFunction Disconnect;
    SearchFunction Search_For_Boards;
    ConnectFunction Connect;
    DownloadFWFunction Download_Firmware;

};


#endif // AD5932DDS_H




AD5932DDS::AD5932DDS(QObject *parent) : QObject(parent)
{
int searchErrorCode = 0;
int connectErrorCode = 0;
int downloadErrorCode = 0;
unsigned int num_boards = 0;
handle = 0;

char pcFilePath[] = "C:\\Users\\Jason\\Documents\\Development\\Qt\\CrackDetection\\AD593x.hex";
char path = 0;
myLib = new QLibrary;
myLib->setFileName("ADI_CYUSB_USB4.dll");
Search_For_Boards = (SearchFunction) myLib->resolve("Search_For_Boards");
Connect = (ConnectFunction) myLib->resolve("Connect");
Download_Firmware = (DownloadFWFunction) myLib->resolve("Download_Firmware");
Vendor_Request = (VendorRequestFunction) myLib->resolve("Vendor_Request");
Disconnect = (DisconnectFunction) myLib->resolve("Disconnect");
if (!Search_For_Boards || !Connect || !Download_Firmware || !Vendor_Request || !Disconnect)
{
    myLib->unload();
}

searchErrorCode = Search_For_Boards(VID, PID, &num_boards, &path);

if (num_boards > 0)
{
    connectErrorCode = Connect(VID, PID, path, &handle);
    if (connectErrorCode == 0)
    {
        downloadErrorCode = Download_Firmware(handle, pcFilePath2);
    }
}
}
然后它会回到顶部,继续向下,一切正常

但是,在释放模式下,如果

QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
QMAKE_LFLAGS_RELEASE = $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO
在调试发布版本时允许断点的.pro文件中,要命中的第一个断点是

handle = 0;
从这里开始,它跳下,跳过上面的初始化,以便

myLib = new QLibrary;
myLib->setFileName("ADI_CYUSB_USB4.dll");
在继续之前,它两次击中这两个。我注意到的一件事是即使在

Search_For_Boards = (SearchFunction) myLib->resolve("Search_For_Boards");
Connect = (ConnectFunction) myLib->resolve("Connect");
Download_Firmware = (DownloadFWFunction) myLib->resolve("Download_Firmware");
Vendor_Request = (VendorRequestFunction) myLib->resolve("Vendor_Request");
Disconnect = (DisconnectFunction) myLib->resolve("Disconnect");
运行时,如果我检查这些的名称和值,则在“值”下列出每个值。所以这让我觉得可能每个问题都源于试图访问这个dll

dll就是从这里来的,在经过多次尝试和错误之后,我能够在它没有提供静态库或带有原型的头文件的情况下找到如何使用dll的方法。我所做的是在头文件中创建自己的原型,如下所示:

#ifndef ADICYUSBUSB4_H
#define ADICYUSBUSB4_H

const unsigned int VID = 0x0456;
//const unsigned int PID = 0xB20B; // EVAL-AD5932EBZ
const unsigned int PID = 0xB205; // EVAL-AD5930EBZ
const unsigned char WRITE = 0xDD;
const unsigned char SET_STANDBY_PIN = 0xDC;
const unsigned char CLEAR_STANDBY_PIN = 0xDB;
const unsigned char PULSE_CONTROL_PIN = 0xDA;
const unsigned char SET_CONTROL_PIN = 0xD9;
const unsigned char CLEAR_CONTROL_PIN = 0xD8;
const unsigned char PULSE_INTERRUPT_PIN = 0xD7;


typedef unsigned int (*SearchFunction) (unsigned int, unsigned int, unsigned int *, char *);
typedef int (*ConnectFunction) (unsigned int, unsigned int, char, unsigned int *);
typedef int (*DownloadFWFunction) (unsigned int, char []);
typedef int (*VendorRequestFunction) (unsigned int, unsigned char, unsigned short, unsigned short, unsigned char, unsigned short, unsigned char *[]);
typedef int (*DisconnectFunction) (unsigned int);

#endif // ADICYUSBUSB4_H 
这种方法在调试模式下工作得很好,但有些东西不适合发布


因此,要么我处理这个dll不正确(尽管它在调试模式下工作得很好),要么我的程序由于未知原因跳过了一些变量初始化

在启用优化的情况下编译时,不要依赖断点或单步执行。优化器将更改、重新排序或删除语句。不要花太多时间来分析通过优化编译的程序流

  • QLibrary
    是否以某种方式失败?检查
    isLoaded()
    并记录各种
    resolve()
    调用的返回值。如果出现故障,您将调用
    unload()
    ,但是您正在愉快地执行其余的操作,试图取消对空指针的引用

  • 你能准确地说出它在哪里坠毁吗?尝试使用非缓冲流在每个语句之间向控制台输出一些内容,例如
    std::cerr


这可能是很愚蠢的事情,因为您的工作目录不同,DLL无法加载。

在编译时打开优化,不要依赖断点或单步执行。优化器将更改、重新排序或删除语句。不要花太多时间来分析通过优化编译的程序流

  • QLibrary
    是否以某种方式失败?检查
    isLoaded()
    并记录各种
    resolve()
    调用的返回值。如果出现故障,您将调用
    unload()
    ,但是您正在愉快地执行其余的操作,试图取消对空指针的引用

  • 你能准确地说出它在哪里坠毁吗?尝试使用非缓冲流在每个语句之间向控制台输出一些内容,例如
    std::cerr


这可能是很愚蠢的事情,因为您的工作目录不同,DLL无法加载。

在编译时打开优化,不要依赖断点或单步执行。优化器将更改、重新排序或删除语句。不要花太多时间来分析通过优化编译的程序流

  • QLibrary
    是否以某种方式失败?检查
    isLoaded()
    并记录各种
    resolve()
    调用的返回值。如果出现故障,您将调用
    unload()
    ,但是您正在愉快地执行其余的操作,试图取消对空指针的引用

  • 你能准确地说出它在哪里坠毁吗?尝试使用非缓冲流在每个语句之间向控制台输出一些内容,例如
    std::cerr


这可能是很愚蠢的事情,因为您的工作目录不同,DLL无法加载。

在编译时打开优化,不要依赖断点或单步执行。优化器将更改、重新排序或删除语句。不要花太多时间来分析通过优化编译的程序流

  • QLibrary
    是否以某种方式失败?检查
    isLoaded()
    并记录各种
    resolve()
    调用的返回值。如果出现故障,您将调用
    unload()
    ,但是您正在愉快地执行其余的操作,试图取消对空指针的引用

  • 你能准确地说出它在哪里坠毁吗?尝试使用非缓冲流在每个语句之间向控制台输出一些内容,例如
    std::cerr


这可能与工作目录不同以及DLL无法加载一样愚蠢。

我认为0xc0000409表示堆栈损坏,这可能是由于各种原因造成的,而不仅仅是未初始化的变量

由于您注意到您必须手动创建一个DLL头,因此有可能它与DLL的实际实现方式不完全匹配。除了参数计数/类型和返回类型之外,还有调用约定。因为您没有指定一个,所以您将得到MSVC的默认值。但是,如果该DLL是使用选择了不同约定的内容编译的,那么这种不匹配将导致问题

事实上,一个可能的结果是堆栈损坏。我不能肯定这是您的问题,但我相信这与您的0xc0000409错误是一致的

理想情况下
#ifndef ADICYUSBUSB4_H
#define ADICYUSBUSB4_H

const unsigned int VID = 0x0456;
//const unsigned int PID = 0xB20B; // EVAL-AD5932EBZ
const unsigned int PID = 0xB205; // EVAL-AD5930EBZ
const unsigned char WRITE = 0xDD;
const unsigned char SET_STANDBY_PIN = 0xDC;
const unsigned char CLEAR_STANDBY_PIN = 0xDB;
const unsigned char PULSE_CONTROL_PIN = 0xDA;
const unsigned char SET_CONTROL_PIN = 0xD9;
const unsigned char CLEAR_CONTROL_PIN = 0xD8;
const unsigned char PULSE_INTERRUPT_PIN = 0xD7;


typedef unsigned int (*SearchFunction) (unsigned int, unsigned int, unsigned int *, char *);
typedef int (*ConnectFunction) (unsigned int, unsigned int, char, unsigned int *);
typedef int (*DownloadFWFunction) (unsigned int, char []);
typedef int (*VendorRequestFunction) (unsigned int, unsigned char, unsigned short, unsigned short, unsigned char, unsigned short, unsigned char *[]);
typedef int (*DisconnectFunction) (unsigned int);

#endif // ADICYUSBUSB4_H