代码之家  ›  专栏  ›  技术社区  ›  jrdev

线程1:ExcIDBADIAccess(代码=1,地址=0x0)XCode C++

c++
  •  -2
  • jrdev  · 技术社区  · 6 年前

    所以我尝试打开一个文件并在C++中解析一个文件(使用 initializeSimulation() . 我可以成功地打开文件,但是当我试图解析文件并将文件中的特定值存储到变量中时,我得到了 THREAD 1 错误。这个 DataParser.cpp 文件是我必须使用的文件,不能修改,我只是简单地调用它。我认为问题在于我的函数调用 getData() (用指针)但我似乎不明白为什么。现在设置变量的方式由于某种原因工作异常,直到我尝试存储 m_sMaxVal . 当我把它们都设置为指针时,我得到了一个不同的错误。我是新到C++,但请让我知道,如果你需要更多的信息,并提前感谢。

    仿真.cpp

    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    #include "Simulation.hpp"
    #include "dDataParser.h"
    
    Simulation::Simulation() {}
    Simulation::~Simulation(){}
    
    void Simulation::initializeSimulation() {
    
        char *fileName;
        char *m_sType;
        char m_sMaterial;
        int m_iID;
        char m_sUnits;
        double m_sMinVal;
        double *m_sMaxVal;
    
    
        cout << "Enter the name of the data file:" << endl;
        cin >> fileName ;
        //cout << fileName << "\n" ;
    
        parser = new EnviroSimDataParser(fileName);
        parser ->getSensorData(m_sType, &m_sMaterial, &m_iID, &m_sUnits, &m_sMinVal, m_sMaxVal);
    }
    

    数据分析器.cpp

    EnviroSimDataParser::EnviroSimDataParser(char *fileName)
    {
    char line[128];
    strcpy(m_sFileName, fileName); 
    inFile = new ifstream();
    inFile->open(m_sFileName, fstream::in); // Open the data file
    m_iNumSensors = 0;  // Number of sensors in the file
    m_iNumDisplays = 0; // Number of display devices in the file
    m_iNextSensor = 0;  // Next sensor number to read
    m_iNextDisplay = 0; // Next display number to read
    
    if(inFile->is_open())
    {
        cout << "file opened successfully1 \n";
        // Count the number of sensors
        while(getNextLine(line, 127))
        {
            if(strcmp(line, "<SENSOR>") == 0)
                m_iNumSensors++;
            if(strcmp(line, "<DISPLAY_DEVICE>") == 0)
                m_iNumDisplays++;
        }
    
        inFile->close();
        cout << "file closed successfully1 \n";
    }
    else
    {
        cout << "Failed to open file. Application terminated...\n";
        exit(0);
    }
    }
    //-----
    
    bool DataParser::getData(char *type, char *material, int *ID,
            char *units, double *minVal, double *maxVal)
    {
        int sNum = 0;
        char line[128];
    
        // See if we have read all sensors
        if(m_iNextSensor >= m_iNumSensors) return false;
    
        // Reopen the file
        inFile = new ifstream();
        inFile->open(m_sFileName, fstream::in);
        if(inFile->is_open())
        {
            // Read to the the current sensor count
            while(getNextLine(line, 127))
            {
                if(strcmp(line, "<SENSOR>") == 0) // Got one
                {
                    if(sNum == m_iNextSensor)
                    {
                        // Get data on this one
                        while(getNextLine(line, 127))
                        {
                            // Get the type
                            if(strcmp(line, "<TYPE>") == 0)
                            {
                                if(getNextLine(line, 127))
                                {
                                    strcpy(type, line); // Set the type
                                }
                                else
                                    return false; // Oops!
                            }
                            else if(strcmp(line, "<MATERIAL>") == 0)
                            {
                                if(getNextLine(line, 127))
                                {
                                    strcpy(material, line); // Set the material
                                }
                                else
                                    return false; // Oops!
                            }
                            else if(strcmp(line, "<ID>") == 0)
                            {
                                if(getNextLine(line, 127))
                                {
                                    *ID = atoi(line); // Set the ID
                                }
                                else
                                    return false; // Oops!
                            }
                            else if(strcmp(line, "<UNITS>") == 0)
                            {
                                if(getNextLine(line, 127))
                                {
                                    strcpy(units, line); // Set the units
                                }
                                else
                                    return false; // Oops!
                            }
                            else if(strcmp(line, "<MINIMUM_VALUE>") == 0)
                            {
                                if(getNextLine(line, 127))
                                {
                                    *minVal = atof(line); // Set the minimum value
                                }
                                else
                                    return false; // Oops!
                            }
                            else if(strcmp(line, "<MAXIMUM_VALUE>") == 0)
                            {
                                if(getNextLine(line, 127))
                                {
                                    *maxVal = atof(line); // Set the minimum value
                                }
                                else
                                    return false; // Oops!
                            }
                            else if(strcmp(line, "</SENSOR>") == 0)
                            {
                                m_iNextSensor++; // Increment for next sensor
                                return true; // Got it
                            }
                        } // end while
                    } // end if(sNum == m_iNextSensor)
                    else
                    {
                        sNum++; // Check the next one
                    }
                }
            }
            inFile->close();
        } // end if file open
        return false; // If we get here we have got all the sensors
    }
    

    编辑: 调试程序在以下行停止

    *maxVal = atof(line); //Set the minimum value

    1 回复  |  直到 6 年前
        1
  •  1
  •   user1118321    6 年前

    double someVar = 0.0;
    

    SomeFunctionThatTakesADoublePointer(&someVar);
    

    double* someVar = new double;
    

    SomeFunctionThatTakesADoublePointer(someVar);
    

    if (someVar != nullptr)
    {
        SomeFunctionThatTakesADoublePointer(someVar);
    }
    

    if (someVar != nullptr)
    {
        SomeFunctionThatTakesADoublePointer(someVar);
        // ... do some calculating with *someVar
        delete someVar;
    }
    

    std::string #include <string> nul

    char someString [ MAX_ALLOWED_STRING_LENGTH + 1 ];
    

    MAX_ALLOWED_STRING_LENGTH

    SomeFunctionThatTakeACharacterString(someString);
    

    new [] nullptr delete []