Skocz do zawartości
Elvis_

problem z przejsciem wskaznika w tablicy [C++]

Rekomendowane odpowiedzi

witam

mam pytanie jesli chodzi o c++, moze banalne, ale dopiero sie ucze, otoz oto kawalek kodu:

 

 

--- kat hir --

cout << "Podaj rozmiar dynamicznej tablicy : " << endl;

int n;

cin >> n;

float *tab = new float[n];

 

for (int i=0; i < n; i++)

{

cout << "Podaj element nr: " << i+1 << endl;

cin >> *(tab++);

}

 

 

for (int i=0; i < n; i++)

{

cout << "Element tablicy o nr: " << i+1

<< " ma wartosc : " << *(tab++) << endl;

}

--- kat hir --

 

druga petla wyswietla elementy tablicy, jednak wyswietlaja sie glupoty bo 'tab' wskazuje na ostatni element tablicy, co zrobic aby wskazywal na pierwszy?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Zmienna tab to u Ciebie jedyne odwolanie do dynamicznie stworzonej tablicy, wiec nie mozesz go stracic. Albo po wprowadzeniu danych cofniesz wskaznik na poczatek, albo dodeklaruj sobie drugi wskaznik, ktorym bedziesz sobie "jezdzil" po tablicy, a ten orginalny niech zawsze stoi na jej poczatku.

Polecam raczej ta druga metode.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Mimo wszystko radzilbym trzymac osobny wskaznik (to tylko 4 bajty...), ktory zawsze pokazuje na poczatek tej tablicy, poniewaz kiedys mozesz zapomnac cofnac i bedziesz dlugo szukal bledu..

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

witam

mam pytanie jesli chodzi o c++, moze banalne, ale dopiero sie ucze, otoz oto kawalek kodu:

--- kat hir --

cout << "Podaj rozmiar dynamicznej tablicy : " << endl;

[...]

for (int i=0; i < n; i++)

{

cout << "Podaj element nr: " << i+1 << endl;

cin >> *(tab++);

}

 

for (int i=0; i < n; i++)

{

cout << "Element tablicy o nr: " << i+1

<< " ma wartosc : " << *(tab++) << endl;

}

--- kat hir --

 

druga petla wyswietla elementy tablicy, jednak wyswietlaja sie glupoty bo 'tab' wskazuje na ostatni element tablicy, co zrobic aby wskazywal na pierwszy?

Mimo, że już podano Ci rozwiązanie, ja mam pytanie: po co Ci zwiększanie wskaźnika?? Czy już nie możesz zastosować zwykłego indeksowania tablicy przez nawiasy []?? Skoro używasz przynajmniej dwukrotnie tej tablicy to jaki jest sens zwiększania wskaźnika i trzymania dodatkowo drugiej kopi albo jeszcze odejmowania??

A propos zapominania o wskaźnikach: możesz zapomnieć, że wogóle masz taki wskaźnik, możesz go podwójnie dealokować, itd. itd.

 

Zwiększanie wskaźnika ma sens w krótkich funkcjach, najczęściej operujących na tłańcuchach znakowych, w celu zwiększenia prędkości działania (teoretycznie... kiedyś tak na pewno było) ale powoduje zaciemnienie kodu oraz właśnie problem z ponownym użyciem tablicy.

 

Czy nie lepiej zastosować prostsze rozwiązanie niż na siłę dokładać kod do dość specyficznego...?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

witam

mam pytanie jesli chodzi o c++, moze banalne, ale dopiero sie ucze, otoz oto kawalek kodu:

[...]

co zrobic aby wskazywal na pierwszy?

Mimo, że już podano Ci rozwiązanie, ja mam pytanie: po co Ci zwiększanie wskaźnika?? Czy już nie możesz zastosować zwykłego indeksowania tablicy przez nawiasy []??

[...]

Czy nie lepiej zastosować prostsze rozwiązanie niż na siłę dokładać kod do dość specyficznego...?

w zasadzie masz racje, ale tego progsa pisze w celach edukacyjnych, natrafilem na cos z czym nie moglem sobie poradzic, sposob z tablicami jest rzeczywiscie wygodniejszy i bardziej przejrzysty,

 

zreszta zobaczcie mojego progsa, juz go zrobilem ale moze cos sie da w nim ulepszyc:

// TRESC ZADANIA://// zdefiniowac dynamicznie jednowymiarowa tablice o dlugosci 'n' z liczb rzeczywistych// przeczytac z klawiatury wartosci elementow tablicy, wyznaczyc najwiekszy element,// srednia jej elementow, wylistowac elementy tablicy, operacje wykonac w funkcjach// wywolanych przez wskaznik.// --------------------------#include "stdafx.h" //kompilacja pod: Visual Studio .NET (C++) //ew: #include <iostream.h>#include "conio.h"  //dla getch();using namespace std;//DEKLARACJE FUNKCJI:void wyswietl(float *w, int n);void srednia(float *w, int n);void najw_elem(float *w, int n);int main(){  cout << "Podaj rozmiar dynamicznej tablicy : ";  int n;  cin >> n;  float *tab = new float[n];  void (*ws)(float *, int); //wskaznik do funkcji  //wczytywanie elementow tablicy  for (int i=0; i < n; i++)  {   cout << "Podaj element nr " << i+1 << " : ";   cin >> tab[i]; //*(tab++), ale wtedy potrzbne jest: tab = tab - n; <=>tab -= n:    //powrot wsk na piewszy (zerowy) element tablicy,zeby moc znowu z nia cos zrobic  }   char znak;  do {	cout << endl      << "***************************************" << endl      << "Program do obslugi dynamicznej tablicy!" << endl      << "***************************************" << endl   << "Co chcesz zrobic z tablica ?           " << endl   << "'N' - najwiekszy element tablicy     " << endl      << "'S' - srednia z elementow tablicy    " << endl      << "'W' - wyswietl elementy tablicy      " << endl   << endl << "'K' - aby zakonczyc          " << endl;	znak = getch();	switch(znak)	{	case 'N': {    ws = najw_elem;    (*ws)(tab, n);    break;     }	case 'S': {    ws = srednia;    (*ws)(tab, n);    break;     }	case 'W': {    ws = wyswietl;    (*ws)(tab, n);    break;     }	case 'K': break;	default: cout << "Wybierz jedna z mozliwych opcji!" << endl; break;	}	cout << endl;  } while ( znak != 'K');  delete [] tab; //wywala nieraz access violation nie wiem na razie dlaczego?}void najw_elem(float *w, int n){	float tmp = w[0]; //tmp wskazuje na 1. element tablicy	for (int i=0; i < n; i++)	{  if (w[i] > tmp) 	 tmp = w[i];	}	cout << "Najwiekszy element tablicy ma wartosc : " << tmp << endl;}void srednia(float *w, int n){	float suma = 0;	for (int i = 0; i < n; i++)	{  suma += w[i];	}	cout << "Srednia wartosci elementow tablicy : " << suma/n << endl;}void wyswietl(float *w, int n){  for (int i=0; i < n; i++)  {	   cout << "Element tablicy o nr: " << i+1      << " ma wartosc : " << w[i] << endl;   }}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...