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
nessuno
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 nessuno 16/10/18 14:08
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
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
nessuno
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.
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
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.