Batch Index du Forum
S’enregistrerRechercherFAQMembresGroupesConnexion
Répondre au sujet Page 1 sur 1
[R] Problème de reset de variable
Auteur Message
Répondre en citant
Message [R] Problème de reset de variable 
Bonjour,

J'ai trouvé un code sur internet qui peut effectuer une multiplication sans problème de limite 32bits. Le truc c'est que ce serait bien de pouvoir le réutiliser ce code c'est a dire que je fais un <code>call:multiplication nbr1 nbr2 variable_de_sortie </code> le soucis c'est que ça foire et je ne voit qu'un problème possible: des variables non réinitialisées (vu que le premier appel marche).

J'ai cherché à les réinitialiser toutes mais ca ne marche quand meme pas donc peut être que j'en ai oublié quelque unes...

Voici le code:
Code:
@echo off
setlocal enableextensions
setlocal enabledelayedexpansion
call:multiplication 1000 1000 hello
echo %hello%
call:multiplication 5203216584 165503216 hello
echo %hello%
call:multiplication 5203216544 165504416 hello
echo %hello%
call:multiplication 520554216584 165545403216 hellow
echo %hellow%
call:multiplication 1000 100 bonjour
echo %bonjour%
pause>nul
:multiplication
set numero1ctn=
set numero2ctn=
set tmp=
set ctn=
set qolctn=
set plus=
set qo=
set spc=
set spc1=
set zero=
set co=
set numero6=
set numero1=
set numero2=
set numero4=
   set numero1=%1
   set numero2=%2
   for /l %%a in (1,1,2) do (
      for /l %%b in (0,1,9) do (
         set numero%%a=!numero%%a:%%b=%%b !
         )
      )
   for %%a in (!numero1!) do set /a numero1ctn+=1 & set !numero1ctn!numero1=%%a
   for %%a in (!numero2!) do set /a numero2ctn+=1 & set !numero2ctn!numero2=%%a
   if !numero1ctn! EQU 1 if !numero2ctn! EQU 1 (
      set /a %3=!numero1! * !numero2!
      goto:eof
      )
   for /l %%b in (!numero2ctn!,-1,1) do (
      for /l %%a in (!numero1ctn!,-1,1) do (
         set /a tmp=!%%bnumero2! * !%%anumero1! !plus! !qo!
         set qo=
         set plus=
         if !tmp! GTR 9 set qo=!tmp:~0,1!& set tmp=!tmp:~-1!& set plus=+
         set numero3_%%b=!numero3_%%b!!spc!!tmp!
         set spc=
         set tmp=
         )
      if defined qo set numero3_%%b=!numero3_%%b! !qo!& set qo=& set plus=
      set numero3_%%b=!zero!!numero3_%%b!
      set zero=0!spc1!!zero!
      set spc1=
      for %%a in (!numero3_%%b!) do (
        set /a ctn+=1
        for %%c in (!ctn!) do set numero4_%%c=!numero4_%%c!%%a+
        )
      set ctn=
      )
   for /f %%a in ('set numero4') do set /a qolctn+=1
   for /l %%a in (1,1,!qolctn!) do (
   set /a numero5_%%a=!numero4_%%a:~0,-1!
   echo %%a>> num4reset.txt
   set maxnum4=%%a
   )
   for /f "tokens=1-%maxnum4% delims= " %%a in (num4reset.txt) do set "numero4_%%a="
   del num4reset.txt
   for /l %%a in (1,1,!qolctn!) do (
      if defined qo set /a numero5_%%a=!numero5_%%a! + !qo!
     echo %%a>> num5reset.txt
     set maxnum5=%%a
      set qo=
      if !numero5_%%a! GTR 9 (
         set qo=!numero5_%%a:~0,-1!
         set numero6=!numero5_%%a:~-1!!numero6!
         ) else (
         set numero6=!numero5_%%a!!numero6!
         )
      set %3=!qo!!numero6!
      )
   for /f "tokens=1-%maxnum5% delims= " %%a in (num5reset.txt) do set "numero5_%%a="
   del num5reset.txt
   goto:eof


Si un œil externe pouvait regarder...

Merci d'avance,



Dernière édition par programme le Mar 24 Avr 2018 - 18:04; édité 1 fois

______________________________________________________

Programme
Skype
Message Publicité 
PublicitéSupprimer les publicités ?


Répondre en citant
Message [R] Problème de reset de variable 
Il suffit de jouer un peu avec les setlocal Okay

