Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
canek244
0 / 0 / 0
Регистрация: 23.09.2012
Сообщений: 3
#1

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

26.09.2012, 05:45. Просмотров 1220. Ответов 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++ после паскаля, подскажите где тут ошибка, и как можно оптимизировать код.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.09.2012, 05:45     Необработанное исключение в "0x77913ab3" в "x": 0xC0000005: Нарушение прав доступа при чтении "0xdddddddd"
Посмотрите здесь:
C++ Необработанное исключение в "0x0138169d" в "kursovaya.exe": 0xC0000005: Нарушение прав доступа при чтении "0x6
C++ Необработанное исключение в "0x776315de" в "c++1.exe": 0xC0000005: Нарушение прав доступа при записи "0x40e000
C++ Необработанное исключение в "0x104b2288" в "Matrix.exe": 0xC0000005: Нарушение прав доступа при записи "0xcdcd
Возникает ошибка "0xC0000005: Нарушение прав доступа при чтении "0xfeeefee2"." C++
C++ Ошибка: "Необработанное исключение: 0xC0000005: Нарушение прав доступа при записи"
C++ Ошибка 0xC0000005: Нарушение прав доступа при чтении "0xcccccccc"
"Нарушение прав доступа при чтении "0x00000000"" C++
C++ 0xC0000005: Нарушение прав доступа при записи "0xcccccccc". Инициализация строк
Найти ошибку "Нарушение прав доступа при чтении" C++
C++ Ошибка "нарушение прав доступа при чтении по адресу."
"Нарушение прав доступа при чтении по адресу 0x00000000" C++
C++ Нарушение прав доступа при чтении "0xcdcdcdcd"

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6552 / 5018 / 463
Регистрация: 14.02.2011
Сообщений: 16,741
26.09.2012, 06:23     Необработанное исключение в "0x77913ab3" в "x": 0xC0000005: Нарушение прав доступа при чтении "0xdddddddd" #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:
вывод
надо создавать массив после того как введешь размер
canek244
0 / 0 / 0
Регистрация: 23.09.2012
Сообщений: 3
30.09.2012, 14:03  [ТС]     Необработанное исключение в "0x77913ab3" в "x": 0xC0000005: Нарушение прав доступа при чтении "0xdddddddd" #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"); 
}   
}
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru