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