Guest User

Untitled

a guest
Feb 18th, 2018
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.65 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include <string.h>
  5.  
  6. #define WITHHEXDUMP 0
  7.  
  8. // MIN A
  9. double *allocate_double(long len);
  10. void free_double(double *mem);
  11. void print(double *mem, long len);
  12.  
  13. // MIN B
  14. double *double_size(double *zahl, long old_size);
  15. long sub(double *a, long size1, double *b, long size2,
  16. double *c, long size3);
  17.  
  18. void clearstdin();
  19.  
  20. // ERW
  21. char **store_in_array(char **storage, long length, char *newitem);
  22. char **delete_from_array(char **storage, long length, long delete_index);
  23.  
  24.  
  25. char **store_in_array(char **storage, long length, char *newitem)
  26. {
  27. char *adrptr=0;
  28. int i=0, size_bytes=0;
  29. printf("*** STORE_IN_ARRAY ***\n");
  30. for(i=0;i<length;i++)
  31. size_bytes+=strlen(storage[i]);
  32. size_bytes+=strlen(newitem);
  33. printf("OLD ADRESS %p\n",storage);
  34. printf("REALLOCATION OF %ld BYTES\n",size_bytes);
  35. if(!(adrptr=realloc(storage, size_bytes)))
  36. {
  37. printf("REALLOCATION FAILED.\n");
  38. return 0;
  39. }
  40. printf("NEW ADRESS %p\n", adrptr);
  41. memset(adrptr
  42.  
  43. }
  44.  
  45.  
  46. void clearstdin()
  47. {
  48. while(getchar()!='\n');
  49. }
  50.  
  51. double *allocate_double(long len)
  52. {
  53. long size_bytes=len*sizeof(double);
  54. double *adrptr=0;
  55. printf("*** ALLOCATE_DOUBLE ***\n");
  56. printf("ALLOCATION OF %ld BYTES FOR %ld DOUBLES:\n",
  57. size_bytes, len);
  58. if(!(adrptr=malloc(size_bytes)))
  59. {
  60. printf("MALLOC ERROR OR OUT OF MEMORY.\n");
  61. printf("BUY DISCOUNTED RAM CHEAP: 1-800-HYNIX.\n");
  62. exit(-1);
  63. }
  64. printf("ALLOCATION DONE AT %p\n",adrptr);
  65. return adrptr;
  66. }
  67.  
  68. void free_double(double *mem)
  69. {
  70. printf("*** FREE_DOUBLE ***\n");
  71. if(!mem)
  72. {
  73. printf("ATTEMPT TO FREE A NULL POINTER.\n");
  74. exit(-1);
  75. }
  76. free(mem);
  77. printf("FREED MEMORY AT %p\n",mem);
  78. }
  79.  
  80.  
  81.  
  82. void print(double *mem, long len)
  83. {
  84. int i;
  85. unsigned char *byteptr=(unsigned char*) mem;
  86. printf("*** PRINT ***\n");
  87. printf("ACCESSING MEMORY AT %p\n",mem);
  88. for(i=0;i<len;i++)
  89. printf("%20lf%c", mem[i], (i+1)%3?' ':'\n');
  90. putchar('\n');
  91.  
  92. #if WITHHEXDUMP
  93.  
  94. // "welche die darin enthaltenen Zeichen ausgibt" ?!!?!
  95. // OK, hier kommt der HEX-Dump:
  96. // Ich glaube nicht, dass es ernst gemeint ist sondern
  97. // ein Fehler in der Angabe... Aber ein HEX-Dump ist
  98. // nuetzlich um zu sehen, wie es im Speicher aussieht
  99. // und die Adressen.
  100. // Diesen Teil kann man also ziemlich sicher WEGLASSEN:
  101.  
  102. for(i=0;i<len*sizeof(double);i++)
  103. {
  104. if(!(i%16))
  105. printf("\n%p:",byteptr+i);
  106. printf("%02X ", byteptr[i]);
  107. }
  108. putchar('\n');
  109. #endif
  110.  
  111. }
  112.  
  113.  
  114.  
  115. double *double_size(double *zahl, long old_size)
  116. {
  117. long size_bytes=old_size*2*sizeof(double);
  118. double *adrptr=0;
  119. printf("*** DOUBLE_SIZE ***\n");
  120. printf("REALLOCATION OF %ld BYTES FOR %ld DOUBLES\n",size_bytes,old_size*2);
  121. if(!(adrptr=realloc(zahl, size_bytes)))
  122. printf("REALLOCATION FAILED.\n");
  123. else
  124. printf("NEW ADRESS %p\n", adrptr);
  125. return adrptr;
  126. //Warum wird hier nicht explizit return 0 gemacht? Weil realloc ja bereits
  127. //0 zurueckliefert und sich um das sowieso im Beispiel die aufrufende
  128. //Fkt kuemmert, daher kommt nur eine Fehlermeldung.
  129. }
  130.  
  131. // Ergibt mit double's irgendwie keinen Sinn, sie "numerisch" (Ziffer fuer Ziffer) zu subtrahieren?
  132. long sub(double *a, long size1, double *b, long size2, double *c, long size3)
  133. {
  134. printf("*** SUB ***\n");
  135. printf("ACCESSING A AT %p\n",a);
  136. printf("ACCESSING B AT %p\n",b);
  137. printf("ACCESSING C AT %p\n",c);
  138. if(size2>size1)
  139. {
  140. printf("CANNOT SUBTRACT LARGER FROM SMALLER NUMBER\n");
  141. return 0;
  142. }
  143. if(size3<size1)
  144. {
  145. printf("NOT ENAUGH ROOM FOR RESULT.\n");
  146. return 0;
  147. }
  148. if(!a || !b || !c)
  149. {
  150. printf("MEMORY BUFFER(S) NOT ALLOCATED.\n");
  151. return(0);
  152. }
  153. memset(c, 0, size3*sizeof(double));
  154. int i, carry=0;
  155.  
  156. //Anm: Eigentlich heisst es korrekt "borrow" und nicht "carry" beim Subtr.
  157. for(i=1;i<=size1;i++)
  158. {
  159. c[size3-i]=a[size1-i]-carry; //Ein ev. Carry aus dem vorherigen Schritt abziehn
  160. if(!(i>size2)) //Solange es Zahlen zum subtrahieren gibt
  161. c[size3-i]-=b[size2-i]; //diese auch abziehen
  162. carry=0; //Carry null setzen
  163. if(c[size3-i] < 0) //Wenn etwas negatives rauskommt:
  164. {
  165. c[size3-i]=10+c[size3-i]; // Wrap-Around um 10
  166. carry=1; //Carry setzen
  167. }
  168. }
  169. return 1;
  170. }
  171.  
  172.  
  173. int main()
  174. {
  175. int i;
  176. int num;
  177. int size1, size2, size3;
  178. double *new;
  179. double *buffer=allocate_double(20);
  180. double *a, *b, *c;
  181. sranddev();
  182. for(i=0;i<20;i++)
  183. buffer[i]=sin(rand())*rand();
  184. print(buffer,20);
  185. printf("PRESS RETURN\n");
  186. clearstdin(); // WAIT KEY
  187. new=double_size(buffer,20);
  188. if(!new)
  189. {
  190. printf("COULDN'T DOUBLE BUFFER SIZE...\n"); //Realloc ging nicht
  191. free_double(buffer);
  192. buffer=0;
  193. }
  194. else
  195. {
  196. buffer=new; //Realloc ging, dann noch paar konstante Werte als Beweis
  197. printf("ADDING SOME CONSTANT VALUES...\n"); //reinschreiben und diese ausgeben.
  198. for(i=20;i<40;i++)
  199. buffer[i]=1234;
  200. print(buffer,40);
  201. free_double(buffer);
  202. buffer = new = 0;
  203. }
  204. printf("PRESS RETURN\n");
  205. clearstdin(); // WAIT KEY
  206.  
  207. // Groessen fuer 3 Arrays abfragen und diese dann allocen
  208. // Diese Arrays werden nachher zum subtrahieren verwendet
  209. // Deswegen sollte B kleiner als A sein und C mindestens
  210. // so gross wie A (z.b. A=10, B=5, C=10)
  211. printf("ENTER SIZE (ELEMENTS) OF 3 DYNAMIC ARRAYS:\n");
  212. printf("1: ");
  213. scanf("%d",&size1);
  214. clearstdin();
  215. printf("2: ");
  216. scanf("%d",&size2);
  217. clearstdin();
  218. printf("3: ");
  219. scanf("%d",&size3);
  220. clearstdin();
  221. a=allocate_double(size1);
  222. b=allocate_double(size2);
  223. c=allocate_double(size3);
  224. printf("PRESS RETURN\n");
  225. clearstdin(); // WAIT KEY
  226.  
  227. i=0;
  228. do
  229. {
  230. printf("RANDOM FILL? Y/N: ");
  231. switch(getchar())
  232. {
  233. case 'y': //Mit ZUfallszahlen ausfuellen
  234. case 'Y':
  235. for(i=0;i<size1;i++)
  236. a[i]=rand()%10; //Modulo 10 dient dazu, damit nur 1 Ziffer drinsteht
  237. for(i=0;i<size2;i++)
  238. b[i]=rand()%10;
  239. break;
  240. case 'n':
  241. case 'N': //Ziffern manuell eingeben (Achtung, nur 1 Ziffer eingeben,
  242. Angabe ist hier sinnlos wegen Doubles, also nicht 0.5 eingb)
  243. printf("VALUES FOR A:\n");
  244. for(i=0;i<size1;i++)
  245. {
  246. printf("%u: ",i);
  247. scanf("%lf",&a[i]);
  248. }
  249. printf("VALUES FOR B:\n");
  250. for(i=0;i<size2;i++)
  251. {
  252. printf("%u: ",i);
  253. scanf("%lf",&b[i]);
  254. }
  255. break;
  256. default:
  257. clearstdin();
  258. continue;
  259. }
  260. } while(!i);
  261. print(a,size1);
  262. printf("PRESS RETURN\n");
  263. clearstdin(); //WAIT KEY
  264. print(b,size2);
  265. printf("PRESS RETURN\n");
  266. clearstdin(); //WAIT KEY
  267. printf("SUBTRACTING...\n");
  268. sub(a,size1,b,size2,c,size3);
  269. print(c,size3);
  270. printf("PRESS RETURN\n");
  271. clearstdin(); //WAIT KEY
  272. if(a)
  273. free_double(a);
  274. if(b)
  275. free_double(b);
  276. if(c)
  277. free_double(c);
  278. printf("That's all folks...\n");
  279. return 0;
  280. }
Add Comment
Please, Sign In to add comment