Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[Objective-C] "nombre" mais not respond to '+premier'

6 réponses
Avatar
panther751
Bonjour,

Tout d'abord je pr=E9cise que c'est la premi=E8re fois que je tente de
faire de l'objective-C, mais que je poss=E8de les bases de la POO
puisque mon principal langage est PHP5.

Je tente donc de construire une petite application qui pour un nombre
donn=E9 teste s'il est premier. Sur le fond aucun probl=E8me, mon
algorithme est fonctionnel ou du moins je suis assez grand pour le
d=E9buguer :p , mais le probl=E8me est que la tentative de codage que
j'ai fait en obj-C ne fonctionne pas.

Le compilateur me retourne le message d'erreur (pas fatale):
nptesteur.m:35: warning: `Testeur' may not respond to `+premier:'
.=2E. et effectivement =E0 l'utilisation ca ne fonctionne pas.

La ligne 35 est celle ci:
if ( [Testeur premier:nombrev] )
( Marqu=E9e par un // LIGNE 35 plus bas)

Je pense que mon erreur est toute b=EAte, et pourtant je ne la trouve
pas, mais peut =EAtre pourriez vous m'aider.

Merci bien et bonne fin d'ann=E9e.

Voici mes fichiers:

header:
---------------------------------------------------------------------------=
---
/* nptesteur */

#import <Cocoa/Cocoa.h>

@interface Testeur : NSObject
- (BOOL)premier:(int)nombrev;
@end

@interface nptesteur : NSObject
{
IBOutlet id nombre;
IBOutlet id progression;
IBOutlet id resultat;
}
- (IBAction)tester:(id)sender;
@end
---------------------------------------------------------------------------=
---

implementations:
---------------------------------------------------------------------------=
---
#import "nptesteur.h"

@implementation Testeur

- (BOOL)premier:(int)nombrev
{
float racine;
int i =3D 3;
BOOL b =3D TRUE;
racine =3D sqrt( nombrev );

if ( nombrev % 2 !=3D 0 )
while ( i < racine )
{
if ( nombrev % i =3D=3D 0 )
{
b =3D FALSE;
break;
}
i +=3D 2;
}

return b;
}

@end

@implementation nptesteur

- (IBAction)tester:(id)sender
{
int nombrev;
NSString *premierv;

nombrev =3D [nombre intValue];
if ( [Testeur premier:nombrev] ) // LIGNE 35
{
NSString *premierv =3D @ "est";
}
else
{
NSString *premierv =3D @ "n'est pas";
}

[resultat setStringValue: [NSString stringWithFormat:@"%d %s un nombre
premier",premierv,nombrev] ];
}

@end
---------------------------------------------------------------------------=
---

6 réponses

Avatar
luc
wrote:

Je pense que mon erreur est toute bête, et pourtant je ne la trouve
pas, mais peut être pourriez vous m'aider.


Toute bête en effet: tu essayes d'envoyer les message 'premier:' à la
*classe* Testeur alors que la methode est déclarée comme étant une
méthode d'*instance*.

Pour que ton code fonctionne il faut soit changer les déclaration et
définition de ta méthode 'premier:', soit instancier un objet Testeur:

1. changer la méthode en méthode de classe:

@interface Testeur : NSObject
// Note bien le '+' à la place du '-'
+ (BOOL)premier:(int)nombrev;
@end

@implementation Testeur
+ (BOOL)premier:(int)nombrev
{ ....... }
@end

...ou...

2. Instancier un objet Testeur:
Testeur* testeur = [[Testeur alloc] init];
[testeur premier:nombrev];

...MAIS...

Il faut quand même noter qu'utiliser une classe ou une instance dans ce
cas là n'a *strictement* pas le moindre intérêt, une simple fonction C
(eh oui, ne pas oublier que dans 'ObjC', y a 'C' :) ) suffit largement:

BOOL premier(int nombrev)
{ ........ }

--
Luc Heinrich

Avatar
ftestuz
wrote:

Bonjour,

Tout d'abord je précise que c'est la première fois que je tente de
faire de l'objective-C, mais que je possède les bases de la POO
puisque mon principal langage est PHP5.

Je tente donc de construire une petite application qui pour un nombre
donné teste s'il est premier. Sur le fond aucun problème, mon
algorithme est fonctionnel ou du moins je suis assez grand pour le
débuguer :p , mais le problème est que la tentative de codage que
j'ai fait en obj-C ne fonctionne pas.

Le compilateur me retourne le message d'erreur (pas fatale):
nptesteur.m:35: warning: `Testeur' may not respond to `+premier:'
... et effectivement à l'utilisation ca ne fonctionne pas.


D'après ce que je comprend, tu as voulu créer une classe pour tester si
une variable de type int est premier ou pas.
Dans ton programme tu envoies le message premier: à la *classe* Testeur,
mais tu as défini ta méthode comme une méthode d'instance, note le -
devant, et pas comme une méthode de classe.
Change ton implémentation et ta définition par :

+ (BOOL)premier:(int)nombrev // Un + devant

Deux remarques :
- Je ne connais pas vraiment php, mais note bien que les messages
peuvent être envoyé aux instances d'une classe ou à la classe elle-même.
La différence ce fait à la déclaration avec un + ou un - devant.
En objective-c, la classe est elle-même un objet qui peut recevoir des
messages et avoir des méthodes.

- Pour faire ce que tu proposes et pour être plus dans l'optique POO, je
partirais plutôt vers une catégorie pour étendre les capacités de
NSNumber.

--
Frédéric Testuz
<mailto:

Avatar
panther751
Merci bien.

Au passage vous n'auriez pas une introduction en français sur ce
langage? Les seules que j'ai trouvé étaient en anglais et mon niveau
n'est pas suffisant pour les suivre.
Avatar
Bruno CAUSSE
dans l'article ,
à a écrit le 2/01/06 12:05 :

Au passage vous n'auriez pas une introduction en français sur ce
langage? Les seules que j'ai trouvé étaient en anglais et mon niveau
n'est pas suffisant pour les suivre.


http://www-igm.univ-mlv.fr/~dr/COURS/ObjectiveC/ObjectiveC.html
--
Bruno

Avatar
panther751
Excusez moi je n'ai pas été assez précis.

Je voulais dire une introduction à Objective-C avec XCode, un peu plus
évoluée que le Currency Converter de chez Apple Developer. Enfin
déja je vais lire ça merci.
Avatar
Bruno CAUSSE
dans l'article ,
à a écrit le 2/01/06 12:28 :

Je voulais dire une introduction à Objective-C avec XCode,


en francais, je connais seulement "cocoa par la pratique"

http://www.amazon.fr/exec/obidos/ASIN/2212112327/171-8089540-6317805

Cocoa, seule raison valable a l'apprentissage de objective-c et
projet-builder, ancetre de Xcode mais tres proche.