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

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

Восстановить пароль Регистрация
 
Alpi
104 / 0 / 1
Регистрация: 16.11.2012
Сообщений: 41
30.11.2012, 18:26     не заполняется вектор #1
Добрый день!

вот этот код вылетает в отладчик на строке 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;}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.11.2012, 18:26     не заполняется вектор
Посмотрите здесь:

C++ Создать иерархию классов вектор(longint) и безопасный вектор с проверкой выхода за пределы
Создать иерархию классов вектор и безопасный вектор с проверкой выхода за пределы C++
C++ Есть квадратная матрица А порядка n и вектор b с n элементами. Получить вектор Аb.
Не заполняется массив C++
C++ задан вектор С, который состоит из 12 действительных чисел. Сформировать вектор D, нечетные элементы которого есть целая часть нечетных
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 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)
Alpi
104 / 0 / 1
Регистрация: 16.11.2012
Сообщений: 41
30.11.2012, 19:11  [ТС]     не заполняется вектор #3
на && поправил, все равно не выполняется.
Про массивы - я знаю, понятно. Здесь программа вылетает при первой проверке условия в строке 15 при i = 1 т.е. до затыка с массивом дела не доходит...
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 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;
I.M.
 Аватар для 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;
            }
+ этот цикл бесконечный
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
30.11.2012, 19:26     не заполняется вектор #6
А что Вы хотите сделать то в программе? Задание какое?
Alpi
104 / 0 / 1
Регистрация: 16.11.2012
Сообщений: 41
30.11.2012, 19:39  [ТС]     не заполняется вектор #7
Croessmah,
это расчет z-функции для поиска подстроки в строке.
Я посмотрю ваши ремарки, спасибо, и вернусь с результатом.


I.M., Почему вы так думаете? z[i] меняется, соотв меняется условие, соотв. Когда оно не выполнится, произойдет выход из цикла. Вроде так...
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
30.11.2012, 20:11     не заполняется вектор #8
Цитата Сообщение от Croessmah Посмотреть сообщение
Что значит and?
В C++ это ключевое слово и оно означает то же самое, что и &&. Так же как и or означает ||.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
01.12.2012, 06:28     не заполняется вектор #9
Цитата Сообщение от Toshkarik Посмотреть сообщение
В C++ это ключевое слово и оно означает то же самое, что и &&. Так же как и or означает ||.
Конечно, не аргумент, но студия не поддерживает. Я думал, это фишка в gcc врезана, так же, как и VLA
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 работает.
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
01.12.2012, 11:29     не заполняется вектор #11
Alpi, желательно после изменений снова постить измененный код на форум
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;}
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 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.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4927 / 2670 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
01.12.2012, 14:29     не заполняется вектор #14
Цитата Сообщение от Croessmah Посмотреть сообщение
Конечно, не аргумент, но студия не поддерживает. Я думал, это фишка в gcc врезана, так же, как и VLA
Студия по-умолчанию не включает в себя альтернативные представления. Но вы можете написать
C++
1
#include <ciso646>
http://www.cplusplus.com/reference/ciso646/

Не по теме:

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

Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 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.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4927 / 2670 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
01.12.2012, 14:34     не заполняется вектор #16
Цитата Сообщение от Toshkarik Посмотреть сообщение
MrGluck, из приведенной Вами же ссылки:
Ну кто же знал, что студия так реализует. В стандарте С++ тоже ни слова про void main)
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
01.12.2012, 14:41     не заполняется вектор #17
MrGluck, естественно ни слова. Там ясно написано, что функция main может иметь лишь два прототипа: int main(); и int main( int, char * [] );
Так и же и с альтернативными операторами. Ведь сказано же, что это ключевые слова в C++, что уже не равно макросам, какими они были в C.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.12.2012, 15:16     не заполняется вектор
Еще ссылки по теме:

не правильно заполняется массив C++
Считать вектор из файла, записать вектор в файл C++
C++ Не заполняется название книги

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

Или воспользуйтесь поиском по форуму:
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;}
Yandex
Объявления
01.12.2012, 15:16     не заполняется вектор
Ответ Создать тему
Опции темы

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