2016-07-27 3 views
0

그것은 프로젝트이고 나는 가능한 한 빨리 마무리하고 싶어, 내 코드가 어떻게 만들어 지는지 지독하게 무시하십시오. xcode에서 코드를 실행하려고하면 오류가 발생합니다. 이 프로그램에서는 전화 레코드가있는 텍스트 파일을 가져와 정보를 기반으로 비용을 표시합니다. 파일 경로가 정확한지, 나는이 오류의 원인이 무엇을 내 코드를 잘못 알고하지 않습니다이상한 오류 C++ 엑스 코드 - 스레드 1 : EXC_BAD_ACCESS

https://drive.google.com/file/d/0Bysk6_x4B46uU2pmWFhRYWd6d1E/view?usp=sharing

여기에 코드입니다 :

// phoneRecords.cpp 
// PhoneRecords 
// 
// Created by Roei Bustein on 7/19/16. 
// Copyright © 2016 Roei Bustein. All rights reserved. 
// 

/* 
* This program reads records from a file and parse each 
* record into variables as it goes 
*/ 

#include <iostream> 
#include <string> 
#include <fstream> 
#include <sstream> 
#include <algorithm> 
#include <iterator> 

using namespace std; 

string makeTimeIntoInt(string line[]) { 
    string temp = ""; 
    string time = line[2]; 
    for (char a : time) { 
     if (a == ':') 
      continue; 
     else 
      temp += a; 
    } 

    return temp; 
} 

float calculateCost(string line[]) { 
    int time = stoi(line[2]); 
    int duration = stoi(line[3]); 
    if (line[1] == "Mo" || line[1] == "Tu" || line[1] == "We" || 
     line[1] == "Th" || line[1] == "Fr") { 
     if (time < 800 || time > 1800) { 
      return duration * 0.25; 
     } else 
      return duration * 0.4; 

    } 

    else if (line[1] == "Sa" || line[1] == "Su") { 
     return duration * 0.15; 
    } 

    return 0; 
} 

int main() { 
    ifstream inputFile; 
    string line; 
    int cnt = 0; 
    inputFile.open(
        "/Users/roeibustein/Documents/C++ " 
        "Workspace/PhoneRecords/PhoneRecords/calls1.txt"); 
    string arr[18]; 
    string line1[3], line2[3], line3[3], line4[3], line5[3], line6[3]; 
    float costLine1, costLine2, costLine3, costLine4, costLine5, costLine6; 

    if (inputFile.is_open()) { 
     while (getline(inputFile, line)) { 
      istringstream split(line); 

      while (split) { 
       split >> arr[cnt]; 
       cnt++; 
       split >> arr[cnt]; 
       cnt++; 
       split >> arr[cnt]; 
       cnt++; 
      } 
     } 
    } 

    line1[1] = arr[1]; 
    line1[2] = arr[2]; 
    line1[3] = arr[3]; 
    line2[1] = arr[4]; 
    line2[2] = arr[5]; 
    line2[3] = arr[6]; 
    line3[1] = arr[7]; 
    line3[2] = arr[8]; 
    line3[3] = arr[9]; 
    line4[1] = arr[10]; 
    line4[2] = arr[11]; 
    line4[3] = arr[12]; 
    line5[1] = arr[13]; 
    line5[2] = arr[14]; 
    line5[3] = arr[15]; 
    line6[1] = arr[16]; 
    line6[2] = arr[17]; 
    line6[3] = arr[18]; 

    line1[2] = makeTimeIntoInt(line1); 
    line2[2] = makeTimeIntoInt(line2); 
    line3[2] = makeTimeIntoInt(line3); 
    line4[2] = makeTimeIntoInt(line4); 
    line5[2] = makeTimeIntoInt(line5); 
    line6[2] = makeTimeIntoInt(line6); 

    costLine1 = calculateCost(line1); 
    costLine2 = calculateCost(line2); 
    costLine3 = calculateCost(line3); 
    costLine4 = calculateCost(line4); 
    costLine5 = calculateCost(line5); 
    costLine6 = calculateCost(line6); 

    cout << line1[1] << " " << line1[2] << " " << line1[3] << " " << costLine1 
    << "\n"; 

    cout << line2[1] << " " << line2[2] << " " << line2[3] << " " << costLine2 
    << "\n"; 

    cout << line3[1] << " " << line3[2] << " " << line3[3] << " " << costLine3 
    << "\n"; 

    cout << line4[1] << " " << line4[2] << " " << line4[3] << " " << costLine4 
    << "\n"; 

    cout << line5[1] << " " << line5[2] << " " << line5[3] << " " << costLine5 
    << "\n"; 

    cout << line6[1] << " " << line6[2] << " " << line6[3] << " " << costLine6 
    << "\n"; 

    return 0; 
} 

답변

0

귀하의 배열은 그것의 범위를 벗어납니다. 이 코드를 복사하여 작동하는지 확인하십시오.

#include <iostream> 
#include <string> 
#include <fstream> 
#include <sstream> 
#include <algorithm> 
#include <iterator> 

using namespace std; 

string makeTimeIntoInt(string line[]) { 
    string temp = ""; 
    string time = line[1]; 
    for (char a : time) { 
     if (a == ':') 
      continue; 
     else 
      temp += a; 
    } 

    return temp; 
} 

float calculateCost(string line[]) { 
    int time = stoi(line[1]); 
    int duration = stoi(line[2]); 
    if (line[0] == "Mo" || line[0] == "Tu" || line[0] == "We" || 
     line[0] == "Th" || line[0] == "Fr") { 
     if (time < 800 || time > 1800) { 
      return duration * 0.25; 
     } else 
      return duration * 0.4; 

    } 

    else if (line[0] == "Sa" || line[0] == "Su") { 
     return duration * 0.15; 
    } 

    return 0; 
} 

int main() { 
    ifstream inputFile; 
    string line; 
    int cnt = 0; 
    inputFile.open("/Users/lhmac/abc.txt"); 
    string arr[18]; 
    string line1[3], line2[3], line3[3], line4[3], line5[3], line6[3]; 
    float costLine1, costLine2, costLine3, costLine4, costLine5, costLine6; 

    if (!inputFile.is_open()) { 
     return 0; 
    } 

    while (getline(inputFile, line) && cnt < 18) { 
     istringstream split(line); 
     split >> arr[cnt]; 
     cnt++; 
     split >> arr[cnt]; 
     cnt++; 
     split >> arr[cnt]; 
     cnt++; 
    } 

    inputFile.close(); 

    line1[0] = arr[0]; 
    line1[1] = arr[1]; 
    line1[2] = arr[2]; 
    line2[0] = arr[3]; 
    line2[1] = arr[4]; 
    line2[2] = arr[5]; 
    line3[0] = arr[6]; 
    line3[1] = arr[7]; 
    line3[2] = arr[8]; 
    line4[0] = arr[9]; 
    line4[1] = arr[10]; 
    line4[2] = arr[11]; 
    line5[0] = arr[12]; 
    line5[1] = arr[13]; 
    line5[2] = arr[14]; 
    line6[0] = arr[15]; 
    line6[1] = arr[16]; 
    line6[2] = arr[17]; 

    line1[2] = makeTimeIntoInt(line1); 
    line2[2] = makeTimeIntoInt(line2); 
    line3[2] = makeTimeIntoInt(line3); 
    line4[2] = makeTimeIntoInt(line4); 
    line5[2] = makeTimeIntoInt(line5); 
    line6[2] = makeTimeIntoInt(line6); 

    costLine1 = calculateCost(line1); 
    costLine2 = calculateCost(line2); 
    costLine3 = calculateCost(line3); 
    costLine4 = calculateCost(line4); 
    costLine5 = calculateCost(line5); 
    costLine6 = calculateCost(line6); 

    cout << line1[0] << " " << line1[1] << " " << line1[2] << " " << costLine1 
    << "\n"; 

    cout << line2[0] << " " << line2[1] << " " << line2[2] << " " << costLine2 
    << "\n"; 

    cout << line3[0] << " " << line3[1] << " " << line3[2] << " " << costLine3 
    << "\n"; 

    cout << line4[0] << " " << line4[1] << " " << line4[2] << " " << costLine4 
    << "\n"; 

    cout << line5[0] << " " << line5[1] << " " << line5[2] << " " << costLine5 
    << "\n"; 

    cout << line6[0] << " " << line6[1] << " " << line6[2] << " " << costLine6 
    << "\n"; 

    return 0; 
} 
+0

감사합니다입니다 !!!!!! –

+0

그래서 어떤 배열도 범위를 벗어나지 않고 여전히 동일한 오류가 발생했습니다 (범위를 벗어난 유일한 배열이 아닙니다). 내가 그 오류를 일으킬 수있는 다른 이유를 아십니까? –

+0

Xcode 'Product -> Scheme -> Eidt Scheme -> Diagnostics'를 선택한 다음 'Enable Zoobie Objects'및 'Enable Address Sanitizer'를 선택한 다음 코드를 실행하고 발생한 문제를 확인하십시오. – zylenv

1

테이블의 범위를 벗어난 색인에 액세스하면 오류가 발생했다고 생각합니다. C++ 테이블에서 는 0에서 색인, 그래서 당신은 string arr[18]를 선언 할 때 당신은 arr[18]를 호출하여 값을 얻을 수 없습니다. 즉 첫 번째 요소는 arr[0]하고 마지막 arr[17]

+0

정말 고마워요! –

+0

그래서 어떤 배열도 범위를 벗어나지 않고 여전히 동일한 오류가 발생하도록 코드를 변경했습니다 (범위를 벗어난 유일한 배열이 아닙니다). 내가 그 오류를 일으킬 수있는 다른 이유를 아십니까? –

관련 문제