Cookies op Tweakers

Tweakers maakt gebruik van cookies, onder andere om de website te analyseren, het gebruiksgemak te vergroten en advertenties te tonen. Door gebruik te maken van deze website, of door op 'Ga verder' te klikken, geef je toestemming voor het gebruik van cookies. Wil je meer informatie over cookies en hoe ze worden gebruikt, bekijk dan ons cookiebeleid.

Meer informatie
Stel een vraag

Discussieer mee of stel een vraag

Filters - Verfijn resultaten

Topictype

Categorieën

AND

Onderwerpen

AND

Subforum

Datumbereik

Topicstarter

Topicstatus

245 topics - Pagina 1 van 10

C++ multithreading: mainloop en meerdere workers

06-04 08:59 vraag 12

Vraag

Ik ben bezig met het multithreaded maken van een applicatie. Deze bestaat uit een main loop en een aantal workers. De workers kunnen onafhankelijk van elkaar tegelijk worden uitgevoerd, maar de main loop mag niet worden uitgevoerd als de workers aan het werk zijn. Dit alles moet continue worden uitgevoerd, zoals hieronder met pseudocode kan worden weergegeven
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mainLoop()
{
    while (true)
    {
        wachtTotAlleWorkersKlaarZijn();
        DoeZelfBerekeningen();
        NotifyWorkersDatZeVerderKunnen();
    }
}

worker(int id)
{
    while (true)
    {
        wachtOpNotifyVanMainLoop();
        DoeBerekeningen();
    }
}

Middels boost heb ik zelf wat geprobeerd middels een aantal mutexen en condition variables, maar ik krijg nog niet het gewenste resultaat. Met de onderstaande code krijg ik als output dat de mainLoop twee keer wordt uitgevoerd en slechts een enkele worker wordt drie keer uitgevoerd. De gewenste output is dat continue de mainLoop wordt uitgevoerd gevolgd door alle workers.
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
class ThreadManager
{
    private:
        boost::condition_variable updateReadyCondition;
        boost::mutex updateReadyMutex;
        bool updateReady = false;

        boost::condition_variable threadsReadyCondition;
        boost::mutex threadsReadyMutex;
        bool threadsReady = true;

        int numThreadsRunning = 0;
        int numThreadsStarted = 0;

        boost::mutex numThreadsRunningMutex;
        boost::mutex numThreadsStartedMutex;

    public:

        void threadStarted()
        {
            numThreadsStartedMutex.lock();
            numThreadsStarted++;
            if (numThreadsStarted == NUM_THREADS)
            {
                updateReady = false;
            }
            checkIfThreadsAreReady();
            numThreadsStartedMutex.unlock();
        }

        void threadEnded()
        {
            numThreadsRunningMutex.lock();
            numThreadsRunning--;
            checkIfThreadsAreReady();
            numThreadsRunningMutex.unlock();
        }

        void checkIfThreadsAreReady()
        {
            if (numThreadsRunning == 0 && numThreadsStarted == NUM_THREADS)
            {
                boost::unique_lock<boost::mutex> lock(threadsReadyMutex);
                threadsReady = true;
                updateReady = false;
                threadsReadyCondition.notify_all();
            }
        }

        void mainLoop()
        {
            while (true)
            {
                boost::unique_lock<boost::mutex> lockThread(threadsReadyMutex);
                while (!threadsReady)
                {
                    threadsReadyCondition.wait(lockThread);
                }
            
                cout << "update\n";
                std::this_thread::sleep_for(std::chrono::milliseconds(1000));
                cout << "update done\n";

                numThreadsRunning = NUM_THREADS;
                numThreadsStarted = 0;

                boost::unique_lock<boost::mutex> lockUpdate(updateReadyMutex);
                updateReady = true;
                updateReadyCondition.notify_all();
            }
        }

        void runThread(int id)
        {
            while (true)
            {
                boost::unique_lock<boost::mutex> lockUpdate(updateReadyMutex);
                while (!updateReady)
                {
                    updateReadyCondition.wait(lockUpdate);
                }
            
                threadStarted();
                cout << "start " << id << "\n";
                std::this_thread::sleep_for(std::chrono::milliseconds(1000 * id));
                cout << "end " << id << "\n";
                threadEnded();
            }
        }

        void start()
        {
            vector<boost::thread> threads;
            threads.push_back(boost::thread(&ThreadManager::mainLoop, this));
            for (int i = 0; i < NUM_THREADS; i++)
            {
                threads.push_back(boost::thread(&ThreadManager::runThread, this, i));
            }

            for (int i = 0; i < NUM_THREADS + 1; i++)
            {
                threads[i].join();
            }
        }
};

Beste antwoord

Oke, ben even aan het pielen geweest, maar dit lijkt volgens mij meer op wat je probeert te bereiken. De crux zit 'em in regel 15, waar je de lock op het "werk" weer loslaat nadat je deze hebt gekregen in de wait( .... ). ( Deze versie van wait encapsulate de while loop die jij expliciet uitschrijft ) en zoals je ziet hoef je voor de notify niets te locken.
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
condition_variable work, complete;
mutex mtx;
int work_cnt, busy_cnt;

void worker( int id )
{

    while( true )
    {
        unique_lock<mutex> lk(mtx);

        work.wait(lk, []{ return work_cnt > 0; } );
        ++busy_cnt;
        --work_cnt;
        lk.unlock();


        // Do work here

        {
            lock_guard<mutex> lk(mtx);
            --busy_cnt;
        }
        complete.notify_all();
    }
}

void supervisor()
{
    while( true )
    {
        {
            lock_guard<mutex> lk(mtx);
            work_cnt = 5;
        }

        work.notify_all();

        unique_lock<mutex> lk(mtx);
        complete.wait(lk, []{   return work_cnt == 0 && busy_cnt == 0; } );
    }
}

int main()
{
    thread t1(worker, 1), t2(worker, 2), t3(worker, 3), t4(supervisor);
    t1.join();
    t2.join();
    t3.join();
    t4.join();
}

[Qt] Undefined Reference error bij gebruik QtSerialPort

20-09-2015 discussie 9
Dag allen,

