# Convertir une chaine en nombre



## TopCao (1 Janvier 2011)

Salut,

Je fais un petit programme en objectiv-c dans Xcode.
Celui ci va chercher une chaine de caractères dans un fichier et me la retourne sous la forme de NSString

Ensuite je voudrais réccup la valeur de la chaine (qui est un nombre) pour l'utiliser comme si c'était c'était un entier.


```
NSString		*val;
DCMAttribute	*attr;
val = [[attr value] description];	
attr = [dcmObj attributeForTag:tag];
int bValue = [val intValue];
```

Mon code me retourne une erreur 
Je ne pige pas comment m'en sortir


> Program received signal:  EXC_BAD_ACCESS.
> sharedlibrary apply-load-rules all


----------



## ntx (1 Janvier 2011)

Tu récupères la valeur de "attr" et juste après tu positionnes la valeur de cette variable. Ne faudrait-il pas faire l'inverse ?   Je pense que "val" est un peu égale à NIL


----------



## TopCao (3 Janvier 2011)

En effet, mon code est le suivant :


```
NSString        *val;
DCMAttribute    *attr;
attr = [dcmObj attributeForTag:tag];
val = [[attr value] description];    
int bValue = [val intValue];
```


----------



## ntx (3 Janvier 2011)

Donc avant d'utiliser les variables dcmObj, attr et val, as-tu vérifié si elles étaient nulles ou non ? 

Apprend à utiliser le débogueur


----------



## TopCao (3 Janvier 2011)

ntx a dit:


> Donc avant d'utiliser les variables dcmObj, attr et val, as-tu vérifié si elles étaient nulles ou non ?
> 
> Apprend à utiliser le débogueur


 
Si je fais un NSLog(@"val = %@",val);

il me retourne correctement les valeurs de val :
val = 0
val = 500
val = 1000

Je souhaiterai réccupérer ces valeurs sous la forme de int et les ranger dans un tableau


----------



## ntx (3 Janvier 2011)

Si val n'est pas nul, il y a autre chose autre part que tu ne nous as pas montré.


----------



## TopCao (3 Janvier 2011)

ntx a dit:


> Si val n'est pas nul, il y a autre chose autre part que tu ne nous as pas montré.


 
Voilà tout le code : 


```
[SIZE=2]- (long) filterImage:(NSString*) menuName[/SIZE]
[SIZE=2]{[/SIZE]
[SIZE=2]NSWindowController *window = [[NSWindowController alloc] initWithWindowNibName:@"Control_Panel" owner:self]; [/SIZE]
[SIZE=2][window showWindow:self]; // This will bring up the window[/SIZE]
 
[SIZE=2]// Reading DICOM META DATA - Search for b values[/SIZE]
[SIZE=2]int t;[/SIZE]
[SIZE=2]int nbTimes = [viewerController maxMovieIndex];[/SIZE]
[SIZE=2]for( t = 0; t < [viewerController maxMovieIndex]; t++)[/SIZE]
[SIZE=2]{[/SIZE]
[SIZE=2]NSArray *pixList = [viewerController pixList: t];[/SIZE]
[SIZE=2]NSMutableArray *bValues = [NSMutableArray arrayWithCapacity:nbTimes];[/SIZE]
[SIZE=2]long curSlice = [[viewerController imageView] curImage];[/SIZE]
[SIZE=2]DCMPix *curPix = [pixList objectAtIndex: curSlice];[/SIZE]
[SIZE=2]NSString *file_path = [curPix sourceFile];[/SIZE]
[SIZE=2]NSString *dicomTag = @"0018,9087";[/SIZE]
[SIZE=2]DCMObject *dcmObj = [DCMObject objectWithContentsOfFile:file_path decodingPixelData:NO];[/SIZE]
[SIZE=2]DCMAttributeTag *tag = [DCMAttributeTag tagWithName:dicomTag];[/SIZE]
[SIZE=2]if (!tag) tag = [DCMAttributeTag tagWithTagString:dicomTag];[/SIZE]
[SIZE=2]NSString *val;[/SIZE]
[SIZE=2]DCMAttribute *attr;[/SIZE]
 
[SIZE=2]if (tag && tag.group && tag.element)[/SIZE]
[SIZE=2]{[/SIZE]
[SIZE=2]attr = [dcmObj attributeForTag:tag];[/SIZE]
[SIZE=2]val = [[attr value] description]; [/SIZE]
[SIZE=2]}[/SIZE]
[SIZE=2]NSRunInformationalAlertPanel(@"Metadata",[/SIZE]
[SIZE=2][NSString stringWithFormat:[/SIZE]
[SIZE=2]@"Tag Name:%@\nTag ID:%04x,%04x\nTag VR:%@\nValue:%@",[/SIZE]
[SIZE=2]tag.name, tag.group, tag.element, tag.vr, val],[/SIZE]
[SIZE=2]@"OK", 0L, 0L);[/SIZE]
 
[SIZE=2]NSLog(@"val = %@",val);[/SIZE]
[SIZE=2]//int bValue = [val intValue];[/SIZE]
[SIZE=2]//NSLog(@"bValue = %@",bValue); [/SIZE]
[SIZE=2][bValues addObject:val];[/SIZE]
[SIZE=2]//NSLog(bValues);[/SIZE]
[SIZE=2]} [/SIZE]
 
[SIZE=2]return 0; // No errors[/SIZE]
[SIZE=2]}[/SIZE]
```


----------



## ntx (3 Janvier 2011)

```
if (tag && tag.group && tag.element)
{
attr = [dcmObj attributeForTag:tag];
val = [[attr value] description]; 
}
```
Si tu ne rentres pas dans le bloc, val est nul ou tout du moins non initialisé et donc ça va planter plus loin lors de son utilisation.


----------



## TopCao (3 Janvier 2011)

Comment fait on pour exporter la valeur de la variable à l'ensemble du programme ?


----------



## Céroce (3 Janvier 2011)

TopCao a dit:


> Comment fait on pour exporter la valeur de la variable à l'ensemble du programme ?



On ne fait pas.

Non pas que ce soit impossible (ça s'appelle une variable globale) mais c'est la meilleure manière de rendre un programme bogué et impossible à modifier. Il existe toujours un autre moyen.


----------



## ntx (3 Janvier 2011)

TopCao a dit:


> Comment fait on pour exporter la valeur de la variable à l'ensemble du programme ?


On apprend à utiliser les design pattern et dans ce cas le singleton. Mais bien sûr à n'utiliser qu'à bon escient 

Et quel rapport avant ton problème ?


----------



## TopCao (4 Janvier 2011)

ntx a dit:


> On apprend à utiliser les design pattern et dans ce cas le singleton. Mais bien sûr à n'utiliser qu'à bon escient
> 
> Et quel rapport avant ton problème ?


 Mon programme est divisé en 2 fonctions
- la première va lire le header contenu dans des fichiers DICOM pour en extraire des valeurs (partie faite et qui fonctionne bien)
- la seconde va utiliser ces valeurs dans des calculs.
- pour courronner le tout, les valeurs devraient pouvoir s'afficher dans la GUI

merci pour votre aide


----------



## tatouille (4 Janvier 2011)

TopCao a dit:


> Mon programme est divisé en 2 fonctions
> - la première va lire le header contenu dans des fichiers DICOM pour en extraire des valeurs (partie faite et qui fonctionne bien)
> - la seconde va utiliser ces valeurs dans des calculs.
> - pour courronner le tout, les valeurs devraient pouvoir s'afficher dans la GUI
> ...



creer un object DICOM qui represente les valeurs lues dans un fichier
si tu as plusieur tu crees une collection (ARRAY/VECTOR) puis tu wrap tout ca dans une class DICOMController
que tu instancies pour le dure de vie de ton app (app delegate), les membres de classe "sont la chose que tu veux"

je te conseillerais plutot de commencer avec des simples programmes en c++ avant t'attaquer cocoa et ses objets 
ou plus simple python ou ruby il te manque des grosses bases on ne travaille pas avec des fonctions flottantes (meme en C plain  on utilise des patterns comme les exo-constructors (une structure passée par ref de function en function un bonne exemple le corefoundation d'apple))


----------



## TopCao (4 Janvier 2011)

tatouille a dit:


> creer un object DICOM qui represente les valeurs lues dans un fichier
> si tu as plusieur tu crees une collection (ARRAY/VECTOR) puis tu wrap tout ca dans une class DICOMController
> que tu instancies pour le dure de vie de ton app (app delegate), les membres de classe "sont la chose que tu veux"
> 
> ...


 
Comme je le disais en préambule de ce post, je débute totalement dans la programmation en cocoa. J'ai fait beaucoup d'algorithmique avec MatLab, que j'ai appris seul et sur le tas, mais je ne suis pas du tout informaticien et je n'ai jamais pris de cours. Même si j'en avais envie, je n'en n'aurai pas le temps...
Bref, tout ca pour te demander conseil sur OU et COMMENT obtenir ces grosses bases qu'il me manque.
Merci pour ton aide en tout cas.


----------



## ntx (4 Janvier 2011)

TopCao a dit:


> Comme je le disais en préambule de ce post, je débute totalement dans la programmation en cocoa.


C'est là le problème : Cocoa c'est la dernière étape, pas la première. 

Il te manque les bases de la programmation, du C, de la programmation objet, de l'Obj-C; et après savoir maîtriser un minimum tout cela, tu pourras essayer de comprendre Cocoa.

Il y a tout les tutoriels qu'il te faut sur Google et on en a déjà mille fois parlé sur ce fourm, fais une recherche.


----------

