Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective-C中的动态二维C阵列崩溃_Objective C_Arrays_Dynamic_Crash - Fatal编程技术网

Objective-C中的动态二维C阵列崩溃

Objective-C中的动态二维C阵列崩溃,objective-c,arrays,dynamic,crash,Objective C,Arrays,Dynamic,Crash,我正在使用二维数组形式的矩阵制作一个曲线拟合程序,但编译器会随机抛出错误访问错误,例如线程1:EXC_BAD_ACCESS(代码=1,地址=0x13f800000)。程序有时工作,有时崩溃。任何想法都将不胜感激。谢谢 - (void)main { NSLog(@"Enter size"); scanf("%i", &matrixSize); float* temp; matrix = (float**)calloc(matrixSize, sizeo

我正在使用二维数组形式的矩阵制作一个曲线拟合程序,但编译器会随机抛出错误访问错误,例如线程1:EXC_BAD_ACCESS(代码=1,地址=0x13f800000)。程序有时工作,有时崩溃。任何想法都将不胜感激。谢谢

- (void)main {
    NSLog(@"Enter size");

    scanf("%i", &matrixSize);

    float* temp;

    matrix = (float**)calloc(matrixSize, sizeof(float*));
    temp = (float*)calloc(matrixSize+1, sizeof(float));

    for (int i = 0; i < matrixSize+1; i++) {
        matrix[i] = temp + (i*(matrixSize+1));
    }

    [self enterPoints];
    [self elimination];
    [self setNeedsDisplay:YES];
    free(matrix);
    free(temp);
}

//points entered here

- (void)enterPoints {
    CGPoint *points = (CGPoint *)malloc(matrixSize * sizeof(CGPoint));

    for (int i = 0; i < matrixSize; i++) {
        scanf("%lf", &points[i].x);
        scanf("%lf", &points[i].y);
    }

    for (int j = 0; j < matrixSize; j++) {
        for (int i = 0; i < matrixSize+1; i++) {
            if (i == (matrixSize)) {
                matrix[i][j] = points[j].y;
            }
            else {
                matrix[i][j] = pow(points[j].x, (matrixSize-1)-i);
            }
        }
    }
    free(points);
}

//matrix reduction occurs here

- (void)elimination {

    for (int j = 0; j < matrixSize; j++) {
        double divideValue = matrix[j][j];
        for (int i = 0; i < matrixSize+1; i++) {
            matrix[i][j] /= divideValue;
        }
        for (int j1 = 0; j1 < matrixSize; j1++) {
            if (j1 == j) {
                if (j1 == matrixSize-1) {
                    break;
                }
                else {
                    j1++;
                }
            }
            double subValue = matrix[j][j1];
            for (int i = 0; i < matrixSize+1; i++) {
                matrix[i][j1] -= matrix[i][j]*subValue;
            }
        }
    }
}

//drawing the polynomial 

- (void)drawRect:(NSRect)dirtyRect {
    NSGraphicsContext * GraphicsContext = [NSGraphicsContext currentContext];
    CGContextRef context = (CGContextRef) [GraphicsContext graphicsPort];

    CGContextSetRGBStrokeColor(context, 0.0, 0.0, 0.0, 1.0);

    CGContextSetLineWidth(context, 3.0);

    CGContextMoveToPoint(context, 0, matrix[matrixSize][0]*100 + 100);

    [GraphicsContext saveGraphicsState];

    CGMutablePathRef path;

    path = CGPathCreateMutable();

    for (float i = -matrixSize; i < matrixSize; i+=.01) {
        float y = 0;

        for (int j = 0; j < matrixSize; j++) {
             y += matrix[matrixSize][j]*pow(i, j);
        }

        CGContextAddLineToPoint(context, i*100 + 100, y*100 + 100);   
    }

    CGContextStrokePath(context);

    [GraphicsContext restoreGraphicsState];
}
-(void)主{
NSLog(@“输入大小”);
scanf(“%i”&矩阵大小);
浮动*温度;
矩阵=(float**)calloc(矩阵大小,大小(float*);
temp=(float*)calloc(matrixSize+1,sizeof(float));
对于(int i=0;i
EXC\u BAD\u ACCESS表示在调用某个对象上的方法之前,该对象被过度释放(不要与垃圾收集混淆)。一旦到达代码中调用所收集对象上的方法的点,指针将引用无效的内存位置

要查找僵尸对象,请查看以下内容:


我用过这个,效果很好。

您没有为矩阵分配足够的内存。此行设置了整个数据区域,但您只分配了
matrixSize+1
元素,而不是
matrixSize*(matrixSize+1)

因此,维护
matrixSize+1
列和
matrixSize
行:

matrix = (float**)calloc(matrixSize, sizeof(float*));
temp = (float*)calloc(matrixSize * (matrixSize+1), sizeof(float));

for (int i = 0; i < matrixSize; i++) {
    matrix[i] = temp + (i*(matrixSize+1));
}
matrix=(float**)calloc(matrixSize,sizeof(float*);
temp=(float*)calloc(matrixSize*(matrixSize+1),sizeof(float));
for(int i=0;i
以后使用时,请小心。你说的不对:

for (int j = 0; j < matrixSize; j++) {
    for (int i = 0; i < matrixSize+1; i++) {
        if (i == (matrixSize)) {
            matrix[i][j] = points[j].y;
        }
        else {
            matrix[i][j] = pow(points[j].x, (matrixSize-1)-i);
        }
    }
}
for(int j=0;j
请注意,
i
转到
matrixSize+1
,但您使用它作为行索引(只有
matrixSize
行)。我想你是想用
matrix[j][I]
而不是
matrix[I][j]
。当你构造初始矩阵的时候,你也会这样做,但我实际上已经改变了它,使之与你的分配一致


因此,我看到程序中存在两个缓冲区溢出点

除非在OSX上启用了垃圾收集器,否则没有垃圾收集器。EXC_BAD_访问可能发生的原因有很多,并且,考虑到OP正在破坏malloc()d内存,它很可能不是一个过度释放的对象。True。我打字打错了。iOS中没有垃圾收集。我很长一段时间没有对malloc()d内存做太多的工作,所以我在EXC_BAD_访问错误方面的大部分经验都是针对过度释放的对象。有一个GUI程序也在解析标准输入,这是一件很奇怪的事。。。奇怪的是,它通常一点也不像你期望的那样工作。谢谢,我对引用矩阵中的元素的看法是错误的。
for (int j = 0; j < matrixSize; j++) {
    for (int i = 0; i < matrixSize+1; i++) {
        if (i == (matrixSize)) {
            matrix[i][j] = points[j].y;
        }
        else {
            matrix[i][j] = pow(points[j].x, (matrixSize-1)-i);
        }
    }
}