Informatică, întrebare adresată de Rayzen, 8 ani în urmă

Codul acesta îmi afișeaza "2, 3" ci nu "2, -3" cum as vrea eu.


De ce functia conjugaComplex nu imi schimba valoarea celor doua numere in afara functiei?


#include < stdio.h >
#include < stdlib.h >

struct nrComplex
{
float Re, Im;
};


void conjugaComplex (struct nrComplex x)
{
x.Re = x.Re;
x.Im = (-1)*x.Im;
}

int main()
{
struct nrComplex z1 = {2,3};

conjugaComplex(z1);

printf("%f, %f", z1.Re, z1.Im);

return 0;
}

void conjugaComplex (struct nrComplex n);


boiustef: funcţia ta nu întoarce valoarea schimbată, deoarece deoarece tr să declari funcţia ca să întoarcă rezultat prin parametrul x:
void conjugaComplex (struct nrComplex &n);
astfel va fi ok
Rayzen: daca pun & imi da eroare.
Rayzen: #include
#include

typedef struct complex
{
float Re, Im;
}complex;

complex conjugaComplex(complex x)
{
complex temp;
temp.Re = x.Re;
temp.Im = (-1)*x.Im;

return (temp);
}

int main()
{
complex z1 = {2,3};
complex temp = conjugaComplex(z1);

printf("%f, %f", temp.Re, temp.Im);

return 0;
}
Rayzen: Am facut asa si acum imi merge.
Rayzen: Dar fiindca am folosit complex in loc de void si am returnat cred.
CinevaFaraNume: & e referinta in C++, nu functioneaza in C

Răspunsuri la întrebare

Răspuns de CinevaFaraNume
3

Cand se apeleaza o functie cu parametri, acestia vor fi copiati inainte de apel in stack, se va face apelul la functie(care va folosi COPIILE, nu structurile originale, pe care le poate modifica dupa nevoie) si dupa apelul la functie toata memoria pentru parametri va fi eliberata. In C++ se pot folosi referinte, care modifica si structurile originale, dar in C poti doar sa folosesti pointeri sau sa declari instanta intr-un loc accesibil functiei si sa nu mai fie transmisa ca parametru.

Pentru varianta cu pointeri:

#include < stdio.h >

#include < stdlib.h >

struct nrComplex

{

float Re, Im;

};

void conjugaComplex (struct nrComplex *x)// declarat ca pointer

{

x->Re = x->Re;// pentru pointeri x->Re inseamna (*x).Re, si * in cazul asta e operatorul de dereferentiere

x->Im = (-1)*x->Im;// si x->Im inseamna (*x).Im

}

int main()

{

struct nrComplex z1 = {2,3};

conjugaComplex(&z1);//aici se transmite adresa obiectului z1 (& - operator de referentiere)

printf("%f, %f", z1.Re, z1.Im);

return 0;

}

Acum parametrul trasmis este o adresa, nu o structura, asa ca acum functia primeste o copie a adresei(care se poate modifica dar nu este recomandat, poate corupe memoria), dar nu o copie a structurii, asa ca acum poate modifica structura pentru ca stie unde se afla in memorie.

In cazul in care ai cunostiinte despre asamblatorul GAS(Gnu AS) si sintaxa pe care o foloseste, poti vedea codul assembly generat din cod c cu optiunea -S (gcc -S cod.c si vei avea un fisier nou numit cod.s in care vor fi instructiunile assembly respective).


Rayzen: Mersi pentru explicație! Chiar nu știam cum să pun pointerii.
CinevaFaraNume: Sunt destul de folositi asa ca e bine sa intelegi cum functioneaza.
Rayzen: Da. Eu ar trebui să știu fiindcă materia mea e și din programare dinamică si clase dar nu le-am înțeles bine.
CinevaFaraNume: clase ○_○?
CinevaFaraNume: C nu are d-astea
Rayzen: Da.. Dar C++ da. Facem în C++ si Java.
Alte întrebări interesante