교본에있는 예제 프로그램입니다. 예상대로 실행되지 않습니다. 시그마 계산을 시뮬레이트하고 모든 분수를 시리즈에 추가해야합니다. 루프가 완료되면 0.000000이됩니다. 어떤 아이디어? 미리 감사드립니다 :이 Obj-C 코드의 문제점은 무엇입니까?
#import <Foundation/Foundation.h>
// The Fraction class
@interface Fraction : NSObject
{
int numerator;
int denominator;
}
@property int numerator, denominator;
-(void) print;
-(void) set: (int) n: (int) d;
-(double) convertToNum;
-(void) reduce;
-(Fraction *) add: (Fraction *) f;
@end
-------------------------------------
#import "Fraction.h"
@implementation Fraction
@synthesize numerator, denominator;
-(void) print
{
NSLog (@"%i/%i", numerator, denominator);
}
-(double) convertToNum
{
if (denominator != 0)
return (int) numerator/denominator;
else
return 1.0;
}
-(void) set:(int)n:(int)d
{
numerator = n;
denominator = d;
}
-(void) reduce
{
int u = numerator;
int v = denominator;
int temp;
while (v != 0) {
temp = v % u;
u = v;
v = temp;
}
numerator /= u;
denominator /= u;
}
-(Fraction *) add: (Fraction *) f
{
Fraction *result = [[Fraction alloc] init];
int resultNum, resultDenom;
resultNum = numerator * f.denominator +
denominator * f.numerator;
resultDenom = denominator * f.denominator;
[result set: resultNum: resultDenom];
[result reduce];
return result;
}
@end
--------------------------------------------
#import "Fraction.h"
int main (int argc, char *argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
Fraction *aFraction = [[Fraction alloc] init];
Fraction *sum = [[Fraction alloc] init], *sum2;
int i, pow2, n;
// set 1stfraction to 0
[sum set: 0.0 : 1.0];
NSLog (@"Enter your value for n:");
scanf ("%i", &n);
pow2 = 2;
for (i = 1; i <= n; ++i) {
[aFraction set: 1 : pow2];
sum2 = [sum add: aFraction];
[sum release]; // release previous sum
sum = sum2;
pow2 *= 2;
}
NSLog (@"After %i iterations, the sum is %f", n, [sum convertToNum]);
[aFraction release];
[sum release];
[pool drain];
return 0;
}
double을 반환하도록 convertToNum 메서드를 변경했지만 루프가 완료되면 여전히 0.000000을 제공합니다. 더 이상의 아이디어? - (double) convertToNum {(분모! = 0) 반환 값 (double) 분자/(double) 분모; 그렇지 않으면 1.0을 반환합니다. – Andrew
@Andrew Jimley는 main에서 for 루프를 확인합니다. sum2를 sum으로 설정 한 다음 sum을 릴리스하면 sum2도 릴리스됩니다. 둘 다 동일한 객체를 가리키기 때문입니다. 또한 분수에 dealloc 메서드가 없습니다 ... 나는 당신이해야한다는 것을 알기에는 충분하지만, 여기서 일어날 일을 알기에는 충분하지 않습니다. 이 루프를 다시 작성하여 새 값을 생성하고 새로 작성하는 대신 한 값에서 다른 값으로 값을 복사하십시오. – SecretMarmoset