PDA

View Full Version : Probably a Simple Problem...

CaptainZap
Feb 10, 2007, 04:27 PM
Well I am working my way through "Programming in Objective-C" book, and am currently stuck on an exercise in Chapter 8, unfortunately it is an even so I can't see what Kochan has on his site. So the question is,
4. Write a Rectangle method called translate: that takes a vector Point (xv,yv) as its argument. Have it translate the rectangle's origin by the specified vector.

So in the Rectangle.h, I made the method declaration, -(Point *) translate: (Point *) vector; and it is supposed to take a Point instance and translate it by its x and y values.

So I came up with this method definition...
-(Point *) translate: (Point *) vector;
{
float vectorX, vectorY;

origin = [[Point alloc] init];

vectorX = [[vector origin] x] + x;
vectorY = [[vector origin] y] + y;

[origin setX: vectorX setY: vectorY];
}

then in the main.m, I did this

int main (int argc, char *argv[])
{
Rectangle *myRectangle = [[Rectangle alloc] init];
Point *myPoint = [[Point alloc] init];
Point *translation = [[Point alloc] init];

[myRectangle setHeight: 12];
[myRectangle setWidth: 3];

[myPoint setX: 6 setY: 7];

[translation setX: 4 setY: 3];

[myRectangle setOrigin: myPoint];

[myRectangle translate: translation];

printf ("Now the Origin is at (%g,%g)\n", [[myRectangle origin] x], [[myRectangle origin] y]);

return 0;
}

I get the errors, error: 'x' undeclared (first use in this function) and the same for y, if you need the rest of the .m and .h files, just ask.

bronxbomber92
Feb 10, 2007, 04:35 PM
It would help to know what the structs/classes of Point and Rect contained :)

CaptainZap
Feb 10, 2007, 04:38 PM
K, for Rectangle...
@interface Rectangle: Object
{
float height;
float width;
Point *origin;
}

-(void) setHeight: (float) h;
-(void) setWidth: (float) w;
-(float) height;
-(float) width;
-(float) area;
-(float) perimeter;

-(void) setOrigin: (Point *) pt;
-(Point *) origin;

-(Point *) translate: (Point *) vector;

-(id) free;

@end

And for Point
@interface Point: Object
{
float x;
float y;
}

-(void) setX: (float) xVal;
-(void) setY: (float) yVal;
-(void) setX: (float) xVal setY: (float) yVal;

-(float) x;
-(float) y;

@end

P.S. I left out the preprocessor lines, so don't think that I forgot to put them in my program :P

yoavcs
Feb 10, 2007, 05:42 PM
You aren't defining the 'x' and 'y' local variables you use in the translate: method anywhere...

Edit for clarity: not the ones in the [[vector origin] x] message, the ones outside.

CaptainZap
Feb 10, 2007, 06:08 PM
You aren't defining the 'x' and 'y' local variables you use in the translate: method anywhere...

Edit for clarity: not the ones in the [ ] method call, the ones outside.

Ah, ok, I dunno why, but for some reason I kept thinking Rectangle inherited the methods from Point.

Woot, thanks, I got it, and if anyone is curious, I just changed the translate method so it doesn't return anything and to this

-(void) translate: (Point *) vector;
{
float vectorX, vectorY;

Point* transOrigin = [[Point alloc] init];

vectorX = [vector x] + [[self origin] x];
vectorY = [vector y] + [[self origin] y];

[transOrigin setX: vectorX setY: vectorY];

[self setOrigin: transOrigin];

}