@temirlan_official

Почему возникает ошибка «Вызвано исключение по адресу (ntdll.dll) нарушение прав доступа при чтении по адресу»?

Необработанное исключение по адресу(ntdll.dll) : Повреждена запись LIST_ENTRY (например, двойное удаление).
Повреждена запись LIST_ENTRY (например, двойное удаление).
Вызвано исключение по адресу (ntdll.dll) нарушение прав доступа при чтении по адресу.
//вырезал циферки и название файла

Когда выходят эти штуки программа останавливается и указывает на строку где я освобождаю память.
И ещё. Такая проблема только с 3 из 4 тестов.
В чём может быть проблема?
Код в спойлерах

spoiler
#include "pch.h"
#include <iostream>
#include <stdio.h> 
#include <conio.h>
#include "Functions.h"

int main(int argn, char *argc[]) {
	FILE *dat, *res;
	dat = fopen(argc[1], "r"); // Открытие входного файла
	res = fopen(argc[2], "w"); // Открутие выходнго файла
	int N = 0;
	int M = 0;
	double **A;
	//double *B;
	double *B = new double[N];// Объявление динамического массива
/*
fscanf(dat, "%d", &N);                                      
fscanf(dat, "%d", &M); // Считывание размеров матрицы

	double **A = new double*[N];
	double *B = new double[N];// Объявление динамического массива
	for (int i = 0; i < N; i++)
		A[i] = new double[M];    
		*/
	
	readMatrix(N, M, &A, dat); // Считывание матрицы
	fprintf(res, "Задана матрица A из %d строк и %d столбцов:\n", N, M);
	//writeMatrix(N, M, A, res); // Вывод матрицы



	bool sum = summa(N, M, A); // Проверка суммы
	if (sum==false)
	{
		fprintf(res, "\nСумма элементов последнего столбца не отрицательна\n");
		fprintf(res, "\n");
		massiv(N, M, A, B);
		writeMassiv(N, B, res); // Вывод массива
		fprintf(res, "\n");
		fprintf(res, "\n");
		//writeMatrix(N, M, A, res); // Вывод матрицы
	}
	else {
		fprintf(res, "\nСумма элементов последнего столбца отрицательна\n");
		fprintf(res, "\n");
		writeMatrix(N, M, A, res); // Вывод матрицы
	}
	
	fclose(dat);
	fclose(res); // Закрытие файлов
	
	for (int i = 0; i < N; i++)
		delete[] A[i];
	delete[] A; // Освобождение памяти от матрицы
	
	if (sum == false)
	{
		delete[] B; // Освобождение памяти от матрицы
	}
}

spoiler
#include <stdio.h> 
#include <conio.h>
#include "pch.h"
#include "Functions.h"

// Считывание матрицы из файла
void readMatrix(int &N, int &M, double ***A, FILE *dat){
	fscanf(dat, "%d", &N);
	fscanf(dat, "%d", &M); // Считывание размеров матрицы
	*A = new double*[N];
	
	for (int i = 0; i < N; i++)
		(*A)[i] = new double[M];
	for (int i = 0; i < N; i++)
		for (int j = 0; j < M; j++)
			fscanf(dat, "%lf", &((*A)[i][j]));

	
}

// Вывод матрицы в файл
void writeMatrix( int N, int M, double **A, FILE *res){
	for (int i = 0; i < N; i++){
		for (int j = 0; j < M; j++)
			fprintf(res, "%6.2lf ", A[i][j]);
		fprintf(res, "\n");
	}
}

// Вывод массива в файл
void writeMassiv( int N, double *B, FILE *res) {
	for (int i = 0; i < N; i++) {
			fprintf(res, "%6.2lf ", B[i]);
	}
}

double massiv(int N,int M, double **A, double *B){

	for (int i = 0; i < N; i++)
	{
		B[i] = sredn(i, M, A);
	}		
	return 0; 
}
// Подсчёт среднего арифметического
double sredn( int i,  int M, double **A) {
	double summ = 0;
			for (int j = 0; j < M; j++)
			{
				summ = summ + A[i][j];
			}
return summ / (M); // Делим на количество элементов
}

// Проверка суммы
bool summa( int N,  int M, double **A) {
	bool sum = false; // Допустим сумма НЕ отрицательна
	double summ = 0;
	for(int i=0; i<N; i++)
	{
		summ = summ + A[i][M-1];
	}
	if (summ < 0) {
		sum = true;
	}
		return sum;

	}

  • Вопрос задан
  • 2856 просмотров
Решения вопроса 1
myjcom
@myjcom
Code
#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h> 

double sredn(int i, int M, double **A)
{
	double summ = 0;
	for (int j = 0; j < M; j++)
	{
		summ = summ + A[i][j];
	}
	return summ / M;
}

void readMatrix(int &N, int &M, double** (&A), FILE *dat) 
{
	fscanf(dat, "%d", &N);
	fscanf(dat, "%d", &M);
	
	A = new double*[N];

	for (int i = 0; i < N; i++)
	{
		A[i] = new double[M];
	}
		
	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < M; j++)
		{
			fscanf(dat, "%lf", &A[i][j]);
		}
	}
}

void writeMatrix(int N, int M, double **A, FILE *res) 
{
	for (int i = 0; i < N; i++) 
	{
		for (int j = 0; j < M; j++)
		{
			fprintf(res, "%6.2lf ", A[i][j]);
		}
		fprintf(res, "\n");
	}
}

void writeMassiv(int N, double *B, FILE *res) 
{
	for (int i = 0; i < N; i++) 
	{
		fprintf(res, "%6.2lf ", B[i]);
	}
}

double massiv(int N, int M, double **A, double *B) 
{

	for (int i = 0; i < N; i++)
	{
		B[i] = sredn(i, M, A);
	}
	return 0;
}

bool summa(int N, int M, double **A) 
{
	bool sum = false; // Допустим сумма НЕ отрицательна
	double summ = 0;
	for (int i = 0; i < N; i++)
	{
		summ = summ + A[i][M - 1];
	}
	if (summ < 0) 
	{
		sum = true;
	}
	return sum;
}

int main(int argn, char *argc[]) 
{
	FILE *dat, *res;

	dat = fopen("D:\\in.txt", "r"); 
	res = fopen("D:\\out.txt", "w"); 
	int N = 0;
	int M = 0;
	double **A = nullptr;

	readMatrix(N, M, A, dat);

	double *B = new double[N];

	fprintf(res, "Задана матрица A из %d строк и %d столбцов:\n", N, M);
	
	bool sum = summa(N, M, A); 
	if (true)
	{
		fprintf(res, "\nСумма элементов последнего столбца не отрицательна\n");
		fprintf(res, "\n");
		massiv(N, M, A, B);
		writeMassiv(N, B, res);
		fprintf(res, "\n");
		fprintf(res, "\n");
	}
	else 
	{
		fprintf(res, "\nСумма элементов последнего столбца отрицательна\n");
		fprintf(res, "\n");
		writeMatrix(N, M, A, res); 
	}

	fclose(dat);
	fclose(res); 

	for (int i = 0; i < N; i++)
	{
		delete[] A[i];
	}
	delete[] A;
	delete[] B;
}

ввод/вывод
3 3
1 2 3
4 5 6
7 8 9

Задана матрица A из 3 строк и 3 столбцов:

Сумма элементов последнего столбца не отрицательна

  2.00   5.00   8.00

Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы