abonnement Unibet Coolblue Bitvavo
pi_107896577
quote:
4s.gif Op zaterdag 11 februari 2012 19:39 schreef thabit het volgende:

[..]

Ik zou een ander boek pakken. :P. Een const char* is een pointer naar een const char. Dit zou suggereren dat de functie de chars in stg niet verandert, wat-ie natuurlijk wel doet. Die functie heeft dus een gewone char* als input, niet een const char*.
Lekker dan.... 't is een dictaat van een docent btw, maar de eerste hoofdstukken mogen toch wel goed zijn anders wordt het pittig.

Btw, kun je "wat-ie natuurlijk wel doet" toelichten?
pi_107899254
quote:
14s.gif Op zondag 12 februari 2012 14:45 schreef thabit het volgende:

[..]

Juist.
:D
quote:
0s.gif Op zondag 12 februari 2012 16:46 schreef Oneironaut het volgende:

[..]

Lekker dan.... 't is een dictaat van een docent btw, maar de eerste hoofdstukken mogen toch wel goed zijn anders wordt het pittig.

Btw, kun je "wat-ie natuurlijk wel doet" toelichten?
De chars in stg (en dus line) wil je kunnen aanpassen, anders kan je wel leuk chars gaan intypen maar niet opslaan en gebruiken in je programma.
  maandag 13 februari 2012 @ 16:15:04 #253
189216 netolk
maar dan andersom
pi_107933389
Hey, ik ben (nog steeds) aan het kutten met ICMP maar ik kom niet verder met het SOCKET_RAW gebeuren....
Dit is de code:
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
int main(){
    WSAData wsaData;
    sockaddr_in dest,local;
    
    std::cout << "Inizializing... ";
    if(WSAStartup(MAKEWORD(2,0),&wsaData) == 0){
        if(LOBYTE(wsaData.wVersion) >= 2){
            std::cout << "Done.\n";
        }
        else
            std::cout << "Failed!\nRequired version not supported.\n";
        
        local.sin_family = AF_INET;
        local.sin_addr.s_addr = inet_addr(IP_SOURCE);
        local.sin_port = 0;
        
        dest.sin_family = AF_INET;
        dest.sin_addr.s_addr = inet_addr(IP_DESTINATION);
        dest.sin_port = 0;
        
        try{
            SOCKET hSocket;
            std::cout << "Creating Socket... ";
            if(hSocket = socket(AF_INET,SOCK_RAW,IPPROTO_ICMP) == INVALID_SOCKET){
                std::cout << "Failed!\n";
                throw Error();
            }
            std::cout << "Done.\n";
            std::cout << "Binding... ";
            if(bind(hSocket,(sockaddr*)&local,sizeof(local)) != 0){
                std::cout << "Failed!\n";
                std::cout << "WSA Last Error: " << WSAGetLastError() << '\n';
                throw Error();
            }
            std::cout << "Done.\n";
            
            ICMPHeader ICMP;
            ICMP._TYPE = 8; // echo-request
            ICMP._CODE = 0;
            ICMP._CHECKSUM = 0;
            
            std::cout << "Sending... ";
            if(sendto(hSocket,(char*)&ICMP,sizeof(ICMP),0,(sockaddr*)&dest,sizeof(dest)) == SOCKET_ERROR){
                std::cout << "Failed!\n";
                throw Error();
            }
            std::cout << "Done.\n";
            
        }
        catch(Error){}
                
        std::cout << "Cleaning up... ";
        if(WSACleanup()!= 0){
            std::cout << "Failed!\n";
            return -1;
        }
        else
            std::cout << "Done.\n";
        
    }
    else
        std::cout << "Failed!\n";
    return 0;
}
Nu is het alleen zo dat ik de socket niet kan binden ik krijg WSA Error 10038 (WSAENOTSOCK)
Maar daarvoor heb ik al gekeken of de socket valid is en dat zou het geval moeten zijn, zou iemand mij kunnen uitleggen waarom dit niet werkt en hoe ik dit zou kunnen oplossen?
Beware of the Raping Zebra's
pi_107964139
@netolk: Leuk voorbeeld van hoe een complex probleem veroorzaakt wordt door een simpele vergissing. Algemene tip: Luister altijd naar de waarschuwingen van je compiler.

