Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
prog63
2 / 2 / 0
Регистрация: 24.11.2013
Сообщений: 77
#1

Ошибка "Ascess violation" при выводе массива - C++

24.07.2014, 23:47. Просмотров 295. Ответов 6
Метки нет (Все метки)

В проекте есть две такие строчки:
C++
1
2
for(int L6x=0;L6x<=argcnt;L6x++){for(int L6y=0;L6y<argsize;L6y++){cout<<ComArgumentList[L6x][L6y];}cout<<endl;}
for(int L7=0;L7<=argcnt;L7++)delete []ComArgumentList[L7];delete []ComArgumentList;
Первая выводит содержимое двухмерного массива символов, а вторая удаляет его.
Если хотя бы одна из этих строчек присутствует, то выскакивает ошибка "Ascess violation: write on adress XXXXX"
Проект вот:
Кликните здесь для просмотра всего текста
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
163
164
165
166
167
168
169
170
//---Код:---
//--Библиотеки и '#pragma'-коды:--
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
#include <string.h>
#include <cyrillic.h>
#pragma hdrstop
#pragma argsused
#include <vcl.h>
//------------------------------------------------------------------------------
//--Константы:
//-Команды:
//Команда выхода:
const string COMMAND_exitcom="exit";
//-Ошибки:
//Синтаксические:
const int ERROR_lbrmiss=10001;
const int ERROR_rbrmiss=10002;
const int ERROR_strml=10011;
 
