2012-03-26 5 views
2

int配列を宣言してからcharで初期化することはできますか?私は各移動の後にゲームの状態を印刷しようとしているので、最初は配列は文字でいっぱいになるでしょうし、各移動はエントリがintに更新されます。整数とcharを単一の配列で表現しなければならない場合、Cでこれを行うにはどうすればよいでしょうか?

私は答えがイエスだと思いますが、これは許可されており、intは32ビットでcharは8ビットなので動作します。配列のn + 1番目のアドレスはn + 32ビットになり、charは最初の8ビットのみを使用するため、それぞれのcharがお互いに24ビットのメモリでオフセットされると仮定します

私は宿題に取り組んでいる間に出てきた宿題に関する質問ではありません。たぶん私は完全に間違っているし、私はすべてを設定した方法をコンパイルされません?

編集:私はを持っていますが、この記事のタイトルごとに1つの配列で表現することはできません。私はちょうどそれを行う簡単な方法を考えることができませんでした。

+0

'char'は単に' int'よりも小さい数である。ここで一例です。 charをintに自由にキャストできます。 –

+3

charが初期状態を表し、intが後の状態を表す場合、char-vs-intに頼るのではなく、状態をよりよくエンコードするクラスまたは構造体にするのはなぜですか?あなたが何かをすることができるからといって、あなたが意味するものではありません。 –

答えて

4

また、各要素がcharまたはintの和集合であるユニオンの配列を作成することもできます。そうすれば、あるものを別のものとして扱うために型キャスティングをする必要がなくなり、物の大きさを気にする必要がなくなります。

+0

ああ、それはとても素敵です。私はタイプキャスティングを避けるので、この答えが好きです。 – sep332

2

intchar数値型であり、charは(したがって、intが期待されているcharを供給することは安全である)intよりも小さいことが保証されているので、一言で言えばそう、あなたがそれを行うことができます。

+0

'char'は必ずしも署名されていません。 'signed char'は明らかです。 –

+0

@NiklasB:確かに、それは普通の 'char'は' signed'保証されていません。キャッチーありがとうございます。 – Jon

2

はい、charは暗黙的にintに変換されるため、機能します。

"私は答えがイエスだと思うが、これは許可されており、intは32ビットでcharは8ビットなので動作する。"これは間違っています、intは必ずしも32ビットではありません。また、sizeof(char)は1ですが、必ずしも8ビットである必要はありません。

0

説明したように、charint互換タイプです。

あなたの説明から、最初に値がcharであるintの配列で開始するかもしれません。そして、ゲームが進行するにつれて、char値はもはや関連しなくなり、int値になります。はい?

IMHO問題は、intにcharを入れていないということです。それは動作し、言語に組み込まれています。

IMHOは、同じ種類のスペースを使用していずれかのタイプを格納できるようにするのに役立ちますが、重要ではありません。驚くほど小型のマイクロコントローラを使用している場合を除き、スペースの節約は重要ではありません。

ボードを書きやすいようにしたいのはなぜか分かりますが、それはゲーム作成のごく一部であると思います。残りのゲームでは単純にコードの最初の数行に焦点を当てるよりも。

プログラムについて考えてみましょう。ボードの印刷方法を検討してください。

for (int i=0; i<states; ++i) { 
    printf("%c ", game_state[i]); 
} 

ゲームが進むにつれてその後、これらの値のいくつかはint次のようになります。それができる開始時

「セルの値を印刷するにはどのフォーマットが必要ですか?」という問題があります。 %c形式は1つの文字を出力します。 intの値が通常の印刷文字とは異なって印刷されていると思われますか?たとえば、intの値を整数、つまり10進数(または16進数)の文字列にしたいとしますか?これには '%d'形式が必要です。私のMac上で

私はこれでした:

#include <stdio.h> 

#define MAX_STATE (90) 

int main (int argc, const char * argv[]) { 
    int game_state[MAX_STATE]; 
    int state; 
    int states; 

    for (states=0; states<MAX_STATE; ++states) { 
     game_state[states] = states+256+32; 
    } 

    for (int i=0; i<states; ++i) { 
     printf("%c ", game_state[i]); 
    } 

    return 0; 
} 

を表現states+256+32は出力文字コードはASCIIでない、あるいはISO-8859-1、彼らはコードをコントロールしていない保証します。それらは単なる整数です。出力は次のとおりです。

! " # $ % & ' () * + , - ./0 1 2 3 4 5 6 7 8 9 : ; <=> ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ]^_ ` a b c d e f g h i j k l m n o p q r s t u v w x y 

私は値が初期文字(%cの形式)であるときに、印刷される元の文字(無データ変換)をたいと思いますが、あなたは、データ変換を見たいです、 2進数から数字の文字列(%dまたは相対形式)に変換します。はい?

どのようにプログラムがどのようなものかを伝えますか?

intの値が(プログラムのように)文字でないことを確認できます。通常、これは苦痛になります。なぜなら、値が制限されていて、その1つの仕事をより簡単にするために面白い表現を使用するからです。

私は「値がまだcharある」と言うフラグを使用する方が簡単だと思いますか

「の値がintである」労働組合を使用してから、スペースの小さな節約がしばらくまれ価値がある、と初期状態と現在の移動が利用可能であることに利点があります。

だから私はあなたのようなもので終わると思う:移動が任意の便利な値にすることができ

#include <stdio.h> 

#define MAX_STATE (90) 

int main (int argc, const char * argv[]) { 
    struct GAME { int cell_state; int move; char start_value } game_state[MAX_STATE]; 
    enum CELL_STATE_ENUM { start_cell, move_cell }; 
    int state; 
    int states; 

    for (states=0; (state=getchar())!= EOF && states<MAX_STATE; ++states) { 
     game_state[states].start_value = state; 
     game_state[states].cell_state = start_cell; 
    } 
    // should be some error checking ... 

    // ... make some moves ... this is nonsense but shows an idea 
    for (int i=0; i<states; ++i) { 
     if (can_make_move(i)) { 
      game_state[states].cell_state = move_cell; 
      game_state[states].move = new_move(i); 
     } 
    } 

    // print the board 
    for (int i=0; i<states; ++i) { 
     if (game_state[i].cell_state == start_cell) { 
     printf("'%c' ", game_state[i].start_value); 
     } else if (game_state[i].cell_state == move_cell) { 
      printf("%d ", game_state[i].move); 
     } else { 
      fprintf(stderr, "Error, the state of the cell is broken ...\n"); 
     } 
    } 

    return 0; 
} 

、プログラムの残りの部分を複雑にするものは何もありません。

0

あなたの意向は、stdint.hヘッダーのint8_tまたはuint8_tを使用してもう少し明確にすることができます。この方法では、「私は8ビットの整数を使用していますが、の数字がになるようにします。

0

これは可能かつ非常に簡単です。

int main() 
{ 
    // int array initialized with chars 
    int arr[5] = {'A', 'B', 'C', 'D', 'E'}; 
    int i; // loop counter 

    for (i = 0; i < 5; i++) { 
     printf("Element %d id %d/%c\n", i, arr[i], arr[i]); 
    } 

    return 0; 
} 

出力である:

Element 0 is 65/A 
Element 1 is 66/B 
Element 2 is 67/C 
Element 3 is 68/D 
Element 4 is 69/E 
関連する問題