Strana 1 z 2

Ako vybrať časť textu z premennej.

Napísané: 14 Feb 2024, 19:58
od používateľa gfox
Pasujem sa v arduino ide s výpisom na displej,
Mám displej lcd 4x20.
Mám takýto kus kódu:

Kód: Vybrať všetko

void audio_showstation(const char* info) {
    Serial.printf("showstation: %s\n", info);
    lcd.setCursor(0,1);
    lcd.print(info);
}
Toto mi vypíše na terminál text s premennej "info". A na druhý riadok displeja tiež. Toto je v poriadku. Ale keď má premenná "info" viac textu ako 20 znakov, tak mi to prepíše viac riadkov na displeji. Ja potrebujem s premennej "info" vybrať povedzme prvých 20znakov a len tie vypísať na displej.
Doteraz som robil v bascome, tam je text v premennej typu string. Tam sú funkcie na prácu s reťazcami napr. LEFT() alebo MID().
Ale tu neviem presne čo je to za typ const char *. Ani sa neviem dopátrať na webe ako urobiť to čo chcem.

Re: Ako vybrať časť textu z premennej.

Napísané: 14 Feb 2024, 20:16
od používateľa maskrtnik01

Re: Ako vybrať časť textu z premennej.

Napísané: 14 Feb 2024, 21:49
od používateľa gfox
Ďakujem za reakciu, ale takýchto odkazov som dnes už prešiel desiatky.
Potrebujem naozaj príklad.
Povedzme že const char *info obsahuje text o dĺžke 40 znakov. Ako vypíšem na displej iba posledných 20 znakov.
Používam knižnicu LiquidCrystal_I2C.h
Potrebujem vedieť ako vybrať hocijakú časť textu, a vložiť do nejakej premennej aby som to mohol vypísať na displej.

Re: Ako vybrať časť textu z premennej.

Napísané: 14 Feb 2024, 21:57
od používateľa stefanSK
takto:
void audio_showstation(const char* info) {
uchar prvyZnak=20;
Serial.printf("showstation: %s\n", &info[prvyZnak]);
lcd.setCursor(0,1);
lcd.print(info);
}

Toto platí ak dlžka reťazca je 40.
inak pre výpis posledných 20 znakov reťazca dĺžky > 20 platí ():
prvyZnak= strlen(info)-20;

Re: Ako vybrať časť textu z premennej.

Napísané: 14 Feb 2024, 22:03
od používateľa Andy99
Napádajú ma hneď 4 riešenia.
- Použi napr. sprintf s medzibufferom, kde si uložiť presne toľko znakov, potrebuješ.
- Ak vieš na aký typ ukazuje pointer, podľa jeho veľkosti vieš postupne cez neho iterovať až po dĺžku ktorú potrebuješ. A následne vypísať.
- Pozrieš sa, ako dobre je printf implementovaná a použiješ priamo jej funkcionalitu na výpis podľa počtu znakov.
- Vytvoríš si vlastnú funkciu, ktorá ten string proste zoseká.
Riešení je samozrejme oveľa viacej.

Re: Ako vybrať časť textu z premennej.

Napísané: 14 Feb 2024, 22:27
od používateľa gfox
stefanSK napísal:
14 Feb 2024, 21:57
takto:
void audio_showstation(const char* info) {
uchar prvyZnak=20;
Serial.printf("showstation: %s\n", &info[prvyZnak]);
lcd.setCursor(0,1);
lcd.print(info);
}

Toto platí ak dlžka reťazca je 40.
inak pre výpis posledných 20 znakov reťazca dĺžky > 20 platí ():
prvyZnak= strlen(info)-20;
Rozumiem čo sa mi snažíš povedať, ale upravil si serial.printf. Výpis na terminál ma netrápi. Mne ide o lcd.print.
Andy99 napísal:
14 Feb 2024, 22:03
Napádajú ma hneď 4 riešenia.
- Použi napr. sprintf s medzibufferom, kde si uložiť presne toľko znakov, potrebuješ.
- Ak vieš na aký typ ukazuje pointer, podľa jeho veľkosti vieš postupne cez neho iterovať až po dĺžku ktorú potrebuješ. A následne vypísať.
- Pozrieš sa, ako dobre je printf implementovaná a použiješ priamo jej funkcionalitu na výpis podľa počtu znakov.
- Vytvoríš si vlastnú funkciu, ktorá ten string proste zoseká.
Riešení je samozrejme oveľa viacej.
Ďakujem, ale naozaj potrebujem príklad. Netuším čo znamená "sprintf s medzibuferom".

