Funktion? Zeiger?

  • Funktion? Zeiger?

    Hallo Forum,

    ich bin anfänger in Objetiv-C und hab eine zu Funktionen oder Zeiger:


    ich hab IBAction in der je nach auswahl eines von Zwei Array's gefüllt wird.

    nun möchte ich eine Function aufrufen der ich das eine oder ander Array übergeben möchte und dort dann eine berechnung durchgeführt wird.

    wie muss ich die Funktion implementieren?

    ich kenne das aus anderen Sprachen so:

    meineAction {

    Aufruf der Funktion(array);

    }

    function rechnen(meinArray){

    rechnen;

    }

    wie sieht das in Objective-C aus?

    besten dank
    Markus

    ps. ich hab auch schon in Verschieden Büchern und im Web geschaaaut, hab aber leider nicht so wirklich gefunden wie das geht.
  • RE: Funktion? Zeiger?

    Original von frog
    wie muss ich die Funktion implementieren?

    ich kenne das aus anderen Sprachen so:

    meineAction {

    Aufruf der Funktion(array);

    }

    function rechnen(meinArray){

    rechnen;

    }

    wie sieht das in Objective-C aus?

    1. genau so - C ist eine Untermenge von Objective-C, d.h. Du kannst eine Funktion aufrufen (z.B.

    Quellcode

    1. void rechnen(NSMutableArray *array) {...}

    2. als Methode implementieren (dann kann man an die Instanzvariablen ran)

    Quellcode

    1. @interface meineKlasse
    2. ...
    3. -(void) rechnen:(NSArray *) array;
    4. ...
    5. @end
    6. @implementation meineKlasse
    7. ---
    8. -(void) rechnen:(NSArray *) array
    9. {
    10. rechnen...
    11. }
    12. ...
    13. - (IBAction) meineAction:(id) Sender
    14. {
    15. ...
    16. [self rechnen:dasArray];
    17. }
    18. @end
    Alles anzeigen


    -- hns
  • Danke für eure hilfe, ich werde die info von hns nachher mal ausprobieren. ich bin zwar fast sicher, dass ich dies so schon hatte aber ich schau mal.

    OK wegen Methoden und Funktionen... habs verstanden.

    gruss maruks
    ps. muss schnell für 3 std weg und dan wird getestet.
  • Ich mutmaße, dass dein Hauptproblem der Call by Reference ist. Also ganz kurz:

    Du hast Wert, sagen wir eine ganze Zahl. Diesen speicherst du naturgemäß in einer Variablen, die dann den Typen int hat:

    int zahl;

    Wenn du den übergeben möchtest, dannn übergibst du ihn einfach:

    methodeOderFunktionSpieltHierKeineRolle( zahl );

    Das Ergebnis ist, dass der Compiler eine Kopie deiner Zahl macht. Wenn du etwa in der Funktion (oder Methode) den Wert veränderst, dann spielt das für den Inhalt von Zahl keine Rolle. Das nennt man Call by Value.

    Objekte werden aber grundsätzlich als Referenz übergeben. Du übergibst einen Zeiger auf das Objekt, also seine Ausweisnummer. *Dieser* wird kopiert. Wenn du *diesen* änderst, spielt das für den Aufrufer keine Rolle. Das Objekt, dass sich aber hinter dieser ID verbirgt, ist nie kopiert worden. Es ist also dasselbe wie beim Aufrufer. Aus diesem Grund musst du auch immer explizit Objekte erzeugen. (Die Variable zahl ist ja einfach da.) Ein Bespiel:

    Quellcode

    1. ...
    2. NSArray* einFeld; // Dies ist kein Array, sondern die ID eines Arrays.
    3. einFeld = [NSArray arrayWithObjects:@"Tom", @"9811", nil]; // Erst jetzzt haben wir ein Feld(-Objekt)
    4. [self machWasMitFeld:einFeld]; // Es wird die ID, nicht das Objekt, übergeben.
    5. ...
    6. - (void)machWasMitFeld:(NSArray*)feld {
    7. NSLog( @"Das Feld %@", [feld description] );
    8. feld = weranderes; // Das ändert nichts an einFeld im "Hauptprogramm"
    Alles anzeigen

    Übergäbest du ein Mutable-Array, könntest du auch das Feld verändern. Das würde auch das Hauptprogramm bemerken. Wenn man das nicht möchte, muss man sich eine Kopie machen:

    Quellcode

    1. - (void)machWasMitFeld:(NSArray*)feld {
    2. // Ich habe feld als aktuellen Parameter
    3. feld = [feld mutableCopy];
    4. // Feld hat jetzt die ID einer *anderen* Objektes
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Hi bin schon wieder zurück...

    danke für die hilfen... hab es nun geschafft!

    -IBAction{
    double DurchSchnittWuerfe;
    DurchSchnittWuerfe = [self BeRechnen:arrWuerfe];
    }

    -(double) BeRechnen:(NSArray *) arrSpieler
    {
    ...
    return ergebniss;
    }

    Tom: hab ich dich richtig verstanden, so könnte ich auch felder verändern, da ich das arry übergebe und nicht nur die id?

    -IBAction{
    double DurchSchnittWuerfe;
    DurchSchnittWuerfe = [self BeRechnen:arrWuerfe];
    }

    -(double) BeRechnen:(NSMutableArray *) arrSpieler
    {
    ...
    return ergebniss;
    }


    gruss markus
  • Kleiner Tip zur Benennung:
    * Klassennamen mit großem Buchstaben beginnen
    * Variablen mit kleinem (DurchSchnittWuerfe -> durchSchnittWuerfe)
    * Methoden mit kleinem (BeRechnen -> beRechnen)

    Ist zwar nicht zwingend vorgeschrieben aber einfach üblich (auch Apple macht Ausnahmen, z.B. die Methode 'URL').

    -- hns
  • Original von hns
    Kleiner Tip zur Benennung:
    * Klassennamen mit großem Buchstaben beginnen
    * Variablen mit kleinem (DurchSchnittWuerfe -> durchSchnittWuerfe)
    * Methoden mit kleinem (BeRechnen -> beRechnen)

    Ist zwar nicht zwingend vorgeschrieben aber einfach üblich (auch Apple macht Ausnahmen, z.B. die Methode 'URL').

    -- hns


    beRechnen -> berechnen

    ;)
  • Ja, das kannst du. Dazu muss natürlich das Feld selbst veränderlich sein:

    Quellcode

    1. - (void)insertItemIntoArray:(NSMutableArray*)array {
    2. [array addObject:@"frog war hier!"];
    3. }
    4. ...
    5. NSMutableArray* stringArrays = [NSMutableArray arrayWithObject:@"Wer war hier?"];
    6. NSLog( @"%@", [stringArray description] );
    7. [self insetItemIntoArray:stringArray];
    8. NSLog( @"%@", [stringArray description] );
    9. ...
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Die richtiige Notation ist wichtig für Cocoa. Mache da nichts eigenes. Ganz übel ist übrigens ungarische Notation (Typ im Variablennamen), da es Konzepten von Objective-C zuwiderläuft. Du outest dich damit als Newby. ;)

    Nein, ernsthaft, man macht das nicht, es sei denn man hat einfach gar keinen Bezug zu nichts und daher keinen anständigen Namen.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Original von frog
    ich bin Newby, was Objectorientiert angeht....

    die Notation ist nicht nur int oder arr sondern
    intMeinezahl
    arrMeinArray

    ich finde so sieht mann immer was für ein typ das ist...

    in längerem code einfach übersichtlicher.

    =)


    intMeinezahl2
    intMeinezahl879
    intMeinezahl43
    intMeinezahl5
    arrMeinArray23
    arrMeinArray2654
    arrMeinArray34

    sehr übersichtlich *lol*
  • Original von frog
    Meinezahl stet für einen Sprechenden Namen....


    dann weis ich aber immer noch net was es jetzt genau ist. also Uint16, SInt16, Uint32, SInt32, UInt64, SInt64, short, unsigned, int...

    normalerweise sagt einem ja der sprechende namen um was es sich für einen typ handelt.

    namesCount -> mit was zählt man? Eben, mit ganzzahl also irgend ein integer
    names -> mehrzahl also ein array
    namesToIds -> also ein dictionary

    und wenn man das unbedingt macht, dann hinten dran. dann gehsts schneller beim vervollständigen von variablen (autovervollständigung).
    Bei C++ nutze ich das manchmal:

    namesList
    namesSList
    namesVector
    namesSet

    etc... aber auch nur weil es dort im unterschied zu Obj-C (3) jede menge verschiedene container gibt!