begin process at 2012 02 14 18:54:00
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Visual Basic 6

 > 

Divers

 > 

General

 > 

trouver valeur max


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

trouver valeur max

Echange clos Echange clos, plus de réponse possible sur cet échange

mercredi 26 septembre 2007 à 17:21:26 | trouver valeur max

boursicotteur

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
mercredi 26 septembre 2007 à 17:53:43 | Re : trouver valeur max

FMatrix07

Bonjour,
Je pense que le plus rapide est belle et bien une boucle.

@+: SCCréat
Pensez:  Réponse acceptée

Mail:
Stéphan.COCHET
mercredi 26 septembre 2007 à 18:03:25 | Re : trouver valeur max

etniqs

c'est quoi un bloc de mémoire ? des pointeurs ?? de toute façon, tu n'as pas le choix que de comparer des valeurs entre elles, puisque tu veux le max des valeurs, donc une boucle ... par contre, c'est elle qu'il faudra optimiser, la base est simple : while if tab(n) > tab(n+1) then mavaleur = tab(n) wend
mercredi 26 septembre 2007 à 19:04:24 | Re : trouver valeur max

boursicotteur

Pas le choix de comparer des valeurs... Donc, faut une boucle?

Dans Excel il y a une fonction qui compare des valeurs...sans faire de boucle...    

Max(liste de nombres ou plage d'adr contenant des nombres)

C'est quoi un bloc de mémoire, un pointeur?
Si tu sais ce qu'est une API alors examine celle-ci:

Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)

· Destination
Points to the starting address of the copied block's destination.

· Source
Points to the starting address of the block of memory to copy.

· Length
Specifies the size, in bytes, of the block of memory to copy.

mercredi 26 septembre 2007 à 21:05:15 | Re : trouver valeur max

BruNews

Administrateur CodeS-SourceS
Une API ça s'écrit, encore faut-il avoir qlq détail.
Quel type tes nombres, intt16, int32, single, double ?

ciao...
BruNews, MVP VC++
mercredi 26 septembre 2007 à 21:59:33 | Re : trouver valeur max

Kristof_Koder

"Dans Excel il y a une fonction qui compare des valeurs...sans faire de boucle..." < Ah !! Bon ! Parce que tu connais le code exécuter par la fonction Max d'Excel toi ? Tu croit vraiment qu'il n'y a pas de boucle dans le Max() !! Moi, je pense qu'il y en a une. Quel que soit ce ue tu utiliseras pour faire ca, tu auras une boucle. La seule différence, c'est que si tu fais ta boucle en C ou mieux en ASM, ca va booster bien plus qu'une boucle en VB6 !! Tu parles de bloc mémoire, de pointeur et de dimension. Pour ballader ton ptr du début à la fin du bloc, il te faudra bien une boucle ! Ou alors tu es magicien !
mercredi 26 septembre 2007 à 22:36:20 | Re : trouver valeur max

boursicotteur

Salut BruNews

Mes nombres proviennent de fichiers wave de 8 bits et 16 bits et il est inutile de préciser qu'il y en a plusieurs millions dans chaque fichier alors les boucles en VB c'est pas ce qu'il y a de mieux.

Présentement, j'utilise l'API  ReadFile pour placer ces nombres directement dans un tableau dimentionné soit en Bytes ou en Integer. C'est ultra rapide! Il faut à peine quelques mSec!

Mais çà se gâte quand je travaille avec ce tableau pour extraire les valeurs crêtes de blocs de 128 échantillons en faisant une boucle en VB. Il me faut 12 sec pour traiter un fichier de 6 millions d'échantillons alors qu'un logiciel du commerce le fait en 3 ou 4 sec. Voilà pour la lenteur de VB!

Tu dis être capable d'en écrire une?
Je sais que les API sont livrées dans des DLL et qu'il est possible d'écrire des DLL mais pour qu'elles soient rapide il ne faut pas le faire en VB. D'après ce que j'en sais, C++ est beaucoup mieux.

J'espère que cela répond à ta question.
Merci
mercredi 26 septembre 2007 à 22:49:30 | Re : trouver valeur max

BruNews

Administrateur CodeS-SourceS

Declare Sub bnGetInt16MinMax Lib "vbMinMax.dll" (ByRef ptab As Integer, ByVal nelems As Long, ByRef pMin As Integer, ByRef pMax As Integer)
les 2 bornes min et max retournées dans pMin et pMax, OK ?

exemple:
Declare Sub bnGetInt16MinMax Lib "vbMinMax.dll" (ByRef ptab As Integer, ByVal nelems As Long, ByRef pMin As Integer, ByRef pMax As Integer)

Dim T(100) As Integer
Dim a, b
' remplir T de 100 valeurs int16
bnGetInt16MinMax(T(0), 100, a, b)
debug.Print a
debug.Print b

et la meme en 8 bits: bnGetInt8MinMax

les valeurs sont à considérer en unsigned ?

ciao...
BruNews, MVP VC++

mercredi 26 septembre 2007 à 23:38:44 | Re : trouver valeur max

BruNews

Administrateur CodeS-SourceS

Exemple fait sur Excel, je n'ai pas VB.

Option Explicit

' RECHERCHE BORMES MIN ET MAX SUR ENTIERS 16 BITS
Declare Sub bnGetInt16MinMax Lib "D:\vbMinMax.dll" (ByRef ptab As Integer, ByVal nelems As Long, ByRef pMin As Integer, ByRef pMax As Integer)
Declare Sub bnGetWordMinMax Lib "D:\vbMinMax.dll" (ByRef ptab As Integer, ByVal nelems As Long, ByRef pMin As Integer, ByRef pMax As Integer)

Sub DireInt16MinMax()
  Dim cel As Range
  Dim n As Integer, a, z
  Dim T(100) As Integer
  Set cel = Range("A1")
  n = 100
  Do
    T(n) = CInt(cel.Value)
    Set cel = cel.Offset(1, 0)
    n = n - 1
  Loop While n >= 0
 
  bnGetInt16MinMax T(0), 100, a, z
  ' SI TRAVAIL EN UNSIGNED UTILISER bnGetWordMinMax AVEC MEMES PARAMS
 
  Debug.Print a
  Debug.Print z
End Sub

DLL (2,5 Ko) ici: http://brunews.com/vbMinMax.zip

ciao...
BruNews, MVP VC++

jeudi 27 septembre 2007 à 04:03:59 | Re : trouver valeur max

boursicotteur

Merci pour ton travail BruNews!
Malheureusement je ne réussi pas à faire fonctionner cette DLL.
Voici ce que j'ai fait:

1-J'ai d'abord déclaré les 2 fonctions dans un module:
Public Declare Sub bnGetInt16MinMax Lib "vbMinMax.dll" ( _
        ByRef ptab As Integer, _
        ByVal nelems As Long, _
        ByRef pMin As Integer, _
        ByRef pMax As Integer)

Public Declare Sub bnGetInt8MinMax Lib "vbMinMax.dll" ( _
        ByRef ptab As Integer, _
        ByVal nelems As Long, _
        ByRef pMin As Integer, _
        ByRef pMax As Integer)

2-J'ai ensuite écrit un code test dans un formulaire:
Public Sub btnTEST_Click()
    Dim T(100) As Integer
    Dim a, b, rt
    ' remplir T de 100 valeurs int16
    For rt = 0 To 99
        T(rt) = rt + 5
    Next

    rt = bnGetInt16MinMax(T(0), 100, a, b)
    Debug.Print a
    Debug.Print b
Exit Sub

=> J'ai obtenu le message suivant:
Erreur de compilation:
Function ou variable attendue

Alors je me suis dit qu'il fallait enrégistrer cette dll; ce que j'ai fait en utilisant la ligne de commande suivante: 
regsvr32 C:\windows\system\vbMinMax.dll

=> J'ai obtenu le message suivant:
C:\windows\system\vbMinMax.dll was loaded, but the DllRegisterServer entry point was not found.

