Seite 1 von 1

c++ fragen zu methoden/funktionen

Verfasst: 19. Februar 2019 15:24
von Djago
Hallo zusammen,

wie immer gibt es fragen die nur Fachleute beantworten könne.

Mein gröstes problem scheint beim verstehen der von mir abverlangten parameter zu sein.

Egal ob bei Qt, SDL2, GLSL usw. immer stoße ich an sachen die ich nicht richtig verstehe.

bsp.

https://doc.qt.io/qt-5/qchart.html

QChart(QGraphicsItem *parent = nullptr, Qt::WindowFlags wFlags = Qt::WindowFlags())

1# QGraphicsItem *parent = nullptr
2# Qt::WindowFlags wFlags = Qt::WindowFlags()

Da ich lesen kann verstehe ich das ich bei 1# ein QGraphicsItem zeiger auf nullptr habe
wenn ich diese funktion jetzt aber nutzen möchte fällt es mir schwer nachzuvollziehen wie und was ich da einfüge
Bei 2# übergebe ich ein Flag oder so . . . . :?

So geht es mir mit fast allen frameworks, bibliotheken.

Meine frage ist jetzt, gibt es lektüren oder eine möglichkeit das besser zu verstehen als die dokumentation die nicht mehr sagt das diese funktion parameter x,y braucht.

bzw. wie kann ich das besser lernen (Tips,Eselbrücke, rückwärts denken usw... würde alles helfen wenn ich wüsste wie :))?

Danke im voraus

Re: c++ fragen zu methoden/funktionen

Verfasst: 19. Februar 2019 20:14
von hilefoks
Sorry wenn ich das so sage, aber dir scheinen noch viele elementare Grundlagen der Programmierung zu fehlen.

Kauf dir ein Buch zur Sprache, es wird nicht das letzte sein das du zum Thema kaufst, und lese es auch mindestens 3/4 durch. Deutschsprachig für C++ scheint dieses https://www.amazon.de/Das-umfassende-Ha ... 836243601/ ganz brauchbar und aktuell zu sein. Ich habe aber jetzt nur mal schnell das Inhaltsverzeichnis gelesen.

Zu deinem Beispiel:

Code: Alles auswählen

int addiere(int a, int b, int c, int d, int e, int f)
{
    return a + b + c + d + e + f;
}
Tolle Funktion zum addieren von 6 Werten, nicht wahr? Kann man so nutzen:

Code: Alles auswählen

int ergebnis = addiere(1,2,3,4,5,6);
Blöd ist nur, das ich immer alle 6 Werte angeben muss, auch wenn ich nur 2 Werte addieren möchte:

Code: Alles auswählen

int ergebnis = addiere(1,2,0,0,0,0);
Das nervt. C++ hat dafür aber mehrere Lösungen. Ich zeige nur zwei.
1. Ich kann die gleiche Funktion mehrfach, aber mit unterschiedlichen Parametern haben:

Code: Alles auswählen

int addiere(int a, int b)  {  return a + b; }
int addiere(int a, int b, int c)  {  return a + b + c; }
int addiere(int a, int b, int c, int d)  {  return a + b + c + d; }
int addiere(int a, int b, int c, int d, int e)  {  return a + b + c + d + e; }
int addiere(int a, int b, int c, int d, int e, int f)  {  return a + b + c + d + e + f; }
Jetzt kann ich auch einfach 2 zahlen addieren:

Code: Alles auswählen

int ergebnis = addiere(1,2);
Für den Benutzer der Funktion schonmal nett, aber für den Entwickler immer noch aufwändig.
2. Ich kann aber auch Standardwerte für die Parameter angeben:

Code: Alles auswählen

int addiere(int a, int b, int c = 0, int d = 0, int e = 0, int f = 0)
{
    return a + b + c + d + e + f;
}
Diese Funktion verlangt jetzt nur 2 Parameter, kann aber 6 Parameter verarbeiten. Gebe ich weniger als 6 Parameter an, werden die anderen mit 0 initialisiert.


