2013-06-23 6 views
3

У меня есть следующие CORBA IDL-3.2, который пытается объявить взаимно рекурсивную структуру:Как объявить/использовать прямую ссылку на struct в CORBA IDL?

module SE 
{ 
    interface SE 
    { 

typedef unsigned short MenuItemID; // a small integer representing a unique menu item 

enum MenuSubaction { CollectCharacter, CollectStruct }; 

struct MenuItemAction; // forward declaration 

union MenuSubactionParameter switch (MenuSubaction) 
{ case CollectStruct: MenuItemAction sub_structure; // <<<<<<<<< use of forward 
}; 

struct MenuItemAction { MenuSubaction menu_subaction; 
       MenuSubactionParameter menu_subaction_parameter; 
       }; 
    }; // interface 
}; // module 

я получаю жалобы от Sun JDK 1.7 idlj на линии, отмеченные < < < < <

... SE.idl (line xx): Illegal reference to incomplete forward declaration of type MenuItemAction. 

Примечание: это не декларация «прямого интерфейса».

Что такое «неполная декларация вперед»? (Если вы успешно объявили в качестве прямого объявления, я бы не подумал, что форвардное объявление как неполное, просто еще не определено. Возможно, это просто неверно истолкованная фраза).

Что еще более важно, как мне определить свою рекурсивную структуру?

Я новичок в CORBA, поэтому я не знаю: -} знаю, что я делаю. Я не понимаю, почему CORBA не может определить такие рекурсивные структуры; один передает конкретный экземпляр, который не будет рекурсивным. В частности, это формирует дерево, которое должно быть «легко» для отправки CORBA.

EDIT: Брайан имел правильный ответ. Мне нужно заменить прямое упоминание о прямой ссылке,

  MenuItemAction sub_structure 

с

  sequence<MenuItemAction> sub_structure> 
+0

Я не подумайте, что у вас может быть модуль и интерфейс с тем же именем. В вашем IDL также отсутствуют некоторые закрывающие фигурные скобки. Можете ли вы очистить код? –

+0

Я попытался опубликовать ответ, но мои знания об этой области немного растянуты. Тем временем вы можете проверить эту ссылку, это может быть полезно. http://sandeshudupa.blogspot.com/2006/04/structure-declaration-in-idl-and-its-c.html –

+0

http://www.cs.uic.edu/~troy/fall04/cs441/drake /CORBA.html говорит: «IDL поддерживает прямое объявление построенных типов, например struct Point;». Ваша ссылка также показывает, что это действительно, по крайней мере, в последовательности . Я не могу себе представить, могут ли они поддерживать Sequence , они не могут поддерживать последовательность точно * одного * элемента и, следовательно, непосредственно структуру. –

ответ

1

Вы можете перенаправить декларирование структур, но существует множество ограничений.

Edit: Я не знаю, какая версия CORBA вы используете, но в 2.6.1 specification говорится в разделе 3.10.2.3 (курсив мой):

Синтаксис IDL позволяет генерировать рекурсивные структуры и союзов через членов , которые имеют тип последовательности.

И позже:

IDL поддерживает рекурсивных типов через упреждающее объявление для структур и объединений (а также для типы значений).

И позже:

Неполный типа может появиться только как тип элемента последовательности определения. Последовательность с неполным типом элемента называется неполным типом последовательности .

Неполный тип последовательности может отображаться только как тип элемента другой последовательности, или как тип члена структуры или определения объединения.

Пример:

struct Foo; // Forward declaration; Foo is incomplete 
typedef sequence<Foo> FooSeq; // incomplete sequence type 
struct Foo { 
    long value; 
    FooSeq chain; // incomplete seq. type used as struct member; OK 
}; 

Гораздо больше информации можно найти в ссылке, в том числе это пример, который может быть ближе к тому, что вы хотите сделать:

union Bar; // Forward declaration 
typedef sequence<Bar> BarSeq; 

union Bar switch(long) { // Define incomplete union 
    case 0: 
     long l_mem; 
    case 1: 
    struct Foo { 
     double d_mem; 
     BarSeq nested; // OK, recurse on enclosing 
        // incomplete type 
    } s_mem; 
}; 
+0

Я попробую это просто, чтобы увидеть работу с прямым текстом, но вы правы, это не то, что я хочу. Существует много фактов о том, как интерфейсы могут иметь передовые декларации; structs (с моей точки зрения, похожие на C++), являются лишь слабыми объектами/интерфейсами. Я предполагаю, что понятие вложенной struct-as-value должно быть запрещено; что создало бы бесконечно большую структуру данных, поэтому нужно использовать struct-as-reference (как это работает на C), и это невозможно сказать в IDL напрямую. Вероятно, именно поэтому интерфейсы отличаются от структур; они эффективно рассматриваются как ссылки ... –

+0

... и, возможно, это оправдание для последовательности . –

+0

Мне нужно подождать до завтра, чтобы проверить это, я не на моей системе dev. –

1

Вроде бы известная ошибка «4754974: idlj не поддерживают вперед декларацию структуры и союзов»: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4754974

после комментариев выше я опробовал:

module SE 
{ 
    interface SE 
    { 

    typedef unsigned short MenuItemID; // a small integer representing a unique menu item 

    enum MenuSubaction { CollectCharacter, CollectStruct }; 

    struct MenuItemAction; // forward declaration 

    union MenuSubactionParameter switch (MenuSubaction) 
    { 
     case CollectStruct: sequence<MenuItemAction> sub_structure; // <<<<<<<<< use of forward 
    }; 

    struct MenuItemAction { 
     MenuSubaction menu_subaction; 
     MenuSubactionParameter menu_subaction_parameter; 
    }; 
}; // interface 

, который работает. В конечном итоге вы получите последовательность, а не одну запись, но в целях, которые могут быть непонятными.

+0

Этот отчет об ошибке немного интересен, но он датируется 2002 годом, поэтому времени было исправлено, и в 2004 году он был отмечен как «разрешенный». Приятно попробовать. –

+0

структура опережающие ссылки даже не совместимые с CORBA IDL синтаксиса правил см 50 в http://www.sce.carleton.ca/netmanage/corba/idlsyn.htm (50) :: = «структура» " {""} " Я знаю, что IBM была в числе первых поставщиков, игнорирующих этот факт. Солнце, похоже, пробовало то же самое. –

+0

Я не уверен, что понял то, что вы только что сказали мне. Вы говорите, что объявление прямой ссылки в моем приведенном примере верное? idlj не возражает против него; он будет позже. Ваш пример синтаксиса структуры выглядит отлично ... для объявления полной структуры; зачем нужно все это для форвардной декларации, где нужно оставить это вещество? «Я знаю, что IBM ... игнорирует этот (что?) Факт». –

Смежные вопросы