Re: Ako vybrať časť textu z premennej.

Napísané: 14 Feb 2024, 22:33
od používateľa peterple
V prvom rade sa rozhodni čo vlastne chceš. Pretože
gfox napísal:
14 Feb 2024, 21:49
Ako vypíšem na displej iba posledných 20 znakov.
a
gfox napísal:
14 Feb 2024, 21:49
Potrebujem vedieť ako vybrať hocijakú časť textu, a vložiť do nejakej premennej aby som to mohol vypísať na displej.
Sú úplne dve rozdielne veci ktoré treba riešiť úplne iným spôsobom. Nečuduj sa že keď položíš nejasnú otázku, tak dostaneš všeobecnú odpoveď ktorá pokrýva možnosti na ktoré si sa pýtal.

Re: Ako vybrať časť textu z premennej.

Napísané: 14 Feb 2024, 23:12
od používateľa gfox
Proste potrebujem vybrať nejakú časť textu z premennej z prvého príspevku "const char*" aby som ju vedel vypísať na jednom riadku lcd displeja. Je jedno či prvých 20 znakov alebo posledných 10znakov, alebo 15 znakov niekde v strede. Podľa toho ako budem potrebovať.

Re: Ako vybrať časť textu z premennej.

Napísané: 14 Feb 2024, 23:27
od používateľa peterple
No moc si to teda neupresnil. Tiež aj preto že používaš blbú terminológiu. To čo nazývaš premenná, žiadna premenná nie je. Prečítaj si prosím kapitolu 15 v tomto odkaze https://www.smnd.sk/anino/moje/C.pdf#page=40

Mal by si tam nájsť v prvom rade odpoveď na to ako sa v C pracuje s textovými reťazcami a potom aj to čo ťa trápi.

Re: Ako vybrať časť textu z premennej.

Napísané: 15 Feb 2024, 06:41
od používateľa Andy99
gfox napísal:
14 Feb 2024, 23:12
Proste potrebujem vybrať nejakú časť textu z premennej z prvého príspevku "const char*" aby som ju vedel vypísať na jednom riadku lcd displeja. Je jedno či prvých 20 znakov alebo posledných 10znakov, alebo 15 znakov niekde v strede. Podľa toho ako budem potrebovať.
V tom prípade napr. memcpy je tvoj kamarát. Vytvoríš si napr. vlastnú funkciu, ktorá ti vráti novo zosekaný string. Nezabudni na /0.

Existujú samozrejme aj menej výpočtovo/pamäťovo náročné metódy, ale najprv otestuj toto.

Re: Ako vybrať časť textu z premennej.

Napísané: 15 Feb 2024, 08:31
od používateľa Radus
...prvých 20...

Kód: Vybrať všetko

char newChar[21];
uint i;

for(i=0; i<21; i++)
{
if(oldChar=='/0') break;
newChar[i]=oldChar[i];
}
newChar[i+1]='/0';

//nepísal som to v prostredí C tak sa ospravedlňujem ak sú tam syntaktické chyby a dlhšie som ani v C nerobil ale v C#, ak je inicializácia poľa nesprávna... dúfam že C pozná príkaz break :)

Re: Ako vybrať časť textu z premennej.

Napísané: 15 Feb 2024, 09:34
od používateľa stefanSK
príklad na výber časti textu od indexu 10, dĺžky 5:
//potom buf poslať na LCD
char buf[40];
char b[50];

strcpy(b,"toto je text z ktoreho sa ma kopirovat 5 znakov");

strncpy(buf,(const char *)&b[10],5);

Re: Ako vybrať časť textu z premennej.

Napísané: 15 Feb 2024, 10:05
od používateľa gfox
Ďakujem chlapi, idem to skúšať.

Re: Ako vybrať časť textu z premennej.

Napísané: 15 Feb 2024, 11:13
od používateľa YellowJacket
Pokial tam nechces linkovat ziadne kniznice navyse kvoli jednej funkcii, tak si napis funkciu sam ( i ked ano, v arduine sa sotva mozme bavit o setreni pamate, ze jo ):

