[C++] Przekazanie tablicy dynamicznej do funkcji

Odpowiedz Nowy wątek
janemba
2010-12-15 20:44
janemba
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:17: 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

Pozostało 580 znaków

2010-12-15 20:54

Rejestracja: 11 lat temu

Ostatnio: 6 lat temu

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


Potrzebujesz programy do szkoły/na zaliczenie? Pomocy podczas kolosa lub egzaminu?
Zamów go!

http://proogramy.c0.pl
edytowany 2x, ostatnio: Blood, 2010-12-15 20:57

Pozostało 580 znaków

janemba
2010-12-15 21:02
janemba
0

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

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

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

Pozostało 580 znaków

2010-12-15 21:09
Moderator

Rejestracja: 12 lat temu

Ostatnio: 9 minut temu

0

Formatowanie i znaczniki< code >< /code >


edytowany 1x, ostatnio: hauleth, 2010-12-15 21:10

Pozostało 580 znaków

janemba
2010-12-15 21:20
janemba
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.

Pozostało 580 znaków

janemba
2010-12-15 21:22
janemba
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:17: error: invalid conversion from ‘int’ to ‘int
1a.cc:17: 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.

Pozostało 580 znaków

2010-12-15 21:28

Rejestracja: 11 lat temu

Ostatnio: 6 lat temu

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;
}

Potrzebujesz programy do szkoły/na zaliczenie? Pomocy podczas kolosa lub egzaminu?
Zamów go!

http://proogramy.c0.pl

Pozostało 580 znaków

janemba
2010-12-15 22:01
janemba
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

Pozostało 580 znaków

2010-12-17 00:35

Rejestracja: 11 lat temu

Ostatnio: 3 lata temu

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.
    }

}

Pozostało 580 znaków

Odpowiedz

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