Probleme mit Pointer



  • Moin,

    schon wieder.

    Hier ebend mein Code:

    const int length1 = sizeof(array3)/sizeof(array3[0]);
    	const int length2 = sizeof(array4)/sizeof(array4[0]);
    
    	int length3 = length1+length2;
    	int *array7 = new int [length3]; //dynamisches Array;
    
    	copy(array3, array3+length1, array7);
    	copy(array4, array4+length2, array7+length1);
    
    	if(testArray3 == array3 && testArray4 == array4 && testArray7 == array7){
    	return true;
    	}else{
    	return false;
    	}
    

    Mein Problem ist die Zeile:

    int *array7 = new int [length3]; //dynamisches Array;
    

    array7 ist ein Pointer, aber ich kann mit dem ja so nix anfangen. Da ich ja weiter unten verschiedene Array-Werte Vergleichen möchte und array7 noch ein Pointer ist kann ich das so nicht machen. Wie kann ich das Problem am besten Lösen.

    Mfg Patrick



  • man kann auf Pointer mit arrysyntax zugreifen, also array7[5] liefert beispielsweise das 6te element des dynamisch allokierten Arrays.



  • meinst du damit, ich soll mit hilfe einer schleife, die Werte wieder in ein array ohne pointer schreiben und dann vergleichen?



  • 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.html

    int 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;
    
    #endif
    

    Nicht 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 int dar und zweitens hast du mit T_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!


Anmelden zum Antworten