Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 09:10

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



merwürdiges char array problem

Discussion on merwürdiges char array problem within the C/C++ forum part of the Coders Den category.

Reply
 
Old   #1
 
elite*gold: 0
Join Date: Jul 2008
Posts: 84
Received Thanks: 3
merwürdiges char array problem

hey habe ein problem, wovon ich keine ahnung habe wieso es kommt.
hier der code erstmal
Code:
class HB{
	protected:
		char UHB[4]; //unteres halbbyte also "1111" für 15
		bool Valid;  //gültigkeit überprüfen
	public:
		char* getUHB(){
			return UHB;
		}
		bool getValid(){
			return Valid;
		}
		
		HB(int Wert){
			Valid = true;
			if(Wert>=0 && Wert<=15){
				for(int i=3; i>=0; i--){// zahl in binärzahl umrechnen
					UHB[i]= Wert%2+48;
					Wert/=2;
				}
			}else Valid = false;
		}
		HB(const HB &HB2){
			for(int i=0;i<4&&Valid;i++){
				UHB[i]=HB2.UHB[i];
			}
			Valid= HB2.Valid;
		}
};


int main() {
	HB byte(11);
	std::cout << byte.getUHB();
	return 0;
}
eigentlich klappt alles perfekt nur eine sache nervt, unzwar ist mein array nicht "1011" sondern "1011" keine ahnung wieso 5 zeichen statt 4 ausgegeben werden... das traurige ist sobald ich oben "char UHB[4]" ändere zu "char UHB[3]" oder "char UHB[5]" mache klappt das normal... aber will das nicht machen, da ich für ein unteres halbbyte halt genau 4 zeichen brauche + null terminierter 5 also UHB[4] sollte ja das optimale sein :S
extac is offline  
Old 09/02/2015, 00:18   #2
 
Padmak's Avatar
 
elite*gold: 58
Join Date: Jun 2008
Posts: 2,311
Received Thanks: 8,420
Genau da ist dein Problem, nach deinem Char-Array befindet sich eben kein "null terminierter"
Entweder du vergrößterst das Array, um noch ein 0-Byte anhängen zu können, oder du änderst deine getUHB-Methode auf so etwas:
Code:
std::string getUHB(){ return std::string(UHB, UHB + sizeof(UHB)); }
(Ungetestet, *dürfte* aber funktionieren)

Padmak
Padmak is offline  
Thanks
1 User
Old 09/02/2015, 00:43   #3
 
elite*gold: 0
Join Date: Mar 2010
Posts: 360
Received Thanks: 132
edit:

Code:
char uhb[5];
int zahl = 11;
uhb[0] = (char)((0x1 & zahl)) + 48;
uhb[1] = (char)((0x2 & zahl) >> 1) + 48;
uhb[2] = (char)((0x4 & zahl) >> 2) + 48;
uhb[3] = (char)((0x8 & zahl) >> 3) + 48;
uhb[4] = '\0';
std::cout << uhb;
std::cin.get();
Daifoku is offline  
Thanks
1 User
Old 09/02/2015, 10:08   #4
 
elite*gold: 198
Join Date: Mar 2011
Posts: 835
Received Thanks: 263
Offtopic Frage: Nennt man das offiziell nicht LSB/HSB und nicht UHB oder hat das tatsächlich jemand eingedeutscht ?
ƬheGame is offline  
Thanks
1 User
Old 09/02/2015, 10:57   #5
 
elite*gold: 0
Join Date: Jul 2008
Posts: 84
Received Thanks: 3
Erstmal danke an euch alle, also ich will das schon als char Array behalten.
Muss ich also den '\4' immer selber auf die letzte stelle des Arrays setzten? Ich dachte wenn ich z.B char uhb[4] mache ist automatisch auf der letzten stelle der null terminierer
Das ist ne Aufgabe von einem Blatt da soll das so genannt werden, keine Ahnung wie das sonst heißt
extac is offline  
Old 09/02/2015, 13:49   #6
 
Shadow992's Avatar
 
elite*gold: 77
Join Date: May 2008
Posts: 5,430
Received Thanks: 5,878
Quote:
Originally Posted by extac View Post
Erstmal danke an euch alle, also ich will das schon als char Array behalten.
Muss ich also den '\4' immer selber auf die letzte stelle des Arrays setzten? Ich dachte wenn ich z.B char uhb[4] mache ist automatisch auf der letzten stelle der null terminierer
Das ist ne Aufgabe von einem Blatt da soll das so genannt werden, keine Ahnung wie das sonst heißt
Entweder das oder du lässt die Zeichen einzeln ausgeben, also in etwa so (oder eben in einen string umwandeln):

PHP Code:
charuhb=byte.getUHB();
for (
int i=0;i<4;i++)
       
std::cout<<uhb[i]; 
Shadow992 is offline  
Thanks
1 User
Old 09/02/2015, 14:28   #7
 
elite*gold: 0
Join Date: Mar 2010
Posts: 360
Received Thanks: 132
der Null-Terminator wird nur gesetzt, wenn du deinen Array mit einem "String" initialisierst:

char * uhb = "1111";
uhb hat nun die Länge 5 (1111 und \0)

Wenn du einen char array mit char uhb[4]; deklarierst, musst du dich selbst um die Terminierung kümmern, da diese Deklaration nur den Speicher reserviert ohne diesen zu verändern (e.g. \0 anhängen)

Ich würde ja meinen Code verwenden :P Der erzeugt dir einen char array, ist beliebig erweiterbar und funktioniert auch mit größeren Zahlen.
Binäre Operationen sind toll und schnell
Daifoku is offline  
Thanks
2 Users
Old 09/02/2015, 17:11   #8
 
Shadow992's Avatar
 
elite*gold: 77
Join Date: May 2008
Posts: 5,430
Received Thanks: 5,878
Quote:
Originally Posted by Daifoku View Post
der Null-Terminator wird nur gesetzt, wenn du deinen Array mit einem "String" initialisierst:

char * uhb = "1111";
uhb hat nun die Länge 5 (1111 und \0)

Wenn du einen char array mit char uhb[4]; deklarierst, musst du dich selbst um die Terminierung kümmern, da diese Deklaration nur den Speicher reserviert ohne diesen zu verändern (e.g. \0 anhängen)

Ich würde ja meinen Code verwenden :P Der erzeugt dir einen char array, ist beliebig erweiterbar und funktioniert auch mit größeren Zahlen.
Binäre Operationen sind toll und schnell

Wobei man bei 95% der Compiler heutzutage davon ausgehen kann, dass ein
"i/=2" in "i>>=1" automatisch optimiert wird.
Genau dasselbe ist es bei "i%=2". Aber unabhängig von der Optimierung hast du natürlich recht, binäre Operationen sind schneller.
Shadow992 is offline  
Thanks
1 User
Old 09/02/2015, 21:51   #9
 
elite*gold: 0
Join Date: Jul 2008
Posts: 84
Received Thanks: 3
Quote:
Originally Posted by Daifoku View Post
der Null-Terminator wird nur gesetzt, wenn du deinen Array mit einem "String" initialisierst:

char * uhb = "1111";
uhb hat nun die Länge 5 (1111 und \0)

Wenn du einen char array mit char uhb[4]; deklarierst, musst du dich selbst um die Terminierung kümmern, da diese Deklaration nur den Speicher reserviert ohne diesen zu verändern (e.g. \0 anhängen)

Ich würde ja meinen Code verwenden :P Der erzeugt dir einen char array, ist beliebig erweiterbar und funktioniert auch mit größeren Zahlen.
Binäre Operationen sind toll und schnell
erstmal danke nochmal für die Hilfe an alle und finde dein code auch ganz ausser das du die stellen vertauscht hast .
eine frage hätte ich noch zu etwas anderem, möchte jetzt nicht ein neues thema dafür öffnen.
Unzwar versteh ich nicht genau, wann speicher reserviert werden muss und wann nicht.
z.b
wo genau ist der unterschied zwischen
Code:
int *a; und
int *a = new int;
wann muss speicher reserviert werden?
genau so auch bei arrays,
Code:
char a[5];
und
char* a = new char[5];
extac is offline  
Old 09/02/2015, 22:50   #10
 
elite*gold: 0
Join Date: Mar 2010
Posts: 360
Received Thanks: 132
Zwei Dinge:
Nummer 1:

Code:
char a[5]; // Die Länge muss FEST gewählt werden. Statische Zuweisung.
char *b = new char[len]; //len kann irgendwoher kommen. Dynamische Zuweisung
Nummer 2:
Angenommen a und b werden in einer Funktion deklariert.

Code:
char a[5]; // a ist nur LOKAL verfügbar und wird nach Ende des lokalen Bereichs (return der Funktion) AUTOMATISCH gelöscht.
char *b = new char[5]; // ist GLOBAL verfügbar. Muss MANUELL mit delete []b; gelöscht werden. Ist auch nach dem return noch Verfügbar.
Daifoku is offline  
Thanks
1 User
Old 09/03/2015, 18:02   #11
 
elite*gold: 0
Join Date: Jul 2008
Posts: 84
Received Thanks: 3
habe noch eine frage, habe einen operator überladen, welcher 2 UHB miteinander oder verknüpft, z.b hb1 "1001" und hb2 "0010", habe 2 methoden, eine klappt nicht, Ich weiß aber nicht wieso,
1. (klappt)
Code:
 
HB* operator + (const HB& HB2){
			char tmp[] = "0000";
			for(int i=0; i<4 ; i++){
				if( UHB[i]=='1'|| HB2.UHB[i]=='1')
					tmp[i]='1';
			}
			return new HB(tmp);
		}
2 (klappt nicht)
.
Code:
 
HB* operator + (const HB& HB2){
			char tmp[] = "0000";
			for(int i=0; i<4 ; i++){
				if( UHB[i]=='1'|| HB2.UHB[i]=='1')
					tmp[i]='1';
			}
			HB hb(tmp);
                        return &hb;
		}
ok liegt wahrscheinlich an speicherreservierung oder so aber keine wie genau, und meine andere frage ist , bei der ersten methode muss ich den speicher in der main wieder freigeben oder? also wenn ich z.b habe
HB *hb3(hb2+hb);
wann muss speicher mit delete wieder freigegeben werden?
extac is offline  
Reply


Similar Threads Similar Threads
char array vom pointer mit srcpy changen
04/09/2015 - C/C++ - 10 Replies
Hey zusammen, also habe ein kleines problem das grad unnormal nervt:rtfm: Habe in einem game ein pointer der auf ein char array zeigt der pointer ist DWORD* F = (DWORD*)0x0076BBD8; // hier der pointer auf dem pointer ist jetzt ein char array drauf, nehmen wir einfach als beispiel "hey"
Problem mit Array und for Schleife
11/25/2012 - C/C++ - 0 Replies
Hallo, das folgende programm sollte eigentlich ein 11x11 feld aus zufälligen zahlen ausgeben, macht es allerdings nicht :confused:. #include <iostream> using namespace std; int irand( int min, int max) { double r = max - min + 1; return min + (int)(r * rand()/(RAND_MAX+1.0)); } int main(){
[?]Array Problem (VB.NET 2012)
10/24/2012 - .NET Languages - 6 Replies
Hallohallöchen, Da ich gerade mega auf dem Schlauch stehe wollte ich mal fragen, ob mir einer von euch weiterhelfen kann. Folgendes Problem: Ich lese eine eine verschlüsselte .csv Datei ein, entschlüssel sie das folgender Syntax entsteht.
[Java] Problem mit Array
10/17/2011 - General Coding - 5 Replies
Hallo lieber User ! Ich habe hier ein Programm das ein Array mit Zufallszaheln befüllt, und es dann mit einer anderen Methode durch Beistriche trennt. Mein Problem liegt in der Testklasse, da er mir da zwar die Ziffern durch Beistriche trennt, diese aber nicht mehr zufällig sondern alle gleich sind. z.b eingabe : 5 ausgabe : 1,1,1,1,1, public class ArrayMethoden { public static int zufallsArray (int anzahl) { int a = new int;
Array-Problem
05/13/2010 - AutoIt - 0 Replies
Also ich habe die System-Zeit und das System-Datum in einen Array geladen: #include <Date.au3> Global $dat, $tim $dat = _NowCalcDate() If @error Then Return $tim = _NowTime(5)



All times are GMT +1. The time now is 09:10.


Powered by vBulletin®
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2026 elitepvpers All Rights Reserved.