2D en 3D problemen

Status
Niet open voor verdere reacties.

Voldemort

Gebruiker
Lid geworden
21 jul 2006
Berichten
111
Ik wou een script maken dat adhv de lengte afmetingen de oppervlakte van een figuur kan berekenen en het volume als de figuur 3D is. Ik heb daarvoor deze code gemaakt:

Code:
#include <iostream.h>

int get_maten(int demensie)
{
	if(demensie == 2)
	{
		int lengte;
		int breedte;

		cout << "Geef de lengte: ";
		cin >> lengte;

		cout << "Geef de breedte";
		cin >> breedte;

		int arr[2] = { lengte, breedte };

		return arr;
	}
	else
	{
		int lengte;
		int breedte;
		int hoogte;

		cout << "Geef de lengte: ";
		cin >> lengte;

		cout << "Geef de breedte";
		cin >> breedte;

		cout << "Geef de hoogte";
		cin >> hoogte;

		int arr[3] = { lengte, breedte, hoogte };

		return arr;
	}
}

bool check_maten(int demensie, int arr)
{
	if(arr[0] < 1)
		return FALSE;

	if(arr[1] < 1)
		return FALSE;

	if(demensie == 3 && arr[2] < 1)
		return FALSE;

	return TRUE;
}

int get_opp_2d(int arr)
{
	return arr[0] * arr[1];
}

int get_opps_3d(int arr)
{
	int opp1 = arr[0] * arr[1];
	int opp2 = arr[1] * arr[2];
	int opp3 = arr[0] * arr[2];

	int arr2 = { opp1, opp2, opp3 };

	return arr2;
}

int get_volume_3d(int arr)
{
	return arr[0] * arr[1] * arr[2];
}

int main()
{
	int demensie;

	cout << "Is uw figuur 2D of 3D? [2/3]";
	cin >> demensie;

	if(demensie < 2 || demensie > 3)
		cout << "Fout, de figuur moet ofwel 2D ofwel 3D zijn.";
	else
	{
		int arr;
		bool check:

		arr = get_maten(demensie);
		check = check_maten(demensie,arr);

		if(check === FALSE)
			cout << "1 van de maten is kleiner dan 1 en is bijgevolg niet geldig/";
		else
		{
			int opp;

			if(demensie == 2)
			{
				opp = get_opp_2d(arr);

				cout << "De oppervlakte van deze figuur is " << opp << endl;
			}
			else
			{
				int volume;
				opp = get_opps_3d(arr);
				volume = get_volume_3d(arr);

				cout << "De oppervlakten zijn" << endl << opp[0] << endl << opp[1] << endl opp[3] << endl << endl << "Het volume is " << volume << endl;
			}
		}
	}

	return 0;
}

De errors zijn:

