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

[C++]Przkazanie przez referencje

Ostatnio zmodyfikowano 2016-05-29 01:31
Autor Wiadomość
koniol
Temat założony przez niniejszego użytkownika
[C++]Przkazanie przez referencje
» 2016-05-24 19:41:05
Wyświetla mi sie blad nie mam pojecia dlaczego

Chce przekazać oryginalna tablice do funkcji wypisz_tab i tam ja wyswietlic
C/C++
using namespace std;
string tab[ 9 ];

void wypisz_tab( string & tab[] ) {
    for( int i = 1; i <= 9; ++i )
    {
        tab[ i ] = i + 48;
        if(( i - 1 ) % 3 == 0 )
             cout << endl;
       
        cout << tab[ i ];
    }
}


int main( int argc, char ** argv ) {
   
    wypisz_tab( tab );
    return 0;
}
P-148547
mateczek
» 2016-05-24 19:45:41
musisz napisać co chcesz zrobić bo kod jest bez sensu !!!
//edit
C/C++
#include<string>
#include<iostream>
using namespace std;

void wypisz_tab( string tab[] ) { //tablica jest wsaźnikiem nie musisz używać referencji
    for( int i = 1; i < 6; ++i ) {
        cout << tab[ i ] << endl;
    }
    //możesz zmienić coś
    tab[ 2 ] = "xxxx";
}

int main() {
    string tab[ 6 ] { "mała", "ala", "ma", "kota", "a Alicja", "ma tygrysa" }; //tablica 6 stringów
    wypisz_tab( tab );
    //funkcja może zmieniać tablicę!!!
    cout << tab[ 2 ] << endl;
    return 0;
}
P-148548
carlosmay
» 2016-05-24 20:00:57
Jeśli chcesz przeliterować słowo to przekaż zmiana string.
String sam w sobie jest tablicą znaków.
P-148549
mateczek
» 2016-05-24 20:33:01
C/C++
#include<iostream>
using namespace std;

void stworz_tab( char * & t ) { //wskaźnik przekazany przez refernencje
    //tablice/wskaźnik przekazujesz przez refernencję. Wtedy i tylko wtedy gdy chcesz zmienić to na co ten wskaźnik pokazuje.
    t = new char[ 6 ]; // tworzymy tablicę znaków i początkowy adres tej tablicy przypisujemy do wskaźnika t
    for( int i = 0; i < 6; i++ ) {
        t[ i ] = i + '0';
    }
   
}

int main() {
    char * tab; //tablica czy wskaźnik to prawie to samo - doczytaj !!!
    //wskaźnik narazie nic nie wskazuje dopiero w funkcji ustawimy mu obiekt do pokazywania
    stworz_tab( tab ); //tutaj już pokazuje bo funkcja stworz tablice przypisze mu pamięć
    for( int i = 0; i < 6; i++ ) {
        cout << tab[ i ] << " "; //normalne wyświetlenie tablicy
    }
    delete[] tab;
}



//uwaga !!!
//tab[0], (tab*) można stosować zamiennie. tab to adres zerowego elementu tablicy!!!
P-148550
Zibby
» 2016-05-27 23:31:23
rozumiem, że chcesz, żeby funkcja wypełniła tablicę i żebyś mógł jej użyć w main?
powinno działać coś takiego

void wypisz_tab( string (& tab)[9] )

btw jak masz tablicę wielowymiarową to nawet w zwykłym przekazaniu jej do funkcji powinieneś określić jej rozmiar
P-148633
mateczek
» 2016-05-29 01:31:03
@Zibby
1. Aby funkcja mogła wypełniać tablicę i abyś mógł tej tablicy używać w "main" nie trzeba wcale referencji wystarczy zwykłe przekazanie
C/C++
void wypisz_tab( string tab[] ) //bo tab jest wskaźnikiem więc zawsze uzyskujesz dostęp do danych.
2. Jedyny racjonalny sposób użycia referenci w stosunku do tablicy jest wówczas, gdy chcesz  stworzoną  w funkcji tablice przypisać do wskaźnika // napisałem to dwa posty wyżej.

3. Co do funkcji i podawania rozmiaru tablicy 2d. To wynika to z faktu że tablica w pamięci jest liniowa

dla kompilatora wygląda tak
1 2 3 4 5 6
kompilator chcąc pobrać element musi znać liczbę kolumn aby wiedzieć jak taką tablice zrozumieć !!!       
1 2 _ 3 4 _ 5 6      //tablica [3][2]
dla tak rozumianej tablicy element[1][1] to cyfra 4
1 2 3 _4 5 6         //tablica [2][3]
dla tak rozumianej tablicy element[1][1] to cyfra 5

kompilator wylicza adres elementu w sposób jak następuje:

adres[wiersz][kolumna] = wiersz*liczbaKolumn+kolumna
dla elementu[1][1] i liczby kolumn=2
1*2+1=3 - będzie to trzeci element tablicy liniowej
dla elementu[1][1] i liczby kolumn=3
1*3+1=4 - będzie to czwarty element tablicy liniowej

minimum przy przekazaniu do funkcji to poniższa deklaracja.
C/C++
void zamiana( int tab[][ 3 ] ) //inne dane są ignorowane
{
    //kod na tablicy 2d
}
P-148666
« 1 »
  Strona 1 z 1