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

0

mam zmodyfikowac program z listingu 7.7, zamieniając 3 funkcje obslugujące tablicę tak, aby każda z nich używała dwóch wskaźników określających zakres. Funkcja fill_array() zamiast zwracac aktualna liczbe elementow ma zwrocic wskaznik elementu znajdujacego sie za ostatnim wypelnionym elementem. Inne funkcje maja uzywac tego wskaznika jako drugiego parametru pozwalającego wykryć koniec danych. Proszę o pomoc bo mam problem ze zwróceniem odpowiedniej wartosci.

Oto listing 7.7:


#include<iostream>
const int Max = 5;

int fill_array(double ar[], int limit);
void show_array(const double ar[], int n); //nie zmienia danych
void revalue(double r,double ar[], int n);

int main()
{
using namespace std;
double properties[Max];

int size = fill_array(properties, Max);
show_array(properties, size);
if (size > 0)
{
    cout << "Podaj czynnik zmiany wartosci: ";
    double factor;
    while (!(cin >> factor)) //nieliczbowa wartosc na wejsciu
    {
        cin.clear();
        while (cin.get() != '\n')
            continue;
        cout << "Niepoprawna wartosc; podaj liczbe: ";

    }
    revalue(factor,properties,size);
    show_array(properties,size);
}
cout << "Gotowe.\n";
cin.get();
cin.get();
return 0;

}

int fill_array(double ar[], int limit)
{
using namespace std;
double temp;
int i;
for (i = 0; i < limit; i++)
{
cout << "Podaj wartosc nr " << (i + 1) << ": ";
cin >> temp;
if (!cin) //bledne dane
{
cin.clear();
while (cin.get() != '\n')
continue;
cout << "Bledne dane, wprowadzanie danych przerwane.\n";
break;
}
else if (temp < 0) // nakaz zakoczenia
break;
ar[i] = temp;
}
return i;
}

void show_array(const double ar[], int n)
{
using namespace std;
for (int i = 0; i < n; i++)
{
cout << "Nieruchomosc nr " << (i + 1) << ": ";
cout << ar[i] << endl;
}
}

void revalue(double r,double ar[], int n)
{
for (int i = 0; i < n; i++)
ar[i] *= r;
}



#include <iostream>

const int Max = 6;

int * fill_array(int *begin, int * end);
//void show_array(int * begin, int * end, int * wsk);
//void revalue(int * begin, int * end, int * wsk);

int main()
{

using namespace std;

int properties[Max];
int * wsk = fill_array(properties,properties + Max); // obejmuje cala tablice
cout << * wsk; // sprawdzenie wyniku

return 0;
}
int *fill_array(int *begin, int *end)
{
using namespace std;
int *temp = 0;
int n;
for(temp = begin, n = 0; temp != end; temp++,n++)
{
cout << "Podaj wartość nr " << (n+1) << ": ";
cin >> *temp;
if(!cin)
{
cin.clear();
while(cin.get() != '\n')
continue;
cout << "Błędne dane, wprowadzanie danych przerwane.\n";
return begin + n; //tutaj chyba cos namieszalem
break;
}
else if (temp < 0)
break;
}
return &n;
}


2

return begin + n; czemu to jest w środku pętli?
return &n; zwracasz wskaźnik do zmiennej której czas życia zaraz się kończy.

Co jest takiego trudnego w napisaniu return end;?

cout << * wsk; // sprawdzenie wyniku dereferencja wskaźnika, który ma być wskaźnikiem za ostatnim elementem tablicy. UB.

0

@nightrrayy skąd ten listing masz?

0

prata c++ rozdział 7

0

const int Max = 6;

int * fill_array(int *begin, int * end);
//void show_array(int * begin, int * end, int * wsk);
//void revalue(int * begin, int * end, int * wsk);

int main()
{

using namespace std;

int properties[Max];
int * wsk = fill_array(properties,properties + Max); // obejmuje cala tablice
cout <<  *wsk; // sprawdzenie wyniku

return 0;
}
int *fill_array(int *begin, int *end)
{
using namespace std;
int *temp = 0;
int n;
for(temp = begin, n = 0; temp != end; temp++,n++)
{
cout << "Podaj wartość nr " << (n+1) << ": ";
cin >> *temp;
if(!cin)
{
cin.clear();
while(cin.get() != '\n')
continue;
cout << "Błędne dane, wprowadzanie danych przerwane.\n";
break;
}
else if (temp < 0)
break;
}
return end;
}


0

Dobrze było (swoją drogą, return temp; wydaje sie wygodniejszym rozwiązaniem). Po prostu potem źle interpretujesz wynik. Dostajesz wskaźnik na element ZA zainicjalizowaną tablicą. Nie masz prawa dokonać jego dereferencji.

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