Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » dyn Speicher freigeben

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 < [ 2 ]
000
05.01.2006, 16:06 Uhr
~tillle
Gast


wenn ich dynamisch Platz angelegt habe (in meinem Fall ein char array), dann muss ich ihn doch eigentlich mit sowas wie - delete[] speicher - wieder freigeben.
Bei mir kommt aber dann ein abort. Wenn ich jedoch den Standardkonstruktor lasse wie er ist, sprich nichts mache, dann wird es wohl richtig aufgeräumt. Kann mir jemand das erklären?

Mein Code ist :


C++:
#include <iostream>
#include <cstring>

class vchif
{
public:
  char* text;
  char* code;

  vchif();
  vchif(char* _code);
  ~vchif();
  //char* gettext();
  
  void settext(char* _text);
  char* gettext();
  char* getcode();
  void setcode(char* _code);
  void encode(char* _text, int _i);
};
_____________________________________
#include "vchif.h"

using namespace std;

vchif::vchif(){}

vchif::vchif(char* _code): code(_code)
{
  text = "";
  setcode(_code);
}

vchif::~vchif()
{
  //delete[] text;
  //delete[] code;
}

void vchif::settext(char* _text)
{
  int gr;
  gr = strlen(_text);
  text = new char[gr];
  text = _text;
}

char* vchif::gettext(void)
{
  return text;
}

//dasselbe für code


 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
05.01.2006, 16:37 Uhr
Tommix



Hallo,

Zitat:

C++:
  text = new char[gr];
  text = _text;



Du überschreibst den gerade belegten Zeiger (!) text einfach mit einem anderen Wert. Was Du willst, ist die Stringdaten zu kopieren. Das geht so:

C++:
strcpy(text, _text);


Aber, ich sag's nochmal, es geht auch einfacher:

C++:
//...
#include <string>

class vchif
{
private:
  std::string text;
//...
public:
  vchif();
  void settext(std::string _text);
//...

void vchif::settext(std::string _text)
{
  text = _text;
}



- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
05.01.2006, 16:52 Uhr
~tillle
Gast


danke, also die <string> werde ich mir echt mal ansehen:-))

aber so langsam bin ich soweit, dass ich glaube, dass ich gar nichts mehr verstehe.
ist:
char *a
und
char a[]

dann dasselbe??
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
05.01.2006, 17:08 Uhr
Tommix



Das selbe sind Arrays und Zeiger nicht, obwohl die Verwendung in vielen Fällen identisch ist. Das ist hier neulich diskutiert worden. Wie auch immer hast Du sowohl char* text wie auch char* _text dazustehen und nirgenwo char text[].

- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
05.01.2006, 18:08 Uhr
~tillle
Gast


Hallo nochmal, mir ist jetzt wieder eingefallen, warum ich doch einen array brauche, diesen aber trotzdem dynamisch anlegen muss, da geht dann ja wohl nicht char* text.
Und zwar, wenn jemand einen Text eingibt der 50 Arrayfächer lang ist. Dann soll es ein zweiten Array geben eben auch mit 50 Fächern, allerdings mit einem, sich immer wieder wiederholendem Wort, welches auch angegeben werden kann. die a[i] und b[j] werden dann aufaddiert und wieder in char umgewandelt.
Wie lege ich denn dann sowas an?

int gr;
char* eingabe;
gr = strlen(*eingabe);
eingabenarray = new char[gr];

dann habe ich doch einen array (also keinen Zeiger!)? Oder fehlt da noch was vor eingabenarray.


Sorry, dass ich so viel frage, denkt bitte nicht ich lese nicht nach irgendwo, das Prob ist, dass ich dadurch noch verwirrter bin als vorher.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
06.01.2006, 07:22 Uhr
Tommix




Zitat von ~tillle:
...allerdings mit einem, sich immer wieder wiederholendem Wort, welches auch angegeben werden kann....

