probleme bei typwandlung/parameterübergabe
-
ich habe folgendes problem: ich hänge mit append mehrere strings aneinander. diesen wert muss ich dann allerdings als char-array an eine methode übergeben. wie geht das?
// ************Funktion zur Berechnung einer 16bit CRC-Prüfsumme ******************** int checkSum(char block[]) { int crc=0xFFFF; for (unsigned int x=0; x<strlen(block);x++) { crc=crc^(int)block[x]; for(int y=0; y<8; y++) { if((crc & 0x0001) == 0x0001) { crc=((crc >> 1) ^ 0xA001); }else{ crc=crc >>1; } } } return crc; } void main(){ using namespace std; string zusammen; zusammen.append("12"); zusammen.append("34"); zusammen.append("56"); zusammen.append("78"); std::cout<<"zusammen: "<<zusammen<<endl; //zusammen.c_str(); --> geht das?? gibt einen Pointer auf ein char array mit dem Inhalt von "zusammen" aus // | // | hier liegt das Problem: checkSum muss ein char-array übergeben werden. // | // | // V int crc=checkSum(zusammen); }
wäre euch seeehr dankbar wenn ihr mir weiterhelfen könntet... ich denke das ist an sich kein großes problem, wenn man aber einfach nicht genug erfahrung hat und nicht draufkommt, dann ist es das schon
danke!
-
Nicht ganz so, mach einfach
int crc = checkSum(zusammen.c_str());
edit: Allerdings gibt std::string::c_str() ein const char* zurück, dh. Du musst Deine Spezifikation uU leicht ändern...
-
so hab ichs auch schon versucht, aber wie gesagt passen da die typen nicht zusammen... ich weiß nicht wie ich das hinbekomme... die übergabe eines char-arrays an die crc-methode muss jedenfalls so bleiben... das muss doch irgendwie gehen...
-
Warum muss checkSum unbedingt ein char-Array bekommen? std::string geht doch genausogut.
Aber da du das Array nicht veränderst, setz doch ein const davor.
Dann klappt das auch mitint crc = checkSum(zusammen.c_str());
-
moon schrieb:
ich habe folgendes problem: ich hänge mit append mehrere strings aneinander. diesen wert muss ich dann allerdings als char-array an eine methode übergeben. wie geht das?
// ************Funktion zur Berechnung einer 16bit CRC-Prüfsumme ******************** int checkSum(char block[]) { int crc=0xFFFF; for (unsigned int x=0; x<strlen(block);x++) { crc=crc^(int)block[x]; for(int y=0; y<8; y++) { if((crc & 0x0001) == 0x0001) { crc=((crc >> 1) ^ 0xA001); }else{ crc=crc >>1; } } } return crc; } void main(){ using namespace std; string zusammen; zusammen.append("12"); zusammen.append("34"); zusammen.append("56"); zusammen.append("78"); std::cout<<"zusammen: "<<zusammen<<endl; //zusammen.c_str(); --> geht das?? gibt einen Pointer auf ein char array mit dem Inhalt von "zusammen" aus // | // | hier liegt das Problem: checkSum muss ein char-array übergeben werden. // | // | // V int crc=checkSum(zusammen); }
wäre euch seeehr dankbar wenn ihr mir weiterhelfen könntet... ich denke das ist an sich kein großes problem, wenn man aber einfach nicht genug erfahrung hat und nicht draufkommt, dann ist es das schon
danke!Noch ein paar Fragen. Warum berechnest du in jedem Schleifendurchlauf die Länge des C-String neu? Findest du das incht gerade bei dieser engen Schleife etwas performancehinderlich? Und warum sollte deine Funktion nicht mit einem const std::string& funktionieren?
-
ich bin für alle verbesserungen offen
kannst du mir den code so verändern, dass er läuft? wie geht das mit const std::string&??
-
#include <string> using namespace std; // Funktion zur Berechnung einer 16bit CRC-Prüfsumme int checkSum(const string& block) { int crc=0xFFFF; string::sizetype laenge = block.size(); for (string::sizetype x=0; x < laenge; ++x) { crc=crc^(int)block[x]; for(int y=0; y < 8; ++y) { if((crc & 0x0001) == 0x0001) { crc=((crc >> 1) ^ 0xA001); } else { crc=crc >>1; } } } return crc; } int main(){ using namespace std; string zusammen; zusammen.append("12"); zusammen.append("34"); zusammen.append("56"); zusammen.append("78"); std::cout<<"zusammen: "<<zusammen<<endl; int crc=checkSum(zusammen); }
-
Ich verändere noch ein bisschen:
#include <string> #include <iostream> using namespace std; int checkSum(const string& block); int main() { string zusammen; zusammen.append("12"); zusammen.append("34"); zusammen.append("56"); zusammen.append("78"); std::cout << "zusammen: " << zusammen << endl; int crc = checkSum(zusammen); std::cout << crc; } int checkSum(const string& block) { int crc=0xFFFF; string::size_type blockSize = block.size(); for (string::size_type x = 0; x < blockSize; ++x) { crc ^= static_cast<int>(block[x]); for(int y = 0; y < 8; ++y) { if((crc & 0x0001) == 0x0001) crc = ((crc >> 1) ^ 0xA001); else crc = crc >> 1; } } return crc; }