Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание динамической перемнной в структуре, Созать Переменную в структуре раной дины 
:(
    Опции темы
XPyCT
Дата 4.12.2011, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Как в структуре создать переменную размером переменной StrLen

Гугл ответа не дал! За ранее спс

Код

struct stTemplate
{
unsigned int Index;
unsigned int StrLen;
char *StrValue = new char[StrLen]; // <- Как  реализовать эту строчку?
};
std::vector<stTemplate> vcTemplate;



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


а ты мне нравишься
***


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

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



Например так:

Код

struct stTemplate
{
stTemplate(unsigned int StrLen) : StrLen(StrLen)
{
  StrValue = new char[StrLen];
}
~stTemplate() 
{
  delete [] StrValue;
}

unsigned int Index;
unsigned int StrLen;
char *StrValue;
};



--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
borisbn
Дата 4.12.2011, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Использовать конструктор
Код

struct stTemplate
{
unsigned int Index;
unsigned int StrLen;
char *StrValue;

stTemplate( int a_Index, int a_StrLen )
    : Index( a_Index ), StrLen( a_StrLen )
{
   StrValue = new char[StrLen + 1]; // +1 для '\0' в конце
};
// лучше ещё добавить конструктор копирования
stTemplate( const stTemplate & other )
    : Index( other.Index ), StrLen( other.StrLen )
{
     StrValue = new char[StrLen + 1];
     strcpy( StrValue, other.StrValue );
}

// и  не забыть про конструктор
~stTemplate()
{
   delete []StrValue;
};



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


а ты мне нравишься
***


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

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



XPyCT, если данный вариант не подойдет, могу показать еще один.


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
XPyCT
Дата 4.12.2011, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ребятаааа я проставляю ++ и побежал пробовать! если что вернусь


Artemon Реакция студии на ваш код такая
Код

//----------------------------------------------
[BCC32 Error] vector(608): E2285 Could not find a match for 'stTemplate::stTemplate()'
  Full parser context
    vector(607): decision to instantiate: void vector<stTemplate,allocator<stTemplate> >::resize(unsigned int)
  --- Resetting parser context for instantiation...
 Unit1.cpp(5): #include C:\Program Files\Embarcadero\RAD Studio\7.0\include\boost_1_39\boost\tr1\tr1\vector
 vector(20): #include c:\program files\embarcadero\rad studio\7.0\include\../include/dinkumware/vector
 vector(8): namespace std
 vector(330): class vector<_Ty,_Ax>
 vector(607): parsing: void vector<stTemplate,allocator<stTemplate> >::resize(unsigned int)
//--------------

Далее открывает файл vector

и выделяет следующий код
Код

    void resize(size_type _Newsize)
        {    // determine new length, padding with _Ty() elements as needed
        resize(_Newsize, _Ty());
        }


Ща попробую следующий фрагмент

Второй код тоже ругается на вектор!


Для чего это нужно- Я открываю бинарный файл и в нем указывается для каждого элемента(чар) новый размер,
тобиш знать сколько нужно прочитать

Это сообщение отредактировал(а) XPyCT - 4.12.2011, 17:33
PM MAIL Skype   Вверх
borisbn
Дата 4.12.2011, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



XPyCT, лучше всего прочитай размер, выдели тут же необходимую память, прочитай строку указанной длины, переведи всё это безобразие в std::string и удали выделенную память
псевдокод
Код

int strLen;
fread( &strLen, sizeof(strLen), 1, file );
char * buff = new char [ strLen + 1 ];
fread( buff, sizeof( *buff ), strLen, file );
buff[ strLen ] = 0;
std::string str( buff );
delete []buff;

а ещё лучше с вектором
Код

std::vector< char > buff;
int strLen;
fread( &strLen, sizeof(strLen), 1, file );
buff.resize( strLen + 1, 0 );
fread( &buff[ 0 ], sizeof( char ), strLen, file );
std::string str( &buff[ 0 ] );


Это сообщение отредактировал(а) borisbn - 4.12.2011, 17:56


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


Опытный
**


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

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



borisbn
спс огромное я тоже к этому склонялся!ну раз это наилучший выход придется делать так;
просто это геморойный файл игрового сервера имеет более 60 листов.

ок. если найдется более кашерное решение и вас не затруднит с радостью выслушаю =)
PM MAIL Skype   Вверх
Artemon
Дата 4.12.2011, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


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

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



Развивая мысль borisbn:

Код

#include <stdio.h>
#include <string>
#include <vector>

struct stTemplate
{
  public: 
    stTemplate(const unsigned int& Index, const std::string& StrValue):Index(Index), StrValue(StrValue){} 
  private: 
    unsigned int Index;
    std::string StrValue;
};

int main()
{
   FILE* f = fopen("C:/text.bin", "rb");
   
   int strLen = 0;
   fread( &strLen, sizeof(strLen), 1, f );
   char* Data = new char[strLen+1];
   Data[strLen] = '\0';
      
   fread( Data, strLen, 1, f);  
  
   fclose(f);  
  
     
   std::vector<stTemplate>  mas;
  
   mas.push_back( stTemplate(1, std::string(Data)) );  
   mas.push_back( stTemplate(2, std::string(Data)) );  
   mas.push_back( stTemplate(3, std::string(Data)) ); 
  
   delete [] Data;  

   return 0;
}



--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
XPyCT
Дата 5.12.2011, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Всем спс методов достаточно главное выбрать подходящий
PM MAIL Skype   Вверх
xvr
Дата 5.12.2011, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



BTW - вашу оригинальную структуру вообще нельзя класть в vector. Ее нельзя копировать (будут либо утечки памяти либо множественные удаления одних и тех же участков памяти). Либо распределением памяти (под строку StrValue) придется управлять извне

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


Опытный
**


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

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



Да вроде как справился правда не динамически
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

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


 




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


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

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