Не уверен, почему у меня ошибка "EXC Bad Access" - PullRequest
2 голосов
/ 20 октября 2010

Я программировал некоторое время на Java и .Net, но никогда не использовал C или Objective C. Я все еще пытаюсь понять некоторые концепции. Я работал над простой программой, чтобы посмотреть, как я могу создать массив структур. Который, я полагаю, я понял правильно. Мне трудно понять, как получить доступ к подклассам и сохранить значения в подклассах, которые я создал.

Я предполагаю, что получаю ошибку из-за использования scanf. Кто-нибудь может предложить какую-либо помощь?

Вот что у меня есть.

#import <Foundation/Foundation.h>

//Player Prototype: Stores name and wins so far. It can also print out the name and wins
@interface Player : NSObject
{
    NSString *name; //Player name
    NSInteger wins; //Player wins
    NSInteger losses; //Player losses
    NSInteger bp; //extra value for anything I might need in the future.
}

@property (retain, nonatomic) NSString *name;
@property NSInteger wins;
@property NSInteger losses;
@property NSInteger bp;

@end

//Next part

@implementation Player

@synthesize name;
@synthesize wins;
@synthesize losses;
@synthesize bp;

@end

//Brackets

@interface Bracket : NSObject
{
    NSMutableArray *playerarray;
    Player *addplayer;
}

@property (retain, nonatomic) NSMutableArray *playerarray;//array of players
@property (retain, nonatomic) Player *addplayer;//player and data

-(void) SetUp;

@end

//Starting Bracket, working with only 8. Later moving up to 32
@implementation Bracket

@synthesize playerarray;
@synthesize addplayer;

-(void) SetUp;//sets up the array
{
    int i;//counting fun!
    playerarray = [[NSMutableArray alloc] init];//initialize a bracket
    for(i = 0; i < 8; i++)//To add the players
    {

        Player *addplayerx = [Player new];//New instance of Player

        NSString *p;//Not sure if I need two of them.
        NSString *tempname = @"bye";

        NSLog(@"Player %d Name:", i);
        scanf("%s",&p);
        tempname = p;
        NSLog(@"%s", tempname);
        addplayerx.name = p;
        NSLog(@"%s", addplayerx.name);
        addplayerx.wins = 0;
        addplayerx.losses = 0;
        addplayerx.bp = 0;
        [playerarray addObject: addplayerx];
        [addplayerx release];
        [p release];

    }
}


@end



//End function

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    Bracket *starting = [Bracket new];
    [starting SetUp];

    [pool drain];
    return 0;
}

Ответы [ 2 ]

4 голосов
/ 20 октября 2010

Вы не можете scanf() в NSString.Вам нужно отсканировать в обычную строку C (убедитесь, что вы выделяете для нее память), а затем вы можете построить NSString из этого, используя stringWithUTF8String:, или что-то в этом духе.

2 голосов
/ 20 октября 2010

Не угадай: запусти приложение под отладчиком, а в случае сбоя проверь обратный след.Вы также можете посмотреть обратные следы в ~ / Library / Logs / DiagnosticReports / foo.crash.

Что вы пытаетесь делать, считывая данные построчно из файла?Было бы намного проще просто использовать text = [NSString stringWithContentsOfFile:path], а затем разделить text на всех символах новой строки:

NSCharacterSet *newlines = [NSCharacterSet newlineCharacterSet];
NSArray *lines = [text componentsSeparatedByCharactersInSet:newlines];

После этого вы можете просто перейти к нужному имени игрока и взять его:

...