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

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

30.11.2012, 18:26. Просмотров 562. Ответов 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;}

http://www.cyberforum.ru/cpp-beginners/thread1112396.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.11.2012, 18:26
Я подобрал для вас темы с готовыми решениями и ответами на вопрос не заполняется вектор (C++):

Создать иерархию классов вектор и безопасный вектор с проверкой выхода за пределы
Создать иерархию классов вектор и безопасный вектор с проверкой выхода за...

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

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

матрица на вектор, вроде правильно, а вектор на матрицу? посмотрите пожалуйста?
#include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;cstdlib&gt; #include &lt;ctime&gt; ...

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

17
Croessmah
++Ͻ
14147 / 8072 / 1512
Регистрация: 27.09.2012
Сообщений: 19,907
Записей в блоге: 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
++Ͻ
14147 / 8072 / 1512
Регистрация: 27.09.2012
Сообщений: 19,907
Записей в блоге: 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.
566 / 549 / 47
Регистрация: 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
++Ͻ
14147 / 8072 / 1512
Регистрация: 27.09.2012
Сообщений: 19,907
Записей в блоге: 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
1148 / 865 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
30.11.2012, 20:11 #8
Цитата Сообщение от Croessmah Посмотреть сообщение
Что значит and?
В C++ это ключевое слово и оно означает то же самое, что и &&. Так же как и or означает ||.
0
Croessmah
++Ͻ
14147 / 8072 / 1512
Регистрация: 27.09.2012
Сообщений: 19,907
Записей в блоге: 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.
566 / 549 / 47
Регистрация: 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
1148 / 865 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 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Эксперт С++
7981 / 4862 / 1423
Регистрация: 29.11.2010
Сообщений: 13,236
01.12.2012, 14:29 #14
Цитата Сообщение от Croessmah Посмотреть сообщение
Конечно, не аргумент, но студия не поддерживает. Я думал, это фишка в gcc врезана, так же, как и VLA
Студия по-умолчанию не включает в себя альтернативные представления. Но вы можете написать
C++
1
#include <ciso646>
http://www.cplusplus.com/reference/ciso646/

Не по теме:

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

0
Toshkarik
1148 / 865 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 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
MrGluck
Модератор
Эксперт CЭксперт С++
7981 / 4862 / 1423
Регистрация: 29.11.2010
Сообщений: 13,236
01.12.2012, 14:34 #16
Цитата Сообщение от Toshkarik Посмотреть сообщение
MrGluck, из приведенной Вами же ссылки:
Ну кто же знал, что студия так реализует. В стандарте С++ тоже ни слова про void main)
0
Toshkarik
1148 / 865 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
01.12.2012, 14:41 #17
MrGluck, естественно ни слова. Там ясно написано, что функция main может иметь лишь два прототипа: int main(); и int main( int, char * [] );
Так и же и с альтернативными операторами. Ведь сказано же, что это ключевые слова в C++, что уже не равно макросам, какими они были в C.
1
Alpi
104 / 0 / 1
Регистрация: 16.11.2012
Сообщений: 41
01.12.2012, 15:16  [ТС] #18
Toshkarik, спасибо за помощь, действительно. Я почитал еще раз объяснение и т.п.
Тем не менее,
я немного поправил, но функция все равно не считается, т.е. в массиве z содержатся только нули. Но она обязана прирастать, я на желтом листочке в клеточку проверил...

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
#include <iostream>
#include <string>
#include <cstdlib>
 
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
using namespace std;
int main ()
{
    char s[17] = "abcdabcabcdfghab";
    int z[17] = {0};
    for  (int i=1, l=0, r=0; i < 17; ++i)
        {
            if (i < r || i == r)
            {
                z[i] = min (r-i+1, z[i-l]);
            }
            while (i + z[i] < 17 && s[z[i]] == s[i+z[i]])
            {
                z[i]+=1;
            }
            if (i + z[i] - 1 > r)
            {
                l = i;
                r = i + z[i] - 1;
            }
            ++i;
 
        }
    cout << z[6];
        return 0;}
Добавлено через 24 минуты
Заработало вот так:
Вроде вывод правильный.

Всем спасибо большое, это был ценный опыт.
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
int main ()
{
    char s[17] = "abcdabcabcdfghab";
    int z[17] = {0};
    for  (int i=0, l=0, r=0; i < 17; ++i)
        {
            if (i < r || i == r)
            {
                z[i] = min (r-i+1, z[i-l]);
            }
            while (i + z[i] < 17 && s[z[i]] == s[i+z[i]])
            {
                ++z[i];
            }
            if (i + z[i] - 1 > r)
            {
                l = i;
                r = i + z[i] - 1;
            }
            cout << i << " "<< z[i] << ' ' << endl;
           
 
        }
    
        return 0;}
0
01.12.2012, 15:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.12.2012, 15:16
Привет! Вот еще темы с решениями:

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

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

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

Не заполняется массив
Здравствуйте! Подскажите, пожалуйста, почему при создании нового массива,...


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

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

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