Plugins en C++

Dit heeft geen zak te maken met pointers of jouw insteek, dit heeft te maken met waarderen wanneer mensen tijd uit hun leven nemen om je vragen te beantwoorden.

In plaats van de discussie over pointers te verplaatsen zou je je ook eens een keer kunnen inleven in de vele mensen die je geholpen hebben en inzien dat de manier waarop je reageert vaak neerbuigend en zeer onprettig is. Je verteld mensen met vele malen meer kennis dan jijzelf dat jij het beter weet, terwijl je ze de dag daarvoor nog eindeloos veel newbie vragen hebt gesteld.

Doet het je dan echt niets?
 
Voor een iets andere aanpak van pointers kun je ook eens naar C# kijken.
Dan heb je de voordelen van een hogere programmeertaal en toch een aantal opties om op een lager(machine) niveau te werken.
Echt kritische routines zou je alsnog in C of C++ kunnen schijven en ze vervolgens te linken aan de main module.
Ik zou dat niet echt heel prettig vinden, 2 programmeertalen door elkaar heen gebruiken betekent context wisselen en dubbel zoveel te leren.
Daarnaast is C# (net als Java en Go) een taal met automatisch geheugenbeheer. Daar bepaalt een 'garbage collector' zelf wanneer het geheugen vol raakt en wordt je programma af en toe onderbroken om het op te ruimen. Dat wil je liever niet als je met real-time audio toepassingen bezig bent. Er is wel omheen te werken maar dan gebruik je de taal weer niet zoals die bedoeld is.
 
dunning-kruger in full effect en geen enkle vorm van zelfintrospectie + dikke laag arrogantie .

Stoppen met die handel
 
Gezellig hobby forum hier. En volop waardering voor mensen die hun eigen weg zoeken. Ahum. :D
 
Gezellig hobby forum hier. En volop waardering voor mensen die hun eigen weg zoeken. Ahum. :D
Er wordt op veel manieren getracht om te helpen. Met name mbt het begrip van pointers.
Dat jij je eigen weg zoekt is lovenswaardig. Maar het gebruik van pointers in C/C++ is zoals het is.
Er zijn veel voorbeelden aangedragen om je met de syntax en het gebruik te helpen. Wil je die talen gebruiken dan dien je je te conformeren aan de syntax.
Commentaar geven op de wijze van notatie en gebruik is zinloos omdat de talen niet zullen veranderen.
Het beste advies wat rest is om veel voorbeelden te zoeken en deze te testen. Vooral flink fouten maken en vervolgens uitzoeken wat er fout is zal je een goed inzicht geven.
 
Ik heb inmiddels ook zelf een manier bedacht om de zin en werking van pointers in C++ voor mijzelf helder te krijgen. Dat behelst een vertaalslag naar een formalisme dat ik wel begrijp. Bij de eerste tests lijkt het te kloppen, maar ik moet het nog verder uitproberen. Maar niemand die daar ook maar enige belangstelling voor toont. Sterker nog - de gedachte alleen al dat ik met een eigen insteek zou kunnen komen om pointers te begrijpen wordt mij al kwalijk genomen. Het moet en zal op de wijze waarop de heren hier het ooit ook zelf geleerd hebben! En wie iets anders probeert wordt hier al bij voorbaat voor een arrogante nitwit en idioot uitgemaakt. Maar het is mijn hobby, en ik doe het zoals ikzelf wil. Mijn advies - als mijn aanpak je niet interesseert laat dit topic dan gewoon links liggen als betrof het een muzieksoort die je niet bevalt.
 
Steeds als ik even dit draadje lees heb ik een hele tijd het nummer 'Fire' in m'n hoofd. Je weet wel, de uitvoering door... The Pointer Sisters.

:D
 
Dit lijkt er meer op:



Mensen lopen zich hier onnodig op te winden. Ik ben gewoon wat aan het hobbyen, no big deal.
 
Het heeft mij een hele tijd geduurd om door te krijgen wat pointers zijn en elke soort andere uitleg is een beetje op me afgeketst, dus ik snap de pijn. Het is niet voor niks dat andere talen om het probleem heen proberen te werken.

Het volgende is meer pseudocode dan correct C dus zie dat even over het hoofd. Kans zit er ook in dat er fouten in zitten; that's an exercise for the reader.

OK, het probleem is als volgt:

int function add(int a, int b){
return a+b;
}

Wat er hier gebeurt is dat je een functie hebt die add heet. De functie krijgt twee argumenten met zich mee; a en b. De functie geeft de som terug. Simpeler kan het niet!

Als ik dit doe:

int first = 3;
int second = 4;
int sum = add(first,second);

Dan wordt er op de achtergrond iets gedaan wat je niet in de code ziet.

Er wordt bij int first = 3 een geheugenlocatie gereserveerd en bij int second = 4 ook. Deze hebben beiden een adres.

Als deze vervolgens de functie in worden geyeet worden er stiekem kopietjes van gemaakt. Die kopietjes staan op een andere locatie dan waar first en second op staan. Die kopietjes worden vervolgens bij elkaar opgeteld, en dan stuurt de functie het resultaat terug. Omdat je dan uit de functie springt mogen deze stukken geheugen weer als vrij worden gemarkeerd, want de levensduur van de variabele duurt net zo lang als de scope van de functie.

Vaak is dit wenselijk. Een functie rommelt niet met dingen in de omgeving en al het werk vind in een geisoleerd stukje plaats. No side-effects.

Dit op de achtergrond kopietjes maken heet pass by value.

Als tegenhanger heb je pass by reference.

Wat voor probleem los je hier mee op? Nou, een hele ris problemen. Een van de regeltjes in C is dat een functie altijd maar 1 return value heeft. Ik kan dus geen functie genaamd addAndMultiply schrijven die zowel a+b als a*b teruggeeft.

Maar, dat kan ik wel. Ik kan beide getallen in een struct stoppen en die struct teruggeven. Er zijn een hele ris workarounds die je kunt verzinnen van ontzettend goor en niet te onderhouden tot redelijk maar eigenlijk nog steeds rommel.

Maar - we kunnen ook dit doen:

We maken een functie:

void addAndMultiply(int a, int b, int &mult, int &sum){
*mult = a*b;
*sum = a+b;
}

Je ziet dat deze functie niks meer teruggeeft. Dat hoeft ook niet meer.

En zo roepen we 'm aan:
int multiplyResult = 0;
int sumResult = 0;
int *multiplyPointer = &multiplyResult;
int *sumPointer = &sumResult;

int first = 3;
int second = 4;

addAndMultiply(first, second);

Als ik nu kijk wat er in multiplyResult en sumResult zit is dat 12 en 7 respectievelijk.

Dus nu heeft de functie een soort achterdeurtje - zonder iets in de achtergrond te kopieren en zonder ergens naar toe te springen kan de functie nu met een waarde rommelen die er buiten ligt. Een functie krijgt een soort lijntje mee dat naar een adres leidt en die kan daar waardes in dumpen of uit lezen.

Dit zit eigenlijk best dicht tegen de machine aan, want je weet zo dingen die je eigenlijk niet hoeft te weten. Voor performance is dat mooi, want je kunt je geheugen zodanig inrichten dat dingen altijd op dezelfde plaats staan of allemaal netjes naast elkaar staan, en dat is weer fijn voor performance. Het is ook minder fijn voor veiligheid, want als een ander programma gewoon doodleuk mag uitlezen wat je in je geheugen hebt is dat een gapend veiligheidslek. Zie ook Real mode - Wikipedia .

Een int is natuurlijk supersimpel. Een struct is al minder simpel, en je kunt hele complexe objecten maken die best wel een ris geheugen innemen. Als je die elke keer by value moet meegeven wordt er een hoop geheugen van A naar B gekopieerd terwijl dat eigenlijk niet nodig is.

Zoals je begrijpt maakt dit dingen ook wat minder transparant. Omdat een functie nu op deze manier dingen kan aanpassen krijg je een hoop void functies waarvan je niet weet wat ze doen, en als je je pointers niet netjes initialiseert en opruimt is dat een recept voor crashes.

De rest mag je zelf uitvinden, maar ga gewoon een cursus op Udemy of zo doen, want dat werkt veel beter dan hier vragen en hopen dat je een antwoord krijgt.



Maar om even terug te komen op het commentaar:

Denk je even in dat iemand vragen stelt over synthesizers die voor ervaren gebruikers superbasic lijken. Voor elk stapje moet de hand vastgehouden worden.

Op een gegeven moment word je daar zelf behoorlijk gefrustreerd van want je bent voor niks helpdeskmedewerker aan het spelen. Op een gegeven moment moet de persoon die de vragen stelt gewoon de shit aansluiten en dingen zelf proberen en door fouten te maken er achter komen hoe het wel werkt. Maar - zonder proberen geen leren, en zonder fouten geen leren.

Toch?

Communities work because of reciprocity. Ik doe iets voor jou, jij doet iets voor mij. Als het niet lijkt alsof jij er iets voor terugkrijgt word je daar ook niet vrolijk van.

"Dan klik niet op de thread" - nee, zo werkt het niet. Dan begin je er gewoon een nieuwe, want je krijgt niet de antwoorden die je wil ;)

En wat je nu vraagt komt eigenlijk neer op een 4-jarige HBO-opleiding. Dat kun je niet met 15 pagina's discussie op een forum overbrengen. Programmeren leren breekt je hersens op een speciale manier.
 
Ik heb inmiddels ook zelf een manier bedacht om de zin en werking van pointers in C++ voor mijzelf helder te krijgen. Dat behelst een vertaalslag naar een formalisme dat ik wel begrijp. Bij de eerste tests lijkt het te kloppen, maar ik moet het nog verder uitproberen. Maar niemand die daar ook maar enige belangstelling voor toont. Sterker nog - de gedachte alleen al dat ik met een eigen insteek zou kunnen komen om pointers te begrijpen wordt mij al kwalijk genomen. Het moet en zal op de wijze waarop de heren hier het ooit ook zelf geleerd hebben! En wie iets anders probeert wordt hier al bij voorbaat voor een arrogante nitwit en idioot uitgemaakt. Maar het is mijn hobby, en ik doe het zoals ikzelf wil. Mijn advies - als mijn aanpak je niet interesseert laat dit topic dan gewoon links liggen als betrof het een muzieksoort die je niet bevalt.

Is allemaal niet nodig. Ik heb begrepen dat je een universitair geschoolde Pascal-guru bent en daarmee kunnen wij jouw vraag heel simpel beantwoorden en kan dit topic op slot en kun jij weer verder met coderen:

Operatie:Pascal:C/C++
Reference@&
Dereference:^*
Declaratie pointer middels dereference symbool:var
a: Integer;
ap: ^Integer;
int a;
int *a;

Ik heb gemerkt dat ik me er nog niet helemaal overeen heb kunnen zetten dus ik zocht een creatieve uitlaatklep. Dit is echt mijn laatste post in dit topic temeer het nu voor eens en voor altijd beantwoord is met bovenstaande tabel.


 
Ik voel me inmiddels net een bejaarde die tegen zijn wil naar de overkant van de weg geholpen wordt. Ik heb al een vierjarige HTS opleiding elektrotechniek gevolgd met specialisatie informatietechniek, plus nog eens twee jaar natuurkunde aan de universiteit. Daar ligt het niet aan. Bovendien heb ik hier al herhaalde malen gemeld dat het begrijpen van wat pointers zijn het probleem niet is. Wat mij in de weg zit is de lelijke en verwarrende syntax van C++. Alle goed bedoelde antwoorden die ik hier gekregen heb schieten hun doel dan ook voorbij, want ze gaan niet in op het punt waar ik mee zit. Of beter gezegd: op het punt waar ik mee zat, want ik denk inmiddels zelf al een oplossing gevonden te hebben. Dus iedereen wordt hartelijk bedankt voor de gedane moeite :halleluja, maar het is al klaar.

Verdere uitleg over pointers is onnodig. Dus bespaar u de moeite. Duidelijker kan ik niet zijn.
 
Hier dan mijn visie op de betekenis van pointers binnen C++:

C++ bevat onder meer commando’s en objecten.

