Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Probleme mit der Speicherverwaltung ?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
27.10.2004, 21:26 Uhr
~Veritas
Gast


Hallo C/C++ CoderZ,

ich hab da ein Problem mit der Speicherbelegung:

ein Teil meines Prog soll einen Zahl in eine String umwandeln. Dabei besteht die Zahl nur
aus 1en und 0en ( 100 %ig).


ich überprüfe jedes Bit der Nummer und jenachdem ob es 1 oder 0 ist hänge ich es an einen "string" an mit strcat(string,"1") oder strcat(string,"0");

den "string" hab ich vorher mit char* string = new char(); angelegt.

Ich frag mich und euch jetzt warum das programm jedes mal abschmiert sobald ich mehr als 24 zeichen daranhängen will. Irgentwie darf ich den Speicher nicht mehr benutzen der dann kommt, aber warum ausgerechnet ab 24 Zeichen(könnt sein das es auch mal funktioniert oder erst bei 25 oder 26 Zeichen abschniert, weiß ich jetzt nicht genau).

Ich bin für jeden kleinen Tip dankbar, oder kann mir jemand erklären wie ich es ohne strcat machen könnte? oder warum mein Programm jedes mal abstürzt ????
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
27.10.2004, 21:34 Uhr
~Hammurabi
Gast


wie groß ist dein string?
etwa? char string[25] mal abgesehen von der 0...(Stringende)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
27.10.2004, 23:30 Uhr
Hans
Library Walker
(Operator)


Hi,

Zitat:

ich überprüfe jedes Bit der Nummer und jenachdem ob es 1 oder 0 ist hänge ich es an einen "string" an mit strcat(string,"1") oder strcat(string,"0");

den "string" hab ich vorher mit char* string = new char(); angelegt.


strcat() ist C;
string = new char(); ist C++, das sollte man nicht mischen.
Nu kenn ich mich mit C++ nicht so gut aus, aber ich halte es für möglich, das new() für den string erst mal nur 24 Bytes reserviert, und das Programm deshalb nicht funktioniert.
Da Du ja sicherlich weisst, wie lang die Zahlen sind, d.h. wieviele Bits sie umfasst, reservierst Du vorher entsprechend viel Speicher für Deine strings. Wenn Du also z.B. 32 Bit lange Zahlen hast, legst Du vorher einen char[33] an.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
28.10.2004, 10:56 Uhr
RHBaum



Wobei das die (fast)perfekte Aufgabenstellung ist, um mit Templates zu ueben ...

aus dem "new" erkenne ich das du c++ schreibst ...

wie waers mit sowas ?


C++:
template <class CharacterTyp = char>
class BinaryCharacterCreator
{
public:
     static CharacterTyp GetChar(bool isSet = true)
     {
            //hier entsprechend '0' oder '1' zrueckgeben, je nach stringklasse
            // eventuell diese funktion fuer char und wchar_t spezailisieren ....
            return irgendwas;
     }
};
template<class IntergerTyp = long,class CharacterTyp = char,class CharacterCreatorTyp = BinaryCharacterCreator<CharacterTyp >,IntergerTyp DefaultValue = 0>
class BinaryString
{
public:
BinaryString(IntergerTyp aValue = DefaultValue):
Value(aValue)
{
    fillStringBuffer();
}
~BinaryString(){};  // wuerd das konstrukt ned wirklich als basisklasse verwenden wollen

const CharacterTyp * c_str(){return m_strbuffer;};

// dann sollt hier noch CCtor, zuweisungsops von nem IntergerTyp und von der eigenen klasse implementiert werden ....

private:
// hier noch ne interne funktion zum befuellen des stringbuffers
void fillStringBuffer()
{
     // viel spass beim implementieren :-)
    // nicht vergessen, CharacterCreatorTyp verwenden ...
}
private:

// der Integer an sich
IntergerTyp m_Value;
// stringbuffer gleich fester laenge .....
CharacterTyp m_strbuffer[sizeof(IntergerTyp) + 1 ];
};



anwenden koennt man das dann recht einfach etwa so


C++:
BinaryString<long> myBinString(255);
std::cout << myBinString.c_str() ;



so wuerd ich zumindest rangehen ....

Ciao ...

Dieser Post wurde am 28.10.2004 um 10:57 Uhr von RHBaum editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
28.10.2004, 11:12 Uhr
RHBaum




Zitat von Hans:

strcat() ist C;
string = new char(); ist C++, das sollte man nicht mischen.


kommt man manchmal aber ned drumrum .... besonders wenn man mit strings arbeitet, die man wegens der performance aufn stack legt .... also so schlimm isses nu nich
aber wenn man kann sollt man c++ strings verwenden


Zitat von Hans:

string = new char();
Nu kenn ich mich mit C++ nicht so gut aus, aber ich halte es für möglich, das new() für den string erst mal nur 24 Bytes reserviert, und das Programm deshalb nicht funktioniert.



Im ReleaseModus würde das genau 1 byte aufn Freestore anlegen ....
im Debug modus, je nach compiler +- paar DebugGuards, um speicher verletzungen zu erkennen, je nach compiler ....

dynamisch anlegen:
string = new char[255];
und loeschen
delete[] string;

wobei das unsinnig in diesem fall ist ... strings fester laenge sollte man aufn stack werfen wenn es geht -> performance

Ciao ...

Dieser Post wurde am 28.10.2004 um 11:13 Uhr von RHBaum editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: