Hello,<br>I am a Ph.D. student from Ireland working on a project that data mines the SDSS catalogue.   I was advised to ask here for help by Peter Kretschmar of ESA who is a colleague of my supervisor.  I sent a similar email in at about the same time I signed up for this list, about a week ago, but since I recieved my confirmation email after this point, I am unsure if it would have been recieved.   If anyone has recieved a double post from me, I apologise.<br>

<br>I am having trouble with a C++ program that uses the cfitsio library .  The program is intended to write a large amount of data from an array in memory into a .fits table.  However, I get an error when I attempt to write an array of more than 14040 "double" numbers to the file.  <br>




<br>If I attempt to write between 14041 and 14400 doubles, I get this error.<br><div style="margin-left:40px"><b><span style="font-family:courier new,monospace">FITSIO status = 107: tried to move past end of file</span><br style="font-family:courier new,monospace">

<span style="font-family:courier new,monospace">Error reading data buffer from file:</span></b>


<b><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">/mnt/Share/test_harness_out_fits.fit</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">Error while closing HDU number 1 (ffchdu).</span></b>


<br></div><br>While if I write 14401 or over I get this one<br><div style="margin-left:40px"><b><span style="font-family:courier new,monospace">FITSIO status = 252: 1st key not SIMPLE or XTENSION</span><br style="font-family:courier new,monospace">

<span style="font-family:courier new,monospace">Error reading data buffer from file:</span></b>


<b><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">/mnt/Share/test_harness_out_fits.fit</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">Extension doesn't start with SIMPLE or XTENSION keyword. (ffrhdu)</span></b>


<b><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">@B</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">Error while closing HDU number 1 (ffchdu).</span></b>


<br></div><br>I can't seem to find any documentation indicating such a limit on the size of fits tables (indeed, what I've found seems to suggest I'm barely scratching the surface.)  <br>


<br>I have included a stripped down version of my code below which includes the critical functions and which returns the same errors and at the same points in the code as the "live" code does.  <br><br>I am running scientific Linux 4.5 and using Eclipse Europa as my development environment.<br>

<br>I hope this is a relatively simple fix and you can help me.<br>


Many thanks in advance,<br>Oisin Creaner<br><br><div style="margin-left:40px"><span style="font-family:courier new,monospace">using namespace std;</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">// Required header files</span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">#include <stdio.h></span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">#include <stdlib.h></span><br style="font-family:courier new,monospace">




<br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">//required for FITS file operations</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">#include <fitsio.h></span><br style="font-family:courier new,monospace">




<br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">//includes the mathemathical library</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">#include <math.h></span><br style="font-family:courier new,monospace">




<br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">//This function creates a fits file</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">int make_out_fits ( fitsfile **p_fp_out_fits, char *p_file_name);</span><br style="font-family:courier new,monospace">




<br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">//This function writes the array into a fits file</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">int write_output_fits(    fitsfile **p_fp_out_fits, </span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">                        double **p_output_array, </span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">                        long int *p_total_targets);</span><br style="font-family:courier new,monospace">




<br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">int main() {</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    //error handling routine</span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">    int error = 0;</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    </span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">    //Test data: normally calculated based on inputs</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    //works at up to 14040// gives error 107 from 14041-14400//gives error 252 beyond14401;</span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">    long int out_num_rows = 14000;</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    long int *p_out_num_rows = &out_num_rows;</span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">    </span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    //index for seeding array</span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">    int output_index = 0;</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    </span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">    //Fitsio error handling </span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    int status = 0;</span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">    </span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    //creates a pointer to a file to store the output filename (150 characters allowed)</span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">    char *p_out_file_name= (char *) malloc (150 * sizeof(char));</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    </span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">    //creates a pointer for the output fits file</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    fitsfile *fp_out_fits = {NULL};</span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">    fitsfile **p_fp_out_fits = &fp_out_fits;</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    </span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">    //creates an array to write to a file</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    double *output_array= (double *) malloc (out_num_rows *(sizeof (double)));</span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">    double **p_output_array  = (double **) malloc (sizeof (double));</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    p_output_array  = &output_array;</span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">    </span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    //output file name</span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">    p_out_file_name = "/mnt/Share/test_harness_out_fits_small.fit";</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    </span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">    //seeds the array //in the real program, the array is generated from inputs</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    for (output_index = 0; output_index < out_num_rows; output_index ++)</span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">    {</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">        *(output_array+output_index) = output_index;</span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">        printf("%lf \n", *(output_array+output_index));</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    }</span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">    </span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    //and makes the file</span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">    error = make_out_fits (p_fp_out_fits, p_out_file_name);</span><br style="font-family:courier new,monospace"><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    printf("\nWriting Fits File!");</span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">    </span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    //runs the writing program that creates the output .fit</span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">    //file for the user.</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    error = write_output_fits (p_fp_out_fits, p_output_array, p_out_num_rows);</span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">    </span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    //This is the point where it usually goes wrong</span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">    printf("\nClosing Fits File!");</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    fits_close_file (*p_fp_out_fits, &status);</span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">    if (status!=0)</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">        {</span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">        fits_report_error (stdout, status);</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">        return (status);</span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">        }</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    </span><br style="font-family:courier new,monospace">
<span style="font-family:courier new,monospace">    printf("\nFinished!");</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    return (error);</span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">    </span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    </span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">}</span><br style="font-family:courier new,monospace">