Ik ben al een tijdje bezig aan een aantal elektronica projectjes, waarvoor ik een USB interface naar een µC (in dit geval voorlopig een arduino) nodig heb. In het verleden is me dit altijd goed gelukt, zowel met Java als met C++ in Visual Studio.
Maar om Qt een beetje op te frissen (maandag begint een nieuw academiejaar, en dan is zo'n opfrisbeurt natuurlijk altijd welkom :) ) heb ik deze keer de interface in Qt proberen te maken.

Alleen ging dat minder vlot dan verwacht...

Ik krijg een hele hoop gelijkaardige errors:
code:
1
2
3
C:\Users\Azzi\OneDrive\Documenten\Software3\QTProjects\ArduinoCom\serialcom.cpp:3: error: undefined reference to `_imp___ZN11QSerialPortC1EP7QObject'
C:\Users\Azzi\OneDrive\Documenten\Software3\QTProjects\ArduinoCom\serialcom.cpp:5: error: undefined reference to `_imp___ZN11QSerialPort11setPortNameERK7QString'
...

Ik verwacht dat dit zou liggen aan een library die niet is geïnclude, maar de libraries zijn wel degelijk geïnclude:
code:
1
2
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>

Van wat ik uit google kan opmaken, is dat de linker op zoek gaat naar een reference die niet bestaat, of een reference die alleen gedeclareerd is (en niet gedefinieerd). Maar dat lijkt me in dit geval zo onwaarschijnlijk, aangezien het gewoon uit de Qt library komt?

Iemand die me in de juiste richting kan sturen?

Alvast bedankt!


edit: de code:
http://pastebin.com/XtTLMNqz

EDIT2: Ok, aan de hand van een youtube filmpje waarin iemand iets gelijkaardig probeert gedaan te krijgen heb ik het al gevonden. Ik had op voorhand al een vermoeden dat het iets in die aard ging zijn, omdat ik in het verleden al vaker dit nodig heb gehad:
In Qt moet je voor sommige libraries te gebruiken, ondanks dat je ze gewoon kan includen zonder dat de IDE een fout geeft, ook een vermelding maken in je project-file. Anders vindt de linker die library niet...

Opgelost dus! Sorry voor deze nutteloze thread :X

[c++] include 'boom' analyseren?

14-06-2015 discussie 22
Ik werk nu aan een project waarbij heel vaak geldt dat als je een header file aanpast, je weer een kwartier zit te wachten op een bijna volledige rebuild. Daar wil ik graag wat aan doen. Simpele oplossingen genoeg, bijvoorbeeld: als je een class nodig hebt als argument-type is 'class X' beter voor dat geval dan '#include "X.h" '.

Wat ik daarvoor graag zou zien is de 'boom' van includes: welke header wordt indirect door het hele programma included, en waar moet ik bovenstaande (of een andere) truc toepassen om de bouw-tijden te verbeteren. Wie kent daar goede tools voor? We bouwen nu met CMake, als dat helpt.

Ik snap dat veel mensen denken dat dit geen goed idee is: als je een type nodig hebt moet je toch dat type includen, geen gezeur? Dat is normaal ook mijn eerste gedachte. Tweede gedachte is uiteraard dat de bouw-tijden verbeterd moeten worden. Daar ben ik het ook helemaal mee eens, maar bij een project van 26MB sourcecode zal dat waarschijnlijk wat meer tijd kosten ;) Daarnaast heeft include volgens mij het effect dat de CPP-file voor de compiler effectief langer is, dus verwacht ik dat als ik de include-boom kleiner maak, de compile-tijd ook korter wordt.

[C++] eenvoudige TCP socket geraakt niet verbonden (in Qt)

25-05-2015 discussie 10
Dag allen!

Ik zit al een hele tijd te zoeken achter de reden waarom ik geen data via TCP verstuurd krijg in een programma'tje dat ik aan het schrijven ben. Ik heb gekeken in Wireshark, en ook daar kan ik geen verzonden TCP pakketten van mijn applicatie zien. (De UDP pakketten komen wél door).

Eerst dacht ik dat het oftewel een firewall probleem kon zijn, oftewel dat ik ergens een gigantische fout over het hoofd zou gezien hebben in mijn code.

Ik heb dan om te testen een nieuw project aangemaakt waarbij het programma een heel basic TCP verbinding opzet met zichzelf, en data probeert te versturen, waarbij hij in console print als hij op een bepaalde regel is geraakt. Wat bleek? Hij blijft steken bij "waitForConnected()".
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void MainWindow::readTcpData()
{
    QByteArray data = pSocket->readAll();
    QD << data;
}
void MainWindow::on_pushButton_clicked()
{
    QByteArray data;
    data.append("test");

    pSocket = new QTcpSocket( this ); 
    connect( pSocket, SIGNAL(readyRead()), SLOT(readTcpData()) );

    QD << "button clicked";

     pSocket->connectToHost("127.0.0.1", 9000);
     if( pSocket->waitForConnected() ) {
         QD << "connected";
         pSocket->write( data );
     }
}

"button clicked" krijg ik in console te zien als ik op de knop klik. "connected" komt er niet op.
Iemand die een eenvoudige verklaring hiervoor heeft?
(Kans is zeer reëel dat het iets heel stoms is. Ben namelijk nog maar een noob-programmeur ;) )

Alvast bedankt!

[C++] reboot loop atmega328p class

23-05-2015 discussie 2
Beste tweakers,

Ik heb een probleem met mijn code wat ik op een atmega328P draai.
Ik heb in C++ een driver geschreven voor de w5100 (ethernet), echter als ik in mijn code een socket aan maak.
Server sock0(o);
Dan gebeuren er rare dingen, oa wordt de code die er boven staat niet meer helemaal uitgevoerd.

De fout zit dus waarschijnlijk in de constructor van mijn server class, ik heb echter niet zoveel ervaring met classes (dit is de eerste keer dat ik het een beetje serieus gebruik), dus zou iemand hier even naar kunnen kijken?
C: main
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include "spi.hpp" // mijn librarys
#include "ethernet.hpp" // mijn librarys
 
void setup(){
    pinMode(7, OUTPUT);
    pinMode(5, OUTPUT);
    melodi();  // piep toontje (tijdelijk)
 
    delay(1000);
    Serial.begin(115200);
    Serial.println("We just rebooted!!!!\n"); // hierna herstart hij ( de volgende regel wordt dus niet uitgevoerd), mits ik onderin de socket aan maak.
    Serial.println("\t Start init");
    spi.init();
    delay(1);
}
 
void loop()
{
    Serial.println("\t begin setIpData");
    wiz.setIpData();
    Serial.println("\t sock init");
    Server sock0(0); // -----------------------  als dit in mijn code staat
    Serial.println("end sock");
    while(1);
}


C: Header
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Server{
public:
    uint8_t buffer[bufferSize];
    //Server(uint8_t number);
    Server(int number);
    void setPort();
    void setPort(uint8_t laag);
    void setPort(uint8_t hoog, uint8_t laag);
    void setPort(uint16_t getal);
    void setPort(int x);
 
    int start();            // initalizatie
    int listen();                    // luisteren voor binnen koment verkeer
    int checkEstablished();          // is er een verbinding tot stand gekomen?
    uint16_t receivedData();         // data ontvangen?
    void receivingData();            // er komt data binnen, nu verwerken
    int sendData(uint8_t data[], uint16_t length);                           // verstuur data
    void gotFin();                   // fin: einde verbinding ontvangen?
    void closed();                   // verbinding is verbroken (denk ik)
    int timeout();                  // Timeout in de verbinding
    void close();                    // sluit de verbinding
    uint8_t getStatus();
    void disconnect();                     // sluit de vebinding netjes af
private:
    struct MODE{
        const static uint8_t MULTI          = 1<<7;
        const static uint8_......  // en nog veel meer constanten
    }SR;
 
    uint8_t sNr, number;                     // socket nummer
};


C: cpp include
1
2
3
4
Server::Server(int Number){  /// oorspronkelijk stond hier meer code in, maar dat heb ik er even uit gelaten (krijg het zelfde probleem hier mee)
    sNr=4;
    Number = 0;
}

Een paar dingen wat ik al heb geprobeerd:
  • Alle functies leeg halen
  • controlleren of de voeding spanning niet inzakt
  • Andere(grote) microcontroller
  • Controle of het geheugen niet vol loopt, (volgens de compiler niet)
Mvg,

Flammert

[C] Ip address probleem

