LIFO-Puffer !?
-
Hallo zusammen,
Ich sitze hier vor einem riesigen Problem, nämlich eine Pflichtübung für mein Studium, allerdings habe ich so gut wie gar keine Ahnung von ANSI-C.Wir sollen einen LIFO-Puffer schreiben, also LastInFirstOut (soll ja wohl bedeuten, dass ein Wort genau rückwärts ausgegeben wird).
Das Programm selber wäre wahrscheinlich nicht mal das Problem, aber wir haben da ein paar Codeschnipsel gegeben wo ich überhaupt nicht weiß was ich damit anfangen soll:
#define LEN 20 typedef unsigned char BYTE; typedef struct { BYTE Top; BYTE Data[LEN]; } Buffer; typedef *Buffer HDLD; typedef enum {BufOK = 0, BufEmpty = 1, BufFull = 2 , BufError = 0xFF} BufStatus;
Lösen Sie die folgenden Aufgaben möglichst knapp, aber mit Kommentaren:
a) Eine Initialisierungsroutine „InitBuf“ soll Speicher für einen Datenpuffer des Typs RawData
anlegen, die Verwaltungsvariable Top auf -1 setzen (Puffer leer) und als Ergebnis die Adresse
des Datenpuffers zurückgeben. Die Signatur der Routine ist:
HDLD InitBuf();
b) Eine Schreibroutine „PutElem“ soll prüfen, ob der Puffer noch Platz hat. Falls ja, soll sie ein
Byte in den Puffer an die durch Top+1 bezeichnetes Stelle hereinschreiben und ein entsprechendes
Resultat zurückgeben. Die Signatur ist:
BufStatus PutElem(HDLD buf, BYTE d);
c) Eine Leseroutine „GetElem“ soll prüfen, ob der Puffer noch mind. ein Element enthält. Falls ja,
soll sie das durch Top bezeichnete Element in die über Referenz übergebene Bytevariable
hereinschreiben, Top dekrementieren und ein entsprechendes Resultat zurückgeben. Die
Signatur der Routine ist:
BufStatus GetElem(HDLD buf, BYTE *d);
d) Eine Wandelroutine CnvBuf soll alle Elemente eines Puffers nacheinander lesen, die Bits 5..2
extrahieren und die darin enthaltenen Werte in einen neuen Puffer schreiben. Dabei sollen die
Funktionen aus den vorigen Teilaufgaben verwendet werden. Die Signatur der Routine ist:
BufStatus CnvBuf(HDLD RawData, HDLD *ExtrData);Ich hab zwar Ahnung von PHP und mittlerweile auch ein wenig von Java, aber hier steig ich absolut nicht durch.
Was bedeutet dieses typedef, struct?
Wir haben noch nie ein Programm mit ANSI-C geschrieben, aber sollen schon sowas alles wissen...
Kann mir jemand paar Gedankenanstöße geben und/oder mir die gegebenen Codeschnipsel erklären?
Gruß
Julian
-
du hast einen c-kurs belegt im studium, und noch nie ein programm in einem semester geschrieben?
irgendwie seltsam.ich empfehle (trotz einiger kritiken hier daran
)
www.pronix.de, dort gibt es ein openbook für c.oder einfach mal in eine bibliothek deiner wahl, und eines leihen.
denn diese basics erklären macht keinen sinn:Was bedeutet dieses typedef, struct?
die lernst du am besten durch ein gutes anfängerbuch.
so long
-
Jul-ian schrieb:
Kann mir jemand paar Gedankenanstöße geben und/oder mir die gegebenen Codeschnipsel erklären?
das ganze schimpft sich "stack". guck mal im internet danach.
btw: namen wie 'HDLD' sind schlecht. es ist ein Buffer*-typ, aber das erkennt niemand. nenn es besser PBUFFER o.ä.
ausserdem, 'Top' sollte besser ein 'int' sein, sonst könnt's probleme geben mit der -1.else schrieb:
die lernst du am besten durch ein gutes anfängerbuch
und durch selber coden...
-
Naja, der Kurs ist "Digitaltechnik/Technische Informatik". Es fing mit Boolsche Algebra und sowas an. Danach haben wir mit VHDL kleinere Programme geschrieben (Motoransteuerungen etc.).
...und jetzt ist ANSI-C dran.
Der steigt da etwas heftig ein. 2 Vorlesungen zu dem Thema gab es jetzt vor dieser Pflichtübung -.- ...Soviel dazu.
Ich hab schon diverse eBooks gelesen, aber so wirklich weiß ich trotzdem nicht was der gute Mann von mir will
-
du sollst 4 funktionen schreiben.
üblich ist für einen stack:push, pop, read, und fragen, ob er leer ist.
du darüber hinaus eine init, die den stackzeiger von vornherein auf -1 setzt, dann zwei funktionen, die ein element auflegen, und ablegen, aber nur, solange der speicher nicht voll ist, und dann eine funktion, die was wandeln soll.
stell dir einen stapel mit tellern vor. du würdest sicher immer den obersten nehmen, und nicht den untersten. nach diesem prinzip verläuft lifo.
-
Kapitel4: Funktionen und Programmstruktur (The C Programming Language, zweite Ausgabe (ansi), Prentice Hall)
da wird ein stack gebaut, mit dem dann ein simpler taschenrechner geschrieben wird.
-
Hey Julian,
meld dich mal bei mir mit ICQ 178387274. Habe die gleichen Probleme... *lach* vielleicht kommen wir gemeinsam weiter.
Gruß Volker
-
ich mach mir gleich die muehe, euren dozenten rauszufinden
-
Hallo ihr, wäre echt super wenn jemand hier und ein Muster von der Lösung geben könnte. Er ist nicht der einzige mit dem Problem. Können die Hilfe gut gebrauchen
-
zu a:
Buffer *InitBuff (void) { Buffer *b = malloc(sizeof(Buffer)); b->Top = -1; return b; }
-
Also, Ich habe noch etwas rumgerätselt, bin aber noch kein Stück weiter gekommen.
Die Aufgabe hat sich ein wenig geändert, die einzelnen Teilaufgaben sind als Kommentare über die jeweilige Funktion eingefügt.Weiß noch jemand weiter? Ich steh mit beiden Füßen auf'm Schlauch.
Beim kompilieren bekomme ich - mal abgesehen von den Warnings - 2 Fehler die ich nicht gelöst bekomme:
Error E2040 D:\Studium\Digitaltechnik\pflichtuebung.c 27: Declaration terminated incorrectly in function InitBuf
Error E2110 D:\Studium\Digitaltechnik\pflichtuebung.c 28: Incompatible type conversion in function InitBufDer bisherige Quellcode:
/* Folgende Deklarationen und Definitionen für einen LIFO-Puffer (Last In, First Out, d.h. das zuletzt gespeicherte Element wird als erstes wieder herausgenommen) sind vorgegeben: */ #include <stdio.h> #include <stdlib.h> #define LEN 20 typedef unsigned char BYTE; typedef struct { BYTE Top; //Index Top-Element BYTE Data[LEN]; //Datenplatz } Buffer; typedef Buffer *HDLD; typedef enum { BufOK = 0, BufEmpty = 1, BufFull = 2 , BufError = 0xFF } BufStatus; /* Eine Initialisierungsroutine "InitBuf" soll Speicher für einen Datenpuffer des Typs Buffer anlegen1, die Verwaltungsvariable Top auf 0xFF setzen (Puffer leer) und als Ergebnis die Adresse des Datenpuffers zurückgeben. Die Signatur der Routine ist: HDLD InitBuf(); */ Buffer *InitBuf(void) { HDLD myBuffer = calloc(1,sizeof(Buffer)); //Datenpuffer wird angelegt Buffer->Top = 0xFF; //Verwaltungsvariable Top auf 0xFF gesetzt return *myBuffer; //Adresse des Datenpuffers zurückgeben } /* Eine Schreibroutine „PutElem“ soll prüfen, ob der Puffer noch Platz hat. Falls ja, soll sie ein Byte in den Puffer an die durch Top+1 bezeichnetes Stelle hereinschreiben und ein entsprechendes Resultat zurückgeben. Die Signatur ist: BufStatus PutElem(HDLD buf, BYTE d); */ BufStatus PutElem(HDLD buf, BYTE d) { } /* Eine Leseroutine „GetElem“ soll prüfen, ob der Puffer noch mind. ein Element enthält. Falls ja, soll sie das durch Top bezeichnete Element in die über Referenz übergebene Bytevariable hereinschreiben, Top dekrementieren und ein entsprechendes Resultat zurückgeben. Die Signatur der Routine ist: BufStatus GetElem(HDLD buf, BYTE *d); */ BufStatus GetElem(HDLD buf, BYTE *d) { } /* Eine Wandelroutine CnvBuf soll alle Elemente eines Puffers nacheinander lesen, die Bits 5..2 extrahieren und die darin enthaltenen Werte in einen neuen Puffer schreiben. Dabei sollen die Funktionen aus den vorigen Teilaufgaben verwendet werden. Die Signatur der Routine ist: BufStatus CnvBuf(HDLD RawData, HDLD *ExtrData); */ BufStatus CnvBuf(HDLD RawData, HDLD *ExtrData) { } /* Main-Methode */ int main( ) { }
-
Denke du willst
myBuffer->Top = 0xFF; //die Variable heisst nicht Buffer sondern myBuffer
Kurt