Archief - Vraagje C

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

GTboy

Legacy Member
Hallo iedereen :)

De examens naderen en zit met een klein vraagje :)

Voor een oefening in C hadden we een opdracht gemaakt die de temperaturen van een week grafisch weergeeft.

Dit is de juiste code voor de opdracht:

[C] Juist - Pastebin.com

Nu is mijn vraag waarom het ook niet met deze code werkt :p

[C] Fout - Pastebin.com

Alvast Bedankt :)

GTboy

Legacy Member
Hebbet zelf opgelost, ik moest bij de scan nog naar het adres verwijzen. En dagen+i moest gewoon dagen zijn :) mag dicht :)

ultddave

Legacy Member
In de juiste code werkt ge met pointers.

Dus als je een variabele ziet staan die zo een sterretje langs zijn naam heeft:

Code:
int *getallen
Dan heb je geen integer maar een pointer naar een integer (of array van integers).

Wat is een pointer precies is? In principe een "verwijzing" naar een ander stukje geheugen. Het houdt in principe een geheugenplaats bij.

Is dat dan nuttig? Hangt van de situatie af. Ze zijn vooral handig als je ze wilt meegeven als functieparameters. Als je bijvoorbeeld een array wilt meegeven aan een functie, dan wil je eigenlijk dat zo efficient mogelijk doen.

Door enkel een paar bytes mee te geven aan de functie ( een pointer dus), kan je dat bereiken. De functie kan dan de echte array vinden op de geheugenplaats die aangegeven wordt door de pointer.

Concreet wilt bovenstaande stukje code zeggen dat je geheugen hebt gereserveerd voor een type "pointer". Die pointer zal dezelfde grootte hebben als je bijvoorbeeld dit doet:

Code:
char *someString
Een char zelf neemt minder geheugen in dan een integer, maar we hebben het hier over pointers. ;)

Maakt de juiste code het niet onnodig ingewikkeld door zelfs niet-pointer arrays te referencen etc? Ja :P.

Code:
printf("%c: ",*(dagen + i));

Of:

Code:
printf("%c: ", dagen[i]);

Gaat evengoed en is zelfs leesbaarder.


****



Code:
scanf("%d",&getallen[i]);

Scanf verwacht nu toevallig een pointer als tweede parameter:
scanf - C++ Reference

These arguments are expected to be pointers: to store the result of a scanf operation on a regular variable, its name should be preceded by the reference operator (&) (see example).

Je array "getallen"/"temperaturen" bevat gewoon integers en geen pointers. De variabele "getallen/temperaturen" is een pointer, maar de array zelf bevat geen pointers.

Een referentie (pointer) naar de integer kan je krijgen door zo een ampersand te prependen aan de variabelenaam.

Bijvoorbeeld:

Code:
int test;
scanf("%d", &test);


Dus kort samengevat:
Gewone integer
Code:
int test;
test = 3;

Pointer naar integer
Code:
int *test;
test = (int*) malloc(sizeof(int));

*test = 2323; // Om een waarde toe te kennen aan de integer ipv de pointer, moeten we de pointer "volgen".
// Het volgen van een pointer gebeurt via die asterisk "*".

Pointer naar array (100 elementen bv.)
Code:
int *test;
test = calloc(100, sizeof(int));

Gebruiken van deze array:
Code:
test[22] = 78;
test[0] = 2322323;

Het is inderdaad nogal vreemd omdat er hier geen asterisk wordt geschreven.

Dat is omdat de code in principe equivalent is met:

Code:
*(test + 22) = 78;
*(test + 0) = 2322323;

Meer info;
Pointers - C++ Documentation
A Tutorial on Pointers and Arrays in C

Als je dat goed doorhebt, zal je een aantal fouten zien in jouw code.

EDIT; Ah ok XD. te laat =D.

profound

Legacy Member
Volgens mij is den ultddave nen fervente stackoverflower ^^

ultddave

Legacy Member
Hehe XD. Vanwege de lange antwoorden zeker? En je hebt inderdaad gelijk ^^. Spendeer elke dag toch wel wat tijd daar, ben wel nog niet zolang lid dus nog niet zoveel rep verzameld :d.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan