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.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
|