1

ダウンロードする場合は、ここにプロジェクトファイルがあります:http://files.me.com/knyck2/918odc

そこで、私は「Objective c 2.0でのプログラミング」という本に取り組んでおり、演習8.5に取り組んでいます。この演習では、一連のクラスを作成し、自家製の抽象クラスを正方形クラス、三角形クラス、および円クラスにサブクラス化する必要があります。また、各オブジェクトのメソッドを使用して面積と周長/円周を計算し、nslogに表示する必要があります。

すべてがほぼ設定されていますが、三角形のクラスから各辺のサイズを表示すると、いくつかの奇妙な値が返されます。理由はわかりません。側面の1つは0.000000として表示され、他の2つはこれらの巨大なフロート/ダブルとして表示されます。

521556413499497987605515504756958465074645713473678706698073680750705671496313493175192637227720116636212033961634738517717834352497805734697302078530634879721347399811072.000000

661675923659048238438515844320261245751425513854584815925028483891542482488445146590620251584462848.000000

デバッグに行くと、すべての値が正しく割り当てられているように見えるので、なぜこれがとてもファンキーに表示されているのか迷っています。

あなたが提供できるどんな助けにも感謝します、

ニック

これがメインです:

#import <Foundation/Foundation.h>
#import "Rectangle.h"
#import "Triangle.h"
#import "Circle.h"

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

    Rectangle *myRect = [[Rectangle alloc] init];
    Circle    *myCircle = [[Circle alloc] init];
    Triangle *myTriangle = [[Triangle alloc] init];

    myRect.fillColor = 12345;
    myRect.filled = NO;
    myRect.lineColor = 29999;
    [myRect setWidth:15.3 andHeight:22.3];

    NSLog(@"the rectangle has a filled color of %i,line color of %i",
            myRect.fillColor, myRect.lineColor);

    if (myRect.filled == YES) 
        NSLog(@"The rectangle is also filled");
    else if (myRect.filled == NO) 
    NSLog(@"The rectangle is not filled");

    NSLog(@" rectangle %f, %f, area %f, perimeter %f",
           myRect.w , myRect.h, myRect.area, myRect.perimeter);                    

    myCircle.fillColor = 15555;
    myCircle.filled = NO;
    myCircle.lineColor = 32349;
    [myCircle setR:15.2];

    NSLog(@"the circle has a radius of %f ,color of %i, line color of %i",
           myCircle.r, myCircle.fillColor, myCircle.lineColor);

    NSLog(@"Also the circles area is %f and the circumference is %f",
            myCircle.area, myCircle.circumference  );


    myTriangle.fillColor = 71611;
    myTriangle.filled = NO;
    myTriangle.lineColor = 78998;
    [myTriangle setSide1:13];
    [myTriangle setSide2:19];
    [myTriangle setSide3: 27.5];

    NSLog(@"triangle sides %g, %g and %g."),  // << error
            myTriangle.side1 , myTriangle.side2 , myTriangle.side3 ;
    NSLog(@"triangle area %f, perimeter %f.",
            myTriangle.area, myTriangle.perimeter );
    NSLog(@"triangle fill color %i, line color %i",
            myTriangle.fillColor, myTriangle.lineColor);

    [myCircle release];
    [myRect release];
    [myTriangle release];

    [pool drain];
    return 0;

}

インターフェースと実装は次のとおりです。

#import <Foundation/Foundation.h>
#import "GraphicObject.h"

@interface Triangle : GraphicObject 
{
    double side1;
    double side2;
    double side3;
}

@property double side1, side2, side3;

-(void) setSides: (double)s1: (double)s2 : (double)s3;
-(double) area;
-(double) perimeter;

@end

Triangle.m

#import "Triangle.h"
#import <math.h>

@implementation Triangle
@synthesize side1, side2, side3;

-(void) setSides: (double) s1: (double) s2:(double) s3
{
    side1 = s1; 
    side2 = s2;
    side3 = s3;
}

-(double) area
{
    return sqrt(  (side1 + side2 + side3) 
                * (side1 + side2 - side3)
                * (side2 + side3 - side1)
                * (side3 + side1 - side2) / 16);
}

-(double) perimeter
{
    return side1 + side2 + side3;
}
@end

ここにもスーパークラスGraphicObject.hがあります

#import <Foundation/Foundation.h>    
@interface GraphicObject : NSObject 
{
    int fillColor; 
    BOOL filled; 
    int lineColor;  
}

@property int fillColor, lineColor;
@property BOOL filled;
@end

GraphicObject.m

#import "GraphicObject.h"
@implementation GraphicObject
@synthesize fillColor, lineColor, filled;
@end
4

1 に答える 1

3

問題はこの行です:

NSLog(@"the triangle has the sides of sizes %g, %g and %g."), myTriangle.side1 , myTriangle.side2 , myTriangle.side3 ;

)beforeを使用する,ということは、NSLogの呼び出しが%g、出力用にフォーマットするときにそれらの代わりとなる値を提供しないことを意味します。私の旧友が「すべてのエラーはコピーアンドペーストに起因する……すべて」と言っていたので、それは意図的ではないように見えます。

修正は、の)直前にに移動する;ことです。

NSLog(@"the triangle has the sides of sizes %g, %g and %g.", myTriangle.side1 , myTriangle.side2 , myTriangle.side3);
于 2010-01-04T21:35:51.670 に答える