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

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

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

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

24.07.2014, 23:47. Просмотров 279. Ответов 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. Заранее спасибо
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.07.2014, 23:47     Ошибка "Ascess violation" при выводе массива
Посмотрите здесь:

Создание структуры "префиксное дерево". Ошибка "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...

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

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

Ошибка исполнения "Access violation writing location 0x.........." - C++
Здравствуйте! Написал код в MS Visual Studio 2012 64-битной такой код: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include...

Ошибка компилятора: "Access violation writing location" - C++
Здравствуйте! Проблема в том что я пишу простой скрипт и у меня всегда вылезает окошко с надписью : Unhandled exception at 0X002611F1 in...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6920 / 4113 / 941
Регистрация: 30.01.2014
Сообщений: 6,908
24.07.2014, 23:51     Ошибка "Ascess violation" при выводе массива #2
prog63, хз конечно. тут надо смотреть как ты память выделял. Но индексы в С++ начинаются с нуля, а у тебя в цикле <= используется. Т.к. мы верхнюю границу берем с включением. Если у тебя argcnt == 4, и массив был выделен из 4х элементов, то последняя итерация, при l7 == 4 выйдет за пределы массива - это будет уже 5й элемент, которого не существует, ведь счет идет с нуля.
XRoy
851 / 701 / 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
2 / 2 / 0
Регистрация: 24.11.2013
Сообщений: 77
25.07.2014, 09:41  [ТС]     Ошибка "Ascess violation" при выводе массива #4
Цитата Сообщение от XRoy Посмотреть сообщение
Попробуйте такой вариант
Попробовал, все равно вылазит:
Миниатюры
Ошибка "Ascess violation" при выводе массива  
XRoy
851 / 701 / 217
Регистрация: 15.04.2013
Сообщений: 2,047
Записей в блоге: 5
25.07.2014, 13:38     Ошибка "Ascess violation" при выводе массива #5
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" при выводе массива
Еще ссылки по теме:

Исключение "unwanted exception at 0x775c15ee Access violation" при считывание из файла - C++
Добрый вечер! Подскажите пожалуйста. У меня в файле записана следующая строка b6589fc6abdc8ac. Я её считываю следующим образом char...

Как "подкрасить" некоторые элементы массива на выводе во время выполнения программы - C++
как &quot;подкрасить&quot; некоторые элементы массива на выводе во время выполнения программы в общем, необходимо, если такое возможно, чтобы,...

Индекс элемента массива, для которого значение функции - минимально. "Мусор в выводе" - C++
Собственно поставлена следующая задача: Разработать функцию P, находящую индекс элемента массива Х, для которого зачение функции f...

"Неожиданное" закрытие окна при выводе результатов на консоль - C++
Здраствуйте, Уважаемые программисты! Недавно начал учить язык програмирования C++, произошла такакя проблема, пишу-пишу код. И когда...


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

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

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