# char zusammenfügen



## seru (22. Juni 2010)

Ich habe eine Frage zu folgenden Code: 

char hlf;
char m_sBufRes[98];		

hlf = m_sBufRes[27]+m_sBufRes[28]+m_sBufRes[29]+m_sBufRes[30];


in m_sBufRes[27] steht 0
in m_sBufRes[27] steht 3
in m_sBufRes[27] steht 4
in m_sBufRes[27] steht 1

Steht nun in hlf 0341?
Wenn ja wie kann ich diese Char Variable in eine Float Variable umwandenln


----------



## youza (22. Juni 2010)

Schau dir des mal an: 
http://www.c-plusplus.de/forum/viewtopic-var-t-is-39488.html


----------



## deepthroat (22. Juni 2010)

seru hat gesagt.:


> Ich habe eine Frage zu folgenden Code:
> 
> char hlf;
> char m_sBufRes[98];
> ...


Nein, in hlf steht '0' + '3' + '4' + '1' = 48 + 51 + 52 + 49 = 200 (vgl. ASCII Tabelle).


seru hat gesagt.:


> Wenn ja wie kann ich diese Char Variable in eine Float Variable umwandenln


Du könntest sscanf verwenden.

Gruß


----------



## seru (22. Juni 2010)

Danke für den Link hilft mir jedoch nicht weiter. Ich schreibe die Daten in den Buffer:  m_sBufRes über die serielle Schnittstelle. Dann möchte ich nur  die Arrayfelder 27,28,29,30 zusammenfügen und in eine float Variable schreiben


----------



## MCoder (22. Juni 2010)

Du kannst den ganzen Block in eine float-Variable kopieren:

```
float fValue;
memcpy(&fValue, m_sBufRes + 28, sizeof(float));
```
Gruß
MCoder


----------



## seru (22. Juni 2010)

Ok danke das hilft mir schon mal weiter nur mein Problem wie ich die einzelen Array Felder zusammenfüge ist immer noch nicht gelöst. 
Frage noch zu deinem Code 
cpp Code:  

float fValue;
memcpy(&fValue, m_sBufRes + 28, sizeof(float)); 

was macht das m_sBufRes +28

Habe noch eine weitere Frage: 

Wie kann ich folgenden ASCII Code am Einfachsten in ein char schreiben?+

ASCII Code: 1001 0000000000  

Die Rechtecke stehen für STX und ETX Start up Text und End up Text


----------



## MCoder (22. Juni 2010)

seru hat gesagt.:


> was macht das m_sBufRes +28


Das ist ein Zeiger auf m_sBufRes[27]; die Speicherstelle, an der die 4 Bytes beginnen, die den  float-Wert bilden.



			
				seru hat gesagt.:
			
		

> Wie kann ich folgenden ASCII Code am Einfachsten in ein char schreiben?+
> ASCII Code: 1001 0000 000000


Was ist "1001 0000 000000", eine binäre Zahl?

Gruß
MCoder


----------



## sheel (22. Juni 2010)

Sollte es dann nicht +27 sein?


----------



## MCoder (22. Juni 2010)

Natürlich +27


----------



## seru (22. Juni 2010)

1001!0000000000¡ das ist ein ASCII Code den ich gerne in ein Char Array schreiben würde. Sprich jedes Zeichen steht für 1byte. Wobei die Dreiecke STX und ETX sind.
Alles was ich bis jetzt versucht habe hat nicht funktioniert


----------



## brunlorenz (22. Juni 2010)

Du kannst keine binäre Zahlen direkt in ASCII schreiben, doch hier die Funktion:

```
char bintoascii(char bin[])
{
int z=0;
char ascii;
for(z=0;z<strlen(bin))
{
if(bin[z]=='1') ascii+=(int) pow( (double) z,(double) 2);
}
return ascii;
}
```
Damit kannst du immer ein Zeichen in ein char umwandeln 
Grüsse,
Lorenz


----------



## MCoder (22. Juni 2010)

seru hat gesagt.:


> 1001!0000000000¡ das ist ein ASCII Code den ich gerne in ein Char Array schreiben würde. Sprich jedes Zeichen steht für 1byte. Wobei die Dreiecke STX und ETX sind.
> Alles was ich bis jetzt versucht habe hat nicht funktioniert




