2017-04-06 8 views
-5
char boardCoordinates[15]; 
    void setupBoardCoordinates(char boardCoordinates[]) 
{ 
    boardCoordinates[0] = "0,0"; 
    boardCoordinates[1] = "0,1"; 
    boardCoordinates[2] = "1,1"; 
    boardCoordinates[3] = "0,2"; 
    boardCoordinates[4] = "1,2"; 
    boardCoordinates[5] = "2,2"; 
    boardCoordinates[6] = "0,3"; 
    boardCoordinates[7] = "1,3"; 
    boardCoordinates[8] = "2,3"; 
    boardCoordinates[9] = "3,3"; 
    boardCoordinates[10] = "0,4"; 
    boardCoordinates[11] = "1,4"; 
    boardCoordinates[12] = "2,4"; 
    boardCoordinates[13] = "3,4"; 
    boardCoordinates[14] = "4,4"; 
} 

int getCoordinateX(const char boardCoordinates[], int number) 
{ 
    char coordinates[] = boardCoordinates[number]; 
    char xValue = coordinates[2]; 

    return (int) xValue; 
} 

私は、それぞれのboardCoordinate [number]がboardCoordinateのインデックス値として入力された "数値"の座標として機能する座標系を設定しようとしています。Cで文字配列を使用する座標系

私がしようとしたのは、各boardCoordinateが座標を含むchar配列(文字列)を持ち、例えばX座標を返すgetCoordinateX値を使用して抽出できるシステムをセットアップすることでした。

geCoordinateX関数のポインタエラーのために動作していないようです。

どのように私はX座標を取得できるようにこの問題を修正するつもりですか?事前のおかげ:)

+0

Don'trスパムタグ! C++は異なる言語です。 – Olaf

+1

構造体でこれを行う方が簡単でメンテナンスが容易です。 –

+0

好ましくは構造体を避けて、@ChrisTurnerなしでそれを行います。 – Imdad

答えて

1

、あなたが言った:

は、あなたはまた、構造体なしの実装を持っていますか?私はStructsを学習目的で使用することを避けようとしています。また、よく説明されたポストに感謝します!

座標を格納するためにintを使用できます。座標値が0〜9に制限されている場合は、数値を表すのにx*10 + yを使用できます。座標値が0〜99に制限されている場合は、数字をx*100 + yで表すことができます。

など。 x*10 + yを仮定:

int boardCoordinates[15]; 

void setupBoardCoordinates(char boardCoordinates[]) 
{ 
    boardCoordinates[0] = 0; 
    boardCoordinates[1] = 1; 
    boardCoordinates[2] = 11; 
    boardCoordinates[3] = 2; 
    boardCoordinates[4] = 12; 
    boardCoordinates[5] = 22; 
    boardCoordinates[6] = 3; 
    boardCoordinates[7] = 13; 
    boardCoordinates[8] = 23; 
    boardCoordinates[9] = 33; 
    boardCoordinates[10] = 4; 
    boardCoordinates[11] = 14; 
    boardCoordinates[12] = 24; 
    boardCoordinates[13] = 34; 
    boardCoordinates[14] = 44; 
} 

int getCoordinateX(const char boardCoordinates[], int number) 
{ 
    return boardCoordinates[number]/10; 
} 

int getCoordinateY(const char boardCoordinates[], int number) 
{ 
    return boardCoordinates[number]%10; 
} 

あなたがx*100 + yを使用する必要がある場合は、それを絞り込むことができます。

4

であなたのアプローチにはいくつかの問題、

  1. があります。あなただけの構造

    struct coordinate { 
        int x; 
        int y; 
    }; 
    
  2. Aを作成し、全くの文字列であることを座標を必要はありません。 char *ポインタのタイプがcharではない場合は、タイプconst char *の文字列リテラルへのポインターを、char[]のタイプの配列に格納しています。タイプはcharです。it charは整数型ですが、変換が定義された動作を保証していないため、実際にはc標準で指定されているように定義されていないため、正しくありません。ただし、コンバージョンに関する警告が表示されるはずです。

あなたがstruct coordinateを使用する場合は、あなたが

const struct coordinate * 
get_coordinate_x(int index) 
{ 
    static const struct coordinate board_coordinates[15] = { 
     {0, 0}, {0, 1}, ..., {4, 4} 
    }; 
    return &board_coordinates[index]; 
} 

または同等のものを書くことができ、あなたは未定義の動作の原因となりますので、ちょうどなぜそれがだ、あなたはローカル変数へのreturnaポインタができないことを覚えstaticを使用した場合は、例のように配列を渡すこともできます。コメントで

+0

ありがとう! :)あなたはStructsのない実装もしていますか?私はStructsを学習目的で使用することを避けようとしています。また、よく説明されたポストに感謝します! – Imdad

+0

構造体を避けて、座標に文字列を使用すると、困ったことになり、思うよりも言語を学習するのが難しくなります。構造体をまだ使用したくない場合は、座標系を使用しないでください。構造はC言語の非常に重要な部分です。あなたはそれらがなければ何も面白く書くことはできません。理解するのも、全く使用することも難しくありません。私が今cを学んでいたなら、ポインタと文字列を避けますが、構造体は避けます。 –

+0

@Imdadはまた、他の人がこの解決法を提案していることにも注意しています。なぜなら、これが最も単純でより簡単な解決策である理由を理解しているプログラマーです。 –

2

もう一つの答え(https://stackoverflow.com/a/43259364/4386427参照)で既に説明したように、行く方法はstructです。

しかし、あなたは次のようにコメントし

が好ましくすなわち "x,y"、それができる、構造体を回避しようとしているとあなたが本当にカンマ区切りの文字列として座標を保存したい場合は、それらなし

オーケー、それを行いますあなたの現在のコードにはいくつかの問題があります。

char boardCoordinates[15]; 

まず

これは15列のアレイではありません。これは、ゼロ終了を含む15文字分のスペースを持つ単一の文字列です。長さ15の文字列を3にするには、

char boardCoordinates[15][4]; // Notice 4 to make room for string termination 

次の問題があります。代わりに

boardCoordinates[0] = "0,0"; 

のあなたは

strcpy(boardCoordinates[0], "0,0"); 

が必要になるでしょうか、のような変数を初期化できます。

int getCoordinateX(const char boardCoordinates[][4], int number) 
{ 
    int xValue = boardCoordinates[number][0] - '0'; 

    return xValue; 
} 
:あなたのような何かができる getCoordinateX機能について

char boardCoordinates[15][4] = {"0,0", "0,1", "1,1", ...... }; 

しかし通知は0と9の間の座標になります。座標が10以上(または負)の場合は、xyを正しく抽出するコードが必要です文字列)。だからここ

は少しサンプルです:

#include <stdio.h> 

int getCoordinateX(const char boardCoordinates[][4], int number) 
{ 
    int xValue = boardCoordinates[number][0] - '0'; 
    return xValue; 
} 

int getCoordinateY(const char boardCoordinates[][4], int number) 
{ 
    int yValue = boardCoordinates[number][2] - '0'; 
    return yValue; 
} 

int main(void) { 
    char boardCoordinates[2][4] = {"1,2", "3,4"}; 

    printf("x[0]=%d\n", getCoordinateX(boardCoordinates, 0)); 
    printf("y[0]=%d\n", getCoordinateY(boardCoordinates, 0)); 
    printf("x[1]=%d\n", getCoordinateX(boardCoordinates, 1)); 
    printf("y[1]=%d\n", getCoordinateY(boardCoordinates, 1)); 
    return 0; 
} 

出力:

x[0]=1 
y[0]=2 
x[1]=3 
y[1]=4 

だけ繰り返す: @で説明したようにそれは、テキスト文字列を使用して行うことができますが、最良の方法は、structですIharob Al Asimi

1

このようにint配列の配列を使うことができます:

あなたがプリントアウトしたい場合、これは {0,2}

から2を返しますcoords[3][1]よう

int coords[15][2] = {{0,0},{0,1},{1,1},{0,2},{1,2},{2,2},{0,3},{1,3},{2,3},{3,3},{0,4},{1,4},{2,4},{3,4},{4,4}}; 

アクセス、それを "×、yは" あなたが常に行うことができます。

std::cout << coords[i][0] << ',' << coords[i][1] << std::endl;