IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Objective-C Discussion :

Lancer un programme externe + question sur va_list


Sujet :

Objective-C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Décembre 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 17
    Par défaut Lancer un programme externe + question sur va_list
    Bonjour

    Je me suis lancer dans la programmation objective-c ce week-end, et je but sur un problème. Je précise que j'ai déjà fait de la programmation, mais en Java. Ce qui rend l'apprentissage de Objective-c facile, mais je passe surement a côté de subtilité du code c.

    Le programme que je développe est tout bête, il calcule une série de valeur grâce à Runge-Kutta d'ordre 4. Puis il les enregistre dans un fichier texte sur mon bureau. Jusque là j'ai pas trop de souci, mis à part un seul.


    Mon but est d'utiliser GNUPlot. Je l'ai installé car je sais utiliser Octave, et MatLab. Je voudrai voir si en programmant dans un langage natif, c'est plus rapide que d'interpréter des fichiers comme le font Matlab et Octave.
    Je ne sais pas du tous comment lancer GNUPlot, et lui fournir les données. Je n'arrive pas à trouver quelque chose de convainquant sur internet. Qu'es ce que je doit faire ? Utiliser une ligne de commande ? Dans ce cas, quel objet permet de communiquer avec le Shell ?
    Je précise que je ne me suis pas encore penché sur les tableaux en Objective-c ce qui ne vas pas tarder.



    P.S. : l'autre problème rencontré est plus simple.
    En objective-c j'ai découvert qu'on pouvait créer des fonction avec un liste d'argment variable ex :
    +(NSString*) concatener: (NSString*) first, ...
    Pour ça, pas de problème je trouve plein de code sur internet, qui ont tous l'air de fonctionner, mais aucun ne fonctionne.

    En regardant ce qui se passe avec le débugger, j'ai vue que :
    Pour une liste de deux argument, quand mon va_arg(maliste, id) est appelé une troisième fois, il me sort une valeur "nil" mais avec une adresse .
    Du coup, ma condition de sortie de la boucle n'es pas validé, et me provoque une erreur quand on repasse dans cette boucle.
    Voici le code que j'utilise pour cette fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    + (NSString*) concatenerPlusieurs:(NSString*) first, ...{	
    	NSString*result = @"";
        NSString*eachArg;
        va_list alist;
        if(first)
        {
            eachArg = [NSString stringWithString:first];
    		va_start(alist, first);
            do{
    			if([eachArg class]==[NSString class])
    				result= [NSString stringWithFormat:@"%@\n%@", result, eachArg];
    			eachArg = va_arg(alist, id);//j'ai déjà essayé de remplacer id par NSString, mais sans succès.
    		}while (eachArg) ;
     
    			va_end(alist);
        }
        return result;
    }
    Merci de vos réponse que j'espère nombreuses.

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    - (NSString*)concatenerPlusieurs:(NSString*) arg, ...
    {	
    	NSMutableString *result = [NSMutableString string];
        va_list alist;
    	va_start(alist, arg);
        while(arg)
        {
    		[result appendFormat:@"%@\n", arg];
    		arg = va_arg(alist, NSString *);
        }
    	va_end(alist);
        return [NSString stringWithString:result] ;
    }
    vous pouvez même écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    - (NSString*)concatenerPlusieurs:(id) arg, ...
    le %@ du format implique que c'est la description de l'objet qui est concaténée au résultat…
    c'est grossièrement équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    		[result appendFormat:@"%s\n", [[arg description] UTF8String]];
    votre test d'égalité de [… class] ne peut pas fonctionner car si vous passez en argument des constantes string @"…" ou des NSMutableString, ce test échouera…
    la bonne manière de tester la classe pour ce que vous voulez faire serait d'utiliser isKindOfClass…
    en utilisant appendFormat et le "%@" : n'importe quel objet (NSObject *…) est accepté…
    (mais évidemment cela se plantera si vous passez par exemple un int *)

  3. #3
    Membre averti
    Inscrit en
    Décembre 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 17
    Par défaut
    Merci pour votre réponse, je vais tester cela dès que possible.

    Sinon pour GNUPlot, j'ai un quelque peu avancé.
    Je sais maintenant (et encore sa ne marche pas toujours) ouvrir une application avec NSWorkspace (ou quelque chose dans le genre, je n'ai pas mon code sous la main). Le problème est que je ne parvient pas à communiquer avec GNUPlot.
    Une autre possibilité est d'utiliser le code source en Objective c. C'est ce que je cherche pour le moment.

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Citation Envoyé par ThomasAU Voir le message
    Merci pour votre réponse, je vais tester cela dès que possible.

    Sinon pour GNUPlot, j'ai un quelque peu avancé.
    Je sais maintenant (et encore sa ne marche pas toujours) ouvrir une application avec NSWorkspace (ou quelque chose dans le genre, je n'ai pas mon code sous la main). Le problème est que je ne parvient pas à communiquer avec GNUPlot.
    Une autre possibilité est d'utiliser le code source en Objective c. C'est ce que je cherche pour le moment.
    voir NSTask pour lancer un programme en lui passant des paramètres…

    http://developer.apple.com/mac/libra...Wrapper_m.html

  5. #5
    Membre averti
    Inscrit en
    Décembre 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 17
    Par défaut
    Pour la concaténation sa marche très bien.
    J'ai bien prit note que sa ne fonctionne pas pour les types primitifs.

    Il me reste plus qu'à tester NSTake

Discussions similaires

  1. Lancer un programme externe
    Par jagwar dans le forum Smalltalk
    Réponses: 2
    Dernier message: 30/01/2011, 21h32
  2. Lancer un programme externe en cliquand sur un bouton
    Par maxkarting25 dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 17/05/2008, 10h20
  3. [Système] Lancer un programme externe
    Par Invité dans le forum Langage
    Réponses: 2
    Dernier message: 19/08/2007, 07h56
  4. [Système] Lancer un programme externe depuis une page web
    Par needles94000 dans le forum Langage
    Réponses: 2
    Dernier message: 08/02/2006, 21h34
  5. lancer un programme externe et continuer
    Par seal3 dans le forum C++
    Réponses: 6
    Dernier message: 31/10/2005, 19h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo