Mein Zinsrechner mit Klassen funktioniert nicht

M

mmoerth

Neues Mitglied
Thread Starter
Dabei seit
30.03.2013
Beiträge
17
Reaktionspunkte
0
Liebe MacUser-Community,

ich habe versucht, einen kleinen Zinsrechner mit Klassen zu schreiben. Jedoch diesmal nicht mit grafischer Oberfläche sondern für die Konsole, da ich mir dachte, dass ich mich erst einmal mit den wichtigen Grundlagen auseinandersetzten muss, bevor ich mich auf die Programmierung inklusive GUI stürze. Also habe ich einmal begonnen, dieses kleine Vorhaben mit dem Zinsrechner zu realisieren. Jedoch gab es bei der Ausführung 5 Hinweise und 1 Warnung, und das Programm konnte demnach nicht ausgeführt werden. Hierbei noch die einzelnen Dateien mit den Quelltexten:

main.m
Code:
#import <Foundation/Foundation.h>
#import "Zinsrechner.h"

int main(int argc, const char * argv[])
{


    @autoreleasepool {
        
        Zinsrechner *meinZinsrechner;
        meinZinsrechner = [Zinsrechner alloc];
        [meinZinsrechner init];
        
        double kontostand = 100.00;
        double zinssatz = 5.0;
        double laufzeit = 5;
        
        double neuerKontostand = [meinZinsrechner berechneZinsen:kontostand :zinssatz :laufzeit];
        NSLog(@"Kontostand %.2f",neuerKontostand);
        
        [meinZinsrechner release];
    }
    return 0;
}
Warnung bei double neuerKontostand = [meinZinsrechner berechneZinsen:kontostand :zinssatz :laufzeit]; (Sending 'double' to parameter of incompatible type 'id')


Zinsrechner.m
Code:
#import "Zinsrechner.h"


@implementation Zinsrechner


- (double)berechneZinsen:(double)kontostand:(double)zinssatz:(int)laufzeit
{
    double neuerKontostand = kontostand * pow(zinssatz/100 + 1,laufzeit);
    return neuerKontostand;
}


@end
3 Hinweise:
'kontostand' used as the name of the previous parameter rather than as part of the selector
'zinssatz' used as the name of the previous parameter rather than as part of the selector
Conflicting parameters types in implementation of berechneZinsen:::':' 'id' vs 'double'


Zinsrechner.h
Code:
#import <Foundation/Foundation.h>


@interface Zinsrechner : NSObject


- (double)berechneZinsen:(double)kontostand:zinssatz:(int)laufzeit;


@end
2 Hinweise
'kontostand' used as the name of the previous parameter rather than as part of the selector
'zinssatz' used as the name of the previous parameter rather than as part of the selector

Und das bringt mich grade zum verzweifeln. Denn entweder ich verstehe diese Fehlermeldungen falsch, oder meine logik ist grade am Ende.


Danke für eure Hilfe im voraus.


MfG mmoerth
 
Code:
Du hast was vergessen, vergleiche mal diese Methode:
- (void) drawRoundedRect:(NSRect)aRect inView:(NSView *)aView withColor:(NSColor *)color fill:(BOOL)fill
Du hast draus gemacht:
- (void) drawRoundedRect:(NSRect)aRect :(NSView *)aView :(NSColor *)color :(BOOL)fill
Wie sieht also Dein Selector aus:
- (void) drawRoundedRect:
Wie richtig:
- (void) drawRoundedRect:inView:withColor:fill:
Deiner also so richtig:
- (double)berechneZinsenVon:(double)kontostand mitZinssatz:(double)zinssatz fuerLaufzeit:(int)laufzeit;
Dein Selector also:
- (double)berechneZinsenVon:mitZinssatz:fuerLaufzeit:

No.
 
Meinst du etwa, und das wird jetzt sicher falsch sein (weil blutiger Anfänger), dass das ganze nun so aussieht?:

main.m
Code:
#import <Foundation/Foundation.h>
#import "Zinsrechner.h"

int main(int argc, const char * argv[])
{


    @autoreleasepool {
        
        Zinsrechner *meinZinsrechner;
        meinZinsrechner = [Zinsrechner alloc];
        [meinZinsrechner init];
        
        double kontostand = 100.00;
        double zinssatz = 5.0;
        double laufzeit = 5;
        
        double neuerKontostand = [meinZinsrechner berechneZinsen:kontostand :zinssatz :laufzeit];
        NSLog(@"Kontostand %.2f",neuerKontostand);
        
        [meinZinsrechner release];
    }
    return 0;
}


Zinsrechner.m
Code:
#import "Zinsrechner.h"


@implementation Zinsrechner


