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.

von Rolf M. (rmagnus)


Lesenswert?

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

: Bearbeitet durch User
von Klaus M. (klaus_me)


Lesenswert?

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!

von Rolf M. (rmagnus)


Lesenswert?

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.

von Oliver S. (oliverso)


Lesenswert?

Und wenn er nicht verändert wird, als const&

Oliver

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


Lesenswert?

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.

;-)

: Bearbeitet durch User
von Daniel A. (daniel-a)


Lesenswert?

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