[RISOLTO] [C++] Accesso a funzioni e liste

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
1001001
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1506
Iscrizione: mercoledì 22 dicembre 2010, 18:09
Desktop: Unity
Distribuzione: Ubuntu 14.04.1 LTS 64bit
Località: Verona

Re: programma in c++,accesso alle funzioni

Messaggio da 1001001 »

seven speed [url=http://forum.ubuntu-it.org/viewtopic.php?p=4578868#p4578868][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:grazie davvero per il supporto e sto seguendo il tuo consiglio,ovvero cerco di studiare qualcosa di c++ un po meglio.mi interesserebbe sapere qualcosa di piu sull'esistenza del tipo list,sul web ho trovato molto poco,ma sarebbe fondamentale per il mio programma..
Il tipo list non è una cosa che si possa trattare in un post di poche righe, ci sarebbe un mare di cose da dire :)
qua trovi tutte le informazioni: http://www.cplusplus.com/reference/list/list/?kw=list
C'è una spiegazione del tipo in generale e l'elenco di tutti i metodi possibili, ciascuno con spiegazione del funzionamento e parametri in ingresso e in uscita..si danno però per "scontate" alcune cose appartenenti alle basi generali del C++, ad esempio la conoscenza degli iteratori

Se poi hai ancora domande (magari un po' più specifiche :) ) chiedi pure!
"I find your lack of faith disturbing."
seven speed
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 337
Iscrizione: lunedì 4 novembre 2013, 10:15
Desktop: Gnome3/Unity
Distribuzione: Ubuntu 14.04 lts

Re: programma in c++,accesso alle funzioni e gestione lista

Messaggio da seven speed »

dopo piu d un weekend(da giovedi mattina)passato interamente sul c++ sono giunto finalmente ad aver eun programma decente.mi rimane un erroe,che da quant ho capito su internet dovrebbe essere questione di standard o compilatore.adesso ve lo posto per avere un parere piu chiaro(ed in italiano).
vi posto il main e le due classi,lasciando fuori l'implementazioni delle funzioni che sono lunghe e non mi creano problemi:

Codice: Seleziona tutto

#include <iostream>
#include <cmath>
#include <list>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#define M 2
#define N 50

using namespace std;

class input{

public:
double a[2];
double b[2];
double toll1;
double dati[][M];
int n;
public:
//metodi
void proiezionepuntoretta (double xa, double ya, double xp, double yp, double h, double v, double *asc, double *ord, double *coord);
double isconvesso (double p3[]);
int calcolaindicelatotriangolo(int iterazione);
double distanzapunti(double x1, double y1,double x2, double y2);
void risolvi(double xp, double yp,double xa, double ya,double h, double v, double hs, double vs, double*t, double*s);

    input(double punto1[],double punto2[],double toll)
    {
        int i;
        toll1=toll;
         for(i=0;i<2;i++)
          {
            a[i]=punto1[i];
            b[i]=punto2[i];
          }
    }

    input(double seg1[2],double seg2[2],double toller,double matrix[3][2],int nn)
    {
        int i,j;
        for(i=0;i<2;i++)
          {
            a[i]=seg1[i]=0;
            b[i]=seg2[i]=0;
          }
          toll1=toller=0;
          for(i=0;i<3;i++)
          {
            for(j=0;j<2;j++)
            {
                dati[i][j]=matrix[i][j];
            }
          }
    }

    input(double toll){
     int i;
     for(i=0;i<2;i++)
     {
         a[i]=0;
         b[i]=0;
     }
    }
};

class output{

public:

char mex[N];
double x,y;
int indice;
public:
list<output> polixseg(input);

};

int main()
{
   input t(double,double,double[3][2],double,int);
   output ris;
   cout<<ris.polixseg(t({3,20},{1,16},0.5,{4,3},{21,3},{4,20},3));***
   return 0;
}
mi vien dato un errore e 5 warning alla riga che ho asteriscato,cioè la penultima:

|83|warning: extended initializer lists only available with -std=c++11 or -std=gnu++11 [enabled by default]|
|83|warning: extended initializer lists only available with -std=c++11 or -std=gnu++11 [enabled by default]|
|83|warning: extended initializer lists only available with -std=c++11 or -std=gnu++11 [enabled by default]|
|83|warning: extended initializer lists only available with -std=c++11 or -std=gnu++11 [enabled by default]|
|83|warning: extended initializer lists only available with -std=c++11 or -std=gnu++11 [enabled by default]|
|83|error: cannot convert ‘<brace-enclosed initializer list>’ to ‘double’ for argument ‘1’ to ‘input t(double, double, double (*)[2], double, int)’|
||=== Build finished: 1 errors, 5 warnings ===|


sapete aiutarmi?
1001001
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1506
Iscrizione: mercoledì 22 dicembre 2010, 18:09
Desktop: Unity
Distribuzione: Ubuntu 14.04.1 LTS 64bit
Località: Verona

Re: programma in c++,accesso alle funzioni e gestione lista

Messaggio da 1001001 »

Per quanto riguarda i warning, sono dovuti al fatto che le liste di inizializzazione con le parentesi graffe sono presenti solo nell'ultima versione dello standard C++, quindi i compilatori un po' vecchi richiedono il passaggio di una flag (nello specifico -std=c++11 nel tuo caso) per attivare le funzionalità del nuovo standard. In soldoni, compila con:

Codice: Seleziona tutto

g++ main.cpp -std=c++11
e i warning scompaiono.

Per quanto riguarda l'errore:

Codice: Seleziona tutto

input t(double,double,double[3][2],double,int);
cosa stai cercando di fare con questa istruzione?

E

Codice: Seleziona tutto

cout<<ris.polixseg(t({3,20},{1,16},0.5,{4,3},{21,3},{4,20},3));***
questo t e quello dell'istruzione sopra dovrebbero essere la stessa variabile/funzione/qualunque cosa tu intendess? :)

In ogni caso, per far funzionare la stampa tramite cout dovrai implementare il metodo operator<< nella classe output
"I find your lack of faith disturbing."
seven speed
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 337
Iscrizione: lunedì 4 novembre 2013, 10:15
Desktop: Gnome3/Unity
Distribuzione: Ubuntu 14.04 lts

Re: programma in c++,accesso alle funzioni e gestione lista

Messaggio da seven speed »

innanzi tutto un GRAZIE immenso per l'aiuto,dul c++ non so proprio dove andare perchè ho notato che rispetto al c su internet c'è molta meno roba...

1)andando nelle opzioni codeblocks(il mio IDE) in compiler non trovo alcuna voce come quella che mi hai postatpo e che mi viene segnalat nell'errore..avrò una versione troppo vecchia di codeblocks?(10.05)
2)con l'istruzione ch emi hai postata sto dichiarando la variabile t di tipo input e con i parametri indicati(che richiamano l'apposito costruttore nella classe input).
3)come faccio ad implementare il metodo operator?
seven speed
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 337
Iscrizione: lunedì 4 novembre 2013, 10:15
Desktop: Gnome3/Unity
Distribuzione: Ubuntu 14.04 lts

