Ошибка сегментации при чтении текстового файла
При чтении текстового файла вылезает ошибка сегментации:
Signal: SIGSEGV (Segmentation fault)
К тому же если поменять fscanf на scanf и вводить числа через консоль, то происходит тоже самое. Хотя это обычные переменные, а не указатели на них.
Сам код:
#include <stdio.h>
#include <math.h>
#include <malloc.h>
struct complex {
double real, imag;
};
void print_nulls(int c) {
for (int i = 0; i < c; i++) {
printf("%14d ", 0);
}
}
void Print(int m_arr[], int size_m, struct complex *a_arr[], int size_a, int m) {
int i_m = 0;
printf("DEFAULT MATRIX\n");
for (int i = 0; i < size_a; i += 2) {
if (m_arr[i_m] == 0) {
print_nulls(m);
++i_m;
continue;
}
if (i == m_arr[i_m]) {
print_nulls((int) a_arr[i]->real - 1);
++i_m;
} else {
print_nulls((int) a_arr[i]->real - (int) a_arr[i - 2]->real - 1);
}
printf("%1.2f + %1.2f*i ", a_arr[i + 1]->real, a_arr[i + 1]->imag);
}
printf("FIXED MATRIX\nARRAY M\n");
for (int i = 0; i < size_m; i++) {
printf("%d ", m_arr[i]);
}
printf("ARRAY A\n");
for (int i = 0; i < size_a; i++) {
if (i % 2) {
printf("%1.2f + %1.2f*i ", a_arr[i]->real, a_arr[i]->imag);
} else {
printf("%d ", (int) a_arr[i]->real);
}
}
printf("\n");
}
int main() {
FILE *f = fopen("in.txt", "r");
if (f == NULL) {
printf("INVALID INPUT\n");
return 0;
}
int *m_arr;
struct complex **a_arr;
int n, m;
int i_a = 0, i_m = 0;
while (!feof(f)) {
scanf("%d %d", n, m); // ошибка происходит на этой строчке
m_arr = (int *) malloc(m * sizeof(int));
a_arr = (struct complex **) malloc(n * m * 2 * sizeof(struct complex));
for (int i = 0; i < n; i++) {
int bool_ch = 0;
for (int j = 0; j < m; j++) {
double real, imag;
fscanf(f, "%f %f", real, imag);
if (real || imag) {
if (!bool_ch) {
m_arr[i_m++] = i_a;
}
bool_ch = 1;
a_arr[i_a]->real = j, a_arr[i_a++]->imag = 0;
a_arr[i_a]->real = real, a_arr[i_a++]->imag = imag;
}
}
if (!bool_ch) m_arr[i_m++] = 0;
}
}
fclose(f);
int size_a = i_a, size_m = i_m;
Print(m_arr, size_m, a_arr, size_a, m);
int colums[100], size = 0;
struct complex *del;
del->real = 0, del->imag = 0;
i_m = 0;
float mod = 0;
for (int i = 0; i < size_a; i += 2) {
if (a_arr[i]->real == m_arr[i_m]) {
i_m++;
}
if (mod < sqrt(pow(a_arr[i]->real, 2) + pow(a_arr[i]->imag, 2))) {
for (int j = 0; j < size; j++) {
colums[j] = 0;
}
colums[0] = i_m, size = 1;
mod = sqrt(pow(a_arr[i]->real, 2) + pow(a_arr[i]->imag, 2));
del = a_arr[i];
} else if (mod == sqrt(pow(a_arr[i]->real, 2) + pow(a_arr[i]->imag, 2))) {
colums[size++] = i_m;
}
}
for (int i = 0; i < size; i++) {
int graniza = -1;
if (colums[i] == m) {
graniza = size_a;
} else {
graniza = m_arr[colums[i]];
}
for (int j = m_arr[colums[i] - 1]; j < graniza; j += 2) {
struct complex ch = *a_arr[j + 1];
a_arr[j + 1]->real = (ch.real * del->real + ch.imag * del->imag) /
((pow(del->real, 2) + pow(del->imag, 2)));
a_arr[j + 1]->imag = (ch.imag * del->real - ch.real * del->imag) /
((pow(del->real, 2) + pow(del->imag, 2)));
}
}
Print(m_arr, size_m, a_arr, size_a, m);
free(m_arr);
for (int i = 0; i < n * m * 2; i++) {
free(a_arr[i]);
}
free(a_arr);
return 0;
}