Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1

    Problema con gli array di puntatori a strutture.

    Salve a tutti sono iscritto al 2 anno di informatica. Ho un progetto che mi sta causandoun pò di problemi.
    Non sto a spiegare tutto il progetto che devo fare perchè sarebbe troppo lungo
    Immaginate di avere una lista riempita in un modo molto complesso , tramite la funzione Inserisci.
    Dal main viene richiamata la funzione CostruisciArray che deve costruire l'array di puntatori, dove ogni elemento dell'array punta ad un nodo della lista.

    La stuttura del nodo della lista è:

    struct lista{
    int Frequenza;
    char Parola[20];
    char Lemma[10];
    char Pos[10];
    struct lista *nodo_successivo;}

    typedef struct lista *Lista;

    nel Main dichiaro l'array di puntatori di tipo Lista
    Lista *A;
    dopo la funzione inserisci so quante sono le parole dell'articolo(N_parole)
    come si alloca dinamicamente un array di puntatori?
    semplicemente così?
    malloc(N_Parole * sizeof( struct lista**));
    una volta allocato l'array lo passo alla funzione Costruisci Array:
    CostruisciArray(A,testa,N_Parole);

    nella funzione costruisci array come deve avvenire l'assegnazione?

    CostruisciArray(Lista **A, Lista testa, int N_parole){
    int i=0;
    while(i<=N_parole && testa!=NULL){
    A[i]= &testa;
    testa=testa->nodo_successivo;
    i++;}
    }

    mentre la funzione StampaVettore sempre chiamata dal main da Stampa vettore(A,N_Parole);

    int StampaVettore(Lista **A, int N_Parole){
    int i;
    for(i=0;i<=N_parole;i++){
    printf("\nParola: %s, Lemma: %s, Pos: %s, Frequenza %d \n", (*A[i])->Parola, (*A[i])->Lemma, (*A[i])->Pos, (*A[i])->Frequenza);
    }
    }

    il problema è che non va, o si blocca, o mi stampa simboli strani e poi si blocca... o mi stampa sempre i stessi simboli strani fino all'ultima parola.
    Dopo questo, dal main dovrei richiamare heapsort e quicksort per ordinare in base alla frequenza e in ordine alfabetico delle parole... Il programma funziona se uso un array di tipo Lista e associo ad ogni elemento un nodo, ma se invece uso l'array di puntatori non va, il professore ovviamente vuole l'array di puntatori!

    Vi prego datemi qualche suggerimento, perchè è da una settimana che sono bloccato!

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472

    Moderazione

    Il linguaggio di programmazione va indicato anche nel titolo, come da Regolamento, e il codice va racchiuso nel tag [CODE].

    Il titolo di questa discussione l'ho corretto io.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Se fornisci, tra tag CODE, il codice *compilabile* completo di main, è possibile provarlo e capire cosa succede ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    E comunque non si alloca in quel modo un array di puntatori. Se il tuo array è di tipo Lista *, dove Lista è a sua volta struct lista *, l'allocazione deve avvenire (senza scrivere controlli vari) così:

    codice:
       Lista *array;
    
       ...
    
       array = (Lista *) malloc(sizeof(Lista) * N_Parole);
       for (i = 0; i < N_Parole; i++) {
             array[i] = (Lista) malloc(sizeof(struct lista));
       }
    
       ...
    ma in realtà così andrebbe fatto se dovessi effettivamente scrivere dei dati nei vari elementi dell'array, mentre se ho ben capito tu devi solo copiare i puntatori di qualcosa che già esiste, quindi se è così il ciclo for non serve e ti basta allocare spazio per N_Parole puntatori. In ogni caso mi associo al consiglio di ripostare il codice con i tag giusti, perché come vedi si rompe l'Universo senza :°D
    every day above ground is a good one

  5. #5
    Eh si avete ragione

    Questo è il main

    *************************************************M AIN

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "Struttura.h"
    #include "LeggiFile.h"
    #include "StampaLista.h"
    #include "CostruisciArray.h"
    #include "StampaVettore.h"
    #include "HeapSort.h"
    #include "QuickSort.h"
    #include "DeallocaLista.h"
    #include "IndovinaGenere.h"
    int main()
    {

    Lista testa = NULL; // la testa della lista
    Lista testa1 = NULL;
    Lista tmp;
    int N_parole=0, //il numero di parola nella lista
    i, g;
    char Genere[6][10] = {"Politica", "Sport", "Cultura", "Economia", "Scienze", "Cronaca"};
    Lista *A;//array di tipo lista
    FILE *fp, //FILE in.txt
    *fp1, //FILE out.txt
    *fp2; //FILE generi.txt
    int scelta, //scelta dello switch
    step = 0, //definisce i passi dello switch
    k; //


    printf("\n\t\t\t\tBENVENUTI!\n\nQuesto programma permette di visualizzare le prime 100 parole");
    printf(" piu' frequenti \nin un testo in input oppure le prime 100 in ordine alfabetico.\n");
    printf("\nIl programma \"Tree Tagger\", inoltre, permettera' di visualizzare ");
    printf("anche i campi \nPos e Lemma di ogni parola.\n");
    printf("\n\nPremere un tasto per iniziale la lettura da FILE \ne l' inserimento in lista...\n");
    getch();

    //-----esecuzione di Tree Tagger da FILE in.txt ed inserimento ordinato in lista-----

    fp = fopen("in.txt","r");

    if(fp == NULL )// se non trova il FILE in input
    {
    printf("\nApertura FILE fallita\n\n");
    system("pause");
    }
    else
    {
    system("cls");
    printf("BY:\t\t\t\t\t\t|\nALBANO GIOVANNI & ALESSIO DOMENICO ABBINANTE\t|\n");
    printf("------------------------------------------------+\n\n\n");
    //richiamo il Tree Tagger
    system("tag-italian.bat in.txt out.txt");
    fclose(fp);//non mi serve più in.txt
    fp2 = fopen("generi.txt","w");
    fp1 = fopen("out.txt", "r");

    //---------INSERIMENTO IN LISTA PER GENERI-----------
    for(k=0;k<=6;k++)//6 sono i generi
    {

    fp1 = fopen("out.txt", "r");
    LeggiFile(fp1, fp2, &testa, &testa1, &N_parole, k);
    tmp = testa1;
    if(k<6)
    {
    while(tmp)
    {

    if(tmp->Frequenza == 2 || tmp->Frequenza == 3)
    if( !strcmp(tmp->Pos, "NOUN") || !strncmp(tmp->Pos, "VER:", 4))
    fprintf(fp2, "%-20s\n", tmp->Parola);

    tmp = tmp->nodo_successivo;
    }
    }
    fclose(fp1);
    if(k == 6)
    StampaLista(testa1);
    if(k != 6 )
    DeallocaLista(testa1);
    }
    fclose(fp2);
    fp2 = fopen("generi.txt", "r");

    g = IndovinaGenere(testa1, fp2);
    printf("\n\nIl genere dell' ultimo articolo e' : %s\n", Genere[g]);
    system("pause");
    DeallocaLista(testa1);
    fclose(fp2);


    printf("\n\n\nIl FILE e' stato letto correttamente e copiato nella lista.\n\n");
    printf("\nSi desidera visualizzare la lista? (S o N)\n");


    do

    i = getch();

    while( i !=110 && i !=115);// 115 = s , 110 = n

    if( i == 115)//si è scelto di visualizzare la lista
    StampaLista(testa);

    do
    {
    istruzioni(); //stampa istruzioni
    scelta = getch() - 48;
    printf("%d\n", scelta);

    switch(scelta) //scelta da tastiera
    {
    case 1: //si è scelto di visualizzare la lista

    StampaLista(testa);
    istruzioni();

    break;

    case 2: //si è scelto di richiamare l' heap sort

    if(step == 0) //la prima volta
    {
    A = malloc(N_parole*(sizeof(struct lista)));
    Costruisci_Array(testa,A,N_parole);
    //alloca e costruisci l' array


    Heapsort(A,N_parole);

    step = 1; // per non ripetere l' ordinamento
    }
    printf("\n\n\nL' Heap Sort ha funzionato correttamente.\n\n");
    printf("\nSi desidera visualizzare l' array? (S o N)\n");

    do
    i = getch();

    while( i !=110 && i !=115);// 115 = s , 110 = n

    if( i == 115)//si è scelto di visualizzare l' array
    StampaVettore(A,N_parole);

    istruzioni();
    break;

    case 3: //si è scelto di chiamare il quick sort

    if(step == 0) //se non è stato ancora chiamato l' heap sort
    {
    printf("\n\n\nDevi prima richiamare l' Heap Sort!!\n");
    getch();
    }
    else
    {
    if(step == 1) //già è stato chiamato l' Heap Sort
    { //ma non il quick sort
    QuickSort(A,0,N_parole);

    step = 2;
    }

    printf("\n\n\nIl Quick Sort ha funzionato correttamente.\n\n");
    printf("\nSi desidera visualizzare l' array? (S o N)\n");

    do
    i = getch();

    while( i !=110 && i !=115);// 115 = s , 110 = n

    if( i == 115)//si è scelto di visualizzare l' array
    StampaVettore(A,N_parole);
    }
    istruzioni();
    break;


    }

    }while(scelta != -21); //finchè non si preme ESC (27 - 48 = 21)

    free(A); //libera la memoria occupata dall' array
    DeallocaLista(testa);
    printf("\n\n\n\n\t\tARRIVEDERCI!!!\n\n\n");
    system("pause");
    return 0;
    }

    }

    Questa è la struttura

    *****************************STRUTTURA************ ***

    #define LenLine 80 // Lunghezza massima della parola
    #define LenMax 21
    #define LenPos 15
    //STRUTTURA LISTA
    struct lista{
    char Parola[LenMax];
    char Pos[LenPos];
    char Lemma[LenMax];
    int Frequenza;
    struct lista *nodo_successivo;
    };

    typedef struct lista *Lista;

    **************************COSTRUISCI ARRAY DI PUNTATORI ************

    #include <stdio.h>
    #include "Struttura.h"





    void Costruisci_Array(Lista ptr, Lista *A, int N_parole)
    {
    //printf("\nHai inserito %d parole\n",N_parole);
    int i=0;
    while(i<=N_parole && ptr!=NULL){
    A[i]=ptr;
    (ptr)=(ptr)->nodo_successivo;
    i=i+1;
    }
    }


    __________________________________________________

    Come vi avevo detto questo è il programma con l'array di tipo Lista e funziona...se dovessi fare un array dove ogni elemento dell'array punta ad un nodo della lista...come si fa?

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da alex89na
    Eh si avete ragione
    ... ma continui a non postare il codice nel modo corretto ...

    se dovessi fare un array dove ogni elemento dell'array punta ad un nodo della lista...come si fa?
    Ovviamente non si può rispondere facilmente in un post ... comincia ad impostare l'array di puntatori e modifica opportunamente tutte le funzioni ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Come si posta bene un codice, non ci sono riuscito?

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da alex89na
    Come si posta bene un codice, non ci sono riuscito?
    Devi usare il tasto

    #

    che inserisce i tag CODE
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    La cosa è più difficile di quello che sembra XD
    http://www.megaupload.com/?d=FN02MZX3
    qui c'è il progetto scritto con il Dev.
    Ho oscurato la chiamata di sistema per eseguire il programma Tree Tagger, così funziona normalmente
    Le funzione interessate dall'array di puntatori sono il main, costruisci array, heap sort, quick sort.

    Edit. Al momento non si può ancora scaricare...bah...
    nel frattempo provo ad utilizzare il tag->

    codice:
    struct lista{
       char Parola[LenMax];
       char Pos[LenPos]; 
       char Lemma[LenMax];
       int Frequenza; 
       struct lista *nodo_successivo; };
    
    typedef struct lista *Lista;
    direttamente dal Main

    codice:
    Lista *A;//array di tipo lista
    
     A = malloc(N_parole * (sizeof(struct lista)));
                               Costruisci_Array(testa,A,N_parole);
                                //alloca e costruisci l' array
                                   
                                   Heapsort(A,N_parole);
    codice:
    void Costruisci_Array(Lista ptr, Lista *A, int N_parole)
    { 
        //printf("\nHai inserito %d parole\n",N_parole);
        int i=0;
        while(i<=N_parole && ptr!=NULL){
                       A[i]=ptr;
                       (ptr)=(ptr)->nodo_successivo;
                       i=i+1;
        }                    
    }
    Questo è l'heap sort

    codice:
    void Heapsort(Lista *A,int N_parole)
    {
    
     int i,heapsize;
     heapsize=N_parole;
     BuildHeap(A,heapsize,N_parole);
      for (i=N_parole ; i>0 ; i--)
     {
         Scambia(A,0,i);
         heapsize--;
         Heapify(A,0,heapsize);
     }
    }
    così giustamente funziona...ma il professore vuole un array di puntatore di tipo Lista, dove ogni nodo punta ad un nodo della lista...mentre io ho fatto un array di tipo lista dove in ogni A[i] ho assegnato il nodo della lista.

  10. #10
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    39

    Re: Problema con gli array di puntatori a strutture.

    Originariamente inviato da alex89na
    nella funzione costruisci array come deve avvenire l'assegnazione?

    CostruisciArray(Lista **A, Lista testa, int N_parole){
    int i=0;
    while(i<=N_parole && testa!=NULL){
    A[i]= &testa;
    testa=testa->nodo_successivo;
    i++;}
    }
    Devi mettere solo Lista *A perchè Lista l'hai già definito come lista *;
    ad A[i] devi assegnare testa per lo stesso motivo, è già un puntatore;
    per il resto questa dovrebbe andare... Le stesse cose le fai in StampaVettore!
    (*A[i])->Frequenza deve diventare o A[i]->Frequenza o (*A[i]).Frequenza!
    e anche qui gli devi passare Lista *A!

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.