Du wertest den Rückgabewer von malloc nicht aus, daher ist nicht sicher,
daß auch nur der erste Aufruf geklappt hat. Deine Schreibzugriffe auf
output_string_ptr können also irgendwo im Speicher herumschreiben mit
welchen Folgen auch immer.
Was soll das hier?
1
start_of_output_string_ptr=output_string_ptr;
2
output_string_ptr=start_of_output_string_ptr;
Im übrigen forderst Du Platz für 7 Bytes an, schreibst aber 8.
Was ist der zweite Parameter von send_frame? Hoffentlich nicht die
Puffergröße.
Meinst Du außerdem, daß es sinnvoll ist, für einen Puffer von gerade
mal 7 (naja, eigentlich 8) Bytes Länge auf dynamische Speicherverwaltung
zu setzen?
Hallo,
>Was soll das hier?> start_of_output_string_ptr = output_string_ptr;> output_string_ptr = start_of_output_string_ptr;
Das ist das Fragment einer früheren Version, das ich wohl übersehen
habe.
>Im übrigen forderst Du Platz für 7 Bytes an, schreibst aber 8.
Hoppla.
>Was ist der zweite Parameter von send_frame? Hoffentlich nicht die>Puffergröße.
Nein, das ist eine von zwei Headervarianten, die es im speziellen
Protokoll des LCDs gibt.
Gruß,
Harald
>> muß ich dann hier nicht noch die Anzahl der Array-Elemente mitübergeben?>
an wen?
Die Funktion macht nichts anderes als deine gepostete Version.
Nur ist sie einfacher, kürzer, (wahrscheinlich schneller),
hat keinen Array Overflow Bug und auch malloc kann dir nicht
in die Quere kommen.
Wenn deine ursprüngliche Version ausser dem malloc Problem,
noch ein anderes logisches Problem hatte, dann hat sie diese
Version auch. Aber das kann ich von hier aus nicht beurteilen
(ZB. kommt mir das komisch vor, dass die Koordinaten nur ein
char sind. Aber das musst du wissen).
Ich glaube ich hab jetzt eine Ahnung was dir Kopfzerbrechen macht.
Die Funktion send_frame möchte als erstes Argument einen Pointer
haben. Buffer ist aber ein Array
Lektion 5 oder 6 in der C Programmierung für Anfänger:
Arrays werden in C immer an Funktionen übergeben, indem die
Startadresse des Arrays übergeben wird.
Hier:
send_frame( Buffer, 0x11 );
wird tatsächlich die Startadresse des Arrays (in Form eines
Pointers) übergeben.
Luther Blissett wrote:
> Man würde es idR. wohl so machen:
Yep. Das sind dann schon die Luxusversionen.
Wobei: Alle 3 Versionen schlagen mit einer identischen
Code-Größe zu Buche. Lediglich der Schreibaufwand ist geringer.
Trotzdem kommt mir das immer noch seltsam vor.
Für X1, y1, x2, y2 würde ich mal auf Koordinaten tippen.
Und 0 soll ja unter den Koordinaten nicht so unüblich selten
sein. Ich frage mich wie das dann funktionieren soll.
Aber ev. gehen die Koordinaten ja auchnur von 0 bis 9 und
werden als die entsprechenden ASCII Code gesendet, oder
es wird zur Zahl ein entsprechender Offset (ausserhalb
der Funktion) addiert oder ...
Möglich ist es, dass das so richtig ist. Aber seltsam ist
es doch.
Es gibt nur 2 Gründe, um malloc zu benutzen.
1. Die Puffergröße ist zur Compilezeit unbekannt.
Dann sollte man aber erstmal prüfen, ob man den Puffer nicht mit der zu
erwartenden Maximalgröße anlegt.
Denn malloc kann auch nicht mehr herzaubern, als verfügbar ist.
2. Der Puffer muß über den Erzeuger hinaus bestehen.
Dann sollte man aber erstmal prüfen, ob man nicht eine Oberfunktion
definiert, die nur den Puffer anlegt und erst nach dem Nutzer
terminiert.
Bzw. ob es überhaupt was bringt, den Puffer vor Ende des Main
freizugeben.
Peter