Re: Schmarrn ?? So schon! Kategorie: Programmierung (von André H. - 11.04.2004 9:51) | ||
Als Antwort auf Schmarrn ?? So nicht! von thomas - 7.04.2004 22:59 | ||
| ||
Hallo Thomas, 1.Es ist extrem unhöflich über jemanden in der dritten Person zu sprechen/schreiben, wenn man direkt auf das Posting antwortet. 2. Du schreibst so, als hätte ich eine Auskunftspflicht und müsste allem bis ins kleinste Detail antworten. > erst einmal eines vorweg: > > Die hwcom-Routinen sind in Ordnung. Warum machst Du dann einen Thread mit dem Topic "hwcom-Modul fehlerhaft", wenn an hwcom.c2 keinerlei Fehler sind. Das war von Dir eine Behauptung, die ich wiederlegt habe. > Trotzdem gibt es weiterhin das beschriebene Problem, dass nur durch das generelle > Verwenden von Variablen zur Ausgabe von Daten über die hwcom-Schnittstelle > vermieden werden kann. Das stimmt nicht ganz. Mit Abfrage von hwcom.ready() kann man dies abfangen. > Allerdings würde das Verwenden von Konstanten z.B. > bei einer Menuführung einige Vorteile bringen. Das direkte Angeben bei hwcom.c2 und swcom.c2 bringt VM-technisch keinerlei Vorteile. Hier ist das Benutzen von eigenen Variablen besser. Die Abänderung der Print-Funktion mit der Möglichkeit direkt Strings (Konstanten) anzugeben, habe ich nur auf bitten von ein paar Usern gemacht. > Aber was ist denn nun eigentlich das Problem? Wie "zwischen den Zeilen" aus > Andre's Antwort zu ersehen ist, wei� er die Antwort, teilt sie uns aber leider > nicht mit. Ich habe alles nötige mitgeteilt. Ich setze natürlich vorraus, da� man - als erstes das Handbuch liest, bzw. in den entsprechenden Kapiteln nachschlägt. (Konstanten, Strings, Funcktionen, hwcom.send()) - sich die Funktionen im Modul hwcom.c2 näher ansieht - als nächstes im Forum die Suchfunktion benutzt. Wie ich an Deiner Antwort erkennen kann, hast Du nichts davon gemacht !!! Im Handbuch steht 99% davon, was man zu diesem Thema wissen mu�. > Die von ihm gegebene Begründung ist so nicht richtig!! > Falsch. Sie ist 100% richtig. > > Im Modul hwcom.c2 sind diesbezüglich keinerlei Fehler ! > > Wenn Du mit hwcom Festtexte ausgibst, mu�t Du warten, bis > > der vorherige String gesendet wurde. Denn, wie hei�t es schon so schön > > deutlich im Handbuch zur CC2: Das Senden von Datenrahmen (=Byterrays=Strings) > > geschieht im Hintergrund (=eigener Systemthread). > > Und hier steckt die erste Unsauberkeit: > Eigentlich dürften Festtexte kein Problem mit einer Verarbeitung im Hintergrund > haben, da sie bereits bei der Programmerzeugung während der Kompilierung erzeugt > werden und nicht mehr verändert werden. Somit dürfte das nur für Variablen > gelten! Es können keine Festtexte direkt gesendet werden ! Nur Daten aus Segment 8 (RAM) können übergeben werden ! Konstanten, sofern es keine Byte oder Integer-Einzelwerte sind, werden immer im Konstantenspeicher, Seg. 6 & 7, abgelegt. Es ist egal, ob Du den String vorher als Konstante defninierst, oder direkt mit hwcom.print("123245") angibst. Der String landet immer im Konstantenspeicher. > > Natürlich werden diese ausgeführt. > > Du überschreibst nur mit jedem neuem print() die zu sendende Variable, > > bevor sie gesendet wurde. > > Hier ist die nächste Unsauberkeit: Welche Variable denn? > In meinem Beispiel wird nicht eine einzige Variable verwendet; nur Konstanten! > Dies zeigt allerdings auch, dass Andre den Hintergrund, warum es nicht > funktioniert, kennt. LESE DAS HANDBUCH !!! Ich setze, wie gesagt gewisse Grundlagen vorraus ! Ist es zuviel verlangt, das Handbuch zu lesen !? Ich habe nichts verschwiegen ! In hwcom.print(string s) gibt es den String s. Das ist die Stringvariable, die ich gemeint habe. Deine Ausdrucksweise kann ich so nicht akzeptieren. Du schreibst so, als hätte ich eine Auskunftspflicht und müsste jedem bis ins kleinste Detail antworten, auch das was überdeutlich im Handbuch steht ! Insgesamt sehe ich Deine schreibweise eher als beleidigend an ! Angegebene (String-)Konstanten werden in den String s von function print(string s) umkopiert. String-Variablen werden als Referenz übergeben. Darum ist es von der Programmausführtung vorteilhafter mit String-Variablen zu arbeiten, in denen die String-Konstanten zuerst kopiert werden, bevor man diese an die hwcom.print() (besser print2()) übergibt. Das Programm wird dadurch nicht länger ! Die Ausführung kann jedoch schneller erfolgen. > Was man hier wohl nicht erwarten würde: auf der seriellen Schnittstelle wird nicht > die Konstante HINWEIS sondern die Konstante HEX ausgegeben! > Strings werden immer als Referenz an Funktionen übergeben. Das steht auch überdeutlich im Handbuch ! Es werden nie Konstanten ausgegeben, sondern Variabeln bzw. Var.-Arrays(=Strings). In diesem Fall ist es die lokale Variable s in hwcom.print() > Diese werden immer im Segment 8 erwartet. Die Konstanten liegen allerdings im > Programmcode und der liegt nicht in diesem Segment. Falsch ! Konstanten liegen nicht im Programmcode, sondern im Konstantenspeicher. Das steht auch sehr deutlich im Handbuch. Die einzigen Konstanten, die in den Programmcode eingebettet werden, sind Byte und Integerwerte. (Nur bei Einzelwerten, nicht Arrays) Siehe Handbuch Kap. 5.6.5 . > Also kann die Konstante eigentlich > nicht an die Funktion übergeben werden. Der Kompiler behilft sich, in dem er einfach > eine Variable erzeugt, den Inhalt der Konstanten hineinkopiert und an die Funktion über- > gibt. Dies macht er allerdings nicht nur beim Aufruf der hwcom.print()-Funktion > sondern auch beim Aufruf der str.length()-Funktion. Und so wird der Inhalt der > (unsichtbaren) "Variablen" die der print-Funktion übergeben wurde in der nächsten > Zeile beim Aufruf der length-Funktion wieder überschrieben. Der Compiler erzeugt keine undefinierten/"unsichtbaren" Variablen. Die Definitionen stehen überdeutlich in den Modulen ! Bsp.: hwcom.print(string s) Hier wird die lokale Stringvariable s defniniert. Aber nur, wenn eine Festtext, also eine Stringkonstante übergeben wird. Wird eine String-Variable übergeben, so ist s nur die Referenz auf diese. Es wird dann keine eigene Variable angelegt, sondern s beleget denselben Speicher, wie die übergebene Variable.. str.length(string s) Hier verhält es sich absolut identisch. Was hier mit hwcom.print() und anschlie�endem str.length() passiert ist folgendes: Da Du eine Stringkonstante übergibst, wird in hwcom.print die Var s neu angelegt. die Startadresse wird an print2(), welche diese wiederum an send() übergibt, übergeben. Da bei hwcom.c2 und swcom.c2 die Ausgabe im Hintergrund in einem eigenen Systemthread erfolgt, kommt die Funktion sofort nach �bergabe der Speicheradresse von s wieder zurück. Beim Beenden der Funktion hwcom.print() wird s wieder freigegeben. Da Du an str.length() wieder eine Stringkonstante übergibst, wird hier s wieder als Variable angelegt. Da der Speicherplatz der Variable s von hwcom.print() zuvor wieder freigegeben und die Ausgabe noch nicht beendet wurde. Wird hier s von str.length() derselbe Speicherbereich zugeordnet, und somit von dem Systemthread, welcher das senden an hwcom übernimmt, ausgegeben. Da die Diskussion hier für mich beendet ist, solange Du das Handbuch nicht liest, mache folgende �nderung in hwcom.print(), wenn Du unbedingt die Konstanten direkt: übergeben willst. //---------------------------------------- function print ( string s ) //---------------------------------------- { print2(s); wait ready(); } Allerdings rate ich immer zur verwendeung von extra Variablen bei der Verwendung der Sende-Funktionen bei den ser.Schnittstellen. Die Ausgabe ist einfach schneller, und der Programm-Code(VMC) wird dadurch auch nicht länger ! Und noch etwas allgemeines für die Vorgehensweise bei Problemen: 1. Handbuch lesen 2. FAQ benutzen 3. Suchfunktion im Forum nutzen 4. Dann erst im Forum posten MfG André H. Antworten bitte nur ins Forum! Fragen per EMail auf Forum-Postings werden nicht beantwortet! Das macht meine Heizung gerade | ||
Antwort schreiben Antworten: Re: Schmarrn, jetzt wird's lustig (von thomas - 12.04.2004 21:03) Re: Schmarrn, jetzt wird's lustig (von Dietmar Weickert - 13.04.2004 11:10) hwcom-Modul nicht fehlerhaft (von thomas - 13.04.2004 22:26) |