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

Object Storage Arubacloud
0 głosów
410 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ź 542 wizyt
pytanie zadane 29 października 2017 w C i C++ przez chucksqll Stary wyjadacz (12,930 p.)
0 głosów
2 odpowiedzi 512 wizyt
pytanie zadane 3 czerwca 2016 w C i C++ przez iai Nowicjusz (200 p.)
+1 głos
1 odpowiedź 137 wizyt
pytanie zadane 15 sierpnia 2015 w C i C++ przez rafalmagician Obywatel (1,320 p.)

92,583 zapytań

141,434 odpowiedzi

319,669 komentarzy

61,966 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...