Typumwandlung (int) und (int *)



  • Hallo,

    ich habe in meinem Programm eine Variable "unsigned char* begin() const;", wie kann ich diese Variable in ein integer temporär umwandeln?
    Mit (unsigned int) oder (unsigned int 😉 vor der Variable funktioniert es nicht!
    Als Fehler gibt er immer "Zeigerverkürzung" oder "unsigned int unterscheidet sich von unsigned int *" aus.

    Wann benutzt man (int) und wann (int 😉 bei der Umwandlung??

    Ps: Bin neu im Forum und noch nicht die beste in c++ 🙂


  • Administrator

    Einen Zeiger wandelt man normalerweise auch nicht in einen Integer um. Sowas ist in 99% der Fälle unnötig und grob fahrlässig. Du kannst es zwar über einen reinterpret_cast durchführen, aber ich möchte ehrlich gesagt lieber nachfragen, was du erreichen möchtest. Vielleicht gibt es da einen besseren Weg 🙂

    Grüssli



  • (int) und (int 😉 benutzt man gar nicht.
    man benutzt static_cast<int>( ) bei einer Standardumwandlung.

    Wenn ich deine Frage richtig verstehe, willst du eine zeichenkette, die zahlen enthält in eine zahl umwandeln? dazu nimmst du die c-Standardfunktion atoi( )



  • Es handelt sich um eine Praktikumsaufgabe in der Uni.
    Ein Zeiger zeigt auf ein pgm-Bild mit "unsigned char* begin() const;".
    Der Inhalt gibt die Farbtiefen des Bildes an der Stelle wieder. Die Farbtiefe ist ne Zahl zwischen 0 und 255. Mit einer Variable k wollte ich das Bild durchlaufen, um dann die Häufigkeit der Farbtiefe festzulegen..

    Also ich will ja in der Adresse immer eine Stelle weiter, um zu gucken, welche Farbtiefe dort ist.

    Ich hab jetzt:

    int anzahl = 0;
    unsigned char *k = image.begin(),
    string farbe = 0; 
    
    while (farbe < "256"){
    	while(*k < image.end()){    // 1.
    		if(k = farbe)
    			anzahl++;
    		*k++;
    	}
    	m_greys[farbe,anzahl];
    	farbe++;     // 2.
    }
    

    Bei 1. und 2. (im Code) funktioniert es nicht.
    Brauch ich überhaupt eine Typumwandlung??



  • Der Code ist ja auch gänzlich unsinnig. So unsinnig dass ich mich schon fast frage ob du nicht gar ein Troll bist... 😕

    'string farbe' macht keinen Sinn.

    'farbe < "256"' auch nicht wirklich.

    'm_greys[farbe,anzahl]' tut nichts, ausser den operator [] mit 'anzahl' als parameter aufzurufen.

    'if(k = farbe)' macht vermutlich auch nicht das was du möchtest, das ist nämlich eine Zuweisung, und kein Vergleich.

    'while(*k < image.end())' ist Unsinn, du willst ja vergleichen ob k noch auf einen Bereich vor Ende des Bilds zeigt, nicht ob der Farbwert an der Stelle kleiner als das Ende des Bilds ist. Natürlich kann man einen Farbwert nicht mit einer "Position" vergleichen, genau deswegen bekommst du an der Stelle auch ne Fehlermeldung.

    '*k++;' --- ??? Der selbe Denkfehler/"Verständnisfehler" wie bei 'while(*k < image.end())' vermutlich. 'k++;' reicht völlig.

    ----

    Nun könnte man dir natürlich einen funktionierenden Code hinschreiben, bloss das bringt fürchte ich garnix, da du dabei nix lernst.



  • antworter schrieb:

    dazu nimmst du die c-Standardfunktion atoi( )

    Wenn du dich schon gegen C-Casts aussprichst, kannst du auch gleich mit den lexikalen Umwandlungen fortfahren. In C++ nimmt man dafür nämlich eher std::stringstream oder mit Boost boost::lexical_cast . 😉

    dena_blena schrieb:

    Brauch ich überhaupt eine Typumwandlung??

    Eine explizite eigentlich nicht. char s sind auch integrale Typen und können z.B. implizit zu int konvertiert werden (ASCII-Werte). Wenn du jedoch den Zeigertyp änderst, wirst du mit grosser Wahrscheinlichkeit undefiniertes Verhalten haben. Mal abgesehen davon, dass du damit nicht erreichst, was du willst.

    Und nach deinem Code scheint dir sehr viel Grundlagenwissen zu fehlen. Du solltest dich unbedingt richtig in Zeiger und Arrays einlesen, die Thematik lässt sich nämlich nicht in einem Abschnitt erklären. Zum Beispiel kannst du diesen Artikel lesen. Wobei es vielleicht besser ist, noch einmal ganz neu anzufangen (zum Beispiel mit Variablendeklarationen, Datentypen und boolschen Bedingungen)...



  • 🙂 LoL.....

    Also ich guck mir das dann irgendwann genauer an und melde mich dann noch mal hier.... Letzendlich muss ich es ja irgendwie hinkriegen..



  • Ja, ich habe grade vor einem Jahr angefangen C zu lernen bzw. Grundlagen in C. Und jetzt muss ich in C++ das umfangreiche Projekt schreiben..
    Und wenn man vorher noch gar nicht programmieren konnte, ist es nicht so leicht..
    Aber danke für diesen Artikel.


Anmelden zum Antworten