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

wiseone9

macrumors newbie
Original poster
Aug 21, 2010
7
0
hey there,
im very new to objective c programming, and i'm having trouble getting the values contained in a class to change. ill just go straight to the problem

so basically i created a class called vector that contains variables like this:
Code:
Vector.h:

@interface Vector : NSObject {
	float X;
	float Y;
	float magnitude;
	float direction;
}
@property float X;
@property float Y;
@property float magnitude;
@property float direction;


- (Vector *)setVector:(float *)newX : (float *)newY;

Vector.m:
#import "Vector.h"


@implementation Vector

	@synthesize X;
	@synthesize Y;
	@synthesize magnitude;
	@synthesize direction; //goes on for a while this is just the beginning

now, i have this function that is supposed to set a vector inside Vector.m. this is what it looks like:
Code:
- (Vector *) setVector:(float *)newX : (float *)newY{
	Vector *v1;
	v1.X = *newX;
	v1.Y = *newY;
	v1.magnitude = sqrtf(powf(X,2) + powf(Y, 2));
	v1.direction = atanf(Y/X);
	return v1;
}
but when i say
Code:
	vector1 = [vector1 setVector: &xfloat : &yfloat];
(xfloat and yfloat do have a value, i have confirmed this)

when i output vector1.X and vector1.Y i get 0 and 0...whats going on?
let me know if this is not clear
 
Code:
- (Vector *) setVector:(float *)newX : (float *)newY{
	Vector *v1;
	v1.X = *newX;
	v1.Y = *newY;
	v1.magnitude = sqrtf(powf(X,2) + powf(Y, 2));
	v1.direction = atanf(Y/X);
	return v1;
}

At no point do you set v1 to anything: all you have done is declare a pointer to an object of type v1. That just reserves storage space for the pointer. It does not create a new object.

Also that method is very odd. Why does your set method (which would normally set the values of the existing method) return a new vector instead of setting the values in the instance the method is called on?
 
At no point do you set v1 to anything: all you have done is declare a pointer to an object of type v1. That just reserves storage space for the pointer. It does not create a new object.

Also that method is very odd. Why does your set method (which would normally set the values of the existing method) return a new vector instead of setting the values in the instance the method is called on?

Ok so if i read your post right, this is what you meant:
Code:
- (Vector *) setVector:(float *)newX : (float *)newY{
	
	X = *newX;
	Y = *newY;
	magnitude = sqrtf(powf(X,2) + powf(Y, 2));
	direction = atanf(Y/X);
        return self;
}

but it still does not work... i tried doing both:
Code:
vector1 = [vector1 setVector: &xfloat : &yfloat];
and just
Code:
[vector1 setVector: &xfloat : &yfloat];
 
How did you determine it didn't work? Debugger? NSLog? printf?

Post the code that shows whatever you did to determine it didn't work.

Debugging is mostly a process of gathering useful evidence. We need to see the evidence (i.e. the output) as well as the evidence-gatherer.
 
basically i just output it to a label that says "X coordinate: " and then a float value

when i output vector1.X, it always outputs 0, but if i output xfloat, which is what i tried to set vector1.X equal to, it outputs the proper number. (which is the number i enter in a text field above the label). therefore, i know that xfloat is being set to the correct number, but vector1.X just stays at 0
 
Code:
- (Vector *) setVector:([COLOR="Red"]float *[/COLOR])newX : ([COLOR="red"]float *[/COLOR])newY{
	
	X = [COLOR="red"]*newX[/COLOR];
	Y = [COLOR="red"]*newY[/COLOR];
	...
float is a primitive. What is the need for all the screwy pointers?

Plus, setters normally just return void.

P.S. Have you instantiated your vector1 yet?
 
basically i just output it to a label that says "X coordinate: " and then a float value

when i output vector1.X, it always outputs 0, but if i output xfloat, which is what i tried to set vector1.X equal to, it outputs the proper number. (which is the number i enter in a text field above the label). therefore, i know that xfloat is being set to the correct number, but vector1.X just stays at 0

Post your code.

Describing code does nothing. We can't debug descriptions. Even if we could, the translation from description to code could be incorrect.

EDIT:
Test program and output is below.
Compiled as command-line tool for Mac OS 10.6.3.

Output:
Code:
2010-08-21 19:12:33.975 a.out[1847:903]  X:0.000000 Y:0.000000 mag:0.000000 dirn:0.000000
2010-08-21 19:12:33.979 a.out[1847:903]  X:12.300000 Y:12.400000 mag:17.465681 dirn:0.789447

vecmain.m:
Code:
#import <Foundation/Foundation.h>

#import "Vector.h"

static void
showVec( Vector * vec )
{
  NSLog( @" X:%f Y:%f mag:%f dirn:%f", vec.X, vec.Y, vec.magnitude, vec.direction );
}


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

	Vector * vec1 = [[Vector alloc] init];  // initially empty
	
	showVec( vec1 );
	
	float x1 = 12.3f;
	float y1 = 12.4f;
	
	[vec1 setVector:&x1 :&y1];
	showVec( vec1 );
	
    [pool drain];
    return 0;
}

Vector.h:
Code:
#import <Foundation/Foundation.h>

@interface Vector : NSObject {
	float X;
	float Y;
	float magnitude;
	float direction;
}
@property float X;
@property float Y;
@property float magnitude;
@property float direction;


- (Vector *)setVector:(float *)newX : (float *)newY;

@end

Vector.m:
Code:
#import "Vector.h"

@implementation Vector

	@synthesize X;
	@synthesize Y;
	@synthesize magnitude;
	@synthesize direction; //goes on for a while this is just the beginning
	
	- (Vector *) setVector:(float *)newX : (float *)newY{
	X = *newX;
	Y = *newY;
	magnitude = sqrtf(powf(X,2) + powf(Y, 2));
	direction = atanf(Y/X);
	return self;
}

@end
 
thanks everyone

wow thanks for all the help everybody. it turns out that all my code is fine, i had just forgotten to instantiate vector1. (the ironic thing is that i had instantiated my vector2, but i never tested that one)

anyways, thanks and sorry for making such a big deal about a really dumb mistake
 
Register on MacRumors! This sidebar will go away, and you'll see fewer ads.