int main(int argc, char* argv[])
{
print("\nЗагрузка консольного модуля...\n");
class Console
{public:
string command;
int bufsize;
int LastError;
void err(int errcode)
{
switch(errcode)
{
case ERROR_lbrmiss:print("В команде пропущена закрывающая скобка !\n");break;
case ERROR_rbrmiss:print("В команде пропущена открывающая скобка !\n");break;
}
LastError=errcode;
}
char *Version;
void Initial(void)
{
LastError=0;
Version="1.0";
bufsize=50;
argsize=50;
labellistsize=50;
arglistsize=50;
comarglistsize=50;
}
bool LexAnalys(string command)
{
bool result=true;
int strsize=command.length();
int countleft,countright,left,right;
bool argnull;
int argnmb;
lrcf:
countleft=0,countright=0,left=0,right=0;argnull=false;
//Подсчет количества скобок:
//[открывающих:]
for (int L1=0;L1<=strsize;L1++){if(command[L1]=='('){countleft++;}}
//[закрывающих:]
for (int L2=0;L2<=strsize;L2++){if(command[L2]==')'){countright++;}}
//Проверка количества скобок:
if (countleft>countright){LastError=ERROR_lbrmiss;result=false;}
if (countleft<countright){LastError=ERROR_rbrmiss;result=false;}
//Поиск наименьших скобок
fbrack:
for (int L1=0;L1<=strsize;L1++){if(command[L1]=='('){left=L1;}}
for (int L2=left;L2<=strsize;L2++){if(command[L2]==')'){right=L2;break;}}
cout<<endl<<"left="<<left+1<<endl<<"right="<<right-1<<endl;
//Подсчет количества разделителей аргументов:
int divcount=0;
for(int L3=left+1;L3<right;L3++){if(command[L3]==','){divcount++;}}
divcount++;
int argleft=left+1,argright=right-1;
bool argrghtfinded=false;
divfind1:
argrghtfinded=false;
argnull=false;
for(int L4=argleft+1;L4<argright;L4++){if(command[L4]==','){argright=L4-1;argrghtfinded=true;break;}}
if(argrghtfinded==true){
if(argleft==argright+1){argnull=true;}
if(argright==argleft&&command[argleft+1]==' '){argnull=true;}
if(argnull){divcount--;}
argleft=argright+2;
argright=right-1;}
if(argrghtfinded==true)goto divfind1;
cout<<"argcount="<<divcount<<endl<<endl;
 
getch();
 
//Создание массива аргументов
char **ComArgumentList = new char* [divcount];
for(int count = 0; count<divcount;count++)
ComArgumentList[count]=new char[argsize];
//Очистка массива
for (int L6x=0;L6x<divcount;L6x++){for (int L6y=0;L6y<argsize;L6y++){ComArgumentList[L6x][L6y]=' ';}}
 
getch();
 
argleft=left+1,argright=right-1;
argrghtfinded=false;
int argcnt=0;
divfind2:
argrghtfinded=false;
argnull=false;
if(argleft<argright-1){cout<<"argleft ("<<argleft<<") < argright-1 ("<<argright-1<<")"<<endl;}else{cout<<"argleft ("<<argleft<<") >= argright-1 ("<<argright-1<<")"<<endl;}
for(int L4=argleft+1;L4<argright;L4++){if(command[L4]==','){argright=L4-1;argrghtfinded=true;cout<<"\",\" has finded in ["<<L4<<"]"<<endl;break;}}
cout<<"argleft="<<argleft<<endl;
cout<<"argright="<<argright<<endl;
cout<<"argument:";
 
getch();
 
for(int L6=argleft;L6<=argright;L6++)cout<<command[L6];
for(int L6=argleft-1;L6<=argright;L6++)ComArgumentList[argcnt][L6-argleft]=command[L6];
argcnt++;
cout<<endl<<endl;
if(argrghtfinded==true){
if(argleft==argright+1){argnull=true;cout<<"argument is empty"<<endl;}
if(argright==argleft&&command[argleft+1]==' '){argnull=true;cout<<"argument is empty"<<endl;}
if(argnull){divcount--;}
argleft=argright+2;
argright=right-1;}
if(argrghtfinded==true)goto divfind2;
 
getch();
 
for(int L6x=0;L6x<=argcnt;L6x++){for(int L6y=0;L6y<argsize;L6y++){cout<<ComArgumentList[L6x][L6y];}cout<<endl;}
for(int L7=0;L7<=argcnt;L7++)delete []ComArgumentList[L7];delete []ComArgumentList;
 
return result;
}
private:int argsize,labellistsize,arglistsize,comarglistsize;};
Console console;
print("Консольный модуль загружен\n");
print("Инициализация...\n");
console.Initial();
print("Консоль запущена\n");
print("Версия: ");print(console.Version);print("\n\n");
 
 
 
//Ввод команды:
while (!(console.command==COMMAND_exitcom)){
console.command="";
cout<<">";
//cout<<"func(arg1,arg2,arg3)";
getline(cin,console.command);
 
//console.command="func(arg1,arg2,arg3)";
 
if(!(console.command==COMMAND_exitcom)){
if (console.command.length()>console.bufsize){print("Ошибка! Строка длиннее ");cout<<console.bufsize;print(" символа(ов) !\n");console.err(ERROR_strml);}
//Удаление двойных пробелов:
for (int L1 = 0;L1<console.command.length();L1++) if (console.command[L1] == ' ' && console.command[L1+1] == ' ') {console.command.erase(L1,1); L1--;}
 
//Добавление управляющих скобок:
console.command="("+console.command+")";
//Вызов функции лексического анализирования:
if(!(console.LexAnalys(console.command))){console.err(console.LastError);};}
}
print("Выход...\n");
getch();
        return 0;
}
//------------------------------------------------------------------------------


P.S. Заранее спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.07.2014, 23:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка "Ascess violation" при выводе массива (C++):

Где ошибка невозможно преобразовать указатель "this" из "const pers" в "pers &" при выводе объектов через cout - C++
Добрый день! Переписал код из книг Лафоре, создание мультимножества из собственных объектов- справочник телефонный, с именем и фамилией. ...

Ошибка "Access violation writing location" при работе с массивом. - C++
Задание номер 2 #include &lt;stdio.h&gt; #include &lt;cstdlib&gt; #include &lt;math.h&gt; #include &lt;cmath&gt; #include &lt;iostream&gt; #include...