Als ik compileer, geeft de compiler een waarschuwing op de regel
1if(hSocket = socket(AF_INET,SOCK_RAW,IPPROTO_ICMP) == INVALID_SOCKET){

Zie je wat daar fout gaat? Deze regel corrigeren lost volgens mij het bind-probleem op.

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.
PS: Je code was niet gemakkelijk te compileren. Als je sneller antwoord wilt, zorg dan dat je ook de nodige headers in de code zet, erbijzet met welke libraries je linkt en eventueel ontbrekende of overbodige klassen (ICMPHeader?) verduidelijkt.
"Slechts diegene mag slopen die iets beters kan bouwen."
  dinsdag 14 februari 2012 @ 14:13:33 #255
189216 netolk
maar dan andersom
pi_107967445
Um, bij mijn weten probeerd ie eerst de socket te maken en checkt ie daarna of dat gelukt is. Maar dit is dan niet zo? Want deze manier van fout controle heb ik ook ooit eens in een tut voor tcp gezien.
Ow, enne ik Krijg geen waarschuwing van mijn compiler wat zou die waarschuwing moeten zijn?
Beware of the Raping Zebra's
  dinsdag 14 februari 2012 @ 14:21:47 #256
314941 Ai_KaRaMBa
Eat my shorts!
pi_107967734
De vergelijking "==" heeft een hogere prioriteit dan toewijzing "=". Je assigned dus effectief een boolean waarde aan hSocket. Haakjes lossen dit op:
1if( (hSocket = socket(AF_INET,SOCK_RAW,IPPROTO_ICMP)) == INVALID_SOCKET )


[ Bericht 0% gewijzigd door Ai_KaRaMBa op 14-02-2012 14:52:20 ]
  dinsdag 14 februari 2012 @ 14:33:08 #257
189216 netolk
maar dan andersom
pi_107968186
Ow, fuck... Die ben ik idd vergeten :-(
dit is best wel heel stom |:(
Beware of the Raping Zebra's
pi_107968471
quote:
0s.gif Op dinsdag 14 februari 2012 14:13 schreef netolk het volgende:
Um, bij mijn weten probeerd ie eerst de socket te maken en checkt ie daarna of dat gelukt is. Maar dit is dan niet zo? Want deze manier van fout controle heb ik ook ooit eens in een tut voor tcp gezien.
Ow, enne ik Krijg geen waarschuwing van mijn compiler wat zou die waarschuwing moeten zijn?
Oh, ik dacht dat de spoiler wel duidelijk genoeg was. Maar je hebt het probleem nu gevonden. :)

De waarschuwing die mijn compiler (g++ 4.5) geeft is
quote:
In function 'int main()':
warning: suggest parentheses around assignment used as truth value
Als je waarschuwingen wilt zien, moet je meestal een flag meegeven (in mijn geval -wall).
Graag gedaan. ;)
"Slechts diegene mag slopen die iets beters kan bouwen."
  dinsdag 14 februari 2012 @ 15:25:21 #259
189216 netolk
maar dan andersom
pi_107969969
quote:
0s.gif Op dinsdag 14 februari 2012 14:41 schreef GS42 het volgende:

[..]

Oh, ik dacht dat de spoiler wel duidelijk genoeg was. Maar je hebt het probleem nu gevonden. :)

De waarschuwing die mijn compiler (g++ 4.5) geeft is

[..]

Als je waarschuwingen wilt zien, moet je meestal een flag meegeven (in mijn geval -wall).
Graag gedaan. ;)
Hehe, had die hele spoiler niet gezien....
ik gebruik G++ moet volgensmij idd -wall maar zonder params krijg je wel gewoon waarschuwingen over data types zoals if(unsigned i < 0 ) dat die altijd waar is ed.
Beware of the Raping Zebra's
  woensdag 15 februari 2012 @ 19:42:59 #260
189216 netolk
maar dan andersom
pi_108018323
Het werkt nu, maar als ik iets ping (bijv. router), krijg ik een 56 bytes aan data terug, een deel ervan is de IP-Header en een deel is de ICMP-Header (met reply 0), maar dan zit er nog een stuk data achter, wat kan dat zijn? overigens verstuur ik dit alleen (behalve de IP-Header die sendto() maakt):

struct ICMPHeader{
unsigned char _TYPE;
unsigned char _CODE;
unsigned short _CHECKSUM;
};

type = 8 en de rest is 0.

Weet iemand wat dat stuk aan data kan zijn? Overigens duurt het ook vrij lang voordat ik reactie krijg (>30 sec), terwijl ik via ping gemiddeld iets van 1 a 2 ms krijg...

Reicieve Buffer Dump (IP-Header is weggelaten):
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.


[ Bericht 60% gewijzigd door netolk op 17-02-2012 18:32:32 ]
Beware of the Raping Zebra's
  vrijdag 17 februari 2012 @ 18:36:11 #261
