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

    [C] puntatori a funzioni ed errore di compilazione

    Ciao a tutti,

    giusto oggi ho cominciato a programmare in C, e sono subito caduto in un problema che non riesco a risolvere: durante la compilazione (con GCC) del mio file .C, viene rilevato un parser error in file header incluso:

    codice:
    ....
    
    CLD_RESULT (*COMMAND)(int, char[][]);
    
    struct {
    	int index;
    	char* name;
    	char* doc;
    	int args_num;
    	COMMAND command;   //Riga 18
    } command_node;
    
    struct command_node commands[CLD_MAX_COMMANDS];
    int cindex = 0;
    
    ....
    Mi dice che alla riga 18 c'e' un parser error, dandomi come warning "no semicolon at the end of structo or union", e dandomi poi come warning alla linea 19 "data definition has no type or storange class".
    Penso che gli errori siano facili da correggere, sapete dirmi qualcosa??

    Una info: se nell'header definisco una variabile che voglio poi usare come globale all'interno dei file che includono questo header, la devo definire EXTERN?
    eXtending-Php.net coming soon ...

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Ehm... mi sa che hai fatto qualcosa di strano: non hai dato un nome alla struct, tenti di dichiarare una variabile di quel tipo (senza nome) e credi di aver dato come nome alla struct "command_node"... questo dovrebbe andare:
    codice:
    struct command_node {  /* E' qui che va il nome da assegnare al tipo */
    	int index;
    	char* name;
    	char* doc;
    	int args_num;
    	COMMAND command;
    }; /* puoi anche dichiarare qui, eventuali variabili di questo tipo */
    
    struct command_node commands[CLD_MAX_COMMANDS];
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Ora mi da solamente "no semicolon at the end of struct or union" alla riga 18 ... why?
    eXtending-Php.net coming soon ...

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Beh... hai detto che COMMAND è definita in un header... prova a postare il codice dell'header, credo che COMMAND sia una struct o una union scritta in modo sbagliato...
    Poi: il punto e virgola alla fine della struct l'hai messo, come nel mio codice?

    Mi sembra un po' strano che non vada...



    Ciao
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Facciamo cosi': posto l'header ed il main e vediamo cosa non va:

    header: cld.h
    codice:
    #ifndef __CLD_H_
    #define __CLD_H_
    
    #define CLD_OK		1
    #define CLD_FAIL	0
    #define CLD_RESULT	int
    #define CLD_SUCCEDE(a)	(a == CLD_OK)
    #define CLD_FAILED(a)	(a == CLD_FAIL)
    #define CLD_MAX_COMMANDS	32
    
    CLD_RESULT (*COMMAND)(int, char[][]);
    
    struct command_node{
    	int index;
    	char* name;
    	char* doc;
    	int args_num;
    	COMMAND command;
    };
    
    struct command_node commands[CLD_MAX_COMMANDS];
    int cindex = 0;
    
    int register_command(char*, char*, int, COMMAND);
    CLD_RESULT run_command(char*, int, char[][]);
    
    #endif
    main: cld.c
    codice:
    #include <stdio.h>
    #include "cld.h"
    
    int register_command(char* name, char* doc, int an, COMMAND cmd){
    	commands[cindex] = {cindex, name, doc, an, cmd};
    	cindex++;
    }
    
    //definizione di un comando test
    
    //Comando Print: stampa gli argomenti
    
    CLD_RESULT cmd_print(int argc, char[] *args){
    	int i;
    
    	for(i = 0; i < argc; i++){
    		printf("%s\n", args[i]);
    	}
            return CLD_OK;
    }
    
    CLD_RESULT run_command(char* name, int argc, char[][] args){
    	struct command_node *tmp;
    	COMMAND cmd = NULL;
    	int i;
    
    	for(i = 0; i < cindex; i++){
    		tmp = &commands[i];
    		if(tmp->name == name){
    			if(tmp->args_num == -1 || tmp->args_num == argc){
    				cmd = tmp->command;
    				break;
    			}
    		}
    	}
    	if(cmd == NULL){
    		return CLD_FAIL;
    	}
    	return cmd(argc, args);
    }
    
    int main(int argc, char[] *args){
    
    	char[] *args = {
    		"primo",
    		"secondo"
    	};
    
    	register_command("print", "prints all the arguments passed", -1, cmd_print);
    	run_command("print", 2, args):
    
    	return 0;
    }
    Ripeto che e' la prima volta che uso C. Il programmino dovrebbe registrare un puntatore a funzione e richiamare la funzione tramite run_command(). La compilazione da errori anche sulle variabili cindex e commands, che dovrebbero essere globali (forse devo usare extern???)

    grazie per l'aiuto
    eXtending-Php.net coming soon ...

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Ehm... ma dove hai definito il tipo COMMAND? Non c'è da nessuna parte...
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Ho letto che per definire un puntatore a funzione devo usare la sintassi

    VALORE_RESTITUITO (*NOME_PTR)([argomenti]);

    dove NOME_PTR e' il nome da associare al puntatore di funzione.
    La sintassi dovrebbe essere corretta, visto che voglio usare COMMAND come noem del puntatore ...

    altrimenti come posso fare a definire un puntatore a funzione?
    eXtending-Php.net coming soon ...

  8. #8
    Utente di HTML.it L'avatar di pixer
    Registrato dal
    Oct 2000
    Messaggi
    614
    Originariamente inviato da Dark Bard
    altrimenti come posso fare a definire un puntatore a funzione?
    La domanda è: perchè definire un puntatore a funzione ?

    ciao dark
    MySQL Worker - The OpenSource Multiplatform MySQL database Administrator (C++ powered)
    .:[ It resumes the development !! ]:.


  9. #9
    ciao bello.

    Quello che voglio fare e' questo:

    definire una funzione A che acceta come parametri una funzione di CALLBACK ed una lista di argomenti. La funzione dovrebbe eseguire la callback passandole come parametro la lista di args.
    eXtending-Php.net coming soon ...

  10. #10
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Calma. La definizione di una fnuzione ha la seguente sintassi:

    valore restituito nome funzione([eventuali parametri]);

    Dunque questa riga:
    codice:
    CLD_RESULT (*COMMAND)(int, char[][]);
    significa:

    Definisco un puntatore ad una funzione che si chiama COMMAND, la quale restituisce un valore di tipo CLD_RESULT.

    Ma rimane il fatto che tu usi COMMAND come identificatore di tipo all'interno della struct: il compilatore vede che c'è una funzione che si chiama COMMAND e tu la usi all'interno della struct per identificare un tipo di dato... questo non va bene, nemmeno dal punto di vista semantico.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

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.