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

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

Восстановить пароль Регистрация
 
prog63
 Аватар для prog63
2 / 2 / 0
Регистрация: 24.11.2013
Сообщений: 77
24.07.2014, 23:47     Ошибка "Ascess violation" при выводе массива #1
В проекте есть две такие строчки:
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. Заранее спасибо
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6461 / 3835 / 886
Регистрация: 30.01.2014
Сообщений: 6,630
24.07.2014, 23:51     Ошибка "Ascess violation" при выводе массива #2
prog63, хз конечно. тут надо смотреть как ты память выделял. Но индексы в С++ начинаются с нуля, а у тебя в цикле <= используется. Т.к. мы верхнюю границу берем с включением. Если у тебя argcnt == 4, и массив был выделен из 4х элементов, то последняя итерация, при l7 == 4 выйдет за пределы массива - это будет уже 5й элемент, которого не существует, ведь счет идет с нуля.
XRoy
848 / 698 / 217
Регистрация: 15.04.2013
Сообщений: 2,047
Записей в блоге: 5
24.07.2014, 23:51     Ошибка "Ascess violation" при выводе массива #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;
prog63
 Аватар для prog63
2 / 2 / 0
Регистрация: 24.11.2013
Сообщений: 77
25.07.2014, 09:41  [ТС]     Ошибка "Ascess violation" при выводе массива #4
Цитата Сообщение от XRoy Посмотреть сообщение
Попробуйте такой вариант
Попробовал, все равно вылазит:
Миниатюры
Ошибка "Ascess violation" при выводе массива  
XRoy
848 / 698 / 217
Регистрация: 15.04.2013
Сообщений: 2,047
Записей в блоге: 5
25.07.2014, 13:38     Ошибка "Ascess violation" при выводе массива #5
prog63,
А вы память выделяете под массив?
prog63
 Аватар для prog63
2 / 2 / 0
Регистрация: 24.11.2013
Сообщений: 77
26.07.2014, 20:17  [ТС]     Ошибка "Ascess violation" при выводе массива #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){}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.07.2014, 20:24     Ошибка "Ascess violation" при выводе массива
Еще ссылки по теме:

C++ Ошибка компилятора: "Access violation writing location"
C++ Класс "Матрица", ошибка при выводе результата
При компиляции ошибка: C2228: left of ".real",".imag" must have struct/class/union C++

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

Или воспользуйтесь поиском по форуму:
Voivoid
 Аватар для Voivoid
580 / 256 / 12
Регистрация: 31.03.2013
Сообщений: 1,284
26.07.2014, 20:24     Ошибка "Ascess violation" при выводе массива #7
Yandex
Объявления
26.07.2014, 20:24     Ошибка "Ascess violation" при выводе массива
Ответ Создать тему
Опции темы

Текущее время: 20:54. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru