Arrays via Pointer kopieren (C++)
-
Habe eine Aufgabe zu bewältigen:
Wie kann ich ein Array, z.B.
int a[7] = {0,6,5,3,2,4,1}in ein anderes "leeres" Array (int *b = new int[7] )kopieren?
Diese Aufgabe sollte mit Pointern gelöst werden und nicht mit Zuweisungen der Art b[i] = a[i]...Ich hoffe da kann mir jemand helfen.
Danke im Voraus
-
Anfänger2 schrieb:
...mit Pointern gelöst werden und nicht mit Zuweisungen der Art b[i] = a[i]...
Ich tippe mal auf memcpy(), aber die Aufgabe (bzw. das, was du darunter verstanden hast) ist auf jeden Fall "unglücklich" formuliert...
Gruß,
Simon2.
-
Aufgabe 1 (4 Punkte)
Find and fix at least 4 problems in the following program. The fixed program should indeed correctly do what it claims to do (this is a theory exercise)# include < iostream >
int main ()
{
int a [7] = {0 , 6 , 5 , 3 , 2 , 4 , 1}; // static array
int* b = new int [7]; // dynamic array
// copy a into b using pointers
for ( int* p = a; p <= a +7; ++ p)
*b ++ = * p;
// cross - check with random access
for ( int i = 0; i <= 7; ++ i)
if (a[i ] != b[i])
std :: cout << "Oops , copy error ...\n";
delete b;
return 0;
}Das wäre dann die komplette Aufgabe... Es fehlen mal die meisten Klammern, aber danach funktioniert das programm trotzdem nicht
-
Ein besonders penetranter Fehler ist die Index-Überschreitung (der höchste Index in beiden Arrays ist 6).
-
Habe den Indexfehler behoben...
Ich vermute den Fehler irgendwo bei den Pointer Zuweisungen. Hab schon jene Testprogramme erstellt, aber habe bis jetzt den gravierendsten Fehler noch nicht gefunden...
Kann mir jemand weiterhelfen?
thx
-
Ein eher unbedeutender Fehler ist die falsche Anwendung von delete (du brauchst die Array-Version delete[]). Problematisch könnte es werden, daß du in der Schleife b weiterzählst und es damit am Schleifenende nicht mehr auf den Anfang des dynamischen Arrays zeigt (sondern auf sein Ende).
-
Anfänger 2 schrieb:
Aufgabe 1 (4 Punkte)
Find and fix at least 4 problems in the following program. The fixed program should indeed correctly do what it claims to do (this is a theory exercise)
...
Das hat mit dem hier:Anfänger2 schrieb:
...
Diese Aufgabe sollte mit Pointern gelöst werden und nicht mit Zuweisungen der Art b[i] = a[i]......Aber auch gar nichts zu tun ...
Gruß,
Simon2.
-
Zuerst mal ein Danke an alle!!!
Wie CStoll geschrieben hat lag das Problem an b... Musste es am Ende der Schleife zurücksetzen und jetzt lauft alles wie geschmiert.
Danke übrigens auch für die anderen Bemerkungen.Best regards
thx
-
Simon2 schrieb:
Anfänger2 schrieb:
...mit Pointern gelöst werden und nicht mit Zuweisungen der Art b[i] = a[i]...
Ich tippe mal auf memcpy()
Wieso nicht std::copy?
-
Anfänger 2 schrieb:
*b ++ = * p;
Bin jetzt nicht ganz sicher, welcher der beiden Operatoren Vorrang hat, aber ega wie rum, scheints mir falsch zu sein:
- wird zuerst der Pointeroperator ausgewertet, dann wird das erste Element von b inkrementiert, ein rvalue zurueckgegeben und dem der Inhalt, auf den p zeigt zugewiesen - Autsch.
- wirt zuerst der Inkrement ausgeführt und dann dereferenziert, dann wird b selbst inkrementiert, es zeigt nichts mehr auf den Anfang des urpsrünglichen b-arrays, damit haben wir ein Speicherleck und die nachfolgenden Vergleiche mit b[i] sind ein Zugriff aufs Nirvana...
-
Der Inkrement-Operator hat Vorrang - aber die Postfix-Version liefert als Rückgabe den Wert vor der Erhöhung (und damit bekommt der Dereferenzierungs-Operator doch die richtige Adresse übergeben).
-
innerhalb der for-schleife ist auch alles wunderbar, nichts desto trotz ist b dann in der for-schleife 7mal inkrementiert worden und verweist damit nichtmehr auf das erste Element sondern hinter das letzte. Wir haben also den pointer auf das erste Element des dynamisdchen arrays halbwegs verloren und mittels
if (a[i ] != b[i])
wird das Array a mit den Elementen hinterdem dynamischen Array verglichen.
ich wuerde daher fuer die Kopierschleife eine Kopie von b nehmen, so dass das ganze dann wie folgt aussieht:
# include < iostream > int main () { int a [7] = {0 , 6 , 5 , 3 , 2 , 4 , 1}; // static array int* b = new int [7]; // dynamic array // copy a into b using pointers int* c=b; //## NEU ## for ( int* p = a; p < a +7; ++ p) //## aus <= mach < ## *(c++) = * p; //## GEAENDERT ## // cross - check with random access for ( int i = 0; i < 7; ++ i) //## aus <= mach < ## if (a[i ] != b[i]) std :: cout << "Oops , copy error ...\n"; delete[] b; //## delete -> delete[] ## return 0; }
-
pumuckl, schreibst Du wirklich so Code? Gott bewahre.