Произошла непредвиденная ошибка необработанное исключение c ералаш

На чтение 15 мин. Просмотров 612 Опубликовано 29.04.2021

Ошибка « Необработанное исключение win32 в * application_name * » обычно возникает, когда пользователь пытается запустить приложение, созданное в Visual Studio. Большинство зарегистрированных случаев этой ошибки связаны с Uplay, Internet Explorer и несколькими устаревшими играми, изначально созданными для более старых версий Windows.

Примечание : вот как исправить библиотеку времени выполнения, связанную с Visual C ++.

Содержание

  1. Что вызывает ошибку «Необработанное исключение в вашем приложении» в Windows?
  2. Решение 1. Установите все ожидающие обновления Windows
  3. Решение 2. Замените антивирус
  4. Решение 3. Удаление значения реестра Launcher (если применимо)
  5. Решение 4 : Сбросить Internet Explorer (если применимо)
  6. Решение 5. Отключите отладку скриптов и связанные ключи реестра (если применимо)
  7. Решение на 6: Установите последнюю версию NET Framework и отремонтируйте ее
  8. Решение 7. Выполните чистую загрузку
  9. Решение 8. Используйте SFC для сканирования утечек памяти
  10. Решение 9. Выполнение чистой установки

Что вызывает ошибку «Необработанное исключение в вашем приложении» в Windows?

Есть несколько Простые причины этой проблемы, и проблема может быть эффективно решена, если вы сможете распознать свой сценарий просто на основе определения правильной причины. Ознакомьтесь со списком ниже:

  • Виновником может быть ваш антивирус – известны некоторые антивирусные инструменты, такие как Panda Antivirus. которые вызвали эту проблему, поэтому обязательно замените их.
  • Могут быть запущены определенные программы или вредоносное ПО – если на вашем компьютере запущена установленная программа или вредоносное ПО, возможно, вы захотите от него избавиться. Убедитесь, что вы загружаетесь в режиме чистой загрузки, чтобы убедиться, что это правильная причина.
  • Установка Microsoft .NET Framework повреждена . Если его основные файлы повреждены, вы можно попробовать восстановить его установку, установить более новую версию или выполнить сканирование SFC.
  • Отладка скриптов включена через реестр – как оказалось, определенная Ключ реестра может способствовать возникновению этой проблемы. Чтобы решить эту проблему, вам необходимо отключить отладку скриптов с помощью ключей реестра.
  • Нарушение прав доступа в Msvcr92.dll – превышение исходного буфера или неправильный Последний байт также является потенциальной причиной этой проблемы. Чтобы устранить их, вам нужно будет устанавливать все ожидающие обновления Windows.
  • Удаление раздела реестра Ubisoft launcher – если вы видите эту ошибку при попытке запустить Uplay. exe, это связано с ошибкой в ​​Ubisoft Game Launcher. Эту проблему также можно решить через реестр, удалив значение, принадлежащее этому средству запуска.
  • Повреждение системного файла . Несогласованность системных файлов также может создать эту проблему. Легкие повреждения можно устранить с помощью простого сканирования DISM и SFC. В более серьезных обстоятельствах чистая установка или установка с восстановлением должны помочь вам в решении проблемы.

Решение 1. Установите все ожидающие обновления Windows

Одной из наиболее распространенных причин, которые в конечном итоге приводят к ошибке « Произошло необработанное исключение win32 », является приложение, созданное для платформы x64 с использованием MSVCR90.DLL, которое заканчивается вызов функции strncpy.

В этом случае нарушение прав доступа сработало в Msvcr92. DLL , скорее всего, приведет к тому, что приложение перестанет отвечать в функции strncpy. Наиболее вероятными причинами этой проблемы являются чрезмерный исходный буфер или неправильный конечный байт.

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

Примечание. Это исправление было помещено в новую версию Visual Studio 2008, который Windows обновляет автоматически, поэтому приведенные ниже шаги универсальны и должны работать независимо от версии вашей ОС.

