user705404
user705404

Reputation:

gcc compile errors in an basic example objc program

Hey all, I'm new to programming and going through an objective-c book to learn the language and programing fundamentals. I've looked through the code repeatedly, went back to the book's example, and attempted to understand the gcc comple errors. Here's my code:

#import <stdio.h>
#import <objc/Object.h>

@interface Point: Object
    {
        int xaxis;
        int yaxis;
    }

    -(void) print;
    -(void) setx:   (int)x;
    -(void) sety:   (int)y;

@end

@implementation Point;

    -(void) print
        {
            printf("(%i,%i)", xaxis, yaxis);
        }

    -(void) setx:   (int) x
        {
            xaxis = x;
        }

    -(void) sety:   (int) y
        {
            yaxis = y;
        }
@end

int main (int argc, char *argv[])
    {
        Point *myPoint;

        myPoint = [Point alloc];

        myPoint = [myPoint init];

        [myPoint setx: 4];
        [myPoint sety: 5];

        printf("The coordinates are: ");
            [myPoint print];
        printf("\n");

        [myPoint free];

        return 0;

    }

Then the compile errors from gcc look like this:

urban:Desktop alex$ gcc point.m -o point -l objc
point.m: In function ‘main’:
point.m:38: warning: ‘Point’ may not respond to ‘+alloc’
point.m:38: warning: (Messages without a matching method signature
point.m:38: warning: will be assumed to return ‘id’ and accept
point.m:38: warning: ‘...’ as arguments.)
point.m:40: error: ‘mypoint’ undeclared (first use in this function)
point.m:40: error: (Each undeclared identifier is reported only once
point.m:40: error: for each function it appears in.)
point.m:49: warning: ‘Point’ may not respond to ‘-free’

Where am I going wrong?

btw I'm going through "Programming in Objective-C" by Stephen Kochan if you wanted to know.

Upvotes: 1

Views: 1127

Answers (3)

paulbailey
paulbailey

Reputation: 5346

You have warnings and an error. The warnings seem to suggest that Object, which you are subclassing, doesn't implement alloc, init or free. Normally, on an Apple platform, you'd subclass NSObject, which does implement these, but without knowing which platform you're on, it's not possible to advise the correct option.

Secondly, you had a typo, but that now seems to be corrected. This

point.m:40: error: ‘mypoint’ undeclared (first use in this function)

suggests that you had mypoint in your code, rather than myPoint.

Upvotes: 0

AndersK
AndersK

Reputation: 36082

First the base class should be NSObject, not Object

the normal way to do the initialization is to write the alloc and init in the same statement. You would typically have an -(id)init; method in your class:

-(id)init
{
  if ( ( self = [super init] ) )
  {
    ; // additional initialization goes here
  }
  return self;
}

and

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

Properties are better used, then you get the setter and getter automatically generated for you

instead of

@interface Point: Object
    {
        int xaxis;
        int yaxis;
    }

write

@interface Point : NSObject
{
}

@property int xaxis;
@property int yaxis;

then when you assign you can either write

[myPoint setXaxis:4]

or

myPoint.xaxis = 4;

when you release the object write release, not free

[myPoint release];

hth

Upvotes: 2

Dev
Dev

Reputation: 7046

You forgot to include the header Foundation.h:

#import <Foundation/Foundation.h>

Upvotes: 0

Related Questions