gpt4 book ai didi

c - 在 C 中实现 COBOL REDEFINES

转载 作者:行者123 更新时间:2023-12-04 12:30:10 27 4
gpt4 key购买 nike

我正在尝试用 C 语言实现 COBOL 中使用的 REDEFINES 逻辑。

下面是 COBOL 程序:

   IDENTIFICATION DIVISION.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.

01 DATE-MMDDYY.
10 DATE-MM PIC 9(02).
10 DATE-DD PIC 9(02).
10 DATE-YY PIC 9(02).
01 SYSTEM-DATE-MMDDYY REDEFINES DATE-MMDDYY PIC X(6).

PROCEDURE DIVISION.

MOVE '011817' TO SYSTEM-DATE-MMDDYY.
DISPLAY 'SYSTEM-DATE-MMDDYY: ' SYSTEM-DATE-MMDDYY.
DISPLAY 'DATE-MM: ' DATE-MM.
DISPLAY 'DATE-DD: ' DATE-DD.
DISPLAY 'DATE-YY: ' DATE-YY.

DISPLAY 'CHANGING DATE-YY = 18'
MOVE '18' TO DATE-YY.
DISPLAY 'New SYSTEM-DATE-MMDDYY: ' SYSTEM-DATE-MMDDYY.

STOP RUN.

下面是上面程序的执行:

SYSTEM-DATE-MMDDYY: 011817
DATE-MM: 01
DATE-DD: 18
DATE-YY: 17
CHANGING DATE-YY = 18
New SYSTEM-DATE-MMDDYY: 011818

我知道 C 中的 UNION 可以用来实现类似的事情。但这对我不起作用。

下面是我写的C程序:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

union redef
{
struct date_mmddyy{
char date_mm[2];
char date_dd[2];
char date_yy[2];
}date_mmddyy;
char system_date_mmddyy[6];
};
typedef union redef redef;
int main(){
redef redef;
strcpy(redef.date_mmddyy.date_mm, "01");
strcpy(redef.date_mmddyy.date_dd, "18");
strcpy(redef.date_mmddyy.date_yy, "17");
printf("%s\n",redef.date_mmddyy.date_mm);
printf("%s\n",redef.date_mmddyy.date_dd);
printf("%s\n",redef.date_mmddyy.date_yy);
printf("%s\n",redef.system_date_mmddyy);

strcpy(redef.system_date_mmddyy, "021918");
printf("%s\n",redef.date_mmddyy.date_mm);
printf("%s\n",redef.date_mmddyy.date_dd);
printf("%s\n",redef.date_mmddyy.date_yy);
printf("%s\n",redef.system_date_mmddyy);

return 0;
}

运行如下:

011817
1817
17
011817
021918
1918
18
021918

你能分享一些想法吗?

更新 1:

我现在已经用 \0 终止了所有字符数组。下面是更改后的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

union redef
{
struct date_mmddyy{
char date_mm[3];
char date_dd[3];
char date_yy[3];
}date_mmddyy;
char system_date_mmddyy[7];
};
typedef union redef redef;
int main(){
redef redef;
redef.date_mmddyy.date_mm[2] = '\0';
redef.date_mmddyy.date_dd[2] = '\0';
redef.date_mmddyy.date_yy[2] = '\0';
redef.system_date_mmddyy[6] = '\0';

strcpy(redef.date_mmddyy.date_mm, "01");
strcpy(redef.date_mmddyy.date_dd, "18");
strcpy(redef.date_mmddyy.date_yy, "17");
printf("%s\n",redef.date_mmddyy.date_mm);
printf("%s\n",redef.date_mmddyy.date_dd);
printf("%s\n",redef.date_mmddyy.date_yy);
printf("%s\n",redef.system_date_mmddyy);

strcpy(redef.system_date_mmddyy, "021918");
printf("%s\n",redef.date_mmddyy.date_mm);
printf("%s\n",redef.date_mmddyy.date_dd);
printf("%s\n",redef.date_mmddyy.date_yy);
printf("%s\n",redef.system_date_mmddyy);

return 0;
}

下面是执行:

01
18
17
01
021918
918

021918

输出与 COBOL 中的输出相去甚远。

最佳答案

如果您想在 C 语言中使用来自 COBOL 的 REDEFINE 逻辑,只有一个选择:不要将 C 字符串用于 COBOL 存储,因为 COBOL 数据仅使用字符数组存储数据结构。和:注意structure padding (对于任何未声明为 PIC X 的项目)!

这会导致类似的事情

#include <stdio.h>

union redef
{
struct date_mmddyy{
char date_mm[2];
char date_dd[2];
char date_yy[2];
}date_mmddyy;
char system_date_mmddyy[6];
};
typedef union redef redef;
int main(){
redef redef;
redef.date_mmddyy.date_mm[0] = '0';
redef.date_mmddyy.date_mm[1] = '1';
redef.date_mmddyy.date_dd[0] = '1';
redef.date_mmddyy.date_dd[1] = '8';
redef.date_mmddyy.date_yy[0] = '1';
redef.date_mmddyy.date_yy[1] = '7';
// or:
memcpy((void *)redef.date_mmddyy, (void *)"011817", 6);

printf("%c%c\n",redef.date_mmddyy.date_mm[0],
redef.date_mmddyy.date_mm[1]);
[...]

要使其实际可用,您可能会使用两件事:

  • 除了包含数据的结构外,还添加了一个至少包含指向存储、大小和类型的指针的字段结构(在您的示例中,“x”和“numeric-display”就足够了
  • 添加辅助函数以设置/获取字段值

有点像

#include <stdio.h>

enum cob_type {
T_DISPLAY = 0,
T_NUMERIC_DISPLAY
};

struct cob_field{
char *data;
int size;
enum cob_type;
};

/* one for the actual storage - could be a simple unnamed char array */
struct date_mmddyy{
char date_mm[2];
char date_dd[2];
char date_yy[2];
} date_mmddyy;

/* fields with pointers to the storage and the size */
cob_field date_mmddyy = {&date_mmddyy, 6, T_DISPLAY};
cob_field date_mm = {&date_mmddyy.date_mm, 2, T_NUMERIC_DISPLAY};
cob_field date_dd = {&date_mmddyy.date_dd, 2, T_NUMERIC_DISPLAY};
cob_field date_yy = {&date_mmddyy.date_yy, 2, T_NUMERIC_DISPLAY};
cob_field system_date_mmddyy = {&date_mmddyy, 6, T_DISPLAY};

int main(){
set_field_data(system_date_mmddyy, "011817");
printf("SYSTEM-DATE-MMDDYY: %s\n', get_field_data(system_date_mmddyy));
printf("DATE-MM: %s\n', get_field_data(date_mm));
printf("DATE-DD: %s\n', get_field_data(date_dd));
printf("DATE-YY: %s\n', get_field_data(date_yy));

puts("CHANGING DATE-YY = 18");
set_field_data(date_yy, "18");
printf("SYSTEM-DATE-MMDDYY: %s\n', get_field_data(system_date_mmddyy));

return 0;
}

鉴于 COBOL 有许多不同的类型,您需要在辅助函数中编写大量逻辑 - 这里需要的那些 void set_field (cob_field *f, char *data) char *get_field (cob_field *f) 非常简单,当使用 COBOL 具有的所有类型时,这会发生变化,当使用超过 MOVE 从文字(添加隐式类型转换)和显示

顺便说一句:您可能需要查看 GnuCOBOL - 它将 COBOL 翻译成 C...

关于c - 在 C 中实现 COBOL REDEFINES,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41724735/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com