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

[C++] Przesyłanie do funkcji tablicy dwuwymiarowej o nieznanej wartości

Ostatnio zmodyfikowano 2015-11-14 08:36
Autor Wiadomość
emSon
Temat założony przez niniejszego użytkownika
[C++] Przesyłanie do funkcji tablicy dwuwymiarowej o nieznanej wartości
» 2015-11-13 18:45:28
Cześć.

Mam taki prototyp:
C/C++
int policzSumeWartosciWTablicy( int( * )[ 5 ], int );

Funkcja ta liczy sumę elementów zawartych w tablicy dwuwymiarowej o indeksie drugim '5'. Czy da się zrobić tak, aby liczba ta była wyznaczana przez zmienną?
W przypadku usunięcia tej liczby jest taki błąd:


D:\C++\TEST\main.cpp|6|error: parameter '<anonymous>' includes pointer to array of unknown bound 'int []'|
 
P-140083
1aam2am1
» 2015-11-13 18:58:11
Tak możesz zrobić wskaźnik na zwykłą tablice (int*) i przekazywać ile jest wierszy i kolumn w tejże tablicy.
P-140084
emSon
Temat założony przez niniejszego użytkownika
» 2015-11-13 19:04:43
Możesz podać przykład?
P-140086
Monika90
» 2015-11-13 19:37:12
Oto przykład
C/C++
void f( int * data, int width, int height )
{
}

int main()
{
    int w = 100;
    int h = 200;
    std::vector < int > v( w * h );
    f( v.data(), w, h );
}

ale w pełni poprawnym sposobem byłoby zdefiniowanie klasy Array, albo użycie jakiejś już istniejącej np. z biblioteki boost
P-140088
j23
» 2015-11-13 20:18:26
Można też tak, jeśli tworzysz tablice wielowymiarowe w sposób, nazwijmy to, klasyczny:
C/C++
template < int cols > int policzSumeWartosciWTablicy( int tab[][ cols ], unsigned rows )
{
    cout << "tab[" << rows << ", " << cols << "]\n";
    return 0;
}


/* użycie */
int tab1[ 10 ][ 5 ];
int tab2[ 100 ][ 6 ];
auto tab3 = new int[ 1 ][ 666 ];

policzSumeWartosciWTablicy( tab1, 10 );
policzSumeWartosciWTablicy( tab2, 100 );
policzSumeWartosciWTablicy( tab3, 1 );
P-140095
emSon
Temat założony przez niniejszego użytkownika
» 2015-11-13 22:10:22
Wykombinowałem coś takiego, może być?

C/C++
#include <iostream>
#include <windows.h>
#include <ctime>

using namespace std;

void zapelnijTablice( int ** tablica, int iloscWierszy, int iloscKolumn );

int main()
{
    int iloscWierszy, iloscKolumn;
   
    cout << "Ile wierszy ma miec twoja tablica: __\b\b";
    cin >> iloscWierszy;
   
    cout << "Ile kolumn ma miec twoja tablica: __\b\b";
    cin >> iloscKolumn;
   
    int ** tablica = new int *[ iloscWierszy ];
   
    for( int i = 0; i < iloscWierszy; i++ )
    {
        tablica[ i ] = new int[ iloscKolumn ];
    }
   
    zapelnijTablice( tablica, iloscWierszy, iloscKolumn );
   
    cout << tablica[ 2 ][ 2 ];
   
    for( int i = 0; i < iloscWierszy; i++ )
    {
        delete[] tablica[ i ];
    }
   
    delete tablica;
}

void zapelnijTablice( int ** tablica, int iloscWierszy, int iloscKolumn )
{
    srand( time( NULL ) );
    int liczbaLosowa;
   
    for( int i = 0; i < iloscWierszy; i++ )
    {
        for( int j = 0; j < iloscKolumn; j++ )
        {
            liczbaLosowa = rand() % 100 + 1;
            tablica[ i ][ j ] = liczbaLosowa;
            cout << i << ", " << j << ": " << tablica[ i ][ j ] << endl;
        }
    }
}
P-140096
carlosmay
» 2015-11-13 23:02:40
C/C++
delete tablica;
 zwalniasz tylko pamięć pierwszego elementu tablic.

Wskaźnik możesz dla bezpieczeństwa uczynić pustym.
tablica = NULL;
P-140097
emSon
Temat założony przez niniejszego użytkownika
» 2015-11-14 08:36:57
Dzięki wam ;)
P-140101
« 1 »
  Strona 1 z 1