Become a MacRumors Supporter for $50/year with no ads, ability to filter front page stories, and private forums.

CaptainZap

macrumors regular
Original poster
Jan 17, 2007
170
0
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,
Code:
-(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...
Code:
-(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

Code:
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.
 

CaptainZap

macrumors regular
Original poster
Jan 17, 2007
170
0
K, for Rectangle...
Code:
@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
Code:
@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

macrumors regular
Apr 7, 2004
220
96
Israel
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

macrumors regular
Original poster
Jan 17, 2007
170
0
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

Code:
-(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];
	
}
 
Register on MacRumors! This sidebar will go away, and you'll see fewer ads.