Boj s pointery

Michal Grunt michal.grunt na gmail.com
Středa Srpen 17 11:37:59 CEST 2022


Trochu bojuji v C s pointery resp. s řetězci. Mám následující kód (z
delšího řetězce vytvoří kratší a text dokola rotuje):

const char* textScroll(char* strText, int* iPos) {
        static int iScrWidth = 15;
        int iLen, i, j;
        char strTmp[100];
        //char *strTmp = malloc(sizeof(char) * 100);
        //memset(strTmp,0,sizeof(strTmp));

        iLen = strlen(strText);
        j = *iPos;
        if (iLen > iScrWidth) {
                for (i = 0; i < iScrWidth; i++) {
                        if (j == iLen) {
                                j = 0;
                        }
                        strTmp[i] = strText[j++];
                }
                *iPos = *iPos + 1;
                if (*iPos > iLen-1) *iPos = 0;
                return strTmp;
        }
        return strText;
}

int main(void) {
int i = 0;
char aaa[] = "Toto je test a nic jineho.";
char *xx;

while(1) {
  xx = textScroll(aaa,&i);
  printf("%s\n", xx);
  sleep(5);
  }
return 0;
}

Celé to funguje (text v "xx" se ořízne na 15 znaků rotuje dokola jak
má), ale jenom za určitých podmínek (krokováno a laděno v Code::Blocks
ve Windows kde je překladač "gcc version 4.4.5 (QP MinGW32)" tj. to co
obsahuje portable verze Code::Blocks).

První zádrhel... Když ve funkci textScroll změním char strTmp[100]
třeba na char strTmp[15]; (což by mělo stačit, protože výsledný
řetězec nebude delší jak "iScrWidth") tak funkce vrátí správný řetězec
(krokováním a sledování watches), ale v main v "xx" už je nějaký
nesmysl o pár znacích. Začne to fungovat asi až od té stovky...

Druhý zádrhel... Pokud to nechám tak jak to je tak GCC v RPi hlásí
warning, že funkce textScroll vrací proměnou (return strTmp;). Když
tedy zakomentuji char strTmp[100] a odkomentuji dva řádky pod tím tak
už to chybu nehlásí, ale ve Windows funkce textScroll vrací za textem,
který vracet má i nějaké další nesmysly (část proměnné PATH atd) a na
RPi to vrátí něco podobného (za text přidá něco co tam nepatří).

Co dělám špatně?

Děkuji
MG


Další informace o konferenci Hw-list