Remember that in "C", "strings" are NULL terminated -- make sure you "wipe
out" that null terminator when building your "key" value -- this example
shows the difference:
print qndffind.c
#include <stdio.h>
#include <string.h>
#include <mpe.h>
#pragma intrinsic FFINDBYKEY,FOPEN,FCLOSE,PRINTFILEINFO,FREAD
int main(int argc, char *argv[])
{
short int ksm;
char b[64];
char k[16];
ksm=FOPEN("KSAMXL ",0x1805,0x0025);
FREAD(ksm,b,-64);
printf("first record: %-.64s\n",b);
memset(k,' ',sizeof(k));
strcpy(k,argv[1]);
printf("FFINDBYKEY(ksm,'%s',0,0,0)\n",k);
FFINDBYKEY(ksm,k,0,0,0);
PRINTFILEINFO(ksm);
memset(k,' ',sizeof(k));
strncpy(k,argv[1],sizeof(argv[1])); /* <=== note the difference! */
printf("FFINDBYKEY(ksm,'%s',0,0,0)\n",k);
FFINDBYKEY(ksm,k,0,0,0);
PRINTFILEINFO(ksm);
FREAD(ksm,b,-64);
printf("%-.64s\n",b);
FCLOSE(ksm,0,0);
}
qndffind.exec KEY3
first record: ANOTHERKEY DATA
FFINDBYKEY(ksm,'KEY3',0,0,0)
+-F-I-L-E---I-N-F-O-R-M-A-T-I-O-N---D-I-S-P-L-A-Y+
! FILE NAME IS KSAMXL.WORK.EMERSON !
! FOPTIONS: SYS,ASCII,FORMAL,F,NOCCTL,FEQ,KXL !
! NOLABEL !
! AOPTIONS: UPDATE,NOMR,LOCK,DEF,BUF,NOMULTI !
! WAIT,NOCOPY !
! DEVICE TYPE: 3 DEVICE SUBTYPE: 8 !
! LDEV: 2 DRT: 8 UNIT: 0 !
! RECORD SIZE: 64 BLOCK SIZE: 4096 (BYTES) !
! EXTENT SIZE: 75 MAX EXTENTS: 8 !
! RECPTR: 2 RECLIMIT: 1023 !
! LOGCOUNT: 6 PHYSCOUNT: 1 !
! EOF AT: 5 LABEL ADDR: %00000000000 !
! FILE CODE: 0 ULABELS: 0 !
! FILE OWNER: TOM.EMERSON !
! PHYSICAL STATUS: ???????????????? !
! ERROR NUMBER: 172 RESIDUE: 64 (BYTES) !
! BLOCK NUMBER: 1 NUMREC: 4 !
+------------------------------------------------+
FFINDBYKEY(ksm,'KEY3 ',0,0,0)
+-F-I-L-E---I-N-F-O-R-M-A-T-I-O-N---D-I-S-P-L-A-Y+
! FILE NAME IS KSAMXL.WORK.EMERSON !
! FOPTIONS: SYS,ASCII,FORMAL,F,NOCCTL,FEQ,KXL !
! NOLABEL !
! AOPTIONS: UPDATE,NOMR,LOCK,DEF,BUF,NOMULTI !
! WAIT,NOCOPY !
! DEVICE TYPE: 3 DEVICE SUBTYPE: 8 !
! LDEV: 2 DRT: 8 UNIT: 0 !
! RECORD SIZE: 64 BLOCK SIZE: 4096 (BYTES) !
! EXTENT SIZE: 75 MAX EXTENTS: 8 !
! RECPTR: 4 RECLIMIT: 1023 !
! LOGCOUNT: 9 PHYSCOUNT: 1 !
! EOF AT: 5 LABEL ADDR: %00000000000 !
! FILE CODE: 0 ULABELS: 0 !
! FILE OWNER: TOM.EMERSON !
! PHYSICAL STATUS: ???????????????? !
! ERROR NUMBER: 0 RESIDUE: 64 (BYTES) !
! BLOCK NUMBER: 1 NUMREC: 4 !
+------------------------------------------------+
KEY3 DATA
> -----Original Message-----
> From: Russ Smith [mailto:[log in to unmask]]
> in a KSAM file using the following code:
>
> char FindKey[26];
>
> if(TestMode==1)
> fprintf(stderr,"\nRead KSAM with: %s", FindKey);
>
> FFINDBYKEY(KSAMFileNo, &FindKey, 0,0,0);
> MPEerr(KSAMFileNo,1101);
>
> The records were not being found, so I inserted the call to my error
> subroutine to discover why.
>
> The reported tombstone shows the error to be 186 (Invalid Key
> Length), but
> the documentation I have for this intrinsic tells me that
> passing zeros in
> the key number, key length and reation operator parameters
> will default to
> "primary key", "full key usage" and "equals specified value",
> respectively.
|