Почему у меня начало выдавать ошибку на все строки со структурами
У меня был файл с полностью рабочим кодом, и я работал в другом файле. И в какой-то момент в обоих этих файлах код начал ругаться на все структуры. Сперва Я удалил новый файл(там мало чего было сделано), но это не помогло. Файлы друг с другом не взаимодействуют. В целом у меня VS выдаёт ошибку только на те строки, где есть обращения к структурам. Вот код где
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <stdio.h>
#define MAX_SIZE_OF_MATRIX 3
#define MAX_SIZE_OF_VAL 4
typedef struct STR {
int Val;
int Row;
STR* Next;
} STR;
typedef struct ListSTR {
STR* row;
struct ListSTR* Next;
} ListSTR;
void Add(STR** point, int Val, int Row) {
STR* t = malloc(sizeof(STR));
t->Row = Row;
t->Val = Val;
t->Next = NULL;
STR** p = point;
if (*p)
for (p = &(*p)->Next; *p; p = &(*p)->Next);
*p = t;
}
void AddToIndex(ListSTR** matrix, int index, int Val, int Row) {
ListSTR** result = matrix;
for (int i = 1; i <= index; i++) {
if (*result) {
result = &(*result)->Next;
}
else {
printf("Error");
exit(1);
}
}
Add(&((*result)->row), Val, Row);
}
void clean(ListSTR* matrix, int ROWS) {
ListSTR* matrixTemp;
for (int i = 0; i < ROWS; i++) {
matrixTemp = matrix;
STR* point = matrixTemp->row;
STR* pTemp;
while (point) {
pTemp = point;
if (point->Next) {
point = point->Next;
}
else {
free(pTemp);
break;
}
free(pTemp);
}
if (matrix->Next) {
matrix = matrix->Next;
}
else {
free(matrixTemp);
break;
}
free(matrixTemp);
}
}
int isNum(char c) {
switch (c) {
case '1':
return 1;
case '2':
return 1;
case '3':
return 1;
case '4':
return 1;
case '5':
return 1;
case '6':
return 1;
case '7':
return 1;
case '8':
return 1;
case '9':
return 1;
case '0':
return 1;
default:
return 0;
}
}
int isWhitespace(char c) {
switch (c) {
case' ':
return 1;
case'\n':
return 1;
case'\0':
return 1;
default:
return 0;
}
}
void GetRowsAndColums(char* filename, int* ROWS, int* COLUMNS) {
FILE* fp = fopen(filename, "r");
char rows[MAX_SIZE_OF_MATRIX];
char c;
while (isWhitespace(c = getc(fp))) {}
int i = 0;
while (1) {
i = 0;
if (isNum(c)) {
rows[i++] = c; rows[i] = 0;
}
else if (isWhitespace(c)) {
if (c == '\n') {
printf("Error");
exit(1);
}
*ROWS = strtol(rows, NULL, 10);
break;
}
else {
printf("Error");
exit(1);
}
c = getc(fp);
}
while (isWhitespace(c = getc(fp))) {}
char column[MAX_SIZE_OF_MATRIX];
i = 0;
while (1) {
i = 0;
if (isNum(c)) {
column[i++] = c; column[i] = 0;
}
else if (isWhitespace(c)) {
*COLUMNS = strtol(column, NULL, 10);
break;
}
else {
printf("Error");
exit(1);
}
c = getc(fp);
}
fclose(fp);
}
void TestAdd(ListSTR* matrix) {
for (int i = 0; i < 3; i++) {
matrix->row = (STR*)malloc(sizeof(STR));
matrix->row->Row = i;
matrix->row->Val = i + 1;
matrix->row->Next = NULL;
matrix = matrix->Next;
}
}
void printMatrix(ListSTR* matrix, int ROWS, int COLUMNS) {
STR* point;
for (int i = 0; i < ROWS; i++) {
point = matrix->row;
int lastRow = -1;
for (int j = 0; j < COLUMNS; j++) {
if (point == NULL) {
for (int k = 1; k < COLUMNS - lastRow; k++) {
printf("0 ");
}
break;
}
int Val = point->Val;
int Row = point->Row;
if (Row == 0) {
printf("%d ", Val);
lastRow = 0;
}
else if (Row >= COLUMNS) {
printf("Error");
exit(1);
}
else if (Row > lastRow) {
for (int k = lastRow + 1; k < Row; k++) {
printf("0 ");
}
printf("%d ", Val);
lastRow = Row;
}
else if (Row <= lastRow) {
printf("Error");
exit(1);
}
else {
printf("%d ", Val);
}
point = point->Next;
}
printf("\n");
matrix = matrix->Next;
}
}
void Initialize(ListSTR* matrix, int ROWS) {
if (ROWS == 1) {
matrix->row = NULL;
return;
}
else if (ROWS < 1) {
printf("Error");
exit(0);
}
for (int i = 0; i < ROWS; i++) {
matrix->row = NULL;
matrix->Next = malloc(sizeof(ListSTR));
matrix = matrix->Next;
}
free(matrix);
}
void ReadMatrix(ListSTR* matrix, int ROWS, int COLUMNS, char* filename) {
FILE* fp = fopen(filename, "r");
char c;
int count = 1;
while (c = getc(fp) != '\n') {}
while (1) {
while (1) {
int isNULL = 0;
char val[MAX_SIZE_OF_VAL];
while (isWhitespace(c = getc(fp))) {}
int i = 0;
int value;
int row;
while (1) {
if (c == '-' && i == 0) {
val[i++] = c; val[i] = 0;
}
else if (isNum(c)) {
val[i++] = c; val[i] = 0;
}
else if (isWhitespace(c)) {
if (c == '\n') {
printf("Error");
exit(1);
}
value = strtol(val, NULL, 10);
break;
}
else if (c == 'N') {
if (matrix->row != NULL) {
printf("Error");
exit(1);
}
isNULL = 1;
break;
}
else {
printf("Error");
exit(1);
}
c = getc(fp);
}
while (isWhitespace(c = getc(fp))) {}
char rows[MAX_SIZE_OF_MATRIX];
i = 0;
while (1) {
if (isNULL) {
if (c == 'U') {
for (int i = 0; i < 2; i++) {
c = getc(fp);
if (c != 'L') {
printf("Error");
exit(1);
}
}
break;
}
}
if (isNum(c)) {
rows[i++] = c; rows[i] = 0;
}
else if (isWhitespace(c)) {
row = strtol(rows, NULL, 10);
if (row >= ROWS) {
printf("Error");
exit(1);
}
break;
}
else if (c == EOF) {
row = strtol(rows, NULL, 10);
if (row >= ROWS) {
printf("Error");
exit(1);
}
break;
}
else {
printf("Error");
exit(1);
}
c = getc(fp);
}
if (!isNULL) {
Add(&(matrix->row), value, row);
}
else {
break;
}
if (c == '\n' || c == EOF) {
break;
}
}
count++;
if (count >= ROWS) {
break;
}
matrix = matrix->Next;
}
fclose(fp);
}
void Transpose(ListSTR* matrix, ListSTR* result, int ROWS, int COLUMNS) {
for (int i = 0; i < ROWS; i++) {
if (matrix->row == NULL) {
if (i < ROWS) {
matrix = matrix->Next;
}
continue;
}
STR* point = matrix->row;
while (1) {
AddToIndex(&result, point->Row, point->Val, i);
if (point->Next != NULL) {
point = point->Next;
}
else {
break;
}
}
if (i < ROWS) {
matrix = matrix->Next;
}
}
}
int Trans() {
setlocale(LC_ALL, "Rus");
int ROWS, COLUMNS;
char* file = "Text.txt";
GetRowsAndColums(file, &ROWS, &COLUMNS);
ListSTR* matrix = malloc(sizeof(ListSTR));
Initialize(matrix, ROWS);
ListSTR* result = malloc(sizeof(ListSTR));
Initialize(result, COLUMNS);
ReadMatrix(matrix, ROWS, COLUMNS, file);
printf("Матрица \n");
printMatrix(matrix, ROWS, COLUMNS);
Transpose(matrix, result, ROWS, COLUMNS);
printf("Матрица транспонированная \n");
printMatrix(result, COLUMNS, ROWS);
clean(matrix, ROWS); clean(result, COLUMNS);
return 0;
}
Ответы (1 шт):
Автор решения: Harry
→ Ссылка
typedef struct STR {
int Val;
int Row;
struct STR* Next;
} STR;
Обратите внимание на пропущенное вами struct.
