2017-04-06 76 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 [数字]作为一个“数字”的坐标,作为boardCoordinate的索引值输入。在C中使用char数组的坐标系统

我试图做的是设置一个系统,其中每个boardCoordinate都有一个包含坐标的char数组(字符串),并且可以使用返回X坐标的getCoordinateX值进行提取。

由于geCoordinateX函数中存在一些指针错误,它似乎没有工作。

任何想法如何去解决这个问题,所以我可以检索X坐标?感谢提前:)

+0

Don'tr垃圾邮件的标签! C++是一种不同的语言。 – Olaf

+1

你会发现它更容易和更易于维护,可以通过结构来实现。 –

+0

最好尽量避免使用结构体,并且不要使用它们@ChrisTurner :) – Imdad

回答

1

在评论,你说:

你也有没有的Structs的实现?我试图避免使用Structs进行学习。并感谢您的解释良好的帖子!

您可以使用一个int来存储的坐标。如果坐标值限制为0-9,则可以使用数字x*10 + y来表示它们。如果坐标值限制为0-99,则可以使用数字x*100 + y来表示它们。

E.g.假设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. char *指针是char类型的没有,则显然存储与const char *型指针字符串文字到char[]类型的阵列与char类型的元素,它可能编译,因为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]; 
} 

或等效的,只是remeber,你不能returna指针到一个局部变量,因为你会导致不确定的行为,这就是为什么我已经使用了static,你也可以像你的例子那样传递数组。

+0

谢谢你! :)你还有没有Structs的实现?我试图避免使用Structs进行学习。并感谢您的解释良好的帖子! – Imdad

+0

如果你避免使用这个结构,并使用一个字符串作为坐标,你将会遇到麻烦,并且在学习语言方面遇到的困难比你想象的要多。相反,如果您不想使用结构,请避开坐标系。结构是c语言中非常重要的一部分,没有它们,你就不会写任何有趣的东西,而且它们也不难理解或使用。如果我现在在学习c,我会避免使用指针和字符串,但不要使用结构。 –

+0

@Imdad也注意到其他人也提出了这个解决方案,这是因为他们是经验丰富的c程序员,他们明白为什么这是最简单和更直接的解决方案。 –

2

要走的路是struct如已经在另一个答案解释(见https://stackoverflow.com/a/43259364/4386427)。

但你说:

最好尽量避免结构体和做没有他们

好吧,如果你真的想保存的坐标为逗号分隔字符串,即"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"); 

,或者你可以像初始化变量:

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

对于getCoordinateX功能,你可以这样做:

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

    return xValue; 
} 

但是通知那将只有为0和9之间的坐标工作。如果坐标可以是10或更高(或负值),则需要更多代码才能正确提取xy(并且每个元素的空间多于4串)。

所以这里是一个小例子:

#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数组的数组:

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}}; 

访问它像coords[3][1]这会从{0,2}

返回2如果您想打印出 “X,Y” 你总是可以做:

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