이차원 포인터 배열 읽기 엑세스 위반
조회수 709회
슈트라센 알고리즘을 작성 중인데,
알고리즘은 다 작성했는데, int **c
로 넘겨받은 이차원 포인터 배열에 값이 대입이 안돼요.
읽기 엑세스 위반이라고 뜨는데 왜 뜨는지 모르겠어요
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
void read(int **A, int **B, int **C);
void strassen(int row, int **a, int **b, int **c);
void freeArr(int **a, int **b, int **c, int row);
int size;
void main() {
int** a = NULL;
int** b = NULL;
int** c = NULL;
read(a, b, c);
strassen(size, a, b, c);
int i, j;
printf("Strassen 행렬곱의 결과 : \n");
for (i = 0;i < 2;i++) {
for (j = 0;j < 2;j++) {
printf("%d ", c[i][j]);
}
printf("\n");
}
free(a, b, c, size);
}
void read(int **A, int **B, int **C) {
FILE *fp;
fp = fopen("matrix.txt", "r");
char buffer[50];
int dim = 0;
fgets(buffer, sizeof(buffer), fp); //buffer에 읽은 문자열 입력
char *ptr = strtok(buffer, " ");
dim = atoi(ptr); //행렬의 차원 수
A = (int**)malloc(sizeof(int*)*dim);
B = (int**)malloc(sizeof(int*)*dim);
C = (int**)malloc(sizeof(int*)*dim);
int i, j;
for (i = 0;i < dim;i++) {
A[i] = (int*)malloc(sizeof(int)*dim);
B[i] = (int*)malloc(sizeof(int)*dim);
C[i] = (int*)malloc(sizeof(int)*dim);
}
for (i = 0;i < dim;i++) {
for (j = 0;j < dim;j++) {
C[i][j] = 0;
}
}
//행렬A 입력받음
printf("행렬 A:\n");
fgets(buffer, sizeof(buffer), fp);
ptr = strtok(buffer, " "); //빈칸을 기준으로 끊는다
for (i = 0;i < dim;i++) {
for (j = 0;j < dim;j++) {
A[i][j] = atoi(ptr);
ptr = strtok(NULL, " ");
printf("%d ", A[i][j]);
}
printf("\n");
}
//행렬B 입력받음
printf("행렬 B:\n");
fgets(buffer, sizeof(buffer), fp);
ptr = strtok(buffer, " "); //빈칸을 기준으로 끊는다
for (i = 0;i < dim;i++) {
for (j = 0;j < dim;j++) {
B[i][j] = atoi(ptr);
ptr = strtok(NULL, " ");
printf("%d ", B[i][j]);
}
printf("\n");
}
fclose(fp);
size = dim;
}
void strassen(int row, int **a, int **b, int **c) {
int i, j, q;
if (row <= 2) {
int i, j, k;
for (i = 0;i < row;i++) {
for (j = 0;j < row;j++) {
//c[i][j] = 0;
*(*(c + i) + j) = 0; ///////////////////////////////읽기 엑세스 위반////////////////////////////
for (k = 0;k < row;k++) {
c[i][j] += a[i][k] * b[k][j];
}
}
}
}
else { //배열 동적할당
int row = size / 2;
int** p1 = (int**)malloc(sizeof(int*)*row);
int** p2 = (int**)malloc(sizeof(int*)*row);
int** p3 = (int**)malloc(sizeof(int*)*row);
int** p4 = (int**)malloc(sizeof(int*)*row);
int** p5 = (int**)malloc(sizeof(int*)*row);
int** p6 = (int**)malloc(sizeof(int*)*row);
int** p7 = (int**)malloc(sizeof(int*)*row);
int** temp1 = (int**)malloc(sizeof(int*)*row);
int** temp2 = (int**)malloc(sizeof(int*)*row);
for (q = 0;q < row;q++) { //2차원 배열 동적할당
int row = (size) / 2;
p1[q] = (int*)malloc(sizeof(int)*row);
p2[q] = (int*)malloc(sizeof(int)*row);
p3[q] = (int*)malloc(sizeof(int)*row);
p4[q] = (int*)malloc(sizeof(int)*row);
p5[q] = (int*)malloc(sizeof(int)*row);
p6[q] = (int*)malloc(sizeof(int)*row);
p7[q] = (int*)malloc(sizeof(int)*row);
temp1[q] = (int*)malloc(sizeof(int)*row);
temp2[q] = (int*)malloc(sizeof(int)*row);
}
for (i = 0;i < row;i++) {
for (j = 0;j < row;j++) {
temp1[i][j] = 0;
temp1[i][j] = a[i][j] + a[i + row][j + row];
temp2[i][j] = b[i][j] + b[i + row][j + row];
}
}
strassen(row, temp1, temp2, p1); //p1
for (i = 0;i < row;i++) {
for (j = 0;j < row;j++) {
temp1[i][j] = a[i + row][j] + a[i + row][j + row];
temp2[i][j] = b[i][j];
}
}
strassen(row, temp1, temp2, p2); //p2
for (i = 0;i < row;i++) {
for (j = 0;j < row;j++)
{
temp1[i][j] = a[i][j]; // a11
temp2[i][j] = b[i][j + row] - b[i + row][j + row]; // b12 - b22
}
}
strassen(row, temp1, temp2, p3); // p3
for (i = 0;i < row;i++) {
for (j = 0;j < row;j++) {
temp1[i][j] = a[i + row][j + row];
temp2[i][j] = b[i + row][j] - b[i][j]; //b21-b11
}
}
strassen(row, temp1, temp2, p4); //p4
for (i = 0;i < row;i++) {
for (j = 0;j < row;j++) {
temp1[i][j] = a[i][j] + a[i][j + row];
temp2[i][j] = b[i + row][j + row];
}
}
strassen(row, temp1, temp2, p5); //p5
for (i = 0;i < row;i++) {
for (j = 0;j < row;j++) {
temp1[i][j] = a[i + row][j] - a[i][j];
temp2[i][j] = b[i][j] + b[i][j + row];
}
}
strassen(row, temp1, temp2, p6);
for (i = 0;i < row;i++) {
for (j = 0;j < row;j++) {
temp1[i][j] = a[i][j + row] = a[i + row][j + row];
temp2[i][j] = b[i + row][j] + b[i + row][j + row];
}
}
strassen(row, temp1, temp2, p7);
for (i = 0;i < row;i++) {
for (j = 0;j < row;j++) {
c[i][j] = p1[i][j] + p4[i][j] - p5[i][j] + p7[i][j]; //c11
c[i][j + row] = p3[i][j] + p5[i][j]; //c12
c[i + row][j] = p2[i][j] + p4[i][j]; //c21
c[i + row][j + row] = p1[i][j] + p3[i][j] - p2[i][j] + p6[i][j]; //c22
}
}
for (j = 0;j < row;j++) // 동적 배열 해제
{
free(p7[j]);
free(p6[j]);
free(p5[j]);
free(p4[j]);
free(p3[j]);
free(p2[j]);
free(p1[j]);
free(temp2[j]);
free(temp1[j]);
}
free(temp2);
free(temp1);
free(p7);
free(p6);
free(p5);
free(p4);
free(p3);
free(p2);
free(p1);
} //크기가 2보다 큰 경우 - else
}
void freeArr(int **a, int **b, int **c, int row) {
for (int j = 0;j < row;j++) // 동적 배열 해제
{
free(a[j]);
free(b[j]);
free(c[j]);
}
free(a);
free(b);
free(c);
}
댓글 입력