Binnen C++ is een object x eigenlijk een geordend paar (t,g) met t een type-aanduiding en g de inhoud van een geheugenadres. Type-aanduidingen worden door de compiler gebruikt maar daarna (uitzonderingen daargelaten) niet langer als onderdeel van de gegenereerde machinetaal in het geheugen opgeslagen. Dat neemt evenwel niet weg dat de type-aanduiding een essentiële rol vervult in hoe pointers binnen C++ functioneren.

Hoe ik dat begrijp:

1. Ik geef de inhoud van een geheugenadres a aan met: inhoud(a).

2. Ik geef het geheugenadres waar een object b is opgeslagen aan met: adres(b).

3. De interpretatie van de geheugeninhoud g als een ding van type t maakt er iets specifieks van zoals een integer, een float, etc. Deze geïnterpreteerde betekenis van g als een ding van type t noteer ik als: interp(t,g).

4. Voor objecten x = (t,g) noteer ik het type t van x als: type(x).

5. Voor objecten x = (t,g) noteer ik de waarde w van x als: waarde(x).

6. Merk op dat dan voor x = (t,g) geldt dat: waarde(x) = interp(t,g).

7. Een declaratie van de vorm “t x” in C++ kan ik nu schrijven als: type(x) = t.

8. Als we een object tegelijk een type en een (begin)waarde toekennen dan heet dat een definitie of initialisatie. Dat gaat zo: “t x = w”. Ik noteer dat als: x = (t,g) met g zodanig dat w = interp(t,g).

9. Het toewijzen van een (nieuwe) waarde w aan een object x heet een assignment: “x = w”. Ik schrijf dat als: x = (t,g) met g zodanig dat w = interp(t,g).

10. De referencing of address-of operator &( ) levert onder meer het geheugenadres van een ingevuld object. Maar het ingevulde object moet een lvalue hebben. Voor x = (t,g) hebben we dan:

&(x) = (t*,adres(x)) (waarbij “&(x)” vaak wordt afgekort tot “&x”).

11. De dereferencing of indirection operator *( ) toegepast op een pointer levert het object waar de pointer naar wijst (als zo’n object bestaat). We bekijken hier alleen gewone pointers. Voor pointers ptr = (t*,g) naar een object x heb ik dan:

*(ptr) = (t , inhoud(adres(x))) (waarbij “*(ptr)” vaak wordt afgekort tot “*ptr”).

12. Dubbelzinnigheden en verwarring binnen C++ kunnen nu worden voorkomen door de declaratie van een pointer ptr als zijnde van het type t* te schrijven als “t* ptr” in plaats van “t *ptr”. En zo is het voor de declaratie van een variabele x als zijnde van het type t& ook beter om te schrijven “t& x” dan “t &x”. Dit voorkomt dat “t *ptr” en “t &x” worden gezien als declaraties van *ptr en &x .

13. Bij het printen vanuit C++ van een variabele x = (t,g) wordt eigenlijk interp(t,g) geprint.
 
Duurde best lang voordat het ruzie werd deze keer. Misschien heb je meer aan een cursus basale omgangsvormen.
 
@ProgHead

&a hoef je níet te declareren en is geen type in de zin van dat deze een declaratie nodig heeft. schrijf ik hetzelfde in 1 zin.

simpel: &a kun je zonder declaratie en dus zonder type gebruiken.......... in zekere zin zeer logisch. een pointer moet wel worden gedefinieerd, dat is ook zeer logisch.

ook

t* p;

is zeker mogelijk, maar werkt niet voor

t* p, x;

x is géen pointer hier.

zag ik nu dat in C#

t* p, x;

wel x een pointer maakt?

ik neem aan dat

p++

werkt, dat doet het zeker,

maar

&a++

niet, of iig niet zoals verwacht. kan dit fout hebben. ik gebruik geen compiler om te teste, wat wel goed zou zijn.

verder moet ik wat je schrijft nog nalopen, maar ik ben geen mathematicus of logikus.

@Yoozer goede uitleg wanneer je pointers echt gaat of moet gaan gebruiken!
 
Laatst gewijzigd:
Back
Top