Schrift
[thread]1092[/thread]

zweidimensionale dynamische arrays: theorie + verständniss



<< |< 1 2 >| >> 13 Einträge, 2 Seiten
Cooly
 2003-11-21 19:21
#11574 #11574
User since
2003-08-04
81 Artikel
BenutzerIn
[Homepage] [default_avatar]
hallo,

beschäftige mich gerade mit den oben genannten arrays und habe leider null Durchblick -- Wie funktioniert das Erstellen grundsätzlich? / Was steckt da nun genau dahinter (Pointer, Speicherverwaltung etc.)? / Wie unterscheiden sich die Lösungen in C von denen in C++? / Wie sehen Beispiele aus?

Fragen über Fragen

Vielen Dank

Cooly
esskar
 2003-11-21 19:38
#11575 #11575
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
Code: (dl )
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
template <typename T>
class Array
{
  public:
     Array() : m_container(0), m_size(0), m_lastindex(0) { }
     Array(size_t size) : m_container(0), m_size(size), m_lastindex(0) { }
     ~Array() { if(m_container) free(m_container); }

     size_t CountElements() const { return m_lastindex; }
     size_t GetSize() const { return m_size; }

     bool ReSize(size_t size)
     {
        if(size <= m_size) return false;
       
        size_t len = sizeof(T) * size;
       
        if(m_container == 0)
        {
        m_container = (T*)malloc(len);
        memset(m_container, 0, len);
        }
        else
        {
           size_t oldlen = sizeof(T) * m_size;
        m_container = (T*)realloc(m_container, len);
        memset(m_container + oldlen, 0, len - oldlen);
        }        
        m_size = size;
        return true;
     }
     
     T & operator [](size_t idx)
     {
        if(idx >= m_size) ReSize(idx+1);
        return m_container[m_lastindex = idx];
     }

  private:
     T* m_container;
     size_t m_size;
     size_t m_lastindex;
};

Array< int > 1dintarray0(10);
Array< int > 1dintarray1(10);
Array< int > 1dintarray2(10);
Array< int > 1dintarray3(10);
Array< int > 1dintarray4(10);

Array< Array<int> > 2dintarray(5);

2dintarray[0] = 1dintarray0;
2dintarray[1] = 1dintarray1;
2dintarray[2] = 1dintarray2;
2dintarray[3] = 1dintarray3;
2dintarray[4] = 1dintarray4;


ungetestet ... sind bestimmt noch denkfehler drin...

empfehler dir std::vector aus der STL\n\n

<!--EDIT|esskar|1069634756-->
kabel
 2003-11-23 22:03
#11576 #11576
User since
2003-08-04
704 Artikel
BenutzerIn
[default_avatar]
nach templates hat er aber net gefragt ;)
den typ T% kenn ich gar net :p

"zweidimensionale arrays" heissen so, weil du sie zweidimensional ansprechen kannst. in wirklichkeit steht wieder nur ein speicherblock dahinter. in C ist die unterstützung AFAIK lausig, z.b. beim übergeben an eine unterfunktion müssen zwingend alle dimensionen bis auf die letzte angegeben werden - statisch, wohlgemerkt. bei dynamisch allokierten multidimensionalen arrays musst du zwangsläufig den pointer übergeben. somit fehlt die information, wie viele elemente jede dimension enthält. C ist da ziemlich übel.

C++ hingegen stellt kein problem dar, stichwort standard C++ library (siehe esskars hinweis).

HTH

btw @esskar kennst du igor? ???
-- stefan
SirLant
 2003-11-24 00:03
#11577 #11577
User since
2003-08-04
516 Artikel
BenutzerIn
[default_avatar]
In C würde man für solch ein Vorhaben einfach
ne Struktur benutzen die die Informationen
speichert und den Zeiger auf den Anfang des
Arrays :p

Aber bis heute Morgen war ich noch richtiger C
Fan, jetzt hab ich paar Seiten in C++ Programmiersprache gelesen und bin von C++ begeistert :blush:
--Programming today is a race between Software Enginers striving to build bigger and better idiot-proof Programs,
and the Universe trying to produce bigger and better idiots.
So far, the Universe is winning!
esskar
 2003-11-24 02:51
#11578 #11578
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
@kabel: nein, kenn ich nicht!
habe % nach & geändert... war ein vertipper... kann schon passieren, wenn man es "on the fly" tippt...

noch zu c:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
char 1darray0[16];
char 1darray1[16];
char 1darray2[16];
char 1darray3[16];

char* 2darrayptr[4];

2darrayptr[0] = 1darray0;
2darrayptr[1] = 1darray1;
2darrayptr[2] = 1darray2;
2darrayptr[3] = 1darray3;


void work(char** 2darrayptr)
{
// ...
}

work(2darrayptr);
kabel
 2003-11-24 08:28
#11579 #11579
User since
2003-08-04
704 Artikel
BenutzerIn
[default_avatar]
@sirlant: das ist eine möglichkeit. du könntest auch am ende einen null-pointer setzen (z.b. die dritte variable der main funktion arbeiten so). stellt sich die frage, warum da keine struktur eingesetzt wird (argc - argv) ;) mit sizeof lässt sich ebenfalls was drehen

in C gibts auch mehrere wege ... bzw der eine ist genauso richtig wie der andere.

Code: (dl )
1
2
3
4
void work(char 2darrayptr[4][])
{
// ...
}
-- stefan
Crian
 2003-11-24 14:16
#11580 #11580
User since
2003-08-04
5872 Artikel
ModeratorIn
[Homepage]
user image
[quote=esskar,21.11.2003, 18:38]empfehler dir std::vector aus der STL[/quote]
Genau, nimm Vector aus der STL ... das ist wie bei den Perl-Modulen... die STL bietet wirklich gut ausgereifte Klassen an, da sollte man sich nicht mehr über dynamische Arrays selbst den Kopf zerbrechen, außer zu lernzwecken, aber keinesfalls im realen Einsatz.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
esskar
 2003-11-24 17:48
#11581 #11581
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
was mich ja immer schon genervt hat, dass stl::string keine string compare erlaubt, was zwei strings auf egal ob caseinsensitive vergleicht...

aber sonst: daumen hoch...
Crian
 2003-11-24 18:20
#11582 #11582
User since
2003-08-04
5872 Artikel
ModeratorIn
[Homepage]
user image
naja, selbst anbauen: uppercase machen und dann mit == vergleichen...
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Cooly
 2003-11-24 21:06
#11583 #11583
User since
2003-08-04
81 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=Crian,24.11.2003, 13:16][quote=esskar,21.11.2003, 18:38]empfehler dir std::vector aus der STL[/quote]
Genau, nimm Vector aus der STL ... das ist wie bei den Perl-Modulen... die STL bietet wirklich gut ausgereifte Klassen an, da sollte man sich nicht mehr über dynamische Arrays selbst den Kopf zerbrechen, außer zu lernzwecken, aber keinesfalls im realen Einsatz.[/quote]
jo,

leider will ich das Ganze erst verstehen und dann erst zu den Modulen übergehen -- eine Lösung mit Pointern wäre interessant so auch die Reservierung von Speicher dafür


vielen Dank

Cooly
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2003-11-21 19:21.