Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 14/04/2011, à 17:56

shadowless

int main (int argc,char** argv)

Bonjour

si le vous plais je trouve du mal a comprendre les arguments de la fonction principale de ce programme et surtout la désignation des deux étoiles


#include "MCharImage.h"
#include "MDetecteur.h"
#include "MListePI.h"
//#include "MListeCouples.h"
#include "MUtils.h"

using namespace std;
using namespace local_vis_eric;

int main (int argc,char** argv)
{
MCheckCpu();
//MSetWithMmxSseUse(2); //0->pas de SIMD, 1->MMX et SSE (Pentium 3 et AMD), 2->SSE2 (Pentium 4)

if (argc==3)
{
//Ouverture des images
cout << "ouverture des images" << endl;
MCharImage Image1,Image2;
Image1.Load(argv[1]);
Image2.Load(argv[2]);
cout << "ouverture des images ok" << endl;
int x=Image1.x();
int y=Image2.y();

cout << " dim : " << x << " " << y << endl;
//Detection des points
// Attention : utiliser un detecteur diffent pour chaque image
// Les detecteurs doivent etre conserves pour l'appariement
MDetecteurHarris Detecteur1(x,y),Detecteur2(x,y);
MListePI ListePI1,ListePI2;
int res = Detecteur1.DetecteBaquets(Image1,ListePI1,8,8,20,500,true);
cout << "Npoints : " << res << endl; //Subpixel=true




Detecteur2.DetecteBaquets(Image2,ListePI2,8,8,20,500,true); //Subpixel=true
cout << ListePI1.getNbPoints() << " ; " << ListePI2.getNbPoints() << endl;
/*
for(int i = 0 ; i < ListePI1.getNbPoints() ; i ++)
cout << "[" << ListePI1.getX(i) << " " << ListePI1.getY(i) << "]";
*/
cout << endl;
/*
for(int i = 0 ; i < ListePI2.getNbPoints() ; i ++)
cout << "[" << ListePI2.getX(i) << " " << ListePI2.getY(i) << "]";

*/
//system("pause");

//Appariement
//60x40 : taille de la fenetre de recherche, 0.8 : score minimum pour valider l'appariement
//~ MListeCouples ListeCouples;
//~ ListeCouples.Apparie(ListePI1,Detecteur1,ListePI2,Detecteur2,120,80,0.8);
//~ ListeCouples.KeepBest();

//~ MCharImage im(512,384);
//~ ListeCouples.DrawSelected(im,1,1,255);
//~ im.Save_pgm("pouet.pgm");
//ListeCouples.Create(ListePI1,ListePI2,120,80,0.8);



//Affichage
//~ for (int i=0;i<ListeCouples.getNbCouples();i++)
//~ {
//~ float x1,y1,x2,y2;
//~ ListeCouples.GetCoords(i,x1,y1,x2,y2);
//~ cout << "("<<x1<<","<<y1<<")-("<<x2<<","<<y2<<")"<<endl;
//~ }
}
else cout << "Usage : exemple image1.pgm image2.pgm" << endl;
//system("pause");
return 0;
}

Hors ligne

#2 Le 14/04/2011, à 18:02

Kharec

Re : int main (int argc,char** argv)

Une étoile en C symbolise un pointeur.

Hors ligne

#3 Le 14/04/2011, à 18:19

:!pakman

Re : int main (int argc,char** argv)

C'est donc un pointeur de pointeur, ou tu peux le noter aussi comme ça en l'occurrence :
char* argv[]

Ça marche aussi dans ce cas précis, c'est un pointeur sur tableau, "argv" étant un pointeur sur la 1ere case du 1er tableau, c'est un pointeur de pointeur.
argv[0][0] ou **argv par ex. te retourne un int (ou plus précisément un caractère) qui correspond à la 1ere lettre du nom de ton programme.

C'est un peu compliqué au départ, tu devrais faire un tour sur le site du zéro c'est bien expliqué.

argc : nombre d'arguments du programme, nom du programme inclus
argv[i] : la chaine i passée en argument dans ton programme, argv étant un tableau de tableaux.

Tiens, en bonus (c'est du C pas du C++, les headers ne sont peut-être pas bons ?) :

#include <stdio.h>
#include <stdlib.h>

int main (int argc, char *argv[])
{
    int i = 0;
    printf("On a passé %d arguments au programme, nom du programme inclus.\n", argc);
    printf("Les arguments passés sont :\n");
    while (i < argc)
    {
        printf("%s\n", argv[i]);
        i++;
    }
    printf("La 1ere lettre du nom du programme est %c\n", argv[0][0]);
    printf("La 2nd lettre du nom du programme est %c\n", argv[0][1]);
    if (argc > 1)
        printf("La 1ere lettre du 2nd argument est %c\n", argv[1][0]);

    return EXIT_SUCCESS;
}

Dernière modification par :!pakman (Le 14/04/2011, à 18:42)


...

Hors ligne

#4 Le 14/04/2011, à 18:45

Uda

Re : int main (int argc,char** argv)

Kharec a écrit :

Une étoile en C symbolise un pointeur.

Dans une déclaration. Parce que sinon cela peut être un multiplication, indiquer la veleur pointer, ...

Ta réponse va pas beaucoup l'aider smile

Pour faire simple :
argv définie un tableau de chaine de caractère.
argc indique le nombre de paramètre
Le premier élément de argv (à l'indice 0) est le nom du programme.

Pour comprendre ce que signifie char **argv, il faut décomposé.

char représente un caractère                   
char  * représente un pointeur (l'adresse) d'un tableau (ensemble continue) de caractère. Ce tableau peut être de 1 ou plusieurs éléments.
char ** représente un pointeur sur un tableau de Pointeur sur caractère.

Ensuite, il faut savoir comment interpréter la zone pointée. Cela dépends du contexte et de la logique du programme.
Dans ce cas, le char * représente un chaine de caractère. En C, une chaine de caractère se termine avec un caractère '\0'.
argv est un tableau de chaine de caractère. Chaque chaine représentant un argument de la ligne de commande.

Pour ton programme, il faut lui passer deux nom de fichier d'image.

J'espère que c'est plus clair.

Hors ligne

#5 Le 14/04/2011, à 22:04

Pylades

Re : int main (int argc,char** argv)

Bon, je vais faire le connard qui tire dans les coins, mais je précise qu'il n'est pas possible de passer un tableau comme argument à une fonction en C (et heureusement, car le C est bien fait).

En fait, quand on semble passer un tableau comme argument, il y a génération de pointeur à partir du tableau et c'est le pointeur qui est passé. Mais on peut utiliser la notation avec les crochets avec un pointer par commodité, il faut juste faire attention à ne pas faire de buffer overflow (comme avec les tableaux, d'ailleurs).


Pour bien se rendre compte de cela, voici un code d'exemple :

#include <stdio.h>

void to_ptr(int[]);

int main(void)
{
    int tab[5];
    printf("tableau: %d\n", (int) sizeof tab);
    to_ptr(tab);
    return 0;
}

void to_ptr(int ptr[])
{
    printf("pointeur: %d\n", (int) sizeof ptr);
}

On voit donc bien ici que ptr n'est pas identique à tab (l'un est un pointeur, l'autre un tableau).


Pour cette raison, j'ai tendance à privilégier la notation int main(int argc, char** argv) ; histoire de bien expliciter que nous avons affaire à un pointeur et non un tableau.


“Any if-statement is a goto. As are all structured loops.
“And sometimes structure is good. When it’s good, you should use it.
“And sometimes structure is _bad_, and gets into the way, and using a goto is just much clearer.”
                Linus Torvalds – 12 janvier 2003

Hors ligne

#6 Le 15/04/2011, à 18:36

:!pakman

Re : int main (int argc,char** argv)

Plyade a écrit :

Bon, je vais faire le connard qui tire dans les coins, mais je précise qu'il n'est pas possible de passer un tableau comme argument à une fonction en C [...]

Tu fait bien de le préciser wink

Dernière modification par :!pakman (Le 16/04/2011, à 14:07)


...

Hors ligne

#7 Le 18/08/2011, à 09:32

Kharec

Re : int main (int argc,char** argv)

Uda a écrit :
Kharec a écrit :

Une étoile en C symbolise un pointeur.

Dans une déclaration. Parce que sinon cela peut être un multiplication, indiquer la veleur pointer, ...

Ta réponse va pas beaucoup l'aider smile

Je suis d'accord, j'aurais pu répondre de manière plus exhaustive. wink

Hors ligne