07-05-2015 discussie 8
Hallo, ik ben bezig met de OSCP security training en heb voor een lab (meteen een disclaimer dus: nee ik doe niks illegaals, dit is mijn werk) een exploit gevonden. Ik heb 'm hier en daar wat aangepast met die zeer gelimiteerde kennis van programmeren die ik helaas nog heb...

Nu loop ik tegen een probleem aan... Hier volgt een stukje code van een publieke exploit van CUPS:

http://sebug.net/paper/Ex...s/0301-exploits/sigcups.c
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
#define BUF_SIZE    4096

#define die(a) { perror("[!] "a); exit(-1); }

int     verbose = 0;
char        *host = "127.0.0.1";
int     port = 631;
unsigned long   retaddr = 3232239841; /* exploit: *($retaddr * 4) = $address_of_shellcode */

char greet[] = "POST /jobs HTTP/1.1\nContent-type: application/x-www-form-urlencoded\nContent-length: %d\n\n";
char evilmsg[] = "-%u=";

/*

Hierin heb ik het originele retaddr vervangen van 805289688 naar 3232239841 (de int waarde van 192.168.16.225)

Als Ik de code nu compile lijkt die waarde nu te groot te zijn voor "unsigned long"?

Hoe krijg ik dit nu toch aan de praat zonder dat het impact heft op the hele lijn code (incl erachter)?

de error:

gcc ./cups.c
./cups.c:38:1: warning: this decimal constant is unsigned only in ISO C90 [enabled by default]

opengl over xforwarding

30-04-2015 discussie 4
hallo allemaal,

ik heb een opengl programma wat op mijn windows prima werkt. ik wil dit ook testen op linux, compilen is gelukt maar als ik het run krijg ik de volgende error:
code:
1
freeglut (./ProjectDemeter):  ERROR:  Internal error <FBConfig with necessary capabilities not found

ik gebruik xming-mesa op windows en xforwarding over ssh op linux om het resultaat om mijn beeld te toveren (zonder succes dus) google wijst vooral naar dat ik xming-mesa moet hebben (wat ik dus al gebruik) en verder niet veel nuttigs. Weet iemand hoe ik dit kan fixen?

[C++] Waarom geen string ref class?

31-03-2015 discussie 18
In C++ mis ik een 'string ref' class, een const char* pair dat wijst naar een string. STL gebruikt wel iterator pairs als input types, maar functies die strings als input parameters hebben, willen een reference naar std::string.
Op die manier ben je verplicht een std::string te construeren, terwijl dit helemaal niet nodig is.
Weet iemand waarom dit is?
Zelfs Boost heeft zo'n class niet voor zover ik weet.

[C++] kan geen threads gebruiken met /clr ? (noob)

14-03-2015 discussie 14
Ik was vandaag begonnen met mezelf .NET aan te leren (heb deze korte guide gevolgd: http://www.codeproject.co...T-Forms-in-C-the-Easy-Way ) En dat vlotte aardig. Ik kreeg (tegen mijn verwachtingen in) alles vrij snel werkend in Visual Studio.

Nu, wanneer ik een interface wou bouwen voor een ander project, lukte dit niet. Ik kreeg de error dat <thread> niet gebruikt kan worden met /clr en /clr:pure. Maar ik heb dat wel nodig volgens bovenstaande guide. En zonder die toe te voegen detecteerd hij verschillende namespaces niet.

Ik heb dan wat gegoogled of er workarounds waren. Die bleken er te zijn, maar die waren, voor en noob-programmer als ik, chinees. Ik geraakte er niet echt wijs uit wat ik moest doen. Tot dat ik dit tegenkwam:
quote:
It is not supported because the std::mutex implementation uses GetCurrentThreadId(). That's a winapi function that is not supposed to be use in managed code since it might be running on a custom CLR host that doesn't use threads to implement threading.

This is the good kind of problem to have, it shows that you are building your code wrong. Your native C++ is being compiled with /clr in effect. Which works rather too well, all C++03 compliant code can be compiled to MSIL and get just-in-time compiled at runtime, just like managed code. You don't want this to happen, your native C++ code should be compiled to machine code and get the compile-time code optimizer love.

Turn off the /clr option for this source code file, and possibly others, in your project. Right-click + Properties, General. If the native C++ code is mixed with C++/CLI code in one source file then you can use #pragma managed to switch back-and-forth.
(gaat wel niet over <thread>, maar over een andere include die blijkbaar ook niet tesamen gebruikt mag worden.)

Ik maak er uit op dat je in aparte source files clr kan uitzetten in Visual studio. Dit heb ik dan ook geprobeerd: enkel /clr voor de GUI.cpp, maar dit werkte helaas ook niet, want op de GUI.h kon ik die instelling niet aanpassen, en het is daarin dat alle includes staan die /clr nodig hebben (denk ik toch).

Is er iets dat ik fout doe/fout begrijp? Of is er misschien een workaround voor dit probleem?

[C++] 50 random elementen uit unordered_map

11-03-2015 discussie 43
Ik heb een unordered_map met meer dan 50 elementen en wil daar willekeurig 50 elementen uithalen. Hoe doe ik dit het beste?
Performance is belangrijk, de grootte van de containers ligt tussen de 0 en 10000 elementen en het trucje moet tot 10000x per seconde herhaalt worden.

Momenteel kopieër ik de elementen naar een vector en haal daar dan 50 elementen uit maar dat is niet echt efficient.

Oh ja, in sommige gevallen wordt de input container nog gefilterd, dus dan doen niet alle elementen mee.

Ik zou 50 random indexes in een vector kunnen stoppen, die sorteren en dan de originele unordered_map uitlezen maar weet niet of dat veel beter is en of het nog beter kan.
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
std::vector<std::array<char, 6>> candidates;
candidates.reserve(peers.size());
// populate candidates from unordered_map
size_t c = 50;
std::string d;
d.reserve(300);
if (candidates.size() > c)
{
    while (c--)
    {
        int i = rand() % candidates.size();
        d.append(candidates[i].begin(), candidates[i].end());
        candidates[i] = candidates.back();
        candidates.pop_back();
    }
}
else
{
    for (auto& i : candidates)
        d.append(i.begin(), i.end());
}
return d;

Het type van de elementen is std::array<char, 6> om het wat makkelijker te maken. ;)
Het is een IP adres / port combi.

[C++] error C2064, te weinig argumenten voor functie?

25-02-2015 discussie 9
Hellow allemaal,

Ik zit al enkele uurtjes te prutsen met multithreading werkend te krijgen in een C++ projectje.
code:
1
2
3
4
5
MotionDetect *o = new MotionDetect;
    //thread motionDetectThread(o->detect);
    thread motionDetectThread(&MotionDetect::detect);

    thread communicatieThread(communicatie);

de communicatieThread, die een functie start in hetzelfde cpp bestand werkt perfect, maar de motionDetectThread, die een functie moet starten uit een andere klasse, krijg ik maar niet werkend.

Ik krijg steeds deze error:
Error 1 error C2064: term does not evaluate to a function taking 0 arguments E:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\functional 1149 1

Volgens wat ik uit google kan afleiden wil dit zeggen dat ik niet het juiste aantal argumenten meegeef voor de functie detect te starten, maar die neemt helemaal geen argumenten:
code:
1
void detect();

Is er iets dat ik verkeerd doe/begrijp?

Alvast bedankt!


EDIT: @mods: Ik had eerst, zoals aangegeven staat in de richtlijnen van dit forum, de tag [C++] voor mijn titel geplaatst, maar had deze weggehaald omdat ik hieronder ook tag-functie zag staan. Na het posten blijkt echter dat dit niet hetzelfde is, maar ik kan het niet meer aanpassen. Kan iemand die dit leest dat in mijn plaats doen?

[C#] P/Invoke van een C++ functie geeft een NullRefException

16-01-2015 discussie 8
Lang geleden, maar ik ga hier toch nog eens een topic openen, ik zit nl. reeds een tijd te 'sjieken' op een probleem dat ik maar niet opgelost krijg.


We hebben hier een C++ DLL waar er een aantal methods gedefinieerd zijn die we via P/Invoke aanroepen vanuit .NET.
Deze C++ dll bestaat al enkele jaren, en werkte tot nu toe naar tevredenheid. Eén van de methods die we vanuit C# aanroepen, ziet er als volgt uit in die C++ dll.
C++:
1
2
3
4
extern "C" long WINAPI BtrTableOpenEx(long *Handle , char *TableName , char *DDLocation , char *DataLocation , char *Owner)
{
   ...
}

Deze method roepen we aan vanuit een C# dll. Hiertoe gebruiken we het DllImport attribute:
code:
1
2
3
4
5
6
[SuppressUnmanagedCodeSecurity]
        private static class NativeMethods
        {                    
            [DllImport ("BtrTable.dll")]
            internal static extern int BtrTableOpenEx( ref int handle, string tableName, string ddLocation, string dataLocation, string owner );
       }

Dit werkt perfect; we kunnen vanuit C# de BtrTableOpenEx method zonder probleem aanroepen.

Onlangs heb ik er echter een method moeten aan toevoegen aan die C++ dll. Het is eigenlijk dezelfde method, maar met een extra parameter. Ik heb geen overload van die method gemaakt, maar een method met een andere naam gedefinieerd (gewoon dezelfde naam gepostfixt met 2):
C++:
1
2
3
4
extern "C" long WINAPI BtrTableOpenEx2(long *Handle , char *TableName , char *DDLocation , char *DataLocation, char *Owner, BTI_WORD threadId)
{
    ...
}

Zoals je kan zien: de naam is gepostfixt met 2, er is een extra parameter toegevoegd van het type BTI_WORD. BTI_WORD is gedefinieerd als
C++:
1
typedef unsigned short     BTI_WORD;

De C++ dll compiled en build perfect.

Ik heb het .NET project aangepast zodanig dat deze nieuwe method ook vanuit .NET kan aangeroepen worden:
C#:
1
2
3
4
5
6
7
8
9
10
11
  [SuppressUnmanagedCodeSecurity]
        private static class NativeMethods
        {
            #region Table manipulation

            [DllImport ("BtrTable.dll")]
            internal static extern int BtrTableOpenEx2( ref int handle, string tableName, string ddLocation, string dataLocation, string owner, ushort threadId );

            [DllImport ("BtrTable.dll")]
            internal static extern int BtrTableOpenEx( ref int handle, string tableName, string ddLocation, string dataLocation, string owner );
}

Als ik nu echter vanuit .NET deze BtrTableOpenEx2 method ga aanroepen, dan krijg ik een runtime-error "object reference not set to an instance".
Het lijkt erop alsof die nieuwe method niet gevonden wordt, want ik ben zeker dat de BtrTableOpenEx2 functie uit de C++ niet aangeroepen wordt.

Waarschijnlijk zie ik iets over het hoofd, maar ik weet niet wat. Hopelijk kan iemand mij helpen. :P

[C++] OpenGL maakt witte lijnen

30-12-2014 discussie 7
hallo allemaal ik heb een beetje raar probleem. ik teken een kaart naar het scherm door pixel bij pixel dit naar het scherm te sturen. _map is een twee dimensionale matrix gemaakt met std::vector. Ik heb de pixels in de matrix naar een txt bestand gedumpt en geverifieerd dat deze kloppen met het plaatje dat ik wil tekenen.als ik render dan krijg ik echter dit:
http://i.imgur.com/hQ84xEn.png

mijn glut init:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH | GLUT_ALPHA); // Double buffering, RGB format
    glutInitWindowSize(width, heigth);
    glutInitWindowPosition(0, 0);
    glutCreateWindow("Test Plaatje");
    glClearColor(1.0, 1.0, 1.0, 1.0);

    glColor3f(1.0, 1.0, 1.0);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0.0, 1024, 0.0, 500);
    glMatrixMode(GL_MODELVIEW);

en mijn teken functie
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
...
std::vector<std::vector<RGB>> _map = std::vector<std::vector<RGB>>();
...
struct RGB
{
    int R;
    int G;
    int B;
};
...

//de teken functie
void Map::draw()
{
    glBegin(GL_POINTS);

    for (int x = 0; x < _w; x++)
    {
        for (int y = 0; y < _h; y++)
        {
            RGB pixel = _map[y][x];
            glColor3ub(pixel.R, pixel.G, pixel.B);
            glVertex2i(_p[0] + x, _p[1] + y);
        }
    }

    glEnd();
}

weet iemand hoe ik dit fatsoenlijk kan debuggen en fixen?

Mobile Cross-platform in C++ bouwen zonder C++ ervaring

17-12-2014 discussie 15
We willen in de toekomst meer code-sharing gaan gebruiken tussen onze verschillende apps en de verschillende platforms waarop die draaien (tot nu toe iOS waar Android een beetje achter aan hobbelt maar Windows Phone moet ook mogelijk zijn later) en ik heb naar aanleiding van dit artikel over cross-platform libraries bedacht dat wij het wellicht ook in C++ kunnen doen.

Er wordt binnen het bedrijf waarschijnlijk een hackathon georganiseerd en ik wilde daarvoor een minimale proof-of-concept SDK opleveren in C++ met op zijn minst Objective-C bridges (niet strikt noodzakelijk vanwege Objective-C++ maar niet iedereen die het moet implementeren voelt zich op zijn gemakt met direct C++ aanroepen), een simpele implementatie in iOS en hopelijk ook Android bridges. En dan wilde ik één van onze JSON API's implementeren.

De grote onbekende voor mij is C++. Op papier voldoet C++ aan een hoop voorwaarden omdat het OO, cross-platform en snel is. Maar het schijnt een enorm grote taal te zijn en een hoop "moet je net weten" dingen te hebben. Aan de andere kant heb ik 80% waarschijnlijk niet nodig omdat ik gewoon business logic ga schrijven die wat API's consumeert en de code helemaal niet zo performance gevoelig is. Wellicht dat ik een simpele subset van C++ kan gebruiken?

Hoe groot wordt deze uitdaging als ik al gewend ben aan een IDE met C++ support (Visual Studio en Xcode, ga het waarschijnlijk in Xcode doen i.v.m. iOS implementatie), Objective-C dus ook een beetje C ervaring en 7 jaar ervaring met C#?

opsporen debug assertion failed error

29-03-2014 discussie 10
Hallo allemaal,

Ik ben bezig een game of life game te maken in c++. Ik loop op het moment tegen een debug assertion failed error aan. Probleem is dat ik dit heel moeilijk kan debuggen omdat visual studio ipv breaken in mijn code waar het fout gaat, breaked ergens diep in een buildin library, terwijl ik wel "just my code" heb aanstaan. Weet iemand hoe ik bij dit type error ervoor kan zorgen dat visual studio wel breaked in mijn code? Dan kan ik ook fatsoenlijk naar mijn variablen kijken. Alvast bedankt.

[C++] Optimalisatie images/arrays

08-02-2014 discussie 15
Hey,

Ik ben momenteel bezig met een programma dat gebruik maakt van grote hoeveelheden afbeeldingen en functies adhv de invidiuele pixel waarden (volume rendering).
Nu merk ik echter dat het volgende erg traag gaat:
- De alpha waarden vaan meerdere PNG's opslaan in één lange array
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    char* chBuffer = new char[iImageWidth*iImageHeight*iImageCount];
    int i = 0, index = 0;
    while(pos2)
    {
        std::vector<unsigned char> image;
        error = lodepng::decode(image, width, height, CString2String(Files.GetNextPathName(pos2))); 
// PNG inlezen in vector image
        
        for(int x = 0; x < iImageWidth; ++x)
        {
            for(int y = 0; y < iImageHeight; ++y)
            {
                index = x*iImageWidth + y;

                chBuffer[i*iImageWidth*iImageHeight + index] = image[index*4 + 3]; 
// Alpha waarde opslaan in lange array
            }
        }
        
        ++i;
    }

- Een for loop met hierin een if-then operatie op iedere waarde in de lange array
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
    int index = 0;
    for(int i = 0; i < iImageCount; ++i)
    {
        for(int x = 0; x < iImageWidth; ++x)
        {
            for(int y = 0; y < iImageHeight; ++y)
            {
                index = i*iImageWidth*iImageHeight + x*iImageWidth + y;
                
                chBuffer[index] = func(chBuffer[index]);
            }
        }
    }

Mijn C++ kennis is redelijk beperkt, en ik ben na vandaag nog niet veel verder gekomen met dit optimalizeren.
Mijn vraag is of dit te optimalizeren valt en hoe ik dit het beste aan kan pakken.

Bvd!

[C++] GUI microcontroller

15-01-2014 discussie 6
Hallo

Ik ben bezig aan een GUI library te maken voor mijn Mini-DK2 microcontroller met ingebouwd 320x240 LCD scherm en touchscreen (de mini-dk2 is compatibel met de online mbed compiler, zodat je hier gemakkelijk in C++ kunt coden).

Wat ik nu heb (deels overgenomen van een andere library):
Een klasse "Menuitems" met daarin alleen informatie zoals een char* met de naam, een functiepointer voor wat te doen als er op dit menuitem is geklikt, een pointer naar een ander menuitem...
Dan is er een klasse "Menu", wat eigelijk niet meer is dan een vector van verschillende menuitems.
Ten slotte is er de "Navigator" klasse, die alles doet in verband met het tonen van de menu's, het controleren dat er een touch plaatsvind en hiermee de juiste dingen doet, de navigator houd ook bij wat het actieve menu is (zodat hij de juiste dingen doet bij een touch).

Het grote nadeel is dat dit alleen maar werkt met "normale" statische menus (dus "menuitem1", "menuitem2" ...). Nu wil ik deze boel wat uitbreiden zodat ik ook andere dingen kan tonen op het scherm (bijvoorbeeld een fader, numeriek toetsenbord voor nummers in te geven, labels...

Nu wil ik helemaal opnieuw beginnen en is mijn vraag hoe ik dit het best zou doen? Dit is wat ik al bedacht heb (copy paste van stackoverflow, maar daar krijg ik geen reactie):

My first thought was using an Abstract class "InterfaceElement", with in it functions like "touchEvent() , draw(), update()". Then I would use different IntefaceElements like Button, Slider, Label... All those InterfaceElements would go into a vector that is in a certain Container (with for each container a different layout). Then a Controller that remembers the currently active Container, and gives through the touchEvents to the container which handles it to the InterfaceElement.

Of zou ik het best overstappen op iets meer MVC achtigs?

Bedankt!

Jannes

[C++] Popup window in GUI applicatie

26-06-2013 discussie 5
Goedendag,

Momenteel ben ik bezig met het maken van een GUI C++ applicatie (Microsoft Visual Studio 2012) en wil daar graag een Popup window tonen vanuit de code. Echter na het zoeken op het internet kom ik weinig informatie tegen om een simpel schermpje te tonen. Kan iemand mij op weg helpen?

Alvast bedankt!

[C++] [Boost:asio] Custom TCP en IP pakket

20-06-2013 discussie 5
Is het mogelijk om met behulp van Boost:asio een custom TCP en IP pakket te versturen. Kortom de waarde van het TCP en/of IP pakket dienen aangepast te worden (denk aan TTL) en dergelijke. TCP is mogelijk heb ik gelezen, alleen ik lees op https://github.com/kevincon/asio-rawsockets-example dat custom IP niet mogelijk is, maar dat hij het nog niet heeft geprobeerd. Kan een van jullie mij vertellen of iemand het heeft geprobeerd en nog belangrijker of het mogelijk is?

Alvast bedankt!

[C++] OpenGL: FrameBuffer geeft "corrupt" resultaat

19-03-2013 discussie 7
Hoi allemaal,

Ben bezig met video speler in SDL, en hiervoor maak ik nu gebruik van een fragment shader om de vertaling van ruwe video (YUV) naar RGB te doen.
Dit werkt allemaal mooi en aardig, maar zoals ik het nu werkend heb, zal de shader elke renderloop zijn werk doen, en helaas onnodig vaak hetzelfde video frame converteren.

Daar komt de FrameBuffer om de hoek.
De FrameBuffer wil ik gebruiken om de conversie éénmalig te doen, en het resultaat in een nieuwe texture op te slaan, zodat ik deze later zoals elke willekeurige andere texture kan renderen.
Als hier andere/betere alternatieven voor zijn, hoor ik dat natuurlijk graag :D
(Let wel op dat ik naast de video ook andere textures wil kunnen blijven renderen)

Alvast sorry voor de ENORME lap code...
Na twee dagen proberen, debuggen, specs lezen en voorbeelden doorspitten voor iets simpels als een framebuffertje verwacht ik dat ik toch nog iets simpels over het hoofd zie...


Voor de volledigheid zal laat ik eerst eens laten zien hoe ik het spul initialiseer:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// Initialize SDL
SDL_InitSDL_INIT_VIDEO );
// Set the default attributes
SDL_GL_SetAttributeSDL_GL_DOUBLEBUFFER1 );
SDL_GL_SetAttributeSDL_GL_DEPTH_SIZESCREEN_BPP );
SDL_GL_SetAttributeSDL_GL_RED_SIZE8 );
SDL_GL_SetAttributeSDL_GL_GREEN_SIZE8 );
SDL_GL_SetAttributeSDL_GL_BLUE_SIZE8 );
SDL_GL_SetAttributeSDL_GL_ALPHA_SIZE8 );
SDL_GL_SetAttributeSDL_GL_SWAP_CONTROL1 );
pSurface = SDL_SetVideoMode480320SCREEN_BPPSDL_OPENGL );
// OpenGL settings
glEnableGL_TEXTURE_2D );
glEnableGL_LINES );
glClearColor0.0f0.0f0.0f0.0f );
glViewport00480320 );
glClearGL_COLOR_BUFFER_BIT );
glMatrixModeGL_PROJECTION );
glLoadIdentity();
glOrtho0.04803200.00.01.0 );
glMatrixModeGL_MODELVIEW );
glLoadIdentity();
glEnableGL_BLEND );
glBlendFuncGL_SRC_ALPHAGL_ONE_MINUS_SRC_ALPHA );

Hier de functie waarmee ik de Y, U en V data aan de fragment shader voer, die er vervolgens zijn kunstje mee doet:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
void RenderConverted()
{
    // Get Textures
    GLuint    textures[3] = { NULL };
    glGenTextures3textures );
    if (!textures[0] || !textures[1] || !textures[2])    { return; }    // Not all textures created!

    // Use the program.
    glUseProgram(pProgramHandle);

    int i = 0;
    const int videoWidth = 300;
    const int videoHeight = 225;

    // Set fragment shader variable
    GLint sampler1Uniform = glGetUniformLocation(pProgramHandle,"height");
    glUniform1f(sampler1UniformGLfloat(videoHeight));

    // Select texture unit 1 as the active unit and bind the U texture.
    glActiveTexture(GL_TEXTURE1);
    i=glGetUniformLocation(pProgramHandle,"Utex");
    glUniform1i(i,1);  // Bind Utex to texture unit 1
    glBindTexture(GL_TEXTURE_RECTANGLE_NV,textures[0]);
    glTexParameteri(GL_TEXTURE_RECTANGLE_NV,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_RECTANGLE_NV,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);
    glTexImage2D(GL_TEXTURE_RECTANGLE_NV,0,GL_LUMINANCE,GetStridePlane_U ),videoHeight /2,0,GL_LUMINANCE,GL_UNSIGNED_BYTE,GetPlanePlane_U ));
    // Select texture unit 2 as the active unit and bind the V texture.
    glActiveTexture(GL_TEXTURE2);
    i=glGetUniformLocation(pProgramHandle,"Vtex");
    glBindTexture(GL_TEXTURE_RECTANGLE_NV,textures[1]);
    glUniform1i(i,2);  // Bind Vtext to texture unit 2
    glTexParameteri(GL_TEXTURE_RECTANGLE_NV,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_RECTANGLE_NV,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);
    glTexImage2D(GL_TEXTURE_RECTANGLE_NV,0,GL_LUMINANCE,GetStridePlane_V ),videoHeight /2,0,GL_LUMINANCE,GL_UNSIGNED_BYTE,GetPlanePlane_V ));
    // Select texture unit 0 as the active unit and bind the Y texture.
    glActiveTexture(GL_TEXTURE0);
    i=glGetUniformLocation(pProgramHandle,"Ytex");
    glUniform1i(i,0);  // Bind Ytex to texture unit 0
    glBindTexture(GL_TEXTURE_RECTANGLE_NV,textures[2]);
    glTexParameteri(GL_TEXTURE_RECTANGLE_NV,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_RECTANGLE_NV,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);
    glTexImage2D(GL_TEXTURE_RECTANGLE_NV,0,GL_LUMINANCE,GetStridePlane_Y ),videoHeight ,0,GL_LUMINANCE,GL_UNSIGNED_BYTE,GetPlanePlane_Y ));

    // Note that this image is horizontally flipped
    glBegin(GL_QUADS);
    glTexCoord2i(          0,           0 );
    glVertex2i(            0videoHeight );
    glTexCoord2ivideoWidth,           0 );
    glVertex2i(   videoWidthvideoHeight );
    glTexCoord2ivideoWidthvideoHeight );
    glVertex2i(   videoWidth,           0 );
    glTexCoord2i(          0videoHeight );
    glVertex2i(            0,           0 );
    glEnd();

    // Disable the program.
    glUseProgram(0);

    // Clean up
    if (textures[0]) { glDeleteTextures1, &textures[0] ); textures[0] = NULL; }
    if (textures[1]) { glDeleteTextures1, &textures[1] ); textures[1] = NULL; }
    if (textures[2]) { glDeleteTextures1, &textures[2] ); textures[2] = NULL; }
}

En vervolgens is dit mijn (versimpelde) renderloop:
C++:
1
2
3
4
5
6
7
8
// Begin
glClearColor0.0f0.0f0.0f0.0f );
glClearGL_COLOR_BUFFER_BIT );

RenderConverted();

// Flip the surfaces
SDL_GL_SwapBuffers();

Bovenstaande code geeft 't gewenste resultaat.


Vervolgens ben ik met de FrameBuffer aan de slag gegaan...
Ik heb voor de oudere EXT functies gekozen omdat ik heb gelezen dat deze ook op OpenGL ES 2.0 zullen werken, en de nieuwe functies zonder EXT onderdeel zijn van OpenGL 3.1. But correct me if i'm wrong!

Een globale FrameBuffer aangemaakt met:
C++:
1
2
3
GLuint frameBufferObject = 0;
glGenFramebuffersEXT(1, &frameBufferObject);
if (!frameBufferObject) { return; }

Gebruik van de FrameBuffer:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
void CreateVideoTexture()
{
    // Prepare texture for the FrameBuffer to render on
    glGenTextures1, &texture );
    if (!texture) { return false; }    // No texture created
    const int videoWidth = 300;
    const int videoHeight = 225;
    GLenum textureFormat = (SDL_BYTEORDER == SDL_BIG_ENDIAN) ? GL_BGRA : GL_RGBA;
    glBindTexture(GL_TEXTURE_2Dtexture);
    glTexParameteri(GL_TEXTURE_2DGL_TEXTURE_MIN_FILTERGL_LINEAR);
    glTexParameteri(GL_TEXTURE_2DGL_TEXTURE_MAG_FILTERGL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D0GL_RGBAvideoWidthvideoHeight0textureFormatGL_UNSIGNED_BYTENULL); // Reserve memory
    glBindTexture(GL_TEXTURE_2D0);

    // Prepare depth buffer
    glGenTextures(1, &depth);
    glBindTexture(GL_TEXTURE_2Ddepth);
    glTexParameteri(GL_TEXTURE_2DGL_TEXTURE_MAG_FILTERGL_LINEAR);
    glTexParameteri(GL_TEXTURE_2DGL_TEXTURE_MIN_FILTERGL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D0GL_DEPTH_COMPONENT32videoWidthvideoHeight0GL_REDGL_BYTENULL); // Reserve memory

    glBindTexture(GL_TEXTURE_2D0); // Make sure no texture is bound when starting to use the Frame Buffer

    // Bind the framebuffer object
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXTframeBufferObject);

    // Attach a texture to the Frame Buffer Object
    glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXTGL_COLOR_ATTACHMENT0_EXTGL_TEXTURE_2Dtexture0);
    glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXTGL_DEPTH_ATTACHMENT_EXTGL_TEXTURE_2Ddepth0);

    // Check if the Frame Buffer Object is OK
    GLenum framebufferStatus = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
    if (framebufferStatus != GL_FRAMEBUFFER_COMPLETE_EXT) { return; }

    // Render the fragment shader stuff
    RenderConverted();

    // Unbind the Frame Buffer Object
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT0);
}

Nieuwe renderloop:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// Begin
glClearColor0.0f0.0f0.0f0.0f );
glClearGL_COLOR_BUFFER_BIT );

if (!texture) { CreateVideoTexture(); }

const int videoWidth = 300;
const int videoHeight = 225;
// Render the texture!
glBindTexture(GL_TEXTURE_2Dtexture);
glBegin(GL_QUADS);
glTexCoord2i(          0,           0 );
glVertex2i(            0,           0 );
glTexCoord2ivideoWidth,           0 );
glVertex2i(   videoWidth,           0 );
glTexCoord2ivideoWidthvideoHeight );
glVertex2i(   videoWidthvideoHeight );
glTexCoord2i(          0videoHeight );
glVertex2i(            0videoHeight );
glEnd();

// Flip the surfaces
SDL_GL_SwapBuffers();

Dit geeft mij het volgende resultaat:
http://i47.tinypic.com/2qbsjn4.png

Voor mijn ongetraind oog lijkt het wel alsof ik onbedoelt een feedback loop heb gemaakt, waar ze in menig voorbeeld al voor waarschuwen. Maar voor zover ik weet unbind ik alles netjes optijd...

Elke tip of opmerking is welkom!
(Note: mijn voorbeeld plaatje hierboven is 480x320, maar in de code staat voor video 300x225. Dit heb ik gedaan om duidelijk aan te geven dat het renderwindow en de video verschillende afmetingen hebben)

[C/C++,Qt] BlackBerry 10 native Dev Startup topic

24-01-2013 discussie 1
(Dit is een openingspost, is de bedoeling het wat op te fleuren in de nabije toekomst met wat mooie plaatjes en voorbeelden)

Ikzelf heb geen probleem met het ontwikkelen voor BlackBerry 10, mar wil met deze openingspost mense de gelegenheid geven BlackBerry 10 te verkennen en ermee te starten en hun problemen in dit topic naar voren te brengen zodat we elkaar kunnen helpen.

Met de introductie van het BlackBerry 10 platform gaat RIM een compleet nieuwe kant op en breekt met het oude Java 2 Mobile Edition platform van BlackBerry 4,5,6,7 nu BBOS genoemd door RIM.

BlackBerry 10 draait op QNX os een Unix microkernel POSIX OS, die gebruikt om real-time systemen mee te draaien die 24/7 draaien en nooit een kernel crash hebben

Voor meer informatie over QNX - http://www.qnx.com/

De native programeer taal voor BlackBerry 10 is C/C++ en de ontwikkelomgeving is een eclipse client genaamd Momentics (welke ook al gebruikt werd voor ontwikkelen op het QNX platform)
http://developer.blackberry.com/native/

BlackBerry 10 heeft tevens ook een UI framework, welke direct uit C/C++ kan worden gebruikt of in combinatie met Qt en QML gebruikt kan worden.

Om het developers makkelijker te maken heeft BlackBerry 10 de Qt libraries geïmplementeerd.
Qt is een C/C++ library framework om een hoop zaken makkelijk te maken voor developers, zodat ze niet alleen maar low-level hardware code hoeven te kloppen. Het heeft datamodelen, netwerk libraries en ondersteund QML (Qt Markup Language) dat gebruikt kan worden om UI's mee te maken.
Qt is gebruikt op Nokia Symbian toestellen en is ook geimplementeerd in vele Linus varianten waarvan Ubuntu wel de grootste is.

Qt: http://qt.digia.com/
Qt Organisatie: http://qt-project.org/

Het Cascades UI framework kan je in de Momentics IDE gelijk met grafische preview gebruiken als je met QML werkt als je Cascades vanuit C/C++ gebruikt is er geen preview mogelijkheid.
https://developer.blackberry.com/cascades/

Het Cascades UI framework, draait constant op 60fps en elk element op het scherm is standaard mogelijk om te animeren ( roteren, schalen, bewegen, etc.)

RIM heeft van BlackBerry 10 een open standaarden (OpenGL ES, OpenAL, SQLlite) en open source platform gemaakt en zeer veel open source libraries en Platformen om bvb het maken van games te vereenvoudigen (Marmalade, Unity, GamePlay)
https://github.com/blackberry

Voorbeeld code:
Cascade
https://developer.blackberry.com/cascades/sampleapps/
https://github.com/blackberry/Cascades-Community-Samples

C/C++
http://developer.blackberry.com/native/sampleapps/bb10/
https://github.com/blackberry/Core-Native-Community-Samples

Voor nu een eerste verkenning van het platform.

Voor hulp van mede BlackBerry ontwikkelaars check http://www.bbdevgroup.nl
Een korte presentatie voor Native BlackBerry Development: http://www.slideshare.net...L/bb10-native-development

Alvast hel veel succes met het ontwikkelen van je eerste BlackBerry 10 App!

[C/C++] for loop VS while loop i.c.m multidimensionale array

22-01-2013 discussie 16
Hoi, ik heb een vraag:

Het is normaal gesproken zo dat als je door een multidimensionale array wilt gaan dan neem je een for loop.

Zoals het volgende:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const char * array[3][3] = {
        {"str1""str1""str1"},
        {"str2","str2""str2"},
        {"str3","str3","str3"}
};

int main() {
    int ij;

    for(i = 0i < 3i++) {
        for(j = 0j < 3j++) {
            printf("%s "array[i][j]);
        }
    }

    return 0;
}

Output: str1 str1 str1 str2 str2 str2 str3 str3 str3

Echter wil ik het met een while loop doen. En dan krijg ik dit:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
const char * array[3][3] = {
        {"str1""str1""str1"},
        {"str2","str2""str2"},
        {"str3","str3","str3"}
};

int main() {
    int i = 0;
    int j = 0;

    while(i < 3) {
        while(j < 3) {
            printf("%s "array[i][j]);
            j++;
        }
        i++;
    }

    return 0;
}

Output: str1 str1 str1

Dit doe ik met GCC 4.7.2. Is dit een bug of toch een standaard die ik over het hoofd zie? Of doe ik iets verkeert?

[C++] string met maximale grootte opvragen

01-11-2012 discussie 30
hallo allemaal,

ik zit met een probleempje wat heel simpel lijkt maar wat ik maar niet opgelost krijg. Ik wil dat mijn programma aan de gebruiken een string vraagt en dat het programma controleert hoe groot die is. Dus als de user meer chars invoert dan de bedoeling is moet mijn programma een bericht hierover geven. Ik heb hiervoor de volgende functie geschreven:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void get_string(char string[],int max_size,char name_item[]){
    int i;
    while(1){
        printf("Please enter %s with max %i chars: ",name_item,max_size);
        for(i=0;i<max_size;i++){
        string[i] = getchar();
            if(string[i] == '\n'){
                string[i] = '\0';
                return;
            }
        }
        printf("%s is too long! Please use a string of max %i chars\nPlease Try again\nPlease enter %s: ",name_item,max_size,name_item);
    }
}

Het probleem is echter dat ik als output krijg dat eerste call (ik doe er 2 achter elkaar) meteen skipt. hij denkt dat ik op enter druk zonder iets in tegeven. Ik denk dat dit komt omdat er een menutje voor zit waarbij je op enter moet drukken en hij de enter als het ware 'meeneemt' dat hij dus te snel is voor de user als het ware. weet iemand hoe ik dit moet oplossen? Heb het volgende al geprobeerd:
- clear van input
- cin.ignore()
- wachten totdat enter wordt losgelaten
helaas werkt dit allemaal niet, heeft iemand ideeën?

[C++] objectinstantie van parentform meegeven aan childform

18-10-2012 discussie 8
Ik ben bezig met het bouwen van een C++ programma met de Ultimate++ library. Ik heb een hoofdform en een form voor het maken van instellingen. Dit form kan middels een knop op het hoofdform worden geopend. Nu heb ik een class die dient voor het beheren van een aantal instelbare variabelen die opgeslagen worden in een XML file. Dit werkt allemaal prima. De instantie van deze class zit in de hoofdform, omdat de hoofdform altijd open is en er dus geen problemen komen met het vernietigen van de configuratie-class.

Nu wil ik echter de opgeslagen instellingen in de configuratie-class in de instellingenform gebruiken. Ik wil geen dubbele variabelen hebben dus ik wil een pointer naar de bestaande instantie meegeven aan de instellingenform. Dit is een goede oplossing toch? Als ik er compleet naast zit dan zeg het me!

In C# zou ik het zo doen, ik doe het al jaren en het werkt altijd:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Hoofdform : Form
{
     Configuratieclass mConf;

     InstellingenForm miForm = new InstellingenForm(mConf);
     
     void OpenInstellingen()
     {
          miForm.ShowDialog();
     }
}
class InstellingenForm : Form
{
     ConfiguratieClass mConf;

     InstellingenForm(ConfiguratieClass pConf)
     {
          mConf = pConf;
     }
}

Nu zit ik hier in C++ echter met een probleem. De forms zijn geen classes, maar structs. Echter heb ik ze veranderd in classes en mijn idee toegepast. Ik kreeg geen errors maar in de runtime kwam ik meteen een fout tegen. Naar mijn idee is het een memory leak of een corrupte pointer waar ik niet op heb gelet. De code zoals ik het in C++ heb gemaakt zag er zo uit.
C++:
1
2
3
4
5
6
7
8
9
10
11
12
struct SettingsDialog : public TopWindow // Dit is de instellingenform die erft van de U++ library
{
     ConfigurationStorage mStor// lokale variabele is wel nodig anders kan ik de instellingen niet meer opslaan nadat de objecten zijn ingeladen

     // meer object/functie definities...
}
SettingsDialog::SettingsDialog(ConfigurationStoragepConfig// Dit is de constructor van het instellingenformulier
{
     mStor = pConfig;

     // objecten uit het pConfig object worden ingeladen, dit zijn strings. Hier krijg ik dus runtime fouten. Meestal zijn het assert fail fouten.
}

Kan iemand me hiermee helpen? Ik doe nog niet zo heel lang C++ en ik ben nog steeds bezig met zo veel mogelijk te leren. Ik heb al veel problemen met pointers gehad wanneer de variabele in kwestie bijvoorbeeld al was vernietigd. Tijdens het debuggen zag ik ook dat de inhoud van een vector<string> in pConfig aangaf: "Unable to read memory". De waardes klopten ook niet. Er klopt dus iets niet in mijn pointer! Ik heb overigens ook de variabele meegegeven als: "ConfigurationStorage pConfig", en "ConfigurationStorage* pConfig". Beide geven foutmeldingen.

[C++] Run Length Encoding geeft teveel slashes bij decoderen

15-10-2012 discussie 11
(dit is een huiswerktopic)
Hallo allen,

In het volgende C++ programmeerwerkje was het de bedoeling om bestanden dmv Run Length Encoding te compressen. Voor degenen die er niet mee bekend zijn, dit houdt in dat een string als aaaaabbbbbb87324 naar het volgende wordt gecomprimeerd: a5b6\8\7\3\2\4

Dus vijf a'tjes wordt vervangen door a5, zes b'tjes wordt b6 en voor alle getallen en backslashes komt een backslash te staan om het zodoende te kunnen onderscheiden. Voor het gemak heeft onze leraar nog bedacht dat het wel leuk was om die getallen om te keren, dus aaaaaaaaaaaa wordt a21 in plaats van a12.

Nu werkt ons coderen perfect, maar bij het decoderen (line 121-176) gaat het mis zodra er slashes in het spel komen. Wat er gebeurt is het volgende:

- Er wordt bijvoorbeeld een string als a7959dddd gecomprimeerd. Dit geeft als resultaat a\7\9\5\9d4.
- Als we dan weer gaan decoderen, denkt het programma dat \7 betekent dat er 7 slashes moeten komen, waardoor het bestand overspoeld wordt met backslashes

Dit zal ongetwijfeld een klein, dom foutje zijn, maar we komen er niet meer uit (eerstejaars studenten he ;))

We hebben hier in ons werkcollege uren mee zitten stoeien, Rosetta heeft ons niet geholpen (die gebruikt een of andere rare library) en ook de student-assistent wist niet precies hoe hij dit nou op kon lossen. We hebben al vooruitgang geboekt, eerst bleef het programma namelijk zevens uitspugen als het een \7 tegenkwam..

Als er iemand is die tijd en zin heeft om een kijkje te nemen en ons een stapje in de goede richting kan helpen (tenslotte moeten we dit wel zelf bedenken op het tentamen), zijn we al heel gelukkig :)

Alvast bedankt!


Decodeer-functie:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
void decodeer(ifstream &invoerofstream &uitvoer){
   char prevkar = '$'//vorige karakter (voor vergelijking); $ = default
   char kar//huidig karakter
   int n = 0// teller voor hoe vaak een karakter nog uitgevoerd moet worden
   int aantalTekensUit = 0//teller voor grootte outputbestand
   int tellertje = 0//teller voor voorloopnullen
   char onthoudLetter = '@'//als een letter onthouden moet worden gebruiken we deze
   bool dubbelebackslash = false//bool voor dubbele backslashes
   int aantalslash = 0//aantal slashes dat de decodeerder tegenkomt

   kar = invoer.get();
   while (!invoer.eof())
   {      
      if (kar == '0')         
         tellertje++;        

      if (kar == '\\')
         aantalslash++;
       
      else if (prevkar != '\\')
         aantalslash = 0;
        
      if (isGetal(kar) && (prevkar != '\\' || dubbelebackslash))
             n = 10*n + kar-'0';
                                      
      else {
         n = omgekeerdDecodeer(ntellertje);
         tellertje = 0;
         
         while (n > 1){          
               uitvoer << onthoudLetter;
               n--;
               cout << "ik zit in de while" << endl;
         }//while
         
         n = 0;
         onthoudLetter = kar;
         
         if (aantalslash != 1)
            uitvoer.put(kar);

      }//else
      
      if (aantalslash == 2)
          dubbelebackslash = true;
      else
          dubbelebackslash = false;        
    
      aantalTekensUit++;
      prevkar = kar;  
      kar = invoer.get();    
            
   }//while
}

omgekeerd-decodeerfunctie
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int omgekeerdDecodeer(int getalint nullen){
   int omkeerhulpje = 0//zorgt voor afhandeling voorloopnullen
      
   while (getal > 0){
      omkeerhulpje *= 10
      omkeerhulpje += laatsteCijfer(getal);
      getal /= 10;
   }//while
  
   while (nullen > 0){
      omkeerhulpje *= 10;
      nullen--;
   }//while 
   
   return omkeerhulpje;
}// omgekeerdDecodeer

Resultaten per pagina: 25 | 50 | 100
1 2 3 ... 10


Samsung Galaxy S7 edge Athom Homey Apple iPhone SE Raspberry Pi 3 Apple iPad Pro Wi-Fi (2016) HTC 10 Hitman (2016) LG G5

© 1998 - 2016 de Persgroep Online Services B.V. Tweakers vormt samen met o.a. Autotrack en Carsom.nl de Persgroep Online Services B.V. Hosting door True