Trouver valeur max

Résolu
boursicotteur Messages postés 201 Date d'inscription mercredi 25 septembre 2002 Statut Membre Dernière intervention 10 novembre 2007 - 26 sept. 2007 à 17:21
boursicotteur Messages postés 201 Date d'inscription mercredi 25 septembre 2002 Statut Membre Dernière intervention 10 novembre 2007 - 4 oct. 2007 à 16:40
Je cherche une façon ultra rapide de trouver la valeur maximale d'une grande liste de nombres. Il n'est donc pas question ici de commencer à comparer des nombres dans une boucle...

Une solution pourrait être une API (que je ne connais pas) qui s'appliquerait sur un bloc de mémoire en spécifiant un pointeur et une dimention.

Une autre solution pourrait être une fonction (que je ne connais pas) qui s'appliquerait sur un tableau. Je sais déjà comment remplir ce tableau très rapidement en copiant un bloc de mémoire directement dans ce tableau.

Merci de m'aider
A voir également:

34 réponses

boursicotteur Messages postés 201 Date d'inscription mercredi 25 septembre 2002 Statut Membre Dernière intervention 10 novembre 2007
2 oct. 2007 à 17:02
Salut BruNews

C'est "techniquement" très intéressant ton offre de tout mettre en C mais il s'agit d'un prog VB et dans ce contexte, je me contenterai des seules fonctions telles que je les ai décrites.

Par contre, je dois reconnaître que je me heurte de plus en plus souvent aux limites du language VB et c'est vraiment très très déplaisant pour ne pas dire carrément chiant.

J'ai donc décidé de commencer à me mettre au C++. Je ne vais pas abandonner VB pour autant car, le connaissant bien, il me permet d'écrire rapidement des codes dont j'ai besoin.

Le démarrage en C++ n'est pas évident car le sujet est vaste et complexe. Je dispose de l'aide MSDN (tutoriaux et exemples), de l'aide offerte par les forums (questions et sources) et d'une ténacité "épeurante".

Ce serait un EXCELLENT point de départ pour moi si tu acceptais de me remettre le code de ta DLL (terminée ou non).

Merci
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
2 oct. 2007 à 17:31
Ce n'est assurément pas avec le code de la DLL qu'il faut commencer, il y a de nombreux niveaux à gravir avant.

ciao...
BruNews, MVP VC++
0
boursicotteur Messages postés 201 Date d'inscription mercredi 25 septembre 2002 Statut Membre Dernière intervention 10 novembre 2007
2 oct. 2007 à 19:24
Pas d'accord!

Ta DLL fonctionne déjà alors cela représente 2 gros avantages:

1- Sachant ce qu'elle fait, c'est énormément plus facile de comprendre COMMENT elle le fait. C'est bien le but de mettre des sources sur ce site, non?  L'alternative est de travailler 10 fois plus fort en partant de rien.

