• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Was gibt es Schöneres als den Mai draußen in der Natur mit allen Sinnen zu genießen? Lasst uns teilhaben an Euren Erlebnissen und macht mit beim Thema des Monats Da blüht uns was! ---> Klick

Ausgabeproblem im Foundation Projekt

MarCus88

Alkmene
Registriert
29.10.09
Beiträge
31
Hallo zusammen,

da ich in meinen Semesterferien nun endlich wieder ein bisschen Zeit habe, beschäftige ich mich wieder mit Cocoa und Objective-C. Dazu arbeite ich das Buch von Amin Negm-Awad durch (sehr zu empfehlen übrigens). Derzeit bin ich etwa in der Mitte des Buches und halte mich für fähig einfache Foundation Applikationen zu schreiben. Um nun selbst ein wenig zu schauen ws ich bisher verstanden habe, wollte ich eine kleine Anwendung schreiben um mit komplexen Zahlen zu rechnen. Leider scheitert mein Vorhaben nach der Initialisierung zweier Instanzen undzwar bei der Ausgabe.

Ich poste einfach mal die einzelnen Codes des Headers, der Implementierung sowie des Programmms:

Code:
#import <Cocoa/Cocoa.h>


@interface Complex : NSObject {
	double realTeil;
	double imaginaerTeil;
}
@property(readwrite) double realTeil;
@property(readwrite) double imaginaerTeil;

+(Complex*)complexWithRealTeil:(double)realTeil imaginaerTeil:(double)imaginaerTeil;
-(id)initWithRealTeil:(double)initRealTeil imaginaerTeil:(double)initImaginaerTeil;
@end
der Header

Code:
#import "Complex.h"


@implementation Complex
@synthesize realTeil,imaginaerTeil;

#pragma mark overwrite init
-(id)init
{
	return [self initWithRealTeil:0.0 imaginaerTeil: 0.0];
}
#pragma mark Convenience-Allocator
+(Complex*)complexWithRealTeil:(double)realTeil imaginaerTeil:(double)imaginaerTeil
{
	return [[[self alloc] initWithRealTeil:(double)realTeil imaginaerTeil:(double)imaginaerTeil] autorelease];
}
#pragma mark initializer
-(id)initWithRealTeil:(double)initRealTeil imaginaerTeil:(double)initImaginaerTeil
{
	self=[super init];
	
	if (self) {
		self.imaginaerTeil=initRealTeil;
		self.realTeil=initImaginaerTeil;
	}
	return self;
}
#pragma mark dealloc
-(void)dealloc
{
	self.realTeil=0.0;
	self.imaginaerTeil=0.0;
	
	[super dealloc];
}

@end
die Implementierung

Code:
#import <Foundation/Foundation.h>
#import "Complex.h"

int main (int argc, const char * argv[]) {
	Complex* c1;
	Complex* c2;
	
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

	// Instanzen initialisieren
    c1 = [Complex complexWithRealTeil:3.0 imaginaerTeil:4.0];
	c2 = [Complex complexWithRealTeil:5.0 imaginaerTeil:8.0];
	
	// Ausgabe beider komplexen Zahlen
	NSLog("c1 Re: %f, Im: %f",c1.realTeil,c1.imaginaerTeil);
	NSLog("c2 Re: %f, Im: %f",c2.realTeil,c2.imaginaerTeil);
	
    [pool drain];
    return 0;
}
und hier das Programm

Sicherlich ist es irgendeine Kleinigkeit die ich aber nicht selbst finde. Danke euch für die Hilfe vorab!

Grüße
Marcus
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
NSLog() erwartet als ersten Parameter einen NSString. Der Compiler weist Dich darauf auch hin, dass Du da etwas falsches übergibst.
Code:
NSLog(@"c1 Re: %f, Im: %f", c1.realTeil, c1.imaginaerTeil);
NSLog(@"c2 Re: %f, Im: %f", c2.realTeil, c2.imaginaerTeil);
MacApple
 

MarCus88

Alkmene
Registriert
29.10.09
Beiträge
31
Ich muss mich nochmal rückmelden. Jetzt hab ich meine Implementierung insoweit erweitert, dass ich die Instanzen miteinander addieren kann. Das funktioniert auch ganz gut, allerdings bekomme ich vom Compiler eine Warnung :(

Ich poste einfach mal meine Erweiterung:

Code:
-(Complex*)addComplexOne:(Complex*)complexOne complexTwo:(Complex*)complexTwo
{
	Complex* newComplex = [Complex complexWithRealTeil:0.0 imaginaerTeil:0.0];
	newComplex.realTeil=complexOne.realTeil + complexTwo.realTeil;
	newComplex.imaginaerTeil=complexOne.imaginaerTeil+complexTwo.imaginaerTeil;
	return newComplex;
}
die Implementierung

Code:
result=[result addComplexOne:c1 complexTwo:c2];
die kritische Zeile im Programm (result ist eine korrekt initialisierte Instanz von Complex)

Danke für die Hilfe vorab!
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
Schön, dass der Compiler eine Warnung ausgibt. Sollen wir die jetzt erraten? Der Instanzmethode zwei Objekte zu übergeben, die dann verarbeiten werden, ist ziemlich umständlich. Hast Du vielleicht Instanz und Klassenmethode verwechselt?

MacApple
 

MarCus88

Alkmene
Registriert
29.10.09
Beiträge
31
Entschuldige, die Warnung hätte ich natürlich direkt dazuschreiben können^^

Der Compiler schreibt mir in der Programmzeile: 'Complex' may not respond to '-addComplexOne:complexTwo:'

Sicherlich hätte ich hieraus eine Klassenmethode machen können. Hab bitte Nachsehen, ich bin noch Neuling ;)

Edit: Ok hat sich erledigt. Ich hab zwischenzeitlich eine Klassenmethode draus gemacht und hatte dasselbe Problem, die Warnung des Compilers blieb weiterhin bestehen. Ich hatte vergessen die Methode im Headerfile entsprechend bekannt zu machen.^^
 
Zuletzt bearbeitet:

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
So einfach kann es manchmal sein. ;)

MacApple