Buffer auslesen
-
Hallo, das unstenstehende Programm funktioniert soweit
nur sobald ich im main Programm scale_factor ein wert von über 127 übergib
bringt mir beim anschließenden auslesen des Buffers also ein falschen wert zurück!!!wie änder ich das Programm damit ich auch größere werte als 127 im Buffer speichern und auslesen kann???
Wictig ist ich will die werte unbedingt in einem Buffer speichern
vielen dank mal oli
#include <iostream> using namespace std; char *descBuffer(); int scale_factor(); int scale_factor(unsigned int n); char* Buffer; int main() { Buffer= new char[20]; memset(Buffer,'0',20); //OK scale_factor(222); //sobald hier ein wert von über 127 ist tut es nicht mehr!!! cout << "scale_factor: "<<scale_factor()<<endl; return 0; } char* descBuffer() { return Buffer; //OK } int scale_factor() { fprintf(stderr,"das les ich aus dem Buffer aus %d \n\n",(int)descBuffer()[3]); return (int)descBuffer()[3]; } //scale_factor write Method int scale_factor(unsigned int n) { fprintf(stderr,"das schreib ich in Buffer %d \n\n",n); memcpy(&descBuffer()[3],&n,4); return 0; }
/* Ausgabe bei scalefactor(222)
das schreib ich in Buffer 222
das les ich aus dem Buffer aus -34
scale_factor: -34
Ausgabe bei bei scale factor 114:
das schreib ich in Buffer 114
das les ich aus dem Buffer aus 114
scale_factor: 114
-
char geht nur von -127 bis +127.
222 - 127 = 95
-127 + 95 = -32
-
ja ok aber wie änder ich das programm jetzt dass es auch für integer also größere werte funktioniert???
-
the_alien schrieb:
char geht nur von -127 bis +127.
Wie der Wertebereich von char aussieht, hängt von der Implementation ab. Und wenn, dann ginge der von -128 bis 127.
@oli23
Wenn du schon C++ schreibst, wieso verwendest du dann nicht die Ein-/Ausgabe Streams? Dann wären auch nicht solche Typinkonsistenzen passiert.fprintf(stderr,"das schreib ich in Buffer %d \n\n",n);
n ist unsigned, also muss das Format %u beinhalten.
memcpy(&descBuffer()[3],&n,4);
Warum so umständlich? Und so falsch? Dir ist schon klar, dass gleich 4 Zeichen in Buffer überschrieben werden?
Vielleicht wolltest du eher sowas?
descBuffer()[3] = int(n);
btw:
Du hast ein astreines Speicherleck.
-
Wenn du schon C++ schreibst, wieso verwendest du dann nicht die Ein-/Ausgabe Streams? Dann wären auch nicht solche Typinkonsistenzen passiert.
ok hab ich geändert
memcpy(&descBuffer()[3],&n,4);
Warum so umständlich? Und so falsch? Dir ist schon klar, dass gleich 4 Zeichen in Buffer überschrieben werden?
nein ich wollte nur die Adresse von n in des Buffer kopieren und gleich 4 zeichen weil doch int 4 Byte hat....
habs aber so geändert wie du vorgeschlagen hast....
Hab aber immernoch dasselbe Problem bei zahlen über 127 bekomm ich falsche werte zurück
des neuen code nochmal
#include <iostream> using namespace std; char *descBuffer(); int scale_factor(); int scale_factor(unsigned int n); char* Buffer; int main() { Buffer= new char[20]; memset(Buffer,'0',20); //OK scale_factor(222); //sobald hier ein wert von ueber 127 ist tut es nicht mehr!!! cout << "scale_factor: "<<scale_factor()<<endl; return 0; } char* descBuffer() { return Buffer; //OK } int scale_factor() { cout <<"das les ich aus dem Buffer aus "<< (int)descBuffer()[3]<<endl; return (int)descBuffer()[3]; } //scale_factor write Method int scale_factor(unsigned int n) { cout<< "das schreib ich in den Buffer "<<n<<endl; descBuffer()[3] = int(n); //memcpy(&descBuffer()[3],&n,4); return 0; }
-
oli 23 schrieb:
habs aber so geändert wie du vorgeschlagen hast....
Hab aber immernoch dasselbe Problem bei zahlen über 127 bekomm ich falsche werte zurück
Dann solltest du deine Vorgehensweise nochmal überdenken.
int scale_factor(unsigned int n)
nimmt als Parameter nunmal einen unsigned int Wert
int scale_factor()
gibt aber einen (signed) int Wert zurück. Das passt nicht zusammen.
-
oli 23 schrieb:
nein ich wollte nur die Adresse von n in des Buffer kopieren und gleich 4 zeichen weil doch int 4 Byte hat....
Ja, aber char hat nur 1 Byte, nicht 4.
Wenn du schon Integer speicherst, warum machst du dann kein Integer Array?@groovemaster:
Aber die Rechnung passte so schön mit seiner Ausgabe zusammen, dass ich gedacht habe ich hätte das falsch im Kopf gehabt