2014-11-22 5 views
0

내 코드가 잘못되었습니다? 이런 오류가 있습니다.동적 배열 C++ 액세스 위반 쓰기 위치

mnozenie_macierzy.exe의 처리되지 않은 예외는 0x00d21673입니다. 0xC0000005 : 0xcdcdcdcd 위치 쓰기 액세스 위반입니다.

첫 번째 배열을 만들고 두 번째 배열을 반으로 만듭니다. 프로그램은 배열을 곱합니다. 내 영어로 죄송합니다. 올바르지 않을 경우. 날 이해 해주길 바래.

#include <iostream> 
#include <time.h> 

using namespace std; 

void losowa_tablica(int **tab1, int **tab2, int a, int b, int c, int d) 
{ 
    int i, j; 
    for(i=0; i<a; i++) 
    { 
     cout << endl; 
     for(j=0; j<b; j++) 
     { 
      tab1[i][j]=rand(); 
      cout << "tab1[" << i << "][" << j << "] : \t" << tab1[i][j] << "\t"; 
     } 
    } 
    cout << endl; 
    for(i=0; i<c; i++) 
    { 
     cout << endl; 
     for(j=0; j<d; j++) 
     { 
      tab2[i][j]=rand(); 
      cout << "tab2[" << i << "][" << j << "] : \t" << tab2[i][j] << "\t"; 
     } 
    } 
    cout << endl << endl; 
} 
int **mnozenie(int **tab1, int **tab2, int a, int b, int c, int d) 
{ 
    int g, suma, i, j; 
    int **mac=new int*[a]; 
    for(int i=0; i<d; i++) 
     mac[i]=new int[d]; 
    for(i=0; i<a; i++) 
     for(j=0; j<d; j++) 
     { 
      g=b-1, suma=0; 
      do 
      { 
      suma+=tab1[i][g]*tab2[g][j]; 
      g--; 
      }while(g!=0); 
      mac[i][j]=suma; 
     } 
    return mac; 
} 

int main() 
{ 
    int a,b,c,d; 
    cout << "Podaj liczbe wierszy pierwszej macierzy: " << endl; 
    cin >> a; 
    cout << "Podaj liczbe kolumn pierwszej macierzy: " << endl; 
    cin >> b; 
    cout << "Podaj liczbe wierszy drugiej macierzy: " << endl; 
    cin >> c; 
    cout << "Podaj liczbe kolumn drugiej macierzy: " << endl; 
    cin >> d; 
    int **tab1=new int*[a]; 
    for(int i=0; i<b; i++) 
     tab1[i]=new int[b]; 
    int **tab2=new int*[c]; 
    for(int i=0; i<d; i++) 
     tab2[i]=new int[d]; 
    losowa_tablica(tab1, tab2, a, b, c, d); 
    if (b==c) 
    { 
     cout << "Mnozenie wykonalne" << endl; 
     int **mno=mnozenie(tab1, tab2, a, b, c, d); 
    } 
    else cout << "Mnozenie niewykonalne" << endl; 
    system("pause"); 
} 
+0

'b> a' 또는'd> c'이면 곤란을 겪을 것입니다 (아마'i

+0

마음을 다시 잡아야합니다. 예를 들어,'a' 엘리먼트의 배열을 할당한다면, 'b'가 아닌 0부터'a'까지 iterate해야합니다! –

+0

배열을 2D로 만들고 크기를 사용자에게 부여하고 싶습니다. – NMM

답변

0

귀하의 코드 수율 정의되지 않은 동작은 :

int **tab1=new int*[a]; // allocating an array of 'a' elements 
for(int i=0; i<b; i++) // if b > a then the next line will eventually yield UB 
    tab1[i]=new int[b]; 

int **tab2=new int*[c]; // allocating an array of 'c' elements 
for(int i=0; i<d; i++) // if d > c then the next line will eventually yield UB 
    tab2[i]=new int[d]; 

int **mac=new int*[a]; // allocating an array of 'a' elements 
for(int i=0; i<d; i++) // if d > a then the next line will eventually yield UB 
    mac[i]=new int[d]; 

실제로, 위의 코드는 대부분 어떤 시점에서 메모리 액세스 위반을 수행합니다.