Help with values not being changed

Discussion in 'iPhone/iPad Programming' started by wiseone9, Aug 21, 2010.

  1. macrumors newbie

    Joined:
    Aug 21, 2010
    #1
    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
     
  2. Moderator emeritus

    robbieduncan

    Joined:
    Jul 24, 2002
    Location:
    London
    #2
    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?
     
  3. thread starter macrumors newbie

    Joined:
    Aug 21, 2010
    #3
    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];
     
  4. macrumors 603

    Joined:
    Aug 9, 2009
    #4
    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.
     
  5. thread starter macrumors newbie

    Joined:
    Aug 21, 2010
    #5
    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
     
  6. Moderator

    dejo

    Staff Member

    Joined:
    Sep 2, 2004
    Location:
    The Centennial State
    #6
    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?
     
  7. macrumors 603

    Joined:
    Aug 9, 2009
    #7
    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
    
     
  8. thread starter macrumors newbie

    Joined:
    Aug 21, 2010
    #8
    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
     

Share This Page