- (double)berechneZinsen Von:mitZinssatz:fuerLaufzeit
{
    double neuerKontostand = kontostand * pow(zinssatz/100 + 1,laufzeit);
    return neuerKontostand;
}


@end

Zinsrechner.h
Code:
#import <Foundation/Foundation.h>


@interface Zinsrechner : NSObject


- (double)berechneZinsen Von:(double)kontostand mitZinssatz(double)zinssatz fuerLaufzeit:(int)laufzeit;


@end
 
Einmal ist [Zinsrecher alloc] falsch, es muss [[Zinsrechner alloc] init] sein.

Zweitens hast du in der Implementierung deine Datentypen in der Methode vergessen. Die muss aussehen wie im Header - wobei der auch falsch geschrieben ist. Vergleich die Signatur mal mit bestehenden Methoden, dann siehst du was falsch ist.
 
Einmal ist [Zinsrecher alloc] falsch, es muss [[Zinsrechner alloc] init] sein.
Nein, er initialisiert die Instanz danach ja separat. Nicht unbedingt üblich, aber auch nicht falsch.
 
Das kommt davon, wenn man sich Code aus dem Netz zusammenkopiert und eigentlich gar nicht weiss, was man da tut!
 
leider kommt er nicht aus dem netz. und ein kommentar, welches man sich sicherlich hätte sparen können.
 
Ich vermute einmal, dass es sich der Fehler auf die folgenden zwei Zeilen beschränkt:

Code:
- (double)berechneZinsen:(double)kontostand:(double)zinssatz:(int)laufzeit
{
     double neuerKontostand = kontostand * pow(zinssatz/100 + 1,laufzeit);     return neuerKontostand;
}

und

Code:
- (double)berechneZinsen:(double)kontostand:zinssatz:(int)laufzeit;

Denn ich schätze einmal, dass ich die Klasse in der main.m-Datei korrekt aufrufe. Also so:

Code:
double neuerKontostand = [meinZinsrechner berechneZinsen:kontostand :zinssatz :laufzeit];

Da ich ich mich das Thema der Klassen grade total verwirrt, habe ich mir einmal die Dokumentation von Apple angesehen, die hier zu finden ist:
https://developer.apple.com/library...jectiveC/DefiningClasses/DefiningClasses.html
Dort haben die folgendes Beispiel angegeben:

Code:
[COLOR=#666666][FONT=Courier]- (void)someMethodWithFirstValue:(SomeType)info1 secondValue:(AnotherType)info2;[/FONT][/COLOR]

Somit vermute ich mal, wenn ich das richtig verstanden habe, dass mein Code dann in etwa so aussehen muss:

Code:
- (double)berechneZinsen:Von:(double)kontostand mitZinssatz:(double)zinssatz fuerLaufzeit:(int)laufzeit
{
     double neuerKontostand = kontostand * pow(zinssatz/100 + 1,laufzeit);     return neuerKontostand;
}

und

Code:
- (double)berechneZinsen:Von:(double)kontostand mitZinssatz:(double)zinssatz fuerLaufzeit:(int)laufzeit;

Ich verstehe von euren Fachausdrücken (derzeit) noch etwas wenig. Also bitte den Fehler auf Deutsch formulieren. Wäre auch sehr nett, wenn ihr mir das Themengebiet der Klassen etwas näher bringt, anstatt mich nur zu kritisieren. Denn ich glaube nicht, dass ihr das Programmieren von Null auf Hundert in wenigen Tagen gelernt habt, sondern auch mal klein angefangen habt. Danke!


MfG mmoerth
 
ich weiß ja nicht, warum sich immer da ein Von bei dir einschleicht (mit leerzeichen oder mit doppelpunkt).
soll das eine variable sein oder zu dem methoden namen gehören?
 
eig eine variable.
 
Genau dieses :Von: hat da nichts zu suchen.

Header:

Code:
- (double)berechneZinsenVon:(double)kontostand mitZinssatz:(double)zinssatz fuerLaufzeit:(int)laufzeit;

Implementation:

Code:
- (double)berechneZinsenVon:(double)kontostand mitZinssatz:(double)zinssatz fuerLaufzeit:(int)laufzeit
{
     double neuerKontostand = kontostand * pow(zinssatz/100 + 1,laufzeit);     
     return neuerKontostand;
}
 
achsoooo habt ihr das gemeint. und dann sieht der aufruf der klasse ja schon ganz anders aus.

Code:
double neuerKontostand = [meinZinsrechner berechneZinsenVon:kontostand mitZinssatz:zinssatz fuerLaufzeit:laufzeit];
 
Genau. Und klappt?
 
ja hat es. und es macht das ganze für mich etwas klarer.

Danke für eure Hilfe Leute!


MfG mmoerth
 
Zurück
Oben Unten