abonnement Unibet Coolblue Bitvavo
pi_93914977
De parameters geef je als pointer door in het vierde argument van CreateThread.
  donderdag 10 maart 2011 @ 19:16:07 #102
189216 netolk
maar dan andersom
pi_93918008
hmm, dan werkt mn code niet zoals ik zou verwachten...

ik heb nu dus
1HANDLE Thread = CreateThread(0,0,Threader,&hClient,0,0);

en
1
2
3
4
5
6
7
8
9
10
11
unsigned long WINAPI Threader(void *Data){
    std::cout << "Threader\n";
    
    SOCKET Client = *(SOCKET*)(&Data);
    char Buffer[2] = {'1','2'};
    if((send(Client,Buffer,2,0)) == SOCKET_ERROR)
        throw Error("Socket error while sending!");
    
    if(Client != INVALID_SOCKET)
        closesocket(Client);
}

ik blijf echter nog steeds een error krijgen bij het versturen van data
Beware of the Raping Zebra's
pi_93918556
Misschien moet je in de main() je SOCKET behalve declareren ook initialiseren.
  donderdag 10 maart 2011 @ 20:01:34 #104
189216 netolk
maar dan andersom
pi_93920690
1
2
3
4
5
6
7
SOCKET hClient = INVALID_SOCKET;
        sockaddr_in ClientSockAddr = {0};
        int ClientSockSize = sizeof(ClientSockAddr);
        hClient = accept(hSocket,reinterpret_cast<sockaddr*>(&ClientSockAddr),&ClientSockSize);
        if(hClient == INVALID_SOCKET)
            throw Error("Accept function failed!");
        HANDLE Thread = CreateThread(0,0,Threader,&hClient,0,0);
dit is wat ik nu heb dus hij word geïnitialiseerd
Beware of the Raping Zebra's
pi_93931377
Het volgende is ook een erg rare cast:

1SOCKET Client = *(SOCKET*)(&Data);

Data is al een pointer. &Data levert dus het adres van een pointer. Dit cast je naar een Socket-pointer. En die dereference je. De compiler denkt nu dus dat het een Socket is, terwijl je eigenlijk een Socket-pointer hebt.

Probeer het volgende eens:

1SOCKET Client = *reinterpret_cast<SOCKET *>(Data);

En let op dat de hClient nog steeds op de stack in main() staat: als hij hier uit scope raakt of overschreven wordt, dan ben je je gegevens kwijt en crasht de boel (dus beter advies is dynamisch alloceren).
"Slechts diegene mag slopen die iets beters kan bouwen."
  donderdag 10 maart 2011 @ 22:27:30 #106
189216 netolk
maar dan andersom
pi_93932152
quote:
1s.gif Op donderdag 10 maart 2011 22:17 schreef GS42 het volgende:
Het volgende is ook een erg rare cast:
[ code verwijderd ]

Data is al een pointer. &Data levert dus het adres van een pointer. Dit cast je naar een Socket-pointer. En die dereference je. De compiler denkt nu dus dat het een Socket is, terwijl je eigenlijk een Socket-pointer hebt.

Probeer het volgende eens:
[ code verwijderd ]

En let op dat de hClient nog steeds op de stack in main() staat: als hij hier uit scope raakt of overschreven wordt, dan ben je je gegevens kwijt en crasht de boel (dus beter advies is dynamisch alloceren).
hmm, wat ik dus probeerde was met die cast er voor zorgen dat de compiler idd denkt dat het een socket is en die vervolgens kopieert naar de socket in the nieuwe thread
Beware of the Raping Zebra's
pi_93932820
quote:
hmm, wat ik dus probeerde was met die cast er voor zorgen dat de compiler idd denkt dat het een socket is en die vervolgens kopieert naar de socket in the nieuwe thread
Tsja, maar als de compiler denkt een Socket te hebben terwijl het eigenlijk het adres van een Socket is, kunnen er natuurlijk geen goede dingen gebeuren.

Sowieso is een nieuw kopie maken in Threader() onveilig, omdat er geen garantie is dat het object nog bestaat ten tijde van kopieren (tenzij jij die garantie als programmeur geeft d.m.v mutex locks of iets dergelijks).
"Slechts diegene mag slopen die iets beters kan bouwen."
  donderdag 10 maart 2011 @ 22:46:42 #108
189216 netolk
maar dan andersom
pi_93933513
quote:
1s.gif Op donderdag 10 maart 2011 22:36 schreef GS42 het volgende:

[..]

Tsja, maar als de compiler denkt een Socket te hebben terwijl het eigenlijk het adres van een Socket is, kunnen er natuurlijk geen goede dingen gebeuren.

Sowieso is een nieuw kopie maken in Threader() onveilig, omdat er geen garantie is dat het object nog bestaat ten tijde van kopieren (tenzij jij die garantie als programmeur geeft d.m.v mutex locks of iets dergelijks).
ja das waar miss is het beter om dan de sockets in een array oid. te stoppen dynamisch geheugen alloceren zodat de treads er gebruik van kunnen maken
Beware of the Raping Zebra's
  vrijdag 11 maart 2011 @ 18:35:36 #109
189216 netolk
maar dan andersom
pi_93967417
1
2
3
4
5
6
7
8
SOCKET *Clients[number];

// code

for(int i = 0; i < number; i++){
   delete [] Clients[i];
   Clients[i]=0;
}

kan bij die delete de brakkets ("[]") weggelaten worden?
Beware of the Raping Zebra's
pi_94036304
quote:
1s.gif Op vrijdag 11 maart 2011 18:35 schreef netolk het volgende:

kan bij die delete de brakkets ("[]") weggelaten worden?
Het moet zelfs, want je delete geen gealloceerde array van Sockets, maar één enkele. In het algemeen geldt: alleen met delete[] verwijderen als je met new[] gealloceerd hebt.

Je bovenstaande code is gevaarlijk omdat het gedrag ongedefinieerd is: per implementatie kan het resultaat verschillen (en waarschijnlijk segfaulten).
"Slechts diegene mag slopen die iets beters kan bouwen."
  zondag 13 maart 2011 @ 11:44:41 #111
189216 netolk
maar dan andersom
pi_94039004
quote:
1s.gif Op zondag 13 maart 2011 09:20 schreef GS42 het volgende:

[..]

Het moet zelfs, want je delete geen gealloceerde array van Sockets, maar één enkele. In het algemeen geldt: alleen met delete[] verwijderen als je met new[] gealloceerd hebt.

Je bovenstaande code is gevaarlijk omdat het gedrag ongedefinieerd is: per implementatie kan het resultaat verschillen (en waarschijnlijk segfaulten).
oke, ik snap die brakkets nu maar waarom waarom is het gedrag ongedefinieerd dan?
Beware of the Raping Zebra's
pi_94039883
quote:
1s.gif Op zondag 13 maart 2011 11:44 schreef netolk het volgende:

oke, ik snap die brakkets nu maar waarom waarom is het gedrag ongedefinieerd dan?
TL;DR versie: Omdat C++ niet beschrijft hoe deze situatie afgehandeld moet worden.

Lange versie: De programmeertaal 'C++' wordt ontwikkeld door een groep mensen die precies omschrijft wat C++ moet kunnen en doen. Deze groep maakt echter geen compilers, maar alleen een beschrijving van de taal. Compilerbouwers (zoals Microsoft, GCC, Borland etc.) gebruiken deze beschrijving en moeten deze precies volgen als ze een C++-compiler willen maken.

Niet alles staat echter in beschrijving van de taal (ook wel 'standaard' genoemd). Bijvoorbeeld het onderstaande stukje beschrijft de de memberfunctie sum() van de std::valarray class:

quote:
T sum () const ;
This function may only be instantiated for a type T to which operator+= can be applied. This function returns the sum of all the elements of the array.
If the array has length 0, the behavior is undefined. If the array has length 1, sum() returns the value of element 0. Otherwise, the returned value is calculated by applying operator+= to a copy of an element of the array and all other elements of the array in an unspecied order.
Hierin staat dus precies wat std::valarray::sum() moet doen. Het interessante stuk is dikgedrukt. Omdat niet is gedefinieerd wat de functie moet doen als lengte = 0, kan dit verschillen per compilerbouwer. Ze kunnen er bijvoorbeeld voor kiezen te segfaulten, een exception te gooien of gewoon '0' terug te geven als resultaat. Het punt is: ze kunnen kiezen.

Als je dus goede C++ code wilt schrijven, moet je zorgen dat je nooit sum() gebruikt van een leeg std::valarray object: je weet immers niet wat er gaat gebeuren. Je kunt wel testen wat er met jouw compiler gebeurt, maar je weet dan nog niet (a) of dit met iets andere code ook zo zal zijn, (b) of dit in een andere versie van jouw compiler (ouder/nieuwer) ook zo zal zijn en al helemaal niet of (c) dit met een andere compiler ook werkt.

Het resultaat van delete[] op een gewone pointer is ook zoiets: het effect van die operatie staat niet in de standaard, dus moet je er niet vanuit gaan dat het werkt. Dat wordt bedoeld met 'ongedefinieerd gedrag': het resultaat van een operatie die niet in de standaard staat en dus per implementatie kan verschillen.

[ Bericht 0% gewijzigd door GS42 op 13-03-2011 12:21:25 ]
"Slechts diegene mag slopen die iets beters kan bouwen."
  zondag 13 maart 2011 @ 19:42:52 #113
