Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    24

    Programmazione C: **scheda

    Salve a tutti,
    volevo sapere come potevo accedere ai membri di una struttura con una variabile doppio puntatore.
    Ho questa struttura:
    typedef struct data *next;
    typedef struct data{
    char word[20];
    int dim;
    int num_voc;
    next successivo;
    }
    e nel main()
    data **lista;

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Ad esempio, semplicemente con

    lista[0]->

    lista[1]->

    a seconda di quanti puntatori hai previsto nel vettore lista
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    24
    codice:
    void crea_lista(FILE *input, data **lista)
    {
     char *stringa[20],buff[20];
     int j=0,i;
     while(fscanf(input,"%s",buff)>0)
     {
      stringa[j]=(char*)malloc(20*sizeof(char));
      strcpy(stringa[j],buff);
      j++;
      }
      stringa[j]=(char*)malloc(20*sizeof(char));
      strcpy(stringa[j],"null");
      for(i=0;strcmp(stringa[i],"null")!=0;i++)
      {
       lista[i]=(data*)malloc(sizeof(data));
       lista[i]->word=(char*)malloc(20*sizeof(data));
       strcpy(lista[i]->word,stringa[j]);
       lista[i]->dim=strlen(lista[i]->word);
       lista[i]=lista[i+1]->successivo;
      }
      lista[i+1]->successivo=NULL;
      }
    non accetta l'allocazione di word, perchè?

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Primo : devi usare i tag CODE quando mostri del codice, altrimenti diventa difficile leggerlo e darti qualsiasi informazione ...

    Secondo : quando hai un errore devi indicare sempre la linea in cui si verifica e il codice/messaggio d'errore ...

    In ogni caso, nella riga

    lista[i]->word=(char*)malloc(20*sizeof(data));

    word non è un puntatore a char ma un vettore di char già allocato. Non ha senso (ed è sbagliato) allocare lo spazio con la malloc.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    24
    l'errore sta qui:
    codice:
    lista[i]->word=(char*)malloc(20*sizeof(data));
    poi:
    codice:
    strcpy(stringa[j],"null");
    mi è servito per delimitare la fine della stringa facendo in modo che nel for appena si incontra la stringa null termina la concatenazione della lista
    e poi volevo segnalare una correzione nel
    codice:
    Prima:strcpy(lista[i]->word,stringa[j]);
    Dopo:strcpy(lista[i]->word,stringa[i]);

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Come avevo aggiunto nell'ultimo post, nella riga

    lista[i]->word=(char*)malloc(20*sizeof(data));

    word non è un puntatore a char ma un vettore di char già allocato. Non ha senso (ed è sbagliato) allocare lo spazio con la malloc.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    24
    Grazie

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    24
    Perchè mi da un errore di segmentazione?
    codice:
    lista[i]=(data*)malloc(sizeof(data));

  9. #9
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Se hai dichiarato:
    codice:
    data **lista;
    lista è un puntatore a puntatore a data, lista[i] è un puntatore a data.
    Per cui quando fai:
    codice:
    lista[i]=(data*)malloc(sizeof(data));
    Ti da segmentation fault se lista non ha alcun elemento allocato.
    lista è un array di puntatori, ma è vuoto.Se i=0 puoi fare:
    codice:
    lista=(data**)malloc(sizeof(data*));
    lista[0]=(data*)malloc(sizeof(data));
    Cambiando l' argomento della malloc puoi anche avere più puntatori, ogni puntatore è un array.Se te in lista[0] ci allochi un solo elemento data è un "array" di un elemento, potresti anche allocarci 20 elementi, 30...
    Ad esempio vuoi 10 array ciascuno da 20 elementi:
    codice:
    lista=(data**)malloc(10*sizeof(data*));
    for(int i=0;i<10;i++)
        lista[i]=(data*)malloc(20*sizeof(data));

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.