Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Fehler Division durch null

Frage Entwicklung Batch & Shell

Mitglied: nullplan001

nullplan001 (Level 1) - Jetzt verbinden

16.11.2005, aktualisiert 18.11.2005, 6219 Aufrufe, 4 Kommentare

Nachdem ich ein Programm in VBS und Pascal geschrieben hatte, wollte ich das ganze in einer Batch schreiben...

... und bekam prompt ein Problem. Mein Programm soll den größten gemeinsamen Teiler (ggt) und das kleinste gemeinsame Vielfache (kgv) nach dem euklidischen Algorithmus ausrechnen. In VBS sah das ganze schön aus und funktionierte auch schön. Es sah so aus:
01.
option explicit 
02.
dim intAntw, intA, intB, intggt, intkgv 
03.
intAntw= MsgBox("Dieses Skript berechnet den ggT und das"&chr(13)&"kgV zweier von ihnen angegeben Zahlen."&chr(13)&"Fortfahren?",36,"ggT-kgV-Rechner") 
04.
if intAntw=7 then WScript.quit 
05.
intA= InputBox ("Bitte geben Sie die erste Zahl ein","ggT-kgV-Rechner","18") 
06.
intB= InputBox ("Bitte geben Sie die zweite Zahl ein","ggT-kgV-Rechner","60") 
07.
if intA=intB then 
08.
  WScript.echo "Ich lache morgen drüber, OK? Man kann nicht von ein",chr(13)&"und derselben Zahl ggT und kgV berechnen!!" 
09.
  WScript.quit 
10.
end if 
11.
intggt= fcnggt(intA,intB) 
12.
intkgV= intA*intB/intggt 
13.
WScript.echo "ggT("&intA&","&intB&")="&intggt 
14.
WScript.echo "kgv("&intA&","&intB&")="&intkgv 
15.
 
16.
function fcnggt (intZ1, intZ2) 
17.
dim ArrIntFeld(1000), intI 
18.
arrintFeld(0)=intZ1 
19.
arrintFeld(1)=intZ2 
20.
for intI = 0 to 998 
21.
  ArrIntFeld(intI+2)=ArrIntFeld(intI) mod ArrIntFeld(intI+1) 
22.
  if ArrIntFeld(intI+2)=0 then  
23.
    exit for 
24.
  end if 
25.
  if intI=998 then  
26.
    WScript.echo "Sorry, aber die Zahlen sind eindeutig zu groß!!" 
27.
    WScript.echo "Skriptverarbeitung wird abgebrochen" 
28.
    wscript.quit 
29.
  end if 
30.
next 
31.
fcnggt=ArrIntFeld(intI+1) 
32.
end function
So, und das hatte ich in eine Batch umschreiben wollen (es sind nur geringfügige Änderungen für Linux-Shellscripts erforderlich). Das sah dann so aus:
01.
@echo off 
02.
:: ggtkgv.bat made by Markus Wichmann 2005 & Copyright the same 
03.
:: Syntax: %0 zahl1 zahl2 [/s] 
04.
:: Berechnet das kleinste gemeinsame Vielfache und den größten gemeinsamen Teiler 
05.
call :paramcheck %1 %2 
06.
if %3==/s endlocal 
07.
call :ggt %1 %2 
08.
echo ggT(%1,%2)=%ggt% 
09.
set /a kgv=%1 * %2 / %ggt% 
10.
echo kgV(%1,%2)=%kgv% 
11.
goto :eof 
12.
 
13.
:ggt 
14.
endlocal 
15.
set z1=%1 
16.
set z2=%2 
17.
for /l %%i in (1,1,1000) do ( 
18.
  set /a z3=!z1!%%!z2! 
19.
  if z3==0 ( 
20.
    set ggt=!z2! 
21.
    goto :eof 
22.
23.
  set z1=!z2! 
24.
  set z2=!z3! 
25.
26.
 
27.
:paramcheck 
28.
if X%1==X ( 
29.
  echo Parameter 1 wurde nicht angegeben. 
30.
  md 2>nul 
31.
  goto :showhelp 
32.
33.
if X%2==X ( 
34.
  echo Parameter 2 wurde nicht angegeben. 
35.
  md 2>nul 
36.
  goto :showhelp 
37.
38.
if %1==/? goto :showhelp 
39.
if %1==-? goto :showhelp 
40.
if %1==/h goto :showhelp 
41.
if %1==-h goto :showhelp 
42.
set /a h=%1 - %2 
43.
if %h%==0 ( 
44.
  echo Einer der Parameter oder beide sind keine Zahlen oder gleichen sich 
45.
  md 2>nul 
46.
  goto :showhelp 
47.
48.
goto :eof 
49.
 
50.
:showhelp 
51.
echo Syntax: 
52.
echo ggtkgv zahl1 zahl2 
53.
echo zahl1,zahl2 Zahlen von denen der größte gemeinsame Teiler und das kleinste 
54.
echo             gemeinsame Vielfache ermittelt werden soll. 
55.
exit /b 1
ABER: Direkt nach dem zweiten Schleifendurchlauf (die Schleife wird ja immer als Klotz durchgeführt) erhalte ich eine Fehlermeldung namens: Fehler: Division durch Null.
Un nü??
Danke für etwaige Antworten.
Mitglied: Biber
16.11.2005 um 20:54 Uhr
Moin nullplan001,

war nichts Gravierendes - eher Tippfehler und eine Stelle, wo der CMD-Interpreter eben nicht alle Sprachelemente von VB-Skript abdeckt.

Die Tippfehler (weil da jeder reintappt früher oder später):
...
set z1=%1
set z2=%2
.................wenn dummerweise ein Leerzeichen dranhängt in dieser Eingabezeile, steht da "set z1=%1 "
Dann wird z1 beim übergebenen Parameter 28 statt der Zahl 28 zum String "28 "
.... workaround siehe unten im Batch.
~~~~~~~~~~~~~
~~~~~~~~~~~~~
set /a z3=!z1!%%!z2!
if z3==0 (

...so viel Mühe bei der MOD-Zeile... aber die Zeile darunter muss
if %z3%==0 ( ........lauten. Flüchtigkeitsfehler.
~~~~~~~~~~~~
~~~~~~~~~~~~
if %3==/s .................wenn kein dritter Parameter übergeben wird, steht da: "if ==/s " -->Syntaxfehler
...

..und ein Script-sprachliches Problem: der CMD-Interpreter kennt zwar FOR-Schleifen, aber kein "Exit For", wie Du es in VBS verwendet hast. Okay, die 1...1000-Schleife kostet kaum Zeit, aber er läuft sie halt bis 1000 durch, auch wenn er nach dem ersten Durchgang schon den ggT ermittelt hat.

ich habs mal ein bisschen geflickt.. der Output wäre z.B.:
01.
>e:\kgVggT.bat 34 2654 
02.
ggT(34,2654)=2 
03.
kgV(34,2654)=45118 
04.
 
05.
>e:\kgVggT.bat 27 3 
06.
ggT(27,3)=3 
07.
kgV(27,3)=27 
08.
 
09.
>e:\kgVggT.bat 28 3 
10.
ggT(28,3)=1 
11.
kgV(28,3)=84 
12.
 
13.
>e:\kgVggT.bat 12 15 
14.
ggT(12,15)=3 
15.
kgV(12,15)=60
Der marginal geänderte Code:
01.
::*** edited Biber *** @echo off  
02.
@echo off & setlocal enableDelayedExpansion 
03.
:: ggtkgv.bat made by Markus Wichmann 2005 & Copyright the same & No rights wanted By Beaver 
04.
:: Syntax: %0 zahl1 zahl2 [/s]  
05.
:: Berechnet das kleinste gemeinsame Vielfache und den größten gemeinsamen Teiler  
06.
set /a "ggT=0" 
07.
call :paramcheck %1 %2  
08.
::*** edited Biber *** if %3==/s endlocal 
09.
::*** Biber wenn jemals, dann so ***if [%3]==[/s] endlocal 
10.
call :ggt %1 %2  
11.
echo ggT(%1,%2)=%ggt%  
12.
set /a kgv=%1 * %2 / %ggt%  
13.
echo kgV(%1,%2)=%kgv%  
14.
goto :eof  
15.
 
16.
:ggt  
17.
::*** deleted Biber *** endlocal  
18.
::*** edited Biber *** set z1=%1  
19.
::*** edited Biber *** set z2=%2  
20.
set /a "z1=%1" 
21.
set /a "z2=%2" 
22.
 
23.
for /l %%i in (1,1,1000) do if !ggT! EQU 0 call :getggt 
24.
goto :eof 
25.
 
26.
:getggt 
27.
set /a "z3=!z1!%%!z2!" 
28.
if %z3%==0 (  
29.
set /a "ggt=!z2!" 
30.
goto :eof  
31.
32.
set /a "z1=!z2!" 
33.
set /a "z2=!z3!" 
34.
goto :eof  
35.
 
36.
:paramcheck  
37.
if X%1==X (  
38.
echo Parameter 1 wurde nicht angegeben.  
39.
::*** delited Biber *** md 2>nul  
40.
goto :showhelp  
41.
)  
42.
if X%2==X (  
43.
echo Parameter 2 wurde nicht angegeben.  
44.
::*** edited Biber *** md 2>nul  
45.
goto :showhelp 
46.
47.
 
48.
if %1==/? goto :showhelp  
49.
if %1==-? goto :showhelp  
50.
if %1==/h goto :showhelp  
51.
if %1==-h goto :showhelp  
52.
Set /a "Nullcheck=%1*%2" >nul 2>nul 
53.
If Errorlevel 1 ( 
54.
  Echo Ein oder beide Parameter haben den Wert 0! 
55.
  goto :Showhelp 
56.
)   
57.
set /a "h=%1 - %2" 
58.
if %h%==0 (  
59.
echo Einer der Parameter oder beide sind keine Zahlen oder gleichen sich  
60.
::*** edited Biber *** md 2>nul  
61.
goto :showhelp  
62.
63.
goto :eof  
64.
 
65.
:showhelp  
66.
echo Syntax:  
67.
echo ggtkgv zahl1 zahl2  
68.
echo zahl1,zahl2 Zahlen von denen der größte gemeinsame Teiler und das kleinste  
69.
echo gemeinsame Vielfache ermittelt werden soll.  
70.
exit /b 1
HTH Biber
Bitte warten ..
Mitglied: Biber
17.11.2005 um 13:40 Uhr
Moin nullplan001,

sorry, eines hatte ich gestern noch vergessen bzw. auch im Source nicht zu Ende geführt.

Da, wo Du bisher dieses "md 2>nul " stehen hattest...
Ziel des Ganzen ist je das Setzen eines Errorlevels. Da aber alle Errorlevels ohnehin in der :Showhelp gesetzt werden, kannst Du der natürlich auch eine "interne" Fehlerkennung setzen, die dann in der :Showhelp (und nur dort) in einen Exitcode umgesetzt wird.

...also im ganzen Satz:
HEUTE:
...steht an -zig Stellen "md 2>nul" == Setze Errorlevel auf 1
... wird in der :Showhelp ohnehin immer genau der gleiche Exitcode 1 gesetzt "exit /b 1"
HEUTEaber später am Tach)
...steht an -zig Stellen set "MyErrorLevel=2" oder ..3 oder 4... je nach Fehlerort
...und in der :Showhelp wird dann "Exit /b %MyErrorLevel%+0" gesetzt.
( "+0" nur für den Fall, dass an irgeneiner Stelle die Variable MyErrorlevel vergessen wurde/leer ist.)

Grüße
Biber
Bitte warten ..
Mitglied: nullplan001
18.11.2005 um 15:54 Uhr
Oh, danke Biber. Das mit den Quotes wusste ich nicht und das "/a" hatte ich weggelassen, weil dann immer "Fehlender Operand" kam. Klar, ohne Quotes hängt er sich an den eigentlich nicht vorhandenen Leerzeichen auf. Na ja, edit.com sind Leerzeichen eh egal, wenn man navigiert, darum fallen Leerzeichen am Zeilenende gar nicht auf. Nebenbei, gibt es bei notepad.exe einen Auto-Indent-Mode? Ich habe zwar keinen gefunden (auch nicht in der Hilfe, aber da steht ja eh nie was ordentliches.Um dich zu zitieren: "Deinen Jungs möchte ich mal beim coden zusehen, Billy"(Batch-Workshop, Part III))
Bitte warten ..
Mitglied: Biber
18.11.2005 um 17:00 Uhr
Moin, Markus,

sieh mal zu, dass Du den Editor wechselst - ich nehme zum Coden (selbst für Batch-Files) einen der Editoren á la TextPad oder UltraEdit - irgendetwas, dass AutoIndent-Mode hat und mir ein Syntax-Highlightning ermöglicht. Da kommen sicherlich Edit und M$'s NotePad nie hin.

Meinen NotePad habe ich zwar geringfügig getunt, weil er ja doch bei diesen oder jenen File-Typen laut Registry-Standard-Einstellungen automatisch aufklappt, aber einen "AutoIndent-Switch" in der Registry habe ich nicht gefunden. Auch nicht ernsthaft gesucht.
Die paar Keys, die Du ggf. nachtragen kannst in der Reg unter [HKCU\Software\Microsoft\Notepad] sind:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Notepad]
; ....die üblichen lass ich mal raus
"fWrap"=dword:00000001
; nix Zeilenbruch ohne zu fragen
"StatusBar"=dword:00000001
; Zeilen+Spaltenpos anzeigen
"fSaveWindowPositions"=dword:00000000
"fSavePageSettings"=dword:00000001
; Fensterpositionen merken nach Geschmack
;....
"lfFaceName"="Tahoma"
"lfPitchAndFamily"=dword:00000031
"iPointSize"=dword:00000064
; Tahoma als Schriftart in erträglicher Auflösung (ich nehme es ja nicht zum Coden)
;....
"szHeader"="&n &d &l"
"szTrailer"="Seite &s"

Glaube nicht, das sich aus Notepad mehr rausholen lässt. geh lieber auf http://www.textPad.de.

Grüße
Frank / der Biber aus Bremen
Bitte warten ..
Ähnliche Inhalte
JavaScript
Problem Bei JavaSkript Rechnung Division
Frage von HattoriHanzoJavaScript5 Kommentare

Wo Liegt hier der Fehler? bis Zeile 20 hat noch alles funktioniert.

Batch & Shell
Führende Nullen hinzufügen
gelöst Frage von Erik72Batch & Shell6 Kommentare

Hallo ihr Lieben, ich habe folgendes Script und wünsche führende Nullen bei der Ausgabe. Kann mir bitte jemand helfen? ...

Batch & Shell
PDFTK Zeichnungen stempeln mit führender NULL
Frage von Herby-zBatch & Shell4 Kommentare

Hallo zusammen, ich würde gerne mit PDFTK meine Zeichnungen stempeln Die Zeichnungen haben folgendes Format 00026973.pdf, also eine 8-stellige ...

Batch & Shell
Zeitstempel mit führenden Nullen in den Stunden vor 10
gelöst Frage von jan99Batch & Shell4 Kommentare

Moin ! ich generiere einen Zeitstempel wie folgt: FOR /F "tokens=1,2,3,4 delims=/. " %%a in ('date/T') do set CDATE=%%c-%%b-%%a ...

Neue Wissensbeiträge
Windows 10

Autsch: Microsoft bündelt Windows 10 mit unsicherer Passwort-Manager-App

Tipp von kgborn vor 23 StundenWindows 102 Kommentare

Unter Microsofts Windows 10 haben Endbenutzer keine Kontrolle mehr, was Microsoft an Apps auf dem Betriebssystem installiert (die Windows ...

Sicherheits-Tools

Achtung: Sicherheitslücke im FortiClient VPN-Client

Tipp von kgborn vor 1 TagSicherheits-Tools

Ich weiß nicht, wie häufig die NextGeneration Endpoint Protection-Lösung von Fortinet in deutschen Unternehmen eingesetzt wird. An dieser Stelle ...

Internet

USA: Die FCC schaff die Netzneutralität ab

Information von Frank vor 1 TagInternet3 Kommentare

Jetzt beschädigt US-Präsident Donald Trump auch noch das Internet. Der neu eingesetzte FCC-Chef Ajit Pai ist bekannter Gegner einer ...

DSL, VDSL

ALL-BM200VDSL2V - Neues VDSL-Modem mit Vectoring von Allnet

Information von Lochkartenstanzer vor 1 TagDSL, VDSL2 Kommentare

Moin, Falls jemand eine Alternative zu dem draytek sucht: Gruß lks

Heiß diskutierte Inhalte
Windows Server
GPO nur für bestimmte Computer
Frage von Leo-leWindows Server13 Kommentare

Hallo Forum, gern würde ich ein Robocopy script per Bat an eine GPO hängen. Wichtig wäre aber dort der ...

Windows Server
KMS Facts for Client configuration
Frage von winlinWindows Server13 Kommentare

Hey Leute, wir haben in unserem Netz nun einen neuen KMS Server. Haben Bestands-VMs die noch nicht aktiviert sind. ...

Windows Tools
Software-Tool zum Entfernen von bösartigem Windows
Frage von emeriksWindows Tools11 Kommentare

Hi, siehe Betreff hat das jemals irgendjemand schonmal sinnvoll eingesetzt? (MRT) E.

Router & Routing
OpenWRT bzw. L.E.D.E auf Buffalo WZR-HP-AG300H - update
gelöst Frage von EpigeneseRouter & Routing11 Kommentare

Guten Tag, ich habe auf einem Buffalo WZR-HP-AG300H die alternative Firmware vom L.E.D.E Projekt geflasht. Ich bin es von ...