Diskuze: Definice pointerů
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Tvůrce

Zobrazeno 23 zpráv z 23.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
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.