problem z zakresem tablicy jako parametrem funkcji

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

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.

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

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


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

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ć

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

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

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

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