Как определить / использовать 2-D массив строк (3-й символ?) В C? - PullRequest
0 голосов
/ 19 апреля 2019

Я новичок в программировании, особенно в C; просто пытаюсь чесать зуд.

Попытка использовать ncurses для создания ASCII-человека, выполняющего прыжковые удары, пытаясь последние три дня, но я просто не получаю «Струны» в C (я понимаю, что строки на самом деле не являются концепцией C, просто массивы символов), и я не получаю указатели, и я не получаю указатели на массивы символов и т. д.

прости искусство; это просто доказательство концепции.

И я не пытаюсь сделать анимацию (или даже использовать ncurses) на данный момент (эта часть проста); Я просто пытаюсь понять, как использовать массивы для хранения моих кадров анимации (хотя я открыт для других идей сделать это, если они концептуально проще).

#define NumOfFrames      4  // Num of animation frames
#define WidthOfFrames   15  // Characters per animation line
#define FrameHeight  5  // Frame is this many lines tall.

const char *D51[NumOfFrames][FrameHight][WidthOfFrames] = {{
    " \\ 0 /  ",
    "  \\|/   ",
    "   |     ",
    "  / \\   ",
    "_/   \\_ "
},
{
    "         ",
    " __0__   ",
    "/  |  \\  ",
    "  / \\   ",
    " _\\ /_  "
},
{
    "         ",
    "   o     ",
    " /\\ /\\ ",
    " |/ \\|  ",
    " _\\ /_  "
},
{
    "         ",
    "         ",
    "   __  ",
    "  /_\\\\0_  ",
    " _\\\\/_  \\_"
}};

void main(int argc, char *argv[]) {

    FILE *f = fopen("log.txt","w");
    if (f == NULL) {
    printf("Error opening file!\n");
    exit(1);
    }

    // Try to print each frame to a text file to wrap
    // my brain around how this works.
    for (int x=0;x<NumOfFrames;x++) {
        for (int y=0;y<FrameHeight;y++) {
            for (int z=0;z<WidthOfFrames;z++) {
                fprintf(f, "%c", D51[x][y][z]);
            }
            fprintf(f,"\n");
        }
    }

    fclose(f);
}

В этом коде я просто пытаюсь понять, как манипулировать строками, записывая изображения в текстовый файл. Как только я пойму концепции, я переведу его в ncurses "графический" формат; эта часть проста и не отражена в этом примере кода.

Моя проблема в том, что независимо от того, какие перестановки я пробую в своих экспериментах - a * здесь и не там, или там и здесь, или там, но не здесь, или два индекса вместо трех, или тот или иной - я не могу понять, что происходит под капотом. В Интернете я могу найти примеры того, что мне нужно, если я использую целые числа, но использование chars / strings / pointers добавляет целый более низкий уровень сложности, который я просто не получаю. Буду очень признателен за любую помощь в лучшем понимании нужных мне понятий.

1 Ответ

0 голосов
/ 22 апреля 2019

Я думал, что каждая фигура состоит из массива указателей символов

const char *D51 [FrameHeight] = {
" \\ 0 /  ",
"  \\|/   ",
"   |     ",
"  / \\   ",
"_/   \\_ "
};

, за которыми следуют другие цифры * D52, * D53, * D54.Тогда у нас будет указатель на указатель, который будет содержать адреса этих цифр, такие как

const char **ptr [NumOfFrames];
*ptr = D51;
*(ptr+1) = D52
..

, теперь, когда у нас есть адреса для каждого отдельного символа, назначенного ** ptr, прямо или косвенно мы можем идти впереди работать над печатью рисунков.Например, это даст нам первую цифру

for (int i=0; i<5; i++)
printf("%s\n", *(*(ptr)+i));

, а чтобы сделать *(*(ptr)+i) более понятным, давайте разберем ее **ptr - указатель на указатель и, следовательно, *ptr будет содержать адрес указателяпричина, по которой в *(ptr) заключены квадратные скобки, заключается в том, что мы хотим выбрать нужную нам фигуру, если мы хотим, чтобы первая цифра называлась *ptr, и если мы хотим, чтобы вторая фигура отображалась, мы просто вызываем *(ptr+1) и такon.

+i позволяет нам указать, какую строку цифры вызывать, например, если мы хотим вызвать первую строку, мы можем оставить i равным 0, но если мы хотимНазовите нижнюю строку фигуры, нам нужно, чтобы i было 4.Точно так же, как *(ptr)+4.

Теперь, когда мы указали и номер рисунка, и номер строки, все, что нам нужно сделать, это разыменовать указатель, добавив оператор *.*(*(ptr)+i)

пример кода, который я написал:

..
..

const char *D54 [FrameHeight] = {
"         ",
"         ",
"   __  ",
"  /_\\\\0_  ",
" _\\\\/_  \\_"
};

const char **ptr [NumOfFrames];


int main(){
*ptr = D51;
*(ptr+1) = D52;
*(ptr+2) = D53;
*(ptr+3) = D54;

for(int j=0; j<4; j++)
{
  for (int i=0; i<5; i++)
    printf("%s\n", *(*(ptr+j)+i));
puts (" "); //this is nothing more than a newline character
}
return 0;
}

вывод:

 \ 0 /
  \|/
   |
  / \
_/   \_


 __0__
/  |  \
  / \
 _\ /_


   o
 /\ /\
 |/ \|
 _\ /_



   __
  /_\\0_
 _\\/_  \_
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...