2016-04-04 16 views
1

ich IMidiQueue bin mit in die Warteschlange/hinzufügen IMidiMsg Objekte meiner IMidiQueue mMIDICreated;Wie wird die Größe dieses Arrays abgerufen?

An manchen Zeiten, würde Ich mag die Anzahl der Elemente abzurufen ich darauf hinzugefügt haben. Ich habe dies versucht:

char buffer[50]; 
sprintf(buffer, "size %d\n", sizeof(mMIDICreated)/sizeof(IMidiMsg)); 
OutputDebugString(buffer); 

aber nach 8 Hinzufügen von Elementen:

for (int i = 0; i < 4; i++) { 
    IMidiMsg* one = new IMidiMsg; 
    // ... 
    mMIDICreated.Add(one); 

    IMidiMsg* two = new IMidiMsg; 
    // ... 
    mMIDICreated.Add(two); 
} 

es gibt 2 zurück, nicht 8. Wo bin ich falsch?

+0

std :: Ausmaß http://en.cppreference.com/w/cpp/types/extent –

Antwort

3

sizeof wird die Größe des Objekts oder des Typs selbst zurückgeben, es ist eine Konstante und wird zur Kompilierzeit ausgewertet, hat nichts mit der Anzahl der Elemente zu tun, die nur zur Laufzeit bekannt sein könnten.

sollten Sie IMidiQueue::ToDo verwenden:

Gibt die Anzahl der MIDI-Nachrichten in der Warteschlange.

+0

Wow. Ja, das scheint, was ich brauche. Warum heißt es 'ToDo'? Tippfehler? – markzzz

+0

@markzzz Ich weiß es nicht. Die Anzahl der Nachrichten muss verarbeitet werden? – songyuanyao

+1

@markzzz Ich denke, der Autor hat es als eine Arbeitswarteschlange behandelt. Die darin gespeicherten Gegenstände sind Arbeitseinheiten. Wenn Sie arbeiten müssen, dann bekommen Sie 'ToDo'. Übrigens ist diese Klasse ziemlich unnötig. - Es ist eine Prioritätswarteschlange, und man sollte eine von der Stange verwenden, nicht eine von Grund auf schreiben ... ['std :: priority_queue'] (http://en.cppreference.com/w/cpp/container/priority_queue) basierend auf einem 'std :: deque' Container würde funktionieren. –

2

Unter der Annahme, dass mMIDICreated ist ein Zeiger, tun sizeof auf einem Zeiger gibt die Größe des tatsächlichen Zeiger und nicht das, was er zeigt. Beachten Sie auch, dass beim Übergeben eines Arrays an eine Funktion zu einem Zeiger auf sein erstes Element zerfällt.

Wenn eine Funktion die Anzahl der Elemente in einem Array benötigt, müssen Sie diese als Argument an die Funktion übergeben.


Eine alternative Lösung, und eine, die I gegenüber der Verwendung Klar Arrays/Zeigers empfehlen ist std::array (für Arrays, die zum Zeitpunkt der Kompilierung bekannt sind) zu verwenden, und std::vector für „run-time“ oder dynamischen Arrays.

+0

Also jedes Mal, wenn ich ein Element I zu "count" (Speicher) benötigen fügen Sie das Element, das ich in einer Variablen hinzufügen ? – markzzz

+0

@markzzz Ja. Oder verwenden Sie ['std :: vector'] (http://en.cppreference.com/w/cpp/container/vector). –

1

Mit Blick auf Ihren Link:

class IMidiQueue 
{ 
    ... 
    IMidiMsg* mBuf; 
} 

Der Puffer, der die Elemente speichert, ist nicht in der Größe gemacht zurück von sizeof(). Nur die Größe des Zeigers selbst.

Es gibt jedoch auch eine Methode int GetSize(), die für Sie nützlich sein könnte.

Verwandte Themen