Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [C] Assignment makes integer from pointer

    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:

    codice:
    #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;
    
    
    }

  2. #2
    "nero" è uno string literal, dunque è un const char * (ossia, un puntatore all'area di memoria dove si trova la stringa in questione); array_num[i].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, copia la stringa in questione nell'array di char usando la strcpy:
    codice:
    strcpy(array_num[i].colore, "nero");
    Stai attento a non cercare di memorizzare stringhe più lunghe di N; per avere maggiore sicurezza, usa snprintf:
    codice:
    snprintf(array_num[i].colore, N, "%s", "nero");
    o in alternativa strncat (un po' più efficiente):
    codice:
    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)
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Wow grazie mille, sei stato chiarissimo.

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

  4. #4
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Se quel codice invece di appartenere al main, appartenesse a una funzione, come potrei passare i valori assunti dall' array tramite il return?

  6. #6
    Perchè se faccio in questo modo:

    codice:
    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

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    93
    Se vuoi tornare un puntatore la tua funzione dovrebbe essere
    codice:
    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:
    codice:
    void riempimento(numero_struct *array)

  8. #8
    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.
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.