189216 netolk
maar dan andersom
pi_94060436
oke, dus dat was het ongedefinieerde deel :P, dus zonder [] is het wel correcte taal dus :)
Beware of the Raping Zebra's
pi_94121577
Niet specifiek C++ deze vraag, maar is het mogelijk de handle van een control te krijgen (bv een textbox) in flash?

Aangezien ze voor zover ik kan zien geen eigen hWnd hebben.
'And I called your name,
like an addicted to cocaine calls for the stuff he'd rather blame'
  dinsdag 15 maart 2011 @ 16:11:51 #115
189216 netolk
maar dan andersom
pi_94146477
het moet mogelijk zijn aangezien Windows ook het een en ander moet weten over de textbox oid.
zoals grootte, locatie ect.

ik zou het alleen niet weten hoe je dit kan vinden er zijn denk ik wel tooltjes voor die dat voor je kunnen vinden
Beware of the Raping Zebra's
pi_94175452
Ok weet niet of iemand me kan helpen maar ik waag maar de gok :P

Ik wil graag libHaru, een opensource pdf library, compilen naar een dll. Op de wiki documentatie zeggen ze dat je het volgende moet doen voor windows:

- unzip libharu-X.X.X.zip
- cd libharu-X.X.X
- Microsoft VC++ Compiler: nmake -f script/Makefile.msvc_dll demo

Nu heb ik dat gedaan alleen krijg ik steeds een error:

quote:
Microsoft (R) Program Maintenance Utility Version 10.00.30319.01
Copyright (C) Microsoft Corporation. All rights reserved.

cl -Fosrc\hpdf_streams.obj /MD -nologo -O2 -Iinclude -Iwin32\include -
I"../../libpng"\include -I"../../zlib"\include -DHPDF_DLL_MAKE -c src\hpdf_strea
ms.c
hpdf_streams.c
src\hpdf_streams.c(28) : fatal error C1083: Cannot open include file: 'zlib.h':
No such file or directory
NMAKE : fatal error U1077: '"C:\Program Files\Microsoft Visual Studio 10.0\VC\BI
N\cl.EXE"' : return code '0x2'
Stop.
Blijkbaar kan hij een header zlib niet vinden. Ik geloof dat deze bij de zlib hoort, http://zlib.net/. Alleen lees ik nergens in de documentatie dat je die ook moet hebben. Ook lijkt het als of je http://www.libpng.org/pub/png/ nodig hebt... ook hier lees ik niets van in de documentatie...

Iemand enig idee hoe ik dit oplos? Ben niet echt bekend met het compilen van dll's en makefiles.

De code is hier te downloaden, niet van http://libharu.org/ zelf want dan mis je een aantal dirs.

De makefile
SPOILER
Om spoilers te kunnen lezen moet je zijn ingelogd. Je moet je daarvoor eerst gratis Registreren. Ook kun je spoilers niet lezen als je een ban hebt.
pi_94176085
Dale, heb je geprobeerd de preprocess-flag LIBHPDF_HAVE_NOZLIB te definieren? Als ik de code in /src/hpdf_streams.c doorblader, krijg ik het idee dat er dan gecompileerd wordt zonder zlib-functionaliteit (wat dat ook in moge houden...).

Zoniet, dan lijkt het erop dat je inderdaad de zlib library nodig hebt op je systeem.
"Slechts diegene mag slopen die iets beters kan bouwen."
  donderdag 17 maart 2011 @ 17:31:43 #118
189216 netolk
maar dan andersom
pi_94246308
hey, ik ben bezig met een linked list dinges te maken....

ik heb de volgende code:
SPOILER
Om spoilers te kunnen lezen moet je zijn ingelogd. Je moet je daarvoor eerst gratis Registreren. Ook kun je spoilers niet lezen als je een ban hebt.
en dan heb ik hier de niet gedefinieerde functies gedefinieerd:
SPOILER
Om spoilers te kunnen lezen moet je zijn ingelogd. Je moet je daarvoor eerst gratis Registreren. Ook kun je spoilers niet lezen als je een ban hebt.
nu is het zo dat ik dit doe
1
2
3
4
LList myLList(mypiece);
std::cout << "List length: " << myLList.lenght() << '\n';

std::cout << "List loop?: " << myLList.loop() << '\n';

dit is mijn output:
1list lenght: 5

dan krijg ik een error dat het programma niet meer werkt...
dit duid er dus op dat m'n length() functie niet goed opgeruimd word of zo, iemand een idee wat ik niet goed doe?
Beware of the Raping Zebra's
pi_94247729
Je lijkt dingen te deleten die niet met new worden aangemaakt. Dat kan natuurlijk niet goed gaan.
pi_94248535
quote:
4s.gif Op donderdag 17 maart 2011 18:10 schreef thabit het volgende:
Je lijkt dingen te deleten die niet met new worden aangemaakt. Dat kan natuurlijk niet goed gaan.
Dat is inderdaad een probleem, maar zijn fout wordt veroorzaakt door iets anders: bekijk je LList constructor LList(Piece start):_START(&start) eens goed. Wat klopt hier niet? (Hint: waar wordt 'Piece start' geinitialiseerd en wanneer wordt deze vernietigd?)
"Slechts diegene mag slopen die iets beters kan bouwen."
  donderdag 17 maart 2011 @ 18:55:41 #121
189216 netolk
maar dan andersom
pi_94249454
quote:
1s.gif Op donderdag 17 maart 2011 18:33 schreef GS42 het volgende:

[..]

Dat is inderdaad een probleem, maar zijn fout wordt veroorzaakt door iets anders: bekijk je LList constructor LList(Piece start):_START(&start) eens goed. Wat klopt hier niet? (Hint: waar wordt 'Piece start' geinitialiseerd en wanneer wordt deze vernietigd?)
umm, hij word geïnitialiseerd bij de constructie, en weer vernietigd tijdens de destructie van LList

Ik neem aan de de _START pas vernietigd word nadat de rest van de destructor is uitgevoerd...
quote:
4s.gif Op donderdag 17 maart 2011 18:10 schreef thabit het volgende:
Je lijkt dingen te deleten die niet met new worden aangemaakt. Dat kan natuurlijk niet goed gaan.
ja, dat dacht ik dus ook al maar als ik gewoon in de main dit schrijf:
1
2
3
4
Pice myPiece;
Piece *ptr;
ptr = &myPiece;
delete ptr;
is er niks aan de hand, kan zelfs myPiece gewoon nog gebruiken, maar dit zal wel zo'n ongedefinieerd gebeuren zijn
Beware of the Raping Zebra's
pi_94249618
quote:
1s.gif Op donderdag 17 maart 2011 18:55 schreef netolk het volgende:

[..]

umm, hij word geïnitialiseerd bij de constructie, en weer vernietigd tijdens de destructie van LList
Je past daar pass-by-value toe. Dat ding wordt dus meteen al vernietigd bij het verlaten van de constructor.
  donderdag 17 maart 2011 @ 19:01:20 #123
189216 netolk
maar dan andersom
pi_94249776
ow lol Xd, dat verklaard een hoop :P ik heb ze nu idd maar weer via new gemaakt en heb de error nu ook niet meer :)

ow kut die Piece start word natuurlijk weer vernietigd... lekker dom weer |:(

ik was al bang dat mn length() functie een fout bevatte die ik niet snapte

bedankt in ieder geval
Beware of the Raping Zebra's
  zaterdag 2 april 2011 @ 15:32:53 #124
189216 netolk
maar dan andersom
pi_94942724
Hey heeft iemand een idee waarom dit niet werkt??

1
2
3
4
5
6
int ifstr_loc = read.tellg();
while(b_temp){
    read.seekg(ifstr_loc);
    std::cout << read.tellg( << '\n';
    Handle_Function(read);
}

als bool b_temp = true; dan zou dit toch een oneindige loop moeten vormen die steeds read op ifstr_loc zet en dan iets gaat doen??

ik krijg nu dat Handle_Function 1x word uitgevoerd en daarna is read.tellg() -1 nadat seekg(44) is aangeroepen, kan iemand mij misschien vertellen waarom read.tellg() -1 word?
Beware of the Raping Zebra's
pi_94948505
quote:
1s.gif Op zaterdag 2 april 2011 15:32 schreef netolk het volgende:
Hey heeft iemand een idee waarom dit niet werkt??
[ code verwijderd ]

als bool b_temp = true; dan zou dit toch een oneindige loop moeten vormen die steeds read op ifstr_loc zet en dan iets gaat doen??
Ja, tenzij b_temp in Handle_Function aangepast wordt. Dan hoeft de loop niet oneindig te zijn.

quote:
ik krijg nu dat Handle_Function 1x word uitgevoerd en daarna is read.tellg() -1 nadat seekg(44) is aangeroepen, kan iemand mij misschien vertellen waarom read.tellg() -1 word?
Aannemende dat 'read' een of andere istream is, dan geeft tellg() -1 terug als deze faalt. Dit betekent hoogstwaarschijnlijk dat 'read' geen vailde status meer heeft, dus dat een of andere operatie in Handle_Function gefaald is. In het algemeen lees je nooit van een istream zonder te controleren of de istream wel leesklaar is. Probeer maar eens de statusbits van de istream af te drukken (eof, fail en bad), dan zal je zien dat dat de stream zich in een foutstaat bevindt.

[ Bericht 1% gewijzigd door GS42 op 03-04-2011 15:15:35 ]
"Slechts diegene mag slopen die iets beters kan bouwen."
abonnement Unibet Coolblue Bitvavo
Forum Opties
Forumhop:
Hop naar:
(afkorting, bv 'KLB')