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

Aktuelle Zeit: Do Jul 03, 2025 22:15

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 14 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: c++ Pointer
BeitragVerfasst: Sa Mai 28, 2011 20:08 
Offline
DGL Member

Registriert: Mo Apr 27, 2009 11:19
Beiträge: 35
Hallo liebe Forenmitglieder,

ich habe eine Frage bezüglich Pointern und Arrays. Ich bin etwas verwirrt. Habe von dieser Seite einen Code gefunden um Bsplines zu zeichnen. Möchte diesen für C++ und OpenGL unter Mac umschreiben.
Da ich selber wenig Erfahrungen mit Pointern habe, hier meine Frage:

Die Funktion blend() erwartet ja als ersten Parameter einen Pointer auf ein Array. Es muss ein Array sein, da dieses ja in compute_intervals() berechnet wird und später in compute_point() und blend() wiederverwendet wird.

Ich würde jetzt denken, dass ich in der Zeile blend(k,t,u,v) schreiben müsste blend(k,t,u[k],v), da er doch immer den k-ten Wert aus der Liste nehmen muss. Oder ist das durch diese Schreibweise:blend(k,t,u,v) schon gegeben, dass er hochzählt?

Ich hoffe ihr versteht was ich meine. Bei Bsplines hängen ja auch so viele Sachen voneinander ab und die Programmierung ist nicht so leicht.

Es wäre super-duper-nett, wenn ihr mir helfen könntet.

Dank euch...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: c++ Pointer
BeitragVerfasst: Sa Mai 28, 2011 20:30 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Na schau dir mal die Funktion blend an. Die nimmt als ersten Parameter einen Integer, der wird in der Funktion als Index für das Array verwendet.

greetings

_________________
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  
 Betreff des Beitrags: Re: c++ Pointer
BeitragVerfasst: Sa Mai 28, 2011 21:44 
Offline
DGL Member

Registriert: Mo Apr 27, 2009 11:19
Beiträge: 35
Ah ok, also muss ich krass auf die Benennungen achten, oder. Der Name für das Array muss in allen Funktionen gleich bleiben. Weil ich hab bei meiner Umschreibung ein bisschen die Bezeichnungen geändert.

Vielen vielen Dank... Du hast mir echt einiges an Recherche erspart.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: c++ Pointer
BeitragVerfasst: So Mai 29, 2011 09:48 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Nein, warum sollte der Name gleich bleiben müssen? Namen sind nur Schall und Rauch:
Code:
  1. int getItem(int* array, int index) {
  2.   return array[index];
  3. }
  4.  
  5. int getItem2(int* cookie, int idx) {
  6.   return cookie[idx];
  7. }
  8.  
  9. void main(int argc, char* argv[]) {
  10.   int bla[10];
  11.   printf("%d %d %d", getItem(bla, 0), getItem2(bla, 0), bla[0]);
  12. }

Das wird drei mal die gleiche Zahl ausgeben.

greetings

_________________
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  
 Betreff des Beitrags: Re: c++ Pointer
BeitragVerfasst: So Mai 29, 2011 19:54 
Offline
DGL Member

Registriert: Sa Okt 18, 2008 11:59
Beiträge: 180
"Es wäre super-duper-nett, wenn ihr mir helfen könntet."

Füg noch hyper hinzu und du hast SDH-nett. :D

Also da ich jetzt keine Datei runterladen will (auch wenn nur 2 Kb) und möglicherweise (Sithmeister) Horazont dir schon eine Hilfe gegeben hat, verweis ich einfach mal hierauf (sofern du der englischen Sprache mächtig bist):
http://www.learncpp.com/cpp-tutorial/68 ... rithmetic/

Im Grunde ist der Name eines Arrays bereits ein Zeiger.
Code:
  1.  
  2. int tolleVariable[12] //12 Integers als Array \o/
  3.  
  4. tolleVariable[0] //Integer
  5. tolleVariable //Zeiger
  6.  


BOAH ist das blau für die Indexe schrecklich...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: c++ Pointer
BeitragVerfasst: So Mai 29, 2011 20:10 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
OT:
SDH.Prod hat geschrieben:
BOAH ist das blau für die Indexe schrecklich...

*Indicies, und ich verweise auf diese beiden Threads.

greetings

_________________
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  
 Betreff des Beitrags: Re: c++ Pointer
BeitragVerfasst: So Mai 29, 2011 20:48 
Offline
DGL Member

Registriert: Sa Okt 18, 2008 11:59
Beiträge: 180
OT:

Dann war das 2009 halt "cool", jetzt ist es schrecklich. :D

Vorallem bei dem Hintergrund.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: c++ Pointer
BeitragVerfasst: So Mai 29, 2011 21:58 
Offline
DGL Member

