Diskuze: Definice pointerů
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 23 zpráv z 23.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
pole je pointer ( resp. title[1] = *(title+1) ) Takhle ukazuješ na nějaký pointer. Dal bych tam prostě jenom char *title V Céčku ale naštěstí moc nedělám.
Na konci ti chybí středník (pokud je to pouze deklarace funkce bez definice). Navíc pokud chceš předat řetězec, musíš tam dát jenom char* title, to tvoje je pole pointerů na char, tzn. pole řetězců. Jinak jako parametr funkce je char* parametr a char parametr[] uplně to samý (ale pozor, normálně to uplně to samý neni, jenom jako parametr funkce).
Je to C nebo C++? C++ má třídu string, která umí docela dost věcí.
Jinak starý string je prostě jen ukazatel na začátek řetězce, konec se pak identifikuje podle nulového bajtu.
místo
char * title[]
tedy použij jen
char * title // pointer
nebo
char title[] // pole
Já nevim jak ty, ale já standardní string nemam moc rád, jelikož nemá definovanou konverzi na char*, takže pokud používáš nějakou Céčkovou (i některý C++) knihovnu, neni string moc praktickej, imho je lepší si zvyknout používat pole znaků jako řetězec, nebo si udělat vlastní třídu string, která funguje tak jak chceš. Já takovou mam, sice neni moc efektivní co se rychlosti týká, ale funguje přesně tak jak mi to vyhovuje.
String právě, že ani nechci. Chci jen char array. Já bych tam pointer nedávál, kdyby compiler (gcc) nekřičel... A ne - toto je jen útržek metody - jak jsem psal - prázdná definice se mi zatím nepodařila - tedy jistě - sem dám jen ;, ale když to pak použiji ve spod - gcc křičí, že už je tato metoda definována a nelze použít... Bez char arraye to jelo bez problémů - jak jej tam tedy správě dát? Děkuji.
Funkci nemůžeš definovat 2x, možná tam už takovou máš, když si tam neměl char array, tak ty dvě nebyly stejný a ono to vytvořilo novou (přetížilo). Teď tam možná dvě stejný jsou, a nejde to, jinak by gcc nehlásilo, že už je funkce jednou definovaná.
Jako že nefunguje až při volání? Pokud jí předáváš char* a v parematrech máš char** tak těžko pojede. Ty máš v parametrech char* title[], to neni pointer na řetězec, to je pointer na pointer, respektive pole pointerů, smaž v parametrech ty hranatý závorky.
WINDOW *NewWindow(char *title[], int x, int y, int width, int height)
{
<-->WINDOW *win = newwin(height, width, y, x);
<-->wprintw(win, "\n " + title);
<-->wborder(win, '|', '|', '-', '-', '+', '+', '+', '+');
<-->wrefresh(win);
<-->return win;
}
řádek 26:
WINDOW *mainWin = NewWindow("Hello World!", 0, 0, 50, 20);
výstup:
/home/sam/Dokumenty/PedWM.c: In function ‘NewWindow’:
/home/sam/Dokumenty/PedWM.c:7:21: error: invalid operands to binary + (have ‘char *’ and ‘char **’)
/home/sam/Dokumenty/PedWM.c: In function ‘main’:
/home/sam/Dokumenty/PedWM.c:26:2: warning: passing argument 1 of ‘NewWindow’ from incompatible pointer type [enabled by default]
/home/sam/Dokumenty/PedWM.c:3:9: note: expected ‘char **’ but argument is of type ‘char *’
/home/sam/Dokumenty/PedWM.c:64:7: warning: passing argument 1 of ‘NewWindow’ makes pointer from integer without a cast [enabled by default]
/home/sam/Dokumenty/PedWM.c:3:9: note: expected ‘char **’ but argument is of type ‘int’
/home/sam/Dokumenty/PedWM.c:64:7: error: too few arguments to function ‘NewWindow’
/home/sam/Dokumenty/PedWM.c:3:9: note: declared here
Bez pointeru to také řve - a bez [] to přeci nebude pole... 
Ale bude. V C/C++ je pole totiž pointer(zjednodušeně řečeno). Jak
myslíš že se dělá dynamický pole.
int* array = new int[size];
array[index] = 7486;
Máš to i v tom hlášení - note: expected ‘char **’ but argument is of
type ‘char * ’
Přečti si muj první komentář, v parametrech funkce je char* array to samý
jako char array[], prostě pointer na char*, přes kterej přistupuješ ke
znakům, který jsou v paměti za sebou - poli znaků.
Bez závorek dostanu:
/home/sam/Dokumenty/PedWM.c: In function ‘NewWindow’:
/home/sam/Dokumenty/PedWM.c:7:21: error: invalid operands to binary + (have ‘char *’ and ‘char *’)
/home/sam/Dokumenty/PedWM.c: In function ‘main’:
/home/sam/Dokumenty/PedWM.c:64:7: warning: passing argument 1 of ‘NewWindow’ makes pointer from integer without a cast [enabled by default]
/home/sam/Dokumenty/PedWM.c:3:9: note: expected ‘char *’ but argument is of type ‘int’
/home/sam/Dokumenty/PedWM.c:64:7: error: too few arguments to function ‘NewWindow’
/home/sam/Dokumenty/PedWM.c:3:9: note: declared here
Tedy chyba je nyní v "ddd"... (Po jednotlivých znacích se v tom opravdu
ztratím...
) Vždy^t by to
char[] mělo "ddd" brát...
Píše to že konvertuješ int na char*, a že předáváš málo argumentů, musels tu funkci špatně zavolat. Chyba z řádku 26 ti zmizela, voláš tu funkci znova na řádku 64 a tam máš očividně spatně parametry. Ta chyba z řádku 21 netušim co je, kód tu neni.
Nikde chybu nevidím:
#include <ncurses.h>
WINDOW *NewWindow(char *title, int x, int y, int width, int height)
{
<-->WINDOW *win = newwin(height, width, y, x);
<-->wprintw(win, "\n " + title);
<-->wborder(win, '|', '|', '-', '-', '+', '+', '+', '+');
<-->wrefresh(win);
<-->return win;
}
int main(int argc, char *argv[])
{
<-->int ch, x = 0, y = 0;
<-->MEVENT event;
<-->initscr();
<-->keypad(stdscr, TRUE);
<-->refresh();
<-->WINDOW *mainWin = NewWindow("Hello World!", 0, 0, 50, 20);
Joo - 64. řádek jsem vědel co je - jen neuložil, výstup nyní:
/home/sam/Dokumenty/PedWM.c: In function ‘NewWindow’:
/home/sam/Dokumenty/PedWM.c:7:21: error: invalid operands to binary + (have ‘char *’ and ‘char *’)
wprintw(win, "\n " + title); - nemůžeš spojovat řetězce pomocí +.
Jsou to pointery, sčítat pointery nemá smysl a i kdyby to implicitně šlo,
nespojilo by to řetězce, pouze vrátilo součet adres v paměti.
Funkce strcpy nefunguje tak jak si myslíš, ona projede znaky od prvního na kterej ukazuje title až do '\0', a zkopíruje je postupně za sebe na místo kam ukazuje pointer v prvním parametru. Ty tam máš konstantu, do ní nic zkopirovat nejde.
char str[strlen(title) + 2];
str[0] = '\n';
strcpy(str + 1, title);
wprintw(win, str);
Tohle by mělo fungovat.
Možná funkce wprintw umí formátovat. Pak by šlo udělat: wprintw(win,
"\n%s",title);
wprintw(win, "\n%s", title);
Jede! Děkuji! Jen - přidám-li za %s mezeru, je ignorována (i více mezer)
- warning: unknown escape sequence: '\s' [enabled by default] mi to hodí při
pokusu o "\s" - musím ji tedy přidat jako další parametr, nebo to lze
přilepit do stringu? 
Před s není / ale %. Ty písmenka před kterýma je % jsou jakoby
parametry, a jako další parametry funkce pak doplníš co se za ně má
dosadit, to písmenko určuje datovej typ a formát výstupu.
%s - řetězec, ke kterému je přistupováno přes char*
%d - celé číslo (int)
%f - desetinné číslo (float)
%x - celé číslo vypsané v hexadecimální soustavě
wprintw(win, "\n %s ", title); - tohle by mělo fungovat normálně
Je jich víc, někde si je najdi, je to i tady, myslím v tutoriálu na C.
Tohle vypadá na těžký boj 
To je tak když někdo přechází na C++ z moderního jazyka 
Zobrazeno 23 zpráv z 23.
