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.

#1976 Le 18/09/2012, à 21:28

Shanx

Re : /* Topic des codeurs [7] */

Ah oui, en effet. J’ai du indenter après le c/c, du coup c’était déjà fait.

J’ai terminé mon premier jeu ! \o/ (tout dégueulasse, mais quand même !).


Mes randos : grande traversées des Alpes, de l'Islande, de la Corse, du Japon (en vélo), etc.
Traversée des États-Unis à pied

Hors ligne

#1977 Le 18/09/2012, à 21:29

Rolinh

Re : /* Topic des codeurs [7] */

Shanx a écrit :

(tout dégueulasse, mais quand même !).

Tu veux qu'on t'aide à le rendre propre? Histoire de prendre de bonnes habitudes...

Hors ligne

#1978 Le 18/09/2012, à 21:31

Shanx

Re : /* Topic des codeurs [7] */

Rolinh a écrit :
Shanx a écrit :

(tout dégueulasse, mais quand même !).

Tu veux qu'on t'aide à le rendre propre? Histoire de prendre de bonnes habitudes...

Volontiers. Pylade a raison, le prof ne me sanctionnera pas…


Mes randos : grande traversées des Alpes, de l'Islande, de la Corse, du Japon (en vélo), etc.
Traversée des États-Unis à pied

Hors ligne

#1979 Le 18/09/2012, à 21:43

Dr Le Rouge

Re : /* Topic des codeurs [7] */

Shanx a écrit :

Pylade a raison, le prof ne me sanctionnera pas…

Eeuuuh, garde une version faite « à sa manière » sous le coude quand même, hein hmm


C'est deux suites de Cauchy qui veulent aller à la soirée 'no limit'. Hélas, à l'entrée le videur leur dit : "désolé, c'est complet !".
mon site perso (π²/6.fr) et mon blog

Hors ligne

#1980 Le 18/09/2012, à 21:45

Shanx

Re : /* Topic des codeurs [7] */

Mais je fais ce truc pour moi, pas pour les cours…

Dernière modification par Shanx (Le 18/09/2012, à 22:06)


Mes randos : grande traversées des Alpes, de l'Islande, de la Corse, du Japon (en vélo), etc.
Traversée des États-Unis à pied

Hors ligne

#1981 Le 18/09/2012, à 21:49

Rolinh

Re : /* Topic des codeurs [7] */

On va corriger étape par étape alors.

Ici, si le joueur tape "a" par exemple, tu rentres dans une boucle infinie. En fait, comme le disait Pylade, scanf(3) pour récupérer l'input utilisateur c'est le mal. En fait, interagir avec un utilisateur = devoir prendre un maximum de précautions (l'utilisateur peut potentiellement faire n'importe quoi). Comme le suggérait Pylade, regarde du côté de fgets(3) (ou même getchar(3) pour le cas ci-dessous).

        do {
                printf("Combien de joueurs ? ");
                scanf("%d", &a);
                if (a != 1 && a != 2) {
                        printf("Un ou deux joueurs, pas plus, pas moins.\n");
                }
        } while (a != 1 && a != 2);

Ensuite, fais attention aux conversions implicites. time(3) retourne un time_t et srand(3) demande un unsigned int en paramètre.

Hors ligne

#1982 Le 18/09/2012, à 21:55

Rolinh

Re : /* Topic des codeurs [7] */

Le Rouge a écrit :
Shanx a écrit :

Pylade a raison, le prof ne me sanctionnera pas…

Eeuuuh, garde une version faite « à sa manière » sous le coude quand même, hein hmm

En même temps, le prof ne peut pas compter faux quelque chose de parfaitement juste s'il fait ce qui est demandé...

Hors ligne

#1983 Le 18/09/2012, à 22:00

The Uploader

Re : /* Topic des codeurs [7] */

Et s'il reproduit les erreurs du prof (int main() O_o ) pendant tout un semestre, il risque de les garder.

Autant avoir de bonnes habitudes tout de suite.

Si le prof compte faux quelque chose de "trop juste" pour lui, c'est juste qu'il arrive pas à lire un code propre, et là c'est grave.

Dernière modification par The Uploader (Le 18/09/2012, à 22:02)


- Oldies PC : Intel Pentium 3 @ 800 Mhz sur CM ASUS P2B-F, GeForce 4 Ti4800 SE, Disque Dur Hitachi 160 Go, 512 Mo de RAM, 3DFX Voodoo 2, Sound Blaster 16 ISA PnP, Windows 98 SE / XP)
- Desktop : Intel Core i7 6700K @ 4 GHz sur CM ASUS Z170-P, GeForce GTX 1070, SSD Samsung 850 EVO 1 To, 16 Go de RAM, Disque Dur Seagate Barracuda 3 To, Windows 10

Hors ligne

#1984 Le 19/09/2012, à 07:24

grim7reaper

Re : /* Topic des codeurs [7] */

@Shanx : Bon, j’ai lu ton code plus attentivement.
Quelques remarques :
- Noms de variables en français, c'est pas lisible et carrément à éviter
- Si tu veux afficher une chaîne de caractères, utilise puts (put string) au lieu de printf (print format).
Simple question de sémantique (sur laquelle beaucoup de gens s’assoient…).
Et si vraiment tu veux rester sur printf, tu fais

printf("%s", "Combien de joueurs ? ");

pas

printf("Combien de joueurs ? ");

Mais bon, ça reste plus moche que puts ou fputs.
- je ne vais pas revenir sur l’usage de scanf, d’autres l’ont déjà fait.
- sinon je remplacerais ton do/while, qui ressemble en gros à ça

do {
    lecture();
    if(pas ok)
        print blabla;
} while (pas ok);

par

lecture();
while(pas ok)
{
    print blabla;
    lecture();    
}

Ça évite de répéter le test deux fois par itération, mais tu fais comme tu le sens.
- La réduction d’intervalle pour la sortie du PRNG à coup de modulo, c’est pas jojo (thsirtman a fait un article dessus).

Dernière modification par grim7reaper (Le 19/09/2012, à 09:47)

Hors ligne

#1985 Le 19/09/2012, à 11:00

The Uploader

Re : /* Topic des codeurs [7] */


- Oldies PC : Intel Pentium 3 @ 800 Mhz sur CM ASUS P2B-F, GeForce 4 Ti4800 SE, Disque Dur Hitachi 160 Go, 512 Mo de RAM, 3DFX Voodoo 2, Sound Blaster 16 ISA PnP, Windows 98 SE / XP)
- Desktop : Intel Core i7 6700K @ 4 GHz sur CM ASUS Z170-P, GeForce GTX 1070, SSD Samsung 850 EVO 1 To, 16 Go de RAM, Disque Dur Seagate Barracuda 3 To, Windows 10

Hors ligne

#1986 Le 19/09/2012, à 11:27

Titus007

Re : /* Topic des codeurs [7] */

Tiens, je profite des questions de Shanx pour poser une petite question qui me tracasse :

Dans son code, à aucun moment il ne définit EXIT_SUCCESS. Est-ce que c'est une constante « universelle » du C (qui est implicite lors de la compilation) ?

(Je demande parce que mes quelques rares cours de C, on faisait un

return 0;

)


3% of people today would die if facebook was completely destroyed, 2.7% wouldn't. If you are one of the 0.03% that would be laughing, copy and paste this to your signature. If you are one of the 12% who would mourn the dead, don't. If you are among the 60% of people who don't have Internet, well... and if you don't care, do whatever the f... you want !

Hors ligne

#1987 Le 19/09/2012, à 12:31

grim7reaper

Re : /* Topic des codeurs [7] */

C’est définie dans stdlib.h
Et EXIT_SUCCESS vaut en général (pour le moment, dans tout les cas que j’ai vu) 0.
Mais le standard assure juste que

ISO/IEC 9899:TC3 a écrit :

EXIT_FAILURE and EXIT_SUCCESS which expand to integer constant expressions that can be used as the argument to the exit function to return unsuccessful or successful termination status, respectively, to the host environment;

Donc ça peut être différent de 0 sur certaines plateformes.

Dernière modification par grim7reaper (Le 19/09/2012, à 12:35)

Hors ligne

#1989 Le 19/09/2012, à 12:53

The Uploader

Re : /* Topic des codeurs [7] */

smile

Defcon 18 - PowerShell... omfg
yikes

(sérieux y'a de quoi remplir ses journées à apprendre avec toutes ces vidéos ! Mais j'arrête là sinon je vais flooder le fil tongue )

Dernière modification par The Uploader (Le 19/09/2012, à 12:57)


- Oldies PC : Intel Pentium 3 @ 800 Mhz sur CM ASUS P2B-F, GeForce 4 Ti4800 SE, Disque Dur Hitachi 160 Go, 512 Mo de RAM, 3DFX Voodoo 2, Sound Blaster 16 ISA PnP, Windows 98 SE / XP)
- Desktop : Intel Core i7 6700K @ 4 GHz sur CM ASUS Z170-P, GeForce GTX 1070, SSD Samsung 850 EVO 1 To, 16 Go de RAM, Disque Dur Seagate Barracuda 3 To, Windows 10

Hors ligne

#1990 Le 19/09/2012, à 14:42

Titus007

Re : /* Topic des codeurs [7] */

grim7reaper a écrit :

C’est définie dans stdlib.h
Et EXIT_SUCCESS vaut en général (pour le moment, dans tout les cas que j’ai vu) 0.
[...]
Donc ça peut être différent de 0 sur certaines plateformes.

Si EXIT_SUCCESS est défini dans stdlib.h pour le C, à ce moment-là, ça veut dire que sur d'autres plateformes (ie un autre langage de programmation ?) on peut être amené à utiliser une autre libraire que stdlib.h pour avoir une autre valeur que 0 ?


3% of people today would die if facebook was completely destroyed, 2.7% wouldn't. If you are one of the 0.03% that would be laughing, copy and paste this to your signature. If you are one of the 12% who would mourn the dead, don't. If you are among the 60% of people who don't have Internet, well... and if you don't care, do whatever the f... you want !

Hors ligne

#1991 Le 19/09/2012, à 14:48

grim7reaper

Re : /* Topic des codeurs [7] */

Par plateforme, j’entends plus un truc du genre OS, pas le langage de programmation.
Et non, si la valeur doit être différente de 0, tu inclueras toujours stdlib.h mais EXIT_SUCCESS y sera définit avec une autre valeur. Toi, tu n’as pas à t’en occuper.
D’où l’intérêt théorique d’utiliser EXIT_SUCCESS au lieu de 0 pour les return de main, pour être portable.
En pratique, je l’ai toujours vu à 0 cela dit…

Hors ligne

#1992 Le 19/09/2012, à 16:01

Titus007

Re : /* Topic des codeurs [7] */

Ok merci pour toutes ces informations !

J'imagine qu'il doit y avoir pas mal de "constantes" dans le genre qui sont définies par une libraire. Y a moyen d'en voir une liste quelque part ? En lisant directement les différentes librairies ?


3% of people today would die if facebook was completely destroyed, 2.7% wouldn't. If you are one of the 0.03% that would be laughing, copy and paste this to your signature. If you are one of the 12% who would mourn the dead, don't. If you are among the 60% of people who don't have Internet, well... and if you don't care, do whatever the f... you want !

Hors ligne

#1993 Le 19/09/2012, à 16:09

grim7reaper

Re : /* Topic des codeurs [7] */

De rien.

Dans la documentation de la bibliothèque si elle existe et qu’elle est bien faite.
Pour la bibliothèque standard du C, tu peux lire le standard (enfin le dernier brouillon, le standard lui-même étant payant), partie « 7. Library »
Bien que parfois indigeste, surtout pour un débutant, il est très complet. Après, d’autres références plus « lisible » sont peut-être dispo sur le net.

Lire les sources, des fois ça fonctionne bien aussi. Mais je te conseille d’éviter de le faire pour la GNU libc…

Dernière modification par grim7reaper (Le 19/09/2012, à 16:11)

Hors ligne

#1994 Le 19/09/2012, à 18:15

Titus007

Re : /* Topic des codeurs [7] */

grim7reaper a écrit :

De rien.

Dans la documentation de la bibliothèque si elle existe et qu’elle est bien faite.
Pour la bibliothèque standard du C, tu peux lire le standard (enfin le dernier brouillon, le standard lui-même étant payant), partie « 7. Library »
Bien que parfois indigeste, surtout pour un débutant, il est très complet. Après, d’autres références plus « lisible » sont peut-être dispo sur le net.

Lire les sources, des fois ça fonctionne bien aussi. Mais je te conseille d’éviter de le faire pour la GNU libc…

Merci encore !
Très intéressant le standard, mais en effet un peu indigeste. Une petite question si je peux : quelle signification a le N qui apparaît dans plusieurs "constante" ?


3% of people today would die if facebook was completely destroyed, 2.7% wouldn't. If you are one of the 0.03% that would be laughing, copy and paste this to your signature. If you are one of the 12% who would mourn the dead, don't. If you are among the 60% of people who don't have Internet, well... and if you don't care, do whatever the f... you want !

Hors ligne

#1995 Le 19/09/2012, à 20:39

Elzen

Re : /* Topic des codeurs [7] */

Quelqu'un a déjà utilisé Poppler ? Je n'dois pas faire ce qu'il faut, j'ai des segfault à peu près chaque fois que j'essaye de toucher un truc…

Cette fonction est censée renvoyer un aperçu du fichier à la taille demandée. Dans l'état actuel, elle renvoie un espèce de carré blanc avec du bruit. Si quelqu'un voit ce qui ne va pas…

import os, gtk, poppler

def read_file_glimpse(fpath, width, height):
	fpath = "file://"+os.path.abspath(fpath)
	page = poppler.document_new_from_file(fpath, None).get_page(0)
	surface = page.get_image(0)
	pixmap = gtk.gdk.Pixmap(None, width, height, 24)
	cr = pixmap.cairo_create()
	cr.set_source_surface(surface, 0, 0)
	cr.paint()
	pixbuf = gtk.gdk.Pixbuf (gtk.gdk.COLORSPACE_RGB, True, 8, width, height)
	return pixbuf.get_from_drawable(pixmap, gtk.gdk.colormap_get_system(), 0, 0, 0, 0, width, height)

(Lignes de plus de 80 caractères, je sais, ça j'm'en occupe une fois que j'ai un truc qui marche à peu près tongue)

Hors ligne

#1996 Le 19/09/2012, à 22:30

The Uploader

Re : /* Topic des codeurs [7] */

Les lignes de plus de 80 caractères, ça me gêne pas, perso, tant que ça reste lisible et relativement court (plus ou moins 20% autour de cette limite).
Appliquer cette règle comme une "limite dure", je trouve que c'est une perte de temps pour un code pas forcément plus lisible.
Par contre, ce qui est peut-être plus inquiétant, c'est une méthode qui semble prendre pas moins de 8 paramètres (la dernière ligne). yikes

Dernière modification par The Uploader (Le 19/09/2012, à 22:36)


- Oldies PC : Intel Pentium 3 @ 800 Mhz sur CM ASUS P2B-F, GeForce 4 Ti4800 SE, Disque Dur Hitachi 160 Go, 512 Mo de RAM, 3DFX Voodoo 2, Sound Blaster 16 ISA PnP, Windows 98 SE / XP)
- Desktop : Intel Core i7 6700K @ 4 GHz sur CM ASUS Z170-P, GeForce GTX 1070, SSD Samsung 850 EVO 1 To, 16 Go de RAM, Disque Dur Seagate Barracuda 3 To, Windows 10

Hors ligne

#1997 Le 19/09/2012, à 22:44

Mindiell

Re : /* Topic des codeurs [7] */

C'est bien un fichier PD Fque tu cherches à ouvrir ?
Et à quoi sert cr au final ? Tu l'initialises et tout, mais tu ne l'utilises pas...

Tu peux documenter ton code ? tongue

Dernière modification par Mindiell (Le 19/09/2012, à 22:45)

Hors ligne

#1998 Le 20/09/2012, à 00:25

HP

Re : /* Topic des codeurs [7] */

The Uploader a écrit :

Par contre, ce qui est peut-être plus inquiétant, c'est une méthode qui semble prendre pas moins de 8 paramètres (la dernière ligne). yikes

En GTK (et simili, je pense à zeitgeist.datamodel, par exemple), c'est loin d'être inhabituel, malheureusement…


cat /dev/urandom >/dev/null 2>&1 #github

Hors ligne

#1999 Le 20/09/2012, à 00:43

Elzen

Re : /* Topic des codeurs [7] */

Mindiell a écrit :

C'est bien un fichier PD Fque tu cherches à ouvrir ?

C'est bien un pdf, et jusqu'à l'appel à get_page(), ça a l'air de marcher (ensuite, moins).

Mindiell a écrit :

Et à quoi sert cr au final ? Tu l'initialises et tout, mais tu ne l'utilises pas...

Bah, si, j'm'en sers : je fais d'abord un set_surface() pour lui dire d'utiliser la cairo.Surface renvoyée par poppler comme source, puis je fais un paint() pour tracer cette surface sur le pixmap sur lequel je travaille.
Enfin, c'est ce que j'ai compris des exemples pas commentés que j'ai trouvé sur le net, si ça se trouve, ç'n'est pas bon non plus hmm

Mindiell a écrit :

Tu peux documenter ton code ? tongue

Trois premières lignes de la fonction : je récupère un objet cairo.Surface à partir du fichier PDF lu par poppler (c'est censé être la contribution de poppler, de me permettre de récupérer ça) (et c'est aussi la partie plantogène qui déclenche une segfault dès que j'essaye de changer un petit détail).
Les quatre lignes suivantes, en théorie, je fabrique un objet gdk.Pixmap et je transfère la cairo.Surface dedans, pour pouvoir réutiliser l'image obtenue dans GTK. Exemple de code repompé sur le net, j'ai l'impression de comprendre en lisant, mais il est possible que ça ne marche pas comme je l'imagine.
Enfin, les deux dernières lignes, je récupère un gdk.Pixbuf depuis le Pixmap, vu que c'est d'un Pixbuf que j'ai besoin à l'extérieur. Ça, j'm'en sers déjà ailleurs, et j'suis à peu près sûr que ça marche.

Dernière modification par ArkSeth (Le 20/09/2012, à 00:45)

Hors ligne

#2000 Le 20/09/2012, à 01:57

Steap

Re : /* Topic des codeurs [7] */

@ArkSeth : j'ai essayé ton code smile

Effectivement, ça segfault sur :

surface = page.get_image(0)

GDB nous dit :

INT_cairo_surface_status (surface=0x0) at /tmp/buildd/cairo-1.12.2/src/cairo-surface.c:259

surface est sans doute déréférencé, et comme il est NULL, bang. Pour pousser un peu plus loin tout ça, regardons le wrapper :

   │580     static PyObject *                                                                                            │
   │581     _wrap_poppler_page_get_image(PyGObject *self,                                                                │
   │582                                  PyObject *args,                                                                 │
   │583                                  PyObject *kwargs)                                                               │
B+>│584     {                                                                                                            │
   │585         static char     *kwlist[] = { "image_id", NULL };                                                        │
   │586         gint            image_id;                                                                                │
   │587         cairo_surface_t *surface;                                                                                │
   │588                                                                                                                  │
   │589         if (!PyArg_ParseTupleAndKeywords(args, kwargs,                                                           │
   │590                                          "i:Page.get_image", kwlist,                                             │
   │591                                          &image_id)) {                                                           │
   │592             return NULL;                                                                                         │
   │593         }                                                                                                        │
   │594                                                                                                                  │
   │595         surface = poppler_page_get_image(POPPLER_PAGE(self->obj), image_id);                                     │
   │596                                                                                                                  │
   │597     #if PYCAIRO_VERSION_HEX >= 0x1010600                                                                         │
   │598         return PycairoSurface_FromSurface(surface, NULL);                                                        │
   │599     #else                                                                                                        │
   │600         return PycairoSurface_FromSurface(surface, NULL, NULL);                                                  │
   │601     #endif                                                                                                       │
   │602     } 

On remarque que surface est effectivement NULL quand on arrive à l'appel de PycairoSurface_FromSurface(). Si on plonge dans poppler_page_get_image() :

   │998     cairo_surface_t *                                                                                            │
   │999     poppler_page_get_image (PopplerPage *page,                                                                   │
   │1000                            gint         image_id)                                                               │
B+>│1001    {                                                                                                            │
   │1002      CairoImageOutputDev *out;                                                                                  │
   │1003      cairo_surface_t *image;                                                                                    │
   │1004                                                                                                                 │
   │1005      g_return_val_if_fail (POPPLER_IS_PAGE (page), NULL);                                                       │
   │1006                                                                                                                 │
   │1007      out = poppler_page_get_image_output_dev (page,                                                             │
   │1008                                               image_draw_decide_cb,                                             │
   │1009                                               GINT_TO_POINTER (image_id));                                      │
   │1010                                                                                                                 │
   │1011      if (image_id >= out->getNumImages ()) {                                                                    │
   │1012        delete out;                                                                                              │
   │1013                                                                                                                 │
   │1014        return NULL;                                                                                             │
   │1015      } 
...

En avançant pas à pas, on passe bien dans le if (...). image_id vaut 0. Donc out->getNumImages() retourne sans doute 0 smile


Bref, à ce stade, mes conclusions :

1) Tu ne dois sans doute pas pouvoir appeler page.get_image(0) (d'ailleurs, page.get_image_mapping() retourne une liste vide, serait-ce lié ?)
2) Il faudrait sans doute patcher _wrap_poppler_page_get_image() pour que ça devienne :

...
surface = poppler_page_get_image(POPPLER_PAGE(self->obj), image_id); 
if (surface == NULL)
    return NULL;
...

Pour que tu puisses, en Python, écrire "surface = page.get_image(0)" et tester si surface vaut None.
Si j'ai le temps, je testerai ce patch.




Bon sinon, sous Debian, on peut installer les paquets libfoo-dbg pour avoir les symboles de debug, mais parfois ça ne suffit pas à lister le code dans GDB (par exemple là, j'ai du faire quelques "apt-get source" et ensuite utiliser "directory" dans GDB). Pourquoi ?



Je suis revenu de chez Google : ça déchire !


GNU Guix, un gestionnaire de paquets fonctionnel.

Hors ligne