Вот краткое руководство по обновлению сборки Windows до последней версии для установки исправление для Visual Studio 2008 и устранение проблемы:

  1. Нажмите клавишу Windows + R , чтобы открыть Выполнить диалоговое окно. Затем введите ‘ms-settings: windowsupdate’ и нажмите Enter , чтобы открыть вкладку обновления Windows в Настройках . app.

    Примечание. Если вы столкнулись с этой проблемой в Windows 7 или Windows 8.1. вместо этого используйте команду ‘wuapp’ .

  2. После того, как вам удастся попасть на экран Центра обновления Windows, начните с нажатия Проверьте обновления . Затем начните следовать инструкциям на экране, чтобы завершить установку всех Windows Update , которые в настоящее время ожидают установки.

    Примечание. Помните, что очень важно устанавливать все обновления, а не только критические. Поскольку исправление включено в ревизию Visual Studio, вы можете найти соответствующее обновление в разделе «Необязательно», поэтому обязательно установите их все.

  3. В случае, если вы ‘ Вам будет предложено перезагрузить компьютер, прежде чем вы получите возможность установить все доступные обновления, сделайте это. Но не забудьте вернуться к этому же экрану после завершения следующего запуска, чтобы завершить установку остальных обновлений.
  4. После установки каждого ожидающего обновления перезагрузите компьютер в последний раз. а затем повторите действие, которое ранее вызывало сообщение об ошибке, чтобы узнать, устранена ли проблема.

Если вы все еще сталкиваетесь с ошибкой « Необработанный файл win32 исключение произошло ‘, перейдите к следующему способу ниже.

Решение 2. Замените антивирус

Бесплатные антивирусные инструменты могут быть весьма полезными, и они могут выполнять свою работу по защите вашего компьютера, но иногда они просто не ладят с другими вещами на вашем компьютере. Подумайте о замене антивируса, если он вызывает эту проблему, когда он включен!

  1. Щелкните меню “Пуск” и откройте Панель управления , выполнив поиск. Кроме того, вы можете щелкнуть значок шестеренки, чтобы открыть настройки, если вы используете Windows 10.
  2. В панели управления выберите Просмотреть как – Категория на в правом верхнем углу и нажмите Удалить программу в разделе «Программы».

  1. Если вы используете приложение” Настройки “, при нажатии на Apps немедленно откроется список всех программ, установленных на вашем компьютере.
  2. Найдите свой антивирусный инструмент в Панели управления или Настройках и нажмите Удалить .
  3. Должен открыться его мастер удаления, следуйте инструкциям по его удалению.

  1. Нажмите “Готово”, когда программа удаления завершит процесс, и перезапустите компьютер, чтобы увидеть, будут ли по-прежнему появляться ошибки. Убедитесь, что вы выбрали лучший вариант антивируса .

Решение 3. Удаление значения реестра Launcher (если применимо)

Если вы столкнулись с ошибкой « Произошло необработанное исключение win32 » при попытке запустить Uplay.exe или другое приложение, принадлежащее Ubisoft, скорее всего, это связано с ошибкой в ​​их Ubisoft Game Launcher.

Оказывается, это широко распространенная проблема в Windows 10, особенно среди пользователей, у которых одновременно установлены Steam и Uplay.

Несколько затронутых пользователей, с которыми мы изо всех сил пытаемся решить эту проблему, сумели исправить ее, используя редактор реестра, чтобы найти строковое значение реестра, принадлежащее средству запуска, и удалить его. Это якобы устраняет конфликт, позволяя обоим приложениям правильно работать на одном компьютере.

Вот краткое руководство по удалению значения реестра, связанного с программой запуска Uplay:

  1. Нажмите клавишу Windows + R , чтобы открыть диалоговое окно Выполнить . В текстовом поле введите ‘regedit’ и нажмите Enter , чтобы открыть редактор реестра . При появлении запроса UAC (Контроль учетных записей) введите Да , чтобы предоставить права администратора.
  2. Как только вы попадете в редактор реестра , используйте левую часть окна, чтобы перейти к следующее расположение:
     Computer  HKEY_LOCAL_MACHINE  SOFTWARE  WOW6432Node  Ubisoft 

    Примечание. Вы можете либо перейти туда вручную, либо вставить местоположение прямо в панель навигации вверху и нажмите Enter , чтобы сразу попасть туда.

  3. После того, как вам удастся приземлиться в правильном месте, двигайтесь вниз в правой части экрана щелкните правой кнопкой мыши Launcher и выберите Удалить , чтобы избавиться от него.

    Примечание. Если вы можете удалить ключ, вот как стать владельцем ключей реестра.

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

  4. После того, как ключ будет был удален, закройте редактор реестра и перезагрузите компьютер.
  5. При следующем запуске компьютера повторите действие, которое ранее вызывало « Произошло необработанное исключение win32 » и посмотрите, решена ли проблема.

Если проблема не устранена, перейдите к следующему потенциальному исправлению ниже.

Решение 4 : Сбросить Internet Explorer (если применимо)

Другой потенциальный случай, который может создать эту проблему, – это серия поврежденных Internet Explorer (IE). Если вы столкнулись с ошибкой “ Произошло необработанное исключение win32 в файле iexplore.exe ‘. Скорее всего, оно появляется после сбоя s cript.

Чтобы решить эту проблему, вам следует сбросить настройки Internet Explorer через меню «Свойства обозревателя». Многие пользователи, столкнувшиеся с этой ошибкой, подтвердили, что эта операция прошла успешно.

Вот краткое руководство по сбросу Internet Explorer для устранения ошибки « Необработанный файл win32 произошло исключение. ‘ошибка:

  1. Убедитесь, что Internet Explorer, Edge или любой другой связанный экземпляр выключен и фоновый процесс не запущен.
  2. Нажмите клавишу Windows + R , чтобы открыть диалоговое окно Выполнить . В текстовом поле введите ‘inetcpl.cpl’ и нажмите Enter , чтобы открыть меню Свойства обозревателя .

    Примечание. Если вам предложит UAC (Пользователь Контроль учетных записей) , нажмите Да , чтобы предоставить права администратора.

  3. После того, как вам удастся войти в Интернет На экране “Свойства ” выберите вкладку Дополнительно в горизонтальном меню вверху. Затем перейдите к настройкам Reset Internet Explorer и нажмите кнопку Reset .
  4. Как только вы увидите экран подтверждения, убедитесь, что установлен флажок Удалить личные настройки . , затем нажмите кнопку Reset .
  5. Подождите, пока операция завершена, затем перезагрузите компьютер и посмотрите, будет ли проблема решена при следующем запуске компьютера.

В случае того же «Необработанное исключение win32 произошло в iexplore.exe ‘ ошибка все еще возникает, перейдите к следующему способу ниже.

Решение 5. Отключите отладку скриптов и связанные ключи реестра (если применимо)

Если вы столкнулись с проблемой с Internet Explorer на машине, на которой установлен VS, проблема также может возникнуть из-за того, что включена отладка сценариев и записи реестра содержат поврежденные данные.

Несколько затронутых пользователей, столкнувшихся с этой проблемой, подтвердили, что проблема была решена после того, как они открыли меню «Свойства обозревателя», чтобы отключить отладку сценария, а затем удалили связанные ключи с помощью редактора реестра.

Вот краткое руководство по устранению ошибки « Необработанное исключение win32 в ошибке iexplorer.exe ‘:

  1. Нажмите клавишу Windows + R , чтобы открыть диалоговое окно Выполнить . Затем в текстовом поле введите « inetcpl.cpl» и нажмите Enter , чтобы открыть меню «Свойства обозревателя». Если вас предложит Контроль учетных записей (UAC) , нажмите Да , чтобы предоставить права администратора.
  2. Как только вам удастся оказаться на экране Свойства Интернета , используйте меню вверху, чтобы выбрать Дополнительно .
  3. На экране Свойства Интернета прокрутите вниз меню Настройки и установите флажок, связанный с Отключить отладку скриптов (Internet Explorer) .
  4. После того, как изменение вступит в силу, нажмите Применить , чтобы сохранить изменения, затем закройте окно Свойства Интернета .
  5. Нажмите Клавиша Windows + R еще раз, чтобы открыть другое диалоговое окно. На этот раз введите «regedit» и нажмите Enter , чтобы открыть редактор реестра. Вам потребуется предоставить доступ администратора, поэтому нажмите Да , когда появится запрос в окне управления учетными записями пользователей.
  6. Внутри редактора реестра перейдите в следующее место с помощью меню слева:
     HKEY_LOCAL_MACHINE  SOFTWARE  Microsoft  Windows NT  CurrentVersion  AeDebug (32-битная машина) HKEY_LOCAL_MACHINE   SOFTWARE  Wow6432Node  Microsoft  Windows NT  CurrentVersion  AeDebug (64-разрядная машина) 

    Примечание. Местоположение файла, который нам нужно удалить, отличается в зависимости от версии Windows, которую вы используете. Если у вас 32-разрядная версия Windows, используйте первое расположение, иначе используйте второе.

  7. Как только вы окажетесь в правильном месте, перейдите в правую секцию, вправо -щелкните Отладчик и выберите Удалить в контекстном меню.
  8. После удаления этого ключа перейдите во второе место:
     HKEY_LOCAL_MACHINE  SOFTWARE  Microsoft  .NETFramework  (32 - Bit Machine) HKEY_LOCAL_MACHINE  SOFTWARE  Wow6432Node   Microsoft  .NETFramework (64-битная машина) 

    Примечание. Получите доступ к разделу реестра, связанному с вашей битовой версией Windows, которую вы используете.

  9. Когда вы окажетесь в правильном месте, перейдите в правый раздел и удалите значение DbgManagedDebugger , щелкнув его правой кнопкой мыши и выбрав Удалить из контекстного меню.
  10. После того, как вам удастся удалить значение, закройте редактор реестра и перезагрузите компьютер.
  11. После завершения следующего запуска проверьте, возникает ли та же проблема.

На случай, если ошибка «Произошло необработанное исключение win32» ошибка все еще возникает, перейдите к следующему методу ниже.

Решение на 6: Установите последнюю версию NET Framework и отремонтируйте ее

Установка NET Framework на ваш компьютер жизненно важна, и от ее установки зависит множество современных игр и программ. Перед ремонтом выполните следующие действия, чтобы установить последнюю версию на свой компьютер.

Перейдите по этой ссылке и нажмите красную кнопку загрузки, чтобы загрузить последнюю версию Microsoft .NET. Фреймворк. После завершения загрузки найдите загруженный файл и запустите его. Учтите, что вам потребуется постоянный доступ в Интернет. Следуйте инструкциям на экране, чтобы продолжить установку.

  1. После установки последней версии пора проверить ее целостность. На клавиатуре используйте комбинацию клавиш Windows + R , чтобы открыть диалоговое окно Выполнить .
  2. Введите control. exe и нажмите OK, чтобы открыть его.

  1. Щелкните параметр Удалить программу и щелкните Включить или выключить функции Windows . Обязательно найдите запись .NET Framework 4.x.x и убедитесь, что она включена. «X.x» обозначает последнюю версию, доступную для вашей операционной системы.
  2. Если флажок рядом с .NET Framework 4.x.x не установлен, включите его, установив флажок. Нажмите OK, чтобы закрыть окно Компонент Windows и перезагрузите компьютер.

  1. Если .Net Framework 4.xx уже включен, вы можете восстановить .Net Framework, сняв флажок и перезагрузив компьютер. После перезагрузки компьютера снова включите .Net Framework и снова перезагрузите компьютер..

