Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Core Ultra 7 270K Plus e Core Ultra 7 250K Plus: Intel cerca il riscatto ma ci riesce in parte
Core Ultra 7 270K Plus e Core Ultra 7 250K Plus: Intel cerca il riscatto ma ci riesce in parte
Abbiamo provato le nuove CPU Intel Core Ultra 7 270K Plus e Core Ultra 7 250K Plus: più core e ottimizzazioni al funzionamento interno migliorano le prestazioni, anche in virtù di prezzi annunciati interessanti. A questo si aggiungono nuove ottimizzazioni software. Purtroppo, a fronte di prestazioni di calcolo elevate, il quadro rimane incerto nel gaming, dove l'andamento rimane altalenante. Infine, rimane il problema della piattaforma a fine vita.
PC Specialist Lafité 14 AI AMD: assemblato come vuoi tu
PC Specialist Lafité 14 AI AMD: assemblato come vuoi tu
Il modello "build to order" di PCSpecialist permette di selezionare una struttura base per un sistema, personalizzandolo in base alle specifiche esigenze con una notevole flessibilità di scelta tra i componenti. Il modello Lafité 14 AI AMD è un classico notebook clamshell compatto e potente, capace di assicurare una elevata autonomia di funzionamento anche lontano dalla presa di corrente
Recensione Nothing Phone 4(a): sempre iconico ma ora più concreto
Recensione Nothing Phone 4(a): sempre iconico ma ora più concreto
Nothing con il suo nuovo Phone 4(a) conferma la sua identità visiva puntando su una costruzione che nobilita il policarbonato. La trasparenza resta l'elemento cardine, arricchita da una simmetria interna curata nei minimi dettagli. Il sistema Glyph si evolve, riducendosi nelle dimensioni ma aumentando l'utilità quotidiana grazie a nuove funzioni software integrate e notifiche visive. Ecco tutti i dettagli nella recensione completa
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 19-11-2009, 13:20   #1
The-Revenge
Senior Member
 
Iscritto dal: Feb 2007
Messaggi: 1352
[C]Ciclo for infinito, non riesco ad individuare il problema

Perchè questo cicli for mi và in un loop infinito?

Codice:
for(t=0;t<dim2;t++) 
      for(i=0;i<dim;i++)
       for(j=0;j<dim;j++){
                          if(A[i]==B[j]){
                                         for(k=0;k<t;k++)
                                          if(A[i]!=V[k])
                                           V[t]=A[i];
                                           else break;
                                           }
                                           }
__________________
Ho venduto a : truedocman2004,ragen-fio
Ho acquistato da :shinakuma, britt-one
The-Revenge è offline   Rispondi citando il messaggio o parte di esso
Old 19-11-2009, 13:38   #2
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Codice:
for (t=0; t<dim2; t++) 
    for (i=0; i<dim; i++)
        for (j=0; j<dim; j++)
            if (A[i]==B[j]) {
                for (k=0; k<t; k++)
                    if (A[i]!=V[k])
                        V[t]=A[i];
                    else 
                        break;
            }
Sei sicuro che questi cicli annidati ti vadano in loop infinito? Non è che semplicemente ci vuole molto tempo per eseguire tutte le computazioni?

Che grandezze hai per dim2, dimm?

Perchè (sarò ciecato io) dal codice non mi pare ci sia nulla che possa riccondurre alla possibilità di un loop infinito.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 19-11-2009, 13:43   #3
The-Revenge
Senior Member
 
Iscritto dal: Feb 2007
Messaggi: 1352
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
Codice:
for (t=0; t<dim2; t++) 
    for (i=0; i<dim; i++)
        for (j=0; j<dim; j++)
            if (A[i]==B[j]) {
                for (k=0; k<t; k++)
                    if (A[i]!=V[k])
                        V[t]=A[i];
                    else 
                        break;
            }
Sei sicuro che questi cicli annidati ti vadano in loop infinito? Non è che semplicemente ci vuole molto tempo per eseguire tutte le computazioni?

Che grandezze hai per dim2, dimm?

Perchè (sarò ciecato io) dal codice non mi pare ci sia nulla che possa riccondurre alla possibilità di un loop infinito.
in effetti ora che mi ci fai pensare in altri programmi mi andava in loop infinito e la finestra rimaneva aperta, mentre qua mi dà "il programma ha smesso di funzionare". Quindi non ha un ciclo infinito, ma qualche problema c'è di sicuro (il compilatore non me lo segnala però).
Le dimensioni di dim sono 100, dim 2 varia a seconda degli elementi uguali di dim 1, ma comunque è compreso tra 0 e 100
__________________
Ho venduto a : truedocman2004,ragen-fio
Ho acquistato da :shinakuma, britt-one
The-Revenge è offline   Rispondi citando il messaggio o parte di esso
Old 19-11-2009, 13:46   #4
The-Revenge
Senior Member
 
Iscritto dal: Feb 2007
Messaggi: 1352
questo è tutto il codice

Codice:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define VERO 1
#define FALSO 0
#define dim 100
void prim(int);

main(){
       int min,mag,dif,dim2,i,j,k,t, A[dim],B[dim],V[dim2];
       srand(time(NULL));
       for(i=0;i<dim;i++){
                          A[i]=rand()%27+45;
                          B[i]=rand()%27+45;
                          }
       printf("\nIl primo vettore e':\n");
       for(i=0;i<dim;i++)printf("%d ",A[i]);
       printf("\nIl secondo vettore e':\n");
       for(i=0;i<dim;i++)printf("%d ",B[i]);
       
       //calcolo dimensione del vettore intersezione
       
      for(i=0;i<dim;i++)
       for(j=0;j<dim;j++)
        if(A[i]==B[j]){
                       dim2++;
                       break;
                       }
       //fine
       
       //calcolo elementi intersezione eliminando ripetuti
     for(t=0;t<dim2;t++) 
      for(i=0;i<dim;i++)
       for(j=0;j<dim;j++){
                          if(A[i]==B[j]){
                                         for(k=0;k<t;k++)
                                          if(A[i]!=V[k])
                                           V[t]=A[i];
                                           else break;
                                           }
                                           }
printf("\nIl vettore intersezione e':\n");
for(i=0;i<dim2;i++)printf("%d ",V[i]);
for(i=0;i<dim2;i++)if(V[i]>V[0])mag++;
min=dim-mag;
dif=mag-min;
prim(dif);
system("PAUSE");
return(0);
}

//funziona primalità
void prim(int num){
int i=3;
int primo = FALSO;
if((num%2)==0 || (num==1)) //Se il numero è 1 o 2 allora è primo
primo = VERO;

while((primo==FALSO) && (i<num)) //Qui arriva soltanto se il numero è maggiore di 2
{
if((num%i)==0) //Controlla se da una divisione esce il resto zero
primo=VERO;
i=i+2;
}


if (primo==FALSO)
printf("Il numero %d e' primo\n", num);
else
printf("Il numero %d non e' primo\n", num);

}
__________________
Ho venduto a : truedocman2004,ragen-fio
Ho acquistato da :shinakuma, britt-one
The-Revenge è offline   Rispondi citando il messaggio o parte di esso
Old 19-11-2009, 16:59   #5
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Scusa, ma dim2 prima di essere incrementato, non ha bisogno di essere inizializzato?
Codice:
main(){
       int min,mag,dif,dim2,i,j,k,t, A[dim],B[dim],V[dim2];
       srand(time(NULL));
       for(i=0;i<dim;i++){
                          A[i]=rand()%27+45;
                          B[i]=rand()%27+45;
                          }
       printf("\nIl primo vettore e':\n");
       for(i=0;i<dim;i++)printf("%d ",A[i]);
       printf("\nIl secondo vettore e':\n");
       for(i=0;i<dim;i++)printf("%d ",B[i]);
       
       //calcolo dimensione del vettore intersezione
       
      for(i=0;i<dim;i++)
       for(j=0;j<dim;j++)
        if(A[i]==B[j]){
                       dim2++;
                       break;
                       }
       //fine
Anzi, a essere onesto molte cose non mi tornano (sarà che sono stanco...); tipo il codice mi pare sia in linguaggio C.
Vedo delle variabili dichiarate, ma non inizializzate e poi utilizzate (tipo dim2, ma anche dim)... sono dolori a tutto spiano, da quel poco che ricordo del C.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 19-11-2009, 17:11   #6
yorkeiser
Senior Member
 
L'Avatar di yorkeiser
 
Iscritto dal: Jul 2006
Città: Tristram
Messaggi: 517
Questa dichiarazione è errata:

Codice:
int min,mag,dif,dim2,i,j,k,t, A[dim],B[dim],V[dim2];
Non puoi dichiarare sulla stessa riga un intero (dim2) e contestualmente un vettore che ha dimensione dim2, visto che oltretutto, ammesso che dim2 sia stato inizializzato, varrebbe 0, quindi avresti un vettore di dimensione 0.

Puoi correggere ad esempio con:
Codice:
int min,mag,dif,dim2,i,j,k,t, A[dim],B[dim];
dim2=100;
int V[dim2];
EDIT: Avevo lasciato il tab aperto prima di postare la risposta, vedo che Banryu mi ha preceduto
Comunque, repetita iuvant
__________________
Il sole è giallo
yorkeiser è offline   Rispondi citando il messaggio o parte di esso
Old 19-11-2009, 17:29   #7
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da yorkeiser Guarda i messaggi
EDIT: Avevo lasciato il tab aperto prima di postare la risposta, vedo che Banryu mi ha preceduto
Comunque, repetita iuvant
No, no, vai vai anche tu, io il codice C non lo "frequento" più da anni ormai
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 19-11-2009, 21:38   #8
The-Revenge
Senior Member
 
Iscritto dal: Feb 2007
Messaggi: 1352
scusa ma se quindi dichiari
int dim;
int v[dim]

cosi va bene?o nemmeno? devo per froza dargli un numero alla dimensione?

Comunque ho modificato il programma in una maniera che forse dovrebbe essere più corretta, ma non funziona ugualmente, mi dà numeri random.

Codice:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define VERO 1
#define FALSO 0
#define dim 10
#define dim3 27
void prim(int);

main(){
       int min=0,mag=0,dif=0,dim2=0,i=0,j=0,k=0,t=0, A[dim],B[dim],Atemp[dim3],Btemp[dim3];
       srand(time(NULL));
       for(i=0;i<dim;i++){
                          A[i]=rand()%27+45;
                          B[i]=rand()%27+45;
                          }
       printf("\nIl primo vettore e':\n");
       for(i=0;i<dim;i++)printf("%d ",A[i]);
       printf("\nIl secondo vettore e':\n");
       for(i=0;i<dim;i++)printf("%d ",B[i]);
       
       //calcolo dimensione del vettore intersezione
       
      for(i=0;i<dim;i++){
       for(k=0;k<j;k++)if(A[i]==A[k])break;                  
       for(j=0;j<dim;j++)
        if(A[i]==B[j]){
                       dim2++;
                       break;
                       }
                       }
       //fine
       
       printf("%d",dim2);
int V[dim2];
       //calcolo elementi intersezione eliminando ripetuti
     for(i=0;i<dim3;i++)
      for(j=0;j<dim;j++){
                                        for(k=0;k<dim;k++)
                                        if(A[j]==A[k])continue;
                                        if(i+45==A[j])
                                       Atemp[i]=1;
                                       else Atemp[i]=0;
                                       }
                                       
      for(i=0;i<dim3;i++)
      for(j=0;j<dim;j++){
                                        for(k=0;k<dim;k++)
                                        if(B[j]==B[k])continue;
                                        if(i+45==B[j])
                                       Btemp[i]=1;
                                       else Btemp[i]=0;
                                       }
                                     
      for(i=0;i<dim2;i++)
       for(j=0;j<dim3;j++)
       if((Atemp[j]==1)&&(Btemp[j]==1))V[i]=i+45;
                                       
                                           
      //calcolo maggiori, minori, primalità
printf("\nIl vettore intersezione e':\n");
for(i=0;i<dim2;i++)printf("%d ",V[i]);
for(i=0;i<dim2;i++)if(V[i]>V[0])mag++;
min=dim-mag;
dif=mag-min;
prim(dif);
system("PAUSE");
return(0);
}

//funziona primalità
void prim(int num){
int i=3;
int primo = FALSO;
if((num%2)==0 || (num==1)) //Se il numero è 1 o 2 allora è primo
primo = VERO;

while((primo==FALSO) && (i<num)) //Qui arriva soltanto se il numero è maggiore di 2
{
if((num%i)==0) //Controlla se da una divisione esce il resto zero
primo=VERO;
i=i+2;
}


if (primo==FALSO)
printf("Il numero %d e' primo\n", num);
else
printf("Il numero %d non e' primo\n", num);

}
__________________
Ho venduto a : truedocman2004,ragen-fio
Ho acquistato da :shinakuma, britt-one

Ultima modifica di The-Revenge : 19-11-2009 alle 21:41.
The-Revenge è offline   Rispondi citando il messaggio o parte di esso
Old 20-11-2009, 11:32   #9
yorkeiser
Senior Member
 
L'Avatar di yorkeiser
 
Iscritto dal: Jul 2006
Città: Tristram
Messaggi: 517
Quote:
Originariamente inviato da The-Revenge Guarda i messaggi
scusa ma se quindi dichiari
int dim;
int v[dim]

cosi va bene?o nemmeno? devo per froza dargli un numero alla dimensione?

Codice:
#define dim 10
int v[dim];
va bene, dal momento che dim viene sostituito con il valore 10 e quindi alla seconda riga dichiari un array di 10 elementi.

Codice:
int dim; 
int v[dim];
non va bene perchè:
a) stai utilizzando una variabile (dim) non inizializzata, il cui valore è imprevedibile, e non ha senso dichiarare un array di grandezza casuale
b) la gran parte dei compilatori (ma non ne hai certezza) inizializza dim al valore 0 dopo la dichiarazione, quindi su questi compilatori stai dichiarando un array di 0 elementi.

Potresti avere array di grandezza variabile solo utilizzando l'allocazione dinamica, ma ti consiglio di fare un po' di esperienza col c prima di passare su quella sponda, che per esperienza risulta sempre un po' ostica.
__________________
Il sole è giallo
yorkeiser è offline   Rispondi citando il messaggio o parte di esso
Old 20-11-2009, 14:06   #10
The-Revenge
Senior Member
 
Iscritto dal: Feb 2007
Messaggi: 1352
Quote:
Originariamente inviato da yorkeiser Guarda i messaggi
Codice:
#define dim 10
int v[dim];
va bene, dal momento che dim viene sostituito con il valore 10 e quindi alla seconda riga dichiari un array di 10 elementi.

Codice:
int dim; 
int v[dim];
non va bene perchè:
a) stai utilizzando una variabile (dim) non inizializzata, il cui valore è imprevedibile, e non ha senso dichiarare un array di grandezza casuale
b) la gran parte dei compilatori (ma non ne hai certezza) inizializza dim al valore 0 dopo la dichiarazione, quindi su questi compilatori stai dichiarando un array di 0 elementi.

Potresti avere array di grandezza variabile solo utilizzando l'allocazione dinamica, ma ti consiglio di fare un po' di esperienza col c prima di passare su quella sponda, che per esperienza risulta sempre un po' ostica.
capisco...però non ho problemi se prima mi calcolo la dimensione, e poi gliela assegno, giusto?

Ad esempio se faccio un operazione su 2 vettori e questa operazione alla fine mi restituisce dim2, e nel rigo dopo scrivo
int v[dim2] cosi va bene vero?
__________________
Ho venduto a : truedocman2004,ragen-fio
Ho acquistato da :shinakuma, britt-one
The-Revenge è offline   Rispondi citando il messaggio o parte di esso
Old 23-11-2009, 14:30   #11
The-Revenge
Senior Member
 
Iscritto dal: Feb 2007
Messaggi: 1352
Ragazzi ho riscritto il codice, adesso mi funziona tutto tranne un pezzo in cui stampo i valori delle intersezioni.

Ecco tutto il programma

Spoiler:
Codice:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define VERO 1
#define FALSO 0
#define dim 10
#define dim3 27
void prim(int);

main(){
       int min=0,mag=0,dif=0,dim2=0,i=0,j=0,k=0; 
       int A[dim],B[dim],Atemp[dim3],Btemp[dim3];
       srand(time(NULL));
       for(i=0;i<dim;i++){
                          A[i]=rand()%27+45;
                          B[i]=rand()%27+45;
                          }
       printf("\nIl primo vettore e':\n");
       for(i=0;i<dim;i++)printf("%d ",A[i]);
       printf("\nIl secondo vettore e':\n");
       for(i=0;i<dim;i++)printf("%d ",B[i]);
       
       //calcolo dimensione del vettore intersezione
       
      for(i=0;i<dim;i++){
       for(k=0;k<i;k++)if(A[i]==A[k])break;                  
       for(j=0;j<dim;j++)
        if(A[i]==B[j]){
                       dim2++;
                       break;
                       }
                       }
       //fine
       
int V[dim2];
       //calcolo elementi intersezione eliminando ripetuti
       for(i=0;i<dim3;i++)
        for(j=0;j<dim;j++){
         if(A[j]==(i+45)){
                          Atemp[i]=1;
                          break;
                          }
                          else Atemp[i]=0;
                          }
            
            for(i=0;i<dim3;i++)
        for(j=0;j<dim;j++){
         if(B[j]==(i+45)){
                          Btemp[i]=1;
                          break;
                          }
                          else Btemp[i]=0;
                          }
                          
           
           
 //inizio prova
 
 printf("dim2 e' : %d",dim2);
 printf("vettore Atemp: ");
 for(i=0;i<dim3;i++)printf("%d ",Atemp[i]);
 printf("vettore Btemp: ");
 for(i=0;i<dim3;i++)printf("%d ",Btemp[i]);
                                     
       for(i=0;i<dim2;i++)
       for(j=k;j<dim3;j++)
       if((Atemp[j]==1)&&(Btemp[j]==1)){
                                        V[i]=(j+45);
                                        k=j+1;
                                        break;
                                        }
                                        
                                       
      //calcolo maggiori, minori, primalità
printf("\nIl vettore intersezione e':\n");
for(i=0;i<dim2;i++)printf("%d ",V[i]);
for(i=0;i<dim2;i++)if(V[i]>V[0])mag++;
min=dim-mag;
dif=mag-min;
prim(dif);
system("PAUSE");
return(0);
}

//funziona primalità
void prim(int num){
int i=3;
int primo = FALSO;
if((num%2)==0 || (num==1)) //Se il numero è 1 o 2 allora è primo
primo = VERO;

while((primo==FALSO) && (i<num)) //Qui arriva soltanto se il numero è maggiore di 2
{
if((num%i)==0) //Controlla se da una divisione esce il resto zero
primo=VERO;
i=i+2;
}


if (primo==FALSO)
printf("Il numero %d e' primo\n", num);
else
printf("Il numero %d non e' primo\n", num);

}


mentre questo è il pezzo che non funziona

Codice:
 for(i=0;i<dim2;i++)
       for(j=k;j<dim3;j++)
       if((Atemp[j]==1)&&(Btemp[j]==1)){
                                        V[i]=(j+45);
                                        k=j+1;
                                        break;
                                        }
Non funziona perchè l'ultimo valore me lo da casuale, un numero grandissimo
__________________
Ho venduto a : truedocman2004,ragen-fio
Ho acquistato da :shinakuma, britt-one

Ultima modifica di The-Revenge : 23-11-2009 alle 14:51.
The-Revenge è offline   Rispondi citando il messaggio o parte di esso
Old 23-11-2009, 23:50   #12
maulattu
Senior Member
 
L'Avatar di maulattu
 
Iscritto dal: Mar 2005
Città: ~
Messaggi: 740
Quote:
Originariamente inviato da The-Revenge Guarda i messaggi
capisco...però non ho problemi se prima mi calcolo la dimensione, e poi gliela assegno, giusto?

Ad esempio se faccio un operazione su 2 vettori e questa operazione alla fine mi restituisce dim2, e nel rigo dopo scrivo
int v[dim2] cosi va bene vero?
no, perché il compilatore a compile time non sa quanto varrà dim2.

vedila da questo punto di vista
Codice:
int a;
int b;
int result;
scanf("Numero a: %d", &a);
scanf("Numero b: %d", &b);
result = a+b;
print("Risultato è: %d\n", result);
int v[result];
int i;
fot (i = 0; i <result; i++) {...}
tu a priori sai quanto varrà "result"? No
il compilatore nemmeno, dunque non saprà quanto spazio allocare per l'array v.
ah, a proposito: se non devi usare numeri con segno, dichiara le variabili come unsigned. Non è il massimo avere result = -1 e poi creare (dinamicamente) un array di dimensione result
anzi, mi meraviglio che ti compili una cosa del genere. visual studio 2005 si incazza come una iena, e credo pure gcc.
l'unica cosa permessa è:
Codice:
const unsigned result = 100;
int v[result];
essendo const, l'inizializzazione è obbligatoria dopo la dichiarazione e, di conseguenza, il compilatore saprà quando spazio allocare per l'array v
__________________
Ciao ciao cagnolino Billy
MacMini late 2009, 2.53GHz, 4GB ram, 320GB hard disk, Snow Leopard 10.8.2 - iPod Nano 6th gen.
XBOX Live GamerTag: InsaneMau

Ultima modifica di maulattu : 23-11-2009 alle 23:53.
maulattu è offline   Rispondi citando il messaggio o parte di esso
Old 24-11-2009, 12:56   #13
The-Revenge
Senior Member
 
Iscritto dal: Feb 2007
Messaggi: 1352
Quote:
Originariamente inviato da maulattu Guarda i messaggi
no, perché il compilatore a compile time non sa quanto varrà dim2.

vedila da questo punto di vista
Codice:
int a;
int b;
int result;
scanf("Numero a: %d", &a);
scanf("Numero b: %d", &b);
result = a+b;
print("Risultato è: %d\n", result);
int v[result];
int i;
fot (i = 0; i <result; i++) {...}
tu a priori sai quanto varrà "result"? No
il compilatore nemmeno, dunque non saprà quanto spazio allocare per l'array v.
ah, a proposito: se non devi usare numeri con segno, dichiara le variabili come unsigned. Non è il massimo avere result = -1 e poi creare (dinamicamente) un array di dimensione result
anzi, mi meraviglio che ti compili una cosa del genere. visual studio 2005 si incazza come una iena, e credo pure gcc.
l'unica cosa permessa è:
Codice:
const unsigned result = 100;
int v[result];
essendo const, l'inizializzazione è obbligatoria dopo la dichiarazione e, di conseguenza, il compilatore saprà quando spazio allocare per l'array v
ho capito. Però adesso il programma mi funziona dichiarandolo dopo. Cioè come ho scritto sopra, il programma funziona , dopo varie volte che lo modificato: prima ho fatto il calcolo di dim2, e poi ho dichiariato il vettore di dimensioni dim2. Tu hai detto che nn è possibile, e per motivi giustissimi, però il risultato me lo dà smepre corretto...mhà
__________________
Ho venduto a : truedocman2004,ragen-fio
Ho acquistato da :shinakuma, britt-one
The-Revenge è offline   Rispondi citando il messaggio o parte di esso
Old 24-11-2009, 13:51   #14
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Quote:
Originariamente inviato da The-Revenge Guarda i messaggi
ho capito. Però adesso il programma mi funziona dichiarandolo dopo. Cioè come ho scritto sopra, il programma funziona , dopo varie volte che lo modificato: prima ho fatto il calcolo di dim2, e poi ho dichiariato il vettore di dimensioni dim2. Tu hai detto che nn è possibile, e per motivi giustissimi, però il risultato me lo dà smepre corretto...mhà
Il perchè è presto detto: il tuo codice è perfettamente valido col C99.
Non lo è in C++ e C89.
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 24-11-2009, 16:43   #15
The-Revenge
Senior Member
 
Iscritto dal: Feb 2007
Messaggi: 1352
Quote:
Originariamente inviato da tomminno Guarda i messaggi
Il perchè è presto detto: il tuo codice è perfettamente valido col C99.
Non lo è in C++ e C89.
capito..ammazza ci sono un sacco di regole e di standard
Ma io visual C++ non lo so usare, riesco a malappena a compilare
questo codice per esempio, che mi sembra del tutto normale e lineare, mi dà un errore sia in in visual c che in devc...mi dice "too few arguments in function "int confronto(int)

Codice:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define dim 50
void stampa(void);
int media(void);
void genera(void);
int confronto(int);
int A[dim][dim];
int i,j;
int main(){
    srand(time(NULL));
    genera();
    stampa();
    printf("\nIl numero e' %d",confronto());
    system("PAUSE");
    return(0);
}

    
    
    
    
void genera(void){
     for(i=0;i<dim;i++)
      for(j=0;j<dim;j++)
       A[i][j]=rand()%5+13;
       }
       
void stampa(void){
    printf("\nIl vettore e':\n");
    for(i=0;i<dim;i++){
     printf("\n");
     for(j=0;j<dim;j++)
      printf("%d ",A[i][j]);
      }
      }
      
      
int confronto(int media()){
    int count;
    for(i=0;i<dim;i++)
     for(j=0;j<dim;j++)
      if((j<dim-1-i)&&(j>i)){
                           if(A[i][j]>media())count++;
                           }
                           return(count);
                           }
                           
int media(void){
    int med;
    for(i=0;i<dim;i++)
     for(j=0;j<dim;j++)
      med=med+A[i][j];
    med=med/(dim*dim);
    return(med);
}
__________________
Ho venduto a : truedocman2004,ragen-fio
Ho acquistato da :shinakuma, britt-one
The-Revenge è offline   Rispondi citando il messaggio o parte di esso
Old 24-11-2009, 16:53   #16
||ElChE||88
Senior Member
 
Iscritto dal: Dec 2003
Messaggi: 4907
Codice:
int confronto(int media())
?
||ElChE||88 è offline   Rispondi citando il messaggio o parte di esso
Old 24-11-2009, 17:44   #17
The-Revenge
Senior Member
 
Iscritto dal: Feb 2007
Messaggi: 1352
Quote:
Originariamente inviato da ||ElChE||88 Guarda i messaggi
Codice:
int confronto(int media())
?
la funzione confronto in ingresso ha bisogno del valore di uscita della funziona media.E' sbagliato?
cmq nn me lo da li l'errore, me lo da quando dichiaro confronto, fuori dal main.
__________________
Ho venduto a : truedocman2004,ragen-fio
Ho acquistato da :shinakuma, britt-one

Ultima modifica di The-Revenge : 24-11-2009 alle 17:48.
The-Revenge è offline   Rispondi citando il messaggio o parte di esso
Old 24-11-2009, 17:59   #18
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Quote:
Originariamente inviato da The-Revenge Guarda i messaggi
la funzione confronto in ingresso ha bisogno del valore di uscita della funziona media.E' sbagliato?
cmq nn me lo da li l'errore, me lo da quando dichiaro confronto, fuori dal main.
E' sbagliato come lo scrivi, quando dichiari e scrivi il corpo della funzione confronto devi semplicemente specificare un intero.
Poi nel tuo caso quando andrai a richiamarla potrai fare:
Codice:
printf("\nIl numero e' %d",confronto(media()));
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 24-11-2009, 18:20   #19
yorkeiser
Senior Member
 
L'Avatar di yorkeiser
 
Iscritto dal: Jul 2006
Città: Tristram
Messaggi: 517
Quote:
Originariamente inviato da The-Revenge Guarda i messaggi
la funzione confronto in ingresso ha bisogno del valore di uscita della funziona media.E' sbagliato?
cmq nn me lo da li l'errore, me lo da quando dichiaro confronto, fuori dal main.
La dichiarazione è errata; in questo caso, che è comunque anche concettualmente errato, dovresti usare un puntatore a funzione.

Codice:
dichiarazione:
int (*puntatore)();
Codice:
nel main:
puntatore=media;
A questo punto, puntatore punta alla funzione media, quindi puoi passarlo alla funzione confronto().
Ti spiego però perchè è errato anche dal punto di vista concettuale (non ti offendere, sono errori che fanno tutti e solo l'esperienza aiuta ad evitarli): media è sempre uguale e non cambia nel tempo, quindi non ha senso ricalcolarlo ogni volta che accedi alla funzione confronto, sprechi solo un sacco di cicli macchina.
Il modo corretto sarebbe di calcolare la media una volta sola, ad esempio con
Codice:
int m=media();
e a questo punto passi direttamente m, che è stato già valutato, alla funzione confronto.
__________________
Il sole è giallo
yorkeiser è offline   Rispondi citando il messaggio o parte di esso
Old 24-11-2009, 19:26   #20
The-Revenge
Senior Member
 
Iscritto dal: Feb 2007
Messaggi: 1352
Quote:
Originariamente inviato da yorkeiser Guarda i messaggi
La dichiarazione è errata; in questo caso, che è comunque anche concettualmente errato, dovresti usare un puntatore a funzione.

Codice:
dichiarazione:
int (*puntatore)();
Codice:
nel main:
puntatore=media;
A questo punto, puntatore punta alla funzione media, quindi puoi passarlo alla funzione confronto().
Ti spiego però perchè è errato anche dal punto di vista concettuale (non ti offendere, sono errori che fanno tutti e solo l'esperienza aiuta ad evitarli): media è sempre uguale e non cambia nel tempo, quindi non ha senso ricalcolarlo ogni volta che accedi alla funzione confronto, sprechi solo un sacco di cicli macchina.
Il modo corretto sarebbe di calcolare la media una volta sola, ad esempio con
Codice:
int m=media();
e a questo punto passi direttamente m, che è stato già valutato, alla funzione confronto.
si è tutto chiaro..grazie mille...in effetti ora che mi hai fatto notare, era un suicidio di efficenza, invece cosi la media la calcola 1 volta sola
Non ho ben capito il fatto dei puntatori, ma visto che sono uno studente e che i puntatori li ha solo accenati, credo che capirò più avanti...o meglio più che non li ho capiti, fino ad ora ho dato i puntatori come delle cose scontate, come se fossero impliciti ovvero come se il compilatore sapesse sempre dove andare a prendere i dati, cosa che non richiederebbe effettivamente l'uso dei puntatori, ma visto che questi errori che compio mi fanno capire che nn è cosi, tneterò di approfondire sui puntatori ...fermo restando che comunque col metodo di porre m=media() e poi confronto(m) il rpogramma funzione bene, ed è ciò che volevo dato che il problerma era solo una simulazione di una prova e quasi nessuno è riuscito a farla
__________________
Ho venduto a : truedocman2004,ragen-fio
Ho acquistato da :shinakuma, britt-one
The-Revenge è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Core Ultra 7 270K Plus e Core Ultra 7 250K Plus: Intel cerca il riscatto ma ci riesce in parte Core Ultra 7 270K Plus e Core Ultra 7 250K Plus:...
PC Specialist Lafité 14 AI AMD: assemblato come vuoi tu PC Specialist Lafité 14 AI AMD: assemblat...
Recensione Nothing Phone 4(a): sempre iconico ma ora più concreto Recensione Nothing Phone 4(a): sempre iconico ma...
Corsair Vanguard Air 99 Wireless: non si era mai vista una tastiera gaming così professionale Corsair Vanguard Air 99 Wireless: non si era mai...
Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lavaggio è ampio Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lav...
iPad 12 arriverà nel 2026 e sar&a...
AMD per il futuro dell'IA in Corea del S...
L'IA agentica incrementa il rischio cybe...
Rapporto Clusit 2026: finanza e infrastr...
Gli stessi sali che solidificano il tofu...
Il conflitto in Medio Oriente minaccia l...
OnlyFans, scomparso il proprietario Leon...
Le migliori offerte Amazon da leggere in...
Recensioni su Trustpilot non affidabili,...
Il CISPE denuncia Broadcom all'antitrust...
Il cyberattacco che negli Usa ha trasfor...
AI Grid Intelligent Orchestration, l'inf...
Roborock Qrevo CURV 2 Flow X: tecnologia...
Quanto viaggia il modem di iPhone Air? I...
300 GB di memoria RAM per le future gene...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 23:19.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v