| 1 | HANDLE Thread = CreateThread(0,0,Threader,&hClient,0,0); |
| 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); } |
| 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); |
| 1 | SOCKET Client = *(SOCKET*)(&Data); |
| 1 | SOCKET Client = *reinterpret_cast<SOCKET *>(Data); |
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 threadquote: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).
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.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
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 makenquote: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).
| 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; } |
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.quote:Op vrijdag 11 maart 2011 18:35 schreef netolk het volgende:
kan bij die delete de brakkets ("[]") weggelaten worden?
oke, ik snap die brakkets nu maar waarom waarom is het gedrag ongedefinieerd dan?quote: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).
TL;DR versie: Omdat C++ niet beschrijft hoe deze situatie afgehandeld moet worden.quote: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?
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.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.
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...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.
SPOILEROm 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.
SPOILEROm 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:SPOILEROm 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
4LList myLList(mypiece);
std::cout << "List length: " << myLList.lenght() << '\n';
std::cout << "List loop?: " << myLList.loop() << '\n';
dit is mijn output:
1 list 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
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?)quote: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.
umm, hij word geïnitialiseerd bij de constructie, en weer vernietigd tijdens de destructie van LListquote: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?)
ja, dat dacht ik dus ook al maar als ik gewoon in de main dit schrijf:quote: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.
| 1 2 3 4 | Pice myPiece; Piece *ptr; ptr = &myPiece; delete ptr; |
Je past daar pass-by-value toe. Dat ding wordt dus meteen al vernietigd bij het verlaten van de constructor.quote: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
| 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); } |
Ja, tenzij b_temp in Handle_Function aangepast wordt. Dan hoeft de loop niet oneindig te zijn.quote: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??
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.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?
| Forum Opties | |
|---|---|
| Forumhop: | |
| Hop naar: | |