DllRegisterServer may not be exported, or a corrupt version of C:\windows\system\vbMinMax.dll may be in memory. Consider using Pview to detect and remove it.

J'ai donc utilisé mon Pview pour voir tous les process actifs et il n'y avait pas trace de vbMinMax.dll.
Peut-être que le fichier n'est pas correct ou qu'il est corrompu...
...Il a pourtant fonctionné avec ton Excell!

Je vais le retélécharger et le réessayer...au cas où il aurait été corrompu lors du téléchargement (mais j'en doute).

Ce serait bien si d'autres personnes pouvaient l'essayer avec un code VB et poster ici leur résultat.

Tes 2 fonctions semblent répondre à mes besoins mais il va y avoir un autre petit problème que voici:

Les fichiers wave ont 1 ou 2 canaux et les données sont ordonnées en conséquence. Le tableau qui recevra ces données doit être dimentionné en conséquence.
 
Ceci veut dire que pour un fichier wave à 1 canal, le tableau doit avoir 1 seule dimention (0  à  N-1 échantillons).
Pour un fichier wave à 2 canaux, ce sera 2 dimentions (0 à 1, 0 à N-1).

Il faudrait avoir la possibilité d'extraire les valeurs Min Max pour chacun des 2 canaux (si il y en a 2).
Il suffirait donc d'ajouter une autre variable à tes fonctions...

Encore une fois merci pour ton aide.


1 2 3 4

Cette discussion est classée dans : trouver, valeur, tableau, max, nombres


Sujets en rapport avec ce message

comment trouver la valeur MIN et la valeur MAX dans un tableau [ par Jeronimo ] J'ai un tableau intNombre(1 to 25). Premièrement, les valeurs du tableau sont initiées par un combobox. Ensuite, je dois afficher la valeur la plus é Min...Max...d'un comboboxe... [ par Gigi ] Bonjour! voici mon probleme... j'ai des nombres dans un comboboxes, et je veux afficher dans des labels respectifs, la valeur minimal et la va Comment peut on savoir quel est la valeur max dans un tableau de valeurs ? [ par Moi ] Comment peut on savoir quel est la valeur max dans un tableau de valeurs ? Trouver le max et le min dans un tableau [ par Jeronimo ] Je dois, dans la même procédure trouver le nombre max et le nombre min dans un tableau. Comment faire ?Mon tableau est intNombre(25) as Integermerci Tableau d'integer et valeur max [ par olivier857 ] Bonjour à tous,Je cherche à créer un tableau d'integer, a y stocker des données dans une boucle puis récupérer la valeur max du tableau de données.Mai Valeur max dans une plage définit par des variables [ par Everlast03 ] J'ai un petit problème, J'ai un tableau de valeurs (que je récupère) dont les premiers relevés ne m'intéressent pas. Je prends donc le maximum (car l Recherche d'une valeur dans une ligne [ par wassim0285 ] Bonjour, Comment je peux trouver si une valeur existe ou non sur une ligne particulière, sachant que je connais la ligne ( c'est la ligne 1), donc je ACCESS-VBA Stocker Valeur dans une variable "Tableau" (Nombre d'enregistrement variable) [ par daimadoshi60 ] Bonjour à tous, Voila, je souhaiterai stocker un certain nombre de valeur dans une variable de type Tableau ou liste et je ne trouve pas vraiment le comment recherchez un valeur dans une colonnes et la comparer si pareil renvoyer la valeur dans une autre celulle [ par qcsylvain ] Bonjour, sa fait des semaines que je cherche une facon de crée ce code, je travail avec excel vba 2007jai 2 feuille dans mon classeur "2" et  "Feuil1" Chercher le code en C pour trier le fichier texte et trouver la valeur max [ par codon21 ] Bonjour à tous, J'ai cherché dans le forum le code pour trier et trouver la valeur max dans un fichier texte. J'en ai trouvé quelques un. Mais c'est p


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,858 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales