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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите с void* 
V
    Опции темы
Zakhar_Shan
Дата 15.8.2012, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 14.6.2007
Где: Тюмень

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



Есть программка которая с бинарного файлика считывает данные. Тип данных не известен.  Пока не дойдешь до секции файла, где и будет содержаться инфа о типе содержащихся данных. Для каждой секции файла, программка создает объект класса, и вписывает туда значения, так как тип изначально не известен то в классе массив значений определен как:
Код

void* vals;

После того, как тип дальнейших данных выясняется, массив vals, определяется под конкретные данные:
Код

void defineArray(int count){
    switch(typeOfValue){
        case charType:{
            vals = calloc(count,BYTES_IN_CHAR);
        };break;
        case intType:{
            vals = calloc(count,BYTES_IN_INT);
        };break;
        case realType:{
            vals = calloc(count,BYTES_IN_REAL);
        };break;
        case doubleType:{
            vals = calloc(count,BYTES_IN_DOUBLE);
        };break;
    };
}


В случаях с intType, realType и doubleType все норм. А вот когда дело касается charType, все плохо. Данные типа char в файлике это записи по 8 символов (константа BYTES_IN_CHAR=8). 
При определении считывание значения в класс, оно пишется при помощи метода:
Код

void KeyWord::defineCharVal(char *val, int ind){
    char *arr  = (char*)vals;
    for (int i = 0; i < BYTES_IN_CHAR; i++) {
        arr[ind*BYTES_IN_CHAR+i]=val[i];
    }
    delete[] val;

}


а считывается:
Код

char* KeyWord::getCharVal(int ind, int &count){
    char *arr = (char*)vals;
    count = BYTES_IN_CHAR;
    char *ret = new char[BYTES_IN_CHAR];
    for (int i = 0; i < count; i++) {
       ret[i]=arr[ind*BYTES_IN_CHAR+i];
    }
    return ret;
}

Так вот, в defineCharVal приходит нормальное значение, а вот считывается фигня...
Помогите плиз, что может быть не так? Ведь с другими типами все норм...


PM MAIL   Вверх
borisbn
Дата 15.8.2012, 10:00 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



т.к. память выделяется жёстко под BYTES_IN_CHAR байт,
Цитата(Zakhar_Shan @  15.8.2012,  08:45 Найти цитируемый пост)
vals = calloc(count,BYTES_IN_CHAR);

а запись (и чтение) м.б. больше
Цитата(Zakhar_Shan @  15.8.2012,  08:45 Найти цитируемый пост)
arr[ind*BYTES_IN_CHAR+i]=val[i];

то всё это будет работать только если ind == 0. Во всех остальных случаях м.б. всё что угодно


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Cheloveck
Дата 15.8.2012, 10:02 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Из приведённого кода мало, что понятно. Но, во-первых, при считывании файла, обычно, используют не void *, а char *. Во-вторых, используй memcpy вместо своих подозрительных циклов.


--------------------
user posted image
PM Jabber   Вверх
Zakhar_Shan
Дата 15.8.2012, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 14.6.2007
Где: Тюмень

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



Цитата(borisbn @ 15.8.2012,  10:00)
т.к. память выделяется жёстко под BYTES_IN_CHAR байт,
Цитата(Zakhar_Shan @  15.8.2012,  08:45 Найти цитируемый пост)
vals = calloc(count,BYTES_IN_CHAR);

а запись (и чтение) м.б. больше
Цитата(Zakhar_Shan @  15.8.2012,  08:45 Найти цитируемый пост)
arr[ind*BYTES_IN_CHAR+i]=val[i];

то всё это будет работать только если ind == 0. Во всех остальных случаях м.б. всё что угодно

На сколько я понимаю, запись 
Код

vals = calloc(count,BYTES_IN_CHAR);

равносильно выделению памяти count * BYTES_IN_CHAR. т.е. для count=10 и BYTES_IN_CHAR=8 выделится 80 байт?

Добавлено через 2 минуты и 1 секунду
Цитата(Cheloveck @ 15.8.2012,  10:02)
Из приведённого кода мало, что понятно. Но, во-первых, при считывании файла, обычно, используют не void *, а char *. Во-вторых, используй memcpy вместо своих подозрительных циклов.

memcpy копирует с 0 элемента массива, если можно было бы копернуть с n-го... Цены бы не было...
PM MAIL   Вверх
borisbn
Дата 15.8.2012, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Zakhar_Shan @  15.8.2012,  10:52 Найти цитируемый пост)
равносильно выделению памяти count * BYTES_IN_CHAR. т.е. для count=10 и BYTES_IN_CHAR=8 выделится 80 байт?

да. всё правильно. я не усмотрел этот count (давно не пользуюсь calloc)
Цитата(Zakhar_Shan @  15.8.2012,  10:52 Найти цитируемый пост)
memcpy копирует с 0 элемента массива, если можно было бы копернуть с n-го...

Код
memcpy( &dest[ n ], &src[ m ], ...

вообще-то, в коде не видно особых проблем. поставь assert( ind <= count ), что-ли...
или выкладывай весь код


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
bsa
Дата 15.8.2012, 11:05 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Zakhar_Shan @  15.8.2012,  11:52 Найти цитируемый пост)
memcpy копирует с 0 элемента массива, если можно было бы копернуть с n-го... Цены бы не было... 
Если бы ты не пользовался void*, то мог бы использовать запись: memcpy(dest + Nd, src + Ns, size);
PM   Вверх
Zakhar_Shan
Дата 15.8.2012, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 14.6.2007
Где: Тюмень

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



Цитата(borisbn @ 15.8.2012,  11:01)
Цитата(Zakhar_Shan @  15.8.2012,  10:52 Найти цитируемый пост)
равносильно выделению памяти count * BYTES_IN_CHAR. т.е. для count=10 и BYTES_IN_CHAR=8 выделится 80 байт?

да. всё правильно. я не усмотрел этот count (давно не пользуюсь calloc)
Цитата(Zakhar_Shan @  15.8.2012,  10:52 Найти цитируемый пост)
memcpy копирует с 0 элемента массива, если можно было бы копернуть с n-го...

Код
memcpy( &dest[ n ], &src[ m ], ...

вообще-то, в коде не видно особых проблем. поставь assert( ind <= count ), что-ли...
или выкладывай весь код

Да код весь смысла нет выкладывать, даже не знаю что может там пригодиться... Могу сказать, сто методы:
Код

int  getIntVal( int ind){
    int *arr = (int*)vals;
    return arr[ind];

и
Код

void  defineIntVal(int val, int ind){
    int *arr = (int*)vals;
    arr[ind] = val;
}

Работают адекватно...

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


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 14.6.2007
Где: Тюмень

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



Ошибку нашел  smile , все действительно оказалось в другой части кода, но выкладывать его не было смысла. т.к. Кода много. Спасибо Cheloveck, borisbn и bsa за помощь smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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