Autore |
Discussione  |
|
Leon
Utente giovane

Regione: Puglia
Prov.: Bari
Città: Monopoli
|
Inserito il - 08/02/2008 : 17:23:42
|
Raga mi vergogno anche a chiedere aiuto per questi errori, ma non ne riesco proprio a venire a capo.... creo una piccola lista spero mi sappiate aiutare:
ERRORE1:switch quantity not an integer; ERRORE2:invalid operands to binary + (perche' non mi da quest'errore con la sottrazione ???) CODICE: void calcola (punt *p1, punt *p2, punt *p3, punt *p){ switch(*p3) { case 1: *p=*p1 + *p2; break; } ......
ERRORE: comparison between pointer and integer CODICE: void calcola (punt *p1, punt *p2, punt *p3, punt *p){ if (*p3==1) ......
ERRORE: assignment makes pointer from integer without a cast CODICE: *p = *p1 - *p2;
Nell'ultimo errore, cosi come nel secondo, non capisco: mettendo *p (per esempio) di fatto, non e' come se operassi con il contenuto dell'indirizzo puntato da p ? (ossia con il contenuto dell'indirizzo contenuto in p) ??? Se si, perche' mi da questo errore ??? PRECISO che i puntatori in fase di dichiarazione sono stati posti cosi:
typedef int *punt; punt p,p1,p2,p3;
Mi sapreste rispondere ??? Grazie mille in anticipo
|
Don't you let your demons pull you down cause you can have it all |
|
Capitan
Utente medio
 

|
Inserito il - 09/02/2008 : 09:50:39
|
Ciao Leon inserisci prorpio tutto il codice compilabile... Così provo a compilare e capire quali errrori fa... |
 |
|
Leon
Utente giovane

Regione: Puglia
Prov.: Bari
Città: Monopoli
|
Inserito il - 26/08/2008 : 14:12:28
|
Raga nessuno che mi può aiutare ??? Ho sempre lo stessissimo errore e nessuno mi ha ancora dato una risposta... La parte di codice interessata è solo quella non c'è nessun bisogno che inserisca tutto il codice... Perfavore qualche anima pia che mi risponda altrimenti mi metto una corda al collo... |
Don't you let your demons pull you down cause you can have it all |
 |
|
lacrijux
Utente Gastema
  

Regione: Puglia
Prov.: Bari
Città: bari
|
Inserito il - 26/08/2008 : 14:42:17
|
per accedere al valore puntato devi usare la &
per valore puntatore intendo dire: al valore a cui punta il puntatore
|
...mok a kedda kia.... bello! Ma sta a parl o sa a muv le rekkiie? citazione colta: Megghiie ferit ke muert! La fregatura e' che la coca cola si paga, ma il chinotto e' gratis. "la vertigine non è paura di cadere, ma è voglia di volare!"[cit] |
Modificato da - lacrijux in data 26/08/2008 14:43:25 |
 |
|
n/a
deleted
Prov.: Bari
Città: Bari
|
Inserito il - 27/08/2008 : 11:42:31
|
La function è corretta. Il problema è come viene attivata ed il tipo punt. Esempio:
#include <stdio.h> typedef int punt; void calcola (punt *p1, punt *p2, punt *p3, punt *p); int main() { punt *a, *b, *c, *d; int x, y, z, zz; // inizializza puntatori c=&x; a=&y; b=&z; d=&zz; *a =2; *b=3; *c=1; printf("\n *c= %d \n" , *c); calcola ( a, b, c, d); printf(" *d= %d \n" , *d); system("pause"); return 0; }
void calcola (punt *p1, punt *p2, punt *p3, punt *p){ printf("Hello World\n *p3= %d \n" , *p3); switch(*p3) { case 1: *p = *p1 + *p2; break; } printf("Hello World\n *p= %d \n" , *p); }
|
 |
|
Leon
Utente giovane

Regione: Puglia
Prov.: Bari
Città: Monopoli
|
Inserito il - 27/08/2008 : 15:02:13
|
Citazione: Messaggio inserito da Laura Caponetti
La function è corretta. Il problema è come viene attivata ed il tipo punt. Esempio:
#include <stdio.h> typedef int punt; void calcola (punt *p1, punt *p2, punt *p3, punt *p); int main() { punt *a, *b, *c, *d; int x, y, z, zz; // inizializza puntatori c=&x; a=&y; b=&z; d=&zz; *a =2; *b=3; *c=1; printf("\n *c= %d \n" , *c); calcola ( a, b, c, d); printf(" *d= %d \n" , *d); system("pause"); return 0; }
void calcola (punt *p1, punt *p2, punt *p3, punt *p){ printf("Hello World\n *p3= %d \n" , *p3); switch(*p3) { case 1: *p = *p1 + *p2; break; } printf("Hello World\n *p= %d \n" , *p); }
Ok questa mi torna nuova.... perchè devo inizializzare i puntatori in quel modo ? cioè come è scritto in questo esempio è come se dichiaro i puntatori tre volte.... Un secondo faccio l'esempio diretto sulla stessa funzione:
#include <stdio.h> typedef int punt; punt *a, *b, *c, *d; void calcola (punt *p1, punt *p2, punt *p3, punt *p); int main() { // punt *a, *b, *c, *d; <-- questo nelle dich. globali // int x, y, z, zz; <-- questo lo elimino // inizializza puntatori <-- perchè inizializzarli cosi ? // c=&x; a=&y; b=&z; d=&zz; // *a =2; // *b=3; // *c=1; // printf("\n *c= %d \n" , *c); calcola ( &p1, &p2, &p3, &p); printf(" *d= %d \n" , *d); system("pause"); return 0; }
void calcola (punt *p1, punt *p2, punt *p3, punt *p){ printf("Hello World\n *p3= %d \n" , *p3); switch(*p3) { case 1: *p = *p1 + *p2; break; } printf("Hello World\n *p= %d \n" , *p); }
In tutti i casi ci sono delle piccose cose: 1) Nel passaggio dei parametri alle function, il puntatore dev'essere passato nella notazione &puntatore (per permetterci di passare l'indirizzo) e non come semplice passaggio per valore... Il problema è che il compilatore mi da errore anche se metto la &puntatore nella chiamata della function.... 2) Nella riga di comando subito successiva allo SWITCH, continua ad esserci l'errore INVALID OPERANDS TO BINARY + (o le altre tre operazioni)...
@ lacrijux: la & viene usata per restituire l'indirizzo a cui punta il puntatore... la * invece (operatore di deferenziazione) viene usata per restituire la variabile (quindi il suo contenuto)...
ora provo come ha proposto Laura Caponetti (non penso sia la VERA Laura Caponetti), altrimenti mi do all'ippica (o se qualcuno che non è in vacanza prova ad aiutarmi).....
Ciao a tutti e grazie ancora |
Don't you let your demons pull you down cause you can have it all |
 |
