c/c++ структуру переделать в php..
static struct {
byte group;
short id;
const char *name;
} items[] = {
{0x00, 0x0001, "abc"},
{0x00, 0x0002, "qaq"},
{0x00, 0x0003, "bdd"},
......
};
ну и собственно, чтобы парсер не писать, который бы её переделал под новый формат, хорошо бы способ затрагивающий только изменение заголовка (описания) структуры :D
public $group;
public $id;
public $name;
public function __construct($_group, $_id, $_name) {
$this->group = $_group;
$this->id = $_id;
$this->name = $_name;
}
};
$items = array(new CItem(0x00, 0x0001, 'abc'), new CItem(0x00, 0x002, 'qaq'), new CItem(0x00, 0x0003, 'bdd'));
А если enum какой-нибудь?
нет, проблема главным образом в том, что в оригинальный структуре под 5 тысяч элементов. Я хочу изменить заголовок:
static struct {
byte group;
short id;
const char *name;
} items[] = {
Так, чтобы эту структуру (массив, enum) стал воспринимать php. Без правки последующих элементов структуры.. ну в кратце, чтобы я без всяких парсеров эту структуру мог переделать под php. Такое возможно?
можно наверное как-нибудь так:
public static $items = array();
public function add($item) {
$this->items[] = $item;
}
}
$test = new CItem();
$test->add(array(0x00, 0x0001, 'abc'));
$test->add(array(0x00, 0x0002, "qaq"));
$test->add(array(0x00, 0x0003, "bdd"));
в такой форме уже можно пройти Find/Replace'ом по сишному коду (заменить в куске данных { на $test->add(array( а } на )); )
Такое возможно?
[/QUOTE]
Боюсь, что нет. В PHP нет таких инициализаторов, как в C / C++. Легче переделать инициализацию:
$php_initialization_string = preg_replace('#\{([^,]+),\s*([^,]+),\s*([^,]+)\}#Usi', 'new CItem(\1, \2, \3)', $cpp_initialization_string);
И подставлять результат в тот вариант, который я вам написал.
Чего-чего?
Я так полагаю, это была сокращенная версия фразы "Да, я согласна с Alexander92 и Mr.Hacker". :D
$php_initialization_string = preg_replace('#\{([^,]+),\s*([^,]+),\s*([^,]+)\}#Usi', 'new CItem(\1, \2, \3)', $cpp_initialization_string);
И подставлять результат в тот вариант, который я вам написал.
правильно ли я понял, что этот код даёт строку, которую мне надо вывести на экран и затем вставить в код выше? Т.е. это парсер для моей структуры? :)
а этот код, в свою очередь, генерируется приведенным парсером.
а этот код, в свою очередь, генерируется приведенным парсером.
да, спасибо! Получилось!
Правда появилась новая проблема.. массив огромный и я решил вставить его в другой файл items.php:
Class CItem {
var $group;
var $id;
var $name;
function __construct($_group, $_id, $_name) {
$this->group = $_group;
$this->id = $_id;
$this->name = $_name;
}
};
$items = array(new CItem(0x00, 0x0001.........
В своём же файле:
require_once($path . "/modules/items.php");
....
и в теле моего файла $items массив классов всё равно оказывается невидимым! Пробовал и include, и require(), одна фигня. Пишу:
echo $items[0]->id;
ничего на экран не выводится.. ну и по логике работы скрипта видно, что $items не определена. При этом, если вставить в мой файл описание класса, php выдаёт, что класс уже определён. Что за? Может я не так к элементам массивов обращаюсь?
Class CItem {
public $group;
public $id;
public $name;
....
и получаю ошибку:
Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in /modules/items.php on line 3