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