Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
menu search
person
Welcome To Ask or Share your Answers For Others

Categories

I have the following code:

[self swap:set :begin :begin+i];  //swap

calling the following swap method:

-(void) swap:(NSMutableString *)set:(NSInteger)first:(NSInteger)second 
{
   NSRange rangeSecond = NSMakeRange((NSUInteger) second, 1);
   NSRange rangeFirst = NSMakeRange((NSUInteger) first, 1);

   NSString *chsecond =  [set substringWithRange:rangeSecond ];

   [set replaceCharactersInRange:rangeSecond 
                      withString:[set substringWithRange:rangeFirst]];
   [set replaceCharactersInRange:rangeFirst 
                      withString:chsecond];
}

The very first time this swap routine is called, it crashes at the statement:

[set replaceCharactersInRange:rangeSecond 
                   withString:[set substringWithRange:rangeFirst]];

without leaving any debug information. Before calling swap I can hover over set, begin and i and they all have valid values. After swap is called when I hover over "first" it says (data variable, no debug info)first (unknown type)

This program was working fine and this happened suddenly. Any idea why this is happening? Thanks

Here is the whole chain of calls. start StartPermutate calls permute which calls swap. Is there any problems in the way I pass the parameters?

-(void) permute: (NSMutableString *) set :(NSInteger ) begin  :(NSInteger ) end {
int i;
int range = end - begin;
if(range == 1) {
    if([self is_word_valid:set]) {
        [self addWord:selectedWords : set];
    }
 } else {
    for(i=0; i<range; i++) {
        NSLog(@"set = '%@', first = '%@', second = '%@'", set, begin, begin + i);
        [self swap:set :begin :begin+i];  //swap
        [self permute:set :begin+1 :end]; // recursion
        [self swap:set :begin :begin+i];  // swap back
    }
 }
}    

-(NSMutableArray *)StartPermutate: (NSMutableString *) letters {

 [self permute:letters :0 :(NSInteger)[letters length]];
 return selectedWords;
}
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
202 views
Welcome To Ask or Share your Answers For Others

1 Answer

I think you have asked the same question else where. So here is the answer which also applies here.

I found a few things that should be changed in your code. Here is what I did to make your swap function work.

This is the function:

-(void) swapCharacters: (NSMutableString *)set withInteger: (int)first andInteger: (int)second{

NSLog(@"swap: set = '%@', first = '%i', second = '%i'", set, first, second);
NSRange rangeSecond = NSMakeRange(second, 1);
NSRange rangeFirst = NSMakeRange(first, 1);

[set replaceCharactersInRange:rangeSecond withString:[set substringWithRange:rangeFirst]];
NSLog(@"swap: set = '%@', first = '%i', second = '%i'", set, first, second);
}

This is how the function was called:

FooClass *fooObjectVar = [[FooClass alloc] init];

NSMutableString *myString = [[NSMutableString alloc] initWithString:@"Hello"];

[fooObjectVar swapCharacters:myString withInteger:0 andInteger:0];

[fooObjectVar release];
[myString release];

This is the output:

2011-12-30 14:19:00.501 StackOverflowHelp[748:903] swap: set = 'Hello', first = '0', second = '0'
2011-12-30 14:19:00.504 StackOverflowHelp[748:903] swap: set = 'Hello', first = '0', second = '0'

*Notice that with functions in objective-c, the name is like a description

*Instead of using NSInteger, I used a normal int because an NSInteger is not necessary here

*When using NSLog or string formatting, %@ is for objects (NSString,NSInteger...), %i is for int, %f is for float and %d is for double

I hope that helped, happy coding!


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
...