Advertisement
temomik

Untitled

Jan 21st, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.42 KB | None | 0 0
  1. #include <stdio.h>
  2. #include "windows.h"
  3.  
  4. /*Билет 17
  5. 1. Написать функцию с переменным кол-вом параметров (использовать бестиповой указатель).
  6. Найти сумму чисел int и float. Функция возвращает 2 полученные суммы */
  7. void** summ(int n,...);
  8.  
  9.  
  10. int main (void)
  11. {
  12.     void** ms;
  13.  
  14.     ms = summ(4,'i',3,1,3,4,'f',2,2.5,3.5,'i',1,6,'f',1,2.2);
  15.  
  16.     printf("%d\n",*((int*)ms[0]) );
  17.     printf("%.3lf\n",*((double*)ms[1]) );
  18.  
  19.     free(ms[1]);
  20.     free(ms[2]);
  21.     free(ms);
  22.  
  23.     system("pause");
  24.     return 0;
  25. }
  26.  
  27.  
  28. void** summ(int n,...)
  29. {
  30.     void** ms,*ptr;
  31.     int* isumm,i;
  32.     double* dsumm;
  33.  
  34.     ms = (void**)malloc(2 * sizeof(void*));
  35.     isumm = (int*)calloc(1,sizeof(int));
  36.     dsumm = (double*)calloc(1,sizeof(double));
  37.  
  38.     char c;
  39.     ptr = &n;
  40.     ptr = ((int*)ptr) + 1;
  41.  
  42.  
  43.     while(n--)
  44.     {
  45.  
  46.         c = *(char*)ptr;
  47.         ptr = ((int*)ptr) + 1;
  48.  
  49.         switch(c)
  50.         {
  51.             case 'i':
  52.             {
  53.                 i = *(int*)ptr;
  54.                 ptr = ((int*)ptr) + 1;                 
  55.                 for(int j = 0; j < i; j++)
  56.                 {
  57.                     isumm[0] += *(int*)ptr;
  58.                     ptr = ((int*)ptr) + 1;                 
  59.                 }
  60.                 break;
  61.             }
  62.  
  63.             case 'f':
  64.             {
  65.                 i = *(int*)ptr;
  66.                 ptr = ((int*)ptr) + 1;
  67.                 for(int j = 0; j < i; j++)
  68.                 {
  69.                     dsumm[0] += *(double*)ptr;
  70.                     ptr = ((double*)ptr) + 1;
  71.                 }
  72.                 break;
  73.             }
  74.         }
  75.     }
  76.  
  77.     ms[0] = (void*)isumm;
  78.     ms[1] = (void*)dsumm;
  79.     return ms;
  80.  
  81. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement