Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Festivalul de Film Cannes 2024

Scaun auto

La mulți ani @ranit6996!

La mulți ani @Ciubex!
 Reparat difuzor membrana hartie, ...

Restaurantele cu stele Michelin

Best cooler

Program vizibilitate intre puncte
 Sfat achizitie casti gaming 300-3...

Dimensiune optima teava scurgere ...

Sfat achizitie telefon cu camera/...

Nu se poate completa declaratia 2...
 Caut firma pentru lucrare bucatar...

Dimensionare țevi incalzire

Cum va merge sistemul dupa upgrad...

Cuvantul "ciunet"
 

Pointerii

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

#73
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,272
  • Î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,272
  • Î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,272
  • Î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,272
  • Î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,272
  • Î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,548
  • Înscris: 10.08.2005
Concentraza-te pe ce primeste functia, ce face cu elementele ne uitam mai tarziu.

Anunturi

Neurochirurgie minim invazivă Neurochirurgie minim invazivă

"Primum non nocere" este ideea ce a deschis drumul medicinei spre minim invaziv.

Avansul tehnologic extraordinar din ultimele decenii a permis dezvoltarea tuturor domeniilor medicinei. Microscopul operator, neuronavigația, tehnicile anestezice avansate permit intervenții chirurgicale tot mai precise, tot mai sigure. Neurochirurgia minim invazivă, sau prin "gaura cheii", oferă pacienților posibilitatea de a se opera cu riscuri minime, fie ele neurologice, infecțioase, medicale sau estetice.

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