Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
prog63
2 / 2 / 1
Регистрация: 24.11.2013
Сообщений: 77
#1

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

24.07.2014, 23:47. Просмотров 313. Ответов 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
Ответы с готовыми решениями:

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

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

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

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

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

6
DrOffset
8000 / 4640 / 1128
Регистрация: 30.01.2014
Сообщений: 7,543
24.07.2014, 23:51 #2
prog63, хз конечно. тут надо смотреть как ты память выделял. Но индексы в С++ начинаются с нуля, а у тебя в цикле <= используется. Т.к. мы верхнюю границу берем с включением. Если у тебя argcnt == 4, и массив был выделен из 4х элементов, то последняя итерация, при l7 == 4 выйдет за пределы массива - это будет уже 5й элемент, которого не существует, ведь счет идет с нуля.
0
XRoy
861 / 711 / 305
Регистрация: 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 / 1
Регистрация: 24.11.2013
Сообщений: 77
25.07.2014, 09:41  [ТС] #4
Цитата Сообщение от XRoy Посмотреть сообщение
Попробуйте такой вариант
Попробовал, все равно вылазит:
0
Миниатюры
Ошибка "Ascess violation" при выводе массива  
XRoy
861 / 711 / 305
Регистрация: 15.04.2013
Сообщений: 2,047
Записей в блоге: 5
25.07.2014, 13:38 #5
prog63,
А вы память выделяете под массив?
0
prog63
2 / 2 / 1
Регистрация: 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
708 / 280 / 16
Регистрация: 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

Ошибка при выводе из "хранилища объектов"
Само хранилище это такая динамическая структура - стек в дереве. Выглядит так: #include...

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

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


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

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

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