Avatar
matesax
Redaktor
Avatar
matesax:

Dobrý den,
rád bych ve své metodě použil string. Což znamená char array - jenže C si žádá definici pointeru. Kód:

WINDOW *NewWindow(char *title[], int x, int y, int width, int height)

To ale nefunguje. Už tedy chápu, proč se prvně v hlavičkách dokumentů objevuje definice prázdných metod a až někde dole jsou naplněny. Jenže se mi nedaří ani ta prázdná definice...

Jak by to mělo správně vypadat?
Děkuji.

Editováno 15.3.2013 17:01
 
Odpovědět 15.3.2013 16:59
Avatar
Drahomír Hanák
Tým ITnetwork
Avatar
Odpovídá na matesax
Drahomír Hanák:

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.

 
Nahoru Odpovědět 15.3.2013 17:18
Avatar
Odpovídá na matesax
Lukáš Hruda (Luckin):

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).

Editováno 15.3.2013 17:26
 
Nahoru Odpovědět 15.3.2013 17:23
Avatar
Odpovídá na matesax
Luboš Běhounek (Satik):

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
Nahoru Odpovědět 15.3.2013 17:31
:)
Avatar
Odpovídá na Luboš Běhounek (Satik)
Lukáš Hruda (Luckin):

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.

 
Nahoru Odpovědět 15.3.2013 17:38
Avatar
matesax
Redaktor
Avatar
matesax:

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.

 
Nahoru Odpovědět 15.3.2013 17:46
Avatar
Odpovídá na matesax
Lukáš Hruda (Luckin):

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á.

 
Nahoru Odpovědět 15.3.2013 17:52
Avatar
matesax
Redaktor
Avatar
matesax:

Ale ne - char array s tím deklarováním prázdné metody nesouvisí. Bavím se o metodě jako takové - před tím jela, po přidání toho jednoho parametru již gcc řve...

 
Nahoru Odpovědět 15.3.2013 18:09
Avatar
Odpovídá na matesax
Lukáš Hruda (Luckin):

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.

 
Nahoru Odpovědět 15.3.2013 18:15
Avatar
matesax
Redaktor
Avatar
matesax:
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... :)

Editováno 15.3.2013 18:24
 
Nahoru Odpovědět 15.3.2013 18:22
Avatar
Odpovídá na matesax
Lukáš Hruda (Luckin):

Ale bude. V C/C++ je pole totiž pointer(zjedno­duš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ů.

Editováno 15.3.2013 18:40
 
Nahoru Odpovědět 15.3.2013 18:39
Avatar
matesax
Redaktor
Avatar
matesax:

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...

Editováno 15.3.2013 18:54
 
Nahoru Odpovědět 15.3.2013 18:53
Avatar
Odpovídá na matesax
Lukáš Hruda (Luckin):

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.

 
Nahoru Odpovědět 15.3.2013 19:01
Avatar
matesax
Redaktor
Avatar
matesax:

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 *’)
Editováno 15.3.2013 19:28
 
Nahoru Odpovědět 15.3.2013 19:26
Avatar
Odpovídá na matesax
Lukáš Hruda (Luckin):

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.

 
Nahoru Odpovědět 15.3.2013 19:32
Avatar
matesax
Redaktor
Avatar
matesax:

To je vtip za vtipem... :) Totiž - compiler to vzal - ALE...

strcpy("\n ", title)

dá:

Neoprávněný přístup do paměti (SIGSEGV) (core dumped [obraz paměti uložen])
 
Nahoru Odpovědět 15.3.2013 20:02
Avatar
Odpovídá na matesax
Lukáš Hruda (Luckin):

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);

 
Nahoru Odpovědět 15.3.2013 20:08
Avatar
matesax
Redaktor
Avatar
matesax:
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? :)

Editováno 15.3.2013 21:29
 
Nahoru Odpovědět 15.3.2013 21:27
Avatar
Odpovídá na matesax
Lukáš Hruda (Luckin):

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.

Editováno 15.3.2013 23:32
 
Nahoru Odpovědět 15.3.2013 23:30
Avatar
matesax
Redaktor
Avatar
matesax:

Jenže já nechci %s, ale \s - mezeru... Ještě si s tím pohraji...

 
Nahoru Odpovědět 16.3.2013 6:36
Avatar
Odpovídá na matesax
Lukáš Hruda (Luckin):

Nic takovýho jako \s neznam...

 
Nahoru Odpovědět 16.3.2013 10:44
Avatar
Luboš Běhounek (Satik):

Tohle vypadá na těžký boj :D

Nahoru Odpovědět 16.3.2013 15:46
:)
Avatar
Odpovídá na Luboš Běhounek (Satik)
Lukáš Hruda (Luckin):

To je tak když někdo přechází na C++ z moderního jazyka :D

 
Nahoru Odpovědět 16.3.2013 18:00
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 23 zpráv z 23.