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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Struct, array, Ламерский вопрос 
:(
    Опции темы
deBuger
Дата 14.11.2002, 23:15 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Ламерский вопрос.
Есть рабочий код:
struct settings {
char *element;
};
int main(int argc, char ** argv) {
settings *ss;
char *a;
char *b;
a = "La-La-La\n";
b = "element";
ss -> element = a;
printf(ss->element);
return 0;
}

Хочется присваивать значение для члена (MEMBER) структуры
не по конкретному названию (как ss -> element), а через
переменную, ну типа ss -> b, а b содержит соответственно
имя название "element", ну как в примере.
Вот такая дурь.
  Вверх
neutrino
Дата 14.11.2002, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

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



Цитата

Хочется присваивать значение для члена (MEMBER) структуры
не по конкретному названию (как ss -> element), а через
переменную, ну типа ss -> b, а b содержит соответственно
имя название "element", ну как в примере.

Не понял. Как это? Если у тебя определена struct{char* element}, то нельзя обращаться как ss->а или ss->b.


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
deBuger
Дата 14.11.2002, 23:35 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Неверное не так выразился.
Можно ли вместо явного указания члена структуры, каким либо
образом, указать , что его имя надо взять из переменной.
  Вверх
AntonSaburov
Дата 15.11.2002, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

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



Просто так в лоб - не получится. Можно переопределить оператор и его использовать, но это как-то странно выглядит. Или тогда уже просто Map использовать.
PM MAIL WWW ICQ   Вверх
Fantasist
Дата 15.11.2002, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


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

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



В общем случае это так:

Код
struct sst
{
 int a;
 int b;
 int c;
};

typedef int sst::* sst_member;

int main()
{
 sst_member pMember=&sst::b;

 sst* var=new sst;
 var->*pMember=5; //var->b=5;

 return 0;
}



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


Unregistered











Продолжаем разговор.
Может я че-то недогоняю, или мысли не могу выразить.
Но вот не в тему код на РНР (синтаксис как в С):
$a = "I'am A";
$b= "a";
printf($$b);

который выводит I'am A
а как такое-же сделать на С.
  Вверх
AntonSaburov
Дата 16.11.2002, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

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



Что-то я не понял, в чем суть.
Ну вот так вот можно. И будет работать на ура

#include <stdio.h>

int main()
{
 char* a = "I am Bill";
 char* b = a;

 printf("%s\n\r",a);
 printf("%s\n\r",b);

 return 0;
}
PM MAIL WWW ICQ   Вверх
man2002ua
Дата 16.11.2002, 00:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



вопрос вовсе не ламерский... (просто непонятно ДЛЯ ЧЕГО ЭТО НАДО?)
Естественный выход (если ты хочешь сделать это как в PHP-примере) - это классы.
Классы в к-х переопределены все операции (=,-,+,... и т.д.) и для каждой переменной - задается имя и значение. Что-то вроде Variant в D5.
Но это хороший кусок программного кода, чтобы делать нахрапом.


--------------------
"Нет ничего более постоянного, чем временное"
PM MAIL   Вверх
Fantasist
Дата 16.11.2002, 07:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


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

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



Цитата(man2002ua @ 15.11.2002, 16:54)
вопрос вовсе не ламерский...

Ага не ламерский, а просто не понятный.  :)
Но до меня кажись дошло в чем суть (благодаря примеру на PHP) - он хочет обращаться к переменной по ее имени.  :) Так вот я привел пример как обращаться к переменной косвенно. А по имени - это что-то извращенческое, для которого я даже не могу придумать место использования и способы реализации. Хотя, как уже упоминалось, если нужно хранить динамически задаваемые именованные переменные, то это std::map<std::string,(тип переменной)>. Но для вас, это пожалуй рано упоминать.


--------------------
Волны гасят ветер...
PM MAIL   Вверх
man2002ua
Дата 16.11.2002, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



никогда не использовал <map> и не собираюсь впредь. Может я извращенец, но для меня легче что-то подобное написать самому. :bored


