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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проблемы с вектором и чаром 
V
    Опции темы
notnat
Дата 26.2.2011, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



доброе время суток!
помогите пожалуйста разобраться. пытаюсь сделать хранилище для будущих сигнатур библиотечных функций (вообще это пока просто первые 32 байта любого ехе). хранилище двухуровневое - на первом в векторе лежат по 12 байт от каждой сигнатуры, на втором - остальные 20 байт, которые будут листьями от элементов первого уровня. получается список из деревьев, состоящих из корня и нескольких листьев.
ну это примитивная оптимизация, в плане что многие сигнатуры начинаются одинаково.
а проблема вот в чем - в метод добавления сигнатуры подаются все 32 байта, но на первый уровень должны попасть только 12. написала метод для откусывания части строки, все вроде нормально, но после выполнения пуш_бэка строка превращается в нечто непотребное.. сначала список был реализован вручную с указателями и всем таким, думала проблема в них. переписала с вектором - то же самое.. без отделения куска строки все норм..

Код

main
    
    vector<SignatureBase> vBase;
    SignatureBase sBase;
    if (sBase.AddPrimary("1fba0e00b409cd21b8014ccd21546869732070726f6772616d2063616e6e6f74") == true)
    {
        //после выполнения эддпримари парт1 = 1fba0e00b409cd21b8014ccd, что правильно
        vBase.push_back(sBase);
        //а вот здесь уже оно превращается в странный набор символов
    }

Код

bool SignatureBase::AddPrimary(char* data)
{
    char* part1 = data;
    part1 = this->PartMagic(part1);
    this->Part1 = part1;
    return true;
}

char* SignatureBase::PartMagic(const char *data)
{
    const char* tmpData = data;
    char dataPart1[24]; 
    for (int i=0; i<24; i++)
    {
        dataPart1[i] = *tmpData;
        *tmpData++;
    }
    return dataPart1;
}


Это сообщение отредактировал(а) notnat - 26.2.2011, 00:53
PM MAIL   Вверх
alexvs11
Дата 26.2.2011, 01:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


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

Репутация: 2
Всего: 10



осмысленный конструктор копирования у SignatureBase есть?
PM MAIL   Вверх
notnat
Дата 26.2.2011, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



мм, я думала о нем, но что-то меня остановило. так что нет
PM MAIL   Вверх
volatile
Дата 26.2.2011, 01:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 16
Всего: 85



Цитата(notnat @  26.2.2011,  00:50 Найти цитируемый пост)

char* SignatureBase::PartMagic(const char *data)
{
    const char* tmpData = data;
    char dataPart1[24]; 
    for (int i=0; i<24; i++)
    {
        dataPart1[i] = *tmpData;
        *tmpData++;
    }
    return dataPart1;
}


Вы возвращаете указатель на стековый объект, который уже уничтожен.

Это сообщение отредактировал(а) volatile - 26.2.2011, 01:14
PM MAIL   Вверх
notnat
Дата 26.2.2011, 01:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



спасибо, почти получилось) 

Это сообщение отредактировал(а) notnat - 26.2.2011, 01:38
PM MAIL   Вверх
volatile
Дата 26.2.2011, 01:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 16
Всего: 85



Напишите еще такие функции:
  
SignatureBase ( const SignatureBase & sb );
const SignatureBase & operator = ( const SignatureBase & sb );
это конструктор и оператор=

Рекомендую использовать не char* а, std::string
Вы ведь все равно STL используете.

зачем вы пишете this-> в мемберах?. (Это не ошибка просто лишнее).

PM MAIL   Вверх
notnat
Дата 26.2.2011, 02:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



спасибо большое!
да, я знаю, что можно не писать smile
PM MAIL   Вверх
xvr
Дата 28.2.2011, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



На конструкцию *tmpData++; должен был совершенно справедливо изругаться компилятор - вы модифицируете const объект (и заодно разрушаете входной параметр)

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


Эксперт
****


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

Репутация: 15
Всего: 101



гораздо короче, проще и безопасней пользоваться std::copy или strncpy.
еще проще std::string (data, 24);

Добавлено через 2 минуты и 7 секунд
Цитата(volatile @  26.2.2011,  01:48 Найти цитируемый пост)
Рекомендую использовать не char* а, std::string

тогда и конструктор копирования, возможно, не понадобится

Это сообщение отредактировал(а) baldina - 28.2.2011, 17:42
PM MAIL   Вверх
baldina
Дата 28.2.2011, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 15
Всего: 101



PM MAIL   Вверх
notnat
Дата 28.2.2011, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



спасибо большое, baldina, за такие подробности! попробуем

PM MAIL   Вверх
volatile
Дата 28.2.2011, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 16
Всего: 85



Цитата(xvr @  28.2.2011,  16:12 Найти цитируемый пост)
На конструкцию *tmpData++; должен был совершенно справедливо изругаться компилятор - вы модифицируете const объект (и заодно разрушаете входной параметр)

Честно говоря, странно слышать такое..
Имхо, вы ошибаетесь, *tmpData++ интерпретируется как  *(tmpData++),
модифицируется указатель, а константный объект на который он указывает не модифицируется.
И от него берется значение, которое не используется.
Да, разыменование там лишнее, только и всего. Никакой ошибки, "де юре" нет.

Цитата(notnat @ 26.2.2011,  00:50)
char* SignatureBase::PartMagic(const char *data)
{
    const char* tmpData = data;
    char dataPart1[24]; 
    for (int i=0; i<24; i++)
    {
        dataPart1[i] = *tmpData;
        *tmpData++;
    }
    return dataPart1;
}



Это сообщение отредактировал(а) volatile - 28.2.2011, 23:31
PM MAIL   Вверх
volatile
Дата 1.3.2011, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 16
Всего: 85



Цитата(volatile @  28.2.2011,  23:23 Найти цитируемый пост)
*tmpData++ интерпретируется как  *(tmpData++),

Во избежание от придирок, полный и точный аналог выражения *tmpData++
Код

char t = *tmpData; tmpData++; t;

что сути сказанного мной выше не меняет.

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


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(volatile @  28.2.2011,  23:23 Найти цитируемый пост)
Имхо, вы ошибаетесь, *tmpData++ интерпретируется как  *(tmpData++),

Вы правы, тут я слегка погорячился. Посыпаю голову пеплом  smile 

PM MAIL   Вверх
volatile
Дата 1.3.2011, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 16
Всего: 85



Цитата(xvr @  1.3.2011,  13:32 Найти цитируемый пост)
слегка погорячился

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

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

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

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

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


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

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


 




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


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

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