Mehrdimensionales Array von externer Klasse aus ansprechen

  • Mehrdimensionales Array von externer Klasse aus ansprechen

    Hallo

    ich habe ein Problem wo ich nicht weiterkomme.

    Habe in meinem Code eine neue Klasse erstellt die berechnet und das Ergebnis in ein Mehrdimensionales Array speichert ( z.B. int Felder[5][25])
    Im UIViewController.m will ich nun auf die Inhalte zugreifen (lesen & schreiben). Habe die Variable ausserhalb deklariert um sie Global zu nutzen.
    Im Simulator funktioniert das auch gut aber wenn ich über Instruments > Profile das laufen lasse um es richtig zu testen crasht der Code.

    Ich kommen hier nicht weiter. Habe schon viele Stunden bei der Suche verbracht.
    Wie deklariert man so etwas das das alles auch lauffähig ist? Oder gibt es eine andere Möglichkeit .



    // LevelBuilding.h
    #import <Foundation/Foundation.h>
    int Felder[5][25];



    // LevelBuilding.m
    #import "LevelBuilding.h"
    #import "levels.h"
    @implementation LevelBuilding
    -(void)ErstelleLevel:(int) LevelNeu
    {
    // Berechnung
    }

    // ViewController.m
    #import "ViewController.h
    "#import "LevelBuilding.h"



    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    if (Felder[1][10]==.......
    }
  • entweder du machst dir einen getter für die speicheradresse (also (int *)Felder;).
    wobei variablennamen und methodennamen mit kleinbuchstaben beginnen sollten.
    du kannst dir aber auch getter/setter für einzelne werte schreiben (ist halt langsamer wenn du viele zurgriffe hast):
    - (int)feldValueAtX:(int)x y:(int)y;
  • Ich habe Dir mal eine Beispielklasse geschrieben, die ein 2-dimensionales Array einfach durch einen Zeiger auf NSUInteger abbildet.
    Man hätte noch einiges mehr machen können, aber so geht das im Printip:

    GameMap.h

    Quellcode

    1. #import <Foundation/Foundation.h>
    2. @interface GameMap : NSObject
    3. @property NSUInteger width;
    4. @property NSUInteger height;
    5. @property NSUInteger *mapData;
    6. - (id)initWithWidth:(NSUInteger)width andHeight:(NSUInteger)height;
    7. - (NSUInteger)valueAtRow:(NSUInteger)row andColumn:(NSUInteger)column;
    8. - (void)setValue:(NSUInteger)value atRow:(NSUInteger)row andColumn:(NSUInteger)column;
    9. @end
    Alles anzeigen


    GameMap.m

    Quellcode

    1. #import "GameMap.h"
    2. @implementation GameMap
    3. - (id)initWithWidth:(NSUInteger)width andHeight:(NSUInteger)height
    4. {
    5. self = [super init];
    6. if (( self )) {
    7. self.width = width;
    8. self.height = height;
    9. self.mapData = malloc(sizeof(NSUInteger) * width * height);
    10. if (( !self.mapData ))
    11. self = nil;
    12. }
    13. return self;
    14. }
    15. - (NSUInteger)valueAtRow:(NSUInteger)row andColumn:(NSUInteger)column
    16. {
    17. NSUInteger idx;
    18. NSUInteger val;
    19. val = 0;
    20. if ((row < self.height) && (column < self.width)) {
    21. idx = row * self.width + column;
    22. val = self.mapData[idx];
    23. }
    24. return val;
    25. }
    26. - (void)setValue:(NSUInteger)value atRow:(NSUInteger)row andColumn:(NSUInteger)column
    27. {
    28. NSUInteger idx;
    29. if ((row < self.height) && (column < self.width)) {
    30. idx = row * self.width + column;
    31. self.mapData[idx] = value;
    32. }
    33. }
    34. - (void)dealloc
    35. {
    36. free(self.mapData);
    37. NSLog(@"dealloc");
    38. }
    39. @end
    Alles anzeigen


    Benutzung:

    Quellcode

    1. NSUInteger val;
    2. GameMap *map = [[GameMap alloc] initWithWidth:64 andHeight:64];
    3. [map setValue:10 atRow:0 andColumn:0];
    4. val = [map valueAtRow:0 andColumn:0];
    5. NSLog(@"value %ld", (long)val);
  • Ja. Auch das width und height von aussen veränderbar sind hilft nach dem "init" eher nicht ;)

    Es ging mir dabei nur im das Prinzip.
    Der Quellcode wäre sonst lang geworden.

    Ich persönlich würde die Spiele Karten API sowieso nicht unbedingt in Obj-C modellieren.
    Wenn Du 3000 Mal die Selektoren aufrufst um einzelne Kartenelemente zu ändern, ist das eher kontraproduktiv.

    Es ist zwar ungern gesehen, aber ich programmiere noch sehr viel C in Apps und kapsele nur die Sachen in Obj-C die für den
    Datenaustausch mit UIKit notwendig sind.
  • pmau schrieb:

    Der Quellcode wäre sonst lang geworden.

    Um ca. 6 Zeilen ;)

    pmau schrieb:

    Es ist zwar ungern gesehen, aber ich programmiere noch sehr viel C in Apps und kapsele nur die Sachen in Obj-C die für den Datenaustausch mit UIKit notwendig sind.

    Mit Performance-Hinweisen kann man bei Anfängern sehr schlimme POITROAE-Schäden anrichten; Ansonsten ist gegen C an den richtigen Stellen nichts einzuwenden.
    „Meine Komplikation hatte eine Komplikation.“
  • pmau schrieb:

    Ja. Auch das width und height von aussen veränderbar sind hilft nach dem "init" eher nicht ;)

    Es ging mir dabei nur im das Prinzip.
    Der Quellcode wäre sonst lang geworden.

    Ich persönlich würde die Spiele Karten API sowieso nicht unbedingt in Obj-C modellieren.
    Wenn Du 3000 Mal die Selektoren aufrufst um einzelne Kartenelemente zu ändern, ist das eher kontraproduktiv.

    Es ist zwar ungern gesehen, aber ich programmiere noch sehr viel C in Apps und kapsele nur die Sachen in Obj-C die für den
    Datenaustausch mit UIKit notwendig sind.


    warum wäre der code dann länger geworden?
    wohl eher kürzer denn auf die properties kann man in so einem fall ja verzichten. warum sollte man immer die getter gehen? setter braucht (darf) man eh keine also nur sinnloser overhead.