Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
15.02.2001, 19:39
Oheim



Wie kann ich einer int variablen den Die vorkommastellen einer float variable zuweisen... (int)float_variable geht zwar vom kompilieren her, aber die Werte die da rauskommen sind absolut falsch !

--

www.darkconspiracymod.de

zum Seitenanfang zum Seitenende Profil || Suche
001
16.02.2001, 00:08
Kriz



Hä?

Die Typumwandlung kappt von float nach int die Nachkommastellen ab. Was zum Henker soll da nicht funzen?

5.55 ---> 5

Es werden meiner Erfahrung nach keine Rundungen vorgenommen bei der Typumwandlung. In C++ würde ich da den sicheren Weg gehen:

int INTVAR = static_cast<FLOATVAR>(int);

Damit dürfte es keine Probleme geben. Was benutzt Du denn für einen C++ Compiler? Bist Du dir sicher, daß es ein C++ Compiler ist und net Pascal oder Fortran (*ggg*)???

Cu

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
002
16.02.2001, 10:40
TheTinySteini



Vorrausgesetzt du redest vom HL-Code, dann dürfte es mit (int) keine Probleme geben - static_cast ist unnötig. Ich glaub du kannst sogar schreiben int intvar = float_var. Normalerweise würde der Compiler dabei ne Warnung ausgeben, aber bei HL ist die deaktiviert (weil die da ziemlich oft sowas in der Art machen).
Vielleicht beschreibst du dein Prob mal genauer, also mit der Codezeile die du verwendest und was die einzelnen Variablen vor und nach der Konvertierung für Werte haben.

--

TheTinySteini
Coder Poke646
"Don't Panic" - Hitchhiker's Guide to the Galaxy

zum Seitenanfang zum Seitenende Profil || Suche
003
16.02.2001, 15:48
DarKnight



"du kannst sogar schreiben int intvar = float_var"

sicher gibt das ne warnung und es ist auch kein guter programmierstil. also wie kriz schon sagte wird einfach die nachkommastelle bei int a = int(float b); abgeschnitten. das muss gehen. ausserdem ist es meines wissens nach die einzige schnelle möglichkeit float in int zu konvertieren.

Wenn du aber runden willst, ist das net so gut.

--

void CHudSayText :: EnsureTextFitsInOneLineAndWrapIfHaveTo( int line ) -- Aja?

zum Seitenanfang zum Seitenende Profil || Suche
004
16.02.2001, 17:29
Oheim



Hm, also ich caste sie nach int über
int intvar = (int)floatvar...

In der floating point var stehen am Anfang recht große Werte von 0 bis 90,
in der int variablen stehen hinter Potenzen von 2: 1, 2, 4, 8, 16, 32; 32 ist der Größte...

--

www.darkconspiracymod.de

zum Seitenanfang zum Seitenende Profil || Suche
005
17.02.2001, 14:01
Kriz



Zum zweiten Mal: HÄ?

Verstehe ich das richtig? In FLOATVAR steht z.B. 88.0 und nach der Typumwandung steht in INTVAR z.B. 16?

Ey, Alter, ich glaube, dein Compiler ist im Arsch...

Cu

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
006
17.02.2001, 15:06
feigling



Vielleicht verstehe ich die Frage falsch, aber ich könnte mir vorstellen, dass wenn er ne float Zahl hat, sagen wir mal 4,683 hat, dass er dann eine int Variable mit dem Wert mit der vier, dann eine int Variable mit der 6, eine mit der 8 und eine mit der 3 hat. So dass man die Zahlen nach den Komma in jeweils ein int Variable schreiben kann.
So könnte ich mir seine Frage vorstellen.
Falls ich mich irre, sorry !

--

zum Seitenanfang zum Seitenende Profil || Suche
007
17.02.2001, 15:49
Oheim



@Kriz, jep genauso läuft das...
Ich hab nen Vector in der client.dll, dessen Koordinaten ich in ints umwandeln möchte...
Hier der Code...

cl_entity_t *player = gEngfuncs.GetLocalPlayer();

vec3_t vecDelta = Vector(0, 1, 0);
vec3_t vecAngleDiff;
VectorAngles(vecDelta, vecAngleDiff);

vecAngleDiff.x -= player->angles.x;
vecAngleDiff.y -= player->angles.y;

char sz[20];
sprintf(sz, "x: %f; y: %f\n", vecAngleDiff.x, vecAngleDiff.y);
ConsolePrint(sz);
// Hier ist alles noch in Ordnung

int angx = (int)(vecAngleDiff[0]);
int angy = (int)(vecAngleDiff[1]);

sprintf(sz, "x: %i; y: %i\n", angx, angy);
ConsolePrint(sz);
// Hier kommt nur noch Quatsch raus...

--

www.darkconspiracymod.de

zum Seitenanfang zum Seitenende Profil || Suche
008
17.02.2001, 19:20
Ducados



was hälst du von:

int angx = (int)(vecAngleDiff.x);
int angy = (int)(vecAngleDiff.y);

--

zum Seitenanfang zum Seitenende Profil || Suche
009
17.02.2001, 20:23
apfelkorn



jepp... eine vektor-variable im hlsdk ist kein array, sondern besteht aus drei member-variablen: x, y und z. Es wird immer ein neuer gesamtwert (was weiß ich wie) berechnet, mit dem man solche kunststücke wie Quellcode:Vector = pev->origin + (gpGlobals->v_forward * units) + (gpGlobals->v_up * units) - (gpGlobals->v_right * units) oder ähnliches anstellen kann. Wer dazu mehr erfahren will, sollte mal beim Wavelength-Forum vorbeischauen und nach Topics übers Thema Fahrzuge nachlesen...

--

zum Seitenanfang zum Seitenende Profil || Suche
010
17.02.2001, 21:12
TheTinySteini



Jo, genau. Es ist allerdings ein bisschen durcheinander im HL-Quellcode. Denn es gibt zwei verschiedene Vektor-Typen. Einmal ein einfaches Array von 3 Floats, die man dann also so anspricht: vector[0...2]
Das ganze nennt sich dann vec3_t.

Dann gibt's noch ne Vektor-Klasse. Da sind dann die ganzen Operatoren überladen und Funktionen wie Length, Crossproduct und Dotproduct implementiert. Bei so einem Vektor ist es dann eben vector.x. Hier kann man dann ganz einfach schreiben: vector3 = vector1 + vector2; mit der ersten Variante müsste man schreiben VectorAdd( vector1, vector2, vector3 )

Tjaja...

[edit]
ups, hab nochmal nachgeguckt, Crossproduct und so sind gar nicht Teil der Klasse Vector, sondern als Inline-Funktionen ausgeführt. Naja. Es sieht übrigens so aus als würde vec3_t per #define immer in Vector umgewandelt. Laut einem Kommentar ist wohl vec3_t das Format eines Vektors in der Engine, deshalb gibt's diesen Typ auch in der Game DLL

--

TheTinySteini
Coder Poke646
"Don't Panic" - Hitchhiker's Guide to the Galaxy

zum Seitenanfang zum Seitenende Profil || Suche
011
17.02.2001, 23:42
Oheim



Jo, ich hab beides ausprobiert (vector[0] und vector.x), aber beides liefert die gleichen Ergebnisse! Am Compiler kanns auch nuich liegen, denn ich benutz VC 5.0, wie VALVE. BITTE HELFT MIR ! *verzweifel...*

--

www.darkconspiracymod.de

zum Seitenanfang zum Seitenende Profil || Suche
012
17.02.2001, 23:57
Hellfire



ich erinner mich gerade so dunkel an eine Funktion in der Vektor Klasse, die sich CopyToArray nennt, die die Membervariablen in einen Array kopieren. Das dürfte wohl auch der Grund sein, dass du sie auch wie einen Array benutzen kannst.

--

zum Seitenanfang zum Seitenende Profil || Suche
013
18.02.2001, 16:27
Another1



es liegt am printf(): nich %i nehmen, %d , irgendwie funzt %i bei MSVC++6 nit soo richtig!

--

Another1

...relaxing..atm =)
... und Schweiz suckt!

zum Seitenanfang zum Seitenende Profil || Suche
014
18.02.2001, 17:30
Oheim



@another1, daran liegt es auch nicht !

--

www.darkconspiracymod.de

zum Seitenanfang zum Seitenende Profil || Suche
015
18.02.2001, 22:16
Another1



Hast du es ausprobiert?

--

Another1

...relaxing..atm =)
... und Schweiz suckt!

zum Seitenanfang zum Seitenende Profil || Suche
016
19.02.2001, 11:28
Kriz



Hmmm... %i is auch noch so ein Relikt aus der Urzeit. Ich glaube sogar, daß %i seit langem schon nicht mehr zum ANSI gehört... Obwohl ich den Sprung eigentlich nie ganz so kapiert habe. Ich meine, mir ist bis heute nicht eingefallen, was das d in %d ausgeschrieben heißen könnte! i is ja klar (integer), aber d?

