Question

Je suis en train de construire un tableau imbriqué: Tout d'abord, je fais un tableau « de PlayerItems » qui contiendra 10 tableaux, contenant chacun des objets d'objets, correspondant aux stocks de chaque joueur dans le jeu. Sur la ligne indiquée, je reçois l'erreur suivante:

  

erreur: void Valued pas ignoré car il doit être

Quelle est la valeur vide ici? Si je [[PlayerItems objectAtIndex:i] addObject:myitem] à la place, le programme compile mais se bloque. Si je commente cette ligne sur, il compile et fonctionne sur OK. Merci pour votre aide!

self.PlayerItems = [[NSMutableArray alloc] initWithCapacity:11];
NSMutableArray *itemarray = [[NSMutableArray alloc] initWithCapacity:60];
item *myitem = [[item alloc] init];
item.kind = 1;
for (int i = 1; i < 10; i++) {
    itemarray = [[NSMutableArray alloc] initWithCapacity:60];
    [PlayerItems addObject:itemarray];
    for (int i2 = 1; i2 < 50; i2++) {
        myitem = [[item alloc] init];
        myitem.kind = 1;
        // The error occurs on the line below:
        ((NSMutableArray *) [[PlayerItems objectAtIndex:i] addObject:myitem]);
    }
}
Était-ce utile?

La solution

Je le ferais comme suit:

self.playerItems = [[NSMutableArray alloc] initWithCapacity:11];

NSMutableArray * itemArray;
Item * anItem;
for (int playerIndex = 1; playerIndex <= 10; playerIndex++)
{
    itemArray = [NSMutableArray arrayWithCapacity:60];
    [playerItems addObject:itemArray];

    for (int itemIndex = 1; itemIndex <= 50; itemIndex++)
    {
        anItem = [[Item alloc] init];
        anItem.kind = 1;
        [itemArray addObject:anItem];
        [anItem release];
    }
}

Comme une note de côté, vous devriez certainement lire sur la gestion de la mémoire de cacao, depuis votre code d'origine est pleine de fuites de mémoire. Il peut être un peu difficile à enrouler autour de votre tête au début, mais une fois que vous l'apprendre, il devient une seconde nature. Il vaut bien l'effort.

Mise à jour:

A serait plus moyen de le faire orienté objet de créer une classe de Player, et ont chacun Player gérer son propre ensemble d'éléments:

Player.h

@interface Player : NSObject
{
    NSMutableArray * items;
}
@property (readonly) NSMutableArray * items;
@end

Player.m

#import "Player.h"
@implementation Player

@synthesize items;

- (id)init
{
    if ((self = [super init]) == nil) { return nil; }

    items = [[NSMutableArray alloc] initWithCapacity:60];
    Item * anItem;
    for (int itemIndex = 1; itemIndex <= 50; itemIndex++)
    {
        anItem = [[Item alloc] init];
        anItem.kind = 1;
        [items addObject:anItem];
        [anItem release];
    }

    return self;
}

- (void)dealloc
{
    [items release];
    [super dealloc];
}

@end

Ailleurs

NSMutableArray * allPlayers = [[NSMutableArray alloc] initWithCapacity:11];

Player * aPlayer;
for (int playerIndex = 1; playerIndex <= 10; playerIndex++)
{
    aPlayer = [[Player alloc] init];
    [allPlayers addObject:aPlayer];
    [aPlayer release];
}

...

[allPlayers release];

Autres conseils

  

Salut, je suis en train de construire un tableau imbriqué ...

Ne pas faire. réseaux parallèles et imbriqués sont plus difficiles à écrire et à lire que de véritables solutions orientées objet comme celui eJames suggéré, qui est celle de la création d'un modèle de classe.

Considérons le code pour définir le type d'élément de premier élément de chaque joueur. Avec des réseaux parallèles / imbriqués:

for (NSArray *items in PlayerItems)
    [[items objectAtIndex:0U] setKind:newKind];

Avec les objets du modèle:

for (Player *player in players)
    [player setKind:newKind];

Lequel est plus clair?

Le travail nécessaire pour maintenir des réseaux parallèles et imbriqués, pour les garder tous synchronisés pour chaque changement et d'accéder à un élément en eux, est beaucoup plus grande que les travaux requis pour créer une classe de modèle. De plus, si vous décidez de port au Mac, ne pas avoir une classe de modèle vous blesse activement, comme vous ne pouvez pas utiliser Manchettes et mettre en œuvre AppleScript (pas une grosse affaire pour un jeu, je l'avoue) est impossible.

Comme eJames également mentionné, vous objets une fuite de grosses gouttes. Suivez sa recommandation et lisez le guide de programmation de gestion de la mémoire pour le cacao.

Comme dit PGB, les indices de tableau à Cocoa (et C, pour cette question) commencent à 0. De plus, vous ne généralement pas utiliser les index à moins que vous devez; voir mes exemples de code ci-dessus pour un moyen d'itérer sur un tableau beaucoup plus clair.

PGB et Christian soulignent tous les deux, addObject: est la méthode qui retourne void, que vous lancez à NSMutableArray * alors. Peut-être que vous avez voulu mettre cette fonte dans la première paire de supports carrés-? Mais ceci est un autre problème que vous auriez pas si vous aviez une vraie classe de modèle, comme vous installerez tout sur le nouveau joueur à la fois, y compris ses éléments:

Player *player = [[Player alloc] init];

//Set up name, SPECIAL stats, etc.

for (int kind = 1; kind < 50; ++kind) {
    Item *item = [[Item alloc] init]; //I capitalized your class name for you.
    [item setKind:kind];
    [player addInventoryObject:item]; //Assume “inventory” is the name of the property that holds the player's items.
    [item release];
}

[allPlayers addObject:player];
[player release];

Cela me amène à une autre suggestion: Vous pouvez également faire une classe de modèle pour les types d'objets, et ont un tableau de ces quelque part. Ensuite, chaque type peut avoir un nom, une icône, peut-être une description, la nature, comme une seule main par rapport à deux mains, les exigences de la classe, les exigences de stat, etc., tout là dans l'objet de l'élément nature. La boucle ressemble alors à ceci:

for (ItemKind *kind in [self kindsOfItems]) {
    Item *item = [[Item alloc] initWithKind:kind];
    [player addInventoryObject:item];
    [item release];
}

En outre, si vous créez cette propriété kindsOfItems en extension, vous pouvez permettre aux joueurs d'ajouter d'autres types d'articles plus tard, soit par des plug-ins (Mac) ou en application d'achat (iPhone).

Les tableaux en Objective-C sont à base de zéro, et pour votre boucle commence à 1. Vous devez changer à

for (int i = 0; i < 10; i++)

En ce qui concerne l'erreur de vide, vous n'avez pas besoin de jeter la valeur de retour de addObject: car il retourne vide, c'est la raison pour laquelle vous obtenez l'avertissement.

Cette ligne devrait être:

[[PlayerItems objectAtIndex:i] addObject:myitem];

Dans la dernière ligne que vous appelez addObject: qui renvoie vide:

- (void)addObject:(id)anObject

Vous essayez alors de jeter à vide NSMutableArray *. Et vous pouvez aussi ne pas attribuer le vide à quoi que ce soit casted.

Pour ajouter le sous-tableau à votre tableau cela devrait être suffisant:

[[PlayerItems objectAtIndex:i] addObject:myitem];

BTW: Vous créez seulement 9 tableaux et vous ajoutez seulement 49 sous-zones

.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top