Kód: Vybrať všetko

void copyCharsFromIndex( const char *str_in, char *str_out, int index, int count ) {

    int i;


        /* maximalne 20 znakov */
    if ( count > 20 )
        count = 20;

        /* kopirovanie znakov */
    for ( i = 0; i < count; i++ )
        str_out[i] = str_in[index + i];

    str_out[i] = '\0';

}
C-ckovy priklad pouzitia:

Kód: Vybrať všetko

const char  str[] = "aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeee";
char        buffer[21];


copyCharsFromIndex( str, buffer, 0, 6 );
printf( "%s\n\n", buffer );    /* aaaaaa */

copyCharsFromIndex( str, buffer, 10, 20 );
printf( "%s\n\n", buffer );    /* abbbbbbbbbbccccccccc */

copyCharsFromIndex( str, buffer, 20, 30 );
printf( "%s\n\n", buffer );    /* bccccccccccddddddddd */

Re: Ako vybrať časť textu z premennej.

Napísané: 15 Feb 2024, 12:16
od používateľa gfox
Ďakujem chlapi. Toto som potreboval, vidieť nejaké príklady riešenia. Už to chápem.
Na moje prekvapenie prinf funguje aj pri výpise na displej "lcd.printf".
A tým pádom funguje riešenie ktoré mi dal stefansk už v prvom príspevku.
Čiže moje riešenie je zatiaľ takéto:

Kód: Vybrať všetko

void audio_showstreamtitle(const char* info) {
  Serial.printf("streamtitle: %s\n", info);
  lcd.setCursor(0, 1); 
  lcd.print("                    ");
  lcd.setCursor(0, 1);
  lcd.printf("%.20s",info); //vypíše prvých 20 znakov s "info"
  lcd.setCursor(0, 2);
  lcd.print("                    ");
  //ak je text dlhší ako 20 znakov tak sa vypíšu do dalsieho riadku
  if (strlen(info)>20){
    lcd.setCursor(0, 2);
    lcd.printf("%.20s",&info[20]);
  }
  lcd.setCursor(0, 3);
  lcd.print("                    ");
  //ak je text dlhší ako 40 znakov 
  if (strlen(info)>40){
    lcd.setCursor(0, 3);
    lcd.printf("%.20s",&info[40]);
  }
}
Testujem to, zatial to robí to čo má. Je to internetové rádio a vypisuje mi interpreta a názov skladby na displej.

Re: Ako vybrať časť textu z premennej.

Napísané: 15 Feb 2024, 20:57
od používateľa Atlan
Preco si nedas beziaci text? I ked na lcd to mozno bude necitatelne.

Re: Ako vybrať časť textu z premennej.

Napísané: 15 Feb 2024, 22:11
od používateľa gfox
Dlho mi ležal v šuplíku veľký displej 4x20 znakov. Tu ma napadlo ho využiť.
V prvom riadku je názov stanice a ďalšie tri riadky sú dosť na zobrazenie interpreta a názvu skladby.
Viac ma štve že namiesto písmen s dĺžňami a mäkčeňmi sa zobrazujú kadejaké kliky-háky.

Re: Ako vybrať časť textu z premennej.

Napísané: 15 Feb 2024, 23:34
od používateľa Radus
...daný displej asi nemá našu znakovú sadu. Buď si do neho uložíš vlastné znaky, mal by to umožňovať, alebo si spravíš konvertnú funkciu a diakritiku vyhodíš... miesto ň vypíšeš n a podobne...

Re: Ako vybrať časť textu z premennej.

Napísané: 16 Feb 2024, 06:47
od používateľa budvar10
Buď si do neho uložíš vlastné znaky...
V takýchto displejoch môžeš uložiť 8 štandardných znakov, ak to vôbec podporuje. To je na SK diakritiku veľmi málo.

Ak chceš zistiť, aké to má znaky, daj si vypísať 0-255.

Re: Ako vybrať časť textu z premennej.

Napísané: 16 Feb 2024, 07:54
od používateľa Radus
...to by aj tak nefungovalo, keďže ascii kódom našej diakritike sú už priradené haky-baky... Treba odstrániť diakritiku z textu... Alebo má možno displej prepínateľné sady, už som videl aj to ;)