как изменить часть аргумента, переданного функции в C? - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть функция

Oled_lo go (const unsigned char * image)

, поэтому, если я передам

unsigned char giphy_0 [] = {0x80, 0x81, 0x03, 0x07, 0x0f, 0x1f, 0x1f, 0x3f, 0x7f, 0xff, 0};

например -

Oled_lo go (giphy_0);

это работает

, но я получил 14 таких изображений с именами giphy_0, giphy_1 .. giphy_14

, поэтому я хочу запустить их один за другим, чтобы получить анимацию

Я просто хочу передать аргументы в Oled_lo go, например, Oled_lo go (giphy_0) или Oled_log (giphy_1) или Oleg_lo go (giphy_2), поэтому вместо того, чтобы делать это 14 раз, я хочу вызвать функцию Oled_lo go в l oop и изменить часть аргумента giphy_imagenumber в l oop.

Поэтому вместо написания кода для вызова функции Oled_lo go 14 раз, я хочу, чтобы al oop, где я передаю giphy_imagenumber в функцию Oled_lo go и этот номер заменен редактируемый переменной l oop, поэтому мне нужно написать всего несколько строк в al oop. После этого я попытался

unsigned char x[] = "giphy_0";
    volatile unsigned char y ;
    while(1)
    {
        for(int image_gif = 0 ; image_gif<=14;image_gif++)
        {

            x[6] = image_gif + 0x30;

        Oled_logo(x);

        ssd1306_UpdateScreen();
        HAL_Delay(4000);
        }
}

Ошибка не возникла, но вывод - это какой-то мусор

Я попытался с помощью strcat, преобразовал переменную l oop в строку и конкатанат с помощью giphy_ и передал в Oled_lo go функция та же проблема

Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 19 февраля 2020

{ 0x80, 0x81, 0x03, 0x07, 0x0f, 0x1f, 0x1f, 0x3f, 0x7f, 0xff, 0 }

отличается от

"giphy_0"

То, что вы пытаетесь достичь, кажется неправильным или вы упускаете кусок.

Полагаю, вам нужен массив типа { giphy_0, giphy_1, ... }, а затем используйте индекс в этом массиве.

0 голосов
/ 20 февраля 2020

То, что вы пытаетесь сделать, это передать строку с именем рассматриваемой переменной, ожидая, что программа автоматически заменит эту строку содержимым переменной с таким именем. Это не то, как C работает.

Реальная проблема здесь в том, как вы определили массивы. Вместо того, чтобы иметь набор массивов с именами, содержащими номер массива:

unsigned char giphy_0 [] = { 0x80, 0x81, 0x03, 0x07, 0x0f, 0x1f, 0x1f, 0x3f, 0x7f, 0xff, 0 };
unsigned char giphy_1 [] = { 0x80, 0x81, 0x03, 0x07, 0x0f, 0x1f, 0x1f, 0x3f, 0x7f, 0xff, 0 };
unsigned char giphy_2 [] = { 0x80, 0x81, 0x03, 0x07, 0x0f, 0x1f, 0x1f, 0x3f, 0x7f, 0xff, 0 };
...
unsigned char giphy_14 [] = { 0x80, 0x81, 0x03, 0x07, 0x0f, 0x1f, 0x1f, 0x3f, 0x7f, 0xff, 0 };

Создайте массив массивов:

unsigned char giphy[][11] = {
    { 0x80, 0x81, 0x03, 0x07, 0x0f, 0x1f, 0x1f, 0x3f, 0x7f, 0xff, 0 },
    { 0x80, 0x81, 0x03, 0x07, 0x0f, 0x1f, 0x1f, 0x3f, 0x7f, 0xff, 0 },
    { 0x80, 0x81, 0x03, 0x07, 0x0f, 0x1f, 0x1f, 0x3f, 0x7f, 0xff, 0 },
    ...
    { 0x80, 0x81, 0x03, 0x07, 0x0f, 0x1f, 0x1f, 0x3f, 0x7f, 0xff, 0 },
};

И передайте l oop через внешнее измерение:

    for(int image_gif = 0 ; image_gif<=14; image_gif++)
    {
        Oled_logo(giphy[image_gif]);

        ssd1306_UpdateScreen();
        HAL_Delay(4000);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...