Forum: PC-Programmierung C++ Array "inline" erzeugen und an Methode übergeben?
Hi! Ich bin in C++ nicht so firm. Geht sowas in C++ (inzwischen)
irgendwie?
Ich benutze gcc/g++ 13
1 | include <iostream>
| 2 |
| 3 | void proc(const int arr[])
| 4 | {
| 5 | for (int i = 0; arr[i] != 0; i++)
| 6 | std::cout << arr[i] << " ";
| 7 | std::cout << std::endl;
| 8 | }
| 9 |
| 10 | int main()
| 11 | {
| 12 | const int array[] = {1, 2, 3, 0};
| 13 |
| 14 | proc(array); // Geht!
| 15 | proc({1,2,3,0}); // Geht das irgendwie auch?
| 16 | }
|
Ohne die Frage gelesen zu haben, nimm std::array<int>.
Ok, ich habe aber variable Listen. Aber mit std::vector gehts wohl!
Ts... das kommt davon wenn man in den 80er C gelernt hat und C++ nie
gescheit...
Danke!
1 | #include <iostream>
| 2 | #include <vector>
| 3 |
| 4 | void proc(std::vector<int> arr)
| 5 | {
| 6 | for (auto id = arr.begin(); id != arr.end(); id++)
| 7 | std::cout << *id << " ";
| 8 | std::cout << std::endl;
| 9 | }
| 10 |
| 11 | int main()
| 12 | {
| 13 | std::vector<int> vec{1, 2, 3, 0};
| 14 |
| 15 | proc(vec); // Geht!
| 16 | proc({1,2,3,0}); // Geht auch!
| 17 | }
|
Klaus M. schrieb: 1 | > for (auto id = arr.begin(); id != arr.end(); id++)
| 2 | > std::cout << *id << " ";
|
Oder einfach: 1 | for (int id : arr)
| 2 | std::cout << id << " ";
|
Ob man für sowas dynamische Speicherallkation verwenden will, was
std::vector ja mit sich bringt, ist natürlich ne andere Frage. Bei
"PC-Programmieung" wohl kein allzu großer Haken...
Klaus M. schrieb:
> Hi! Ich bin in C++ nicht so firm. Geht sowas in C++ (inzwischen)
> irgendwie? 1 | #include <iostream>
| 2 | #include <iterator>
| 3 | #include <initializer_list>
| 4 |
| 5 | template < typename Iter >
| 6 | void proc_impl( Iter begin, Iter end )
| 7 | {
| 8 | for ( ; begin != end && *begin; ++begin )
| 9 | std::cout << *begin << " ";
| 10 |
| 11 | std::cout << std::endl;
| 12 | }
| 13 |
| 14 | template < typename T >
| 15 | void proc( const T& v )
| 16 | {
| 17 | proc_impl( std::begin( v ), std::end( v ) );
| 18 | }
| 19 |
| 20 | template < typename T >
| 21 | void proc( std::initializer_list< T > v )
| 22 | {
| 23 | proc_impl( std::begin( v ), std::end( v ) );
| 24 | }
| 25 |
| 26 | int main()
| 27 | {
| 28 | const int array[] = {1, 2, 3, 0};
| 29 | proc(array); // Geht!
| 30 | proc({1,2,3,0}); // Geht das irgendwie auch?
| 31 | }
|
Der Beispielcode von Torsten gibt proc({1,2,3,0}) falsch aus.
Grund ist Zeile 8:1 | for ( ; begin != end && *begin; ++begin )
|
Das Prüfen von *begin bewirkt, dass bei einer 0 im Array die Schleife
abgebrochen wird.
Besser: 1 | for ( ; begin != end; ++begin )
|
Klaus H. schrieb:
> Der Beispielcode von Torsten gibt proc({1,2,3,0}) falsch aus.
Das war, was Klaus M. bestellt hatte.
Torsten R. schrieb:
> Das war, was Klaus M. bestellt hatte.
Sorry, Du hast Recht, so wie er den Beispielcode gebaut hat, fällt die 0
weg.
Ich bezweifle allerdings, dass das auch wirklich seine Intention war.
proc({1,2,3,0,5,2,9,0,3,1}) wird zu proc({1,2,3})
Es geht doch nichts über gescheit formulierte Anforderungen... 🙂
Klaus H. schrieb:
> Torsten R. schrieb:
>> Das war, was Klaus M. bestellt hatte.
>
> Sorry, Du hast Recht, so wie er den Beispielcode gebaut hat, fällt die 0
> weg.
> Ich bezweifle allerdings, dass das auch wirklich seine Intention war.
NULL oder 0 als Ende-Marker wenn die Anzahl der Elemente nicht bekannt
ist, ist so unüblich nicht. Im originalen Code war genau das der Fall,
d.h. proc() hatte keine andere Möglichkeit das Ende des Arrays zu
erkennen.
Johann L. schrieb:
> NULL oder 0 als Ende-Marker wenn die Anzahl der Elemente nicht bekannt
> ist, ist so unüblich nicht.
getchar benutzt z.B. EOF (-1) als Endezeichen. Damit trotzdem jeder
8Bit-Wert gelesen werden kann, wird der Rückgabewert von unsigned char
nach int gecastet.
Peter D. schrieb:
> Johann L. schrieb:
>> NULL oder 0 als Ende-Marker wenn die Anzahl der Elemente nicht bekannt
>> ist, ist so unüblich nicht.
>
> getchar benutzt z.B. EOF (-1) als Endezeichen.
getchar iteriert aber nicht über ein Array. Es gibt EOF zurück, wenn
stdin geschlossen wurde.
Peter D. schrieb:
> Damit trotzdem jeder 8Bit-Wert gelesen werden kann, wird der Rückgabewert
> von unsigned char nach int gecastet.
EOF muss nicht zwingend -1 sein nach standard. Es muss nur negativ sein.
Es ist auch nicht garantiert, dass es keinen gültigen Wert für char
darstellt. Deshalb gibt es zusätzlich die Funktion feof().
Torsten R. schrieb:
> Das war, was Klaus M. bestellt hatte.
Korrekt, die "0" ist kein Inhalt, der regulär vorkommt und soll als
Endmarker herhalten. Mir ist inzwischen klar, dass ich das gar nicht
brauche und verwende es auch nicht mehr: 1 | void RenderArea::drawNote(QPainter *painter, enum NH nh, int32_t xs, int32_t n, int32_t vel, std::vector<int> check_notes)
| 2 | {
| 3 | ...
| 4 | if (check_notes.empty() == false)
| 5 | {
| 6 | // Step through all the notes
| 7 | for (int chk_note : check_notes)
| 8 | {
| 9 | ...
| 10 | }
| 11 | }
| 12 | }
|
Danke an alle Beteiligten!
Klaus M. schrieb:
> void RenderArea::drawNote(QPainter *painter, enum NH nh, int32_t xs,
> int32_t n, int32_t vel, std::vector<int> check_notes)
Du solltest dir überlegen, den vector per Referenz zu übergeben, denn
sonst wird er jedes mal für den Funktionsaufruf komplett in einen neuen
vector kopiert.
Und wenn er nicht verändert wird, als const&
Oliver
Und wenn wir schon beim Code-Review sind:
- Den unnötigen Test auf .empty() weg lassen, weil überflüssig.
- Den ! Operator verwenden, wenn ein boolscher Ausdruck negiert werden
soll.
;-)
Die C variante wäre: proc((int[]){1,2,3,0})
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
|