2 Stimmen

Objective-C erstellt ein dynamisches zweidimensionales Array

Ich versuche, eine Klasse zu erstellen, die zweidimensionale Arrays verwalten kann. Ich habe den gleichen Algorithmus in C ohne Objekte verwendet (natürlich) und es funktioniert gut. Das Problem ist, dass, wenn ich versuche, eine Variable meines Objekts zu ändern, sie nicht im Hauptprogramm geändert wird, und das ist absurd!

NSMatrice.h

#import <Cocoa/Cocoa.h>
#import <Foundation/Foundation.h>

struct ogmat
{
    float value;
    int row, col;
    struct ogmat *next;
};

typedef struct ogmat Tmat;
typedef Tmat* TpTmat;

@interface NSMatrice : NSObject{
    TpTmat m;
}
- (void)    crea;       //inizializza la matrice
- (int)     destroy;    //la distrugge
- (BOOL)    exisistsatxy :(int) x :(int) y;
- (void)    setvalueatxy :(float) value :(int) x :(int) y;
- (float)   getvalueatxy :(int) x :(int) y;

@end

NSMatrice.c

#import "NSMatrice.h"
@implementation NSMatrice
- (void)    crea{       //inizializza la matrice
    m=NULL;
}
- (int)     destroy{    //la distrugge
    while (m!=NULL){
        TpTmat pa;
        pa=m->next;
        free(m);
        m=NULL;
        m=pa;
    }
    return 1;
}
- (BOOL)    exisistsatxy :(int) x :(int) y{
    while (m!=NULL&&(!(m->col==y&&m->row==x))){
        m=m->next;
    }
    if (m==NULL) return FALSE;
    else return TRUE;
}
- (void)    setvalueatxy :(float) value :(int) x :(int) y{
    Tmat *pa;
    if (!([self exisistsatxy:x:y])){//nuova testa modifico pa
        pa=malloc(sizeof(Tmat));
        pa->col=y;
        pa->row=x;
        pa->value=value;
        pa->next=m;
        m=pa;
    }else{
        pa=m;
        while (pa!=NULL&&(!(pa->col==y&&pa->row==x))){//stessa testa
            pa=pa->next;
        }
        if (pa!=NULL){
            pa->value=value;
        }
    }
}
- (float)   getvalueatxy :(int) x :(int) y{
    Tmat *pa;
    pa=m;
    while (pa!=NULL&&(!(pa->col==y&&pa->row==x))){
        pa=pa->next;
    }
    if (pa!=NULL){
        return pa->value;
    }
    else return 0;
}
@end

obj_mat.m

#import <Foundation/Foundation.h>
#import "NSMatrice.h"
#import <time.h>

int main () {
    NSMatrice *m;
    int i,j;
    m=[NSMatrice alloc];
    [m crea];
    srand(time(NULL));
    for (i=0;i<5;i++)
        for (j=0;j<5;j++)
            [m setvalueatxy:rand()%20 :i :j];
    for (i=0;i<5;i++){
        for (j=0;j<5;j++)
            printf("%.2f\t",[m getvalueatxy:i :j]);
        printf("\n");
    }
}

0voto

martin clayton Punkte 74309

Ich vermute, es hat etwas mit Ihrer exisistsatxy Methode - die den Link in der Liste ändert, der m Adressen, anstatt eine Kopie des Zeigers zu erstellen und diese zum Durchlaufen zu verwenden - was Sie in setvalueatxy Methode.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X