PDA

Visualizza la versione completa : [C] Errore: incompatible implicit declaration


roldo
12-02-2012, 11:28
Studio leggendo e compilando codici da questo ottimo forum.
Questo programma che dovrebbe essere corretto e funzionante >>>
http://forum.html.it/forum/showthread.php?s=&threadid=1494990&highlight=matrice

a me da >>>
../vedere.c:48: error: conflicting types for ‘Alloca’
../vedere.c:12: error: previous declaration of ‘Alloca’ was here
../vedere.c: In function ‘Alloca’:
../vedere.c:50: warning: incompatible implicit declaration of built-in function ‘calloc’


PS >> per comodità metto il codice in questione >>







#include <stdio.h>
#include <time.h>
#include <math.h>

typedef struct {
int **m;
int r;
int c;
} mat;


void Alloca(mat);


main () {
int i,j;
mat M;
M.r=5;
M.c=6;
Alloca(M);
srand(time(NULL));
for (i=0,j=0;i<M.r;j++) {
if (j==M.c) {
j=0;
i++;
}
M.m[i][j]= rand()%20;


}

for (i=0,j=0;i<M.r;j++) {
if (j==M.c) {
j=0;
i++;
printf("\n");
}

printf("%d\t", M.m[i][j]);


}



}



.. void Alloca (mat *M) {
int i;
(*M).m=(int**)calloc((*M).r,sizeof(int*));

for (i=0;i<(*M).r;i++)
(*M).m[i]=(int*)calloc((*M).c,sizeof(int));

return;
}

ESSE-EFFE
12-02-2012, 11:44
Originariamente inviato da roldo


void Alloca(mat);
.. void Alloca (mat *M) {

Sono diverse...

oregon
12-02-2012, 11:49
Per il warning probabilmente risolvi aggiungendo la

#include <stdlib.h>

Per l'errore, la funzione Alloca dovrebbe accettare la matrice per indirizzo. La chiamata dovrebbe essere

Alloca(&M);

roldo
12-02-2012, 11:52
Originariamente inviato da ESSE-EFFE
Sono diverse...


cioè la funzione è diversa dalla dichiarazione Alloca ....questo è per la correzione suggerita e accettata
come soluzione dall 'autore....
Ma se si usa il programma originale , da solo un warning in compilazione ma "segmentation fault in esecuzione....quindi la correzione giusta per quel programma quale sarebbe ?

oregon
12-02-2012, 12:03
Originariamente inviato da roldo
cioè la funzione è diversa dalla dichiarazione Alloca ....questo è per la correzione suggerita e accettata
come soluzione dall 'autore....

E quindi mi sembra chiaro ...


Ma se si usa il programma originale , da solo un warning in compilazione ma "segmentation fault in esecuzione....quindi la correzione giusta per quel programma quale sarebbe ?

Scusa ... allora che si è detto?

La funzione Alloca deve avere il parametro passato per indirizzo e quindi devi modificare di conseguenza il main.

In più devi rivedere il main dopo la chiamata ad Alloca perché c'è qualche problema con gli indici dei cicli.

Ti faccio notare che una versione completa e funzionante del codice non è stata mai proposta ...

roldo
12-02-2012, 12:04
Originariamente inviato da oregon
Per il warning probabilmente risolvi aggiungendo la

#include <stdlib.h>

Per l'errore, la funzione Alloca dovrebbe accettare la matrice per indirizzo. La chiamata dovrebbe essere

Alloca(&M);


Non gli piace .....
../vedere.c: In function ‘main’:
../vedere.c:22: error: incompatible type for argument 1 of ‘Alloca’

oregon
12-02-2012, 12:07
Originariamente inviato da roldo
Non gli piace .....

Che vuol dire "non gli piace"?

Scusa ... ma questo modo di programmare non ha molto senso ...

Questo

void Alloca(mat);

l'hai corretto?

roldo
12-02-2012, 16:31
Originariamente inviato da oregon
Che vuol dire "non gli piace"?

Scusa ... ma questo modo di programmare non ha molto senso ...

Questo

void Alloca(mat);

l'hai corretto?

Più che programmare cerco di capire da programmi già fatti...

Ho fatto tutte le combinazioni possibili per l 'allocazione e quella che non da errori è quella
sotto...che però da "segmentation fault" in esecuzione . Pazienza.





#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <math.h>

typedef struct {
int **m;
int r;
int c;
} mat;


void Alloca(mat M);


main () {
int i,j;
mat M;
M.r=5;
M.c=6;
Alloca( M);
srand(time(NULL));
for (i=0,j=0;i<M.r;j++) {
if (j==M.c) {
j=0;
i++;
}
M.m[i][j]= rand()%20;


}

for (i=0,j=0;i<M.r;j++) {
if (j==M.c) {
j=0;
i++;
printf("\n");
}

printf("%d\t", M.m[i][j]);


}



}





void Alloca (mat M) {
int i;
M.m=(int**)calloc(M.r,sizeof(int*));

for (i=0;i<M.r;i++)
M.m[i]=(int*)calloc(M.c,sizeof(int));

return;
}

oregon
12-02-2012, 16:35
Scusami, ma allora tutto quanto detto prima non è servito a nulla?

Avevi scritto nel primo post



void Alloca (mat *M)


poi ti avevo detto che dovevi chiamarla così



Alloca(&M);


e anche



Questo

void Alloca(mat);

l'hai corretto?


E ora torni al primo post?

ramy89
12-02-2012, 17:21
Originariamente inviato da roldo
Più che programmare cerco di capire da programmi già fatti...

Ho fatto tutte le combinazioni possibili per l 'allocazione e quella che non da errori è quella
sotto...che però da "segmentation fault" in esecuzione . Pazienza.


E perchè non provi a farli te? Secondo me fai molto prima.

Loading