--------------------
"Нет ничего более постоянного, чем временное"
PM MAIL   Вверх
HexoGenus
Дата 17.11.2002, 02:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Экс. модератор
Сообщений: 110
Регистрация: 28.8.2002
Где: Ростов-на-Дону

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



Цитата(Guest @ 15.11.2002, 07:32)
Может я че-то недогоняю, или мысли не могу выразить.
Но вот не в тему код на РНР (синтаксис как в С):
$a = "I'am A";
$b= "a";
printf($$b);

Хммммм.... задачка приобрела зловещий смысл :D
В свое время я пытался создать искусственный интелект используя Basic
(вот умора)
потом то же самое на паскале
(вот долбежу то...)
Вобщем с треском провалилась тогда моя затея (может лет через 5 снова попробую      :sneaky2  
Вопрос вас удивил ??? Зачем ему это нужно ???
Все очень даже просто :D
Представте у вас есть процесс выполняющийся на данной машине, или на сервере, вас интересует возможность не прерывая его в любой момент отследить значение любой его переменной, но количество этих самых переменных в вашем проекте растет не по часам а по минутам...
А вы очень любопытные ... хочется то значение одной переменной узнать то другой... (Вобщем свитч на 400 переменных вам писать совсем не хочется а какие переменные вас заинтересуют через три минуты вы сами не знаете) Навел на мысль как это просто было бы реализовать если была бы возможность узнать значение переменной по имени?
У вас есть функция которую вы можете вызывать из другого процесса и передавать ей имя переменной а эта программулька тут же вернет значение...
И это только один из вариантов применения этой функции...

Кстати говоря вопрос который очень похож на этот очень часто поднимается в разных форумах: "Как выполнить функцию по ее имени?"
Ответы которые я встречал:
1. Невозможно так как после компиляции к функциям идет обращение по их адресам а не по именам...
2. Можно замутить огромный свитч который будет по имени возвращать функцию...
3. Можно все функции научить проверять имя по которому к ним обращаются и если оно не соответствует их собственному передавать управление по цепочке следующей ... (что то типа: я не Вася а ты???)
4. Способ который лежит в часто задаваемых вопросах на этом сайте :

В Builder C++ задача получения адреса функции по ее символьному имени решается не просто, а очень просто. Правда с одним ограничением: эта функция должна быть опубликованным методом класса.
Код

class TMyForm : public TForm
{
 
 TNotifyEvent fastcall GetProcByName(AnsiString);
published:
   void fastcall MyFunc1(TObject* Sender);  
   void fastcall MyFunc2(TObject* Sender);  

};
TNotifyEvent fastcall  TMyForm ::GetProcByName(AnsiString ProcName)
{
//формируем __closure адрес
TMethod Method;
           Method.Data = this;
  if(Method.Code)
 {
           Method.Code = MethodAddress(ShortString(ProcName));
      return  *(TNotifyEvent*)&Method;
 }
 return NULL;        
}
....
//получаем адрес функции по имени
TNotifyEvent AdrFunc = GetProcByName("MyFunc1");
//теперь мы ее можем запустить
if (AdrFunc)   AdrFunc(NULL);
//или присвоить событию в качестве какого либо обработчика
Button->OnClick = AdrFunc;
...
AdrFunc = GetProcByName("MyFunc2");
Button->OnClick = AdrFunc;

естественно, возможен обратный процесс получения символьного имени по адресу. Например, определим как называется функция, которая в данный момет является обработчиком события Button->OnClick;
Код

TMethod Method = *(TMethod*)&(Button->OnClick);
ShortString ProcName = MethodName(Method.Code);


А теперь сравните в первом случае сказали что это невозможно
а в четвертом сказали что это очень просто....

Так может и к переменным по именам обращаться можно очень даже просто ???
Вобщем если кто найдет способ то я с удовольствием занесу его в свою копилочку на будущее  :D очень может пригодится!
--------------------
Когда невозможно уже работать напряженнее, начни работать умнее.
PM MAIL WWW ICQ   Вверх
Fantasist
Дата 17.11.2002, 05:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


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

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



Цитата
никогда не использовал <map> и не собираюсь впредь. Может я извращенец, но для меня легче что-то подобное написать самому.


Что-о-о?? :0  Написать самому? Тебе легче написать самому, чем научиться пользоваться готовой? Мож ты и компилер свой напишиь, че готовыми пользоваться? :D  Ну давай, напиши хотя бы свой map, а мы его оценим. :)
Но посуществу, если ты хочешь стать проффессиональным программистом на С++, то с STL придется разобраться.

Цитата
Представте у вас есть процесс выполняющийся на данной машине, или на сервере, вас интересует возможность не прерывая его в любой момент отследить значение любой его переменной, но количество этих самых переменных в вашем проекте растет не по часам а по минутам


Для этого существуют отладчики и отладачная информация. Но это по большому счету роли не играет - обычно использования глобальных переменных не велико, а локальные переменные существуют то недолгое время, пока не кончится соответсвующий контекст выполнения. И в разных контекстах я могу использовать одно и то же имя.

Цитата
А теперь сравните в первом случае сказали что это невозможно
а в четвертом сказали что это очень просто....


Это уже использование RTTI(Run-Time Type Information) в Builder. Реально такое очень редко применяется. Это слишком дорого и это просто не правильно. Так никто не делает.

Цитата
Так может и к переменным по именам обращаться можно очень даже просто


Можно так же просто. Делаешь published property и сможешь обращаться к нему по имени. Но все это ерунда.


--------------------
Волны гасят ветер...
PM MAIL   Вверх
HexoGenus
Дата 17.11.2002, 06:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Экс. модератор
Сообщений: 110
Регистрация: 28.8.2002
Где: Ростов-на-Дону

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



Цитата(Fantasist @ 16.11.2002, 21:47)
Для этого существуют отладчики и отладачная информация. Но это по большому счету роли не играет - обычно использования глобальных переменных не велико, а локальные переменные существуют то недолгое время, пока не кончится соответсвующий контекст выполнения. И в разных контекстах я могу использовать одно и то же имя.

Попробуй при помощи отладчика отследи как выполняется приложение на машине в другой части города??? или хотя бы в соседней аудитории  :angry:
А насчет малого числа переменных... как бы не так на каждой форме их может быть тьма... и на время существования формы они очень даже существуют
:D
Цитата

Это уже использование RTTI(Run-Time Type Information) в Builder. Реально такое очень редко применяется. Это слишком дорого и это просто не правильно. Так никто не делает.

Да просто задача редкая мало кто пишет не просто алгоритмы а алгоритмы-интерпритаторы входящих команд, что ты предложишь самому все написать? :p
Цитата

Можно так же просто. Делаешь published property и сможешь обращаться к нему по имени. Но все это ерунда.

Хмммммм..... :notify ну хорошо, пропишешь ты published property и после этого сможешь к переменной обращаться через инспектор объектов !НО!!! до запуска программы... а как тоже самое сделать в ходе выполнения программы?
Разве к свойствам можно обращаться по имени в ходе выполнения программы??? Можно получить список названий публичных свойств компонента в ходе выполнения программы? ???
--------------------
Когда невозможно уже работать напряженнее, начни работать умнее.
PM MAIL WWW ICQ   Вверх
Fantasist
Дата 17.11.2002, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


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

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



Цитата
Попробуй при помощи отладчика отследи как выполняется приложение на машине в другой части города??? или хотя бы в соседней аудитории


Вполне. Если есть соответствующий доступ по сети. Но это очень редкий случай.

Цитата
А насчет малого числа переменных... как бы не так на каждой форме их может быть тьма... и на время существования формы они очень даже существуют


Это совсем, НЕ глобальные переменные. Сама форма может быть глобальной переменной, но я могу написать отдельный класс формы, и использовать там те же имена для переменных. Какое тогда имя выбирать? Внутри функций я тоже могу те же имена использовать.

Цитата
Да просто задача редкая мало кто пишет не просто алгоритмы, а  алгоритмы-интерпритаторы входящих команд что ты предложишь самому все написать?


