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

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

1

26.09.2007, 19:49

LNK2019

jaja, der alte bekannter LNK2019

is zwar ein guter bekannter von mir, mögen tu ich den allerdings nicht..

hab den code jetz 10 mal durchgelesen..
ich finde den fehler nicht..

Zitat von »"Compiler"«


Fehler 1 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_main" in Funktion "___tmainCRTStartup". MSVCRTD.lib

Fehler 2 fatal error LNK1120: 1 nicht aufgelöste externe Verweise. Fensterklasse.exe 1


hier der complette code meines progs.. ^^

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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
// M A I N . C P P /////////////////////////////////////

#include "CWindow.hpp"

int __stdcall WinMain(HINSTANCE instance, HINSTANCE prevInstance, char* cmdLine, int show)
{
    return 0;
}

// ////////////////////////////////

// C W I N D O W . C P P 


// I N C L U D E S /////////////////////////////////////

#include "CWindow.hpp"

// C L A S S ///////////////////////////////////////////


// /////////////////////////////////////////////////////

// P R I V A T E ///////////////////////////////////////

WINDOW::WINDOW (void)
{
} // WINDOW()


WINDOW::~WINDOW (void)
{
} // ~WINDOW()


LRESULT CALLBACK WINDOW::WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{ return DefWindowProc (hWnd, msg, wParam, lParam); } // WndProc()


// /////////////////////////////////////////////////////

// P U B L I C /////////////////////////////////////////

void WINDOW::Create (WNDCX* wc)
{
} // Create()


void WINDOW::Show (int cmdShow)
{
} // Show()


void WINDOW::Update (void)
{
} // Update()


int WINDOW::Close (void)
{
    return 0;
} // Close()


// ////////////////////////////////

// C W I N D O W . H P P 


#if !defined (_CWINDOW_HPP_)
#define _CWINDOW_HPP_

// I N C L U D E S /////////////////////////////////////

#include <windows.h>

// S T R U C T S ///////////////////////////////////////

    // WNDCLASSEX

typedef struct _wndclassex {
    UINT        cbSize;
    UINT        style;
    WNDPROC     lpfnWndProc;
    int         cbClsExtra;
    int         cbWndExtra;
    HINSTANCE   hInstance;
    HICON       hIcon;
    HCURSOR     hCursor;
    HBRUSH      hbrBackground;
    LPCTSTR     lpszMenuName;
    LPCTSTR     lpszClassName;
    HICON       hIconSm;
} WNDCX, *PWNDCX;

// C L A S S ///////////////////////////////////////////

class WINDOW
{
    // /////////////////////////////////////////////////

    // P R I V A T E ///////////////////////////////////

private:
        // M e m b e r _ F u n c t i o n s

                        WINDOW          (void);
                        ~WINDOW         (void);
    LRESULT CALLBACK    WndProc         (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);

    // /////////////////////////////////////////////////

    // P U B L I C /////////////////////////////////////

public:
        // M e m b e r _ V a r i a b l e s /////////////

    HWND    hWnd;
    MSG     msg;

        // M e m b e r _ F u n c t i o n s /////////////

    void    Create  (WNDCX* wc);
    void    Show    (int cmdShow);
    void    Update  (void);
    int     Close   (void);
    
}; // class WINDOW


#endif
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

Schnitter

Treue Seele

Beiträge: 141

Wohnort: Remshalden

Beruf: Schüler

  • Private Nachricht senden

2

26.09.2007, 19:52

Kann es sein, dass du noch eine Konsolenapplikation eingestellt hast?

3

26.09.2007, 19:59

Was gibt das bitte? Das ist der schlechteste Programmierstil den ich seit langem gesehen habe. Irgendwie nen bissel abklatsch von Patrick drin, dann nen paar Sachen, auf die nichtmal ein Anfänger kommt so zu machen, usw ^^ Also das ist echt grausig. Und ja der Fehler ist, das du_CONSOLE als Preprozessorparameter gesetzt hast.
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

