Pages: [1]   Go Down
Print
Author Topic: Esempio Fraction  (Read 2054 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
K1a
Apprendista Forumista
**
Offline Offline

Posts: 210



« on: 26-10-2009, 18:40:22 »

Salve ho preso il codice del professore:

Code:
#import <stdio.h>
#import <objc/Object.h>

@interface Fraction: Object {
int numerator;
int denominator;
}
- (void) print;
- (void) setNumerator: (int) n;
- (void) setDenominator: (int) d;

@end

@implementation Fraction;
-(void) print {
printf(" %i / %i ", numerator, denominator);
}

-(void) setNumerator: (int) n {
numerator = n;
}

-(void) setDenominator: (int) d {
denominator = d;
}

@end

int main(int argc, char **argv) {

Fraction *myFraction;

myFraction = [[Fraction alloc] init];
//myFraction = [myFraction init];

[myFraction setNumerator: 1];
[myFraction setDenominator: 3];

printf("The value of myFraction is: ");
[myFraction print];
printf("\n");

[myFraction free];

return 0;
}

e ne ho fatto un file .m, succesivamente l'ho compilato da terminale con: gcc -o output Fraction.m -lobjc
e mi sono comparse delle warning:
Fraction.m: In function ‘main’:
Fraction.m:33: warning: ‘Fraction’ may not respond to ‘+alloc’
Fraction.m:33: warning: (Messages without a matching method signature
Fraction.m:33: warning: will be assumed to return ‘id’ and accept
Fraction.m:33: warning: ‘...’ as arguments.)
Fraction.m:33: warning: no ‘-init’ method found
Fraction.m:43: warning: ‘Fraction’ may not respond to ‘-free’

Quindi l'oggetto fraction potrebbe non rispondere ai metodi free, alloc ed init non è trovato. Qual'è il motivo?

provo poi ad eseguire e mi restituisce:
objc[505]: Fraction: Does not recognize selector forward::
Illegal instruction

So che potrebbero essere problemi banali, ma sono alle prime armi con obj-C   
Logged
havoc
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 224


« Reply #1 on: 26-10-2009, 19:08:17 »

Ho copiato e incollato il codice e con tutti i warning attivati mi da' solo questo:
gcc -lobjc -W -Wall -o foo foo.m
foo.m:29: warning: unused parameter ‘argc’
foo.m:29: warning: unused parameter ‘argv’

Ho installato gobjc-4.3
Logged

Costantino Pistagna
Matricola
*
Offline Offline

Posts: 6


« Reply #2 on: 28-10-2009, 11:55:18 »

Che versione di XCode utilizzi? Che versione dell'SDK hai installato?

da terminale:

$locate Object.h

[snip]
/usr/include/objc/Object.h
$

dovresti avere un riferimento ad un header come quello sopra. prova a fare un MD5, vediamo se hai la mia stessa versione:

$ md5 /usr/include/objc/Object.h
MD5 (/usr/include/objc/Object.h) = 2ab8df98ba3f31d5a5163fba75605834

i metodi citati sono riferiti in quel file. Una reinstallazione dell'SDK + Xcode, potrebbe servire.

buon lavoro
Logged
K1a
Apprendista Forumista
**
Offline Offline

Posts: 210



« Reply #3 on: 28-10-2009, 23:18:58 »

l' md5 mi restituisce la stessa cosa  , ma occorre installare gobjc? non basta gcc per compilare?

Logged
K1a
Apprendista Forumista
**
Offline Offline

Posts: 210



« Reply #4 on: 29-10-2009, 19:52:19 »

 aggio a snow leopard a 64 bit il problema, ci dovrebbe essere per compilare con gcc un flag opportuno per far funzionare le cose, ma ancora non l'ho scovato   
Logged
Costantino Pistagna
Matricola
*
Offline Offline

Posts: 6


« Reply #5 on: 30-10-2009, 01:06:53 »

Salve,

Oggi pomeriggio sono arrivate le licenze di Snow Leopard e con il prof. Cutello abbiamo fatto le prime due installazioni.

Ho subito verificato il problema sollevato ed, in effetti, Snow Leopard abilita i flag per 64bit di default. Questo comporta, con mio grosso stupore, una serie di warning nella compilazione.

Come se non bastasse, il problema sembra ripercuotersi anche nel binario che, viene compilato, ma risulta non funzionante.

Abbiamo fatto alcune indagini approfondite e ci siamo accorti di un interessante particolare: sembrerebbe che, per ragioni a me sconosciute, i messaggi alloc, free ed init, assumano una firma diversa quando compilati a 64bit. Questo comporta un warning (ed un errore reale, in fase di esecuzione).

Per risolvere il problema, potete usare il seguente flag di compilazione a linea di comando:

gcc -arch i386 -o test test.m -lobjc

saluti e buon divertimento!

--
costantino

Logged
K1a
Apprendista Forumista
**
Offline Offline

Posts: 210



« Reply #6 on: 30-10-2009, 09:05:21 »

Il flag l'ha scovato prima il prof 
Comunque grazie, l'ho provato e funziona tutto perfettamente 
Logged
Pages: [1]   Go Up
Print
Jump to: