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

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

Войти
Регистрация
Восстановить пароль
 
 
Alpi
104 / 0 / 1
Регистрация: 16.11.2012
Сообщений: 41
#1

не заполняется вектор - C++

30.11.2012, 18:26. Просмотров 520. Ответов 17
Метки нет (Все метки)

Добрый день!

вот этот код вылетает в отладчик на строке 15.
z[i] заполнено всякой ерундой, в том числе 10-значными числами непонятными
Я так понимаю, не сравниваются символы массива s, но отловить почему - не могу.

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
int main ()
{int i = 1, l = 0, r = 0;
    char s[17] = "abcdabcabcdfghab";
        int z[17];
        while (i < 17)
        {
            if (i < r)
            {
                if ((i - r) < (i - l))
                {z[i] = i - r + 1;}
                else
                    z[i] = l - r;
            }
            while (i < 17 and s[z[i]] == s[z[i-l]])
            {
                z[i]+=1;
            }
            if (i + z[i] - 1 > r)
            {
                l = i;
                r = i + z[i] - 1;
            }
            ++i;
            cout << z[i] << endl;
        }
        return 0;}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.11.2012, 18:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос не заполняется вектор (C++):

Класс "вектор" с конструкторами, позволяющими создать нулевой вектор и вектор с произвольным числом элементов - C++
Привет! Задача следующая. Нужно реализовать класс &quot;вектор&quot; с конструкторами, которые позволяют создать нулевой вектор и вектор с...

Создать иерархию классов вектор и безопасный вектор с проверкой выхода за пределы - C++
Создать иерархию классов вектор и безопасный вектор с проверкой выхода за пределы. Безопасный вектор определяет переменные нижний и верхний...

матрица на вектор, вроде правильно, а вектор на матрицу? посмотрите пожалуйста? - C++
#include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;cstdlib&gt; #include &lt;ctime&gt; using namespace std; int main() { ...

Почему матрица на вектор умножается быстрее чем вектор на матрицу? - C++
Почему матрица на вектор умножается быстрее чем вектор на матрицу?

Есть квадратная матрица А порядка n и вектор b с n элементами. Получить вектор Аb. - C++
Привет. Не могу разобратся, вот задание: Есть квадратная матрица А порядка n и вектор b с n элементами. Получить вектор Аb.

Создать иерархию классов вектор(longint) и безопасный вектор с проверкой выхода за пределы - C++
Помогите не знаю как сделать! Создать иерархию классов вектор(longint) и безопасный вектор с проверкой выхода за пределы. Безопасный...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Croessmah
Эксперт CЭксперт С++
13237 / 7509 / 847
Регистрация: 27.09.2012
Сообщений: 18,448
Записей в блоге: 3
Завершенные тесты: 1
30.11.2012, 18:37 #2
C++
1
while (i < 17 and s[z[i]] == s[z[i-l]])
Что значит and? Логическое И? Тогда &&
P.S. Массивы имеют индексы [0;n)
0
Alpi
104 / 0 / 1
Регистрация: 16.11.2012
Сообщений: 41
30.11.2012, 19:11  [ТС] #3
на && поправил, все равно не выполняется.
Про массивы - я знаю, понятно. Здесь программа вылетает при первой проверке условия в строке 15 при i = 1 т.е. до затыка с массивом дела не доходит...
0
Croessmah
Эксперт CЭксперт С++
13237 / 7509 / 847
Регистрация: 27.09.2012
Сообщений: 18,448
Записей в блоге: 3
Завершенные тесты: 1
30.11.2012, 19:17 #4
Во-первых, z[i] в данной строчке
C++
1
s[z[i]] == s[z[i-l]]
еще не инициализирован, во-вторых, чему будет по Вашему равен z[i] в данном случае?
C++
1
z[i]+=1;
в-третьих, в цикле Вы проходите по элементам от 1 до 16, а не от 0 до 16. А в строчках
C++
1
2
++i;
            cout << z[i] << endl;
на последней итерации будет
C++
1
cout<<z[17]<<endl;
0
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
30.11.2012, 19:25 #5
C++
1
2
3
4
            while (i < 17 and s[z[i]] == s[z[i-l]])
            {
                z[i]+=1;
            }
+ этот цикл бесконечный
1
Croessmah
Эксперт CЭксперт С++
13237 / 7509 / 847
Регистрация: 27.09.2012
Сообщений: 18,448
Записей в блоге: 3
Завершенные тесты: 1
30.11.2012, 19:26 #6
А что Вы хотите сделать то в программе? Задание какое?
0
Alpi
104 / 0 / 1
Регистрация: 16.11.2012
Сообщений: 41
30.11.2012, 19:39  [ТС] #7
Croessmah,
это расчет z-функции для поиска подстроки в строке.
Я посмотрю ваши ремарки, спасибо, и вернусь с результатом.


