Форум программистов, компьютерный форум 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. Просмотров 1242. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.09.2012, 05:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Необработанное исключение в "0x77913ab3" в "x": 0xC0000005: Нарушение прав доступа при чтении "0xdddddddd" (C++):

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

Найти в строке последовательность символов ("abcd") и заменить ее другой ("xyz") - C++
Найти в строке последовательность символов (&quot;abcd&quot;) и заменить ее другой (&quot;xyz&quot;).

О "нестабильности" или "переполнении" цикла foreach - C++
Здравствуйте, коллеги. Недавно коллега-программист сообщил мне страшную вещь: оказывается, что цикл foreach может переполниться при...

Ошибка: invalid conversion from "int" to "SDL_RendererFlip" - C++
Скриншот приложен, Вот страница, откуда я брал этот код Подскажите что делать

CString buff = "aaa" + "bbb" - C++
Хочется одним оператором конкатенировать несколько подстрок CString buff = &quot;aaa&quot; + &quot;bbb&quot; компилятор выдает error C2110: cannot add two...

Qt Creator. Все "за" и "против" - C++
Доброго времени суток, форумчане! Сегодня задался вопросом использования такой IDE, как Qt Creator. Суть темы заключается в том, что я...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ValeryS
Модератор
6631 / 5039 / 466
Регистрация: 14.02.2011
Сообщений: 16,845
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
canek244
0 / 0 / 0
Регистрация: 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.09.2012, 14:03
Привет! Вот еще темы с ответами:

Ошибка "неопределенная ссылка" при работе с std::thread - C++
При попытке сделать что-либо с std::thread, выдает ошибку компиляции, &quot;неопределенная ссылка &quot; . К примеру: #include...

Ошибка "Signal received" при использовании taglib - C++
Когда пытаюсь вывести id3v2-&gt;artist(или любое другое ), вне функции где инициализировал id3v2, вылетает signal received;(библиотека taglib)...

Реализовать выход из многопоточного приложения при нажатии сочетания клавиш "Ctrl+С" - C++
Добрый день! Подскажите пжл, как реализоввать выход с многопоточного(консольного) приложения по обработке нажатия клавишь ctrl+c(при этом...

прога при компиляции ругаеться на "unit1.h" - C++
вся проблема в том,что у меня єтого файла нет,так как прога с нета качаная.можно ли его как нить востановить?? #include &lt;vcl.h&gt; ...


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

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

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