Registriert: Mo Apr 27, 2009 11:19
Beiträge: 35
Danke euch für die Antworten. Jetzt funktioniert die Sache. Der Fehler lag allerdings ganz woanders, aber trotzdem hab ich dann nicht ständig mich mit dieser stelle beschäftigt. Also danke nochmal...

Ich hätte jetzt noch ne andere Frage:
Und zwar wollte ich die BSplines interaktiv zeichnen lassen. Das heißt man kann mit der Maus Kontrollpunkte auswählen und der Bspline wird gezeichnet.

Jetzt habe ich das ungefähr so gemacht:

Code:
  1.  
  2. void mouse (int button, int state, int mx, int my)
  3. {
  4.     #define size 1000
  5.     spline_coor *p_list = 0;
  6.     p_list = new spline_coor[size];
  7.     spline_coor *p_outcome2 = 0;
  8.     p_outcome2 = new spline_coor[101];
  9.    
  10.     if (button==GLUT_LEFT_BUTTON && state == GLUT_DOWN) {
  11.         counter++;
  12.         p_list[counter].x   = mx-(width/2);
  13.         p_list[counter].y   = my-(height/2);
  14.         glPointSize(5);
  15.         glBegin(GL_POINTS);
  16.         glColor3d(1, 0, 0);
  17.         glVertex2i(p_list[counter].x, p_list[counter].y);
  18.         cout << "[" << p_list[counter].x << "," << p_list[counter].y << "]" << endl;
  19.         glEnd();
  20.         bspline(counter, 3, p_list, p_outcome2, 101);
  21.         }      
  22.     }
  23.     glFlush();
  24. }
  25.  


Die Funktion bspline()
Code:
  1.  
  2. void bspline(int n, int d, spline_coor *control, spline_coor *output, int num_output)
  3. {
  4.     int *p_u = 0;
  5.     p_u = new int[n+d+1];
  6.     GLdouble increment, interval;
  7.     interval = 0;
  8.     spline_coor calcxy;
  9.     if (n+2<=d)
  10.     {
  11.         cout << "Not enough controlpoints!";
  12.     }
  13.     else
  14.     {
  15.     knot_vector(p_u, n, d);
  16.     increment = (GLdouble) (n-d+2)/(num_output-1);
  17.     for (int output_index=0; output_index<num_output-1; output_index++)
  18.     {
  19.         compute_spline(p_u, n, d, interval, control, &calcxy);
  20.         output[output_index].x = calcxy.x;
  21.         output[output_index].y = calcxy.y;
  22.         interval = interval + increment;
  23.     }
  24.     output[num_output-1].x = control[n].x;
  25.     output[num_output-1].y = control[n].y;
  26.     delete p_u;
  27.     glBegin(GL_LINE_STRIP);
  28.     for (int i=0; i<num_output; i++)
  29.     {
  30.         glVertex2d(output[i].x, output[i].y);
  31.     }
  32.     glEnd();
  33.     }
  34. }
  35.  


Jetzt hatte ich angenomen, dass ja die Funktion mouse immer von neuem durchlaufen wird und somit auch die Funktion bspline immer von neuem aufgerufen wird. Dadurch müsste sich doch immer mit der Zunahme eines neuen Kontrollpunktes der Bspline neu zeichnen, dachte ich. Es werden aber nur Linien vom Mittelpunkt bis zum jeweiligen Kontrollpunkt gezeichnet.

Irgendwer Ideen?

Vielen Dank schonmal...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: c++ Pointer
BeitragVerfasst: So Mai 29, 2011 23:01 
Offline
DGL Member

Registriert: Sa Okt 18, 2008 11:59
Beiträge: 180
ufff... schaut mir erstmal danach aus das du das mit dem "new" falsch verstanden hast.
http://www.learncpp.com/cpp-tutorial/69 ... nd-delete/

Z.B. würde deine mouse-Funktion immer wieder 1000 neue spline_coor erstellen, p_list würde auf die letzte erstellten 1000 zeigen und die anderen geistern irgendwo lose rum.


Ich tippe mal du benutzt GLUT, indem Falle: die Funktion wird beim drücken und beim loslassen einer Maustaste aufgerufen (es lebe das RedBook).
Lösung: glutMotionFunc(void (*func)(int x, int y));
Die Funktion wird beim bewegen der Maus innerhalb des Fensters ausgelöst (wenn eine oder mehrere Maustasten gedrückt gehalten werden), x und y enthalten dann die Mausposition relativ zum Fenster. (RedBook \o/)

Welche Maustaste(n) gedrückt sind musst du dann mittels glutMouseFunc herausfinden und in einen extra bool speichern der für beide sichtbar ist. (Selbst nachdenken :/)

(Dumme Kommentare in Klammern *yeay*)

Nach weiteren Fehlern hab ich nicht gesucht.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: c++ Pointer
BeitragVerfasst: Di Mai 31, 2011 10:38 
Offline
DGL Member

Registriert: Mo Apr 27, 2009 11:19
Beiträge: 35
Genau da lag der Fehler, dass ich den Pointer mit new erstellt habe.
Jetzt gehts...

Danke...

Habe leider noch ein weiteres Problem, wo ich irgendwie hängen bleibe.

Code:
  1.  
  2. void mouse (int button, int state, int mx, int my)
  3. {  
  4.     #define size 1000
  5.     spline_coor list[size];
  6.     spline_coor *p_list = 0;
  7.     p_list = list;
  8.     spline_coor out[resolution];
  9.     spline_coor *p_out = 0;
  10.     p_out = out;
  11.     if (button==GLUT_LEFT_BUTTON && state == GLUT_DOWN) {
  12.         counter++;
  13.         p_list[counter].x   = mx-(width/2);
  14.         p_list[counter].y   = my-(height/2);
  15.         glEnable(GL_LINE_SMOOTH);
  16.         glEnable(GL_POINT_SMOOTH);
  17.         glEnable (GL_BLEND);
  18.         glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  19.         glHint (GL_LINE_SMOOTH_HINT, GL_NICEST);
  20.         glHint (GL_POINT_SMOOTH_HINT,GL_NICEST);   
  21.         glPointSize(5);
  22.         glBegin(GL_POINTS);
  23.         glColor3d(1, 0, 0);
  24.         glVertex2i(p_list[counter].x, p_list[counter].y);
  25.         glEnd();
  26.         bspline(counter, 7, p_list, p_out, resolution);
  27.         glDisable(GL_LINE_SMOOTH);
  28.         glDisable(GL_POINT_SMOOTH);
  29.         glDisable(GL_BLEND);
  30.         glutPostRedisplay();
  31.         glFlush();
  32.     }
  33. }
  34.  


Und zwar besteht das Problem darin, dass wenn ich glutPostRedisplay() aufrufe meine Splinekurve zwar verändert/ erneuert wird (Man sieht die alte kürzere Kurve nicht mehr), jedoch sieht man meine Punkte dann auch nicht mehr aus p_list. Diese verschwinden und man sieht immer nur den letzten, was ja auch logisch ist. Wenn ich glutPostRedisplay() weglasse sieht man zwar die Kontrollpunkte aus p_list, jedoch sieht man auch alle alte Kurven. Es werden die alten Kurven mit der neuen Kurve übermalt.
Wie könnte ich es schaffen, dass glutPostRedisplay() nur für die Funktion bspline() gilt und alles andere unverändert lässt. Geht das?

Danke schonmal


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: c++ Pointer
BeitragVerfasst: Di Mai 31, 2011 16:45 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Guter Plan wäre, deine Punkte mal nicht als lokale Variable der mouse-Funktion zu halten. Außerdem würde sich eine dynamischere Datenstruktur (die C++ Stdlib hat da z.B. das Vector-Template, siehe Dokumentation) anbieten, sonst kannst du nie mehr als 100 Punkte haben.
So wie du es jetzt hast, wird bei jedem aufruf von mouse ein neues Array erzeugt (p_list) wo du dann von neuem Punkte reinschreibst. Lokale Variablen bleiben nicht über Funktionsaufrufe hinweg erhalten!

greetings

_________________
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  
 Betreff des Beitrags: Re: c++ Pointer
BeitragVerfasst: Di Mai 31, 2011 17:08 
Offline
DGL Member

Registriert: Sa Okt 18, 2008 11:59
Beiträge: 180
... ausser du schreibst static davor.

"HÄ?"

Lokale Variablen bleiben nicht über Funktionsaufrufe hinweg erhalten ...
... ausser du schreibst static davor.


Im Grunde ist dies ebenfalls überflüssig:
Code:
  1.     spline_coor *p_list = 0;
  2.     p_list = list;
  3.  
  4. //gleichbedeutend wie:
  5.     spline_coor *p_list = list;
  6.  
  7. //gleichbedeutend wie:
  8.     list; //list ist nämlich bereits ein Zeiger vom Typ spline_coor

Das nur nebenbei.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: c++ Pointer
BeitragVerfasst: Mi Jun 01, 2011 11:20 
Offline
DGL Member

Registriert: Mo Apr 27, 2009 11:19
Beiträge: 35
Hm...also ich habe beides ausprobiert, aber der Effekt bleibt leider der Gleiche.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: c++ Pointer
BeitragVerfasst: Mi Jun 01, 2011 11:37 
Offline
DGL Member

Registriert: Mo Apr 27, 2009 11:19
Beiträge: 35
Oh Mann, ich habs jetzt rausgefunden. War ne schwere Geburt. Ich muss die Kontrollpunkte einfach schon in der Funktion compute_point() zeichnen lassen, dann komm ich gar nicht in Konflikt mit glutPostRedisplay.
Aber ich danke euch trotzdem für alle Denkanstöße und Hilfen...
Ist immer hilfreich :wink:


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 14 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


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.014s | 18 Queries | GZIP : On ]