Ага. Что-то за супер задача у тебя? Тогда вот что - пиши лучше сразу новый язык и интерпритатор/компилятор к нему. Будет он делать все что ты захочешь. А что такое "алгоритмы-интерпритаторы входящих команд" непонял.

Цитата
Разве к свойствам можно обращаться по имени в ходе выполнения программы Можно получить список названий публичных свойств компонента в ходе выполнения программы?


Примерно так же как методов. Смотри модуль Classes - TWriter::WriteProperties.

Eще раз повторю, если уж захотел извращений, то сделай их по нормальному. примерно так:

Код

class VariableValue
{
public:
  struct EInvalidType{};
  enum TVariableTypes{vtInt,vtChar,vtString};
private:
  TVaribaleTypes VaribaleType
  void *p;
public:
  VariabaleValue() {};
  VariableValue(int* var): VaribaleType(vtInt)  p((void*)var) {};
  VariableValue(char* var): VaribaleType(vtChar)  p((void*)var) {};
  VariableValue(std::string* var): VaribaleType(vtString)  p((void*)var) {};

  int& GetInt() throw EInvalidType()
  {  
       if (VariabaleType==vtInt) return *((int*)p);
       else throw(EInvalidType);
  }

  char& GetChar() throw EInvalidType()
  {  
       if (VariabaleType==vtChar) return *((char*)p);
       else throw(EInvalidType);
  }

  std::string& GetString() throw EInvalidType()
  {  
       if (VariabaleType==vtString) return *((std::string*)p);
       else throw(EInvalidType);
  }
};

tepdef std::map<std::string,VaribleValue> TVariables;


Потом и добавляй где-нибудь:

Код

class A
{
 std::string s;
};
....
{
 A obj;
 int a;
 int b;
 TVariables variables;

 variables["a"]=&a;
 variables["b"]=&b;
 variables["obj.s"]=&obj.s;



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


Опытный
**


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

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



2 Fantasist - ВОТ ЭТО МОЁ - смотри как это сделать на BCB5... На С++ можно тоже запросто (Delphi труднее).

Оценивай...

TStringList *VALS;
typedef struct vINT{
 int vVAL;
}vINT, *LPvINT;

int& V(char *s)
{
 if(!VALS) VALS = new TStringList;
 int idx = VALS->IndexOf(s);
 if(idx == -1) idx = VALS->AddObject(s,(TObject*)(new LPvINT));
 return LPvINT(VALS->Objects[idx])->vVAL;
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 V("hello") = 5;
 V("gotta") = 10;
 V("all") = V("hello") + V("gotta");
 Caption = IntToStr(V("all"));
}

повторяю тебя - "лучше использовать свои мозги, чем чужой бредовый код"


--------------------
"Нет ничего более постоянного, чем временное"
PM MAIL   Вверх
HexoGenus
Дата 18.11.2002, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Экс. модератор
Сообщений: 110
Регистрация: 28.8.2002
Где: Ростов-на-Дону

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



Цитата(Fantasist @ 17.11.2002, 02:14)
Ага. Что-то за супер задача у тебя? Тогда вот что - пиши лучше сразу новый язык и интерпритатор/компилятор к нему. Будет он делать все что ты захочешь. А что такое "алгоритмы-интерпритаторы входящих команд" непонял.

Алгоритмы-интерпритаторы входящих команд???
Например программка администрирования другого компа работающая по сети в режиме приема команд с удаленной консоли...


>>Попробуй при помощи отладчика отследи как выполняется приложение на ?>>машине в другой части города??? или хотя бы в соседней аудитории...
Цитата

Вполне. Если есть соответствующий доступ по сети. Но это очень редкий случай.

Еще раз убеждаюсь что многие вопросы рождаются от недостатка академических знаний... ну не пользуюсь я отладчиком... знаю что полезная штука... но обычно встраиваю свои следящие функции которые мне текущие значения переменных и различные состояния программы на разных этапах ее выполнения сообщают...
Я даже и не подозревал что можно программу запустить на другом компьютере и пользуясь отладчиком прямо со своего компьютера отследить ход ее выполнения ...
Цитата

Это совсем, НЕ глобальные переменные. Сама форма может быть глобальной переменной, но я могу написать отдельный класс формы, и использовать там те же имена для переменных. Какое тогда имя выбирать? Внутри функций я тоже могу те же имена использовать.


:-) Да кто говорит обо всех переменных...
Мы тут немножко на разных языках говорим ...

