Forum: PC-Programmierung C++ Array "inline" erzeugen und an Methode übergeben?


von Klaus M. (klaus_me)


Lesenswert?

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
}

von Scyte R. (scyte)


Lesenswert?

Ohne die Frage gelesen zu haben, nimm std::array<int>.

von Klaus M. (klaus_me)


Lesenswert?

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
}

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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...

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

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
}

von Klaus H. (klummel69)


Lesenswert?

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 )

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Klaus H. schrieb:
> Der Beispielcode von Torsten gibt proc({1,2,3,0}) falsch aus.

Das war, was Klaus M. bestellt hatte.

von Klaus H. (klummel69)


Lesenswert?

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... 🙂

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.