• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wskaźniki określające zakres tablicy w funkcjach...

42 Warsaw Coding Academy
0 głosów
446 wizyt
pytanie zadane 16 lipca 2015 w C i C++ przez Izzz Nowicjusz (170 p.)

Witam :) mam problem z zadaniem z podręcznika Prata, ktore polega m.in na tym, żeby utworzyć funkcje obsługujące tablice , ale zamiast używać np. int funkcja( double tab[ ], int size) maja uzywac dwoch wskaznikow okreslajacych zakres. Funkcja fill_array(), zamiast zwracać aktualną liczbę elementów, ma zwrócić wskaźnik elementu znajdującego się za ostatnim wypełnionym elementem. Inne funkcje mają używać tego wskaźnika jako
drugiego parametru pozwalającego wykryć koniec danych.

Chodzi o to, że gdy zwracam (wg mnie XD ) wskaźnik na przedostatni wypelniony element w funkcji wprowadzajacej dane do tablicy to cos sie psuje gdy podam znak inny niz liczbe ( podanie innego znaku niz cyfra albo liczby ujemnej mialo konczyc wprowadzanie danych do tablicy), pewnie cos zepsulam ze wskaznikami, nawet nie mam pewnosci, czy faktycznie zwracam wskaznik na  przedostatni element ... 

#include<iostream>
using namespace std;
const int SIZE = 6;
/*
Zmodyfikuj program z listingu 7.7, zamieniając trzy funkcje obsługujące tablice tak, aby
każda z nich używała dwóch wskaźników określających zakres. Funkcja f i l l _ a r r a y ( ) ,
zamiast zwracać aktualną liczbę elementów, ma zwrócić wskaźnik elementu znajdującego
się za ostatnim wypełnionym elementem. Inne funkcje mają używać tego wskaźnika jako
drugiego parametru pozwalającego wykryć koniec danych.
*/
int fill( int *beg, int *end);
void show(int *beg, int *end);
//void revaluate(double tab[], int *size);

int main(){
	int wartosci[SIZE];
	int ile = fill(wartosci, wartosci + SIZE);	
	//cout << ile;
	show(wartosci, wartosci + ile );
	return 0;
}

int fill(int *beg, int *end){
	int *i=0;
	int n=0;
	for (i=beg; i != end; i++){
		cout << n+1 << ". ";
		cin >> *i;
		if(!cin){
			cin.clear();
			while(cin.get() != '\n')
				continue;
			cout << "Bledne dane!" << endl;
			break;
		}
		else if(*i < 0)
			break;	
	n++;
	}
	return (*beg + *i ); // TU NA PEWNO JEST BLAD, ale nie wiem jak to zrobic inaczej
}

void show(int *beg, int *end){
	int *i=0;
	int n=0;
	for (i=beg; i != end; i++){
		cout << n+1 << ". " << *i << endl;	
		n++;
		}
}
/*void revaluate(double r; double tab, int size){
	for ( int i=0; i < size; i++)
		tab[i] += r;
}*/

ment 

1 odpowiedź

+2 głosów
odpowiedź 17 lipca 2015 przez Buby Pasjonat (19,590 p.)
wybrane 17 lipca 2015 przez Izzz
 
Najlepsza

Funkcja fill ma zwrócić wskaźnik na element za ostatnim w tablicy. Czyli prototyp funkcji fill musi zawierać wskaźnik do typu int, a nie sam typ int, czyli popraw to w ten sposób:

int* fill( int* beg, int* end )

Poza tym masz zwrócić wskaźnik na wartość za, czyli zobacz, najdosłowniejsz masz zwrócić po prostu beg+ilość elementów, bądź end. Czyli w tym przypadku funkcja powinna zwracać beg+n, bądź samo i, ponieważ po przejściu przez całą pętle wskazuje ono na element poza tablicą, bądź ewentualnie end. Oczywiście bez operatorów wyłuskania - operatory te oddają wartości, a nam chodzi o zwrócenie adresu.

Tak dla pewności, wszystkie te zmienne zwrócą ten sam adres. :)

komentarz 17 lipca 2015 przez Izzz Nowicjusz (170 p.)
Dziękuję, teraz to ma sens :)

Podobne pytania

+1 głos
1 odpowiedź 712 wizyt
pytanie zadane 29 października 2017 w C i C++ przez chucksqll Stary wyjadacz (12,930 p.)
0 głosów
2 odpowiedzi 1,032 wizyt
pytanie zadane 3 czerwca 2016 w C i C++ przez iai Nowicjusz (200 p.)
+1 głos
1 odpowiedź 234 wizyt
pytanie zadane 15 sierpnia 2015 w C i C++ przez rafalmagician Obywatel (1,320 p.)

93,385 zapytań

142,384 odpowiedzi

322,540 komentarzy

62,746 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...