Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Di Mai 14, 2024 18:51

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 26 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
BeitragVerfasst: Fr Apr 05, 2013 14:02 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Hallo, Wölfchen
Wenn Du mir eine abgespeckte Version nochmals hier hereinstellst, könnte ich sie mir heute abend anschauen. Du hast in der Zwischenzeit den Quellcode offensichtlich geändert.
Viele Grüße
Traude


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Apr 05, 2013 16:04 
Offline
DGL Member

Registriert: Do Mär 05, 2009 20:17
Beiträge: 284
Wohnort: Kaiserslautern
Hallo Traude,

ja, ich habe am code gefeilt insgesamt 8 verschiedene Varianten meiner Anwendung gemacht die alle auf ATI bei mir zuhaus laufen (mit glgeterror fehlerfrei), auf der 1800 FX von NVIDIA geht zumindest mein derzeitiger Favorit.. und auf der Quadro 2000 + Quadro 1000M abstürzen..

Geändert habe ich folgendes:

sowohl TVertex als auch TVBOVertexpack sind jetzt packed records.
TIndexBuffer ist jetzt ein gluint und kein Cardinal mehr, weil ich das irgendwo gelesen habe, das gehört so..

Die FillVBO procedure ist noch wie sie hier im ersten Post steht..

und rendern tu ich zur zeit so:
Code:
  1.   begin
  2.     model := TCTB3d(frmMainMPV2.PartManager.Models[TTreeInstanz(frmMainMPV2.partmanager.InstanzList[i]).ModelListIndex]);
  3.     glBindBuffer(GL_ARRAY_BUFFER, model.IDVBO);
  4.  
  5.     glVertexPointer(3,GL_FLOAT,STRIDE,@model.VBOBuffer[0].vertex);
  6.     glNormalPointer(GL_FLOAT,STRIDE,@model.VBOBuffer[0].normal);
  7.  
  8.     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, model.IDIndex);
  9.  
  10.     glpushmatrix;
  11.     glmultmatrixd (@TTreeInstanz(frmMainMPV2.partmanager.InstanzList[i]).resultmatrix);
  12.  
  13.     glEnableClientState(GL_NORMAL_ARRAY);                                       // Normalen Array Modus einschalten
  14.     glEnableClientState(GL_VERTEX_ARRAY);
  15.  
  16.     glDrawElements(GL_TRIANGLES, model.IndexCount,GL_UNSIGNED_int,nil);
  17.  
  18.     glDisableClientState(GL_NORMAL_ARRAY);                                      // Vertex und Normalen Modus verlassen
  19.     glDisableClientState(GL_Vertex_ARRAY);
  20.  
  21.     Finalize(model.IndexBuffer);
  22.     Finalize(model.VBOBuffer);
  23.  
  24.     glpopmatrix;
  25.  
  26.   end;


Wenn ich noch was nachliefern soll einfach sagen! Danke schonmal das du dir Zeit nimmst!!

Wolfgang


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Apr 05, 2013 20:00 
Offline
DGL Member

Registriert: Do Mär 05, 2009 20:17
Beiträge: 284
Wohnort: Kaiserslautern
ich hab den Fehler gefunden!
Hurra! freu hüpf spring!

es war das Finalize! bzw das zu späte Finalize..
Wie ich ja schon im Eingangsposting geschrieben hatte wusste ich von Anfang an nicht wohin damit und habs ans Ende der Renderschleife gepackt, weil es im WIKI dazu nur hiess "noch aufräumen" oder so, da dachte ich das muß hintendran.

In Wirklichkeit gehört es vors Rendern ich machs jetzt bereits beim Laden... und schon läufts auf der NVIDIA Quadro 1000M hier..

Ich hoffe damit ist es dann auch für die Quadro 2000 auf arbeit ok... und für die Intel R Core 7i...

das wär schön...


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Apr 05, 2013 20:02 
Offline
Compliance Officer
Benutzeravatar

Registriert: So Aug 08, 2010 08:37
Beiträge: 460
Programmiersprache: C / C++ / Lua
und ATI akzeptiert das??

ich tu immer wieder gut eine NVIDIA zu haben...

_________________
offizieller DGL Compliance Beauftragter
Never run a changing system! (oder so)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Apr 05, 2013 20:22 
Offline
DGL Member

Registriert: Do Mär 05, 2009 20:17
Beiträge: 284
Wohnort: Kaiserslautern
ATI und auch die FX1800 sowie jeder billige aldi laptop der mir zwischen die finger kam (ok warn nur 2 stück).
im Grunde hats auf mehr rechnern funktioniert, als es nicht funktioniert hat etwa 7:3

