Boj s pointery
Miroslav Mraz
mrazik na volny.cz
Středa Srpen 17 16:48:26 CEST 2022
Už to tady zaznělo, ignorovat některá varování překladače se nemusí vždy
vyplatit. Možná je lepší v té funkci předat ukazatel na výsledek např.
static const int iScrWidth = 15;
static void textScroll (const char * strText, char * result) {
static int n = 0; // !!! static
const int len = strlen (strText);
int k = n, i;
for (i=0; i<iScrWidth; i++) {
k %= len;
result [i] = strText [k++];
}
n++;
result [iScrWidth] = '\0';
}
int main (void) {
const char * aaa = "Toto je test a nic jineho.";
char * xx = alloca (iScrWidth + 1);
// or simple "char xx [iScrWidth + 1];" in std=c99
while (1) {
textScroll (aaa, xx);
printf ("%s\r", xx);
fflush (stdout);
usleep (250000);
}
return 0;
}
Jediná statická proměnná typu int pak drží poslední pozici.
Mrazík
On 17. 08. 22 11:37, Michal Grunt wrote:
> 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