Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Intrerupator cu N - doza doar cu ...

Incalzire casa fara gaz/lemne

Incalzire in pardoseala etapizata

Suprataxa card energie?!
 Cum era nivelul de trai cam din a...

probleme cu ochelarii

Impozite pe proprietati de anul v...

teava rezistenta panou apa calda
 Acces in Curte din Drum National

Sub mobila de bucatarie si sub fr...

Rezultat RMN

Numar circuite IPAT si prindere t...
 Pareri brgimportchina.ro - teapa ...

Lucruri inaintea vremurilor lor

Discuții despre TVR Sport HD.

Cost abonament clinica privata
 

Pointerii

- - - - -
  • Please log in to reply
86 replies to this topic

#73
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,194
  • Înscris: 24.02.2007
Decat sa transmiti vectorul ca adresa 1000 (de exemplu), si apoi start ca 10, ce-ar fi sa trimiti vectorul direct ca 1010?

#74
AnduIX

AnduIX

    Junior Member

  • Grup: Members
  • Posts: 159
  • Înscris: 07.08.2016
In cazul de fata, adresa primului element + sizeof(int)*start, nu?

#75
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,194
  • Înscris: 24.02.2007
Doar element + start. Adauga compilatorul automat sizeof-ul in calcul.

In concluzie, solutia finala este ... ?

#76
AnduIX

AnduIX

    Junior Member

  • Grup: Members
  • Posts: 159
  • Înscris: 07.08.2016
Le-am cam incurcat..

#include <iostream>
using namespace std;
int sumaSir(int* p, int nrElemente)
{
		int suma=0, i=0;
		while (i<=nrElemente)
		{
			suma+=*p;
			p+=sizeof(int);
			i++;
		}
		return suma;
}
int main()
{
		int sir[10] = {3, 4, 43, 65, 534, 2, 7, 55, 29, 10}, start, stop;
		cin >> start >> stop;
		int* p = &sir[0] + start;
		cout << sumaSir (p, stop-start);
		return 0;
}



#77
tavitu

tavitu

    Minune: HE a început să emită facturile!

  • Grup: Senior Members
  • Posts: 5,598
  • Înscris: 16.02.2009
1. Dacă începi cu i de la 0, trebuie să te oprești înainte de nrElemente, adică < nu <=.
2. Dacă p este pointer către int, atunci p += 1 mută pointerul p un singur element la dreapta. p += sizeof(int), în funcție de valoarea lui sizeof(int), care poate fi 2 sau 4, mută pointerul p 2/4 elemente la dreapta.

Mai citește odată ce am scris aici, paragraful din mijloc, https://forum.softpe...4#entry22183340

Edited by tavitu, 25 December 2017 - 18:36.


#78
AnduIX

AnduIX

    Junior Member

  • Grup: Members
  • Posts: 159
  • Înscris: 07.08.2016
Ma gandeam ca i trebuie sa inceapa cu 0 in conditiile astea, caci daca start este 6 si stop este 8, de exemplu, va trebui sa faca suma a trei elemente, nu a doua elemente, cat este diferenta stop-start.

Acum totul este in regula, din cate vad.

#include <iostream>
using namespace std;
int sumaSir(int* p, int nrElemente)
{
	int suma=0, i=1;
	while (i<=nrElemente)
	{
			suma+=*p;
			p+=1;
			i++;
	}
   
	return suma;
}
int main()
{
	int sir[10] = {3, 4, 43, 65, 534, 2, 7, 55, 29, 10}, start, stop;
	cin >> start >> stop;
	int* p = &sir[0] + start;
	cout << sumaSir (p, stop-start);
   
	return 0;
}


Edited by AnduIX, 25 December 2017 - 19:24.


#79
tavitu

tavitu

    Minune: HE a început să emită facturile!

  • Grup: Senior Members
  • Posts: 5,598
  • Înscris: 16.02.2009
Acum rescrie funcția să folosească doar doi pointeri, start și stop.

#80
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,194
  • Înscris: 24.02.2007
&sir[0] e tot una cu sir

#81
AnduIX

AnduIX

    Junior Member

  • Grup: Members
  • Posts: 159
  • Înscris: 07.08.2016
Trebuie ca parametrii funcției sa fie amândoi pointeri? Mă gândeam ca folosesc un pointer numai la start și trec de la element la element, cât timp valoarea de la adresa respectiva este diferită de stop.

&sir[0] este același lucru ca &sir ?

#82
tavitu

tavitu

    Minune: HE a început să emită facturile!

  • Grup: Senior Members
  • Posts: 5,598
  • Înscris: 16.02.2009
Da, ambii parametrii să fie pointeri. Operațiile de comparare sunt valide în cazul pointerilor, adresele, până la urmă sunt niște numere și pot fi comparate. &sir[0] este echivalent cu sir simplu fără &.

#83
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,194
  • Înscris: 24.02.2007
O noua problema pentru a intelege de ce folosirea pointerilor ajunge inevitabila:

Quote

Sa se scrie o functie ce primeste un sir de 10 milioane de numere naturale si returneaza suma celor mai mari 3 valori gasite in sir (sa zicem ca fiecare valoare nu pot depasi 1 mil sa nu existe overflow pe 32 bit).


#84
AnduIX

AnduIX

    Junior Member

  • Grup: Members
  • Posts: 159
  • Înscris: 07.08.2016
Este in regula?

#include <iostream>
using namespace std;
int sir[10] = {3, 4, 43, 65, 534, 2, 7, 55, 29, 10};
int sumaSir(int* pstart, int* pstop)
{
	int suma=0;
	while (pstart <= pstop)
	{
		suma+=*pstart;
		pstart+=1;
	}
	return suma;
}
int main()
{
	int start, stop;
	cin >> start >> stop;
	int* pstart = sir + start; int* pstop = sir + stop;
	cout << sumaSir (pstart, pstop);
	return 0;
}



#85
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,194
  • Înscris: 24.02.2007
Aproape. In C++ vei intalni foarte des stilul asta cu 2 pointeri (iteratori defapt, mai generic decat pointeri, dar seamana), dar, prin conventie, stop e mereu cu unul dupa ultimul element. Deci vei avea < stop, nu <= stop.

#include <algorithm>
#include <iostream>

int main()
{
	int v[] = {3, 1, 4, 1, 5, 9};

	int* ptrMinElement = std::min_element(v, v + 6);
	std::cout << "Min element: " << *ptrMinElement;
}


Edited by dani.user, 26 December 2017 - 21:39.


#86
AnduIX

AnduIX

    Junior Member

  • Grup: Members
  • Posts: 159
  • Înscris: 07.08.2016
In exemplul tău, funcția min_element se afla in headerul “algorithm”, nu?

Acea funcție are drept scop găsirea celui mai mic element din vector, parcurgând vectorul folosind pointeri, nu?

#87
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,383
  • Înscris: 10.08.2005
Concentraza-te pe ce primeste functia, ce face cu elementele ne uitam mai tarziu.

Anunturi

Chirurgia spinală minim invazivă Chirurgia spinală minim invazivă

Chirurgia spinală minim invazivă oferă pacienților oportunitatea unui tratament eficient, permițându-le o recuperare ultra rapidă și nu în ultimul rând minimizând leziunile induse chirurgical.

Echipa noastră utilizează un spectru larg de tehnici minim invazive, din care enumerăm câteva: endoscopia cu variantele ei (transnazală, transtoracică, transmusculară, etc), microscopul operator, abordurile trans tubulare și nu în ultimul rând infiltrațiile la toate nivelurile coloanei vertebrale.

www.neurohope.ro

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate