From: "Matthew Bayliss" Newsgroups: comp.os.msdos.djgpp Subject: Static variables Date: Fri, 17 May 2002 17:03:03 +0100 Lines: 202 Message-ID: NNTP-Posting-Host: 195.44.51.226 X-Trace: fu-berlin.de 1021651355 23380834 195.44.51.226 (16 [106847]) X-Priority: 3 X-MSMail-Priority: Normal X-Newsreader: Microsoft Outlook Express 5.00.3018.1300 X-MimeOLE: Produced By Microsoft MimeOLE V5.00.3018.1300 To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Reply-To: djgpp AT delorie DOT com I have a variable declared outside of main() with a static keyword. If you break on line 117 and "print words_ptr" the pointer has an assignment. When the function returns to main() (line 31) the variable has no value. Why is this? I thought a static variable would also keep it's value between funtions. Help. Matt ============================================= #include #include #include #define WORDSARRAYSIZE 50 #define WORDSFILENAME "..\\words.txt" #define PHRASESFILENAME "..\\phrases.txt" // Structure of data file will be "ENGLISH,KOREAN". static int words_elements = 0; struct wordstruct{ char english[WORDSARRAYSIZE]; char korean[WORDSARRAYSIZE]; }; static struct wordstruct *words_ptr; int inputdata( struct wordstruct *words_ptr ); // Function to read words from a file. void extractenglish( char tempstring[] , char tempenglish[] ); void extractkorean( char tempstring[] , char tempkorean[] ); int main( void ) { if ( inputdata( words_ptr ) == 0 ) // Read the data in. { // process the rest of the program. int c; for ( c = 0; c < words_elements; c++ ) { printf( "%s\n", words_ptr[words_elements].english ); } } else { // display a file error. printf("Error reading data!\n"); } return 0; } // *************************************************************** // // Returns 0 on success, non-zero if an error occured. // // *************************************************************** int inputdata( struct wordstruct *words_ptr ) { int err = 0; // Initialize the error code, only change it if an error occurs. FILE *fp; if ( ( words_ptr = malloc( sizeof( struct wordstruct ) ) ) !=NULL ) { // memory allocated words_elements = 0; if ( ( fp = fopen( WORDSFILENAME, "r" ) ) != NULL ) { // Read the data. char tempstring[2*WORDSARRAYSIZE]; char tempenglish[WORDSARRAYSIZE]; char tempkorean[WORDSARRAYSIZE]; int loopcount = 0; while ( ( fgets( tempstring, 2*WORDSARRAYSIZE, fp ) ) != NULL ) loopcount++; /* Some psuedo-code: if ( numelements >= 0 ) copy array[numelements] = data; numelements++; */ extractenglish( tempstring , tempenglish ); extractkorean( tempstring , tempkorean ); if ( words_elements == 0 ) { strcpy ( words_ptr->english, tempenglish ); strcpy ( words_ptr->korean, tempkorean ); words_elements++; } else if (words_elements > 0 ) { struct wordstruct *temp_ptr = NULL; // Make more room temp_ptr = realloc( words_ptr, ((WORDSARRAYSIZE*2) * words_elements) + (WORDSARRAYSIZE * 2) ); words_ptr = temp_ptr; // copy data strcpy( words_ptr[words_elements].english , tempenglish ); strcpy( words_ptr[words_elements].korean , tempkorean ); // increment counter. words_ptr++; } printf("The english for %s is %s.\n", tempkorean, tempenglish ); } fclose( fp ); fp = NULL; } else { // There was an error, report it. err = 1; } } else { // Memory allocation error err = 1; } return err; } void extractenglish( char tempstring[] , char tempenglish[] ) { int length = 0; while ( tempstring[length] != ',' ) length++; strncpy ( tempenglish, tempstring, length ); if ( length < WORDSARRAYSIZE ) tempenglish[length] = '\0'; else tempenglish[WORDSARRAYSIZE-1] = '\0'; } void extractkorean( char tempstring[] , char tempkorean[] ) { char *start_p = NULL; int count = 0; // Find the , and shift along one. start_p = strpbrk( tempstring, "," ); start_p = start_p + 1; // HEREIN LIES A BUG: if \n does not come before EOF then it will gpf. while ( *start_p != '\n' ) tempkorean[count++] = *start_p++; if ( count < WORDSARRAYSIZE ) tempkorean[count] = '\0'; else tempkorean[WORDSARRAYSIZE-1] = '\0'; }