Welcome to the Treehouse Community

Want to collaborate on code errors? Have bugs you need feedback on? Looking for an extra set of eyes on your latest project? Get support with fellow developers, designers, and programmers of all backgrounds and skill levels here with the Treehouse Community! While you're at it, check out some resources Treehouse students have shared here.

Looking to learn something new?

Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and join thousands of Treehouse students and alumni in the community today.

Start your free trial

iOS

Implicit declaration of function '...' is invalid on C99

I am still working on an iPhone app called Cruzia and am now wondering why I am geting these two warnings, both in ViewController.m and three errors, all an Apple Mach-O Linker Error. If you can point me in the direction of some fixes I would be very appreciative. I have commented the warnings out below in a copy of my viewcontroller.m:

#import "CIAViewController.h"

@interface CIAViewController()


@end

@implementation CIAViewController




-(IBAction)press {
cruzia.hidden = 0;
textarea.hidden = 0;
playbtn.hidden = 1;
tutorialbtn.hidden = 1;
optionsbtn.hidden = 1;
trainingbtn.hidden = 1;
back.hidden = 0;
cruzia.text = @"Play";
textarea.text = @"Hello! You are playing the game of Cruzia!";

    // declare defaults it is not declared elsewhere within your view controller
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    // The stringForKey method returns a String and not a Boolean value
    // However, if you just want to check if a value exists then it is implied you are checking for existence
    // If there is no value then it will return nil and statement will fail
    // You had "== YES" outside of the parenthesis which is an illegal statement
    if ([defaults stringForKey:kMusic])  {
        CFBundleRef mainBundle = CFBundleGetMainBundle();
        CFURLRef soundFileURLRef;
        soundFileURLRef =CFBundleCopyResourceURL(mainBundle, (CFStringRef) @"click",                     CFSTR ("wav"), NULL);
        UInt32 soundID;
        AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID);
        AudioServicesPlaySystemSound(soundID); }

}


-(IBAction)press2 {
cruzia.hidden = 0;
textarea.hidden = 0;
playbtn.hidden = 1;
tutorialbtn.hidden = 1;
optionsbtn.hidden = 1;
trainingbtn.hidden = 1;
back.hidden = 0;
cruzia.text = @"Tutorial";
textarea.text = @"Welcome! You are watching the Cruzia tutorial!";
// declare defaults it is not declared elsewhere within your view controller
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

// The stringForKey method returns a String and not a Boolean value
// However, if you just want to check if a value exists then it is implied you are checking for existence
// If there is no value then it will return nil and statement will fail
// You had "== YES" outside of the parenthesis which is an illegal statement
if ([defaults stringForKey:kMusic])  {
    CFBundleRef mainBundle = CFBundleGetMainBundle();
    CFURLRef soundFileURLRef;
    soundFileURLRef =CFBundleCopyResourceURL(mainBundle, (CFStringRef) @"click",                     CFSTR ("WAV"), NULL);
    UInt32 soundID;
    AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID);
    AudioServicesPlaySystemSound(soundID); }
}

-(IBAction)press3 {
cruzia.hidden = 0;
textarea.hidden = 0;
playbtn.hidden = 1;
tutorialbtn.hidden = 1;
optionsbtn.hidden = 1;
trainingbtn.hidden = 1;
back.hidden = 0;
cruzia.text = @"Options";
textarea.text = @"Hello! You have clicked Options. Sadly, you need to open Settngs and go to the Cruzia area to get most of the options of the game.";
CFBundleRef mainBundle = CFBundleGetMainBundle();
CFURLRef soundFileURLRef;
soundFileURLRef =CFBundleCopyResourceURL(mainBundle, (CFStringRef) @"click", CFSTR ("WAV"), NULL);
UInt32 soundID;
AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID);
AudioServicesPlaySystemSound(soundID);
}

