CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

qu:fichier en arg

argum2
argum2
Niveau 5
21 janvier 2008 à 15:24:34

Bonjour a tous,
je viens vous ecrire car je dois realiser un programme en ppm pour de la retouche d'image.

Mon "probleme" est le suivant : je voudrais pouvoir saisir durant l'execution de mon programme le nom d'un fichier qu'il affichera a l'aide de imagemagick. D'habitude je fais simplement dans mon programme en C/"C++"
systeme("imdisplay image.pmm);
mais je voudrais donc remplacer le image.ppm par une variable correspondant au fichier que j'aurais saisi durant l'execution de mon programme.

J'espere etre assez clair sinon hesitez pas a me poser des questions et j'espere que cela est possible.
Merci d'avance

Fvirtman
Fvirtman
Niveau 10
21 janvier 2008 à 16:58:27

Déclare ton main ainsi :

int main(int argc,char** argv)

Ces parametres permettent de récupérer ce qu'il y a sur la ligne de commande.
argc est un int : le nombre d'arguments passés, incluant le nom du programme lui meme.
argv : tableau de char* pour les arguments

exemple :
si tu tapes :

mon_prog fichier1.ppm fichier2.ppm

tu récuperes argc = 3
et
argv[0] = "mon_prog"
argv[1] = "fichier1.ppm"
argv[2] = "fichier2.ppm"

argum2
argum2
Niveau 5
21 janvier 2008 à 18:19:29

c'est genial comme truc XD merci beaucoup ^^ je galere!!! merci merci!!! j'y vais de suite^^

argum2
argum2
Niveau 5
21 janvier 2008 à 18:31:08

excuse moi, je me suis un peu emballé.
Je m'explique : en gros durant l'execution de mon programme(je suis sous XP) je voudrais taper dans la fenetre cmd qui s'ouvre le nom du fichier, donc si je comprends bien je saisi celui que je veux comme tu me l'as dit plus haut.

mais alors pour transformer l'image ppm j'ai la ligne de code :

system("imdisplay image.ppm");

et donc le cas echeant, je ne peux pas y introduire une variable... enfin surment (je l'espere) mais je ne sais pas quelle est la syntaxe

PS: je suis dsle mais je debute encore donc je ne suis pas tres doué!

caelacanthe
caelacanthe
Niveau 10
21 janvier 2008 à 20:19:22

a la place de "imdisplay image.ppm", mets argv[1] :ok:

guyver2
guyver2
Niveau 10
21 janvier 2008 à 21:53:02

si il fait comme ça il va lui manquer "imdisplay" dans sa fonction system...

en gros il faut que tu fabrique la commande que tu taperais dans la fenetre cmd.

int main()
{
char fichier[255];
printf("entre le nom de l'image : ");
scanf("%s", fichier);
char *commande = malloc(10+strlen(fichier));
sprintf(commande, "%s %s", "imdisplay", fichier);
system(commande);
free(commande);
return 0;
}

explications :
- le printf affiche du texte a l'ecran (dans la console)
- le scanf qui suit sert a recuperer ce que tu tapes dans la console, ici il s'agit du nom de ton fichier "image.ppm", il faut que ce nom ne fasse pas plus de 255 caracteres... tu devrais avoir de la marge.

- ensuite on crée la chaine de caractere qui va contenir la commande a passer a la fonction system();
on fabrique un tableau de caractere de taille 10 + la taille de ton nom d'image, le 10 correspond a la taille de "imdisplay ".

- on ecrit dans la chaine commande le texte qui va bien grace a la fonction sprintf qui marche sensiblement comme printf.

- on lance system(commande);
- on libere la memoire aloué par le malloc.
- on quitte.

Enjoy

argum2
argum2
Niveau 5
21 janvier 2008 à 23:17:10

je vais peut etre dire une betise mais il me semble que malloc n'est utilisable que sous linux?? non? alors que je suis sous XP

autre point, je ne connaissais pas du tout sprint et je trouve sa super^^
neanmoins, comme le noob que je suis, j'utilise les cin et cout du C++ et je me demande s'il y a un equivalent?

en tout cas je trouve vos reponses super clair^^ merci bien sa m'aide a progresser!!

guyver2
guyver2
Niveau 10
21 janvier 2008 à 23:34:54

alors deja, malloc est valable quelque soit la plateforme, c'est une base du langage C.

ensuite le code que je t'ai donné est en C pur, mais tu peux faire la meme chose en C++ en encore plus simple

int main()
{
cout << "donne le nom du fichier : ";
string fic;
cin >> fic;
string commande = "imdysplay "+fic; // c'est beau les objets :)
system(commande.c_str());
return 0;
}

argum2
argum2
Niveau 5
21 janvier 2008 à 23:47:01

merci beaucoup de prendre le temps de me repondre!

j'ai fait ce que tu m'as dit et sa marche ^^ SUPER!!!

par contre, je ne comprends pas ce << system(commande.c_str()); >>

le c.str() signifie quoi??

dnob700
dnob700
Niveau 10
22 janvier 2008 à 00:49:16

guyver : horrible le dépassement de tampon !
10+strlen(fichier) ? et le zéro final, tu le mets où ? ...

Non, bref, ce que je veux dire, c'est que la méthode de guyver est très bien, et en plus il l'a bien expliqué, juste, le problème inhérent à ce genre de jeux est qu'on écrit n'importe où dans la mémoire.

Moralité, il vaut mieux soit utiliser des stream C++ (comme dans le poste suivant) soit être large sur ses allocations (genre toujours allouer une chaine de taille 256) et utiliser des fonctions "sûre" c'est à dire à qui l'on passe en paramètre la taille de la chaine comme sprintf_s, mais qui ne sont pas implémenté par bcp de compilo (seulement VC++ je crois, mais je pense que c'est quand même une norme et pas juste une extension microsoft).

Pour la dernière question : commande est un objet de type string (une chaîne C++), or system attend en argument une chaîne de caractère C (un tableau de caractères terminé par un zéro). c_str est une fonction membre de la classe string (une fonction associées à l'objet) qui permet de renvoyer une chaine de type C qui contient les même données que la string.

guyver2
guyver2
Niveau 10
22 janvier 2008 à 01:34:04

pour le depassement memoire je pensait que c'etait oblige d'en mettre dans les prog qui tournent sur windows... Comment executer du code malicieu facilement si on a pas ce genre de porte? ;)

godrik
godrik
Niveau 30
22 janvier 2008 à 09:19:21

guyver: c'était petit ca! :)

dnob, les fonctions dont tu parles ont en effet été intégré au standard apres que microsoft les aie rajouté dans leur lib.
Cependant, des fonctions equivalentes existent depuis longtemps dans la glibc. La "convention" est de rajouter un 'n' a la séparation des deux premiers mot du nom:

snprintf
strncat
strncpy
...

bizarement, je n'arrive pas a trouver la variante de scanf qui fait cela... a suivre.

argum2
argum2
Niveau 5
23 janvier 2008 à 22:55:16

bonsoir, je reviens vous voir d'une part pour vous dire que sa marche j'y arrive bien now^^

et d'autre part j'ai une question : (eh oui encore!!)

je voudrais executer une boucle genre for toutes les secondes!
mais je sais pas comment faire. Mon but est par ppm de creer un fond puis d'y inclure un disque symbolisant une planete et je voudrais al faire tourner donc executer par exemple 20 boucles par seconde.

je suppose que je me base sur l'horloge de l'ordi mais je sais pas faire..

la chose est equivalente sous lab view quand on met une horlage pour faire un relevé tous les 0.5sec par exemple. J'espere etre assez clair.

Merci d'avance!

guyver2
guyver2
Niveau 10
24 janvier 2008 à 13:32:01

regarde du coté de time.h
http://www.cplusplus.com/reference/clibrary/ctime/
en gros si tu veux attendre une demie seconde tu fais un truc du genre:

time_t t1, t2;
t1 = time();
/// fait tes calculs
...
t2 = time();
while(difftime(t1,t2)>0.5) t2 = time();

Bon cette methode est assez crade car elle contient une boucle d'attente active mais bon j'imagine que tu n'es pas dans un environement critique... Je t'aurais bien dit d'utiliser usleep() mais il me semble que ça n'existe pas sous windows

godrik
godrik
Niveau 30
24 janvier 2008 à 13:38:36

Sleep a une précision en millisecondes sous windows, ce qui devrait suffire pour obtenir la precision recherché d'une seconde.

argum2
argum2
Niveau 5
24 janvier 2008 à 17:30:41

sleep marche super bien!!!

par contre je precise certaines choses que j'ai remarqué
_il faut ecrire sleep avec un grand S Sleep
_il suffit d'ajouter(sous windows) #include<windows.h>

encore merci beaucoup!!!!!!j'y retourne!!!

godrik
godrik
Niveau 30
24 janvier 2008 à 18:20:24

le standard C définit la fonction sleep avec un s minuscule et l'API de windows le fait avec un S majuscule...
Probleme de convention... comme souvent.

dnob700
dnob700
Niveau 10
24 janvier 2008 à 20:25:30

sauf que ce n'est pas la même fonction. sleep prend un temps en seconde et Sleep un temps en milliseconde (comme la fonction standard usleep).

guyver2
guyver2
Niveau 10
24 janvier 2008 à 21:50:36

histoire de chipoter encore plus : usleep prend en un temps en microsecondes...

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Création de sites web
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment