Forum by laureateci.it
[ Home | REGOLE FORUM | Tutti i blog | Profilo | Registrati | CHAT | Discussioni Attive | Discussioni Recenti | Segnalibro | Msg privati | Sondaggi Attivi | Utenti | Download Informatica | Download ICD | Download TPS | Download Magistrale | Download Specialistica | Giochi | Cerca nel web | cerca | faq | RSS ]
Nome Utente:
Password:
Salva Password
Password Dimenticata?

 Tutti i Forum
 INFORMATICA - Primo Anno
 Programmazione
 Help piccola funzione

Nota: Devi essere registrato per poter inserire un messaggio.
Per registrarti, clicca qui. La Registrazione è semplice e gratuita!

Larghezza finestra:
Nome Utente:
Password:
Modo:
Formato: GrassettoCorsivoSottolineatoBarrato Aggiungi Spoiler Allinea a  SinistraCentraAllinea a Destra Riga Orizzontale Inserisci linkInserisci EmailInserisci FlashInserisci Immagine Inserisci CodiceInserisci CitazioneInserisci Lista Inserisci Faccine
   
Icona Messaggio:              
             
Messaggio:

  * Il codice HTML è OFF
* Il Codice Forum è ON

Smilies
Approvazione [^] Arrabbiato [:(!] Bacio [:X] Bevuta [:273]
Caldo [8D] Compiaciuto [8)]    
compleanno [:269]
Davvero Felice [:D] Diavoletto [}:)] Disapprovazione [V] Domanda [?]
Felice [:)] Fumata [:29] Goloso [:P] Imbarazzato [:I]
Infelice [:(] Morte improvvisa da [:62]
Morto [xx(] Occhio Nero [B)] Occhiolino [;)] Palla 8 [8]
pc [:205]    
Riproduzione [:76]
Scioccato [:O]      

   Allega file
  Clicca qui per inserire la tua firma nel messaggio.
Clicca qui per sottoscrivere questa Discussione.
    

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...

Forum by laureateci.it © 2002 - 2012 Laureateci Communications Torna all'inizio della Pagina
Il DB ha risposto in 0,13 secondi.

TargatoNA.it | SuperDeejay.Net | Antidoto.org | Brutto.it | Equiweb.it | Snitz Forum 2000