Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

c/c++ структуру переделать в php..

318
27 июля 2011 года
nof
193 / / 03.04.2006
ребят, я начинающий в пхп и вот требуется переделать структуру с содержимым из моей прошлой с++ программы в php скрипт. Структура выглядит так:

static struct {
byte group;
short id;
const char *name;
} items[] = {
{0x00, 0x0001, "abc"},
{0x00, 0x0002, "qaq"},
{0x00, 0x0003, "bdd"},
......
};

ну и собственно, чтобы парсер не писать, который бы её переделал под новый формат, хорошо бы способ затрагивающий только изменение заголовка (описания) структуры :D
278
27 июля 2011 года
Alexander92
1.1K / / 04.08.2008
Ну структур как таковых в PHP нет, только классы.
Код:
class CItem {
  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'));
318
27 июля 2011 года
nof
193 / / 03.04.2006
уууу там элементов тысяч 5. Это не пойдёт..
А если enum какой-нибудь?
278
27 июля 2011 года
Alexander92
1.1K / / 04.08.2008
Ну я строго перевел то, что вы написали. :) Какой enum вы хотите, что вам перечислять нужно?
318
27 июля 2011 года
nof
193 / / 03.04.2006
Цитата: Alexander92
Ну я строго перевел то, что вы написали. :) Какой enum вы хотите, что вам перечислять нужно?


нет, проблема главным образом в том, что в оригинальный структуре под 5 тысяч элементов. Я хочу изменить заголовок:
static struct {
byte group;
short id;
const char *name;
} items[] = {
Так, чтобы эту структуру (массив, enum) стал воспринимать php. Без правки последующих элементов структуры.. ну в кратце, чтобы я без всяких парсеров эту структуру мог переделать под php. Такое возможно?

271
27 июля 2011 года
MrXaK
721 / / 31.12.2002
PHP не понимает короткую запись {}, а также там нельзя так присваивать значения классу, так если вы хотели Ctrl+C/Ctrl+V перенести сишную структуру в пхп, изменив только хедер, то не получится..
можно наверное как-нибудь так:
 
Код:
class CItem {
  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( а } на )); )
278
27 июля 2011 года
Alexander92
1.1K / / 04.08.2008
[QUOTE=nof]
Такое возможно?
[/QUOTE]
Боюсь, что нет. В PHP нет таких инициализаторов, как в C / C++. Легче переделать инициализацию:

 
Код:
$cpp_initialization_string = '{0x00, 0x0001, "abc"}, {0x00, 0x0002, "qaq"}, {0x00, 0x0003, "bdd"}';
$php_initialization_string = preg_replace('#\{([^,]+),\s*([^,]+),\s*([^,]+)\}#Usi', 'new CItem(\1, \2, \3)', $cpp_initialization_string);


И подставлять результат в тот вариант, который я вам написал.
74K
27 июля 2011 года
julia90
1 / / 27.07.2011
+1 в РНР не будут инициализаторы
366
28 июля 2011 года
int
668 / / 30.03.2005
Цитата: julia90
+1 в РНР не будут инициализаторы

Чего-чего?

278
28 июля 2011 года
Alexander92
1.1K / / 04.08.2008
Цитата: int
Чего-чего?


Я так полагаю, это была сокращенная версия фразы "Да, я согласна с Alexander92 и Mr.Hacker". :D

318
28 июля 2011 года
nof
193 / / 03.04.2006
Цитата: Alexander92
Боюсь, что нет. В PHP нет таких инициализаторов, как в C / C++. Легче переделать инициализацию:

 
Код:
$cpp_initialization_string = '{0x00, 0x0001, "abc"}, {0x00, 0x0002, "qaq"}, {0x00, 0x0003, "bdd"}';
$php_initialization_string = preg_replace('#\{([^,]+),\s*([^,]+),\s*([^,]+)\}#Usi', 'new CItem(\1, \2, \3)', $cpp_initialization_string);


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


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

278
28 июля 2011 года
Alexander92
1.1K / / 04.08.2008
Ну по сути - да. :) Только вместо заголовка структуры вы пишете класс, а вместо инициализаторов вставляете строку вида
 
Код:
$items = array(new CItem(......), new CItem(.....), ...);
,
а этот код, в свою очередь, генерируется приведенным парсером.
318
28 июля 2011 года
nof
193 / / 03.04.2006
Цитата: Alexander92
Ну по сути - да. :) Только вместо заголовка структуры вы пишете класс, а вместо инициализаторов вставляете строку вида
 
Код:
$items = array(new CItem(......), new CItem(.....), ...);
,
а этот код, в свою очередь, генерируется приведенным парсером.


да, спасибо! Получилось!
Правда появилась новая проблема.. массив огромный и я решил вставить его в другой файл items.php:

Код:
<?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.........

В своём же файле:
 
Код:
<?php
require_once($path . "/modules/items.php");
....

и в теле моего файла $items массив классов всё равно оказывается невидимым! Пробовал и include, и require(), одна фигня. Пишу:
echo $items[0]->id;
ничего на экран не выводится.. ну и по логике работы скрипта видно, что $items не определена. При этом, если вставить в мой файл описание класса, php выдаёт, что класс уже определён. Что за? Может я не так к элементам массивов обращаюсь?
318
28 июля 2011 года
nof
193 / / 03.04.2006
видимо, элементы $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
278
29 июля 2011 года
Alexander92
1.1K / / 04.08.2008
Не могу смоделировать вашу ошибку, визуально все правильно. Выложите сюда оба скрипта, посмотрим.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог