Интерпретировать строку так, как она ссылается на переменную в программе. Geant4 единиц - PullRequest
0 голосов
/ 29 декабря 2010

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

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

То, что я хотел бы сделать, этополучить строку, которая описывает единицу измерения из текстового файла, и каким-то образом сопоставить ее с фактической переменной с тем же именем, чтобы я мог выполнить преобразование.Есть ли способ взломать и урезать это, или это абсолютно невозможно (или почти невозможно)?

Конечно, я мог бы заставить людей конвертировать во внутренние единицы для всех своих записей в базе данных, но это могло быбыстро становиться уродливым и быть большим источником трудно отслеживаемой ошибки (15 знаков до десятичной точки очень похожи на 14).

Спасибо

1 Ответ

1 голос
/ 29 декабря 2010

Сложно ответить, частично потому, что я никогда не использовал (или не слышал раньше) Geant4, и частично потому, что не совсем понятно, что вы пытаетесь сделать: вы делаете библиотеку C ++ для своих коллег, чтобыиспользовать напрямую?Или вы делаете какой-то инструмент, который ваши коллеги могут использовать, не касаясь С ++?

Тем не менее, я постараюсь ответить как можно лучше.

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

Однако вам не обязательно создавать эту таблицу сопоставления вручную.Информация должна присутствовать в заголовочном файле Geant4, который определяет единицы измерения, чтобы вы могли написать инструмент (взломать и косую черту, как вы выразились), чтобы прочитать этот заголовочный файл и сгенерировать код для таблицы сопоставления.

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

Хотя я немного здесь остановлюсь.Быстрый поиск в Google по Geant4 и чрезвычайно беглый поиск по первому найденному мною исходному коду приводит меня к двум соответствующим файлам: SystemOfUnits.h и G4UnitsTable.hh .

Я отмечаю, что 2 обеспечивает именно то, что вы можете захотеть отобразить в соответствии с именем, но я не знаю, как оно связано с остальной частью системы и, следовательно, является ли оно релевантным.

Если 1 является релевантным заголовком, то, очевидно, определения единиц измерения являются наиболее простыми из возможных: то есть коэффициенты масштабирования до базовых единиц.Если это так, то нет особой причины, по которой ваш файл базы данных материалов не должен также содержать определения единиц аналогичного вида (то есть загружать таблицу сопоставления из того же места, где вы загружаете определения материалов), что позволило быВаши коллеги могут добавлять новые единицы по мере необходимости.

Существует одна последняя возможность, которую я мог бы упомянуть, а именно то, что при подсчете десятичных цифр, я согласен, крайне предрасположен к ошибкам, если вы разрешаете представлять значения в научныхобозначения тогда большая часть этой проблемы уходит.Поэтому, возможно, самое простое решение - попросить ваших коллег использовать базовые единицы Geant4, и если они хотят указать значение, скажем, 5 км, они должны указать его как 5e6 (поскольку базовая единица Geant4 для длины - это миллиметр).согласно 1 ).

...