Visualizzazione dei risultati da 1 a 8 su 8

Discussione: [C]warning in debug

  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    10

    [C]warning in debug

    Questo frammento di codice mi dà questo (warning) initialization makes pointer from integer without a cast. Relativo alla linea di inizializzazione graph *campo= creategraph(); e anche nel suo assegnamento. Ma perchè? Dov'è l'errore?
    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
    #include <stdlib.h>

    #define N 10

    typedef char stringa[N];

    typedef struct lista{
    int pila;
    struct lista *next;
    }lista;
    /*nodo della lista di adiacenza*/
    typedef struct nodo_lista{
    lista *info;
    struct nodo_lista *next;
    }nodo_lista;


    /*grafo rappresentato tramite lista di liste di adiacenza*/
    typedef struct graph{
    nodo_lista *adiacenza,*next;
    lista *info; // nodo corrente
    struct graph *g;
    } graph;

    stringa argomenti[3];

    graph *creategraph()
    {
    graph* grafo = malloc(sizeof(graph));

    if (!grafo) {
    fprintf(stderr,"Errore di allocazione A\n");
    exit(-1);
    }


    if(!(grafo->adiacenza = malloc (sizeof(nodo_lista)))) {
    fprintf(stderr,"Errore di allocazione B\n");
    exit(-2);
    }
    grafo->adiacenza = NULL;
    grafo->next = NULL;
    //grafo->info = NULL;
    return grafo;
    }

    int main(int argc, char *argv[])
    {
    int i,j,k, /*contatore*/
    c; /* usato nella getchar*/

    char comando; /*carattere*/
    graph *campo= creategraph();
    stringa input; /*stringa usata per memorizzare temporaneamente le righe di Input*/
    while(1){
    i=0;
    for(j=0;j<N;j++) /* j contatore caratteri nella stringa */
    input[j]='\0'; /* si cotruisce l'array di un massimo di 100 caratteri*/
    for(k=0;k<6;k++) /* k contatore argomenti*/
    for(j=0;j<N;j++)
    argomenti[k][j]='\0'; /* inizializzazione dell'array di stringhe*/

    printf("Inserire il comando : ");
    while((c=getchar())!='\n'){
    input[i++]=c;
    }
    comando = input[0];
    trova_argomenti(input); /* memorizzo gli argomenti inseriti da input nell'array di stringhe */

    switch(comando){

    case 'i':
    campo = creategraph();
    inizia_partita(atoi(argomenti[0]), campo);
    break;
    case 'f':
    printf("\nExit\n\n");
    exit (0);

    default:
    printf("Comando inesistente\n");
    break;
    }

    }
    exit (0);
    }

    Potete aiutarmi per cortesia?

    Grazie

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Il cast è richiesto se si usa un compilatore C++. Con un compilatore C puro non serve.
    codice:
    graph* grafo = (graph*) malloc(sizeof(graph));
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    10
    Grazie shodan,
    infatti non l'ho metto mai il cast in c. Il problema è che mi dà questo warning ora, mentre su un'altra struttura dati come un albero rb non me lo dà facendo il debug.
    scusa ma allora perchè mi si verifica poi un errore in esecuzione?
    Non è che ho sbagliato qualcosa nella struttura dati?
    Hai provato ad eseguire il mio codice?

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Il problema è che mi dà questo warning ora, mentre su un'altra struttura dati come un albero rb non me lo dà facendo il debug.
    scusa ma allora perchè mi si verifica poi un errore in esecuzione?
    Non avevi parlato di errori in esecuzione, ma solo di warning che di per se non è un errore.

    Comunque non serve eseguire il codice per accorgersi del possibile l'errore:
    codice:
    graph *creategraph() {
    
       graph* grafo = (graph*) malloc(sizeof(graph));
       if (!grafo) {
          fprintf(stderr,"Errore di allocazione A\n");
          exit(-1);
       }
       
       grafo->adiacenza = (nodo_lista*) malloc (sizeof(nodo_lista)); 
       if(!grafo->adiacenza ) {
          fprintf(stderr,"Errore di allocazione B\n");
          exit(-2);
       }
       grafo->adiacenza = NULL; /* BOOM!!! */
       grafo->next = NULL;
       //grafo->info = NULL;
       return grafo;
    }
    In pratica prima allochi il campo, poi lo annulli (perdendo la possibilità di deallocarlo in seguito). Appena usi quel campo il programma va in crash.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    10

    non è quello il problema

    Non è quello il problema perchè togliendolo il crash rimane.
    I warning mi escono in debug e non quando mando in esecuzione.
    L'impostazione del compilatore è su c e non su c++ quindi continuo a non capire.

  6. #6
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    il codice non è compilabile perchè mancano 2 funzioni

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Originariamente inviato da Stoicenko
    il codice non è compilabile perchè mancano 2 funzioni
    every day above ground is a good one

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    10
    grazie ragazzi ho risolto il problema... ora proseguirò.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.