Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it L'avatar di Linusss
    Registrato dal
    Sep 2002
    Messaggi
    405

    [C]File e strutture:non trovo l'errore

    Raga ho fatto un semplice programmino che utilizza le liste per memorizzare dei caratteri da tastiera e all'occorrenza li salva su file(questa funziona la devo ancora creare).
    Il fatto è che compilandolo mi da un errore.
    Il codice è questo:
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    #include <dos.h>
    
    /*STRUTTURA DEGLI ELEMENTI DELLA LISTA*/
    typedef struct buffer{
    char *stringa;
    struct buffer *pun;
    }buff;
    /*------------------------------------*/
    typedef buff *pbuff;
    showlist(pbuff);
    savelist(pbuff);
    
    void main()
    {
    char c;
    pbuff p, ptemp;
    printf("Inserisci dei caratteri da tastiera,premi ESC quando hai finito.");
    p=(pbuff)malloc(sizeof(buff));
    ptemp=p;
    while(c!=27)
    {
    c=getch();
    if (c==0)
    	{
    	c=getch();
    	if (c==72)
    		ptemp->stringa="Su";
    	if (c==80)
    		ptemp->stringa="Gi—";
    	if (c==75)
    		ptemp->stringa="Sx";
    	if (c==77)
    		ptemp->stringa="Dx";
    	}
    else p->stringa[0]=c;
    ptemp->pun=(pbuff)malloc(sizeof(buff));
    ptemp=ptemp->pun;
    delay(150);
    clrscr();
    }
    ptemp->pun=NULL;
    printf("\n========MENU=======\n(1)Vedi caratteri digitati\n(2)Salva su file\n(ESC)Esci");
    do
    {
    c=getch();
    switch(c){
    	case 49 :showlist(p);break;
    	case 50 :savelist(p);break;
    	case 27 :break;
    	}
    	delay(150);
    	}
    while(c!=27);
    }
    
    void showlist(pbuff primoel)
    {
    if(primoel!=NULL)
    	printf("I caratteri digitati sono: ");
    while(primoel!=NULL)
    {
    	printf("%s-->", primoel->stringa);
    	primoel=primoel->pun;
    }
    }
    l'errore è nella funzione showlist sembra che gli passo dei valori sbaglati...
    se avete tempo dateci un occhi vi ringrazio
    ciao!

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Quando scrivi il prototipo della showlist cosi'

    showlist(pbuff);

    stai dicendo al compilatore di assumere che la funzione restituisca un int. E' come se scrivessi

    int showlist(pbuff);

    Quando la dichiari nel codice invece, questa diventa

    void showlist(pbuff primoel)

    ovvero non restituisce valori. Questa differenza determina l'errore di compilazione.

    Per evitare questi problemi si usa scrivere il main alla fine del codice sorgente in modo evitando di scrivere i prototipi delle funzioni.

  3. #3
    Utente di HTML.it L'avatar di Linusss
    Registrato dal
    Sep 2002
    Messaggi
    405
    Grazie ora lo compila. Però ho notato che non funziona molto bene...vedi qualcos'altro che non quadra?
    Ad esempio io ho una lista che contiene delle stringhe, va bene il metodo che uso per memorizzare il carattere nella stringa e per poi visualizzarlo a schermo?

  4. #4
    Utente di HTML.it L'avatar di Linusss
    Registrato dal
    Sep 2002
    Messaggi
    405
    xkè se nella struttura invece che:
    char *stringa;

    metto

    char stringa[3]=" "; mi da errore?
    oppure anche solo
    char stringa[3]; sempre errore, eppure a me serve un vettore di caratteri...

  5. #5
    Utente di HTML.it L'avatar di Linusss
    Registrato dal
    Sep 2002
    Messaggi
    405
    allora se nella struttura metto char stringa[3];
    dopo mi da errore quando provo a memorizzare qualcosa nella stringa usando
    p->stringa="abc"; dove p punta alla struttura ovviamente(elemento della lista);
    Come mai?Eppure mi sembra tutto logico...

  6. #6
    Originariamente inviato da Linusss
    allora se nella struttura metto char stringa[3];
    Se la stringa più lunga è di tre caratteri
    stringa[3]
    non è sufficiente devi aggiungere un char per il terminatore quindi :
    stringa[4]
    dopo mi da errore quando provo a memorizzare qualcosa nella stringa usando
    p->stringa="abc"; dove p punta alla struttura ovviamente(elemento della lista);
    Come mai?Eppure mi sembra tutto logico...
    #include <string.h>
    ...
    strcpy( p->stringa, "abc"); /* Per copiare le stringhe */
    ...

    ...
    p->stringa[0] = c; /* Copia il carattere digitato */
    p->stringa[1] = '\0' /* Aggiungi 'manualmente' il terminatore di stringa */
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  7. #7
    Utente di HTML.it L'avatar di byaur
    Registrato dal
    Aug 2004
    Messaggi
    1,061
    Originariamente inviato da Linusss
    allora se nella struttura metto char stringa[3];
    dopo mi da errore quando provo a memorizzare qualcosa nella stringa usando
    p->stringa="abc"; dove p punta alla struttura ovviamente(elemento della lista);
    Come mai?Eppure mi sembra tutto logico...
    per il tipo di programma che devi fare ti consiglio di usare la sintassi
    char *stringa, e poi con la malloc() allochi lo spazio necessario per memorizzare quello che ti serve.
    char stringa[3] è molto restringente e come è detto prima basta un carattere terminatore è ti si sputtana tutto!!! VVoVe: VVoVe:

    Chi di noi non vorrebbe
    sollevare il velo sotto cui sta nascosto il
    futuro...
    David Hilbert

  8. #8
    Utente di HTML.it L'avatar di Linusss
    Registrato dal
    Sep 2002
    Messaggi
    405
    Allora la parola + lunga che va a finire nella stringa in questione è Giù, ma normalemnte ci vanno i caratteri premuti...che sono quindi di un solo carattere.
    Quindi stringa[4] dovrebbe bastare, ma non riesco ad inserire un solo carattere come si deve, infatti quando vado a rileggere i caratteri che ho digitato sembrano un po' a casaccio.

  9. #9
    Originariamente inviato da Linusss
    Allora la parola + lunga che va a finire nella stringa in questione è Giù, ma normalemnte ci vanno i caratteri premuti...che sono quindi di un solo carattere.
    Quindi stringa[4] dovrebbe bastare, ma non riesco ad inserire un solo carattere come si deve, infatti quando vado a rileggere i caratteri che ho digitato sembrano un po' a casaccio.
    Così è ok :
    codice:
    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>
    #include <conio.h>
    #include <dos.h>
    
    /*STRUTTURA DEGLI ELEMENTI DELLA LISTA*/
    
    typedef struct buffer
    {
    	char stringa[6];		/* Alloco staticamente la dimensione della stringa */
    	struct buffer *pun;
    } buff;
    
    /*------------------------------------*/
    
    typedef buff *pbuff;
    void showlist( pbuff );
    void savelist( pbuff );
    
    int main()
    {
    	char c;
    	pbuff p, ptemp;
    	printf("Inserisci dei caratteri da tastiera,"\
    	" premi ESC quando hai finito.\n\n");
    	p = (pbuff)malloc( sizeof(buff) );
    	p->pun = NULL;
    	ptemp = p;
    	
    	while( c!=27 && c!=13 )
    	{
    		c = getch();
    		if( c<=0 || c>31 ) /* Ignora se non ACII */
    		{
    			if( c<=0 )
    			{
    				c=getch();
    				if( c==72 )
    					strcpy( ptemp->stringa, "(Su)");
    				else if( c==80 )
    					strcpy( ptemp->stringa, "(Gi—)");
    				else if( c==75 )
    					strcpy( ptemp->stringa, "(Sx)");
    				else if (c==77)
    					strcpy( ptemp->stringa, "(Dx)");
    				else
    					strcpy( ptemp->stringa, "(?)");
    			}
    			else
    			{
    				ptemp->stringa[0] = c;
    				ptemp->stringa[1] = '\0'; /* Aggiungo un terminatore */
    			}
    			/* Echo dei tasti premuti */
    			printf("%s", ptemp->stringa);
    			
    			ptemp->pun=(pbuff)malloc(sizeof(buff));
    			ptemp=ptemp->pun;
    		}
    		/* delay(150); non supportata dai miei compilatori :) */
    	}
    	ptemp->pun=NULL;
    	ptemp = p;
    	do
    	{
    		clrscr();
    		printf("\n\t  ============MENU==========\n\t"\
    		"  1) Vedi caratteri digitati\n\t"\
    		"  2) Salva su file\n\tESC) Esci\n\n");
    		c=getch();
    		switch(c)
    		{
    			case 49 : showlist( ptemp ); break;
    /*			case 50 : savelist( ptemp ); break; */
    		}
    		/* delay(150); non supportata dai miei compilatori :) */
    	}
    	while( c != 27 );
    	return EXIT_SUCCESS;
    }
    
    void showlist(pbuff primoel)
    {
    	if( primoel->pun != NULL)
    	{
    		printf("I caratteri digitati sono: \n");
    		while(primoel->pun != NULL)
    		{
    			printf("%s-->", primoel->stringa);
    			primoel = primoel->pun;
    		}
    		printf("NULL\n");
    	}
    	else
    	{
    		printf("Nessun carattere digitato.\n");
    	}	
    	printf("\n\nPremi un tasto.\n");
    	getch();	
    }
    Dov'era il problema che riscontravi ? :master:
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

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.