Решение 7. Выполните чистую загрузку

Существуют различные другие программы и службы, которые могут повлиять на правильную загрузку. функциональность пакета Microsoft .NET Framework. В большинстве случаев причиной является установленный вами антивирус, и вы можете попробовать отключить его, чтобы проверить, сохраняется ли ошибка. Однако, чтобы убедиться, что ничто не может помешать установке, мы рекомендуем выполнить чистую загрузку, которая отключит запуск всех сторонних программ и служб. Таким образом, вы можете легко определить, какая программа вызывает эту ошибку!

  1. Используйте комбинацию клавиш Windows + R на клавиатуре. В диалоговом окне Выполнить введите MSCONFIG и нажмите ОК.
  2. Щелкните вкладку Загрузка и снимите флажок с параметра Безопасная загрузка ( если отмечено).

  1. На вкладке “Общие” в том же щелкните, чтобы выбрать параметр Выборочный запуск , а затем снимите флажок Загружать элементы автозагрузки , чтобы убедиться, что он не установлен.
  2. На вкладке Службы установите флажок Скрыть все службы Microsoft , а затем нажмите Отключить все

  1. На вкладке “Автозагрузка” нажмите Открыть диспетчер задач . В окне диспетчера задач на вкладке «Автозагрузка» щелкните правой кнопкой мыши каждый включенный элемент автозагрузки и выберите

  1. После этого вам нужно будет выполнить некоторые из самых утомительных процессов, а именно включение элементов автозагрузки один за другим. и перезагрузите компьютер. После этого нужно проверить, появляется ли проблема снова. Вам нужно будет повторить тот же процесс даже для Сервисов, которые вы отключили на шаге 4.
  2. Как только вы обнаружите проблемный элемент автозагрузки или сервис, вы можете предпринять действия, чтобы решить эту проблему. ВНИМАНИЕ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Если это программа, ее можно переустановить или восстановить . Если это служба, вы можете отключить ее и т. Д.

Решение 8. Используйте SFC для сканирования утечек памяти

Сообщалось, что повреждение Microsoft .NET Framework связано с неисправной системой файлы. Эти проблемы уходят корнями глубоко в системные файлы, и единственный способ попытаться решить их – запустить средство проверки системных файлов (SFC). Он просканирует ваши системные файлы на наличие ошибок и, возможно, отремонтирует или заменит их. Для этого выполните следующие действия!

  1. Найдите « Command Prompt », набрав его либо прямо в меню «Пуск», либо нажав нажав кнопку поиска рядом с ним. Щелкните правой кнопкой мыши первую запись, которая появится как результат поиска, и выберите пункт контекстного меню «Запуск от имени администратора»..
  2. Кроме того, вы также можете использовать комбинацию клавиш с логотипом Windows + R, чтобы открыть диалоговое окно Выполнить . Введите « cmd » в открывшемся диалоговом окне и используйте комбинацию клавиш Ctrl + Shift + Enter для командной строки администратора.

  1. Введите следующие команды в окне и не забудьте нажать Enter после ввода каждой один. Дождитесь сообщения «Операция успешно завершена» или чего-то подобного, чтобы узнать, что метод сработал.
 sfc/scannow 
  1. Попробуйте перезагрузить компьютер и проверьте, продолжает ли ошибка Необработанное исключение в вашем приложении появляться на вашем компьютере.

Решение 9. Выполнение чистой установки

Если ни один из представленных ниже методов не помог вам в решении проблемы, скорее всего, вы имеете дело с какой-то несоответствия Windows, которое не может быть разрешено традиционным способом.

Если этот сценарий применим, вы сможете решить проблему, сбросив все компоненты, связанные с вашей установкой Windows. Если вы хотите пойти по этому пути, у вас есть два пути вперед. Все сводится к процедуре, которой вы хотите следовать:

  • Ремонтная установка (восстановление на месте) – эта процедура является наилучшей. подход, когда вам нужно обновить каждый компонент ОС, но некоторые пользователи могут в конечном итоге посчитать его слишком утомительным на свой вкус. Имейте в виду, что вам понадобится совместимый установочный носитель, чтобы применить это исправление, но основным преимуществом является то, что все ваши личные данные (включая игры, приложения и личные носители) будут сохранены, даже если вы не создадите резервную копию своего компьютера. .
  • Чистая установка . Если вы ищете простейшее решение, это лучший вариант. Вам не понадобится установочный носитель для его принудительного применения (все это делается через графический интерфейс Windows). Но если вы заранее не сделаете резервную копию своих данных, будьте готовы к полной потере данных.

I’m building a windows forms program on Visual Studio 2013 (C#) which reads data from Serial Port (in my case — Arduino) and use it to change a picture. The Arduino returns an 8-bit string of 0’s and 1’s, which indicates what picture to change. For example — if the string is 10001001 the program should change the 1’st, 5’th and 8’th picture. The program is able to get the correct string from the Serial Port (via Serial Communication), but when I added a method that makes the picture to change, it sometimes gives me this error:

An unhandled exception of type ‘System.Reflection.TargetInvocationException’ occurred in mscorlib.dll

and point that line on Program.cs:

Application.Run(new Form1());

(My form name is «form1.cs» and the namespace is serial_read)

Here’s what the program looks like:
enter image description here

And here’s my form1.cs code:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using System.Threading;

namespace Serial_receive
{
public partial class Form1 : Form
{
    SerialPort serialPort1 = new SerialPort(); //Defines Serial Port

    public Form1()
    {
        InitializeComponent();

        serialPort1.BaudRate = 9600;
        serialPort1.DtrEnable = true;

        foreach (string port in SerialPort.GetPortNames()) {comboBox1.Items.Add(port);} //Gives a list of the available ports

        serialPort1.DataReceived += serialPort1_DataReceived;
    }

   private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
   {
       string line = serialPort1.ReadLine(); //The serial string
       this.BeginInvoke(new LineReceivedEvent(LineReceived), line);

   }
   private delegate void LineReceivedEvent(string line);

   //Change image to a different image
   private void changeColor(PictureBox ob, string line, int l) //ob = PictureBox, line = the serial string, l = number of PictureBox
   {
       if (int.Parse(line.Substring(l, 1)) == 1)
           ob.Image = Serial_receive.Properties.Resources.red;
   }

   private void LineReceived(string line)
   {
       label1.Text = line;

       changeColor(l1, line, 0); //Picture 1
       changeColor(l2, line, 1); //Picture 2
       changeColor(l3, line, 2); //Picture 3
       changeColor(l4, line, 3); //Picture 4
       changeColor(l5, line, 4); //Picture 5
       changeColor(l6, line, 5); //Picture 6
       changeColor(l7, line, 6); //Picture 7
       changeColor(l8, line, 7); //Picture 8

   }

   private void button1_Click(object sender, EventArgs e) //Start Button
   {
       serialPort1.PortName = comboBox1.Text.ToString();

       if (comboBox1.Text.ToString() == "Select Port... (Default: COM4)" || comboBox1.Text.ToString() == "")
            serialPort1.PortName = "COM4";
       serialPort1.Open();
       button1.Enabled = false;
   }
}

}

Any ideas why I get this error? I’m kinda new to C# and don’t really know what’s the problem..

Как исправить ошибку необработанного исключения

Я написал небольшое приложение и добавил проект установки щита. После установки приложения в C:\Program Files я могу без проблем запускать его от имени администратора. Но когда я запускаю его без прав администратора, это дает мне эту ошибку:

Произошло необработанное исключение в вашем приложении. Если вы нажмете «Продолжить», приложение проигнорирует эту ошибку и попытается продолжить. Если вы нажмете Quit, приложение закроется немедленно. Операция должна использовать неопровержимый запрос

Как я могу это исправить?

2015-04-19 17:22

2
ответа

Считаете ли вы, что ваша установка подразумевает зависимость от запуска в качестве администратора. Например, пользователям, как правило, разрешен доступ для записи в «C:\Program Files», это предотвращает несанкционированные изменения программ от несанкционированных изменений в ваших приложениях.

2015-04-19 17:34

Одна из возможностей состоит в том, что ваши приложения пытаются получить доступ к некоторым файлам в C:\Program Files каталог и для этого у вас должны быть права администратора. Но сложно сказать. Вы можете попробовать отладить ваше приложение и посмотреть, вызывает ли оно исключение и режим отладки. Если это также произойдет, вы можете расследовать это оттуда. Другой вариант — добавить обработку исключений (try..catch блоки) и запись всех сгенерированных исключений в файл. После запуска приложения в режиме без прав администратора вы можете проверить файл для деталей.

2015-04-19 17:59

Такое сообщение: Необработанное исключение по адресу 0x00A8AF69 в ConsoleApplication5.exe: 0xC0000005: нарушение прав доступа при записи по адресу 0x005BF000.

Я выполнил трассировку, стрелка указала на восьмую строчку. Бесконечного цикла, как мне кажется, нет. Да и массив создан динамический. В чем ошибка?

  { 
  int i, j, k, pos = -1, N, M;
  int *d = new int;//Массив сдвигов
  N = s.length();
  M = find.length();
  clock_t t0 = GetTickCount(); // начальное время
  // Формирование таблицы сдвигов d
  for(i = 0; i <= N; i++)
  d[i] = M;
  for(i = 0; i < M - 1; i++)
  d[find[i]] = M - i - 1;
  // Поиск образца P в тексте S
  i = M;
  do{
  k = i;
  j = M;
    do
{
  j--;
  k--;
}
while(j >= 0 && s[k] == find[j]);
if(j == -1)
  pos = i - M;
else
  i += d[s[i - 1]];
 }
 while(i <= N && j >= 0);
 if(j > -1)
 cout << "Образец найден по смещению pos : " << pos-1 << endl; 
 else 
 cout << "Образец не найден" << endl;
 clock_t t1 = GetTickCount();// конечное время
 cout << "Время поиска : " << (double)(t1 - t0)/1000 << endl;// время поиска
 }
 system("pause");
 return 0;
 }

