10. Создание массивов
Last updated
Last updated
#include <stdio.h>
#define ARRAY_MAX_SIZE 2500
int array[ARRAY_MAX_SIZE];
Решение: не использовать такие массивы, особенно с выдуманными ограничениями по размеру никак не связанному с условием работ.
int n; // размер матрицы
float **read_matrix_from_file(char *filename)
{
FILE *f = fopen(filename, "r");
fscanf(f, "%d", &n);
if (n <= 0) // "Error: negative size"
exit(1);
float **matrix = malloc(sizeof(float *) * n);
for (int i = 0; i < n; i++)
{
matrix[i] = malloc(sizeof(float) * n);
if (matrix[i] == NULL) // "Error: Memory allocation failed."
{
free(matrix);
exit(1);
}
for (int j = 0; j < n; j++)
if (!fscanf(f, "%float", &matrix[i][j])) // "Error: Invalid file format."
{
free(matrix);
exit(1);
}
}
fclose(f);
return matrix;
}
int main(void)
{
read_matrix_from_file("inputfile");
}
А вот в коде выше появилась новая проблема – exit
. Если обратиться к стандарту C или C++, то можно заметить, что гарантируются "several cleanup steps".
Однако в C++: "Stack is not unwound: destructors of variables with automatic storage duration are not called."
И ещё неприятнее становится, когда разработчик в своём коде использует функцию из внешней библиотеки,а она посреди процесса вычислений вызывает exit
и программа этого разработчика также завершает исполнение, когда этого вообще не хочется.
Более лучшее решение:
float **read_matrix_from_file(char *filename, int *n)
{
FILE *f = fopen(filename, "r");
if (fscanf(f, "%d", &n) != 1 && n <= 0) // "Error: negative size"
return NULL;
float **matrix = malloc(sizeof(float *) * *n);
if (matrix == NULL)
{
return NULL;
}
for (int i = 0; i < n; i++)
{
matrix[i] = malloc(sizeof(float) * *n);
if (matrix[i] == NULL)
{
for (int k = 0; k < i; ++k)
free(matrix[k]);
free(matrix);
return NULL;
}
for (int j = 0; j < n; j++)
if (!fscanf(f, "%f", &matrix[i][j]))
{
for (int k = 0; k < i; ++k)
free(matrix[k]);
free(matrix);
return NULL;
}
}
fclose(f);
return matrix;
}
int main(void)
{
int n;
read_matrix_from_file("inputfile", &n);
}