Aber mal zurück zu dem Finalize... der Befehl ist mir neu und aus der Hilfe werd ich nicht wirklich schlau...

Zitat:
Wenn auf eine dynamische Variable folgende Bedingungen zutreffen, ist ein Aufruf von Finalize erforderlich, um die Variable vor ihrer Deallozierung zu finalisieren.

Die Variable wird nicht mit der Standardprozedur Dispose (sondern z.B. mit FreeMem) freigegeben.

Die Variable enthält lange Strings, Varianten und Interfaces, die nicht alle leer sind bzw. den Wert Unassigned haben.



Ich hab noch mehr dynamische arrays im code, muß ich die auch finalizen?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Apr 05, 2013 20:57 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Eigentlich muss man dynamische Arrays nie finalizen. Finalize ist für Records, welche mit New o.ä. erzeugt wurden und mit Initialize initialisiert.

grüße

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Apr 05, 2013 23:54 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
@Lord Horazont:
Mit so einer Aussage wär ich vorsichtig:

Zitat aus meinem (zugegeben uralten) Delphi-Handbuch "Object Pascal Sprachreferenz":
Zitat:
Dynamische Array-Variablen sind implizit Zeiger und werden mit derselben Referenzzählung verwaltet wie lange Strings. Um ein dynamisches Array freizugeben,weisen Sie einer Variablen, die das Array referenziert, den Wert nil zu, oder Sie übergeben die Variable an Finalize.


@Wolfgang:
Derzeit benutze ich nur noch FreePascal, und in meinem derzeitigen FreePascal Handbuch scheint zu meiner Überraschung "Finalize" überhaupt nicht mehr auf. Da FreePascal sich immer noch ziemlich streng an Delphi hält, könnte das bedeuten, dass Finalize heutzutage etwas anderes macht als früher. Ich würde jedenfalls vorschlagen, statt des Finalize eine Freigabe-Routine zu benutzen, die in Deiner Delphi-Version für so etwas vorgesehen ist. Da ich Delphi nicht mehr benutze kann ich Dir hier nur sagen, was FreePascal jetzt vorsieht, nämlich SetLength(Variable,0).

Dieses "Finalize" benutze ich, um den normalen RAM-Speicher für das VBO freizugeben. Daher ist es, wenn Du den Inhalt des VBO in den Grafikkartenspeicher (GRAM) geladen hast und dann nicht mehr verändern willst, natürlich möglich, das VBO im normalen RAM nach dem Upload in den GRAM freizugeben. Ich mache das aber normalerweise nicht, denn üblicherweise benutze ich ein rund 4MB großes statisches VBO, wo ich alle meine Sachen reinpacke.

Man kann aber zB. auch Folgendes machen

VBO-Speicher im Ram erzeugen (irgendein dynamisches Array mit Namen "RAMDATA")

For X:= 0 To ichweißnichtwieoft
Daten in das RAMDATA laden
Neuen VBO auf der Gafikkarte (= GRAM) erzeugen (GenVBO VBO_X)
Daten aus dem RAMDATA in den VBO_X im GRAM laden
End //Of ichweißnichtwieoft

Dann darfst Du das RAMDATA natürlich nicht gleich nach dem ersten Upload freigeben, sondern erst, wenn Du mit all Deinen Uploads fertig bist. Das soll heißen, wann man das RAMDATA freigibt hängt davon ab, was man damit macht. Ich mache das z.B. meistens ganz zum Schluß. Es kommt eben darauf an, wie Deine Anwendung arbeitet.

Obwohl ich mich natürlich darüber freue, dass es jetzt bei Dir funktioniert, kann ich nicht wirklich glauben, dass es an dem "Finalize" liegt. Ich sehe mir Deinen Quellcode trotzdem noch an. Jedenfalls habe ich an Deinem Posting gesehen, dass ich offenbar zu wenig Kommentar dazu geschrieben habe.
Viele Grüße
Traude


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Apr 06, 2013 08:04 
Offline
DGL Member

Registriert: Do Mär 05, 2009 20:17
Beiträge: 284
Wohnort: Kaiserslautern
@Traude

Traude hat geschrieben:
For X:= 0 To ichweißnichtwieoft
Daten in das RAMDATA laden
Neuen VBO auf der Gafikkarte (= GRAM) erzeugen (GenVBO VBO_X)
Daten aus dem RAMDATA in den VBO_X im GRAM laden
End //Of ichweißnichtwieoft
Traude


