我一直在尝试将程序从Java转换为C,它是 watch 的模拟器,并显示我使用Ascii艺术的时间。我已将所有数字(0-9)存储在2D char数组(fx。9)中:

char nine[7][5] = {
    { '0', '0', '0', '0' },
    { '0', ' ', ' ', '0' },
    { '0', ' ', ' ', '0' },
    { '0', '0', '0', '0' },
    { ' ', ' ', ' ', '0' },
    { ' ', ' ', ' ', '0' },
    { ' ', ' ', ' ', '0' }
};

我现在有一个函数,该函数是将存储在int数组中的时间转换(fx。22:04:59,将在数组中存储为220459)。该函数应将对应的Ascii样式返回给每个数字,以便我最终可以调用该函数,该函数打印采用6个char [] []参数的时间(以ascii形式)。

简而言之,我需要知道使用哪个6个参数来调用此函数:
void printScreen(char hourFirstDigit[7][5], char hourSecondDigit[7][5], char minuteFirstDigit[7][5], char minuteSecondDigit[7][5], char secFirstDigit[7][5], char secSecondDigit[7][5])

在Java中,我的解决方案只是简单地创建一个函数,该函数返回char [] []数组,然后返回10种情况(0-9)的switch语句,(这是前几行):
char timeToAsciiArt[][](int digitNumber, int small) {
switch (timeRightNow[digitNumber]) {
    case 0:
    return zero;
}

可能的解决方案:
我读到那里至少有两种可能的方法可以解决该问题(通常):1.用指向数组的指针替换。 2.用结构包装。

我的想法是:
1.我真的不确定如何返回指向数组的指针(有人可以用案例0:来说明如何做到这一点吗?

最佳答案

据我了解,您希望拥有:

  • 某种用于ASCII艺术的存储;
  • 一个函数,它接收一个数字并返回一些指针到相应的ASCII art存储区;
  • 一个函数,它接收一组ASCII艺术作品并将其打印出来。

  • 存储ASCII文字
    将ASCII文字包装到一个结构中可能是明智的,因为您可以随后存储有关它的更多数据。也许将来您会希望使用更薄的1数字;您将需要存储有关每种ASCII字体大小的数据:
    struct ascii_digit {
        unsigned int width;
        unsigned int height;
        char[MAX_HEIGHT][MAX_WIDTH] art; //Here you could instead use a pointer
                                         //instead of storing directly
    }
    
    当然,如果您绝对不打算使用固定大小以外的东西,那么数组就可以了。

    寻找正确的ASCII文字
    在C中传递数组时,通常不直接传递数组:通常使用指向它的指针。因此,不会为您的函数提供正确的原型(prototype)
    char time_to_ascii_art[][](int digit_number, int small);
    
    但是,如果您使用结构
    struct ascii_digit* time_to_ascii_art(int digit_number, int small);
    

    或者您可以使用幼稚的方法使用指向char的指针:
    char* time_to_ascii_art(int digit_number, int small);
    
    请注意,如果您有一个指向二维数组的char*指针,则在尝试访问其内容时必须自己进行数学计算。例如,访问第y行的x成员:array[width * x + y]。为了避免这样做,您可以使用指向数组的指针:
    char (*time_to_ascii_art)(int digit_number, int small)[ASCII_ART_WIDTH];
    
    在此函数中,您可以像在Java中一样使用switch … case语句(使用结构的示例):
    // Let's say that your structures are declared in the global scope as ascii_zero, ascii_one…
    struct ascii_digit* time_to_ascii_art(int digit_number, int small)
    {
        switch(digit_number) {
            case 0:
              return ascii_zero;
            case 1:
              return ascii_one;
            default:
              return NULL;
        }
    }
    
    或者您可以-在Java中可能也是个好主意-建立一个包含ASCII艺术作品或指向它们的指针的数组,并对其进行索引,以便访问n成员将为您提供数字n的ASCII艺术作品:
    // Let's now say you have an ascii_digits array of structs containing your digits
    struct ascii_digit* time_to_ascii_art(int digit_number, int small)
    {
        return ascii_digits + digit_number; // You should handle bad values.
        // ascii_digits being an array, it is implicitly cast to a pointer here.
    }
    

    将ASCII艺术传递给显示功能
    现在将ASCII艺术传递到显示功能,您可以根据所选择的数据类型使用指向结构的两个指针:
    void print_screen(struct ascii_digit* hour_first_digit, …);
    
    指向char的指针:
    void print_screen(char* hour_first_digit, …);
    
    或指向字符数组的指针:
    void print_screen(char (*hour_first_digit)[ASCII_ART_WIDTH], …);
    

    关于c - C的新增功能,返回指向2D数组的指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33543781/

    10-11 22:40
    查看更多