Genau das ist bei QChart auch der Fall. Du kannst einen parent angeben, musst es aber nicht und wenn du es nicht tust, dann ist der parent automatisch null (nullptr).

MfG
- Hilefoks

Re: c++ fragen zu methoden/funktionen

Verfasst: 19. Februar 2019 21:03
von veeman
Oft ist es hilfreich den Kontext zu verstehen. Entweder man sucht sich dann entsprechende Bücher, die imho diesen vermitteln sollten, oder man Fragt in unser Zeit in Foren oder beim Support nach.

Bezüglich des Parameters Parent findest du hier eine gute Beschreibung:
https://doc.qt.io/archives/qt-4.8/objecttrees.html

Bezüglich des Parameters Flags findest du unter der entsprechenden Doku auch ein wenig Beschreibung:
https://doc.qt.io/qt-5/qt.html#WindowType-enum
Bei diesem Parameter handelt es sich um Teilweise um Betriebsystemspezfische Funktionen die man sicherlich nicht alle Brauchen wird, wenn überhaupt.
In solch einem Fall lohnt es sich auch mal explizit nach Beispielen zu suchen
(zB. https://doc.qt.io/qt-5/qtwidgets-widget ... ample.html), und mit diesen zu "spielen".

Re: c++ fragen zu methoden/funktionen

Verfasst: 20. Februar 2019 08:52
von Djago
hilefoks hat geschrieben: 19. Februar 2019 20:14 Sorry wenn ich das so sage, aber dir scheinen noch viele elementare Grundlagen der Programmierung zu fehlen.

Kauf dir ein Buch zur Sprache, es wird nicht das letzte sein das du zum Thema kaufst, und lese es auch mindestens 3/4 durch. Deutschsprachig für C++ scheint dieses https://www.amazon.de/Das-umfassende-Ha ... 836243601/ ganz brauchbar und aktuell zu sein. Ich habe aber jetzt nur mal schnell das Inhaltsverzeichnis gelesen.

Zu deinem Beispiel:

Code: Alles auswählen

int addiere(int a, int b, int c, int d, int e, int f)
{
    return a + b + c + d + e + f;
}
Tolle Funktion zum addieren von 6 Werten, nicht wahr? Kann man so nutzen:

Code: Alles auswählen

int ergebnis = addiere(1,2,3,4,5,6);
Blöd ist nur, das ich immer alle 6 Werte angeben muss, auch wenn ich nur 2 Werte addieren möchte:

Code: Alles auswählen

int ergebnis = addiere(1,2,0,0,0,0);
Das nervt. C++ hat dafür aber mehrere Lösungen. Ich zeige nur zwei.
1. Ich kann die gleiche Funktion mehrfach, aber mit unterschiedlichen Parametern haben:

Code: Alles auswählen

int addiere(int a, int b)  {  return a + b; }
int addiere(int a, int b, int c)  {  return a + b + c; }
int addiere(int a, int b, int c, int d)  {  return a + b + c + d; }
int addiere(int a, int b, int c, int d, int e)  {  return a + b + c + d + e; }
int addiere(int a, int b, int c, int d, int e, int f)  {  return a + b + c + d + e + f; }
Jetzt kann ich auch einfach 2 zahlen addieren:

Code: Alles auswählen

int ergebnis = addiere(1,2);
Für den Benutzer der Funktion schonmal nett, aber für den Entwickler immer noch aufwändig.
2. Ich kann aber auch Standardwerte für die Parameter angeben:

Code: Alles auswählen

int addiere(int a, int b, int c = 0, int d = 0, int e = 0, int f = 0)
{
    return a + b + c + d + e + f;
}
Diese Funktion verlangt jetzt nur 2 Parameter, kann aber 6 Parameter verarbeiten. Gebe ich weniger als 6 Parameter an, werden die anderen mit 0 initialisiert.


Genau das ist bei QChart auch der Fall. Du kannst einen parent angeben, musst es aber nicht und wenn du es nicht tust, dann ist der parent automatisch null (nullptr).

MfG
- Hilefoks
Danke für deine Antwort !

Die Grundlagen sind mir schon sehr bekannt.
Vieleicht habe ich auch mich nicht richtig ausgedrückt.

Die von Dir beschriebene sachen sind für mich mehr als verständlich.
Ich vermute das mein problem eher im verstehen von parametern aus anderen bibliotheken liegt.

bsp.
ich versuche mich gerade in GLSL
https://www.khronos.org/opengl/wiki/Shader_Compilation
Bild

die erste funktion glVertexAttribPointer() zeigt wie es richtig ist.
die zweite habe ich blanko angelegt damit mir visual studio zeig was die funktion erwartet.

GLuint index = ein unsignt int index
GLint size = int größe
GLenum type = enum type

ab hier wirds schon nerfig:
GLboolean normalized = bool // was zum teufel bedeutet normalized?
GLsizei stride = sizeof // was meinen die mit stride?

hier ist es dann speziel:
const void* pointer = mir ist hier klar konstanter void zeiger (ein zeiger für alle variablen der sich nicht verändert)
aber wie finde ich heraus das ich das als (void*)offsetof(....) übergebe

Und meine Frage hier ist wie kann ich das was da verlangt wird, besser herausfinden.
Gibt es irgend wie eine Tip oder Trick indem ich das besser lerne.

Freue mich auf Eure anregungen

Re: c++ fragen zu methoden/funktionen

Verfasst: 20. Februar 2019 09:19
von Djago
veeman hat geschrieben: 19. Februar 2019 21:03 Oft ist es hilfreich den Kontext zu verstehen. Entweder man sucht sich dann entsprechende Bücher, die imho diesen vermitteln sollten, oder man Fragt in unser Zeit in Foren oder beim Support nach.

Bezüglich des Parameters Parent findest du hier eine gute Beschreibung:
https://doc.qt.io/archives/qt-4.8/objecttrees.html

Bezüglich des Parameters Flags findest du unter der entsprechenden Doku auch ein wenig Beschreibung:
https://doc.qt.io/qt-5/qt.html#WindowType-enum
Bei diesem Parameter handelt es sich um Teilweise um Betriebsystemspezfische Funktionen die man sicherlich nicht alle Brauchen wird, wenn überhaupt.
In solch einem Fall lohnt es sich auch mal explizit nach Beispielen zu suchen
(zB. https://doc.qt.io/qt-5/qtwidgets-widget ... ample.html), und mit diesen zu "spielen".
Danke für deine Antwort !

Re: c++ fragen zu methoden/funktionen

Verfasst: 20. Februar 2019 10:48
von veeman
Djago hat geschrieben: 20. Februar 2019 08:52 die erste funktion glVertexAttribPointer() zeigt wie es richtig ist.
die zweite habe ich blanko angelegt damit mir visual studio zeig was die funktion erwartet.

GLuint index = ein unsignt int index
GLint size = int größe
GLenum type = enum type

ab hier wirds schon nerfig:
GLboolean normalized = bool // was zum teufel bedeutet normalized?
GLsizei stride = sizeof // was meinen die mit stride?
Als nicht OpenGL und/oder Shader Experte hätte ich schon bei den ersten drei Parametern drei Fragezeichen?
Für was braucht die Funktion Index, Size oder Type und wie sietht da der Wertebereich aus???

Nach einer kurzen Websuche erhalte ich:
index
Specifies the index of the generic vertex attribute to be modified.
size
Specifies the number of components per generic vertex attribute. Must be 1, 2, 3, 4. Additionally, the symbolic constant GL_BGRA is accepted by glVertexAttribPointer. The initial value is 4.
type
Specifies the data type of each component in the array. The symbolic constants GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT, GL_UNSIGNED_SHORT, GL_INT, and GL_UNSIGNED_INT are accepted by glVertexAttribPointer and glVertexAttribIPointer. Additionally GL_HALF_FLOAT, GL_FLOAT, GL_DOUBLE, GL_FIXED, GL_INT_2_10_10_10_REV, GL_UNSIGNED_INT_2_10_10_10_REV and GL_UNSIGNED_INT_10F_11F_11F_REV are accepted by glVertexAttribPointer. GL_DOUBLE is also accepted by glVertexAttribLPointer and is the only token accepted by the type parameter for that function. The initial value is GL_FLOAT.
Zumindest weiß man jetzt was der Wertebereich von size und type ist... was nun für index eingesetzt werden soll weiß ich immer noch nicht; mir fehlt der Context.

Nach einer Websuche für "glVertexAttribPointer example" findet man auch ein relativ einfaches Beispiel:

Code: Alles auswählen

  glBindBuffer(GL_ARRAY_BUFFER, VertexVBOID);
  glEnableVertexAttribArray(0);    // We like submitting vertices on stream 0 for no special reason
  glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(MyVertex), BUFFER_OFFSET(0));      // The starting point of the VBO, for the vertices
  glEnableVertexAttribArray(1);    // We like submitting normals on stream 1 for no special reason
  glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(MyVertex), BUFFER_OFFSET(12));     // The starting point of normals, 12 bytes away
  glEnableVertexAttribArray(2);    // We like submitting texcoords on stream 2 for no special reason
  glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(MyVertex), BUFFER_OFFSET(24));     // The starting point of texcoords, 24 bytes away
Daraus schliesse ich, dass vor der verwendung der Funktion glVertexAttribPointer ich zumindest ein glEnableVertexAttribArray tätigen muss.
Da stell sich nun nochmal die Frage welchen Wertebereich nun index Anehmen kann; dieser hat offensichtlich in glEnableVertexAttribArray und glVertexAttribPointer den selben Wertebereich.

Eine Websuche nach glEnableVertexAttribArray ergibt:
GL_INVALID_VALUE wird generiert, wenn index größer oder gleich GL_MAX_VERTEX_ATTRIBS ist.
Auf der selben Seite findet man dann auch raus dass man den Wert durch einen Aufruf von "glGet" und dem Parameter "GL_MAX_VERTEX_ATTRIBS" rankommt.

Außerdem entnehme ich dem Beispiel, dass size entsprechend der obigen Verwendung auf eine 2D oder 3D Koordinate zielt und der dritte Parameter entsprechend den verwendeten Datentyp darstellt, in demm Fall immer float.
Jetzt wäre sicherlich interessant wann man 1 oder 4 verwendet....
Das Spiel kann man nun mit allen Parametern weiter treiben.

Die Frage ist dann inwiefern man an alle Infos die man wissen möchte auch kommt.
Sollte man die gwünschten Infos nicht finden, muss man entsprechende Foren oder Support Dienste aufsuchen.
Bücher sind sicherlich auch Sinnvoll, aber du wirst wohl im vorfeld nicht wissen ob das jeweilige Buch die gwünschten Informationen beinhaltet.

Re: c++ fragen zu methoden/funktionen

Verfasst: 20. Februar 2019 11:16
von Djago
veeman hat geschrieben: 20. Februar 2019 10:48
Djago hat geschrieben: 20. Februar 2019 08:52 die erste funktion glVertexAttribPointer() zeigt wie es richtig ist.
die zweite habe ich blanko angelegt damit mir visual studio zeig was die funktion erwartet.

GLuint index = ein unsignt int index
GLint size = int größe
GLenum type = enum type

ab hier wirds schon nerfig:
GLboolean normalized = bool // was zum teufel bedeutet normalized?
GLsizei stride = sizeof // was meinen die mit stride?
Als nicht OpenGL und/oder Shader Experte hätte ich schon bei den ersten drei Parametern drei Fragezeichen?
Für was braucht die Funktion Index, Size oder Type und wie sietht da der Wertebereich aus???

Nach einer kurzen Websuche erhalte ich:
index
Specifies the index of the generic vertex attribute to be modified.
size
Specifies the number of components per generic vertex attribute. Must be 1, 2, 3, 4. Additionally, the symbolic constant GL_BGRA is accepted by glVertexAttribPointer. The initial value is 4.
type
Specifies the data type of each component in the array. The symbolic constants GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT, GL_UNSIGNED_SHORT, GL_INT, and GL_UNSIGNED_INT are accepted by glVertexAttribPointer and glVertexAttribIPointer. Additionally GL_HALF_FLOAT, GL_FLOAT, GL_DOUBLE, GL_FIXED, GL_INT_2_10_10_10_REV, GL_UNSIGNED_INT_2_10_10_10_REV and GL_UNSIGNED_INT_10F_11F_11F_REV are accepted by glVertexAttribPointer. GL_DOUBLE is also accepted by glVertexAttribLPointer and is the only token accepted by the type parameter for that function. The initial value is GL_FLOAT.
Zumindest weiß man jetzt was der Wertebereich von size und type ist... was nun für index eingesetzt werden soll weiß ich immer noch nicht; mir fehlt der Context.

Nach einer Websuche für "glVertexAttribPointer example" findet man auch ein relativ einfaches Beispiel:

Code: Alles auswählen

  glBindBuffer(GL_ARRAY_BUFFER, VertexVBOID);
  glEnableVertexAttribArray(0);    // We like submitting vertices on stream 0 for no special reason
  glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(MyVertex), BUFFER_OFFSET(0));      // The starting point of the VBO, for the vertices
  glEnableVertexAttribArray(1);    // We like submitting normals on stream 1 for no special reason
  glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(MyVertex), BUFFER_OFFSET(12));     // The starting point of normals, 12 bytes away
  glEnableVertexAttribArray(2);    // We like submitting texcoords on stream 2 for no special reason
  glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(MyVertex), BUFFER_OFFSET(24));     // The starting point of texcoords, 24 bytes away
Daraus schliesse ich, dass vor der verwendung der Funktion glVertexAttribPointer ich zumindest ein glEnableVertexAttribArray tätigen muss.
Da stell sich nun nochmal die Frage welchen Wertebereich nun index Anehmen kann; dieser hat offensichtlich in glEnableVertexAttribArray und glVertexAttribPointer den selben Wertebereich.

Eine Websuche nach glEnableVertexAttribArray ergibt:
GL_INVALID_VALUE wird generiert, wenn index größer oder gleich GL_MAX_VERTEX_ATTRIBS ist.
Auf der selben Seite findet man dann auch raus dass man den Wert durch einen Aufruf von "glGet" und dem Parameter "GL_MAX_VERTEX_ATTRIBS" rankommt.

Außerdem entnehme ich dem Beispiel, dass size entsprechend der obigen Verwendung auf eine 2D oder 3D Koordinate zielt und der dritte Parameter entsprechend den verwendeten Datentyp darstellt, in demm Fall immer float.
Jetzt wäre sicherlich interessant wann man 1 oder 4 verwendet....
Das Spiel kann man nun mit allen Parametern weiter treiben.

Die Frage ist dann inwiefern man an alle Infos die man wissen möchte auch kommt.
Sollte man die gwünschten Infos nicht finden, muss man entsprechende Foren oder Support Dienste aufsuchen.
Bücher sind sicherlich auch Sinnvoll, aber du wirst wohl im vorfeld nicht wissen ob das jeweilige Buch die gwünschten Informationen beinhaltet.
Erstmal danke das Du dir Zeit genommen hast.

Ich habe auch zwischenzeitlich mit einem unserer Delphi entwickler gesprochen.
Die Antwort vom Entwickler war auch "schau dir die Definition / Deklaration an"
Er hat mir auch erklärt das es meistens hilft zu suchen :geek:

Aber wir kommen immer näher, google, bücher usw. ist alles kein problem.
Die frage ich ich nach wie vor habe ist -> gibt es einen Trick genau solche sachen besser zu verstehen/lernen.

btw. die deutsche erklärung habe ich dann bei Delphi gefunden :roll: :roll:
https://wiki.delphigl.com/index.php/glV ... ribPointer

Und nochmal danke ;)