Salve a tutti ragazzi ho avuto questo compito a scuola la simulazione dello stack di un microprocessore utilizzando le liste ho creato il programma riscontrando i seguenti errori:
in più mi ritrovo che quando stampo la lista un loop del messaggio che ho dato per la stampacodice:In function `InserisciNodo': [Warning] assignment from incompatible pointer type In function `EstraiNodo': [Warning] assignment from incompatible pointer type
riuscite a darmi una mano ?
un ringraziamento in anticipo
Codice programma:
codice:/*********************************************************************************** Autore: Capuano Nicola Data:05/05/2011 Titolo: Simulazione dello STACK Descrizione:Questo programma simulera uno stack attraverso le liste Ogni Nodo sarà l'elemento dello stack, verrà inserito ogni volta in testa alla lista seguendo l'ordine LIFO (Last in Firt Out) cioè quando noi inseriamo un elemento l'elemento sarà sempre in cima alla pila e sarà l'ultimo elemento che andremmo ad estrarre. ------------------------------------------------------------------------------------*/ #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <windows.h> /* API di windows */ /*************************************************************************************** La struttura e composta da un solo campo d'informazione e un puntatore che punta al nodo successivo. --------------------------------------------------------------------------------------*/ typedef struct Nodo { char Numero[200]; struct nodo* Successivo; }NODO; /*-----------------------------------------------------------------------------------*/ #define ESC 27 void Clrscr (void); void Gotoxy (int x, int y); void TextColor (unsigned short Colore); void Maschera (char *Titolo); void LeggiStringa(char Buf[],int Max); NODO* InserisciNodo (NODO* Testa); NODO* EstraiNodo(NODO* Testa); void StampaStack(NODO* Head); /************************************************************************************ Il main e composto unicamente dal menu formato da uno swtich che chiamerà delle subroutine che inseriranno e estrarrano i nodi dalla lista --------------------------------------------------------------------------------------*/ main() { /*************************** Dichiriamo il nodo di testa che indica la posizione del primo elemento nella lista --------------------------*/ NODO* Testa; /******************************* La variabile "Tasto" verrà utilizzata per interagire nel menu utilizzando la funzione _getch() che legge il tasto battuto sulla tastiera ------------------------------*/ int Tasto; do { Maschera("Simulazione Dello Stack"); /********************************************** Il menu e composto da 3 casi dello switch Inserisci , Estrai, Stampa per utilizzare questi tre casi lo switch analizzera la variabile tasto in cui attraverso _getch() abbiamo inserito il valore ascii del tasto battuto sulla tastiera I=Inserisci S=Stampa E=Estrai per guanto riguarda la grafica del menu, e gestita da una subroutine. -------------------------------------------------*/ Tasto=_getch(); switch(Tasto) { case 'i': Testa=InserisciNodo(Testa); break; case 's': StampaStack(Testa); break; case 'e': Testa=EstraiNodo(Testa); break; } }while(Tasto!=ESC); /************************************************ alla fine liberiamo i nodi che magari non sono stati estratti durante l'uso del programma ----------------------------------------------*/ } /*************************************************************************************** FUNZIONI: INSERISCI,STAMPA,ESTRAI UN ELEMENTO DALLA LISTA ----------------------------------------------------------------------------------------*/ /***************************************************************************************** INSERISCI: Input: Puntatore di testa Output: Nuovo puntatore di testa e nodo inserito nella lista Descrizione: Il nodo verra inserito in testa alla lista per simulare il modo in cui vengono inserite le informazioni nello stack ---------------------------------------------------------------------------------------*/ NODO* InserisciNodo (NODO* Testa) { char Rigo[200],NuovoNumero; NODO* NuovoNodo;/*Nuovo Nodo*/ NuovoNodo=(NODO*)malloc(sizeof(NODO));/*Allochiamo Memoria nella heap*/ printf("\n Inserisci L'elemento nello Stack: "); LeggiStringa(Rigo,200); strcpy(NuovoNodo->Numero,Rigo); NuovoNodo->Successivo=Testa; Testa=NuovoNodo; return Testa; } /*************************************************************************************** STAMPASTACK: input: Puntatore di testa Output: Stampa sul video della lista Descrizione: La subroutine stampera semplicemente sul video gli elementi della lista. -----------------------------------------------------------------------------------------*/ void StampaStack(NODO* Testa) { NODO* NuovoNodo; NuovoNodo=Testa; while(NuovoNodo != NULL) { printf("\nElemento in lista: ",NuovoNodo->Numero); NuovoNodo->Successivo; } } /****************************************************************************************** ESTRAINODO: Input: Puntatore di testa output: Lista vuota Descrizione: Questa subroutine ha il compito di estrarre dall'ultimo nodo in poi gli elementi della lista simulando l'estrazione da uno stack cioè l'ultimo elemento inserito sarà il primo eliminato. ------------------------------------------------------------------------------------------*/ NODO* EstraiNodo(NODO* Testa) { NODO* NuovoNodo; NuovoNodo=Testa; Testa=NuovoNodo->Successivo; free(NuovoNodo); return Testa; } /*************************************************************************************** FUNZIONI DI INPUT E OUTPUT ***************************************************************************************/ /************************************************************************************** LEGGI STRINGA ***************************************************************************************/ void LeggiStringa (char Buf[], int Max) { int i; fgets(Buf, Max, stdin); fflush(stdin); for (i=0; Buf[i]<0 || Buf[i]>31; i++); Buf[i] = 0; } /************************************************************************************* Crea una maschera standard per il software: Il titolo e' centrato in un rigo di 80 caratteri. **************************************************************************************/ void Maschera ( char *Titolo ) { char Rigo[96]; // multiplo anche di 16 int d, i, n; if ( (n=strlen(Titolo)) > 78) n = 78; // tronca il titolo lungo sprintf (Rigo, "%80s", " "); for (d=(80-n)/2, i=0; i<n ; Rigo[d++]=Titolo[i++]); Clrscr(); Gotoxy(0, 0); TextColor (0xC0); printf(Rigo); sprintf (Rigo, "%60s%s", " ", "Capuano Nicola "); Gotoxy(0,24); TextColor (0xC0); printf(Rigo); Gotoxy(0, 0); TextColor (7); } /***************************************************************************** Cancella lo schermo. ******************************************************************************/ void Clrscr (void) { COORD coord; DWORD written; CONSOLE_SCREEN_BUFFER_INFO info; coord.X = 0; coord.Y = 0; GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &info); FillConsoleOutputCharacter (GetStdHandle(STD_OUTPUT_HANDLE), ' ', info.dwSize.X * info.dwSize.Y, coord, &written); Gotoxy (1, 1); } /***************************************************************************** Posiziona il cursore di console alle coordinate x,y. ******************************************************************************/ void Gotoxy ( int x, // indice di colonna int y // indice di riga ) { COORD Cur = {x, y}; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Cur); } /***************************************************************************** Utilizzando la funzione SetConsoleTextAttribute(HANDLE,WORD) cambia il colore del testo da stampare in console. ******************************************************************************/ void TextColor ( unsigned short Colore // codice numerico del colore ) { HANDLE h = GetStdHandle ( STD_OUTPUT_HANDLE ); SetConsoleTextAttribute ( h, Colore ); } /***************************************************************************** MENU ******************************************************************************/

Rispondi quotando