Zum Inhalt springen

kross

Mitglieder
  • Gesamte Inhalte

    7
  • Benutzer seit

  • Letzter Besuch

  1. Also derzeit arbeite ich hauptsächlich mit C#, die Entwicklungsumgebung bleibt aber die gleiche und ich muß sagen VS.Net sagt mir deutlich mehr zu als Java mit z.B Eclipse. Dies stellt für mich bei der Wahl der Sprache schon ein Kriterium dar. Immerhin schlägt man sich mit der Umgebung wärend der ganzen Entwicklungsphase rum und wird durch das VS gut unterstützt und abgesehen von bedingten Breakpoints auf das ändern von Werten erfüllt auch der Debugger alles was ich bisher brauchte. Ansonsten zum Thema Unterschiede bei der arbeit mit Datenbanken. Stichwort LINQ hat Java etwas ähnliches?
  2. Für mich ist nur wichtig das die Daten überhaupt kommen. Über den USB-Port werden Kundenspezifische Konfigurationsdaten geschrieben oder das Eventlog ausgelesen oder die Firmware upgedated aber nichts timingspezifisches wie ankommende Messwerte ohne eigenes Timestamp. Wenn ich Zeitangaben bräuchte hätte ich das Glück die Firmware gleich mitzuprogrammieren. Wenn das nicht der Fall wäre würde ich dann aber nix anderes als Möglichkeit sehen als in einem Backgroundworker den Puffer permanent schnell auszulesen mir das aktuelle Datetime des ankommens der Daten zu merken mit den Daten zusammen in die Eventargs des Receiveevents packen und dann oberhalb zu schauen ob ich mit den Timespans zwischen meinen Eventargs auf sinnvolle Werte komme.
  3. Du verstehst da etwas falsch. ftStatus = Mach_Irgendwas(bla); In dem Fall führt ja Mach_Irgendwas code innerhalb der FTDI-Klasse aus, die du als DLL hast, und genau darin sind MessageBoxen für bestimmte Fehler fest im Code... zum code erstelle einfach 2 Klassen FTDI und ComportStream die du von System.IO.Stream ableitest VS bietet dir dann von allein an die abstrakten Funktionen zu implementieren. dann SerialPort m_comport = null; public ComPortStream(SerialPort _comport) { m_comport = _comport; } public override int Read(byte[] buffer, int offset, int count) { return m_comport.Read(buffer, offset, count); } public override void Write(byte[] buffer, int offset, int count) { m_comport.Write(buffer, offset, count); } private static Dictionary<FTDI, FTDIStream> m_instances; public static FTDIStream getInstance(FTDI _ftdi) { if (m_instances == null) m_instances = new Dictionary<FTDI, FTDIStream>(); if(m_instances.ContainsKey(_ftdi)) { return m_instances[_ftdi]; } else { FTDIStream stream = new FTDIStream(_ftdi); m_instances.Add(_ftdi, stream); return m_instances[_ftdi]; } } public static void removeInstance(FTDI _ftdi) { if(m_instances.ContainsKey(_ftdi)) { m_instances.Remove(_ftdi); } } private FTDI m_ftdi; public FTDIStream(FTDI _ftdi) { if (_ftdi == null) throw new NullReferenceException(); m_ftdi = _ftdi; } public override void Flush() { m_ftdi.Purge(FTD2XX_NET.FTDI.FT_PURGE.FT_PURGE_RX); m_ftdi.Purge(FTD2XX_NET.FTDI.FT_PURGE.FT_PURGE_TX); } public override int Read(byte[] buffer, int offset, int count) { if (buffer == null) throw new NullReferenceException(); if (buffer.Length < count) throw new Exception("Buffer to small."); byte[] tempbuffer = new byte[offset + count]; uint bytesread = 0; m_ftdi.Read(tempbuffer, (uint)tempbuffer.Length, ref bytesread); Buffer.BlockCopy(tempbuffer, offset, buffer, 0, (int)((count + offset >= bytesread) ? ((bytesread - offset > 0) ? bytesread - offset : 0) : count)); return (int)((count + offset >= bytesread) ? ((bytesread - offset > 0) ? bytesread - offset : 0) : count); } public override void Write(byte[] buffer, int offset, int count) { if (buffer == null) throw new NullReferenceException(); if (offset > buffer.Length) throw new Exception("Offset greater then Buffersize"); byte[] writebuffer = new byte[buffer.Length - offset]; Buffer.BlockCopy(buffer, offset, writebuffer, 0, writebuffer.Length); uint byteswritten = 0; FTDI.FT_STATUS status = m_ftdi.Write(writebuffer, count, ref byteswritten); } public override long Length { get { uint retval = 0; m_ftdi.GetRxBytesAvailable(ref retval); return retval; } } der fdtistram ist schon deutlich mehr getestet als die comportvariante die hab ich nur mal halbherzig implementiert
  4. Mal ne Frage, die FTDI-Klasse die da verwendet wird ist das zufällig die welche es unter C# Examples direkt oben als managed .NET wrapper gibt? Falls ja, wie geht ihr mit den Mesageboxen um? Keine Ahnung was sich FTDI dabei gedacht hat, aber wenn man sich die einzelnen Funktionen mal im Reflector anschaut, sehen die immer so inetwa aus public FT_STATUS functionname(params) { tests ob ausführung ok ist functionscode if (mögliche fehlerquelle 1) { MessageBox.Show("fehlertext1"); } if (mögliche fehlerquelle 2) { MessageBox.Show("fehlertext 2"); } ... } return ft_status; } und mal ehrlich ich will doch nicht das eine DLL dem User Messageboxen entgegenschmeißt, anstatt mir eine Exception hochzugeben, über deren Behandlung ich mir dann selbst Gedanken machen kann und falls nötig eine messagebox erzeuge. Zum erzeugen von Events in meinem aktuellen Projekt auf Arbeit arbeite ich auf mit nem FTDI-Chip über den Chip läuft ein selbst definiertes Protokoll das auf C# Seite über einen Backgroundworker abgearbeitet wird. Dabei wird nur ein Stream ansich benötigt und dann Streamspezifische funktionen verwendet. So kann man USB und Serial auf einmal erschlagen. Eine FTDI-Streamklasse implementiert read/write. Anschließend liest der Protokollhandler ankommende Daten in einen Puffer und sobald ein gültiges Paket erkannt wurde schmeißt er ein Event.
  5. kross

    Punkt vor Strichrechnung

    so sollte es relativ einfach gehen -eingabe (werte und operanten merken) -anschließend aus dieser liste die operationen von der höchsten zur kleinsten priorität abarbeiten -bleibt nurnoch ein wert und keine operation mehr hat man das ergebnis zu tun erstmal ein neues leeres form erstellen und 6 buttons adden und code einfügen das beispielprojekt hat nur addition, multiplikation und potenzieren und als wert nur die zahl 3 -erweitern um ziffern {0..9}/3 -ziffern untereinander zu zahlen zusammenfassen (sind 2 werte an stelle i in der liste ohne rechenoperation benachbart wert=wert*10+wert[i+1], lösche wert[i+1]) -erweitern um subtraktion/division -fehlerbehandlung (doppelte rechenoptoren abfangen etc) using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace WindowsApplication5 { public partial class Form1 : Form { private List<Teil> m_teile; public enum operation { plus, minus, mal, durch, hoch, } public Form1() { InitializeComponent(); button1.Text = "3"; button2.Text = "+"; button3.Text = "*"; button4.Text = "^"; button5.Text = "Neu"; button6.Text = "="; m_teile = new List<Teil>(); } private void button1_Click(object sender, EventArgs e) { m_teile.Add(new Teil(3)); } private void button2_Click(object sender, EventArgs e) { m_teile.Add(new Teil(Operation.plus)); } private void button3_Click(object sender, EventArgs e) { m_teile.Add(new Teil(Operation.mal)); } private void button4_Click(object sender, EventArgs e) { m_teile.Add(new Teil(Operation.hoch)); } private void button5_Click(object sender, EventArgs e) { m_teile = new List<Teil>(); } private void button6_Click(object sender, EventArgs e) { //schrittweise aufloesen //erster schritt die ziffern zu zahlen zusammenfassen //!!!!todo im beispiel nur mit einstelligen ziffern gearbeitet //zweiter schritt potenzen ausrechnen //rechten und linken operand + rechenzeichen aus der liste löschen //ergebnis an deren stelle einfügen for (int i = 0; i < m_teile.Count; i++) { if (m_teile[i].Art == Teil.ArtEnum.RechenOperation && m_teile[i].Operation == Operation.hoch) { int erg = (int)Math.Pow(m_teile[i - 1].Wert, m_teile[i + 1].Wert); m_teile[i - 1].Wert = erg; //wert vor dem operand wird überschrieben spart herrauslöschen und anschließendes neu einfügen m_teile.RemoveRange(i, 2); i--;//i um eins verringern da durch das löschen der aktuellen position dort nun ein noch nicht verarbeiteter wert steht } } //dritter schritt multiplizieren (todo dividieren) for (int i = 0; i < m_teile.Count; i++) { if (m_teile[i].Art == Teil.ArtEnum.RechenOperation && m_teile[i].Operation == Operation.mal) { int erg = m_teile[i - 1].Wert * m_teile[i + 1].Wert; m_teile[i - 1].Wert = erg; //wert vor dem operand wird überschrieben spart herrauslöschen und anschließendes neu einfügen m_teile.RemoveRange(i, 2); i--;//i um eins verringern da durch das löschen der aktuellen position dort nun ein noch nicht verarbeiteter wert steht } } //letzter schritt addieren (todo subtrahieren) for (int i = 0; i < m_teile.Count; i++) { if (m_teile[i].Art == Teil.ArtEnum.RechenOperation && m_teile[i].Operation == Operation.plus) { int erg = m_teile[i - 1].Wert + m_teile[i + 1].Wert; m_teile[i - 1].Wert = erg; //wert vor dem operand wird überschrieben spart herrauslöschen und anschließendes neu einfügen m_teile.RemoveRange(i, 2); i--;//i um eins verringern da durch das löschen der aktuellen position dort nun ein noch nicht verarbeiteter wert steht } } //m_teile sollte nurnoch 1 eintrag haben dieser ist das ergebnis MessageBox.Show(m_teile[0].Wert.ToString()); } } public enum Operation { plus, minus, mal, durch, hoch, } public class Teil { private ArtEnum m_art; public ArtEnum Art { get { return m_art; } } private Operation m_operation; public Operation Operation { get { return m_operation; } } private int m_wert; public int Wert { get { return m_wert; } set { m_wert = value; } } public Teil(Operation _op) { m_art = ArtEnum.RechenOperation; m_operation = _op; } public Teil(int _wert) { m_wert = _wert; m_art = ArtEnum.Wert; } public enum ArtEnum { RechenOperation, Wert } } }
  6. waren ein paar kleine fehler drin und nicht alles vollständig wenn du das ganze auf 20 fragen erweiterst kommst du auf 79 zeilen inklusive einiger leerzeilen using System; using System.Collections.Generic; using System.Text; namespace ConsoleApplication2 { class Program { static void Main(string[] args) { List<Frage> fragen = new List<Frage>(); fragen.Add( new Frage("meine frage", new List<string>(new string[] { "antwort 1", "antwort 2", "antwort n" }), "A")); fragen.Add(new Frage("noch eine frage", new List<string>(new string[] { "andere antwort 1", "andere antwort 2", "andere antwort n" }), "B")); fragen.Add(new Frage("Was ist keine Ziffer", new List<string>(new string[] { "1", "2", "3", "4", "5", "6", "7", "8", "#" }), "I")); foreach (Frage frage in fragen) { if (frage.StelleFrage()) { Console.WriteLine("Richtig!"); } else { Console.WriteLine("Falsch!"); } } Console.ReadKey(); } class Frage { string m_fragetext; List<string> m_antworten; string m_antwort; public Frage(string _fragetext, List<String> _antworten, string _antwort) { m_fragetext = _fragetext; m_antworten = _antworten; m_antwort = _antwort; } public bool check(String _userAntwort) { return m_antwort.ToLower() == _userAntwort.ToLower(); } public bool StelleFrage() { Console.WriteLine("{0}", m_fragetext); char antwortindex = 'A'; foreach (string antwort in m_antworten) { Console.WriteLine("{0} ) {1}", (Char)(antwortindex++), antwort); } Console.Write("Antwort: "); string userantwort = Console.ReadLine(); return check(userantwort); } } } }
  7. erstell dir ne frageklasse mit den membern string m_fragetext; List<string>m_antworten; string m_antwort; ctor(string _fragetext, List<String> _antworten, _antwort) { m_fragetext = _fragetext; m_antworten = _antworten; m_antwort = _antwort; } public bool check(String _userAntwort) { return m_antwort.ToLower() == _userAntwort.ToLower(); } der klasse kannst du auchnoch funktionen zum schreiben deiner frage in die konsole geben evtl auch das antwort auswerten komplett überlassen in deiner mainklasse erstellst du dann die fragen mit List<Frageklasse> fragen = new List<Frageklasse>(); fragen.Add("meine frage",new List<string>(new string[] { "antwort 1", "antwort 2", "antwort n" }, "A")); fragen.Add("noch eine frage",new List<string>(new string[] { "andere antwort 1", "andere antwort 2", "andere antwort n" }, "B")); ... danach foreach (Frageklasse frage in fragen) { //todo code zum frage stellen antwort einlesen z.B. in string inputstr if(frage.check(inputstr)) { //code für richtige antwort } else { //code für falsche } } vorteil für das hinzufügen jeder weiteren frage benötigst du blos eine weitere zeile code ps das ist noch dotnet2 code mit dem 3er gehts noch etwas angenehmer

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...