#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define MAX_TERM 20
#define MAX 20
typedef struct
{
int col;
int row;
int value;
} term;
int** SM;
void fastTranspose(term *A, term *B)
{
int rowTerms[100] = { 0, };
int startingPos[100] = { 0, };
int i, j, numRows = A[0].col, numTerms = A[0].value;
B[0].col = numRows;
B[0].row = A[0].col;
B[0].value = numTerms;
if (numTerms > 0)
{
for (i = 0; i < numRows; i++)
rowTerms[i] = 0;
for (i = 1; i <= numTerms; i++)
rowTerms[A[i].row]++;
startingPos[0] = 1;
for (i = 1; i < numRows; i++)
startingPos[i] = startingPos[i - 1] + rowTerms[i - 1];
for (i = 1; i <= numTerms; i++)
{
j = startingPos[A[i].row]++;
B[j].col = A[i].row;
B[j].row = A[i].col;
B[j].value = A[i].value;
}
}
}
int** make2dArray(int rows, int cols)
{
int** x;
x = (int**)malloc(sizeof(int*) * rows);
for (int i = 0; i < rows; i++)
x[i] = (int*)malloc(sizeof(int) * cols);
for (int i = 0; i < rows; i++)
for (int j = 0; j < cols; j++)
x[i][j] = 0;
return x;
}
void generateTerm(term a[], int rows, int cols, int value)
{
a[0].row = rows;
a[0].col = cols;
a[0].value = value;
int temp = 1;
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
if (SM[i][j] != 0)
{
a[temp].col = i;
a[temp].row = j;
a[temp].value = SM[i][j];
temp++;
}
}
}
void printTerm(term a[], int rows, int cols)
{
int l = 1;
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
if (a[l].col == i && a[l].row == j)
printf("%5d", a[l++].value);
else
printf("%5d", 0);
}
printf("\n");
}
printf("\n");
}
int main()
{
FILE* fp;
fp= fopen("a.txt", "r");
FILE* fp2;
fp2 = fopen("b.txt", "w");
int rows, cols, value;
fscanf(fp, "%d %d %d\n", &rows, &cols, &value);
term* a = (term*)malloc(sizeof(term) * value);
term* b = (term*)malloc(sizeof(term) * value);
SM = make2dArray(rows, cols);
for (int i = 0; i < value; i++)
{
int j, k, z;
fscanf(fp, "%d %d %d\n", &j, &k, &z);
SM[j][k] = z;
}
generateTerm(a, rows, cols, value);
printf("A\n");
printTerm(a, rows, cols);
fastTranspose(a, b);
printf("B\n");
printTerm(b, rows, cols);
for (int i = 0; i <= value; i++)
fprintf(fp2, "%3d\t%3d\t%3d\n", b[i].col, b[i].row, b[i].value);
fclose(fp);
fclose(fp2);
return 0;
}
메모리 누수 검사해봐야할듯
너 컴퓨터에서 됨 ? 페러렐즈라 나한테만 안되는건가
memory 읽기 범위 초과문제는 체크가 안되니 니가 코드에서 범위체크를 추가해야된다
종료코드는 제대로 나옴?ㅇㅅㅇ
혹시 몰라서 ONLINEGDB에서 돌려보니까 corrupted size vs. prev_size라는데.. 이전 사이즈와 뭐가 다른거지
종료코드 -1073740940개라네 , ,
그럼 힙오버플로우 난거 같은데ㅇㅅㅇ
free(SM); 안해줬긴 하네.. 근데 파일 안써지는게 .ㅠ 왜그러지
free 문제가 아님ㅇㅅㅇ
파일에 쓰는 for문에서 왜 i <= value 냐? i < value 해야 맞는거 아니냐?
열 갯수 행 갯수 데이터 갯수가 0에 저장되어있어서 value까지 가야함
할당을 value 만큼했으면 i의 범위는 0 <= i < value 이고, 할당을 value+1 만큼해야 0 <= i <= value 가 맞지 않나? 메인에서 a, b 할당은 value 만큼 했으면서 왜 i가 value값 포함해서 for문을 돌아야 하냐?
malloc할 때, (term*)malloc(sizeof(term) * (value + 1)); 해야 for문의 i <= value 가 될 것 같은데...
fprintf 가 안되는 이유가, 위의 배열에서 value 인덱스에 접근할 때 out of index 에러로 프로그램 죽어서 안되는거 아닐까?