I have been trying to read large binary files of floating point data
using CMUCL (19c). I thought I would have to do it using some form of
FFI and went to comp.lang.lisp for help getting that working. I
succeeded. But Duane Rettig at Allegro suggested it would be easier to
use 'read-vector. So I tried that as follows:

(let ((vec (make-array 10 :element-type 'double-float)))
  (with-open-file (os "d10.bin")
    (read-vector vec os)
    (print vec)))

where "d10.bin" is a double-float binary file containing 10
elements. When I try to read the file it produces the following error:

Type-error in KERNEL::OBJECT-NOT-DOUBLE-FLOAT-ERROR-HANDLER:
   #\Null is not of type DOUBLE-FLOAT

Here is the C-code code I used to produce the file:

#include <iostream>
#include <fstream>
#include <complex>
using namespace std;

int main()
{
  int n=10;
  double *d = new double[n];
  for (int i=0; i<n; i++) 
    d[i] = i;
  FILE *of = fopen("d10.bin", "wb");
  fwrite(f,8,n,of);
  fclose(of);
  return 0;
}


Here is Duane's sample code that he say works in Allegro:

copied from 
<http://groups.google.com/group/comp.lang.lisp/browse_thread/thread/67876101085aee82/05a20cfcd11f8fbe?hl=en#05a20cfcd11f8fbe>
...................................................................
You must be using a simple-streams implementation from another lisp.
Allegro CL doesn't have a KERNEL package.

What you're seeing above is a bug; you should report it to that
lisp's support team.

It works fine in Allegro CL (for which you can download the Express
Edition for free):

CL-USER(1): (defvar *x*
               (make-array 10 :element-type 'double-float
                              :initial-contents
                              (loop for i from 0.0d0 to 9.0d0
                                    collect i)))
*X*
CL-USER(2): *x*
#(0.0d0 1.0d0 2.0d0 3.0d0 4.0d0 5.0d0 6.0d0 7.0d0 8.0d0 9.0d0)
CL-USER(3): (with-open-file (s "z.dat" :direction :io
                                       :if-exists :overwrite
                                       :if-does-not-exist :create)
(write-vector *x* s))
80
CL-USER(4): (defvar *y* (make-array 10 :element-type 'double-float
                                       :initial-element 10.0d0))
*Y*
CL-USER(5): (with-open-file (s "z.dat")
(read-vector *y* s))
80
CL-USER(6): *y*
#(0.0d0 1.0d0 2.0d0 3.0d0 4.0d0 5.0d0 6.0d0 7.0d0 8.0d0 9.0d0)
CL-USER(7):

-- 
Duane Rettig
...................................................................



Is this really a bug? Or am I doing something else wrong?

Regards,

--Jeff


Reply via email to