```
char buffer[] = { 2 /*STX*/, '1', '0', '0', '1', '!', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 3 /*ETX*/ };
```
Gruß
MCoder


----------



## seru (22. Juni 2010)

He danke 
bin bis jetz immer an ETX und STX gescheitert 
danke vielmals

Leider zufrüh gefreut bekomme folgende Error's:

error C2059: Syntaxfehler : '{'
error C2334: Unerwartete(s) Token vor '{'; sichtbarer Funktionsrumpf wird übersprungen

Hilfe bitte


----------



## ComFreek (22. Juni 2010)

Poste mal deinen Code!


----------



## MCoder (22. Juni 2010)

Hmm, bei mir funktioniert die Zeile


----------



## ComFreek (22. Juni 2010)

Also ich habe die Zeile gerade getestet unter Code::Blocks mit MinGW. Sie funktioniert.
Aber die zwei Zahlen am Anfang und am Ende kommen mir komisch vor. Wieso sind sie nicht in ' ' ?

@seru: Welchen Compiler benutzt du?


----------



## MCoder (22. Juni 2010)

ComFreek hat gesagt.:


> Aber die zwei Zahlen am Anfang und am Ende kommen mir komisch vor. Wieso sind sie nicht in ' ' ?


Das sind die Codes für STX (0x02) und ETX (0x03).

Gruß
MCoder


----------



## seru (23. Juni 2010)

code: 	char buffer[] = { 2 /*STX*/, '1', '0', '0', '1', ' ', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',' ', 3 /*ETX*/ }; 

Ich verwende Visual Studio 6.0


----------



## Cromon (23. Juni 2010)

Warum um alles in der Welt verwendest du eine 12 Jahre alte Entwicklungsumgebung?


----------



## MCoder (23. Juni 2010)

Hallo seru,

die Zeile kompiliert bei mir auch unter VC++ 6.0 fehlerfrei. Wenn Fehler auftreten, liegt deren Ursache im vorherigem Code.

Gruß
MCoder


----------



## seru (23. Juni 2010)

Darum gehts jetzt nicht das hat schon seine Gründe!! 
Kann mir jetzt jemand bitte bei diesem Problem helfen!
Ich müsste einfach nur eine Reihe von ASCII Zeichen in ein Array speichern!
Das ist eigentlich ganz einfach aber bei mir funktioniert nix! 

Kann das was damit zutun haben, dass mein Projekt eine MFC Anwendung ist und ich dieses Array im .h file definiere


----------



## Cromon (23. Juni 2010)

seru hat gesagt.:


> [...]das hat schon seine Gründe!!



Die da wären?



seru hat gesagt.:


> Kann mir jetzt jemand bitte bei diesem Problem helfen!
> Ich müsste einfach nur eine Reihe von ASCII Zeichen in ein Array speichern!
> Das ist eigentlich ganz einfach aber bei mir funktioniert nix!



Wie du oben siehst lässt sich der Code einwandfrei compilieren. Poste halt mal ein bisschen Zusammenhang.


----------



## seru (23. Juni 2010)

Meine Gründe sind dass diese Entwicklungsumgebung mir vorgegeben wurde!!
Zusammenhänge habe ich scho zuvor erwähnt. Es geht darum eine Reihe von ASCII Zeichen über die serielle Schnittstelle zu übertragen und 
weiter Zeichen von der seriellen zu Empfangen. Die Zeichen müssen in ASCII Code gesendet werden, da ansonst die Anwendung die auf der seriellen Schnittstelle hängt die Zeichen nicht erkennt. 
Das ganze Projekt ist eine MFC Anwendung. Nämlich wird beim kompelieren ein Active X Steuerelement (.ocx) erstellt !!


----------



## Cromon (23. Juni 2010)

Was du machen willst ist mittlerweile klar. Mit Zusammenhang war eher Codezusammenhang gemeint, denn wie erwähnt, der gepostete Code erzeugt keine Fehler.


----------



## seru (23. Juni 2010)

der gesamte Code meines .h files

#if !defined(AFX_OEBBSTEUERELEMENTCTL_H__5FEFA690_FF48_4895_A689_4AE94967D0FD__INCLUDED_)
#define AFX_OEBBSTEUERELEMENTCTL_H__5FEFA690_FF48_4895_A689_4AE94967D0FD__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

// OEBBSteuerelementCtl.h: Deklaration der COEBBSteuerelementCtrl-ActiveX-Steuerelementeklasse.

/////////////////////////////////////////////////////////////////////////////
// COEBBSteuerelementCtrl: Siehe OEBBSteuerelementCtl.cpp für Implementierung.

class COEBBSteuerelementCtrl : public COleControl
{
	DECLARE_DYNCREATE(COEBBSteuerelementCtrl)

// Konstruktor
public:
	COEBBSteuerelementCtrl();

// Überladungen
	// Vom Klassenassistenten generierte Überladungen virtueller Funktionen
	//{{AFX_VIRTUAL(COEBBSteuerelementCtrl)
	public:
	virtual void OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid);
	virtual void DoPropExchange(CPropExchange* pPX);
	virtual void OnResetState();
	//}}AFX_VIRTUAL

// Implementierung
protected:
	~COEBBSteuerelementCtrl();


	DECLARE_OLECREATE_EX(COEBBSteuerelementCtrl)    // Klassenerzeugung und GUID
	DECLARE_OLETYPELIB(COEBBSteuerelementCtrl)      // GetTypeInfo
	DECLARE_PROPPAGEIDS(COEBBSteuerelementCtrl)     // Eigenschaftenseiten-IDs
	DECLARE_OLECTLTYPE(COEBBSteuerelementCtrl)		// Typname und versch. Status

// Nachrichtenzuordnungstabellen
	//{{AFX_MSG(COEBBSteuerelementCtrl)
		// HINWEIS - Der Klassen-Assistent fügt Member-Funktionen hier ein und entfernt diese.
		//    Innerhalb dieser generierten Quelltextabschnitte NICHTS VERÄNDERN!
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()

// Dispatch-Tabellen
	//{{AFX_DISPATCH(COEBBSteuerelementCtrl)
	afx_msg short ClockWatchdog();
	afx_msg float MeasureSYSTmp();

	//}}AFX_DISPATCH
	DECLARE_DISPATCH_MAP()
// Ereignistabellen
	//{{AFX_EVENT(COEBBSteuerelementCtrl)
		// HINWEIS - Der Klassen-Assistent fügt Member-Funktionen hier ein und entfernt diese.
		//    Innerhalb dieser generierten Quelltextabschnitte NICHTS VERÄNDERN!
	//}}AFX_EVENT
	DECLARE_EVENT_MAP()

// Dispatch- und Ereignis-IDs
public:
	enum {
	//{{AFX_DISP_ID(COEBBSteuerelementCtrl)
		dispidClockWatchdog = 1L,
	//}}AFX_DISP_ID
	};

private:
	short InitWatchDog(short Triggertime,short OffTime,short StartTrigger);
	short COMport(char *m_sBuffer);
	float GetSYSTmp();
	short SetWdgTime(short WdgTime);
	short m_nMinute;
	short m_nTimer;
	short m_nTimeout;
	char buffer[] = { 2 /*STX*/, '1', '0', '0', '1', ' ', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',' ', 3 /*ETX*/ }; 
	char m_sBufRes[96];
	int m_nAnzahl;
	float m_nTemp;
	short m_nWdgT1;
	short m_nWdgT2;
	Tserial *com;

};

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ fügt unmittelbar vor der vorhergehenden Zeile zusätzliche Deklarationen ein.

#endif // !defined(AFX_OEBBSTEUERELEMENTCTL_H__5FEFA690_FF48_4895_A689_4AE94967D0FD__INCLUDED)


----------



## Cromon (23. Juni 2010)

Nur statische Member einer Klasse können direkt initialisiert werden. Definiere buffer statisch und in der .CPP Datei wird die Variable dann initialisiert.


----------



## seru (23. Juni 2010)

Was meinst du mit statisch mit "static" oder außerhalb der Klasse bitte Codebsp. !


----------



## Cromon (23. Juni 2010)

Die Begriffe static und "ausserhalb der Klasse" sind nicht exklusiv, du kannst auch ausserhalb der Klasse die statische Speicherklasse angeben. Aber ja ich meine einfach ganz normal als statischen Member der Klasse.


----------



## seru (23. Juni 2010)

Ich hab's jetzt mit 'static' versucht => bekomme die selben beiden Fehler wie vorher
Code: 	static char buffer[] = { 2 /*STX*/, '1', '0', '0', '1', ' ', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',' ', 3 /*ETX*/ };


----------



## Cromon (23. Juni 2010)

Ich zitiere mich hier mal einfach selber 



Cromon hat gesagt.:


> Definiere buffer statisch und in der .CPP Datei wird die Variable dann initialisiert.



Ist das das erste Mal dass du static verwendest?


----------



## seru (23. Juni 2010)

Ja eigentlich schon hab ansonsten nicht viel mit Statischen Dingen am Hut.
Für meine Anwendung wäre mir eine dynamische Lösung eh lieber aber die statische ist für den Anfang einfacher. 
Kannst du mir jetzt bitte anhand eines Codes erklären wie du das gemeint hast bitte


----------



## Cromon (23. Juni 2010)

statisch bezieht sich lediglich auf die Speicherklasse und nicht auf dein Programm 


```
class Foo
{
public:
        static int bar;
};

// in einer .CPP-Datei im globalen Gültigkeitsbereich:
int Foo::bar = 0;
```


----------



## seru (23. Juni 2010)

Ok das hab ich verstanden, nur wenn ich vorher meine 
static char buffer[] = { 2 /*STX*/, '1', '0', '0', '1', ' ', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',' ', 3 /*ETX*/ }; 
im headerfile .h definiere aber dann im .cpp wieder auf 0 setze hab ich ja meinen gewünschte Zeichenfolge wieder nicht im array buffer stehen


----------



## Cromon (23. Juni 2010)

Wie bereits 2 Mal erwähnt: Du initialisierst nicht im Header, du initialisierst in der Definition in einer CPP-Datei

```
class Foo
{
public:
        static int bar[];
};

int Foo::bar[] = { 0 };
```


----------



## seru (23. Juni 2010)

Ok danke das hat jetzt funktioniert habe jedoch 
char buffer[]= { 2 /*STX*/, '1', '0', '0', '1', ' ', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',' ', 3 /*ETX*/ };
im Konstruktor aufgerufen!! 
Trotzdem danke vielmals für deine Geduld mit mir.
Eine Frage noch hast du irgendeine Idee wie man diesen ASCII String dynamisch in solch einen Buffer laden kann


----------



## Cromon (23. Juni 2010)

Wenn du das im Konstruktor aufrufst initialisierst du die im Konstruktor lokale Variable buffer mit den Werten was überhaupt keinen Einfluss auf den Member buffer deiner Klasse hat.

Indem du über new ein dynamisches char-Array allozierst und dieses mit deinen Werten beschreibst.


----------



## deepthroat (23. Juni 2010)

seru hat gesagt.:


> Ok danke das hat jetzt funktioniert habe jedoch
> char buffer[]= { 2 /*STX*/, '1', '0', '0', '1', ' ', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',' ', 3 /*ETX*/ };
> im Konstruktor aufgerufen!!


Das funktioniert dann aber nicht, da diese Variable nur lokal im Konstruktor vorliegt. Du mußt es so machen wie Cromon bereits sagte.


seru hat gesagt.:


> Eine Frage noch hast du irgendeine Idee wie man diesen ASCII String dynamisch in solch einen Buffer laden kann




```
char buf[512] = {};

strcpy(buf, "\x021001 00000003\x03");
```
In C++ würde sich ein std::string anbieten, da dieser den Speicher verwaltet:

```
std::string buf;

buf += "\x021001 00000003\x03";

send(buf.data(), buf.size());
```
Gruß


----------



## seru (23. Juni 2010)

Wenn ich 	
strcpy(buffertest,"\x021001 0000000000 \x03");
Verwende bekomme ich folgende error massage:
error C2022: '135169' : Zu gross für ein Zeichen Fehler beim Ausführen von cl.exe.

Wenn ich std:string buf verwende bekomme ich 5 
Error Messages das std und string nicht exestieren ich habe aber <string> eingefügt


----------



## Cromon (23. Juni 2010)

Hast du auch den Standard I/O-Header iostream includiert?


----------



## deepthroat (23. Juni 2010)

seru hat gesagt.:


> Wenn ich
> strcpy(buffertest,"\x021001 0000000000 \x03");
> Verwende bekomme ich folgende error massage:
> error C2022: '135169' : Zu gross für ein Zeichen Fehler beim Ausführen von cl.exe.


Du hast buffertest falsch deklariert. Schau dir nochmal meinen Code an.

Und gewöhne dir bitte an, bei einem Fehler 1. deinen Code (und zwar mit allen Deklarationen der Variablen) und 2. die Fehlermeldungen direkt aus dem Output-Fenster zu kopieren und hier einzufügen.


seru hat gesagt.:


> Wenn ich std:string buf verwende bekomme ich 5
> Error Messages das std und string nicht exestieren ich habe aber <string> eingefügt


Zeig den konkreten Code und die konkreten Fehlermeldungen.


			
				Cromon hat gesagt.:
			
		

> Hast du auch den Standard I/O-Header iostream includiert?


Das braucht man aber für std::string nicht.

Gruß

\edit: @seru: Hast du vielleicht string.h statt string eingebunden?


----------



## seru (23. Juni 2010)

Nein hatte ich vergessen!!
Danke jetzt funktoniert's 
Um noch mal zum eigentlichen Thema des Threads zurückzukommen:
Kann man mit memcpy ein ASCII Zeichen aus einem Array in eine float variable speichern


----------



## Cromon (23. Juni 2010)

Ein ASCII-Zeichen ist i.d.R. 1 Byte gross, eine float-Variable 4 Byte. Aber auch abgesehen davon gibt es keinen Grund da über memcpy zu gehen, du kannst einfach den Wert der float-Variablen zuweisen (was zwar keinen Sinn macht, aber wems beliebt 3 Bytes zu verschwenden...).


----------



## seru (23. Juni 2010)

Ja eigentlich möchte ich aus 4 ASCII Zeichen die in  Array Felder stehen eine float Zahl machen 
da hätte ich dann ja die 4 byte nicht verschwendet


----------



## deepthroat (23. Juni 2010)

seru hat gesagt.:


> Ja eigentlich möchte ich aus 4 ASCII Zeichen die in  Array Felder stehen eine float Zahl machen
> da hätte ich dann ja die 4 byte nicht verschwendet




```
char buf[] = "abcdef";

float f = *reinterpret_cast<float*>(buf);
```
Gruß


----------



## seru (23. Juni 2010)

Kann ich den von dir vorgeschlagenen Befehl auch mit einzelnen Feldern eines Arrays machen.
Also ich würde nur die Felder 27,28,29,30 von einem 96 Felder großem Array brauchen. 
Code:

char  m_sBufRes[96];   //array aus dem ich die Felder brauche

m_sBufRes[27]
m_sBufRes[28]
m_sBufRes[29]
m_sBufRes[30] 

nur diese Felder würde ich aus dem Array m_sBufRes[96] holen wollen und in eine float variable schreiben


----------



## Cromon (23. Juni 2010)

float f = *reinterpret_cast<float*>(m_sBufRes + 27);


----------



## seru (23. Juni 2010)

Ok aber ich kann nicht 4 Felder gleichzeitig in ein float laden. Da müsste ich zunächst die Werte in 4 verschiedene Floats laden
und anschließend die Werte in den Floats mit 100,10,1,0.1 multiplizieren damit zb. wenn 
m_sBufRes[27] = '0'
m_sBufRes[28] = '3'
m_sBufRes[29 ] = '3' 
m_sBufRes[30] = '7' 
damit in meinem gewünschten Float 33,7 steht ? 

müsste eig mit int auch gehn dann verbrauche ich nicht so viel Speicher 
bitte um Antwort


----------



## Cromon (23. Juni 2010)

Sowohl long int als auch float benötigen beide 4 Byte Speicher jedoch kann ein Integer keine Kommazahlen speichern. Bei deinem Aufbau kommst du nicht drum herum einfach mit 100, 10, 1, 0.1 zu multiplizieren und das als float zu speichern.


----------



## seru (23. Juni 2010)

Ok alles klar herzlichen Dank 
auch an alle anderen die auf meine Fragestellungen gepostet haben


----------



## Cromon (23. Juni 2010)

Es wäre vielleicht eine Überlegung wert ob du nicht vielleicht die Daten über die serielle Schnittstelle binär senden möchtest statt als String.


----------