'Morgen,
ein char ist ein einzelner Buchstabe. Ein C-String ist ein Array aus chars, mit einem zusätzlichen char '\0' als Ende-Markierung. Funktionen, die mit Strings arbeiten, bekommen als Parameter üblicherweise einen Zeiger auf das erste Zeichen, also

C++:
char text[] = "bla";
int len = strlen(&(text[0]));


Alternativ kann man auch schreiben

C++:
len = strlen(text);


Das ist intuitiv eher erfassbar. Der Compiler macht aber genau das erste Konstrukt daraus. Es wird nicht, wie bei einer "normalen" Variable, eine Kopie der eigentlichen Daten übergeben, sonder ein Zeiger auf das erste Element.
Wenn es dynamisch sein soll sähe es so aus:

C++:
char text[] = "bla";
char* kopie = new char[strlen(text)+1]; // +1 wegen dem '\0' am Ende
strcpy(kopie, text);
//...
delete[] kopie;


Einen derartigen Mischmasch aus C und C++ sollte man sich aber nicht erst angewöhnen.

Gruß, Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
09.01.2006, 08:59 Uhr
~tillle
Gast


Guten Morgen
Erstmal ein großes DANKESCHÖN für deine Hilfe.
Wo genau mischt sich denn hier jetzt c und c++? Bei dem strcpy?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
09.01.2006, 09:11 Uhr
ao

(Operator)


new und delete sind C++.
strlen, strcpy und überhaupt die ganze String-Verwaltung in char[]-Arrays sind C.

Für eine reine C-Lösung nimm malloc und free statt new und delete.
Für C++ speichere die Stringdaten in std::string.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
09.01.2006, 11:47 Uhr
~tillle
Gast


Oh mann ich komm nicht weiter.
Also ich habe jetzt das Prog mal geschrieben, aber natürlich mal wieder Probleme mit dem Zeiger-Array-Zugriff-blubb.

ich schick mal den code, unten noch ne Frage.

C++:
#include "vchif.h"

using namespace std;


void vchif::setzeText(void)
{
  int groesse = 200;
  cout << "Text eingeben:" << endl;
  cin.getline(text, groesse); // >> text[];///
}

void vchif::setzeCodewort(char* _codewort)
{
  codewort = _codewort;
  codeInit();
}

void vchif::codeInit()
{
  maxlaenge = strlen(text) + 1;
  char* code = new char[maxlaenge];
  strcpy(code, codewort);
}

void vchif::chiffrierung()
{
  int k = 0;
  int flag = 0;
  for (text[k]; k <= maxlaenge; k++)
    {
      if ((text[k] >= 'a') && (text[k] < 'z'))
    {flag = 0;}
      else if ((text[k] >= 'A') && (text[k] < 'Z'))
    {flag = 1;}
      else
    flag = -1;

      text[k] = intToString(k, flag);
    
    }
}

void vchif::textAusgeben()
{
  int k = 0;
  for (text[k]; k<=maxlaenge; k++)
    {
      cout << text[k];
    }
  cout << endl;
}


char vchif::intToString(int _bst, int _flag)
{
  cout << "in chif" << endl;
  char* h = &text[_bst];
  char* g = &code[_bst];
  cout << &text[_bst] << endl;
  int erg = atoi(h) + atoi(g);
  if (erg > 26)
    {
      erg = erg % 26;
    }
  return (char(erg));
}


jetzt die intToString stimmt gar nicht mehr.

Was ich da machen will ist:
ich will auf das Zeichen welches im array text[] an Position _bst steht zugreifen, mit diesem dann arbeiten.
der Zugriff müsste doch so lauten:

C++:
char bla;
bla = *text[_bst];


das wäre doch das Zugreifen (dereferenzieren mit *) auf den Inhalt oder?
Aber es geht nicht.
Was ich oben mit

C++:
char* h = &text[_bst];


versuchte war dann: einen Zeiger vom typ char, der auf den Inhalt an der Adresse der eben ist, zugreift.
Aber alles tut nicht:-(
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
09.01.2006, 11:47 Uhr
~tillle
Gast


ach nochmal was: das mit den flags ignorieren!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ 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: