Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Przekazanie danych do funkcji (analogicznie do przesyłania napisu)

Ostatnio zmodyfikowano 2017-01-24 18:59
Autor Wiadomość
Nazgul
Temat założony przez niniejszego użytkownika
Przekazanie danych do funkcji (analogicznie do przesyłania napisu)
» 2017-01-24 16:12:28
Napiszę najpierw dwa przykłady
1:
C/C++
void foo( const char * napis )
{
    printf( "%s", napis );
    delete[] napis;
}

int main() {
    foo( new char[ 12 ] { 'a', 'l', 'a', ' ', 'm', 'a', ' ', 'k', 'o', 't', 'a', '\0' } );
    system( "pause" );
    return 0;
}

2:
C/C++
void foo( const char * napis )
{
    printf( "%s", napis );
}

int main() {
    foo( "Ala ma kota" );
    system( "pause" );
    return 0;
}

Przykład 1: trzeba ręcznie usunąć pamięć tablicy.
Przykład 2: kompilator automatycznie usuwa pamięć tablicy.

Następny przykład(podobny do przykładu nr 1:

C/C++
void foo( const int * dane )
{
    int suma = 0;
    for( unsigned int i = 0; dane[ i ] != 0; i++ )
         suma += dane[ i ];
   
    printf( "%i", suma );
    delete[] dane;
}

int main() {
    foo( new int[ 5 ] { 1, 8, - 2, 4, 0 } );
    system( "pause" );
    return 0;
}

Czy jest sposób, żeby w podobny sposób do przykładu nr 2 przesłać tablice np. intów?
P-156863
carlosmay
» 2017-01-24 16:21:11
P-156864
Nazgul
Temat założony przez niniejszego użytkownika
» 2017-01-24 17:37:49
Naprawdę, to że pytanie jest z wiedzy podstawowej, nie znaczy że ktoś nie potrafi podstaw.

Przeczytałem cały artykuł i tam nie ma nic wspomnianego o tym o co pytałem.

Chodzi o samą wygodę w wywoływaniu funkcji.

Zapis
C/C++
foo( new int[ 5 ] { 1, 2, 3, 4, 5 } );
foo( new char[ 12 ] { 'a', 'l', 'a', ' ', 'm', 'a', ' ', 'k', 'o', 't', 'a', '\0' } );
jest o tyle zły, że
a) używa operatora new, przez co sprawia wrażenie jakby był wyciek pamięci
b) wydaje się że można do tablicy przekazać tablicę statyczną
c) w momencie jak się utworzy dynamiczną tablicę, którą dopiero potem się prześle do funkcji, to funkcja ją usuwa.

dlatego żeby czytelność kodu była dobra, jeżeli jest jakiś sposób typu
C/C++
foo( int { 1, 2, 3, 4, 5 } );
//tak jak jest:
foo( "Ala ma kota" );
to będę bardzo wdzięczny za odpowiedź
P-156868
jankowalski25
» 2017-01-24 17:52:17
std::initializer_list (wymaga C++11).
P-156869
Nazgul
Temat założony przez niniejszego użytkownika
» 2017-01-24 18:29:18
Super!:) Dziękuję

A tak jeszcze się dodatkowo spytam, jak twórcy tej biblioteki sprawili, że kompilator rozumie taki zapis ("foo({.., .., ..,});")?
Ostatnio mocno interesuje mnie abstrakcją w programowaniu, tworzeniem w pewien sposób interfejsu dla programisty w taki sposób, żeby nie miał żadnych wątpliwości jak się tego używa.
P-156872
jankowalski25
» 2017-01-24 18:44:10
jak twórcy tej biblioteki sprawili, że kompilator rozumie taki zapis
To jest w standardzie, ręcznie (chyba) się takich rzeczy samemu nie zrobi.

Dopisano:
Jednak da się, ale składnia jest nieco mniej wygodna. Trzeba napisać własną klasę i przeciążyć odpowiednie operatory (między innymi
operator ,
).

Wtedy wywołanie funkcji może wyglądać na przykład tak:
f(( MyIntegers( 1 ), 2, 3, - 5 ) );
P-156873
Nazgul
Temat założony przez niniejszego użytkownika
» 2017-01-24 18:59:58
Dziękuję bardzo za pomoc
Wooo Teraz, po dopisce "jednak da sie..." już tak bardzo bardzo dziękuję za pomoc, to jest właśnie to czego szukałem!;D
P-156874
« 1 »
  Strona 1 z 1