Aller au contenu

Eléments d'un tableaux


Invité ddurandet
 Share

Messages recommandés

Invité ddurandet

J'ai une question, théorique pour l'instant.

Comme je découvre ensemble le C et l'Objective C, j'ai du mal a imaginer comment m'y prendre et je me retrouve incapable de me lancer dans des essais. Je suis sur que ca va passer, c'est une question de pratique. Mais en attendant...

Comment fait-on en C pour supprimer des éléments d'un tableau ?

Il a par l'air d'aimer ca, le C ? .

 

un exemple : j'ai un tableau d'entiers (en fait ce sera des strings mais c'est plus simple comme exemple)

Je veux tester chaque element pour savoir si il est pair. Si il l'est, je le garde. Sinon, je le jette.

Mais dans la pratique je suis obligé de déplacer les ints qui sont pairs vers un autre tableau... ?

Oui, mais, mon tableau d'arrivé, je n'en connais pas la taille... Alors comment je l'initialise ?

Lien vers le commentaire
Partager sur d’autres sites

Invité ddurandet

Merci chezSeb

 

C'est a la fois cool et déroutant.

Je ne sais plus ce que je dois apprendre du C, finalement.

Je suppose que toutes les classes C vont avoir un correspondant NSlaClasse et NSmutableLaClasse, j'ai vu que c'etait le cas pour les string.

En me concentrant sur ces classes, et grace au polymorphisme, je suppose que ce je vais apprendre de plus en plus vite. Mais je ne peut pas me passer du C non plus...

En fait l'apprentissage est complexe, meme si l'objectiveC est simplifié.

 

Bon, je reprends mon exemple avec des entiers pairs.

 

si j'ecris :

for (i = 0; i < [monArray lenght]; i++) ([monTest [monArray]] ? [monArray removeObjectAtIndex:i] : nil);

 

Mis a part les nombreuses erreurs de syntaxe que j'ai du ecrire, j'espère que tu arrives a suivre l'idée. Mon probleme ici, c'est que l'incrémentation de i dans l'instruction for fait que les éléments a l'index qui suit une elimanation ne sont pas testés...

Heu, c'est clair ?

Quand j'avais ce soucis avec hyperCard, et je commencais par la fin pour revenir vers le premier élément. Je dois faire pareil ou il y a quelquechose qui m'échappe ?

--

Qu'est ce qui me manque comme connaissance ? En gros, sur quoi je dois me concentrer dans le C et sur quoi je dois me concentrer sur l'Objective-C ?

 

----

 

Question optionnelle : suis-je énervant d'ignorance ? :-/

Lien vers le commentaire
Partager sur d’autres sites

Invité chezseb

En fait, toute l'algorithmie est en C, seuls la gestion des objets est Objective-C. Donc pour reprendre ton exemple avec un if pour plus de lisibilité, je ferai de la manière suivante :

int i;
NSMutableArray*tempArray;
for (i=0; i<[monArray count]; i++)  {
  if ([monTest [monArray objectAtIndex:i]]) {
     [tempArray addObject:[monArray objectAtIndex:i]];
  }
}
[monArray removeObjectsInArray:tempArray];

 

Je crois que le code parle de lui-même...

Lien vers le commentaire
Partager sur d’autres sites

Invité ddurandet

Heu, je me concentre beaucoup.

C'est clair :-/

J'ai bien suivi, que tu utilise un tableau temporaire dans lequel sont copiés les (pointeurs ? des) éléments du tableau  qui correspondent au test.

 

La dernière ligne a l'air magique, mais je suppose qu'elle fonctionne justement parcequ'il s'agit de pointeurs et que grace a ca, il n'y a pas de risques de confusion ?

Quid de la memoire allouée au tableau temporaire ? Dois-je la désallouer ?

 

Sinon,ai-je une chance de me passer d'un tableau temporaire par quelquechose du genre :

int i;

for (i=0; i<[monArray count]; nil)

 if ([monTest [monArray objectAtIndex:i]]) {

    [monArray removeObjectAtIndex:i];

 }else{

    i++;

 }

}

Lien vers le commentaire
Partager sur d’autres sites

Invité chezseb

Objective-C ne manipule quasiment que des pointeurs !

C'est effectivement pour ça que la dernière ligne est magique.

Pour le tableau temporaire, l'ideal est :

NSMutableArray *tempArray = [NSMutableArray array];

qui a pour effet de créer un tableau "autorelease" qui sera donc désallouer

Lien vers le commentaire
Partager sur d’autres sites

Invité ddurandet

Merci Kronos.

 

je sais bien que mes questions doivent paraitre tres bizarres aux spécialistes, mais je l'explique ainsi.

A part une formation/découverte d'une semaine a la programmation, je suis un autodidacte parceque j'aime faire marcher ma logique. ce qui explique que je ne vais pas souvent au bout de mes projets et que ca n'a pas d'importance pour moi car je ne cherche qu'a me faire plaisir. Je ne me sens pas du tout a l'aise d''être autodidacte. J'aurais préféré rencontrer la programmation plus jeune et pouvoir me former. Aujourd'hui, ce n'est plus possible. Alors je cherche a pratiquer. Je suis devenu assez fort avec hypercard, j'ai voulu passer a ApplScript pour évoluer un peu. Pas de soucis avec appleScript, et j'aime beaucoup, mais ca reste limité au niveau de l'interface. Avec l'arrivée d'AppleScript studio, j'ai cru que j'allais franchir un cap, mais je suis vu incappable de discuter efficacement avec les objets graphiques tels que drawers, box etc.

