C中的两个函数一起使用时会发生冲突,但单独使用时效果很好,我该怎么办?

时间:2019-06-22 10:17:20

标签: c arrays multidimensional-array

我正在尝试通过使用地址数组和算法来计算动画的当前图片来制作动画。 我有两个函数,一个是简单的“ 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++;

        }

    }

我只想同时使用printAnimationprintMultiAnimation,这样我就可以在屏幕上同时显示一些“简单动画”和“基于方向的动画”。 就像我说的那样,如果我声明图像地址为“手工”,则可以正常工作,因此我很确定我在loadAdrArrPaths函数中做错了什么。我最有可能搞砸了指针/引用吗?

我希望有人能够并且会帮助我。

1 个答案:

答案 0 :(得分:1)

问题出在loadAdrArrPaths的以下行中:

adrArr[count] = tempPath[count];

数组tempPathloadAdrArrPaths是局部的,因此在该函数返回后,其内容不再可用。该代码有效的情况是靠运气实现的。最细微的变化都可能导致堆栈被覆盖,从而更改数组的内容。

您可以通过使调用方将数组传递到loadAdrArrPaths或通过使用malloc动态分配存储来解决此问题。