2010-02-03 4 views
1

Je viens de faire mes premiers pas en passant au Objective-C. J'ai une question très simple sur le fonctionnement des tableaux.Comprendre les tableaux dans Objective-C/C

J'ai deux fichiers .m:

1)

Line = origin[6]; 
forloop(i...i++) { 
    origin[i]=7; 
} 
[buildSubview:origin]; 

2)

Line response[6]; 

-(id)buildSubview:(Line[])origin { 
    *response=*origin; 
    NSLog(@"response[1]=%o",response[1]); 
    NSLog(@"origin[1]=%o",origin[1]); 
    ........ 
    ..... 
} 

La sortie que je reçois est:

response[1]=0; <-- I would expect the same value as origin 
origin[1]=7; 

Mais si je demande pour imprimer la valeur à l'indice 0, je reçois ce que je veux cted:

response[0]=7; <-- Now they are the same 
origin[0]=7; 

Je demande pourquoi deux valeurs différentes? Et aussi, pourquoi si j'écris

response=origin; 

Je reçois une erreur de compilation d'affectation incompatible?

+0

Qu'est-ce que l'instruction 'forloop'? – mouviciel

+0

est juste un raccourci, ce que je voulais dire était pour (int i = 0; i <6; i ++) {...} – Leonardo

+0

Pourquoi ne pas nous montrer le vrai code? –

Répondre

3

En résumé, sometimes, le nom d'un tableau dans C "se désintègre" en un pointeur vers le premier élément du tableau, et cela vous cause des problèmes.

Lorsque vous écrivez

response=origin; 

Le nom origin sur la partie droite « désintègre » être de type Line *, et des points au premier élément du tableau origin, alors que response est un tableau de type »[6] Ligne". Puisque les deux types ne sont pas compatibles (cela n'a pas de sens d'initialiser un tableau avec un pointeur), c'est une erreur.

Maintenant,

*response=*origin; 

ne copie pas toute la mémoire dans origin à response. Comme je l'ai mentionné ci-dessus, et plus en détail dans le lien ci-dessus, origin pointe sur le premier élément du tableau origin dans ce contexte, donc *origin est en fait le premier élément du tableau. Par conséquent, *response=*origin; copie simplement la valeur du premier élément du tableau origin au premier élément de response. Puisque vous n'avez pas attribué de valeur à response[1], il contient des données erronées.

Si vous souhaitez copier les données du tableau sur, vous pouvez faire une boucle:

size_t i; 
for (i=0; i < 6; ++i) 
    response[i] = origin[i]; 

Ou, vous pouvez utiliser memcpy():

memcpy(response, origin, sizeof response); 

(ci-dessus est C, Objective C peut avoir des différences et d'autres façons de faire ce que vous voulez faire.)

+0

@Peter, merci pour le correctif orthographique. –

+0

merci pour cette explication claire, je viens de voter. En java comme dans un autre langage orienté objet, vous savez peut-être que lorsque j'écris objectx = objecty, j'ai deux références au même objet. J'essayais d'atteindre cela avec objectif-c, avec un moyen préféré d'apprendre à faire dans un langage non orienté objet comme C. – Leonardo

+0

s/memset/memcpy –