home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #26 / NN_1992_26.iso / spool / comp / lang / c / 16482 < prev    next >
Encoding:
Text File  |  1992-11-14  |  5.2 KB  |  129 lines

  1. Newsgroups: comp.lang.c
  2. Path: sparky!uunet!charon.amdahl.com!pacbell.com!ames!haven.umd.edu!darwin.sura.net!wupost!gumby!yale!yale.edu!ira.uka.de!math.fu-berlin.de!unidui!rrz.uni-koeln.de!Germany.EU.net!mcsun!sunic!ugle.unit.no!alf.uib.no!krill!yngvar
  3. From: yngvar@imr.no (Yngvar Foelling)
  4. Subject: Re: largest structure size on pc (in c)
  5. Message-ID: <1992Nov13.165506.27585@alf.uib.no>
  6. Sender: yngvar@krill (Yngvar Foelling)
  7. Organization: Institute of Marine Research, Bergen, Norway.
  8. References:  <92314.235722U17868@uicvm.uic.edu>
  9. Date: Fri, 13 Nov 92 16:55:06 GMT
  10. Lines: 117
  11.  
  12. In article <92314.235722U17868@uicvm.uic.edu>, <U17868@uicvm.uic.edu> writes:
  13. |> my  program is listed below. it is very short. All I am trying to do is to
  14. |> read from a file. But, I think the problem is that the structure size is too bi
  15. |> g. It compiles successfully.I am using Turbo C 2.0. When I run it I get the mes
  16. |> sage "Null Pointer Assignment". I tried different ways that is using malloc, wi
  17. |> thout malloc, defining structure as a tag and then declaring an instance, but n
  18. |> othing helpded. I have 2M RAM on my pc.Anyone has any suggestion send it to
  19. |> u17868@uicvm..cc.uic.edu
  20. |> 
  21.  
  22. I'm a bit confused.  You say that you want to read from a file, but the code
  23. seems to try to read from the keyboard and WRITE to the file.  Anyway, although
  24. I can't say for certain what's causing the "Null pointer assignment" message,
  25. there are enough mistakes in the program anyway, so let's walk through them:
  26.  
  27. |> #include <stdio.h>
  28. |> #include <stdlib.h>
  29. |> struct {
  30. |>     int  id;
  31. |>     char  date[9];
  32. |>     char day[10];
  33. |>     int  stime;
  34. |>     int  length;
  35. |>     char location[10];
  36. |>     char with_who[10];
  37. |>     char phone[11];
  38. |>     char subj[10];
  39. |>     char note[10];
  40. |>         int  flag;
  41. |> }temp;
  42. |> 
  43.  
  44. Turbo C has a maximum size of 64K for a structure.  This structure is only 78
  45. bytes long (a bit more if you turn on word alignment), so that is not the problem.
  46.  
  47. |> main()
  48. |> {
  49. |> int i;
  50. |> FILE *file_pointer;
  51. |>  file_pointer = fopen("activity.dat","rb+");
  52.  
  53. This is the only place where you hint at reading instead of writing.  You open
  54. the file for reading AND writing, and this call fails if the file doesn't
  55. exist.  It seems more sensible, given the following instructions, to use mode
  56. "wb".
  57.  
  58. |>  fseek(file_pointer,0,0);
  59.  
  60. Completely redundant.  The file pointer is already positioned at the beginning
  61. of the file.  But so long as it's there, it seems better to use SEEK_SET as the
  62. third argument.  I'm not certain if the ANSI standard guarantees it to be set
  63. to 0 or not, but it seems to be the "approved" form of the third argument.
  64.  
  65. |> 
  66. |>  for(i=0;i<=4;i++)
  67.  
  68. Maybe I'm stating something obvious here, but this loop loops five times, and
  69. not four.  If you really wanted four loops, write  for (i=0; i<4; i++)
  70.  
  71. |>      {
  72. |>        scanf("%d",&temp.id);
  73. |>        gets(temp.date);
  74.  
  75. This is the real big mistake in the program.  If you had inserted appropriate
  76. printf/puts/fputs statements before each statement to prompt for the next
  77. value, you would have discovered that gets takes its value from the same line
  78. as the scanf call.  scanf skips all preceding whitespace, which includes any
  79. newline you might hammer in with repeated banging of the RETURN key.  It then
  80. tries to parse the next characters as an integer.  If it fails (the user made
  81. a mistake), scanf returns but leaves the erroneous characters in the input
  82. buffer to be read by gets.
  83.  
  84. But even if the user typed the value correctly, there's still a problem.  scanf
  85. returns at the first character that can't be interpreted as an integer, but
  86. again it leaves the remaining characters unread in the input buffer, which
  87. includes the newline character.  gets will then read the remaining characters
  88. on the line, instead of the next line as you probably intended.  It will do
  89. this even if you hit RETURN directly after typing the number, in which case
  90. gets will return with an empty string in temp.date.
  91.  
  92. This still leaves the problem that gets doesn't know the size of the string
  93. temp.date, and happily overwrites any memory following it if the string is
  94. longer than 8 characters.  I would say that this is the most likely cause of
  95. the "Null pointer assignment" message.
  96.  
  97. |>        gets(temp.day);
  98. |>        scanf("%d",&temp.stime);
  99. |>        scanf("%d",&temp.length);
  100. |>        gets(temp.location);
  101. |>        gets(temp.with_who);
  102. |>        gets(temp.phone);
  103. |>        gets(temp.subj);
  104. |>        gets(temp.note);
  105. |>        scanf("%d",&temp.flag);
  106.  
  107. My notes above still apply.  I might add that if one scanf fails, and is
  108. followed by a new scanf call, the second scanf will read the same characters
  109. as the first, and so will also fail.
  110.  
  111. |>        fwrite(&temp,sizeof(temp),1,file_pointer);
  112. |>        }
  113. |>  }
  114. |> 
  115.  
  116. You have no fclose(file_pointer).  That is not strictly necessary, though.
  117.  
  118. Conclusion: Don't use scanf or gets.  They both have big problems.  scanf has
  119. no decent facilities for error recovery.  gets has no way of checking the size
  120. of its argument.  Though more complicated, I'll suggest that you write wrapper
  121. functions that read one single line and stores it in a variable, possibly after
  122. some conversion, which could be done with sscanf, atoi or strtol.
  123.  
  124. -- 
  125. Yngvar F°lling (yngvar@imr.no)
  126. Institute of Marine Research
  127. Bergen
  128. Norway
  129.