FOK!forum / Digital Corner / [C(++)] voor dummies - Deel 1
Trollface.zaterdag 6 maart 2010 @ 19:30

Nu mét gratis web-support!

Als je vragen hebt over C of C++, dan zit je hier goed met een (hopelijk later grote) kliek guru's.
Beperk je vragen niet tot "hij doet het niet" of "hij geeft een fout" - onze glazen bol is kapot en we willen graag van je weten wát er niet lukt en wélke foutmelding je precies krijgt.

En onthoud: lieve modjes maken dit topic centraal!

Vorige delen:

Geen!

FAQ

Ik wil beginnen met C/C++, wat voor IDE is het beste voor mij?
Dat ligt eraan. Als je alléén voor MS Windows wilt gaan developen, is Visual Studio de beste optie. Deze kun je bovendien als je student bent via Microsoft DreamSpark of MSDN Academic Alliance gratis downloaden. :)
Wil je echter cross-platform (dat wil zeggen: voor b.v. Windows én Linux, of Linux én Mac) gaan developen, dan zijn Dev-C++ en Code::Blocks de beste optie voor C++. Eclipse (ook voor C) en NetBeans zijn ook goede keuzes, alleen zijn deze meer op Java gericht. Een ander IDE, van Nokia's hand, is Qt Creator. Dit IDE maakt gebruik van het Qt-framework, een set van functies, types, variabelen etc. om programmeren makkelijker te maken. Dit framework is cross-platform.

Hoe gebruik ik x/wat houdt y in?
Stop! Voor vragen hoe je bepaalde ingebouwde functies, types of classes gebruikt kun je de C referentie of de C++ referentie gebruiken. Hier staat alles in wat je nodig hebt.

Wat is het verschil tussen C en C++?
C++ is, eenvoudig gezegd, een nieuwere versie van C (vandaar ook de naam, C++ wil zeggen: verhoog de waarde van C met 1). Het biedt onder andere betere klasse-ondersteuning en verschillende nieuwe types, zoals vectors en maps, om er maar een paar te noemen.
Als je wilt beginnen met leren, is C++ beter, want C wordt eigenlijk niet vaak meer gebruikt.

Wat is het Windows SDK?
Het Windows SDK is een set van functies, gemaakt door Microsoft, om het programmeren voor Windows te vereenvoudigen.
Als je ervoor kiest het Windows SDK te gebruiken, houd er dan rekening mee dat je applicatie Windows-only wordt!
Je kunt de laatste versie hier vinden ter download.

Handige links:

