0 / 0 / 1
Регистрация: 23.09.2012
Сообщений: 3
1

Необработанное исключение в "0x77913ab3" в "x": 0xC0000005: Нарушение прав доступа при чтении "0xdddddddd"

26.09.2012, 05:45. Показов 3080. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
вот код, нужно найти 3 минимальных положительных числа в массиве.
При размере массива больше 950 в конце заполнения рандомным способом вылитает ошибка,
При размере массива больше 15-20 во время окончания отладки, выдаёт ошибку.

Необработанное исключение в "0x77913ab3" в "x": 0xC0000005: Нарушение прав доступа при чтении "0xdddddddd"

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
#include "stdafx.h"
 
#include <clocale>
#include <conio.h>
#include <stdio.h>
#include <ctime>
#include <iostream>
 
int random(int, int);   //прототип функции
 
int security();
 
 
int main()
{  setlocale(LC_ALL, "Russian");
   setlocale(LC_ALL, "rus");
   int menu, i, size=0, g, iM, menu1, menu2,temp;
   int max1, max2, max3;           
   int *mas=new  int[size](); 
   int wasEntered=0;  
   int wasNext=0;
   printf("*Программа для нахождение трёх самых маленьких положительных чисел в массиве*\n\n");
 
do
{  printf("1. Ввод элементов массива\n");
   printf("2. Обработка массива\n");
   printf("3. Вывод данных на экран\n");
   printf("-------------------------\n");
   printf("0. Выход.\n");
   printf("Ваш выбор: ");
   menu=security();
 switch(menu)
 {   case 1:
mak:
         iM =0,size=0;         
         printf("\n\n\nВведите размер массива: ");
         iM=security();
 
          if (iM<=0)
          {   printf("\n\aОшибка!\n Размер не может быть отрицательным или равным 0!\n");
              goto mak;    }
 
          if (iM>=901)
          {   printf("\n\aОшибка!\n Размер слишком большой(901=> )!\n");
              goto mak;    }
  
         printf("1. Ручной ввод\n");
         printf("2. Авто-заполнение(рандомом)\n");
         printf("3. Назад\n");
         printf("Ваш выбор: ");
         menu1=security();
        switch(menu1)
        {    case 1: printf ("\n\nВведите целые элементы массива: \n");
                     for(i=0,g=0; g<iM; g++)
                     {    temp=security();
                     if(temp>0)
                     {    mas[i]=temp;   size++; i++;   } }
                     printf("\nГотово!\n");
                     wasEntered=1;    //массив был заполнен
                     wasNext=0;       //обнуление предыдущего запуска
                       break;
 
             case 2: srand(static_cast<unsigned int>(time(NULL)));   //нужен, что-бы рандом был разный
                     for(i=0; i<iM; i++)
                     mas[i]=random(10, 1000); //Рандом
                     printf("\nГотово!\n\n");
                     wasEntered=1; 
                     wasNext=0; 
                     size=iM;
                       break;
 
             case 3:   break;
 
             default: printf("\a\nНеверный пункт меню!\n");     
                       break;         
        }
      break;
   case 2: if (wasEntered==1)   //условие, что массив был заполнен
           {    
               int temp=0;                          //отсортировка массива по возрастанию    
               for (int i=1;  i<size  ;  i++)
               {   for (int j=0;  j<size-i;  j++)
                   {   if (mas[j]> mas[j+1])
                       {   temp=mas[j];           
                           mas[j]= mas[j+1];    
                           mas[j+1]=temp;
               }    }  }
               max1=mas[0], max2=mas[1], max3=mas[2]; 
               printf("\n\nГотово!\n\n");   
               wasNext=1;   }//обработка была выполнена
 
           else 
           {   printf("\a\nВы ещё не заполнили массив!\n");
               printf("Выберите пункт меню 1.\n\n");      }
     break; 
   case 3: if (wasNext) 
           {    menu2=0;
                printf("\n1. Вывод положительного массива\n");
                printf("2. Вывод трёх самых маленьких положительных чисел в массиве\n");
                printf("3. Назад\n");
                printf("Ваш выбор: ");
                menu2=security(); 
 
               switch(menu2)
               {    case 1: printf("\n");
                             for(i=0; i<size; i++)
                             {   printf("%d; ", mas[i]);   }
                              printf("\nГотово!\n");
                                break;
 
                    case 2: if (size==0)
                            printf("\nПоложительных чисел нету!\n");
                            if (size==1)
                            printf("\nПоложительно число: %d.\n",max1);
                           
                            if (size==2)
                            {   printf("\nПервое число: %d.\n",max1);
                                printf("\nВторое число: %d.\n",max2);
                                printf("Больше положительных чисел нету!\n\n");      }
                            if (size>=3)
                            {   printf("\nПервое число: %d.\n", max1); 
                                printf("\nВторое число: %d.\n", max2);   
                                printf("\nТретье число: %d.\n", max3);    } 
                                 break;
 
                    case 3:  break;
 
                    default: printf("\a\nНеверный пункт меню!\n");       
          }    }
          else 
          {   printf("\a\nВы ещё не произвели расчёт!\n");
              printf("Выберите пункт меню 2.\n\n");       }
     break;
   case 0: 
     break; 
   default: printf("\a\nНеверный пункт меню!\n");
       break;     
}}
while(menu!=0);    
}
 
