2013-12-10 6 views
1

내 프로그램의 목표는 파일에서 판매 배열로 데이터를로드 한 후 다음 도시로 이동하기 전에 매일 각 도시 판매를 표시하는 것입니다. 내 2 차원 SalesArray를 다른 함수에 전달하는 데 문제가 있습니다. 나는 그것이 글로벌과 메인에서 선언하는 방식 때문에 그것이라고 확신한다. 또한 각 도시와 일을 적절하게 표시 할 수 있도록 구성하는 데 문제가 있습니다.2 차원 배열의 오류 C++

도움이 될 것입니다. 감사합니다

#include <iostream> 
#include <iomanip> 
#include <string> 
#include <fstream> 
#include <time.h> 

using namespace std; 

double SalesArray; 
void GetSales(); 
void DisplaySales(double SalesArray[5][4]); 


int main(){ 

    DisplayHeading(); 
    GetSales(); 
    DisplaySales(double(SalesArray)[5][4]) ; 

    cout << endl; 
    system("pause"); 
    return 0; 

} 


void GetSales(){ 

    double SalesArray[5][4]; 
    ifstream indata; 
    indata.open("sales.txt"); 

    for (int row = 0; row < 5; row++){ 
     for (int col = 0; col < 4; col++){ 
      indata >> SalesArray[row][col] ;  
     } 
    } 


    //Close the File 
    //indata.close(); 

    //cout << endl; 

} 

void DisplaySales(double SalesArray[5][4]){ 

    for (int row = 0; row < 5; row++){ 
     for (int col = 0; col < 4; col++){ 
      cout << fixed << setprecision(2) << SalesArray[row][col] << endl; 
     } 
    } 


    // Array for City 
    const int SIZE = 5; 
    string city[SIZE] = {"New York" , "LA" , 
       "Chicago" , "Springfield" , 
       "Prophetstown" }; 

    for (int count = 0; count < SIZE; count ++){ 
     cout << city[count] << endl; 
    } 

    // Array for Days 

    const int SALES = 4; 
    string days[SALES] = {"Friday" , "Saturday" , 
       "Sunday" , "Monday" 
       }; 

    for (int count = 0; count < SALES; count ++){ 
     cout << days[count] << endl; 
    } 
} 
+1

전체 파일을 게시하지 마십시오. 문제를 보여줄 최소 코드 스 니펫을 넣어보십시오. 들여 쓰기를 잊지 마십시오. 귀하의 프로그램에서 하나의 값을 선언했기 때문에 배열을 잘못 선언하고 있습니다. '*'가 빠졌습니까? 포인터와 배열에 대해 읽으십시오. – janisz

답변

0

왜 변수 SalesArray을 여러 번 선언 했습니까? 그래서 당신은 double SalesArray을 가지고 있고, GetSales() 안에 또 다른 double SalesArray[5][4]이 있습니다. 또한이 함수에서 파일의 값을이 로컬 변수에 저장하므로 함수가 완료된 후에 값이 손실됩니다.

글로벌 변수 double SalesArray[5][4]을 사용하거나 글로벌 변수를 제거하고 GetSales 함수로 SalesArray[5][4]을 전달하면 나중에 검색 할 수 있습니다.

0

GetSales() 내에서 선언 한 SalesArray는 메인에있는 SalesArray와 다르며, 일단 사라진 기능은 그대로 둡니다. 가장 간단한 해결 방법은 함수 프로토 타입을 GetSales(double SalesData[5][4])으로 변경하고 함수 범위가 지정된 SalesArray를 제거하는 것입니다.

그리드 종류의 형식으로 데이터를 표시 하시겠습니까? 그렇다면, 당신은 당신이 그것을 완전히 정확하게 표시 할 폭에 대해 연주해야 할 수도 있습니다

//Display days along top axis 
cout << "\t"; 
for (int count = 0; count < SALES; count ++){ 
    cout << days[count] << "\t"; 
} 
cout << endl; 

for (int row = 0; row < 5; row++){ 
    //display city for that row 
    cout << city[row] << "\t"; 

    // display each 
    for (int col = 0; col < 4; col++){ 
     cout << fixed << setprecision(2) << SalesArray[row][col] << "\t"; 
    } 
    cout << endl; 
} 

같은 것을 필요하지만, 그게 당신이 필요로하는 것을 대략 생각합니다.

1

예, 로컬 선언 SalesArrayGetSales();에서 더 잘 제거하고, 인수로 만들고 DisplaySales()처럼 전달하십시오.

또한 [5][4]의 요소가 아닌 SalesArray을 모두 전달해야합니다.

 DisplaySales(SalesArray); 

참고 ... [5][4]의 요소는 배열의 끝을 벗어납니다. C에서 크기는 N이지만, 인덱스는 N-1입니다.

0

선언하는 전역 변수는 배열이 아니라 하나의 double 값입니다. 배열을 선언하려면 double SalesArray[5][4];과 같아야합니다. main()에서 DisplaySales()를 잘못 호출하고 있습니다. 이와 비슷한 것을 시도하십시오 DisplaySales(SalesArray); 다른 답변에 동의하지만,이를 전역 및 로컬로 선언하거나 전역 함수를 다른 함수의 매개 변수로 전달해서는 안됩니다. 전략을 하나 선택하십시오.