26.09.2007, 20:23

Zitat von »"Deviloper"«

Das ist der schlechteste Programmierstil den ich seid langem gesehen habe.

:arrow: http://www.seitseid.de

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

26.09.2007, 20:36

Zitat von »"Deviloper"«

Was gibt das bitte? Das ist der schlechteste Programmierstil den ich seit langem gesehen habe. Irgendwie nen bissel abklatsch von Patrick drin, dann nen paar Sachen, auf die nichtmal ein Anfänger kommt so zu machen, usw ^^ Also das ist echt grausig. Und ja der Fehler ist, das du_CONSOLE als Preprozessorparameter gesetzt hast.


Tja, Patrick ist halt für viele Anfänger das A und O in Sache Programmierung! ;)
@D13_Dreinig

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

6

26.09.2007, 20:40

ok jetzt musste ich einstecken..

aber die kritik bekommt ihr nat. zurück:

wenn ihr schon "stil-sünden" entdeckt, dann wäre es nett wenn nach dem geflame ein paar nützliche tipps kommen würden. in sachen programmierstil bzw. oop bin ich mit meinem wissen wie man so schön sagt: "am sand"

also raus damit..
wo genau ist der code scheisse?
her mit den tipps!! weil genau DIE art von hilfe kann ich ziemlich gut gebrauchen wie ihr anscheinend bemerkt habt..

also los, wenn ich bitten darf..
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

7

26.09.2007, 20:49

So beim Überfliegen:

o Keine WinAPI Macros auflösen
o Kommentierung überdenken (deine wirkt irgendwie hässlich und zerreißt den Code)
o Keine typedef structs mehr verwenden
o Daten mehr kapseln (Membervariablen nicht öffentlich verfügbar machen z.B.)
o Const-Correctness beachten
o Referenzen sind Zeigern vorzuziehen
o Keine vorhandenen Strukturen "neu erfinden"
o Unnötigen Code vermeiden

Jo, das war erstmal das was ich beim groben drüberschauen entdecken konnt! :)
@D13_Dreinig

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

8

26.09.2007, 20:55

Zitat von »"David_pb"«

So beim Überfliegen:

1 ) Keine WinAPI Macros auflösen
2 ) Kommentierung überdenken (deine wirkt irgendwie hässlich und zerreißt den Code)
3 ) Keine typedef structs mehr verwenden
4 ) Daten mehr kapseln (Membervariablen nicht öffentlich verfügbar machen z.B.)
5 ) Const-Correctness beachten
6 ) Referenzen sind Zeigern vorzuziehen
7 ) Keine vorhandenen Strukturen "neu erfinden"
8 ) Unnötigen Code vermeiden

Jo, das war erstmal das was ich beim groben drüberschauen entdecken konnt! :)


1 ) welche löse ich da genau auf? falls du jene bei der WinMain meinst, das hab ich nur schnell reinkopiert..
2 ) nya ok, über comments lässt sich streiten..
3 ) das struct hab ich bereits entfernt und verwende WNDCLASSEX
4 ) jo das mit dem kapseln is bei mir eben das problem weil ich in oop einfach nicht wirklich den durchblick habe. das mit den membervariablen: welche genau sollten private sein?
5 ) hä? ^^
6 ) jo, darin fehlts mir auch noch ein wenig an übung.. zu erkennen wann pointer besser sind als referenzen
7 ) erledigt..
8 ) zum beispiel?

danke für die antworten :D
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

9

26.09.2007, 21:20

