nightrrayy Temat założony przez niniejszego użytkownika |
zwracanie wskaźnika elementu znajdującego się za ostatnim wypełnionym elementem » 2016-09-25 11:44:48 Witam, mam problem z jednym zadaniem 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. Próbuję narazie wykombinować w jaki sposób ma się odbywać zwracanie przez funkcję fill_array() wskaznika na nastepny element za ostatnim wypełnionym: #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 );
int main() { int wartosci[ SIZE ]; int * ile = fill( wartosci, wartosci + SIZE ); cout << * 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; cout << * beg + n << endl; return *( * beg + n ); break; } else if( * i < 0 ) break; n++; } }
void show( int * beg, int * end ) { int * i = 0; int n = 0; for( i = beg; i != end; i++ ) { cout << n + 1 << ". " << * i << endl; n++; } }
[ / i ]
|
|
pekfos |
» 2016-09-25 12:05:49 myślę że tutaj trzeba zwrócić właśnie beg + n |
To tak zrób. |
|
nightrrayy Temat założony przez niniejszego użytkownika |
» 2016-09-25 12:14:41 tyle że przy zwracaniu beg + n teraz wywala mi blad odrazu segmentation fault(core dumped) po wpisaniu jednej liczby. |
|
pekfos |
» 2016-09-25 12:40:29 Bo nie we wszystkich przypadkach twoja funkcja zwraca wartość. |
|
nightrrayy Temat założony przez niniejszego użytkownika |
» 2016-09-25 13:11:26 Wymyśliłem coś takiego : Teraz przy wpisaniu jakiejś litery zwraca return np przy wpisaniu 1 2 a return b+n zwraca 2. return end zwraca 0. #include<iostream> using namespace std; const int SIZE = 6;
int * fill( int * beg, int * end ); void show( int * beg, int * end, int * ile );
int main() { int wartosci[ SIZE ]; int * ile = fill( wartosci, wartosci + SIZE ); cout << * ile; return 0; }
int * fill( int * beg, int * end ) { int * i; int n; int * a = beg + n; for( i = beg, n = 0; i != end; i++, n++ ) { cout << n + 1 << ". "; cin >> * i; if( !cin ) { cin.clear(); while( cin.get() != '\n' ) continue; cout << "Bledne dane!" << endl; return a; break; } else if( * i < 0 ) { return 0; break; } } return end; }
[ / cpp ]
|
|
pekfos |
» 2016-09-25 13:50:13 Funkcja fill_array(), zamiast zwracać aktualną liczbę elementów, ma zwrócić wskaźnik elementu znajdującego się za ostatnim wypełnionym elementem. |
Gdzie tu masz cokolwiek o zwracaniu zera? Albo o zwracaniu innych bzdur, które teraz dodałeś? |
|
nightrrayy Temat założony przez niniejszego użytkownika |
» 2016-09-25 13:59:32 Stworzyłem wcześniej int * a który zdefiniowałem jako b + n i to zwracam wtedy kiedy nastąpi wpisanie jakiejś litery. warunek na zwracanie 0 przy if ( *i < 0) rzeczywiście nie ma sensu ... wywaliłem go. natomiast return end moim zdaniem powinno tam być bo jak przejdzie przez całą tablicę to jakbym zwracał kolejny element to przecież wyszłoby poza zakres tablicy dlatego w tej sytuacji zwracam ostatni element tablicy. #include<iostream> using namespace std; const int SIZE = 6;
int * fill( int * beg, int * end );
int main() { int wartosci[ SIZE ]; int * ile = fill( wartosci, wartosci + SIZE ); cout << * ile; return 0; }
int * fill( int * beg, int * end ) { int * i; int n; int * a = beg + n; for( i = beg, n = 0; i != end; i++, n++ ) { cout << n + 1 << ". "; cin >> * i; if( !cin ) { cin.clear(); while( cin.get() != '\n' ) continue; cout << "Bledne dane!" << endl; return a; break; } else if( * i < 0 ) { break; } } return end; }
|
|
pekfos |
» 2016-09-25 15:05:55 Dalej jest wszystko źle. |
|
« 1 » 2 |