개발 기록/행렬 계산기

행렬 계산기 개발 일지 - 7

LiDARian 2021. 5. 28. 22:25
반응형

문제가 있는 함수 를 아예 따로 때와서 디버깅을 했다.

하면서 느낀건...

  1. 함수 내부를 복잡하게 하느니, 차라리 하나의 기능에 대해서 하나의 함수를 반드시 만들자.
  2. 자료형 오류는 항상 쉽게 발생한다. 동적타이핑이 되는 언어가 아니라면 반드시 자료형에 대한 설계도 프로그래밍 전에 하자.
  3. 코드에 손대기 전에 프로그램 설계를 반드시 하자....라고 할 때 하자...라고 할 때 하자...라고 할 때 하자...

아예 test.c로 이름 붙이고 새로 작성한 함수. 아래는 디버깅 결과다. 다행히도 에러도 경고도 안뜬다.
기쁘다.

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define TEXT_LENGTH 512
#define MATMAXNUMBER 10
#define ERRORTEST printf("no error\n"); fflush(stdin);

typedef struct Matrix{
    int n;
    int m;    // row and column
    char ** matData; // data of matrix
    char * textMat;
} Matrix;


void showMatrix(Matrix * matStruct){
    printf("\n");
    for(int i = 0; i < matStruct->n; i++){
        for(int j = 0; j < matStruct->m; j++){
            printf("%d ", (matStruct->matData)[i][j]);
        }
        printf("\n");
    }
}

int main(){
    Matrix * matStruct = (Matrix *)malloc(sizeof(Matrix));

    // data and text Initialization
    matStruct->n = matStruct->m = 2;
    matStruct->textMat = "2,2,2,2";

    // Matrix Initialization
    matStruct->matData = (char**)malloc(sizeof(char**) * matStruct->n);
    for(int i = 0; i < matStruct->n; i++){
        (matStruct->matData)[i] = (char*)calloc(matStruct->m, sizeof(float) * matStruct->m);
    }

    int len = strlen(matStruct->textMat);
    int num = 0;    // temporary space for sum
    int numtemp[10] = {0}; // temporary space for number from textMat
    int z, i = 0;
    int x, y = 0; // row and column

    for(i = 0; i <= len; i++){
        if(((matStruct->textMat)[i] == ',') || ((matStruct->textMat)[i] == '\0')){ 
            for(int j = 1; j <= z; j++){
                //multiply 10 for z-j times
                for(int k = 1; k <= (z - j); k++){
                    numtemp[j - 1] = numtemp[j - 1] * 10;
                }
                num = num + numtemp[j - 1];
            }
            (matStruct->matData)[x][y] = num;

            // initializtion
            num = 0;
            while(z){
                numtemp[z] = 0;
                z--;
            }
            y++;
            if(y > matStruct->m){ y=0; x++; }
        }
        else{
            // turn character to integer
            numtemp[z] = (matStruct->textMat)[i] - '0';
            z++;
        }
    }

    showMatrix(matStruct);
}
반응형