Forum
Tipps
News
Menu-Icon

Strukturen in c ++ kopieren ?

Ich habe folgendes Problem:

Ich habe in meinem c ++ Programm 2 Strukturen :
einmal schueler & datex.

Beide Strukuren haben folgende variablen:

Name,Vorname,Alter.

Nun möchte ich alle gespeicherten daten der Strukur Datex in die Struktur Schueler kopieren.

eine FOR Schleife :

for (int i=1;i<anzahl+1;i++)
{
Schueler.name = Datex.name
}

funktioniert leider nicht.

Hat jemand vll eine idee wie ich das problem lösen kann ?

Würd mich freuen...

Gruß


Antworten zu Strukturen in c ++ kopieren ?:

Wäre sinnig wenn Du mal die Fehlermeldung mitposten könntest. Ansonsten sehe ich 2 mögliche Fehler:

1. Sind die Variablen "Datex" und "Schueler" Instanzen DERSELBEN Struktur? Wenn nicht, dann liegt dort schon ein möglicher Fehler.

2. und wahrscheinlicher ist allerdings, dass der Fehler in der Bedingung der FOR-Schleife liegt.
Von wo bis wo soll die Schleife denn zählen, bzw. Wie lauten die Grenzen der Arrays Datex und Schüler? Weiterhin beginnt die Indizierung der Arrays typischerweise mit 0. Möchtest Du z.B. "anzahl" Elemente kopieren, dann muss die Anweisung lauten:

for( i=0; i < anzahl; i++ )
{
...
}
Es wird also mit Index i=0 begonnen und bis anzahl-1 gezählt, somit werden anzahl Elemente kopiert.

Ich vermute mal das hier der Fehler liegt und Du über die Grenzen des Arrays hinaus zählst, was dann zu einem Laufzeitfehler (Zugriffsverletzung) führt.

es sind GENAU die gleichen Strukturen !

die For schleife soll ab 1 anfangen zu zählen da es den datensatz 0 ja nicht gibt.

es erscheint keine fehlermeldung, das Programm lässt sich ohne probleme compilieren (DEV-C++)
aber die strukuren lassen sich einfach nicht kopieren :(

Hi...

vielleicht solltest du mal StrCpy() asuprobieren um
die struckturen zu tauschen ?

so z.b.

strcpy(Schueler[i].name, Datex[i].name);

Gruß

Jan

Nun erscheint folgende Fehlermeldung:

366 C:\Dev-Cpp\myProjects\class#\datenbank.cpp cannot convert `std::string' to `char*' for argument  `1' to `char* strcpy(char*, const char*)'

Dann hast du schon strings-Objekte genommen, die können ohne Probleme mit '=' kopiert werden, kein Bedarf für strcpy.

Ohne mehr Code wird da niemand was erkennen können :-)

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

versuch ma:

memcpy(&Schueler,&Datex,sizeof(Datex));

lol

Was passiert wenn man Strukturen mit Pointern kopiert ?
Schade das Anwendungen beim crashen keinen Sound abspielen. Diesen würdest du nämlich hören. Warum ?

1. Es ist undefiniert was passiert wenn man einen Speicherbereich 2 mal freigibt (siehe dtor von std::string)
2. Es ist undefiniert was passiert wenn man auf Speicher zugreift der schon freigegeben worden ist. (wieder dtor vom 1. String, der ja den Speicher freigibt).
3. Es ist undefiniert ob er überhaupt crashed. Wenn man VC++ 2003 benutzt, der ja die "small string optimization" benutzt, kann es manchmal klappen aber manchmal auch nicht. (16 Zeichen ;) )
4. Schonmal was von COW (copy on write) und Referenzzählen bei strings gehört? Was glaubst du wie der std::string implementiert ist? (hint: VC++ 2003 macht weder noch, aber VC6 macht beides)

Und wie erfährt man nun was hinten rauskommt ? Nachschauen, aber ich glaube nicht das das Ergebnis gefällt :P.

Deshalb niemals memcpy benutzen (auch nicht strcpy und Konsorten) wenn man nicht genau weiß, ob das Ding was du kopieren willst wirklich ein POD (plain old datatype) ist.

nf ?

Hier wird aber nur std::string kopiert,keine Pointer.

Zitat

1. Es ist undefiniert was passiert wenn man einen Speicherbereich 2 mal freigibt (siehe dtor von std::string)

"...", bist Du es? ;-)

Zitat von: .:..:.:.:.:.:.
Hier wird aber nur std::string kopiert,keine Pointer.

Ich hoffe, dass Du NIE NIE NIE eine Applikation programmierst, die ich mal benutzen muss!

Ausserdem hätte der OP, wenn er schon statt C unbedingt C++ programmieren muss, ein Klasse "Datex" statt einer Struktur erstellen sollen und dort den "="-Operator überladen - dann wär die Sache wenigstens Rund, er hätte sich von vornherein Gedanken über die Kopieroperation machen müssen und memcpy wäre schön in der Schublade geblieben....

Ich wurde gerade vom netten '...' darauf hingewiesen: Man kann den Zuweisungsoperater auch bei Strukturen überladen - nur der Vollständigkeit halber ;-)

Ich hoffe du meinst nicht mich ,,,,  ::)
Ist der Unterschied zwischen struct und class nicht nur die Art des Zugriffsschutzes?

Hier wird aber nur std::string kopiert,keine Pointer.

Ich meine den Verbrecher Verfasser dieses Postings

Dann erklär mal was daran so falsch ist.

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Lies dir doch nochmal den Post von '####' durch. Wenn du gut bist, verstehst du das Problem. Wenn nicht, auch nicht schlimm, aber behaupte bitte einfach nicht mehr dass man Klassen, deren Implementation man nicht kennt, sicher mit memcpy kopieren kann...

Ich bezog mich auf das
bla.string = bla2.string;
dass man Klassen nicht mit memcpy kopieren soll ist klar.

Und nochmal:
,,,,, erklär mir bitte was an meinem Posting falsch war,
ich möchte von deinen Erkenntnissen profitieren.  ::)

Was war Falsch?

- Irgendn Trottel schlägt vor, die Struktur mit memcpy zu kopieren.
- Ein Kluger Mensch erklärt wieso das nicht geht
- Du sagst: "Hier wird aber nur std::string kopiert,keine Pointer."

Und ich dachte ### würde sich darauf

Zitat
for (int i=1;i<anzahl+1;i++)
{
Schueler.name = Datex.name
}
beziehen.
Mal davon abgesehen solltest auch du gemerkt haben,dass ich nicht voids Beitrag meine,weil dort dort der Speicher der Struktur kopiert wird und nicht std::string.

Du hast es nicht verstanden. Die Struktur enthält einen std::string, und darf deshalb nicht kopiert werden...

(Erkennt man aus dem strcpy-Vorschlag und der dazugehörigen Fehlermeldung...)

*seufz*
Wir reden hier über die memcpy Variante,nicht?
Dass diese nicht zu verantworten ist,ist klar,
mit kopieren einer Variablen der Klasse x meine ich normalerweise nicht ein kopieren des Speichers dieser Variablen,sondern der Aufruf des Kopier-Konstruktors bzw des operator =.

Kurzer Nachtrag:
Entweder reden wir aneinander vorbei oder du (ihr?) glaubst,dass man std::string auch nicht über den Kopier-Konstruktor/operator= kopieren darf.

ersteres?

@.:..:.:.:.:.:..

Übrigens hat jedes Posting einen "Zitieren"-Knopf.

Dann weiss man wenigstens, worüber Du redest.


« Verschlüsseln eine Strings in C#DirectX-SDK und Visual C++! »
 

Schnelle Hilfe: Hier nach ähnlichen Fragen und passenden Tipps suchen!

Fremdwörter? Erklärungen im Lexikon!
Grundstrich
Der Begriff des Grundstrichs im Bereich der Typografie, bezeichnet den senkrechten Strich der Buchstaben. Bei Schriftarten mit variabler Strichstärke, wie zum Beispi...

Haarstrich
Der Begriff Haarstrich stammt aus dem Bereich der Typographie. Bei Schriften, wie zum Beispiel der Antiquaschrift mit unterschiedlichen Strichstärken, wird zwischen ...

Internet-Zugriffsprogramm
Ein Internet-Zugriffsprogramm, auch Browser genannt, stellt Internetseiten für den Benutzer dar. Am bekanntesten ist der Microsoft Internet Explorer, gefolgt vom kos...