problem z zakresem tablicy jako parametrem funkcji

Odpowiedz Nowy wątek
2012-06-30 11:36
0

cześć wszystkim mam problem z funkcja której przekazuje zakres tablicy oto jej wstepna wersja


int wypelnij (const int *begin, const int *end)
{    

    const int *i;
    for (i=begin; i<end; i++)
        cout<< "Podaj wartosc ";       

}

problem polega na tym ze chciałbym w funkcji utworzyć tablice do której użytkownik wczytałby wartości wiec proszę o podpowiedz jak utworzyć taka tablice w funkcji na podstawie tych 2 wskazników zakresu i jak odwolywać się do poszczególnych elementów zeby móc ja wypelnić jakimis wartościami

Pozostało 580 znaków

2012-06-30 12:05
0

jak tu (w funkcji) utworzysz tablice to ona zginie zaraz po tej funkcji. Najlepiej przekaż w parametrze tablice która ma być uzupełniana.

i nie rób tak
const int * i = begin.
Bo tym poleceniem przepisujesz i po prostu adres begin (więc działasz na tablicy z parametru).

Ja bym przekazał zamiast dwóch wskaźników liczbę ile jest tych elementów bo teraz musisz na podstawie tych dwóch wskaźników zobaczyć ile jest wartości w tej tablicy czyli

int count = 0
for (;begin < end ; begin++)
  count++;

int tablica[count];
begin -=count //żeby ustawić znowu wskaźnik na początek

zresztą jak tworzyć coś takiego
const int *i;
to Ty już tam nic nie wpiszesz.

edytowany 2x, ostatnio: fasadin, 2012-06-30 12:12
da sie wpisac do const int, ale niekoniecznie jest to zbyt czyste rozwiazanie - krwq 2012-06-30 16:12
no tak, można użyc const_cast, ale przyjmuje się ze constów na ogól nie powinno się zmieniać - fasadin 2012-06-30 16:16

Pozostało 580 znaków

2012-06-30 14:01
0

dzięki za odpowiedz
sprawa wygląda tak ze wiem ze można to zrobić w ten sposób

void wypelnij (int tablica[], int wielkosc)
{

    for (int i=0; i<wielkosc; i++) {
        cout<< "Podaj wartosc ";
        cin>> tablica[i];
    }
}

pytam z ciekawości czy można tylko na podstawie 2 wskazników zakresu tablicy napisać taka funkcje i troszkę mi już pomogleś ; ) bo funkcja ta ma tylko zwrócić wskaznik elementu znajdującego się za ostatnim elementem tablicy aby inne funkcje mogły go wykorzystać jako swój parametr do określenia ile wartości zostało wprowadzonych do tablicy

Pozostało 580 znaków

2012-06-30 14:17
0

"bo funkcja ta ma tylko zwrócić wskaznik elementu znajdującego się za ostatnim elementem tablicy aby inne funkcje mogły go wykorzystać jako swój parametr do określenia ile wartości zostało wprowadzonych do tablicy"
nie rozumiem tego. jak za ostatnim elementem tablicy? przecież tam nic nie ma. Chyba że chodzi Ci o powiększenie tablicy, ale od tego są listy (vector) a jak bardzo chcesz to utwórz nowy blok pamięci i przepisz stary i usuń stary
Jeżeli koniecznie chcesz zrobić tak żeby mając dwa wskaźniki stworzyć tablice na ich podstawie to możesz zrobić coś takiego


int *wypelnij (const int *begin, const int*end)
{
  int count = 0;
  for (;begin < end ; begin++)
    count++;

  int *tablica = new int [count];
  begin -=count; //żeby ustawić znowu wskaźnik na początek
  /*TUTAJ ROBISZ WCZYTYWANIE DO TABLICA*/
  return tablica;
}

tylko musisz pamiętać żeby później zwolnić pamięć poprzez delete
edytowany 1x, ostatnio: fasadin, 2012-06-30 14:18

Pozostało 580 znaków

2012-06-30 15:31
0

dzięki zrobiłem coś takiego (jednak dodałem dodatkowy parametr do funkcji tablica[],)


int wypelnij (int tablica[], const int *begin, const int *end)
{
    int x = 0;
    int i = 0;
    for (;begin<end; begin++)
        i++;

    for (int y=0; y<i; y++) {
        cout<< "Podaj " << (y+1) << " wartosc ";
        cin>> tablica[y];
        x++;

            if (!cin) {
               cin.clear();
               cin.sync();
               --x;
               break;
           }

    }

    return x;
}

teraz tylko prosilbym cie o podpowiedz jak przepisać ta funkcję aby nie zwracała wartości int elementów tablicy jak robi to teraz a jedynie wskaznik int który bede mógł wykorzystać do kolejnej funkcji jako parametr który bedzie informował o końcu tablicy np

int dodaj (int *begin, int *end); //prototyp przykladowej funkcji

gdzie int *end bedzie przekazane poprzez wlaśnie tą wcześniejsza funkcje w której mi pomogłeś PRZEPRASZAM ZA OGÓLNE ZAMOTANIE ; ) i dzieki za zainteresowanie

a dlatego chce wskaznik elementu znajdujacego sie za ostatnim wypelnionym elementem tablicy bo majac tablice int tablica[20];
to zeby przekazac cala tablice musze majac prototyp funkcji

int dodaj (int *begin, int *end);

wywołać ja np tak jakis tam wynik = dodaj (tab, tab+20//czyli o jeden wiecej niz ma cala tablica) o to mi chodzilo ; )

edytowany 1x, ostatnio: emacs, 2012-06-30 15:42

Pozostało 580 znaków

2012-06-30 15:38
0

przesuwasz wskaźnik begin a później go nie ustawiasz, przez co jak go użyjesz jeszcze to już nie będzie działać tak jakbyś chciał. (specjalnie po to napisałem komentarz)

w poprzednim poście napisałem Ci jak zwrócić wskaźnik
int wypelnij (int tablica[], const int begin, const int *end); //prototyp

a tam robisz return tablica;
czy nawet return tablica+5;
w zależności co potrzebujesz. Nadal nie do końca rozumiem co masz na myśli więc najlepiej pokaż kawałek kodu lub co chcesz dokładnie zrobić

Pozostało 580 znaków

2012-06-30 16:06
0

#include <iostream>
using namespace std;
const int size = 10;

int wypelnij (int tablica [], const int *begin, const int *end);
int dodaj (int tablica[], int end);

int main()
{

    int tab[size];
    int result;
    result = wypelnij (tab, tab, tab+size);

    int wynik_dodawania;
    wynik_dodawania = dodaj (tab, result);
    cout<< "Suma wszystkich elementow w tablicy wynosi " << wynik_dodawania <<endl;

    system("PAUSE");
}

int wypelnij (int tablica[], const int *begin, const int *end)
{
    int x = 0;
    int i = 0;
    for (;begin<end; begin++)
        i++;

    for (int y=0; y<i; y++) {
        cout<< "Podaj " << (y+1) << " wartosc ";
        cin>> tablica[y];
        x++;

            if (!cin) {
               cin.clear();
               cin.sync();
               --x;
               break;
           }

    }

    return x;
}

int dodaj (int tablica[], int end)
{
    int wynik = 0;
    for (int i=0; i <end; i++)
        wynik += tablica[i];

    return wynik;

}

zrobiłem taki oto prosty programik i chciałem funkcji dodaj o prototypie int dodaj (int tablica[], int end); przekazać wskaznik wartości elementów zamiast samej wartości int ot co ; ) tak jak jest to w funkcji int wypelnij (int tablica [], const int begin, const int end);
chciałem po prostu aby funkcje operowały nie na samych wartościach a na wskaznikach wartości i aby jedna funkcja przekazywała wskaznik z którego nastepna korzysta ale chyba mnie to troszke przerosło ; )

edytowany 1x, ostatnio: emacs, 2012-06-30 16:06
napisałem Ci taka funkcje w drugim poście - fasadin 2012-06-30 16:58

Pozostało 580 znaków

2012-06-30 16:15
0

wroc moze do tej pierwszej wersji bo widze ze wlasnie kilka osob Ci namieszalo:

int wypelnij (int *begin, int *end) // 1. wywalilem te const sprzed inta, zapis ten jest sugestia dla kompilatora ze ma zglaszac bledy przy probie modyfikacji elementu na ktory wskazuje wskaznik
{    
    int *i; // tu tez
    for (i=begin; i<end; i++)
      {
        cout<< "Podaj wartosc ";
        cin >> *i; // I to by bylo na tyle
      }
}

w c++ proponuje korzystac z vectora


░█░█░█░█░█░█░█░█░█░█░█░
edytowany 4x, ostatnio: krwq, 2012-06-30 16:19
jak się odwoła teraz do pierwszego elementu i? jak w innych funkcjach odczyta w ogóle i? - fasadin 2012-06-30 16:49
a czy on napisal ze chce? - krwq 2012-07-01 02:08
cytując post wyżej "chciałem po prostu aby funkcje operowały nie na samych wartościach a na wskaznikach wartości i aby jedna funkcja przekazywała wskaznik z którego nastepna korzysta ale chyba mnie to troszke przerosło ; )" - fasadin 2012-07-01 07:32
czyli chodzilo mu po prostu o operator wyluskania, nic poza tym - krwq 2012-07-01 07:40

Pozostało 580 znaków

2012-06-30 16:21
0

Ja bym to zrobił w ogóle inaczej.

#include <iostream>
using namespace std;

template< typename T >
void fun( T* begin, T* end )
{
    int size = end - begin;

    for( int i = 0; i < size; ++i )
        cout << "Wartosc tablicy = " << begin[ i ] << "\n";
}

//lub dla samych intów
void intfun( int* begin, int* end ) // @Fasadin - tutaj tworzy się kopia wskaźnika na tablicę, dlatego nie ma sensu zwracać wskaźnika do pierwszego elementu...
{
    int size = end - begin;

    for( int i = 0; i < size; ++i )
        cout << "Wartosc tablicy = " << begin[ i ] << "\n";
}

int main( )
{
    int tablica[] = { 1, 2, 3, 4, 5, 6 };
    cout << "Pierwszy element tablicy: " << tablica[ 0 ] << endl;

    fun( tablica, tablica + 6 );

    cout << "Pierwszy element tablicy: " << tablica[ 0 ] << endl; // ...Jak widać tutaj.
    getchar( );
    return 0;
}

Gdy się nie wie, co się robi, to dzieją się takie rzeczy, że się nie wie, co się dzieje ;-)
rzeczywiście, myślałem że skoro przekazujemy wskaźnik do tablicy to na nim operujemy a nie na jego kopii ;) Tylko też on chce przy sumowaniu użyć nową powstała tablice więc trzeba utworzyć przed lub w funkcji tablice i ja zwrócić/zmodyfikować. - fasadin 2012-06-30 16:56
Jeśli chcesz operować na oryginale to piszesz fun( int begin, int end ) i przekazujesz fun( &tablica, &( tablica + 6 ) ) lub deklarujesz funkcję fun( int& begin, int& end ) i przekazujesz parametry fun( tablica, tablica + 6 ). Wtedy nie tworzysz kopii wskaźnika, tylko operujesz na dokładnie tym wskaźniku. - MJay 2012-06-30 16:59
dzięki ;) Jednak sprawdziłem sobie od razu po Twoim poście jak to działa. - fasadin 2012-06-30 17:10
byłem długo w tym samym miejscu, co Ty teraz, z tym, że ja się wykłócałem, że to ja mam rację, a nie inni ;] wróżę Ci za jakiś czas naprawdę dobrych wyników w programowaniu. Nie przestawaj tylko czytać książek i nowości ;] Mi to zajęło trochę dłużej, bo ja zawsze wolałem wyjść na laseczki niż siedzieć i kodzić ;] - MJay 2012-07-01 08:28

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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