oppervlak_inhoud-6.cpp: In function ‘int get_maten(int)’:
oppervlak_inhoud-6.cpp:18: error: invalid conversion from ‘int*’ to ‘int’
oppervlak_inhoud-6.cpp:16: warning: address of local variable ‘arr’ returned
oppervlak_inhoud-6.cpp:37: error: invalid conversion from ‘int*’ to ‘int’
oppervlak_inhoud-6.cpp:35: warning: address of local variable ‘arr’ returned
oppervlak_inhoud-6.cpp: In function ‘bool check_maten(int, int)’:
oppervlak_inhoud-6.cpp:43: error: invalid types ‘int[int]’ for array subscript
oppervlak_inhoud-6.cpp:44: error: ‘FALSE’ was not declared in this scope
oppervlak_inhoud-6.cpp:46: error: invalid types ‘int[int]’ for array subscript
oppervlak_inhoud-6.cpp:47: error: ‘FALSE’ was not declared in this scope
oppervlak_inhoud-6.cpp:49: error: invalid types ‘int[int]’ for array subscript
oppervlak_inhoud-6.cpp:50: error: ‘FALSE’ was not declared in this scope
oppervlak_inhoud-6.cpp:52: error: ‘TRUE’ was not declared in this scope
oppervlak_inhoud-6.cpp: In function ‘int get_opp_2d(int)’:
oppervlak_inhoud-6.cpp:57: error: invalid types ‘int[int]’ for array subscript
oppervlak_inhoud-6.cpp:57: error: invalid types ‘int[int]’ for array subscript
oppervlak_inhoud-6.cpp: In function ‘int get_opps_3d(int)’:
oppervlak_inhoud-6.cpp:62: error: invalid types ‘int[int]’ for array subscript
oppervlak_inhoud-6.cpp:62: error: invalid types ‘int[int]’ for array subscript
oppervlak_inhoud-6.cpp:63: error: invalid types ‘int[int]’ for array subscript
oppervlak_inhoud-6.cpp:63: error: invalid types ‘int[int]’ for array subscript
oppervlak_inhoud-6.cpp:64: error: invalid types ‘int[int]’ for array subscript
oppervlak_inhoud-6.cpp:64: error: invalid types ‘int[int]’ for array subscript
oppervlak_inhoud-6.cpp:66: error: scalar object ‘arr2’ requires one element in initializer
oppervlak_inhoud-6.cpp: In function ‘int get_volume_3d(int)’:
oppervlak_inhoud-6.cpp:73: error: invalid types ‘int[int]’ for array subscript
oppervlak_inhoud-6.cpp:73: error: invalid types ‘int[int]’ for array subscript
oppervlak_inhoud-6.cpp:73: error: invalid types ‘int[int]’ for array subscript
oppervlak_inhoud-6.cpp: In function ‘int main()’:
oppervlak_inhoud-6.cpp:88: error: a function-definition is not allowed here before ‘:’ token
oppervlak_inhoud-6.cpp:91: error: ‘check’ was not declared in this scope
oppervlak_inhoud-6.cpp:93: error: expected primary-expression before ‘=’ token
oppervlak_inhoud-6.cpp:93: error: ‘FALSE’ was not declared in this scope
oppervlak_inhoud-6.cpp:111: error: invalid types ‘int[int]’ for array subscript
oppervlak_inhoud-6.cpp:111: error: invalid types ‘int[int]’ for array subscript
oppervlak_inhoud-6.cpp:111: error: expected `;' before ‘opp’

Ik denk dat alle errors er zijn omdat die arr niet goed wordt teruggestuurd/aangemaakt. Ik gebruikt geen pointers, wat zaagt ie dan over die int*, ik heb er nergens 1 staan? Wat doe ik fout?
 
Dat helpt niet:

Code:
#include <iostream.h>

int get_maten(int demensie)
{
	if(demensie == 2)
	{
		int lengte;
		int breedte;

		cout << "Geef de lengte: ";
		cin >> lengte;

		cout << "Geef de breedte";
		cin >> breedte;

		int arr[2] = { lengte, breedte };

		return arr;
	}
	else
	{
		int lengte;
		int breedte;
		int hoogte;

		cout << "Geef de lengte: ";
		cin >> lengte;

		cout << "Geef de breedte";
		cin >> breedte;

		cout << "Geef de hoogte";
		cin >> hoogte;

		int arr[3] = { lengte, breedte, hoogte };

		return arr;
	}
}

bool check_maten(int demensie, int arr)
{
	if(arr[0] < 1 || arr[1] < 1 || (demensie == 3 && arr[2] < 1))
		return false;

	return true;
}

int get_opp_2d(int arr)
{
	return arr[0] * arr[1];
}

int get_opps_3d(int arr)
{
	int opp1 = arr[0] * arr[1];
	int opp2 = arr[1] * arr[2];
	int opp3 = arr[0] * arr[2];

	int arr2 = { opp1, opp2, opp3 };

	return arr2;
}

int get_volume_3d(int arr)
{
	return arr[0] * arr[1] * arr[2];
}

int main()
{
	int demensie;

	cout << "Is uw figuur 2D of 3D? [2/3]";
	cin >> demensie;

	if(demensie < 2 || demensie > 3)
		cout << "Fout, de figuur moet ofwel 2D ofwel 3D zijn.";
	else
	{
		int arr;
		bool check:

		arr = get_maten(demensie);
		check = check_maten(demensie,arr);

		if(check === false)
			cout << "1 van de maten is kleiner dan 1 en is bijgevolg niet geldig/";
		else
		{
			int opp;

			if(demensie == 2)
			{
				opp = get_opp_2d(arr);

				cout << "De oppervlakte van deze figuur is " << opp << endl;
			}
			else
			{
				int volume;
				opp = get_opps_3d(arr);
				volume = get_volume_3d(arr);

				cout << "De oppervlakten zijn" << endl << opp[0] << endl << opp[1] << endl opp[3] << endl << endl << "Het volume is " << volume << endl;
			}
		}
	}

	return 0;
}

Errors:

oppervlak_inhoud-6.cpp: In function ‘int get_maten(int)’:
oppervlak_inhoud-6.cpp:18: error: invalid conversion from ‘int*’ to ‘int’
oppervlak_inhoud-6.cpp:16: warning: address of local variable ‘arr’ returned
oppervlak_inhoud-6.cpp:37: error: invalid conversion from ‘int*’ to ‘int’
oppervlak_inhoud-6.cpp:35: warning: address of local variable ‘arr’ returned
oppervlak_inhoud-6.cpp: In function ‘bool check_maten(int, int)’:
oppervlak_inhoud-6.cpp:43: error: invalid types ‘int[int]’ for array subscript
oppervlak_inhoud-6.cpp:43: error: invalid types ‘int[int]’ for array subscript
oppervlak_inhoud-6.cpp:43: error: invalid types ‘int[int]’ for array subscript
oppervlak_inhoud-6.cpp: In function ‘int get_opp_2d(int)’:
oppervlak_inhoud-6.cpp:51: error: invalid types ‘int[int]’ for array subscript
oppervlak_inhoud-6.cpp:51: error: invalid types ‘int[int]’ for array subscript
oppervlak_inhoud-6.cpp: In function ‘int get_opps_3d(int)’:
oppervlak_inhoud-6.cpp:56: error: invalid types ‘int[int]’ for array subscript
oppervlak_inhoud-6.cpp:56: error: invalid types ‘int[int]’ for array subscript
oppervlak_inhoud-6.cpp:57: error: invalid types ‘int[int]’ for array subscript
oppervlak_inhoud-6.cpp:57: error: invalid types ‘int[int]’ for array subscript
oppervlak_inhoud-6.cpp:58: error: invalid types ‘int[int]’ for array subscript
oppervlak_inhoud-6.cpp:58: error: invalid types ‘int[int]’ for array subscript
oppervlak_inhoud-6.cpp:60: error: scalar object ‘arr2’ requires one element in initializer
oppervlak_inhoud-6.cpp: In function ‘int get_volume_3d(int)’:
oppervlak_inhoud-6.cpp:67: error: invalid types ‘int[int]’ for array subscript
oppervlak_inhoud-6.cpp:67: error: invalid types ‘int[int]’ for array subscript
oppervlak_inhoud-6.cpp:67: error: invalid types ‘int[int]’ for array subscript
oppervlak_inhoud-6.cpp: In function ‘int main()’:
oppervlak_inhoud-6.cpp:82: error: a function-definition is not allowed here before ‘:’ token
oppervlak_inhoud-6.cpp:85: error: ‘check’ was not declared in this scope
oppervlak_inhoud-6.cpp:87: error: expected primary-expression before ‘=’ token
oppervlak_inhoud-6.cpp:105: error: invalid types ‘int[int]’ for array subscript
oppervlak_inhoud-6.cpp:105: error: invalid types ‘int[int]’ for array subscript
oppervlak_inhoud-6.cpp:105: error: expected `;' before ‘opp’