-(IBAction)press4 {
cruzia.hidden = 0;
textarea.hidden = 0;
playbtn.hidden = 1;
tutorialbtn.hidden = 1;
optionsbtn.hidden = 1;
trainingbtn.hidden = 1;
back.hidden = 0;
cruzia.text = @"Training";
textarea.text = @"This is the training area. You can improve your Cruzia skills here!";
// declare defaults it is not declared elsewhere within your view controller
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

// The stringForKey method returns a String and not a Boolean value
// However, if you just want to check if a value exists then it is implied you are checking for existence
// If there is no value then it will return nil and statement will fail
// You had "== YES" outside of the parenthesis which is an illegal statement
if ([defaults stringForKey:kMusic])  {
    CFBundleRef mainBundle = CFBundleGetMainBundle();
    CFURLRef soundFileURLRef;
    soundFileURLRef =CFBundleCopyResourceURL(mainBundle, (CFStringRef) @"click",                     CFSTR ("WAV"), NULL);
    UInt32 soundID;
    AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID);
    AudioServicesPlaySystemSound(soundID); }
}

-(IBAction)press5 {
cruzia.hidden = 0;
textarea.hidden = 0;
playbtn.hidden = 0;
tutorialbtn.hidden = 0;
optionsbtn.hidden = 0;
trainingbtn.hidden = 0;
back.hidden = 1;
cruzia.text = @"Cruzia";
textarea.text = @"";
// declare defaults it is not declared elsewhere within your view controller
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

// The stringForKey method returns a String and not a Boolean value
// However, if you just want to check if a value exists then it is implied you are checking for existence
// If there is no value then it will return nil and statement will fail
// You had "== YES" outside of the parenthesis which is an illegal statement
if ([defaults stringForKey:kMusic])  {
    CFBundleRef mainBundle = CFBundleGetMainBundle();
    CFURLRef soundFileURLRef;
    soundFileURLRef =CFBundleCopyResourceURL(mainBundle, (CFStringRef) @"click",                     CFSTR ("WAV"), NULL);
    UInt32 soundID;
    AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID);
    AudioServicesPlaySystemSound(soundID); }

}

- (void)viewDidLoad
{
textarea.hidden = 1;
playbtn.hidden = 0;
tutorialbtn.hidden = 0;
optionsbtn.hidden = 0;
trainingbtn.hidden = 0;
back.hidden = 1;
cruzia.text = @"Cruzia";
[super viewDidLoad];

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateSettings:)
                                            name:
 NSUserDefaultsDidChangeNotification object:nil];

[self setupDefaults];
}

- (void)viewDidUnload 
{

[super viewDidUnload];

[[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidFinishLaunchingNotification object:nil];
}

-(void) setupDefaults {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];


NSString *violenceValue = [defaults stringForKey:kViolenceMode];

if ( violenceValue == nil ) {
    NSString *pathStr = [[NSBundle mainBundle] bundlePath];
    NSString *settingsBundlePath = [pathStr stringByAppendingPathComponent:@"Settings.bundle"];
    NSString *finalPath = [settingsBundlePath stringByAppendingPathComponent:@"Root.plist"];

    NSDictionary *settingsDictionary = [NSDictionary dictionaryWithContentsOfFile:finalPath];
    NSArray *prefSpecifierArray = [settingsDictionary objectForKey:@"PreferenceSpecifiers"];


    NSString *isMusicOn, *isSoundOn;

    NSDictionary *prefItem;

    for (prefItem in prefSpecifierArray) {
        NSString *keyValue = [prefItem objectForKey:@"Key"];
        id defaultValue = [prefItem objectForKey:@"DeafultValue"];

        if ([keyValue isEqualToString:kSound])
        {
            isSoundOn = defaultValue;
        }
        else if ([keyValue isEqualToString:kMusic])
        {
            isMusicOn = defaultValue;
        }

        NSDictionary *appDefaults = [NSDictionary dictionaryWithObjectsAndKeys:                                  isSoundOn, kSound, isMusicOn, kMusic, nil];

        [defaults registerDefaults:appDefaults];
        [defaults synchronize];

    }

}

}



@end

And here is a screenshot of the place I am getting the other errors with the Debug and Output panels open. Go to http://i.stack.imgur.com/fZVw8.png for image

Thanks again,

1 Answer

For the undefined symbols error you need to make sure you include the AudioToolbox.framework in your project. See this link if you're not sure of all the steps to do that.

Aha Thankyou! Now my project works, even if it still has the C99 error!