Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Korowai

unregistriert

1

01.10.2016, 14:57

Problem mit Variablenausgabe

Hi,

ich benötige dringend Hilfestellung. Ich habe zu meinem Problem bereits Stunden verbracht und mit diversen Lösungen probiert, aber nix funzt.

Grober Umriss:

Ich habe in einem WInAPI Dialog (modal) in WM_PAINT eine Ausgabeverzweigung, die je nach Booleanischen Werten diverse Variablen ausgibt.
Die WM_PAINT des Dialogs rufe ich in der Folge von den diversen Steuerungs- IDs auf (InvalidateRect und UpdateWindow).

Die beiden Variablen durchlaufen Funktionen bzw. einen Berechnungscode, und die per Return zurückgegebenen Werte werden mittels sprintf in chars geschrieben, um dann mit der TextOut Funktion ausgegeben zu werden. Als Ausgabe erhalte ich eine "0". Aber sowohl Funktionen als auch Ausgabe sind richtig, das habe ich bereits in einem Testprogramm durchgespielt, mit den richtigen Ausgaben.

Falls jemand Zeit hat, schreib mir einfach, was Du von den jeweiligen Codezeilen sehen möchtest, um Dir die GRundlage zu geben, mir vielleicht einen Tipp oder besser noch die Lösung meines Problems zu präsentieren. Ich stehe auf dem Schlauch und bin ratlos.

Danke im Voraus

Anbei die relevanten Codeschnipsel:

Die Teile der WM_PAINT (ich habe mittlerweile die entsprechenden TextOuts sogar in die Steuerungs- ID Programmteile übertragen, um zu sehen, ob der FEhler dort liegt...)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// Beginn WM_PAINT weggelassen
if (Zielauswahl==false)
                {
                    Entfernung=0;
                    sprintf(aEntfernung,"0");
                }
                else if (Zielauswahl==true)
                {
                    memset(&aEntfernung[0],0,sizeof(aEntfernung));
                    sprintf(aEntfernung,"%d",Entfernung);
                };

        if (Waffenwahl==false)
        {
            Rundendauer=0;
            sprintf(aGeschwindigkeit,"0");
            sprintf(aRundendauer,"%d",Rundendauer);
        }
        else if (Waffenwahl==true)
        {
            memset(&aRundendauer[0],0,sizeof(aRundendauer));
            sprintf(aRundendauer,"%d",Rundendauer);
        };
                InvalidateRect(hDlg18,NULL,TRUE);

                hdc=BeginPaint(hDlg18,&ps);
                SetBkMode(hdc, TRANSPARENT);
                GetClientRect(hDlg18, &rect);

                TextOut(hdc, 700,360,"Geschwindigkeit: ", 18);
                TextOut(hdc,900,360,aGeschwindigkeit,strlen(aGeschwindigkeit)+1);
                TextOut(hdc, 700,380,"Rundendauer: ", 14);
                TextOut(hdc,900,380,aRundendauer,strlen(aRundendauer)+1);
                TextOut(hdc, 700,400,"Zielentfernung: ", 17);
                TextOut(hdc,900,400,aEntfernung,strlen(aEntfernung)+1);
                EndPaint(hDlg18,&ps);
            }
            break;


Die ID zur Ermittlung von Entfernung:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
// Beginn der ID weggelassen
iKriegszielplanetauswahl=SendMessage(GetDlgItem(hDlg18, ID_ARSENALZIELAUSWAHL18), LB_GETCURSEL,0,0);

               Kriegszielplanetauslesen=SendMessage(GetDlgItem(hDlg18, ID_ARSENALZIELAUSWAHL18),LB_GETTEXT,iKriegszielplanetauswahl,(LPARAM)Kriegszielauswahl);

               if (Basisnummer0==13&&RestonaGuldon_Spieler0.m_Basisaktiv==true)
                    {
                        Startx=CRestonaGuldon.posx;
                        Starty=CRestonaGuldon.posy;
                    }
                    else if (Basisnummer0==1&&KlendautKlendaut_Spieler0.m_Basisaktiv==true)
                    {
                        Startx=CKlendautKlendaut.posx;
                        Starty=CKlendautKlendaut.posy;
                    }
                    else if (Basisnummer0==9&&AbsariLumos_Spieler0.m_Basisaktiv==true)
                    {
                        Startx=CAbsariLumos.posx;
                        Starty=CAbsariLumos.posy;
                    }
                    else if (Basisnummer0==21&&HysskallMatras_Spieler0.m_Basisaktiv==true)
                    {
                        Startx=CHysskallMatras.posx;
                        Starty=CHysskallMatras.posy;
                    }

                if (strcmp(Kriegszielauswahl,"Restona Guldon")==0)
                    {
                        Zielx=CRestonaGuldon.posx;
                        Ziely=CRestonaGuldon.posy;
                        Entfernung=Entfernungsberechnung(Startx,Starty,Zielx,Ziely);
                    }
                    else if (strcmp(Kriegszielauswahl,"Absari Lumos")==0)
                    {
                        Zielx=CAbsariLumos.posx;
                        Ziely=CAbsariLumos.posy;
                        Entfernung=Entfernungsberechnung(Startx,Starty,Zielx,Ziely);
                    }
                    else if (strcmp(Kriegszielauswahl,"Klendaut Klendaut")==0)
                    {
                        Zielx=CKlendautKlendaut.posx;
                        Ziely=CKlendautKlendaut.posy;
                        Entfernung=Entfernungsberechnung(Startx,Starty,Zielx,Ziely);
                    }
                    else if (strcmp(Kriegszielauswahl,"Hysskall Matras")==0)
                    {
                        Zielx=CHysskallMatras.posx;
                        Ziely=CHysskallMatras.posy;
                        Entfernung=Entfernungsberechnung(Startx,Starty,Zielx,Ziely);
                    }

                Zielauswahl=true;
                InvalidateRect(hDlg18,NULL,TRUE);
                UpdateWindow(hDlg18);
           };
        }
        break;


Die Funktion zur Berechnung der Entfernung (nach dem Prinzip des Abstands zweier Koordinaten xStart/ yStart und xZiel/ yZiel)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
float Entfernungsberechnung(int &Startx,int &Starty,int &Zielx,int &Ziely)
{
    float Entfernungx;
    float Entfernungy;
    float Entfernung;

    Entfernungx=(Zielx-Startx)*(Zielx-Startx);
    Entfernungy=(Ziely-Starty)*(Ziely-Starty);
    if (Entfernungx<0)
    {
        Entfernungx=Entfernungx * -1;
    }
    if (Entfernungy<0)
    {
        Entfernungy=Entfernungy * -1;
    }
    Entfernung=sqrt(Entfernungx+Entfernungy);
    return Entfernung;
}


Ich habe "int Entfernung" bereits als float initialisiert und in der sprintf "%0.f" angegeben. Hat auch nix gebracht.

Hat jemand Vorschläge, was ich noch versuchen kann?

Korowai

unregistriert

2

01.10.2016, 15:00

Zusatz- Deklarationen

Alle Variablen sind in der Eröffnungssequenz des Dialogs als "static" deklariert. Die beiden bools "Waffenwahl" und "Zielauswahl" habe ich inzwischen global deklariert. Hat nix gebracht.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

01.10.2016, 16:41

Abgesehen davon, dass dein Code (sorry) durch und durch vermurkst ist, ist das ein typischer Fall für den Debugger. Setze einen Breakpoint direkt vor die Textausgabe und an andere wichtige Stellen und schau dir dann an, ob deine Variablen die erwarteten Werte haben. Das ist viel sinnvoller und lehrreicher als im Dunkeln zu stochern und irgendwelche Variablen umzudeklarieren. Man kann nicht früh genug lernen mit dem Debugger umzugehen!

PS: Eine quadrierte reelle Zahl kann nicht negativ sein.

Korowai

unregistriert

4

01.10.2016, 20:19

Hi,

danke für den Tip mit dem Debugger.
Zu Deinen Anmerkungen:
Im Gegensatz zu Dir bin ich Autodidakt. Ich hatte/ habe keinen Dozenten, der mir alles vorbetet. Deshalb mag mein sicher noch verbesserungsbedürftiger Code in Deinem angelernten Begriffsverständnis "vermurkst" sein.
Allerdings kann ich mal an dieser Stelle anmerken, dass ich in den 1 1/2 Jahren auch eine Menge gelernt habe. Auch Dank Dir.
Vielleicht kannst Du mir explizit aufweisen, wo der Code "vermurkst" ist, damit ich etwas lernen kann.

Wenn Du Dir die Formel anschaust, mein Lieber, kannst Du feststellen, dass es durchaus möglich ist, dass eine der Variablen negativ und die andere positiv sein kann. Das ergibt durchaus eine negative Zahl. Und aus dieser kann ich keine Wurzel bilden. Sicher gibt es bezüglich der Ermittlung des Abstandes zweier Punkte im (kartesischen?) Koordinatensystem auch andere Möglichkeiten, diesen zu ermitteln. Ich habe mich für die vorliegende Lösung entschieden.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

5

01.10.2016, 20:34

Wenn Du Dir die Formel anschaust, mein Lieber, kannst Du feststellen, dass es durchaus möglich ist, dass eine der Variablen negativ und die andere positiv sein kann.

Nein.
Entfernungx=(Zielx-Startx)*(Zielx-Startx);
Entfernungy=(Ziely-Starty)*(Ziely-Starty);
if (Entfernungx<0)
{
Entfernungx=Entfernungx * -1;
}
if (Entfernungy<0)
{
Entfernungy=Entfernungy * -1;
}

Entfernungx und Entfernungy müssen positiv sein. Egal ob Zielx-Startx oder Ziely-Starty nun positiv oder negativ sind, du quadrierst die Ergebnisse und da kann nur etwas positives bei raus kommen. Die Bedingungen sind also niemals wahr. An sich ist das ja nicht schlimm, der Code ist einfach nur überflüssig.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

01.10.2016, 21:59

Im Gegensatz zu Dir bin ich Autodidakt. Ich hatte/ habe keinen Dozenten, der mir alles vorbetet.

Hatte ich auch nicht. Wie kommst du darauf?
Ich habe mir ebenfalls fast alles selbst beigebracht. In Gegensatz zu dir hatte ich anfangs aber weder Bücher noch Internet, “mein Lieber“ ;) Ich hatte nur ein paar QBASIC-Beispielprogramme und die spärliche Dokumentation. Ich kannte niemanden, der programmieren konnte, den ich hätte um Hilfe bitten können. Und wie gesagt, Internet steckte da noch in den Kinderschuhen, und es hat noch Jahre gedauert, bis wir mal ein 56k-Modem bekamen, wo man noch für jede Minute bezahlen musste und währenddessen niemand telefonieren konnte ...
Was an dem Code alles “vermurkst“ ist, schreibe ich dir morgen vom PC aus.

Korowai

unregistriert

7

02.10.2016, 03:08

Hi. Habt vollkommen recht. Ist murks. Das hab ich übersehen. Kann nur positive Ergebnisse haben.

Ändert aber nix an dem ursprünglichen problem. Vielleicht schauen wir da mal drauf wenn ihr Zeit habt und wir mit dem üblichen fertig sind. Danke.

Ciao

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

8

02.10.2016, 07:54

Wie gesagt: Nutze den Anlass, um dich mit dem Debugger vertraut zu machen. Wie du vorgehen solltest, habe ich ja schon geschrieben. Es gibt kein nützlicheres Tool beim Programmieren. Wenn du Fragen zum Debugger hast (die sich nicht durch Google beantworten lassen), kannst du sie gerne stellen. Aber das Forum ist nicht dafür gedacht, dass andere deine Arbeit machen. Debuggen gehört nunmal zum Programmieren dazu und macht oft sogar den Großteil davon aus.

Korowai

unregistriert

9

02.10.2016, 09:11

Morgen,

die Funktionen des Debugger ergeben, dass alles in Ordnung ist (abgesehen von dem Murks mit den negativen Vorzeichen ;)). Ich habe die Werte der Klasse nicht ganz korrekt gesetzt, und es fehlt noch eine Kleinigkeit. Das bekomme ich hin. An sich ist die Lösung einfach, aber manchmal ist man einfach betriebsblind. Null ist null, wenn man es dem Programm sagt, abgesehen davon ist Null sowieso Null, auch wenn man denkt, es sollte Eins sein. :wacko:

Danke David, der Vorschlag Debugger war genau das, was ich gebraucht habe. Wußte ehrlich gesagt nicht, was man mit dem Debugger alles machen kann. Sehr gut.

Bis denn,

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

10

02.10.2016, 10:17

Prima! Der Debugger kann noch viel mehr, z. B. automatisch unterbrechen, sobald sich eine bestimmte Variable ändert. Wir können uns glücklich schätzen, denn früher war das alles noch wesentlich mühsamer.

Werbeanzeige