C++ Array "inline" erzeugen und an Methode übergeben?

OP #7903119
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
}
OP #7903163
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
}
(Firma: Torrox.de) #7903587
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
}
Persönliche Seite #7904292
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.

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

OP #7907465
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!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren