Passer des paramètres à un sous programme

Fermé
toma - Modifié par KX le 18/05/2013 à 10:05
 toma - 21 mai 2013 à 21:55
salut,
est-il possible d'avoir des paramètres de la fonction main qui viennent de sous programmes?

je m'explique: dans mon main je définis une matrice, j'ai des sous programmes qui travaillent dessus et créent d'autres matrices. dans la suite de mon main, je veux me servir de ces matrices en leur appliquant d'autres sous programmes. comment indiquer à mon main où aller les chercher (les matrices créees par les sous programmes)?

j'ai essayé de les déclarer en paramètres de main: int tab[][], ainsi que char* mais il bloque à la compilation..

merci d'avance!
A voir également:

7 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
18 mai 2013 à 10:05
Tu veux faire ça avec quel langage ?
0
en c ++
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
18 mai 2013 à 13:27
Les espaces mémoires appartiennent au programme qui les alloue, tu ne peux pas directement accéder aux objets d'un programme A depuis un programme B.
Par contre tu peux faire passer les valeurs d'un programme à l'autre, pour cela il y a plusieurs manières :

1) Tu passes tous tes paramètres dans l'argc du main, mais dans ce cas tu dois respecter le type char*[] de argc, et donc passer une ou plusieurs chaînes de caractères qui représente ta matrice, exemple : "1,2,3;4,5,6;7,8,9"

2) Tu crées un fichier temporaire où tu écris le contenu de ta matrice, et tu passes le nom de ce fichier au deuxième programme pour qu'il aille le lire.

Remarque : dans ces deux premiers cas, le deuxième programme peut être exécuté indépendamment du premier sous-réserve qu'on lui passe bien les bons paramètres. De plus, rien n'oblige que les deux programmes soient écrits dans le même langage.

3) Tu fais de la communication interprocessus. C'est plus compliqué, et ça dépend en général du système d'exploitation où fonctionnent les programmes, mais c'est aussi la manière la plus efficace de faire de la transmission de données entre deux programmes (généralement écrit dans le même langage)

Par exemple en créant une file de message dont "l'entrée" est gérée par le programme A, et la "sortie" par le programme B, les messages étant ici les différentes valeurs de tes matrices.

Le gros avantage c'est que cette méthode permet de synchroniser les deux programmes, il est donc possible d'envoyer des messages n'importe quand dans la vie des deux processus. Et non plus seulement au démarrage du deuxième.
0
Pour la solution 1, j'ai mis : int main( int TailleMax , char *PoidsCumul[TailleMax],int TailleMax, char *CheminPlusCourt[TailleMax] )

(j'ai en fait 2 matrices en paramètres à utiliser dans mon main) mais à la compilation il me dit : [Error] expected ',' or '...' before numeric constant
au niveau du premier int TailleMax. j'ai pourtant bien changé les int nom du tableaux[] par int TailleMax , char *nom tableau l[TailleMax] dans ma liste des sous programmes qui est juste au dessus.

autre petite question: dans le cas où la matrice serait de aurait plusieurs lignes, je devrai ensuite la réassembler dans le main?

pour la solution 2, je crains de ne pas du tout être au niveau.. pour la 3 non plus d'ailleurs.
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
18 mai 2013 à 15:47
j'ai mis : int main( int TailleMax , char *PoidsCumul[TailleMax],int TailleMax, char *CheminPlusCourt[TailleMax] )

NON ! La définition de main doit rester la même tout le temps !!!

int main(int argc, char* argv[]) // toujours !
Tu dois respecter le type int de argc et le type char*[] de argv. Les valeurs de ces variables seront remplies automatiquement en fonction des paramètres passés au programme.

Exemple :

// Programme1

int main(int argc, char* argv[])
{
    printf("%s\n",argv[0]); // Programme1
    
    char* command="Programme2";
    char* arguments={"tata","toto","titi",(char*) NULL};
    int retour=execvp(command,arguments);
    
    printf("%d\n",retour); // 0

    return 0;
}

// Programme2

int main(int argc, char* argv[])
{
    printf("%s\n",argv[0]); // Programme2
    
    printf("%s\n",argv[1]); // "tata"
    printf("%s\n",argv[2]); // "toto"
    printf("%s\n",argv[3]); // "titi"
    
    return 0;
}

Ce que tu dois faire c'est de mettre en place une méthode de conversion d'une matrice vers une chaîne de caractères et inversement, pour les passer en paramètres à la place de "tata" ,"toto", "titi"
Je donnais un exemple tout à l'heure "1,2,3;4,5,6;7,8,9" il s'agit d'une matrice 3x3 où les lignes sont séparées par des point-virgules, et les colonnes par des virgules. C'est facile à écrire et à lire.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ah d'accord, comme je suis dans le cas où ce sont des fonctions de mon main qui m'envoient les matrices, il faut juste que je crée une autre fonction pour convertir mes matrices en chaînes de caractère? comme j'en ai deux, je dois les rentrer toutes les 2 dans une même chaîne et trouver un moyen de différencier les éléments de chaque matrice dans ma chaîne?

je ne comprends pas juste cette commande: execvp(command,arguments)
que fait-elle?

printf ça marche en c ++?
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
19 mai 2013 à 15:30
execvp c'est ce qui te permet d'appeler un autre programme ! Comment tu fais sinon ?

Et oui, printf fonctionne en C++, comme beaucoup d'autres bibliothèques du C.
0
ah oui d'accord je comprenais pas parce que je n'ai qu'un programme (les autres sont des sous programmes dedans)

pour pouvoir exécuter des programmes liés comme ça, ils faut qu'ils soient stockés dans le même fichier ou l'ordinateur se débrouille avec le nom pour le trouver?
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
19 mai 2013 à 22:22
Entendons nous bien sur le vocabulaire :

Un programme est un fichier exécutable compilé. Le début de ce programme est décrit dans le code C++ par la fonction int main(int argc, char* argv[]), c'est pour ça que sa signature est imposée.

Depuis le début je pars du principe que tu as plusieurs programmes et que tu veux passer ta matrice d'un programme à un autre. C'est le seul cas où tu aurais besoin de t'intéresser aux valeurs argv de la méthode main !

Mais j'ai l'impression que tes "sous-programmes" sont en faites des fonctions (voire des méthodes vu qu'on parle de C++). Prends ton temps et expliques TRÈS CLAIREMENT ce que tu veux faire, parce que ça ne sert à rien que je réponde à une question que tu ne poses pas !
0
oui mes "sous programmes" sont bien des fonctions (on les appelle comme ça dans mon cours, je ne sais pas pourquoi)

je veux faire exactement ce que font argc et argv dans le cas de deux programmes, sauf que c'est une fonction qui envoie la matrice à son main au lieu d'un autre programme

dans le main, je définis une matrice. 2 fonctions travaillent dessus et en font 2 autres matrices. j'ai une autre fonction (exécutée ensuite dans mon main) qui travaille avec ces matrices.

il faut donc que je déclare ces matrices à mon main, sinon à la compilation il me dit qu'il ne les connaît pas, et quand je mets simplement int tableau[][] en paramètre (comme lorsque j'ai un tableau paramètre d'une fonction autre que le main) , ça ne marche pas, il me dit qu'il ne les connaît pas non plus.
0