Machine wrote:
> Headerdatei:
>
>>>int* buf; // pointer to fifo-buffer
>
> umändern in
>
>>>char* buf
Ja.
Natürlich auch den malloc anpassen :-)
>
> Das mit der Funktion macht mir noch große Probleme.
> Wie könnte man jetzt einen String einlesen bzw. int?
>
>
1 | > //-------------------------------------------------------------------------
|
2 | > int CQUEUE::write_que_str(char* text)
|
3 | > {
|
4 | > int i;
|
5 | > i = (len + ri - wi - 1) % len; //i = space in buffer
|
6 | > if (i>0) //if enough space
|
Das kann natürlich nicht so bleiben.
Wenn i die Anzahl der noch freien Bytes im Speicher
angibt, dann passt der String logischerweise nur dann
in diesen Speicher, wenn für jedes Zeichen im String
(+ das obligate '\0' Zeichen) ein Byte frei ist.
Die Anzahl der Zeichen in einem String kriegt man
mit strlen(). Nach 1 dazu für das '\0' Zeichen.
Ergo
1 | int textLen = strlen(text) + 1;
|
2 | if( textLen < i ) // es ist genug Platz
|
>
1 | {
|
2 |
|
3 | > buf[wi] = value; //tranfer value
|
4 | >
|
Nachdem text ein String (also eine Abfolge von Zeichen) ist
wird das mit einer Zuweisung wohl nichts werden. (Man kann
Arrays nicht zuweisen. Bei dir würde es auch nichts bringen
wegen dem Wrap.
(Hab ich eigentlich schon mal erwähnt, dass man sich solche
Situationen aufzeichnen sollte ?)
1 | for( i = 0; i < textLen; ++i ) {
|
2 | buf[wi] = text[i]; // Ein Zeichen umkopieren
|
3 |
|
4 | wi = ( wi + 1 ) % len; // Und den Zielindex um 1
|
5 | // erhöhen. Dabei aber aufpassen
|
6 | // dass er beim Erreichen des Buffer-
|
7 | // endes bei 0 weitermachen muss.
|
8 | }
|
>
1 | wi = (wi + 1) % len; //increment write index
|
Das brauchts dann nicht mehr. wi ist schon innerhalb der Schleife
korrekt erhöht worden.
>
1 | return(1); //successfully transmitted one int
|
2 | > }
|
3 | > else
|
4 | > return(0);
|
5 | > }
|
6 | >
|
Ist doch nicht so schwer.
Nochmal: Mal dir einen Buffer auf. Mal dir einen String auf
und spiele am Papier durch, was zu passieren hat!
Das ist kein Scherz!