2015-04-01 2 views
1

Я довольно новичок в Cobol, и мне трудно понять, как использовать структуры. Как выглядят структуры C ниже, когда они преобразуются в Cobol?Как бы эта C-структура была переведена в Cobol

Это я имею Структуры:

struct dataT 
{ 
    int m; 
}; 

struct stack 
{ 
    int top; 
    struct dataT items[STACKSIZE]; 
} st; 

Как бы это утверждение можно представить в Cobol?

st.items[st.top].m 
+0

Последняя строка в основном оценивает верхнюю часть стека, получает верхнее значение (st.top), а затем получает его из массива элементов, содержащего целые числа , –

+0

Открыть Cobol. Мне жаль, я не спрашивал, как реализовать стек. Мне хотелось знать синтаксис. Как и как эта структура и этот оператор выглядят в Cobol, так что я могу сделать остальную часть стека себе. –

+0

ОК. OpenCOBOL теперь GnuCOBOL. Если вы пойдете сюда и зададите вопрос в «Помощь при запуске», это будет гораздо лучший формат для вероятного итеративного исследования вашего вопроса. –

ответ

3

Это очень удар в темноте, так как я никогда не писал линию COBOL до сегодняшнего дня . Однако, после того, как немного googling и играя в ideone, я думаю, что я, по крайней мере захватил вкус того, что код будет выглядеть, если не фактическое решение:

IDENTIFICATION DIVISION. 
PROGRAM-ID. IDEONE. 

ENVIRONMENT DIVISION. 

DATA DIVISION. 
    WORKING-STORAGE SECTION. 
    01 WS-STACK. 
    05 WS-TOP PIC 9 VALUE 0. 
    05 WS-ITEMS OCCURS 10 TIMES INDEXED BY I. 
     10 WS-M PIC 9 VALUE 0. 

PROCEDURE DIVISION. 
    ADD 1 TO WS-TOP. 
    MOVE 9 TO WS-M(WS-TOP). 
    ADD 1 TO WS-TOP. 
    MOVE 8 to WS-M(WS-TOP). 
    DISPLAY "WS-STACK :" WS-STACK. 
    DISPLAY "WS-TOP :" WS-TOP. 
    DISPLAY "WS-ITEMS[WS-STACK.WS-TOP].M :" WS-M(WS-TOP). 
    SUBTRACT 1 FROM WS-TOP. 
    DISPLAY "WS-TOP :" WS-TOP. 
    DISPLAY "WS-ITEMS[WS-STACK.WS-TOP].M :" WS-M(WS-TOP). 
    STOP RUN. 

Да, размер hardcoded to 10 (не знаю, как делать символические константы в COBOL), и WS-TOP и WS-M могут хранить только значения от 0 до 9.

Излишне говорить, что типы данных в COBOL и C очень разные. Я не создал новый тип стека; Я объявлял отдельные элементы данных с несколькими подпозициями, одна из которых представляет собой таблицу, которая может хранить 10 экземпляров чего-то, называемого WS-M. Это фактически то же самое, как написание

int main(void) 
{ 
    int top = 10; 
    int m[10]; 

    m[--top] = 9; 
    m[--top] = 8; 

    printf("top = %d\n", top); 
    printf("m[%d] = %d", top, m[top]); 
    top++; 

    printf("top = %d\n", top); 
    printf("m[%d] = %d", top, m[top]); 
    return 0; 
} 

в С, причем основное различие в том, что я написал код C таким образом, что стек растет «вниз» (который является более естественным). Насколько я мог сказать за десять минут, проведенных в этом учебнике COBOL, COBOL на самом деле не имеет эквивалента типа struct; даже если элементы данных могут быть сгруппированы иерархически, вы не создаете новый struct или тип записи как таковой. Если бы я хотел несколько стеков, мне пришлось бы объявлять несколько отдельных резервных хранилищ и индексных переменных.

думаю.

