Hallo, vorab: Ich bin kein Informatiker und kann nicht so gut programmieren. Ich durchlaufe eine Schleife so oft, bis Enter gedrückt wird. Jedes Mal, wenn die Schleife durchlaufen wird, erscheint in diesem Konsolenfenster eine neue Zeile mit den aktuellen Werten (siehe Anhang). Wie ist es nun möglich, dass ich zum Beispiel nur die letzten 3 Zeilen darstellen kann (die Werte sollen kontinuierlich erneuert werden) und darunter statisch schreiben kann: "Zum Beenden bitte Enter drücken" Zum Beispiel sowas: --- Zeit lesen <> schreiben: 0.123 Sekunden - Strom: 0.234 - Umdreh: 0.345 Zeit lesen <> schreiben: 0.345 Sekunden - Strom: 0.987- Umdreh: 0.586 Zeit lesen <> schreiben: 0.678 Sekunden - Strom: 0.475 - Umdreh: 2.485 Zum Beenden bitte Enter drücken --- Das Ganze wurde bisher in C programmiert. Kann mir hier jemand weiterhelfen?
zeig doch mal deinen vorhandenen code
Gast
#3758519
In Pascal gibt es eine gotoxy Funktion, die den Cursor auf eine bestimmte Stelle setzt. Ich meine ich hätte sowie auch mal in C gemacht. Musst nur vorher den alten Text wieder mit schwarz überschreiben, sonnst liegen die Texte übereinander.
Das "Programm" liest von einer NI USB 6009 Karte verschiedene Messwerte kontinuierlich ein. Hier ist nachfolgend die Schleife, die kontinuierlich durchlaufen wird: (Ich habe es momentan noch mit goto realisiert, das werde ich aber demnächst ändern, keine Angst ;) )
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
Gast
#3758560
Standard-C bietet keine Funktionen dafür. Da musst du Systemfunktionen nutzen. Es gibt zum Glück schon fertige Librays dafür. Unter Unix kan man die ncurses Library nutzen. Für Windows gibt es die auch. Du kannst auch die Improved Console nehmen: http://www.c-plusplus.de/code/ic/
Gast
#3758562
das geht mit reinem c nicht. welches os?
Gast
#3758704
Unter Windows XP mit visual Studio 2010
Gast
#3758709
Wenn du Visual Studio schon hast, nimm doch C++/CLI. Da brauchst du keine Zusätze um einfach ein paar Zeilen in der cmd zu löschen ;)
Gast
#3758722
Und warum nimmst du dann keine grafische Lösung? Ein Label, dass sich immer aktualisiert?
Früher gingen Dinge wie Cursorpositionierung, bunte Texte und Scrollen in der Konsole noch ganz einfach mit ANSI-Steuersequenzen, die man in die Printf-Aufrufe einflechten konnte. Aber das scheint in neueren Windows-Versionen nicht mehr zu gehen. Heute muss man dazu wohl die WinAPI-Funktionen bemühen, siehe http://msdn.microsoft.com/en-us/library/windows/desktop/ms682073%28v=vs.85%29.aspx einen Windows-Port der Curses-Bibliothek installieren und verwenden, siehe http://gnuwin32.sourceforge.net/packages/pdcurses.htm ein Tool installieren, das der Konsole die verlorenen Features wieder zurückgibt, siehe https://github.com/adoxa/ansicon oder gar eine neue Programmiersprache lernen, siehe jz schrieb: > Wenn du Visual Studio schon hast, nimm doch C++/CLI. oder eine GUI-Version des Programms hochziehen, was de facto ebenfalls das Lernen einer neuen Programmiersprache (und noch einiges darüber hinaus) impliziert, siehe St M schrieb: > Und warum nimmst du dann keine grafische Lösung? Ein Label, dass > sich immer aktualisiert? Ich schätze, dass in diesem konkreten Fall die Verwendung der WinAPI-Funktionen noch das kleinste Übel darstellt. Die Lösung mit der Curses-Bibliothek hat immerhin noch den Vorteil, dass diese plattformübergreifend verfügbar ist.
Gast
#3758793
Yalu X. schrieb: > Früher gingen Dinge wie Cursorpositionierung, bunte Texte und Scrollen > in der Konsole noch ganz einfach mit ANSI-Steuersequenzen, die man in > die Printf-Aufrufe einflechten konnte. Auf jeden Fall geht noch der "\r" (Zeilenrücklauf). Damit kann man zumindest die Ausgabe einer Zeile immer wieder überschreiben. Aber die Cursorpositionierung, Cursor Up und Home und ähnliches scheint nicht mehr zu funktionieren. Hab ich früher mit TurboPascal oft gemacht...
Gast
#3758807
npn schrieb: > Aber die Cursorpositionierung, Cursor Up und Home und ähnliches scheint > nicht mehr zu funktionieren. Hab ich früher mit TurboPascal oft > gemacht... Heutzutage braucht das (fast) keiner mehr. Da macht man graphisch einen rollenden xt-Plot, so dass man immer den Verlauf der letzen Zeit im Fenster sieht und hat einen Button in der GUI, der über Hotkey auch per Tastatur bedienbar ist.
Gast
#3758820
pnp schrieb: > npn schrieb: >> Aber die Cursorpositionierung, Cursor Up und Home und ähnliches scheint >> nicht mehr zu funktionieren. Hab ich früher mit TurboPascal oft >> gemacht... > > Heutzutage braucht das (fast) keiner mehr. Da macht man graphisch einen > rollenden xt-Plot, so dass man immer den Verlauf der letzen Zeit im > Fenster sieht und hat einen Button in der GUI, der über Hotkey auch per > Tastatur bedienbar ist. Hier gehts um eine ganz normale Consolenausgabe. Und da gibts nun mal nur Zeilen und Spalten, die mit Zeichen gefüllt werden... Daß es Grafik gibt und GUIs, hat sich mittlerweile rumgesprochen ;-) Johannes schrieb: > ...und kann nicht so gut programmieren. Es ist doch in Ordnung und überhaupt nichts falsches dran, wenn man erstmal Programme mit Konsolenausgabe schreibt und die Grundlagen lernt. Später, wenn man besser programmieren kann, ist man auch in der Lage, Dinge zu verstehen, die für einen Anfänger reichlich komplex sind. Zum Beispiel eine GUI-Programmierung.
Gast
#3758903
letzte 3 Werte(paare) merken
system ("cls");
ausgeben
Stefan
pnp schrieb: > Heutzutage braucht das (fast) keiner mehr. Es ist die gesamte Konsole, die "fast" keiner mehr braucht. Trotzdem gibt es sie immer noch. Die wenigen, die sie noch nutzen, wären ganz froh, wenn die ohnehin schon spärlichen Features nicht immer noch mehr zusammengestaucht würden. Die Funktionalität des früheren ANSI.SYS würden, fest integriert in CMD.EXE, dieses vielleicht gerade einmal um ein paar Hundert Bytes vergrößern. Da wird an anderen Stellen in Windows für nutzlosere Features deutlich mehr Speicher verschwendet. Stefan schrieb: > letzte 3 Werte(paare) merken > system ("cls"); > ausgeben Das flackert evtl. ein Bisschen, ist aber dafür eine sehr einfach umzusetzende Lösung des Problems.
Gast
#3759068
Stefan schrieb: > letzte 3 Werte(paare) merken > system ("cls"); > ausgeben > > Stefan Kannst du mir das etwas näher erklären?
Gast
#3759119
hallo, google doch mal nach "improved console". das ist ein kleines framework für die konsole. leicht zu benutzen und gut dokumentiert. grüße
Gast
#3759149
nicht"Gast" schrieb: > google doch mal nach "improved console". Gar nicht nötig. Nur die Beiträge aufmerksam lesen :-) DirkB schrieb: > Für Windows gibt es die auch. > Du kannst auch die Improved Console nehmen: > http://www.c-plusplus.de/code/ic/
Gast
#3759173
Muster schrieb: > Kannst du mir das etwas näher erklären? http://support.microsoft.com/kb/99261 http://de.wikipedia.org/wiki/Liste_von_Kommandozeilenbefehlen_(Microsoft) Stefan
Gast
#3759306
DirkB schrieb: > nicht"Gast" schrieb: >> google doch mal nach "improved console". > > Gar nicht nötig. Nur die Beiträge aufmerksam lesen :-) Ach mist :) das hatte ich glatt überlesen. Sie es als +1 an ^^
Gast
#3759490
npn schrieb: > Yalu X. schrieb: >> Früher gingen Dinge wie Cursorpositionierung, bunte Texte und Scrollen >> in der Konsole noch ganz einfach mit ANSI-Steuersequenzen, die man in >> die Printf-Aufrufe einflechten konnte. > > Auf jeden Fall geht noch der "\r" (Zeilenrücklauf). Damit kann man > zumindest die Ausgabe einer Zeile immer wieder überschreiben. > > Aber die Cursorpositionierung, Cursor Up und Home und ähnliches scheint > nicht mehr zu funktionieren. Hab ich früher mit TurboPascal oft > gemacht... Das habe ich jetzt gemacht. Dann belasse ich es vorerst dabei. Habe dann eben keine Historie. Jetzt aber noch zwei weitere Fragen: Die Zeile wird nun bei jedem Durchlaufen aktualisiert. 1. Wie kann ich nun statisch darunter "Zum Beenden bitte Enter druecken" schreiben? Wenn ich nun mit \n arbeite, schreibt er wieder jede Zeile einzeln untereinander. 2. Wie kann ich in der Schleife auf eine Tastatureingabe abfragen, OHNE dass er mich bei jedem Durchlauf danach fragt? Er soll einfach so oft die Schleife durchlaufen bis ich Enter drücke und dann soll er rausspringen. Mit "if (getchar() )goto Beenden;" geht es nicht, weil er dann jedes Mal danach fragt und erst weiter macht, wenn ich Enter drücke.
Gast
#3759524
1. Mit Standard-C geht das nicht. C kennt keinen Bildschirm. Schreib es darüber. 2. Mit Standard-C geht das nicht. C kennt keine Tastatur. Es gibt bei MS die Funktionen kbhit() (deklariert in der conio.h) die feststellt ob eine Taste gedrückt wurde. Wenn eine gedrückt wurde, kannst du die dann mit getchar einlesen. Sonst google doch mal nach "Snake für DOS Konsole". Die haben da meist die gleichen Probleme wie du.
Gast
#3759547
Muster schrieb: > 2. Wie kann ich in der Schleife auf eine Tastatureingabe abfragen, OHNE > dass er mich bei jedem Durchlauf danach fragt? Er soll einfach so oft > die Schleife durchlaufen bis ich Enter drücke und dann soll er > rausspringen. Klar geht das. Binde die "windows.h" ein mit
1 | |
und dann kannst du mit
1 | |
abfragen, ob Return gedrückt worden ist. Wenn du andere Tasten abfragen willst, kannst du nach "Virtual-Key Codes" suchen, da findest du Listen.
Gast
#3759611
npn schrieb: > Muster schrieb: >> 2. Wie kann ich in der Schleife auf eine Tastatureingabe abfragen, OHNE >> dass er mich bei jedem Durchlauf danach fragt? Er soll einfach so oft >> die Schleife durchlaufen bis ich Enter drücke und dann soll er >> rausspringen. > > Klar geht das. Binde die "windows.h" ein mit#include <windows.h> > und dann kannst du mitif(GetAsyncKeyState(VK_RETURN)) > abfragen, ob Return gedrückt worden ist. > > Wenn du andere Tasten abfragen willst, kannst du nach "Virtual-Key > Codes" suchen, da findest du Listen. Aaaah, wunderbar. Sowas habe ich gesucht. Vielen Dank
Gast
#3760369
Hallo, ich möchte nun, dass ich in meinem Konsolenfenster eine Drehzahl vorgebe und der Motor diese dann versucht zu erreichten. Das ganze wird wieder in Visual Studio 2010 mit C programmiert. Die Parameter gebe ich dann auf meine NI USB 6009 aus. Diese gibt dann eine Spannung von 0-5V aus. Beispiel: Der Motor steht. Die zu erreichende Drehzahl ist nun 1000/min. Ich möchte also, dass die Berechnung "Beschleunigen" aufgerufen wird. Sobald die Drehzahl erreicht wurde, soll das Programm warten, bis etwas neues passiert. Zum Beispiel könnte ich den Motor belasten, sodass die Drehzahl fällt und er nachregeln muss. Allerdings könnte es auch sein, dass ich die Belastung wegnehme, folglich steigt die Drehzahl und dann Programm soll "Bremsen" aufrufen. Das Spiel soll so lange weitergehen, bis es beende. Ist dafür eine Switch Anweisung sinnvoll bzw. überhaupt machbar? Bei Switch kann ich doch nur auf Konstante abfragen?! Ich müsste doch dann zb. so abfragen: Wenn Solldrehzahl>Istdrehzahl, dann beschleunigen. Wenn Solldrehzahl<Istdrehzahl, dann bremsen. Wenn Solldrehzahl=Istdrehzahl, dann warten.
Gast
#3760609
Hat niemand eine Idee?
Hallo! zuerst mußt Du Dir klar werden, was es werden soll: http://de.wikipedia.org/wiki/Regler
Gast
#3761089
Hallo, ich denke ein PID Regler wäre am Besten.
Gast
#3761379
Obwohl es wahrscheinlich auch ein PD Regler tun würde.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.
