Objective-C创建动态二维数组

时间:2010-12-21 15:12:38

标签: objective-c arrays

我正在尝试创建一个可以管理二维数组的类。 我在C中使用相同的算法没有对象(显然),它工作正常。 问题是,当我尝试修改我的对象的变量时,它不会在主程序中修改它,这是荒谬的!

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");
    }
}

1 个答案:

答案 0 :(得分:0)

我怀疑它与你的exisistsatxy方法有关 - 它改变了m地址列表中的链接,而不是制作指针的副本并使用它来遍历 - 这是你在setvalueatxy方法中做了什么。