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

Не хватает опыта для того, чтобы понять ошибку в задаче циклического побитового сдвига - C++

Восстановить пароль Регистрация
 
Кателевский ВН
 Аватар для Кателевский ВН
0 / 0 / 1
Регистрация: 23.04.2014
Сообщений: 46
23.04.2014, 21:06     Не хватает опыта для того, чтобы понять ошибку в задаче циклического побитового сдвига #1
Доброго времени суток! Помогите пожалуйста разобраться, почему вместо заданных мною, скажем 4 символов, после циклического сдвига он выдаёт в разы больше. Ошибка начинает появляться на третьем цикле for. Вот функция:
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
void lrotate(unsigned char ch[],int n)
    { unsigned int in[80];
        for(int j=0;ch[j] > 0;j++)
        {
            in[j]=ch[j];
 
        }
 
        for(int k=0;in[k];k++)
            {
                 cout << in[k] << endl;
                for(int i=0;i < n; i++)
                {
                    in[k] = in[k] << 1;
                    if(in[k] & 256)
                        in[k] = in[k] | 1;
                }
 
            }
        int l=0;
        while(in[l])
        {
            cout << in[l] <<" ";
            l++;
        }
    }
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.04.2014, 21:06     Не хватает опыта для того, чтобы понять ошибку в задаче циклического побитового сдвига
Посмотрите здесь:

программа циклического сдвига числа C++
Программа циклического сдвига элементов массива C++
Операция побитового сдвига C++
Написать программы шифрования и расшифровки файла методом циклического сдвига C++
C++ Функция циклического сдвига побитово вправо
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
newbie666
Заблокирован
23.04.2014, 21:30     Не хватает опыта для того, чтобы понять ошибку в задаче циклического побитового сдвига #2
Это Г. код. Лучше скажи, для чего тебе нужен этот сдвиг и в каком узле своего софта ты его используешь?
Кателевский ВН
 Аватар для Кателевский ВН
0 / 0 / 1
Регистрация: 23.04.2014
Сообщений: 46
24.04.2014, 09:48  [ТС]     Не хватает опыта для того, чтобы понять ошибку в задаче циклического побитового сдвига #3
На самом деле, Я решил задачу немного другим способом...Но мне не понятно, отчего(в этом варианте решения) вместо положенного количества чисел получается в массиве больше. Если конкретно, на вопрос ответить: то планировалась функция, для того, чтобы разобраться в элементарном шифровании по сдвигу и для этого и использовалась. Я не понимаю, откуда эти дополнительные элементы в массиве появляются? Вот во воложении Я поместил результат пробы этой кодировки:
Миниатюры
Не хватает опыта для того, чтобы понять ошибку в задаче циклического побитового сдвига  
Кателевский ВН
 Аватар для Кателевский ВН
0 / 0 / 1
Регистрация: 23.04.2014
Сообщений: 46
24.04.2014, 09:59  [ТС]     Не хватает опыта для того, чтобы понять ошибку в задаче циклического побитового сдвига #4
Да! Newbie666 поясните что значит "Г. код" это качество моего кода))) или определение какое-то?
newbie666
Заблокирован
24.04.2014, 10:53     Не хватает опыта для того, чтобы понять ошибку в задаче циклического побитового сдвига #5
Цитата Сообщение от Кателевский ВН Посмотреть сообщение
Да! Newbie666 поясните что значит "Г. код"
это гавно код , ты прав

Давай весь проект в архиве сюда, тогда гляну.
Кателевский ВН
 Аватар для Кателевский ВН
0 / 0 / 1
Регистрация: 23.04.2014
Сообщений: 46
24.04.2014, 11:29  [ТС]     Не хватает опыта для того, чтобы понять ошибку в задаче циклического побитового сдвига #6
Вот ловите, не судите строго, Я пока ещё чайник)
Вложения
Тип файла: 7z kodirovka.7z (182.5 Кб, 4 просмотров)
Кателевский ВН
 Аватар для Кателевский ВН
0 / 0 / 1
Регистрация: 23.04.2014
Сообщений: 46
24.04.2014, 11:32  [ТС]     Не хватает опыта для того, чтобы понять ошибку в задаче циклического побитового сдвига #7
Хотя нет, как можно строже, больше знать буду)))
newbie666
Заблокирован
24.04.2014, 11:52     Не хватает опыта для того, чтобы понять ошибку в задаче циклического побитового сдвига #8
О.о.о какой же мусор в твоём исходнике, у меня ваще твоя так сказать программа вылетает с экзепшеном, даже разбираться не хочу в таком мусоре...
Ты скажи, что ты хочешь сделать? Закодировать строку какой то другой строкой? Зачем тебе какая - то мутохрень? Нельзя побайтово XOR-м байты закодить и потом также раскодить? Код в две строки будет.
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
24.04.2014, 12:05     Не хватает опыта для того, чтобы понять ошибку в задаче циклического побитового сдвига #9
Цитата Сообщение от Кателевский ВН Посмотреть сообщение
while(in[l])
а что это за условие цикла? кто сказал что
а) в массиве не хранится нулей до последнего числа?
б) в массиве последнее число именно нуль?
DrOffset
6461 / 3835 / 886
Регистрация: 30.01.2014
Сообщений: 6,630
24.04.2014, 14:59     Не хватает опыта для того, чтобы понять ошибку в задаче циклического побитового сдвига #10
Кателевский ВН, в смысл всего этого не вдавался, остается на твоей совести. Но вот вроде бы то, что должно быть:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void lrotate(unsigned char ch[], int n)
{
    unsigned int in[80];
    size_t j;
    for(j = 0; ch[j]; ++j)
    {
        in[j] = static_cast<unsigned int>(ch[j]);
        for(int i = 0; i < n; ++i)
        {
            in[j] <<= 1;
            if(in[j] & 256)
            {
                in[j] |= 1;
            }
        }
    }
    for(size_t i = 0; i < j; ++i)
    {
        cout << in[i] << " ";
    }
}
Кателевский ВН
 Аватар для Кателевский ВН
0 / 0 / 1
Регистрация: 23.04.2014
Сообщений: 46
25.04.2014, 09:42  [ТС]     Не хватает опыта для того, чтобы понять ошибку в задаче циклического побитового сдвига #11
Ты скажи, что ты хочешь сделать? Закодировать строку какой то другой строкой?
Там, в задании у Шилдта, вторая строка выполняет роль количества сдвигов, поэтому только её размер и нужен.
Зачем тебе какая - то мутохрень?
Это задание, Я его решил по своему, не так как в архиве который скинул. Но мне интересно откуда лишние данные берутся в этой попытке решения программы?
Нельзя побайтово XOR-м байты закодить и потом также раскодить? Код в две строки будет.
Я же говорил, Я начинающий...
а что это за условие цикла?
а) в массиве не хранится нулей до последнего числа?
б) в массиве последнее число именно нуль?
Это для того, чтобы выводить данные из заполненного массива пока 0 не обозначит завершение.
По условию задания нулей нет, кроме, как в конце строки.

Добавлено через 7 минут
DrOffset поясните пожалуйста это место "in[j] = static_cast<unsigned int>(ch[j]);", что-то мне подсказывает здесь проблема у меня и была. Почему именно такое приведение типов Вы использовали? Может быть лишние данные именно от того и появлялись у меня, из за неправильного приведения типов? Тогда почему они появляются?
DrOffset
6461 / 3835 / 886
Регистрация: 30.01.2014
Сообщений: 6,630
25.04.2014, 13:32     Не хватает опыта для того, чтобы понять ошибку в задаче циклического побитового сдвига #12
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Кателевский ВН Посмотреть сообщение
поясните пожалуйста это место "in[j] = static_cast<unsigned int>(ch[j]);"
Это не играет роли. Вообще-то расширение char->int - это автоматическое преобразование (оно у тебя и было), но я посчитал, что в алгоритме присутствует определенная неочевидность, и обозначил явно намерение это сделать.
Цитата Сообщение от Кателевский ВН Посмотреть сообщение
что-то мне подсказывает здесь проблема у меня и была.
Нет. Проблема была из-за неправильного чтения массива in (последний цикл while). Массив не обязан заканчиваться нулем, поэтому условие срабатывало значительно большее количество раз, чем требовалось, выводя мусор из памяти. Ноль мог встретиться и позже, тогда мусорных "элементов" было бы еще больше. Я же просто немного сократил твой алгоритм, добавил некоторой четкости формулировок и убрал ошибку выведения данных массива in.

Добавлено через 2 минуты
Цитата Сообщение от Кателевский ВН Посмотреть сообщение
По условию задания нулей нет, кроме, как в конце строки.
В конце строки ноль есть. Но он в конце строки. А в конце массив in нет нуля, потому что его туда никто не пишет. Массив in - это уже не строка.

Добавлено через 6 минут
Цитата Сообщение от Кателевский ВН Посмотреть сообщение
Почему именно такое приведение типов Вы использовали?
Вообще, С++-касты задумывались в том числе и для того, чтобы внести определенную декларативность в исходный код. Чтобы было сразу видно, что тут происходит, чтобы, в том числе, можно было найти такой каст поиском по тексту.
В общем, чем четче обозначены намерения программиста в исходном коде, тем меньше ему придется писать комментариев (они, как известно, имеют свойство устаревать и рассинхронизироваться с кодом), и тем проще будет другому программисту сходу разобраться.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.04.2014, 10:19     Не хватает опыта для того, чтобы понять ошибку в задаче циклического побитового сдвига
Еще ссылки по теме:

Реализовать функции шифровки и дешифровки методом циклического сдвига битов C++
C++ Как закодировать методом циклического сдвига?
C++ Ошиба циклического сдвига

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

Или воспользуйтесь поиском по форуму:
Кателевский ВН
 Аватар для Кателевский ВН
0 / 0 / 1
Регистрация: 23.04.2014
Сообщений: 46
27.04.2014, 10:19  [ТС]     Не хватает опыта для того, чтобы понять ошибку в задаче циклического побитового сдвига #13
Я понял, благодарю за помощь, очень помогли.
Yandex
Объявления
27.04.2014, 10:19     Не хватает опыта для того, чтобы понять ошибку в задаче циклического побитового сдвига
Ответ Создать тему
Опции темы

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