189216 netolk
maar dan andersom
pi_108089491
oke, kom nu tot de conclusie dat wanneer ik de firewall aan heb staan dat ik errorcode 4 (Source Quench) terug krijg, als ik de firewall uit heb staan krijg ik een errorcode 3:13 (Destination Unreachable: Communication administratively prohibited) terwijl het adres wel bestaat ook krijg ik dezelfde error returns als ik een echo-request naar 127.0.0.1 probeer, snap er helemaal niks van :(
Beware of the Raping Zebra's
pi_108142360
Netolk, zoals je merkt, krijg je niet veel reacties op je ICMP vragen, omdat het natuurlijk niet direct met C(++) te maken heeft. Zorg inderdaad dat al je firewalls uitstaan, want die zullen zeer waarschijnlijk het antwoord blokkeren.

Daarnaast heb ik het idee dat het pakket dat je verstuurt, niet genoeg data bevat. Lees deze website maar eens goed door, daar staan de specs duidelijk op.

Het lukt mij met het volgende (zelf geschreven) pakket:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
struct ICMPHeader {
    unsigned int type : 8;
    unsigned int code : 8;
    unsigned int checksum : 16;
};

struct ICMPPing : ICMPHeader {
    unsigned int ident : 16;
    unsigned int sequence : 16;

    unsigned char data[32];
};

ICMPPing ping;
ping.type = 8;
ping.code = 0;
ping.checksum = 0;
ping.ident = 0;
ping.sequence = 0;
memcpy(ping.data, "abcdefghijklmnipqrstuvwxyz012345", 32);

Maar verder ben ik bang dat je het vooral zelf uit moet puzzelen.
"Slechts diegene mag slopen die iets beters kan bouwen."
  zondag 19 februari 2012 @ 14:58:14 #263
189216 netolk
maar dan andersom
pi_108149177
Ja, ik weet dat het niks met C++ te maken heeft, was meer een beetje frustratie lozen...
Ik denk dat ik die site idd maar eens grondig door zal gaan nemen

in iedergeval bedankt voor de hulp
Beware of the Raping Zebra's
pi_108160310
Wie kan mij uitleggen wat deze functie parameter structuur inhoudt?

1double my_func(double (*my_arg)(double(*)(double))

Ik snap dat bijv:
1double my_func(double (*my_arg)(double))

een pointer is naar een functie met als returntype double, maar ik snap niet wat die (double) erachter doet. Betekent dat dat de functie double my_arg één double accepteert als argument? En double (*my_arg)(double (*)(double) verwart me al helemaal :').

[ Bericht 6% gewijzigd door Luchtkoker op 19-02-2012 20:05:40 ]
Of toch du vader?
pi_108168777
Luchtkoker,

Ten eerste, je bovenste stukje code is geen valide C++ omdat er een haakje ontbreekt; ik neem aan dat er nog een ')' aan het einde moet staan.

quote:
Ik snap dat bijv:1 [code]double my_func(double (*my_arg)(double))[/code]

een pointer is naar een functie met als returntype double
Dat klopt niet, my_func is hier geen pointer naar een functie. Vervang...
1double (*my_arg)(double)
...eens door iets simpels, bijvoorbeeld...
1double a
...en bekijk wat je dan overhoudt. Zie je dan wat my_func is?

Je eerste voorbeeld is zo gemakkelijker te lezen:

1
2
3
4
5
double my_func(
    double (*my_arg)(
        double(*)(double)
    )
);

Kom je er zo uit?
"Slechts diegene mag slopen die iets beters kan bouwen."
pi_108169355
Dat haakje was inderdaad even ontglipt.

Verder snap ik het nog niet helemaal :@ Ik bedoelde ook niet dat my_func een pointer naar een functie was, maar my_arg. Maar goed, ik snap nog steeds niet wat bijv double(*)(double) is.
Of toch du vader?
pi_108169444
double(*)(double) is een pointer naar een functie die een double als input heeft en een double returnt. Het is zeg maar double(*func_name)(double) met func_name weggelaten.
pi_108169727
Ah, oke. Dus toch wel de argumenten. Dan snap ik 'm. Thanks.
Of toch du vader?
pi_108623904
Gebruiken jullie de nieuwe faciliteiten van C++11 (de uiteindelijke naam van C++0x) al een beetje?

Eerder in dit topic zijn al de std::thread en de move semantics van r-value references genoemd, maar er is nog veel meer toegevoegd. Zo zijn er 4 nieuwe fundamentele types (long long int, char16_t, char32_t en std::nullptr_t, waarbij vooral de laatste conceptueel interessant is), nieuwe keywords (zoals constexpr en auto) en zowel uitbreidingen op de core (zoals anonieme functies en de r-value references) als op de STL (zoals std::thread en std::unordered_map).

Ik compileer eigenlijk altijd met -std=c++0x. Een van de simpelste dingen die ik veel gebruik is het nieuwe parsen van >>. In eerdere versies van C++ is het volgende een compileerfout omdat de >> gelezen wordt als een right shift:

1std::vector<std::pair<int, int>> vb;

In de nieuwe C++ versie is dit echter aangepast, zodat er geen spatie meer tussen hoeft. De std::unordered_map gebruik ik ook als ik een hashtable nodig heb. Als een klasse dynamisch geheugen gebruikt, geef ik die ook move-mogelijkheid (maar dit gebeurt niet erg vaak). De lambda's zijn, net als auto een mooie toevoeging die ik ook wel gebruik als het handig is.

Ik stel de vraag omdat ik benieuwd ben of de nieuwe C++ toevoegingen ook al onderwezen en gebruikt worden. In plaats van functiepointers (waar het hierboven over ging en die - zoals jullie zien - vreselijk lelijk zijn) is het bijvoorbeeld mogelijk om de nieuwe (en veel mooiere) std::function te gebruiken voor alles wat op een functie lijkt. Doen jullie dat ook?

Dus: wat gebruiken jullie in de praktijk van C++11?
"Slechts diegene mag slopen die iets beters kan bouwen."
pi_108694715
... Of, als jullie C++11 niet gebruiken, ben ik daar ook benieuwd naar hoor. ;)

Niet nodig? Te ingewikkeld? Geen compiler-ondersteuning? Nooit van gehoord? ...?
"Slechts diegene mag slopen die iets beters kan bouwen."
pi_108699334
Ik ga maar eerst normaal C++ verder leren, zodat ik het mogelijk nut van C++11 kan inzien.
pi_108701876
quote:
0s.gif Op zondag 4 maart 2012 13:56 schreef GS42 het volgende:
... Of, als jullie C++11 niet gebruiken, ben ik daar ook benieuwd naar hoor. ;)

Niet nodig? Te ingewikkeld? Geen compiler-ondersteuning? Nooit van gehoord? ...?
C/C++ gebruik ik voor low-level spul. Voor het hogere programmeerwerk gebruik ik Python.

Ik vind dat hele C++11 gedoe een beetje mosterd na de maaltijd om eerlijk te zijn. Er wordt gedaan alsof er allemaal nieuwe superfeatures in zitten, terwijl andere programmeertalen dit soort zaken jaren geleden al ondersteunden.
  maandag 5 maart 2012 @ 08:55:19 #273
189216 netolk
maar dan andersom
pi_108731905
quote:
0s.gif Op zondag 4 maart 2012 13:56 schreef GS42 het volgende:
... Of, als jullie C++11 niet gebruiken, ben ik daar ook benieuwd naar hoor. ;)