Ik denk dat alle errors een gevolg zijn van die arr die niet correct wordt aangemaakt/teruggestuurd.

Kan iemand helpen?
 
er zijn een boel dingen mis hier

int get_maten(int demensie)
moet een int returnen, maar je probeert een array te returnen.
moet zijn;
int* get_maten(int demensie)

Je declareert binnen in de functie je array (lokaal dus), en die kan je helaas niet returnen.
opties:
maak hem globaal (lelijk maar snel en handig)
maak het new : int* bla = new int[x] (mooier, dynamisch, maar je zult ook moeten opruimen)
een struct maken voor je spul struct dim {x,y} ofzo. (mooi, lokaal te returnen)



verder
bool check_maten(int demensie, int arr)
{
if(arr[0] < 1)
return FALSE;

.....

arr is geen array, slechts een int.....

moet zijn:
bool check_maten(int demensie, int* arr)


en dit blijf je doen door je gehele code heen. zorg dat je je arrays, pointers en dynamiek onder de knie krijgt.

tevens; declaraties als int a[3] is niks anders dan een pointer structuur achter de schermen. Je hoeft het alleen niet zelf op te ruimen zo. zodoende gaan pointer regels op voor arrays.



En nee, TRUE/FALSE mag gewoon, native typedefs.
0/1 mag ook, maakt allemaal niks uit. alleen voor heel speciale doeleinden (bv. platform support) moet je hier op gaan letten
 
Laatst bewerkt:
Ik heb nu deze code:

Code:
#include <iostream.h>

int* get_maten(int demensie)
{
	if(demensie == 2)
	{
		int lengte;
		int breedte;

		cout << "Geef de lengte: ";
		cin >> lengte;

		cout << "Geef de breedte";
		cin >> breedte;

		int arr[2] = { lengte, breedte };

		return arr;
	}
	else
	{
		int lengte;
		int breedte;
		int hoogte;

		cout << "Geef de lengte: ";
		cin >> lengte;

		cout << "Geef de breedte";
		cin >> breedte;

		cout << "Geef de hoogte";
		cin >> hoogte;

		int arr[3] = { lengte, breedte, hoogte };

		return arr;
	}
}

bool check_maten(int demensie, int* arr)
{
	if(arr[0] < 1 || arr[1] < 1 || (demensie == 3 && arr[2] < 1))
		return false;

	return true;
}

int get_opp_2d(int* arr)
{
	return arr[0] * arr[1];
}

int* get_opps_3d(int* arr)
{
	int opp1 = arr[0] * arr[1];
	int opp2 = arr[1] * arr[2];
	int opp3 = arr[0] * arr[2];

	int* arr2 = { opp1, opp2, opp3 };

	return arr2;
}

int get_volume_3d(int* arr)
{
	return arr[0] * arr[1] * arr[2];
}

int main()
{
	int demensie;

	cout << "Is uw figuur 2D of 3D? [2/3]";
	cin >> demensie;

	if(demensie < 2 || demensie > 3)
		cout << "Fout, de figuur moet ofwel 2D ofwel 3D zijn.";
	else
	{
		int* arr;
		bool check:

		arr = get_maten(demensie);
		check = check_maten(demensie,arr);

		if(check === false)
			cout << "1 van de maten is kleiner dan 1 en is bijgevolg niet geldig/";
		else
		{
			if(demensie == 2)
			{
				int opp;

				opp = get_opp_2d(arr);

				cout << "De oppervlakte van deze figuur is " << opp << endl;
			}
			else
			{
				int opp[3];
				int volume;
				opp = get_opps_3d(arr);
				volume = get_volume_3d(arr);

				cout << "De oppervlakten zijn" << endl;
				cout << opp[0] << endl << opp[1] << endl << opp[3] << endl << endl;
				cout << "Het volume is " << volume << endl;
			}
		}
	}

	return 0;
}

En ik heb deze fouten:


oppervlak_inhoud-6.cpp: In function ‘int* get_maten(int)’:
oppervlak_inhoud-6.cpp:16: warning: address of local variable ‘arr’ returned
oppervlak_inhoud-6.cpp:35: warning: address of local variable ‘arr’ returned
oppervlak_inhoud-6.cpp: In function ‘int* get_opps_3d(int*)’:
oppervlak_inhoud-6.cpp:60: error: scalar object ‘arr2’ requires one element in initializer
oppervlak_inhoud-6.cpp: In function ‘int main()’:
oppervlak_inhoud-6.cpp:82: error: a function-definition is not allowed here before ‘:’ token
oppervlak_inhoud-6.cpp:85: error: ‘check’ was not declared in this scope
oppervlak_inhoud-6.cpp:87: error: expected primary-expression before ‘=’ token
oppervlak_inhoud-6.cpp:103: error: incompatible types in assignment of ‘int*’ to ‘int [3]’

1) Waarom moet ik altijd int* arr doen bij arrays? Waarom kan ik die array niet gewoon terugsturen?
2) Wat zijn mijn fouten?
3) Wat hebben arrays met pointers te maken?
4) Ik heb nog enkele vragen ivm pointers. Deze staan in dit topic. Kan je deze ook even beantwoorden?
 
