0

「Program9.1」のKochanによる「ProgramminginObjective-c」の演習用のコピー貼り付けコード。しかし、それはコンパイルされません。

分数と複雑の2つのクラスがあります。Complexのオブジェクトは正常に機能しているようですが、「main.m」にあるFractionのオブジェクト「fracResult」でエラーが発生します:「互換性のないタイプ「void」から「Fraction*」に割り当てています」。

これがFraction.hです。

#import <Foundation/Foundation.h>
// Define the Fraction class
@interface Fraction : NSObject
{
int numerator;
int denominator;
}
@property int numerator, denominator;
-(void) print;
-(void) setTo: (int) n over: (int) d;
-(double) convertToNum;
-(void) add: (Fraction *) f;
-(void) reduce;
@end 

Fraction.mファイル:

#import "Fraction.h"
@implementation Fraction
@synthesize numerator, denominator;
-(void) print
{
NSLog (@"%i/%i", numerator, denominator);
}
-(double) convertToNum
{
if (denominator != 0)
return (double) numerator / denominator;
else
return NAN;
}
-(void) setTo: (int) n over: (int) d
{
numerator = n;
denominator = d;
}
// add a Fraction to the receiver
-(void) add: (Fraction *) f
{
// To add two fractions:
// a/b + c/d = ((a*d) + (b*c)) / (b * d)
numerator = numerator * f.denominator + denominator * f.numerator;
denominator = denominator * f.denominator;
}
-(void) reduce
{
int u = numerator;
int v = denominator;
int temp;
while (v != 0) {
temp = u % v;
u = v;
v = temp;
}
numerator /= u;
denominator /= u;
}
@end

main.mファイル:

#import "Fraction.h"
#import "Complex.h"
int main (int argc, char *argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
Fraction *f1 = [[Fraction alloc] init];
Fraction *f2 = [[Fraction alloc] init];
Fraction *fracResult;
Complex *c1 = [[Complex alloc] init];
Complex *c2 = [[Complex alloc] init];
Complex *compResult;
[f1 setTo: 1 over: 10];
[f2 setTo: 2 over: 15];
[c1 setReal: 18.0 andImaginary: 2.5];
[c2 setReal: -5.0 andImaginary: 3.2];
// add and print 2 complex numbers
[c1 print]; NSLog (@" +"); [c2 print];
NSLog (@"---------");
compResult = [c1 add: c2];
[compResult print];
NSLog (@"\n");
[c1 release];
[c2 release];
[compResult release];
// add and print 2 fractions
[f1 print]; NSLog (@" +"); [f2 print];
NSLog (@"----");
fracResult= [f1 add: f2];  //this line gives an error 
[fracResult print];
[f1 release];
[f2 release];
[fracResult release];
[pool drain];
return 0;
}

このトピックを調査したところ、ポインタの誤った使用によって引き起こされるこのタイプのエラーが頻繁に発生することがわかりました。メソッド「add:」の宣言と実装からアスタリスク記号を削除することをお勧めします。しかし、それはより多くの「意味論的問題」につながりました

また、本で使用されている文字とxcodeで使用されている文字の違いが原因で、本のコードがコンパイルされない場合があります。多くの場合、ダッシュは異なります。しかし、それでも「互換性のないタイプ」の問題は解決しませんでした。

アドバイスや提案は大歓迎です。

4

2 に答える 2

2

問題は、add次のように定義されていることです

-(void) add: (Fraction *) f;

Fraction* f現在のオブジェクトに渡されたものをオブジェクト自体に追加するためです。これは、2つの分数の合計である新しい分数を返さないが、分数自体を変更することを意味します。そのため、戻りタイプはです(void)。そうでない場合は、-(Fraction*) add:(Fraction*)f;です。

それで

Fraction *fractResult = [f1 add:f2]

によって返された値を格納しようとします[Fraction add:]が、戻り値はですvoid。これは値ではなく、どこにも格納できません。(そのため、互換性のないタイプvoidから割り当てを取得します)

于 2012-11-13T18:56:56.240 に答える
0

このクラスメソッドは正しく定義されていません:

-(void) add: (Fraction *) f;

したがって、次のようにをに割り当てvoidますFraction *

fracResult= [f1 add: f2];

宣言と実装を修正すると、正常に機能するはずです。

于 2012-11-13T18:59:35.577 に答える