👤

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);


Răspuns :

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).