I.M., Почему вы так думаете? z[i] меняется, соотв меняется условие, соотв. Когда оно не выполнится, произойдет выход из цикла. Вроде так...
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
30.11.2012, 20:11 #8
Цитата Сообщение от Croessmah Посмотреть сообщение
Что значит and?
В C++ это ключевое слово и оно означает то же самое, что и &&. Так же как и or означает ||.
0
Croessmah
Эксперт CЭксперт С++
13237 / 7509 / 847
Регистрация: 27.09.2012
Сообщений: 18,448
Записей в блоге: 3
Завершенные тесты: 1
01.12.2012, 06:28 #9
Цитата Сообщение от Toshkarik Посмотреть сообщение
В C++ это ключевое слово и оно означает то же самое, что и &&. Так же как и or означает ||.
Конечно, не аргумент, но студия не поддерживает. Я думал, это фишка в gcc врезана, так же, как и VLA
0
Alpi
104 / 0 / 1
Регистрация: 16.11.2012
Сообщений: 41
01.12.2012, 09:54  [ТС] #10
Ребята, я проинициализировал массив нулями.
Все равно вылетает на первом шаге на 15 строчке при выполнении, хотя компиляцию проходит.
Пишет - Exc_Bad_Access....
При этом z[1] = 542752
i = 1, r = 0, l = 0
Честно говоря, я уже скоро как неделю пытаюсь это сделать - и с векторами, и тп. Результат один и тот же.

Ошибка в этой строчке, но я не понимаю, почему не работает, ведь отдельно если запросить элемент строки в такой форме - он выводится.

Помогите, пожалуйста, как это правильно написать, может, здесь какая-то фундаментальная ошибка?

Касательно and - в XCode работает.
0
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
01.12.2012, 11:29 #11
Alpi, желательно после изменений снова постить измененный код на форум
0
Alpi
104 / 0 / 1
Регистрация: 16.11.2012
Сообщений: 41
01.12.2012, 11:37  [ТС] #12
Конечно, вот он,
вылетает безнадежно на первом шаге на 19 строчке при выполнении, хотя компиляцию проходит.
Пишет - Exc_Bad_Access....
При этом z[1] = 542752
i = 1, r = 0, l = 0

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
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
int main ()
{int i = 1, l = 0, r = 0;
    char s[17] = "abcdabcabcdfghab";
    int z[17] = {0};
        while (i < 17)
        {
            if (i < r)
            {
                if ((i - r) < (i - l))
                {z[i] = i - r + 1;}
                else
                    z[i] = l - r;
            }
            while (i < 17 && s[z[i]] == s[z[i-l]])
            {
                z[i]+=1;
            }
            if (i + z[i] - 1 > r)
            {
                l = i;
                r = i + z[i] - 1;
            }
            ++i;
            cout << z[i] << endl;
        }
        return 0;}
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
01.12.2012, 14:04 #13
Цитата Сообщение от Croessmah Посмотреть сообщение
Конечно, не аргумент, но студия не поддерживает. Я думал, это фишка в gcc врезана, так же, как и VLA
Студия много чего не поддерживает. Скорей всего, в ней нужно подключать заголовок <ciso646>. Но все равно это не правильно, так как эти слова именно ключевые в C++ а не макросы, и поэтому не должны требовать подключания каких либо заголовков.

Добавлено через 14 минут
Цитата Сообщение от Alpi Посмотреть сообщение
while (i < 17 && s[z[i]] == s[z[i-l]])
* * * * * * {
* * * * * * * * z[i]+=1;
* * * * * * }
У Вас выход за пределы массива. Условие i < 17 выполняется всегда, так как i не изменяется в теле цикла. Так же условие s[z[i]] == s[z[i-l]] выполняется всегда, так как l == 0.
1
MrGluck
Модератор
Эксперт CЭксперт С++
7239 / 4407 / 642
Регистрация: 29.11.2010
Сообщений: 11,929
01.12.2012, 14:29 #14
Цитата Сообщение от Croessmah Посмотреть сообщение
Конечно, не аргумент, но студия не поддерживает. Я думал, это фишка в gcc врезана, так же, как и VLA
Студия по-умолчанию не включает в себя альтернативные представления. Но вы можете написать
C++
1
#include <ciso646>
http://www.cplusplus.com/reference/ciso646/

Не по теме:

почему-то пост Tosharik не заметил, опоздал(

0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
01.12.2012, 14:31 #15
MrGluck, из приведенной Вами же ссылки:
In C++, reserved words exist with the same names as these macros and are treated as aliases of their respective operator. Therefore the inclusion of this header has no effect in C++, and is not necessary in order to use the alternative names.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.12.2012, 14:31
Привет! Вот еще темы с ответами:

Вектор с неизвестным количеством чисел преобразовать в другой вектор, где числа будут стоять по возрастанию - C++
Вектор с неизвестным количеством чисел нужно превратить в другой вектор, где числа будут стоять по возрастанию. Мне код не столько нужен,...

Считать вектор из файла, записать вектор в файл - C++
Доброго времени суток. Программа должна считывать числа из заданного файла, потом записывать в другой файл вектор, в котором каждый элемент...

задан вектор С, который состоит из 12 действительных чисел. Сформировать вектор D, нечетные элементы которого есть целая часть нечетных - C++
задан вектор С, который состоит из 12 действительных чисел. Сформировать вектор D, нечетные элементы которого есть целая часть нечетных...

Не заполняется массив - C++
#include &quot;stdafx.h&quot; #include &quot;iostream&quot; using namespace std; int m, n, a, b, c; int mas; int masd; int _tmain(int argc,...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
01.12.2012, 14:31
Ответ Создать тему
Опции темы

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