On Tuesday, 10 April 2012 at 09:15:13 UTC, simendsjo wrote:
On Tue, 10 Apr 2012 10:53:58 +0200, CrudOMatic
<[email protected]> wrote:
On Tuesday, 10 April 2012 at 08:05:33 UTC, simendsjo wrote:
On Tue, 10 Apr 2012 09:41:28 +0200, CrudOMatic
<[email protected]> wrote:
The D documentation is a little lacking in a lot of areas.
I'm needing to know an exact way of making arrays of objects.
For example:
/* Deck class */
// Will be adjusted with the proper cards for each game type
class Deck {
/* Card count - used to keep track of how many cards are
left in the deck - when zero, Deck is discarded from the
Shoe */
int cardCount;
/* Cards array - initialized to cardCount elements */
Card cards[];
/* Constructor */
this(int no_cards) {
cardCount = no_cards;
cards = new Card[cardCount];
}
/* Destructor */
~this() {
delete cards;
}
}
the cards[] array is meant to be an array of Card objects,
and I'm initializing it in the constructor as seen above.
This hasn't been tested yet, but I'm needing to know if this
is the correct way of doing it - to save headaches later.
Also, while I'm here, how would you go about moving objects
from the cards array in the Deck class to another class
containing a cards array - I'm talking about MOVING them,
not COPYING them. I don't want any issues with references
being destroyed after being moved to another class when I
happen to destroy an instance of the Deck class.
In D, arrays includes the number of elements in the array.
Card[] cards;
assert(cards.length == 0); // Automatically initialized to 0
elements
cards.length = cardCount; // cards gets cardCount of null
elements
cards.reserve(cardCount); // This just extends the array
without filling with null elements. cards.length stays at 0
D includes array slices - a view into an array. This way, you
can reference cards without copying them.
auto other = cards[1..$-1]; // all but first and last card
I'll let someone else answer the moving part as I'm not sure
how that could be done.
The delete statement is going away. You should use
clear(cards) instead. This really isn't needed as Ds GC will
take care of it eventually.
Your example could be written as
class Deck {
Card[] cards;
@property int cardCount() {
return cards.length;
}
this(int no_cards) {
cards.reserve(no_cards);
}
}
Arrays are more complicated than they seem at first. I
recommend you read this article:
http://dlang.org/d-array-article.html
D has a newsgroup, .learn, for beginner questions.
Thanks, I'm not sure if this is what I was after though. Let
me explain a little more, and you can tell me if I'm stupid or
not.
To make it simple - I have 4 (well more than 4, but trying to
get these shored up first) classes, Shoe, Deck, Hand and Card.
The Shoe class contains anywhere from 4 to 8 Deck objects in a
Deck array.
The Deck class contains anywhere from 40 to 54 Card objects in
a Card array.
The Hand class contains a 2-dimensional array of Card Objects
([2][]), that are to be moved from the Deck array and placed
here.
The Card class just contains info on the card in question.
The cardCount property in Deck gets decremented each time a
card is dealt from it, until it reaches zero - which then that
instance of the Deck object is removed from the Deck array in
Shoe - thus why I needed to move instead of just copying or
referencing.
The way I'm understanding your solution is that you are
treating it just as a normal property instead of a generic
object reference count. If not, then I've mistaken what you
were meaning. It's merely there to tell me how many objects
are left until time to clear() it away.
Not quite sure where you are going with this..
class Deck {
Card popBack() {
auto card = cards.popBack(); // get last card. cards.length
is decremented
assumeSafeAppend(cards); // now we can add cards to the
deck without it relocating - not sure if you need this though
return card;
}
}
I don't know why you cannot just use a reference. When you stop
using a Deck, the cards won't be cleaned by the GC as you are
referencing Cards from other parts of the program - like Hand.
hmmmm... so no need for a generic object reference counter. Nice.
I was trying to approach it from a literal sense (e.g. card moves
from deck to player's hand) - when you do the popBack() is that
object returned and deleted from the original array, or just the
reference returned and ref removed from original array?
The whole thing is supposed to be a large 21 simulator -
everything from 21, to blackjack, to Spanish 21 to Ventiuna.
I was trying to use literal real-world ideas of objects, and was
wanting the moving so I didn't have weird issues later down the
road, like not knowing why a reference was hanging around. I
understand D has a GC, but sometimes it pays to do management
yourself.