1

ユーザーが単一のインターフェイスを使用して、int、char、float、または double 型の 1 次元、2 次元、または 3 次元の配列を作成できるようにする配列ライブラリを作成しようとしています。私の現在のアプローチは複雑すぎるようです。正しい軌道に乗っているかどうか疑問に思っています。ありがとうございます。

typedef enum type
{
    CHAR, INT, FLOAT, DOUBLE
}

Type;

typedef struct array
{
    void *values;          // pointer to the data
    Type type;           // type of data
    int rank;            // # of dimensions (1, 2, and 3)
    int dimensions[3];   // a,b,c array dimensions
}

MultiArray;

MultiArray * array_init(int rank, int dims[], Type type); //init new Array

Array a;
a.ranking = ranking;
a.type = type;

switch (ranking)
{

    case 3:
    a.dimensions[0] = dimensions[0];
    a.dimensions[1] = dimensions[1];
    a.dimensions[2] = dimensions[2];

    switch (type)
    {

            case CHAR:
            values = new char**[dimensions[0]];

            for (int i = 0;i < dimensions[0];i++)
            {
                (((char***)values)[i]) *= new char * [dimensions[1]];

                for (int j = 0;j < dimensions[1];j++)
                    ((((char***)values)[i])*[j]) *= new char[dimensions[2]];
            }

            break;

            case INT:
            values = new int**[dimensions[0]];

            for (int i = 0;i < dimensions[0];i++)
            {
                (((int***)values)[i]) *= new int * [dimensions[1]];

                for (int j = 0;j < dimensions[1];j++)
                    ((((int***)values)[i])*[j]) *= new int[dimensions[2]];
            }

            break;

            case FLOAT:
            values = new float**[dimensions[0]];

            for (int i = 0;i < dimensions[0];i++)
            {
                (((float***)values)[i]) *= new float * [dimensions[1]];

                for (int j = 0;j < dimensions[1];j++)
                    ((((float***)values)[i])*[j]) *= new float[dimensions[2]];
            }

            break;

            case DOUBLE:
            values = new double**[dimensions[0]];

            for (int i = 0;i < dimensions[0];i++)
            {
                (((double***)values)[i]) *= new double * [dimensions[1]];

                for (int j = 0;j < dimensions[1];j++)
                    ((((double***)values)[i])*[j]) *= new double[dimensions[2]];
            }

            break;
    }

    break;

    case 2:
    a.dimensions[0] = dimensions[0];
    a.dimensions[1] = dimensions[1];

    switch (type)
    {

            case CHAR:
            values = new char * [dimensions[0]];

            for (int i = 0;i < dimensions[0];i++)
                (((char**)values)[i]) *= new char[dimensions[1]];

            break;

            case INT:
            values = new int * [dimensions[0]];

            for (int i = 0;i < dimensions[0];i++)
                (((int**)values)[i]) *= new int[dimensions[1]];

            break;

            case FLOAT:
            values = new float * [dimensions[0]];

            for (int i = 0;i < dimensions[0];i++)
                (((float**)values)[i]) *= new float[dimensions[1]];

            break;

            case DOUBLE:
            values = new double * [dimensions[0]];

            for (int i = 0;i < dimensions[0];i++)
                (((double**)values)[i]) *= new double[dimensions[1]];

            break;
    }

    break;

    case 1:
    a.dimensions[0] = dimensions[0];

    switch (type)
    {

            case CHAR:
            values = new char[dimensions[0]];
            break;

            case INT:
            values = new int[dimensions[0]];
            break;

            case FLOAT:
            values = new float[dimensions[0]];
            break;

            case DOUBLE:
            values = new double[dimensions[0]];
            break;
    }

    break;
}

return a;

void display_array(Array * arr); // prints Array

ありがとうございました

4

0 に答える 0