<br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">//standardised final writing stage</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">int make_out_fits ( fitsfile **p_fp_out_fits, char *p_file_name)</span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">{</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    //error handling</span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">    int error = 0;</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    int status = 0;</span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">    int *p_status = &status;</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">        </span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">    //creates name and format files for the new table</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    char ra_name[16] = "ra";</span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">    char *p_ra_name = & ra_name[0];</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    char form[3] = "1D";</span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">    char *p_form = &form[0];</span><br style="font-family:courier new,monospace"><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    //creates a file</span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">    fits_create_file (p_fp_out_fits, p_file_name, p_status);    </span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    if (status!=0)</span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">        {</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">        fits_report_error (stdout, status);</span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">        return (status);</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">        }</span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">    </span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    //creates a fits data table</span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">    fits_create_tbl (*p_fp_out_fits, BINARY_TBL, 0, 1, &p_ra_name, &p_form, NULL, NULL, p_status);</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    if (status!=0)</span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">        {</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">        fits_report_error (stdout, status);</span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">        return (status);</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">        }</span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">    printf ("\nNew FITS table created!\n");</span><br style="font-family:courier new,monospace"><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    return (error);</span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">}</span><br style="font-family:courier new,monospace"><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">int write_output_fits(    fitsfile **p_fp_out_fits, </span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">                        double **p_output_array, </span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">                        long int *p_out_num_rows)</span><br style="font-family:courier new,monospace">




<br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">{</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    //error handling</span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">    int error = 0;</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    int status = 0;</span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">    int *p_status = &status;</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">        </span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">    //declares an index for control of writing and </span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    //column numbers the array is to write to</span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">    long int output_index =0;</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    long int row_index = output_index +1;</span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">    int new_ra_col = 1;</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    </span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">    //goes through the array line by line writing it to the file.</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    for(output_index = 0 ; output_index < *p_out_num_rows ; output_index ++)</span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">    {</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">        row_index = output_index +1;</span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">        </span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">        //writes to the file</span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">        fits_write_col (*p_fp_out_fits, TDOUBLE, new_ra_col, row_index, 1, 1, (((*p_output_array)+output_index)/*->ra*/), p_status);</span><br style="font-family:courier new,monospace">




<br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">        if (status!=0)</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">            {</span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">            fits_report_error (stdout, status);</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">            return (status);</span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">            }</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">        </span><br style="font-family:courier new,monospace">




<span style="font-family:courier new,monospace">        printf ("%lf\n", *((*p_output_array)+output_index));</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    }</span><br style="font-family:courier new,monospace">




<br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    return (error);</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">}</span><br>




<br><br><br><br></div>

<br><br><div></div>
<div></div>
<div style="visibility: hidden; left: -5000px;" id="avg_ls_inline_popup"></div><style type="text/css">#avg_ls_inline_popup{position: absolute;z-index: 9999;padding: 0px 0px;margin-left: 0px;margin-top: 0px;overflow: hidden;word-wrap: break-word;color: black;font-size: 10px;text-align: left;line-height: 130%;}</style>