Aufruf von Funktionen aus der Funktion (float * VeryBigArray, lange SizeofArray) aus ObjC Methode schlägt fehl mit EXC_BAD_ACCESS

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

Frage

Ok fand ich endlich das Problem. Es war in der C-Funktion (CarbonTuner2) nicht die ObjC Methode. Ich war die Schaffung innerhalb der Funktion ein Array von der gleichen Größe wie die Dateigröße, so dass, wenn die Dateigröße wurde groß es ein wirklich großes Array erstellt und meine Vermutung ist, dass, wenn ich eine andere Funktion von dort aufgerufen, die lokalen Variablen auf dem Stapel gelegt wurden die die EXC_BAD_ACCESS erstellt. Was ich tat, dann ist stattdessen eine Variable mit der Größe des Arrays zu erklären, ich die Nummer direkt setzen. Dann knapp über den Code selbst kompilieren. es wusste. Der Fehler wassomething mag: Feldgröße zu groß. Ich denke, arbeiten 20 + Stunden in einer Reihe ist nicht gut XD Aber ich bin auf jeden Fall werde Blick in andere Werkzeuge als Schritt für Schritt debuggin diese hier, um herauszufinden. Danke für Ihre Hilfe. Hier ist der Code. Wenn Sie gFileByteCount durch 2 teilen müssen Sie nicht den Fehler mehr:

//  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);
}
War es hilfreich?

Lösung

Ihr Absturz hat nichts mit Inkompatibilitäten zwischen C und ObjC zu tun. Und wie schon in früheren Bewertungen gesagt, Sie müssen math.h nicht enthalten.

Führen Sie Ihren Code unter gdb, und sehen, wo der Absturz passiert, von Backtrace verwenden.

Sind Sie sicher, dass Sie nicht schlecht Argumente für die mathematischen Funktionen zu senden?

z. dies verursacht BAD_ACCESS:     Doppel t = cos (* (double *) NULL);

Andere Tipps

Objective C ist direkt auf C gebaut, und die C Untermauerung und Arbeit tun.

Ein Beispiel für die Verwendung von math.h und Teilen der Standard-Bibliothek aus einem Ziel-C-Modul finden Sie unter:

http://en.wikibooks.org/wiki/Objective-C_Programming/syntax

Es gibt andere Beispiele herum.

ist Einige Pflege benötigt um die Variablen herumgereicht; Verwenden Sie die C-Variablen für die C und Standardbibliothek Anrufe; nicht die Typen C Daten mischen und Objective-C-Datentypen unvorsichtig. Sie werden in der Regel eine Umwandlung hier wollen.

Wenn das nicht der Fall ist, dann beachten Sie bitte den Code beteiligt veröffentlichen, und den Fehler (n) Sie empfangen.

Und bei allem Respekt wegen Herrn Hellman Antwort habe ich Fehler schlagen, wenn ich die Header-Dateien enthalten nicht haben; Ich ziehe die Header enthalten. Aber dann neige ich dazu, die Compiler-Diagnose auf ein paar Kerben zu wählen, auch.

Für das, was es wert ist, weiß ich nicht math.h in meiner Cocoa-Anwendung enthalten, aber habe kein Problem mit mathematischen Funktionen (in C).

Zum Beispiel verwende ich atan () und nicht Compiler-Fehler erhalten, oder Zeitfehler führen.

Können Sie das versuchen, ohne math.h einschließlich überhaupt?

Als erstes sollten Sie Ihren Code zu Ihrer Frage hinzufügen, anstatt es als Antwort veröffentlichen, so können die Menschen sehen, was Sie fragen zu. Zweitens haben Sie all möglichen seltsame Probleme mit Ihrer Speicherverwaltung bekommen hier -. GFileByteCount eine Reihe von Puffern zur Größe verwendet wird, aber es wird auf Null gesetzt, und scheinen nicht überall wieder eingestellt zu bekommen

  

err = AudioFileReadPackets (fileID,   false & bytesReturned, NULL, 0,   & Pakete (Byte *) rawAudio);

Also, an dieser Stelle, Sie passieren eine Größe Null-Puffer zu AudioFileReadPackets, die prompty den Haufen Überschreitungen, den Wert von korrumpieren, der weiß, was andere Variablen ...

  

fRawAudio =   malloc (gFileByteCount / (BITS / 8) * sizeof (fRawAudio));

Hier ist eine andere, kleinere Fehler - Sie sizeof (* fRawAudio) hier, da Sie versuchen, eine Reihe von Schwimmern zu vergeben, nicht ein Array von float Zeigern. Glücklicherweise sind diese Einheiten die gleiche Größe haben, so dass es spielt keine Rolle.

Sie sollten wahrscheinlich mit einigen Beispiel-Code, den Sie kennen Werke (SpeakHere?) Starten, und ändern Sie es. Ich vermute, es gibt noch andere ähnliche Probleme im Code yoou geschrieben, aber ich habe keine Zeit, sie jetzt zu finden. Zumindest bekommen die rawAudio Puffer in geeigneter Größe und mit den von AudioFileReadPackets zurückgegebenen Werte entsprechend.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top