2010-04-16 8 views
0

J'écris un programme qui calcule l'algorithme de Jacobi. Il est écrit en Objective-C car il s'exécute sur un Mac, mais la majorité est écrite en standard C. J'utilise un tableau C bidimensionnel et un NSArray contenant 5 étiquettes NSTextField.NSString stringWithFormat: avec un tableau C?

Le code suivant donne une erreur EXC_BAD_ACCESS:

for (int i = 0; i < 5; i++) { 
    NSString *resultString = [NSString stringWithFormat:@"%g", matrix[i][i] ]; 
    [[resultLabels objectAtIndex:i] setStringValue:resultString]; // error line 
} 

Toute aide?

EDIT

est ici où je initresultLabels:

resultLabels = [[NSArray alloc] initWithObjects:result11, result22, result33, result44, result55, nil]; 
+0

Vous êtes sûr que la valeur non nil est à toutes les valeurs possibles de 'martix [i] [i]'? –

+0

Oui, tout est déclaré comme un 'int' 0 à 9. –

+0

Je pense que vous avez mal compris la question de Squeegy (et de Don et de paull): divisez la ligne' [[resultLabels objectAtIndex: i] setStringValue: resultString]; ' et vérifiez les valeurs nulles pour chaque objet: 'NSArray * labels = resultLabels; id object = [étiquettes objectAtIndex: i]; NSTextField * textField = (NSTextField *) objet; [textField setStringValue: resultString]; ' –

Répondre

1

Très probablement, vous faites référence à un objet qui a été libéré. Est-ce que votre NSArray ou objectAtIndex: nil à ce moment-là? Pouvez-vous montrer les lignes où vous instanciez ces objets?

+0

Envoyer un message à zéro ne provoque pas une erreur BAD_ACCESS. –

+0

paull - true; Je voulais dire l'adresse de mémoire 0x0, pas nul. Merci d'avoir fait remarquer cela. – Don

+0

Détail pointilleux: nul et l'adresse 0x0 sont les mêmes, aucune ne provoquera une erreur d'accès incorrecte; messages à zéro retour nul. –

1

Si vous obtenez l'erreur sur cette ligne, alors soit resultsLabels est libéré, ou l'objet à i est.

+0

L'objet à i dans votre tableau est une chaîne, pas une de votre matrice d'ints. –

+0

Oh désolé; tu as raison. Travailler sur deux projets à la fois devient un peu confus! ;) –

1

Ce n'est pas la source de votre crasher, mais le code de format %g est pour les doubles pas ints; vous voulez% d.

Les éléments du tableau seraient automatiquement conservés par le tableau (les objets des collections Foundation sont toujours conservés par la collection), vous ne devriez donc pas avoir à leur envoyer de messages supplémentaires -retain. Donc, il semblerait que resultLabels puisse être libéré quelque part avant que le crash ne se produise.

+0

En fait, j'ai simplifié. C'est vraiment un «double» qui sera changé plus tard. Le 'retainCount' dans la méthode' init' est 1, mais il se bloque lorsqu'il est appelé dans une méthode différente. Je pensais que rien ne se produisait si un message était envoyé à un objet 'nil', ce qui explique pourquoi c'est si déroutant. –

+0

Rien ne se passe, et votre commentaire ailleurs dans cette question montre que votre NSArray pointe vers 0x4. Donc je suppose que vous avez probablement assigné un de vos ints au pointeur de tableau en quelque sorte. –

Questions connexes