[Rd] data is getting corrupted
Duncan Murdoch
murdoch at stats.uwo.ca
Tue Nov 30 17:50:43 CET 2004
On Tue, 30 Nov 2004 08:01:14 -0800 (PST), "Jeff D. Hamann"
<jeff.hamann at forestinformatics.com> wrote :
>I'm not sure I described the problem correctly with my last post.
Or maybe I missed that. Sorry!
>The structure that is being allocated contains fixed length arrays and
>thus, the location of the strings aren't NULL (the contents are however).
I'd suggest using strncpy instead of strcpy; it might be that one of
your strings is longer than expected, and is overwriting something it
shouldn't.
Duncan Murdoch
>
>struct SAMPLE_RECORD
>{
>char forest[HEADER_CHAR_STR]; /* forest identifier */
>char subunit[HEADER_CHAR_STR]; /* subunit */
>char stand_name[HEADER_CHAR_STR]; /* stand name */
>char legal[HEADER_CHAR_STR]; /* legal description */
>long elevation; /* elevation (ft) */
>double acreage; /* number of acres */
>unsigned long age; /* stand age */
>
>unsigned long sampled_month; /* month of the year */
>unsigned long sampled_day; /* day of the month */
>unsigned long sampled_year; /* year measured */
>unsigned long current_year; /* year of forecast */
>
>double x0;
>
>unsigned long n_points;
>struct PLOT_RECORD *plots_ptr;
>
>unsigned long n_plants;
>struct PLANT_RECORD *plants_ptr;
>};
>
>The plots_ptr and plants_ptr are set to NULL because they're not static
>arrays and are allocated.
>
>Since the problem didn't manifest itself within the strings, but rather in
>the arrays that are allocated (plants_ptr) and specifically a single
>column (variable) that occurs within the plants_ptr, I still think I have
>a problem with the PROTECT/UNPROTECT operations because with small
>data.frames (200 rows x 10 cols) the code works fine. With larger
>data.frames (2000 rows x 10 cols), then the corruption begins. COuld this
>be a problem with the sequencing of the allocate
>plants_ptr->PROTECT->assign values to variables->UNPROTECT? Is it possible
>to find out when R is performing garbage collection or moving data around?
>
>Thanks,
>Jeff.
>
>
>Duncan Murdoch said:
>> On Mon, 29 Nov 2004 09:27:42 -0800 (PST), "Jeff D. Hamann"
>> <jeff.hamann at forestinformatics.com> wrote:
>>
>>>/* this function converts the sample list */
>>>/* from R into the internal structure */
>>>struct SAMPLE_RECORD *build_sample_from_sexp( SEXP sample )
>>>{
>>
>> [ declarations deleted ]
>>
>>>
>>> char temp_sp_code[16];
>>> struct SAMPLE_RECORD *s_ptr;
>>> struct SPECIES_RECORD *sp_ptr;
>>>
>>> s_ptr = (struct SAMPLE_RECORD *)calloc( 1, sizeof( struct
>>> SAMPLE_RECORD
>>>) );
>>
>> This allocates a structure, initialized to all zeros.
>>
>>>/* s_ptr = (struct SAMPLE_RECORD *)Calloc( 1, struct SAMPLE_RECORD );
>>> */
>>>
>>> /* *fill in the header info */
>>> strcpy( s_ptr->forest,
>>>CHAR(STRING_ELT(get_list_element(sample,"forest"), 0)) ) ;
>>
>> This copies the string element to the address s_ptr->forest points to,
>> which is address 0, since you didn't change it from the initial NULL.
>> I'm surprised you didn't get a bigger error than the one you saw.
>>
>> [ more deletions ]
>>
>>>I'm sure there's something I don't understand about the PROTECT/UNPROTECT
>>>sequence as this seems to work on smaller data.frames
>>
>> Maybe you were just lucky that the overwriting at address 0 didn't
>> trash anything in those cases?
>>
>> Duncan Murdoch
>>
More information about the R-devel
mailing list