Мне нужно будет немного почитать.


1. На данный момент в день я предпочел бы работать на только о ничего кроме проблемы передо мной прямо сейчас, и я всегда был интересен, как другая половина живет. Кроме того, я работаю над платформой онлайн-банкинга, и я знаю, что половина наших бэкэндов написана в COBOL, так что это не помешает занять время, чтобы изучить его.

2. Я не могу ручаться за качество этого урока; это первый, который я нашел, который казался достаточно полным и легким для чтения.

+0

@Quentin: помните, что это было написано общим COBOL noob, поэтому оно не является репрезентативным для правильного программирования COBOL. Я соглашусь, что COBOL не так уж и красив, но он нигде не близок, как Perl. –

+0

И я не уверен, что это будет считаться «стеком» или все массивы в C «в стеке»? К одному из ваших помощников по стандарту COBOL не имеют символических констант. Некоторые компиляторы выполняют как расширение, например номер уровня 78. Объедините это с условными директивами компилятора (опять же нестандартными), и я думаю, что это обеспечит то, что вы там хотите. Я думал, что стек отличается от массива? –

+0

@BillWoodger: см. Мое редактирование; Я выделил эквивалент C. Обратите внимание, что в этом случае мы используем массив для реализации структуры данных стека. –

0

Вы бы сделать это так:

*> Not a symbolic constant, but if it is never referenced as a 
*> target of a move/compute, the compiler should recognize that. 
*> and tune for that. 

01 Stack-Size  Pic S9(8) comp-4 Value <<some-number>>. 

*> The "comp-4" data type is a twos complement integer, S9(8) makes 
*> it a 32-bit word. Depending upon your compiler, you will sometimes 
*> see "binary" or "comp-5" 

01 My-Stack. 
    02 Stack-Top  Pic S9(8) comp-4 Value 0. 
    02 Stack-Items occurs 0 to <<some-maximum-size>> 
        depending on Stack-Size. 
*>-------* 
*> This is your data structure, if you made it a copybook, you would have 
*> the similar effect of having the struct def from the C code. You can 
*> use the copy/replacing features if you need to make multipule data 
*> items with different names. 
*> 
    03 Stack-M  Pic S9(8) comp-5. 
*>-------* 

Для доступа к текущему значению на вершине стека:

Move Stack-M (Stack-Top) to where-ever 

Некоторые полезные пункты:

Pop-Stack. 
    Move 0 to Stack-M (Stack-Top) 
    Subtract 1 from Stack-Top 
    Exit. 

Push-Stack. 
    Add 1 to Stack-Top 
    Move <<whatever value>> to Stack-M (Stack-Top) 
    Exit. 
+0

COMP-4, где COMP-4 является двоичным (не все компиляторы), является целым числом, если оно не определено с предполагаемым десятичным местом. Дополнение от двух доходит до реализации, хотя я не знаю того, что нет. COMP является еще одним двоичным. Все 'зависящие от' будут получать, проверяет границы, если они доступны, и если они включены. Это только LIFO (OP не указывал) с бит GIGO, поскольку проверка на push/pop абзацев отсутствует. Поп не должен устанавливать ноль, иначе импликация равна нулю, это недопустимое фактическое значение. CURR вместо TOP удаляет возможную путаницу в том, почему верх внизу внизу ... –

+0

TOP внизу?Stack-Items (TOP) всегда должен иметь адрес памяти, который равен или больше, чем Stack-Items (1), как это внизу? –

+0

Нет. Я могу реализовать стек как Связанный список, приобретая хранилище, когда я иду. Будет ли адрес памяти всегда быть выше по мере роста стека? Может быть, может и нет, и это неважно. Во всяком случае, возможно, для программиста на C/C++ его не смущает. Только я. Ваш POP должен предоставить данные из стека, и PUSH и POP должны выполнять проверку границ (хотя с Linked List, превышающим текущее распределение, можно просто означать «получить больше памяти»). –