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