Тема 1: EXC_BAD_ACCESS (code = 1, address = 0x0) xCode C ++

jrdev спросил: 13 июня 2018 в 05:21 в: c++

Поэтому я пытаюсь открыть файл и проанализировать файл на C ++ (используя initializeSimulation(). может открыть файл успешно, но когда я пытаюсь проанализировать файл и сохранить определенные значения из файла в мои переменные, я получаю ошибку THREAD 1. Файл DataParser.cpp - это один я требуется использовать и не изменять, я просто позвоню. Я думаю, что проблема связана с вызовом функции getData() (с помощью указателей), но я не могу понять, почему. Как меняют мои переменные по-прежнему работает странно по какой-то причине, пока я не попытаюсь сохранить m_sMaxVal. Когда я установил их как указатели, у меня возникла другая ошибка. Я новичок в C ++, но, пожалуйста, дайте мне знать, если вам нужна дополнительная информация и спасибо заранее.

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);
}

DataParser.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 readif(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
}

edit: отладчик останавливается в строке

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


1 ответ

Есть решение
user1118321 ответил: 13 июня 2018 в 06:26

Если функция или метод имеет параметр, который является указателем на переменную, вам необходимо выделить память для этой переменной. Есть несколько способов сделать это, но проще всего объявить автоматическую переменную следующим образом:

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;
}

Все становится сложнее с символьными строками. В C ++ вы должны избегать символьных строк и использовать std::string из стандартной библиотеки. (Вам понадобится #include <string>). Если вы должны работать с символьными строками, потому что вы вызываете функцию, которую вы не контролируете, и для нее требуется строка, вам нужно выделить строку который имеет достаточно памяти для всех символов и завершающего символа nul. Вы можете сделать это в стеке, если знаете, что длина строки ограничена, делая что-то вроде:

char someString [ MAX_ALLOWED_STRING_LENGTH + 1 ];

, где MAX_ALLOWED_STRING_LENGTH - константа, определенная где-то в вашей программы. Затем вы можете вызвать функцию или метод, который принимает строку символов следующим образом:

SomeFunctionThatTakeACharacterString(someString);

Опять же, вы можете выделить память с помощью new [], но вы должны убедитесь, что это не nullptr, прежде чем использовать его, и delete [], когда вы закончите.

Дополнительное видео по вопросу: Тема 1: EXC_BAD_ACCESS (code = 1, address = 0x0) xCode C ++

XCode Fix Issue: EXC_BAD_ACCESS (code=1, adress=0xc) NSXMLParser . Stack Overflow

Memory 1 - Value Types vs Reference Types (iOS, Xcode 9, Swift 4)

iPhone_App_Crash.mov