Probleme mit Pointer
-
nein, du kannst den Pointer auf ein Array genauso wie ein Array benutzen.
-
aber er gibt mir nen false zurück was eigendlich nicht sein darf.
Wenn ich mit dem Compiler durch gehe und mir den Wert der Variable anschaue, der in *array7 steht dann steht da nur :
CXX0030: Fehler: Ausdruck kann nicht ausgewertet werden
drin und daher ist der vergleich natürlich false.
die Frage ist nur weshalb?
-
arrays kann man nicht mit == vergleichen. Wenn du arrayX == arrayY abfragst, gibt das nur einen Vergleich der Adressen beider Arrays. Was du aber wohl vergleichen willst sind die Inhalte.
Das geht z.B. mit std::equal, http://www.cplusplus.com/reference/algorithm/equal.htmlint testArray7[7] = 1,2,3,4,1,2,3; int * array7 = new int[7]; //copy etc... if(std::equal(testArray7, testArray7+7, array7)) //...Wenn dir die Unterschiede und Ähnlichkeiten von Arrays udn Pointern noch nicht bekannt sind und das Vergleichen von Arrays, dann solltest du evtl nochmal das entsprechende Kapitel in der Literatur deiner Wahl durcharbeiten

-
oha ich glaub da haste recht, bin schon dabei ;).
danke für die info!
Aber nur noch eine Frage dazu, wenn ich da mit dem Compiler durchgehe, dann steht da in array7, nach der "fehlermeldung"s.o., immer nur ne 1 drin auch nach der copy-Funktion?
-
stimmt ja auch. Array7 ist ein Zeiger auf int. *Array7 ist der int auf den der Zeiger zeigt, nämlich die 1. Dass dahinter im Speicher noch weitere ints stehen weiß der Compiler und der Debugger nicht. Das weiß nur der Operator delete[], wenn du ihn aufrufst, denn mit new[] hat der Compiler neben den 7 int-Plätzen noch einen kleinen Inforecord angelegt wo drin steht wieviel Platz belegt wurde.
-
Tummi schrieb:
if(testArray3 == array3 && testArray4 == array4 && testArray7 == array7){ return true; }else{ return false;Eine Anmerkung: Konstrukte der folgenden Art
if (Condition) return true; else return false;kannst du auch einfacher schreiben:
return Condition;Und du meinst statt Compiler (der den Code in Maschinencode umwandelt) sicher Debugger (der Laufzeitanalysen ermöglicht).

-
oh man wie ich mal so c++ garnicht mag... wenn ich dich richtig verstanden hab dann passt das schon so :), wieso genau hab ich trotzdem nicht wirklich verstanden. Also mit dem Zeiger auf Zeiger schon aber weiter verstehe ich nicht, ich denke muss ich ma nachlesen. Danke soweit!
-
Du wirst C++ schon noch zu schätzen wissen. Die Zeiger sind ja eher aus C und du musst dich nicht die ganze Zeit mit ihnen rumschlagen. In der STL (Standard Template Library, Teil der C++-Standardbibliothek) gibt es einige Container - also dynamisch verwaltete Klassen zur Speicherung mehrerer Elemente gleichen Typs - die dir die Arbeit abnehmen, sicherer sind und dynamische Möglichkeiten bieten (einfache Vergrösserung, Löschung, etc. zur Laufzeit).
In diesem Forum wurden einige Artikel geschrieben, die sich mit der STL und auch mit Zeigern befassen. Ich rate dir, diese anzuschauen.
-
das klingt doch gut. Ich mein ist ja nicht so das mich das garnicht interessiert und ich nur total auff java abfahren würde;), aber es macht mir doch schon bischen zu schaffen. Da ich in der Theorie, so dachte ich es, soweit ne Menge verstanden hätte :(.
Jetzt stehe ich schon wieder vor nem Zeiger Problem vieleicht könnt ihr mir da auch noch ma helfen, auch wenn ich heute schon ne ganze menge gernervt habe.hier der Code:
Main-Klasse:
merge(array3, arr3Size, &array4, 4, &array7);Funktions-Klasse:
void merge(int *arr3, int const size, T_intArray **arr4, int zahl, T_intArray **arr7){ copy(arr3, arr3+size, **arr7); copy(**arr4, **arr4+zahl, **arr7+size); }header-datei:
#ifndef MAIN_HEADER #define MAIN_HEADER typedef int* T_intArray; #endifNicht wundern, ich hab ein weinig nachgelesen und rumprobiert. Das ist dabei rausgekommen. Ich bin mir sicher, dass da einieges zu ändern ist. Könnt ihr mir da weiter helfen.
Der fehlercode lautet:
error C2664: 'merge': Konvertierung des Parameters 3 von 'T_intArray *' in 'T_intArray' nicht möglich
Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.
-
Das Typedef ist an dieser Stelle nur verwirrend. Erstens stellt es kein Array, sondern einen Zeiger auf
intdar und zweitens hast du mitT_intArray**einen Dreifachzeiger. Im Übrigen sagt die Fehlermeldung ja alles. Das Argument entspricht nicht dem geforderten Parametertyp (eine Zeiger-Indirektion zu viel oder zuwenig).Mit "Main-Klasse" und "Funktions-Klasse" meinst du entweder Funktionen oder Dateien.
Willst du dich wirklich die ganze Zeit mit Zeigern rumschlagen, und dann noch so mühsam? Ich würde vorschlagen, wenn du bereits jetzt Zeiger so ausführlich anschauen willst, solltest du zuerst mal einfachere Funktionen schreiben, die z.B. ein Array annehmen und jedes Element erhöhen. Oder halt Zeiger ohne Arrays.
Zudem hatte ich einen Grund, Folgendes zu erwähnen:
Nexus schrieb:
In diesem Forum wurden einige Artikel geschrieben, die sich mit der STL und auch mit Zeigern befassen. Ich rate dir, diese anzuschauen.
-
ja ja hab ich ja alles gelesen. Aber wie schon erwähnt muss ich das für die uni machen und wir wurden da so ziemlich ins kalte wasser geworfen, was ja eigendlich ok ist, aber ich hab halt meine Probleme damit.
Also letztendlich muss ich den kram machen.mit dem typedef int* T_intArray; kann gut sien das es vieleicht an der falschen stelle ist. Es wurde uns vorgegeben es zu benutzen, aber naja ich wusste halt ma wieder nicht wie genau und da "schien" es mir am besten :(...
Naja gut, dann muss ich da wohl noch ne weile sitzen.
aber danke soweit!