Autor |
Nachricht |
2c96
|
|
|
Zu Fehlercodes und Meldungen: Ich bin es aus dem Dinosaurier-Bereich (Großsysteme) gewohnt und finde es sehr praktisch, wenn Fehlercodes und Meldungen eine Systematik zur Zurodnung haben. Das mindeste sind Zahlenblöcke, die aber meistens schon vom Betriebssystem und einigen Service-Libs belegt sind. Du wirst ja gerade bei Bibliotheken mit Unterprogrammen bzw. eigenständigem Blöcken arbeiten, wie immer Du das jetzt nennst.
Ich habe mir angewöhnt, die ersten drei Zeichen (alpha) des Programmnamens durchgängig für alle externen Meldungen, Codes und Namen (DLL, etc) zu verwenden. Bei Fehlern sieht man relativ schnell, wo etwas passiert ist. Es wird zwar heute sehr "individuell" programmiert, aber ich habe es von der Serviceseite kennen und schulen müssen -- es hat schon Vorteile. Es ist ziemlich nervig, wenn ich bei Nummern und Bit-Leisten erst suchen muß, kommt jetzt etwas vom System, von einer DLL (wenn ja von welcher), evtl beim Ausdruck vom LAN-Printer usw. Es werden auch Unterprogramme Cross-Language verwendet, und dann wird es grausam, wenn keine Unterschiede gemacht werden. Du bist in Deinem Programmablauf ja nicht der einzige der Ideen für Fehlecodes hat -- da mischt Dein PC per Betriebssystem und Hardware auch noch mit.
Zu Abbrüchen: die vermeidet man so lange es geht. Es reicht oft -- und ist insgesamt besser und Anwender-freundlicher -- erst einmal mit "defaults" (Ersatzwerten) weiter zu arbeiten. Es kann ganz schön nerven, wenn mehrere Daten kaputt sind und man einzeln -Fehler-Abbruch-Korrektur-Neustart- durchlaufen muß. Es reicht z.Bspl. bei der Exzentrizität, die Ellipse als Kreis weiterlaufen zu lassen oder einen typischen Wert als Korrekturwert einzusetzen. Dazu unterlegt man den Wert mit Farbe und Eintrag in ein Log plus optional Fehlermeldung und ein mitlaufendes Consol-Window. Dann kann man Mehrfach-Fehler mit einem Korrektur lauf machen anstelle deren 20.
73 Peter
|
|
|
|
|
56c5
|
|
|
Nichts gegen bewährte Vorgehensweisen bei, nennen wir sie mal "gereiften", Systemen. Aber Herr pointhi programmiert in C++. D. h. er bekommt Fehler "vom System" als Ausnahmen und nicht über einen Fehlercode. Man braucht einfach keine Fehlercodes und muss sich über deren Benennung deshalb auch keine Gedanken machen. Diese clevere und heutzutage wirklich außerordentlich gut bewährte Strategie der [url=http://de.wikipedia.org/wiki/Ausnahmebehandlung:32rwubm2]Ausnahmebehandlung[/url:32rwubm2] kann man (muss man aber nicht) bei eigenen Projekten fortführen. Man vermeidet somit auch einen Bruch in der Behandlung von Fehlern. Dieser Bruch führt zwangsweise zu einem völligen Umdenken bei der Codierung.
Das ist so ähnlich wie wenn man eine Windows-Anwendung baut, schön mit Fenstern, graphischen Dialogboxen, Message-Qeues der GUI, Events usw. Und dann kommt eine Stelle, wo der Benutzer gezwungen wird, eine Zahl statt in einer graphischen Windows-Textbox in einer DOS-Box einzugeben.
Aber ich will es jetzt zu diesem Thema belassen.
|
|
|
|
|
56c5
|
|
|
Mir ist noch etwas zur Verwendung der ungarischen Notation eingefallen: Spätestens wenn (eigene) Klassen instanziiert werden, die Objekt-Verweise also in einer Variablen gehalten werden, wird die Verwendung der ungarischen Notation ziemlich albern.
Die schiere Menge der Klassen, die auf einen zustürzen können, macht es inpraktikabel, Präfixe voranzustellen und diese auch noch halbwegs konsistent zu halten.
Excel:
Range
Chart
DialogSheet
MenuBar
Window
Workbook
AddIns
AnswerWizard
Application
Assistant
.......
Wo soll das enden?
|
|
|
|
|
4ed3
|
|
|
ich werde mich jetzt mal über die fehler/ausnahmebehandlung informieren und dann ein allegmeines konzept dazu machen. Ich werde es auch hier posten, und erst nach absegnung davon zum programmieren anfangen.
Erster kurzentwurf
Bei der tle.Load brauche ich glaub ich keine try/catch da keine rechenoperationen durchgeführt werden. Es kommt eine neue Int-Variable dazu die die Fehlercodes bitweise speichert und am ende mit return zurückgibt, es gibt also den Code 0 als erfolg oder bis zu 16 "fehlerbits". Die Bedeutung von ihnen werde ich dann gesondert niederschreiben. So wird ein tle-Datensatz auch eingelesen falls ein winkel über 360° ist, der modulo falsch ist,...
Bei der umlb.FromTleToUmlb werde ich wie schon gehabt alle falschen winkelmaße automatisch anpassen, sind eigentlich auch keine Fehler. Alle Berechnungen werden in Try/Catch eingebunden und bei einem Fehlerfall wird ein entsprechender fehlercode zurückgeliefert (bitmuster ist sinnlos da nur 1. Fehler meines wissen nach ausgewertet werden kann in catch). Da jetzt kein einmaliger Biblioteksinterner Fehlercode mehr exestiert müsste ich für jede Bibliotek eine eigene funktion für die Fehlerausgabe schreiben, das werde ich wohl nicht machen. Da muss man sich dann informieren was der code bedeutet.
Die einbindung wird 1. komplexer da keine allgemeine Fehleranzeigefunktion exestiert, und 2. Kann man dann, als programmierer Jedenfalls in der Bibliotek oder in Mediawiki nachschauen was der code bedeutet.
Was ist eigentlich mit der Bibliotek <errno.h> ?, würde sich diese etwas nutzen oder ist diese sinnlos, oder wäre es villeicht eine gute idee selber so eine Bibliotek zu schreiben und für die Fehlererkennung zu nutzen?
mfg. pointhi
|
|
|
|
|
2c96
|
|
|
Günter, es geht nicht im sinnlose Prefixe für jeden code-block. "Ausnahmen" gibt es nicht erst seit C++ und OO, die waren in den HLLs immer schon etabliert. Dahinter steckt in der Regel ein Return-Code o.ä. Fehlercode und ein "Hinweis" (Label, Stmt, offset, ...) wo es paassiert ist. Es geht um eine sinnvolle Hilfestellung zur Fehlereingrenzung. Was hilft Dir eine abgefangene Ausnahme "Zero Divide", wenn Du Dein Pgm abbrechen läßtund lapidar als Fehler schreibst "Division durch Null". Ein Backtrace oder Roman von Registern hilft Dir auch nicht. Man kann ein Pgm schon so sinnvoll aufteilen, daß ein Prefix eine Hilfe ist.
Außerdem ..... Excel ist ja nun kein Vorbild für ein Programm ..... und Windows nicht nur in dieser Hinsicht nicht das gelbe vom Ei. Bei manchem Abbruchcode hilft ein Horoskop mehr als die Bedienungsanleitung des Programms. Das Thema ist uralt ..........
Bei mir fangen (mit sehr wenigen Ausnahmen) die Pgm-Teile bereits mit einen "Gruppen"-Prefix an, sonst ist diese Methode natürlich absolut sinnlos.
73 Peter
|
|
|
|
|
4ed3
|
|
|
Bei der Fehlererkennung glaub ich ist eine eigene error.hpp meiner meinung am besten. Ich würde dabei eine dynamische array definierern in diese durch setter 2Bit Fehercodes geschrieben werden können und durch getter wieder ausgelesen werden können. Ich könnte dann auch eine komplette funktion schreiben die für jeden Fehlercode eine entsprechnde Meldung bereithält. Das ganze würde static-definiert und mittels einer 2. Variable die inder klasse enthalten ist kann man dann die fehleranzahl ermitteln. Bei 0 ist dann alles ok.
Was haltet ihr davon?
Die ungarische notation werde ich warscheinlich bei der Bibliotek anwenden, Fehlererkennung/verarbeitung hat aber eine größere priorität.
mfg. pointhi
|
|
|
|
|
2c96
|
|
|
[quote]... Fehlererkennung/verarbeitung hat aber eine größere priorität. ... [/quote]Das Problem ist m.E. Ursache und vor allem Fehlerort sauber zu dokumentieren und im zweiten Schritt zu entscheiden: gebe ich nur einen Hinweis aus (reine Schönheitsfehler, z.Bspl. keinen Sat Namen), ersetze ich den fehlerhaften Teil durch einen Standardwert und mache nach einer Warnung automatisch weiter, wie vor -- nur muß der User das Weiter-Machen bestätigen, oder breche ich komplett ab. Im speziellen Fall würde ich die TLE-Records immer komplett durchscannen und bei Fehlern am Ende des Einlesens/Scannens entscheiden.
Ansonsten .... Du hast volle Freiheit. Ich habe jetzt in erster Linie den Blickwinkel des "Debuggers" beschrieben, aber ..... wo passieren keine Fehler ..... ..
73 Peter
|
|
|
|
|
4ed3
|
|
|
ich finde die idee von mir mit einer eigenen error.h am besten. Man kann wenn nötig, fehlertexte für jede der funktionen ausgeben und es werden auch mehrere fehlermeldungen unterstützt. Wäre eigentlich die besste methode meiner meinung nach.
ich hab mich mal in der ungarischen notation versucht:
[code:3vbzqxci] char rgchName[20]; // Name des Satelliten unsigned int uwNoradNumber; // NORAD-Katalog-Nr. char chDesignation; // Klassifizierung char rgchInternatonalDesignation[9]; // Internationale Klassifizierung int wEpocheDayAndYear; // Epoche Jahr und Tag double dEpocheDayAndYear; // Epoche Tagesbruchteil double dResistanceFactorSpg; // Widerstandskoeffizient im SGP-Modell [d^(-2)] double dNegligibleResistanceFactorSpg4; // vernachlässigbarer Widerstandskoeffizient im SGP-Modell [d^(-3)] double dResistanceFactorSpg4; // Widerstandskoeffizient im SGP4-Modell unsigned int uwEphemeris; // Ephemeridentyp unsigned int uwCurrentRecordNumber; // laufende Datensatz-Nummer double dInclination; // Inklination [Grad] double dRightAscensionOfAscendingNode; // Rektaszension des aufsteigenden Knotens Ω [Grad] double dEccentricity; // numerische Exzentrizität der Umlaufbahn double dArgumentOfPerigee; // Argument des Perigäums ω [Grad] double dMeanAnomaly; // Mittlere Anomalie Μ [Grad] double dAverageMotion; // Mittlere Bewegung n unsigned int uwCirculationNumber; // Umlauf Nr. seit dem Start unsigned int uwChecksum1; // Prüfsumme1 Modulo 10 unsigned int uwChecksum2; // Prüfsumme2 Modulo 10 [/code:3vbzqxci]
Was sagt ihr dazu?, hab ich alles richtig gemacht und ist es gut für die lesbarkeit?
mfg. pointhi
|
|
|
|
|
4ed3
|
|
|
nur mal als kurzes update: ich hab zurzeit nicht so viel machen können, werde aber bis neujahr viele grundfunktionen hinzufügen. Das error handling ist auch geplant und gehört nur mehr realisiert, es ist dann so ausgelegt das man entweder nur oberflächlich fehler erkennen kann, aber dass auch sehr genaue fehlerbeschreibungen ausgegeben werden können. Das ganze funktioniert mit einbindbaren xml-dateien um platz zu sparen und um das ganze vom code zu trennen.
Zurzeit umfasst der code etwa 1500 Zeilen!, ich hatte erst ein Projekt wo ich mehr geschrieben habe. Schon diese codeanzahl beweist meiner meinung dass die Bibliotek später viel arbeit ersparen wird, da die bedienung auch relativ einfach ist. Der main-code zum ausführen braucht dann villeicht 30-40 zeilen. (mit vielen kommentaren und lehrzeichen) Zum berechnen und ausgeben der Bahndaten aus einem TLE-String benötigt man nur 3 Befehle!
Der grundstring ist [i:1wpd7eeu]tle_datensatz[0][/i:1wpd7eeu]
[code:1wpd7eeu] satpos::tle tle_test(tle_datensatz[0],true); satpos::umlb umlb_test(&tle_test); umlb_test.Out();[/code:1wpd7eeu]
der dahinter steckende code ist dagegen ein paar hundert zeilen lang!
Warscheinlich werde ich rund um neujahr die bibliotek auf sourceforge raufladen, errorhandling kommt aber erst später, und bei der locatorberechnung hab ich glaub ich noch einen fehler drinnen, kann ihn aber nicht lokalisieren. Zurzeit arbeite ich an den ganzen funktionen für die diversen zeitformate und danach werde ich die Bibliotek für die Fehlerverarbeitung schreiben.
Erst danach werde ich mit der allgemeinen Berechnung der Satellitenbahn und position weitermachen da ich das noch nicht so wirklich ganz durchschaue.
mfg. pointhi
|
|
|
|
|
4ed3
|
Betreff des Beitrags: pre-alpha 1.02 online |
|
|
hy,
ich habe gerade die Version 1.02 der Bibliotek online gestellt:
sie ist hier zu finden:
https://sourceforge.net/projects/satpos/
ich hab diverse funktionen hinzugefügt, das wichtigste bei diesem update ist aber dass ich alle kommentare ins englische umgearbeitet habe, und bei allen variablen die Hungarische Notation jetzt verwende, diese ist für mich logisch und ohne viel nachzudenken verwendbar. Ich finde sie auch nicht nervig sondern nutzbringend, was ja das wichtigste ist.
http://de.wikipedia.org/wiki/Ungarische ... _Hungarian
Das errorhandling kommt in der nächsten version dann, da das ganze relativ komplex ist. Zurzeit sind mal alle benötigten funktionen definiert worden, inc. erklärung, und auch schon erster code für die dynamische arry. Ich habe aber leider noch keine der funktionen testen können da ich das Singleton pattern noch nicht ganz verstanden habe. Das ganze ist aber notwendig da ich die funktion nicht statisch möchte, anderseits aber auch nur maximal einmal erzeugen können möchte. Das setzt einige kniffe voraus, die ich beim abschreiben noch nicht alle verstanden habe. besonders den wegen dem initialisieren.
ein schritt den ich bei V1.03 machen möchte ist das makefile, dass ist dan ein wichtiger schritt für eine richtige bibliotek. Muss mich aber deswegen noch informieren. zurzeit hab ich eine codeblocks datei drinnen, mit der das ganze unter windows und linux compiliert werden kann, natürlich noch nicht optimal aber besser als nichts. Auch hab ich jetzt das erste mal die ganze bibliotek unter ubuntu getestet. Ich hab es korrekt kompilen können, aber nicht ausführen (wegen fehlenden permissions), nach verschieben hab ich es auch nicht ausführen könne, was wohl an dem falschen öffnenbefehl in der konsole gelegen ist, ich aber nicht weiterverfolgen konnte da sich mein ubuntu schon aufgehängt hat . Es sollte aber problemlos funktionieren.
mfg. pointhi
|
|
|
|
|
0482
|
|
|
Ach du meine Güte.. ist das eine riesige Diskussion.
Ich hatte vor ca. 5 Jahren mir sowas für meinen Jornada 720 geschrieben und dabei auf Vorarbeiten von Robert W. Berger N3EMO zurückgegriffen. Guck doch einfach mal dort, da findest du eigentlich alles, was zum Bahnkurven berechnen nötig ist. Die ganzen TLE-Routinen gibt's bei Bedarf bei mir.
W.S.
|
|
|
|
|
2c96
|
|
|
@W.S.: pointhi ist Schüler (<20) und ackert sich durch die Formeln usw. Er will den Satelliten-Stoff "lernen" (verstehen), und ebenso ackert er sich durch die C-Programmierung. Er möchte - so sehe ich es seit seinem ersten Beiträgen - etwas eigenes schaffen -- finde ich gut. (evtl. als Matura Arbeit, lt. seinem Bekunden).
Poste doch die URLs, wo er Info und Tips kriegt. Hier sind noch mehr, die auch schon früher durch SAT-Rechnerei und -Pgm gegangen sind. Einige Bücher sind vergriffen, ich habe ihm teilweise Kopien daraus geschickt.
73 Peter
|
|
|
|
|
4ed3
|
|
|
[quote]@W.S.: pointhi ist Schüler (<20) und ackert sich durch die Formeln usw. Er will den Satelliten-Stoff "lernen" (verstehen), und ebenso ackert er sich durch die C-Programmierung. Er möchte - so sehe ich es seit seinem ersten Beiträgen - etwas eigenes schaffen -- finde ich gut. (evtl. als Matura Arbeit, lt. seinem Bekunden). [/quote] Das stimmt voll und ganz , ich arbeite mich allgemein gerne in komplexe sachen ein die mich interressieren, und will mich darin auch weiterbilden. Und das trifft dabei voll und ganz zu: ich interressiere mich allgemein für astronomie, satellitentechnik, funktechnik, wofür die bibliotek gedacht ist, ich will mich beim programmieren weiterentwickeln, was durch dieses projekt geschieht, weil ich feedback bekomme, was man villeicht anders machen könnte, ect., und ein anderer grund ist dass ich mich allgemein in opensource-entwicklung einarbeiten möchte, und dieses thema hat dabei allgemein den vorteil dass es dazu nicht wirklich fertiges zum weiterproggen gibt. Ich hab nur eine andere Bibliotek gefunden die das gleiche macht und für c ist, aber bis auf die info dass es sie gibt hab ich nichts dazu gefunden. Mein Ziel ist daher auch dass ich eine bibliotek schaffe, mit der sich programmierer, die sich nicht so stark in die berechnungen einarbeiten wollen, auch eine möglichkeit haben selber etwas zu programmieren, oder dass amateurfunker einfach eigene ansteuerprogramme für ihre anlage schreiben können. Ein vorgriff: Da ich mich bald warscheinlich in QT einarbeiten werde (robocup junior), und auch in 3D programming, ect. könnte es sein dass ich in 1-2 jahren villeicht an einem leistunsfähigen programm arbeite, dass diese bibliotek nutzt. So etwas wie orbitron, nur wesentlich leistunsfähiger und komplett open-source, und auch mit weniger fehler (die ISS hatte bei 2 unterschiedlichen files einen versatz von mehreren grad (galube 15-30grad), deutet auf sehr alte files). mal schauen was die zukunft bringt , und ich schreibe schon wie der zu viel [quote]Poste doch die URLs, wo er Info und Tips kriegt. Hier sind noch mehr, die auch schon früher durch SAT-Rechnerei und -Pgm gegangen sind. Einige Bücher sind vergriffen, ich habe ihm teilweise Kopien daraus geschickt. [/quote]
Auf dieverse URLs zu anderen programmen freue ich mich gerne, ich will eh mal den programmierstil von anderen programmen sehen, leider hab ich bei den ganzen großen opensource-projekten keine sourcecodes gefunden. (würde mir gerne mal code im umfang von 2.000 - 20.000 codezeilen anschauen (nur oberflächlich ))
mfg. pointhi
|
|
|
|
|
0482
|
|
|
[quote]
Auf dieverse URLs zu anderen programmen freue ich mich gerne, ich will eh mal den programmierstil von anderen programmen sehen,...
mfg. pointhi[/quote]
Oh lieber nicht. Finde du lieber deinen eigenen Stil. Gerade bei der ganzen Open-Source-Gnu-Linux-Strecke sehe ich ganz häufig einen Stil, der mir gar nicht gefällt, weil er zu unübersichtlich und häufig zu "genial" geschrieben ist. Da ist es besser, sich mal mit anderen Programmiersprachen zu befassen, also auch die Strecken Pascal, Modula, Python usw. und sich dann eine eigene Meinung zu bilden. Und vergiß nicht, auch mal die Nase in Assembler diverser CPU's zu stecken, immerhin ist es ja genau diese Ebene, wo alles tatsächlich stattfindet.
Und denk immer mal an die Abkürzung KISS (keep it small and simple)
So, nun aber genug von meiner Schulmeisterei, die du vielleicht garnicht magst..
W.S.
|
|
|
|
|
4ed3
|
|
|
[quote]Und vergiß nicht, auch mal die Nase in Assembler diverser CPU's zu stecken, immerhin ist es ja genau diese Ebene, wo alles tatsächlich stattfindet. [/quote] stimmt eh, und auch wenn ich 16 bin war meine erste programmiersprache Assembler, genau den Befehlscode für die PIC microcontroller . Das ist ein grund das ich C so schätze, da muss man für eine IF mit mehreren bedingungen nicht einen ganzen aufsatz schreiben (hab ich in assembler noch nie gemacht kanns mir aber vorstellen ). Hab da bei Blinklicher mit bestimmten mustern, kleine steuerprogramme für roboter, ect. aufgehört. C ist vie übersichtlicher , und dir gehen die goto namen nicht aus [quote]Oh lieber nicht. Finde du lieber deinen eigenen Stil. Gerade bei der ganzen Open-Source-Gnu-Linux-Strecke sehe ich ganz häufig einen Stil, der mir gar nicht gefällt, weil er zu unübersichtlich und häufig zu "genial" geschrieben ist. Da ist es besser, sich mal mit anderen Programmiersprachen zu befassen, also auch die Strecken Pascal, Modula, Python usw. und sich dann eine eigene Meinung zu bilden.[/quote]
Aus fehler lernt man ja am besten, auch wenn sie andere gemacht haben , und villeicht kann man sich ja was abschauen , ohne dem code von meinem lehrer in Robotik hätte ich die auswertung von inkrementalen drehgebern nie so schnell hinbekommen. Sind nur 2 IF mit 4 bedingungen , und ein wenig binärdenken.
Und für kommentare bin ich immer zu haben, kann nie schaden eine andere sichtweise zu sehen. Und stile schau ich mir auch nicht mehr so schnell ab, das mit dem hintereinanderschreiben von code hab ich auch von meinem robotiklehrer, aber er proggt noch die 80353 prozessoren und druckt den code für die schüler aus .
mfg. pointhi
|
|
|
|
|