C/400

69. 可変長フィールドを C/400 で使用するには ?

C/400 で外部記述としてデータ・ベースを処理しているときに、可変長フィールドを
使用するためには少しばかりの修正を必要とする。
例えば 商品マスター QTRFIL/SHOHIN を扱うときには

    #include <recio.h>
      :
    #pragma mapinc("SHOHIN", "QTRFIL/SHOHIN(SHOHINR)", "both", "d",,""         ) 
    #include "SHOHIN"                                                         
      :
    _RFILE *SHOREC;
    SHOREC_both_t  SHO_REC;
      :
      :
    memcpy(SHOREC.SHNAME, "蛍光灯スタンド", 16); ・・・@

のような記述を行うはずである。
ところが商品マスター SHOHIN の商品名 : SHNAME を次のように可変長フィールドとして
定義していると、この演算はコンパイル・エラーとなってしまう。

    A            SHNAME      1024O         COLHDG(' 商品名 ')
    A                                      VARLEN(24)

この記述はフィールド SHNAME は最初は 24バイトとして確保されているが
1024 バイトまで拡張可能な可変長フィールドであることを意味している。
SHNAME が固定長フィールドであれば @ の演算は問題ないが SHNAME が可変長フィールドである場合は
コンパイル・エラーとなっしまう。
なぜならば可変長フィールド SHANEM

        struct { short len;
                 char data[1024]
                } SHNAME;

として定義されているからである。ここで shirt len はデータの長さである。
データ部分はつねに data という名前で定義されている。
従って @ の演算命令は

     memcpy(SHOREC.data.SHNAME, "蛍光灯スタンド", 16); 

と記述しなければならない。