Vytváření typu objektu, ARM/MIPS – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Vytváření typu objektu, ARM/MIPS – C / C++ – Fórum – Programujte.comVytváření typu objektu, ARM/MIPS – C / C++ – Fórum – Programujte.com

 

TomyB
~ Anonymní uživatel
57 příspěvků
18. 3. 2018   #1
-
0
-

Ahoj,

vytvářím apku pro WinCE, jak pro ARM tak MIPS. Mám jeden problém. Po kompilaci pro MIPS, aplikace nenaběhne, pokud je použit tento řádek pro vytváření typu objektu. Pod ARM je to v pořádku. Co je špatně, mám někdě něco v nastavení VS změnit?

Vytvářím pod VS2008 C++

cpp:

Config * Config::getInstance()
{
static Config * config = NULL;
config = new Config();

return config;

}

h:
class Config
{
public:
    enum earg
    {
        label,
        .....
    }

static Config * getInstance();

.....

};

Dík

Tomy

Nahlásit jako SPAM
IP: 94.113.172.–
KIIV
~ Moderátor
+43
God of flame
18. 3. 2018   #2
-
0
-

Moc nechapu na co tam mas statickou promennou. Stejne ji vzdy prepises novou instanci. Rovnou muzes dat  "return new Config;".

Pokud ale chces singleton, tak pouzij treba:

static Config& instance()
{
    static Config singleton;
    return singleton;
}

A jako bonus muzes pouzivat teckovou notaci a ne ->

Nahlásit jako SPAM
IP: 81.30.230.–
Program vždy dělá to co naprogramujete, ne to co chcete...
TomyB
~ Anonymní uživatel
57 příspěvků
18. 3. 2018   #3
-
0
-

Tohle částečně zafungovalo, ale mám problém s třídou, doteď jsem měl

Config*	config = NULL;

int WINAPI WinMain(...)
{
...
config = Config::getInstance();
...
}

A teď s tím po úpravě nehnu, hlásí to C2440 '=': cannot convert 'Config' to 'Config *'
 

Nahlásit jako SPAM
IP: 94.113.172.–
KIIV
~ Moderátor
+43
God of flame
18. 3. 2018   #4
-
0
-

#3 TomyB
tak kdyz je tak nutne pouzit pointer, tak ho pouzij:

static Config* instance()
{
    static Config singleton;
    return &singleton;
}

Nebo klidne i ta verze vracejici referenci:

    config = &(Config::getInstance());

Nebo kdyz to hodis do mainu:

   Config& config = Config::getInstance(); // varianta vracejici referenci

Hlavne se ani v jednom pripade nemusis starat o uvolneni instance. V puvodnim pripade vsech instanci.

Nahlásit jako SPAM
IP: 81.30.230.–
Program vždy dělá to co naprogramujete, ne to co chcete...
TomyB
~ Anonymní uživatel
57 příspěvků
19. 3. 2018   #5
-
0
-

