View Full Version : [C] incompatible pointer
Dark_Tranquillity
21-01-2004, 19:50
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
#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;
}
xybercom
21-01-2004, 20:32
Il programma funziona ?
I warning spesso ( ma non sempre :D ) si possono trascurare almeno se il programma va.
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]).
Dark_Tranquillity
21-01-2004, 20:52
Originariamente inviato da xybercom
Il programma funziona ?
I warning spesso ( ma non sempre :D ) si possono trascurare almeno se il programma va.
giusto....
e come faccio a rendere un valore float intero???
xybercom
21-01-2004, 21:09
?? 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
Dark_Tranquillity
21-01-2004, 21:39
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
#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;
}
xybercom
21-01-2004, 21:47
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).
xybercom
21-01-2004, 21:50
Ah, non è che sei del Politecnico di milano ?
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).
Dark_Tranquillity
21-01-2004, 21:54
ahi ancora segmentation fault :cry:
deve funzionare :muro:
cmq la funzione l'ho copiata da Linguaggio C di bellini-guidi
no non sono del politecnico sto alla federico II
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;
}
maxithron
21-01-2004, 21:57
Originariamente inviato da Dark_Tranquillity
ahi ancora segmentation fault :cry:
deve funzionare :muro:
cmq la funzione l'ho copiata da Linguaggio C di bellini-guidi
no non sono del politecnico sto alla federico II
Federico II di Napoli?
xybercom
21-01-2004, 21:59
-edited-
Dark_Tranquillity
21-01-2004, 21:59
Originariamente inviato da maxithron
Federico II di Napoli?
sì
anche tu lì??? che studi???
Dark_Tranquillity
21-01-2004, 22:01
Originariamente inviato da xybercom
-edited-
quindi le new le posso usare?
maxithron
21-01-2004, 22:04
Originariamente inviato da Dark_Tranquillity
sì
anche tu lì??? che studi???
No...non sono li e non studio da nessun'altra parte se non a casa mia :(
Era solo una curiosità.
Fine [OT]
xybercom
21-01-2004, 22:07
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;
}
Dark_Tranquillity
21-01-2004, 22:07
lo provo
Dark_Tranquillity
21-01-2004, 22:10
uà sei un toro :D
funziona da dio :p
Originariamente inviato da xybercom
Allora, new in C non c'è a quanto ne so.
Argh, hai perfettamente ragione, la forza dell'abitudine =))
xybercom
21-01-2004, 22:12
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.
xybercom
21-01-2004, 22:13
Originariamente inviato da Bane
Argh, hai perfettamente ragione, la forza dell'abitudine =))
Ti capisco, anch'io uso sempre (quando posso almeno) il C++ :)
xybercom
21-01-2004, 22:14
Originariamente inviato da Dark_Tranquillity
uà sei un toro :D
funziona da dio :p
:cool:
cn dev-C lo fa partire, mi chiede il numero di elementi e di inserirli, ma quando gli do l'elemento da cercare esce dal programma...
xybercom
22-01-2004, 20:27
Versione migliorata a prova di warning:
#include <stdio.h>
#include <stdlib.h> /* abort */
#include <malloc.h>
/* PROTOTIPO FUNZIONE */
void bin_search(int *A, int n, int chiave, int ris[3]);
/* PROGRAMMA CHIAMANTE*/
int main()
{
/* DICHIARAZIONE VARIABILI */
int *A, out[3], chiave;
int n, i;
/*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; i++)
{
printf("Inserire il valore dell'elemento %d: ", i );
scanf("%d", A+i ); /* come &(A[i]) */
}
/* NUMERO DA RICERCARE */
printf("\nInserire il numero che si desidera individuare: ");
scanf("%d", &chiave);
bin_search( A, n, chiave, out );
if ( out[0] )
{
printf("Valore trovato: Chiave: %d alla Posizione: %d", out[1], out[2]);
}
else printf("Valore non trovato");
printf("\n\n fine");
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;
}
ma è solo cn dev-c che se nn metto un system("PAUSE"); mi esegue il programma ma quando gli dico cosa cercare lo trova ma esce subito?
xybercom
22-01-2004, 20:39
Originariamente inviato da Guts
cn dev-C lo fa partire, mi chiede il numero di elementi e di inserirli, ma quando gli do l'elemento da cercare esce dal programma...
Il programma funziona, esempio:
Inserire il numero di elementi formanti l'array: 3
Inserire il valore dell'elemento 0: 1
Inserire il valore dell'elemento 1: 7
Inserire il valore dell'elemento 2: 9
Inserire il numero che si desidera individuare: 9
Valore trovato: Chiave: 9 alla Posizione: 2
stai usando Dev-C++ ?
L'ho usato anch'io prima di passare a Linux; forse c'è qualche opzione di configurazione sbagliata o forse (non so) Dev tenta di compilare il programma come se fosse un file C++.
Volendo rimanere sotto Windows puoi usare il compilatore mingw (www.mingw.org) o ancora meglio msys + mingw.
Con gcc o mingw il comando per compilare il file è "gcc ex_forum4.c -o ex_forum4"
(dove ho chiamato ex_forum4.c il sorgente)
xybercom
22-01-2004, 20:42
Originariamente inviato da Guts
ma è solo cn dev-c che se nn metto un system("PAUSE"); mi esegue il programma ma quando gli dico cosa cercare lo trova ma esce subito?
Se ho capito bene è un problema stupido, basta che fai partire il programma da una finestra dos, così quando il programma termina ritorna al prompt del dos e ti fa vedere quello che ha scritto.
giusto, potrebbe essere colpa di quello.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.