int random(int min, int max)                  //Функция рандом
{   return (min + rand()%(max-min+1));    }   // от min до max включительно
 
int security()            //Функция защиты ввода
{  char bufStub;
   int y=1;
   double poram;
do
{ 
    poram=0; bufStub=0;
    if((scanf("%lf%c",&poram,&bufStub) != 2) || bufStub != '\n')
    {    printf("\n\aОшибка! Возможно вы ввели нецелое число или символы\n");
           
         while(bufStub != '\n')
         scanf("%c",&bufStub);
    }
    else y=0;
}
while(y==1);
return(poram);
}
Я только начинаю разбираться в c++ после паскаля, подскажите где тут ошибка, и как можно оптимизировать код.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.09.2012, 05:45
Ответы с готовыми решениями:

Необработанное исключение по адресу 0x7C5101C9 (ucrtbased.dll) в EXAM.exe: 0xC0000005: нарушение прав доступа при записи
Доброго времени суток. Необходимо переписать данные структуры в файл и после прочитать. Не могу...

Ошибка: "Необработанное исключение: 0xC0000005: Нарушение прав доступа при записи"
мной написана программа #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &quot;mpi.h&quot; #include...

Необработанное исключение: 0xC0000005: Нарушение прав доступа при чтении
Программа складывает и вычитает матрицы произвольной размерности, читаемые ею с файла. На самом...

Необработанное исключение по адресу 0x008B94C5. 0xC0000005: нарушение прав доступа при чтении по
Здравствуйте! Функция должна искать локальные минимумы массива. То есть это элементы,которые меньше...

Необработанное исключение по адресу 0x004490F8 в ConsoleApplication1.exe: 0xC0000005: нарушение прав доступа при чтении
Я реализую дерево. Хочу добавить элемент через указание ссылки на родителя. Но непонятно почему я...

2
Модератор
Эксперт по электронике
8876 / 6651 / 912
Регистрация: 14.02.2011
Сообщений: 23,420
26.09.2012, 06:23 2
Цитата Сообщение от canek244 Посмотреть сообщение
int menu, i, size=0, g, iM, menu1, menu2,temp;
int max1, max2, max3;
int *mas=new int[size]();
ты задал размер массива равным 0
Цитата Сообщение от canek244 Посмотреть сообщение
for(i=0; i<iM; i++)
mas[i]=random(10, 1000); //Рандом
и вот здесь выходишь за рамки массива
и получаешь

