Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

zwracanie wskaźnika elementu znajdującego się za ostatnim wypełnionym elementem

Ostatnio zmodyfikowano 2017-05-21 18:03
Autor Wiadomość
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.
*/

C/C++
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; // licznik elementow
    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 ); // myślę że tutaj trzeba zwrócić właśnie beg + n ... tyle że tutaj wyskakuje mi blad invalid type of argument unary *(have int)
            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++;
    }
}
/*void revaluate(double r; double tab, int size){
    for ( int i=0; i < size; i++)
        tab[i] += r;
}*/[ / i ]
P-151979
pekfos
» 2016-09-25 12:05:49
myślę że tutaj trzeba zwrócić właśnie beg + n
To tak zrób.
P-151980
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.
P-151982
pekfos
» 2016-09-25 12:40:29
Bo nie we wszystkich przypadkach twoja funkcja zwraca wartość.
P-151984
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.

C/C++
#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 * ile );
//void revaluate(double tab[], int *size);

int main() {
    int wartosci[ SIZE ];
    int * ile = fill( wartosci, wartosci + SIZE );
    cout << * ile;
    // show(wartosci, wartosci + SIZE,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; // zawsze 0
   
}

/*void show(int *beg, int *end,int *ile){
    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;
}*/
[ / cpp ]
P-151986
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ś?
P-151991
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.
C/C++
#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 *ile);
//void revaluate(double tab[], int *size);

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

int * fill( int * beg, int * end ) {
    int * i;
    int n;
    int * a = beg + n; // zdefiniowana zmienna a
    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;
}
P-151993
pekfos
» 2016-09-25 15:05:55
Dalej jest wszystko źle.
P-151995
« 1 » 2
  Strona 1 z 2 Następna strona