Witzigerweise ist das ja genau der Fall bei mir "ichweißnichtwiegroß" die meshes sind die einer laden will.. darum hab ich dynamische arrays und setze die mit setlength auf die entsprechende größe... bisher hab ich dann genau die arrays genommen und mit vertexarray und normalarray gerendert (ohne VBO)... jetzt mit VBO benutz ich die dinger nur noch um die VBO's zu befüllen und mach danach ein setlength(varray,0) und ein setlength(narray,0)

Traude hat geschrieben:
Obwohl ich mich natürlich darüber freue, dass es jetzt bei Dir funktioniert, kann ich nicht wirklich glauben, dass es an dem "Finalize" liegt. Ich sehe mir Deinen Quellcode trotzdem noch an.
Traude

Ich kann halt nur sagen wie es sich bei mir verhält, und das steht ja schon im Eingagspost, das
Code:
  1. Finalize(IndexBuffer);
war den ATI karten völlig egal ob die zeile im code war oder nicht.. ohne das
Code:
  1. Finalize(VBOBuffer);
kam zwar kein Fehler (ATI) aber gesehen habe ich auch nichts.

Traude hat geschrieben:
Jedenfalls habe ich an Deinem Posting gesehen, dass ich offenbar zu wenig Kommentar dazu geschrieben habe.
Viele Grüße
Traude

Nuja kommt drauf an wen du erreichen willst, ich zähl mich immernoch als Anfänger und ich bin ja auch nur Autodidakt in Delphi, richtig gelernt (schule, studium) hab ich das nie. Mich hat das 4. Nachher reinen Tisch machen einfach in die falsche Richtung gelenkt, für jeden der es besser kann ist das vermutlich sonnenklar.

aber was
Code:
  1. glVertexPointer(4, GL_FLOAT, STRIDE, POS_OFFSET);
in deinem Wiki Beitrag angeht bin ich fast sicher das das es falsch sein müsste, weil es mir den im ersten Post beschriebenen Compilerfehler bringt.
Ich hab in der Wiki zu glVertexPointer zwar gesehen das es für VBO's den offset abbilden soll aber vielleicht wurde das ja geändert? *schulterzuck*


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Apr 06, 2013 20:32 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Zitat:
Geändert habe ich folgendes:

sowohl TVertex als auch TVBOVertexpack sind jetzt packed records.
TIndexBuffer ist jetzt ein gluint und kein Cardinal mehr, weil ich das irgendwo gelesen habe, das gehört so..
Die FillVBO procedure ist noch wie sie hier im ersten Post steht..
Also hier mal die Konstanten analog zu Traudes Vorgehensweise:


Code:
  1.  
  2.     type
  3.       TVertex = record
  4.       VX, VY, VZ: GLfloat;
  5.     end;
  6.      
  7.     type TVBOVertexPack = packed record
  8.       Vertex,
  9.       Normal:TVertex; //Das Original im Wiki hat Position, Color +Platzhalter.. ich habe Vertis und Normis
  10.     end;
  11.      
  12.     TVBOBuffer = array of TVBOVertexPack;
  13.     TIndexBuffer = array of Cardinal; //hier habe ich Cardinal gewählt statt "Word"
  14.      
  15.     const
  16.      
  17.     POS_OFFSET = 0;
  18.     NORM_OFFSET = SizeOf(TVertex); //da ich keinen TVector4D habe nehme ich sizeof(TVertex)
  19.     STRIDE = SizeOf(TVBOVertexPACK);
  20.  

Ich habe mir meine Testanwendung für diesen Artikel aufgehoben. Dort habe ich "POS_OFFSET" und auch den zweiten Offset ebenfalls wie oben angegeben definiert. Ich habe das jetzt nochmal kompiliert, und der FPC-Compiler hat das Pos-Offset akzeptiert, aber das zweite Offset angemeckert. Ich kann mich nicht mehr erinnern, wie es jetzt wirklich war, aber ich hoffe, Du glaubst mir, dass ich nicht absichtlich etwas Falsches ins Wiki geschrieben habe. Jedenfalls hast Du recht: Das Offset ist ein Pointer und sollte so definiert werden:

Code:
  1.     POS_OFFSET = Pointer(0);
  2.     NORM_OFFSET = Pointer(SizeOf(TVertex));
  3.  

Ich werde das im Wiki korrigieren.

Zitat:
In meiner Klasse Model Klasse habe ich dann folgende Variablen zugefügt:


Code:
  1.  
  2.         VBOBuffer : TVBOBuffer;
  3.         IndexBuffer : TIndexBuffer;
  4.         VertexBuffSize,
  5.         IndexBuffSize,
  6.         IndexCount,
  7.         IDVBO,IDINDEX:Cardinal; //alles weitestgehend identisch zum Wiki Beitrag
  8.  

OK