Цитата Сообщение от canek244 Посмотреть сообщение
Необработанное исключение в "0x77913ab3" в "x": 0xC0000005:
вывод
надо создавать массив после того как введешь размер
1
0 / 0 / 1
Регистрация: 23.09.2012
Сообщений: 3
30.09.2012, 14:03  [ТС] 3
Спасибо, там разобрался.
Вот новая задачка: перемножить две матрицы, проблема в том, что третья матрица не заполняется во время переумножения. вот код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
int _tmain(int argc, _TCHAR* argv[])
{  setlocale(LC_ALL, "Russian");
   setlocale(LC_ALL, "rus");
   int i, g, z, b; 
   int N=3000, M=3000, S=3000;  // размеры матриц  
   int **mas= NULL;     //первая матрица
   int **kap= NULL;     //вторая матрица
   int **bol= NULL;     //Матрица произведения первой на вторую
   mas=new  int*[N];    
   kap=new  int*[M];   
   bol=new  int*[N];
mak:
    N=0;        
    printf("\n\nВведите количество строк  первой матрицы: ");
    scanf("%d",&N);
    if ((N>=3000)||(N<=0))
    {    printf("Размер матрицы должен быть в границах от 0 до 3000!\n");
         goto mak;     }
mak1:
     M=0;
     printf("\n\n\nВведите количество столбцов первой матрицы и это же число будет \n количеством строк второй матрицы(по правилу умножения матриц): ");
     scanf("%d",&M);
     if ((M>=3000)||(M<=0))
     {   printf("Размер матрицы должен быть в границах от 0 до 3000!\n");
         goto mak1;     }
mak2:
     S=0;
     printf("\n\n\nВведите количество столбцов второй матрицы: ");
     scanf("%d",&S);        
     if ((S>=3000)||(S<=0))
     {   printf("Размер матрицы должен быть в границах от 0 до 3000!\n");
         goto mak2;     }
 
for(i=0; i<N; i++)      //преобразовываем массивы в матрицы
    mas[i]=new  int[M];
for(i=0; i<M; i++)
    kap[i]=new  int[S];
for(i=0; i<N; i++)
    bol[i]=new  int[S];
 
printf ("\n\nВведите целые элементы первой матрицы: \n");
for(i=0; i<N; i++)
{    
     printf ("\n\nВведите элементы %d-й строки: \n", i+1);
     for(g=0; g<M; g++)
         scanf("%d",&mas[i][g]);
}
 
printf ("\n\nВведите целые элементы второй матрицы: \n");
for(i=0; i<M; i++)
{    
     printf ("\n\nВведите элементы %d-й строки: \n", i+1);
     for(g=0; g<S; g++)
         scanf("%d",&kap[i][g]);
}
              
for(b=0; b<S; b++)       //b-номер столбца второй матрицы 
{ 
    for(z=0; z<N; z++)    //z-номер строки первой матрицы
    {   bol[z][b]=0;
        for(i=0; g<M; i++)   //i-одинаковый номер строки и столбца первой и второй матрицы
        {    
            bol[z][b]=bol[z][b]+mas[z][i]*kap[i][b];
        }
    }
}    
printf("Получившаяся матрица\n");
for(i=0; i<N; i++)
{   for(g=0; g<S; g++)
        printf ( "%d", bol[i][g]);                           
    printf("\n"); 
}   
}
0
30.09.2012, 14:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.09.2012, 14:03
Помогаю со студенческими работами здесь

Необработанное исключение по адресу 0x00E730CD в ConsoleApplication18.exe: 0xC0000005: нарушение прав доступа при чтении
Задана целочисленная динамическая матрица M. Элементы этой матрицы, без остатка делящиеся на 6,...

Необработанное исключение по адресу 0x00EB1F23 в ConsoleApplication49.exe: 0xC0000005: нарушение прав доступа при чтении
В функции Max выдает такую ошибку на строчке с int Z Необработанное исключение по адресу...

Необработанное исключение по адресу 0x7798E43E (ntdll.dll) в bunkers.exe: 0xC0000005: нарушение прав доступа при чтении
прога вылетает на необработанном исключении.... на этих строчках message.addPart(&amp;content);...

Необработанное исключение по адресу 0x00105FD7 в Динамические структуры: 0xC0000005: нарушение прав доступа при чтении по адресу 0xCDCDCE09
Необработанное исключение по адресу 0x00105FD7 в Динамические структуры.exe: 0xC0000005: нарушение...

Необработанное исключение по адресу 0x00EC2729 в izo.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xCDCD
#include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; #include...

Необработанное исключение по адресу 0x001B3371 в XXX.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xFDF
Делал консольную змейку и столкнулся вот с такой проблемой. void stena(char **arr) { int y...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru