[C++] "->"-Operator

04/10/2008 18:38 CracKPod#1
Hey,
Ich probiere grade nen kleinen PixelBot zu schreiben.

Folgendes habe ich jetzt aus Testgründen geschrieben:

Code:
#include <iostream>
#include <windows.h>

using namespace std;

int main()
{
    LPPOINT CursorPos;
    while(true)
    {
        Sleep(100);
        GetCursorPos(CursorPos);
        cout << CursorPos.x << endl;
        cout << CursorPos.y << endl;
    }
}
ne LPPOINT struct deklariert und dann diese mit GetCursorPos in der Schleife gefüllt. Jetzt bekomme ich aber nen error wenn ich mit dem Zugriffsoperator auf die Variablen der struct zugreifen will.

"`x' has not been declared"
"request for member of non-aggregate type before '<<' token "
"`y' has not been declared"
"request for member of non-aggregate type before '<<' token "

Da ich ziemlich neu in C++ bin weiß ich nicht was das bedeutet. Daraufhin habe ich mir den Source eines anderen PixelBots angeschaut und dieser realisiert das so:

Code:
int GetCursorX() {
    LPPOINT p = new POINT;

    GetCursorPos(p);

    return p->x;
}

int GetCursorY() {
    LPPOINT p = new POINT;

    GetCursorPos(p);

    return p->y;
}
Da sehe ich jetzt den "->" operator. Leider habe ich noch keine Ahnung was der bedeutet bzw. was der macht. Scheint für mich jetzt nen anderer Zugriffsoperator zu sein um auf variablen einer struct/Klasse zuzugreifen.

Seine Methode funktioniert komischerweise.

Also:

Code:
#include <iostream>
#include <windows.h>

using namespace std;

int main()
{
    LPPOINT CursorPos;
    while(true)
    {
        Sleep(100);
        GetCursorPos(CursorPos);
        cout << CursorPos->x << endl;
        cout << CursorPos->y << endl;
    }
}
Startet zwar stellt aber nach der ersten Sekunde ein Problem fest.
Kann mir jemand helfen und mich ein bisschen aufklären?
Klassen und Objekte lerne ich bald in meinem Tutorial.

Danke,
MfG,
CracKPod
04/10/2008 19:53 Forgi#2
Ich glaube des schlägt eine Fehlermeldung, weil dein Programm ein Konsolen-Projekt ist... Probiers mal mit wxWidges, da klappt es zu 100% mit "->"-Operatoren.

Wieso machen sich die meisten Programmierer so viele Umwege, wenns leichter geht :cool:

Naja... zu deinem 2. Zitat: Er hat den Quelltext nich in "Main" geschrieben, sondern direkt nach dem "using namespace std;". Daraufhin muss er in "Main" dies wieder eingebunden haben, da dies sonst nicht laufen würde (Objekt-Orientierte-Programmierung [OOP] - eine schon etwas höhere Programmierung)

Und wenn du sozusagen noch Newbie in C++ bist kannst du auch nicht von Anfang an schon richtige "Bots" basteln. Die laufen meistens auch erst mit einem Script, der dem Programm die Anweisungen gibt; ähnlich wie bei einem Drucker.

Hier mal ein Beispiel zum Ausprobieren (wxWidges):
Code:
//base.h
#ifndef BASIC_H
#define BASIC_H

class MainApp : public wxApp {

    public: virtual bool OnInit();
};

class MainFrame : public wxFrame {

    public:
             MainFrame(const wxChar *title, int xpos, int ypos, int width, int height);
             ~MainFrame();
};
#endif
Code:
//base.cpp
#include <wx/wx.h>
#include "base.h"

IMPLEMENT_APP(MainApp)

bool MainApp::OnInit() {
     
     MainFrame *frame = new MainFrame(wxT("Titel"),50,50,450,300);
     frame[B]->[/B]Show(TRUE);
     SetTopWindow(frame);
     return TRUE;
}

MainFrame::MainFrame(const wxChar *title,
                     int xpos, int ypos,
                     int width, int height)
                     : wxFrame((wxFrame *)NULL, -1, title, wxPoint(xpos,ypos),wxSize(width, height)) { }
                     
MainFrame::~MainFrame() { }
Das "->" sagt in diesem Fall dem Frame, dass er angezeigt werden soll.
04/10/2008 20:38 CracKPod#3
Ehrmm ich bin mir zu 100% sicher das es nicht an den wxWidgets liegt.
Außerdem möchte ich nur die koordinaten meiner Maus rausfinden und da ist es kackegal ob man ne gui hat oder nicht.

"Wieso machen sich die meisten Programmierer so viele Umwege, wenns leichter geht "
Machst du mit deinem wxWidgets-Gekrame nicht mehr Umwege?

"Naja... zu deinem 2. Zitat: Er hat den Quelltext nich in "Main" geschrieben, sondern direkt nach dem "using namespace std;". Daraufhin muss er in "Main" dies wieder eingebunden haben, da dies sonst nicht laufen würde (Objekt-Orientierte-Programmierung [OOP] - eine schon etwas höhere Programmierung)"

Ergab im Zusammenhang mit meiner Frage keinen Sinn.
Und ich weiß was OOP ist. Tut mir leid aber deine Antwort hat mir nicht wirklich weitergeholfen.

MfG,

CracKPod

EDIT:
Scheint mir jetzt ehrlich gesagt nicht so als hättest du Ahnung davon was du da redest srry. Kann aber natürlich auch nur ich sein.

Habe es rausgefunden hängt mit dynamischer Speicherreservierung zusammen und dem Schlüsselwort new. MfG, CracKPod

EDIT2:

So gehts:

Code:
#include <iostream>
#include <windows.h>

using namespace std;

int main()
{
    LPPOINT CursorPosition = new POINT;
    while(true)
    {
        long xold, yold;
        Sleep(1);
        GetCursorPos(CursorPosition);
        if ((CursorPosition->x==xold)&&(CursorPosition->y==yold))
        {
            continue;
        }
        cout << "Cursor @ X: " << CursorPosition->x << endl;
        cout << "Cursor @ Y: " << CursorPosition->y << endl;
        xold = CursorPosition->x;
        yold = CursorPosition->y;
    }
}
Ich habe jetzt leider keine Ahnung wofür der -> gut ist und wofür das Schlüsselwort new steht.
Ich denke new hat was mit der dynamischen Speicherverwaltung zu tun und -> muss man damit im zusammehang benutzen ist wohl nen pointer operator o.ä.

Wäre schon wenn mich jemand aufklärt mfg,
CracKPod
04/11/2008 13:00 CracKPod#4
Verdammt, Danke!

Hat mir sehr geholfen. Wusste nicht das wenn man eine struct dynamisch anlegt auch alle variablen in dieser struct nur Zeiger sind.

MfG,
CracKPod