Pointers zijn een lastig iets om te begrijpen, maar uiteindelijk een simpel iets.

Ten eerste, zoek wat tutorials op. simpele voorbeeldjes.

Om het een en ander duidelijk te maken.
Alles gaat met types. we hebben int's, float's, char's etc.
nu is er ook nog een ander type genaamd pointer.
pointers zijn geheugen adressen. zie dit als een type apart, maar dan wel een type wat elk normaal type heeft. ook je eigen declaraties.
dus we hebben int, dus ook int *
we hebben char, dus ook char *
we hebben een class met naam my_class, dus ook my_class*
etc.

het voordeel hier is, pointers zijn enkel geheugen adressen dus efficient, en je kan dynamisch alloceren. je classes kunnen heel groot worden, maar een pointer is altijd klein.

een voorbeeldje.
we hebben
int x = 3;
is dus een getal (int) namelijk drie
anders
int* y = &x
y is nu een type int*, dus een geheugenadres van iets dat van het type int is

de & betekent 'adres van', dus y is het adres van x

wat betreft array's. het mag duidelijk zijn dat int f = 3 slechts 1 getal is, geen rij van getallen.
int f[2]; is een rij van 2 getallen, maar om met zoiets om te gaan binnen functies werk je met pointers. wat er eigenlijk gebeurt is het volgende

int* a = new int [2];
we maken een geheugenadress vrij voor 2 int getallen
dus a is het geheugen adres van de eerste
a+1 is het adres van de tweede

pointers kan je met ++ en -- gewoon aflopen als je ze zo alloceert. hiervoor is een operator gemaakt []
a[0] = a
a[1] = a+1
a[2] = a+2

etc...
dit ken je als arrays, maar het zij dus gewoon pointers.

Pointers zijn een lastig verhaal in de eerste instantie, maar om efficient te programeren en goed met geheugen om te gaan, zul je ze goed door moeten krijgen, dus ik zou aanraden er eens op te googlen
 
Een array dus een pointer? Of begrijp ik je nu verkeerd? Zonee, wat is het verschil tussen een pointer en array dan?

Ik begrijp wat een pointer is*, alleen begrijp ik niet wanneer, waar en voor welke types je ze nodig hebt. Kan je dit ook even verduidelijken?

* Om te bewijzen dat ik weet wat een pointer is zal ik hier even zetten wat het is volgens mij:
In een pointer sla je een geheugenadres van iets op. Zo kan je dat deel van de code 'aanroepen' en die ergens anders gebruiken zonder een complete kopie te maken van dat deel (wat dus veel meer geheugen en tijd vraagt).
 
Laatst bewerkt:
een array is geen pointer. een array is gewoon een rij van iets. maar om met zoiets te werken, werk je dus met de geheugenadressen van de elementen in die rij.
stel je hebt een functie met 1 par

void foo ( par x ) ....

wat par voor type is, zul je moeten bepalen aan de hand van wat je nodig hebt. heb je bv 1 ding nodig, een waarde ofzo, dan wordt het iets van

void foo ( int y )

dus als je ergens anders een array hebt

int array [] = { 0, 1, 2};

kun je aan de functie foo 1 int geven
bv

foo ( array[0] ), want array[0], das een int
foo ( array[1] ), dan x=1
etc

als je de hele rij wilt meegeven, komen pointer om de hoek.
logisch, je hebt geen type 'array' ofzo. je hebt een type int, char float etc. en van elk type kun je een rij maken. aangezien een rij dus geen type is, kun je het ook niet als 'normaal' invoeren in functies.
dit wordt dan

void foo ( int* x )

nu geef je dus geen echte int mee, maar een adres van een int. In de functie werk je dus ook met adressen. en adressen kun je aflopen met [] of met ++ / --
geef nu het adres van je array mee (het eerste element) en je hebt je array in je functie
dus
foo ( array )
is hetzelfde als
foo ( array[0] )
en
foo ( array[1] )
geeft de array min het eerste element mee
etc.

je geeft dus nooit letterlijk een rij mee, maar een adres van 1 van de elementen. mbv van dat adres kun je in je functie naastliggende adressen aflopen (dus toch de rij beschikbaar)

als vb. om een 'echte' rij te mee te geven zou het zoiets worden


struct { int a, int b, int c, int d etc } een_struct;

void foo ( een_struct s )
{
..
}

..
een_struct S;
foo (S)
....


nu geef je dus je hele struct met alle getallen letterlijk mee. maar das dus niet wat je met arrays doet.


wanneer, waar en voor welke types je ze nodig heb........

wanneer? verschillende redenenen, voornamelijk efficientie, EN dynamisch alloceren, wat erg belangrijk is/wordt.
Ga gewoon normaal redeneren over wat je doorgeeft aan functie, wat wil je hebben, letterlijk een waarde, of heb je meer aan een verwijzing naar een waarde...

waar? zelfde al wanneer

voor welke types??
alle types die er zijn....
elke type kan je een verwijzing naar maken, ook je eigen classes en struct

belangrijk.
Pointers zijn een grote bron van problemen. initialiseer pointers op 0. anders kunnen ze nog naar ongedefinieerde adressen verwijzen.
int* x = NULL;

check pointer op NULL om crashes te voorkomen. heb je bv een klasse K met een functie L dan zou je met een K* k het volgende kunnnen aanroepen: k->L().
naar als k NULL is, crashed de boel.
bij dynamisch alloceren zul je ook moeten gaan opruimen. memory leaks zijn een grote bron van frustratie.

Uiteindelijk zullen pointers je grootste vriend worden, maar in de eerste instantie de bron van koppijn.... tja

hoop dat het zo wat duidelijk is.....maar ben bang dat je toch echt veel zult moeten *****en om er vertrouwd mee te raken.

suc6
 
Ik denk dat ik het begin te snappen hoe het allemaal werkt, die pointers. Dat met die NULL snap ik niet. En ik las ook op wikibooks iets met new en delete bij de C++ pointers. Ik heb nu al een hele boel minder errors:

Code:
#include <iostream.h>

int get_maten(int demensie)
{
	if(demensie == 2)
		int arr[2];
	else
		int arr[3];

	cout << "Geef de lengte: ";
	cin >> arr[0];

	cout << "Geef de breedte";
	cin >> arr[1];

	if(demensie == 3)
	{
		cout << "Geef de hoogte";
		cin >> arr[2];
	}

	return arr;
}

bool check_maten(int demensie, int* arr)
{
	if(arr[0] < 1 || arr[1] < 1 || (demensie == 3 && arr[2] < 1))
		return false;

	return true;
}

int get_opp_2d(int* arr)
{
	return arr[0] * arr[1];
}

int get_opps_3d(int* arr)
{
	int opp1 = arr[0] * arr[1];
	int opp2 = arr[1] * arr[2];
	int opp3 = arr[0] * arr[2];

	int arr2[3] = { opp1, opp2, opp3 };

	return arr2;
}

int get_volume_3d(int* arr)
{
	return arr[0] * arr[1] * arr[2];
}

int main()
{
	int demensie;

	cout << "Is uw figuur 2D of 3D? [2/3]";
	cin >> demensie;

	if(demensie < 2 || demensie > 3)
		cout << "Fout, de figuur moet ofwel 2D ofwel 3D zijn.";
	else
	{
		int arr;
		bool check;

		arr = get_maten(demensie);
		check = check_maten(demensie,&arr);

		if(!check)
			cout << "1 van de maten is kleiner dan 1 en is bijgevolg niet geldig/";
		else
		{
			if(demensie == 2)
			{
				int opp;

				opp = get_opp_2d(&arr);

				cout << "De oppervlakte van deze figuur is " << opp << endl;
			}
			else
			{
				int opp[3];
				int volume;
				opp = get_opps_3d(&arr);
				volume = get_volume_3d(&arr);

				cout << "De oppervlakten zijn" << endl;
				cout << opp[0] << endl << opp[1] << endl << opp[3] << endl << endl;
				cout << "Het volume is " << volume << endl;
			}
		}
	}

	return 0;
}

Errors:

oppervlak_inhoud-6.cpp: In function ‘int get_maten(int)’:
oppervlak_inhoud-6.cpp:11: error: ‘arr’ was not declared in this scope
oppervlak_inhoud-6.cpp: In function ‘int get_opps_3d(int*)’:
oppervlak_inhoud-6.cpp:46: error: invalid conversion from ‘int*’ to ‘int’
oppervlak_inhoud-6.cpp:44: warning: address of local variable ‘arr2’ returned
oppervlak_inhoud-6.cpp: In function ‘int main()’:
oppervlak_inhoud-6.cpp:87: error: incompatible types in assignment of ‘int’ to ‘int [3]’

1) Bij die error op lijn 44 en 46 denk ik dat de fout hem zit bij die vermenigvuldiging. Ik geloof dat ie de vermenigvuldiging voor een pointer aanziet ofzo. Klopt dit?
2) Hoe kan ik die errors oplossen (met wat uitleg ook aub)?
3) Kan je dat met die NULL eens uitleggen?
4) Op wikibooks stond er wat van new en delete ivm pointers, kan je dit even toelichten?
5) Kan je wat extra info geven over memory leaks? Zijn deze gevaarlijk (hiermee bedoel ik, is dit een lek dat crackers kunnen gebruiken om hun malware te installeren)? Wat doen memory leaks?
6) Is het nuttig om bij de types bool en int gebruik te maken van pointers?
 
Laatst bewerkt:
Ik denk dat ik het begin te snappen hoe het allemaal werkt, die pointers. Dat met die NULL snap ik niet. En ik las ook op wikibooks iets met new en delete bij de C++ pointers. Ik heb nu al een hele boel minder errors:

Code:
#include <iostream.h>

int get_maten(int demensie)
{
	if(demensie == 2)
		int arr[2];
	else
		int arr[3];

	cout << "Geef de lengte: ";
	cin >> arr[0];

	cout << "Geef de breedte";
	cin >> arr[1];

	if(demensie == 3)
	{
		cout << "Geef de hoogte";
		cin >> arr[2];
	}

	return arr;
}

bool check_maten(int demensie, int* arr)
{
	if(arr[0] < 1 || arr[1] < 1 || (demensie == 3 && arr[2] < 1))
		return false;

	return true;
}

int get_opp_2d(int* arr)
{
	return arr[0] * arr[1];
}

int get_opps_3d(int* arr)
{
	int opp1 = arr[0] * arr[1];
	int opp2 = arr[1] * arr[2];
	int opp3 = arr[0] * arr[2];

	int arr2[3] = { opp1, opp2, opp3 };

	return arr2;
}

int get_volume_3d(int* arr)
{
	return arr[0] * arr[1] * arr[2];
}

int main()
{
	int demensie;

	cout << "Is uw figuur 2D of 3D? [2/3]";
	cin >> demensie;

	if(demensie < 2 || demensie > 3)
		cout << "Fout, de figuur moet ofwel 2D ofwel 3D zijn.";
	else
	{
		int arr;
		bool check;

		arr = get_maten(demensie);
		check = check_maten(demensie,&arr);

		if(!check)
			cout << "1 van de maten is kleiner dan 1 en is bijgevolg niet geldig/";
		else
		{
			if(demensie == 2)
			{
				int opp;

				opp = get_opp_2d(&arr);

				cout << "De oppervlakte van deze figuur is " << opp << endl;
			}
			else
			{
				int opp[3];
				int volume;
				opp = get_opps_3d(&arr);
				volume = get_volume_3d(&arr);

				cout << "De oppervlakten zijn" << endl;
				cout << opp[0] << endl << opp[1] << endl << opp[3] << endl << endl;
				cout << "Het volume is " << volume << endl;
			}
		}
	}

	return 0;
}

Errors:



1) Bij die error op lijn 44 en 46 denk ik dat de fout hem zit bij die vermenigvuldiging. Ik geloof dat ie de vermenigvuldiging voor een pointer aanziet ofzo. Klopt dit?
2) Hoe kan ik die errors oplossen (met wat uitleg ook aub)?
3) Kan je dat met die NULL eens uitleggen?
4) Op wikibooks stond er wat van new en delete ivm pointers, kan je dit even toelichten?
5) Kan je wat extra info geven over memory leaks? Zijn deze gevaarlijk (hiermee bedoel ik, is dit een lek dat crackers kunnen gebruiken om hun malware te installeren)? Wat doen memory leaks?
6) Is het nuttig om bij de types bool en int gebruik te maken van pointers?


1) Ja, je can bv dit doen: const int lengte = arr[0] .. enzovoort en dan return (lengte*breedte*diepte)

4) pointers zijn enorm handig en je zult ze nog veel tegenkomen. een pointer is dus een adres van een bepaald type (DIT TYPE MOET BEPAALD ZIJN)

bv: int getal = 40;
int *ptr = &getal;

nu wijst de pointer naar het adres van getal.
dus als je nu doet cout << *ptr, dan krijg je de WAARDE waarnaar de poiner wijst
doe je cout << ptr, dan krijg je het adres van getal.

een array is eigenlijk een pointer met een vast aantal items erin.
bv als je hebt:

int arr[5]; dan heb je een array gemaakt met 5 plaatsen voor 5 ints. (dus telkens 2bytes) want een int is 2 bytes. in het geheugen ziet die array er dus uit als een aan-elkaar gekoppelde "lijn" van adressen die elk de grootte hebben van een int (2 bytes) dus je array is 10 bytes groot.

doe je nu dit:

int *ptr = &arr[0]; dan wijst deze pointer naar het eerste element van de array.

doe je cout << *ptr : dan krijg je het number dat in arr[0] zit
doe je cout << arr[0] : dan krijg je ook dat number

als je nu cout << arr[1] doet krijg je het nummer dat in arr[1] zit.
als je cout << *(ptr+1) doet dan krijg je ook het nummer dat in arr[1] zit.

wat gebeurt er nu ? eigenlijk doe je : cout << *(het adress van arr[0]+1) want ptr wijst naar arr[0]

maar een int is toch 2 bytes groot? als je er dan maar 1 bij het adres optelt krijg je toch niet het juiste ? inderdaad! maar je telt er 1 INT omdat de ptr van het type int is , dit doet de compiler automatish voor je.

je kan er ook bytes bij optellen, maar ik ben effe vergeten hoe dat moet.

new en delete kan je best later doen als je pointers helemaal snapt. het is niet zo moeilijk hoor.


een string is eigenlijk ook eenvaste aan elkaargekoppelde lijn van adressen net als een array, alleen is de inhoud van de string dynamish gealloceerd (met new en delete dus).

dus je kan een string net zo behandelen als een array en dus ook met pointers
bv:

string zin = "lolzor";
char *ptr = &zin;

cout <<zin[0] geeft "l"
cout <<*ptr geeft ook "l"

cout << zin[0]+(*(ptr+1))+zin[2] geeft "lol"