Re: programma in c++,accesso alle funzioni e gestione lista

Messaggio da seven speed »

per il problema 1) ho risolto ;) mancano gli altri due punti :)
ps.comunque si,quel t è la stessa variabile ;)
1001001
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1506
Iscrizione: mercoledì 22 dicembre 2010, 18:09
Desktop: Unity
Distribuzione: Ubuntu 14.04.1 LTS 64bit
Località: Verona

Re: programma in c++,accesso alle funzioni e gestione lista

Messaggio da 1001001 »

Il problema 1) immagino che si riferisca alla flag di compilazione, giusto? :)

Per quanto riguarda il 2):
seven speed ha scritto:2)con l'istruzione ch emi hai postata sto dichiarando la variabile t di tipo input e con i parametri indicati(che richiamano l'apposito costruttore nella classe input).
No, non stai facendo questo :) almeno per due motivi:
1) se vuoi chiamare una funzione in C++ devi passargli degli argomenti, non dei tipi
2) non c'è nessun costruttore della classe input che prende in ingresso quei tipi in quell'ordine
Quello che stai facendo con quell'istruzione è dichiarare una funzione (locale alla funzione main) che prende in ingresso 5 argomenti (double,double,double[3][2],double,int) e restituisce un oggetto di tipo input


Per il punto 3): http://stackoverflow.com/questions/4421 ... verloading oppure http://www.learncpp.com/cpp-tutorial/93 ... operators/
"I find your lack of faith disturbing."
seven speed
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 337
Iscrizione: lunedì 4 novembre 2013, 10:15
Desktop: Gnome3/Unity
Distribuzione: Ubuntu 14.04 lts

Re: programma in c++,accesso alle funzioni e gestione lista

Messaggio da seven speed »

ma io vorrei dichiarare una variabile di tipo input,con tutti gli attributi della classe input..come dovrei fare allora?
ho cambiato l'ordine dei parametri,era una svista,seguendo il costruttore ma da lo stesso errore
per il punto 3) non conoscendo bene l'inglese non sono sicuro di aver capito cosa fare...potresti darmi una spiegazione veloce?
1001001
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1506
Iscrizione: mercoledì 22 dicembre 2010, 18:09
Desktop: Unity
Distribuzione: Ubuntu 14.04.1 LTS 64bit
Località: Verona

Re: programma in c++,accesso alle funzioni e gestione lista

Messaggio da 1001001 »

Quando crei un oggetto di un certo tipo, tutti i suoi attributi vengono creati, qualunque costruttore tu chiami. Diversi costruttori possono fare cose diverse, dipende da come li implementi, ma se non dici esplicitamente come creare un certo attributo verrà chiamato il costruttore di default per costruirlo.
Detto questo, i costruttori, come tutte le funzioni, devi chiamarli passando oggetti del tipo appropriato. Nel tuo caso, devi passare un array di double di 2 elementi , un altro array di double di due elementi, un double, un array doppio di double di dimensione 3x2 e un intero, ma devi passare oggetti di questo tipo, non i tipi...se no, come fa poi a usare quegli oggetti per fare le operazioni nel costruttore?

Per il punto 3), devi fare una funzione di nome operator<< con la firma che trovi in quei due link che ti ho postato che fa la stampa. Questo forse è più di quanto ti serva però in effetti..se non vuoi poter stampare su file oltre che su standard output, potresti fare una funzione di nome ad esempio print che stampa quello che vuoi stampare su cout. Il fatto è che mentre i singoli attributi magari possono essere stampati (e non sempre, dipende da quale tipo hanno questi oggetti), di certo non puoi stampare un oggetto composto, perché C++ non sa come fare se tu non fai una funzione che fa la stampa come vuoi che sia fatta. Il modo più generale per fare questa cosa è attraverso overloading dell'operatore, ma anche con una funzione "normale" (come la print di cui ti dicevo sopra) si può fare
"I find your lack of faith disturbing."
seven speed
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 337
Iscrizione: lunedì 4 novembre 2013, 10:15
Desktop: Gnome3/Unity
Distribuzione: Ubuntu 14.04 lts

Re: programma in c++,accesso alle funzioni e gestione lista

Messaggio da seven speed »

ma non ho capito,è sbagliato il costruttore(a parte l'ordine delle variabili che ho cambiato) o la chiamata?
perchè se nella chiamata della funzione polixseg nel cout(che modificherò dopo come hai detto tu) scrivo:

Codice: Seleziona tutto

cout<<ris.polixseg({3,20},{1,16},0.5,{{4,3},{21,3},{4,20}},3);
mi da comunque errore:
Modelli/fineprogetto/main.cpp||In function ‘int main()’:|
Modelli/fineprogetto/main.cpp|84|error: no matching function for call to ‘output::polixseg(<brace-enclosed initializer list>, <brace-enclosed initializer list>, double, <brace-enclosed initializer list>, int)’|
Modelli/fineprogetto/main.cpp|84|note: candidate is:|
Modelli/fineprogetto/main.cpp|75|note: std::forward_list<output> output::polixseg(input)|
Modelli/fineprogetto/main.cpp|75|note: candidate expects 1 argument, 5 provided|
||=== Build finished: 4 errors, 0 warnings ===|
Ultima modifica di seven speed il martedì 13 maggio 2014, 19:05, modificato 1 volta in totale.
jigen45
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 717
Iscrizione: lunedì 31 dicembre 2012, 18:59
Desktop: ubuntu

Re: programma in c++,accesso alle funzioni e gestione lista

Messaggio da jigen45 »

La chiamata.
1001001 [url=http://forum.ubuntu-it.org/viewtopic.php?p=4581825#p4581825][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:[...] i costruttori, come tutte le funzioni, devi chiamarli passando oggetti del tipo appropriato. Nel tuo caso, devi passare un array di double di 2 elementi , un altro array di double di due elementi, un double, un array doppio di double di dimensione 3x2 e un intero, ma devi passare oggetti di questo tipo, non i tipi...se no, come fa poi a usare quegli oggetti per fare le operazioni nel costruttore?
1001001
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1506
Iscrizione: mercoledì 22 dicembre 2010, 18:09
Desktop: Unity
Distribuzione: Ubuntu 14.04.1 LTS 64bit
Località: Verona

Re: programma in c++,accesso alle funzioni e gestione lista

Messaggio da 1001001 »

Che poi, con l'istruzione

Codice: Seleziona tutto

cout<<ris.polixseg(t({3,20},{1,16},0.5,{4,3},{21,3},{4,20},3));
cosa vorresti fare? Cioè ok, vuoi stampare l'output di ris.polixseg, ma quella t che hai messo nell'argomento di polixseg cosa dovrebbe essere nelle tue intenzioni?
"I find your lack of faith disturbing."
seven speed
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 337
Iscrizione: lunedì 4 novembre 2013, 10:15
Desktop: Gnome3/Unity
Distribuzione: Ubuntu 14.04 lts

Re: programma in c++,accesso alle funzioni e gestione lista

Messaggio da seven speed »

ma se do:

Codice: Seleziona tutto

cout<<ris.polixseg({3,20},{1,16},0.5,{{4,3},{21,3},{4,20}},3);
mi da errore(l'errore è quello del post precedente,infatti avevo sbagliato mettere il codice,la t non ci andava....)non riesco proprio a capire...
seven speed
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 337
Iscrizione: lunedì 4 novembre 2013, 10:15
Desktop: Gnome3/Unity
Distribuzione: Ubuntu 14.04 lts

Re: programma in c++,accesso alle funzioni e gestione lista

Messaggio da seven speed »

1001001 [url=http://forum.ubuntu-it.org/viewtopic.php?p=4582172#p4582172][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:Che poi, con l'istruzione

Codice: Seleziona tutto

cout<<ris.polixseg(t({3,20},{1,16},0.5,{4,3},{21,3},{4,20},3));
cosa vorresti fare? Cioè ok, vuoi stampare l'output di ris.polixseg, ma quella t che hai messo nell'argomento di polixseg cosa dovrebbe essere nelle tue intenzioni?
sisi la t è un errore che non avevo fatto nel programma ma solo quando ho riposrtato nel post il codice ;)
1001001
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1506
Iscrizione: mercoledì 22 dicembre 2010, 18:09
Desktop: Unity
Distribuzione: Ubuntu 14.04.1 LTS 64bit
Località: Verona

Re: programma in c++,accesso alle funzioni e gestione lista

Messaggio da 1001001 »

seven speed [url=http://forum.ubuntu-it.org/viewtopic.php?p=4582196#p4582196][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:ma se do:

Codice: Seleziona tutto

cout<<ris.polixseg({3,20},{1,16},0.5,{{4,3},{21,3},{4,20}},3);
mi da errore(l'errore è quello del post precedente,infatti avevo sbagliato mettere il codice,la t non ci andava....)non riesco proprio a capire...
Certo, perché il metodo polixseg prende in ingresso un oggetto di tipo input, non double[2], double[2], double, double[3][2], int ;)
quello che prende in ingresso questi oggetti è il costruttore della classe input e quei parametri li devi passare quando costruisci t, se ho capito quello che vuoi fare...poi polixseg lo chiami su t
"I find your lack of faith disturbing."
seven speed
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 337
Iscrizione: lunedì 4 novembre 2013, 10:15
Desktop: Gnome3/Unity
Distribuzione: Ubuntu 14.04 lts

Re: programma in c++,accesso alle funzioni e gestione lista

Messaggio da seven speed »

risolto,adesso li non ci sono più problemi,devo solo pensare alla stampa.stasera vedo di concludere
seven speed
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 337
Iscrizione: lunedì 4 novembre 2013, 10:15
Desktop: Gnome3/Unity
Distribuzione: Ubuntu 14.04 lts

Re: programma in c++,accesso alle funzioni e gestione lista

Messaggio da seven speed »

adesso non mi da piu errori di sintassi ma mi stampa valori casuali...penso che l'errore sia nell'implementazione della stampa:

Codice: Seleziona tutto

void output::printlist(forward_list<output> ou){


    cout<<"punto:("<<x<<","<<y<<")\n"<<"indice:"<<indice<<"\n"<<"messaggio:"<<mex<<"\n";
}
il mio dubbio è:dovrei estrarre(come?)un elemento dalla lista prima di stamparlo?
1001001
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1506
Iscrizione: mercoledì 22 dicembre 2010, 18:09
Desktop: Unity
Distribuzione: Ubuntu 14.04.1 LTS 64bit
Località: Verona

Re: programma in c++,accesso alle funzioni e gestione lista

Messaggio da 1001001 »

Ma le variabili x, y, indice e mex da dove escono?
"I find your lack of faith disturbing."
seven speed
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 337
Iscrizione: lunedì 4 novembre 2013, 10:15
Desktop: Gnome3/Unity
Distribuzione: Ubuntu 14.04 lts

Re: programma in c++,accesso alle funzioni e gestione lista

Messaggio da seven speed »

nel cout...penso infatti che ho sbagliato proprio qui...
1001001
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1506
Iscrizione: mercoledì 22 dicembre 2010, 18:09
Desktop: Unity
Distribuzione: Ubuntu 14.04.1 LTS 64bit
Località: Verona

Re: programma in c++,accesso alle funzioni e gestione lista

Messaggio da 1001001 »

Eh sì, ho capito, ma nella funzione, per come l'hai scritta, quelle variabili non sono state dichiarate, quindi dovrebbe neanche compilare..
"I find your lack of faith disturbing."
seven speed
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 337
Iscrizione: lunedì 4 novembre 2013, 10:15
Desktop: Gnome3/Unity
Distribuzione: Ubuntu 14.04 lts

Re: programma in c++,accesso alle funzioni e gestione lista

Messaggio da seven speed »

ragazzi risolto adesso funziona tutto :D :D :D :D
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 3 ospiti