NULL – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

NULL – C / C++ – Fórum – Programujte.comNULL – C / C++ – Fórum – Programujte.com

 

Sss
~ Anonymní uživatel
6 příspěvků
6. 6. 2017   #1
-
0
-

   

Připojen obrázek.

Ahoj. Mám dotaz. Proč mi při vytváření furt háže tuhle chybu? Jak to NULL mám deklarovat? Díky :)

Nahlásit jako SPAM
IP: 109.105.39.–
6. 6. 2017   #2
-
0
-

vložit hlavičkový soubor, chtělo by to pogůůůglit... ale mohlo by to být stdlib.h

hu

Nahlásit jako SPAM
IP: 193.86.81.–
Sss
~ Anonymní uživatel
6 příspěvků
6. 6. 2017   #3
-
0
-
Nahlásit jako SPAM
IP: 109.105.39.–
KIIV
~ Moderátor
+43
God of flame
6. 6. 2017   #4
-
0
-

V C++ by melo fungovat i nullptr (tedy pokud nemas nejake super stare visual studio)

Nahlásit jako SPAM
IP: 217.196.214.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Sss
~ Anonymní uživatel
6 příspěvků
6. 6. 2017   #5
-
0
-

#4 KIIV
A kam to mám napsat? Do té mé knihovny? 

Nahlásit jako SPAM
IP: 109.105.39.–
gna
~ Anonymní uživatel
1891 příspěvků
6. 6. 2017   #6
-
0
-

Systémové includy se normálně píšou do pičatých závorek #include <stdlib.h>.

Program se nepíše do stdafx.cpp. Při použití předkompilovaných knihoven v MSVC musí každý .cpp soubor začínat includem "stdafx.h".

Ten nullptr znamená, že místo NULL budeš psát nullptr.

Nahlásit jako SPAM
IP: 213.211.51.–
Sss
~ Anonymní uživatel
6 příspěvků
7. 6. 2017   #7
-
0
-

#6 gna
Děkuji za rady, ale mám ještě jeden problém. Mám knihovnu (.h)  ten by měl být dobře.

struct Tstruct;
void StackInit(Tstruct* *TOP);
Tstruct * StackPush(Tstruct * TOP, long VALUE);
long StackPop(Tstruct* *TOP);
long StackShow(Tstruct *TOP);
bool StackIsEmpty(Tstruct *TOP);
void QueueInit(Tstruct* *HEAD, Tstruct* *TAIL);
Tstruct* Enqueue(Tstruct* *HEAD, Tstruct *TAIL, int VALUE);
long Dequeue(Tstruct* *HEAD, Tstruct* *TAIL);
long QueueShow(Tstruct *HEAD);
bool QueueIsEmpty(Tstruct *HEAD);

A pak mám (.cpp)  


struct Tstruct
{
	long value;
	Tstruct *next;
};
void StackInit(Tstruct* *TOP)
{
	*TOP = nullptr;
}
Tstruct * StackPush(Tstruct *TOP, long VALUE)
{
	Tstruct *hlp = new Tstruct;
	if (hlp != nullptr)
	{

		hlp->value = VALUE;
		if (TOP != nullptr)
		{
			hlp->next = TOP;
		}
		else
		{
			hlp->next = nullptr;

		}
	}
	return hlp;
}

long StackPop(Tstruct* *TOP){
	Tstruct *hlp;
	long val;
	hlp = *TOP;
	*TOP = hlp->next;
	val = hlp->value;
	delete hlp;
	return val;
}; 


long StackShow(Tstruct *TOP)
{
	if (TOP != nullptr)
	{
		return TOP->value;
	}
	else
	{
		return nullptr;
	}
}

bool StackIsEmpty(Tstruct *TOP)
{
	return (TOP == nullptr);
}

void QueueInit(Tstruct* *HEAD, Tstruct* *TAIL)
{
	*HEAD = nullptr;
	*TAIL = nullptr;
}

Tstruct* Enqueue(Tstruct* *HEAD, Tstruct *TAIL, int VALUE)
{
	Tstruct *hlp = new Tstruct;
	if (hlp != nullptr)
	{
		hlp->value = VALUE;
		hlp->next = nullptr;
		if (TAIL == nullptr)
		{
			TAIL = hlp;
		}
		else
		{
			TAIL->next = hlp;
		}
		if (*HEAD == nullptr)
		{
			*HEAD = hlp;
		}
	}
	return hlp;
}

long Dequeue(Tstruct* *HEAD, Tstruct* *TAIL)
{
	long value = nullptr;
	if (*HEAD != nullptr)
	{
		Tstruct *headPrvek = *HEAD;
		value = headPrvek->value;
		*HEAD = headPrvek->next;
		delete(headPrvek);
	}
	return value;
}

long QueueShow(Tstruct *HEAD)
{
	if (HEAD != nullptr)
	{
		return HEAD->value;
	}
	else
	{
		return nullptr;
	}
}

bool QueueIsEmpty(Tstruct *HEAD)
{
	return (HEAD == nullptr);
}

A u long StackShow, long Dequeue, long QueueShow mi to u nullptr hlásí chybu a nechce mi to vzít. Kde mám chybu prosím?

Nahlásit jako SPAM
IP: 109.105.39.–
7. 6. 2017   #8
-
0
-

v .cpp není žádný include?

hu

Nahlásit jako SPAM
IP: 193.86.81.–
KIIV
~ Moderátor
+43
God of flame
7. 6. 2017   #9
-
0
-

#7 Sss
nullptr se bere z hlediska jazyka jako pointer a pokud se ho snazis narvat do typu long (o coz se tim return nullptr snazis), tak to bude hlasit chybu. Takovy NULL byl vetsinou definovan jako 0, takze to proste vratilo 0L. Otazkou je, jestli je tohle zrovna spravne chovani. Nula muze byt i vcelku zadana hodnota.

Pokud ale vis co delas, tak muzes pouzit explicitni konverzi, nebo rovnou vracet primo 0L misto nullptr. (jen jako priklad, jak by to slo udelat, jinak je to prasecina)

Nahlásit jako SPAM
IP: 90.178.53.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Sss
~ Anonymní uživatel
6 příspěvků
8. 6. 2017   #10
-
0
-

#9 KIIV
No popravdě nevím co dělám :D Dostali jsme zadání udělat knihovnu a moc tomu nerozumím a vůbec nevím jak to napravit. Nešel by ten kod napsat jinak?

Nahlásit jako SPAM
IP: 109.105.40.–
KIIV
~ Moderátor
+43
God of flame
8. 6. 2017   #11
-
0
-

#10 Sss
Jelikoz pouzivas C++, tak by se cela fronta dala zabalit do tridy. To co tam mas ted, je ve stylu C. Jelikoz je to skolni uloha, tak se neda pouzit neco existujiciho ze STL (standard template library), jelikoz ucelem zadani je zjistit, jak to vlastne funguje interne.

Pri ziskavani prvku z prazdneho zasobniku bys mohl vyvolat vyjimku. U STL knihoven je to tam popane jako undefined behavior (muze to udelat temer cokoliv), do toho by asi padlo i vraceni nuly :D

Nahlásit jako SPAM
IP: 217.196.214.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Sss
~ Anonymní uživatel
6 příspěvků
8. 6. 2017   #12
-
0
-

#11 KIIV
Takže místo toho nullptr tam můžu napsat normálně 0? :D Jsem úplně neschopný a vůbec nevím jak to přepsat aby mi to jelo :/ 

Nahlásit jako SPAM
IP: 109.105.39.–
BDS+3
Věrný člen
8. 6. 2017   #13
-
0
-

#12 Sss
Samozřejmě u long 0. nullptr se používá u ukazatelů. Takže asi pouze u testů Tstruct * použiješ NULL nebo nullptr, u zbytku 0.

Nahlásit jako SPAM
IP: 185.69.69.–
W11 :)
Staon0
Návštěvník
22. 6. 2017   #14
-
0
-

#13 BDS
Ono, aby to nebylo jednoduché, u před-C++11 se navíc doporučuje používat 0 namísto NULL i u ukazatelů :-D

Nahlásit jako SPAM
IP: 94.142.234.–
KIIV
~ Moderátor
+43
God of flame
22. 6. 2017   #15
-
0
-

#14 Staon
o tom bych si rad pocetl, proc.

Kazdopadne, co se pouzije tak trochu naznacuje programatoruv zamer. Kdyz se pro pointer pouzije NULL nebo nullptr, tak je zrejme, ze autor chtel nastavit pointer.  

char * retezec = "whatever";

retezec = 0; // ????? co tim chtel autor rici?

// je to "veskrze" to same jako:
retezec = NULL; // ale ano, tady chtel nastavit pointer na NULL (nebo lepe nullptr)

// ale mozna ho chtel jen "vyprazdnit" ale ponechat "buffer" a zapomnel na dereferenci:
*retezec = 0; // opet neni uplne jasny zamer

// stale mohl chtit jen na prvni pozici v poli 
// nastavit znak '0' a ne znak NUL (znak pro ukonceni retezce)
*retezec = '\0'; // tady je zrejme, ze to mel byt opravdu znak NUL
  

Je to stale ta sama 0, ale pro cloveka, co to cte je pak daleko jasnejsi zamer. A tim padem se da snadneji odhalit chyba.

Nahlásit jako SPAM
IP: 93.91.151.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kit+15
Guru
22. 6. 2017   #16
-
0
-

#15 KIIV
Symbol NULL je prostě jasnější než komentář, proč tam ta nula je.

Nahlásit jako SPAM
IP: 85.93.112.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Staon0
Návštěvník
23. 6. 2017   #17
-
0
-

#15 KIIV
NULL se nedoporučuje používat kvůli přenositelnosti a jednoznačnosti následujícího kódu: 

void f(void* p_);
void f(int i_);
void f(long l_);

f(NULL);

Vzhledem k tomu že NULL je pro různé překladače a různé konfigurace jednoho překladače definovaný různě, se na každém zavolá jiná funkce. Máte naprostou pravdu, že NULL vyjadřuje záměry programátora, ale zároveň dokáže způsobit nečekané chyby - v tomto konkrétním případě na většině překladačů zavolá právě úplně jinou funkci, než byl autorův záměr. Autoři standardu si toho byli vědomi, proto od C++11 zavedli nullptr.

Nahlásit jako SPAM
IP: 94.142.234.–
Kit+15
Guru
23. 6. 2017   #18
-
0
-

Správně by se neměla používat 0, null, ani nullptr. Nic z toho.

Zasláno z mobilního telefonu.

Nahlásit jako SPAM
IP: 37.188.228.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Radek Chalupa
~ Redaktor
+1
Super člen
23. 6. 2017   #19
-
0
-

#17 Staon
pak ale stačí si to makro NULL natvrdo nadefinovat na 0, a všechny překladače budou spokojené a současně kód bude "čitelnější" jak zmínil kolega

Nahlásit jako SPAM
IP: 89.177.51.–
gna
~ Anonymní uživatel
1891 příspěvků
24. 6. 2017   #20
-
+1
-
Zajímavé
Kit +

#19 Radek Chalupa
Ne, v tom je právě problém, na který Staon poukázal. NULLem se myslí nulový ukazatel a ne int.

Nahlásit jako SPAM
IP: 213.211.51.–
Kit+15
Guru
24. 6. 2017   #21
-
0
-

#20 gna
Co takhle nullové ukazatele vůbec nepoužívat? To by nešlo?

Nahlásit jako SPAM
IP: 194.228.68.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
KIIV
~ Moderátor
+43
God of flame
24. 6. 2017   #22
-
+1
-
Zajímavé
Kit +

#21 Kit
V C bez sance.

Null objekty - v C++ ne vzdy potrebujes polymorfizmus (tabulka virtualnich trid ma jistou malou cenu - obvykle je to spis na bazi branch prediction a podobne) a bez nej to bude zase trida, s nejakym testovanim uvnitr, jestli je to zrovna ten "null objekt" nebo ne. Neco jako end pro istream_iterator a podobne...

Kazdopadne, to co sem dal autor vlakna za kod, to je tezke C (kompilovane v C++)

Krom toho si neumim moc predstavit null objekt pro POD typ (pokud nepocitame 0, ale to je furt validni hodnota). Muze vyhodit akorat vyjimku, ze ma kontrolovat, jestli je nejaky prvek vubec k dispozici, pred tim, nez ho ziska a odebere.

Nahlásit jako SPAM
IP: 93.91.151.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Staon0
Návštěvník
26. 6. 2017   #23
-
0
-

#19 Radek Chalupa
Nemůžete si nadefinovat sám NULL. Tohle makro je ve standardních knihovnách, a pokud ho nadefinujete jinak, získáte od překladače spoustu chyb, že definice makra je rozdílná. A obecně nepomůže ani undef, protože stačí, aby se systémová definice v pořadí vkládaných hlaviček dostala za vaši definici.

Navíc, pokud byste chtěl, aby se NULL chovalo "očekávaně", pak byste makro musel nadefinovat nějak takto: 

#define NULL ((void*) 0)

Pak by se skutečně vybrala očekávaná funkce s ukazatelem. Některé překladače používají tuhle definici; pokud si dobře vzpomínám svého času BorlandC na MS-DOSu.

Nahlásit jako SPAM
IP: 94.142.234.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 97 hostů

Podobná vlákna

Realloc a NULL — založil olgo

(Array == NULL) = 1 -> ? — založil Matěj Andrle

Null hodnoty DataReader — založil Johnnny

Poker (null reference) — založil RePRO

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý