|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Mar 2001
Messaggi: 53
|
[C] incompatible pointer
binsearch.c: In function `main':
binsearch.c:34: warning: passing arg 4 of `bin_search' from incompatible pointer type binsearch.c:35: warning: comparison between pointer and integer Cos'è come risolvo??? Ho messo le righe 34 e 35 in grassetto Codice:
#include <stdio.h>
#include <malloc.h>
/* PROTOTIPO FUNZIONE */
void bin_search(float *A, int n, float chiave, float **ris);
/* PROGRAMMA CHIAMANTE*/
main()
{
/* DICHIARAZIONE VARIABILI */
float *A, *out[2], chiave;
int i, c;
int n, posiz;
/* LETTURA ELEMENTI ARRAY */
printf("Inserire il numero di elementi formanti l'array: ");
scanf("%d",&n);
/* ALLOCAZIONE DINAMICA DELLA MEMORIA */
if(!(A = (float *)malloc(n*sizeof(float))))
abort();
/* LETTURA ELEMENTI ARRAY */
printf("\n");
for (i=0; i<=n-1; i++){
printf("Inserire il valore dell'elemento %d: ", c=i+1);
scanf("%f", &A[i]);
}
/* NUMERO DA RICERCARE */
printf("\nInserire il numero che si desidera individuare: ");
scanf("%f", &chiave);
bin_search(A, n, chiave, &out);
if (out[0]==1){
printf ("Il valore %f è presente ed è situato nella locazione di mem %f",out[1], out[2]);
} else {
printf("Valore non presente");
}
free(A);
}
/****************** SPECIFICHE FUNZIONE *************************/
void bin_search(float *A, int n, float chiave, float **ris)
{
int alto, basso, centro, pos;
alto = 0;
basso = n-1;
pos = -1;
do {
centro = (alto+basso)/2;
if (A[centro]==chiave)
{pos = centro;}
else if (A[centro]<chiave)
{alto = centro+1;}
else
{basso = centro-1;}
}
while(alto<=basso && pos==-1);
if(pos!= -1){
*ris[0] = 1;
*ris[1] = chiave;
*ris[2] = pos; }
else
*ris[0] = 0;
}
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Dec 2000
Città: dintorni di Seregno (MI)
Messaggi: 312
|
Il programma funziona ?
I warning spesso ( ma non sempre Comunque alla linea 35 stai confrontando un puntatore a float (out[0]) con un intero che non penso sia quello che vuoi. Nella 34 penso che dovrebbe funzionare (ma non sono sicurissimo): &(out[0]) o addirittura out al posto di &out [out dovrebbe essere infatti l'indirizzo del primo puntatore out[0]).
__________________
powered by GNU/Linux [ Debian Sid ] |
|
|
|
|
|
#3 | |
|
Member
Iscritto dal: Mar 2001
Messaggi: 53
|
Quote:
e come faccio a rendere un valore float intero??? |
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Dec 2000
Città: dintorni di Seregno (MI)
Messaggi: 312
|
?? Come ti dice il compilatore out[0] è puntatore a un float = contiene l'indirizzo di memoria relativo a una variabile floating point , non è una variabile float (almeno stando alla tua dichiarazione).
Come la confronti con l'intero 1 non lo so (se vuoi prova a fare cout << out[0]). Diverso sarebbe stato se tu avessi confrontato il puntatore con 0, in quanto i puntatori non inizializzati in genere hanno il valore 0 (che è interpretato come null dalla maggior parte dei compilatori a quanto ne so). Per convertire un float in intero si usa un cast, es. float x; int j=5; x = (float)(j); // ora x=5.0 x++; j = (int)(x); // ora j=6
__________________
powered by GNU/Linux [ Debian Sid ] Ultima modifica di xybercom : 21-01-2004 alle 22:12. |
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Mar 2001
Messaggi: 53
|
Perfetto grazie dell'aiuto...
ora si compila senza problemi, ma se il valore da cercare. esiste nell'array và in segmentation fault Spero mi voglia tu aiutare... è per l'esame di programmazione che ho tra pochi giorni Codice:
#include <stdio.h>
#include <malloc.h>
/* PROTOTIPO FUNZIONE */
void bin_search(int *A, int n, int chiave, int **ris);
/* PROGRAMMA CHIAMANTE*/
main()
{
/* DICHIARAZIONE VARIABILI */
int *A, *out[2], chiave;
int i, c;
int n, posiz;
/* LETTURA ELEMENTI ARRAY */
printf("Inserire il numero di elementi formanti l'array: ");
scanf("%d",&n);
/* ALLOCAZIONE DINAMICA DELLA MEMORIA */
if(!(A = (int *)malloc(n*sizeof(int))))
abort();
/* LETTURA ELEMENTI ARRAY */
printf("\n");
for (i=0; i<=n-1; i++){
printf("Inserire il valore dell'elemento %d: ", c=i+1);
scanf("%d", &A[i]);
}
/* NUMERO DA RICERCARE */
printf("\nInserire il numero che si desidera individuare: ");
scanf("%d", &chiave);
bin_search(A, n, chiave, out);
printf("Esito: %d \n Chiave: %d \n Posizione: %d", out[0], out[1], out[2]);
free(A);
}
/****************** SPECIFICHE FUNZIONE *************************/
void bin_search(int *A, int n, int chiave, int **ris)
{
int alto, basso, centro, pos;
alto = 0;
basso = n-1;
pos = -1;
do {
centro = (alto+basso)/2;
if (A[centro]==chiave)
{pos = centro;}
else if (A[centro]<chiave)
{alto = centro+1;}
else
{basso = centro-1;}
}
while(alto<=basso && pos==-1);
if(pos!= -1){
*ris[0] = 1;
*ris[1] = chiave;
*ris[2] = pos; }
else
*ris[0] = 0;
}
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Dec 2000
Città: dintorni di Seregno (MI)
Messaggi: 312
|
La funzione di ricerca non mi convince molto comunque devi dichiarare
int *out[3] e non int *out[2]; se vuoi poter accedere a out[2] infatti quando dichiarari un array gli elementi vanno da 0 a size-1, esempio int a[3]; // array di 3 elementi, a[0],a[1],a[2] int a[2]; // array di 2 elementi, a[0],a[1] Inoltre nella funzione di ricerca puoi usare esplicitamente int *ris[3] invece che int **ris ( e si può fare di meglio ma te lo racconto quando il programma ti va).
__________________
powered by GNU/Linux [ Debian Sid ] |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Dec 2000
Città: dintorni di Seregno (MI)
Messaggi: 312
|
Ah, non è che sei del Politecnico di milano ?
__________________
powered by GNU/Linux [ Debian Sid ] Ultima modifica di xybercom : 22-01-2004 alle 07:20. |
|
|
|
|
|
#8 |
|
Member
Iscritto dal: Aug 2003
Messaggi: 125
|
Per iniziare:
Dichiari un vettore di puntatori a int (int *out[2]) ma non gli allochi la memoria necessaria. out[0] = new (int); out[1] = new (int); out[2] = new (int); Dichiari un vettore di 2 elementi e lo utilizzi come ne avesse 3 (*ris[2] = pos). |
|
|
|
|
|
#9 |
|
Member
Iscritto dal: Mar 2001
Messaggi: 53
|
ahi ancora segmentation fault
deve funzionare cmq la funzione l'ho copiata da Linguaggio C di bellini-guidi no non sono del politecnico sto alla federico II |
|
|
|
|
|
#10 |
|
Member
Iscritto dal: Aug 2003
Messaggi: 125
|
Sistemato in velocita'... controllalo pero'
#include <stdio.h> #include <stdlib.h> #include <malloc.h> /* PROTOTIPO FUNZIONE */ void bin_search(int *A, int n, int chiave, int **ris); /* PROGRAMMA CHIAMANTE*/ main() { /* DICHIARAZIONE VARIABILI */ int *A, *out[3], chiave; int i, c; int n; out[0] = new (int); out[1] = new (int); out[2] = new (int); /* LETTURA ELEMENTI ARRAY */ printf("Inserire il numero di elementi formanti l'array: "); scanf("%d",&n); /* ALLOCAZIONE DINAMICA DELLA MEMORIA */ if(!(A = (int *)malloc(n*sizeof(int)))) abort(); /* LETTURA ELEMENTI ARRAY */ printf("\n"); for (i=0; i<=n-1; i++){ printf("Inserire il valore dell'elemento %d: ", c=i+1); scanf("%d", &A[i]); } /* NUMERO DA RICERCARE */ printf("\nInserire il numero che si desidera individuare: "); scanf("%d", &chiave); bin_search(A, n, chiave, out); printf("Esito: %d \n Chiave: %d \n Posizione: %d", *out[0], *out[1], *out[2]+1); free(A); return 0; } /****************** SPECIFICHE FUNZIONE *************************/ void bin_search(int *A, int n, int chiave, int **ris) { int alto, basso, centro, pos; alto = 0; basso = n-1; pos = -1; do { centro = (alto+basso)/2; if (A[centro]==chiave) {pos = centro;} else if (A[centro]<chiave) {alto = centro+1;} else {basso = centro-1;} } while(alto<=basso && pos==-1); if(pos!= -1){ *ris[0] = 1; *ris[1] = chiave; *ris[2] = pos; } else *ris[0] = 0; } |
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Mar 2002
Città: Italy/Usa
Messaggi: 2817
|
Quote:
__________________
"Utilizzando atomi pentavalenti drogheremo il silicio di tipo n; Utilizzando atomi trivalenti drogheremo il silicio di tipo p; Utilizzando della cannabis ci drogheremo noi e vedremo il silicio fare cose impossibili" - DSDT-HowTo |
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Dec 2000
Città: dintorni di Seregno (MI)
Messaggi: 312
|
-edited-
__________________
powered by GNU/Linux [ Debian Sid ] |
|
|
|
|
|
#13 | |
|
Member
Iscritto dal: Mar 2001
Messaggi: 53
|
Quote:
anche tu lì??? che studi??? |
|
|
|
|
|
|
#14 | |
|
Member
Iscritto dal: Mar 2001
Messaggi: 53
|
Quote:
|
|
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Mar 2002
Città: Italy/Usa
Messaggi: 2817
|
Quote:
No...non sono li e non studio da nessun'altra parte se non a casa mia Era solo una curiosità. Fine [OT]
__________________
"Utilizzando atomi pentavalenti drogheremo il silicio di tipo n; Utilizzando atomi trivalenti drogheremo il silicio di tipo p; Utilizzando della cannabis ci drogheremo noi e vedremo il silicio fare cose impossibili" - DSDT-HowTo |
|
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Dec 2000
Città: dintorni di Seregno (MI)
Messaggi: 312
|
Allora, new in C non c'è a quanto ne so.
Comunque è vero, int *out[3] rappresenta un array di puntatori, non può scriverci sopra se prima non allochi la memoria per gli oggetti puntati. Adesso dovrebbe funzionare, sto passando direttamente alla funzione di ricerca l'array out[3] (esattamente come per A). #include <stdio.h> #include <malloc.h> /* PROTOTIPO FUNZIONE */ void bin_search(int *A, int n, int chiave, int ris[3]); /* PROGRAMMA CHIAMANTE*/ main() { /* DICHIARAZIONE VARIABILI */ int *A, out[3], chiave; int i, c; int n, posiz; /* LETTURA ELEMENTI ARRAY */ printf("Inserire il numero di elementi formanti l'array: "); scanf("%d",&n); /* ALLOCAZIONE DINAMICA DELLA MEMORIA */ if(!(A = (int *)malloc(n*sizeof(int)))) abort(); /* LETTURA ELEMENTI ARRAY */ printf("\n"); for (i=0; i<=n-1; i++){ printf("Inserire il valore dell'elemento %d: ", c=i+1); scanf("%d", &A[i]); } /* NUMERO DA RICERCARE */ printf("\nInserire il numero che si desidera individuare: "); scanf("%d", &chiave); bin_search(A, n, chiave, out); printf("Esito: %d \n Chiave: %d \n Posizione: %d", out[0], out[1], out[2]); free(A); return 0; } /****************** SPECIFICHE FUNZIONE *************************/ void bin_search(int *A, int n, int chiave, int ris[3]) { int alto, basso, centro, pos; alto = 0; basso = n-1; pos = -1; do { centro = (alto+basso)/2; if (A[centro]==chiave) {pos = centro;} else if (A[centro]<chiave) {alto = centro+1;} else {basso = centro-1;} } while(alto<=basso && pos==-1); if(pos!= -1){ ris[0] = 1; ris[1] = chiave; ris[2] = pos; } else ris[0] = 0; }
__________________
powered by GNU/Linux [ Debian Sid ] |
|
|
|
|
|
#17 |
|
Member
Iscritto dal: Mar 2001
Messaggi: 53
|
lo provo
|
|
|
|
|
|
#18 |
|
Member
Iscritto dal: Mar 2001
Messaggi: 53
|
uà sei un toro
funziona da dio |
|
|
|
|
|
#19 | |
|
Member
Iscritto dal: Aug 2003
Messaggi: 125
|
Quote:
|
|
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Dec 2000
Città: dintorni di Seregno (MI)
Messaggi: 312
|
Mi è sembrato più sensato usare un array statico dato che sappiamo già che ci sono 3 elementi di ritorno.
Altrimenti si può allocare dinamicamente anche out: cioè int *out = (int *) malloc ( 3 * sizeof(int) ); se non vuoi cambiare la definizione originale della funzione basta poi che gli passi &out.
__________________
powered by GNU/Linux [ Debian Sid ] |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:56.


















