내 함수 내에서 함수를 호출 (float *verybigarray, 긴 크기로 박리) OBJC 메소드에서 exc_bad_access로 실패합니다.

StackOverflow https://stackoverflow.com/questions/1071521

문제

좋아, 나는 마침내 문제를 발견했다. OBJC 방법이 아닌 C 함수 (CARBONTUNER2) 내부에있었습니다. 파일 크기와 같은 크기의 배열을 함수 내부에서 만들었으므로 파일 크기가 크면 정말 큰 배열이 생성되었으며 다른 기능을 불렀을 때 로컬 변수가 스택에 올려 놓았다는 것입니다. exc_bad_access를 만들었습니다. 내가 한 일은 변수를 사용하여 배열의 크기를 선언하는 대신 숫자를 직접 넣습니다. 그런 다음 코드가 컴파일되지 않았습니다. 그것은 알고있었습니다. 오류는 다음과 같습니다. 어레이 크기가 너무 큽니다. 연속으로 20 시간 이상 일하는 것은 XD가 좋지 않지만 단계별 디버그가 이외의 도구를 살펴보기 위해 확실히 도구를 살펴볼 것입니다. 당신의 도움을 주셔서 감사합니다. 코드는 다음과 같습니다. gfilebytecount를 2로 나누면 더 이상 오류가 발생하지 않습니다.

//  ConverterController.h

# import <Cocoa/Cocoa.h>
# import "Converter.h"

@interface ConverterController : NSObject {

    UInt64 gFileByteCount ;
}

-(IBAction)ProcessFile:(id)sender;
void CarbonTuner2(long numSampsToProcess, long fftFrameSize, long osamp);

@end

//  ConverterController.m
# include "ConverterController.h"

@implementation ConverterController

-(IBAction)ProcessFile:(id)sender{

    UInt32 packets = gTotalPacketCount;//alloc a buffer of memory to hold the data read from disk.

    gFileByteCount=250000;
    long LENGTH=(long)gFileByteCount;
    CarbonTuner2(LENGTH,(long)8192/2, (long)4*2);
}
@end

void CarbonTuner2(long numSampsToProcess, long fftFrameSize, long osamp)
{
    long numFrames = numSampsToProcess / fftFrameSize * osamp;
    float g2DFFTworksp[numFrames+2][2 * fftFrameSize];
    double hello=sin(2.345);
}
도움이 되었습니까?

해결책

충돌은 C와 OBJC 사이의 비 호환성과 관련이 없습니다. 그리고 이전 포스터가 말했듯이, 당신은 Math.h를 포함 할 필요가 없습니다.

GDB에서 코드를 실행하고 백 트레이스를 사용하여 충돌이 발생하는 위치를 확인하십시오.

수학 기능에 나쁜 주장을 보내지 않는다고 확신하십니까?

예를 들어, 이것은 bad_access를 유발합니다 : double t = cos ( *(double *) null);

다른 팁

목표 C는 C에 직접 구축되며 C는 낙담 할 수 있으며 작동 할 수 있습니다.

목표 C 모듈 내에서 수학 및 표준 라이브러리의 일부를 사용하는 예는 다음을 참조하십시오.

http://en.wikibooks.org/wiki/objective-c_programming/syntax

주변에 다른 예가 있습니다.

변수를 전달하는 데는 약간의주의가 필요합니다. C 및 표준 라이브러리 호출에 C 변수를 사용하십시오. C 데이터 유형과 객관적인 C 데이터 유형을 부적절하게 혼합하지 마십시오. 당신은 일반적으로 여기에서 변환을 원할 것입니다.

그렇지 않은 경우 관련된 코드를 게시하고받는 오류를 고려하십시오.

그리고 Hellman 씨의 응답으로 인해 모든면에서 헤더 파일이 포함되어 있지 않을 때 오류가 발생했습니다. 헤더를 포함하는 것을 선호합니다. 그러나 나는 컴파일러 진단에 몇 가지 노치를 다이얼하는 경향이 있습니다.

가치가있는 것에 대해, 나는 Cocoa 앱에 Math.h를 포함시키지 않지만 수학 기능 (C)을 사용하는 데 아무런 문제가 없습니다.

예를 들어, atan ()을 사용하고 컴파일러 오류가 발생하거나 시간 오류를 실행하지 않습니다.

Math.h를 전혀 포함시키지 않고 시도해 볼 수 있습니까?

먼저, 코드를 답으로 게시하지 않고 질문에 코드를 추가해야하므로 사람들은 당신이 요구하는 것을 볼 수 있습니다. 둘째, 여기에 메모리 관리에 모든 종류의 이상한 문제가 있습니다. GFILEBYTECOUNT는 많은 버퍼를 크기로 크기로 만드는 데 사용되지만 0으로 설정되어 있으며 어디에서나 다시 설정되는 것처럼 보이지 않습니다.

err = audiofilereadpackets (fileid, false, & bytesreturned, null, 0, & packets, (byte *) rawaudio);

따라서이 시점에서 제로 크기의 버퍼를 오디오 필레 레드 패킷으로 전달하여 힙을 오버런하여 다른 변수를 알고있는 사람의 값을 손상시킵니다.

frawaudio = malloc (gfilebytecount/(bits/8)*sizeof (frawaudio));

다음은 또 다른 작은 오류입니다 - 당신은 여기에서 sizeof (*frawaudio)를 원합니다. 여기에서 플로트 포인터가 아닌 플로트 배열을 할당하려고합니다. 다행히도 해당 엔티티는 같은 크기이므로 중요하지 않습니다.

아마도 당신이 알고있는 몇 가지 예제 코드로 시작하여 (speakHere?)를 수정해야합니다. Yoou가 게시 한 코드에 다른 비슷한 문제가 있다고 생각하지만 지금 당장 찾을 시간이 없습니다. 적어도 Rawaudio 버퍼를 적절하게 크기로 가져 와서 Audiofilereadpackets에서 반환 된 값을 적절하게 사용하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top