[C] 2dimensionale array of array van pointers?

Pagina: 1
Acties:

  • Marc
  • Registratie: November 2001
  • Laatst online: 01-12-2021
Hey,

sorry voor de gare titel, maar ik ben nooit goed in dat soort dingen.
ik zit met het volgende probleem:
Ik heb een structure gedeclareert waarin ik vrij veel data wil stoppen, zoiets bijvoorbeeld:

code:
1
2
3
4
5
struct mem_t
{
   const char object[20][40];
   const char tool[25][50];
};


hier komt mijn vraag eigenlijk al, is dit een slimme manier om data te reserveren? of kan ik beter met een array van pointers werken en dan met malloc(); data reserveren? zoiets dus:
code:
1
2
3
4
5
struct mem_t
{
   const char *object[40];
   const char *tool[50];
};


ik weet niet, ik vind de eerst code er nogal lelijk uitzien eigenlijk.

ik moet er wel even bijzeggen dat ik later ook dynamisch objects en tools wil kunnen toevoegen. dat de eerste code werkt weet ik dus wel, ik vroeg me alleen af of er geen nettere manier is :)

Verwijderd

En dan kan je ook nog 20 malloc()s doen of 1 malloc() doen en die verdelen in 20 stukken.

Volgens mij maakt het niet zoveel uit en is het een kwestie van smaak.

  • rollebol
  • Registratie: Mei 2000
  • Laatst online: 22-08-2025
Ik zou eens een datastructuren-boek ter hand nemen en kijken wat een linked list is. Je kan dan dynamisch je 'array' uitbreiden. Afhankelijk van hoeveel flexibiliteit je nodig hebt is dat handiger dan dit. Je kan bijvoorbeeld dan ook ergens halverwege de array iets 'invoegen'.

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 11:06

Robtimus

me Robtimus no like you

Marc schreef op 19 juli 2004 @ 18:53:
code:
1
2
3
4
5
struct mem_t
{
   const char object[20][40];
   const char tool[25][50];
};


code:
1
2
3
4
5
struct mem_t
{
   const char *object[40];
   const char *tool[50];
};
1 ding: in het eerste heb je in je 2D array 20 arrays van elk 40 characters. In de tweede 40 "arrays" van nog onbekende lengte. Verkeerd om gedaan dus.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • Marc
  • Registratie: November 2001
  • Laatst online: 01-12-2021
IceManX schreef op 19 juli 2004 @ 19:26:
[...]
1 ding: in het eerste heb je in je 2D array 20 arrays van elk 40 characters. In de tweede 40 "arrays" van nog onbekende lengte. Verkeerd om gedaan dus.
my bad :) je hebt helemaal gelijk, maar dit is gelukkig niet mijn echte code, ik heb dit even gemaakt als voorbeeld.
maar het idee begrijp je wel.

even over die linked list, als ik het idee goed begrijp, maak je dus in de structure een pointer die naar de volgende structure wijst? dan krijg je dus zoiets:

code:
1
2
3
4
5
struct link_list_t
{
  char object[20][40];
  struct link_list_t *next_ptr;
};


maar wat schiet ik hier nou precies mee op?

  • markvt
  • Registratie: Maart 2001
  • Laatst online: 22-05 16:59

markvt

Peppi Cola

Een array zo groot als de maximale geheugenruimte.

van-tilburg.info -=- meka (sega emulator) - Proud MEDION fanclub member - KOPPIG VOLHOUDEN !


  • Marc
  • Registratie: November 2001
  • Laatst online: 01-12-2021
ah ik denk dat ik hem snap! ik moet het dan zeker zo doen:

code:
1
2
3
4
5
struct link_list_t
{
  char object[40];
  struct link_list_t *next_ptr;
};


nu kan ik een variable aantal structures maken dmv die linked list.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Pcies, je doet een malloc( sizeof(link_list_t) ) voor elk element. Dat kun je dus blijven doen tot je geheugen vol is.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
Je zou de grootte van je object ook nog variabel kunnen maken :)

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Marc
  • Registratie: November 2001
  • Laatst online: 01-12-2021
dat zat ik dus ook te denken ja, dan krijg je zoiets:

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
typedef struct object_t OBJ;
typedef struct tool_t TOO;

struct object_t {
   char object[40];
   OBJ *next_ptr;
};

struct tool_t {
   char tool[40];
   TOO *next_ptr;
}

struct mem_t
{
   OBJ object;
   TOO tool;
};


neat! :)
nu niet zo bijster nuttig, maar als je onafhankelijke elementen in de structure mem_t wilt zetten is het wel handig.

[ Voor 18% gewijzigd door Marc op 20-07-2004 23:40 . Reden: code=c :) ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

Overigens
Marc schreef op 19 juli 2004 @ 18:53:
Hey,

sorry voor de gare titel, maar ik ben nooit goed in dat soort dingen.
ik zit met het volgende probleem:
Ik heb een structure gedeclareert waarin ik vrij veel data wil stoppen, zoiets bijvoorbeeld:

code:
1
2
3
4
5
struct mem_t
{
   const char object[20][40];
   const char tool[25][50];
};


hier komt mijn vraag eigenlijk al, is dit een slimme manier om data te reserveren? of kan ik beter met een array van pointers werken en dan met malloc(); data reserveren? zoiets dus:
code:
1
2
3
4
5
struct mem_t
{
   const char *object[40];
   const char *tool[50];
};
Zoals gezegd gaat dat niet goed, omdat je daar een array van 40 pointers naar char declareert, terwijl jij juist wil dat je een 2d array waarbij de achterste dimensie steeds 40 is. Oftewel, een array met variabele lengte van arrays van 40 chars. En een array met variabele lengte doe je natuurlijk met een pointer. De truc is echter alleen even de juiste schrijfwijze te weten:
C:
1
2
3
4
5
struct mem_t
{
    const char (*object)[40];
    const char (*tool)[50];
};


Het alloceren van een object in een mem_t kan dan als volgt:
C:
1
2
3
4
5
6
int main ()
{
    mem_t mem;
    
    mem.object = malloc (aantal_arrays * sizeof (char[40]));
}


tool gaat natuurlijk op eenzelfde manier :). Het benaderen ervan is dan gewoon als een 2d array: mem.object[23][34] = '3' oid.

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.

Pagina: 1