2016-11-07 5 views
0

Ich habe zwei Integer-Zeiger, die die Daten für die (SDL) Bildschirme Höhe und Breite in Pixel enthalten. Sie sind hier erklärt:Wie verwende ich den Zeiger?

int *w = nullptr; 
int *h = nullptr; 

Gegebene Werte hier:

int SDL_GetRendererOutputSize(SDL_Renderer* renderTarget, int *w, int *h); 

und verwendet hier:

Dest.w = (*w/2.0f - 58/2.0f, *h/2.0f - 8/2.0f); 
Dest.h = (*w/2.0f - 58/2.0f, *h/2.0f - 8/2.0f); 
Dest.x = (*w/2.0f - 58/2.0f, *h/2.0f - 8/2.0f); 
Dest.y = (*w/2.0f - 58/2.0f, *h/2.0f - 8/2.0f); 

jedoch * w und * h Aufenthalt nullptrs. Warum ist das?

+6

weil Sie ihnen keinen Wert zugewiesen haben? –

+1

rufen Sie 'SDL_GetRendererOutputSize' auf? – pat

+1

Integerzeiger enthalten keine Höhen- oder Breiteninformationen, Ganzzahlen tun dies. –

Antwort

5

In C (und zu einem gewissen Grad in C++) ist es gängige Praxis, dass beim Schreiben einer Funktion, die mehrere Werte zurückgibt, der Aufrufer einen Zeiger auf die Variablen liefern muss, in die die Ausgaben eingefügt werden.

Also, würden Sie diese Funktion wie folgt aufrufen:

int w=0,h=0; 

int result = SDL_GetRendererOutputSize(renderTarget, &w, &h); 
if (result!=0) { 
    // handle an error here 
} 

Beachten Sie, dass w und h normalen Integer-Variablen sind. Ich gebe die Adresse dieser Variablen an SDL_GetRendererOutputSize weiter (der Operator & nimmt die Adresse seines Arguments); Die Funktion setzt vermutlich die Variablen.

Vergessen Sie nicht, den Rückgabewert der Funktion zu konsultieren, die in diesem Fall nicht null ist, wenn ein Fehler aufgetreten ist.

+0

Es ist erwähnenswert, dass die Übergabe eines Zeigers an eine Integer-Variable normalerweise ein Hinweis ist, dass die Funktion diese Variable ändern darf. Dies ist eine alte C-Konvention. – tadman

0

Ich denke, was Sie tun müssen, ist eigentlich zwei ganze Zahlen für die Höhe und Breite zuweisen, dann übergeben Sie die Adresse von ihnen an die Funktion.

int w = 0, h = 0; 
// Tell the function where to put the height and width by passing in the address of the two. 
// Assuming renderTarget is in scope. 
SDL_GetRendererOutputSize(renderTarget, &w, &h); 

Natürlich müssen Sie den Code mit ihnen ändern. Gute Neuigkeiten sind, dass es den Code einfacher macht.

0

Indem Sie sie auf Null setzen, deklarieren Sie sie. Es teilt dem Programm mit, dass es eine Ganzzahl (Zahl) enthalten wird. Macht das seit? Auch ein Zeiger macht genau das, wie er sich anhört. Es zeigt auf das, was Sie am (int) Speicherort gespeichert haben. Wenn Sie also einige Ganzzahlen für die Variablen "w" und "h" eingeben, werden sie angezeigt, wenn Sie den Zeiger verwenden. Der Zeiger zeigt Ihnen einfach an, was an dem Ort gespeichert ist, den Sie ausgewählt haben. Ich hoffe, das macht die Dinge für dich klar!

Verwandte Themen