V I S U A L I Z Z A D I S C U S S I O N E |
Leon |
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
|
13 U L T I M E R I S P O S T E (in alto le più recenti) |
n/a |
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"); } }
|
Leon |
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...  |
genius |
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? |
Leon |
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"); } }
|
n/a |
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 |
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 |
Leon |
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"); } }
|
genius |
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; |
Leon |
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 |
n/a |
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); }
|
lacrijux |
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
|
Leon |
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... |
Capitan |
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... |
|
|