用户输入的类型数组

时间:2015-05-13 14:00:39

标签: c arrays ncurses

我写道:

printw("\nNow, Which is the type of data to be saved?\n");
printw("\n1- Integer\n2- Short-integer\n3- Char\n4- Float\n");
printw("\nSelect the number of the option (1-4)\n");

do{
    scanf("%d",&h);
    switch(h){
        case 1:
            int matriz[rows][columns];
            break;
        case 2:
            short int matriz[rows][columns];
            break;
        case 3:
            char matriz[rows][columns];
            break;
        case 4:
            float matriz[rows][columns];
            break;
        default:
            printw("\nYou have to enter a number between 1 and 4 :)\n");
            break;


    }
}while(h > 4 || h < 1);

(之前我定义了h,行,colunmns和我正在使用ncurses)

我想做一个用户想要的类型的数组。但我意识到这不是道路。

2 个答案:

答案 0 :(得分:-1)

C语言中类型泛型编程的典型案例。可以这样做但是有点麻烦:

#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

#define ROWS 2
#define COLS 3


typedef enum
{
  TYPE_INT,
  TYPE_SHORT,
  TYPE_CHAR,
  TYPE_FLOAT
} type_t;


typedef struct generic_t generic_t; // forward declaration, incomplete type

// generic print function type
typedef void(*print_func_t ) (const generic_t* ptr, size_t row, size_t col);

typedef struct generic_t
{
  type_t        type;   // corresponding to selected data type
  print_func_t  print_func;
  void*         matrix2D;
} generic_t;


// specific print function just for float
void print_float (const generic_t* ptr, size_t row, size_t col);


int main()
{
  generic_t data;

  // take user input etc, determine type selected

  // lets assume they picked float
  data.type = TYPE_FLOAT;
  data.print_func = print_float;
  data.matrix2D = malloc (ROWS*COLS*sizeof(float));

  float some_data[2][3] =   // some random data:
  {
    {1, 2, 3}, 
    {4, 5, 6}, 
  };
  memcpy(data.matrix2D, some_data, ROWS*COLS*sizeof(float));

  for(size_t r=0; r<ROWS; r++)
  {
    for(size_t c=0; c<COLS; c++)
    {
      data.print_func(&data, r, c);
    }
    printf("\n");
  }

  free(data.matrix2D);
}


void print_float (const generic_t* ptr, size_t row, size_t col)
{
  float(*fmatrix)[COLS] = ptr->matrix2D; // cast to a pointer to a 2D float array
  printf("%f ", fmatrix[row][col]); // treat data as 2D array of float
}

您可以根据您对数据的处理方式创建类似的功能,每种可能的类型都有一个功能。

答案 1 :(得分:-1)

如评论中所述,如果您只希望在每个matriz中独立使用case,则只需将每个case的正文放入其自己的块中使用{ ... }。如果相反,您希望在函数的整个主体中访问matriz,则必须在switch之前声明它,并使用包含所有可能用途的类型。这就是union的用途。

在以下示例中,enum kind用于调用用户的选择,而union container可以存储您的四个选项中的任何一个。然后,在main函数中,根据k的值,您可以决定matriz的单元格中必须包含哪种类型的值,并使用{{1}的相应字段访问它们。

union container