[C++] 2 Demensionale array initialiseren

Pagina: 1
Acties:

  • RdeTuinman
  • Registratie: Mei 2001
  • Laatst online: 16-08 07:25
Ik heb het volgende stukje code:
code:
1
void * Element;

Waarna ik een stukje verder op dit doe:
code:
1
Element = new long[Dim1][Dim2];

Nu wil ik alle waarden initialiseren in die array dus dacht ik (uiteraard ipv boven):
code:
1
Element = new long[Dim1][Dim2](0); // of = 0 of ={0} of ={0,0}

Maar dit werkt niet. Iemand een idee?

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

java opl :)
code:
1
2
3
4
5
6
7
8
9
10
int[][] p = new int[10][10];

for(int k=0;k<p.length;k++)
{
   int[] u = p[k];
   for(int l=0;l<u.length;l++)
   {
    u[l]=0;
   }
}

[opmerking] welke ongelovelijke sukkel zorgt ervoor zo gauw je de tab indrukt dat de verstuur knop wordt ingedrukt? Dat is toch ronduit debiel. Dus ontwerper hiervan }:O

  • RdeTuinman
  • Registratie: Mei 2001
  • Laatst online: 16-08 07:25
Ja, in het uiterste geval kan ik het in een for-loopje doen, maar ik dacht dat het anders kon.

Bij een string-array werkt het wel:
[code]
Element = new string[Dim1][Dim2]("X");
[code]

Dan staat alles op "X". Maarja een string is geen long, dus misschien dat het wel niet kan.

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

ik ben alleen nog maar bezig met java.. maar je kan geloof ik ook zeggen: (heb dit nog nooit gedaan voor een multi dimensionale array)

int[][] a = new int[][]{{10,13},{20,25},{30,50}}

misschien dat zo`n constructie ook met c++ mogelijk is. Denk het eerlijk gezegd wel. Syntactisch is in c en c++ veel meer mogelijk.. kan je helaas daar niet mee helpen.

  • Jelmer
  • Registratie: Maart 2000
  • Laatst online: 19:44
Alarmnummer, het is inderdaad bijna als in java.

Statisch:
int naampje[3][5]={{1,2,3,4,5},{1,2,3,4,5},{1,2,3,4,5}}

  • Primal
  • Registratie: Augustus 2001
  • Laatst online: 11-09 14:32
Op donderdag 04 oktober 2001 15:25 schreef RdeTuinman het volgende:
Ik heb het volgende stukje code:
code:
1
void * Element;

Waarna ik een stukje verder op dit doe:
code:
1
Element = new long[Dim1][Dim2];

Nu wil ik alle waarden initialiseren in die array dus dacht ik (uiteraard ipv boven):
code:
1
Element = new long[Dim1][Dim2](0); // of = 0 of ={0} of ={0,0}

Maar dit werkt niet. Iemand een idee?
Je kunt ook gewoon een 'memset' doen hoor. :) Het is en blijft tenslotte 'flat' geheugen, met andere woorden:

Die 2 dimensionale array komt in het geheugen gewoon als een reeks (dus achter elkaar) bytes (ter grootte van Dim1 * Dim2) in het geheugen te staan.

Dus: memset(&JeArray,0,sizeof(Dim1 * Dim2));

"The fastest code, is the code that is never called."


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 18-09 18:03

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op donderdag 04 oktober 2001 16:02 schreef Jelmer Barhorst het volgende:
Alarmnummer, het is inderdaad bijna als in java.

Statisch:
int naampje[3][5]={{1,2,3,4,5},{1,2,3,4,5},{1,2,3,4,5}}
maar met nieuw werkt dit dus niet en zul je alles even moeten kopieren
Op donderdag 04 oktober 2001 15:25 schreef RdeTuinman het volgende:
Ik heb het volgende stukje code:
code:
1
void * Element;

Waarna ik een stukje verder op dit doe:
code:
1
Element = new long[Dim1][Dim2];

Nu wil ik alle waarden initialiseren in die array dus dacht ik (uiteraard ipv boven):
code:
1
Element = new long[Dim1][Dim2](0); // of = 0 of ={0} of ={0,0}

Maar dit werkt niet. Iemand een idee?
Dat gaat dus sowieso al niet werken. Je hebt een void * Element, maar je gebruikt het type long. Waarom doe je dan niet long * Element?
En dan gaat het NOG niet werken, want een pointer naar iets is maar een 1 dimensionale array, dus long[Dim1][Dim2] is niet te converteren naar long *
Wat jij wilt is het volgende:
code:
1
2
3
4
5
long ** Element;

Element = new long *[Dim1];
for (int x = 0; x < Dim1; x++)
    Element[x] = new long[Dim2];

En java is niet C++ :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

het is inderdaad niet hetzelfde als c of c++. Maar soms vraag je met c of c++ en hun ingewikkelde syntax (dus bijna alles kan) wel om problemen.

bv.
code:
1
int x sin; // dus geen sin(10)

dit komt wel door de compiler. Mijn persoonlijke ervaring is dat ik in Java alles kan doen wat ik wil. En het is zeker niet zo snel als c of c++. Maar het onderhoud is wel 20x zo makkelijk en het debuggen ook (geen geknoei meer met pointers). En je bent met java alleen het probleem aan het oplossen, en met c en c++ ook veel problemen van de taal zelf (complexiteit problemen). Mijn persoonlijke mening is dat c en c++ onnodig complex zijn. En dat je die talen moet gebruiken voor de dingen waar ze echt geschikt voor zijn. OS drivers en tijdkritische routines. Voor apps vind ik java veel geschikter.

Maar om een flamewar te voorkomen geef ik ook eerlijk toe dat ik ook tijden gek op c ben geweest. En wou toen echt niet aan java :)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 18-09 18:03

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op donderdag 04 oktober 2001 16:22 schreef Alarmnummer het volgende:
het is inderdaad niet hetzelfde als c of c++. Maar soms vraag je met c of c++ en hun ingewikkelde syntax (dus bijna alles kan) wel om problemen.

bv.
code:
1
int x sin; // dus geen sin(10)

dit komt wel door de compiler. Mijn persoonlijke ervaring is dat ik in Java alles kan doen wat ik wil. En het is zeker niet zo snel als c of c++. Maar het onderhoud is wel 20x zo makkelijk en het debuggen ook (geen geknoei meer met pointers). Maar om een flamewar te voorkomen geef ik ook eerlijk toe dat ik ook tijden gek op c ben geweest. En wou toen echt niet aan java :)
:?

als DAT door de compiler komt wil ik toch echt wel graag even weten wat voor compiler je gebruikt... niet een ANSI C compatible compiler iig :)

En de discussie van wat nou beter is, java of c, is hier totaal niet aan de orde. Met mijn "java is niet C++" opmerking bedoelde ik dat de C++ syntax echt compleet anders is als het op arrays en pointers enzo aankomt... het enige vergelijkbare tussen java en C zijn denk ik de operatoren, de basic keywords (for, while, select, etc.), en de primitieven, en daar blijft het bij :)

Maar ja, je hebt gelijk dat je als je in C(++) programmeert veel meer moet doen en op veel meer moet letten. Als je daar niet van houdt moet je idd Java of Visual Basic (;)) gaan proggen, maar persoonlijk hou ik niet van talen die meer doen dan je vraagt :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Op donderdag 04 oktober 2001 16:31 schreef OiSyN het volgende:

[..]

:?

als DAT door de compiler komt wil ik toch echt wel graag even weten wat voor compiler je gebruikt... niet een ANSI C compatible compiler iig :)
TC 2.0 :)

int a = sin;

dan stop je het adres van de functie sin in a en aangezien het adres een int is, is het geen enkel probleem :)

En ik denk ook niet dat we elkaar kunnen overtuigen van de schoonheid van onze talen. Ik vind java een uitzonderlijk mooie taal, maar dat zul jij ook zeggen van c en c++.

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

En niet java met vb vergelijken he :) voel me beledigd :)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 18-09 18:03

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op donderdag 04 oktober 2001 16:35 schreef Alarmnummer het volgende:

[..]

TC 2.0 :)

int a = sin;

dan stop je het adres van de functie sin in a en aangezien het adres een int is, is het geen enkel probleem :)
whaahaha turbo c 2.0, kom op heej, onder welke rots kom jij vandaan :)

Maar je was de = vergeten. Overigens, als je compilet met alle warnings aan dan geeft ie nog steeds een warning :) (maar ik weet niet of dit ook geldt in *kuch* TC 2.0 *kuch*)
En ik denk ook niet dat we elkaar kunnen overtuigen van de schoonheid van onze talen. Ik vind java een uitzonderlijk mooie taal, maar dat zul jij ook zeggen van c en c++.
Hmmm volgens mij wil jij flamen, je begint de hele tijd over de dat java voor jou beter is, terwijl ik geen woord heb gezegd dat het afkraakt ;)
Maar begrijp me niet verkeerd hoor, ik vind java mooi ontworpen (vb ook, muhahahaha ;)), en ik programmeer er regelmatig in (ik word geforceerd, het is voor school :( :))
Op donderdag 04 oktober 2001 16:37 schreef Alarmnummer het volgende:
En niet java met vb vergelijken he :) voel me beledigd :)
:P

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Op donderdag 04 oktober 2001 16:50 schreef OiSyN het volgende:

whaahaha turbo c 2.0, kom op heej, onder welke rots kom jij vandaan :)
Voor een opdracht moesten we weer iets schrijven in XINU en de compiler die erbij zat was TC 2.0 :) Dus vandaar. En die fout met a=sin; is echt zoiets waar je over heen leest, en toen ik het ontdekte (na enkele uren zoeken) kon ik mezelf wel voor mijn kop slaan (heb ik maar niet gedaan :) )

En het voorbeeldje met die sin is eigelijk slecht gekozen omdat je een sin een real/float terug stuurt ipv een int.

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Op donderdag 04 oktober 2001 16:50 schreef OiSyN het volgende:


Hmmm volgens mij wil jij flamen, je begint de hele tijd over de dat java voor jou beter is, terwijl ik geen woord heb gezegd dat het afkraakt ;)
Maar begrijp me niet verkeerd hoor, ik vind java mooi ontworpen (vb ook, muhahahaha ;)), en ik programmeer er regelmatig in (ik word geforceerd, het is voor school :( :))
En heb je wel eens een gestopte roker gehoord over het roken? Er is niemand zo tegen een ander die rookt dan een gestopte roker :)

Vind alleen jammer dat java nog steeds niet zo snel is. Als ik software aflever dan zijn de systeem eisen minimaal 350 Mhz en 128 Mb, en dat hoef je bij een c en c++ app echt niet te vragen. Wordt ook wel eens een beetje ziek van al die platform onafhankelijkheid. Maarja.. Ik vind het ontwerpe van java nog steeds uitzonderlijk mooi. Het is eenvoudig, en toch kan je alles..

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 18-09 18:03

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op donderdag 04 oktober 2001 17:01 schreef Alarmnummer het volgende:

[..]

En heb je wel eens een gestopte roker gehoord over het roken? Er is niemand zo tegen een ander die rookt dan een gestopte roker :)
ik rook niet :)
Vind alleen jammer dat java nog steeds niet zo snel is. Als ik software aflever dan zijn de systeem eisen minimaal 350 Mhz en 128 Mb, en dat hoef je bij een c en c++ app echt niet te vragen. Wordt ook wel eens een beetje ziek van al die platform onafhankelijkheid. Maarja.. Ik vind het ontwerpe van java nog steeds uitzonderlijk mooi. Het is eenvoudig, en toch kan je alles..
moet je in vb gaan coden :P

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • RdeTuinman
  • Registratie: Mei 2001
  • Laatst online: 16-08 07:25
Op donderdag 04 oktober 2001 16:16 schreef Primal het volgende:

Je kunt ook gewoon een 'memset' doen hoor. :) Het is en blijft tenslotte 'flat' geheugen, met andere woorden:

Die 2 dimensionale array komt in het geheugen gewoon als een reeks (dus achter elkaar) bytes (ter grootte van Dim1 * Dim2) in het geheugen te staan.

Dus: memset(&JeArray,0,sizeof(Dim1 * Dim2));
Ja, dat begrijp ik wel, maar dan moet je wel weten dat memset bestaat! :9 Ik had het nu even opgelost door calloc(). Ik weet niet of dat een goed idee is onder C++, maar het werkt wel. Maar uiteraard ga ik memset proberen!

  • RdeTuinman
  • Registratie: Mei 2001
  • Laatst online: 16-08 07:25
Op donderdag 04 oktober 2001 16:18 schreef OiSyN het volgende:
Dat gaat dus sowieso al niet werken. Je hebt een void * Element, maar je gebruikt het type long. Waarom doe je dan niet long * Element?
En dan gaat het NOG niet werken, want een pointer naar iets is maar een 1 dimensionale array, dus long[Dim1][Dim2] is niet te converteren naar long *
Juist ja. Zou ik daar misschien niet een bedoeling mee hebben? Met die void pointer?

Maargoed, nu weet je ook dat het geheugen gewoon achter elkaar gealloceerd wordt. ;)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 18-09 18:03

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op donderdag 04 oktober 2001 19:46 schreef RdeTuinman het volgende:

[..]

Juist ja. Zou ik daar misschien niet een bedoeling mee hebben? Met die void pointer?

Maargoed, nu weet je ook dat het geheugen gewoon achter elkaar gealloceerd wordt. ;)
of je er een bedoeling mee hebt of niet maakt niet uit, zoals je het bovenaan geschreven hebt compileert het gewoon niet zonder warnings :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op donderdag 04 oktober 2001 15:30 schreef Alarmnummer het volgende:
[opmerking] welke ongelovelijke sukkel zorgt ervoor zo gauw je de tab indrukt dat de verstuur knop wordt ingedrukt? Dat is toch ronduit debiel. Dus ontwerper hiervan }:O
Neem een andere browser :P (mozilla bijv)


Maar heren, maak hier nou niet de zoveelste c(++) vs. java thread van.

  • RdeTuinman
  • Registratie: Mei 2001
  • Laatst online: 16-08 07:25
Op vrijdag 05 oktober 2001 01:23 schreef OiSyN het volgende:

[..]
zoals je het bovenaan geschreven hebt compileert het gewoon niet zonder warnings :)
Nou, g++ slikt het gewoon hoor. Ik hoor hem nergens over. Ik ga nu meteen even die memset proberen...

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 04-09 14:38

curry684

left part of the evil twins

Op donderdag 04 oktober 2001 16:16 schreef Primal het volgende:
Die 2 dimensionale array komt in het geheugen gewoon als een reeks (dus achter elkaar) bytes (ter grootte van Dim1 * Dim2) in het geheugen te staan.

Dus: memset(&JeArray,0,sizeof(Dim1 * Dim2));
Lullig alleen dat ie een array van longs maakt en je nu dus alleen de eerste 25% van de array wist... :) Ennuh die ampersand is ook overbodig (een array-reference is al een pointer in principe). Nu we toch bezig zijn, die sizeof operator slaat trouwens ook nergens op ;)

Dus:
code:
1
2
3
4
memset(JeArray, 0, sizeof(ElementType) * Dim1 * Dim2);

// In dit geval:
memset(Element, 0, sizeof(long) * Dim1 * Dim2);

Professionele website nodig?


  • RdeTuinman
  • Registratie: Mei 2001
  • Laatst online: 16-08 07:25
Op vrijdag 05 oktober 2001 10:02 schreef curry684 het volgende:

[..]

Dus:
code:
1
2
3
4
memset(JeArray, 0, sizeof(ElementType) * Dim1 * Dim2);

// In dit geval:
memset(Element, 0, sizeof(long) * Dim1 * Dim2);
Ja, maar daar had ik al rekening mee gehouden. Dit is alleen wat netter, want ik had hard-coded * 4 gezet. Zal ik even veranderen naar sizeof(long).. ;)

  • Primal
  • Registratie: Augustus 2001
  • Laatst online: 11-09 14:32
Op vrijdag 05 oktober 2001 10:02 schreef curry684 het volgende:

[..]

Lullig alleen dat ie een array van longs maakt en je nu dus alleen de eerste 25% van de array wist... :) Ennuh die ampersand is ook overbodig (een array-reference is al een pointer in principe). Nu we toch bezig zijn, die sizeof operator slaat trouwens ook nergens op ;)

Dus:
code:
1
2
3
4
memset(JeArray, 0, sizeof(ElementType) * Dim1 * Dim2);

// In dit geval:
memset(Element, 0, sizeof(long) * Dim1 * Dim2);
Het ging alleen maar effe om het idee, maar dat snap je wel. :)

"The fastest code, is the code that is never called."


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 18-09 18:03

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op vrijdag 05 oktober 2001 08:21 schreef RdeTuinman het volgende:

[..]

Nou, g++ slikt het gewoon hoor. Ik hoor hem nergens over. Ik ga nu meteen even die memset proberen...
uhm ja okee, maar dan compile jij waarschijnlijk niet met -Wall, dus ALLE warnings aan. Iets wat je toch echt aan moet hebben staan als je een beetje netjes wilt coden vind ik

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • RdeTuinman
  • Registratie: Mei 2001
  • Laatst online: 16-08 07:25
Nee, idd. Ga ik ook even doen.

..


Heb ik gedaan en het werkt gewoon, zonder warnings.

Maar ik doe dit alleen bij het aanmaken hoor. Bij het aanspreken wordt het iets van:
code:
1
*((long *)Element) = 100; //eerste element

Dus het gaat allemaal goed

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 04-09 14:38

curry684

left part of the evil twins

Op donderdag 04 oktober 2001 19:46 schreef RdeTuinman het volgende:
Juist ja. Zou ik daar misschien niet een bedoeling mee hebben? Met die void pointer?
Lijkt me sterk dat je daar een goede reden voor hebt :)

Professionele website nodig?


  • RdeTuinman
  • Registratie: Mei 2001
  • Laatst online: 16-08 07:25
Nou, of die goed is weet ik niet, maar ik doe het niet voor niets.

Dat Element kan namelijk een pointer zijn naar een array met long's, maar het kan ook een pointer zijn naar een array met strings.

Dit hangt af van een configuratie-file die ingelezen wordt.

Ik weet of er mooiere oplossingen zijn, maar dit kon ik mij bedenken. Ik heb na zitten denken over een class ofzo, maar daar zag ik niet veel voordelen in (in dit geval).

Dus... zodoende :P
Pagina: 1