Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> дамп буфера в стандартный вывод 
:(
    Опции темы
azesmcar
Дата 23.5.2009, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



1. Убрал шаблон..а зачем он нужен?
2. Убрал Buf::const_iterator j; из цикла (каждый раз заново создается)
3. вызовы типа std::cout << ":" << " "; заменил на std::cout << ": ";
4. исправил стиль форматирования - чтобы читалось легче

Добавлено через 54 секунды
Цитата(GoldFinch @  23.5.2009,  11:50 Найти цитируемый пост)
//backup flags
    std::ios_base::fmtflags backup = out.flags();
лучше переменной savedFlags

да ничем )) просто переписывая переименовал автоматом..внимание не обратил
PM   Вверх
GoldFinch
Дата 23.5.2009, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



а вылетает оно при вычислении i + 8 и i + 16
полученное значение проверяется на выход за end() и прога вылетает

Код

Buf buf(2);
Buf::const_iterator i=buf.begin();
Buf::const_iterator e=i+8; //тут прога вылетит


и как от этого избавиться?
PM MAIL ICQ   Вверх
azesmcar
Дата 23.5.2009, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(GoldFinch @  23.5.2009,  12:08 Найти цитируемый пост)
и как от этого избавиться? 

Не выходить за рамки вектора
PM   Вверх
GoldFinch
Дата 23.5.2009, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



azesmcar, вызов std::cout << ":"  << " "; там был специально, т.к. в предыдущей строке задется выравнивание для 1 символа, а не для 2х
а шаблон чтобы можно было бы юникод юзать, при необходимости

Добавлено через 8 минут
azesmcar, а я не выхожу за рамки вектора, я сравниваю итераторы за границами вектора, но не разыменовываю их

замена (j<i+8 && j<e) на (j<e && j<i+8) не помогла , как это ни странно %)

Добавлено через 12 минут и 21 секунду
я может дико туплю, но как сравнить i с e и i с i+8 не вычисляя i+8 ??
PM MAIL ICQ   Вверх
GoldFinch
Дата 23.5.2009, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



видимо кроме итераторов в циклы надо ввести дополнительный счетчик k исключительно для "безопасного" вычисления k+8

спрашивается нафига тогда итераторы, если заменив их на указатели эта проблема пропадет %)
PM MAIL ICQ   Вверх
mes
Дата 23.5.2009, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(GoldFinch @  23.5.2009,  11:27 Найти цитируемый пост)
я может дико туплю, но как сравнить i с e и i с i+8 не вычисляя i+8 ?? 

как я понял, ошибка в понимании работы итератора end ()
Код

end()-1+2 !=end();


для проверки, Вы не должны итератором выходить за пределы [begin(), end()], a следовательно проверка 
Код

it+8<end();

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

end()-it > 8


P.S. хотя мне код с предыдущей страницы не нравится не только этим..


Это сообщение отредактировал(а) mes - 23.5.2009, 15:17


--------------------
PM MAIL WWW   Вверх
GoldFinch
Дата 23.5.2009, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



mes, спасибо, "e-i>8" помогло, 
зато теперь валится на 
Код

        if(j>=e) {
            out<<setfill(' ')<<setw((i+8-j)*3+1);
            j=i+8;
        };

если заменить "i+8-j"  на "i-j+8" то на этой строчке падать не будет (забавный контрпример неопределенности порядка вычисления)

а чем еще не нравится тот код?

Добавлено через 13 минут и 52 секунды
вроде все ошибки убил. получился такой код:
Код

#include <vector>
#include <iostream>
#include <iomanip>

typedef std::vector<unsigned char> Buf;

template<typename charT,typename traits>
std::basic_ostream<charT,traits>&
operator<< (std::basic_ostream<charT,traits>& out,const Buf& buf){
    using namespace std;
    ios_base::fmtflags savedFlags = out.flags();
    out<<hex<<right<<noshowbase<<setfill('0');
    out<<endl;
    Buf::const_iterator j;
    for(Buf::const_iterator i0=buf.begin(),i=i0,e=buf.end();i<e; i=j){        
        out<<setw(4)<<i-i0<<':';
        for(j=i;j-i<8&&j<e; ++j)
            out<<' '<<setw(2)<<static_cast<int>(*j);
        if(j>=e) 
            out<<setfill(' ')<<setw((i-j+8)*3+1);
        out<<'|';
        for(;j-i<16&&j<e; ++j)
            out<<setw(2)<<static_cast<int>(*j)<<' ';
        if(j>=e)
            out<<setfill(' ')<<setw(((j-i<8)?8:(i-j+16))*3+1);
        out<<'|'<<' ';
        for(j=i;j-i<16&&j<e; ++j)
            out<<((*j>=' ')?char(*j):'.');
        out<<endl;
    };
    out.flags(savedFlags);
    return out;
}

#include <locale>
#include <algorithm>

int main(){
    setlocale(LC_ALL,"Russian");    
    Buf buf(67);
    std::generate(buf.begin(),buf.end(),rand);
    std::cout<<"дамп буфера (длина="<<buf.size()<<"):"<<buf<<"- конец дампа -"<<std::endl;
    return 0;
}



что кстати оптимальнее, out<<'+' или out<<"+" ?
PM MAIL ICQ   Вверх
mes
Дата 23.5.2009, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



предлагаю альтернативный вариант для доработки:
Код

typedef std::vector<unsigned char> Buf;
std::ostream& operator<< (std::ostream& out,const Buf& buf)
{
    using namespace std;
    ios_base::fmtflags savedFlags = out.flags();
    out<<hex<<right<<noshowbase<<setfill('0');
    out<<endl;

    for (Buf::const_iterator it = buf.begin(), it1 = buf.begin(); it!=buf.end(); )
    {
        out<<setw(4)<<(it - buf.begin()) <<':';

        for (int i=0; i<8; ++i)
         if (it!=buf.end()) out<<" "<<setw(2)<<static_cast<int>(*it++);
         else { out<<setfill(' ')<<setw((8-i)*3+2); break; }

        out << " |";

        for (int i=0; i<8; ++i)
         if (it!=buf.end()) out<<" "<<setw(2)<<static_cast<int>(*it++);
         else { out<<setfill(' ')<<setw((8-i)*3+3); break; }

        out << " | ";

        for (int i=0; i<16; ++i)
         if (it1!=buf.end()) {  out<< (*it1>=' '? static_cast<char>(*it1) : '.'); ++it1; }
         else  break;

        out << endl;
    }

    out.flags(savedFlags);
    return out;
}



Цитата(GoldFinch @  23.5.2009,  12:45 Найти цитируемый пост)
что кстати оптимальнее, out<<'+' или out<<"+" ? 

интуитивно полагаю что на вывод символа меньше затрат, хотя не думаю, что  этим вопросом стоит озадачиваться.



Это сообщение отредактировал(а) mes - 23.5.2009, 15:14


--------------------
PM MAIL WWW   Вверх
GoldFinch
Дата 23.5.2009, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



mes, действительно, так лучше, спасибо
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0744 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.