Oppure

Loading
16/10/18 12:07
vale77777
Salve, ho scritto questo programmino:
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
char *a()
{
struct b
{ char g[10];
int mese;
};
b c;
c.mese=46;
strcpy(c.g, "anni";);

return c.g;
}

int main ()
{

cout<<a()<<endl;
return 0;


}

in output dovrei avere la scritta "anni" ma non va..sicuramente sbaglio quando richiamo la funzione a() nel cout..sapete darmi qualche consiglio?
aaa
16/10/18 12:32
vale77777
ho risolto in questo modo:
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
char *a()
{
struct b
{ char g[10];
int mese;
};
b c;
c.mese=46;

strcpy(c.g, "ciao";);
char* i= new char[10];
strcpy(i,c.g);
return i;
}

int main ()
{

cout<<a()<<endl;
return 0;


}

ora il problema è con la struct:

#include <stdio.h>
#include <iostream>
using namespace std;

struct a{
int val1;
int val2;
};

struct a *funx01(){
struct a struttura;
struttura.val1 = 12;
struttura.val2=13;

return &struttura;
}


int main()
{
cout<< funx01()->val1;
cout<<funx01()->val2;


return 0;
}
aaa
16/10/18 14:05
Per la questione struttura

struct a *funx01() {
	struct a *struttura = new struct a;
	struttura->val1 = 12;
	struttura->val2 = 13;

	return struttura;
}


int main()
{
	struct a *t = funx01();

	cout << t->val1;
	cout << t->val2;
	
	delete t;

	return 0;
}


Attenzione al main e al delete (anche per il caso dell'array).
Ultima modifica effettuata da 16/10/18 14:08
16/10/18 15:00
vale77777
#include <iostream>
#include <stdlib.h>
using namespace std;

struct a
{
int val1;
int val2;
};

a *funx01(){ //funx01 è di tipo struct


a* c;
c= new a;
c->val1=12;
c->val2=46;
return c;
}

int main()
{
cout<<funx01()<<"\n";
cout<<funx01()->val1<<endl;
cout<<funx01()->val2<<endl;


return 0;
}



nel frattempo avevo risolto in questo modo
aaa
16/10/18 15:07
vale77777
riguardando mi sembra che abbiamo risolto allo stesso modo
aaa
16/10/18 16:36
Sì ma nel main commetti degli errori.

Ti avevo scritto di fare diversamente e di usare il delete.

Chiamando tre volte la funzione con le tre cout hai fatto tre new diverse, creando tre strutture in memoria.
Non hai liberato la memoria di nessuna delle tre strutture e hai creato dei memory leak che, a lungo andare, creano problemi.
16/10/18 19:59
AldoBaldo
In alternativa alla creazione dinamica dell'oggetto nella funzione, potresti passare alla funzione stessa un puntatore ad un oggetto dichiarato in main, così da non doverlo distruggere esplicitamente...

#include <iostream>
#include <cstring>
using namespace std;

struct b {
    char g[10];
    int mese;
};

char *a( b *c ) {
    c->mese=46;
    strcpy( c->g, "anni" );
    return c->g;
}

int main () {
    b c;
    cout<<a(&c)<<endl;
    return 0;
}
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
16/10/18 20:11
AldoBaldo
Seguendo lo stesso ragionamento, anche con la seconda struttura è possibile questo:

#include <iostream>
#include <stdlib.h>
using namespace std;

struct a {
    int val1;
    int val2;
};

a *funx01( a *ptr ){ //funx01 è di tipo struct
    ptr->val1 = 12;
    ptr->val2 = 46;
    return ptr;
}

int main() {
    a c;

    funx01( &c );

    cout<<c.val1<<endl;
    cout<<c.val2<<endl;

    return 0;
}
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.