Soo ...
1) APIENTRY, LPSTR, usw.
2) Nein. Das ist einfach zu viel und z.Teil auch falsch ;)
3) Joa und selbst wenn du es nicht entfernt hättest. typedef struct nutzte man in C, um den Strukturen Namen zu geben. In C++ kannst du einfach den Namen hinter struct angeben.
4) private in dem Fall keine. protected sollte m_hWnd sein. MSG sollte überhaupt keine Membervariable sein. Der Konstruktor sollte public sein. Der Destruktor ebenfalls.
5) Nicht "hä". Funktionen die nichts an den Membervariablen ändern, sind const. Parameter die nicht verändert werden: const.
6) z.B.: du kannst bei create besser const ::WNDCLASSEX& als Parameter nehmen. (s. 5., const correctness)
8) z.B.: Konstruktor, Destruktor usw. ... wenn du jetzt m_hWnd mit NULL initialisieren würdest(Initialisierungsliste) und im Destruktor guckst ob das Fenster existiert und wenn ja es mit DestroyWindow zerstörst, dann ist der Code nicht überflüssig.

Soo. Und bevor du dich nachher wunderst warum das nicht mit Window::WndProc geht, weil WndProc eine Memberfunc ist und das nur geht wenn die statisch ist aber du dann wieder Probleme bekommst, da du dann ja nicht deine Variablen nutzen kannst: Such mal danach im Forum ... hab mal eine fertige Klasse defür hier gepostet ... ist zwar nen bissel alt und nicht nach meinem aktuellen Kenntnisstand verfasst aber was solls ;)
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

10

27.09.2007, 11:09

Zitat von »"Deviloper"«

Soo ...
1 ) APIENTRY, LPSTR, usw.
2 ) Nein. Das ist einfach zu viel und z.Teil auch falsch ;)
3 ) Joa und selbst wenn du es nicht entfernt hättest. typedef struct nutzte man in C, um den Strukturen Namen zu geben. In C++ kannst du einfach den Namen hinter struct angeben.
4 ) private in dem Fall keine. protected sollte m_hWnd sein. MSG sollte überhaupt keine Membervariable sein. Der Konstruktor sollte public sein. Der Destruktor ebenfalls.
5 ) Nicht "hä". Funktionen die nichts an den Membervariablen ändern, sind const. Parameter die nicht verändert werden: const.
6 ) z.B.: du kannst bei create besser const ::WNDCLASSEX& als Parameter nehmen. (s. 5., const correctness)
8 ) z.B.: Konstruktor, Destruktor usw. ... wenn du jetzt m_hWnd mit NULL initialisieren würdest(Initialisierungsliste) und im Destruktor guckst ob das Fenster existiert und wenn ja es mit DestroyWindow zerstörst, dann ist der Code nicht überflüssig.


hmm.. danke für die tipps!
das mit den funktionen die nichts an den memvars ändern:
ich bin das ein bischen gewöhnt Get() und Set() funktionen zu schreiben, ich glaube deshalb hab ich nicht an const gedacht..
wenn ich bei create const::WNDCLASSEX& verwende, welche vorteile hab ich da genau gegenüber der anderen variante?

das mit APIENTRY und LPSTR versteh ich nicht.. wo löse ich da was auf? ^^

jop, das eine oder andere problem hatte ich bereits mit WndProc() ^^

ne letzte frage hab ich noch:

kurze einleitung:
c++ ist so unglaublich umfangreich! es gibt nach meiner auffassung nur wenig grenzen.. im internet findet man tutorials zu ALLEN sachen .. aber eines findet man nicht (oder kaum):
FAUSTREGELN!
mein code sieht so aus, weil ich einfach keine davon kenne.
zb eben: wann ist was protected, private oder publlic?
wann ist ->unbedingt<- const?
es sind so viele kleinigkeiten.. dasselbe mit pointern? wann gibt man ne variable auf den stack, wann übergibt man zeiger?

es sind genau diese dinge die meiner meinung nach "guten code" ausmachen.. aber leider scheine ich nicht in der lage zu sein weiter zu kommen.. an dem punkt steh ich jetz schon ziemlich lange würd ich mal sagen.. ich komme mit meinem "skill" einfach nicht voran..

hast du/habt ihr vllt. ein paar faustregeln für mich? :?
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

Werbeanzeige