Daten im char anhängen -> speicherfehler

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
Hazu
Beiträge: 12
Registriert: 7. Februar 2011 10:56

Daten im char anhängen -> speicherfehler

Beitrag von Hazu »

Hi liebes Forum...

Ich habe ein kleines Problemchen mit meinem QT Programm, glaube aber, dass es an meinen mangelnden c++ Kenntnissen liegt in diesem Fall.

Grundproblem:
ich will Daten über einen TCP-Socket an einen Server übertragen. Dafür nehme ich die Funktion write().
Da meine Daten aber durch eine Oberfläche sehr variabel sein sollen, will ich da einen string mit varibaler länge und daten übertragen...

im moment versuche ich das ganze so:

Code: Alles auswählen

void Client::Telegrammaufbau(unsigned int ID, unsigned int data)
{
	char str[80];
	switch(ID)
	{
		case 1: 
		{
		strcpy(str, "3200");
		strcat(str, (char*)data);
		tcpSocket->write(str);		
		break;
		}
die ID identifiziert den Button, der gedrückt wurde, somit weiß die funktion telegrammaufbau, welche "feststehenden" daten (in diesem fall die "3200") er mit übertragen soll. jetzt soll da allerdings die 1, die in der variable data geschrieben ist, angehängt werden und danach alles zusammen übertragen werden...

allerdings bekomme ich jetzt, wenn ich die oberfläche starte und den button drücke einen Speicheradressierungsfehler... halt dieses nichtssagende typische popup-fenster.
problem scheint die zeile strcat(str, (char*)data); zu sein...
meine Frage, was habe ich falsch gemacht bzw hat jemand eine Lösung für mein problem oder eine Idee, wie ich es anders, schöner, besser, wie auch immer lösen kann :)

Lg, Hazu und danke für jede Hilfe
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Daten im char anhängen -> speicherfehler

Beitrag von Christian81 »

strcpy möchte, wie Du schon mitbekommen hast einen String welcher 0-terminiert ist. Ein Integer ist dies in den meisten Fällen nicht... was Du suchst ist (s)printf
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Hazu
Beiträge: 12
Registriert: 7. Februar 2011 10:56

Re: Daten im char anhängen -> speicherfehler

Beitrag von Hazu »

hm... danke für die schnelle Antwort.
Jetzt habe ich das Strcpy und das strcat in ein sprintf umgewandelt, aber der speicherfehler bleibt...

Code: Alles auswählen

void Client::Telegrammaufbau(unsigned int ID, unsigned int data)
{
	char str[80];
	switch(ID)
	{
		case 1: 
		{
		sprintf(str, "3200");
		sprintf(str, (char*)data);
		tcpSocket->write(str);		
		break;
		}
:(
eigentlich will ich ja nur, dass das 3200 in str geschrieben wird und dann noch der variable wert von data angehängt wird... danach halt alles zusammen übertragen...
fällt jemanden vielleicht eine andere lösung ein, wie das zu machen ist?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Daten im char anhängen -> speicherfehler

Beitrag von franzf »

Weißt du denn, was der cast von unsigned int nach char* macht? Welcher C++-Cast wäre das? (static_cast, dynamic_cast, reinterpret_cast).

Wenn du gar nicht weißt, was da bei dir abläuft, weiche auf das bequemere write (const QByteArray) aus. QByteArray kennt append und Umwandlungen von Zahlen in Zeichenketten.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Daten im char anhängen -> speicherfehler

Beitrag von Christian81 »

Nein - aber da ist selbst C++ Grundlagen das falsche Forum... wer glaubt ohne auch nur ein einziges Mal in ein C-Buch geschaut zu haben ... naja
'man snprintf' bzw. sich einfach mal informieren was snprintf macht und wie man es benutzt sollte man schon von allein können :roll:
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
honda71
Beiträge: 49
Registriert: 12. Juli 2006 16:16

Re: Daten im char anhängen -> speicherfehler

Beitrag von honda71 »

Die Frage liegt schon ein paar Tage zurück, aber bei den bisherigen Antworten wundert es
mich nicht, dass Hazu nix mehr geschrieben hat.

@franzf && Christian81: Könnte man das nicht einen Anfänger einfach schnell erklären??

Ich kann mich noch gut an meine Anfänge mit C erinnern. Learning by Doing war da die Divise!
Bei meinen Auszubildenden hilft auch kein Theoretisieren, sondern zeigen wie das Ergebnis
aussieht und dann den Weg noch mal nachvollziehen lassen.

Also Hazu: ein möglicher Weg (und ich halte mich mal eng an Deinen Quellcode, denn es
ginge mit den Qt-Klassen deutlich einfacher):

sprintf(str,"3200%d",data); // den Zahlenwert von data an 3200 anhängen...
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Daten im char anhängen -> speicherfehler

Beitrag von franzf »

Man könnte natürlich immer alles und jedem erklären, so dass keine Fragen offen bleiben.
Karmapunkte++, Lerneffekt? K.A., liegt daran ob der OP an den Hintergründen interessiert ist oder eben nur eine funktionierende Lösung haben will. Schlimmstenfalls lernt er nur, dass man auf jede Frage gleich funktionierenden Code bekommt :/

Meine Frage betreffend dem cast sollte ihn anregen, mal nachzuschauen was es sein könnte, evtl. überhaupt mal mit der Problematik konfrontiert zu werden, und zu erkennen dass er eigentlich gar keinen cast will! Zur Info: es ist ein reinterpret_cast.
Die Verwendung mit QByteArray kann man sich wunderbar aus der Doku zusammenpflücken. Wenn man mit der Doku nicht zurecht kommt, ist das kein Grund sich alles im Forum erklären zu lassen.

Wie das jetzt auf den OP zutrifft - k.A. Ob er sich nur wg. den Antworten nicht mehr meldet ist auch fraglich, vielleicht hat er ja selber eine Lösung gefunden :)
honda71
Beiträge: 49
Registriert: 12. Juli 2006 16:16

Re: Daten im char anhängen -> speicherfehler

Beitrag von honda71 »

franzf hat geschrieben:Man könnte natürlich immer alles und jedem erklären, so dass keine Fragen offen bleiben.
Karmapunkte++, Lerneffekt? K.A., liegt daran ob der OP an den Hintergründen interessiert ist oder eben nur eine funktionierende Lösung haben will. Schlimmstenfalls lernt er nur, dass man auf jede Frage gleich funktionierenden Code bekommt :/

Meine Frage betreffend dem cast sollte ihn anregen, mal nachzuschauen was es sein könnte, evtl. überhaupt mal mit der Problematik konfrontiert zu werden, und zu erkennen dass er eigentlich gar keinen cast will! Zur Info: es ist ein reinterpret_cast.
Die Verwendung mit QByteArray kann man sich wunderbar aus der Doku zusammenpflücken. Wenn man mit der Doku nicht zurecht kommt, ist das kein Grund sich alles im Forum erklären zu lassen.

Wie das jetzt auf den OP zutrifft - k.A. Ob er sich nur wg. den Antworten nicht mehr meldet ist auch fraglich, vielleicht hat er ja selber eine Lösung gefunden :)
Danke für die ausführliche Antwort.

Meiner Meinung nach kann der TO (Threat-Opener) nichts mit cast anfangen, da er sich noch auf
einem anderen Level des Lernens befindet (was ja nicht schlimm ist!).
Der indirekte Hinweis auf die Problematik ist daher nun wirklich auch schwer zu erkennen: Er
wollte ja nicht casten sondern den Wert der int-Variable an den String hängen.

Dass man auch bei solchen "läppischen" Fragen :lol: auch mal bequemen könnte eine schnelle
einfache Antwort zu geben, sollte - in meinen Augen - doch der Sinn dieses Forums sein, oder irre
ich mich da? Karma hin oder her: mit dem kleinen printf bricht niemand ein Zacken aus der Krone.

Der TO hat die Frage gut formuliert und sich alle Mühe gemacht sein Anliegen zu verdeutlichen. Ihm
seine fehlenden Kenntnisse unter die Nase zu reiben und dann auch noch "im Regen stehen zu
lassen" ist doch eigentlich nicht fair.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Daten im char anhängen -> speicherfehler

Beitrag von franzf »

OP == Original Poster ;)
Früher waren meine Antworten in Foren auch länger, ausführlich, mit Code samt main(). Sowas kostet Zeit. Meistens tauchen dann weitere Fragen auf, die ebenso beantwortet werden wollen. Am Ende hatte ich immer einen vollen Posteingang, weil die Fragen lieber privat als öffentlich gestellt wurden.
Das schlimmste: Die Fragen wurden nicht besser :/

Ich versuch halt, die Leute anzuschubsen. Wenn jemand wirklich Interesse am Programmieren hat, wird er mit so einem Stubs (cast wtf?; Doku -> QByteArray; man sprintf; ...) ein wenig Zeit ins Lesen investieren (die Zeit, die WIR sonst hergeben müssen, um es ihm zu erklären), und sich dann in Zukunft selbständig Informationen aneignen. Oder er wird es einfach irgendwann bleiben lassen (für beide Seiten die nervenschonendste Lösung). Nur wer auf seinen eigenen Beinen stehen kann, kann das Laufen lernen. Beim Programmieren heißt es halt "wer sich selber Wissen aneignen kann" - und dazu gehört Doku finden, lesen und verstehen. Und speziell bei so "leichten" Themen wie diesem hier sollte es eine gute Übung sein.

Aber das ist halt meine eigene Auffassung. Wenn sich Leute finden, die immer gleich ne komplette Lösung parat haben, ist das schön und in Ordnung.
unusual
Beiträge: 9
Registriert: 7. Juli 2010 13:33

Re: Daten im char anhängen -> speicherfehler

Beitrag von unusual »

Hallo,
wenn ein Integer über einen Tcp-Socket versendet wird, dann ist das ein binäres Protokoll. Dies sollte nicht mit "write" gesendet werden, sondern mit "writeData" wobei auch die Länge mitgegeben wird. Will man ausgesprochenerweise ein Text-Protokoll, sollte man den Integer in einen String wandeln. QByteArray::number() wandelt einen Integer beispielsweise in QByteArray, der lässt dann auch mit write in den TcpSocket schreiben.
Die Intuition des eingänglichen Programmkodes war allerding wohl eine andere - da wird wohl der Integer als Pointer verwendet - hmmm....
besser:

Code: Alles auswählen

void Client::Telegrammaufbau( unsigned int ID, void data, int length )
{
   QByteArray ba( (const char *)data, length );

   switch(ID)
   {
      case 1: 
      {
         tcpSocket->write( "3200" );      
         tcpSocket->write( ba );      
      }
      break;
...
}
...als unspezifischer Zeiger, macht sich void* besser (auch nich schön -> trotzdem). Wenn die Daten 0-terminierte Strings sind, dann sollte data auch als const char* definiert sein.
Antworten