On peut savoir d'où tu sors le nombre 255? montre ton code!
On peut savoir d'où tu sors le nombre 255? montre ton code!
"The quieter you become, the more you are able to hear"
"Plus vous êtes silencieux, plus vous êtes capable d'entendre"
Si tu parles d'un errno, tu peux directement afficher sa description avec perror.
Si tu parles d'un retour de fonction, il faut regarder son mode d'emploi.
Si tu parles d'un retour de process, il faut regarder son mode d'emploi.
c'est un retour de fonction, desole
je lui demandais de me retourner -1, mais il m'affichait 255, du coup, j'ai pas bien saisi, en changeant mon code d'erreur, j'ai compris, mon programme ne sort pas avec des exceptions, tout est detruit correctement
mais, ca m'intrigue quand meme, les fichiers que j'essaie d'ouvrir sont tous integres
mais il arrete l'ouverture toujours au 300' fichier
a vrai dire, si je les ouvre avec fopen, ca marche nickel, mais je dois les ouvrir avec des routines speciales (c'est un format d'image specail et les images sont assez volumineuses)
est ce que quelqu'un pourrais me dire ce qui peut empecher l'ouverture d'un fichier?
Bonjour,
Avant d'ouvrir un fichier, fermez vous le(s) précédant(s) ?
Je ne saisis pas tout, mais un -1 qui se transforme en 255, c'est la valeur -1 qu'on affiche comme un unsigned char.je lui demandais de me retourner -1, mais il m'affichait 255, du coup, j'ai pas bien saisi, en changeant mon code d'erreur, j'ai compris, mon programme ne sort pas avec des exceptions, tout est detruit correctement
merci pour l'explication mais j'ai compris pour le 255
pour les fichiers, justement, je dois les laisser tous ouverts
c le but, car, sinon je deverais faire plusieurs ouvertures fermetures, et ca couterais enormement en temps de calcul
Le problème, c'est qu'il y a une limite au nombre de fichiers pouvant être ouverts simultanément...
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".
Consultant indépendant.
Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
C, Fortran, XWindow/Motif, Java
Je ne réponds pas aux MP techniques
oui, certainement, je deverais les fermer ds pas longtemps,
mais pour pouvoir tirer profit de mes images, je dois les ouvrir simultanement pour pouvoir caculer leur intersections
sinon, je deverais en ouvrir 4 a chaque fois
ce qui me fera (n-1)(n-2) ouverture? fermeture de fichiers pour 2*n images ( un fichier va tjrs de pair avec un autre)
svp, vous pouvez me dire combien de fichiers je peux ouvrir au max? et si ca depend reellement e la taille ou juste du nombre
car, quand je fais de fopen/ fclose ca ne me crache pas l'erreur !!
merci de vouloir m'aider car c'est vraiment urgent
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".
Consultant indépendant.
Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
C, Fortran, XWindow/Motif, Java
Je ne réponds pas aux MP techniques
Bonsoir
Vous n'avez pas précisé l'OS que vous utilisez mais il y a des limitations dans stdio/fopen qui pourraient expliquer ce comportement (champ codé sur un unsigned char).
Essayez d'utiliser "open" à la place pour voir si vous avez la même erreur.
Cordialement
- W
PS: Je suis quand même curieux quant à la nécessité de garder tout ces fichiers ouverts avant de commencer à faire qqc avec leur contenu...
j'explique mon probleme:
je dois calculer l'intersection entre chaque deux image de mon dossier, et donc je dois ouvrir pour chaque image toutes les autres images ( je cree un systemem a resoudre pour des fins bien particulieres que j'expliquerais plus tard si ca vous interesse)
comme optimisation, une image prise en mode maitre (si on peut appeler ca comme ca) ne sera plus re-ouverte
donc au lieux de faire n*n ouverture
on fera (n-1)(n-2) ouvertures/fermeture
mais ca reste quand meme enorme de reouvrir a chaque fois les fichiers, d'autant plus que je dois travailler avec bcp d'images a la fois
si vous avez une methode optimisee pour l'ouverture de ces fichiers la, je serais vraiment prenant
merci d'avance
alors je travaille sous linux et unix et donc je dois tout ecrire en C posix, qui pourrais eventuellement etre compile sus windows, mac..
Pour comparer les images, il va falloir lire(et relire) le contenu des fichiers... C'est ce qui va couter le plus cher (en temps d'horloge) et je ne vois pas trop de gains côté 'garder les fichiers ouverts' - il y en a mais ca me semble négligeable par rapport au reste du boulot.
Par contre, je ne sais pas quelle est la taille de vos fichiers mais plutôt que de vous contenter de les 'ouvrir' vous pourriez aussi les mapper en mémoire (voir mmap). Dans ce cas, votre image devient tableau en mémoire.
=> un environnement 64 bits pourrait aider...
En fonction de la mémoire physique disponible, vous pourrez alors éviter de relire le contenu des fichiers. S'il n'y a pas assez de mémoire, l'OS relira les pages sur disque pour vous.
Vous pouvez aussi paralléliser les comparaisons en créant un pool de X threads (en fonction du nombre de CPUs disponibles) pour effectuer les N * (N - 1) comparaisons.
-W
PS: est-ce qu'open fait mieux que fopen
justement, on m'a conseille le mmap, mais le probleme est que je ne sais pas trop l'utiliser
...
en plus mes images sont assez volumineuses (pour le moment elles sont de taille 850*450 de 32 bits/pixel)
ces images la sont des miniature de ce que mon programme doit prendre en compte
d'autre part, j'ai l'entete au debut de l'image, sachant qu'il est un peu complexe aussi
mais c'est vrai, que je pourrais faire une premier ouverture pour trouver les parametres avec les bibliothques existantes, apres, je fait le mapping de ce fichier a partir du debut de ses donnees en memoire et je le ferme et comme ca j'aurais tout en memoire
ca vous semble interessant comme solution?
svp, si vous avez des idees, je suis prenante
le parallelilisme, oui, je deverais voir comment ca marche aussi , les machines sont assez puissantes
C'est assez basique et vous devriez trouver des exemples partout.
Notez que sous Windows, il vous faudra utiliser d'autres primitives.
Ceci dit, c'est une dizaine de ligne de code qui mettent en musique 2/3 primitives systèmes. Ce n'est quand même pas la mer à boire...
Mais pour l'instant, ce n'est pas le sujet.
850*450*4 = 1475 KB = 1.5 MB * 360 = 531 MB ou 0,5 GB
Si vous utilisez mmap, vous aller mettre en correspondance des pages mémoire avec des blocks disques.
Les en-têtes, il faudra les compter dans la mémoire nécessaire.
Intéressant?
Pour l'instant, je ne sais pas ;-(
Essayer d'écrire les opérations de haut niveau que vous devriez effectuer pour comparer deux images en faisant:
- des accès disques (stdio/fread)
- des accès à un tableau mémoire (mmap)
Si vous faites vos lectures par buffers de 128Ko, vous allez lire une image en 12/14 EntréeSortie. Comptons 5ms pour faire une ES, ca fait: 120/140 ms (pour comparer, on en lit 2).
Nous avons 360 * 359 = 12924 comparaisons.
Multiplié par : 120 ms => 4,3 heures juste pour faire les ES.
Avec mmap et de la RAM vous le lirez les images qu'une seule fois...
Vous ferez autant de comparaisons mais 359 fois moins de lectures disques.
Sur le papier et si je ne me suis pas planté...
C'est sans doute intéressant.
Je taille à la louche après il faut faire le même genre de calculs sur les autres ressources de votre système pour voir quelle solution parait la mieux.
Puis, mettre tout ces petits calculs en cohérence.
Enfin, faire des tests pour valider vos hypothèses.
Une fois que vous serez convaincue que ca fait du sens d'utiliser mmap et un pool de threads, vous vous y mettrez avec plaisir ;-(
ok, je me pencherais sur cette facon de faire, meme si je n'en ai jamais fait avant!!
si vous avez sous la main des cours bien expliques ou des liens interessants je suis bien prenant
merci
Non hélas, je n'ai pas de cours.
Ceci dit, lorsqu'on fait de l'informatique, il faut se recoller à des dimensions physiques pour visualiser/jauger ce dont il en retourne.
Ci dessous un exemple d'utilisation de mmap codé vite fait.
- W
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
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81 #include <sys/types.h> #include <sys/stat.h> #include <sys/mman.h> /* mmap() is defined in this header */ #include <unistd.h> # include <fcntl.h> # include <stdlib.h> /* map_image * map image contained in file into memory * returns base address of loaded file or NULL if any error was caugth */ typedef struct file_map { int fd; char *address; long length; } FILE_MAP; FILE_MAP *file_mmap (char *filename) { FILE_MAP *map; int fd; struct stat statbuf; char *address = 0; fd = open (filename, O_RDONLY); if (fd < 0) { perror ("failed to open file"); return 0; } if (fstat (fd, &statbuf) < 0) { perror ("fstat error"); return 0; } /* tbd MAP_POPULATE | MAP_LOCKED */ address = mmap (0, statbuf.st_size, PROT_READ, MAP_SHARED, fd, 0); if (address == (caddr_t) - 1) { perror ("mmap error"); return 0; } map = (FILE_MAP *) malloc (sizeof (FILE_MAP)); /* tbd, check for memory exhaustion */ map->fd = fd; map->address = address; map->length = statbuf.st_size; return map; } void file_unmap (FILE_MAP * map) { if (munmap (map->address, map->length) < 0) { perror ("munmap failed"); } if (close (map->fd) < 0) { perror ("close error"); } free (map); return; } int main (int argc, char *argv[]) { FILE_MAP *map; map = file_mmap (argv[1]); file_unmap (map); } /* main */
Pas de Wi-Fi à la maison : CPL
Pour connaitre les limites de ton environnement tu as la commande ulimit. Il existe un équivalent en c.
Tu pourras éventuellement augmenter le nombre de fichiers ouverts possibles.
Au delà de cette limite, je ne sais pas ce qu'impose l'os.
si j'ai opte pour l'ouverture de tous les fichiers en meme temps, c'est bien parce que mon tuteur le veut ainsi, car, ca le derange de faire des ouvertures/fermetures
mais lui meme voulait que je travaille avec le mmap, sauf que si j'utilise cette facons la, cela voudra dire, que je deverais recoder toute une bibliotheque pour lire les images ".fits" ce qui est assez complexe, alors, que moi je dois d'avantage me concentrer sur le traitement du fond du ciel!!
les bibliotheques sont la:
une, simple est bien documentee, mais helas, pas adaptee a mon probleme et l'autre bien optimisee, basee sur mmap, mais pas documentee
voila, pourquoi je tergeverse a reecrire quelque chose deja existant , alors que j'ai beaucoup de travail a cote
il n 'y a pas de conception, ni d'architecture,
ce que je dois faire est comme suit:
je dois calculer la position de chaque sous image dans l'image globale
pour chaque couple, calculer l'intersection et en deduire des parametre
constituer un systeme d'equations lineaireset ainsi soustraire chaque Xi de l'image i, afin de pouvoir rassembler les images en un seul morceau, en éliminant le maximum de discontinuitéA*X=B
voila, si vous avez des idees, tout est bienvenu sur ce poste
je suis toujours en quete de la meilleure facon a gerer les fichiers, car c'est le vrai probleme, le reste etant des modeles mathematiques ou je m'en sors pas mal
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager