[C++] Przekazanie tablicy dynamicznej do funkcji

0

Witam
Mam ogromną prośbę, nie potrafię sobie poradzić z przekazaniem dynamicznej tablicy do funkcji typu void. Kod programu:
#include<iostream>
#include<cstdlib>
using namespace std;
int i;
void usun(int *tab[], int n);
int main()
{
int n;
cin >>n;
cout <<endl;
int *tab=new int[n];
srand(time(NULL));
for (i=0;i<n;i++){
tab[i]=rand()%100;
cout <<tab[i]<<endl;
}cout <<"taęąćę\n";
usun(tab,n);
return 0;
}
void usun(int *tab[], int n)
{
int licznik=0,a=0;
for(i=0;i<n;i++) {
if (tab[i]>=0)licznik++;
if (licznik==0){ cout <<"tablica pusta"; }
else {
int *tabb=new int[licznik];
for(i=0;i<n;i++)
if (tab[i]>0)
{
tabb[i]= *tab[i]; a++;
}

for (i=0;i<a;i++)
cout <<tabb[i]<<" " ;
cout <<&tabb<<licznik<<endl; }}
}

Błąd który wyrzuca kompilator to: "1a.cc error: cannot convert ‘int*’ to ‘int**’ for argument ‘1’ to ‘void usun(int**, int)’" czyli przy "usun(tab,n);" w linii 17. Jeśli ktoś potrafi zmodyfikować kod na działający czułbym się zobowiązany.
Pozdrawiam

0

Powinno byc void usun(int *tab, int n)

Albo void usun(int **tab, int n)

teraz nie jestem pewny, bo trochę mam na bani :X

0

Niestety obie opcje są nie przynoszą poprawnego efektu. Przy (int tab) wyrzuca:
1a.cc error: invalid conversion from ‘int’ to ‘int

1a.cc error: initializing argument 1 of ‘void usun(int**, int)’

Ja już całkowicie nie mam pomysłu...

0

Formatowanie i znaczniki< code >< /code >

0

Nie przywykłem do for (nie wiedziałem że tutaj jest) z obsługą html odrzucający bbcode. Wcześniej (inny temat) stosowałem [code] i nie zakodowało kodu źródłowego stąd też teraz nie próbowałem. Cały kod:

#include<iostream>
#include<cstdlib>
using namespace std;
int i;
void usun(int **tab, int n);
int main()
{
int n;
cin >>n;
cout <<endl;
int *tab=new int[n];
srand(time(NULL));
for (i=0;i<n;i++){
tab[i]=rand()%100;
cout <<tab[i]<<endl; 
}cout <<"taęąćę\n";
usun(*tab,n);
return 0;
}
void usun(int **tab, int n)
{
int licznik=0,a=0;
for(i=0;i<n;i++) {
if (tab[i]>=0)licznik++;
if (licznik==0){ cout <<"tablica pusta"; } 
else {
int *tabb=new int[licznik];
for(i=0;i<n;i++)  
if (tab[i]>0) 
{ 
tabb[i]= *tab[i]; a++; 
}

for (i=0;i<a;i++) 
cout <<tabb[i]<<" " ;
cout <<&tabb<<licznik<<endl; }}
}

Błąd:

#include<iostream>
#include<cstdlib>
using namespace std;
int i;
void usun(int **tab, int n);
int main()
{
int n;
cin >>n;
cout <<endl;
int *tab=new int[n];
srand(time(NULL));
for (i=0;i<n;i++){
tab[i]=rand()%100;
cout <<tab[i]<<endl; 
}cout <<"taęąćę\n";
usun(*tab,n);
return 0;
}
void usun(int **tab, int n)
{
int licznik=0,a=0;
for(i=0;i<n;i++) {
if (tab[i]>=0)licznik++;
if (licznik==0){ cout <<"tablica pusta"; } 
else {
int *tabb=new int[licznik];
for(i=0;i<n;i++)  
if (tab[i]>0) 
{ 
tabb[i]= *tab[i]; a++; 
}

for (i=0;i<a;i++) 
cout <<tabb[i]<<" " ;
cout <<&tabb<<licznik<<endl; }}
}

Co do drugiej części Twojej odpowiedzi to cały czas szukam jak poprawić błąd, przeglądam inne tego typu programy. Ale jeśli ktoś potrafi mi pomóc to liczę na ten ruch.

0

Proszę o skasowanie powyższego posta, nie mam możliwości edycji.

Nie przywykłem do for (nie wiedziałem że tutaj jest) z obsługą html
odrzucający bbcode. Wcześniej (inny temat) stosowałem [code] i nie zakodowało kodu źródłowego stąd też teraz nie próbowałem. Cały kod:

#include<iostream>
#include<cstdlib>
using namespace std;
int i;
void usun(int **tab, int n);
int main()
{
int n;
cin >>n;
cout <<endl;
int *tab=new int[n];
srand(time(NULL));
for (i=0;i<n;i++){
tab[i]=rand()%100;
cout <<tab[i]<<endl;
}cout <<"taęąćę\n";
usun(*tab,n);
return 0;
}
void usun(int **tab, int n)
{
int licznik=0,a=0;
for(i=0;i<n;i++) {
if (tab[i]>=0)licznik++;
if (licznik==0){ cout <<"tablica pusta"; }
else {
int *tabb=new int[licznik];
for(i=0;i<n;i++)  
if (tab[i]>0)
{
tabb[i]= *tab[i]; a++;
}

for (i=0;i<a;i++)
cout <<tabb[i]<<" " ;
cout <<&tabb<<licznik<<endl; }}
}

Błąd:
1a.cc error: invalid conversion from ‘int’ to ‘int**’
1a.cc error: initializing argument 1 of ‘void usun(int**, int)’

Co do drugiej części Twojej odpowiedzi to cały czas szukam jak poprawić błąd, przeglądam inne tego typu programy. Ale jeśli ktoś potrafi mi pomóc to liczę na ten ruch.

0

Ni wiem ocb. Poniżej masz przykład, który mi się skompilował i działa bez problemu:

#include <iostream>

using namespace std;

void funkcja(int *tab, int n)
{
     for(int i = 0; i < n ; i++)
             cout << tab[i];
     return ;
}

int main()
{
    int n, *tablica;
    cin >> n;
    tablica = new int[n];
    for(int i = 0; i < n; i++)
            tablica[i] = i+5;
    funkcja(tablica, n);
    system("Pause");
    return 0;
}
0

Twój przykład mi pomógł, nie wiem o co chodziło wcześniej, ale pozmieniałem nazwy i parę innych rzeczy i działa. Całość:

#include<iostream>
#include<cstdlib>
using namespace std;
int i;
void usun(int *tab, int n);
int main()
{
int n, *tablica;
cin >>n;
cout <<endl;
tablica = new int[n];
srand(time(NULL));
for (i=0;i<n;i++){
tablica[i]=rand()%100-50;
cout <<tablica[i]<<endl; 
}
usun(tablica,n);
return 0;
}
void usun(int *tab, int n)
{
int licznik=0,a=0, *tabela;
for(i=0;i<n;i++) 
if (tab[i]>0) licznik++; 

if (licznik==0) cout <<"tablica pusta";
else {
tabela=new int[licznik];
for(i=0;i<n;i++)  
if (tab[i]>0) 
{ 
tabela[a]= tab[i]; a++;
}

for (i=0;i<a;i++) 
cout <<tabela[i]<<" " ;
cout <<&tabela<<" "<<licznik<<endl; }
}

Dziękuję Serdecznie!
Pozdrawiam

0

Mnie ten kod wygląda na "uceplusplusowiony" kod C. ;)

Po pierwsze, dlaczego nie ma tu w ogóle wcięć? Zdajesz sobie sprawę z tego, że wcięcia pomagają uniknąć kilku oczywistych (i irytujących początkujących programistów) błędów? Poza tym kod staje się o wiele bardziej czytelny. Porządne IDE sformatuje kod za Ciebie.

W komentarzach zawarłem parę uwag odnośnie kodu:

#include <iostream>
#include <cstdlib>
#include <ctime> // ->[3]

using namespace std;
// - Zobacz: http://www.parashift.com/c++-faq-lite/coding-standards.html#faq-27.5
// aby poczytać dlaczego using namespace std; niekoniecznie jest złe, ale nie jest
// również najlepszym z pomysłów.

int i;
// - Dlaczego właściwie używasz globalnej zmiennej? Nie widzę powodu...
// Poczytaj o zmiennych globalnych http://c2.com/cgi/wiki?GlobalVariablesAreBad

void usun(int *tab, int n);
// - Nazwa tej funkcji jest myląca i zbyt ogólna, usuwasz czyli dealokujesz pamięć?
// Takie właśnie skojarzenie pojawi się komuś kto ten kod przegląda.
// Kod źródłowy powinien być swoją własną dokumentacją, o ile to możliwe...
// Ta funkcja zaś nie usuwa tak naprawdę niczego z podanej tablicy, nie zwraca
// nowej z "usuniętymi" elementami, więc... czemu "usun"?

int main() {
    int n, *tablica;
    // - Deklarowanie zmiennych w jednej linii w ten sposób, bywa uznawane za złą
    // praktykę, szczególnie, jeżeli mieszasz to ze wskaźnikami.
    // - "n" to kiepska nazwa dla zmiennej, jeżeli wyjęta jest z kontekstu.
    // spójrz na: http://everything2.com/title/Use+meaningful+variable+names
    // i: http://everything2.com/title/%2522i%2522+is+a+meaningful+variable+name
    // - [1] To nie C, nie musisz deklarować zmiennych na początku programu.

    cin >> n;
    cout << endl;
    // - std::endl nie tylko wypluwa "\n" ale także wywołuje metodę flush()
    // co ma pewne konsekwencje, lepiej użyć po prostu "\n".
    
    tablica = new int[n];
    // - alokujesz tablicę, ale... -> [2]
    // - ->[1] - mogłeś napisać po prostu:
    // int* tablica = new int[n];

    srand(time(NULL));
    // - error: 'time' was not declared in this scope
    // - [3] funkcja "time()" jest w nagłówku ctime, bez niego nie istnieje...
    for (i = 0; i < n; i++) {
        // - [4] w pętli for możesz zadeklarować nową zmienną lokalną:
        // for (int i = 0; i < n; ++i) {
        // - [5] ++i różni się od i++ - chociaż niemal na pewno zostanie to w tym
        // przypadku zoptymalizowane przez kompilator. ;)
        tablica[i] = rand() % 100 - 50;
        cout << tablica[i] << endl;
    }
    usun(tablica, n);

    // [2] - ...nie sprzątasz po sobie. Gdzie się podziało:
    // delete [] tablica;
    // ?
    return 0;
}

void usun(int *tab, int n) {
    int licznik = 0, a = 0, *tabela;
    // ->[1]
    for (i = 0; i < n; i++)
        // ->[4]
        if (tab[i] > 0) licznik++;

    if (licznik == 0) cout << "tablica pusta";
    else {
        tabela = new int[licznik];
        // ->[1]
        // mogłeś napisać po prostu:
        // int* tabela = new int[licznik]
        
        for (i = 0; i < n; i++)
            // ->[4]
            if (tab[i] > 0) {
                tabela[a] = tab[i];
                a++;
                // ->[5]
            }

        for (i = 0; i < a; i++)
            // ->[4]
            cout << tabela[i] << " ";
        cout << &tabela << " " << licznik << endl;
        // ->[2]
        // wyciek pamięci.
    }

}

1 użytkowników online, w tym zalogowanych: 0, gości: 1