Simulationsprogramm für kombinatorische Steuerung / Hilfe bei Programmierung!
-
Ich möchte ein Pumpensteuerungsprogramm erstellen, dass eine kombinatorische Steuerung voerst nur simuliert. Voerst also keine Schnittstellenprogrammierung (MCATOOLS).
Das Programm soll folgende Menüpunkte beinhalten:
o Tabelle eingeben
-Anzahl der Eingänge (Feldgröße)
-Eingabe der Werteo Aktuelle Tabelle anzeigen
-soll die Ansicht der aktuell im Feld abgelegten Tabelle
ermöglicheno Tabelle laden
-von Diskette laden (Laufwerk A:)
-Suffix automatisch "DAT"o Tabelle korrigieren
-Korrektur einzelner Werteo Tabelle speichern
-speichert existierende Tabelle in einer Datei auf Diskette (Laufwerk A:)
-Dateiname 8 Zeichen + Suffix "DAT" (<- automatisch)o Simulierung der Steuerung
-simuliert auf Bildschirm:
Eingang: 0000 0000 (<-PA7, PA6, PA5... PA0)
Ausgang: 0000 0000 (<-PB7, PB6, PB5... PB0)
Tastatureingabe einer Zahl zwischen 0-255 (nur 8Bit).Ich hoffe, dass ihr die Problemstellung schon einmal versteht.
Das Programm sollte in DOS simpel programmiert sein, da ich noch ein Anfänger bin.Meine Probleme:
-Programm lässt sich wie unten gezeigt nicht starten (nur schwarze DOS Ebene)
-ich hab keine ahnung, wie ich
o Die Tabelle auf Laufwerk A: speicher
o Die Tabelle von Laufwerk A: lade
o Die Tabelle korrigiere
o Die Steuerung auf dem Bildschirm simulieren sollHier schonmal die Grundstruktur von mir:
//Pumpensteuerungsprogramm #include <conio.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <ctype.h> #include <dos.h> //=====================FUNKTIONEN==========================================// int feld2; int *feld = new int [feld2]; //-----------------------Cursor-Position-----------------------------------// cursor_printf(int spalte, int zeile, char *text) { gotoxy(spalte, zeile); printf("%s", text); return 0; } //--------------------Feld definieren--------------------------------------// int feld_definieren() { int groesse; printf("\n\n\nLegen Sie die Groesse der Tabelle fest."); printf("\n\nTabellengroesse: ", groesse); scanf("%i", &groesse); { int n; int x; int i; int f; feld2 = groesse; printf("\n", feld2); for (n=1; n<=feld2; n++) { f = n - 1; printf("\n%i. Wert eingeben: ", n); scanf("%i", &x); feld[f] = x; } printf("\n\n\nTabellenbelegung: "); for (i=0; i<feld2; i++) { printf("%i ", feld[i]); getch(); } } } //------------------------aktuelle Tabelle anzeigen----------------------// int aktuelle_tabelle_anzeigen() { int i; for (i=0; i<feld2; i++) { printf("%i ", feld[i]); getch(); } } //-----------------------Tabelle speichern--------------------------------// int tabelle_speichern() { int i; FILE *datei_tabelle; datei_tabelle = fopen("tabelle.DAT", "w"); for (i=0; i<feld2; i++) { fprintf(datei_tabelle, "%i\n", feld[i]); } fclose(datei_tabelle); } //------------------------Simulieren der Pumpensteuerung-------------------// int simulierung() { } //====================HAUPTPROGRAMM=====================================// main() { char auswahl; do { clrscr(); cursor_printf (26, 7, "P U M P E N S T E U E R U N G"); cursor_printf (26, 8, "============================="); cursor_printf (26, 10, "Auswahlmenue:"); cursor_printf (28, 12, " (A) Tabelle definieren"); cursor_printf (28, 13, " (B) Aktuelle Tabelle anzeigen"); cursor_printf (28, 14, " (C) Tabelle laden"); cursor_printf (28, 15, " (D) Tabelle korrigieren"); cursor_printf (28, 16, " (E) Tabelle speichern"); cursor_printf (28, 17, " (F) Simulierung"); cursor_printf (28, 19, " (X) Programm beenden"); cursor_printf (26, 22, " Ihre Auswahl: "); scanf("%c", &auswahl); auswahl = toupper(auswahl); if(auswahl == 'A') { clrscr(); printf("\nTabelle definieren"); feld_definieren(); getch(); } else if (auswahl == 'B') { clrscr(); printf("\nAktuelle Tabelle anzeigen: "); aktuelle_tabelle_anzeigen(); getch(); } else if (auswahl == 'C') { clrscr(); printf("\nTabelle laden"); getch(); } else if (auswahl == 'D') { clrscr(); printf("\nTabelle korrigieren"); getch(); } else if (auswahl == 'E') { clrscr(); printf("\nTabelle wurde gespeichert"); tabelle_speichern(); getch(); } else if (auswahl =='F') { clrscr(); printf("\nSimulierung der Pumpensteuerung\n\n") simulierung(); getch(); } } while (auswahl != 'X'); }
Irgendwie gibt das Programm bei mir Fehler aus und kann nicht gestartet werden. Wäre nett, wenn ihr mir helfen könnt, um das Programm zu vervollständigen. Bin mit meinem Latein am Ende.
Gruß
-
versuch doch mal:
int *feld = new int [feld2];
durch
int *Feld; //hier nur noch das //... int feld_definieren() { int groesse; printf("\n\n\nLegen Sie die Groesse der Tabelle fest."); scanf("%i", &groesse); //Vielleicht noch testen ob groesse überhaupt sinnvoll ist (z.B. >0) feld=new int [feld2]; //Jetzt hat feld2 einen Wert //{ für was diese Klammer?? //...
zu ersetzten. Für das Hauptprogramm wäre switch(...) case übersichtlicher.
EDIT: Den Speicher solltest du auch irgendwann wieder freigeben.
-
Dieser Thread wurde von Moderator/in Korbinian aus dem Forum Projekte in das Forum Rund um die Programmierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Hallo!
Ich habe das Programm nochmal überarbeitet und erweitert. Es funktioniert alles soweit, nur leider speichert das Programm falsche Werte... Woran liegt das? Könnte jemand von euch das Programm mal testen? Liegt es vielleicht, dass ich den Speicher nicht wieder freigegeben habe, dass dadurch die Werte beim Speichern verändert werden? Hab aber keine Ahnung, wie man den Speicher freigibtHier der Code:
#include <conio.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <ctype.h> #include <dos.h> //=====================FUNKTIONEN==========================================// int feld2; int *feld = new int [feld2]; //-----------------------Cursor-Position-----------------------------------// cursor_printf(int spalte, int zeile, char *text) { gotoxy(spalte, zeile); printf("%s", text); return 0; } //--------------------Feld definieren--------------------------------------// void feld_definieren() { int groesse; printf("Legen Sie die Groesse der Tabelle fest: "); scanf("%i", &groesse); { int n; int x; int a; int f; feld2 = groesse; for (n=1; n<=feld2; n++) { f = n - 1; printf("\n%i. Wert eingeben: ", n); scanf("%i", &x); feld[f] = x; } printf("\n\nTabellenbelegung: "); for (a=0; a<feld2; a++) { printf("%i ", feld[a]); } } } //------------------------aktuelle Tabelle anzeigen----------------------// void aktuelle_tabelle_anzeigen() { int b; printf("Aktuelle Werte: "); for (b=0; b<feld2; b++) { printf("%i ", feld[b]); } } //------------------------Tabelle laden----------------------------------// void tabelle_laden() { int c; int index; index = 0; FILE *datei_tabelle; datei_tabelle = fopen("A:\\tabelle.DAT", "r"); while(!(feof(datei_tabelle))) { c=fgetc(datei_tabelle); index++; } fclose(datei_tabelle); index--; feld2=index; index=0; datei_tabelle = fopen("A:\\tabelle.DAT", "r"); while(!(feof(datei_tabelle))) { c=fgetc(datei_tabelle); feld[index]=c; index++; } fclose(datei_tabelle); printf("Tabelle wurde geladen\n\n"); aktuelle_tabelle_anzeigen(); } //------------------------Tabelle korrigieren----------------------------// void tabelle_korrigieren() { int welcher; int neu; printf("Aktuelle Tabelle:\n"); int d; for(d=1; d<=feld2; d++) { printf("%4i.", d); } printf("\n"); int e; for (e=0; e<feld2; e++) { printf("%5i", feld[e]); } printf("\n\nGeben Sie ein, welchen Wert Sie aendern moechten (1.-%i.): ", feld2); scanf("%i", &welcher); printf("\nNeuer Wert fuer %i. Wert: ", welcher); scanf("%i", &neu); welcher = welcher-1; feld[welcher]=neu; printf("\n\n"); aktuelle_tabelle_anzeigen(); } //-----------------------Tabelle speichern--------------------------------// void tabelle_speichern() { int g; FILE *datei_tabelle; datei_tabelle = fopen("A:\\tabelle.DAT", "w"); for (g=0; g<feld2; g++) { fprintf(datei_tabelle, "%c", feld[g]); } printf("Tabelle wurde auf Laufwerk A: gespeichert"); fclose(datei_tabelle); } //====================HAUPTPROGRAMM=====================================// main() { char auswahl; do { clrscr(); cursor_printf (26, 7, "P U M P E N S T E U E R U N G"); cursor_printf (26, 8, "============================="); cursor_printf (26, 10, "Auswahlmenue:"); cursor_printf (28, 12, " (A) Tabelle definieren"); cursor_printf (28, 13, " (B) Aktuelle Tabelle anzeigen"); cursor_printf (28, 14, " (C) Tabelle laden"); cursor_printf (28, 15, " (D) Tabelle korrigieren"); cursor_printf (28, 16, " (E) Tabelle speichern"); cursor_printf (28, 17, " (F) Simulieren"); cursor_printf (28, 19, " (X) Programm beenden"); cursor_printf (26, 22, " Ihre Auswahl: "); scanf("%c", &auswahl); auswahl = toupper(auswahl); if(auswahl == 'A') { clrscr(); feld_definieren(); getch(); } else if (auswahl == 'B') { clrscr(); aktuelle_tabelle_anzeigen(); getch(); } else if (auswahl == 'C') { clrscr(); tabelle_laden(); getch(); } else if (auswahl == 'D') { clrscr(); tabelle_korrigieren(); getch(); } else if (auswahl == 'E') { clrscr(); tabelle_speichern(); getch(); } else if (auswahl == 'F') { clrscr(); //simulieren(); getch(); } } while (auswahl != 'X'); }
Die Datei wird auf Diskette gespeichert.
-
Dieser Thread wurde von Moderator/in kingruedi aus dem Forum Rund um die Programmierung in das Forum DOS und Win32-Konsole verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Lass es doch mal durch den Debugger laufen und beobachte die Variablen, die
die "falschen" Werte besitzen.
-
hallo
du solltest die zahl auch als integer speichern, nicht als char
fprintf(datei_tabelle, "%i", feld[g]);
beim laden öffnest du zweimal, wohl ein copy und paste fehler, also raus mit einer version aus der funktion.
zum dritten: bitte einen rückgabewert für cursor_orintf setzen:
int cursor_printf(int spalte, int zeile, char *text)
so long
ps: mit laden machst übrigens nichts. du speicherst die werte nirgends bleibend.
du zeigst nur die alten werte.
denk über diese funktion nochmal nach. was soll sie bewirken?
-
Wenn ich die Zahlen als integer speicher, dann kommen da noch verkehrtere Werte heraus... Beim Laden sollen die Werte ja schließlich wieder im Feld (string) abgelegt werden.
Sobald ich die Tabelle (die Werte) gespeichert habe und dann die aktuellen Werte anschauen will, die ich im Feld gespeichert habe, dann sind diese total verfälscht...
Beim Laden muss ich zweimal laden, bzw. die Datei "einscannen". Ich will die Datei ja in mein Feld rein haben.
Hat jemand sonst andere Möglichkeiten, um die Datei als string abzuspeichern und dann wieder als string in das vorhandene Feld zu laden?
Die werte werden bleibend auf Diskette (Laufwer A ) gespeichert. Hierbei ist es egal, ob man sie in der Datei sehen kann, oder nicht.
-
??
dein feld ist doch ein integer feld.. wo ist das stringfeld?
*such*
ps: was heißt denn einscannen? bzw. was verstehst du darunter?
-
Mein Feld heißt "feld". Dort sind die Werte drin abgelegt.
Hier Beweise:
[cpp]int feld2;
int *feld = new int [feld2];[/cpp]und
[cpp]for (n=1; n<=feld2; n++)
{
f = n - 1;
printf("\n%i. Wert eingeben: ", n);
scanf("%i", &x);
feld[f] = x;
}
printf("\n\nTabellenbelegung: ");for (a=0; a<feld2; a++)
{
printf("%i ", feld[a]);
}
}
}[/cpp]Mit einscannen meine ich, dass erstmal herausgefunden wird, wieviele Werte abgespeichert wurden und dann erst wirklich geladen wird. Wenn ich nur einmal lade, dann kommt eine riesen Menge an Werten in den String.
Aber wie gesagt würde ich eine andere Lösung besser finden. Wie kann ich den string laden? irgendwie mit putchar() oder so?
In einem C++ Buch steht folgendes Beispiel für Laden:
... File *stream; int ch; ch = fgetch(stream); while(!feof(stream)); { putchar(ch); ch=fgetc(stream); } fclose(stream); ...
Und wie setze ich dies nun um, dass die Datei in mein String gespeichert wird? Woher soll erkannt werden, wie viele Werte überhaupt in den String kommen?
-
das ist ein int feld.