Zitat:
Hiermit befülle ich das VBO aus meinen bisherigen Arrays:


Code:
  1.  
  2.     procedure FillVBO;
  3.     var Anzahl:integer;
  4.     var i: integer;
  5.     begin
  6.       Anzahl := length(model.varray);
  7.       model.indexcount := Anzahl;
  8.       model.VertexBuffSize := model.IndexCount*SizeOf(TVBOVertexPack);
  9.       model.IndexBuffSize := model.IndexCount*SizeOf(Cardinal);
  10.  

Hier nur eine kleine Anmerkung: Normalerweise ist die Anzal der Indices größer als die Anzal der Vertices; das ist der eigentliche Grund, warum man Indices verwendet: sie ermöglichen ein kleineres Modell. Wenn man ein Viereck in Form von zwei Dreiecken rendert, dann hat es 4 Vertices und 6 Indices. Bei großen Modellen macht das ganz schön etwas aus. Aber der Code ist grundsätzlich OK.


Code:
  1.  
  2.      SetLength(model.VBOBuffer,model.IndexCount);
  3.       FillChar(model.VBOBuffer[0],Length(model.VBOBuffer)*SizeOf(TVBOVertexPack),#0);
  4.       for i  := 0 to Anzahl-1 do
  5.       begin
  6.         With model.VBOBuffer[i] do
  7.         begin
  8.           With Vertex do Begin VX := model.varray[i].VX; VY := model.varray[i].VY; VZ := model.varray[i].VZ; End;
  9.           With Normal do Begin VX := model.narray[i].VX; VY := model.narray[i].VY; VZ := model.narray[i].VZ; End;
  10.         end;
  11.       end;
  12.  


Eine kleine Frage: die Daten sind in dem Model schon irgendwie drin, oder? Kann man diese Daten nicht gleich als VBO benutzen? Dann spart man sich das Umspeichern.

Code:
  1.  
  2.      glGenBuffers(1,@model.IDVbo);
  3.       glBindBuffer(GL_ARRAY_BUFFER, model.IDVbo);
  4.       glBufferData(GL_Array_Buffer,model.VertexBuffSize,@model.VBOBuffer[0],GL_STATIC_DRAW);
  5.      
  6.  
  7.       SetLength(model.IndexBuffer,model.IndexCount);
  8.       for i := 0 to Anzahl-1 do
  9.       begin
  10.         model.IndexBuffer[i] := i;
  11.       end;
  12.       glGenBuffers(1,@model.IDIndex);
  13.       glBindBuffer(GL_Element_ARRAY_BUFFER, model.IDIndex);
  14.       glBufferData(GL_Element_ARRAY_BUFFER, model.IndexBuffSize,@model.IndexBuffer[0],GL_STATIC_DRAW);
  15.     end;
  16.  

OK

Zitat:
und rendern tu ich zur zeit so:


Code:
  1.       begin
  2.         model := TCTB3d(frmMainMPV2.PartManager.Models[TTreeInstanz(frmMainMPV2.partmanager.InstanzList[i]).ModelListIndex]);
  3.         glBindBuffer(GL_ARRAY_BUFFER, model.IDVBO);
  4.      
  5.         glVertexPointer(3,GL_FLOAT,STRIDE,@model.VBOBuffer[0].vertex);
  6.         glNormalPointer(GL_FLOAT,STRIDE,@model.VBOBuffer[0].normal);
  7.  

Noch eine kleine Randbemerkung:
An sich stimmt das Offset. Aber Du beziehst Dich dabei auf den RAM-Buffer. Das solltest Du im Gedächtnis behalten. Das Offset sollte aber als Egenschaft des GRAM-Buffers gesehen werden. Das ist ein feiner Unterschied. Denn Du kannst mit Deinem RAM-Buffer weitere GRAM-VBO's befüllen, die ein anderes Vertexformat und somit auch ein anderes Offset haben. Terraindaten z.B. sehen möglicherweise anders aus als Daten für eine Spielfigur. Das heißt, es läuft sich darauf hinaus, dass man sich die Daten, die man fürs Zeichnen braucht, irgendwo merken muss.


Code:
  1.         glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, model.IDIndex);
  2.      
  3.         glpushmatrix;
  4.         glmultmatrixd (@TTreeInstanz(frmMainMPV2.partmanager.InstanzList[i]).resultmatrix);
  5.      
  6.         glEnableClientState(GL_NORMAL_ARRAY);                                       // Normalen Array Modus einschalten
  7.         glEnableClientState(GL_VERTEX_ARRAY);
  8.      
  9.         glDrawElements(GL_TRIANGLES, model.IndexCount,GL_UNSIGNED_int,nil);
  10.      
  11.         glDisableClientState(GL_NORMAL_ARRAY);                                      // Vertex und Normalen Modus verlassen
  12.         glDisableClientState(GL_Vertex_ARRAY);
  13.      
  14.         Finalize(model.IndexBuffer);
  15.         Finalize(model.VBOBuffer);
  16.      
  17.         glpopmatrix;
  18.      
  19.       end;
  20.  

Jetzt ist mir klar, was da passiert ist. Du hast hier in der Renderschleife immer und immer wieder den Speicherplatz für das VBO freigegeben. Dann hast Du klarerweise auch hier recht: die beiden Statements mit dem Finalize müssen aus der Renderschleife entfernt werden. Man könnte das Freigeben des Speicherplatzes - wie gesagt - nach dem Upload machen (vor der Renderschleife) oder bei Programmende.

Ansonsten ist das ganz OK.

Viele Grüße
Traude


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Apr 06, 2013 21:41 
Offline
DGL Member

Registriert: Do Mär 05, 2009 20:17
Beiträge: 284
Wohnort: Kaiserslautern
Traude hat geschrieben:
... ich hoffe, Du glaubst mir, dass ich nicht absichtlich etwas Falsches ins Wiki geschrieben habe. Jedenfalls hast Du recht: Das Offset ist ein Pointer und sollte so definiert werden:

Code:
  1.     POS_OFFSET = Pointer(0);
  2.     NORM_OFFSET = Pointer(SizeOf(TVertex));
  3.  

Ich werde das im Wiki korrigieren.

Klar glaub ich dir :D und ohne deinen tollen Wiki Eintrag hätte ich heute keine VBO's also Danke! Freut mich das ich in Details an Verbesserungen mitwirken konnte. Ich hab das jetzt so geändert bei mir und es funktioniert tatsächlich :D

Traude hat geschrieben:
Eine kleine Frage: die Daten sind in dem Model schon irgendwie drin, oder? Kann man diese Daten nicht gleich als VBO benutzen? Dann spart man sich das Umspeichern.

Das stimmt, kommt einfach daher das ich jetzt ewig schon mit Vertex und Normal arrays gerendert habe... das einmalige umspeichern kostet kaum zeit und den Speicher gebe ich ja danach mit setlength(varray,0) usw frei also kann ich bis auf weiteres damit leben.

Traude hat geschrieben:
Jetzt ist mir klar, was da passiert ist. Du hast hier in der Renderschleife immer und immer wieder den Speicherplatz für das VBO freigegeben. Dann hast Du klarerweise auch hier recht: die beiden Statements mit dem Finalize müssen aus der Renderschleife entfernt werden. Man könnte das Freigeben des Speicherplatzes - wie gesagt - nach dem Upload machen (vor der Renderschleife) oder bei Programmende.


hmm Programmende würde nicht gehen, zumindest bei mir und meiner ATI nicht, die rendert ohne das eine Finalize nicht. Ich habe das jetzt beim Upload drin es wird also einmal vorm ersten Rendern gemacht.

bis bald


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Mai 27, 2013 16:15 
Offline
DGL Member
Benutzeravatar

Registriert: So Sep 26, 2010 12:54
Beiträge: 238
Wohnort: wieder in Berlin
Programmiersprache: Englisch
Finalize ist nicht nur für records.....

generell jedes dynamische array (array of T... array[0..0] of T) lässt sich damit finalizen.

Ich fand nur deine Namensgebung für deine Vertexdaten etwas konfus.

Code:
  1.  
  2. TVertex = record VX, VY, VZ: GLFloat........ end;
  3. TVertexPack = record
  4.   Vertex,
  5.   Norm: TVertex;
  6. end;
  7.  


oder so ähnlich...

passender wäre doch
Code:
  1.  
  2. type
  3.   TVertex = packed record
  4.     Position: TVector3f;
  5.     Normal: TVector3f;
  6.     Color: TVector4f;
  7.     ...
  8.   end;
  9.  
  10.   F(*Vertex*)Data: array of TVertex;
  11.  


das kann man auch beliebig weiter aufdröseln da es ja in der regel mehrere vertex typen gibt ...... VertexPosition, VertexPositionNormal, VertexPositionNormalTexCoord, VertexPositionNormalColorTexCoord usw... damit hat man das dann namentlich ähnlich dem input layout der shader gemapped.

Für die jeweiligen Vertextypen könnte man dann entweder class var oder consts nehmen um den jeweiligen stride oder sizeof festzunageln.

ja? nein? fettnäpfchen?


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 26 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.022s | 19 Queries | GZIP : On ]