Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 09.10.2014
Сообщений: 55

Неизвестное прибавление в классе

17.10.2014, 02:24. Показов 2075. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Начал писать класс для удобства работы с бинарником:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class editor
{
typedef unsigned char BYTE;
    private:
        std::vector<BYTE> generalVector;
    public:
        bool fillGeneralVector(std::string);
 
        template <typename T1>
        T1 getValue(std::string mod, int index)
        {
 
                int *temp(reinterpret_cast<int *>(&generalVector[0] + index));
                return *temp;
        }
 
        int size()
        {
            return generalVector.size();
        }
        void Free();
        ~editor();
};
*.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
bool editor::fillGeneralVector(std::string filename)
{
    std::FILE * pF = fopen(filename.c_str(), "rb");
    fseek(pF, 0, SEEK_END);
    int size = ftell(pF);
    fseek(pF, 0, SEEK_SET);
    generalVector.resize(size);
    fread(&generalVector[0], 1, size, pF);
    fclose(pF);
 
    if (!generalVector.empty())
        return true;
    else return false;
}
Собственно делаю такую команду:
C++
1
2
3
4
    editor test;
    test.fillGeneralVector("z:\\elements.data");
    int value = test.getValue<int>("fds",136);
    Button1->Caption = IntToStr(value);
И я получаю правильное значение. Но когда я меняю значение int в
C++
1
test.getValue<int>("fds", 136);
на:
C++
1
test.getValue<int>("fds",9032);
То получаю неплохое такое смещение байтов... На вложении видно, что да как. Зелёным квадратиком - откуда должно браться значение. Фиолетовый фон - откуда берётся.

Вопрос с чего такое смещение, и чем оно может быть вызвано?
Миниатюры
Неизвестное прибавление в классе  
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.10.2014, 02:24
Ответы с готовыми решениями:

Прибавление к текущей записи
Здравствуйте! Есть база через ADO. Есть форма добавления записи в ней находятся DBEdit`ы и DBLookupComboBox, первый для ввода количества...

Доля отличников в классе больше 2/5, но меньше 3/7, а всего в классе не более 15 учеников. Сколько всего в классе учеников?
Добрый вечер! Подскажите, пожалуйста! &quot;Доля отличников в классе больше 2/5, но меньше 3/7, а всего в классе не более 15 учеников....

В классе инициализировать массив, в классе создать функцию вывода массива на экран
Прошу помоши с выводом данных, которые содержаться в массиве, на экраy: Задача: В классе инициализировать массив, в классе создать...

32
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
17.10.2014, 21:48
Студворк — интернет-сервис помощи студентам
Если там указатель, т.е по сути массив то вероятно стоит написать отдельную перегрузку с передачей еще и количества элементов, которые нужно прочитать.

Да и вообще зачем такие мансы, если есть потоки?
0
0 / 0 / 0
Регистрация: 09.10.2014
Сообщений: 55
17.10.2014, 21:52  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Да и вообще зачем такие мансы, если есть потоки?
можно поподробнее пожалуйста?

ии, какого чёрта он ругается?
C++
1
2
3
4
5
6
            if (!strcmp(typeid(T).name(), "wchar_t *"))
                return reinterpret_cast<T>(&generalVector[0] + _offset);
            if (!strcmp(typeid(T).name(), "int"))
                return *reinterpret_cast<T *>(&generalVector[0] + _offset);
            if (!strcmp(typeid(T).name(), "float"))
                return *reinterpret_cast<T *>(&generalVector[0] + _offset);
C++
1
[bcc32 Error] editor.h(57): E2031 Cannot cast from 'unsigned char *' to 'float'
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
17.10.2014, 21:55
Цитата Сообщение от trystyle Посмотреть сообщение
можно поподробнее пожалуйста?
http://www.cplusplus.com/refer... m/istream/
http://www.cplusplus.com/refer... eam/seekg/
http://www.cplusplus.com/refer... ream/read/
0
0 / 0 / 0
Регистрация: 09.10.2014
Сообщений: 55
17.10.2014, 22:01  [ТС]
Avazart, ай нет, не подходит. Мне нужно считать именно из вектора данные... Ибо мне нужно выводить оооочень много данных из бинарного вектора, редактировать их, а потом засовывать в другой файл.. так что, это не совсем подходит, но спасибо

Цитата Сообщение от Avazart Посмотреть сообщение
Если там указатель, т.е по сути массив то вероятно стоит написать отдельную перегрузку с передачей еще и количества элементов, которые нужно прочитать.
была мысль передавать ещё и количество байтов, которые следует прочитать, но что-то не стал, раз работает

Добавлено через 2 минуты
Avazart, только вот не знаю как исправить эту штуку https://www.cyberforum.ru/post6734671.html
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33479 / 21577 / 8250
Регистрация: 22.10.2011
Сообщений: 37,040
Записей в блоге: 12
18.10.2014, 01:41
trystyle, Билдер как всегда жжет Любой нормальный компилятор (gcc, в частности) прекрасно компилирует вот такой код:
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 <type_traits>
 
class editor
{
    typedef unsigned char BYTE;
private:
    std::vector<BYTE> generalVector;
 
public:
    bool fillGeneralVector(std::string);
 
    // любые типы- НЕ указатели
    template<typename T, typename std::enable_if<!std::is_pointer<T>::value>::type* = nullptr>
    T getValue(std::string mod, int _offset)
    {
        return *reinterpret_cast<T*>(&generalVector[0] + _offset);
    }
    // любые типы-указатели
    template<typename T, typename std::enable_if<std::is_pointer<T>::value>::type* = nullptr>
    T getValue(std::string mod, int _offset)
    {
        return reinterpret_cast<T>(&generalVector[0] + _offset);
    }
 
    int size()
    {
        return generalVector.size();
    }
    void Free();
    ~editor();
};
, и потом можно вызывать - хоть завызываться:
C++
1
2
3
4
5
    editor test;
    int value = test.getValue<int>("fds", 148);
    wchar_t *value1 = test.getValue<wchar_t*>("fds", 148);
    double value2 = test.getValue<double>("fds", 148);
    float value3 = test.getValue<float>("fds", 148);
, все вызовы компилируются... И только Билдер не хочет понимать подобный синтаксис, и плюется ошибками... Может, на новых что-то изменилось? XE2 не дал мне откомпилить код...
0
0 / 0 / 0
Регистрация: 09.10.2014
Сообщений: 55
18.10.2014, 02:00  [ТС]
UI, XE7 тоже..

Добавлено через 1 минуту
Цитата Сообщение от UI Посмотреть сообщение
typename std::enable_if<!std::is_pointer<T>::valu e>::type* = nullptr>
а можно поподрообнее про такую конструкцию?
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
18.10.2014, 02:01
UI, это на x64 ?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33479 / 21577 / 8250
Регистрация: 22.10.2011
Сообщений: 37,040
Записей в блоге: 12
18.10.2014, 02:11
Цитата Сообщение от Avazart Посмотреть сообщение
это на x64 ?
Не, это 32, в XE2 еще нет x64, только начиная с XE3...
Цитата Сообщение от trystyle Посмотреть сообщение
а можно поподрообнее про такую конструкцию?
А что там не понятно? Это же уже классика (с момента принятия c++11): std::enable_if
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
18.10.2014, 02:56
Цитата Сообщение от UI Посмотреть сообщение
Не, это 32, в XE2 еще нет x64, только начиная с XE3...
Ну так смысл претензий, новый стандарт вроде как только на x64.
Не поддерживает как минимум nullptr, хоть и подсвечивает его(зарезервирован)
0
0 / 0 / 0
Регистрация: 09.10.2014
Сообщений: 55
18.10.2014, 02:57  [ТС]
Цитата Сообщение от UI Посмотреть сообщение
А что там не понятно? Это же уже классика (с момента принятия c++11): std::enable_if
ооо спасибо большое)
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33479 / 21577 / 8250
Регистрация: 22.10.2011
Сообщений: 37,040
Записей в блоге: 12
18.10.2014, 03:18
Цитата Сообщение от Avazart Посмотреть сообщение
новый стандарт вроде как только на x64.
Да что ты говоришь? Сказки мне рассказывать не надо... Ошибка ни разу не связана с nullptr (который элементарно можно заменить на 0, кстати). К тому же, код, использующий std::remove_pointer<T>, std::is_floating_point<T>, многие другие фишки C++11, прекрасно работает. А вот этот std::enable_if - не хочет. Причем только здесь. В других местах - работает. Так что это за фигня?

Кстати, в доках Embarcadero почти все фишки, которые cppreference отмечает как c++11, помечены как c++0x, и заявлена их поддержка в 32-битном компиляторе. Однако, XE7 до сих пор, как видишь, не мычит, не телится... Только бабло сшибать горазды...
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
18.10.2014, 03:22
Цитата Сообщение от UI Посмотреть сообщение
многие другие фишки C++11, прекрасно работает.
Лямбды, потоки, туплы, фор?
Цитата Сообщение от UI Посмотреть сообщение
Embarcadero почти все фишки, которые cppreference отмечает как c++11
Я бы грешил на cppreference. Кроме того иногда разработчики компиляторов идут впереди.
Хотя опять же это не показатель.
Цитата Сообщение от UI Посмотреть сообщение
Однако, XE7 до сих пор, как видишь, не мычит, не телится... Только бабло сшибать горазды...
Давно уже было пора привыкнуть.
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,978
18.10.2014, 11:25
UI, так работает:
C++
1
2
        template<typename T>
        T getValue(int _offset, typename std::enable_if<!std::is_pointer<T>::value>::type* = 0)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.10.2014, 11:25

Как использовать объект класса, созданого в определеном классе, в другом классе
У меня такой вопрос,как использовать объект класса,созданого в определеном классе,в другом классе.У меня есть объект pl класса Player,это...

Как обьявить переменную в одном классе и что бы ее было видно в дочернем классе
У меня есть основной класс с названием Root один из его членов наследует дочерний класс SubRoot. Скажите как объявить, что бы один из...

Как использовать информацию парсированую в 1 классе в другом классе
имеются 2 класса , объясните плз в чём ошибка using System; using System.Collections.Generic; using System.Linq; using System.Text;...

наследование в классе нескольких функций из другого или как добавить функцию находящуюся в классе в другой класс
есть класс. есть второй класс. как добавить функцию находящуюся в классе в другой класс(второй) при этом второй уже наследует какой то...

Составте программу подсчёта числа школьников, имеющих 5 по информатике в данном классе (в классе 5 учеников, изучаемых предметов 12).
Составте программу подсчёта числа школьников, имеющих 5 по информатике в данном классе (в классе 5 учеников, изучаемых предметов 12).


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

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru