Hallo zusammen, ich habe mal ein kleines Tool zum Berechnen von Spannungsteilern geschrieben. Nach Eingabe der entsprechenden Widerstandsreihe (E3, E6, E12, ..., E192) und einigen Parametern (z.B. Eingangs- und Ausgangsspannung, sowie Gesamtwiderstand) berechnet das Prog die entsprechenden Widerstandswerte. Unterstützt werden "Netzwerke" aus bis zu zwei Widerständen in Serie oder parallel. Vielleicht hilft es ja dem Einen oder Anderen. Verbesserungsvorschläge und Fehlerberichte sind selbstverständlich willkommen. Gruss, Philipp
Besonders was die Steuerung mittels Kommandozeile anbelangt habe ich hier wohl etwas Mist gebaut. Sollte jetzt besser sein.
Gast
#723014
Für welchen Compiler hast du das Teil geschrieben? Mein VisualStudio C++ bringt Fehler beim Compilieren.
Mit Visual Studio 2005 und GCC (Unter Linux). Was denn für Fehler?
Gast
#723066
Der hier: C:\Temp\RDC\RDC.cpp(141) : error C2371: 'i' : Neudefinition; unterschiedliche Basistypen C:\Temp\RDC\RDC.cpp(82) : Siehe Deklaration von 'i' C:\Temp\RDC\RDC.cpp(603) : error C2065: 'max' : nichtdeklarierter Bezeichner
Hm, seltsam. Wenn ich es mit Visual C++ 6.0 kompiliere bekomme ich ebenfalls diese Fehler. Naja, hab's jetzt mal entsprechend geändert, damit sollte es nun gehen.
Wer sich getraut kann auch gleich die kompilierte Exe ausführen.
Gast
#734859
49 downloads und keine Reaktion ?
Gast
#734861
Wahnsinn! Das Programm ist genial, ich werde morgen mal ein GUI schreiben. Wenn Interesse besteht, lade ich es hier hoch.
@Andreas: Entweder hat's alle umgehauen oder das Prog ist einfach keinen Kommentar wert ;) @Latex: Danke :)
Hier mal eine Umsetzung mit Visual Studio (VC++ 6.0) in ein Windows Programm. Ich hab zwar die MFC statisch gelinkt, kann aber nicht ausschliessen, dass nicht ev. eine DLL oder LIB fehlt. Bei Bedarf bitte melden.
@Karl heinz Buchegger Win98se --> Geht ohne Lib (bzw... hab VC6 Lib wohl irgenwann mal installiert...) Lösung: R1 = 2.2 Ohm in Reihe zu 10.0 Ohm R2 = 10.0 Ohm parallel zu 47.0 Ohm Widerstand = 20.4 Ohm Abweichung für U1 = 12.0 V: U2 = 4.8 V -3.2 % Abweichung für U2 = 5.0 V: U1 = 12.4 V 3.3 %
@Karl Heinz Buchegger: Danke für die Arbeit, funktioniert einwandfrei. Ich sehe zwar nicht ganz ein, wozu man da eine GUI braucht, aber ich will mich deswegen ja nicht beklagen :) @Läubi: Ist irgendwas mit dem Ergebnis nicht in Ordnung oder ist das der Beweis, dass es funktioniert?
Gast
#736754
Naja Kommandozeile muss man im 21. Jahrhundert nun wirklich nicht mehr haben...
Philipp Burch wrote: > @Karl Heinz Buchegger: > > Danke für die Arbeit, funktioniert einwandfrei. Ich sehe zwar nicht ganz > ein, wozu man da eine GUI braucht, aber ich will mich deswegen ja nicht > beklagen :) Hauptsächlich deshalb, weil ich mir dann keine Command Line Options merken muss. Und jedesmal dann vorher das ganze mit Help aufrufen, nur um dann zu grübeln ob zwischen Command Line Switch und zugehörigem Argument ein Blank reinmuss oder nicht, und überhaupt ... Bin halt schon etwas älter :-) Ach ja: Ein Bug ist mir aufgefallen. Du hast da 2 Abfragen drinn (aus dem Kopf zitiert) if( dev < 1.0 / 1000000.0 ) cout << "dev < 1ppm"; dass muss natürlich heissen if( fabs( dev ) < 1.0 / 100000.0 ) cout << "dev < 1ppm"; dev kann auch negativ werden.
Gast
#736912
Au mann für sowas banales ein Programm? Das sollte jeder der etwas von sich hällt im gebiet Elektrontechnik doch auch so hinbekommen? Ein Spannungsteiler is ja jetzt mal nciht soo schwierig der erklärt sich ja schon durch das Wort Spannungsteiler wie von selbst...
Gast
#736916
@Stefan: Dann rechnest du garantiert wenn du eine Schaltung entwirfst oder bei einer bestehenden Schaltung etwas Feintuning betreibst die notwendigen Widerstandswerte im Kopf aus? Und weißt natürlich auch sofort VORHER dass der notwendige zweite (oder dritte) Widerstand im Teiler auch in der Bastelkiste vorhanden ist? Respekt.... ;) Nettes Tool, hab bisher immer Excel bzw Calc dafür bemüht..
Stefan wrote: > Au mann für sowas banales ein Programm? Das sollte jeder der etwas von > sich hällt im gebiet Elektrontechnik doch auch so hinbekommen? Ein > Spannungsteiler is ja jetzt mal nciht soo schwierig der erklärt sich ja > schon durch das Wort Spannungsteiler wie von selbst... Im Prinzip hast du Recht. Ich hatte heute das 'Problem' einen Spannungsteiler von 12V auf 5V zu rechnen, wobei ich einen Widerstand mit 10k ausführen möchte. Klar hätte ich mir einen Taschenrechner nehmen können und das schnell durchrechnen. Ich hab mich halt an das Programm erinnert und in einer schwachen Stunde das Original in VC++ mit einer GUI drumherum versehen. Ist ja auch nicht ganz uninteressant, wenn dir das Programm dann auch noch heraussucht, welche Widerstände es überhaupt in der E-Serie gibt und dir auch noch ausrechnet, welcher Fehler sich dadurch ergibt. Oder: Du weist welche Spannung du erreichen möchtest und welchen Gesamtwiderstand der Spannungsteiler haben soll. Wie gross sollen die Widerstände sein? Wie kann man mit einer Parallel- bzw. Serienschaltung die geforderten Widerstände des Teilers erreichen? Klar: Das alles ist keine Raketentechnik. Aber die vornehmste Aufgabe eines Computer ist es doch, mir Routinearbeit abzunehmen :-) (Und ehrlich gesagt, weiß ich die Formeln nicht auswendig. Und wenn ich die Formeln jedesmal neu ableiten muss, dann kann ich mir die Formeln auch ein für allemal in ein Programm packen)
Karl heinz Buchegger wrote: > Philipp Burch wrote: >> @Karl Heinz Buchegger: >> >> Danke für die Arbeit, funktioniert einwandfrei. Ich sehe zwar nicht ganz >> ein, wozu man da eine GUI braucht, aber ich will mich deswegen ja nicht >> beklagen :) > > Hauptsächlich deshalb, weil ich mir dann keine Command Line > Options merken muss. Und jedesmal dann vorher das ganze mit > Help aufrufen, nur um dann zu grübeln ob zwischen Command Line > Switch und zugehörigem Argument ein Blank reinmuss oder nicht, > und überhaupt ... Bin halt schon etwas älter :-) Das Prog läuft auch wenn du ihm keinen Parameter gibst ;) Aber egal, jedem das Seine. Ich kann ja auch nicht von mir behaupten, dass ich dieses schwarze Fensterchen einer anständigen GUI vorziehe... > Ach ja: Ein Bug ist mir aufgefallen. > Du hast da 2 Abfragen drinn (aus dem Kopf zitiert) > > if( dev < 1.0 / 1000000.0 ) > cout << "dev < 1ppm"; > > dass muss natürlich heissen > > if( fabs( dev ) < 1.0 / 100000.0 ) > cout << "dev < 1ppm"; > > dev kann auch negativ werden. Da hast du natürlich Recht, danke! @Stefan: Ich wusste, dass das noch kommen musste. Daher habe ich mir auch schon entsprechende Argumente zurechtgelegt: 1. "Ein Elektrotechniker der was auf sich hält" verwendet Hilfsmittel die ihm das Leben erleichtern. Jeder Mensch ist von Natur aus faul ;) 2. Es geht ja nicht darum, bei gegebener Eingangsspannung und zwei Widerständen die Ausgangsspannung zu berechnen. Das ist wirklich banal. Aber es geht darum, den "idealen" Spannungsteiler aus einer Kombination von bis zu vier Widerständen zu finden. Das ist im Kopf doch nicht mehr ganz so trivial. 3. Es gibt schon genügend unnütze Programme, da kommt's auf Eines mehr oder weniger eh nicht mehr an. 4. Rumtrollen kannste woanders, wenn es deine Ehre nicht zulässt, sowas zu verwenden zwingt dich ja auch keiner dazu.
Karl heinz Buchegger wrote: > (Und ehrlich gesagt, weiß ich die Formeln nicht auswendig. Und > wenn ich die Formeln jedesmal neu ableiten muss, dann kann ich mir > die Formeln auch ein für allemal in ein Programm packen) Ich merk mir die Formel so: Gesamtstrom ausrechnen durch beide Widerstände (ist klar: I=U/R wobei R=R1+R2) Spannung am unteren Widerstand ausrechnen (auch klar: U=R*I wobei I=ausgerechneter Gesamtstrom) So kann man sich die "Spannungsteiler-Formel" ganz gut merken. Falls du das nicht ohnehin schon meintest mit herleiten. Wenn man natürlich nen gegebenen Widerstand hat und den anderen Ausrechnen muss, hilft bei mir auch nur noch aufschreiben und umstellen der kompletten Formel - hier ist so eine kleine Applikation natürlich ordentlich im Vorteil.
Gast
#737166
Nun ja, dabeisein ist eben alles! Schönes neues Jahr!
Ich hab das Programm mal kurz getestet und es gibt ja die häkchen für "Parallel / Serienschaltung zulassen", zulassen klingt für mich, als würde er trotzdem die optimale Konfiguration finden, auch wenn der Fehler geringer ist, wenn man nur einen Widerstand nutzt. Hier das "Problem": Eingabedaten U1: 5V, U2 = 3.3V, Rges = 10kOhm Ohne Parallel/Serienschaltung errechnet das Programm einen fehler von 3,2%, wenn man die Parallel/Serienschaltung zulässt, errechnet das Programm größere Fehler. Anscheinend ist dem Programm der gegebene Gesammtwiderstand "wichtiger" als eine möglichst korrrekte Ausgangsspannug. Klar kann man jetzt klicken und gucken wo das beste Ergebnis rauskommt, aber ... ;) Edit: war jetzt bezogen auf Widerstandsreihe 3, war halt so eingestellt ;)
Hauke Radtki wrote: > Ich hab das Programm mal kurz getestet und es gibt ja die häkchen für > "Parallel / Serienschaltung zulassen", zulassen klingt für mich, als > würde er trotzdem die optimale Konfiguration finden, auch wenn der > Fehler geringer ist, wenn man nur einen Widerstand nutzt. > > Hier das "Problem": Eingabedaten U1: 5V, U2 = 3.3V, Rges = 10kOhm > > Ohne Parallel/Serienschaltung errechnet das Programm einen fehler von > 3,2%, wenn man die Parallel/Serienschaltung zulässt, errechnet das > Programm größere Fehler. > Anscheinend ist dem Programm der gegebene Gesammtwiderstand "wichtiger" > als eine möglichst korrrekte Ausgangsspannug. Ja, das ist mir auch schon aufgefallen. Das Problem liegt in der Art der Berechnung: Zuerst wird anhand von U1, U2 und Rges der rechnerisch exakte Wert für R1 berechnet. Dann wird die passende Kombination für R1 gesucht und anschliessend R2 anhand der beiden Spannungen und Rges berechnet und gesucht. Warum ich das allerdings so gelöst habe ist mir ehrlich gesagt ein Rätsel. Sinnvoller wär's, R2 anhand der Spannungen und R1 zu berechnen. Ich hatte da wohl mal wieder geschlafen ;) Ist korrigiert.
@Philipp oder Karl Heinz, nettes kleines Tool. Lust weiter zu machen ???? OPV Grundschaltungen ???? Immer wieder lästig diese Rechnerei und Formelumstellung. Danke und Gruß Stephan
Stephan Henning wrote: > @Philipp oder Karl Heinz, > > nettes kleines Tool. > Lust weiter zu machen ???? OPV Grundschaltungen ???? > Immer wieder lästig diese Rechnerei und Formelumstellung. Danke. OPVs brauche ich nicht so häufig, aber da liesse sich bestimmt was machen. Schreib doch mal auf, was das Tool alles können sollte, vielleicht habe ich wiedermal ein Weilchen Zeit für sowas ;) Sollte man das später im gleichen Tool kombinieren oder lieber ein neues Programm schreiben?
wenn ich wünschen dürfte............ ein Proggi mit kleinen Icons für Spannungsteiler, OPV, etc.pp etc.pp steht für Dinge die Dir oder anderen noch einfallen würden und natürlich für Dich machbar sind. Aber rein "elektronische" Berechnungen. Bei OPV schau mal in die Sparte : http://www.mikrocontroller.net/articles/Operationsverst%C3%A4rker-Grundschaltungen Wobei ich nicht sagen will, was davon wirklich oft benötigt wird. Aber der invertierende und nichtinvertierende wird immer gebraucht. Der Komparator auch. Gruß
Stephan Henning wrote: > wenn ich wünschen dürfte............ Du darfst. Was wirklich umgesetzt wird steht ja eh auf einem anderen Blatt ;) > ein Proggi mit kleinen Icons für Spannungsteiler, OPV, etc.pp "Symbole" klingt nach GUI, damit habe ich in C++ keine Erfahrung... Ich könnte natürlich ein Schwarzes-Fenster-Nur-Mit-Text-Programm machen und es jemand anderem überlassen, dazu eine GUI zu basteln. So wie von Karl heinz bereits begonnen. > etc.pp steht für Dinge die Dir oder anderen noch einfallen würden und > natürlich für Dich machbar sind. > Aber rein "elektronische" Berechnungen. > > Bei OPV schau mal in die Sparte : > http://www.mikrocontroller.net/articles/Operationsverst%C3%A4rker-Grundschaltungen Ja, schlussendlich läuft da ja auch alles auf die Berechnung von Spannungsteilern, bzw. Widerstandskombinationen hinaus. Würde also relativ gut zum Prog passen. > Wobei ich nicht sagen will, was davon wirklich oft benötigt wird. > Aber der invertierende und nichtinvertierende wird immer gebraucht. > Der Komparator auch. Ich schau mal wann ich Zeit finde :)
Ich würd sagen ein extra Programm. Die ganzen Programme kann man dann gut unter einer GUI zusammenfassen. Ich wäre auch bereit da was mit Java hinzuklatschen ;)
Gast
#741269
Hab das Programm auch gerade runtergeladen und unter Linux kompiliert. Folgende Kommentare hätte ich dazu: - Funktioniert. - Das Programm ist sehr nützlich, da das Finden optimaler Widerstandspaare in den E-Reihen von Hand viel zu aufwendig ist. - Kommandozeilenversionen haben auch im Klickibuntizeitalter ihre Berechtigung. Vielleicht weniger auf Windowsplattformen, weil es dort kein geeignetes Tool (sprich Shell) gibt, wo man Kommandos komfortabel eingeben kann ;-), aber auf fast allen anderen Betriebs- systemen. Im Moment scheint auch nur die Kommandozeilenversion portabel zu sein. Als portables Zwischending zwischen Komandozeile und GUI hast du ja auch noch den Menümodus eingebaut. - Mein Eindruck ist, dass, wenn man die Maximalzahl von Widerständen für R1 und R2 mit 2 angibt, diese auch genutzt werden. Bsp.: E12, U1 = 5 V, U2 = 2 V, Rges = 25000 Ohm ergibt R1 = (6,8 + 8,2) kOhm und R2 = (1.8 + 8.2) kOhm. Das ist zwar korrekt, aber R1 = 15 kOhm und R2 = 10 kOhm wäre einfacher. Ist das beabsichtigt? Dann müsste aber "Maximum number of resistors" in "Number of resistors" umbenannt werden. - Wenn du in Zeile 38
1 | |
ein const vor das char schreibst, reduziert sich die Anzahl der Warnungen beim gcc 4.2.2 mit -Wall von 14 auf 0. - Bei der Ausgabe der Ergebnisse wäre zu überlegen, ob man zwischen Zahlen und Einheiten ein Leerzeichen einfügt. Ich bin mir bei 100Ohm immer etwas unsicher, ob das jetzt 100 oder 1000 Öhmer sind. Kann aber auch an meinen Augen liegen. Außerdem kann das ja jeder nach seinem Geschmack ändern. Ich habe natürlich auch die GUI-Variante von Karl Heinz ausprobiert, und zwar mangels einer Windows-Installation mit Wine unter Linux. Auch hier meine Kommentare: - Funktioniert ebenfalls. - Es werden keine Bibliotheken außer den mit Wine mitgelieferten Opensource-Bibliotheken benötigt. Wären alle Windows-Programme so geschrieben, könnte M$ bald schließen ;-) - Kleiner Schönheitsfehler: Die beiden V neben U1 und U2 stehen nicht exakt übereinander. Bevor ich jetzt Erbsenzähler gescholten werde: Ein Kritikpunkt muss ja sein, und ich konnte keinen anderen finden ;-) Zum scheinbaren Fehler der ersten Version von RDC.cpp: > Hm, seltsam. Wenn ich es mit Visual C++ 6.0 kompiliere bekomme ich > ebenfalls diese Fehler. Das ist ein Feature von VC6: Nach Standard ist eine Variable, die in Kopf einer For-Schleife definiert wird, nur innerhalb der Schleife gültig. VC6 sieht das anders. Man kann mittels einer Compiler-Option die Standardkonformität einschalten (oder zumindest etwas erhöhen). Dann verschwindet zwar die Fehlermeldung, dafür erntet man hunderte neue aus den mitgelieferten Include-Files, die ebenfalls den Standard mit Füßen treten ;-) In der Nachfolgeversion von VC sind diese Fehler im Compiler und den Include-Files behoben. > Ich würd sagen ein extra Programm. Die ganzen Programme kann man > dann gut unter einer GUI zusammenfassen. Ich wäre auch bereit da was > mit Java hinzuklatschen ;) Mit Java-Oberfläche würde das GUI plattformunabhängiger, und man könnte das Programm sogar auf einem besseren PDA oder Handy laufen lassen, hätte es also auch dabei, wenn man gerade auf Montage ist :) Dann würde es sich aber anbieten, das gesamte Programm nach Java umzuschreiben. Das dürfte ja wegen der Ähnlichkeit von C++ und Java nicht allzu heftig werden.
yalu wrote: > Hab das Programm auch gerade runtergeladen und unter Linux kompiliert. > Folgende Kommentare hätte ich dazu: > > - Funktioniert. Schön :) > - Das Programm ist sehr nützlich, da das Finden optimaler > Widerstandspaare in den E-Reihen von Hand viel zu aufwendig ist. > > - Kommandozeilenversionen haben auch im Klickibuntizeitalter ihre > Berechtigung. Vielleicht weniger auf Windowsplattformen, weil es > dort kein geeignetes Tool (sprich Shell) gibt, wo man Kommandos > komfortabel eingeben kann ;-), aber auf fast allen anderen Betriebs- > systemen. Im Moment scheint auch nur die Kommandozeilenversion > portabel zu sein. Als portables Zwischending zwischen Komandozeile > und GUI hast du ja auch noch den Menümodus eingebaut. Ja, ich würde sagen, der Menümodus geht eigentlich nicht so schlecht zum Verwenden. Ich mag sowas ;) > - Mein Eindruck ist, dass, wenn man die Maximalzahl von Widerständen > für R1 und R2 mit 2 angibt, diese auch genutzt werden. Bsp.: E12, > U1 = 5 V, U2 = 2 V, Rges = 25000 Ohm ergibt R1 = (6,8 + 8,2) kOhm > und R2 = (1.8 + 8.2) kOhm. Das ist zwar korrekt, aber R1 = 15 kOhm > und R2 = 10 kOhm wäre einfacher. Ist das beabsichtigt? Dann müsste > aber "Maximum number of resistors" in "Number of resistors" > umbenannt werden. Da hast du in der Tat recht. Ich hatte zwar eingebaut, dass er bei exakten Werten nur einen Widerstand verwendet, aber wenn er vorher auf eine passende Kombination gestossen ist, dann hat er die verwendet. Ist jetzt korrigiert, ich hoffe mal, ich habe nicht andere Fehler eingebaut... > - Wenn du in Zeile 38 >
1 | |
2 | |
> ein const vor das char schreibst, reduziert sich die Anzahl der > Warnungen beim gcc 4.2.2 mit -Wall von 14 auf 0. Danke für den Hinweis. Ist korrigiert. > - Bei der Ausgabe der Ergebnisse wäre zu überlegen, ob man zwischen > Zahlen und Einheiten ein Leerzeichen einfügt. Ich bin mir bei 100Ohm > immer etwas unsicher, ob das jetzt 100 oder 1000 Öhmer sind. Kann > aber auch an meinen Augen liegen. Außerdem kann das ja jeder nach > seinem Geschmack ändern. Also ich bin ja überhaupt kein Verfechter vom Plenken, da ziehe ich die angeklebte Variante definitiv vor. Leider ist 0 und O nunmal recht ähnlich... Ich hätte ja eigentlich gerne das richtige Zeichen verwendet, aber cmd.exe kommt schon mit Umlauten nicht recht klar, da brauche ich mit echten Unicode-Zeichen gar nicht kommen wollen ;) > Zum scheinbaren Fehler der ersten Version von RDC.cpp: > >> Hm, seltsam. Wenn ich es mit Visual C++ 6.0 kompiliere bekomme ich >> ebenfalls diese Fehler. > > Das ist ein Feature von VC6: Nach Standard ist eine Variable, die in > Kopf einer For-Schleife definiert wird, nur innerhalb der Schleife > gültig. VC6 sieht das anders. Man kann mittels einer Compiler-Option > die Standardkonformität einschalten (oder zumindest etwas erhöhen). > Dann verschwindet zwar die Fehlermeldung, dafür erntet man hunderte > neue aus den mitgelieferten Include-Files, die ebenfalls den Standard > mit Füßen treten ;-) > > In der Nachfolgeversion von VC sind diese Fehler im Compiler und den > Include-Files behoben. Achso, gut zu wissen. Da hat M$ wohl wiedermal sein eigenes Süppchen gekocht... >> Ich würd sagen ein extra Programm. Die ganzen Programme kann man >> dann gut unter einer GUI zusammenfassen. Ich wäre auch bereit da was >> mit Java hinzuklatschen ;) > > Mit Java-Oberfläche würde das GUI plattformunabhängiger, und man > könnte das Programm sogar auf einem besseren PDA oder Handy laufen > lassen, hätte es also auch dabei, wenn man gerade auf Montage ist :) > Dann würde es sich aber anbieten, das gesamte Programm nach Java > umzuschreiben. Das dürfte ja wegen der Ähnlichkeit von C++ und Java > nicht allzu heftig werden. Über die Verwendung von Java hatte ich am Anfang auch nachgedacht, habe mich dann allerdings an unseren Pflicht-Programmierkurs in Java erinnert und es daraufhin sein gelassen. Wäre aber sicher eine Überlegung wert, vielleicht gibt es hier ja auch Java-Jünger, die gerade nix zu tun haben. Danke für das Feedback!
Und hier mal wieder eine aktuelle Exe. Lässt die sich eigentlich so ausführen? Ich hab' immer noch nicht so recht verstanden, was ich einstellen muss, damit alle benötigten Ressourcen dazugelinkt werden...
Und hier die GUI Variante dazu. @Phillip Ohne das jetzt kontrolliert zu haben: Die Änderung bezog sich nur auf get_nearest_combination. Richtig? Zumindest mit dem oben genannten Testfall kommt bei mir 10k + 15k raus. >> In der Nachfolgeversion von VC sind diese Fehler im Compiler und den >> Include-Files behoben. > > Achso, gut zu wissen. Da hat M$ wohl wiedermal sein eigenes Süppchen > gekocht... Der 'Fairness' halber: ursprünglich wars im Stroustroup C++ so wie M$ das hatte. Der Scope der Schleifenvariable in for( int i = 0; i < 5; ++i ) { } war nicht auf die Schleife beschränkt. War irgendwie sogar logisch, da ja die Variable wenn mans genau betrachtet ausserhalb des { } Blocks definiert wurde. Aus praktischen Gründen hat man aber im ersten C++ Standard den Scope der Variablen dem { } Block zugeschlagen. Macht irgendwie mehr Sinn. Nur: Den ersten C++ Standard gabs 1999. VC++ 6.0 kam 1998 auf den Markt. Klar, M$ hatte Leute in den Gremien sitzen, hat also schon frühzeitig gewusst, was da kommen wird. Da wird dann aber die Zeit nicht mehr gereicht haben, die komplette MFC dahingehend umzuarbeiten, bzw. man wollte kein Risiko eingehen.
Karl heinz Buchegger wrote:
> Und hier die GUI Variante dazu.
Ooops. Anhang vergessen
Karl heinz Buchegger wrote: > Und hier die GUI Variante dazu. > > @Phillip > Ohne das jetzt kontrolliert zu haben: Die Änderung bezog > sich nur auf get_nearest_combination. Richtig? Fast. Die Definition von 'InvalidInputException' habe ich noch mit dem 'const' versehen (Siehe yalus Post oben). Ausserdem habe ich in 'find_values()' noch einige Überprüfungen auf plausible Werte eingebaut. Das betrifft allerdings eigentlich nur die Kommandozeilenversion. 'make_nice_val()' habe ich ebenfalls noch leicht korrigiert, da gab's noch ein Problem mit negativen Werten. Müsste jetzt auch passen (Negative Spannungen werden ja auch unterstützt, ist allerdings nicht wirklich sinnvoll). > Zumindest mit dem oben genannten Testfall kommt bei mir > 10k + 15k raus. Dann hast du die wichtigste Änderung erwischt ;) >>> In der Nachfolgeversion von VC sind diese Fehler im Compiler und den >>> Include-Files behoben. >> >> Achso, gut zu wissen. Da hat M$ wohl wiedermal sein eigenes Süppchen >> gekocht... > > Der 'Fairness' halber: ursprünglich wars im Stroustroup C++ so > wie M$ das hatte. Der Scope der Schleifenvariable in > > for( int i = 0; i < 5; ++i ) > { > } > > war nicht auf die Schleife beschränkt. War irgendwie sogar logisch, > da ja die Variable wenn mans genau betrachtet ausserhalb des { } > Blocks definiert wurde. Aus praktischen Gründen hat man aber im > ersten C++ Standard den Scope der Variablen dem { } Block > zugeschlagen. Macht irgendwie mehr Sinn. > > Nur: Den ersten C++ Standard gabs 1999. VC++ 6.0 kam 1998 auf den > Markt. Klar, M$ hatte Leute in den Gremien sitzen, hat also > schon frühzeitig gewusst, was da kommen wird. Da wird dann aber > die Zeit nicht mehr gereicht haben, die komplette MFC dahingehend > umzuarbeiten, bzw. man wollte kein Risiko eingehen. Ok, so gesehen sollte man M$ wohl nicht zu start verurteilen. Aber es gibt ja genügend andere Standards die sie mit Füssen treten ;)
Gast
#741703
Intervall >> - Mein Eindruck ist, dass, wenn man die Maximalzahl von >> Widerständen für R1 und R2 mit 2 angibt, diese auch genutzt >> werden. > Ist jetzt korrigiert, ich hoffe mal, ich habe nicht andere Fehler > eingebaut... Scheint zu funktionieren. >> ein const vor das char schreibst, reduziert sich die Anzahl der >> Warnungen beim gcc 4.2.2 mit -Wall von 14 auf 0. > > Danke für den Hinweis. Ist korrigiert. Ja, alle Warnungen sind weg. >> - Bei der Ausgabe der Ergebnisse wäre zu überlegen, ob man zwischen >> Zahlen und Einheiten ein Leerzeichen einfügt. > Also ich bin ja überhaupt kein Verfechter vom Plenken, da ziehe ich > die angeklebte Variante definitiv vor. Das hat mit Plenken (Leerzeichen vor Satzzeichen) nichts zu tun. Typo- graphisch korrekt wäre eigentlich ein kleiner Abstand zwischen Zahl und Einheit. Da es aber in der Terminalschrift keine halben Leerzei- chen gibt, muss man sich entscheiden, ob man dieses auf 1 Leerzeichen auf- oder auf 0 abrundet. Aber, wie gesagt, das kann jeder halten wie er will. > Und hier mal wieder eine aktuelle Exe. Lässt die sich eigentlich so > ausführen? Unter Wine ja, und deswegen wahrscheinlich in jedem "echten" DOS/Windows erst recht. Aber die Exe scheint nicht aus deinem main.cpp vom 4.1.08 um 11:26 entstanden zu sein. Für die folgende Eingabefolge (im Menümodus)
1 | |
liefert main.cpp ein Ergebnis, RDC.exe hingegen "No suitable solution
could be found for R1!". Auch die GUI-Variante von Karl Heinz bringt
die Fehlermeldung. Oder liegt die Lösung vielleicht so hart an der
Toleranzschwelle, dass Rundungsfehler in der FP-Lib von GNU bzw. MS zu
diesem Unterschied führen?
Jetzt hätte ich noch einen Verbesserungsvorschlag, den ich gestern
vergessen habe:
Ohne mir ihn näher angeschaut zu haben, scheint dein Algorithmus bei
Eingabe von U1, U2 und Rges eine Lösung zu suchen, bei der der Fehler
sowohl von U2 als auch von Rges minimiert wird. In der Praxis ist der
Fehler von Rges oft (wenn auch nicht immer) unerheblich. Wenn ich, wie
in obigem Beispiel, einen Teiler von 5V nach 2V suche, ist mir
ziemlich egal, ob Rges 10k oder 100k beträgt (1k oder 1M wären
allerdings ungünstig). Wenn ich nun auf gut Glück 20k vorgebe, bekomme
ich eine Lösung mit -1,46% Fehler für U2, obwohl mir die Lösung mit
25k und 0% Fehler lieber gewesen wäre.
Schön wäre es deswegen, wenn der Rges-Fehler vom Benutzer vorgegeben
werden könnte, entweder in Prozenten oder als Intervall (bspw. 10k bis
100k).
Karl heinz Buchegger schrieb:
> Und hier die GUI Variante dazu.
Ha, die beiden V stehen jetzt richtig übereinander ;-) Vielen Dank!
yalu wrote: >>> - Bei der Ausgabe der Ergebnisse wäre zu überlegen, ob man zwischen >>> Zahlen und Einheiten ein Leerzeichen einfügt. >> Also ich bin ja überhaupt kein Verfechter vom Plenken, da ziehe ich >> die angeklebte Variante definitiv vor. > > Das hat mit Plenken (Leerzeichen vor Satzzeichen) nichts zu tun. Typo- > graphisch korrekt wäre eigentlich ein kleiner Abstand zwischen Zahl > und Einheit. Da es aber in der Terminalschrift keine halben Leerzei- > chen gibt, muss man sich entscheiden, ob man dieses auf 1 Leerzeichen > auf- oder auf 0 abrundet. Aber, wie gesagt, das kann jeder halten wie > er will. Gut, "Plenken" war vielleicht das falsche Wort. Sollte eigentlich mehr eine Anspielung auf das Problem bei Zeilenumbrüchen sein. Ist hier allerdings wohl eher unerheblich... Naja, ich überlasse es jedem selbst. Alternativ könnte die Einheit auch komplett weggelassen werden. >> Und hier mal wieder eine aktuelle Exe. Lässt die sich eigentlich so >> ausführen? > > Unter Wine ja, und deswegen wahrscheinlich in jedem "echten" Gut zu wissen. > DOS/Windows erst recht. Aber die Exe scheint nicht aus deinem main.cpp > vom 4.1.08 um 11:26 entstanden zu sein. > > Für die folgende Eingabefolge (im Menümodus) >
1 | |
2 | |
> liefert main.cpp ein Ergebnis, RDC.exe hingegen "No suitable solution > could be found for R1!". Auch die GUI-Variante von Karl Heinz bringt > die Fehlermeldung. Oder liegt die Lösung vielleicht so hart an der > Toleranzschwelle, dass Rundungsfehler in der FP-Lib von GNU bzw. MS zu > diesem Unterschied führen? Das dürfte an Rundungsfehlern liegen. Der benötigte Wert ist 30k, get_nearest_value() findet 27k und die Toleranz beträgt 3k. Leider fehlt da ein '=', denn 3k ist ja eben gerade nicht kleiner als 3k ;) Ist korrigiert. > Jetzt hätte ich noch einen Verbesserungsvorschlag, den ich gestern > vergessen habe: > > Ohne mir ihn näher angeschaut zu haben, scheint dein Algorithmus bei > Eingabe von U1, U2 und Rges eine Lösung zu suchen, bei der der Fehler > sowohl von U2 als auch von Rges minimiert wird. In der Praxis ist der > Fehler von Rges oft (wenn auch nicht immer) unerheblich. Wenn ich, wie > in obigem Beispiel, einen Teiler von 5V nach 2V suche, ist mir > ziemlich egal, ob Rges 10k oder 100k beträgt (1k oder 1M wären > allerdings ungünstig). Wenn ich nun auf gut Glück 20k vorgebe, bekomme > ich eine Lösung mit -1,46% Fehler für U2, obwohl mir die Lösung mit > 25k und 0% Fehler lieber gewesen wäre. > > Schön wäre es deswegen, wenn der Rges-Fehler vom Benutzer vorgegeben > werden könnte, entweder in Prozenten oder als Intervall (bspw. 10k bis > 100k). Da hast du recht. Allerdings will mir gerade keine gescheite Lösung für dieses Problem einfallen. Im Moment wird ja jede Lösung durch ein leicht optimiertes Brute-Force-Verfahren gesucht. Also einfach alle Kombinationen durchprobieren bis ein passendes Ergebnis gefunden wird. Das funktioniert für die Kombination aus zwei Widerständen ja auch schon ganz ordentlich, dummerweise geht das aber halt nur, wenn ich wirklich genau den Wert suche. Ich könnte nun natürlich hingehn und noch eine Schleife mehr hinpacken, die z.B. 20 verschiedene Werte für Rges aussucht und dann die Lösung mit dem kleinsten Fehler raussucht. Nur: Was nehme ich dann als Intervall? Das Problem liegt ja eigentlich hier:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
Ich habe ja zwei Gleichungen mit zwei Unbekannten, wovon ich erstmal R1 anhand der Spannungen und des Gesamtwiderstands berechne. Hier müsste ich nun bereits in Betracht ziehen, welche Werte vorhanden sind und Rges (Resistance) entsprechend anpassen... Was mir gefallen würde, wäre eine Berechnung anhand der Bildungsvorschrift der E-Reihe, denn die ist ja bekannt. Für einzelne Widerstände würde ich mir noch zutrauen, da etwas zu finden, doch bei Kombinationen dürfte das schon einigermassen kompliziert werden. Aber ich werde mal was ausprobieren :) > Karl heinz Buchegger schrieb: >> Und hier die GUI Variante dazu. > > Ha, die beiden V stehen jetzt richtig übereinander ;-) Vielen Dank! ^^
Grmpf.
Gast
#741862
@Karl heinz Buchegger mal eine Frage zu dem Programm mit dem du die GUI gemacht hast. Lässt sich das mit C# unter Visual Studio 2005 mit der Express Version machen oder braucht man da die kostenpflichtige Vollverion um eine Exe.Datei zu entwickeln? Ich habe vor zuerst mal so eine Art Tascherechner zu machen mit den man Komplexe Zahlen berechnen kann.
Die Express-Versionen sind dahingehend nicht eingeschränkt.
wars denn aber nicht so dass programme die mit den Express editions gemacht wurden nur auf dem jeweiligen rechner laufen? ich hab jedenfalls mal eine bekommen die immer mit solche einer fehlermeldung beim start abbrach. Gruß Fabian
Wäre mir neu. Guck' mal hier: http://www.microsoft.com/express/support/faq/ Besonders: "# Can I use Express Editions for commercial use? Yes, there are no licensing restrictions for applications built using Visual Studio Express Editions." Wäre relativ sinnlos, wenn man die Progs nicht weitergeben könnte...
Nochmal ein Versuch... Jetzt berechnet das Programm (wenn möglich) 9 verschiedene Lösungen mit Werten für Rges im Bereich von Vorgabe / 5 bis Vorgabe * 5. Die Lösungen werden dann nach dem Fehler sortiert und ausgegeben. Wie viele Ergebnisse ausgegeben werden sollen, kann ebenfalls angegeben werden. Leider mutiert das ganze Prog irgendwie schon wieder zum Flickwerk...
Gast
#744268
Tja, selber schuld!
Stefan wrote:
> Tja, selber schuld!
Na, sag bloss.
Gast
#745061
Hab gerade mal in der windows version U1=24V, U2=0, R1=47390, R2=47000, Rges=0 eingegeben... da errechnet er mir ein U2 von 12V - ist aber falsch. Aus irgend einen Grund rechnet er auch mit 47,4k anstatt meinen 47k + 390
Naja, "falsch" würde ich nicht unbedingt sagen. Es werden halt sämtliche Ausgaben auf 3 signifikante Stellen gerundet. Das "korrekte" Ergebnis wäre ja etwa 11.95V, das wird nunmal auf 12V aufgerundet. Zugegeben, hier etwas extrem, ich hab's mal auf vier Stellen geändert und ein weiteres Argument für die Commandline gebastelt um die Genauigkeit (Oder die Auflösung?) einzustellen (1 - 6 Stellen).
Gast
#745279
>> - Bei der Ausgabe der Ergebnisse wäre zu überlegen, ob man zwischen >> Zahlen und Einheiten ein Leerzeichen einfügt. > Also ich bin ja überhaupt kein Verfechter vom Plenken, da ziehe ich > die angeklebte Variante definitiv vor. Eigentlich kann man in diesem Fall nichts vorziehen oder mögen. Man schreibt auch nicht 100SäckeKartoffeln, 1Meter oder dergleichen. Zwischen Zahl und Einheit gehört ein Leerzeichen um als halbwegs korrektes Deutsch durchzugehen.
Karl wrote: >>> - Bei der Ausgabe der Ergebnisse wäre zu überlegen, ob man zwischen >>> Zahlen und Einheiten ein Leerzeichen einfügt. >> Also ich bin ja überhaupt kein Verfechter vom Plenken, da ziehe ich >> die angeklebte Variante definitiv vor. > > Eigentlich kann man in diesem Fall nichts vorziehen oder mögen. Man > schreibt auch nicht 100SäckeKartoffeln, 1Meter oder dergleichen. Naja, das sind ja alles ausgeschriebene Wörter. Ich könnte natürlich zwischen dem Widerstand und "Ohm" ein Leerzeichen machen, zwischen der Spannung und "V" aber nicht, denn "12 V" schreibe ich ganz bestimmt nicht. Ob korrekt oder nicht. Allenfalls "12 Volt". Aber das kann ja wirklich jeder so anpassen wie er will, wozu gibt's schliesslich den Sourcecode (Nein, dafür werde ich keine Kommandozeilenoption einbauen ;) ). > Zwischen Zahl und Einheit gehört ein Leerzeichen um als halbwegs > korrektes Deutsch durchzugehen. Das Programm ist Englisch ;)
Gast
#745328
Korrekterweise heißt es trotzdem 12 V, 5 A und auch 100 Ohm. Bei den Ohm zieht nichtmal das Argument, dass es kein ausgeschriebenes Wort ist ;) Einen Kommandozeilenschalter will ich auch gar nicht, wenn dann mach es richtig. Wenn ich im Moment Verwendung für das Programm hätte, würde mich das ärgern bei jeder neuen Version wieder meine privaten Anpassungen zu machen.
Also gut, ich gebe mich geschlagen. Hier die Version mit den Leerzeichen. Vielleicht habe ich es sogar überall erwischt... (Ausser bei Prozenten, das ist eher sowas wie ein Einheitenvorsatz)
Gast
#745348
So ein Programm mit GUI ist doch kontraproduktiv weil es die Möglichkeiten einschränkt. Sinnvoll ist eine GUI als eigenständiges Programm, welche das Spannungsteilerprogramm selber aufruft. Somit hat man beide Vorteile, Kommandozeile zum schnellen Tippen und zum Einbau in Skripte oä und eine GUI für komfortable Bedienung ohne Dokumentation lesen zu müssen.
Gast
#745468
Ich wollte mit meinem Kommentar bzgl. der Leerzeichen eigentlich keine Grundsatzdiskussion auslösen (deswegen der Zusatz "wäre zu überlegen" in meinem ersten Post). Hätte ich die Kommentare von Karl früher gelesen, hätt ich ihm gerne ein Sed-Skript o.ä. angeboten, mit dem er bei jeder neuen Version mit einem Kommando vor sämtliche von Einheiten Leerzeichen einfügen kann (evtl. sogar direkt im Executable) ;-)
Gast
#745473
Oje, jetzt sehe ich gerade: Dein Dich-Geschlagen-Geben zieht weitere Kreise. Ich habe gerade folgende Ausgabe erhalten:
1 | |
2 | |
3 | |
4 | |
Jetzt bekomme ich langsam ein richtig schlechtes Gewissen wegen meiner Meckerei über die fehlenden Leerzeichen <-( Zum Schluss aber noch etwas Positives: Die Möglichkeit, mehrere Lösungen ausgeben zu lassen, finde ich echt topp. So ist immer die gewünschte mit dabei, egal ob man auf genauen Teilungsfaktor oder genauen Gesamtwiderstand Wert legt :-)
yalu wrote: > Oje, jetzt sehe ich gerade: Dein Dich-Geschlagen-Geben zieht weitere > Kreise. Ich habe gerade folgende Ausgabe erhalten: > >
1 | |
2 | |
3 | |
4 | |
5 | |
> > Jetzt bekomme ich langsam ein richtig schlechtes Gewissen wegen meiner > Meckerei über die fehlenden Leerzeichen <-( Mach dir keinen Kopf deswegen. Dass die Ergebnisse nun so aussehen, war klar, sollte das Leerzeichen denn direkt hinter die Zahl? In meinen Augen gehört die Vorsilbe (Oder wie man das nennen will) eher zur Zahl als zur Einheit. Das zu ändern wäre allerdings nicht weiter schwer. > Zum Schluss aber noch etwas Positives: Die Möglichkeit, mehrere > Lösungen ausgeben zu lassen, finde ich echt topp. So ist immer die > gewünschte mit dabei, egal ob man auf genauen Teilungsfaktor oder > genauen Gesamtwiderstand Wert legt :-) Danke :)
Gast
#746359
Ja, ja, ich kleiner Pedant schon wieder: # Zwischen Einheitenvorsatzzeichen und Einheitenzeichen wird kein Zwischenraum geschrieben. # Die Zusammensetzung aus Einheitenvorsatzzeichen und Einheitenzeichen bildet ein neues, untrennbares Einheitenzeichen, das ein Vielfaches oder einen Teil der betreffenden Einheit bezeichnet. Aus: http://de.wikipedia.org/wiki/Vors%C3%A4tze_f%C3%BCr_Ma%C3%9Feinheiten
Karl wrote: > Ja, ja, ich kleiner Pedant schon wieder: > # Zwischen Einheitenvorsatzzeichen und Einheitenzeichen wird kein > Zwischenraum geschrieben. > # Die Zusammensetzung aus Einheitenvorsatzzeichen und Einheitenzeichen > bildet ein neues, untrennbares Einheitenzeichen, das ein Vielfaches oder > einen Teil der betreffenden Einheit bezeichnet. > > Aus: > http://de.wikipedia.org/wiki/Vors%C3%A4tze_f%C3%BCr_Ma%C3%9Feinheiten Grmpf, nach sowas hatte ich noch gesucht und nicht gefunden... Danke. Korrigierte Version im Anhang.
Gast
#746528
Dein Programm bewegt sich unaufhaltsam in Richtung Perfektion ;-)
Gast
#746545
Wie bekomme ich das Programm unter Linux zum Laufen?
@Gast: Indem du es mit dem g++ kompilierst. Irgendein Linuxer hier wird dir sicher sagen können, wie das am einfachsten geht, ich hab's grade nicht auswendig im Kopf. @yalu: :)
Gast
#746675
> Wie bekomme ich das Programm unter Linux zum Laufen?
Wenn der Quellcode in main.cpp steht:1 | |
oder einfach (ohne Makefile)
1 | |
Eine
1 | |
kannst du ignorieren. Danach kannst du das kompilierte Programm mit
1 | |
bzw.
1 | |
(je nachdem, wie dein PATH konfiguriert ist) aufrufen. Die GUI-Version von Karl Heinz läuft problemlos mit Wine (ich habe Version 0.9.50):
1 | |
weils irgendwie halbwegs in den thread passt ;) vielleicht hilft das ja auch dem ein oder anderem: http://hackwerk.de/widerstand/index.php die berechnung wird online durchgeführt. (man muss also nichts runterladen) man gibt das gewünschte übertragungsverhältnis an und erhält verschiedene vorschläge, die mit genauigkeit und realem verhältnis aufgelistet werden. die mindest-genauigkeit kann vorgegeben werden - es werden höchstens 4 widerstände verwendet. realisiert auch übertragungsverhältnisse > 1 oder < 0 mit OPVs. (zeigt entsprechende schaltung an) e-reihen wählbar. zusätzliche widerstandswerte können, wenn gewünscht angegeben werden.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.