편집 기록

편집 기록
  • 프로필 nowp님의 편집
    날짜2019.10.17

    이차원 포인터 배열 읽기 엑세스 위반


    슈트라센 알고리즘을 작성 중인데, 알고리즘은 다 작성했는데, 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);
    }
    
  • 프로필 Yewon님의 편집
    날짜2019.10.17

    이차원 포인터 배열 읽기 엑세스 위반


    슈트라센 알고리즘을 작성 중인데, 알고리즘은 다 작성했는데, int **c로 넘겨받은 이차원 포인터 배열에 값이 대입이 안돼요. 읽기 엑세스 위반이라고 뜨는데 왜 뜨는지 모르겠어요

    define _CRT_SECURE_NO_WARNINGS

    include

    include

    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); }