Ты пытаешься мне объяснить что есть море переменных имя которых вообще не имеет значения так как само существование этих переменных может быть мгновенным ... кто же спорит ...

А я хотел бы больше узнать о тех переменных к которым можно было бы  обратится по их относительному имени например Form1->intMyDay
(Насколько я помню в Билдере можно кое-что в ходе выполнения программы заставить идентифицировать себя <например можно у Edit1 выпытать что он помещен на Form32>... т.е. сообщить свое имя... может и с переменными которые регистрируются в классе компонента тоже так??? получают они какое-то имя???)

Почему мне интересен вопрос о публичных свойствах компонентов...
Хотелось бы иметь возможность получить список имен публичных свойств компонентов в процессе выполнения программы, тогда можно было бы написать что то вроде собственного инспектора объектов который будет обновляться по таймеру в ходе выполнения программы, и что бы этому инспектору достаточно было сообщить имя отслеживаемого компонента а он все остальное уже выискивал бы сам...

Большое спасибо за код который ты привел... возьму кружку кофе побольше и сяду сегодня разбираться....  ;-)
--------------------
Когда невозможно уже работать напряженнее, начни работать умнее.
PM MAIL WWW ICQ   Вверх
man2002ua
Дата 18.11.2002, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



для гурманов, к-е будут использовать подобный код далее - с Variant работать прикольнее (использовать все возможности C++ и BCB по максимуму):

TStringList *VALS;
typedef struct vINT{
 Variant vVAL;
}vINT, *LPvINT;

Variant& V(char *s)
{
 if(!VALS) VALS = new TStringList;
 int idx = VALS->IndexOf(s);
 if(idx == -1) idx = VALS->AddObject(s,(TObject*)(new LPvINT));
 return LPvINT(VALS->Objects[idx])->vVAL;
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 V("hello") = "XpeH ";
 V("gotta") = "BaM";
 V("all") = V("hello") + V("gotta");
 Caption = V("all");
}


--------------------
"Нет ничего более постоянного, чем временное"
PM MAIL   Вверх
Fantasist
Дата 19.11.2002, 05:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


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

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



Цитата
Оценивай...


Ну, сам попросил.  :)

Цитата
ВОТ ЭТО МОЁ


Неправда. Вместо std::map ты использовал VCL-ный TStringList.  Простенькая процедурка, которую ты написал не тянет на написание собственного контейнера. Довольно забавно, что ты утверждаешь, что STL - это "чужой глючный код", а VCL - это "свои мозги". :)

Цитата
На С++ можно тоже запросто


Неправильно - в стандартной библиотеке C++ нет TStringList. А значит так можно отлько в Builder'e.

Цитата

typedef struct vINT{
int vVAL;
}vINT, *LPvINT;


Зачем это извращение для int? Для int можно вообще написать:
Код

...
if(idx == -1) idx = VALS->AddObject(s,0);
return (int)(VALS->Objects[idx]);


Хотя теоретически это непереносимо - размер указателя и размер int на некоторых платформах различаются. Хотя не слышал о таком, чтобы указателя не хватило для хранения int.
Если для чего-то по более чем int, то можно было так:
Код