|
genius
dott. ing. cav. ...FN
    

Regione: Puglia
Prov.: Bari
Città: Molfetta - Caput Mundi
|
Inserito il - 27/08/2008 : 15:23:45
|
premetto che è da un pò che non programmo in c++. Ti rispondo per quel che ricordo.
Citazione: Messaggio inserito da Leon
Raga mi vergogno anche a chiedere aiuto per questi errori, ma non ne riesco proprio a venire a capo.... creo una piccola lista spero mi sappiate aiutare:
ERRORE1:switch quantity not an integer; ERRORE2:invalid operands to binary + (perche' non mi da quest'errore con la sottrazione ???) CODICE: void calcola (punt *p1, punt *p2, punt *p3, punt *p){ switch(*p3) { case 1: *p=*p1 + *p2; break; } ......
ERRORE: comparison between pointer and integer CODICE: void calcola (punt *p1, punt *p2, punt *p3, punt *p){ if (*p3==1) ......
ERRORE: assignment makes pointer from integer without a cast CODICE: *p = *p1 - *p2;
Nell'ultimo errore, cosi come nel secondo, non capisco: mettendo *p (per esempio) di fatto, non e' come se operassi con il contenuto dell'indirizzo puntato da p ? (ossia con il contenuto dell'indirizzo contenuto in p) ??? Se si, perche' mi da questo errore ??? PRECISO che i puntatori in fase di dichiarazione sono stati posti cosi:
typedef int *punt; punt p,p1,p2,p3;
Mi sapreste rispondere ??? Grazie mille in anticipo
per quanto vedo qui, punt è un puntatore ad int, quindi in tutti gli altri punti del programma dovresti usare semplicemente punt. ti faccio un esempio di come dovrebbe essere scritto il tutto:
CODICE: void calcola (punt p1, punt p2, punt p3, punt p){ switch(*p3) { case 1: *p=*p1 + *p2; break; } ......
CODICE: void calcola (punt p1, punt p2, punt p3, punt p){ if (*p3==1) ......
CODICE: *p = *p1 - *p2;
fermo restando la dichiarazione:
typedef int *punt; punt p,p1,p2,p3; |
"...e se non hai morale e se non hai passione se nessun dubbio ti assale perché la sola ragione che ti interessa avere è una ragione sociale soprattutto se hai qualche dannata guerra da fare non farla nel mio nome non farla nel mio nome che non hai mai domandato la mia autorizzazione se ti difenderai non farlo nel mio nome che non hai mai domandato la mia opinione..."
Un blog farlocco |
 |
|
Leon
Utente giovane

Regione: Puglia
Prov.: Bari
Città: Monopoli
|
Inserito il - 27/08/2008 : 15:46:28
|
Aggiornamento: come dice Laura Caponetti in effetti in fase di compilazione non da alcun errore, ma rimane il fatto che comunque il programma non effettua alcun passaggio per riferimento poichè alla chiusura della function e al ritorno al main, il contenuto delle variabili puntate cambiano...
Comunque per chiarezza incollo l'intero codice e vi metto come commento ciò che io penso..... booooh....
#include <stdio.h>
typedef int punt;
void menu (punt *op1, punt *op2, punt *s); void math (punt *ris, punt *s, punt *op1, punt *op2);
main () { punt *x, *y, *z, *zs; int a, b, c, d; x= &a; y= &b; z= &c; zs= &d; do { menu (x, y, z); //se uso la notazione &, come in teoria si dovrebbe fare (menu(&x, &y, &z)), il compilatore mi dice 17 cannot convert `punt**' to `punt*' for argument `1' to `void menu(punt*, punt*, punt*)'
printf ("%i\n%i\n%i\n", z, x, y); //questa riga l'ho messa per verificare se i valori ritornati al main fossero giusti e, in effetti, sono completamente errati (credo che stampando cosi vengano in realtà fuori gli indirizzi ma, usando la *, vengono fuori valori assurdi)
math (zs, z, x, y); if (*z!=0) { printf ("Il risultato dell'operazione richiesta e' %i", zs); } getchar(); } while (*z!=0); } void menu (punt *op1, punt *op2, punt *s ) { printf(" |---------------------------------------------------------------------|\n"); printf(" | ***THIS SOFTWARE IS PRODUCED BY*** |\n"); printf(" | ***LEON*** |\n"); printf(" |---------------------------------------------------------------------|\n"); getchar(); printf (" --- Inserisci il primo dei due operandi ---\n"); scanf ("%i", &op1); printf (" --- Inserisci il secondo dei due operandi ---\n"); scanf ("%i", &op2); printf (" --- Premi 1 per la somma ---\n"); printf (" --- Premi 2 per la sottrazione ---\n"); printf (" --- Premi 3 per la divisione ---\n"); printf (" --- Premi 4 per la moltiplicazione ---\n"); printf (" --- Premi 0 per uscire dal programma ---\n"); //printf (" --- Premi 6 per il calcolo di una percentuale ---\n"); scanf ("%i", &s); } void math (punt *ris, punt *s, punt *op1, punt *op2) { printf ("%i\n", s); printf("%i\n", op1); printf("%i\n", op2); switch (*s) { case 1 : *ris = *op1+*op2; break; case 2 : *ris = *op1-*op2; break; case 3 : *ris = *op1 / *op2; break; case 4 : *ris = *op1* *op2; break; default : printf ("\nScelta errata oppure vuoi uscire"); } }
|
Don't you let your demons pull you down cause you can have it all |
 |
|
Leon
Utente giovane

Regione: Puglia
Prov.: Bari
Città: Monopoli
|
Inserito il - 27/08/2008 : 15:50:04
|
Citazione: Messaggio inserito da genius
premetto che è da un pò che non programmo in c++. Ti rispondo per quel che ricordo.
Citazione: Messaggio inserito da Leon
Raga mi vergogno anche a chiedere aiuto per questi errori, ma non ne riesco proprio a venire a capo.... creo una piccola lista spero mi sappiate aiutare:
ERRORE1:switch quantity not an integer; ERRORE2:invalid operands to binary + (perche' non mi da quest'errore con la sottrazione ???) CODICE: void calcola (punt *p1, punt *p2, punt *p3, punt *p){ switch(*p3) { case 1: *p=*p1 + *p2; break; } ......
ERRORE: comparison between pointer and integer CODICE: void calcola (punt *p1, punt *p2, punt *p3, punt *p){ if (*p3==1) ......
ERRORE: assignment makes pointer from integer without a cast CODICE: *p = *p1 - *p2;
Nell'ultimo errore, cosi come nel secondo, non capisco: mettendo *p (per esempio) di fatto, non e' come se operassi con il contenuto dell'indirizzo puntato da p ? (ossia con il contenuto dell'indirizzo contenuto in p) ??? Se si, perche' mi da questo errore ??? PRECISO che i puntatori in fase di dichiarazione sono stati posti cosi:
typedef int *punt; punt p,p1,p2,p3;
Mi sapreste rispondere ??? Grazie mille in anticipo
per quanto vedo qui, punt è un puntatore ad int, quindi in tutti gli altri punti del programma dovresti usare semplicemente punt. ti faccio un esempio di come dovrebbe essere scritto il tutto:
CODICE: void calcola (punt p1, punt p2, punt p3, punt p){ switch(*p3) { case 1: *p=*p1 + *p2; break; } ......
CODICE: void calcola (punt p1, punt p2, punt p3, punt p){ if (*p3==1) ......
CODICE: *p = *p1 - *p2;
fermo restando la dichiarazione:
typedef int *punt; punt p,p1,p2,p3;
Non è c++ è c  Comunque non va nemmeno cosi....al main ritornano sempre valori sballati |
Don't you let your demons pull you down cause you can have it all |
 |
|
n/a
deleted
Prov.: Bari
Città: Bari
|
Inserito il - 27/08/2008 : 16:39:57
|
Alcune correzioni:
#include <stdio.h>
typedef int punt;
void menu (punt *op1, punt *op2, punt *s); void math (punt *ris, punt *s, punt *op1, punt *op2);
main () { punt *x, *y, *z, *zs; int a, b, c, d; x= &a; y= &b; z= &c; zs= &d; do { //menu (x, y, z); //se uso la notazione &, come in teoria si dovrebbe fare (menu(&x, &y, &z)), il compilatore mi dice 17 cannot convert `punt**' to `punt*' for argument `1' to `void menu(punt*, punt*, punt*)'
//printf ("%i\n%i\n%i\n", z, x, y); //questa riga l'ho messa per verificare se i valori ritornati al main fossero giusti e, in effetti, sono completamente errati (credo che stampando cosi vengano in realtà fuori gli indirizzi ma, usando la *, vengono fuori valori assurdi)
// correzione---- se si vuole effetuare il passaggio per riferimento è necessario // è necessario considerare l'indirizzo dei parametri in questo caso delle variabili intere caso delle variabili // a, b, c - le operazioni aritmetiche si vogliono fare infatti tra interi // non si deve quindi introdurre una variabile puntatore
menu (&a, &b, &c); printf ("%i\n%i\n%i\n", a, b, c); // correzione: in modo analogo si modificano i parametri e la function math // buon lavoro! math (zs, z, x, y); if (*z!=0) { printf ("Il risultato dell'operazione richiesta e' %i", zs); } getchar(); } while (*z!=0); }
void menu (punt *op1, punt *op2, punt *s ) { // correzione - poiche i parametri passati sono indirizzi è corretto // introdurre come parametri della funzione dei puntatori // ma la scanf deve essere modificata
printf(" |---------------------------------------------------------------------|\n");
printf(" | ***THIS SOFTWARE IS PRODUCED BY*** |\n"); printf(" | ***LEON*** |\n");
printf(" |---------------------------------------------------------------------|\n"); getchar(); printf (" --- Inserisci il primo dei due operandi ---\n"); // correzione - la scanf vuole l'indirizzo della variabile in cui inserire il valore // letto - questo indirizzo è il valore del puntatore op1 // scanf ("%i", &op1); scanf ("%i", op1); printf (" --- Inserisci il secondo dei due operandi ---\n"); // scanf ("%i", &op2); scanf ("%i", op2); printf (" --- Premi 1 per la somma ---\n"); printf (" --- Premi 2 per la sottrazione ---\n"); printf (" --- Premi 3 per la divisione ---\n"); printf (" --- Premi 4 per la moltiplicazione ---\n"); printf (" --- Premi 0 per uscire dal programma ---\n"); //printf (" --- Premi 6 per il calcolo di una percentuale ---\n"); // scanf ("%i", &s); scanf ("%i", s); }
void math (punt *ris, punt *s, punt *op1, punt *op2) { printf ("%i\n", s); printf("%i\n", op1); printf("%i\n", op2); switch (*s) { case 1 : *ris = *op1+*op2; break; case 2 : *ris = *op1-*op2; break; case 3 : *ris = *op1 / *op2; break; case 4 : *ris = *op1* *op2; break; default : printf ("\nScelta errata oppure vuoi uscire"); } }
|
 |
|
Leon
Utente giovane

Regione: Puglia
Prov.: Bari
Città: Monopoli
|
Inserito il - 28/08/2008 : 12:12:19
|
Ok risolto  Un grazie mille a Laura Caponetti (e penso debba chiedere scusa se ho sempre messo in dubbio tutto ciò che tu abbia scritto)... Anche se in tutti i casi non ho usato &a, &b, &c ed &d come hai suggerito tu, ma direttamente x,y,z,zs (poichè contengono l'indirizzo che punta alle variabili intere)... Per chiarire una volta per tutte il dubbio, incollo di nuovo l'intero codice (questa volta corretto) cosi possiamo aiutare chi magari ha avuto gli stessi miei problemi e non ha avuto il coraggio di chiedere per paura di esser preso per fesso..... Ecco il codice:
#include <stdio.h>
typedef int *punt;
void menu (punt op1, punt op2, punt s); void math (punt ris, punt s, punt op1, punt op2);
main () { punt x, y, z, zs; int a, b, c, d; x= &a; y= &b; z= &c; zs= &d; do { menu (x, y, z); printf ("\n%i\n%i\n", *x, *y); math (zs, z, x, y); if (*z!=0) { printf ("Il risultato dell'operazione richiesta e' %i\n", *zs); } getchar(); } while (*z!=0); } void menu (punt op1, punt op2, punt s ) { printf(" |---------------------------------------------------------------------|\n"); printf(" | ***THIS SOFTWARE IS PRODUCED BY*** |\n"); printf(" | ***LEON*** |\n"); printf(" |---------------------------------------------------------------------|\n"); getchar(); printf (" --- Inserisci il primo dei due operandi ---\n"); scanf ("%i", op1); printf (" --- Inserisci il secondo dei due operandi ---\n"); scanf ("%i", op2); printf (" --- Premi 1 per la somma ---\n"); printf (" --- Premi 2 per la sottrazione ---\n"); printf (" --- Premi 3 per la divisione ---\n"); printf (" --- Premi 4 per la moltiplicazione ---\n"); printf (" --- Premi 0 per uscire dal programma ---\n"); scanf ("%i", s); } void math (punt ris, punt s, punt op1, punt op2) { switch (*s) { case 1 : *ris = *op1+*op2; break; case 2 : *ris = *op1-*op2; break; case 3 : *ris = *op1 / *op2; break; case 4 : *ris = *op1* *op2; break; default : printf ("\nScelta errata oppure vuoi uscire"); } }
|
Don't you let your demons pull you down cause you can have it all |
 |
|
genius
dott. ing. cav. ...FN
    

Regione: Puglia
Prov.: Bari
Città: Molfetta - Caput Mundi
|
Inserito il - 28/08/2008 : 18:27:18
|
scusa leon, ma a me sembra ke le correzioni ke hai fatto sono esattamente quelle che ti ho suggerito... mi sbaglio? |
"...e se non hai morale e se non hai passione se nessun dubbio ti assale perché la sola ragione che ti interessa avere è una ragione sociale soprattutto se hai qualche dannata guerra da fare non farla nel mio nome non farla nel mio nome che non hai mai domandato la mia autorizzazione se ti difenderai non farlo nel mio nome che non hai mai domandato la mia opinione..."
Un blog farlocco |
 |
|
Leon
Utente giovane

Regione: Puglia
Prov.: Bari
Città: Monopoli
|
Inserito il - 29/08/2008 : 16:04:31
|
Citazione: Messaggio inserito da genius
scusa leon, ma a me sembra ke le correzioni ke hai fatto sono esattamente quelle che ti ho suggerito... mi sbaglio?
Si infatti... ma rimaneva lo stesso il problema che l'errore non era nelle chiamate (nonostante fossero errate poichè erano frutto di vari tentativi ma il codice iniziale era esatto), bensi nell'inizializzazione dei puntatori...  |
Don't you let your demons pull you down cause you can have it all |
 |
|
n/a
deleted
Prov.: Bari
Città: Bari
|
Inserito il - 29/08/2008 : 16:46:30
|
Ecco una versione del programma in cui i puntatori sono utilizzati dove effettivamente sono necessari. Oltre alle dichiarazioni di punt ...nella versione inziale c'era un errore nei parametri della chiamata alla scanf Credo non ci sua altro da chiarire
#include <stdio.h>
typedef int *punt;
void menu (punt op1, punt op2, punt s); void math (punt ris, int s, int op1, int op2);
main () { // punt x, y, z, zs; int a, b, c, d; //x= &a; //y= &b; //z= &c; //zs= &d; do { menu (&a, &b, &c); printf ("\n%i\n%i\n", a, b); math (&d, c, a, b); if (c!=0) { printf ("Il risultato dell'operazione richiesta e' %i\n", d); } getchar(); } while (c!=0); }
void menu (punt op1, punt op2, punt s ) {
printf(" |---------------------------------------------------------------------|\n");
printf(" | ***THIS SOFTWARE IS PRODUCED BY*** |\n"); printf(" | ***LEON*** |\n");
printf(" |---------------------------------------------------------------------|\n"); getchar(); printf (" --- Inserisci il primo dei due operandi ---\n"); scanf ("%i", op1); //!!!!!!!!!!! printf (" --- Inserisci il secondo dei due operandi ---\n"); scanf ("%i", op2); printf (" --- Premi 1 per la somma ---\n"); printf (" --- Premi 2 per la sottrazione ---\n"); printf (" --- Premi 3 per la divisione ---\n"); printf (" --- Premi 4 per la moltiplicazione ---\n"); printf (" --- Premi 0 per uscire dal programma ---\n"); scanf ("%i", s); }
void math (punt ris, int s, int op1, int op2) { // math deve restituire solo il primo parametro switch (s) { case 1 : *ris = op1 + op2; break; case 2 : *ris = op1- op2; break; case 3 : *ris = op1 / op2; break; case 4 : *ris = op1* op2; break; default : printf ("\nScelta errata oppure vuoi uscire"); } }
|
 |
|
|
Discussione  |
|
|
|