2- Pour obtenir les fonctions que je désire avoir (ou en créer d'autres), je n'aurai que quelques ligne de codes à changer car tout l'environnement de la DLL est déjà fait.

Mais bon!
Si tu ne veux pas me donner ton code, c'est ton droit le plus légitime car il t'appartient de plein droit.

Mais...ce serait contraire à l'esprit d'entraide et de partage de ce forum...et en plus çà viendrait d'un Admin CS...
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
2 oct. 2007 à 20:06
Ma réponse était sur le fait que ce soit un "excellent point de départ", je maintiens que non sans les bases.

Inutile de lancer les habituels arguments tendant à culpabiliser, j'ose espérer que tu n'y crois pas toi-même.
Pourquoi devrais-je cacher ce code que nimporte qui sachant le C pondra en 2 mn chrono ? Ce n'est qu'un préliminaire de test pour les appels depuis VB, un tri optimisé final se ferait en ASM avec des temps coupés en 2 au minimum.
Si qlq doute, voir ici:
http://www.cppfrance.com/code.aspx?ID=41536
Je pensais qu'on ne doutait plus de mon "esprit d'entraide" en ayant déjà fourni ce qui ne m'était même pas demandé, je me suis encore gourré.

#include <windows.h>


#pragma comment(linker, "/entry:myDllMain")
__declspec(naked) int __stdcall myDllMain(HINSTANCE hdll, DWORD dwReason, LPVOID Reserved)
{
  __asm {
    mov     eax, 1
    ret     12
  }
}


short __stdcall bnGetInt16MinMax(short *ptab, DWORD n, short *pMin)
{  short t, a 0, z 0;
  if(!n) goto maxEXIT;  a z *ptab;
  if(!--n) goto maxEXIT;
  ptab++;
fromTAB:
  t = *ptab++;
  if(t < a) goto goMINSWAP;
  if(t <= z) goto noSUP1;
tSUPz:
  z = t;
noSUP1:
  if(!--n) goto maxEXIT;
  t = *ptab++;
  if(t < a) goto goMINSWAP;
  if(t > z) goto tSUPz;
  if(!--n) goto maxEXIT;
  t = *ptab++;
  if(t < a) goto goMINSWAP;
  if(t > z) goto tSUPz;
  if(!--n) goto maxEXIT;
  t = *ptab++;
  if(t > z) goto tSUPz;
  if(t < a) goto goMINSWAP;
  if(--n) goto fromTAB;
  goto maxEXIT;
goMINSWAP:
  a = t;
  if(--n) goto fromTAB;
maxEXIT:
  *pMin = a;
  return z;
}

ciao...
BruNews, MVP VC++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
boursicotteur Messages postés 201 Date d'inscription mercredi 25 septembre 2002 Statut Membre Dernière intervention 10 novembre 2007
2 oct. 2007 à 23:07
Désolé que tu réagisses de cette façon...
Ce que tu me donnes ici est incomplet.

Tout d'abord, il n'y a que la fonction 16 bits; la fonction 8 bits est manquante.

Comme ces 2 fonctions sont sur la même DLL, il faut forcément trouver quelquechose dans le code à ce sujet.

Ensuite, une DLL utilise une sorte de template pour cet usage particulier. Tout ce que tu me donnes ici est le contenu "d'un seul" des fichiers nécessaires pour compiler une DLL.
On est vraiment très très loin du compte.

Voici, à titre d'exemple, les fichiers d'une DLL nommée Select que j'ai trouvée dans MSDN (j'ai enlevé les fichiers du démo fournis avec):
SELECT.C
SELECT.DEF
SELECT.EXP
SELECT.H
SELECT.LIB
SELECT.DLL   (c'est la dll compilée)

Ce que je te demandais était de faire un zip contenant TOUS les fichiers de cette source et de le mettre sur ton site comme tu l'as déjà fait 3 fois avec la DLL à tester.

C'est pas sorcier et ce n'est pas plus long que d'aller ouvrir un des fichiers de ta source pour en copier le contenu ici.

Mais bon!
Tu ne veux pas alors on ne va pas commencer à jouer au chat et à la souris ou pire, à s'engueuler... pour ça.
Toi tu as 50 ans et moi j'en ai 52...

Je vais simplement me débrouiller sans toi!
0
boursicotteur Messages postés 201 Date d'inscription mercredi 25 septembre 2002 Statut Membre Dernière intervention 10 novembre 2007
3 oct. 2007 à 18:37
J'ai commencé à examiner le code que tu as affiché dans ton dernier message et je suis franchement déçu.

1- Tout d'abord, ton code est sensé fabriquer une DLL nommée vbMinMax.dll. Pour qu'il puisse remplir cette commande, faudrait commencer par lui donner ce nom...
C'est une autre preuve que ton code est incomplet

2- Ton algorythme n'a pas de sens. Sous l'étiquette noSUP1:, tu a mis 3 blocs de 4 lignes. Les 2 premiers blocs sont identiques tandis que le 3è est légèrement différent.

Le 1er de ces 3 blocs est tout à fait valable car il recherche Min et Max. Mais répéter ce bloc est tout simplement ridicule.

3- Tu fais tes boucles à la façon d'un novice, c'est à dire en faisant des goto tant et aussi longtemps que "n" n'a pas atteint la valeur 0 après l'avoir décrémenté (--n).

Il me semble que l'instruction "for" est à la portée d'un programmeur de ton calibre...

BREF!
Je sais que tu es FORT en programmation alors je dois conclure que tu as trafiqué ton algorythme pour me compliquer la vie.

Décidément...
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
3 oct. 2007 à 19:19
1) "...faudrait commencer par lui donner ce nom..."
 Les seuls endroits où spécifier le nom est dans le DEF et en param du linker, le code n'entre pour rien dans l'affaire.
2) "Le 1er de ces 3 blocs est tout à fait valable car il recherche Min et Max. Mais répéter ce bloc est tout simplement ridicule."
 C'est ce qu'on appelle "dérouler" une boucle, un saut de code coutant cher en perf, on privilégie la vitesse à la taille.
3) "l'instruction "for" est à la portée d'un programmeur ..."
 C'est déjà répondu par le 2) mais vu que le codage n'est pas ton fort, je vais expliquer pourquoi quand il est préférable de tendre vers 0 dès qu'on le peut.
Exemple:
DWORD i;
for(i = 0; 1 < 4; i++) {
  // CODE ICI
}
Compilé donne:
 xor eax, eax  ; i = 0
goFOR:
 ; CODE ICI
 add eax, 1    ; i++
 cmp eax, 4
 jb  short goFOR
On voit de suite que c'est un code de SUPER NUL !!!
if(--n) goto fromTAB;
Compilé donne:
 sub  eax, 1
 jne  short fromTAB
ET BASTA !!! 1 instruction de comparaison gagnée par tour, 'SUB' a déjà placé le registre EFLAGS et rend donc 'CMP' totalement inutile.


"Je sais que tu es FORT en programmation alors je dois conclure que tu as trafiqué ton algorythme pour me compliquer la vie."
J'avais pourtant bien précisé qu'on ne commence pas la prog par une dll.
Moi je conclus d'une autre façon: Tu insistes sur un sujet dont visiblement tu ne connais absolument rien, le mieux serait tout de même de commencer par le début, ça t'éviterait l'étalage d'autres inepties.

ciao...
BruNews, MVP VC++
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
3 oct. 2007 à 20:06
quel retournement de situation...

2 pages d'entraide exemplaires et çà vire presque à l'insulte par le fait qu'il faut une certaine pratique pour lire l'optimisé?

jusqu'à remettre en doute les buts et même les capacités malgré les chiffres à l'appui?

umm, çà donne envie en tout cas!
j'sais pas ce qui s'est passé durant les 2 jours de silence mais qui aide paye, limite immoral non?!!

boursicotteur si tu a un peu de temps à perdre, relis ces 3 pages
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
3 oct. 2007 à 22:05
On se calme, boursicotteur, BruNews t'a filé énormément d'elements de réponse, lui qui d'habitude va droit au but, là, il a pris ell temps de rédiger, il t'as filé une dll, on code, etc...

maintenant, je fais moi même beaucoup de choses en VB, mais manipuler des données wav , c'est pas du tout taillé pour...

comme te le conseille CPT, relis ce qui t'a été dit, et remonte tes manches, c'est aussi ça l'esprit CodeS-SourceS : donner des PISTES et non un code tout fait à 100%

a bon entendeur, je te souhaite une bonne continuation

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
3 oct. 2007 à 23:44
C'est ce genre de comportement qui poussent les bon elements comme Brunews a ne plus repondre aux questions.

E.B.
0
boursicotteur Messages postés 201 Date d'inscription mercredi 25 septembre 2002 Statut Membre Dernière intervention 10 novembre 2007
4 oct. 2007 à 03:24
Renfield et PCPT,

Je suis calme et j'ai relu.
Ce qui s'est passé est très simple:

1- J'ai demandé un truc pour faire une chose rapidement.

2- On m'a offert d'écrire une DLL en C.

3- J'ai accepté et passé plusieurs heures à tester et à définir mes besoins pour que cette DLL soit utilisable par mon prog.

4- J'émet l'idée de faire plus de choses dans la DLL pour sauver du temps. Pour moi c'est une question de curiosité et non une commande.

5- On obtient finalement une DLL qui fonctionne mais qui n'est pas utilisable par mon prog car elle utilise un tableau à 1 seule dimention et la plage d'adresse des valeurs à tester commence toujours à 0.

6-Le 1er jour de silence, j'attend car je pense qu'il est en train de travailler à modifier la DLL pour qu'elle soit utilisable. Je reçois un message perso m'offrant de tout mettre dans la DLL. J'hésite à accepter car je ne veux pas abuser de son temps sur mon projet qui n'est qu'un divertissement. Cependant je lui dit par message perso que je tiens beaucoup à avoir la DLL et qu'elle sera très utile pour tous les programmeurs VB. Suit le 2è jour de silence.

7- Je poste un message disant que je refuse de tout mettre dans une DLL (cela va lui épargner du travail alors j'anticipe qu'il en sera heureux). Je l'informe aussi de mon intention d'apprendre C++ et lui demande de me remettre sa source pour que je puisse l'utiliser pour apprendre et même la modifier (moi-même) pour qu'elle puisse répondre à mes besoins...si il n'est plus intéressé à continuer.

8- Il me répond que ce n'est pas la meilleure façon d'apprendre et ne dit rien de plus.

9- J'estime que son argument ne tiens pas debout car les sources sont la meilleure façon d'apprendre et c'est d'ailleurs la vocation de ce site. Et puis c'est moi seul que cela regarde!

Je soupçonne alors qu'il n'a pas l'intention de me remettre son code et qu'il va me laisser en blanc pour la DLL. Cela signifie que j'aurai consacré (en pure perte) plusieurs jours à travailler avec lui sur cette DLL et que sans son code, je n'aurai même pas la possibilité de me "lever les manches" pour la terminer.

Je l'informe donc de mon désaccord relativement à son argument et je prends soin de lui dire pourquoi. Je vérifie aussi si (comme je le soupçonne) il a l'intention de garder son code. Pour ce faire, je lui rappelle la philosophie de ce site.

10-Il réagit alors de façon très négative en:
* m'accusant d'essayer de le faire sentir coupable
* se défendant de ne pas vouloir cacher ce code "simpliste"
* jouant à la vierge offensée concernant son esprit d'entraide
 
Et, pour me convaincre de sa bonne foi, il poste des lignes de codes qui sont sensés être la source entière.

11- Même si je ne connais pas encore le C, je ne suis pas idiot et je détecte tout de suite que ce qu'il me donne est inutilisable et n'est en fait que de la poudre aux yeux.

Je l'informe que c'est très incomplet en prenant bien soin de ne pas jeter d'huile sur le feu. L'occasion était pourtant belle de lui dire que pour un gars qui se défend de ne pas vouloir garder ce code qualifié d'insignifiant par lui, il fait pourtant l'inverse.      

Je lui dit ensuite que faire un zip des fichiers source aurait été moins long que de copier une partie d'un fichier pour le poster.
...Cela m'aurait aussi été d'une grande aide...et au moins son travail aurait servi à quelque chose...

Finalement, j'en ai marre et je lui dit que je vais me débrouiller sans lui.

-------------
En conclusion:

Au lieu de m'aider, il m'a fait perdre mon temps. Il m'a très gentiment offert une DLL en C mais il ne l'a jamais rendue fonctionnelle pour mon prog. Il m'a carrément laissé tomber exactement au moment où j'ai décliné son offre de tout mettre dans la DLL.
Est-ce que je l'ai frustré? A-t-il voulu ainsi se venger?

J'aurais néanmoins considéré qu'il m'a aidé si il avait accepté de me remettre ce code pour que je puisse le terminer MOI-MÊME. Cela n'aurait pris que 5 min et sans le mooindre frais!
C'était bien la moindre des choses considérant tout le temps que j'ai consacré à tester sa DLL et à l'orienter sur mes besoins.

Mais, entre gens de bonne volonté, il n'est jamais trop tard.
Il peut toujours me remettre son code pour que je puisse le terminer et l'utiliser pour apprendre.

Cela me permettra de dire qu'il m'a effectivement aidé au lieu de me faire perdre mon temps.

-----------
Renfield

Je suis inscrit à ce forum depuis 2002.

Très souvent, quand j'ai demandé de l'aide, j'ai reçu des suggestions complètement à côté de la "track" comme on dit chez moi mais je n'ai jamais rien dit car elles venaient de simples participants comme moi qui étaient en apprentissage et qui de surcroit étaient de bonne foi.

Mais là, cette expérience désagréable fait partie d'une autre catégorie et j'en ressort passablement refroidi.

Étant dans cet état d'esprit, je remarque évidemment beaucoup plus l'énorme baisse d'achalandage sur ce forum. En 2002, il y avait très facilement 100 à 150 demandes d'aide par jour. Maintenant, il n'y en a même pas 10 par jour. Hier, j'en ai compté 29 pour l'ensemble des 7 derniers jours. Cela fait seulement 4 par jour en moy.

C'est bien évident qu'il y a quelque chose qui fait fuir la clientèle.
Personnellement, je n'ai pas l'intention d'y revenir et tu en connais les raisons.

Je ne peux évidemment pas parler pour les autres mais je suppose qu'ils sont autant humains que moi.

Sur ce, je te lève mon chapeau car j'ai toujours apprécié la qualité de tes sources, de tes informations et de ta communication.
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
4 oct. 2007 à 07:25
c'en est souriant,

perso je vois :

"pas bien de commencer par un DLL"
"PAS D'ACCORD"
"je parlais du principe de la DLL comme point de départ"

et çà se prouve par le codage lui-même (goto entre autres) qui a eu besoin de justifications...

j'ai relu la page 3 pour être certain de ne pas prendre parti et ta réaction est disproportionnée. un simple "oui on ne commence sans doute pas le C par un code qu'on assimile pas naturellement c'est moyen mais laissons nous une chance" et le zip aurait déjà été à ta dispo.

bref, je suis certain que les 4 membres quotidiens sauront faire la part des choses...

je ne clos pas ce topic mais considère que le sujet l'est, ton dernier message répondant clairement à "Inutile de lancer les habituels arguments tendant à culpabiliser, j'ose espérer que tu n'y crois pas toi-même."

je suis persuadé qu'en cherchant sur cppfr tu trouveras comment mettre en pratique l'extrait de code à ta dispo, à défaut d'avoir un stdio écrit noir sur blanc

bonne journée
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
4 oct. 2007 à 09:33
Dernière réponse:

"plage d'adresse des valeurs à tester commence toujours à 0."
z = bnGetInt16MinMax(T(0), 100, a)
et ça:
z = bnGetInt16MinMax(T(12), 88, a)
oh miracle, ce n'est plus l'indice 0.
Quelle misère...


"sensés être la source"
Suffit de décompiler pour voir que c'est le code original, ça aurait pris 5 mn au lieu de perdre 1 plombe à taper une page de nimporte quoi.

ciao...
BruNews, MVP VC++
0
boursicotteur Messages postés 201 Date d'inscription mercredi 25 septembre 2002 Statut Membre Dernière intervention 10 novembre 2007
4 oct. 2007 à 16:40
Dorénavant, je vais faire comme les quelques 973,749 membres de ce forum. Les rares fois que je vais y venir ce sera uniquement pour y piquer des idées et des sources.

Plus question donc d'y poser des question, ni de répondre à des question et encore moins d'y déposer des sources. J'ai d'ailleurs enlevé les miennes hier.

Je vais faire de même avec le petit frère cpp qui de toute façon m'apparaît être un amalgame de nombreux languages dont C++...donc moins intéressant. Je crois bien que pour le C++ les sites américains sont de loin ce qu'il y a de mieux...sans vouloir offenser personne.

Je constate qu'un autre message a été déposé après le tiens et je constate aussi qu'il va dans le sens de l'idée que je me suis faite de son auteur.

Adios amigo
-1
Rejoignez-nous