我正在尝试创建一个可以管理二维数组的类。 我在C中使用相同的算法没有对象(显然),它工作正常。 问题是,当我尝试修改我的对象的变量时,它不会在主程序中修改它,这是荒谬的!
#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
#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
#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");
}
}
答案 0 :(得分:0)
我怀疑它与你的exisistsatxy
方法有关 - 它改变了m
地址列表中的链接,而不是制作指针的副本并使用它来遍历 - 这是你在setvalueatxy
方法中做了什么。