Узнать размер экземпляра класса динамически

Тема в разделе "WASM.A&O", создана пользователем EvilsInterrupt, 9 ноя 2005.

  1. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    class Data

    {

    short int CodeObj; //DA

    float ValueObj;

    short int status;

    };



    class BcpArchive

    {

    public:

    unsigned char min; // t2

    unsigned char hour;

    unsigned char sec;

    unsigned char ms;

    short int year; // d2

    char day;

    char month;

    Data * pData;

    };

    В файл ложится структура BcpArchive, где pData переменно и может указывать на N структур Data. В итоге размер BcpArchive может меняться в зависимости от значения N.



    Мне не обоходимо занести в tmp размер этой структуры(а ведь она переменной длины).

    Зы:

    Не судите строго, но сегодня очень устал на работе и голова отказывается работать, может кому не лень подскажет?
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    EvilsInterrupt

    При чём тут размер класса?





    Это у тебя массив, храни его размер (N) в переменной.



    ...

    unsigned nData;

    Data* pData;

    };



    P.S. Не увлёкся ли ты классами? Это же чистой воды структуры (struct).
     
  3. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    В чужом исходники(устаревшем) такова струкура файла, читать классы выше. И его менять мне никто не позволит!!!

    Жаль конечно, но все таки!

    Я переделал на классы, но суть оставил туже!!! Ибо нельзя менять, куча всего полетит!!!

    Мне вот и надо узнать в переменной tmp сколько же весит это струкура!

    В дампе слудуют сначал перемеенные из BcpArchive без Data * pData, а после N раз Data !!!

    Вот как мне эту перемненную структуру,класс, скопление данных узнать! чтобы потом



    pData = new BcpArchive[.../как то хитро написать]
     
  4. Dimson

    Dimson New Member

    Публикаций:
    0
    Регистрация:
    7 июл 2005
    Сообщения:
    59
    Адрес:
    Russia
    Может быть есть какой-нибудь признак конца массива структур Data? Например, в последнем элементе все значения 0-е или что-то типа того?
     
  5. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    EvilsInterrupt

    В Це++, как и в Це, массив - низкоуровневая концепция, которая не содержит параметров о размере. Поэтому размер для него - это категория логическая и определить его можно только логически. Чаще всего это делают именно так как сказал IceStudent - то есть хранят размер явно. Но можно и неявно - как в ASCIZ-строках, например, где размер не хранится, но его можно определить исходя из данных.
     
  6. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348




    Как тогда free() узнает какой размер у блока памяти. И почему, если я, например, выделяю malloc() 10 байт, а запишу в выделенный массив 100, free() упадет на освобождении с сообщением о испорченном блоке. Видимо затираются какие-то служебные структуры? Или нет?
     
  7. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia


    у нее дескриптор есть. И вообще как-то ты так лихо с массивов на блоки памяти перепрыгнул...
     
  8. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348


    значит и нам можно узнать по этому дескриптору размер блока





    а это разные вещи? :)) (имеется в виду массив байт :))
     
  9. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    rmn

    Это разные уровни.



    EvilsInterrupt

    Раз есть память (pData), значит, кто-то её выделил. Раз кто-то её выделил, значит, знал её размер. Вот и возьми оттуда размер данных (кол-во структур).



    А извращаться, лишь бы (не дай Бог!!!!!) не трогать чужой код — это глупо. Нельзя тебе менять — требуй, чтобы изменил автор.
     
  10. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    EvilsInterrupt

    а что в файле находится после массива Data[] ?

    поля Data::CodeObj и Data::status судя по имени имеют небольшое число валидных значений.

    Этим можно воспользоваться для определения конца массива.



    PS

    Интересно как автор формата собирался доставать данные из такого файла
     
  11. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    >Может быть есть какой-нибудь признак конца массива структур Data?

    Признак конца считай число N от него и оталкиваться стоит!Это число N для меня не проблема!

    > что в файле находится после массива Data[] ?

    Повторение структуры BcpArchive, но уже с другими значениями ибо температура как правило меняется хотя бы в пределах сотых
     
  12. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Еще раз повторю:

    Исходные данные:

    Есть класс/структура BcpArchive которая ложится в файл, в ней есть N кол-во структур\классов Data сколько их определяет N которое я могу вычислить!!!



    Получается такя дурь:

    class BcpArchive

    {

    public:

    unsigned char min; // t2

    unsigned char hour;

    unsigned char sec;

    unsigned char ms;

    short int year; // d2

    char day;

    char month;

    Data 1; // На эти структуры указывает Data * pData

    Data 2; // А сколько их говорит N

    ...

    Data N;

    };

    Как мне узнать размер BcpArchive, если я знаю Количество структур Data?



    Зы:

    Извините, что туплю но блин не доходит!!! :dntknw:(( Я прогу надо доделать в пятницу она должна ложить данные в Oracle!
     
  13. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Уважаемый!

    Рэхмет за заботу, причем Зур, но "Как мне узнать размер BcpArchive?", я ума не приложу, именно это и беспокоит меня с первого сообщения в данной теме.
     
  14. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    А тебя не беспокоит то, что вопросы нужно писать так, чтобы они были понятны, а не выкрикивать одно и то же, надеясь на присутствие телепатов, которые, возможно, смогут отгадать, что же ты имеешь ввиду?
     
  15. SI_16

    SI_16 New Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    10
    не знал что размеры объектов могут изменяться во время выполнения программы
     
  16. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    IceStudent

    Я писал, что N может быть разным а оно определяет кол-во структур Data, следовательно структура BcpArchive может иметь разный размер!!!

    Как мне по проще(желательно быстро работающий код) узнать размер текущего экземпляра BcpArchive если я знаю N?
     
  17. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Прога что составляет эти файлы, которые я сейчас разбираю на части переменчива, потому что темперетуру одних объектов нужно видеть чаще, следовательно они в файле и чаще ложатся, отсюда и изменчивость, че толку ложить еже 10 секундно уровень, если он меряется в тоннах и за 10 сек точно не изменится существенно!!!



    СОрри за хреново изложенные мысли,но у меня у самого каша, а работу работать надо! :))) Всего вам доброго
     
  18. Ation

    Ation New Member

    Публикаций:
    0
    Регистрация:
    6 авг 2005
    Сообщения:
    92
    Адрес:
    Zaporozhie
    IMHO надо использовать обычный sizeof.
    Код (Text):
    1. SizeOfBcpArchive = sizeof () + ... //размер членов
    2. //"класса" кроме pData
    3. SizeOfBcpArchive = sizeof(Data) * N;
    4.  
     
  19. Ation

    Ation New Member

    Публикаций:
    0
    Регистрация:
    6 авг 2005
    Сообщения:
    92
    Адрес:
    Zaporozhie
    Sorry

    последняя строка еестественно
    Код (Text):
    1.  
    2. SizeOfBcpArchive += sizeof(Data) * N;
    3.  
     
  20. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Именно так я и решил, но думал есть способ проще, сорри, за то что отнял у собрания время.



    Спасибо!



    Если интересно, то аттач





    [​IMG] _138911256__noname.dat