Две функции в Си сталкиваются при совместном использовании, но работают отлично, если используются по одному, что я могу сделать? - PullRequest
0 голосов
/ 22 июня 2019

Я пытаюсь сделать анимацию, используя массив адресов с алгоритмом для вычисления текущего изображения анимации.У меня есть две функции, одна из которых представляет собой простой «счетчик от 1 до N», другая содержит направление, поэтому я могу где-то изменить направление, и поэтому функция начинает воспроизводить анимацию только для этого направления.Адреса изображений всех направлений сохраняются в массиве, так что, например, 1-3 вверх, 4-6 справа, 7-9 вниз и 10-12 слева.

Теперь к моей проблеме:Если я использую обе мои функции, программа перестает работать.Если я использую только одну функцию, все работает нормально, и поскольку обе функции в основном одинаковы, просто с другим алгоритмом, я не понимаю, почему он останавливается, когда я запускаю обе функции.

Я генерирую свой адресный массивс моей собственной функцией, поэтому мне не нужно иметь тонны строк с:

adr[1] = "bla_1";
adr[2] = "bla_2";

... но это не работает, как только я использую 2 «функции анимации».

Я пытался не использовать функцию и писать адреса вручную, теперь она работает просто отлично.Но это не возможное решение для меня.Так что, я думаю, я допустил ошибку в своей функции генерации массива адресов, даже если она работает нормально, если я использую только одну «анимационную функцию».

______________________________ MAIN _______________________________

    char* playerAdr[8];

    int count = 0;

    char intString[8];

    int gvPlayerDir = 2; // just for example!

    loadAdrArrPaths( playerAdr, 8, "src/images/player" );

    /*

    playerAdr[0] = "src/images/player_1.png";

    playerAdr[1] = "src/images/player_2.png";

    ...

    playerAdr[7] = "src/images/player_8.png";

    */

    printMultiAnimation( playerAdr, 2, 300, setPos(82,50), 1, gvPlayerDir   );

    //printAnimation( playerAdr, 8, 300, setPos(50,50), 1 );

______________________________ HEAD _______________________________

    void printAnimation( char* adrArr[], int adrNr, int frameTime, sPos pos, bool transparent ){

        int tempInt = ((SDL_GetTicks() - gvTimestamp) / frameTime) % adrNr;

            printSurface( adrArr[tempInt], pos, transparent );

    }

    void printMultiAnimation( char* adrArr[], int adrNr, int frameTime, sPos pos, bool transparent, int dir ){

        int tempInt = (((SDL_GetTicks() - gvTimestamp) / frameTime) % adrNr) + ( adrNr * ( dir - 1 ));

            printSurface( adrArr[tempInt], pos, transparent );

    }

    void loadAdrArrPaths( char* adrArr[], int size, char* path ){


        int count = 0;

        char intString[8];

        char tempPath[size][256];

        while( count < size ){

            sprintf(intString, "%d", count+1);

            strcpy( tempPath[count], path );

            strcat( tempPath[count], "_" );

            strcat( tempPath[count], intString );

            strcat( tempPath[count], ".png" );

            adrArr[count] = tempPath[count];

            //printf("%i   -   %s\n", count, adrArr[count]);

            count++;

        }

    }

Все, что я хочу, это использовать printAnimation и printMultiAnimation вместе, чтобы на моем экране одновременно могли отображаться 'простые анимации' и некоторые 'анимации, основанные на направлении'.И, как я уже сказал, если я объявляю адреса изображений «вручную», это прекрасно работает, так что я почти уверен, что сделал что-то не так в своей loadAdrArrPaths -функции.Скорее всего я облажался с указателями / ссылками?

Надеюсь, кто-то может и поможет мне.

1 Ответ

1 голос
/ 22 июня 2019

Проблема в loadAdrArrPaths, в следующей строке:

adrArr[count] = tempPath[count];

Массив tempPath является локальным для loadAdrArrPaths, поэтому его содержимое больше не доступно после возврата этой функции.Случаи, когда этот код работает, делают это по счастливой случайности.Малейшее изменение может привести к перезаписи стека, изменяя содержимое массива.

Вы можете исправить это, либо сделав так, чтобы вызывающий передавал массив в loadAdrArrPaths, либо динамически выделяя хранилище с помощью malloc.

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