Создание структуры "префиксное дерево". Ошибка "Access violation writing location". - C++
Есть структура данных - бор или префиксное дерево. class trie { char value; // символ узла trie** pointers; // ссылки на...

Ошибка "Access violation..." при попытке отсортировать структуру из файла быстрым методом - C++
Собстно ошибко &quot;Project '...' raised exception class EAccessViolation with message 'Access violation at address 00401464 Write of address...

Класс "Матрица", ошибка при выводе результата - C++
Всем доброго времени суток! Нужно под main создать header и реализацию! Я застрял на operator- (а точнее при выводе на экран результата)!...

Ошибка Необработанное исключение в "0x001d18f8" в "lr7v2.exe": 0xC0000005: Нарушение прав доступа при чтении "0xcdcdcde9" - C++
class Hdd { public: char Hdd_name; int total_space; int free_space; int speed; Hdd *next; Hdd *previous; };

6
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
24.07.2014, 23:51 #2
prog63, хз конечно. тут надо смотреть как ты память выделял. Но индексы в С++ начинаются с нуля, а у тебя в цикле <= используется. Т.к. мы верхнюю границу берем с включением. Если у тебя argcnt == 4, и массив был выделен из 4х элементов, то последняя итерация, при l7 == 4 выйдет за пределы массива - это будет уже 5й элемент, которого не существует, ведь счет идет с нуля.
0
XRoy
853 / 703 / 217
Регистрация: 15.04.2013
Сообщений: 2,047
Записей в блоге: 5
24.07.2014, 23:51 #3
prog63,
Попробуйте такой вариант
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
for( int L6x = 0; L6x < argcnt; L6x++ )
    {
        for( int L6y = 0; L6y < argsize; L6y++ )
        {
            cout << ComArgumentList[L6x][L6y];
        }
 
        cout << endl;
    }
 
    for( int L7 = 0; L7 < argcnt; L7++ )
        delete [] ComArgumentList[L7];
 
    delete [] ComArgumentList;
0
prog63
2 / 2 / 0
Регистрация: 24.11.2013
Сообщений: 77
25.07.2014, 09:41  [ТС] #4
Цитата Сообщение от XRoy Посмотреть сообщение
Попробуйте такой вариант
Попробовал, все равно вылазит:
0
Миниатюры
Ошибка "Ascess violation" при выводе массива  
XRoy
853 / 703 / 217
Регистрация: 15.04.2013
Сообщений: 2,047
Записей в блоге: 5
25.07.2014, 13:38 #5
prog63,
А вы память выделяете под массив?
0
prog63
2 / 2 / 0
Регистрация: 24.11.2013
Сообщений: 77
26.07.2014, 20:17  [ТС] #6
Всем спасибо, уже разобрался - отключил в Tools->Debugger Options галочку Integrated debugging, а также выделил код блоком try-catch:
C++
1
2
3
4
try{
for(int L7=0;L7<=argcnt;L7++)delete []ComArgumentList[L7];
delete []ComArgumentList;
}catch(Exception &Err){}
0
Voivoid
675 / 278 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
26.07.2014, 20:24 #7
1
26.07.2014, 20:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.07.2014, 20:24
Привет! Вот еще темы с ответами:

Access violation при выводе массива через функцию - C++
Приветствую вас, прошу помощи в объяснении что же не так.(В частности проблема с указателями) На данный момент программа должна...

Ошибка при сборке многофайлового проекта: "невозможно преобразовать "int" в "const golf" - C++
Сделал многофайловую программу программу, вот она: //golf.h #include &lt;iostream&gt; #ifndef golg_h_ #define golf_h_ const int Len =...

Ошибка "Unhandled exception, Access violation writing location" - C++
Пишу вот так: root-&gt;child1-&gt;parent=root; root-&gt;child2-&gt;parent=root;выходит ошибка Unhandled exception at 0x00073dec in Regul.exe:...

Непонятная ошибка "Access violation writing location 0xcdcdcdd5" - C++
#include &lt;iostream&gt; #include &lt;cstdlib&gt; struct Node{ int data; Node *next, *prev; }; typedef Node...


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

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

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