[ROOT] Problem using C (passing arguments)

From: Georges Lobo (lobo@irmm.jrc.be)
Date: Thu Jul 26 2001 - 09:16:54 MEST


Hi Rooters,
I'm trying to implement am existing C program which reads the neutron data
files from ENDF. Since the file is quite complicated I want to use a
program already written by somebody else. 
I'm curently using it with CINT inside root.
I had to do some adjustements but I am facing a problem which I don't
understand. I give the pieces of the code where the problem occurs 
/*Global variables */
#define MIN(A,B)    ((A)<(B)) ? (A) : (B)
char xfr_buf[128], *b66 = xfr_buf+ 66; /*global too */ 

I'm doing then several call to the function endf_scan 
written below. The calls are in a loop 

endf_scan(xfr_buf,dv,MIN(rest,6));
the local variables are defined as 
double dv[2];
long rest;	

For the first step of the loop everything is OK, but in the second step 
I have an error 
Error: strncpy param[1]=0 must not be 0 
Printing the value of b and v shows that for the second call all the
arguments of endf_scan are null. I verified that the arguments before the
call i.e. xfr_buf and dv are non-null. 
I really don't understand what's happening. 
Thanks in advance.

 /* ................................................. ENDF_SCAN
 * Scan an ENDF HEAD or TAB1  record b into d.fl.pt. vector v
 */
int endf_scan(char *b, double *v, int lim)
{
 
	int k, rv=0, mant;
	char buf[14],*p;
	buf[13]=EOS;
	cout << "In endf_scan"<<endl;
	printf("b adress = %i b content %s\n",&b,b);
	//	printf("****\n%80s", b);
	for ( k=0; k < lim; ++k, b += 11){
		strncpy(buf, b, 11);
		p = strpbrk(buf + 1, "+-");
 		if (p != NULL){
			mant = p - buf;
			strncpy(buf, b, mant);
			p[0] = 'E'; 
			p[1] =  b[mant];
			p[2] = (b[mant+1] == ' ')? b[mant+2] : b[mant+1];
			p[3] = ' ';
		}
		/*printf("%s\n", buf);*/
		printf("print  before scanf );
       		rv += sscanf (buf, "%lf", v + k);
   	}
	/*******
	for (k = 0; k < rv; ++k)
		printf("%g\t", v[k]);
	printf("\n");
	if (rv == 6)
		ags_exit ("STOP");
	********/
	cout << "out endf_scan"<<endl;
	return ( rv );
}



This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:50:53 MET