Referenties en tutorials:
  • Leer C en/of C++ (engels)
  • Leer programmeren met het Windows SDK (engels)
  • Info over het Windows SDK (engels)

    Deze OP vind je hier.

    [ Bericht 1% gewijzigd door Trollface. op 07-03-2010 13:35:32 ]
  • cablegunmasterzaterdag 6 maart 2010 @ 20:39
    tvp
    Netsplitterzaterdag 6 maart 2010 @ 20:42
    C# niet?
    Trollface.zaterdag 6 maart 2010 @ 20:43
    quote:
    Op zaterdag 6 maart 2010 20:42 schreef Netsplitter het volgende:
    C# niet?
    C# is toch wel fundamenteel anders dan C of C++... w.m.b. kun je die vragen gewoon hier stellen, maar of je antwoord krijgt is een tweede

    Als we wat C#-guru's hebben kan dit C(++/#) voor dummies worden w.m.b.

    [ Bericht 15% gewijzigd door Trollface. op 06-03-2010 20:51:58 ]
    Fortitudezaterdag 6 maart 2010 @ 21:07
    Oh wacht er is een heel dev subfora. Laat maar.

    Lijkt me trouwens niet handig als je die 2 door elkaar haalt. C# is heel anders dan C(++).

    [ Bericht 48% gewijzigd door Fortitude op 06-03-2010 21:14:31 ]
    Intrepidityzaterdag 6 maart 2010 @ 21:23
    Dat. Je kunt dan beter C# en VB.net samenvatten in een .net-topic.
    Qunixzaterdag 6 maart 2010 @ 21:24
    quote:
    Op zaterdag 6 maart 2010 20:43 schreef Trollface. het volgende:

    [..]

    C# is toch wel fundamenteel anders dan C of C++... w.m.b. kun je die vragen gewoon hier stellen, maar of je antwoord krijgt is een tweede

    Als we wat C#-guru's hebben kan dit C(++/#) voor dummies worden w.m.b.
    Objective C.
    Trollface.zaterdag 6 maart 2010 @ 22:36
    quote:
    Op zaterdag 6 maart 2010 21:24 schreef Qunix het volgende:

    [..]

    Objective C.
    Als wat mensen hier (gaan) zitten die er verstand van hebben kan dat wat mij betreft toegevoegd worden, C#/VB.NET kan inderdaad beter in een apart topic.
    LucasHulshofzondag 7 maart 2010 @ 11:56
    Potentieel interessant topic.

    Een aardige gratis ide, zonder al te veel poespas en bloat, voor windows, inclusief mingw compiler: Link

    Een erg goede en gratis IDE, voor zowel windows/linux, gericht op het ontwikkelen van software met het QT framework (o.a. google earth maakt hier gebruik van)
    QTCreator

    Het QT Framework verlost je van het broddelwerk genaamd "windows api" en is compleet object georienteerd. Een aanrader voor iedereen die serieus portable software wil schrijven.

    Verder, voor iedereen die écht C wil leren, is er maar één boek wat er toe doet: "The C programming language" van Kernighan en Ritchie, de bedenkers van C. Want in tegenstelling tot wat er in de o.p. staat wordt C nog wel veel gebruikt en is het niet de voorganger van C++
    Trollface.zondag 7 maart 2010 @ 13:32
    quote:
    Op zondag 7 maart 2010 11:56 schreef LucasHulshof het volgende:
    Want in tegenstelling tot wat er in de o.p. staat wordt C nog wel veel gebruikt en is het niet de voorganger van C++
    Misschien is voorganger idd wat slecht verwoord, maar volgens mij wordt C niet echt vaak meer gebruikt.

    Dev-C++ stond al in de OP, ik heb QT toegevoegd.
    Crutchzondag 7 maart 2010 @ 13:36
    Dikke vette TVP.

    Thanks Trollface.
    Crutchzondag 7 maart 2010 @ 13:41
    Btw, C++ is toch gewoon next leveL C? Grootste toevoeging van C++ is Object Oriented Programming.
    Dus eigenlijk zou C++/C# niet zo raar zijn voor dit topic tenzij het verschil tussen C++ en C# té groot is.
    Trollface.zondag 7 maart 2010 @ 13:45
    quote:
    Op zondag 7 maart 2010 13:41 schreef Crutch het volgende:
    Btw, C++ is toch gewoon next leveL C? Grootste toevoeging van C++ is Object Oriented Programming.
    Dus eigenlijk zou C++/C# niet zo raar zijn voor dit topic tenzij het verschil tussen C++ en C# té groot is.
    C# is écht fundamenteel anders dan C++, C# is een samengooisel van C++ en Java, en het lijkt daarbij meer op Java imho. Een algemeen .NET-topic is hier handiger voor, denk ik.
    progjezondag 7 maart 2010 @ 14:33
    Ah zal eens gaan meelezen..

    Programmeer in c++ en c#
    Crutchzondag 7 maart 2010 @ 14:39
    quote:
    Op zondag 7 maart 2010 14:33 schreef progje het volgende:
    Ah zal eens gaan meelezen..

    Programmeer in c++ en c#
    Wat maak je zoal?
    Green1zondag 7 maart 2010 @ 14:41
    tvp
    progjezondag 7 maart 2010 @ 14:41
    quote:
    Op zondag 7 maart 2010 14:39 schreef Crutch het volgende:

    [..]

    Wat maak je zoal?
    Ik werk aan ons eigen product, waarover ik op FOK verder maar niet zoveel ga vertellen
    De core van dit product is geheel C/C++

    Verder hebben we ook een CMS voor dit product, dit is ontwikkeld in C#
    Verder hebben we natuurlijk een API voor het product, ook geheel C#

    Maar ik werk voornamelijk aan de core (gelukkig)

    Ik vind C# / ASP.Net programmeren nogal uber saai
    arpyzondag 7 maart 2010 @ 15:26
    tvp.
    Voor C gebruik ik Pelles C, superlicht en maakt erg kleine executables in Windows.
    Dan nog GTK+ voor de GUI en je kan zo beginnen.
    ErictheSwiftzondag 7 maart 2010 @ 21:42
    quote:
    Op zondag 7 maart 2010 13:32 schreef Trollface. het volgende:

    [..]

    Misschien is voorganger idd wat slecht verwoord, maar volgens mij wordt C niet echt vaak meer gebruikt.

    Dev-C++ stond al in de OP, ik heb QT toegevoegd.
    Laat de Gordon Ramsay van de Unix wereld (yeah i'm talking about you Linus Torvalds ) het maar niet horen. De Linux kernel bestaat al uit een paar tiental miljoen lijnen C-code.
    Fortitudezondag 7 maart 2010 @ 21:45
    quote:
    Op zondag 7 maart 2010 21:42 schreef ErictheSwift het volgende:

    [..]

    Laat de Gordon Ramsay van de Unix wereld (yeah i'm talking about you Linus Torvalds [ afbeelding ] ) het maar niet horen. De Linux kernel bestaat al uit een paar tiental miljoen lijnen C-code.
    Ja maar een kernel is ook niet bepaald het meest standaard stuk code.
    Hameren_Yzerzondag 7 maart 2010 @ 21:45
    cout << "TVP";
    Wuklzondag 7 maart 2010 @ 21:57
    TVP!
    Cruise.Elroyzondag 7 maart 2010 @ 23:26
    1void main() {char _[4](_[(((0[_]=035<<2)+1)[_-0[_]]=0[_]|2)-0[_]]=_[0]-4)-(_[1]-011))[_]=0[_]-1[_]^~1;std::cout<<_;}

    Trollface.zondag 7 maart 2010 @ 23:42
    quote:
    Op zondag 7 maart 2010 23:26 schreef Cruise.Elroy het volgende:

    [ code verwijderd ]

    void main? Echt waar?
    Cruise.Elroymaandag 8 maart 2010 @ 08:22
    quote:
    Op zondag 7 maart 2010 23:42 schreef Trollface. het volgende:

    [..]

    void main? Echt waar?
    Jo0Lzmaandag 8 maart 2010 @ 11:03
    Centraal.
    Cruise.Elroymaandag 8 maart 2010 @ 16:40
    Volgens mij zijn er bijna geen dummies in C++, die zijn slim en gaan voor een taal als C#
    Intrepiditymaandag 8 maart 2010 @ 16:41
    quote:
    Op maandag 8 maart 2010 16:40 schreef Cruise.Elroy het volgende:
    Volgens mij zijn er bijna geen dummies in C++, die zijn slim en gaan voor een taal als C#
    Onzin, in de wereld van hardcore berekeningen en algoritmen is C(++) ongeevenaard.
    Cruise.Elroymaandag 8 maart 2010 @ 17:12
    quote:
    Op maandag 8 maart 2010 16:41 schreef Intrepidity het volgende:

    [..]

    Onzin, in de wereld van hardcore berekeningen en algoritmen is C(++) ongeevenaard.
    Begrijpend lezen is blijkbaar niet aan iedereen besteed.
    Intrepiditymaandag 8 maart 2010 @ 17:12
    quote:
    Op maandag 8 maart 2010 17:12 schreef Cruise.Elroy het volgende:

    [..]

    Begrijpend lezen is blijkbaar niet aan iedereen besteed.
    Dat blijkt ja
    Trollface.vrijdag 12 maart 2010 @ 16:10
    quote:
    Op maandag 8 maart 2010 16:40 schreef Cruise.Elroy het volgende:
    Volgens mij zijn er bijna geen dummies in C++, die zijn slim en gaan voor een taal als C#
    Hoezo is voor C# gaan slim?
    progjevrijdag 12 maart 2010 @ 16:16
    quote:
    Op vrijdag 12 maart 2010 16:10 schreef Trollface. het volgende:

    [..]

    Hoezo is voor C# gaan slim?
    Volgens mij wordt dat nou juist niet expliciet bedoeld.
    Crutchvrijdag 12 maart 2010 @ 16:20
    quote:
    Op vrijdag 12 maart 2010 16:16 schreef progje het volgende:

    [..]

    Volgens mij wordt dat nou juist niet expliciet bedoeld.
    Als je goed leest wel.

    Verklaring:

    Na een n00b geweest te zijn in C++ hebben ze besloten om voor C# te gaan.
    Oftewel; ze zijn nooit verdergegaan in C++
    En dat wordt dan gezien als slimme keuze.
    Trollface.vrijdag 12 maart 2010 @ 16:21
    quote:
    Op vrijdag 12 maart 2010 16:20 schreef Crutch het volgende:

    [..]

    Als je goed leest wel.

    Verklaring:

    Na een n00b geweest te zijn in C++ hebben ze besloten om voor C# te gaan.
    Oftewel; ze zijn nooit verdergegaan in C++
    En dat wordt dan gezien als slimme keuze.
    Pfffffffffff, C#
    Catch22-vrijdag 12 maart 2010 @ 16:22
    C# is wel makkelijk om het in de vingers te krijgen. Dan kan je altijd nog weer overgaan naar C++/C
    Crutchvrijdag 12 maart 2010 @ 16:24
    quote:
    Op vrijdag 12 maart 2010 16:21 schreef Trollface. het volgende:

    [..]

    Pfffffffffff, C#
    Ik ben neutraal daarin. Mocht je namelijk iets Windows-only willen gaan programmeren dat zit je met C# wel wat beter.

    Java FTW!
    progjevrijdag 12 maart 2010 @ 16:27
    Ik vind echt dat C# en C++ geen drol met elkaar te maken hebben
    Toen laatst een van mijn C# programmeurs wat C++ mocht gaan doen, had hij bijvoorbeeld toch behoorlijk wat moeite met pointers

    C# kan heel handig zijn voor bijvoorbeeld een website e.d.
    Of een doodsimpele applicatie of zo.

    Maar als je echt power en controle wil moet je gewoon C/C++ gebruiken

    Bij het bedrijf waar ik werk, hebben we ons eigen product, compleet C/C++

    Maar de API, de management suite (web) e.d. zijn allemaal gemaakt in C#
    Omdat daarvoor C# prima geschikt is.
    Catch22-vrijdag 12 maart 2010 @ 16:39
    Ik maak alleen maar webbased sites en applicaties... Dus dan C# ruim voldoende.
    Trollface.vrijdag 12 maart 2010 @ 16:48
    quote:
    Op vrijdag 12 maart 2010 16:39 schreef Catch22- het volgende:
    Ik maak alleen maar webbased sites en applicaties... Dus dan C# ruim voldoende.
    Daar gebruik ik PHP voor.

    Anyways, laten we dit niet in een C++ vs. C#-topic omtoveren, hoewel het wel een interessant onderwerp is natuurlijk.
    Catch22-vrijdag 12 maart 2010 @ 16:51
    Het heeft beiden zijn voor- en nadelen natuurlijk.


    Ik vind persoonlijk ons gebruikte framework erg fijn, zeker icm VisualStudio
    Qunixvrijdag 12 maart 2010 @ 19:08
    Iemand anders die hier Objective-C (Cocoa) doet?
    Cruise.Elroyzaterdag 13 maart 2010 @ 00:43
    Ik ben zelf gek op C++, het is precies de juiste abstractie waarin ik me thuis voel. Gelukkig gebruiken we in mijn industrie eigenlijk niets anders. C# voor tools zou wel handig zijn denk ik, maar op dit moment ook allemaal nog in C++
    Trollface.zaterdag 13 maart 2010 @ 18:30
    Ik heb een probleem waar ik zelf niet uit kom:

    Ik gebruik een klasse waarbij een functie zit die een callback als volgt neemt:
    1klasse::hookCommand(char*, int(*)());


    Als ik deze aanroep met een functie werkt het gewoon:
    1
    2
    3
    4
    5
    int test() {
    return 5;
    }

    deKlasse.hookCommand("bla", &test);


    Probeer ik deze echter met een klassemethode aan te roepen:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    class Class2 {
    public:
    klasse deKlasse;

    Class2(): {}

    int klasseTest() { 
    return 3;
    }

    void hook() {
    deKlasse.hookCommand("bla", &klasseTest);
    }

    }

    Error: ISO C++ forbids taking the address of an unqualified or parenthesized non-static function to form a pointer to member function. Say `&Class2::klasseTest`.

    Dan probeer ik het zoals de compiler me zegt:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    class Class2 {
    public:
    klasse deKlasse;

    Class2(): {}

    int klasseTest() { 
    return 3;
    }

    void hook() {
    deKlasse.hookCommand("bla", &Class2::klasseTest);
    }

    }

    No matching function call for klasse::hookCommand(char*, int(Class2::*)());
    Candidates are: klasse::hookCommand(char*, int(*)());


    Weet iemand hoe ik dit kan oplossen zonder de basisklasse aan te passen?
    Cruise.Elroyzaterdag 13 maart 2010 @ 20:38
    Een klassemethode is heel iets anders dan een "losse" methode met dezelfde return value en parameters, er wordt namelijk nog een this pointer meegegeven bij de aanroep, anders kan de methode natuurlijk nooit uitvogelen waar hij zijn data vandaan moet halen.

    Het is een fout die bijna iedereen wel een keertje maakt, en het is eigenlijk een denkfout: bedenk dat voor de pointer-logica elke instantie van een klasse zijn eigen functie (methode) heeft, tenzij de functie static is, dan is het gedeeld tussen alle instanties.
    Member-functies/methodes zijn dan ook niet aan te wijzen met een functiepointer.

    twee oplossingen:

    1) maak een abstracte klasse en geef pointers door naar die klasse ipv functiepointers
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    class AbstractClass
    {
     int klasseTest()  = 0;
    }

    class Class2 : public AbstractClass
    {
      public:
      klasse deKlasse;
      Class2(): {}
      int klasseTest()  {return 3;}
    }

    void hook() {
    deKlasse.hookCommand("bla", Abstract_Class_instantie);
    }


    2) maak de funtie static en geef het een pointer naar de instantie mee.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class Class2
    {
      public:
      klasse deKlasse;
      Class2(): {}
      static int klasseTest(Class2* pInstance)  {return 3;}
    }
    void hook() {
    deKlasse.hookCommand("bla", Class2::klasseTest(Class_Instantie));
    }


    en als ik je een tip mag geven: maak je voorbeeldcode duidelijker: klasse, DeKlasse, Class2, klasseTest, dat helpt niet echt.

    [ Bericht 31% gewijzigd door Cruise.Elroy op 13-03-2010 20:50:52 ]
    Catch22-zaterdag 13 maart 2010 @ 21:14
    Daar verval je snel in als je een Proof of Concept/Testje schrijft maar kheb ook wel ondervonden dat je het gelijk duidelijk moet doen, anders verdwaal je gauw
    Cruise.Elroyzaterdag 13 maart 2010 @ 21:37
    quote:
    Op zaterdag 13 maart 2010 21:14 schreef Catch22- het volgende:
    Daar verval je snel in als je een Proof of Concept/Testje schrijft maar kheb ook wel ondervonden dat je het gelijk duidelijk moet doen, anders verdwaal je gauw
    Vooral omdat er zo ontzettende veel notaties rondzwerven kan ik iig iedereen aanraden om namen te nemen die het (meta)type goed aangeven.
    Hameren_Yzerzondag 28 maart 2010 @ 13:57
    Kent iemand iets zoals getchar() maar dan zonder dat er een enter nodig is
    Cruise.Elroyzondag 28 maart 2010 @ 16:01
    quote:
    Op zondag 28 maart 2010 13:57 schreef Hameren_Yzer het volgende:
    Kent iemand iets zoals getchar() maar dan zonder dat er een enter nodig is
    Het standaard invoersysteem van C++ heeft daar geen standaard oplossing voor.
    Wat je kan proberen zijn de functies _kbhit() en _getch()
    Ze zitten in de header conio.h.

    Dit zijn oude functies uit het DOS/POSIX en worden niet meer goed ondersteund dus let daar wel mee op.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    int main()
    {

       int pointer = 0;
       char buffer[10]; 
       do
       {
          while(_kbhit()) // toets ingedrukt?
          {
             int key = _getch(); // toets ophalen
             if (key == '\r') // enter gedrukt
             {
                buffer[pointer] = 0;
             }
             else // "normale" toets ingedrukt
             {
                buffer[pointer++] = (char) key;
                std::cout << '*';
             }
          }
       } while(buffer[pointer]);
       std::cout << "\nJe wachtwoord is " << buffer << '\n';

    }
    Dickbridezondag 28 maart 2010 @ 16:08
    quote:
    Op maandag 8 maart 2010 16:41 schreef Intrepidity het volgende:

    [..]

    Onzin, in de wereld van hardcore berekeningen en algoritmen is C(++) ongeevenaard.
    offtopic: maar daarvoor wordt juist weer FORTRAN gebruikt
    netolkzondag 18 april 2010 @ 01:25
    quote:
    Op zondag 28 maart 2010 16:08 schreef Dickbride het volgende:

    [..]

    offtopic: maar daarvoor wordt juist weer FORTRAN gebruikt
    Ja en elke ander C based programeer taal... dus uiteindelijk gewoon allemaal asambly code
    Cruise.Elroyzondag 18 april 2010 @ 10:25
    quote:
    Op zondag 18 april 2010 01:25 schreef netolk het volgende:

    [..]

    Ja en elke ander C based programeer taal... dus uiteindelijk gewoon allemaal asambly code
    Er worden in de uithoeken van wetenschappelijk onderzoek vaak nog "rare" talen gebruikt. Fortran is nog steeds populairder dan C(++) in sommige gebieden. De eerste adventure game ADVENT was in Fortran geschreven
    netolkzondag 18 april 2010 @ 12:02
    quote:
    Op zondag 18 april 2010 10:25 schreef Cruise.Elroy het volgende:

    [..]

    Er worden in de uithoeken van wetenschappelijk onderzoek vaak nog "rare" talen gebruikt. Fortran is nog steeds populairder dan C(++) in sommige gebieden. De eerste adventure game ADVENT was in Fortran geschreven
    Windows en Mac zijn voor het grootste deel in C en C++ geschreven...
    netolkzondag 18 april 2010 @ 12:05
    Ik ben nu een beetje aan het klooien met pointers in C++ maar het werkt niet zo als ik zou verwachten..
    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
    #include <iostream>

    struct Test{
       int a;
       Test(){a=0;}
       int get(){return a;}
    };

    struct Test2{
       Test *myPointer;
       
       Test2(Test test){myPointer = &test;}
       int get(){return (*myPointer).a;}
       int get2(){return myPointer->a;}
       ~Test2(){delete myPointer; myPointer = 0;}
    };

    int main(){
       Test myTest;
       Test2 Test2(myTest);
       myTest.a = 9;
       
       std::cout << myTest.get() << '\t' << Test2.get() << '\n';
       std::cout << myTest.a << '\t' << Test2.myPointer->a << '\n';
       
       int a = 3;
       int *b;
       b = &a;
       *b = 8;
       
       std::cout << a << '\t' << *b << '\n';
       
       return 0;
    }

    de output is:
    1
    2
    3
    9       0
    9       9
    8       8



    en ik had nog een vraag waarom kan in de onderstaande code het bovenste wel en het onderste niet? dit zou toch het zelfde moeten zijn?
    1
    2
    std::cout << myTest.a << '\t' << Test2.myPointer->a << '\n';
    std::cout << myTest.a << '\t' << Test2.(*myPointer).a << '\n';

    bij de onderste code geeft ie out of scope error...
    Mvg. netolk
    netolkzondag 18 april 2010 @ 12:10
    quote:
    Op zondag 28 maart 2010 16:01 schreef Cruise.Elroy het volgende:

    [..]

    Het standaard invoersysteem van C++ heeft daar geen standaard oplossing voor.
    Wat je kan proberen zijn de functies _kbhit() en _getch()
    Ze zitten in de header conio.h.

    Dit zijn oude functies uit het DOS/POSIX en worden niet meer goed ondersteund dus let daar wel mee op.
    [ code verwijderd ]


    je kan denk ik beter zoiets gebruiken:

    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
    #include <windows.h>
    char GetKey()
    {
       // get standard console handle
       HANDLE myHandle = ::GetStdHandle(STD_INPUT_HANDLE);

       // read input until a key has been pressed
       INPUT_RECORD myEvent[1];
       DWORD myNumberOfEvents;

       do
       {
          // read input
          ::ReadConsoleInput(myHandle, myEvent, 1, &myNumberOfEvents);
       } while ((myEvent[0].EventType != KEY_EVENT) ||
          (myEvent[0].Event.KeyEvent.bKeyDown != TRUE));

       // return ASCII code
       return myEvent[0].Event.KeyEvent.uChar.AsciiChar;
    }

    /**
     * Waits for a key to be pressed and returns the key's virtual key code.
     *
     * @returns   the virtual key code of the pressed key
     */
    WORD GetVirtualKey()
    {
       // get standard console handle
       HANDLE myHandle = ::GetStdHandle(STD_INPUT_HANDLE);

       // read input until a key has been pressed
       INPUT_RECORD myEvent[1];
       DWORD myNumberOfEvents;

       do
       {
          // read input
          ::ReadConsoleInput(myHandle, myEvent, 1, &myNumberOfEvents);
       } while ((myEvent[0].EventType != KEY_EVENT) ||
          (myEvent[0].Event.KeyEvent.bKeyDown != TRUE));

       // return ASCII code
       return myEvent[0].Event.KeyEvent.wVirtualKeyCode;
    }

    dit werkt dan wel alleen op windows
    Cruise.Elroyzondag 18 april 2010 @ 12:10
    quote:
    Op zondag 18 april 2010 12:02 schreef netolk het volgende:

    [..]

    Windows en Mac zijn voor het grootste deel in C en C++ geschreven...
    Ik neem aan dat je OSX bedoelt.
    Stiekem is OSX in ADA geschreven, maar dat weten veel mensen niet.
    Cruise.Elroyzondag 18 april 2010 @ 12:11
    quote:
    Op zondag 18 april 2010 12:10 schreef netolk het volgende:

    [..]

    je kan denk ik beter zoiets gebruiken:
    [ code verwijderd ]

    dit werkt dan wel alleen op windows
    Behalve dat mijn oplossing maar 1 regel code is. En nog beter portable ook.
    netolkzondag 18 april 2010 @ 12:13
    quote:
    Op zondag 18 april 2010 12:11 schreef Cruise.Elroy het volgende:

    [..]

    Behalve dat mijn oplossing maar 1 regel code is. En nog beter portable ook.
    je zegt zelf dat het niet goed ondersteund word...
    Cruise.Elroyzondag 18 april 2010 @ 12:13
    quote:
    Op zondag 18 april 2010 12:05 schreef netolk het volgende:
    Ik ben nu een beetje aan het klooien met pointers in C++ maar het werkt niet zo als ik zou verwachten..
    dit is de code:
    [ code verwijderd ]

    de output is:
    [ code verwijderd ]

    en ik had nog een vraag waarom kan in de onderstaande code het bovenste wel en het onderste niet? dit zou toch het zelfde moeten zijn?
    [ code verwijderd ]

    bij de onderste code geeft ie out of scope error...
    Mvg. netolk
    1
    2
    3
    4
    5
    6
    7
    8
    struct Test2{
       Test *myPointer;
       
       Test2(Test test){myPointer = &test;}
       int get(){return (*myPointer).a;}
       int get2(){return myPointer->a;}
       ~Test2(){delete myPointer; myPointer = 0;}
    };


    Je code is niet echt makkelijk te lezen, maar als ik het even snel doorlees:
    In de constructor Test2:Test2() geef je by value een struct mee: myPointer refereert dus naar de tijdelijke parameter Test test.

    Waarschijnlijk wil je hebben:
    1   Test2(Test* test){myPointer = test;}


    of om met references te werken (maar dat zou ik niet doen totdat je pointers echt snapt):
    1   Test2(Test& test){myPointer = &test;}
    Cruise.Elroyzondag 18 april 2010 @ 12:17
    quote:
    Op zondag 18 april 2010 12:13 schreef netolk het volgende:

    [..]

    je zegt zelf dat het niet goed ondersteund word...
    Niet goed, maar beter dan een spagetti aan windows API calls

    edit: het zijn geen api calls. Je hebt dus gelijk
    Mijn code werkt onder *de meeste* windows compilers en waarschijnlijk ook aan de praat te krijgen onder Linux, maar niet makkelijk.
    netolkzondag 18 april 2010 @ 12:19
    quote:
    Op zondag 18 april 2010 12:10 schreef Cruise.Elroy het volgende:

    [..]

    Ik neem aan dat je OSX bedoelt.
    Stiekem is OSX in ADA geschreven, maar dat weten veel mensen niet.
    wel raar dat Appel zelf wel zegt dat het framework bijvoorbeeld voor een groot deel in objective-C is geschreven en andere dingen ook in C/C++ geschreven zijn...
    Cruise.Elroyzondag 18 april 2010 @ 12:24
    quote:
    Op zondag 18 april 2010 12:19 schreef netolk het volgende:

    [..]

    wel raar dat Appel zelf wel zegt dat het framework bijvoorbeeld voor een groot deel in objective-C is geschreven en andere dingen ook in C/C++ geschreven zijn...
    Het was een grapje.
    ADA is een draak van een taal die door de US Department of Defense verplicht was gesteld ergens in de 80 tot aan eind 90s.
    netolkzondag 18 april 2010 @ 12:29
    11      Test2(Test& test){myPointer = &test;}

    dus als ik het goed begrijp dan refereert test nu aan een Test en myPointer checkt dan dus de locatie van test die dan weer naar de meegegeven Test in de constructor wijst?

    Test voorbeeld;
    Test2 voorbeeld2(voorbeeld);

    myPointer -> test -> voorbeeld

    of klopt dit niet?
    netolkzondag 18 april 2010 @ 12:29
    quote:
    Op zondag 18 april 2010 12:24 schreef Cruise.Elroy het volgende:

    [..]

    Het was een grapje.
    ADA is een draak van een taal die door de US Department of Defense verplicht was gesteld ergens in de 80 tot aan eind 90s.
    dacht al
    Cruise.Elroyzondag 18 april 2010 @ 12:40
    quote:
    Op zondag 18 april 2010 12:29 schreef netolk het volgende:

    [ code verwijderd ]

    dus als ik het goed begrijp dan refereert test nu aan een Test en myPointer checkt dan dus de locatie van test die dan weer naar de meegegeven Test in de constructor wijst?

    Test voorbeeld;
    Test2 voorbeeld2(voorbeeld);

    myPointer -> test -> voorbeeld

    of klopt dit niet?
    Ongeveer, het gaat gewoon
    myPointer -> voorbeeld

    Als je de locatie van een reference opvraagt krijg je gewoon de locatie terug van het object.
    Een reference is een soort "onzichtbare" pointer, het gedraagt zich gewoon als een object.
    netolkzondag 18 april 2010 @ 12:45
    chill, ik wist dat het moest kunnen maar niet zo snel hoe

    bedankt Cruise.Elroy het werkt nu
    SinofEnvyzondag 18 april 2010 @ 15:37
    tvp.
    minibeerzondag 9 mei 2010 @ 15:10
    Hallo
    Sinds een tijdje ben ik ook bezig met c++ leren, en de taal bevalt me eigenlijk wel . Ik heb visual c++ van microsoft gedownload en ben nu een beetje bezig met de taal leren. Is dit een goede keus? (Ik hoorde ergens dat c++ dé taal was om te programmeren in windows, of spellen te programmeren, dus het leek me wel ok, maar ik hoorde ergens anders weer dat c# tegenwoordig meer gebruikt is...)
    Intrepidityzondag 9 mei 2010 @ 15:36
    Er is denk ik geen 'dé' taal voor een bepaald platform, dat hangt compleet van het project en de eisen en dergelijke af. Voor spellen is C++ inderdaad veelgebruikt op Windows in combinatie met Direct3D en dergelijke, hoewel C# op dat gebied ook prima werkt. C# wordt dan weer meer gebruikt voor 'gewone' windows-applicaties, webapplicaties (icm ASP.net) en RIA's (icm Silverlight)
    Ik denk over het algemeen dat je met C# een breder pallet aan applicaties kunt bouwen met dezelfe kennis en moeite (een windows-applicatie bouwen gaat met winforms/wpf nou eenmaal sneller als in C++ met de WIn32-API).
    minibeerzondag 9 mei 2010 @ 15:58
    quote:
    Op zondag 9 mei 2010 15:36 schreef Intrepidity het volgende:
    Er is denk ik geen 'dé' taal voor een bepaald platform, dat hangt compleet van het project en de eisen en dergelijke af. Voor spellen is C++ inderdaad veelgebruikt op Windows in combinatie met Direct3D en dergelijke, hoewel C# op dat gebied ook prima werkt. C# wordt dan weer meer gebruikt voor 'gewone' windows-applicaties, webapplicaties (icm ASP.net) en RIA's (icm Silverlight)
    Ik denk over het algemeen dat je met C# een breder pallet aan applicaties kunt bouwen met dezelfe kennis en moeite (een windows-applicatie bouwen gaat met winforms/wpf nou eenmaal sneller als in C++ met de WIn32-API).
    dankje voor je reactie
    ik snap de relatie tussen c# en c++ eigenlijk ook niet zo goed. C# is toch een opvolger van c++? MAar hij is wel simpeler en 'minder krachtig' gemaakt?
    Lijken de talen zoveel op elkaar dat je zonder problemen alletwee kan leren?
    Intrepidityzondag 9 mei 2010 @ 16:08
    Nee, C# is geen directe opvolger van C++. C# is als het ware een kruising tussen C++ en Java. Je maakt doorgaans gebruik van het .net framework die al een hele hoop functionaliteit bevat die in je in C++ zelf zou hebben moeten programmeren, of die in ieder geval lastiger te gebruiken was. Dat betekent dat je minder tijd kwijt bent met het opnieuw uitvinden van het wiel, maar aan de andere kant beslist het framework hoe bepaalde dingen opgelost worden, terwijl je daar in C++ meer vrijheid in had.
    Het maken van Windows-applicaties in C++ heb ik een aantal jaar geleden gedaan met de Win32-API, en als je ziet hoe verrot lastig het daarin al is om een simpele treeview (ik noem maar iets) op je scherm te tekenen met handles en long pointers to c strings en weet ik veel wat voor rotte datatypen allemaal dan ben ik toch blij dat ik dat in Visual Studio en C# gewoon doe door een treeview-control naar mijn venster te slepen
    Dat betekent echter wel dat als ik de treeview iets wil laten doen wat niet standaard in het .net-framework zit (hoewel de kans daarop vrij klein is), dat het dan een stuk lastiger wordt.
    De syntax is tot op zekere hoogte vergelijkbaar (een for-loop is een for-loop), maar in C# los je een hele hoop op met het .net framework waar dat in C++ wat lastiger gaat.
    Ik moet wel toegeven dat ik geen ervaring heb met Visual C++ in combinatie met het .net framework, dus ik heb geen idee wat de verschillen zijn tussen C# .net en C++ .net
    Ik weet wel dat ik C++ zonder .net geen prettige bezigheid vond
    Cruise.Elroyzondag 9 mei 2010 @ 17:24
    Windows applicaties maken in C++ is heel veel werk zodra je veel venstertjes etc. gaat maken, dan kan je beter C# oid gebruiken. Voor professionele games is C++ weer "beter" omdat het allemaal nog verder geoptimaliseerd kan worden.

    C++ is een goede taal om te leren omdat je high-level (OOP) semantiek en low-level semantiek in 1 taal hebt zitten, maar het nadeel is dat het daarom nogal overdonderend kan zijn. C# haalt veel kopzorgen voor je weg en geeft je hele mooie tools om venstertjes etc. te bouwen.
    Trollface.zondag 9 mei 2010 @ 17:52
    Windows API i.c.m. C++ is inderdaad niet de beste keuze. Heeft iemand hier ervaring met C++ en GTK voor de GUI?

    Ohja, en de WinAPI/.NET is niet cross-platform natuurlijk, dus OSX- en Linux-gebruikers kunnen er niets mee.
    minibeerzondag 9 mei 2010 @ 20:07
    nouja, ik ben toch alleen met de absolute basis van c++ bezig, loopjes die me via pointers en references wat ouput geven (via cout, want ik snap niets van printf ), dus ik denk dat het geen kwaad kan eerst maar eens c++ te leren. Als ik dan daadwerkelijk windows applications wil maken, wat wss nog wel even duurt, ga ik wel weer over c# nadenken. Als de syntax op zich gewoon hetzelfde is lijkt me dat niet zo'n probleem
    Crutchzondag 9 mei 2010 @ 20:07
    Ik heb net een (misschien buggy) iTunes remote dingetje gemaakt in C# .Net


    M'n eerste werkende programmaatje.
    Trollface.zondag 9 mei 2010 @ 21:37
    Ik zou de sluitknop en het kader eromheen weghalen, je hebt toch al een sluitknop?

    Tevens is er een ander topic voor .NET eigenlijk, toch?
    Crutchzondag 9 mei 2010 @ 21:44
    quote:
    Op zondag 9 mei 2010 21:37 schreef Trollface. het volgende:
    Ik zou de sluitknop en het kader eromheen weghalen, je hebt toch al een sluitknop?

    Tevens is er een ander topic voor .NET eigenlijk, toch?
    I know, maar hier kwam ineens actie.

    Als ik de borderstyle op 'none' zet, fuckt ie de hele layout op. Maar ik ga er wel even mee testen.
    Heeft waarschijnlijk te maken met de grootte van de tekst in de Font property.
    minibeerzondag 9 mei 2010 @ 23:35
    quote:
    Op zondag 9 mei 2010 20:07 schreef Crutch het volgende:
    Ik heb net een (misschien buggy) iTunes remote dingetje gemaakt in C# .Net


    M'n eerste werkende programmaatje.
    nice . Ik hoop dat ik over een tijd ook zover ben. Hoeveel werk zit er ongeveer in?
    Crutchzondag 9 mei 2010 @ 23:41
    4 uurtjes + 10 minuten Photoshop.
    Fortitudezondag 9 mei 2010 @ 23:43
    Hij crashed wanneer je geen ITunes hebt. Ik zou even een Exception afvangen.
    Crutchzondag 9 mei 2010 @ 23:47
    quote:
    Op zondag 9 mei 2010 23:43 schreef Fortitude het volgende:
    Hij crashed wanneer je geen ITunes hebt. Ik zou even een Exception afvangen.
    Oh, okay.
    Staat genoteerd.
    minibeermaandag 10 mei 2010 @ 09:08
    quote:
    Op zondag 9 mei 2010 23:41 schreef Crutch het volgende:
    4 uurtjes + 10 minuten Photoshop.
    Valt me mee, maar het dan ook niet zon groot dingetje . Doe je trouwens programmeren voor je opleiding of als hobby?
    Crutchmaandag 10 mei 2010 @ 09:13
    quote:
    Op maandag 10 mei 2010 09:08 schreef minibeer het volgende:

    [..]

    Valt me mee, maar het dan ook niet zon groot dingetje . Doe je trouwens programmeren voor je opleiding of als hobby?
    Hobby.
    minibeermaandag 10 mei 2010 @ 16:16
    quote:
    Op maandag 10 mei 2010 09:13 schreef Crutch het volgende:

    [..]

    Hobby.
    ok .
    klein beginners vraagje. waarom:
    int main()
    {
    ...
    }

    ipv

    void main()
    {
    ...
    }

    Ik heb het tweede nog niet gezien bij voorbeeldcode, terwijl main toch echt nooit wordt gebruikt om een waarde door te geven...
    Intrepiditymaandag 10 mei 2010 @ 16:18
    quote:
    Op maandag 10 mei 2010 16:16 schreef minibeer het volgende:

    [..]

    ok .
    klein beginners vraagje. waarom:
    int main()
    {
    ...
    }

    ipv

    void main()
    {
    ...
    }

    Ik heb het tweede nog niet gezien bij voorbeeldcode, terwijl main toch echt nooit wordt gebruikt om een waarde door te geven...
    Conventie. die return-waarde wordt inderdaad bijna nooit gebruikt, maar volgensmij zijn er nog sommige antieke compilers of zelfs OS'en die moeilijk doen als er geen resultaat uit de main komt. Echter nog nooit tegengekomen.
    Trollface.maandag 10 mei 2010 @ 16:44
    Programma's horen een returncode terug te geven om aan te geven of de executie succesvol was. 0 = succesvol, bij elke andere waarde is er een fout opgetreden. Deze returncode wordt echter nog maar zelden gebruikt.
    Cruise.Elroymaandag 10 mei 2010 @ 16:57
    Die return-code kan je in batch files e.d. nog gebruiken om heel simpel wat feedback te krijgen van je apps. Kijk naar IF ERRORLEVEL voor DOS-batchfiles bijv.
    Ik gebruik void main() als het mogelijk is. Ik heb een hekel aan functies die een return-value hebben maar die by design nooit iets nuttigs returnen.
    Trollface.maandag 10 mei 2010 @ 17:04
    int main() hoort toch bij de C/C++-standaard?
    minibeermaandag 10 mei 2010 @ 20:19
    klinkt logisch. Bedankt
    netolkmaandag 10 mei 2010 @ 22:04
    quote:
    Op maandag 10 mei 2010 17:04 schreef Trollface. het volgende:
    int main() hoort toch bij de C/C++-standaard?
    ja
    Cruise.Elroymaandag 10 mei 2010 @ 22:04
    quote:
    Op maandag 10 mei 2010 17:04 schreef Trollface. het volgende:
    int main() hoort toch bij de C/C++-standaard?
    Klopt. Ik houd er zo m'n eigen regels op na.
    netolkmaandag 10 mei 2010 @ 22:07
    quote:
    Op maandag 10 mei 2010 22:04 schreef Cruise.Elroy het volgende:

    [..]

    Klopt. Ik houd er zo m'n eigen regels op na.
    wat voor regels dan?

    EDIT:
    niet goed gelezen

    [ Bericht 8% gewijzigd door netolk op 10-05-2010 22:13:52 ]
    Trollface.maandag 10 mei 2010 @ 22:11
    quote:
    Op maandag 10 mei 2010 22:04 schreef Cruise.Elroy het volgende:

    [..]

    Klopt. Ik houd er zo m'n eigen regels op na.
    Dat je programma's dan überhaupt compilen mijn compiler pakt void main() niet.
    netolkmaandag 10 mei 2010 @ 22:13
    die van mij idd ook niet maar die compilers van/voor microsoft waarschijnlijk wel
    Thomassmaandag 10 mei 2010 @ 22:13
    quote:
    Op maandag 10 mei 2010 16:44 schreef Trollface. het volgende:
    Programma's horen een returncode terug te geven om aan te geven of de executie succesvol was. 0 = succesvol, bij elke andere waarde is er een fout opgetreden. Deze returncode wordt echter nog maar zelden gebruikt.
    Return values worden zeer veel gebruikt in linux systemen.
    Trollface.maandag 10 mei 2010 @ 22:15
    quote:
    Op maandag 10 mei 2010 22:13 schreef Thomass het volgende:

    [..]

    Return values worden zeer veel gebruikt in linux systemen.
    Valt ook wel mee hoor, in makefiles nog wel ja.
    Cruise.Elroydinsdag 11 mei 2010 @ 07:46
    quote:
    Op maandag 10 mei 2010 22:11 schreef Trollface. het volgende:

    [..]

    Dat je programma's dan überhaupt compilen mijn compiler pakt void main() niet.
    Werkt alleen onder VC++ voor C++, en zou gewoon moeten compilen op elke C compiler afaik.
    thabitdinsdag 11 mei 2010 @ 17:40
    quote:
    Op maandag 10 mei 2010 17:04 schreef Trollface. het volgende:
    int main() hoort toch bij de C/C++-standaard?
    Microsoft wijkt op een aantal punten van de standaard af.
    minibeerdinsdag 11 mei 2010 @ 18:42
    quote:
    Op dinsdag 11 mei 2010 17:40 schreef thabit het volgende:

    [..]

    Microsoft wijkt op een aantal punten van de standaard af.
    zou het (visual c++) dan eigenlijk een warning/error moeten geven?
    thabitdinsdag 11 mei 2010 @ 18:57
    quote:
    Op dinsdag 11 mei 2010 18:42 schreef minibeer het volgende:

    [..]

    zou het (visual c++) dan eigenlijk een warning/error moeten geven?
    Geen idee, ik werk niet meer met VC++, maar je kunt overal warnings en errors voor laten geven dus vast ook wel hiervoor. .
    netolkdinsdag 11 mei 2010 @ 23:15
    quote:
    Op dinsdag 11 mei 2010 17:40 schreef thabit het volgende:

    [..]

    Microsoft wijkt op een aantal punten van de standaard af.
    tja dat zijn vaak ook de problemen met source code...
    Ofyles2dinsdag 11 mei 2010 @ 23:23
    quote:
    Op zondag 7 maart 2010 11:56 schreef LucasHulshof het volgende:
    Een erg goede en gratis IDE, voor zowel windows/linux, gericht op het ontwikkelen van software met het QT framework (o.a. google earth maakt hier gebruik van)
    QTCreator

    Het QT Framework verlost je van het broddelwerk genaamd "windows api" en is compleet object georienteerd. Een aanrader voor iedereen die serieus portable software wil schrijven.
    Afgelopen november een editie van Linux Magazine gekocht, meteen verslaafd geraakt door de Qt Framework.
    thabitwoensdag 12 mei 2010 @ 11:26
    Dit is trouwens ook wel een goed boek om de basisbeginselen van C++ te leren: http://mindview.net/Books/TICPP/ThinkingInCPP2e.html
    netolkwoensdag 12 mei 2010 @ 12:57
    quote:
    Op woensdag 12 mei 2010 11:26 schreef thabit het volgende:
    Dit is trouwens ook wel een goed boek om de basisbeginselen van C++ te leren: http://mindview.net/Books/TICPP/ThinkingInCPP2e.html
    en deze natuurlijk ook:
    cplusplus
    minibeerdinsdag 25 mei 2010 @ 11:57
    van cplusplus.com heb ik de volgende code:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    // function template
    #include <iostream>
    using namespace std;

    template <class T>
    T GetMax (T a, T b) {
      T result;
      result = (a>b)? a : b;
      return (result);
    }

    int main () {
      int i=5, j=6, k;
      long l=10, m=5, n;
      k=GetMax<int>(i,j);
      n=GetMax<long>(l,m);
      cout << k << endl;
      cout << n << endl;
      return 0;
    }


    Maar is het niet zo dat de types int en long hetzelfde zijn en dit voorbeeld dus eigenlijk nutteloos is? Met het compilen heb ik in elk geval geen probleem als ik een int aan een long variabele probeer toe te wijzen en andersom (ook als argumenten bij functies niet).
    progjedinsdag 25 mei 2010 @ 12:21
    een int een long zijn verschillende types.

    Een long is een "long-int"

    of er daadwerkelijk verschil in de lengte zit, is afhankelijk van je processor...

    Dus

    een short is 2 bytes
    een long is 4 bytes
    en een int is 2 of 4 bytes afhankelijk van je processor.
    thabitdinsdag 25 mei 2010 @ 12:21
    Op 16-bitssystemen (mogelijk van voor jouw tijd ) was een int 16 bit en een long 32 bit.
    Cruise.Elroydinsdag 25 mei 2010 @ 17:06
    Het zijn verschillende types die op de huidige hardware "toevallig" dezelfde grootte hebben. Tenzij je de code gaat compileren op obscure platforms zou ik me er geen zorgen over maken.
    minibeerdinsdag 25 mei 2010 @ 17:38
    quote:
    Op dinsdag 25 mei 2010 12:21 schreef progje het volgende:
    een int een long zijn verschillende types.

    Een long is een "long-int"

    of er daadwerkelijk verschil in de lengte zit, is afhankelijk van je processor...

    Dus

    een short is 2 bytes
    een long is 4 bytes
    en een int is 2 of 4 bytes afhankelijk van je processor.
    ik snap het, hoewel het wat onlogisch overkomt om de grootte van een variabele af te laten hangen van de processor.
    minibeerdinsdag 25 mei 2010 @ 17:39
    quote:
    Op dinsdag 25 mei 2010 12:21 schreef thabit het volgende:
    Op 16-bitssystemen (mogelijk van voor jouw tijd ) was een int 16 bit en een long 32 bit.
    ik heb het programmeren geleerd in qbasic
    Cruise.Elroydinsdag 25 mei 2010 @ 17:43
    quote:
    Op dinsdag 25 mei 2010 17:38 schreef minibeer het volgende:

    [..]

    ik snap het, hoewel het wat onlogisch overkomt om de grootte van een variabele af te laten hangen van de processor.
    Is ook raar.
    netolkdinsdag 25 mei 2010 @ 21:06
    quote:
    Op dinsdag 25 mei 2010 17:38 schreef minibeer het volgende:

    [..]

    ik snap het, hoewel het wat onlogisch overkomt om de grootte van een variabele af te laten hangen van de processor.
    raar maar waar...

    PS.
    Hier de groten van alle data typen

    Je kan natuurlijk ook de sizeof(agrument) gebruiken om te zien hoe groot iets is.. uitkomst is overigens wel in bytes
    minibeerzondag 30 mei 2010 @ 00:03
    quote:
    Also, when using SDL, you must have your main() function declared like it is above. You can't use void main() or anything like that.
    Cruise.Elroyzondag 30 mei 2010 @ 01:17
    quote:
    Op zondag 30 mei 2010 00:03 schreef minibeer het volgende:

    [..]


    Ofyles2zondag 30 mei 2010 @ 03:27
    quote:
    Op dinsdag 25 mei 2010 21:06 schreef netolk het volgende:

    [..]

    raar maar waar...

    PS.
    Hier de groten van alle data typen

    Je kan natuurlijk ook de sizeof(agrument) gebruiken om te zien hoe groot iets is.. uitkomst is overigens wel in bytes
    Ik heb thuis een C++-programmeerboek liggen die datatypes van kleinere groottes heeft. Betreft int en long.
    netolkzondag 30 mei 2010 @ 10:24
    quote:
    Op zondag 30 mei 2010 03:27 schreef Ofyles2 het volgende:

    [..]

    Ik heb thuis een C++-programmeerboek liggen die datatypes van kleinere groottes heeft. Betreft int en long.
    Dan is dat waarschijnlijk een oud boek...

    sizeof is de grootte die jouw computer er van maakt
    Ofyles2zondag 30 mei 2010 @ 14:36
    quote:
    Op zondag 30 mei 2010 10:24 schreef netolk het volgende:

    [..]

    Dan is dat waarschijnlijk een oud boek...

    sizeof is de grootte die jouw computer er van maakt
    Het gaat om 'Sams Teach Yourself C++ in One Hour a Day'.

    Een pijnlijke fout is dat de auteurs van dat boek vermelden dat de long int en de int van dezelfde lengte zijn.
    minibeerzondag 30 mei 2010 @ 15:03
    quote:
    Op zondag 30 mei 2010 14:36 schreef Ofyles2 het volgende:

    [..]

    Het gaat om 'Sams Teach Yourself C++ in One Hour a Day'.

    Een pijnlijke fout is dat de auteurs van dat boek vermelden dat de long int en de int van dezelfde lengte zijn.
    dat is dus alleen bij nieuwe systemen zo,
    maar hier staat ook dat de int en de long int even groot zijn:
    http://www.cplusplus.com/doc/tutorial/variables/
    minibeerzondag 30 mei 2010 @ 15:06
    quote:
    Op zondag 30 mei 2010 01:17 schreef Cruise.Elroy het volgende:

    [..]


    Van een SDL tutorial.
    Ik vroeg eerst waarom mensen eigenlijk men een main functie die een int was begonnen, maar dat is dus ook voor dit soort zaken
    netolkzondag 30 mei 2010 @ 15:08
    quote:
    Op zondag 30 mei 2010 15:03 schreef minibeer het volgende:

    [..]

    dat is dus alleen bij nieuwe systemen zo,
    maar hier staat ook dat de int en de long int even groot zijn:
    http://www.cplusplus.com/doc/tutorial/variables/
    ja nieuwe systemen hebben dat zo en daarom staat dat er waarschijnlijk aangezien (bijna) niemand die oude systemen nog gebruikt en er zeker geen programma's meer voor gemaakt worden
    netolkzondag 30 mei 2010 @ 15:09
    quote:
    Op zondag 30 mei 2010 15:06 schreef minibeer het volgende:

    [..]

    Van een SDL tutorial.
    Ik vroeg eerst waarom mensen eigenlijk men een main functie die een int was begonnen, maar dat is dus ook voor dit soort zaken
    gewoon int nemen dan zit je altijd goed
    Ofyles2zondag 30 mei 2010 @ 15:10
    quote:
    Op zondag 30 mei 2010 15:03 schreef minibeer het volgende:

    [..]

    dat is dus alleen bij nieuwe systemen zo,
    maar hier staat ook dat de int en de long int even groot zijn:
    http://www.cplusplus.com/doc/tutorial/variables/
    Oh, oké.
    minibeerzondag 30 mei 2010 @ 16:02
    klopt het dat het niet mogelijk is om mode 13 graphics in visual c++ te doen? Dat zou niet werken omdat dat een 32-bits compiler is ofzo (verder snap ik hier de ballen van). Het zou wel kunnen in SDL, maar ik zou liever eerst om te oefenen mijn programmatjes uit qbasic naar c++ 'vertalen'. En dan kijken hoe snel ze zijn natuurlijk...
    Maar dit zit er dus niet in?
    Cruise.Elroyzondag 30 mei 2010 @ 16:10
    quote:
    Op zondag 30 mei 2010 16:02 schreef minibeer het volgende:
    klopt het dat het niet mogelijk is om mode 13 graphics in visual c++ te doen? Dat zou niet werken omdat dat een 32-bits compiler is ofzo (verder snap ik hier de ballen van). Het zou wel kunnen in SDL, maar ik zou liever eerst om te oefenen mijn programmatjes uit qbasic naar c++ 'vertalen'. En dan kijken hoe snel ze zijn natuurlijk...
    Maar dit zit er dus niet in?
    Mode 13 is iets van 20 jaar geleden. Tegenwoordig heb je geen palette meer van 256 kleuren Het heeft niets met de taal te maken, maar meer met het feit dat al die systemen uit het DOS-tijdperk stammen en niet meer 1-2-3 beschikbaar zijn.

    Ik kan je aanraden om toch SDL te gebruiken, maar misschien eerst C++ goed onder de knie krijgen.
    minibeerzondag 30 mei 2010 @ 16:21
    quote:
    Op zondag 30 mei 2010 16:10 schreef Cruise.Elroy het volgende:

    [..]

    Mode 13 is iets van 20 jaar geleden. Tegenwoordig heb je geen palette meer van 256 kleuren Het heeft niets met de taal te maken, maar meer met het feit dat al die systemen uit het DOS-tijdperk stammen en niet meer 1-2-3 beschikbaar zijn.

    Ik kan je aanraden om toch SDL te gebruiken, maar misschien eerst C++ goed onder de knie krijgen.
    Met qbasic kan je wel gewoon screen 13 graphics en alles doen (tot en met XP werkt dat prima). Beetje jammer, want ik vind graphics wel een van de leukere dingen om te doen, en om nou met SDL te beginnen terwijl ik c++ nog niet echt goed ken... maarja.
    Cruise.Elroyzondag 30 mei 2010 @ 16:42
    quote:
    Op zondag 30 mei 2010 16:21 schreef minibeer het volgende:

    [..]

    Met qbasic kan je wel gewoon screen 13 graphics en alles doen (tot en met XP werkt dat prima). Beetje jammer, want ik vind graphics wel een van de leukere dingen om te doen, en om nou met SDL te beginnen terwijl ik c++ nog niet echt goed ken... maarja.
    Ik kom ook uit een QBasic achtergrond, en het is wel even wennen.
    Als je echt wilt, kan je heel snel een applicatie uit de grond stampen in win32 met een scherm en een tekencanvas (zonder extra libs te hoeven downloaden)

    // maken en registeren van een window:
    RegisterWindowEx()
    CreateWindowEx ()
    ShowWindow()
    // functie die je moet maken waarin je events afhandeld
    WindowProc()

    // maken van een tekencanvas
    CreateDIBSection()
    GetDC()
    SelectObject()

    // kopieren van het tekencanvas naar de oppervlakte van je windowBitBlt()
    BitBlt()

    // Afhandelen van window-events:
    GetMessage()
    en dan de events:

    WM_PAINT (herschrijven van je window)
    beetje muis-events afvangen:
    WM_MOUSEMOVE
    WM_LBUTTONDOWN

    Het is even googlen maar dan heb je in een dag wel een werkend framework waar je redelijk snel op kan tekenen. Het is alleen allemaal event driven, dus als je wilt animeren zul je iets met CreateTimer() moeten doen of met GetTickCount() de tijd in ms opvragen en dat in het GetMessage() loopje zelf doen.
    minibeerzondag 30 mei 2010 @ 17:03
    quote:
    Op zondag 30 mei 2010 16:42 schreef Cruise.Elroy het volgende:

    [..]

    Ik kom ook uit een QBasic achtergrond, en het is wel even wennen.
    Als je echt wilt, kan je heel snel een applicatie uit de grond stampen in win32 met een scherm en een tekencanvas (zonder extra libs te hoeven downloaden)

    // maken en registeren van een window:
    RegisterWindowEx()
    CreateWindowEx ()
    ShowWindow()
    // functie die je moet maken waarin je events afhandeld
    WindowProc()

    // maken van een tekencanvas
    CreateDIBSection()
    GetDC()
    SelectObject()

    // kopieren van het tekencanvas naar de oppervlakte van je windowBitBlt()
    BitBlt()

    // Afhandelen van window-events:
    GetMessage()
    en dan de events:

    WM_PAINT (herschrijven van je window)
    beetje muis-events afvangen:
    WM_MOUSEMOVE
    WM_LBUTTONDOWN

    Het is even googlen maar dan heb je in een dag wel een werkend framework waar je redelijk snel op kan tekenen. Het is alleen allemaal event driven, dus als je wilt animeren zul je iets met CreateTimer() moeten doen of met GetTickCount() de tijd in ms opvragen en dat in het GetMessage() loopje zelf doen.
    dankje!
    ok, ziet er wel ok uit, wordt dit gebruikt voor simpele grafieken binnen windows programma's enzo (zeg maar met de windows.h lib)?
    Ik zal er eens naar kijke
    maar het lijkt me niet zo makkelijk als screen 13 in qbasic
    echt jammer dat er geen optie is voor 16-bit compilen...

    [ Bericht 1% gewijzigd door minibeer op 30-05-2010 17:19:00 ]
    Cruise.Elroyzondag 30 mei 2010 @ 17:17
    quote:
    Op zondag 30 mei 2010 17:03 schreef minibeer het volgende:

    [..]

    ok, ziet er wel ok uit, wordt dit gebruikt voor simpele grafieken binnen windows programma's enzo (zeg maar met de windows.h lib)?
    Ik zal er eens naar kijke
    maar het lijkt me niet zo makkelijk als screen 13 in qbasic
    echt jammer dat er geen optie is voor 16-bit compilen (of is dit onzin wat ik nu zeg :P)
    Als je een oude C++ compiler pakt kan je wss wel oude DOS-executables maken. Geen idee hoe je dat precies kan regelen maar er zijn compilers voor. Dan blijf je helaas wel hangen in een verouderd systeem en dat is wss gewoon zonde van je tijd.
    minibeerzondag 30 mei 2010 @ 17:37
    quote:
    Op zondag 30 mei 2010 17:17 schreef Cruise.Elroy het volgende:

    [..]

    Als je een oude C++ compiler pakt kan je wss wel oude DOS-executables maken. Geen idee hoe je dat precies kan regelen maar er zijn compilers voor. Dan blijf je helaas wel hangen in een verouderd systeem en dat is wss gewoon zonde van je tijd.
    Ja ik wil het sowieso wel bij 1 compiler (per taal) houden, anders vind ik het zo'n gedoe. (Om dan bijvoorbeeld sdl bij beide aan de praat te krijgen)
    minibeerzondag 6 juni 2010 @ 15:09
    nog een n00bvraag...
    Het lukt me niet om in visual c++ andere source files te compileren
    bijvoorbeeld dit bestand:
    Codermind Raytracer source



    Het zal vast niet zo moeilijk zijn maar ik zou niet weten wat ik verkeerd doe
    Cruise.Elroyzondag 6 juni 2010 @ 15:11
    je hebt nu een losse CPP file. Je moet er even een project (solution) omheen draaien.

    New project maken met de wizard, doe je gewoon C++ appliclication (met console evt) en dan "empty solution". Dan de inhoud van dat bestand in je main.cpp zetten, of dat bestand importeren in je project.
    minibeerzondag 6 juni 2010 @ 16:39
    quote:
    Op zondag 6 juni 2010 15:11 schreef Cruise.Elroy het volgende:
    je hebt nu een losse CPP file. Je moet er even een project (solution) omheen draaien.

    New project maken met de wizard, doe je gewoon C++ appliclication (met console evt) en dan "empty solution". Dan de inhoud van dat bestand in je main.cpp zetten, of dat bestand importeren in je project.
    ok thanks man ik wist dat het zoiets moest zijn
    (ik krijg hem nu alleen nog niet aan de praat:
    1
    2
    3
    4
    5
    6
    'raytrace.exe': Loaded 'C:\Users\thuispc\Documents\Visual Studio 2008\Projects\Project1\raytrace\Debug\raytrace.exe', Symbols loaded.
    'raytrace.exe': Loaded 'C:\Windows\System32\ntdll.dll'
    'raytrace.exe': Loaded 'C:\Windows\System32\kernel32.dll'
    'raytrace.exe': Loaded 'C:\Windows\winsxs\x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.30729.1_none_bb1f6aa1308c35eb\msvcp90d.dll'
    'raytrace.exe': Loaded 'C:\Windows\winsxs\x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.30729.1_none_bb1f6aa1308c35eb\msvcr90d.dll'
    The program '[8152] raytrace.exe: Native' has exited with code -1 (0xffffffff).
    )
    netolkzondag 6 juni 2010 @ 16:41
    Wat ben je aan het maken minibeer?

    die code ziet er interessant uit
    Trollface.zondag 6 juni 2010 @ 16:41
    quote:
    Op zondag 6 juni 2010 16:41 schreef netolk het volgende:
    Wat ben je aan het maken minibeer?

    die code ziet er interessant uit
    Dit, lijkt me.
    netolkzondag 6 juni 2010 @ 16:44
    quote:
    Op zondag 6 juni 2010 16:41 schreef Trollface. het volgende:

    [..]

    Dit, lijkt me.
    joh...

    ik vraag me ook af waarvoor de code dient en ben lui
    minibeerzondag 6 juni 2010 @ 16:45
    niet van mij hoor zo ver ben ik nog niet
    gewoon een voorbeeld van raytracen, van het internet geplukt
    in qbasic heb ik nog wel eens een raytracer ding gemaakt
    netolkzondag 6 juni 2010 @ 16:51
    quote:
    Op zondag 6 juni 2010 16:45 schreef minibeer het volgende:
    niet van mij hoor zo ver ben ik nog niet
    gewoon een voorbeeld van raytracen, van het internet geplukt
    in qbasic heb ik nog wel eens een raytracer ding gemaakt
    dankje nu hoef ik zelf niet te kijken
    Cruise.Elroyzondag 6 juni 2010 @ 18:00
    quote:
    Op zondag 6 juni 2010 16:39 schreef minibeer het volgende:

    [..]

    ok thanks man ik wist dat het zoiets moest zijn
    (ik krijg hem nu alleen nog niet aan de praat:
    [ code verwijderd ]

    )
    Je zal toch meer moeten posten dan een lege log als je verwacht dat we je kunnen helpen.
    thabitzondag 6 juni 2010 @ 18:11
    Hoe ziet je main() eruit? int main() {return -1;} ?
    minibeerzondag 6 juni 2010 @ 18:57
    quote:
    Op zondag 6 juni 2010 18:00 schreef Cruise.Elroy het volgende:

    [..]

    Je zal toch meer moeten posten dan een lege log als je verwacht dat we je kunnen helpen.
    ja sorry ik heb nog niet echt de betekenis van die log door
    maar het is iig het bestand dat ik eerder al gepost had
    Cruise.Elroywoensdag 9 juni 2010 @ 13:55
    is het al gelukt?
    netolkdonderdag 17 juni 2010 @ 15:48
    quote:
    Op woensdag 9 juni 2010 13:55 schreef Cruise.Elroy het volgende:
    is het al gelukt?
    minibeervrijdag 18 juni 2010 @ 21:19
    oweeeeuh nee, ik heb het maar opgegeven
    (en ik ben ondertussen een week op vakantie geweest enzo )
    netolkzaterdag 26 juni 2010 @ 17:35
    Hey ik heb een probleem met de ifstream eof() gebeuren...


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #include <fstream>
    #include <iostream>
    int main(){
       std::ifstream Read("lol.jpg");
       if(Read.is_open()){
          int i = 0;
          while(!Read.eof()){
             char temp = Read.get();
             i++;
          }
          Read.close();
          std::cout << "i = " << i <<'\n';
       }
       return 0;
    }

    lol.jpg is (volgens windows) 353.821 bytes en 356.352 bytes grootte op schijf
    dus ik zou zeggen dat het progje ook die waarde zou moeten weergeven alleen nu geeft het programma 275 aan daarna nokt het progje er dus mee

    zou iemand me kunnen vertellen waarom dit gebeurt en hoe ik dit kan oplossen?

    mvg. netolk
    Trollface.zaterdag 26 juni 2010 @ 19:18
    Binaire data lees je toch niet met chars.
    moeftiezaterdag 26 juni 2010 @ 19:51
    Zou het kunnen zijn dat op byte positie 275 het EOF teken staat? Waardoor de boel stopt.

    @Trollface: Binaire data kun je in een char lezen, als je er verder toch niks mee doet.
    netolkzaterdag 26 juni 2010 @ 20:00
    quote:
    Op zaterdag 26 juni 2010 19:18 schreef Trollface. het volgende:
    Binaire data lees je toch niet met chars.
    get() leest 1 byte en char is 1 byte.
    quote:
    Op zaterdag 26 juni 2010 19:51 schreef moeftie het volgende:
    Zou het kunnen zijn dat op byte positie 275 het EOF teken staat? Waardoor de boel stopt.

    @Trollface: Binaire data kun je in een char lezen, als je er verder toch niks mee doet.
    Ik had daar ook naar gekeken er staat een EM (end of medium) maar ik had dus een test bestandje gemaakt met halverwege zo'n EM maar daar las hij wel gewoon netjes tot het einde van het bestand..
    thabitzaterdag 26 juni 2010 @ 20:33
    Het probleem is denk ik dat de constructor van ifstream het bestand standaard als tekstbestand opent. Probeer dus
    std::ifstream Read("lol.jpg", std::ios_base::binary);
    netolkzaterdag 26 juni 2010 @ 20:43
    quote:
    Op zaterdag 26 juni 2010 20:33 schreef thabit het volgende:
    Het probleem is denk ik dat de constructor van ifstream het bestand standaard als tekstbestand opent. Probeer dus
    std::ifstream Read("lol.jpg", std::ios_base::binary);
    Hehe, best wel stom had ik moeten weten XD maar het werkt dus bedankt thabit
    xienixswoensdag 30 juni 2010 @ 05:20
    Na een tijdje in Python en Perl gespeeld te hebben is mij geadviseerd om verder te gaan in C++. Dit vooral omdat ik bezig ben in de bioinformatica.

    Ben ondertussen de cplusplus tutorial aan het doornemen maar vroeg me af of er online boeken/documentatie beschikbaar is met opdrachten.

    En of jullie misschien tutorials weten in de richting van bioinformatica?

    Dit alles doe ik in Xcode en moet zeggen dat tot nu toe alles nog vlekkeloos werkt
    Cruise.Elroywoensdag 30 juni 2010 @ 08:35
    Ik geloof dat ze op CPP-home(.com) wel tutorials e.d. hebben; sowieso een goede community die je kunnen helpen.
    En dingen "in de richting van" bioinformatica lijkt me heel lastig, ik zou niets kunnen noemen wat nou typisch bioinformatica is. Voor wetenschappelijke simulaties hebje vaak goede data-architectuur kennis nodig in combinatie met geoptimaliseerde algo's (die je meestal uit papers haalt) en high-level logica.
    Thormodowoensdag 30 juni 2010 @ 20:01
    quote:
    Op woensdag 30 juni 2010 05:20 schreef xienixs het volgende:
    Ben ondertussen de cplusplus tutorial aan het doornemen maar vroeg me af of er online boeken/documentatie beschikbaar is met opdrachten.

    En of jullie misschien tutorials weten in de richting van bioinformatica?

    Dit alles doe ik in Xcode en moet zeggen dat tot nu toe alles nog vlekkeloos werkt
    Op http://lesmateriaal.saxion.nl/gej/oopr/index.html , http://lesmateriaal.saxion.nl/gej/cpba1/index.html & http://lesmateriaal.saxion.nl/gej/cpro2/index.html staat ook wel wat. Ligt er maar net aan wat je nodig hebt.

    En nog wat zooi die ik in mijn bookmarks had staan:
    http://msdn.microsoft.com(...)k5%28v=VS.71%29.aspx
    http://www.ronkes.nl/oldprogrammeren/

    Maar goed je kan beter gericht zoeken naar wat je nodig bent, want over alles staat wel wat op internet.

    En dit boek (maar dan de Visual C# versie) vond ik wel fijn: http://www.bol.com/nl/p/e(...)002115621/index.html .

    [ Bericht 4% gewijzigd door Thormodo op 30-06-2010 20:11:58 ]
    netolkzondag 4 juli 2010 @ 15:17
    Hey, ik heb iets nodig zoals ::SetConsoleCursorPosition(myHandle, myCoord); alleen moet hij dat de cursorpositie geven... Weet iemand of zo'n functie bestaat of hoe die te maken is?

    avb
    Cruise.Elroyzondag 4 juli 2010 @ 16:56
    Beetje googlen en je hebt het zo gevonden:

    Op MSDN, zoeken naar SetConsoleCursorPosition:
    http://msdn.microsoft.com/en-us/library/ms686025(VS.85).aspx

    En dan halverwege de tekst:
    quote:
    The cursor position determines where characters written by the WriteFile or WriteConsole function, or echoed by the ReadFile or ReadConsole function, are displayed. To determine the current position of the cursor, use the GetConsoleScreenBufferInfo function.
    Eh die staat hier: http://msdn.microsoft.com/en-us/library/ms683171(v=VS.85).aspx
    netolkzondag 4 juli 2010 @ 17:43
    quote:
    Op zondag 4 juli 2010 16:56 schreef Cruise.Elroy het volgende:
    Beetje googlen en je hebt het zo gevonden:

    Op MSDN, zoeken naar SetConsoleCursorPosition:
    http://msdn.microsoft.com/en-us/library/ms686025(VS.85).aspx

    En dan halverwege de tekst:
    [..]

    Eh die staat hier: http://msdn.microsoft.com/en-us/library/ms683171(v=VS.85).aspx
    ik krijg bij het compileren een fout melding:
    1request for member `dwCursorPosition' in `myInfo', which is of non-class type 'CONSOLE_SCREEN_BUFFER_INFO*'


    dit is stukje van de code
    1
    2
    3
    4
    5
    CONSOLE_SCREEN_BUFFER_INFO* myInfo;
       GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE),myInfo);
       COORD myCoord = myInfo.dwCursorPosition;
       myCoord.X -=3;
       SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),myCoord);
    Cruise.Elroyzondag 4 juli 2010 @ 19:44
    quote:
    BOOL WINAPI GetConsoleScreenBufferInfo(
    __in HANDLE hConsoleOutput,
    __out PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo
    );
    Het is niet zo duidelijk, maar kijk goed naar het type en de naam van de tweede parameter:
    De P bij het type en de lp in de naam geeft aan dat het een pointer is.

    PCONSOLE_SCREEN_BUFFER_INFO is een pointer naar CONSOLE_SCREEN_BUFFER_INFO (ms typedeft of defined vaak zijn pointers, geen idee waarom)

    ipv myCoord moet je dus &myCoord meegeven.
    moeftiezondag 4 juli 2010 @ 21:31
    @netolk
    Ik gok ook op iets met pointers, en niet gevulde variabelen.
    netolkmaandag 5 juli 2010 @ 08:14
    Dat is het dus niet...
    Ik heb van alles geprobeerd met die pointers, maar niks helpt Ik heb eerder het idee dat dwCursorPosition niet in de struct staat... maar de error is in line3 van het stukje code in mijn vorige post...
    Cruise.Elroymaandag 5 juli 2010 @ 08:22
    Ik zie het al, jij maakt een pointer aan die je niet initialiseert en die geef je mee aan de functie. Die pointer moet wijzen naar een struct waar Get....() zijn info in kan zetten. De "juiste" code is dus:

    1
    2
    3
    4
    5
       CONSOLE_SCREEN_BUFFER_INFO myInfo;
       GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE),&myInfo);
       COORD myCoord = myInfo.dwCursorPosition;
       myCoord.X -=3;
       SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),myCoord);

    Ik heb van myInfo een struct gemaakt ipv een pointer en deze reference ik naar een pointer met de -& opearator in de functieaanroep. (in mijn vorige post schreef ik myCoord, maar ik bedoelde natuurlijk myInfo)
    De error die je kreeg sloeg op de regel waar je dus met een . operator pointer probeerde te benaderen in regel 3.

    Dit is best wel basic stuff, misschien moet je je even inlezen in pointers, stack variabelen etc.
    netolkmaandag 5 juli 2010 @ 08:30
    quote:
    Op maandag 5 juli 2010 08:22 schreef Cruise.Elroy het volgende:
    Ik zie het al, jij maakt een pointer aan die je niet initialiseert en die geef je mee aan de functie. Die pointer moet wijzen naar een struct waar Get....() zijn info in kan zetten. De "juiste" code is dus:
    [ code verwijderd ]

    Ik heb van myInfo een struct gemaakt ipv een pointer en deze reference ik naar een pointer met de -& opearator in de functieaanroep. (in mijn vorige post schreef ik myCoord, maar ik bedoelde natuurlijk myInfo)
    De error die je kreeg sloeg op de regel waar je dus met een . operator pointer probeerde te benaderen in regel 3.

    Dit is best wel basic stuff, misschien moet je je even inlezen in pointers, stack variabelen etc.
    Hèhè,

    Toch bedankt ik zal idd die pointer gebeuren weer ff doornemen
    ReWoutdonderdag 8 juli 2010 @ 23:28
    Kunt beter bij tweakers zijn voor dit.
    Cruise.Elroydonderdag 8 juli 2010 @ 23:53
    quote:
    Op donderdag 8 juli 2010 23:28 schreef ReWout het volgende:
    Kunt beter bij tweakers zijn voor dit.
    Nee hoor, dit lukt hier prima.
    netolkvrijdag 9 juli 2010 @ 10:44
    quote:
    Op donderdag 8 juli 2010 23:28 schreef ReWout het volgende:
    Kunt beter bij tweakers zijn voor dit.
    Omdat??

    Gaat prima hoor, ik zag in dit geval gewoon even wat over het hoofd maar andere zien dat dan weer wel
    TeringHenkiezondag 1 augustus 2010 @ 22:30
    Wat ik me altijd heb afgevraagd: als je een Win32 programma compileert, vertel je tegen de linker/compiler/whatever dat het een .exe in PE formaat is. Je bent in het feite code aan het produceren die tegen de HAL praat. Maar als je een Linux kernel compileert, wat voor een code komt er dan uit? Wat is je target platform?
    Cruise.Elroyzondag 1 augustus 2010 @ 22:35
    quote:
    Op zondag 1 augustus 2010 22:30 schreef TeringHenkie het volgende:
    Wat ik me altijd heb afgevraagd: als je een Win32 programma compileert, vertel je tegen de linker/compiler/whatever dat het een .exe in PE formaat is. Je bent in het feite code aan het produceren die tegen de HAL praat. Maar als je een Linux kernel compileert, wat voor een code komt er dan uit? Wat is je target platform?
    Je compiler is gewoon hard-coded om PE-headers te compileren, inclusief ondersteuning voor platform-specifieke communicatie met de HAL. Volgens mij declareer je in de PE-header ook de communicatiekanalen naar je OS mbh functie-tabellen enzo, die via de exe-loader worden ingevuld.
    TeringHenkiezondag 1 augustus 2010 @ 23:01
    quote:
    Op zondag 1 augustus 2010 22:35 schreef Cruise.Elroy het volgende:

    [..]

    Je compiler is gewoon hard-coded om PE-headers te compileren, inclusief ondersteuning voor platform-specifieke communicatie met de HAL. Volgens mij declareer je in de PE-header ook de communicatiekanalen naar je OS mbh functie-tabellen enzo, die via de exe-loader worden ingevuld.
    Dus als je een kernel bakt, compileer je puur tegen de CPU aan (met een of andere compilerflagje). Je bent dan alleen maar registertjes aan het vullen en interrupts aan het callen? (mooi gewrapt in C-code :P)
    Trollface.zondag 1 augustus 2010 @ 23:09
    quote:
    Op zondag 1 augustus 2010 22:30 schreef TeringHenkie het volgende:
    Wat ik me altijd heb afgevraagd: als je een Win32 programma compileert, vertel je tegen de linker/compiler/whatever dat het een .exe in PE formaat is. Je bent in het feite code aan het produceren die tegen de HAL praat. Maar als je een Linux kernel compileert, wat voor een code komt er dan uit? Wat is je target platform?
    Linux heeft geen PE-type executables, maar ELF's. :)
    TeringHenkiezondag 1 augustus 2010 @ 23:10
    quote:
    Op zondag 1 augustus 2010 23:09 schreef Trollface. het volgende:

    [..]

    Linux heeft geen PE-type executables, maar ELF's. :)
    I know, maar het ging me meer om de compiler vs. kernel dan om het OS zelf. Welke optie geef je mee aan gcc om een kernel te bakken ipv. een (ELF-)binary?
    Trollface.zondag 1 augustus 2010 @ 23:25
    quote:
    Op zondag 1 augustus 2010 23:10 schreef TeringHenkie het volgende:

    [..]

    I know, maar het ging me meer om de compiler vs. kernel dan om het OS zelf. Welke optie geef je mee aan gcc om een kernel te bakken ipv. een (ELF-)binary?
    Pak de makefile erbij, zou ik zeggen :P de Linux-kernel is in ieder geval niet helemaal standaard C.
    TeringHenkiezondag 1 augustus 2010 @ 23:33
    Nou ik ken het niet vinden :P

    SPOILER
    VERSION = 2
    PATCHLEVEL = 6
    SUBLEVEL = 34
    EXTRAVERSION =
    NAME = Sheep on Meth

    # *DOCUMENTATION*
    # To see a list of typical targets execute "make help"
    # More info can be located in ./README
    # Comments in this file are targeted only to the developer, do not
    # expect to learn how to build the kernel reading this file.

    # Do not:
    # o use make's built-in rules and variables
    # (this increases performance and avoids hard-to-debug behaviour);
    # o print "Entering directory ...";
    MAKEFLAGS += -rR --no-print-directory

    # Avoid funny character set dependencies
    unexport LC_ALL
    LC_COLLATE=C
    LC_NUMERIC=C
    export LC_COLLATE LC_NUMERIC

    # We are using a recursive build, so we need to do a little thinking
    # to get the ordering right.
    #
    # Most importantly: sub-Makefiles should only ever modify files in
    # their own directory. If in some directory we have a dependency on
    # a file in another dir (which doesn't happen often, but it's often
    # unavoidable when linking the built-in.o targets which finally
    # turn into vmlinux), we will call a sub make in that other dir, and
    # after that we are sure that everything which is in that other dir
    # is now up to date.
    #
    # The only cases where we need to modify files which have global
    # effects are thus separated out and done before the recursive
    # descending is started. They are now explicitly listed as the
    # prepare rule.

    # To put more focus on warnings, be less verbose as default
    # Use 'make V=1' to see the full commands

    ifeq ("$(origin V)", "command line")
    KBUILD_VERBOSE = $(V)
    endif
    ifndef KBUILD_VERBOSE
    KBUILD_VERBOSE = 0
    endif

    # Call a source code checker (by default, "sparse") as part of the
    # C compilation.
    #
    # Use 'make C=1' to enable checking of only re-compiled files.
    # Use 'make C=2' to enable checking of *all* source files, regardless
    # of whether they are re-compiled or not.
    #
    # See the file "Documentation/sparse.txt" for more details, including
    # where to get the "sparse" utility.

    ifeq ("$(origin C)", "command line")
    KBUILD_CHECKSRC = $(C)
    endif
    ifndef KBUILD_CHECKSRC
    KBUILD_CHECKSRC = 0
    endif

    # Use make M=dir to specify directory of external module to build
    # Old syntax make ... SUBDIRS=$PWD is still supported
    # Setting the environment variable KBUILD_EXTMOD take precedence
    ifdef SUBDIRS
    KBUILD_EXTMOD ?= $(SUBDIRS)
    endif

    ifeq ("$(origin M)", "command line")
    KBUILD_EXTMOD := $(M)
    endif

    # kbuild supports saving output files in a separate directory.
    # To locate output files in a separate directory two syntaxes are supported.
    # In both cases the working directory must be the root of the kernel src.
    # 1) O=
    # Use "make O=dir/to/store/output/files/"
    #
    # 2) Set KBUILD_OUTPUT
    # Set the environment variable KBUILD_OUTPUT to point to the directory
    # where the output files shall be placed.
    # export KBUILD_OUTPUT=dir/to/store/output/files/
    # make
    #
    # The O= assignment takes precedence over the KBUILD_OUTPUT environment
    # variable.


    # KBUILD_SRC is set on invocation of make in OBJ directory
    # KBUILD_SRC is not intended to be used by the regular user (for now)
    ifeq ($(KBUILD_SRC),)

    # OK, Make called in directory where kernel src resides
    # Do we want to locate output files in a separate directory?
    ifeq ("$(origin O)", "command line")
    KBUILD_OUTPUT := $(O)
    endif

    # That's our default target when none is given on the command line
    PHONY := _all
    _all:

    # Cancel implicit rules on top Makefile
    $(CURDIR)/Makefile Makefile: ;

    ifneq ($(KBUILD_OUTPUT),)
    # Invoke a second make in the output directory, passing relevant variables
    # check that the output directory actually exists
    saved-output := $(KBUILD_OUTPUT)
    KBUILD_OUTPUT := $(shell cd $(KBUILD_OUTPUT) && /bin/pwd)
    $(if $(KBUILD_OUTPUT),, \
    $(error output directory "$(saved-output)" does not exist))

    PHONY += $(MAKECMDGOALS) sub-make

    $(filter-out _all sub-make $(CURDIR)/Makefile, $(MAKECMDGOALS)) _all: sub-make
    $(Q)@:

    sub-make: FORCE
    $(if $(KBUILD_VERBOSE:1=),@)$(MAKE) -C $(KBUILD_OUTPUT) \
    KBUILD_SRC=$(CURDIR) \
    KBUILD_EXTMOD="$(KBUILD_EXTMOD)" -f $(CURDIR)/Makefile \
    $(filter-out _all sub-make,$(MAKECMDGOALS))

    # Leave processing to above invocation of make
    skip-makefile := 1
    endif # ifneq ($(KBUILD_OUTPUT),)
    endif # ifeq ($(KBUILD_SRC),)

    # We process the rest of the Makefile if this is the final invocation of make
    ifeq ($(skip-makefile),)

    # If building an external module we do not care about the all: rule
    # but instead _all depend on modules
    PHONY += all
    ifeq ($(KBUILD_EXTMOD),)
    _all: all
    else
    _all: modules
    endif

    srctree := $(if $(KBUILD_SRC),$(KBUILD_SRC),$(CURDIR))
    objtree := $(CURDIR)
    src := $(srctree)
    obj := $(objtree)

    VPATH := $(srctree)$(if $(KBUILD_EXTMOD),:$(KBUILD_EXTMOD))

    export srctree objtree VPATH


    # SUBARCH tells the usermode build what the underlying arch is. That is set
    # first, and if a usermode build is happening, the "ARCH=um" on the command
    # line overrides the setting of ARCH below. If a native build is happening,
    # then ARCH is assigned, getting whatever value it gets normally, and
    # SUBARCH is subsequently ignored.

    SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
    -e s/arm.*/arm/ -e s/sa110/arm/ \
    -e s/s390x/s390/ -e s/parisc64/parisc/ \
    -e s/ppc.*/powerpc/ -e s/mips.*/mips/ \
    -e s/sh[234].*/sh/ )

    # Cross compiling and selecting different set of gcc/bin-utils
    # ---------------------------------------------------------------------------
    #
    # When performing cross compilation for other architectures ARCH shall be set
    # to the target architecture. (See arch/* for the possibilities).
    # ARCH can be set during invocation of make:
    # make ARCH=ia64
    # Another way is to have ARCH set in the environment.
    # The default ARCH is the host where make is executed.

    # CROSS_COMPILE specify the prefix used for all executables used
    # during compilation. Only gcc and related bin-utils executables
    # are prefixed with $(CROSS_COMPILE).
    # CROSS_COMPILE can be set on the command line
    # make CROSS_COMPILE=ia64-linux-
    # Alternatively CROSS_COMPILE can be set in the environment.
    # Default value for CROSS_COMPILE is not to prefix executables
    # Note: Some architectures assign CROSS_COMPILE in their arch/*/Makefile
    export KBUILD_BUILDHOST := $(SUBARCH)
    ARCH ?= $(SUBARCH)
    CROSS_COMPILE ?=

    # Architecture as present in compile.h
    UTS_MACHINE := $(ARCH)
    SRCARCH := $(ARCH)

    # Additional ARCH settings for x86
    ifeq ($(ARCH),i386)
    SRCARCH := x86
    endif
    ifeq ($(ARCH),x86_64)
    SRCARCH := x86
    endif

    # Additional ARCH settings for sparc
    ifeq ($(ARCH),sparc64)
    SRCARCH := sparc
    endif

    # Additional ARCH settings for sh
    ifeq ($(ARCH),sh64)
    SRCARCH := sh
    endif

    # Where to locate arch specific headers
    hdr-arch := $(SRCARCH)

    ifeq ($(ARCH),m68knommu)
    hdr-arch := m68k
    endif

    KCONFIG_CONFIG ?= .config

    # SHELL used by kbuild
    CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
    else if [ -x /bin/bash ]; then echo /bin/bash; \
    else echo sh; fi ; fi)

    HOSTCC = gcc
    HOSTCXX = g++
    HOSTCFLAGS = -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer
    HOSTCXXFLAGS = -O2

    # Decide whether to build built-in, modular, or both.
    # Normally, just do built-in.

    KBUILD_MODULES :=
    KBUILD_BUILTIN := 1

    # If we have only "make modules", don't compile built-in objects.
    # When we're building modules with modversions, we need to consider
    # the built-in objects during the descend as well, in order to
    # make sure the checksums are up to date before we record them.

    ifeq ($(MAKECMDGOALS),modules)
    KBUILD_BUILTIN := $(if $(CONFIG_MODVERSIONS),1)
    endif

    # If we have "make <whatever> modules", compile modules
    # in addition to whatever we do anyway.
    # Just "make" or "make all" shall build modules as well

    ifneq ($(filter all _all modules,$(MAKECMDGOALS)),)
    KBUILD_MODULES := 1
    endif

    ifeq ($(MAKECMDGOALS),)
    KBUILD_MODULES := 1
    endif

    export KBUILD_MODULES KBUILD_BUILTIN
    export KBUILD_CHECKSRC KBUILD_SRC KBUILD_EXTMOD

    # Beautify output
    # ---------------------------------------------------------------------------
    #
    # Normally, we echo the whole command before executing it. By making
    # that echo $($(quiet)$(cmd)), we now have the possibility to set
    # $(quiet) to choose other forms of output instead, e.g.
    #
    # quiet_cmd_cc_o_c = Compiling $(RELDIR)/$@
    # cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $<
    #
    # If $(quiet) is empty, the whole command will be printed.
    # If it is set to "quiet_", only the short version will be printed.
    # If it is set to "silent_", nothing will be printed at all, since
    # the variable $(silent_cmd_cc_o_c) doesn't exist.
    #
    # A simple variant is to prefix commands with $(Q) - that's useful
    # for commands that shall be hidden in non-verbose mode.
    #
    # $(Q)ln $@ :<
    #
    # If KBUILD_VERBOSE equals 0 then the above command will be hidden.
    # If KBUILD_VERBOSE equals 1 then the above command is displayed.

    ifeq ($(KBUILD_VERBOSE),1)
    quiet =
    Q =
    else
    quiet=quiet_
    Q = @
    endif

    # If the user is running make -s (silent mode), suppress echoing of
    # commands

    ifneq ($(findstring s,$(MAKEFLAGS)),)
    quiet=silent_
    endif

    export quiet Q KBUILD_VERBOSE


    # Look for make include files relative to root of kernel src
    MAKEFLAGS += --include-dir=$(srctree)

    # We need some generic definitions (do not try to remake the file).
    $(srctree)/scripts/Kbuild.include: ;
    include $(srctree)/scripts/Kbuild.include

    # Make variables (CC, etc...)

    AS = $(CROSS_COMPILE)as
    LD = $(CROSS_COMPILE)ld
    CC = $(CROSS_COMPILE)gcc
    CPP = $(CC) -E
    AR = $(CROSS_COMPILE)ar
    NM = $(CROSS_COMPILE)nm
    STRIP = $(CROSS_COMPILE)strip
    OBJCOPY = $(CROSS_COMPILE)objcopy
    OBJDUMP = $(CROSS_COMPILE)objdump
    AWK = awk
    GENKSYMS = scripts/genksyms/genksyms
    INSTALLKERNEL := installkernel
    DEPMOD = /sbin/depmod
    KALLSYMS = scripts/kallsyms
    PERL = perl
    CHECK = sparse

    CHECKFLAGS := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ \
    -Wbitwise -Wno-return-void $(CF)
    MODFLAGS = -DMODULE
    CFLAGS_MODULE = $(MODFLAGS)
    AFLAGS_MODULE = $(MODFLAGS)
    LDFLAGS_MODULE = -T $(srctree)/scripts/module-common.lds
    CFLAGS_KERNEL =
    AFLAGS_KERNEL =
    CFLAGS_GCOV = -fprofile-arcs -ftest-coverage


    # Use LINUXINCLUDE when you must reference the include/ directory.
    # Needed to be compatible with the O= option
    LINUXINCLUDE := -I$(srctree)/arch/$(hdr-arch)/include -Iinclude \
    $(if $(KBUILD_SRC), -I$(srctree)/include) \
    -include include/generated/autoconf.h

    KBUILD_CPPFLAGS := -D__KERNEL__

    KBUILD_CFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
    -fno-strict-aliasing -fno-common \
    -Werror-implicit-function-declaration \
    -Wno-format-security \
    -fno-delete-null-pointer-checks
    KBUILD_AFLAGS := -D__ASSEMBLY__

    # Read KERNELRELEASE from include/config/kernel.release (if it exists)
    KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null)
    KERNELVERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)

    export VERSION PATCHLEVEL SUBLEVEL KERNELRELEASE KERNELVERSION
    export ARCH SRCARCH CONFIG_SHELL HOSTCC HOSTCFLAGS CROSS_COMPILE AS LD CC
    export CPP AR NM STRIP OBJCOPY OBJDUMP
    export MAKE AWK GENKSYMS INSTALLKERNEL PERL UTS_MACHINE
    export HOSTCXX HOSTCXXFLAGS LDFLAGS_MODULE CHECK CHECKFLAGS

    export KBUILD_CPPFLAGS NOSTDINC_FLAGS LINUXINCLUDE OBJCOPYFLAGS LDFLAGS
    export KBUILD_CFLAGS CFLAGS_KERNEL CFLAGS_MODULE CFLAGS_GCOV
    export KBUILD_AFLAGS AFLAGS_KERNEL AFLAGS_MODULE

    # When compiling out-of-tree modules, put MODVERDIR in the module
    # tree rather than in the kernel tree. The kernel tree might
    # even be read-only.
    export MODVERDIR := $(if $(KBUILD_EXTMOD),$(firstword $(KBUILD_EXTMOD))/).tmp_versions

    # Files to ignore in find ... statements

    RCS_FIND_IGNORE := \( -name SCCS -o -name BitKeeper -o -name .svn -o -name CVS -o -name .pc -o -name .hg -o -name .git \) -prune -o
    export RCS_TAR_IGNORE := --exclude SCCS --exclude BitKeeper --exclude .svn --exclude CVS --exclude .pc --exclude .hg --exclude .git

    # ===========================================================================
    # Rules shared between *config targets and build targets

    # Basic helpers built in scripts/
    PHONY += scripts_basic
    scripts_basic:
    $(Q)$(MAKE) $(build)=scripts/basic
    $(Q)rm -f .tmp_quiet_recordmcount

    # To avoid any implicit rule to kick in, define an empty command.
    scripts/basic/%: scripts_basic ;

    PHONY += outputmakefile
    # outputmakefile generates a Makefile in the output directory, if using a
    # separate output directory. This allows convenient use of make in the
    # output directory.
    outputmakefile:
    ifneq ($(KBUILD_SRC),)
    $(Q)ln -fsn $(srctree) source
    $(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkmakefile \
    $(srctree) $(objtree) $(VERSION) $(PATCHLEVEL)
    endif

    # To make sure we do not include .config for any of the *config targets
    # catch them early, and hand them over to scripts/kconfig/Makefile
    # It is allowed to specify more targets when calling make, including
    # mixing *config targets and build targets.
    # For example 'make oldconfig all'.
    # Detect when mixed targets is specified, and make a second invocation
    # of make so .config is not included in this case either (for *config).

    no-dot-config-targets := clean mrproper distclean \
    cscope TAGS tags help %docs check% \
    include/linux/version.h headers_% \
    kernelrelease kernelversion

    config-targets := 0
    mixed-targets := 0
    dot-config := 1

    ifneq ($(filter $(no-dot-config-targets), $(MAKECMDGOALS)),)
    ifeq ($(filter-out $(no-dot-config-targets), $(MAKECMDGOALS)),)
    dot-config := 0
    endif
    endif

    ifeq ($(KBUILD_EXTMOD),)
    ifneq ($(filter config %config,$(MAKECMDGOALS)),)
    config-targets := 1
    ifneq ($(filter-out config %config,$(MAKECMDGOALS)),)
    mixed-targets := 1
    endif
    endif
    endif

    ifeq ($(mixed-targets),1)
    # ===========================================================================
    # We're called with mixed targets (*config and build targets).
    # Handle them one by one.

    %:: FORCE
    $(Q)$(MAKE) -C $(srctree) KBUILD_SRC= $@

    else
    ifeq ($(config-targets),1)
    # ===========================================================================
    # *config targets only - make sure prerequisites are updated, and descend
    # in scripts/kconfig to make the *config target

    # Read arch specific Makefile to set KBUILD_DEFCONFIG as needed.
    # KBUILD_DEFCONFIG may point out an alternative default configuration
    # used for 'make defconfig'
    include $(srctree)/arch/$(SRCARCH)/Makefile
    export KBUILD_DEFCONFIG KBUILD_KCONFIG

    config: scripts_basic outputmakefile FORCE
    $(Q)mkdir -p include/linux include/config
    $(Q)$(MAKE) $(build)=scripts/kconfig $@

    %config: scripts_basic outputmakefile FORCE
    $(Q)mkdir -p include/linux include/config
    $(Q)$(MAKE) $(build)=scripts/kconfig $@

    else
    # ===========================================================================
    # Build targets only - this includes vmlinux, arch specific targets, clean
    # targets and others. In general all targets except *config targets.

    ifeq ($(KBUILD_EXTMOD),)
    # Additional helpers built in scripts/
    # Carefully list dependencies so we do not try to build scripts twice
    # in parallel
    PHONY += scripts
    scripts: scripts_basic include/config/auto.conf include/config/tristate.conf
    $(Q)$(MAKE) $(build)=$(@)

    # Objects we will link into vmlinux / subdirs we need to visit
    init-y := init/
    drivers-y := drivers/ sound/ firmware/
    net-y := net/
    libs-y := lib/
    core-y := usr/
    endif # KBUILD_EXTMOD

    ifeq ($(dot-config),1)
    # Read in config
    -include include/config/auto.conf

    ifeq ($(KBUILD_EXTMOD),)
    # Read in dependencies to all Kconfig* files, make sure to run
    # oldconfig if changes are detected.
    -include include/config/auto.conf.cmd

    # To avoid any implicit rule to kick in, define an empty command
    $(KCONFIG_CONFIG) include/config/auto.conf.cmd: ;

    # If .config is newer than include/config/auto.conf, someone tinkered
    # with it and forgot to run make oldconfig.
    # if auto.conf.cmd is missing then we are probably in a cleaned tree so
    # we execute the config step to be sure to catch updated Kconfig files
    include/config/%.conf: $(KCONFIG_CONFIG) include/config/auto.conf.cmd
    $(Q)$(MAKE) -f $(srctree)/Makefile silentoldconfig
    else
    # external modules needs include/generated/autoconf.h and include/config/auto.conf
    # but do not care if they are up-to-date. Use auto.conf to trigger the test
    PHONY += include/config/auto.conf

    include/config/auto.conf:
    $(Q)test -e include/generated/autoconf.h -a -e $@ || ( \
    echo; \
    echo " ERROR: Kernel configuration is invalid."; \
    echo " include/generated/autoconf.h or $@ are missing.";\
    echo " Run 'make oldconfig && make prepare' on kernel src to fix it."; \
    echo; \
    /bin/false)

    endif # KBUILD_EXTMOD

    else
    # Dummy target needed, because used as prerequisite
    include/config/auto.conf: ;
    endif # $(dot-config)

    # The all: target is the default when no target is given on the
    # command line.
    # This allow a user to issue only 'make' to build a kernel including modules
    # Defaults vmlinux but it is usually overridden in the arch makefile
    all: vmlinux

    ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
    KBUILD_CFLAGS += -Os
    else
    KBUILD_CFLAGS += -O2
    endif

    include $(srctree)/arch/$(SRCARCH)/Makefile

    ifneq ($(CONFIG_FRAME_WARN),0)
    KBUILD_CFLAGS += $(call cc-option,-Wframe-larger-than=${CONFIG_FRAME_WARN})
    endif

    # Force gcc to behave correct even for buggy distributions
    ifndef CONFIG_CC_STACKPROTECTOR
    KBUILD_CFLAGS += $(call cc-option, -fno-stack-protector)
    endif

    ifdef CONFIG_FRAME_POINTER
    KBUILD_CFLAGS += -fno-omit-frame-pointer -fno-optimize-sibling-calls
    else
    KBUILD_CFLAGS += -fomit-frame-pointer
    endif

    ifdef CONFIG_DEBUG_INFO
    KBUILD_CFLAGS += -g
    KBUILD_AFLAGS += -gdwarf-2
    endif

    ifdef CONFIG_FUNCTION_TRACER
    KBUILD_CFLAGS += -pg
    endif

    # We trigger additional mismatches with less inlining
    ifdef CONFIG_DEBUG_SECTION_MISMATCH
    KBUILD_CFLAGS += $(call cc-option, -fno-inline-functions-called-once)
    endif

    # arch Makefile may override CC so keep this after arch Makefile is included
    NOSTDINC_FLAGS += -nostdinc -isystem $(shell $(CC) -print-file-name=include)
    CHECKFLAGS += $(NOSTDINC_FLAGS)

    # warn about C99 declaration after statement
    KBUILD_CFLAGS += $(call cc-option,-Wdeclaration-after-statement,)

    # disable pointer signed / unsigned warnings in gcc 4.0
    KBUILD_CFLAGS += $(call cc-option,-Wno-pointer-sign,)

    # disable invalid "can't wrap" optimizations for signed / pointers
    KBUILD_CFLAGS += $(call cc-option,-fno-strict-overflow)

    # revert to pre-gcc-4.4 behaviour of .eh_frame
    KBUILD_CFLAGS += $(call cc-option,-fno-dwarf2-cfi-asm)

    # conserve stack if available
    KBUILD_CFLAGS += $(call cc-option,-fconserve-stack)

    # Add user supplied CPPFLAGS, AFLAGS and CFLAGS as the last assignments
    # But warn user when we do so
    warn-assign = \
    $(warning "WARNING: Appending $$K$(1) ($(K$(1))) from $(origin K$(1)) to kernel $$$(1)")

    ifneq ($(KCPPFLAGS),)
    $(call warn-assign,CPPFLAGS)
    KBUILD_CPPFLAGS += $(KCPPFLAGS)
    endif
    ifneq ($(KAFLAGS),)
    $(call warn-assign,AFLAGS)
    KBUILD_AFLAGS += $(KAFLAGS)
    endif
    ifneq ($(KCFLAGS),)
    $(call warn-assign,CFLAGS)
    KBUILD_CFLAGS += $(KCFLAGS)
    endif

    # Use --build-id when available.
    LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,\
    $(call cc-ldoption, -Wl$(comma)--build-id,))
    LDFLAGS_MODULE += $(LDFLAGS_BUILD_ID)
    LDFLAGS_vmlinux += $(LDFLAGS_BUILD_ID)

    ifeq ($(CONFIG_STRIP_ASM_SYMS),y)
    LDFLAGS_vmlinux += $(call ld-option, -X,)
    endif

    # Default kernel image to build when no specific target is given.
    # KBUILD_IMAGE may be overruled on the command line or
    # set in the environment
    # Also any assignments in arch/$(ARCH)/Makefile take precedence over
    # this default value
    export KBUILD_IMAGE ?= vmlinux

    #
    # INSTALL_PATH specifies where to place the updated kernel and system map
    # images. Default is /boot, but you can set it to other values
    export INSTALL_PATH ?= /boot

    #
    # INSTALL_MOD_PATH specifies a prefix to MODLIB for module directory
    # relocations required by build roots. This is not defined in the
    # makefile but the argument can be passed to make if needed.
    #

    MODLIB = $(INSTALL_MOD_PATH)/lib/modules/$(KERNELRELEASE)
    export MODLIB

    #
    # INSTALL_MOD_STRIP, if defined, will cause modules to be
    # stripped after they are installed. If INSTALL_MOD_STRIP is '1', then
    # the default option --strip-debug will be used. Otherwise,
    # INSTALL_MOD_STRIP will used as the options to the strip command.

    ifdef INSTALL_MOD_STRIP
    ifeq ($(INSTALL_MOD_STRIP),1)
    mod_strip_cmd = $(STRIP) --strip-debug
    else
    mod_strip_cmd = $(STRIP) $(INSTALL_MOD_STRIP)
    endif # INSTALL_MOD_STRIP=1
    else
    mod_strip_cmd = true
    endif # INSTALL_MOD_STRIP
    export mod_strip_cmd


    ifeq ($(KBUILD_EXTMOD),)
    core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/

    vmlinux-dirs := $(patsubst %/,%,$(filter %/, $(init-y) $(init-m) \
    $(core-y) $(core-m) $(drivers-y) $(drivers-m) \
    $(net-y) $(net-m) $(libs-y) $(libs-m)))

    vmlinux-alldirs := $(sort $(vmlinux-dirs) $(patsubst %/,%,$(filter %/, \
    $(init-n) $(init-) \
    $(core-n) $(core-) $(drivers-n) $(drivers-) \
    $(net-n) $(net-) $(libs-n) $(libs-))))

    init-y := $(patsubst %/, %/built-in.o, $(init-y))
    core-y := $(patsubst %/, %/built-in.o, $(core-y))
    drivers-y := $(patsubst %/, %/built-in.o, $(drivers-y))
    net-y := $(patsubst %/, %/built-in.o, $(net-y))
    libs-y1 := $(patsubst %/, %/lib.a, $(libs-y))
    libs-y2 := $(patsubst %/, %/built-in.o, $(libs-y))
    libs-y := $(libs-y1) $(libs-y2)

    # Build vmlinux
    # ---------------------------------------------------------------------------
    # vmlinux is built from the objects selected by $(vmlinux-init) and
    # $(vmlinux-main). Most are built-in.o files from top-level directories
    # in the kernel tree, others are specified in arch/$(ARCH)/Makefile.
    # Ordering when linking is important, and $(vmlinux-init) must be first.
    #
    # vmlinux
    # ^
    # |
    # +-< $(vmlinux-init)
    # | +--< init/version.o + more
    # |
    # +--< $(vmlinux-main)
    # | +--< driver/built-in.o mm/built-in.o + more
    # |
    # +-< kallsyms.o (see description in CONFIG_KALLSYMS section)
    #
    # vmlinux version (uname -v) cannot be updated during normal
    # descending-into-subdirs phase since we do not yet know if we need to
    # update vmlinux.
    # Therefore this step is delayed until just before final link of vmlinux -
    # except in the kallsyms case where it is done just before adding the
    # symbols to the kernel.
    #
    # System.map is generated to document addresses of all kernel symbols

    vmlinux-init := $(head-y) $(init-y)
    vmlinux-main := $(core-y) $(libs-y) $(drivers-y) $(net-y)
    vmlinux-all := $(vmlinux-init) $(vmlinux-main)
    vmlinux-lds := arch/$(SRCARCH)/kernel/vmlinux.lds
    export KBUILD_VMLINUX_OBJS := $(vmlinux-all)

    # Rule to link vmlinux - also used during CONFIG_KALLSYMS
    # May be overridden by arch/$(ARCH)/Makefile
    quiet_cmd_vmlinux__ ?= LD $@
    cmd_vmlinux__ ?= $(LD) $(LDFLAGS) $(LDFLAGS_vmlinux) -o $@ \
    -T $(vmlinux-lds) $(vmlinux-init) \
    --start-group $(vmlinux-main) --end-group \
    $(filter-out $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) vmlinux.o FORCE ,$^)

    # Generate new vmlinux version
    quiet_cmd_vmlinux_version = GEN .version
    cmd_vmlinux_version = set -e; \
    if [ ! -r .version ]; then \
    rm -f .version; \
    echo 1 >.version; \
    else \
    mv .version .old_version; \
    expr 0$$(cat .old_version) + 1 >.version; \
    fi; \
    $(MAKE) $(build)=init

    # Generate System.map
    quiet_cmd_sysmap = SYSMAP
    cmd_sysmap = $(CONFIG_SHELL) $(srctree)/scripts/mksysmap

    # Link of vmlinux
    # If CONFIG_KALLSYMS is set .version is already updated
    # Generate System.map and verify that the content is consistent
    # Use + in front of the vmlinux_version rule to silent warning with make -j2
    # First command is ':' to allow us to use + in front of the rule
    define rule_vmlinux__
    :
    $(if $(CONFIG_KALLSYMS),,+$(call cmd,vmlinux_version))

    $(call cmd,vmlinux__)
    $(Q)echo 'cmd_$@ := $(cmd_vmlinux__)' > $(@D)/.$(@F).cmd

    $(Q)$(if $($(quiet)cmd_sysmap), \
    echo ' $($(quiet)cmd_sysmap) System.map' &&) \
    $(cmd_sysmap) $@ System.map; \
    if [ $$? -ne 0 ]; then \
    rm -f $@; \
    /bin/false; \
    fi;
    $(verify_kallsyms)
    endef


    ifdef CONFIG_KALLSYMS
    # Generate section listing all symbols and add it into vmlinux $(kallsyms.o)
    # It's a three stage process:
    # o .tmp_vmlinux1 has all symbols and sections, but __kallsyms is
    # empty
    # Running kallsyms on that gives us .tmp_kallsyms1.o with
    # the right size - vmlinux version (uname -v) is updated during this step
    # o .tmp_vmlinux2 now has a __kallsyms section of the right size,
    # but due to the added section, some addresses have shifted.
    # From here, we generate a correct .tmp_kallsyms2.o
    # o The correct .tmp_kallsyms2.o is linked into the final vmlinux.
    # o Verify that the System.map from vmlinux matches the map from
    # .tmp_vmlinux2, just in case we did not generate kallsyms correctly.
    # o If CONFIG_KALLSYMS_EXTRA_PASS is set, do an extra pass using
    # .tmp_vmlinux3 and .tmp_kallsyms3.o. This is only meant as a
    # temporary bypass to allow the kernel to be built while the
    # maintainers work out what went wrong with kallsyms.

    ifdef CONFIG_KALLSYMS_EXTRA_PASS
    last_kallsyms := 3
    else
    last_kallsyms := 2
    endif

    kallsyms.o := .tmp_kallsyms$(last_kallsyms).o

    define verify_kallsyms
    $(Q)$(if $($(quiet)cmd_sysmap), \
    echo ' $($(quiet)cmd_sysmap) .tmp_System.map' &&) \
    $(cmd_sysmap) .tmp_vmlinux$(last_kallsyms) .tmp_System.map
    $(Q)cmp -s System.map .tmp_System.map || \
    (echo Inconsistent kallsyms data; \
    echo Try setting CONFIG_KALLSYMS_EXTRA_PASS; \
    rm .tmp_kallsyms* ; /bin/false )
    endef

    # Update vmlinux version before link
    # Use + in front of this rule to silent warning about make -j1
    # First command is ':' to allow us to use + in front of this rule
    cmd_ksym_ld = $(cmd_vmlinux__)
    define rule_ksym_ld
    :
    +$(call cmd,vmlinux_version)
    $(call cmd,vmlinux__)
    $(Q)echo 'cmd_$@ := $(cmd_vmlinux__)' > $(@D)/.$(@F).cmd
    endef

    # Generate .S file with all kernel symbols
    quiet_cmd_kallsyms = KSYM $@
    cmd_kallsyms = $(NM) -n $< | $(KALLSYMS) \
    $(if $(CONFIG_KALLSYMS_ALL),--all-symbols) > $@

    .tmp_kallsyms1.o .tmp_kallsyms2.o .tmp_kallsyms3.o: %.o: %.S scripts FORCE
    $(call if_changed_dep,as_o_S)

    .tmp_kallsyms%.S: .tmp_vmlinux% $(KALLSYMS)
    $(call cmd,kallsyms)

    # .tmp_vmlinux1 must be complete except kallsyms, so update vmlinux version
    .tmp_vmlinux1: $(vmlinux-lds) $(vmlinux-all) FORCE
    $(call if_changed_rule,ksym_ld)

    .tmp_vmlinux2: $(vmlinux-lds) $(vmlinux-all) .tmp_kallsyms1.o FORCE
    $(call if_changed,vmlinux__)

    .tmp_vmlinux3: $(vmlinux-lds) $(vmlinux-all) .tmp_kallsyms2.o FORCE
    $(call if_changed,vmlinux__)

    # Needs to visit scripts/ before $(KALLSYMS) can be used.
    $(KALLSYMS): scripts ;

    # Generate some data for debugging strange kallsyms problems
    debug_kallsyms: .tmp_map$(last_kallsyms)

    .tmp_map%: .tmp_vmlinux% FORCE
    ($(OBJDUMP) -h $< | $(AWK) '/^ +[0-9]/{print $$4 " 0 " $$2}'; $(NM) $<) | sort > $@

    .tmp_map3: .tmp_map2

    .tmp_map2: .tmp_map1

    endif # ifdef CONFIG_KALLSYMS

    # Do modpost on a prelinked vmlinux. The finally linked vmlinux has
    # relevant sections renamed as per the linker script.
    quiet_cmd_vmlinux-modpost = LD $@
    cmd_vmlinux-modpost = $(LD) $(LDFLAGS) -r -o $@ \
    $(vmlinux-init) --start-group $(vmlinux-main) --end-group \
    $(filter-out $(vmlinux-init) $(vmlinux-main) FORCE ,$^)
    define rule_vmlinux-modpost
    :
    +$(call cmd,vmlinux-modpost)
    $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost $@
    $(Q)echo 'cmd_$@ := $(cmd_vmlinux-modpost)' > $(dot-target).cmd
    endef

    # vmlinux image - including updated kernel symbols
    vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) vmlinux.o $(kallsyms.o) FORCE
    ifdef CONFIG_HEADERS_CHECK
    $(Q)$(MAKE) -f $(srctree)/Makefile headers_check
    endif
    ifdef CONFIG_SAMPLES
    $(Q)$(MAKE) $(build)=samples
    endif
    ifdef CONFIG_BUILD_DOCSRC
    $(Q)$(MAKE) $(build)=Documentation
    endif
    $(call vmlinux-modpost)
    $(call if_changed_rule,vmlinux__)
    $(Q)rm -f .old_version

    # build vmlinux.o first to catch section mismatch errors early
    ifdef CONFIG_KALLSYMS
    .tmp_vmlinux1: vmlinux.o
    endif

    modpost-init := $(filter-out init/built-in.o, $(vmlinux-init))
    vmlinux.o: $(modpost-init) $(vmlinux-main) FORCE
    $(call if_changed_rule,vmlinux-modpost)

    # The actual objects are generated when descending,
    # make sure no implicit rule kicks in
    $(sort $(vmlinux-init) $(vmlinux-main)) $(vmlinux-lds): $(vmlinux-dirs) ;

    # Handle descending into subdirectories listed in $(vmlinux-dirs)
    # Preset locale variables to speed up the build process. Limit locale
    # tweaks to this spot to avoid wrong language settings when running
    # make menuconfig etc.
    # Error messages still appears in the original language

    PHONY += $(vmlinux-dirs)
    $(vmlinux-dirs): prepare scripts
    $(Q)$(MAKE) $(build)=$@
    ifdef CONFIG_MODULES
    $(Q)$(MAKE) $(modbuiltin)=$@
    endif

    # Build the kernel release string
    #
    # The KERNELRELEASE value built here is stored in the file
    # include/config/kernel.release, and is used when executing several
    # make targets, such as "make install" or "make modules_install."
    #
    # The eventual kernel release string consists of the following fields,
    # shown in a hierarchical format to show how smaller parts are concatenated
    # to form the larger and final value, with values coming from places like
    # the Makefile, kernel config options, make command line options and/or
    # SCM tag information.
    #
    # $(KERNELVERSION)
    # $(VERSION) eg, 2
    # $(PATCHLEVEL) eg, 6
    # $(SUBLEVEL) eg, 18
    # $(EXTRAVERSION) eg, -rc6
    # $(localver-full)
    # $(localver)
    # localversion* (files without backups, containing '~')
    # $(CONFIG_LOCALVERSION) (from kernel config setting)
    # $(localver-auto) (only if CONFIG_LOCALVERSION_AUTO is set)
    # ./scripts/setlocalversion (SCM tag, if one exists)
    # $(LOCALVERSION) (from make command line if provided)
    #
    # Note how the final $(localver-auto) string is included *only* if the
    # kernel config option CONFIG_LOCALVERSION_AUTO is selected. Also, at the
    # moment, only git is supported but other SCMs can edit the script
    # scripts/setlocalversion and add the appropriate checks as needed.

    pattern = ".*/localversion[^~]*"
    string = $(shell cat /dev/null \
    `find $(objtree) $(srctree) -maxdepth 1 -regex $(pattern) | sort -u`)

    localver = $(subst $(space),, $(string) \
    $(patsubst "%",%,$(CONFIG_LOCALVERSION)))

    # If CONFIG_LOCALVERSION_AUTO is set scripts/setlocalversion is called
    # and if the SCM is know a tag from the SCM is appended.
    # The appended tag is determined by the SCM used.
    #
    # .scmversion is used when generating rpm packages so we do not loose
    # the version information from the SCM when we do the build of the kernel
    # from the copied source
    ifdef CONFIG_LOCALVERSION_AUTO

    ifeq ($(wildcard .scmversion),)
    _localver-auto = $(shell $(CONFIG_SHELL) \
    $(srctree)/scripts/setlocalversion $(srctree))
    else
    _localver-auto = $(shell cat .scmversion 2> /dev/null)
    endif

    localver-auto = $(LOCALVERSION)$(_localver-auto)
    endif

    localver-full = $(localver)$(localver-auto)

    # Store (new) KERNELRELASE string in include/config/kernel.release
    kernelrelease = $(KERNELVERSION)$(localver-full)
    include/config/kernel.release: include/config/auto.conf FORCE
    $(Q)rm -f $@
    $(Q)echo $(kernelrelease) > $@


    # Things we need to do before we recursively start building the kernel
    # or the modules are listed in "prepare".
    # A multi level approach is used. prepareN is processed before prepareN-1.
    # archprepare is used in arch Makefiles and when processed asm symlink,
    # version.h and scripts_basic is processed / created.

    # Listed in dependency order
    PHONY += prepare archprepare prepare0 prepare1 prepare2 prepare3

    # prepare3 is used to check if we are building in a separate output directory,
    # and if so do:
    # 1) Check that make has not been executed in the kernel src $(srctree)
    prepare3: include/config/kernel.release
    ifneq ($(KBUILD_SRC),)
    @$(kecho) ' Using $(srctree) as source for kernel'
    $(Q)if [ -f $(srctree)/.config -o -d $(srctree)/include/config ]; then \
    echo " $(srctree) is not clean, please run 'make mrproper'";\
    echo " in the '$(srctree)' directory.";\
    /bin/false; \
    fi;
    endif

    # prepare2 creates a makefile if using a separate output directory
    prepare2: prepare3 outputmakefile

    prepare1: prepare2 include/linux/version.h include/generated/utsrelease.h \
    include/config/auto.conf
    $(cmd_crmodverdir)

    archprepare: prepare1 scripts_basic

    prepare0: archprepare FORCE
    $(Q)$(MAKE) $(build)=.
    $(Q)$(MAKE) $(build)=. missing-syscalls

    # All the preparing..
    prepare: prepare0

    # Generate some files
    # ---------------------------------------------------------------------------

    # KERNELRELEASE can change from a few different places, meaning version.h
    # needs to be updated, so this check is forced on all builds

    uts_len := 64
    define filechk_utsrelease.h
    if [ `echo -n "$(KERNELRELEASE)" | wc -c ` -gt $(uts_len) ]; then \
    echo '"$(KERNELRELEASE)" exceeds $(uts_len) characters' >&2; \
    exit 1; \
    fi; \
    (echo \#define UTS_RELEASE \"$(KERNELRELEASE)\";)
    endef

    define filechk_version.h
    (echo \#define LINUX_VERSION_CODE $(shell \
    expr $(VERSION) \* 65536 + $(PATCHLEVEL) \* 256 + $(SUBLEVEL)); \
    echo '#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))';)
    endef

    include/linux/version.h: $(srctree)/Makefile FORCE
    $(call filechk,version.h)

    include/generated/utsrelease.h: include/config/kernel.release FORCE
    $(call filechk,utsrelease.h)

    PHONY += headerdep
    headerdep:
    $(Q)find include/ -name '*.h' | xargs --max-args 1 scripts/headerdep.pl

    # ---------------------------------------------------------------------------

    PHONY += depend dep
    depend dep:
    @echo '*** Warning: make $@ is unnecessary now.'

    # ---------------------------------------------------------------------------
    # Firmware install
    INSTALL_FW_PATH=$(INSTALL_MOD_PATH)/lib/firmware
    export INSTALL_FW_PATH

    PHONY += firmware_install
    firmware_install: FORCE
    @mkdir -p $(objtree)/firmware
    $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.fwinst obj=firmware __fw_install

    # ---------------------------------------------------------------------------
    # Kernel headers

    #Default location for installed headers
    export INSTALL_HDR_PATH = $(objtree)/usr

    hdr-inst := -rR -f $(srctree)/scripts/Makefile.headersinst obj

    # If we do an all arch process set dst to asm-$(hdr-arch)
    hdr-dst = $(if $(KBUILD_HEADERS), dst=include/asm-$(hdr-arch), dst=include/asm)

    PHONY += __headers
    __headers: include/linux/version.h scripts_basic FORCE
    $(Q)$(MAKE) $(build)=scripts scripts/unifdef

    PHONY += headers_install_all
    headers_install_all:
    $(Q)$(CONFIG_SHELL) $(srctree)/scripts/headers.sh install

    PHONY += headers_install
    headers_install: __headers
    $(if $(wildcard $(srctree)/arch/$(hdr-arch)/include/asm/Kbuild),, \
    $(error Headers not exportable for the $(SRCARCH) architecture))
    $(Q)$(MAKE) $(hdr-inst)=include
    $(Q)$(MAKE) $(hdr-inst)=arch/$(hdr-arch)/include/asm $(hdr-dst)

    PHONY += headers_check_all
    headers_check_all: headers_install_all
    $(Q)$(CONFIG_SHELL) $(srctree)/scripts/headers.sh check

    PHONY += headers_check
    headers_check: headers_install
    $(Q)$(MAKE) $(hdr-inst)=include HDRCHECK=1
    $(Q)$(MAKE) $(hdr-inst)=arch/$(hdr-arch)/include/asm $(hdr-dst) HDRCHECK=1

    # ---------------------------------------------------------------------------
    # Modules

    ifdef CONFIG_MODULES

    # By default, build modules as well

    all: modules

    # Build modules
    #
    # A module can be listed more than once in obj-m resulting in
    # duplicate lines in modules.order files. Those are removed
    # using awk while concatenating to the final file.

    PHONY += modules
    modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux)
    $(Q)$(AWK) '!x[$$0]++' $(vmlinux-dirs:%=$(objtree)/%/modules.order) > $(objtree)/modules.order
    $(Q)$(AWK) '!x[$$0]++' $(vmlinux-dirs:%=$(objtree)/%/modules.builtin) > $(objtree)/modules.builtin
    @$(kecho) ' Building modules, stage 2.';
    $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
    $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.fwinst obj=firmware __fw_modbuild


    # Target to prepare building external modules
    PHONY += modules_prepare
    modules_prepare: prepare scripts

    # Target to install modules
    PHONY += modules_install
    modules_install: _modinst_ _modinst_post

    PHONY += _modinst_
    _modinst_:
    @if [ -z "`$(DEPMOD) -V 2>/dev/null | grep module-init-tools`" ]; then \
    echo "Warning: you may need to install module-init-tools"; \
    echo "See http://www.codemonkey.org.uk/docs/post-halloween-2.6.txt";\
    sleep 1; \
    fi
    @rm -rf $(MODLIB)/kernel
    @rm -f $(MODLIB)/source
    @mkdir -p $(MODLIB)/kernel
    @ln -s $(srctree) $(MODLIB)/source
    @if [ ! $(objtree) -ef $(MODLIB)/build ]; then \
    rm -f $(MODLIB)/build ; \
    ln -s $(objtree) $(MODLIB)/build ; \
    fi
    @cp -f $(objtree)/modules.order $(MODLIB)/
    @cp -f $(objtree)/modules.builtin $(MODLIB)/
    $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modinst

    # This depmod is only for convenience to give the initial
    # boot a modules.dep even before / is mounted read-write. However the
    # boot script depmod is the master version.
    PHONY += _modinst_post
    _modinst_post: _modinst_
    $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.fwinst obj=firmware __fw_modinst
    $(call cmd,depmod)

    else # CONFIG_MODULES

    # Modules not configured
    # ---------------------------------------------------------------------------

    modules modules_install: FORCE
    @echo
    @echo "The present kernel configuration has modules disabled."
    @echo "Type 'make config' and enable loadable module support."
    @echo "Then build a kernel with module support enabled."
    @echo
    @exit 1

    endif # CONFIG_MODULES

    ###
    # Cleaning is done on three levels.
    # make clean Delete most generated files
    # Leave enough to build external modules
    # make mrproper Delete the current configuration, and all generated files
    # make distclean Remove editor backup files, patch leftover files and the like

    # Directories & files removed with 'make clean'
    CLEAN_DIRS += $(MODVERDIR)
    CLEAN_FILES += vmlinux System.map \
    .tmp_kallsyms* .tmp_version .tmp_vmlinux* .tmp_System.map

    # Directories & files removed with 'make mrproper'
    MRPROPER_DIRS += include/config usr/include include/generated
    MRPROPER_FILES += .config .config.old .version .old_version \
    include/linux/version.h \
    Module.symvers tags TAGS cscope*

    # clean - Delete most, but leave enough to build external modules
    #
    clean: rm-dirs := $(CLEAN_DIRS)
    clean: rm-files := $(CLEAN_FILES)
    clean-dirs := $(addprefix _clean_,$(srctree) $(vmlinux-alldirs) Documentation)

    PHONY += $(clean-dirs) clean archclean
    $(clean-dirs):
    $(Q)$(MAKE) $(clean)=$(patsubst _clean_%,%,$@)

    clean: archclean $(clean-dirs)
    $(call cmd,rmdirs)
    $(call cmd,rmfiles)
    @find . $(RCS_FIND_IGNORE) \
    \( -name '*.[oas]' -o -name '*.ko' -o -name '.*.cmd' \
    -o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \
    -o -name '*.symtypes' -o -name 'modules.order' \
    -o -name modules.builtin -o -name '.tmp_*.o.*' \
    -o -name '*.gcno' \) -type f -print | xargs rm -f

    # mrproper - Delete all generated files, including .config
    #
    mrproper: rm-dirs := $(wildcard $(MRPROPER_DIRS))
    mrproper: rm-files := $(wildcard $(MRPROPER_FILES))
    mrproper-dirs := $(addprefix _mrproper_,Documentation/DocBook scripts)

    PHONY += $(mrproper-dirs) mrproper archmrproper
    $(mrproper-dirs):
    $(Q)$(MAKE) $(clean)=$(patsubst _mrproper_%,%,$@)

    mrproper: clean archmrproper $(mrproper-dirs)
    $(call cmd,rmdirs)
    $(call cmd,rmfiles)

    # distclean
    #
    PHONY += distclean

    distclean: mrproper
    @find $(srctree) $(RCS_FIND_IGNORE) \
    \( -name '*.orig' -o -name '*.rej' -o -name '*~' \
    -o -name '*.bak' -o -name '#*#' -o -name '.*.orig' \
    -o -name '.*.rej' -o -size 0 \
    -o -name '*%' -o -name '.*.cmd' -o -name 'core' \) \
    -type f -print | xargs rm -f


    # Packaging of the kernel to various formats
    # ---------------------------------------------------------------------------
    # rpm target kept for backward compatibility
    package-dir := $(srctree)/scripts/package

    %pkg: include/config/kernel.release FORCE
    $(Q)$(MAKE) $(build)=$(package-dir) $@
    rpm: include/config/kernel.release FORCE
    $(Q)$(MAKE) $(build)=$(package-dir) $@


    # Brief documentation of the typical targets used
    # ---------------------------------------------------------------------------

    boards := $(wildcard $(srctree)/arch/$(SRCARCH)/configs/*_defconfig)
    boards := $(notdir $(boards))
    board-dirs := $(dir $(wildcard $(srctree)/arch/$(SRCARCH)/configs/*/*_defconfig))
    board-dirs := $(sort $(notdir $(board-dirs:/=)))

    help:
    @echo 'Cleaning targets:'
    @echo ' clean - Remove most generated files but keep the config and'
    @echo ' enough build support to build external modules'
    @echo ' mrproper - Remove all generated files + config + various backup files'
    @echo ' distclean - mrproper + remove editor backup and patch files'
    @echo ''
    @echo 'Configuration targets:'
    @$(MAKE) -f $(srctree)/scripts/kconfig/Makefile help
    @echo ''
    @echo 'Other generic targets:'
    @echo ' all - Build all targets marked with • '
    @echo '* vmlinux - Build the bare kernel'
    @echo '* modules - Build all modules'
    @echo ' modules_install - Install all modules to INSTALL_MOD_PATH (default: /)'
    @echo ' firmware_install- Install all firmware to INSTALL_FW_PATH'
    @echo ' (default: $$(INSTALL_MOD_PATH)/lib/firmware)'
    @echo ' dir/ - Build all files in dir and below'
    @echo ' dir/file.[ois] - Build specified target only'
    @echo ' dir/file.ko - Build module including final link'
    @echo ' modules_prepare - Set up for building external modules'
    @echo ' tags/TAGS - Generate tags file for editors'
    @echo ' cscope - Generate cscope index'
    @echo ' kernelrelease - Output the release version string'
    @echo ' kernelversion - Output the version stored in Makefile'
    @echo ' headers_install - Install sanitised kernel headers to INSTALL_HDR_PATH'; \
    echo ' (default: $(INSTALL_HDR_PATH))'; \
    echo ''
    @echo 'Static analysers'
    @echo ' checkstack - Generate a list of stack hogs'
    @echo ' namespacecheck - Name space analysis on compiled kernel'
    @echo ' versioncheck - Sanity check on version.h usage'
    @echo ' includecheck - Check for duplicate included header files'
    @echo ' export_report - List the usages of all exported symbols'
    @echo ' headers_check - Sanity check on exported headers'
    @echo ' headerdep - Detect inclusion cycles in headers'; \
    echo ''
    @echo 'Kernel packaging:'
    @$(MAKE) $(build)=$(package-dir) help
    @echo ''
    @echo 'Documentation targets:'
    @$(MAKE) -f $(srctree)/Documentation/DocBook/Makefile dochelp
    @echo ''
    @echo 'Architecture specific targets ($(SRCARCH)):'
    @$(if $(archhelp),$(archhelp),\
    echo ' No architecture specific help defined for $(SRCARCH)')
    @echo ''
    @$(if $(boards), \
    $(foreach b, $(boards), \
    printf " %-24s - Build for %s\\n" $(b) $(subst _defconfig,,$(b));) \
    echo '')
    @$(if $(board-dirs), \
    $(foreach b, $(board-dirs), \
    printf " %-16s - Show %s-specific targets\\n" help-$(b) $(b);) \
    printf " %-16s - Show all of the above\\n" help-boards; \
    echo '')

    @echo ' make V=0|1 [targets] 0 => quiet build (default), 1 => verbose build'
    @echo ' make V=2 [targets] 2 => give reason for rebuild of target'
    @echo ' make O=dir [targets] Locate all output files in "dir", including .config'
    @echo ' make C=1 [targets] Check all c source with $$CHECK (sparse by default)'
    @echo ' make C=2 [targets] Force check of all c source with $$CHECK'
    @echo ''
    @echo 'Execute "make" or "make all" to build all targets marked with • '
    @echo 'For further info see the ./README file'


    help-board-dirs := $(addprefix help-,$(board-dirs))

    help-boards: $(help-board-dirs)

    boards-per-dir = $(notdir $(wildcard $(srctree)/arch/$(SRCARCH)/configs/$*/*_defconfig))

    $(help-board-dirs): help-%:
    @echo 'Architecture specific targets ($(SRCARCH) $*):'
    @$(if $(boards-per-dir), \
    $(foreach b, $(boards-per-dir), \
    printf " %-24s - Build for %s\\n" $*/$(b) $(subst _defconfig,,$(b));) \
    echo '')


    # Documentation targets
    # ---------------------------------------------------------------------------
    %docs: scripts_basic FORCE
    $(Q)$(MAKE) $(build)=Documentation/DocBook $@

    else # KBUILD_EXTMOD

    ###
    # External module support.
    # When building external modules the kernel used as basis is considered
    # read-only, and no consistency checks are made and the make
    # system is not used on the basis kernel. If updates are required
    # in the basis kernel ordinary make commands (without M=...) must
    # be used.
    #
    # The following are the only valid targets when building external
    # modules.
    # make M=dir clean Delete all automatically generated files
    # make M=dir modules Make all modules in specified dir
    # make M=dir Same as 'make M=dir modules'
    # make M=dir modules_install
    # Install the modules built in the module directory
    # Assumes install directory is already created

    # We are always building modules
    KBUILD_MODULES := 1
    PHONY += crmodverdir
    crmodverdir:
    $(cmd_crmodverdir)

    PHONY += $(objtree)/Module.symvers
    $(objtree)/Module.symvers:
    @test -e $(objtree)/Module.symvers || ( \
    echo; \
    echo " WARNING: Symbol version dump $(objtree)/Module.symvers"; \
    echo " is missing; modules will have no dependencies and modversions."; \
    echo )

    module-dirs := $(addprefix _module_,$(KBUILD_EXTMOD))
    PHONY += $(module-dirs) modules
    $(module-dirs): crmodverdir $(objtree)/Module.symvers
    $(Q)$(MAKE) $(build)=$(patsubst _module_%,%,$@)

    modules: $(module-dirs)
    @$(kecho) ' Building modules, stage 2.';
    $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost

    PHONY += modules_install
    modules_install: _emodinst_ _emodinst_post

    install-dir := $(if $(INSTALL_MOD_DIR),$(INSTALL_MOD_DIR),extra)
    PHONY += _emodinst_
    _emodinst_:
    $(Q)mkdir -p $(MODLIB)/$(install-dir)
    $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modinst

    PHONY += _emodinst_post
    _emodinst_post: _emodinst_
    $(call cmd,depmod)

    clean-dirs := $(addprefix _clean_,$(KBUILD_EXTMOD))

    PHONY += $(clean-dirs) clean
    $(clean-dirs):
    $(Q)$(MAKE) $(clean)=$(patsubst _clean_%,%,$@)

    clean: rm-dirs := $(MODVERDIR)
    clean: rm-files := $(KBUILD_EXTMOD)/Module.symvers \
    $(KBUILD_EXTMOD)/modules.order \
    $(KBUILD_EXTMOD)/modules.builtin
    clean: $(clean-dirs)
    $(call cmd,rmdirs)
    $(call cmd,rmfiles)
    @find $(KBUILD_EXTMOD) $(RCS_FIND_IGNORE) \
    \( -name '*.[oas]' -o -name '*.ko' -o -name '.*.cmd' \
    -o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \
    -o -name '*.gcno' \) -type f -print | xargs rm -f

    help:
    @echo ' Building external modules.'
    @echo ' Syntax: make -C path/to/kernel/src M=$$PWD target'
    @echo ''
    @echo ' modules - default target, build the module(s)'
    @echo ' modules_install - install the module'
    @echo ' clean - remove generated files in module directory only'
    @echo ''

    # Dummies...
    PHONY += prepare scripts
    prepare: ;
    scripts: ;
    endif # KBUILD_EXTMOD

    # Generate tags for editors
    # ---------------------------------------------------------------------------
    quiet_cmd_tags = GEN $@
    cmd_tags = $(CONFIG_SHELL) $(srctree)/scripts/tags.sh $@

    tags TAGS cscope: FORCE
    $(call cmd,tags)

    # Scripts to check various things for consistency
    # ---------------------------------------------------------------------------

    includecheck:
    find * $(RCS_FIND_IGNORE) \
    -name '*.[hcS]' -type f -print | sort \
    | xargs $(PERL) -w $(srctree)/scripts/checkincludes.pl

    versioncheck:
    find * $(RCS_FIND_IGNORE) \
    -name '*.[hcS]' -type f -print | sort \
    | xargs $(PERL) -w $(srctree)/scripts/checkversion.pl

    namespacecheck:
    $(PERL) $(srctree)/scripts/namespace.pl

    export_report:
    $(PERL) $(srctree)/scripts/export_report.pl

    endif #ifeq ($(config-targets),1)
    endif #ifeq ($(mixed-targets),1)

    PHONY += checkstack kernelrelease kernelversion

    # UML needs a little special treatment here. It wants to use the host
    # toolchain, so needs $(SUBARCH) passed to checkstack.pl. Everyone
    # else wants $(ARCH), including people doing cross-builds, which means
    # that $(SUBARCH) doesn't work here.
    ifeq ($(ARCH), um)
    CHECKSTACK_ARCH := $(SUBARCH)
    else
    CHECKSTACK_ARCH := $(ARCH)
    endif
    checkstack:
    $(OBJDUMP) -d vmlinux $$(find . -name '*.ko') | \
    $(PERL) $(src)/scripts/checkstack.pl $(CHECKSTACK_ARCH)

    kernelrelease:
    $(if $(wildcard include/config/kernel.release), $(Q)echo $(KERNELRELEASE), \
    $(error kernelrelease not valid - run 'make prepare' to update it))
    kernelversion:
    @echo $(KERNELVERSION)

    # Single targets
    # ---------------------------------------------------------------------------
    # Single targets are compatible with:
    # - build with mixed source and output
    # - build with separate output dir 'make O=...'
    # - external modules
    #
    # target-dir => where to store outputfile
    # build-dir => directory in kernel source tree to use

    ifeq ($(KBUILD_EXTMOD),)
    build-dir = $(patsubst %/,%,$(dir $@))
    target-dir = $(dir $@)
    else
    zap-slash=$(filter-out .,$(patsubst %/,%,$(dir $@)))
    build-dir = $(KBUILD_EXTMOD)$(if $(zap-slash),/$(zap-slash))
    target-dir = $(if $(KBUILD_EXTMOD),$(dir $<),$(dir $@))
    endif

    %.s: %.c prepare scripts FORCE
    $(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
    %.i: %.c prepare scripts FORCE
    $(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
    %.o: %.c prepare scripts FORCE
    $(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
    %.lst: %.c prepare scripts FORCE
    $(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
    %.s: %.S prepare scripts FORCE
    $(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
    %.o: %.S prepare scripts FORCE
    $(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
    %.symtypes: %.c prepare scripts FORCE
    $(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)

    # Modules
    /: prepare scripts FORCE
    $(cmd_crmodverdir)
    $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \
    $(build)=$(build-dir)
    %/: prepare scripts FORCE
    $(cmd_crmodverdir)
    $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \
    $(build)=$(build-dir)
    %.ko: prepare scripts FORCE
    $(cmd_crmodverdir)
    $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \
    $(build)=$(build-dir) $(@:.ko=.o)
    $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost

    # FIXME Should go into a make.lib or something
    # ===========================================================================

    quiet_cmd_rmdirs = $(if $(wildcard $(rm-dirs)),CLEAN $(wildcard $(rm-dirs)))
    cmd_rmdirs = rm -rf $(rm-dirs)

    quiet_cmd_rmfiles = $(if $(wildcard $(rm-files)),CLEAN $(wildcard $(rm-files)))
    cmd_rmfiles = rm -f $(rm-files)

    # Run depmod only if we have System.map and depmod is executable
    quiet_cmd_depmod = DEPMOD $(KERNELRELEASE)
    cmd_depmod = \
    if [ -r System.map -a -x $(DEPMOD) ]; then \
    $(DEPMOD) -ae -F System.map \
    $(if $(strip $(INSTALL_MOD_PATH)), -b $(INSTALL_MOD_PATH) ) \
    $(KERNELRELEASE); \
    fi

    # Create temporary dir for module support files
    # clean it up only when building all modules
    cmd_crmodverdir = $(Q)mkdir -p $(MODVERDIR) \
    $(if $(KBUILD_MODULES),; rm -f $(MODVERDIR)/*)

    a_flags = -Wp,-MD,$(depfile) $(KBUILD_AFLAGS) $(AFLAGS_KERNEL) \
    $(NOSTDINC_FLAGS) $(LINUXINCLUDE) $(KBUILD_CPPFLAGS) \
    $(modkern_aflags) $(EXTRA_AFLAGS) $(AFLAGS_$(basetarget).o)

    quiet_cmd_as_o_S = AS $@
    cmd_as_o_S = $(CC) $(a_flags) -c -o $@ $<

    # read all saved command lines

    targets := $(wildcard $(sort $(targets)))
    cmd_files := $(wildcard .*.cmd $(foreach f,$(targets),$(dir $(f)).$(notdir $(f)).cmd))

    ifneq ($(cmd_files),)
    $(cmd_files): ; # Do not try to update included dependency files
    include $(cmd_files)
    endif

    # Shorthand for $(Q)$(MAKE) -f scripts/Makefile.clean obj=dir
    # Usage:
    # $(Q)$(MAKE) $(clean)=dir
    clean := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.clean obj

    endif # skip-makefile

    PHONY += FORCE
    FORCE:

    # Declare the contents of the .PHONY variable as phony. We keep that
    # information in a variable so we can use it in if_changed and friends.
    .PHONY: $(PHONY)
    ReWoutzondag 1 augustus 2010 @ 23:39
    gast :')
    Trollface.maandag 2 augustus 2010 @ 00:10
    Mobiel kan spoilers niet inklappen :')

    Ook,
    # Make variables (CC, etc...)

    AS = $(CROSS_COMPILE)as
    LD = $(CROSS_COMPILE)ld
    CC = $(CROSS_COMPILE)gcc
    CPP = $(CC) -E
    AR = $(CROSS_COMPILE)ar
    NM = $(CROSS_COMPILE)nm
    STRIP = $(CROSS_COMPILE)strip
    OBJCOPY = $(CROSS_COMPILE)objcopy
    OBJDUMP = $(CROSS_COMPILE)objdump
    AWK = awk
    GENKSYMS = scripts/genksyms/genksyms
    INSTALLKERNEL := installkernel
    DEPMOD = /sbin/depmod
    KALLSYMS = scripts/kallsyms
    PERL = perl
    CHECK = sparse

    CHECKFLAGS := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ \
    -Wbitwise -Wno-return-void $(CF)
    MODFLAGS = -DMODULE
    CFLAGS_MODULE = $(MODFLAGS)
    AFLAGS_MODULE = $(MODFLAGS)
    LDFLAGS_MODULE = -T $(srctree)/scripts/module-common.lds
    CFLAGS_KERNEL =
    AFLAGS_KERNEL =
    CFLAGS_GCOV = -fprofile-arcs -ftest-coverage

    i.c.m. het vmlinux-gedeelte. :)
    TeringHenkiemaandag 2 augustus 2010 @ 00:27
    quote:
    Op maandag 2 augustus 2010 00:10 schreef Trollface. het volgende:
    Mobiel kan spoilers niet inklappen :')


    Maar goed, ik snap het wel. Thx ^O^
    Pakspuldonderdag 5 augustus 2010 @ 16:23
    C++ lijkt een beetje op CSS als je totaal niet oplet :{

    [ Bericht 93% gewijzigd door Pakspul op 05-08-2010 16:37:15 ]
    Crutchdonderdag 5 augustus 2010 @ 16:36
    quote:
    Op donderdag 5 augustus 2010 16:23 schreef Pakspul het volgende:
    Waarom werkt tekst transparantie in de volgende situatie niet?
    [ code verwijderd ]

    Zoals te zien is dat bij de eerste div situatie de tekst gewoon mooi wit is, maar bij de twee is de tekst ineens roodachtig ook al zou je anders verwachten :?
    [CSS] voor dummies #15
    Crutchdonderdag 5 augustus 2010 @ 16:46
    quote:
    Op donderdag 5 augustus 2010 16:23 schreef Pakspul het volgende:
    C++ lijkt een beetje op CSS als je totaal niet oplet :{
    Als je totaal niet oplet dan lijkt Annemarie Jorritsma ook op Chantal Janzen :P
    TeringHenkiedonderdag 5 augustus 2010 @ 18:07
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    int doeietsmetgetal(int);

    int _tmain(int argc, _TCHAR* argv[])
    {
        int (*fpoint)(int) = doeietsmetgetal;
        cout << fpoint(5);
        return 0;

    }

    int doeietsmetgetal(int x){

        int * y = new int(x*5);
        return *y;

    }
    Hoe zit het hier met *y? Blijft deze geheugen innemen totdat mijn programma afsluit? Ik kan namelijk *fpoint niet verwijderen, aangezien ik 'm niet met new gecreëerd heb.
    thabitdonderdag 5 augustus 2010 @ 18:10
    *y blijft inderdaad geheugen innemen omdat je new aanroept. Ook als je *fpoint wel zou kunnen verwijderen, dan blijven alle *y instanties gewoon geheugen innemen.
    TeringHenkiedonderdag 5 augustus 2010 @ 18:13
    quote:
    Op donderdag 5 augustus 2010 18:10 schreef thabit het volgende:
    *y blijft inderdaad geheugen innemen omdat je new aanroept. Ook als je *fpoint wel zou kunnen verwijderen, dan blijven alle *y instanties gewoon geheugen innemen.
    En hoe zorg ik ervoor dat y geen geheugen meer inneemt? Niet aanroepen met new? En hoe delete ik m'n fpoint? Of moet ik dan van die doeietsmetgetal functie gewoon een class maken? En mag ik aannemen dat zodra een variabele die zonder new is gedeclareerd verwijderd wordt zodra de functie exit?
    thabitdonderdag 5 augustus 2010 @ 18:35
    Locale (niet-static) variabelen van functies worden op de stack aangemaakt, en die stackruimte wordt vrijgegeven als je de functie verlaat. De pointer y wordt dus ook vrijgegeven, maar niet de int *y waar hij naar verwijst. Ook is fpoint een functiepointer, dus gewoon een locale variabele die wordt verwijderd zodra je de functie verlaat. In het bovenstaande voorbeeld kun je beter
    int y = x*5; return y;
    doen, of zelfs direct return x*5;
    TeringHenkiedonderdag 5 augustus 2010 @ 18:44
    quote:
    Op donderdag 5 augustus 2010 18:35 schreef thabit het volgende:
    Locale (niet-static) variabelen van functies worden op de stack aangemaakt, en die stackruimte wordt vrijgegeven als je de functie verlaat. De pointer y wordt dus ook vrijgegeven, maar niet de int *y waar hij naar verwijst. Ook is fpoint een functiepointer, dus gewoon een locale variabele die wordt verwijderd zodra je de functie verlaat. In het bovenstaande voorbeeld kun je beter
    int y = x*5; return y;
    doen, of zelfs direct return x*5;
    Ok en m'n functiepointer? Valt die gewoon te verwijderen? Of moet ik 'm dan in de scope van een functie zien te proppen?
    thabitdonderdag 5 augustus 2010 @ 18:54
    Je functiepointer is gewoon een lokale variabele en zit in de scope van _tmain. In dit voorbeeld heb je verder geen functiepointers nodig en kun je gewoon
    cout << doeietsmetgetal(5);
    doen.
    TeringHenkiedonderdag 5 augustus 2010 @ 20:37
    Thanks! ^O^
    netolkvrijdag 6 augustus 2010 @ 13:51
    Hey,

    Ik heb een probleem met virtual functies...

    ik heb een namespace gemaakt in een header genaamd Shape.h
    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
    namespace shp{
        class Point{
            unsigned short X,Y;
            public:
                Point(unsigned short x,unsigned short y):X(x),Y(y) {}
                unsigned short get_X(){return X;}
                unsigned short get_Y(){return Y;}
        };
        class Shape{
            public:
                virtual void Rotate(int)=0;
                virtual void Draw()=0;
                virtual bool is_Closed()=0;
        };
        
        class Circle:public Shape{
            Point _CENTER;
            unsigned _RADIUS;
            
            void Rotate(int);
            public:
                Circle(Point p,unsigned r):_CENTER(p),_RADIUS(r){}
                
                void Draw();
                bool is_Closed(){return true;}
        };
    }
    en ik heb dan in mn main het volgende staan:
    1
    2
    3
    4
    5
    6
    7
    #include "Shape.h"
    int main(){
        shp::Circle myCircle(shp::Point(40,20),5);
        
        //myCircle.Draw();
        return 0;
    }
    Als ik dit probeer te compileren krijg ik de volgende foutmelding:
    1
    2
    ...l\Temp/ccoiasqN.o:main.cpp:(.text$_ZN3shp6CircleC1ENS_5PointEj[shp::Circle::Circle(shp::Point, unsigned int)]+0x16): undefined reference to `vtable for shp::Circle'
    collect2: ld returned 1 exit status
    ik gebruik G++ als compiler, zou iemand me kunnen vertellen wat ik dan niet goed doe?
    Cruise.Elroyvrijdag 6 augustus 2010 @ 13:56
    even een recompile ofzo? hij zegt dat Circle geen virtual table heeft, en blijkbaar ergens niet als derived class is gedefinieerd?

    Geen idee verder.
    netolkvrijdag 6 augustus 2010 @ 14:01
    quote:
    Op vrijdag 6 augustus 2010 13:56 schreef Cruise.Elroy het volgende:
    even een recompile ofzo? hij zegt dat Circle geen virtual table heeft, en blijkbaar ergens niet als derived class is gedefinieerd?

    Geen idee verder.
    Dat is toch raar want Circle zou toch gewoon een virtual table moeten hebben aangezien zijn base class puur virtueel is?
    thabitvrijdag 6 augustus 2010 @ 14:39
    Waarom heb je Circle::Rotate private gemaakt?
    netolkvrijdag 6 augustus 2010 @ 14:41
    nou omdat een cirkel roteren niet echt nuttig is...
    maar ik dacht miss is dat het probleem maar toen ik hem public had kreeg ik nog steeds de zelfde melding...
    thabitvrijdag 6 augustus 2010 @ 14:44
    Hij is public in Shape. Dus als je een object van type Shape hebt, en weet niet wat voor Shape het is, moet je wel Rotate erop kunnen aanroepen. Maar goed, dat terzijde.
    netolkvrijdag 6 augustus 2010 @ 14:47
    quote:
    Op vrijdag 6 augustus 2010 14:44 schreef thabit het volgende:
    Hij is public in Shape. Dus als je een object van type Shape hebt, en weet niet wat voor Shape het is, moet je wel Rotate erop kunnen aanroepen. Maar goed, dat terzijde.
    Hmm... daar heb je idd een punt
    thabitvrijdag 6 augustus 2010 @ 14:54
    Misschien zit de fout in Shape.cpp, kun je die tonen?
    netolkvrijdag 6 augustus 2010 @ 15:03
    Staat ook in mn 1e post maar ik zal hem nog een keertje neerzetten
    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
    #ifndef SHAPE_H
    #define SHAPE_H
    namespace shp{
        class Point{
            unsigned short X,Y;
            public:
                Point(unsigned short x,unsigned short y):X(x),Y(y) {}
                unsigned short get_X(){return X;}
                unsigned short get_Y(){return Y;}
        };
        class Shape{
            public:
                virtual void Rotate(int)=0;
                virtual void Draw()=0;
                virtual bool is_Closed()=0;
        };
        class Polygon:public Shape{
            public:
                bool is_Closed(){return true;}
        };
        
        class Circle:public Shape{
            Point _CENTER;
            unsigned _RADIUS;
            
            public:
                Circle(Point p,unsigned r):_CENTER(p),_RADIUS(r){}
                
                void Rotate(int);
                void Draw();
                bool is_Closed(){return true;}
        };
    }
    #endif
    ik heb die Circle::rotate(int) ook maar even public gemaakt

    [ Bericht 4% gewijzigd door netolk op 06-08-2010 15:17:26 ]
    thabitvrijdag 6 augustus 2010 @ 15:06
    Dat is een header file, geen cpp file.
    netolkvrijdag 6 augustus 2010 @ 15:16
    quote:
    Op vrijdag 6 augustus 2010 15:06 schreef thabit het volgende:
    Dat is een header file, geen cpp file.
    Ja, iknow ik heb geen .cpp file maar die heb ik voor classes toch ook niet nodig??

    Ik heb de functies nog niet verder uitgewerkt, dus nog geen .cpp
    thabitvrijdag 6 augustus 2010 @ 15:18
    Dan zit daar dus het probleem: de functies Circle::Rotate en Circle::Draw zijn alleen gedeclareerd, maar niet gedefinieerd. Dat vindt de linker niet zo grappig (vandaar ook een 'ld' error: het compilen gaat op zich goed, alleen het linken wil niet).
    netolkvrijdag 6 augustus 2010 @ 15:19
    quote:
    Op vrijdag 6 augustus 2010 15:18 schreef thabit het volgende:
    Dan zit daar dus het probleem: de functies Circle::Rotate en Circle::Draw zijn alleen gedeclareerd, maar niet gedefinieerd. Dat vindt de linker niet zo grappig (vandaar ook een 'ld' error: het compilen gaat op zich goed, alleen het linken wil niet).
    Hehe, daar kwam ik idd ook net achter...

    Best wel dom, nouja bedankt in iedergeval
    TeringHenkievrijdag 6 augustus 2010 @ 15:23
    quote:
    Op vrijdag 6 augustus 2010 15:18 schreef thabit het volgende:
    Dan zit daar dus het probleem: de functies Circle::Rotate en Circle::Draw zijn alleen gedeclareerd, maar niet gedefinieerd. Dat vindt de linker niet zo grappig (vandaar ook een 'ld' error: het compilen gaat op zich goed, alleen het linken wil niet).
    Maar hij roept Rotate en Draw niet aan
    thabitvrijdag 6 augustus 2010 @ 15:25
    Nog wat algemene opmerkingen: als je een base class aanmaakt, waar je classes van wilt afleiden, is het raadzaam om ook de destructor virtual te maken. En in de constructor van Circle kun je Point beter als reference doorgeven dan als value.
    thabitvrijdag 6 augustus 2010 @ 15:25
    quote:
    Op vrijdag 6 augustus 2010 15:23 schreef TeringHenkie het volgende:

    [..]

    Maar hij roept Rotate en Draw niet aan
    C++ is geen Python.

    [ Bericht 0% gewijzigd door thabit op 06-08-2010 15:33:57 ]
    Cruise.Elroyvrijdag 6 augustus 2010 @ 15:31
    Wel rare error voor een linkerfout. Maar is het nu gefixed?
    netolkvrijdag 6 augustus 2010 @ 15:46
    quote:
    Op vrijdag 6 augustus 2010 15:31 schreef Cruise.Elroy het volgende:
    Wel rare error voor een linkerfout. Maar is het nu gefixed?
    jep

    quote:
    Op vrijdag 6 augustus 2010 15:25 schreef thabit het volgende:
    Nog wat algemene opmerkingen: als je een base class aanmaakt, waar je classes van wilt afleiden, is het raadzaam om ook de destructor virtual te maken. En in de constructor van Circle kun je Point beter als reference doorgeven dan als value.
    hoe zo als reference dan? kost dan minder resources?

    En die destructor moet ik die in de afgeleide classes ook neerzetten of kan ik dat achterwege laten? (tenzij ik een destructor nodig heb natuurlijk)
    Cruise.Elroyvrijdag 6 augustus 2010 @ 15:52
    Die destructor maak je virtual zodat hij (automatisch) kan worden aangeroepen als je afgeleide klassen destruct. Anders krijg je later evt. memory leaks (hoeft eigenlijk alleen als je destructor echt iets doet maar het is wel goed om het aan te leren)

    En ja, als reference heb je iets minder resources maar in dit geval maakt het niet heel veel uit.
    netolkvrijdag 6 augustus 2010 @ 18:07
    ik heb nog een vraagje bestaat er ook iets als #exclude? aangezien je wel #define en #undef hebt...
    Cruise.Elroyvrijdag 6 augustus 2010 @ 18:10
    Euh? Nee want met #include wordt de file direct in je parser geramd. Dus dat later weer undo-en is niet te doen.

    #include zet de inhoud van de file direct tussen je code, het is niet zoals in Java e.d.
    Je kan dus een losse regel code in een file zetten, en deze dan includen midden in een functie bijvoorbeeld :)
    progjevrijdag 6 augustus 2010 @ 18:39
    echt, cruise.elroy, jij weet tenminste echt waar je over praat.. O+

    Ik word echt doodmoe van alle programmeurs waarmee ik al heb moeten werken en die, zodra ze hun database connectie niet kunnen instellen via een Wizard, niet weten hoe het moet :')

    Echt schijtziek word ik er van, totaal geen computer kennis meer...
    Wat maakt het nou uit hoe het geheugen werkt, je propt er toch gewoon een extra bankje bij als het te traag wordt :')
    thabitvrijdag 6 augustus 2010 @ 18:46
    quote:
    Op vrijdag 6 augustus 2010 18:39 schreef progje het volgende:
    Echt schijtziek word ik er van, totaal geen computer kennis meer...
    Wat maakt het nou uit hoe het geheugen werkt, je propt er toch gewoon een extra bankje bij als het te traag wordt :')
    Da's een kwestie van economie: goede hardware is tegenwoordig goedkoper dan een goede programmeur.
    progjevrijdag 6 augustus 2010 @ 18:49
    quote:
    Op vrijdag 6 augustus 2010 18:46 schreef thabit het volgende:

    [..]

    Da's een kwestie van economie: goede hardware is tegenwoordig goedkoper dan een goede programmeur.
    Nou, als de salaris-eis nou ook eens in overeenstemming was met het gewenste niveau..
    Maar dat laat helaas ook nog vaak te wensen over.

    En allemaal zo heerlijk groot ego, ze vinden zichzelf allemaal de beste en overleggen ho maar :r

    verder ben ik niet gefrustreerd hoor. ;)

    Nu werk ik zelf in een omgeving waar ook veel in .Net en C# wordt geprogrammeerd, misschien hoort het ook wel bij dat wereldje ik weet het niet..
    TeringHenkievrijdag 6 augustus 2010 @ 20:19
    quote:
    Op vrijdag 6 augustus 2010 18:49 schreef progje het volgende:

    [..]

    Nou, als de salaris-eis nou ook eens in overeenstemming was met het gewenste niveau..
    Maar dat laat helaas ook nog vaak te wensen over.

    En allemaal zo heerlijk groot ego, ze vinden zichzelf allemaal de beste en overleggen ho maar :r

    verder ben ik niet gefrustreerd hoor. ;)

    Nu werk ik zelf in een omgeving waar ook veel in .Net en C# wordt geprogrammeerd, misschien hoort het ook wel bij dat wereldje ik weet het niet..
    Ik neem aan dat een C++ programmeur wel meer verdient dan iemand die formpjes in elkaar klikt in C#?
    progjevrijdag 6 augustus 2010 @ 20:39
    Hehe ja dat zeker.. :)

    Maar ik ken ook genoeg Senior C#/asp.net programmeurs die er werkelijk waar geen drol van begrijpen..
    En toch ook een salaris verdienen van in de 4000 euro, maar ja

    Al hebben we ook eens een Senior C++ programmeur in dienst gehad en ik begreep er destijds (als junior) al meer van dan hij :') Maar ja die heb je er altijd tussen zitten he.
    TeringHenkievrijdag 6 augustus 2010 @ 21:16
    Grappig is trouwens wel dat de Assemblies van Microsoft gewoon wrappers om Win32 zijn. Bijvoorbeeld Messagebox.Show roept uiteindelijk gewoon MessageBox aan in user32.dll. Als iets niet kan in C#, is er nog geen developer daar die er een wrapper voor heeft geschreven. _O-

    Conclusie: C# voor de GUI, en de snelle/geavanceerde code stop je in een c++ DLL die je dan DllImport :P
    netolkvrijdag 6 augustus 2010 @ 23:32
    quote:
    Op vrijdag 6 augustus 2010 18:10 schreef Cruise.Elroy het volgende:
    Euh? Nee want met #include wordt de file direct in je parser geramd. Dus dat later weer undo-en is niet te doen.

    #include zet de inhoud van de file direct tussen je code, het is niet zoals in Java e.d.
    Je kan dus een losse regel code in een file zetten, en deze dan includen midden in een functie bijvoorbeeld :)
    Ja daar was ik al bang voor :P, ik dacht miss kan het dus als je in een header a header b include dan kan je dus overal waar a geinclude word ook die van b gebruiken...
    Cruise.Elroyzondag 8 augustus 2010 @ 21:24
    quote:
    Op vrijdag 6 augustus 2010 21:16 schreef TeringHenkie het volgende:
    Grappig is trouwens wel dat de Assemblies van Microsoft gewoon wrappers om Win32 zijn. Bijvoorbeeld Messagebox.Show roept uiteindelijk gewoon MessageBox aan in user32.dll. Als iets niet kan in C#, is er nog geen developer daar die er een wrapper voor heeft geschreven. _O-

    Conclusie: C# voor de GUI, en de snelle/geavanceerde code stop je in een c++ DLL die je dan DllImport :P
    Uiteindelijk is elk programma in elke taal op het Windows platform uiteindelijk een wrapper voor de Win32 api, er is geen andere logische manier om Windows "te gebruiken". Hoe hoger het niveau, hoe beter (voor de user) maar (mogelijk) trager. :)
    Dat het anders kan laten Linux ports en Java apps zien, maar daar wordt je echt niet blij van, al is het alleen al het gebruikersgemak, al custom dialogs en lelijke L&F. :X

    Verder kan C# zeker wel sneller zijn dan C++, zelfs sneller dan compiled ASM :o dat komt omdat je stukken (byte)code real-time opnieuw kan compilen naar ASM als de omstandigheden daar toe zijn.
    Trollface.zondag 8 augustus 2010 @ 21:38
    Handgeschreven ASM _O_ daar kan geen compiler tegenop *)
    Cruise.Elroyzondag 8 augustus 2010 @ 21:56
    quote:
    Op zondag 8 augustus 2010 21:38 schreef Trollface. het volgende:
    Handgeschreven ASM _O_ daar kan geen compiler tegenop *)
    Als je met handgeschreven stiekem optimaal bedoelt, dan ja. Handgeschreven ASM is vaak alles behalve optimaal. Niet zo gek als je de intel procs zien icm 8086 ASM.

    Vaak kan je met C# talen snelheidswinst halen omdat tight loops run-time herschreven worden naar gelang de variabelen. Natuurlijk kan je dit zelf gaan schrijven in ASM, maar dan ben je echt gek.
    Trollface.zondag 8 augustus 2010 @ 22:00
    quote:
    Op zondag 8 augustus 2010 21:56 schreef Cruise.Elroy het volgende:

    [..]

    Als je met handgeschreven stiekem optimaal bedoelt, dan ja. Handgeschreven ASM is vaak alles behalve optimaal. Niet zo gek als je de intel procs zien icm 8086 ASM.

    Vaak kan je met C# talen snelheidswinst halen omdat tight loops run-time herschreven worden naar gelang de variabelen. Natuurlijk kan je dit zelf gaan schrijven in ASM, maar dan ben je echt gek.
    Ik ben nou eenmaal gek :P
    __asm__ {} _O_
    Cruise.Elroyzondag 8 augustus 2010 @ 22:06
    Zonde van je tijd :N ik schrijf eigenlijk alleen maar zware time-critical code en zelfs ik gebruik het eigenlijk nooit. Er is eigenlijk altijd wel een meer (dev)tijd-efficientere manier om snelheid te winnen.
    Trollface.zondag 8 augustus 2010 @ 22:09
    push eax
    push ecx
    mov al, 0
    mov cl, 5
    :lp1
    add al, cl
    dec cl
    or cl, cl
    jnz lp1
    pop ecx
    pop eax

    :P
    TeringHenkiezondag 8 augustus 2010 @ 22:16
    quote:
    Op zondag 8 augustus 2010 21:24 schreef Cruise.Elroy het volgende:

    [..]

    Uiteindelijk is elk programma in elke taal op het Windows platform uiteindelijk een wrapper voor de Win32 api, er is geen andere logische manier om Windows "te gebruiken". Hoe hoger het niveau, hoe beter (voor de user) maar (mogelijk) trager. :)
    Dat het anders kan laten Linux ports en Java apps zien, maar daar wordt je echt niet blij van, al is het alleen al het gebruikersgemak, al custom dialogs en lelijke L&F. :X

    Verder kan C# zeker wel sneller zijn dan C++, zelfs sneller dan compiled ASM :o dat komt omdat je stukken (byte)code real-time opnieuw kan compilen naar ASM als de omstandigheden daar toe zijn.
    Dat C# sneller kan zijn dan C++ snap ik wel, maar dan is dat (neem ik aan) alleen maar omdat OF je code brakker is, OF omdat je compiler niet kan optimaliseren. Het probleem met C# is alleen dat je voor de eenvoudigste dingen meteen 3 objecten aan moet gaan maken, wat je waarschijnlijk veel geheugen en cpu-tijd kost.
    Hoe zit dat nou met de machinecode die uitgevoerd wordt? Ik heb begrepen dat moderne OSen een HAL om je hardware heen bouwen. Mag ik dan ook aannemen dat machinecode wel direct op je processor draait, en dat er alleen interrupts aangeroepen mogen worden die opgevangen worden door je HAL?
    Cruise.Elroyzondag 8 augustus 2010 @ 22:17
    @ ASM
    Tof, maar je code doet niets nuttigs, doet dit bijzonder efficient, en reset zijn waardes aan het einde. :D
    Cruise.Elroyzondag 8 augustus 2010 @ 22:19
    quote:
    Op zondag 8 augustus 2010 22:16 schreef TeringHenkie het volgende:

    [..]

    Dat C# sneller kan zijn dan C++ snap ik wel, maar dan is dat (neem ik aan) alleen maar omdat OF je code brakker is, OF omdat je compiler niet kan optimaliseren. Het probleem met C# is alleen dat je voor de eenvoudigste dingen meteen 3 objecten aan moet gaan maken, wat je waarschijnlijk veel geheugen en cpu-tijd kost.
    Hoe zit dat nou met de machinecode die uitgevoerd wordt? Ik heb begrepen dat moderne OSen een HAL om je hardware heen bouwen. Mag ik dan ook aannemen dat machinecode wel direct op je processor draait, en dat er alleen interrupts aangeroepen mogen worden die opgevangen worden door je HAL?
    Je code draait gewoon op je CPU, waar anders op :D Alleen kan je met Protected Mode etc. heel veel dingen afschermen, zoals interrupts, geheugenadressen etc. Een HAL is een low-level variant van een API.
    Trollface.zondag 8 augustus 2010 @ 22:20
    quote:
    Op zondag 8 augustus 2010 22:19 schreef Cruise.Elroy het volgende:

    [..]

    Je code draait gewoon op je CPU, waar anders op :D Alleen kan je met Protected Mode etc. heel veel dingen afschermen, zoals interrupts, geheugenadressen etc. Een HAL is een low-level variant van een API.
    Low-level programming is mijn ding :Y
    Cruise.Elroyzondag 8 augustus 2010 @ 22:23
    Waarom ben je dan een webdevver? :D
    TeringHenkiezondag 8 augustus 2010 @ 22:26
    quote:
    Op zondag 8 augustus 2010 22:19 schreef Cruise.Elroy het volgende:

    [..]

    Je code draait gewoon op je CPU, waar anders op :D Alleen kan je met Protected Mode etc. heel veel dingen afschermen, zoals interrupts, geheugenadressen etc. Een HAL is een low-level variant van een API.
    Dat snap ik, maar de windows kernel mag niet hetzelfde als de HAL, en een applicatie mag niet hetzelfde als de kernel. Hoe wordt dat afgeschermd? Interrupts die worden afgevangen/geblokkeerd oid?
    Trollface.zondag 8 augustus 2010 @ 22:29
    quote:
    Op zondag 8 augustus 2010 22:23 schreef Cruise.Elroy het volgende:
    Waarom ben je dan een webdevver? :D
    Dat ik bij FOK! dev wil niet zeggen dat ik alleen aan webdevving doe :P
    Cruise.Elroyzondag 8 augustus 2010 @ 22:30
    Afaik wordt dat idd met interrupts en dergelijke geregeld. Sowieso heb je je eigenlijk geheugen-ruimtes waardoor je niet meer bij iedereen kan rondkijken.
    Details o.a. hier:

    Dit is de processor-side info: http://en.wikipedia.org/wiki/Protected_mode
    En hier heb je de verschillende permissie-"rings": http://en.wikipedia.org/wiki/Ring_(computer_security)
    Cruise.Elroyzondag 8 augustus 2010 @ 22:32
    quote:
    Op zondag 8 augustus 2010 22:29 schreef Trollface. het volgende:

    [..]

    Dat ik bij FOK! dev wil niet zeggen dat ik alleen aan webdevving doe :P
    Nee maar iemand die low-level zit te hacken ( :') ) is normaal niet iemand die webdevving echt kan waarderen. ;) En je ASM is niet echt geweldig. nm, de mijne is ook kut
    Trollface.zondag 8 augustus 2010 @ 22:33
    De kernel doet o.a. ook zelf interrupts afhandelen dus user-kernelspace kan door de kernel bewaakt worden. :)
    Trollface.zondag 8 augustus 2010 @ 22:34
    quote:
    Op zondag 8 augustus 2010 22:32 schreef Cruise.Elroy het volgende:

    [..]

    Nee maar iemand die low-level zit te hacken ( :') ) is normaal niet iemand die webdevving echt kan waarderen. ;) En je ASM is niet echt geweldig. nm, de mijne is ook kut
    Je weet toch dat dat een snel in elkaar geflanst stukje code is wat in de praktijk niets doet? :P

    Oh, en ik ben begonnen met webdevven :P ik discrimineer over het algemeen niet mits er een uitdaging in zit. :)
    TeringHenkiezondag 8 augustus 2010 @ 22:36
    quote:
    Op zondag 8 augustus 2010 22:30 schreef Cruise.Elroy het volgende:
    Afaik wordt dat idd met interrupts en dergelijke geregeld. Sowieso heb je je eigenlijk geheugen-ruimtes waardoor je niet meer bij iedereen kan rondkijken.
    Details o.a. hier:

    Dit is de processor-side info: http://en.wikipedia.org/wiki/Protected_mode
    En hier heb je de verschillende permissie-"rings": http://en.wikipedia.org/wiki/Ring_(computer_security)
    Dat bedoel ik dus. Wat ik eerst niet snapte, was dat ALLE code op je PC uiteindelijk ook op de CPU stacks zit te pushen en weet ik veel. Hoe zorg je dat dat allemaal niet in de weg zit? Ik neem aan dat als een ander proces CPU-tijd krijgt, jouw registertjes ergens worden opgeslagen, en die andere code z'n waardes weer in de registertjes wordt gestopt :P
    Cruise.Elroyzondag 8 augustus 2010 @ 22:38
    quote:
    Op zondag 8 augustus 2010 22:36 schreef TeringHenkie het volgende:

    [..]

    Dat bedoel ik dus. Wat ik eerst niet snapte, was dat ALLE code op je PC uiteindelijk ook op de CPU stacks zit te pushen en weet ik veel. Hoe zorg je dat dat allemaal niet in de weg zit? Ik neem aan dat als een ander proces CPU-tijd krijgt, jouw registertjes ergens worden opgeslagen, en die andere code z'n waardes weer in de registertjes wordt gestopt :P
    Multi-threading en multi-tasking doet zogenaamde context-switching die alles dus idd keurig weg zet. Interrupts e.d. ook natuurlijk:

    http://en.wikipedia.org/wiki/Context_switch
    TeringHenkiezondag 8 augustus 2010 @ 22:46
    quote:
    Op zondag 8 augustus 2010 22:38 schreef Cruise.Elroy het volgende:

    [..]

    Multi-threading en multi-tasking doet zogenaamde context-switching die alles dus idd keurig weg zet. Interrupts e.d. ook natuurlijk:

    http://en.wikipedia.org/wiki/Context_switch
    HA! Dus eigenlijk was DOS wel een systeem wat multitasking aankon. Immers zouden drivers hun werk nooit kunnen doen :P
    Trollface.zondag 8 augustus 2010 @ 22:48
    quote:
    Op zondag 8 augustus 2010 22:46 schreef TeringHenkie het volgende:

    [..]

    HA! Dus eigenlijk was DOS wel een systeem wat multitasking aankon. Immers zouden drivers hun werk nooit kunnen doen :P
    Multitasking is in principe sowieso een must op een OS. :)
    Cruise.Elroyzondag 8 augustus 2010 @ 23:00
    quote:
    Op zondag 8 augustus 2010 22:46 schreef TeringHenkie het volgende:

    [..]

    HA! Dus eigenlijk was DOS wel een systeem wat multitasking aankon. Immers zouden drivers hun werk nooit kunnen doen :P
    Waarom zou je multi-tasking nodig hebben voor drivers? Die hoeven toch niet los van een applicatie iets uit te voeren?
    Nee in DOS werkte alle(?) drivers met interrups, TSR systemen en ingeladen stukken uitvoerbare code. Geen multi-tasking dus.

    Een muis-driver registereerde een stuk code ergens in een interrupttabel (oid), maar die driver voerde dus zelf geen code uit "los" van de applicatie. Die applicatie riep gewoon driver-code aan waar nodig, en wachtte tot deze klaar was.

    Als je code wilde uitvoeren "samen" met een applicatie moest je een timer-interrupt aanzette die gewoon elke zoveel ms triggerde en dan jouw code weer uitvoerde. Zoals een trainer van games bijv. Een programma die in het geheugen ligt te wachten totdat hij wordt uitgevoerd heet een TSR.

    http://en.wikipedia.org/wiki/Terminate_and_Stay_Resident
    Trollface.zondag 8 augustus 2010 @ 23:02
    quote:
    Op zondag 8 augustus 2010 23:00 schreef Cruise.Elroy het volgende:

    [..]

    Nee in DOS werkte alle(?) drivers met interrups, TSR systemen en ingeladen stukken uitvoerbare code. Geen multi-tasking dus.
    Volgens mij heb ik hier de broncode van MS DOS 5.0 nog liggen, maar ik heb geen zin om hem door te spitten. :P
    TeringHenkiezondag 8 augustus 2010 @ 23:08
    quote:
    Op zondag 8 augustus 2010 23:00 schreef Cruise.Elroy het volgende:

    [..]

    Waarom zou je multi-tasking nodig hebben voor drivers? Die hoeven toch niet los van een applicatie iets uit te voeren?
    Nee in DOS werkte alle(?) drivers met interrups, TSR systemen en ingeladen stukken uitvoerbare code. Geen multi-tasking dus.

    Een muis-driver registereerde een stuk code ergens in een interrupttabel (oid), maar die driver voerde dus zelf geen code uit "los" van de applicatie. Die applicatie riep gewoon driver-code aan waar nodig, en wachtte tot deze klaar was.

    Als je code wilde uitvoeren "samen" met een applicatie moest je een timer-interrupt aanzette die gewoon elke zoveel ms triggerde en dan jouw code weer uitvoerde. Zoals een trainer van games bijv. Een programma die in het geheugen ligt te wachten totdat hij wordt uitgevoerd heet een TSR.

    http://en.wikipedia.org/wiki/Terminate_and_Stay_Resident
    Maar hoe werkte dat dan als je de muis bewoog? Of als je netwerkkaart data ontving? Werd die pas uit de buffer gehaald als je programma polde of de socket data te verwerken had?
    TeringHenkiezondag 8 augustus 2010 @ 23:56
    quote:
    Op zondag 8 augustus 2010 21:24 schreef Cruise.Elroy het volgende:

    [..]

    Uiteindelijk is elk programma in elke taal op het Windows platform uiteindelijk een wrapper voor de Win32 api, er is geen andere logische manier om Windows "te gebruiken".
    Volgens mij is dit niet helemaal waar. Als ik in C# een object aanmaak, maakt het framework voor mij een object aan, dat doet de code niet zelf. Ook neem het framework mij GC uit handen. Als ik in C++ een object aanmaak, maakt mijn eigen code voor mij geheugen aan (in een door windows bepaalde geheugenruimte weliswaar). Als voorbeeld: als ik twee ints optel, doet mijn C++ programma dat gewoon in de registers, zonder tussenkomst van een of andere DLL.
    netolkmaandag 9 augustus 2010 @ 00:13
    quote:
    Op zondag 8 augustus 2010 23:56 schreef TeringHenkie het volgende:

    [..]

    Volgens mij is dit niet helemaal waar. Als ik in C# een object aanmaak, maakt het framework voor mij een object aan, dat doet de code niet zelf. Ook neem het framework mij GC uit handen. Als ik in C++ een object aanmaak, maakt mijn eigen code voor mij geheugen aan (in een door windows bepaalde geheugenruimte weliswaar). Als voorbeeld: als ik twee ints optel, doet mijn C++ programma dat gewoon in de registers, zonder tussenkomst van een of andere DLL.
    Dat is ook de rede dat zware-/besturingsprogramma's doorgaans in C++ geschreven zijn
    Maar doet C# dat met tussenkomst van DLL's?? Dat zou behoorlijk inefficiënt zijn
    Cruise.Elroymaandag 9 augustus 2010 @ 07:13
    quote:
    Op zondag 8 augustus 2010 23:56 schreef TeringHenkie het volgende:

    [..]

    Volgens mij is dit niet helemaal waar. Als ik in C# een object aanmaak, maakt het framework voor mij een object aan, dat doet de code niet zelf. Ook neem het framework mij GC uit handen. Als ik in C++ een object aanmaak, maakt mijn eigen code voor mij geheugen aan (in een door windows bepaalde geheugenruimte weliswaar). Als voorbeeld: als ik twee ints optel, doet mijn C++ programma dat gewoon in de registers, zonder tussenkomst van een of andere DLL.
    Wat is volgens jou het verschl tusen "framework" en "code"? Een C# gaat echt geen DLL gebruiken om ints op te tellen. Het aanmaken van een object gaat ook op eenzelfde manier als in C++, hetzij met iets meer boekhouding. De lijn tussen framework runtime en je "eigen code" is flinterdun, en de compiler zal ze ook gewoon doorelkaar heen compileren.
    GC is wel een andere issue, maar ook deze is enorm geoptimaliseerd en zal niet via DLL wrappers lopen. Wat ik bedoelde was dat alle IO-functies (key-handling, files, audio, video) allemaal via de Win32 API lopen, in elke applicatie.
    Cruise.Elroymaandag 9 augustus 2010 @ 07:14
    quote:
    Op maandag 9 augustus 2010 00:13 schreef netolk het volgende:

    [..]

    Dat is ook de rede dat zware-/besturingsprogramma's doorgaans in C++ geschreven zijn
    Maar doet C# dat met tussenkomst van DLL's?? Dat zou behoorlijk inefficiënt zijn
    C# compileert dat gewoon tot snoeiharde ASM
    Cruise.Elroymaandag 9 augustus 2010 @ 07:16
    quote:
    Op zondag 8 augustus 2010 23:08 schreef TeringHenkie het volgende:

    [..]

    Maar hoe werkte dat dan als je de muis bewoog? Of als je netwerkkaart data ontving? Werd die pas uit de buffer gehaald als je programma polde of de socket data te verwerken had?
    Al die info stond op je hardware te wachten totdat je het pollde ja. Dat is in Windows nog steeds zo; een driver is geen process, dat zou erg raar zijn.
    netolkwoensdag 25 augustus 2010 @ 12:23
    Hey, ik heb problemen met het maken van een ico...

    ik heb op http://www.hackerfactor.c(...)-Ico-Ico-Un-Day.html en op http://en.wikipedia.org/wiki/BMP_file_format gekeken, maar nu werkt de volgende code niet...
    SPOILER
    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
    #include <fstream>
    #include <iostream>
    struct ICOHeader{
        unsigned short _RESERVED;
        unsigned short _TYPE;
        unsigned short _COUNT;
    };

    struct ICOIndex{
        unsigned char _WIDTH;            // 1-255 0=256
        unsigned char _HEIGHT;            // 1-255 0=256
        unsigned char _COLORCOUNT;    // number of collors 0=max possible
        unsigned char _RESERVED;
        unsigned short _V1;            // icon: color planes,cursor: x for hotspot
        unsigned short _V2;            // icon:  bits per pixel,cursor: y for hotspot
        unsigned _SIZE;                // size of the bitmap data
        unsigned _OFFSET;                // offset to data
    };

    struct ICOBmp{
        unsigned _HEADERSIZE;
        unsigned _WIDTH;
        unsigned _HEIGHT;
        unsigned short _PLANES;
        unsigned short _BITCOUNT;        // bits per pixel: 1,4,8,32
        unsigned _COMPRESSION;        // 0 for uncompressed
        unsigned _IMAGESIZE;            // 0 for uncompressed
        unsigned _XPIXELSPERM;        // unused
        unsigned _YPIXELSPERM;        // unused
        unsigned _COLORSUNUSED;        // unused
        unsigned _COLORSIMPORTANT;    // unused
    };

    int main(){
        std::ofstream Write("test.ico",std::ios::binary);
        if(Write.is_open()){
            ICOHeader myICOHeader;
            myICOHeader._TYPE = 1;
            myICOHeader._COUNT = 1;
            
            Write << myICOHeader._RESERVED;
            Write << myICOHeader._TYPE;
            Write << myICOHeader._COUNT;
            
            std::ifstream Read("test.bmp",std::ios::binary);
            if(Read.is_open()){
                ICOIndex myICOIndex;
                ICOBmp myICOBmp;
                unsigned short temp;
                Read >> temp;
                Read >> myICOIndex._SIZE;
                Read >> temp >> temp;
                Read >> myICOIndex._OFFSET;
                
                Read >> myICOBmp._HEADERSIZE;
                Read >> myICOBmp._WIDTH;
                Read >> myICOBmp._HEIGHT;
                Read >> myICOBmp._PLANES;
                Read >> myICOBmp._BITCOUNT;
                Read >> myICOBmp._COMPRESSION;
                Read >> myICOBmp._IMAGESIZE;
                Read >> myICOBmp._XPIXELSPERM;
                Read >> myICOBmp._YPIXELSPERM;
                Read >> myICOBmp._COLORSUNUSED;
                Read >> myICOBmp._COLORSIMPORTANT;
                
                myICOIndex._WIDTH = myICOBmp._WIDTH;
                myICOIndex._HEIGHT = myICOBmp._HEIGHT;
                myICOIndex._COLORCOUNT = 0;
                myICOIndex._V1 = myICOBmp._PLANES;
                myICOIndex._V2 = myICOBmp._BITCOUNT;
            
                Write << myICOIndex._WIDTH;
                Write << myICOIndex._HEIGHT;
                Write << myICOIndex._COLORCOUNT;
                Write << myICOIndex._RESERVED;
                Write << myICOIndex._V1;
                Write << myICOIndex._V2;
                Write << myICOIndex._SIZE;
                Write << myICOIndex._OFFSET;
            
                Write << myICOBmp._HEADERSIZE;
                Write << myICOBmp._WIDTH;
                Write << myICOBmp._HEIGHT;
                Write << myICOBmp._PLANES;
                Write << myICOBmp._BITCOUNT;
                Write << myICOBmp._COMPRESSION;
                Write << myICOBmp._IMAGESIZE;
                Write << myICOBmp._XPIXELSPERM;
                Write << myICOBmp._YPIXELSPERM;
                Write << myICOBmp._COLORSUNUSED;
                Write << myICOBmp._COLORSIMPORTANT;
            
                while(!Read.eof()){
                    unsigned char temp;
                    Read >> temp;
                    if(!Read.eof())
                        Write << temp;
                }
                Read.close();
            }
            Write.close();
        }
        return 0;
    }
    bij de raw data copy (die while(!Read.eof()) loop) komt ie nooit aan bij end of file en krijg ik dus een oneindig groot ico file... weet iemand miss wat ik niet goed doe
    thabitwoensdag 25 augustus 2010 @ 12:29
    Hier kun je beter gewoon de file-I/O-functies van C gebruiken in plaats van die streamzooi van C++.
    Cruise.Elroywoensdag 25 augustus 2010 @ 13:07
    Met operator>> zit je volgens mij formatted data in te lezen, gebruik gewoon getc() oid. Ik weet niet waarom eof() niet triggert, maar ik gebruik het te weinig...

    gooi in je read loopje een std::cout die de char output die net gelezen is (even casten naar int zodat je de waarde krijgt) dan zie je vanzelf waar het fout gaat. Ik kan me voorstellen dat hij bijv. een integer probeert te lezen in binaire stream vol willekeurige bytes, dan leest ie steeds 0 bytes uit als het niet begint met '0' - '9'
    Thomasswoensdag 25 augustus 2010 @ 18:52
    quote:
    Op woensdag 25 augustus 2010 12:23 schreef netolk het volgende:
    Hey, ik heb problemen met het maken van een ico...

    ik heb op http://www.hackerfactor.c(...)-Ico-Ico-Un-Day.html en op http://en.wikipedia.org/wiki/BMP_file_format gekeken, maar nu werkt de volgende code niet...
    SPOILER
    [ code verwijderd ]

    bij de raw data copy (die while(!Read.eof()) loop) komt ie nooit aan bij end of file en krijg ik dus een oneindig groot ico file... weet iemand miss wat ik niet goed doe
    Kijk eens naar de functies seekg en read van fstream. Houd er verder rekening mee dat je structs goed gepacked (dus dat iedere char maar 1 byte inneemt ipv 4)
    netolkdonderdag 26 augustus 2010 @ 10:35
    Het maakt niet uit wat ik doe of ik unformatted data lees of unsigned int/char lees hij blijft in een oneindige loop en geeft geen end of file aan...
    Cruise.Elroydonderdag 26 augustus 2010 @ 11:25
    Wat lees je dan uit, zet die zooi op het scherm en kijk waar het mis gaat. Toch niet zo enorm moeilijk?
    netolkdonderdag 26 augustus 2010 @ 12:17
    quote:
    Op donderdag 26 augustus 2010 11:25 schreef Cruise.Elroy het volgende:
    Wat lees je dan uit, zet die zooi op het scherm en kijk waar het mis gaat. Toch niet zo enorm moeilijk?
    nou op een gegeven moment leest ie alleen maar het zelfde getal uit...

    Ik dacht probeer eerst een een ico te lezen maar daar krijg ik ook allemaal rare code uit dus die structs zullen wel weer eens niet kloppen :( nouja dat bekijk ik later wel weer
    thabitdonderdag 26 augustus 2010 @ 12:39
    Die streams die zien het gewoon als een string ofzo. Dus als je de int 1234 op een stream zet met <<, dan zet hij er in feite de string "1234" erop (denk ik). Dat hele streamgebeuren in C++ is geen verbetering ten opzichte van C. (Sowieso kun je voor dit soort simpele file-conversies beter Python gebruiken, maar dat terzijde).
    Cruise.Elroydonderdag 26 augustus 2010 @ 12:44
    Je moet ook geen << operator gebruiken bij binary streams. Je wilt gewoon byte-voor-byte die data ophalen en wegschrijven met read en write. Als hij nog maar 1 getal uitleest, welke is dat dan? -1 ofzo?
    netolkdonderdag 26 augustus 2010 @ 15:08
    quote:
    Op donderdag 26 augustus 2010 12:44 schreef Cruise.Elroy het volgende:
    Je moet ook geen << operator gebruiken bij binary streams. Je wilt gewoon byte-voor-byte die data ophalen en wegschrijven met read en write. Als hij nog maar 1 getal uitleest, welke is dat dan? -1 ofzo?
    nee iets van 236825 ofzo het maakte niet uit of ik binary las en schreef of niet bleef het zelfde getal krijgen...
    Cruise.Elroydonderdag 26 augustus 2010 @ 16:18
    quote:
    Op donderdag 26 augustus 2010 15:08 schreef netolk het volgende:

    [..]

    nee iets van 236825 ofzo het maakte niet uit of ik binary las en schreef of niet bleef het zelfde getal krijgen...
    Gebruik je nog steeds << ? Want die moet je dus _niet_ gebruiken voor dit soort dingen

    edit: ik zie dat je hele grote getallen krijgt, dus je bent niet byte voor byte binair aan het lezen. Dat moet je wel doen aangezien een BMP/ICO file vol zit met binaire troep.
    Gooi dat getal er eens in HEX uit, misschien iets van 0xFFFF of 0x8000: een of andere errorwaarde.
    netolkdonderdag 26 augustus 2010 @ 17:05
    quote:
    Op donderdag 26 augustus 2010 16:18 schreef Cruise.Elroy het volgende:

    [..]

    Gebruik je nog steeds << ? Want die moet je dus _niet_ gebruiken voor dit soort dingen

    edit: ik zie dat je hele grote getallen krijgt, dus je bent niet byte voor byte binair aan het lezen. Dat moet je wel doen aangezien een BMP/ICO file vol zit met binaire troep.
    Gooi dat getal er eens in HEX uit, misschien iets van 0xFFFF of 0x8000: een of andere errorwaarde.
    Probleem is opgelost... Had eerst mn struct maar eens even in C++ geschreven in plaats van die windows meuk met byte enzo en daar hadden ze arrays dus dacht nou dat kan dan ook wel in 1 variabele maar dat kan dus niet XD

    Bedankt iedereen nu kan ik een ICO tenminste lezen, en moet schrijven ook niet zo moeilijk meer zijn...
    Cruise.Elroydonderdag 26 augustus 2010 @ 19:24
    Euh ok, logisch. ;)
    netolkvrijdag 27 augustus 2010 @ 23:38
    kan iemand mij uitleggen waarom dit niet werkt??
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int main(int argc,char *argv[]){
        for(int i = 0; i < argc; i++){ // tijdelijk
            std::cout << argv[i] << '\n';
        }
        if(argc > 1){
            if(argc == 2){
                if(argv[1] == "/?"){
                    std::cout << '\n' << argv[0] << " [bitmap 1] etc. \n\n";
                    std::cout << "[bitmap] File location of a bitmap (*.bmp)\n";
                    std::cout << "/?       Program help\n";
                }
        }
        return 0;
    }
    als ik mn programma nu aanroep met CreateICO.exe /? dan krijg ik het volgende te zien:
    1
    2
    CreateICO.exe
    /?
    maar dus niet het gedeelte dat in het if-statement staat...

    EDIT: code foutje

    [ Bericht 0% gewijzigd door netolk op 27-08-2010 23:44:59 ]
    thabitvrijdag 27 augustus 2010 @ 23:41
    if(argc = 2) moet if(argc == 2) zijn
    netolkvrijdag 27 augustus 2010 @ 23:45
    quote:
    Op vrijdag 27 augustus 2010 23:41 schreef thabit het volgende:
    if(argc = 2) moet if(argc == 2) zijn
    umja dat klopte idd ook niet maar het is niet de oplossing ik compile overigens met g++ niet dat dat uit zou moeten maken maar toch

    zo doet ie het overigens wel
    1if(argv[1][0] == '/' && argv[1][1] == '?')
    Maar dit word een error als je maar 1 digit mee geeft...
    EDIT: vind ik niet netjes geprogrammeerd en volgens mij zou het bovenste gewoon moeten werken

    [ Bericht 19% gewijzigd door netolk op 28-08-2010 00:07:48 ]
    thabitzaterdag 28 augustus 2010 @ 00:16
    O ja, C heeft geen strings, dus dat zijn dan pointers. Om strings te vergelijken kun je de string klasse van C++ gebruiken. string(argv[0]) == string(argv[1])
    netolkzaterdag 28 augustus 2010 @ 00:21
    ja, nu werkt het idd wel bedankt thabit :)
    Cruise.Elroyzaterdag 28 augustus 2010 @ 13:44
    netolk, je bent bekend met de string-zero opslag in C++ neem ik aan?
    Een string sla je dus op als een reeks char's, en je point dan naar het begin van de string. het einde van de string wordt aangegeven met een nul (als character kan je het schrijven als '\0')

    Als je dus twee strings wilt vergelijken moet je dus het volgende doen:
    1
    2
    3
    4
    5
    6
    7
    8
    bool compareStrings(const char* str1, onst char* str2)
    {
      for (int x = 0; str1[x] != 0 || str2[x] != 0; x++)
      { 
        if (str1[x] != str2[x]) return false;
      }
      return true;
    }
    deze lus loopt de beide strings af totdat er een verschil wordt gevonden, of totdat ze beide tegelijk aflopen. Oh en deze methode is niet optimaal en zit wss vol fouten, gebruik daarom de ingebouwde strcmp() functie.

    Of gebruik de std::string klasse uit de STL lib van C++, maar mss leuk om precies te weten wat je doet.
    netolkzondag 29 augustus 2010 @ 00:25
    quote:
    Op zaterdag 28 augustus 2010 13:44 schreef Cruise.Elroy het volgende:
    netolk, je bent bekend met de string-zero opslag in C++ neem ik aan?
    Een string sla je dus op als een reeks char's, en je point dan naar het begin van de string. het einde van de string wordt aangegeven met een nul (als character kan je het schrijven als '\0')

    Als je dus twee strings wilt vergelijken moet je dus het volgende doen:
    [ code verwijderd ]

    deze lus loopt de beide strings af totdat er een verschil wordt gevonden, of totdat ze beide tegelijk aflopen. Oh en deze methode is niet optimaal en zit wss vol fouten, gebruik daarom de ingebouwde strcmp() functie.

    Of gebruik de std::string klasse uit de STL lib van C++, maar mss leuk om precies te weten wat je doet.
    Dit klinkt idd logisch had ik zelf nog niet aan gedacht :) maar ik heb voor het makkelijkke maar gewoon de std::string gebruikt
    Cruise.Elroyzondag 29 augustus 2010 @ 15:33
    Vergeet niet dat je bij elke string() call wel een stukje geheugen alloceert etc. Als je met std::string werkt, probeer dan zo snel mogelijk (en 1-malig) alle inkomende char* naar strings te converteren, en werk daarna met const string& referenties (of pointers) om zo het onnodig aanmaken van strings te voorkomen. :)

    Niet dat je daarmee in de problemen zal komen, tenzij je echt tijdkritieke code gaat schrijven. :)
    netolkmaandag 30 augustus 2010 @ 23:35
    quote:
    Op zondag 29 augustus 2010 15:33 schreef Cruise.Elroy het volgende:
    Vergeet niet dat je bij elke string() call wel een stukje geheugen alloceert etc. Als je met std::string werkt, probeer dan zo snel mogelijk (en 1-malig) alle inkomende char* naar strings te converteren, en werk daarna met const string& referenties (of pointers) om zo het onnodig aanmaken van strings te voorkomen. :)

    Niet dat je daarmee in de problemen zal komen, tenzij je echt tijdkritieke code gaat schrijven. :)
    Ik laat hem een tijdelijk object aanmaken voor het if-statement gebeuren

    zoiets als dit
    1
    2
    3
    if(std::string(argv[1]) == "/?"){
      //code
    }
    Cruise.Elroydinsdag 31 augustus 2010 @ 00:06
    quote:
    Op maandag 30 augustus 2010 23:35 schreef netolk het volgende:

    [..]

    Ik laat hem een tijdelijk object aanmaken voor het if-statement gebeuren

    zoiets als dit
    [ code verwijderd ]


    ja dat mag, maar kijk uit voor bijv:

    1
    2
    3
    4
    if (std::string(bla) == "hoi") func_hoi0();
    else if (std::string(bla) == "hoi1") func_hoi1();
    else if (std::string(bla) == "hoi2") func_hoi2();
    else if (std::string(bla) == "hoi3") func_hoi3();
    maak er dan van:
    1
    2
    3
    4
    5
    std::string blastr = std::string(bla);
    if (blastr == "hoi") func_hoi0();
    else if (blastr == "hoi1") func_hoi1();
    else if (blastr == "hoi2") func_hoi2();
    else if (blastr == "hoi3") func_hoi3();
    Ik weet niet wat de operator==() van std::string allemaal accepteert, het zou zelfs kunnen zijn dat hij de rechterkant ook steeds naar strings zit om te zetten voordat ie vergelijkt.
    netolkdonderdag 2 september 2010 @ 07:10
    volgens mij accepterend string ook (const) char strings
    thabitdonderdag 2 september 2010 @ 10:50
    Elke keer als je a == b doet, dan wordt de methode operator== van a uitgevoerd, met b als input. Dus a.operator==(b) wordt dan uitgevoerd. Nu zal dat in elk geval voor een const string& b gedefinieerd zijn, maar waarschijnlijk dus ook voor een const char* b.
    Cruise.Elroydonderdag 2 september 2010 @ 11:12
    ja ik had het nagezocht, en dat is idd zo. Vergeet niet dat std::string een specialisatie is van std::basicstring<> maar deze heeft nog extra functies om handig met de "ouderwetse" string0s uit C om te kunnen gaan ;)
    1typedef basic_string<char> string;
    netolkdonderdag 2 september 2010 @ 14:26
    quote:
    Op donderdag 2 september 2010 11:12 schreef Cruise.Elroy het volgende:
    ja ik had het nagezocht, en dat is idd zo. Vergeet niet dat std::string een specialisatie is van std::basicstring<> maar deze heeft nog extra functies om handig met de "ouderwetse" string0s uit C om te kunnen gaan ;)
    [ code verwijderd ]

    Top dan kan ik het gewoon zo laten staan dus :P
    Cruise.Elroydonderdag 2 september 2010 @ 14:37
    Dat kan sowieso, als je er 20.000 per seconde gaat doen, dan wordt het pas een issue ;)
    netolkdonderdag 2 september 2010 @ 21:17
    quote:
    Op donderdag 2 september 2010 14:37 schreef Cruise.Elroy het volgende:
    Dat kan sowieso, als je er 20.000 per seconde gaat doen, dan wordt het pas een issue ;)
    :P nee dat was ik niet van plan XD maar ik wil wel zo efficiënt mogelijke code schrijven
    thabitdonderdag 2 september 2010 @ 21:20
    Premature optimization is the root of all evil.
    Cruise.Elroyvrijdag 3 september 2010 @ 10:15
    Ja, maar er vroeg rekening mee houden is wel heel belangrijk. :7
    netolkzaterdag 18 september 2010 @ 10:04
    Is het ook mogelijk om te zien of de knoppen op je toetsenbord zijn pressed/relased zonder de Windows.h header?? Dat het progje zeg maar op elke unix systeem kan draaien
    Cruise.Elroymaandag 20 september 2010 @ 13:11
    Nee, niet makkelijk volgens mij. Bijna alle standaard I/O is min of meer console-achtig.
    Wat je kan doen is een frame-workje ergens downloaden die cross-platform is en die dingen goed wrapt.
    netolkmaandag 20 september 2010 @ 15:05
    quote:
    Op maandag 20 september 2010 13:11 schreef Cruise.Elroy het volgende:
    Nee, niet makkelijk volgens mij. Bijna alle standaard I/O is min of meer console-achtig.
    Wat je kan doen is een frame-workje ergens downloaden die cross-platform is en die dingen goed wrapt.
    hmm.. oke bedankt in ieder geval
    Cruise.Elroymaandag 20 september 2010 @ 15:12
    Het is trouwens echt een van de meest vervelende "features" van C++, dat je dat niet wat makkelijker kan opvragen, daardoor kan je met "standaard" C++ eigenlijk geen real-time applicaties maken. :P
    thabitmaandag 20 september 2010 @ 15:32
    C++ is dan ook meer een verzameling hacks bij elkaar dan een echte programmeertaal. :P
    Cruise.Elroymaandag 20 september 2010 @ 15:38
    quote:
    Op maandag 20 september 2010 15:32 schreef thabit het volgende:
    C++ is dan ook meer een verzameling hacks bij elkaar dan een echte programmeertaal. :P
    Troll :D
    netolkmaandag 20 september 2010 @ 22:21
    quote:
    Op maandag 20 september 2010 15:32 schreef thabit het volgende:
    C++ is dan ook meer een verzameling hacks bij elkaar dan een echte programmeertaal. :P
    _O- _O-

    quote:
    Op maandag 20 september 2010 15:38 schreef Cruise.Elroy het volgende:
    Troll :D
    thabitmaandag 20 september 2010 @ 23:04
    Face it, mensen: het is niet goed porteerbaar, het heeft geen geheugenmanagement met garbage collector, het heeft geen goede ondersteuning voor parallelisatie (nee, pthread telt niet). 't Is eigenlijk gewoon een verkapte assembly en alleen handig voor kleine libraryfuncties die tot op de bit geoptimaliseerd moeten zijn.
    progjemaandag 20 september 2010 @ 23:14
    :')
    Trollface.dinsdag 21 september 2010 @ 08:10
    Ga eens ergens anders trollen. :')
    Cruise.Elroydinsdag 21 september 2010 @ 13:29
    quote:
    Op maandag 20 september 2010 23:04 schreef thabit het volgende:
    Face it, mensen: het is niet goed porteerbaar, het heeft geen geheugenmanagement met garbage collector, het heeft geen goede ingebouwde ondersteuning voor parallelisatie. t Is eigenlijk gewoon een verkapte assembly en alleen handig voor kleine libraryfuncties die tot op de bit geoptimaliseerd moeten zijn en real-time applicaties en games waar elke ms telt en geheugen vaak de halve GB net haalt.
    Dit klopt allemaal, maar dat komt gewoon omdat de taal op een bepaald abstractieniveau zit. Maakt de taal niet slecht, gewoon krachtiger maar minder geschikt voor RAD.
    netolkdinsdag 21 september 2010 @ 17:01
    quote:
    Op dinsdag 21 september 2010 13:29 schreef Cruise.Elroy het volgende:

    [..]

    Dit klopt allemaal, maar dat komt gewoon omdat de taal op een bepaald abstractieniveau zit. Maakt de taal niet slecht, gewoon krachtiger maar minder geschikt voor RAD.
    _O-
    thabitdinsdag 21 september 2010 @ 17:28
    Natuurlijk speel ik advocaat van de duivel hier, maar af en toe heb ik het idee dat de keuze van sommige mensen voor C++ als programmeertaal sterke analogieën met godsdienstwaanzin vertoont.
    Cruise.Elroywoensdag 22 september 2010 @ 16:23
    Met zo'n advocaat moet de duivel maar hopen dat ie niet wordt aangeklaagd.
    netolkwoensdag 22 september 2010 @ 21:38
    Goede avond, ik kwam code tegen voor een "chat" programma'tje alleen is dit dus voor linux geschreven en mis ik de volgende headers:
    1
    2
    3
    arpa/inet.h
    netdb.h
    netinet/in.h
    SPOILER
    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
    #include <arpa/inet.h>
    #include <netdb.h>
    #include <netinet/in.h>
    #include <unistd.h>
    #include <iostream>

    #define MAX_MSG 100
    #define LINE_ARRAY_SIZE (MAX_MSG+1)

    using namespace std;

    int main()
    {
      int listenSocket, connectSocket, i;
      unsigned short int listenPort;
      socklen_t clientAddressLength;
      struct sockaddr_in clientAddress, serverAddress;
      char line[LINE_ARRAY_SIZE];

      cout << "Enter port number to listen on (between 1500 and 65000): ";
      cin >> listenPort;

      // Create socket for listening for client connection requests.
      listenSocket = socket(AF_INET, SOCK_STREAM, 0);
      if (listenSocket < 0) {
        cerr << "cannot create listen socket";
        exit(1);
      }
      
      // Bind listen socket to listen port.  First set various fields in
      // the serverAddress structure, then call bind().
      // htonl() and htons() convert long integers and short integers
      // (respectively) from host byte order (on x86 this is Least
      // Significant Byte first) to network byte order (Most Significant
      // Byte first).
      serverAddress.sin_family = AF_INET;
      serverAddress.sin_addr.s_addr = htonl(INADDR_ANY);
      serverAddress.sin_port = htons(listenPort);
      
      if (bind(listenSocket,
               (struct sockaddr *) &serverAddress,
               sizeof(serverAddress)) < 0) {
        cerr << "cannot bind socket";
        exit(1);
      }

      // Wait for connections from clients.
      // This is a non-blocking call; i.e., it registers this program with
      // the system as expecting connections on this socket, and then
      // this thread of execution continues on.
      listen(listenSocket, 5);
      
      while (true) {
        cout << "Waiting for TCP connection on port " << listenPort << " ...\n";

        // Accept a connection with a client that is requesting one.  The
        // accept() call is a blocking call; i.e., this thread of
        // execution stops until a connection comes in.
        // connectSocket is a new socket that the system provides,
        // separate from listenSocket.  We *could* accept more
        // connections on listenSocket, before connectSocket is closed,
        // but this program doesn't do that.
        clientAddressLength = sizeof(clientAddress);
        connectSocket = accept(listenSocket,
                               (struct sockaddr *) &clientAddress,
                               &clientAddressLength);
        if (connectSocket < 0) {
          cerr << "cannot accept connection ";
          exit(1);
        }
        
        // Show the IP address of the client.
        // inet_ntoa() converts an IP address from binary form to the
        // standard "numbers and dots" notation.
        cout << "  connected to " << inet_ntoa(clientAddress.sin_addr);

        // Show the client's port number.
        // ntohs() converts a short int from network byte order (which is
        // Most Significant Byte first) to host byte order (which on x86,
        // for example, is Least Significant Byte first).
        cout << ":" << ntohs(clientAddress.sin_port) << "\n";

        // Read lines from socket, using recv(), storing them in the line
        // array.  If no messages are currently available, recv() blocks
        // until one arrives.
        // First set line to all zeroes, so we'll know where the end of
        // the string is.
        memset(line, 0x0, LINE_ARRAY_SIZE);
        while (recv(connectSocket, line, MAX_MSG, 0) > 0) {
          cout << "  --  " << line << "\n";

          // Convert line to upper case.
          for (i = 0; line[i] != '\0'; i++)
            line[i] = toupper(line[i]);

          // Send converted line back to client.
          if (send(connectSocket, line, strlen(line) + 1, 0) < 0)
            cerr << "Error: cannot send modified data";

          memset(line, 0x0, LINE_ARRAY_SIZE);  // set line to all zeroes
        }
      }
      return 0;
    }
    Weet iemand hoe ik deze code onder Windows kan laten werken?

    PS. Ik gebruik de mingw compiler...
    ReWoutwoensdag 22 september 2010 @ 21:46
    :o
    Cruise.Elroywoensdag 22 september 2010 @ 21:47
    Onder Windows kan je winsock.h gebruiken, werkt nagenoeg hetzelfde, maar je zal hier en daar wat calls moeten versleutelen.
    netolkwoensdag 22 september 2010 @ 21:48
    quote:
    Op woensdag 22 september 2010 21:47 schreef Cruise.Elroy het volgende:
    Onder Windows kan je winsock.h gebruiken, werkt nagenoeg hetzelfde, maar je zal hier en daar wat calls moeten versleutelen.
    Oke bedankt ik zal eens even een beetje gaan kloten met die winsock header en kijken of ik er wat uit kan krijgen...
    Cruise.Elroydonderdag 23 september 2010 @ 10:08
    Nog gelukt? Want winsock zou redelijk gelijk moeten zijn aan de standaard berkley sockets interface, zeker voor simpele apps. :)

    http://en.wikipedia.org/wiki/Berkeley_sockets
    netolkdonderdag 23 september 2010 @ 20:29
    quote:
    Op donderdag 23 september 2010 10:08 schreef Cruise.Elroy het volgende:
    Nog gelukt? Want winsock zou redelijk gelijk moeten zijn aan de standaard berkley sockets interface, zeker voor simpele apps. :)

    http://en.wikipedia.org/wiki/Berkeley_sockets
    Nou ik ben eerst maar begonnen met het volgen van een tut ipv dat example te draaien
    Cruise.Elroyvrijdag 24 september 2010 @ 11:11
    Net even een snelle echo gedraaid met hulp van een snelle opfris door MSDN. :P
    Dit programma echo'ed alles terug totdat hij een zending binnenkrijgt dat begint met 'x'.

    Enige libfile die je nodig hebt is Ws2_32.lib (in Visual Studio)

    Sockets zijn echt heel simpel, maar je moet het model even doorhebben van sockets en adressen:
    Elke verbinding naar de buitenwereld is een socket (maken met socket())

    Als je een verbinding wilt ontvangen moet je dus een aanspreekpunt hebben. Eerst koppel je een socket aan een adres. (adres = ip + port) met bind() daarna zet je hem op luisterstand met listen()
    Als je zelf verbinding wilt maken gebruik je simpelweg connect()

    Als een verbinding binnenkomt op je luisterende socket, kan deze verbinding worden gebruikt om een nieuwe socket te maken waar je vervolgens mee kan praten met send()/recv(). Dit doe je met accept().
    accept() blijft blocken totdat er een verbinding beschikbaar is. (kan je ook anders instellen overigens)
    Je luister socket blijft overigens ook gewoon doordraaien dus je kan daar steeds accept() op blijven aanroepen om nieuwe inkomende verbindingen op te vangen.

    Hou ook in de gaten dat elke TCP verbinding uniek moet zijn in zijn begin- en eind-adres. dat betekent dat je dus maar 1 connectie kan hebben van een specifiek adres naar een listen socket (die een vast adres heeft). Als je een uitgaande socket aanmaakt met connect() zal het adres van dit socket ook een willekeurige port meekrijgen tenzij je daarvoor expliciet een bind hebt gedaan, zodat je meerdere verbinden kan maken naar een server vanaf 1 IP. :) Als je je netwerkverkeer zit te bekijken wat binnenkomt zal je zien dat de inkomende adressen dus allemaal rare poorten hebben. :P dat is dus by design.

    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
    #include "stdafx.h"
    #include "windows.h"
    #include "iostream"
    #include "stdlib.h"
    #include "winsock.h"
    #include "assert.h"
    int _tmain(int argc, _TCHAR* argv[])
    {
      WSADATA wsadata;
      int result = WSAStartup(MAKEWORD(2,2), &wsadata); //using winsock version 2.2
      assert(result == 0);

      SOCKET listener;
      listener = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

      sockaddr_in localip;
      localip.sin_family = AF_INET;
      localip.sin_addr.s_addr = inet_addr("127.0.0.1");
      localip.sin_port = htons(12345);
      
      result = (bind(listener, (SOCKADDR*) &localip, sizeof(localip)));
      assert(result == 0);

      listen(listener, SOMAXCONN);

      SOCKET incoming;
      incoming = accept(listener, NULL, NULL );
      int error = WSAGetLastError();
      assert(incoming != INVALID_SOCKET);
      closesocket(listener); // close listener, no longer needed, otherwise could be used again


      char buffer[100];
      while (1)
      {
        int bytesreceived = recv(incoming, buffer, sizeof(buffer), 0);
        if (buffer[0] == 'x') break;
        send(incoming, buffer, bytesreceived, 0);
      }
      WSACleanup();
      return 0;
    }
    Enige tricky gedeelte van de code is evt het casten tussen SOCKADDR en sockaddr_in structs. Moet je verder niet te veel op letten, je kan in de headers gaan kijken hoe dat precies zit.

    Oh en htons() en co. zijn functies om endian om te draaien etc. Er zijn ook functies om hostnamen op te zoeken (getaddrinfo()) en nog een hele reeks andere handige functies.

    Let op dat windows naast de standaard socket systemen ook nog allemaal andere toevoegingen heeft gemaakt, die zijn handig maar je kan daarna dus niet makkelijk meer poorten als je die eenmaal gaat gebruiken (beginnen vaak met WSA.....)

    [ Bericht 16% gewijzigd door Cruise.Elroy op 24-09-2010 12:47:18 ]
    netolkvrijdag 24 september 2010 @ 15:24
    Ik heb op deze site ook een paar examples gevonden

    maar die van jou is ook wel handig :P

    bedankt
    Cruise.Elroyvrijdag 24 september 2010 @ 16:48
    Leuke site, behandeld ook Overlapped I/O op een goede manier, dat zie je idd niet vaak :Y
    netolkvrijdag 24 september 2010 @ 18:36
    ik heb nu alleen het probleem... Dat example van die site dus (die rot13server) probeer ik te draaien dat werkt gewoon alleen nu heb ik een client gemaakt die daar mee kan "praten". de connect werkt gewoon client kan data verzenden maar de server kan het niet ontvangen... Weet iemand waar het aan kan liggen??

    PS. als ik source code moet posten hoor ik het wel
    Cruise.Elroyzaterdag 25 september 2010 @ 01:05
    Is de verbinding in stand gebracht? wat zijn je error-codes voor recv()? gebruik WSAGetLastError om evt extra info te krijgen. :)
    netolkzaterdag 25 september 2010 @ 16:35
    de error die WSAGetLastError geeft is 10054...
    De verbinding is gemaakt ect. en de recv van de server creëert dus die error (10054)

    Op internet staat dat dit de error code is dat de client de connectie verbreekt... Alleen is dit (volgens mij) niet zo

    [ Bericht 31% gewijzigd door netolk op 25-09-2010 17:02:55 ]
    Cruise.Elroyzaterdag 25 september 2010 @ 19:53
    Ja dat zal je toch echt even zelf moeten debuggen, ik denk dat de client gewoon de verbinding verbreekt zodra hij verbinding heeft gemaakt. Iig een program-flow fout van jouw kant waarschijnlijk. :)
    netolkzaterdag 25 september 2010 @ 22:46
    quote:
    Op zaterdag 25 september 2010 19:53 schreef Cruise.Elroy het volgende:
    Ja dat zal je toch echt even zelf moeten debuggen, ik denk dat de client gewoon de verbinding verbreekt zodra hij verbinding heeft gemaakt. Iig een program-flow fout van jouw kant waarschijnlijk. :)
    Ja dat klopt idd het is nu opgelost maar ik kan nergens een duidelijk lijstje vinden van de fout codes van WSAGetLastError()...
    Cruise.Elroyzaterdag 25 september 2010 @ 23:40
    http://msdn.microsoft.com/en-us/library/ms740668(v=VS.85).aspx
    netolkzondag 26 september 2010 @ 00:11
    dankje :P
    Cruise.Elroymaandag 27 september 2010 @ 09:26
    gelukt?
    fuck, nieuw deel [C(++)] voor dummies - Deel 2

    [ Bericht 61% gewijzigd door Cruise.Elroy op 27-09-2010 10:17:29 ]