Невозможно получить значение области данных, используя QXXRTVDA и инициализированные скобкой значения - PullRequest
0 голосов
/ 06 июня 2018

Я пытался сделать простой поиск значений области данных с использованием источника C отсюда: https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_71/rtref/qxxrtvd.htm

И ... код не смог выполнить определенный поиск.

Вот код:

typedef struct _DTAA_NAME_T {
   char dtaa_name[10]; /* name of data area */
   char dtaa_lib[10];  /* library that contains data area */
}_DTAA_NAME_T;

и

#include <stdio.h>
#include <xxdtaa.h>

#define DATA_AREA_LENGTH  30
#define START             6
#define LENGTH            7

int main(void)
{
  char uda_area[DATA_AREA_LENGTH];

 /* Retrieve data from user-defined data area currently in MYLIB */
  _DTAA_NAME_T dtaname = {"USRDDA    ", "MYLIB     "};

 /* Use the function to retrieve some data into uda_area.        */
  QXXRTVDA(dtaname,START,LENGTH,uda_area);

 /* Print the contents of the retrieved subset.                  */
  printf("uda_area contains %7.7s\n",uda_area);

}

В этих значениях в скобках есть несколько проблем:

_DTAA_NAME_T dtaname = {"USRDDA    ", "MYLIB     "};
  1. Значения не могут быть инициализированы с помощью 10значение символов - только 9 символов + нулевой байт.Инициализация значений, состоящих из 10 символов, приведет к ошибке компиляции.
  2. Инициализация этого значения, содержащего менее 10 символов, приведет к добавлению нулевого байта, поэтому QXXRTVDA не найдет никаких значений, как только не будет такой библиотеки с нулевым значением.окончание байта.

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

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

#include <xxdtaa.h>

main()
{
   _DTAA_NAME_T dtaara = {"ABCDEFGHIJ", "KLMNOPQRST"};
   return;
}

При отладке:

EVAL dtaara:x 20                                                       
   00000     C1C2C3C4 C5C6C7C8 C9D1D2D3 D4D5D6D7   - ABCDEFGHIJKLMNOP  
   00010     D8D9E2E3 ........ ........ ........   - QRST............  
0 голосов
/ 06 июня 2018

Обходной путь, который я нашел, состоит в том, чтобы избежать инициализации скобок и инициализировать значения с помощью прямого копирования байтов:

#include <stdio.h>
#include <xxdtaa.h>
#include <QSYSINC/MIH/CPYBLA>

#define DATA_AREA_LENGTH  30
#define START             6
#define LENGTH            7

int main(void)
{
  char uda_area[DATA_AREA_LENGTH];
  _DTAA_NAME_T dtaara;

  memset( &dtaara, ' ', sizeof(dtaara));
  cpybla( dtaara.dtaa_name, "USRDDA", 6);
  cpybla( dtaara.dtaa_lib, "MYLIB", 5);

  /* Use the function to retrieve some data into uda_area.        */
  QXXRTVDA(dtaname,START,LENGTH,uda_area);

  /* Print the contents of the retrieved subset.                  */
  printf("uda_area contains %7.7s\n",uda_area);
}

Надеюсь, что это поможет кому-то не тратить время на такие базовые вещи.

...