线程1:EXC#u BAD#u访问(代码=1,地址=0x0)xCode C++; >我尝试打开一个文件并在C++中解析一个文件(使用初始化)。我可以成功打开该文件,但当我尝试解析该文件并将文件中的特定值存储到变量中时,我得到了线程1错误。DataParser.cpp文件是我必须使用的文件,无法修改,我只需调用它。我认为问题在于对getData()的函数调用(使用指针)但我似乎无法理解为什么我的变量现在设置的方式是出于某种原因而奇怪的工作,直到我试图存储 MysMax Value/Cube >。当我把它们全部设置为指针时,我得到了一个不同的错误。我是新的C++,但是请让我知道,如果你需要更多的信息,并且提前感谢。

线程1:EXC#u BAD#u访问(代码=1,地址=0x0)xCode C++; >我尝试打开一个文件并在C++中解析一个文件(使用初始化)。我可以成功打开该文件,但当我尝试解析该文件并将文件中的特定值存储到变量中时,我得到了线程1错误。DataParser.cpp文件是我必须使用的文件,无法修改,我只需调用它。我认为问题在于对getData()的函数调用(使用指针)但我似乎无法理解为什么我的变量现在设置的方式是出于某种原因而奇怪的工作,直到我试图存储 MysMax Value/Cube >。当我把它们全部设置为指针时,我得到了一个不同的错误。我是新的C++,但是请让我知道,如果你需要更多的信息,并且提前感谢。,c++,C++,Simulation.cpp #include <iostream> #include <stdio.h> #include <stdlib.h> #include "Simulation.hpp" #include "dDataParser.h" Simulation::Simulation() {} Simulation::~Simulation(){} void Simulation::initializeSimulation() { ch

Simulation.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);
}
#包括
#包括
#包括
#包括“Simulation.hpp”
#包括“dDataParser.h”
Simulation::Simulation(){}
模拟::~Simulation(){}
void模拟::initializeSimulation(){
字符*文件名;
char*m_sType;
炭材料;
国际货币联盟;
查姆苏尼茨;
双m_sMinVal;
双*m_sMaxVal;
cout文件名;
//无法打开(m_sFileName,fstream::in);//打开数据文件
m_iNumSensors=0;//文件中的传感器数
m_iNumDisplays=0;//文件中显示设备的数量
m_InxtSensor=0;//要读取的下一个传感器编号
m_indextdisplay=0;//要读取的下一个显示编号
如果(填充->打开()
{
不能关闭();
无法打开(m_sFileName,fstream::in);
如果(填充->打开()
{
//读取到当前传感器计数
while(getNextLine(第127行))
{
if(strcmp(line,“”==0)//得到一个
{
if(sNum==m_取舍传感器)
{
//获取关于这个的数据
while(getNextLine(第127行))
{
//获取类型
如果(strcmp(行“”)==0)
{
if(getNextLine(第127行))
{
strcpy(type,line);//设置类型
}
其他的
返回false;//哎呀!
}
else if(strcmp(行“”)==0)
{
if(getNextLine(第127行))
{
strcpy(材质,线条);//设置材质
}
其他的
返回false;//哎呀!
}
else if(strcmp(行“”)==0)
{
if(getNextLine(第127行))
{
*ID=atoi(行);//设置ID
}
其他的
返回false;//哎呀!
}
else if(strcmp(行“”)==0)
{
if(getNextLine(第127行))
{
strcpy(单位,行);//设置单位
}
其他的
返回false;//哎呀!
}
else if(strcmp(行“”)==0)
{
if(getNextLine(第127行))
{
*minVal=atof(line);//设置最小值
}
其他的
返回false;//哎呀!
}
else if(strcmp(行“”)==0)
{
if(getNextLine(第127行))
{
*maxVal=atof(line);//设置最小值
}
其他的
返回false;//哎呀!
}
else if(strcmp(行“”)==0)
{
m_InxtSensor++;//下一个传感器的增量
返回true;//得到它
}
}//结束时
}//如果结束(sNum==m_InxtSensor)
其他的
{
sNum++;//检查下一个
}
}
}
填充->关闭();
}//如果文件打开,则结束
return false;//如果我们到了这里,我们就得到了所有的传感器
}
编辑:调试器在


*maxVal=atof(line);//设置最小值

当函数或方法的参数是指向变量的指针时,您需要为该变量分配内存。有几种方法可以做到这一点,但最简单的方法是像这样声明一个自动变量:

double someVar = 0.0;
SomeFunctionThatTakesADoublePointer(&someVar);
SomeFunctionThatTakesADoublePointer(someVar);
if (someVar != nullptr)
{
    SomeFunctionThatTakesADoublePointer(someVar);
}
SomeFunctionThatTakeACharacterString(someString);
并调用需要如下指针的函数:

double someVar = 0.0;
SomeFunctionThatTakesADoublePointer(&someVar);
SomeFunctionThatTakesADoublePointer(someVar);
if (someVar != nullptr)
{
    SomeFunctionThatTakesADoublePointer(someVar);
}
SomeFunctionThatTakeACharacterString(someString);
您可以通过执行以下操作在堆上分配内存:

double* someVar = new double;
并按如下方式调用函数:

double someVar = 0.0;
SomeFunctionThatTakesADoublePointer(&someVar);
SomeFunctionThatTakesADoublePointer(someVar);
if (someVar != nullptr)
{
    SomeFunctionThatTakesADoublePointer(someVar);
}
SomeFunctionThatTakeACharacterString(someString);
不过,这有两个要求。首先,您需要通过将函数调用包装成条件来检查分配是否成功,如下所示:

double someVar = 0.0;
SomeFunctionThatTakesADoublePointer(&someVar);
SomeFunctionThatTakesADoublePointer(someVar);
if (someVar != nullptr)
{
    SomeFunctionThatTakesADoublePointer(someVar);
}
SomeFunctionThatTakeACharacterString(someString);
当您使用完内存后,必须释放内存,否则它会泄漏:

if (someVar != nullptr)
{
    SomeFunctionThatTakesADoublePointer(someVar);
    // ... do some calculating with *someVar
    delete someVar;
}
在C++中,你应该避免字符串,并从标准库中使用<代码> STD::String 。(你需要<代码>包含< /代码>来使用它。如果您必须使用字符串,因为您正在调用一个您无法控制的函数,并且它需要一个字符串,那么您需要分配一个具有足够m的字符串