enzovoort. :)
5) Ja dat kan, meestal in de vorm van een buffer overflow. je kan zelf een memory leak programmeren als je dat wilt
je risceerd wel schade aan je computer natuurlijk.

er zijn veel soorten memory leaks, maar degene die jij bedoelt is waarschijnlijk die waar je de functie new gebruikt

bv:
int getal = 1;
int *pointer ;

while (true)
{
pointer = new int[getal]
}

wat je hier doet is een pointer zetten, en daarachter een lijn construeren van vaste adressen die een int bevatten

eigenlijk maak je dus een array die in omvang blijft toenemen, totdat je computergeheugen op is. en dan crashed je programma. dit is een gat in het programma waardoor crackers informatie kunnen stelen, stel maar eens dat dit probleem zig in je poortblocker voortdoet, als je poortblocker crashed heb je een open poort, waardoor aanvallers je informatie kunnen stelen ofzo.

delete dient om een adress van de zopas gemaakte "array" terug te geven aan het vrije geheugen, uit het "lijntje" verwijderen dus.
doe je nu delete[] pointer; dan vernietig je je lijntje en dan is dat geheugen weer vrij om door andere programmas gebruikt te worden.

wat is nu het nut van dynamic gealloceerde arrays? stell je wilt een naam opslaan in een array. je weet natuurlijk niet hoeveel letters de naam gaat bevatten die de gebruiker heeft. dus gebruik je new om een array te maken die net evengroot is als de aantal letters die zijn ingetypt.

als je een array hebt van 40 items groot waarvan er maar 10 gevult zijn, dat is ook maar niks, en dynamic allocatie geeft je de mogelijkheid om exact een array te maken van 10 als de gebruiker er 10 invult!


6) pointers zijn altijd nuttig
 
Laatst bewerkt:
Code:
#include <iostream>
using namespace std;


double berekenoppervlakte2d ( int *Arr)
{
  return (Arr[0]*Arr[1]);
}
double volume3d ( int * Arr)
{
  return (Arr[0]*Arr[1]*Arr[2]);
}



double Get_maten
(int Dementies,int *Array3D,int *Array2D,const int grootte3D,const int grootte2D)
{
  double volumeofoppervlake = 0.00;
  if (Dementies == grootte2D)
  {

    cout <<"Geef de waarden van de 2 dementies in:" << endl;
    for (int x = 0; x < grootte2D; x++) //zolang als x kleiner is dan grootte2d:
    {
      cout <<"Waarde "<<x+1<<": ";
      cin  >> Array2D[x];
    }
     volumeofoppervlake = berekenoppervlakte2d ( Array2D );
     // berken de oppervlakte


  }
  if (Dementies == grootte3D)
  {
    cout << "Geef de waarden van de 3 dementies in:" << endl;
    for (int x = 0; x < grootte3D; x++) //zolang als x kleiner is dan grootte3d:
    {
      cout <<"Waarde "<<x+1<<": ";
      cin >> Array3D[x];
    }
    volumeofoppervlake = volume3d ( Array3D );
    //bereken het volume
  }
  return volumeofoppervlake; // geef de oppervlakte of het volume terug
  // aan de roepende functie (main dus)

}




int main ()
{
  double   volumeofoppervlakte;
  const int grootte3D = 3;
  const int grootte2D = 2;
  int Array3D[grootte3D];
  int Array2D[grootte2D];
  // je kan het bovenste natuurlijk ook zoals jij in een IF lus steken
  // en maar 1 van de 2 Arrays declareren , maar voor dit programma is dat niet
  // echt nodig :)

  //werken met constants is altijd veiliger, + je kan er vergelijkingen mee doen


  int Dementies;

  cout << "hoeveel demensies wil je?" << endl;
  cin >> Dementies;

  while (Dementies != grootte3D && Dementies != grootte2D ) //vergelijking!
  {
    cout <<"fout, de figuur moet ofwel 2D ofwel 3D zijn" << endl;
    cin >> Dementies;
  } // een lus die het getal 2 of 3 wil krijgen, zoniet blijft hij doorvragen
    // (veiligheid)

  volumeofoppervlakte =Get_maten (Dementies,  Array3D,  Array2D ,grootte3D , grootte2D);
  /*
   * Hier geef ik de dementies door, het adress van Array3D, Array2D
   * grootte van array 3d en grootte van array 2d.
   * je ziet misschien geen adress teken staan, maar als je de naam zonder
   *index (bv [0] of [1]) meegeeft aan de functie neemt die automatish het
   * adress van array3D of 2D.
   *
   */
   cout << volumeofoppervlakte << endl;

   return 0;
   
   

}

hetbovenstaande doet ongeveer wat jij wil :P was wat lui.
 
Code:
double Get_maten
(int Dementies,int *Array3D,int *Array2D,const int grootte3D,const int grootte2D)

Waarom doe je bij Dementies, grootte3D en grootte2D geen pointers als die altijd handig zijn?
 
tis maar hoe jij het wilt he ;) het is toch niet dat je die waarde zou wille gaan veranderen in de functie. Dementies is op die wijze ook beveiligt in die functie, omdat je een copie geeft van dat getal. , voor die constanten kan je een pointer meegeven. maar wat is daar het nut van? ze zijn toch constant.
 
Laatst bewerkt:
pointers zijn handig maar je moet ze niet overal voor gaan gebruiken.