:-?

Cu

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
017
19.02.2001, 12:42
dp
Administrator


decimal afaik

--

zum Seitenanfang zum Seitenende Profil || Suche
018
19.02.2001, 17:54
Oheim



Auf jedenfall klappt es nicht....

--

www.darkconspiracymod.de

zum Seitenanfang zum Seitenende Profil || Suche
019
19.02.2001, 18:22
anothergb02



hapa hapa :
#define INT_LETTERS 15
static char iIntLetters[INT_LETTERS] = "0123456789,. "; //

void FloatToInt(float _float)
{
char ranpzpo[99];
int iNewint = 0; // fertiger int mit bl Ball
sprintf(ranpzpo,"%f",_float); // wenn das nicht funkt musst du %d benutzen
int ioffset = -1;
bool ffrreturn = false;
int i = 0;
while(ffrreturn == false)
{
// now get the number
int number = -1;
for(int iln = 0; iln < INT_LETTERS && ranpzpo[i] != iIntLetters[iln]; iln ++) {};
if(iln < INT_LETTERS)
{
if(ioffset != -1)
{
// int hopsi = 1;
// for(int wx = iln; wx > 1; wx++) // misst wie kann man hoch schreiben :( hopsi = 10 hoch x ?? Bsp: 10²
// {
// hopsi *= 10;
// };
iNewint *= 100;
iNewint += ioffset;
}
else
{
iNewint *= 100;
}
ffrreturn = true;
continue;
}

i++;
if(iln == 11 || iln == 12)
{
ioffset = i;
}
else
{
iNewint *= 10;
iNewint += iln;
}
}

}

musste nen bissle rumpumsen damit es klappen wird (habe es nicht getestet) und ueber den Huegel zu RUTZFZ springen :P

=> rauskommen sollte ne Zahl bei der die letzten 2 Zahlen fuer die Kommastelle stehen
Bsp:
100221201 => 100221,2
100221291 => 0,0...1002212 // aaaahhhhhhh

wenn du es nicht schaffen soltest dann spring ueber den Huegel und fliege in die SONNE SONNE BUMM BUMM hmm sollte nicht so viele Drogen nehen (currently gar keine!! Bin so fröhlich, weil de Schule wieder angefangen hat und ich nun wieder sterbe)

--

Being in john Malkovich
.....

zum Seitenanfang zum Seitenende Profil || Suche
020
19.02.2001, 19:04
Prefect



OMFG! Himmel hilf sag ich da nur...

Ach ja: kann es sein, dass du einen Pointer von float nach int umgewandelt hast? Dann wird nämlich das interne Format nicht berücksichtigt, und dabei kann eine Menge Unsinn rauskommen.. also völlig andere Zahlenwerte.

cu,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche
021
19.02.2001, 19:13
anothergb02



ja :) ich habe den code auch nicht getestet : ]
schon der Anfang ist falsch fällt mir gerade auf, das muss nicht void sondern int heißen
und dann return iNewint.
Und die Zahlen werden umgedreht huupps
-> 123
1 * 1
2 * 10
3 * 100
=> 321

naja das zu ändern ist kein Problem, hätte wohl lieber noch warten sollen, bis ich das poste (war da nen bissle happy und verwirrt -> wie man schwer erkennen kann)

--

Being in john Malkovich
.....

zum Seitenanfang zum Seitenende Profil || Suche
022
19.02.2001, 19:33
TheTinySteini



btw: 10 hoch 2 schreibt man so:

int c = 10;
c = pow( c, 2 ); //not sure, vielleicht die Parameter andersrum...

--

TheTinySteini
Coder Poke646
"Don't Panic" - Hitchhiker's Guide to the Galaxy

zum Seitenanfang zum Seitenende Profil || Suche
023
20.02.2001, 15:27
anothergb02



dass mit dem Falschherumschreiben der Zahlen stimmt uebrigens nicht :)

--

Being in john Malkovich
.....

zum Seitenanfang zum Seitenende Profil || Suche
024
20.02.2001, 19:18
Oheim



@Prefect:

ne, ist kein Pointer, ich deklariere meinen Vektor local, lasse ihn von VectorAngles füllen und will ihm dann die Werte entnehmen/konvertieren...

BTW: Ich bin so verzweifelt, ich hab gerade schon mal *ernsthaft* [schrecklich] dran gedacht AnotherGB02s Version zu testen... ;)

--

www.darkconspiracymod.de

zum Seitenanfang zum Seitenende Profil || Suche