...
if(idx == -1) idx = VALS->AddObject(s,new float);
return *((float*)(VALS->Objects[idx]));


 Далее - код абсолютно не инкапсулирован. Непонятно, когда надо удалять VALS, кто это должен делать. Переменную VALS нетяжело случайно запортить, так как она открыта всем. Использование глобальных переменных и функций в таком деле просто не допустимо. Если ты попробуешь написать нормальную программу при таком подходе(как минимум с десяток отдельных модулей и 10000 строк в сумме - считается небольшой проект), быстро поймешь о чем я говорю. ООП как раз придумали, чтобы так не делать.
 Код очень не эффективен. Ты ведь даже не потрудился создать список отсортированным, для ускорения поиска. С типизацией плохо. Если я захочу сделать такую вещь для разных типов, придется создавать несколько переменных и функций. Если сделать Variant станет не намного лучше. Операции с variant достадочно долгие и занимает она много места. Что за данные хранятся там по коду сказать тяжело - читабельность падает, использование усложняется. Уж не говоря о том, что в С++ нету variant - это извращения Borland'a.

Как бы это могло выглядеть:
Код

template <typename Type>
class DummyStringMap
{
private:
 TStringList list;
public:
  DummyStringMap() {list.sorted=true;};
  virtual ~DummyStringMap()
  {for (int i=0; i<list.count; ++i)
      delete reintrepret_cast<Type*>(list.Objects[i]);
  };

  bool Find(string s, int& index)
  {
     if (list.Find(s,index)) return true;
     return false;
  };

  void Delete(int index)
  {
     Type obj=reintrepret_cast<Type*>(list.Objects[index]);
     delete obj;
     list.Delete(index)
  };

  Type& operator[string s]
  {
     int i;
     if (list.Find(s,i)) return *(reintrepret_cast<Type*>(list.Objects[i]));
     Type *NewVal=new Type;
     list.AddObject(s,NewVal);
     return *NewVal;
  };
};


Хотя, конечно, по функциональности и эффективности до std::map все-равно далеко. Не говоря уж о не переносимости.

Так что лучше использовать свои мозги. И если их использовать, то они тебе подскажут, что труд умнейших людей в течении нескольких лет, и признание и использование этого труда во всем мире, стоят очень не мало.


--------------------
Волны гасят ветер...
PM MAIL   Вверх
Fantasist
Дата 19.11.2002, 05:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


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

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



Цитата
Почему мне интересен вопрос о публичных свойствах компонентов...
Хотелось бы иметь возможность получить список имен публичных свойств компонентов в процессе выполнения программы, тогда можно было бы написать что то вроде собственного инспектора объектов который будет обновляться по таймеру в ходе выполнения программы, и что бы этому инспектору достаточно было сообщить имя отслеживаемого компонента а он все остальное уже выискивал бы сам


То есть ты хочешь сделать удаленный инспектор объектов времени исполнения?
Хм... Идея интересная.  :)  Можно и подумать.  Таймер тут не годиться, перменная может менятся и использоваться гораздо чаще.


--------------------
Волны гасят ветер...
PM MAIL   Вверх
man2002ua
Дата 19.11.2002, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



:bored
Речь шла не об удобстве, скорости, оптимальности, а о возможности это сделать...Причем TStringList я для себя уже давно сделал на C++ (вот тут и сортировка и оптимизация и отдельная библиотека). Этот же код не пригодится (пока), чтобы его оптимизировать или формировать класс для него.


--------------------
"Нет ничего более постоянного, чем временное"
PM MAIL   Вверх
Vyacheslav
Дата 19.11.2002, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Цитата(HexoGenus @ 18.11.2002, 15:32)
Хотелось бы иметь возможность получить список имен публичных свойств компонентов в процессе выполнения программы

Без проблем. Правда могут быть ошибки. Пишу влет, без проверки
Итак получение списка  опубликованных свойств из серии " Не просто - а очень просто". Неужели я это забыл вставить в FAQ?
Код

#include <typinfo.hpp>
class TForm1 : public TForm
{
published: // IDE-managed Components
   TListBox *ListBox1;
   TBitBtn *BitBtn1;
   void fastcall BitBtn1Click(TObject *Sender);
private: // User declarations
public: // User declarations
   fastcall TForm1(TComponent* Owner);
};