en verander op zijn minst Dementies naar Dimensies :P
 
pointers zijn handig maar je moet ze niet overal voor gaan gebruiken.

Er werd net gezegd dat ze altijd handig zijn en nu zeg jij dat ik ze niet altijd moet gebruiken. Nu moet je met toch eens uitleggen waarvoor ze nu wel en niet handig zijn en waar ik ze wel en niet moet gebruiken.
 
Als je bijvoorbeeld
Code:
int number = 10;
cout << number;
kunt doen,

moet je niet
Code:
int number = 10;
int* pNumber = &number;
cout << *pNumber;
gaan doen

;)
 
Er werd net gezegd dat ze altijd handig zijn en nu zeg jij dat ik ze niet altijd moet gebruiken. Nu moet je met toch eens uitleggen waarvoor ze nu wel en niet handig zijn en waar ik ze wel en niet moet gebruiken.

zie je toch zelf wanneer je ze nodig hebt...
 
Ik heb m'n code aangepast en deze werkt nu:

Code:
#include <iostream.h>

using namespace std;

void get_maten(int dimensie, int* arr)
{
	cout << "Geef de lengte: ";
	cin >> arr[0];

	cout << "Geef de breedte: ";
	cin >> arr[1];

	if(dimensie == 3)
	{
		cout << "Geef de hoogte: ";
		cin >> arr[2];
	}
}

bool check_maten(int dimensie, int* arr)
{
	if(arr[0] < 1 || arr[1] < 1 || (dimensie == 3 && arr[2] < 1))
		return false;

	return true;
}

int get_opp_2d(int* arr)
{
	const int lengte = arr[0];
	const int breedte = arr[1];

	return lengte * breedte;
}

void get_opps_3d(int* arr, int* opp)
{
	const int lengte = arr[0];
	const int breedte = arr[1];
	const int diepte = arr[2];

	opp[0] = lengte * breedte;
	opp[1] = lengte * diepte;
	opp[2] = breedte * diepte;
}

int get_volume_3d(int* arr)
{
	const int lengte = arr[0];
	const int breedte = arr[1];
	const int diepte = arr[2];

	return lengte * breedte * diepte;
}

int main()
{
	int dimensie;

	cout << "Is uw figuur 2D of 3D? [2/3] ";
	cin >> dimensie;

	if(dimensie < 2 || dimensie > 3)
		cout << "Fout, de figuur moet ofwel 2D ofwel 3D zijn.";
	else
	{
		bool check;

		int arr[3];

		get_maten(dimensie,arr);
		check = check_maten(dimensie,arr);

		if(!check)
			cout << "1 van de maten is kleiner dan 1 en is bijgevolg niet geldig/";
		else
		{
			if(dimensie == 2)
			{
				int opp;

				opp = get_opp_2d(arr);

				cout << "De oppervlakte van deze figuur is " << opp << endl;
			}
			else
			{
				int opp[3];
				int volume;

				get_opps_3d(arr,opp);
				volume = get_volume_3d(arr);

				cout << "De oppervlakten zijn" << endl;
				cout << opp[0] << endl << opp[1] << endl << opp[2] << endl << endl;
				cout << "Het volume is " << volume << endl;
			}
		}
	}

	return 0;
}

Is deze code goed? Wat kan er beter? Werk ik hier goed met pointers? Kunnen in deze code memory leaks voorkomen?
 
dat heb je prima gedaan !

als uitbreiding kan je misschien nog proberen om een soort van beveiliging in te bouwen zodat je programma niet crashed als je een foutive input krijgt van een gebruiker, stel :

Code:
Is uw figuur 2D of 3D? [2/3] 2
Geef de lengte: a
Geef de breedte: De oppervlakte van deze figuur is -1695026188


je ziet het probleem al, lenge a is geen goede waarde he ;)

maar voor de rest heb je het goed gedaan hoor. :thumb:
als je nog vragen hebt wil ik die wel uitgebreid voor je beantwoorden !
 
Ik krijg dit (gecompileerd met g++):

Code:
Is uw figuur 2D of 3D? [2/3] 2
Geef de lengte: a
Geef de breedte: 1 van de maten is kleiner dan 1 en is bijgevolg niet geldig

Nu zijn mijn vragen:

1) Waarom laat ie me niet eerst de breedte ingeven en dan pas die controle? Hij stopt midden in de functie eigenlijk om de volgende al te beginnen. Kan je even uitleggen?

2) Als je met OOP werkt, moet je dan wat anders omgaan met pointers?

3) Kan je de operators new en delete even uitleggen? Ik zag die in classes, maar wat doen ze?

4) Heb ik nu pointers onder de knie of moet ik nog veel leren voor ik die pointers goed zal kunnen?

5) Ik kan string.h niet gebruiken omdat g++ alles haalt uit:
/usr/include/c++/4.1.2/backward/
Maar string (zonder .h) en andere staan in deze dir:
/usr/include/c++/4.1.2/
Maar in /usr/include/c++/4.1.2/backward/ staan er dan als: "algobase.h" en "algo.h" die in /usr/include/c++/4.1.2/ niet staan.

Hoe los ik dit allemaal op?

6) De .h bestanden die je zelf schrijft, waarvoor dienen die? Waarom kan dat niet in die .cpp? Bijna elk .cpp bestand heeft een gelijknamig .h bestand, waarvoor is dat goed?
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan