PDA

Visualizza la versione completa : [C] Warning "Assignment makes integer from pointer"


jackdispade
28-01-2011, 12:24
Praticamente sto cercando di compilare un pezzo di codice solo che mi da risultati inaspettati colpa di questo warning: Assignment makes integer from pointer without cast


Qualcuno potrebbe darmi una mano a capire? Il codice è cortissimo è questo qui:



#include <stdio.h>
#include <string.h>
#define N 37
#define COL 12

typedef struct {

char colore[COL];
int numeror;


} numero_strut;


int main () {


int i; //indice array
numero_strut array_num[N]; //un array del tipo numero_strut

for (i=0;i<N;i++){

array_num [i].numeror=i;

if ((i==1) || (i==3) ||(i==5) ||(i==7) ||(i==9) ||(i==12) ||(i==14) ||(i==16)
|| (i==18) ||(i==19) ||(i==21) ||(i==23) ||(i==25) || (i==27) ||(i== 30) ||(i==32)
||(i==34)||(i==36)){


array_num[i].colore[COL] = "rosso"; // warning 1
printf("%s\n\n",array_num[i].colore[COL]);}

else

if (i!=0){


array_num[i].colore[COL]= "nero"; // warning 2

printf("%s\n\n",array_num[i].colore[COL]);}





}


return 0;


}

MItaly
28-01-2011, 12:40
"nero" è uno string literal, dunque è un const char * (ossia, un puntatore all'area di memoria dove si trova la stringa in questione); array_num[/b]].colore è un array di char di dimensione COL; array_num[i].colore[COL] è un singolo char (tra l'altro fuori dalle dimensioni dell'array, dato che gli indici vanno da 0 a COL-1). Long story short: stai cercando di memorizzare un puntatore a char in un singolo char.

Per risolvere, [i]copia la stringa in questione nell'array di char usando la strcpy:


strcpy(array_num[i].colore, "nero");

Stai attento a non cercare di memorizzare stringhe più lunghe di N; per avere maggiore sicurezza, usa snprintf:


snprintf(array_num[i].colore, N, "%s", "nero");

o in alternativa strncat (un po' più efficiente):


array_num[i].colore[0]=0;
strncat(array_num[i].colore, "nero", N);

(teoricamente esisterebbe la strncpy, ma purtroppo non va bene usarla come "copia con sicurezza" perché non garantisce la terminazione del buffer)

jackdispade
28-01-2011, 12:45
Wow grazie mille, sei stato chiarissimo.

Nella mia ignoranza con le stringhe non avrei mai pensato di risolverlo così :P

MItaly
28-01-2011, 12:47
:ciauz:

jackdispade
28-01-2011, 13:14
Se quel codice invece di appartenere al main, appartenesse a una funzione, come potrei passare i valori assunti dall' array tramite il return?

jackdispade
28-01-2011, 13:29
Perchè se faccio in questo modo:


int riempimento () {


int i; //indice array
numero_strut array_num[N]; //un array del tipo numero_strut

for (i=0;i<N;i++){

array_num[i].numeror= i;



if ((i==1) || (i==3) ||(i==5) ||(i==7) ||(i==9) ||(i==12) ||(i==14) ||(i==16)
|| (i==18) ||(i==19) ||(i==21) ||(i==23) ||(i==25) || (i==27) ||(i== 30) ||(i==32)
||(i==34)||(i==36))


strcpy(array_num[i].colore, "rosso");

else

if (i!=0)


strcpy(array_num[i].colore, "nero");

else
if (i==0)


strcpy(array_num[i].colore, "verde");





}

return array_num; }

Al return mi da 2 warning: return makes integer from pointer without casting e functions return address of local variables

jobv
28-01-2011, 20:45
Se vuoi tornare un puntatore la tua funzione dovrebbe essere

numero_struct *riempimento()
ma tornare l'indirizzo di una variabile locale alla funzione credo sia rischioso.

Forse puoi dichiare la variabile "array_num" nel main e passarla come argomento ad una funzione del tipo:

void riempimento(numero_struct *array)

MItaly
28-01-2011, 22:15
Originariamente inviato da jobv
ma tornare l'indirizzo di una variabile locale alla funzione credo sia rischioso.

Non è rischioso, è semplicemente sbagliato (tecnicamente è "undefined behavior". Una variabile locale cessa di esistere quando la funzione ritorna, pertanto un puntatore ad essa quando la funzione ritorna non ha più senso. Potrebbe sembrare che funzioni se lo usi subito (perché la locazione di memoria dove si trovava non è ancora stata sovrascritta), ma se inizi a chiamare un'altra funzione subito la memoria in questione assume altri valori.

tl;dr: o, come detto, ti fai passare un puntatore all'array in cui scrivere come parametro, o restituisci della memoria allocata con malloc.

Loading