ArvindSai Ответов: 2

Эта простая программа создает исключение в visual studio


Я попытался скомпилировать эту следующую простую программу на языке Си(вычисляя сумму 5 пяти предметов и ее совокупный процент) в visual studio 2015,но она выдает исключение, может ли кто-нибудь мне помочь, я новичок в использовании visual studio.
Он закрывает окно консольного приложения (32 бит) и выскакивает окно с надписью:

"Исключение, вызванное в 0x54ACB5F2 (ucrtbased.dll) в ConsoleApplication3.exe: 0xC0000005: нарушение доступа место записи 0xCCCCCCCC.

Если есть обработчик для этого исключения, программа может быть безопасно продолжена."

Что я уже пробовал:

#include "stdafx.h"
#include<stdio.h>
#include<conio.h>


int main()
{
	int marks=0,sub[4],i=1;
	while (i <= 5)
	{
		A:printf("\nEnter Subject %d Marks: ", i);
		scanf_s("%d", sub[i]);
		if(sub[i]<0)
		{
			printf("\nINVALID VALUE!!");
			goto A;
		}
		else
		marks = marks + sub[i];
	}
	printf("\nTotal Marks : %d out of 500, Aggregate percentage is %f", marks, marks / 5);
    return 0;
}

Graeme_Grant

Это пахнет домашним заданием...

Какая ошибка? Какая линия? Вы искали ошибку в docs/google? Знаете ли вы, как использовать отладчик?

Обновите свой вопрос с подробностями, нажав на кнопку Улучшить вопрос

ArvindSai

Он соответствует программе, но после ввода значения для первого субъекта он закрывает консольное приложение windows и открывает окно, показывающее сообщение, как указано в запросе
Я боюсь сказать, что не знаю, как использовать отладчик, я очень новичок в visual studio, можете ли вы дать мне какие-либо предложения, чтобы узнать о компиляторе visual studio и о том, как он работает: (@Graeme_Grant

Graeme_Grant

Это видео поможет вам начать работу с отладчиком: Отладка приложений C/C++ в Visual Studio 2013 - YouTube[^]

ArvindSai

Спасибо за ссылку!!:)

ArvindSai

Я попробовал отладить, но он выдает одно и то же сообщение@Graeme_Grant

Dave Kreskowiak

Отладчик не предназначен для автоматического поиска ошибок в вашем коде. Он там, чтобы найти в вас Жуков. Он поможет вам понять ваш код и то, как он работает.

[no name]

Не используйте goto

ArvindSai

Что я должен использовать для обнаружения входа отрицательных значений для испытуемых( так как они не могут быть), какие-либо предложения?:)

[no name]

Любая петлевая структура будет работать.

Graeme_Grant

Проверьте, что вы ожидаете, и исключения будут не такими, как вы хотите.

if (okay) { ... } else { ... }

ArvindSai

значит, мне нужно упомянуть это утверждение после else в цветочных скобках?

2 Ответов

Рейтинг:
8

Patrice T

Как вам уже было сказано, ошибка возникает из-за слишком малого массива.
Но если вы посмотрите внимательно, то увидите, что на самом деле вам вообще не нужен массив, достаточно переменной.
Посмотрите, что вы делаете: Вы читаете значение, сохраняете его в массиве, что-то делаете с ним, а затем выполняете цикл для следующего.
И вы никогда больше не используете значения, сохраненные в массиве.
Весь интерес массива заключается в том, что вы можете повторно использовать его значения после заполнения массива.


Чтобы избавиться от goto, изучите do ... while петля.

Отладчик-это инструмент, предназначенный для того, чтобы помочь вам отслеживать ошибки, привыкнуть к нему.

Когда вы не понимаете, что делает ваш код или почему он делает то, что делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволяет вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения, это невероятный инструмент обучения.

Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]

Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.


Рейтинг:
18

OriginalGriff

Массивы в C начинаются с нулевого индекса, поэтому, если вы объявите массив из 4 целых чисел, вы можете получить доступ только к элементам 0, 1, 2 и 3 - ваш код допускает 1, 2, 3, 4 и 5, что вызовет проблемы.

И убрать goto от вашей памяти до тех пор, пока у вас не будет около пяти лет опыта разработки - к тому времени вы поймете, когда это хорошая идея, чтобы использовать его. Это не лучшее время, поэтому не используйте его - он помогает создавать код, который трудно понять, поддерживать и писать.
Я не пользовался goto годами, возможно, десятилетиями!


ArvindSai

Спасибо за решение:)
Итак, как я могу написать код, который обнаруживает отрицательные значения(в допустимых значениях) и переходит обратно к оператору, который позволяет повторно вводить новые допустимые значения?, Какие-нибудь предложения или идеи, пожалуйста??

ArvindSai

Я попытался исправить значения массива и удалил оператор goto
на данный момент вышеприведенная программа выглядит следующим образом
тап_п()
{
int marks = 0, sub[5], i = 0;
в то время как (i <= 4)
{
printf ("\nEnter Subject %d Marks:", i + 1);
scanf_s ("%d", sub[i]);
метки = метки + sub[i];
}
printf ("\nTotal Marks : %d out of 500, Aggregate percentage is %f", marks, marks / 5);
возвращает 0;
}

Но все равно ... та же проблема

OriginalGriff

Вам нужны две петли: одна внутри другой.
Внутренний запрашивает номер, проверяет его и, если он правильный, выходит из цикла.
Если это не так (то есть отрицательное или вообще не число), оно снова вращается.
Как только у вас есть правильное значение и вы вышли из цикла, вам нужно включить его в свой итог и изменить переменную внешнего цикла "i".

Это гораздо проще сделать ,чем описать... но это твое домашнее задание, а не мое, так что нечестно давать тебе код! :смеяться: