Non, justement, le but n'est pas de virer le plus ancien, mais de moins déloter. Donc d'utiliser le plus de boites complètes possible
Non, justement, le but n'est pas de virer le plus ancien, mais de moins déloter. Donc d'utiliser le plus de boites complètes possible
Normalement, tout est bon, et quand je bricole des trucs sensibles, je passe par des lock.
Mais d'un côté je me rappel que j'ai contourné salement un bug l'autre jour (j'avais une démo à faire le lendemain), ça pourrait être lié... Je vais voir ça.
J'y ai pensé mais j'ai déjà 4 mois de retard parce que j'ai presque tout recommencé.
(C'est un (gros) ajout à un soft que j'ai fait l'an dernier, soft absolument bancal en partie à cause de mauvais choix de matériel d'un collègue (ce qui n'empêche pas d'avoir un rendement de 99.71% en prod ). Du coup c'était hors de question que je rajoute des trucs dessus en l'état alors qu'il y a déjà pas de raison pour que ça marche actuellement...).
J'ai un problème, sûrement un truc tout bête, mais je ne le vois pas et ça me pète gentiment les rognons.
J'ai une matrice NxM d'unsigned char. Connaissant l'adresse d'un élément, je voudrais récupérer ses indices de ligne et de colonne dans un vecteur de taille 2.
Voilà la portion de code :
Et voilà ce que j'obtiens en sortie :Code:void getIndexes(unsigned char *pixel, unsigned char **pixels, int width, int height, int *indexes) { int i = 0; int j = 0; printf("adresse du pixel recherché : %d\n", pixel); while ((pixel != &(pixels[i][j])) && (i < height)) { j = 0; while ((pixel != &(pixels[i][j])) && (j < width)) { printf("adresse de pixels[%d][%d] : %d\n", i, j, &(pixels[i][j])); ++j; } ++i; } indexes[0] = i; indexes[1] = j; }
La matrice en entrée (mais le soucis est le même avec d'autres) :Code:adresse du pixel recherché : 8990851 adresse de pixels[0][0] : 8990816 adresse de pixels[0][1] : 8990817 adresse de pixels[0][2] : 8990818 adresse de pixels[0][3] : 8990819 adresse de pixels[1][0] : 8990848 adresse de pixels[1][1] : 8990849 adresse de pixels[1][2] : 8990850 adresse de pixels[2][0] : 8990880 adresse de pixels[2][1] : 8990881 adresse de pixels[2][2] : 8990882 adresse de pixels[2][3] : 8990883 adresse de pixels[3][0] : 8990912 adresse de pixels[3][1] : 8990913 adresse de pixels[3][2] : 8990914 adresse de pixels[3][3] : 8990915 ligne = 4 ; colonne = 4
0000
0004
0000
0000
pixel, c'est l'adresse de la cellule à 4.
pixels, c'est la matrice.
indexes, c'est le tableau de retour.
La recherche se fait, et au moment de trouver l'élément, il passe à la ligne suivante. C'est hallucinant.
Tu es obligé de traiter les commandes dans l'ordre, sans tenir compte des commandes futures ?
Globalement, ça ressemble un peu au problème de Bin Packing ou Cutting Stock, sauf que tu peux récupérer les chutes.
Par contre localement c'est plutôt une variante (triviale) du Knapsack. Une solution localement optimale est effectivement de toujours prendre les boîtes les plus grosses (celles qui sont pleines).
Pour l'implémentation efficace de l'algo, voir la suggestion de Sp1d3r...
Par contre, tu as aussi implicitement une contrainte sur le nombre de boîtes entamées qui trainent ? Parce que sinon c'est facile, tant qu'il te reste des boîtes pleines tu minimises le nombre de déballages, et au pire quand le stock est bas tu te retrouves avec une ou deux commandes chiantes qui t'obligent à racler tous les fonds de tiroirs. Par contre ton entrepôt va être plein de caisses quasi-vides. Tu peux exprimer cette contrainte dans l'énoncé de problème ?
@Deathdigger : t'as pas possibilité d'utiliser du CLP ? C'est typiquement ce qu'il faut pour ce genre de problème (et plus optimisé que les algo fait main).
Les contraintes techniques sont assez importantes, c'est du Java "fermé", mais je vais déjà voir avec ce qui a été proposé
Mais ouais, un des effets indésirables, c'est de se retrouver avec plein de boites entamées
Ton code a l'air "correct" (bien que très sale), tu cherches tout simplement un pixel qui n'est pas dans la matrice ?
EDIT : ouai en fait non, puisque dans ton for externe tu cherches le pixel alors que j == width pour les lignes >= 1
---------- Post added at 21h59 ---------- Previous post was at 21h51 ----------
Je la refais maintenant que mes yeux ne saignent plus : il faut séparer le code qui vérifie si tu es tombé sur le bon pixel et mettre un break dedans.
C'est assez simple à comprendre, ton code trouve le bon pixel dans la condition du while interne, du coup ce while s'arrête, puis il y a le i++, et à cause de ce i++ il ne trouve plus le pixel dans le while externe et continue à chercher.
Rust fanboy
La recherche foire quelque part, sinon la ligne en gras devrait apparaître et donc l'élément être trouvé. Or, ce n'est pas le cas.Code:adresse du pixel recherché : 8990851 adresse de pixels[0][0] : 8990816 adresse de pixels[0][1] : 8990817 adresse de pixels[0][2] : 8990818 adresse de pixels[0][3] : 8990819 adresse de pixels[1][0] : 8990848 adresse de pixels[1][1] : 8990849 adresse de pixels[1][2] : 8990850 adresse de pixels[1][2] : 8990851 adresse de pixels[2][0] : 8990880 adresse de pixels[2][1] : 8990881 adresse de pixels[2][2] : 8990882 adresse de pixels[2][3] : 8990883 adresse de pixels[3][0] : 8990912 adresse de pixels[3][1] : 8990913 adresse de pixels[3][2] : 8990914 adresse de pixels[3][3] : 8990915
Tu écris clairement "while (pas le bon pixel) { printf("adresse de pixels blablabla") }", il n'y aucun moyen que la ligne en gras s'affiche.
Rust fanboy
Dans un code propre il est très simple de comprendre quelle est la logique du code, c'est à dire ce qu'il fait, et l'ordre dans lequel il le fait.
Le fait que tu fasses une comparaison inutile et que tu n'aies pas détecté le bug dans la logique du code montre qu'il y a un problème à ce niveau-là.
---------- Post added at 22h41 ---------- Previous post was at 22h38 ----------
C'est très subjectif, mais un truc comme ça est bien plus lisible d'après moi :
Code:void getIndexes(unsigned char *pixel, unsigned char **pixels, int width, int height, int *indexes) { for (int i = 0; i < height; ++i) { for (int j = 0; j < width; ++j) { // est-ce que c'est le bon pixel? if (pixel == &(pixels[i][j])) { indexes[0] = i; indexes[1] = j; return; } } } // lapin trouvé indexes[0] = height; indexes[1] = width; }
Rust fanboy
C'est très subjectif, mais un truc comme ça est bien plus lisible d'après moi :
Code:void getIndexes(unsigned char *pixel, unsigned char **pixels, int width, int height, int *indexes) { int i = (pixel - pixels[0]) / width; int j = (pixel - pixels[0]) % width; if(i >= 0 && i < height) // sic { indexes[0] = i; indexes[1] = j; } else { // lapin trouvé indexes[0] = height; indexes[1] = width; } }
(L'énoncé dit que pixels est une matrice 2D, pas un tableau de tableaux. Sinon il faut soit boucler sur i, soit fouetter avec des orties le responsable de l'allocation du tableau...)
Euh, on a dit ERP, donc CLP faut pas trop y compter.
Tu es dans du multi-critère : utiliser des boites (des lots je suppose) entièrement peut aller à l'encontre d'utiliser les stocks les plus vieux. Et il faut faire un truc simple parce que si les utilisateurs ne comprennent pas la stratégie d'affectation de stock ça va pas être facile pour les consultants.
Tu peux prioriser les contraintes : tu utilise les stocks les plus anciens (stratégie FIFO donc) en 1er, et à age équivalent tu fais ton mini sac à dos pour utiliser le moins de boites possible. Ou tu te fixes un age maxi pour le stock que tu utilises etc...
En bref, tu retournes vers les fonctionnels (ton chef de produit ou un truc dans ce genre) et tu leur fais spécifier clairement le truc, sinon ça te retombera sur la tronche tôt ou tard: aucune solution unique ne conviendra à tous les clients.
Fais moi confiance, je connais bien le domaine...
Salut les canards,
Je dois faire un petit script de connexion pour la partie adhérents d'un site sur lequel je bosse.
Le client m'a dis que je n'avais qu'a renvoyer vers l'url : http://www.domainepartieadhérents.co...ChaineCryptée
Pour que de leur côté ils récupèrent les infos de connexion.
Problème, le contact chez eux m'a envoyé un e-mail lacunaire se résumant a :
Salut
La syntaxe non cryptée est la suivante
[monLogin]/[monPaasword]
Elle doit être cryptée au format RC2 les clés sont :
IV = blablabla
Key = blablabla
Je ne connais strictement rien au chiffrement (déjà que je suis pas une brute en php) et je patauge donc totalement.
J'ai regardé du côté de PHP_Crypt mais l'IV qu'il m'a filé est sur 12 caractères alors que RC2 en demande 8
Bref je suis pommé, je patauge et vu que c'est pas du tout mon domaine ça a tendance à me gonfler assez rapidement.
Si une âme se sent capable de m'expliquer comment simplement chiffre mon truc ça m'aiderait.
Je précise que pour tout ce qui est concaténation des identifiants et redirection vers leur url fonctionne. C'est vraiment juste la partie chiffrement ou je bloque comme une merde.
Alors le FIFO, c'est le comportement de base de l'ERP, là ce n'est pas pour des commandes clients, mais plutôt pour des transferts de stock de dépôt à dépôt (pour simplifier). Donc le client demande à ce qu'au lieu de piocher dans les stocks les plus vieux (ce qui va faire n manips), il faut d'abord piocher les boites entières (donc il y'aura forcément moins de manip). Pour les effets de bord, on est en train d'y réfléchir et ça sera soumis au client (qui a son avis dessus aussi). Et c'est un mi-technique/mi-fonctionnel qui gère le truc pour l'instant, il me demandait juste si un algo existait déjà, histoire de ne pas réinventer la lune
Mais oui, c'est qu'une fois que ce sera validé par les ouvriers qu'on saura si c'est viable ou pas (chose que les "visionnaires" ont du mal à comprendre).
Le LaTeX, ça rentre dans le cadre du topic ? Je m'y risque quand même : je cherche un moyen de créer des graphes sous forme d'arborescence. Il y a bien le package pst-tree mais on dirait qu'un nœud ne peut pas avoir deux parents, et ça j'en ai vraiment besoin. Des idées ?
Un graphe avec pstricks ?
une balle, un imp (Newstuff #491, Edge, Duke it out in Doom, John Romero, DoomeD again)
Canard zizique : q 4, c, d, c, g, n , t-s, l, d, s, r, t, d, s, c, jv, c, g, b, p, b, m, c, 8 b, a, a-g, b, BOF, BOJV, c, c, c, c, e, e 80, e b, é, e, f, f, f, h r, i, J, j, m-u, m, m s, n, o, p, p-r, p, r, r r, r, r p, s, s d, t, t
Canard lecture
Yop, j'aurais une question sur du fortran90 svp.
J'ai un vecteur xtemp de taille (n). J'ai une matrice X de taille (n,m). Le vecteur xtemp est bien stocké en colonnes hein ?
(Ils sont du même type, double precision.)
Et si je fais xtemp( : )=X(:,i) (pour i compris entre 1 et m) on est d'accord que ça revient à xtemp(j)=X(j,i) avec j compris entre 1 et n ?
Ton "vecteur" xtemp, on va dire que c'est un tableau unidimensionnel. Il n'y a pas de notion de colonne ou de ligne pour un tableau unidimensionnel. En mémoire xtemp(1) et xtemp(2) sont contigus.
Ta "matrice" est représenté par un tableau multidimensionnel. La représentation de "l'être humain qui fait des maths" va considérer que la matrice est stocké en colonne parce que les éléments d'une même colonne sont contigus en mémoire.
En fortran, pour un tableau multidimensionnel, les valeurs contiguës en mémoire sont celles de l'indice le plus à gauche, contrairement au C. Si tu as "DIMENSION A(5,6)", A(1,1) et A(2,1) sont contigus en mémoire.
Donc oui, xtemp( : )=x( : , 1 ) va être équivalent à
xtemp( : )=x( 1 , : ) est incorrect parce que tes deux dimensions sont différentes. Mais si n==m, alors c'est équivalent àCode:DO I=1,N XTEMP(I)=X(I,1) ENDDO
La seule différence c'est que tu copies des valeurs de X qui ne sont pas contigus en mémoire dans xtemp...Code:DO I=1,N XTEMP(I)=X(1,I) ENDDO
Dernière modification par Sp1d3r ; 17/09/2014 à 19h10.
Sinon, tu peux utiliser Asymptote (http://asymptote.sourceforge.net/) avec un super tuto disponible ici http://jyraphe.isae.fr/file.php?h=R9...6b82b960f580a0 (lien valable un mois)
Pour te donner des idées:
donne ça:Code:unitsize(2.5cm); defaultpen(fontsize(12pt)); usepackage("amsmath"); usepackage("amsfonts"); usepackage("amssymb"); pair z1=(0,1), z2=(-1.5,0), z3=(0,-1), z4=(1.5,0); object boite1=draw("Particle mover",ellipse,z1); object boite2=draw("Space Charge Weighting Scheme",ellipse,z2); object boite3=draw("Field Solver",ellipse,z3); object boite4=draw("Lorentz's Force",ellipse,z4); add(new void(picture pic, transform t) { draw(pic,Label("particle distribution"),point(boite1,W,t){W}..{S}point(boite2,N,t),Arrow); draw(pic,Label("$\rho$"),point(boite2,S,t){S}..{E}point(boite3,W,t),Arrow); draw(pic,Label("$\mathbf{E}$"),point(boite3,E,t){E}..{N}point(boite4,S,t),Arrow); draw(pic,Label("$\mathbf{F}$"),point(boite4,N,t){N}..{W}point(boite1,E,t),Arrow); });
Comme les for loops sont gérées par Asymptote, rien de t'empêche de générer un arbre de manière automatique...
Amis Canards développeurs,
J'ai actuellement un souci avec une Regex que j'essaie d'écrire.
Je veux valider une chaine contenant une liste de langues, séparées par une virgule. Voila des exemples :
Voici les contraintes générales :Code:English,French,Spanish // OK French,Spanish // OK French // OK French,English // OK English,French,Spanish,French // NOK : Deux fois French English,Spanish,French, // NOK : Termine par une virgule
- Je dois avoir au moins un langage
- Je ne peux pas avoir de virgule à la fin de la chaine
- Un langage ne peut apparaître qu'une seule fois
- On doit pouvoir mettre les langues dans n'importe quel ordre
- J'ai environ 200 langues possibles
On m'a proposé cette regex :
Mais elle ne tient pas compte de la dernière contrainte, du coup si je rajoute une langue (German), ça donne :Code:^(English|French|Spanish)(?:,(?!\1)(English|French|Spanish))?(?:,(?!\1|\2)(English|French|Spanish))?$
Donc vous imaginez bien qu'avec 200 langues, j'suis pas sorti... En fait c'est presque bon mais j'aurais besoin de la factoriser pour pouvoir mettre les 200 langues sans répéter la totale 200 fois.Code:^(English|French|Spanish|German)(?:,(?!\1)(English|French|Spanish|German))?(?:,(-?!\1|\2)(English|French|Spanish|German))?(?:,(?!\1|\2|\3)(English|French|Spanish|German))?$
Pros de la Regex, c'est a vous !
Tu pourrais ne pas utiliser une regex, parce que c'est clairement pas l'outil le plus adapté dans ce cas de figure.
N'importe quel language de programmation sait faire un truc du genre "input.split(',').unique_values()" écrit en 5 secondes.
Rust fanboy
Tout a fait. L'intéret dans mon cas et que cette chaine sera présente dans un fichier de configuration XML de mon application au milieu de pleins d'autres paramètres. L'application effectue une validation XSD de ce fichier lors de son chargement, et la valeur est directement utilisée telle qu'elle sera présente dans le fichier XML. Et vu que la validation XSD supporte la validation de valeurs par regex, j'ai pensé à cette solution. D'autant plus donc que je n'aurais pas besoin d'effectuer un découpage des valeurs, qui serait nécessaire pour valider la chaine, car mon appli ne s'en servira pas.
Rust fanboy
Je ne te contredis pas, ca m’embête juste de découper mes controles entre le code et la validation XSD. J'aurais préféré que tout se fasse au même moment pour éviter d'en avoir partout.