Niet nodig? Te ingewikkeld? Geen compiler-ondersteuning? Nooit van gehoord? ...?
Ik denk niet dat mijn compiler het ondersteund aangezien ik een best oude gebruik omdat de nieuwe versie dll's mist oid. Maar die std::thread klinkt interessant, dat moet ik nu nog allemaal via windows doen
Beware of the Raping Zebra's
  woensdag 7 maart 2012 @ 16:02:35 #274
189216 netolk
maar dan andersom
pi_108825000
Hey, zou iemand mij dit kunnen uitleggen want ik snap er niks van...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
struct b8TOb16{
        char _B0:8;
        char _B1:8;
        
        void set(char B0,char B1){_B0=B0;_B1=B1;}
    };

    std::ofstream Write("Test.lvl",std::ios::binary);
    if(Write.is_open()){
        b8TOb16 myb8TOb16;
        unsigned short _X=5,_Y=5,_Z=1;
        myb8TOb16 = *(b8TOb16*)(&_X);
        Write.put(myb8TOb16._B0);
        Write.put(myb8TOb16._B1);
        
        std::cout << int(myb8TOb16._B0) << '\t' << int(myb8TOb16._B1) << '\n';
        Write.close();
    }
nu blijkt op mijn systeem _B0 = 5 en _B1 = 0
maar als ik later het bestand open en op deze manier uitlees:
1
2
    myb8TOb16.set(read.get(),read.get());
    std::cout << *(unsigned short*)(&myb8TOb16) << '\n';
dan blijkt er ineens 1280 (in dec) uit te komen oftewel de bytes zijn omgedraaid
maar als ik het op deze manier doe:
1
2
3
    char temp1=read.get(),temp2=read.get();
    myb8TOb16.set(temp1,temp2);
    std::cout << *(unsigned short*)(&myb8TOb16) << '\n';
komt er wel gewoon weer 5 uit, ik snap dus niet waarom het op de 1ste manier niet het goed getal uit komt en op de 2de manier wel
Beware of the Raping Zebra's
pi_108825482
Je komt wel altijd met leuke voorbeelden. :)

1myb8TOb16.set(read.get(),read.get());
Deze regel is ongedefinieerd, omdat C++ de argumenten van de functie in willekeurige volgorde mag evalueren.

Het klassieke voorbeeld is:
1
2
int i = 0;
functie(i++, i++);

Hierin weet je niet of functie(0, 1) aangeroepen wordt of functie(1, 0) omdat de compiler beide mag doen. In jouw geval worden de argumenten blijkbaar van rechts naar links verwerkt. Oplossing: minimaal 1 temp value gebruiken.

[ Bericht 2% gewijzigd door GS42 op 07-03-2012 18:12:00 ]
"Slechts diegene mag slopen die iets beters kan bouwen."
abonnement Unibet Coolblue Bitvavo
Forum Opties
Forumhop:
Hop naar:
(afkorting, bv 'KLB')