void  fastcall TForm1::BitBtn1Click(TObject *Sender)
{
//задаем все то, что хотим иметь в списке
Typinfo::TTypeKinds SupportKinds;
         SupportKinds << tkUnknown << tkInteger << tkChar << tkEnumeration << tkFloat << tkString<< tkSet<< tkClass<<tkWChar<<tkLString<<tkWString<< tkVariant<<tkArray<<tkRecord<< tkInt64<<tkDynArray;
 for(int i = 0; i < ComponentCount; ++i)
 {
   TComponent* Component = Components[i];
   Typinfo::TPropList pList;
   int nPropCount = GetPropList((Typinfo::PTypeInfo)(Component->ClassInfo()),
                                 SupportKinds,
                                ((Typinfo::PPropList)(&pList)));
  for( int j = 0; j < nPropCount;  j++)
  {
    ListBox1->Items->Add(Component->Name + "->"+ pList[j]->Name);
  }
 }
}

Да , небольшое замечание. Это работает в 5-ом Builder , в 6--ом линкер отругается на GetPropList   (баг). Его можно обойти, если вызов  GetPropList обернуть в паскалевскую функцию




--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
dim
Дата 19.11.2002, 23:17 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











2 man2002ua
Цитата

Речь шла не об удобстве, скорости, оптимальности, а о возможности это сделать...Причем TStringList я для себя уже давно сделал на C++ (вот тут и сортировка и оптимизация и отдельная библиотека). Этот же код не пригодится (пока), чтобы его оптимизировать или формировать класс для него.

Напиши пару более менее серьезных проектов, требующих хорошей устойчивости и сопроводимости и ты поймешь о чем говорил Fantasist.
  Вверх
man2002ua
Дата 19.11.2002, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



dim, при написании vxd устойчивость и надежность прежде всего... Большие проекты я тоже писал (правда на С и др.языке, а не VС++). Что я должен понять?


--------------------
"Нет ничего более постоянного, чем временное"
PM MAIL   Вверх
Vyacheslav
Дата 19.11.2002, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Ай-яй-яй. Кое-кто FAQ читать не умеет. А я уж испугался.
Как получить список свойств компонента, RTTI


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Fantasist
Дата 20.11.2002, 01:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


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

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



Цитата
Без проблем. Правда могут быть ошибки. Пишу влет, без проверки


Так я же говорю, открываешь исходник TWriter.WriteComponentProperties, там-то должно быть без ошибок. Или исходники VCL на паскале и для Builder'a?

Цитата(Vyacheslav @ 19.11.2002, 15:27)
Ай-яй-яй. Кое-кто FAQ читать не умеет. А я уж испугался.
Как получить список свойств компонента, RTTI

Ага, а я думал у нас это только в FAQ по Делфи есть. А оно интересно там есть?  :)
Кстати, RTTI не генерируется по умолчанию для классов наследуемых от TObject. Для не наследуемых... Да а вот и нтересно, как Borland совмещает свою RTTI с С++-шной?


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


Лентяй
***


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

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



Цитата(man2002ua @ 19.11.2002, 10:56)
Причем TStringList я для себя уже давно Речь шла не об удобстве, скорости, оптимальности, а о возможности это сделать...


Нет.  Во-первых, речь шла о том, что ты все напишишь сам целиком - этого мы не увидели.  Во-вторых, речь шла о том, что ты сам можешь сделать это лучше, чем стандартная библиотека - этого тоже не было. А сделать-то, конечно, возможно, как-то глупо об этом было бы спорить после того,как  мы имеем столько готовых библиотек. Но сделать еще не достадочно, важно как сделать. Чтобы это можно было использовать.

Цитата(man2002ua @ 19.11.2002, 10:56)
Причем TStringList я для себя уже давно сделал на C++ (вот тут и сортировка и оптимизация и отдельная библиотека).

Давай покажи.  :)
Ты все-таки считаешь, что сумел сделать это лучше, чем люди которые этим занимаются много лет? Уверен, что нет.


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


Опытный
**


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

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



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


--------------------
"Нет ничего более постоянного, чем временное"
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0723 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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