J'ai entendu parler d'objective-c, je me suis donc documenté sur le C et maintenant j'essaye de rassembler mon courage pour me lancer.

A l'inverse d'AppleScript, je maitrise bien la liaison avec les objets graphiques, mais j'ai du mal avec les bases du langage.

Le problème, c'est que je dois jongler avec deux documentations, C et OC, qui donnent des methodes différents. Par exemple, l'exemple que j'ai cité, je l'ai construit a partir d'un exemple du manuel d'ANSI C de Bernard Cassagne.

 

Le probleme aussi, c'est que je manque gravement de vocabulaire.

 

par exemple quand tu me parles de controle de flux et de traitement fonctionnel, j'ouvre de grands yeux et je me dis que j'ai raté trop d'épisodes pour pouvoir aller de l'avant. Ce qui fait au final que j'ose a peine poser des questions et que je passe des heures a essayer de me debrouiller (mal) tout seul.

Voil

Lien vers le commentaire
Partager sur d’autres sites

Invité ddurandet

Je viens de faire un tour chez Project:Omega, et il y a une nouvelle traduction d'oreilly qui concerne justement les tableaux.

J'ai un peu de mal a suivre la demonstration sur les énumerateurs.

 

voici l'exemple qu'ils donnent en comparaison d'une boucle for :

 

// assume anArray exists

id object;

int i;

for (i = 0; i < [anArray count]; i++ ) {

  object = [anArray objectAtIndex:i];

  // do something with object

  }

 

Puis, le mode NSEnumerator :

 

 

// again, assume anArray exists

NSEnumerator *enumerator = [anArray objectEnumerator];

id object;

while ( (identifier = [enumerator nextObject]) ) {

// do something with object

}

 

N'y a t'il pas une erreur dans la ligne while (ou la suivante) ?

J'aurais mis :

while ( (object = ...

// do something with object

 

??? Ai-je bien suivi ?

Cette instruction doit pourvoir ma'aider dans mon exemple ?

 

// monTableau est déclaré

NSEnumerator *enumerator = monTableau objectEnumerator];

id object;

while ( object = [enumerator nextObject]) ) {

 if ([self monTest:object]) {

   [monTableau removeObject : object];

}

Lien vers le commentaire
Partager sur d’autres sites

Invité ddurandet

Kronos :

 

Est-ce que c'est pour cela qu'il y a deux façons d'écrire un if ?

 

( monBooleen ? [self faireCeci] : [self faireCela] );

 

qui serait un branchement de contrôle de flux

 

et

 

if (monBooleen) {

 traitementData1;

 traitementData2;

 } else {

 traitementData3;

 }

 

qui serait plutot manipulation des datas ???

Lien vers le commentaire
Partager sur d’autres sites

Invité kronos

Non je ne pense pas.

 

En fait l'instruction "test ? Fait si vrai : Fait si faux" est apparu avec le C. Or, au début, le C a été utilisé pour écrire du code super optimisé (communication réseau, système UNIX, ...). Cela se situe dans les années 70. Un temps ou la notion de programmation objet nétait pas encore

Lien vers le commentaire
Partager sur d’autres sites

Invité ddurandet

Dommage, parceque  si j'aime bien cette formulation, c'est justement parce qu'elle retourne une valeur.

 

Peut-on écrire :

 

maVariable = if (val1 > val2) {

                      faireQUelquechose;

                      val1;

                   } else {

                      faireQuelquechose;

                      val2;

                   }

 

? la Variable prendra t'elle une valeur ?

Lien vers le commentaire
Partager sur d’autres sites

Invité kronos

Logiquement non.

 

"if" n'est pas une instruction prévue pour retourner une valeur. Mais cela ne garanti pas que certains compilateurs soient incapables de renvoyer un booléen ou void (sorte de pointeur NULL).

 

Je ne suis pas 100% affirmatif car je n'ai jamais testé ce cas de figure. Et connaissant la perfidie du C, je me méfie.

 

Exemple de perfidie :

 

Que fait le petit bout de code suivant ?

 

int a = 1,

   b = 2,

   c = 0;

 

if (a = B)

 {

   c = 1;

 }

else

 {

   c = 0;

 };

 

Beaucoup de gens vont croire que c est égale

Lien vers le commentaire
Partager sur d’autres sites

Invité ddurandet

J'ai bien compris :-)

 

Autre question puisque tu en parles :

C'EST QUOI UN EFFET DE BORD ?

Bernard Cassagne n'arrete pas d'en parler mais il n'explique j'amais ce que c'est.

Lien vers le commentaire
Partager sur d’autres sites

Invité kronos

Salut,

 

Un EFFET DE BORD est souvent annonciateur de catastrophe  :P

 

C'est un effet non prévu d'une action.

 

Cela peut arriver quand on modifie un code source qu'on ne maîtrise pas correctement.

 

Exemple:

 

Je déclare au début d'une fonction un variable chaîne de caractères d'une longueur de 9. Plus loin dans le code je lui attribue la valeur "c'est OK" pour pouvoir l'afficher avec un printf().

 

Quelques temps plus tard, jédite le code et assigne la valeur "c'est pas OK". Je recompile, je lance l'application qui affiche le nouveau message mais se plante

Lien vers le commentaire
Partager sur d’autres sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

Chargement
 Share

×
×
  • Créer...