Модераторы: 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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.1122 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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