Petit code pour se faire un aperçu du fonctionnement de setlocal et de endlocal :
Code:
@echo off

set ma_variable_global=Bonjour

rem On définit un local
setlocal

  set ma_variable_local=Salut

rem On ferme le local, toutes les variables qu'on a déclaré dans ce local sont supprimés
endlocal

echo;%ma_variable_global%

rem erreur la variable n'existe plus
echo;%ma_variable_local%

pause>nul&exit


Donc en partant de ce principe, voilà ton code fonctionnel :
Lien Pastebin : https://pastebin.com/raw/CXuP12Jm




______________________________________________________
la vie est trop courte pour retirer le périphérique USB en toute sécurité...
Si la statue de la liberté lève le bras depuis 125 ans, c'est parce qu'elle cherche du réseau sur son Blackberry Torches...
Grâce à mon nouveau correcteur automatiste sur mon téléphage, je ne fais plus aucune faute d'orthodontie.
Quelqu'un a t il déjà demandé au drapeau japonais ce qu'il enregistre depuis tout ce temps ?
Visiter le site web du posteur
Répondre en citant
Message [R] Problème de reset de variable 
Flammrock a écrit:
Il suffit de jouer un peu avec les setlocal Okay

Petit code pour se faire un aperçu du fonctionnement de setlocal et de endlocal :
Code:
@echo off

set ma_variable_global=Bonjour

rem On définit un local
setlocal

  set ma_variable_local=Salut

rem On ferme le local, toutes les variables qu'on a déclaré dans ce local sont supprimés
endlocal

echo;%ma_variable_global%

rem erreur la variable n'existe plus
echo;%ma_variable_local%

pause>nul&exit


Donc en partant de ce principe, voilà ton code fonctionnel :
Lien Pastebin : https://pastebin.com/raw/CXuP12Jm


merciiiiiiiiii
J'en apprends tous les jours c'est cool. Pourquoi as tu ajouté la variable 'aa' dans le code ?

Un simple endlocal ne suffirait-il pas au lieu d'en mettre 3?
Pourquoi mettre 'exit /b' si il n'y a rien derrière?

Est ce que ces deux programmes sont stables au niveau reset de variables ?

@echo off
setlocal enableextensions
setlocal enabledelayedexpansion

call:add 1 2 hello
echo %hello%
call:add -3 -4 hellohe
echo %hellohe%
pause


:add
set num1=%1
set num2=%2
if not defined num1 set num1=0
if not defined num2 set num2=0
for /l %%a in (1,1,2) do (
for /l %%b in (0,1,9) do (
set _NUM%%a=!_NUM%%a:%%b=%%b !
)
)
for %%a in (%num1%) do set /a num1cnt+=1 & set _!num1cnt!num1=%%a
for %%a in (%num2%) do set /a num2cnt+=1 & set _!num2cnt!num2=%%a
set num1=%num1: =%
set num2=%num2: =%
set /a digits=%num1cnt% + %num2cnt%
if %digits% LEQ 8 (
set /a result=%num1% + %num2%
)
if defined result (ENDLOCAL & set %3=%result%& goto :eof)
if %num1cnt% GEQ %num2cnt% (set maxops=%num1cnt%) else (set maxops=%num2cnt%)
set /a maxops=%maxops% - 1
if %num1cnt% GTR %num2cnt% (
set /a zeros=%num1cnt% - %num2cnt%
for /l %%a in (1,1,!zeros!) do set zero=!zero!0
set num2=!zero!!num2!
)

if %num2cnt% GTR %num1cnt% (
set /a zeros=%num2cnt% - %num1cnt%
for /l %%a in (1,1,!zeros!) do set zero=!zero!0
set num1=!zero!!num1!
)

for /l %%a in (!maxops!,-1,0) do (
set /a tmp=!num1:~%%a,1! + !num2:~%%a,1! !plus! !co!
set co=
set plus=
if !tmp! GTR 9 set co=!tmp:~0,1!& set tmp=!tmp:~-1!& set plus=+
set return=!tmp!!return!
set tmp=
)
if defined co set return=%co%%return%
set result=%return%
if defined result (ENDLOCAL&set %3=%result%)
goto:eof

@echo off
call:islarger 1700 1600 if
echo %if%
call:islarger 1500 -1600 if
echo %if%
pause

:islarger
setlocal enableextensions
setlocal enabledelayedexpansion
set num1=%1
set num2=%2
for /l %%a in (1,1,2) do (
for /l %%b in (0,1,9) do (
set num%%a=!num%%a:%%b=%%b !
)
)
for %%a in (!num1!) do set /a num1cnt+=1 & set _!num1cnt!num1=%%a
for %%a in (!num2!) do set /a num2cnt+=1 & set _!num2cnt!num2=%%a
if !num1cnt! NEQ !num2cnt! (
if !num1cnt! GTR !num2cnt! (
set %3=TRUE
endlocal
endlocal
goto:eof
) else (
set %3=FALSE
endlocal
endlocal
goto:eof
)
)
for /l %%a in (1,1,!num1cnt!) do (
if !_%%anum1! NEQ !_%%anum2! (
if !_%%anum1! GTR !_%%anum2! (
set %3=TRUE
endlocal
endlocal
goto:eof
) else (
set %3=FALSE
endlocal
endlocal
goto:eof
)
)
)
set %3=EQUAL
endlocal
endlocal
goto:eof


PS: pour l'addition je suis sur que c'est pas bon mais le truc c'est que quand je mets mes setlocal apres :add ça ne marche pas donc je suis obligé de les mettre derrière

Merci d'avance pour ton aide!




______________________________________________________

Programme
Skype
Répondre en citant
Message [R] Problème de reset de variable 
programme a écrit:
Pourquoi as tu ajouté la variable 'aa' dans le code ?


Pour rediriger vers le exit /b une fois le résultat obtenu



programme a écrit:
Un simple endlocal ne suffirait-il pas au lieu d'en mettre 3?

En fait, je me suis basé sur ta fonction et tu ouvrais 3 local donc quand je l'ai modifié j'ai rajouté 3 endlocal pour fermer les 3 locals

Pour mieux comprendre l'imbrication des locals :
Code:
@echo off
 
set ma_variable_global=Bonjour
 
rem On définit un local
setlocal
 

  set ma_variable_local=Salut

  rem On définit un 2ème local
  setlocal
   
    set ma_variable_du_local_2=Guten Tag

  rem On ferme le local, toutes les variables qu'on a déclaré dans ce local sont supprimés
  endlocal


  rem erreur la variable n'existe plus
  echo;%ma_variable_du_local_2%

rem On ferme le local, toutes les variables qu'on a déclaré dans ce local sont supprimés
endlocal
 
echo;%ma_variable_global%
 
rem erreur la variable n'existe plus
echo;%ma_variable_local%
 
pause>nul&exit



programme a écrit:
Pourquoi mettre 'exit /b' si il n'y a rien derrière?

Un exit /b c'est comme un goto :eof mais en mieux
Il permet d'envoyer un code exit qui peut s'utiliser de cette façon :

Code:
@echo off


call :ma_fonction
if %errorlevel%==0 (
  echo;Success!
) else (
  echo;Error
)


pause>nul&exit


:ma_fonction
  rem le code 1 est généralement utilisé pour dire qu'il y a une erreur
  set code=1
exit /b %code%

De plus, le exit /b est beaucoup + rapide dans des programmes volumineux


Pour addition, on peut faire comme ça : https://pastebin.com/raw/rSEuG17w
Pour condition il faut procéder de la même manière



Et si on regroupe toutes les fonctions dans une seule fonction, ça donne ça :
https://pastebin.com/raw/pbhUKn8M




______________________________________________________
la vie est trop courte pour retirer le périphérique USB en toute sécurité...
Si la statue de la liberté lève le bras depuis 125 ans, c'est parce qu'elle cherche du réseau sur son Blackberry Torches...
Grâce à mon nouveau correcteur automatiste sur mon téléphage, je ne fais plus aucune faute d'orthodontie.
Quelqu'un a t il déjà demandé au drapeau japonais ce qu'il enregistre depuis tout ce temps ?
Visiter le site web du posteur
Répondre en citant
Message [R] Problème de reset de variable 
Flammrock a écrit:
programme a écrit:
Pourquoi as tu ajouté la variable 'aa' dans le code ?


Pour rediriger vers le exit /b une fois le résultat obtenu



programme a écrit:
Un simple endlocal ne suffirait-il pas au lieu d'en mettre 3?

En fait, je me suis basé sur ta fonction et tu ouvrais 3 local donc quand je l'ai modifié j'ai rajouté 3 endlocal pour fermer les 3 locals

Pour mieux comprendre l'imbrication des locals :
Code:
@echo off
 
set ma_variable_global=Bonjour
 
rem On définit un local
setlocal
 

  set ma_variable_local=Salut

  rem On définit un 2ème local
  setlocal
   
    set ma_variable_du_local_2=Guten Tag

  rem On ferme le local, toutes les variables qu'on a déclaré dans ce local sont supprimés
  endlocal


  rem erreur la variable n'existe plus
  echo;%ma_variable_du_local_2%

rem On ferme le local, toutes les variables qu'on a déclaré dans ce local sont supprimés
endlocal
 
echo;%ma_variable_global%
 
rem erreur la variable n'existe plus
echo;%ma_variable_local%
 
pause>nul&exit



programme a écrit:
Pourquoi mettre 'exit /b' si il n'y a rien derrière?

Un exit /b c'est comme un goto :eof mais en mieux
Il permet d'envoyer un code exit qui peut s'utiliser de cette façon :

Code:
@echo off


call :ma_fonction
if %errorlevel%==0 (
  echo;Success!
) else (
  echo;Error
)


pause>nul&exit


:ma_fonction
  rem le code 1 est généralement utilisé pour dire qu'il y a une erreur
  set code=1
exit /b %code%

De plus, le exit /b est beaucoup + rapide dans des programmes volumineux


Pour addition, on peut faire comme ça : https://pastebin.com/raw/rSEuG17w
Pour condition il faut procéder de la même manière



Et si on regroupe toutes les fonctions dans une seule fonction, ça donne ça :
https://pastebin.com/raw/pbhUKn8M


Excellent! Merci pour tout ! Okay Okay Okay Cela va beaucoup m'aider dans mon programme et changer ma façon de programmer (c'est vrmt bien pensé les .sub,...)

Encore merci ! Sujet résolut !




______________________________________________________

Programme
Skype
Répondre en citant
Message [R] Problème de reset de variable 
Flammrock a écrit:
programme a écrit:
Pourquoi as tu ajouté la variable 'aa' dans le code ?


Pour rediriger vers le exit /b une fois le résultat obtenu



programme a écrit:
Un simple endlocal ne suffirait-il pas au lieu d'en mettre 3?

En fait, je me suis basé sur ta fonction et tu ouvrais 3 local donc quand je l'ai modifié j'ai rajouté 3 endlocal pour fermer les 3 locals

Pour mieux comprendre l'imbrication des locals :
Code:
@echo off
 
set ma_variable_global=Bonjour
 
rem On définit un local
setlocal
 

  set ma_variable_local=Salut

  rem On définit un 2ème local
  setlocal
   
    set ma_variable_du_local_2=Guten Tag

  rem On ferme le local, toutes les variables qu'on a déclaré dans ce local sont supprimés
  endlocal


  rem erreur la variable n'existe plus
  echo;%ma_variable_du_local_2%

rem On ferme le local, toutes les variables qu'on a déclaré dans ce local sont supprimés
endlocal
 
echo;%ma_variable_global%
 
rem erreur la variable n'existe plus
echo;%ma_variable_local%
 
pause>nul&exit



programme a écrit:
Pourquoi mettre 'exit /b' si il n'y a rien derrière?

Un exit /b c'est comme un goto :eof mais en mieux
Il permet d'envoyer un code exit qui peut s'utiliser de cette façon :

Code:
@echo off


call :ma_fonction
if %errorlevel%==0 (
  echo;Success!
) else (
  echo;Error
)


pause>nul&exit


:ma_fonction
  rem le code 1 est généralement utilisé pour dire qu'il y a une erreur
  set code=1
exit /b %code%

De plus, le exit /b est beaucoup + rapide dans des programmes volumineux


Pour addition, on peut faire comme ça : https://pastebin.com/raw/rSEuG17w
Pour condition il faut procéder de la même manière



Et si on regroupe toutes les fonctions dans une seule fonction, ça donne ça :
https://pastebin.com/raw/pbhUKn8M


J ai relevé un bug et une faute de frappe. Le lss affiche true quand les nombres sont egaux et il y a un setn=false quelque part
Saurais tu y regarder ?




______________________________________________________

Programme
Skype
Message [R] Problème de reset de variable 


Montrer les messages depuis:
Répondre au sujet Page 1 sur 1
  



Index | créer un forum | Forum gratuit d’entraide | Annuaire des forums gratuits | Signaler une violation | Conditions générales d'utilisation
Copyright 2008 - 2016 // Batch