fork download
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4.  
  5. // タイプ識別子
  6. typedef enum {
  7. VTP_CHAR = 0,
  8. VTP_INT,
  9. //…
  10. } V_TYPE;
  11.  
  12. // タイプごとのサイズ
  13. enum {
  14. TSZ_CHAR = sizeof(char),
  15. TSZ_INT = sizeof(int),
  16. //…
  17. };
  18.  
  19. // 本体データ
  20. typedef struct _VARIANT {
  21. char m_name[256];
  22. V_TYPE m_type;
  23. int m_size; // = memsize = sizeof(…) * n
  24. void *m_data;
  25. } VARIANT;
  26.  
  27. VARIANT *mk_arr(char *name, char *type, int n)
  28. {
  29. VARIANT *p_tmp;
  30. int sz;
  31. V_TYPE tp;
  32.  
  33. // check
  34. if (0 == strcmp(type, "char")) {
  35. sz = TSZ_CHAR;
  36. tp = VTP_CHAR;
  37. } else if (0 == strcmp(type, "int")) {
  38. sz = TSZ_INT;
  39. tp = VTP_INT;
  40. //…} else if (0 == strcmp(type, "……")) {
  41. //… ;
  42. } else {
  43. return NULL;
  44. }
  45.  
  46. // alloc
  47. if (NULL == (p_tmp = malloc(sizeof(VARIANT)))) {
  48. return NULL;
  49. }
  50. // set
  51. strcpy(p_tmp->m_name, name);
  52. p_tmp->m_type = tp;
  53. p_tmp->m_size = sz * n;
  54. if (0 == (p_tmp->m_data = malloc(p_tmp->m_size))) {
  55. free(p_tmp);
  56. return NULL;
  57. } else {
  58. return p_tmp;
  59. }
  60. }
  61.  
  62. void del_arr(VARIANT * p)
  63. {
  64. free(p->m_data);
  65. free(p);
  66. }
  67.  
  68. int main()
  69. {
  70. VARIANT *p;
  71. char name[] = "str";
  72. char type[] = "int";
  73. int n = 10;
  74.  
  75. if (NULL == (p = mk_arr(name, type, n))) {
  76. printf("作成失敗\n");
  77. return 1;
  78. } else {
  79. printf("作成しました %s %s[%d]\n", type, name, n);
  80. }
  81. del_arr(p);
  82.  
  83. return 0;
  84. }
  85.  
Success #stdin #stdout 0s 1920KB
stdin
Standard input is empty
stdout
作成しました int str[10]