ポインターを使用せずにCでポリモーフィズムをシミュレートする

の中に

TL; DR:

convert_typeを扱っているときでも、情報を失うことなく型キャストを行うことができる型(名前を付けましょう)はありますfloatか?

使用例:

float f1 = 12.34;
long i1 = 32;

convert_type tmp1 = (convert_type) f;
convert_type tmp2 = (convert_type) i;

float f2 = (float) tmp1; // should be 12.34
long i2 = (long) tmp2; // should be 32

環境 :

そのような関数を作成したい:

convert_type ask(char* question, val_type input_type)

val_typeによって定義されたタイプで

typedef enum {
    INT_T,
    STR_T,
    CHAR_T,
    FLOAT_T
} val_type;

引数にquestionは、入力を求めるために出力する文字列があります。

この関数のアイデアはstdin、タイプの入力をinput_type要求し、入力が有効になるまで再度要求することです。

使用例ask()

int main(int argc, char const *argv[]) {
    int nb = (int) ask("How many tries to you want ?\n --> ", T_INT);
    char * message = (char*) ask("What is the victory message ?\n --> ", T_STR);
    float prob = (float) ask("What is the probability of winning ?\n --> ", T_FLOAT);
    printf("\n\n");
    printf("Number of tries : %d\n", nb);
    printf("Victory message : %s\n", message);
    printf("Probability : %f\n", prob);
    return 0;
}

タイプを使用して実装しましたが、タイプunsigned longに問題がありfloatます。

実行例:

How many tries to you want ?
 --> many
The input must be a valid integer.
How many tries to you want ?
 --> -2131 
What is the victory message ?
 --> We are the champions !!!
What is the probability of winning ?
 --> 3.4.3
The input must be a valid float value.
What is the probability of winning ?
 --> 2.54


Number of tries : -2131
Victory message : We are the champions !!!
Probability : 2.000000

タイプではunsigned longうまく機能しないことがわかりますfloatunsigned longには整数値が含まれているため2.54なりまし2.00た)。

代わりにどのタイプを使用できますか?

MikeCAT

読み取り/書き込みタイプの不一致を引き起こさないように十分注意している場合は、次を使用してunion次のようにすることができます

#include <stdio.h>

typedef union {
    int int_data;
    char* str_data;
    char char_data;
    float float_data;
} convert_type;

typedef enum {
    INT_T,
    STR_T,
    CHAR_T,
    FLOAT_T
} val_type;

convert_type ask(char* question, val_type input_type) {
    static char[] str = "We are the champions !!!";
    convert_type ret;
    fputs(question, stdout);
    /* this is examples of how to set values. reading is omitted. */
    switch (input_type) {
        case INT_T:
            ret.int_data = -2131;
            break;
        case STR_T:
            ret.str_data = str;
            break;
        case CHAR_T:
            ret.char_data = 'a';
            break;
        case FLOAT_T:
            ret.float_data = 2.54;
            break;
    }
    return ret;
}

int main(int argc, char const *argv[]) {
    int nb = ask("How many tries to you want ?\n --> ", INT_T).int_data;
    char * message = ask("What is the victory message ?\n --> ", STR_T).str_data;
    float prob = ask("What is the probability of winning ?\n --> ", FLOAT_T).float_data;
    printf("\n\n");
    printf("Number of tries : %d\n", nb);
    printf("Victory message : %s\n", message);
    printf("Probability : %f\n", prob);
    return 0;
}

とは異なりstruct、のメンバーはunion1つのメモリスペース共有します。したがって、のメンバーに値を書き込むunionと、のメンバーはunion無効になります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Cでポリモーフィズムを「エミュレート」するときに、構造体メンバーを使用する場合と構造体ポインターをキャストする場合の違い

分類Dev

C ++ポリモーフィズム基本クラスポインタをベクトルに格納する

分類Dev

なぜポリモーフィズムでポインターを使用するのですか?

分類Dev

ポリモーフィズムとポインターを使用した構造体によるキャスト

分類Dev

matlabで「this」ポインターをシミュレートする

分類Dev

CRTPを使用して静的ポリモーフィズムで純粋仮想関数をエミュレートすることは可能ですか?

分類Dev

C ++で動的ポリモーフィズムを静的ポリモーフィズムに変換する

分類Dev

インターフェイスで継承とポリモーフィズムを効果的に利用する方法

分類Dev

スクリプトを使用せずに動的フレームワークを作成してシミュレータースライスを削除する方法

分類Dev

GUIをフリーズせずにtkinterでテール関数をシミュレートする

分類Dev

ファイル内の相対インポートを使用せずに、別のディレクトリにあるPythonスクリプトからファイル(他のモジュールをインポートする)を実行するにはどうすればよいですか?

分類Dev

C ++ファンクターポリモーフィズムを理解する

分類Dev

ポリモーフィズムに使用される参照とポインター?

分類Dev

スマートポインタによるポリモーフィズム

分類Dev

静的ポリモーフィズムを使用してint型とポインタ型を変換するにはどうすればよいですか?

分類Dev

同じ署名を持つメンバー関数を呼び出すために、関数テンプレートインスタンスの代わりに継承とポリモーフィズムを使用するのはなぜですか?

分類Dev

iPhone 6/6 Plusシミュレーターは、ディスプレイズームモードの変更をサポートしていますか?

分類Dev

変数にポリモーフィズムを使用する方法

分類Dev

AngularプロジェクトでTypeScript、インターフェイス、依存性注入でポリモーフィズムを使用する方法

分類Dev

コレクションインターフェイスを使用してArrayListオブジェクトを作成するポリモーフィズムの利点は何ですか?

分類Dev

カスタムポリモーフィックタイプのコレクションを使用してポリモーフィック動作を取得するにはどうすればよいですか?

分類Dev

C ++のポリモーフィズムにのみ継承を使用する

分類Dev

コレクション内のスマートポインターポリモーフィズム

分類Dev

C ++ポリモーフィズムは子コンストラクターを使用します

分類Dev

clangとgccは、スマートポインターを使用するときに、ポリモーフィズムの非仮想ベースデストラクタについて警告しませんか?

分類Dev

C#のリストのリストでポリモーフィズムを使用する方法

分類Dev

静的ポリモーフィズムを使用するコンストラクター問題の解決

分類Dev

参照を使用してJavaでC ++ポインターをシミュレートしますか?

分類Dev

ポリシーレコードを、トラフィックを中断せずにCloudFrontディストリビューションを指す単純なAレコードに置き換えるにはどうすればよいですか?

Related 関連記事

  1. 1

    Cでポリモーフィズムを「エミュレート」するときに、構造体メンバーを使用する場合と構造体ポインターをキャストする場合の違い

  2. 2

    C ++ポリモーフィズム基本クラスポインタをベクトルに格納する

  3. 3

    なぜポリモーフィズムでポインターを使用するのですか?

  4. 4

    ポリモーフィズムとポインターを使用した構造体によるキャスト

  5. 5

    matlabで「this」ポインターをシミュレートする

  6. 6

    CRTPを使用して静的ポリモーフィズムで純粋仮想関数をエミュレートすることは可能ですか?

  7. 7

    C ++で動的ポリモーフィズムを静的ポリモーフィズムに変換する

  8. 8

    インターフェイスで継承とポリモーフィズムを効果的に利用する方法

  9. 9

    スクリプトを使用せずに動的フレームワークを作成してシミュレータースライスを削除する方法

  10. 10

    GUIをフリーズせずにtkinterでテール関数をシミュレートする

  11. 11

    ファイル内の相対インポートを使用せずに、別のディレクトリにあるPythonスクリプトからファイル(他のモジュールをインポートする)を実行するにはどうすればよいですか?

  12. 12

    C ++ファンクターポリモーフィズムを理解する

  13. 13

    ポリモーフィズムに使用される参照とポインター?

  14. 14

    スマートポインタによるポリモーフィズム

  15. 15

    静的ポリモーフィズムを使用してint型とポインタ型を変換するにはどうすればよいですか?

  16. 16

    同じ署名を持つメンバー関数を呼び出すために、関数テンプレートインスタンスの代わりに継承とポリモーフィズムを使用するのはなぜですか?

  17. 17

    iPhone 6/6 Plusシミュレーターは、ディスプレイズームモードの変更をサポートしていますか?

  18. 18

    変数にポリモーフィズムを使用する方法

  19. 19

    AngularプロジェクトでTypeScript、インターフェイス、依存性注入でポリモーフィズムを使用する方法

  20. 20

    コレクションインターフェイスを使用してArrayListオブジェクトを作成するポリモーフィズムの利点は何ですか?

  21. 21

    カスタムポリモーフィックタイプのコレクションを使用してポリモーフィック動作を取得するにはどうすればよいですか?

  22. 22

    C ++のポリモーフィズムにのみ継承を使用する

  23. 23

    コレクション内のスマートポインターポリモーフィズム

  24. 24

    C ++ポリモーフィズムは子コンストラクターを使用します

  25. 25

    clangとgccは、スマートポインターを使用するときに、ポリモーフィズムの非仮想ベースデストラクタについて警告しませんか?

  26. 26

    C#のリストのリストでポリモーフィズムを使用する方法

  27. 27

    静的ポリモーフィズムを使用するコンストラクター問題の解決

  28. 28

    参照を使用してJavaでC ++ポインターをシミュレートしますか?

  29. 29

    ポリシーレコードを、トラフィックを中断せずにCloudFrontディストリビューションを指す単純なAレコードに置き換えるにはどうすればよいですか?

ホットタグ

アーカイブ