:-(

static Config* instance()
{
	static Config instance_;
	instance_.loadConfig();
	return &instance_;
}

error LNK2019

Config * Config::instance()
{
	static Config instance_;
	instance_.loadConfig();
	return &instance_;
}


fukční, ale jen v ARM, v MIPS je aplikace mrtvá

jeste jsem to bral kousek po kousku, bez tohoto se aplikace v MIPS rozjede, nejak reaguje.

Config::Config():m_sections(NULL), m_count(0), m_allocated(0), m_current(-1),
	m_file(NULL), m_line(0), m_seek(FALSE), m_include(FALSE)
{
	m_settings.background = NULL;
        ...
}
Nahlásit jako SPAM
IP: 94.113.172.–
KIIV
~ Moderátor
+43
God of flame
19. 3. 2018   #6
-
0
-

#5 TomyB
pokud mas to prvni primo ve tride a pak mas jeste to same mimo ni, tak to nemuze nikdy projit.

Bud to mas jenom primo ve tride, nebo prototyp metody a deklarace v cpp. Ale ne oboje.

// definice metody primo v definici tridy:
class Neco1 {
public:
    static Neco1* instance() { Neco1 instance; return &instance; }
};

// definice metody mimo tridu, ve tride je jen deklarace:
class Neco2 {
public:
    static Neco2* instance();
};

Neco2* Neco2::instance() { Neco2 instance; return &instance; }

A ten loadConfig se klidne muze volat primo v konstruktoru. Takhle se to zavola pokazdy, kdyz zavolas metodu instance(). Stejne mu nic nepredavas, takze to vse musi mit k dispozici i v konstruktoru.

Nahlásit jako SPAM
IP: 185.163.41.–
Program vždy dělá to co naprogramujete, ne to co chcete...
TomyB
~ Anonymní uživatel
57 příspěvků
19. 3. 2018   #7
-
0
-

Nene nemám to 2x. Nějak s tím nemůžu hnout. Jsem to vyzobal na úplný základ. Bez tohoto řádku

static Config instance_;
 

se aplikace rozjede, s ním už ne. Jde to nějak jinak napsat? Dík

.h

class Config
{
public:
	static Config * getInstance();

protected:
	Config();

};


.cpp

#include <windows.h>

#include "stdafx.h"
#include "common.h"
#include "config.h"

Config::Config()
{
}


Config * Config::getInstance()
{
	static Config instance_; // Jakmile je tady toto, tak v MIPS zařízení apk nenastartuje
	//instance_.loadConfig();
	return &instance_;
}
Nahlásit jako SPAM
IP: 94.113.172.–
TomyB
~ Anonymní uživatel
57 příspěvků
20. 3. 2018   #8
-
0
-

Tento způsob zabral, na MIPS se to rozběhne
 

static Config& getInstance()
{
	static Config* instance;
	instance = new (Config);
	instance->loadConfig();
	return *instance;
}

Ale nedari se mi to nadefinovat v globalu
Config    * config = NULL;

a v WinMain
config = Config::getInstance();

error C2440 '=' cannot convert 'Config' to 'Config *'

Nahlásit jako SPAM
IP: 94.113.172.–
KIIV
~ Moderátor
+43
God of flame
20. 3. 2018   #9
-
0
-

#8 TomyB
kdyz uz, tak aspon kontroluj, jestli instance uz neobsahuje validni pointer. Pak uz nema smysl vytvaret dalsi a delat load config. Jen to uz proste neni thread safe. Zatimco  static Config instance;  s loadConfig primo v konstruktoru by bylo. Jak to tam volas az pote, tak uz se to zase provadi pri KAZDEM VOLANI getInstance! A tim to neni thread safe.

Chyba "cannot convert 'Config' to 'Config *' " znamena jen to, ze vracis referenci na dereferencovanou instanci, ale snazis se to nacpat do pointeru. Rovnou vrat pointer, kdyz uz ho tam teda mas....

static Config* getInstance()
{
	static Config* instance;  // staticke a globalni se inicializuji na defaultni hodnotu = nullptr
	if (! instance)  // neni to ale thread safe
	{
		instance = new Config;
		instance->loadConfig();
	}
	return instance;
}
Nahlásit jako SPAM
IP: 81.30.230.–
Program vždy dělá to co naprogramujete, ne to co chcete...
TomyB
~ Anonymní uživatel
57 příspěvků
20. 3. 2018   #10
-
0
-

Rozumím, ale i takto je tam něco ještě chybně.

Error    1    error LNK2019: unresolved external symbol "public: static class Config * __cdecl Config::getInstance(void)" (?getInstance@Config@@SAPAV1@XZ) referenced in function WinMain

Error    2    fatal error LNK1120: 1 unresolved externals

Nahlásit jako SPAM
IP: 94.113.172.–
KIIV
~ Moderátor
+43
God of flame
20. 3. 2018   #11
-
0
-

#10 TomyB
takhle tady budem jeste pristi stoleti. Tohle je hlaska, ktera ti rika, ze volas neco, co je sice deklarovano, ale neexistuje implementace. Mas prototyp ale zadnou metodu.

 Tohle napriklad funguje (tedy alespon na normalnim pocitaci):

#include <iostream>

class Config
{
public:
	static Config* getInstance()
	{
		static Config* instance;  // staticke a globalni se inicializuji na defaultni hodnotu = nullptr
		if (! instance)  // neni to ale thread safe
		{
			instance = new Config;
			instance->loadConfig();
		}
		return instance;
	}

	void loadConfig()
	{
		std::cout << __func__ << " called\n";		
	}

private:

	Config()
	{
		loadConfig();
	}
};


int main()
{
	Config* cfg = Config::getInstance();

	std::cout << cfg << "\n";
	std::cout << Config::getInstance() << "\n";
	std::cout << Config::getInstance() << "\n";
	std::cout << Config::getInstance() << "\n";
	std::cout << Config::getInstance() << "\n";
}
Nahlásit jako SPAM
IP: 81.30.230.–
Program vždy dělá to co naprogramujete, ne to co chcete...
TomyB
~ Anonymní uživatel
57 příspěvků
20. 3. 2018   #12
-
0
-

Udělal jsem to takto načisto, ARM funguje, MIPS nefunguje. Takže mě napadá, zda není potřeba něco poštelovat ve Visual Studiu.

Nahlásit jako SPAM
IP: 94.113.172.–
TomyB
~ Anonymní uživatel
57 příspěvků
20. 3. 2018   #13
-
0
-

A jinak díky za snahu pomoci.

Nahlásit jako SPAM
IP: 94.113.172.–
TomyB
~ Anonymní uživatel
57 příspěvků
21. 3. 2018   #14
-
0
-

Tak jsem ten projekt přepsal z VS do eVC++, a tam to šlape jak hodinky, jak ARM, tak MIPS. Tak změním prostředí. :-)

Nahlásit jako SPAM
IP: 94.113.172.–
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, 69 hostů

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ý