Von double zu int?



  • Hi , ich sitze in einer sehr verzwickten Lage .

    Ich habe eine Funktion geschrieben , die sämtliche ganzzahligen Punkte ,die sich in einem Kreis befinden, in einer Array speichert .

    Für die Berechnung der Entfernung der Punkte brauche ich den Typ double für die Wurzel . Nur möchte ich die XY Koordinaten in der selben Array mit Hilfe eines zusammengesetzten Dateityps

    #define CXY10(x,y) ((x<<5)|(y))
    

    sichern , aber Bitwise Operatoren sind nur im zusammenhang mit int möglich .

    Kann ich double irgendwie in int umwandeln ?
    Der Programmcode :

    void ListKoordsInCircleInArray(double mx , double my , double r ,  KoordArrayTypeCXY[]){
    	bool INCIRCLE;
    	int FieldPosition = 0;
    	double Distance;
    
    	for (double i = (mx - r); i <= (mx + r) ; i++) {
    		for (double j = (my - r); j <= (my + r) ; j++) {
    		FieldPosition++;
    		Distance = TraceGetDistanceFromKoordinats(mx,my,i,j);
    		if (Distance <= r)INCIRCLE = true;
    		if (Distance > r)INCIRCLE = false;
    		if (INCIRCLE){	
    		&KoordArrayTypeCXY[FieldPosition] = CXY10((i),(j));
    			} else {
    			FieldPosition--;
    			}
    		}
    	}
    }
    


  • Hallo,

    die "Umwandlung" an sich ist leicht:

    double d = 25.874;
    int i = static_cast<int>(d); //i ist jetzt nur noch 25
    

    Aber es ergeben sich halt Probleme wie: Nachkommastellen werden gekillt und evtl. passt der double Wert auch nicht ins int rein. No Risk no Fun 😉

    MfG

    GPC



  • Klar kannst du das:

    double dval = 3.14;
    int ival=(int)dval;//ival wird 3
    

    (Nachkommastellen werden dabei abgeschnitten)



  • 😃 ist nicht einmal schlimm , denn :
    1. Hab ich keine Nachkommastellen , da zu i und j immer 1 dazugezählt werden
    und i und j immer Ganzzahlig anfangen
    2. Kann ich Koordinaten mit Nachkommastellen nicht darstellen



  • CStoll schrieb:

    Klar kannst du das:

    double dval = 3.14;
    int ival=(int)dval;//ival wird 3
    

    (Nachkommastellen werden dabei abgeschnitten)

    Böser Caster :p

    MfG SideWinder



  • RobthaR schrieb:

    1. Hab ich keine Nachkommastellen , da zu i und j immer 1 dazugezählt werden
    und i und j immer Ganzzahlig anfangen

    Gar nie? Wieso dann double?

    2. Kann ich Koordinaten mit Nachkommastellen nicht darstellen

    Im Ernst, nimm ganzzahlige Datentypen, wenn du kannst. Spart Platz und ist schneller.

    MfG

    GPC



  • RobthaR schrieb:

    😃 ist nicht einmal schlimm , denn :
    1. Hab ich keine Nachkommastellen , da zu i und j immer 1 dazugezählt werden
    und i und j immer Ganzzahlig anfangen
    2. Kann ich Koordinaten mit Nachkommastellen nicht darstellen

    Warum nimmst du dann double? 🙄



  • ich benutze für die Wurzel sqrt und sqrt benötigt double

    Hab ne neue Frage : Ich hab jetzt alles richtig gestellt , aber jetzt sagt mir der Compiler :

    Der Compiler schrieb:

    math_functions.h:42: error: invalid lvalue in assignment



  • Hallo,
    kannst du uns vielleicht auch die Codezeile sagen, in der dieser Fehler im Programm auftaucht und vielleicht noch etwas Code davor, der für diese Zuweisung wichtig ist.

    MfG



  • Ach komm, den Fehler findest du doch auch so.

    Progger ist schon ne scheiss bezeichung.



  • RobthaR schrieb:

    ich benutze für die Wurzel sqrt und sqrt benötigt double

    Nun gut, aber durch einen simplen cast (int->double) kannst du sqrt weiterhin benutzen, die Nachkommastellen interessieren dich ja eh nicht...



  • Jaschi schrieb:

    kannst du uns vielleicht auch die Codezeile sagen

    Mist , ist mir heute morgen wieder eingefallen

    &KoordArrayTypeCXY[FieldPosition] = CXY10(ini,inj);
    //und noch
    #define CXY10(x,y) ((x<<5)|(y))
    

    Das wären die Zeilen
    Ich hab im Internet schon nach dem Fehler gesucht und hab gefunden , das der Fehler nur bei AMD64 Prozessoren und G++ Compilern auftaucht . Ich bin sicherlich nicht der einzige , der diese benutzt . Villeicht weiß schon jemand wie man den Fehler beheben kann .

    Außerdem weiß ich nicht was lvalue und assignment bedeuten sollen



  • Ja, das liegt daran dass man mit G++ und AMD64 nicht die Adresse eines Arrayfeldes ändern kann sondern nur dessen Inhalt. Das & vor dem Array ist da völlig fehl am Platz 😉



  • Danke 👍
    Habs jetzt mit nem Pointer gemacht



  • RobthaR schrieb:

    Ich hab im Internet schon nach dem Fehler gesucht und hab gefunden , das der Fehler nur bei AMD64 Prozessoren und G++ Compilern auftaucht .

    Keine Ahnung, wo du das gelesen hast. Aber das stimmt so nicht.

    &KoordArrayTypeCXY[FieldPosition]
    

    Dies ist schlichtweg kein l-value, kann also maximal als r-value genutzt werden. Und r-values kannst du niemals nie etwas zuweisen. Für welche Plattform du komplierst und welchen Compiler du verwendest, ist dabei völlig unerheblich.

    Übrigens:

    Für sowas

    #define CXY10(x,y) ((x<<5)|(y))
    

    solltest du besser eine inline Funktion verwenden.


Anmelden zum Antworten