2015-01-07 11 views
1

그래서 어떤 이유로 '처리되지 않은 예외가 계속 발생합니다. 코드를 중단 하시겠습니까?' 내가 이걸 달릴 때마다, 내가 배열 바깥으로 나가는 것 같아.2 차원 배열에 쓸 때 처리되지 않은 예외가 발생했습니다.

Header file: 

struct mult_div_values 
{ 
int mult; 
float div; 
}; 

void create_table(mult_div_values ** table, int rows, int columns) 
{ 
table = new mult_div_values * [rows]; 
for (int i = 0; i < columns; i++) 
{ 
    table[i] = new mult_div_values [columns]; 
} 
} 

void set_mult_values(mult_div_values ** table, int rows, int columns) 
{ 
mult_div_values TableValues; 
TableValues.div = 0; 
for (int i = 0; i < rows; i++) 
{ 
    TableValues.mult = i+1; 
    table[0][i] = TableValues; 
} 

for (int i = 1; i < rows; i++) 
    for (int x = 0; x < columns; x++) 
    { 
     if (x == 0) 
     { 
      TableValues.mult = i + 1; 
      table[i][x] = TableValues; 
     } 
     else 
     { 
      TableValues.mult = (i+1) * (x + 1); 
      table[i][x] = TableValues; 
     } 
    } 
}; 

void set_div_values(mult_div_values ** table, int rows, int columns) 
{ 
mult_div_values TableValues; 
for (float i = 0; i < rows; i++) 
{ 
    TableValues.div = i+1; 
    table[0][static_cast<int>(i)] = TableValues; 
} 

for (float i = 1; i < rows; i++) 
    for (float x = 0; x < columns; x++) 
    { 
     if (x == 0) 
     { 
      TableValues.div = i + 1; 
      table[static_cast<int>(i)][static_cast<int>(x)] = TableValues; 
     } 
     else 
     { 
      TableValues.div = (i+1)/(x + 1); 
      table[static_cast<int>(i)][static_cast<int>(x)] = TableValues; 
     } 
    } 
}; 

소스 파일 : : 여기에서 아래 파괴하는 전체 코드, 아픈 포스트 비트의

#include <iostream> 
#include "mult_div.h" 

using namespace::std; 

struct mult_div_values; 

int main() 
{ 
mult_div_values ** table = 0; 
int rows, columns, rowswanted, columnswanted; 
cout << "How many rows?\n"; 
cin >> rows; 
cout << "How many columns?\n"; 
cin >> columns; 
cout << "Which row do you want?\n"; 
cin >> rowswanted; 
cout << "Which column?\n"; 
cin >> columnswanted; 

create_table(table, rows, columns); 
set_mult_values(table, rows, columns); 
set_mult_values(table, rows, columns); 

cout << "Mult value: " << table[rowswanted][columnswanted].mult << endl << "Div value: " << table[rowswanted][columnswanted].div; 

system("Pause"); 
} 

그리고에서 나누기 : 최대한 빨리 공격으로

void set_mult_values(mult_div_values ** table, int rows, int columns) 
{ 
mult_div_values TableValues; 
TableValues.div = 0; 
for (int i = 0; i < rows; i++) 
{ 
    TableValues.mult = i+1; 
    table[0][i] = TableValues; } 

그 마지막 줄, 그것은 나에게 오류 메시지를 준다. 어떤 아이디어?

+0

'table' 포인터가 유효한지 확인하는 것이 좋습니다. 'rows'와'columns' 변수도 있습니다. –

답변

1

이보다 더 많은 문제가있을 수 있지만 즉각적인 문제는 create_table() 메서드에서 배열 포인터를 값으로 전달한다는 것입니다. 결과적으로 클라이언트가 create_table()에 전달한 2 차원 배열에 대한 포인터는 NULL로 유지되고 set_mult_values ​​()가 호출되면 충돌이 발생합니다.

내가 간단히 편집 할 수 있다면 질문하기 전에 디버거를 사용하여이 종류의 코드를 단계별로 실행하는 것이 좋습니다. 그렇게하면 명백한 NULL 포인터가 set_mult_values ​​()에 전달되는 것을 보았을 것입니다.

둘째, 원시 배열 대신 STL 유형을 사용하는 것이 좋습니다. 그것은 당신의 삶을 대략 9 백 배나 쉽게 만듭니다.

+0

이게 당신이 의미하는 바가 확실하지 않지만, 당신이 말한 것은 답을 이끌어 냈습니다. 나는 테이블을 0으로 초기화하고 있었고, 그것은 문제를 일으켰다. 나는 테이블을 생성하여 테이블을 대신 반환하고이를 수정했다. 감사합니다! – Kdizzile

+0

정렬. 원래 코드에서는 테이블을 초기화 할 때 상관 없습니다. create_table()을 호출 한 후에도 동일하게 유지됩니다. 다시 말해서, pass-by-value 의미론으로 인해 유효한 어떤 것도 가리 키지 않을 것입니다. 어쨌든, 테이블을 반환하도록 create_table()을 변경하는 것은 확실히 유효한 수정입니다 :) – Ian

4

당신은 당신의 배열을 생성하는 기능을 잘못 반복됩니다

void create_table(mult_div_values ** table, int rows, int columns) 
{ 
    table = new mult_div_values * [rows]; 
    for (int i = 0; i < columns; i++) 
    //     ^^^^^^^ 
    { 
     table[i] = new mult_div_values [columns]; 
    } 
} 

루프는 rows하지 columns 이상이어야한다. 세트 또한

:

void set_mult_values(mult_div_values ** table, int rows, int columns) 
{ 
    mult_div_values TableValues; 
    TableValues.div = 0; 

    for (int i = 0; i < rows; i++) 
    { 
     TableValues.mult = i+1; 
     table[0][i] = TableValues; 
     //  ^^^ 
    } 

    .. 
} 

i 거기에 열 인덱스에 해당하지만 rows까지 반복하고 있습니다. 따라서 table[i][0] = TableValues이 아니면 루프가 반복되어야합니다 columns

+0

당신의 결정이 옳은 동안 나는 그것을 업데이트했지만 여전히 똑같은 일을합니다. 실제로 나는 그것의 할당 requirment 때문에 그 전체 '행과 열'물건을 사용하고 있었지만 결국 그것들은 상호 교환 적으로 사용될 수 있도록 사각형이 될 것입니다. 뭔가 다른 이유로 뭔가 실종 된 것 같아요. – Kdizzile

+0

@Kdizzile 다른 것으로 업데이트되었습니다. – Barry

관련 문제