задан 23 мар 2015 в 19:21

Sergos's user avatar

SergosSergos

331 золотой знак2 серебряных знака6 бронзовых знаков

2

@Sergos, ошибка очевидна — Вы пишете в память, которая на самом деле не выделена.

Смотрите:

 int *d = new int;//Массив сдвигов

Тут Вы выделили память под один int. Судя по коду

 for(i = 0; i < s.length(); i++)
   d[i] = M;   <---- ошибка????

нужен массив из s.length() чисел.

Вот и создавайте его правильно:

 int *d = new int[s.length()];//Массив сдвигов

Но в свете следующего фрагмента

 for(i = 0; i < M - 1; i++)
   d[find[i]] = M - i - 1;

учитывая

 M = find.length(); // а что за символы в строке find?

вообще-то остаются вопросы к алгоритму.

ответ дан 23 мар 2015 в 20:51

avp's user avatar

avpavp

45.7k6 золотых знаков45 серебряных знаков115 бронзовых знаков

7

Я пытаюсь написать код, использующий 2 рекурсивные функции; ‘I’ и ‘U’ и одна нерекурсивная функция ‘f’ . То, что я пытаюсь достичь, — это запустить рекурсивную функцию I «steps1» много раз , а затем остановиться на этом уровне, чтобы затем запустить < сильная> рекурсивная функция U «шаги2» много раз . После этого, наконец, запустите нерекурсивную функцию f на уровне, где заканчивается итерация функции U .

Например:

Пусть steps1 = 1 и steps2 = 1 , тогда

Я повторю функцию ‘I’ один раз (шаги1) и получу:

   I(n)= 3*I(n/2)+7*n-3  

Затем я повторю функцию U , 1 раз (шаги 2) для n / 2 < / strong> значение. А затем вставьте его вместо I (n / 2) , таким образом я рассчитаю:

    I(n)= 3*[U(n/2)]+7*n-3= 3*[2*U(n/6)+2*(n/2)-9] = 3*2*U(n/6)+3*2*(n/2)-3*9 

Теперь вставьте последнюю функцию f (n / 6) в это уравнение:

        3*2*U(n/6)+3*2*(n/2)-3*9=3*2*f(n/6)+3*2*(n/2)-3*9 

Поскольку f нерекурсивен, это даст мне результат.

Когда я запускаю свой код, я получаю ошибку «необработанное исключение». Может ли кто-нибудь помочь мне найти причину этой ошибки? Где-то мой код неправильный? Может кто-нибудь помочь мне исправить это, пожалуйста? Я не уверен, что мой код делает именно то, что я хочу делать?

#include<stdlib.h>
#include<bits/stdc++.h> 
using namespace std; 


int f(int n) 
{ 
   return (n-1)*(n-1);

} 

 /* step2 many iteration of the function U and then function f */
int U(int n , int steps2, int counter2=0) 
{ 

   if(counter2==steps2){
        return f(n);
      } 

    return 2*U(n/3, steps2, counter2+1)+2*n-9; 

} 

/* step1 many iteration of  the function I and then function U*/
int I(int n , int steps1,int steps2, int counter1=0, int counter2=0) 
{ 

   if(counter1==steps1){
        return U(n,steps2,counter2);
      } 

    return 3*I(n/2, steps1, counter1+1)+7*n-3; 

} 


int main(){

    int n, steps1,steps2;
   cout<< " Enter 'n' value which is divisable by both 2 and 3"<<"\n";
   cin>>n;
    cout<< " Enter iteration count for I"<<"\n";
   cin>>steps1;
    cout<< " Enter iteration count for U"<<"\n";
   cin>>steps2;
   cout<< " result:" << I(n,steps1,steps2)<<"\n";

     getchar(); 
     return 0; 

 }

1 ответ

Лучший ответ

Я скомпилировал и запустил вашу программу, и похоже, что у вас переполнение стека. Рекурсия для функции I неверна. А именно, ваш базовый вариант никогда не будет достигнут. В каждом месте, которое вызывается I, вы передаете только 3 параметра, поэтому counter1 всегда будет иметь значение 0, значение по умолчанию. Кроме того, всегда вызывается I, так что steps1 всегда будет иметь одно и то же значение (из ввода пользователя). Так что if(counter1==steps1){ никогда не будет правдой.

Несколько советов на случай будущих проблем. При устранении такой проблемы, одно из самых простых действий, которое вы можете сделать, — это добавить cout в начало каждой функции. Выведите имя функции и значения параметров. Другой вариант — подключить отладчик и установить несколько точек останова. Изучение того, как использовать отладчик с C ++, будет очень и очень кстати.


2

Michael Albers
6 Май 2020 в 03:16

Понравилась статья? Поделить с друзьями:
  • Произошла непредвиденная ошибка невозможно загрузить страницу инстаграмм
  • Произошла ошибка 0x57
  • Произошла неустранимая ошибка системы зарегистрирована sdd
  • Произошла непредвиденная ошибка невозможно загрузить страницу инстаграм
  • Произошла одна или несколько ошибок фазмофобия