我正在尝试创建自己的类来管理矩阵,但我是Objective-C的新手。
矩阵课
我正在创建此类来管理矩阵,将其保存在NSMutableArray
NSMutableArray
的{。}}中。
@interface matrix : NSObject
{
NSMutableArray *grid;
// Dimensiones de la matriz.
NSUInteger num_columns;
NSUInteger num_rows;
}
我创建了一个添加行,列和其他操作的方法。 addRow方法是这样的:
-(BOOL) addRow:(NSArray *) fila
{
NSLog(@"Dentro de Añadir una Fila de una matriz.");
[grid addObject:fila];
[self checkDimensions];
return YES;
}
我使用的是extern
类的方法。该方法非常简单,因为我只想创建一个矩阵并打印它。
-(BOOL) matrixTEST
{
NSLog(@"Dentro de Testeo de una matriz.");
// create a new instance
matrix *m = [[matrix alloc] init];
NSMutableArray *vector = [[NSMutableArray alloc] init];
[vector addObject:@"1"];
[vector addObject:@"2"];
[vector addObject:@"3"];
[m addRow:vector];
[vector removeAllObjects];
[vector addObject:@"4"];
[vector addObject:@"5"];
[vector addObject:@"6"];
[m addRow:vector];
[vector removeAllObjects];
[vector addObject:@"7"];
[vector addObject:@"8"];
[vector addObject:@"3"];
[m addRow:vector];
[vector removeAllObjects];;
// print matriz
[m imprimirMatriz];
[vector release];
return YES;
}
问题是我不知道我做错了什么,因为方法printMatrix显示错误访问错误或零错误。此外,定义为包含行数和列数的变量显示奇怪的值:- Rows : 5.75753e+228 - Columns : 8.55507e-53
打印矩阵的方法。
-(void) imprimirMatriz
{
NSMutableArray *temp = [[NSMutableArray alloc] init];
// NSNumber *numero = [[NSNumber alloc] init];
NSLog(@"Dentro de imprimir matriz.");
[self printDimensions];
for(NSUInteger c = 0; c < num_rows; c++)
{
temp = [grid objectAtIndex:c];
for(NSUInteger d = 0; d < num_columns; d++)
{
NSLog(@" %3g ", [temp objectAtIndex:d]);
}
NSLog(@"\n");
}
[temp release];
}
答案 0 :(得分:3)
在函数-(BOOL) matrixTest
中插入字符串。这很好。但是,当您在网格数组中打印值时,请指定“%3g”。据我记得,“%g”打印浮点数或双精度数,当值为字符串时,它们将无效。如果用%@替换%g,它应该可以工作。
关于包含数组宽度和高度的变量:您没有提供如何设置这些变量的实现,因此无法知道问题所在。
作为旁注,您还有其他一些错误。在-(void) imprimirMatriz
中,您有NSMutableArray *temp = [[NSMutableArray alloc] init];
行,但您稍后会将temp
指定给其他人。这会导致内存泄漏。将变量赋值给NSArray时,不需要Alloc / init。
作为评论的答案:您只能将对象插入NSMutableArray(或NSArray)。当您编写[myArray addObject:1]
时,您尝试插入一个原始整数。基元(int,bool,char,float,double等)不是对象,因此不能插入NSArray或NSMutableArray。相反,您可以通过将其包装在NSNumber的实例中来插入int。以下行将起作用:[myArray addObject:[NSNumber numberWithInt:1]];
。您还可以在NSNumber对象中包含浮点数和其他类型。有关完整参考,请参阅NSNumber Class Reference。
答案 1 :(得分:2)
您应该为测试函数中的每一行使用一个新数组 - 否则您将三次添加指向同一对象的指针,删除所有对象并重新填充。我希望在上面的代码结束时,你的矩阵中有三个相同的空数组副本。
所以,而不是
[m addRow:vector];
[vector removeAllObjects]; // This removes the objects from the array in your matrix as well!
待办事项
[m addRow:vector];
[vector release];
vector = [NSMutableArray alloc] init];
最后一个removeAllObjects
会清空数组(因此会清空矩阵中的每一行),但不会更新内部维度变量,因此以后可能会导致错误。
此外,正如Bendik所说,你的日志语句的字符串格式错误。它应该是%@