Domanda

Hi this is third day of mine using Objective-C today I was writing few simple programs and i ecncountered the following warning

main.m:19:5: warning: passing argument 1 of 'NSLog' makes pointer from integer without a cast [enabled by default] NSLog(res);

which finally resulted in the Segmentation fault.. Here is my program..

#import <Foundation/Foundation.h>
@interface SomeClass: NSObject
{
    int x;
}
@property int x;
@end

@implementation SomeClass

@synthesize x;
@end

int main(){ 
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc]init];
SomeClass * obj = [[SomeClass alloc]init];
obj.x =20;
int res = obj.x;
NSLog(res); //error
/* But the error was not seen when I replaced the above statement with 
 NSLog(@"The value is : %d",res);
 */
[pool drain];
return 0;
}

The error message that I got was :

Compiling the source code....
$gcc `gnustep-config --objc-flags` -L/usr/GNUstep/System/Library/Libraries -lgnustep-base main.m -o demo -lm -pthread -lgmpxx -lreadline 2>&1
main.m: In function 'main':
main.m:19:5: warning: passing argument 1 of 'NSLog' makes pointer from integer without a cast [enabled by default]
     NSLog(res);
     ^
In file included from /usr/GNUstep/System/Library/Headers/Foundation/NSObject.h:30:0,
                 from /usr/GNUstep/System/Library/Headers/Foundation/FoundationErrors.h:29,
                 from /usr/GNUstep/System/Library/Headers/Foundation/Foundation.h:33,
                 from main.m:1:
/usr/GNUstep/System/Library/Headers/Foundation/NSObjCRuntime.h:146:16: note: expected 'struct NSString *' but argument is of type 'int'
 GS_EXPORT void NSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2);
                ^

Executing the program....
$demo 
Segmentation fault (core dumped)

Please help by making me understand why NSLog behaves like this ? Where did I go wrong? Thank you...

È stato utile?

Soluzione 2

You cant declare the NSLog like that see the tutorial for NSLog its may be useful for you.

Objective-C has a number of built-in data types:

int – integer constant

float – real numbers with fractional component

double – double precision floating point number

char – a single character

short – short integer (2 bytes)

long – double short

long long – double long

BOOL – boolean

The utility function NSLog() can be used to print to the debug console in Xcode. NSLog() uses the NSString formatting services. The easiest way to create a NSString is to use the @”" notation. Inside a format string a % is a placeholder for a value. The character after the % determines the value expected, be it an int or a float and so on. If we declare an integer “int i = 5″ and want to print the value of i with NSLog() we can do it with NSLog(@”The value of i is %d”, i);

You can use %d to print the value of an int, %f for a float and double, %c for a char. For a full listing of all format specifiers supported by NSString formatting methods read through the documentation.

For More Reference Click Here

keep learning..:)

Altri suggerimenti

You can't use the NSLog like this, You need to specify the control string and use like:

NSLog(@"%d",res);

The format should be specified for NSLog(), please check the NSLog and NSLogv reference for more information

NSLog

Logs an error message to the Apple System Log facility.

void NSLog ( NSString *format, ... );

Discussion

Simply calls NSLogv, passing it a variable number of arguments. Availability


NSLogv

Logs an error message to the Apple System Log facility.

void NSLogv ( NSString *format, va_list args );

Discussion

Logs an error message to the Apple System Log facility (see man 3 asl). If the STDERR_FILENO file descriptor has been redirected away from the default or is going to a tty, it will also be written there. If you want to direct output elsewhere, you need to use a custom logging facility.

The message consists of a timestamp and the process ID prefixed to the string you pass in. You compose this string with a format string, format, and one or more arguments to be inserted into the string. The format specification allowed by these functions is that which is understood by NSString’s formatting capabilities (which is not necessarily the set of format escapes and flags understood by printf). The supported format specifiers are described in “String Format Specifiers”. A final hard return is added to the error message if one is not present in the format.

In general, you should use the NSLog function instead of calling this function directly. If you do use this function directly, you must have prepared the variable argument list in the args argument by calling the standard C macro va_start. Upon completion, you must similarly call the standard C macro va_end for this list.

Output from NSLogv is serialized, in that only one thread in a process can be doing the writing/logging described above at a time. All attempts at writing/logging a message complete before the next thread can begin its attempts.

The effects of NSLogv are not serialized with subsystems other than those discussed above (such as the standard I/O package) and do not produce side effects on those subsystems (such as causing buffered output to be flushed, which may be undesirable). Availability

The 1st argument to NSLog is an NSString that should be a string with 0 or more format specifiers.

Use:

NSLog(@"res = %d", res);

or just:

NSLog(@"%d", res);

Have a look at the reference docs for NSLog for details.

You should specify the compiler that what kind of data type you want to print in Log,

    NSLog(@"%d",res);

You should not never use NSLog(variable) directly. Instead, use NSLog(@"%d", variable) for integers or NSLog(@"%@", object) for objects.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top