Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Attenti a Poco F7: può essere il best buy del 2025. Recensione
Attenti a Poco F7: può essere il best buy del 2025. Recensione
Poco F7 5G, smartphone che punta molto sulle prestazioni grazie al processore Snapdragon 8s Gen 4 e a un display AMOLED da ben 6,83 pollici. La casa cinese mantiene la tradizione della serie F offrendo specifiche tecniche di alto livello a un prezzo competitivo, con una batteria generosissima da 6500 mAh e ricarica rapida a 90W che possono fare la differenza per gli utenti più esigenti.
Recensione Samsung Galaxy Z Fold7: un grande salto generazionale
Recensione Samsung Galaxy Z Fold7: un grande salto generazionale
Abbiamo provato per molti giorni il nuovo Z Fold7 di Samsung, un prodotto davvero interessante e costruito nei minimi dettagli. Rispetto al predecessore, cambiano parecchie cose, facendo un salto generazionale importante. Sarà lui il pieghevole di riferimento? Ecco la nostra recensione completa.
The Edge of Fate è Destiny 2.5. E questo è un problema
The Edge of Fate è Destiny 2.5. E questo è un problema
Bungie riesce a costruire una delle campagne più coinvolgenti della serie e introduce cambiamenti profondi al sistema di gioco, tra nuove stat e tier dell’equipaggiamento. Ma con risorse limitate e scelte discutibili, il vero salto evolutivo resta solo un’occasione mancata
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 14-03-2013, 21:00   #1
pocho183
Junior Member
 
Iscritto dal: Mar 2013
Messaggi: 23
errore lnk2019 visual studio

Dopo aver compilato il programma ottengo questo errore:


error LNK2019: riferimento al simbolo esterno "void __cdecl startServer(char * *)" (?startServer@@YAXPAPAD@Z) non risolto nella funzione _main


Nel file chiamato server.cpp in cui c'è L' int main(int argc, char** argv){ ecc. ad un certo punto chiamo la funzione
if(opzione==2) startServer(argv);

Quella funzione è in un file startServer.cpp che inizia con: void startServer(int argc, char**argv){

Non riesco a capire l'errore, mi sono perso con i puntatori su argv, potete aiutarmi?
pocho183 è offline   Rispondi citando il messaggio o parte di esso
Old 14-03-2013, 21:54   #2
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Quote:
Originariamente inviato da pocho183 Guarda i messaggi
Dopo aver compilato il programma ottengo questo errore:


error LNK2019: riferimento al simbolo esterno "void __cdecl startServer(char * *)" (?startServer@@YAXPAPAD@Z) non risolto nella funzione _main


Nel file chiamato server.cpp in cui c'è L' int main(int argc, char** argv){ ecc. ad un certo punto chiamo la funzione
if(opzione==2) startServer(argv);

Quella funzione è in un file startServer.cpp che inizia con: void startServer(int argc, char**argv){

Non riesco a capire l'errore, mi sono perso con i puntatori su argv, potete aiutarmi?
Ma nel codice passi solo argv mentre la firma del metodo ha 2 parametri, la firma del metodo dovrebbe essere:
void startServer(char**argv)
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 14-03-2013, 22:03   #3
lorenzo001
Senior Member
 
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
if(opzione==2) startServer(argc, argv);
lorenzo001 è offline   Rispondi citando il messaggio o parte di esso
Old 14-03-2013, 22:06   #4
pocho183
Junior Member
 
Iscritto dal: Mar 2013
Messaggi: 23
passando solamente char**argv, mi da errore per la mancanza di argc,perchè mi serve dopo. Come posso risolvere?
pocho183 è offline   Rispondi citando il messaggio o parte di esso
Old 14-03-2013, 22:09   #5
pocho183
Junior Member
 
Iscritto dal: Mar 2013
Messaggi: 23
come dice lorenzo0001 mi da errore: la funzione startserver non accetta due argomenti
l'argomento di tipo int è incompatibile con char**
pocho183 è offline   Rispondi citando il messaggio o parte di esso
Old 14-03-2013, 22:11   #6
lorenzo001
Senior Member
 
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
Non ti sei spiegato ... hai detto che hai un file .cpp in cui c'è la funzione

void startServer(int argc, char**argv)

oppure ho capito male?

Spiegati meglio.
lorenzo001 è offline   Rispondi citando il messaggio o parte di esso
Old 14-03-2013, 22:15   #7
pocho183
Junior Member
 
Iscritto dal: Mar 2013
Messaggi: 23
Codice:
* Server.c */

#include "macro.h"
#include "manutenzione.h"
#include "startServer.h"
#include "funzioniServer.h"


int modalita(){

        int modalita;
        int testscanf;

        /* Seleziono l'opzione desiderata scartando quelle "illegali" */
                printf("Premi l'opzione desiderata: 1[Manutenzione], 2[Avvia server], 3 [Esci]");
                testscanf = scanf("%d", &modalita);  // il valore di modalità viene letto da scanf e lo inserisco in testscanf
                if(testscanf == 0 || modalita>3 || modalita<1) { // Ho scelto un'opzione "illegale"
                                        printf("\nErrore scanf\n");
                                        chiusuraServer();
                                }
                        printf("Opzione non valida...\n");
						fflush(stdout);

        /* Ritorno il valore dell'opzione selezionata*/
        return modalita;
}


void inizializzazione(){
        printf("\nInizializzazione server in corso...\n\n");

        /* Testo l'apertura del file ElencoTelefonico.txt in lettura */

        if(( ElencoTelefonico = fopen("ElencoTelefonico.txt", "r")) == NULL){
                printf("Non è possibile aprire il file di lettura Elenco telefonico\n\n");
				fflush(stdout);
                chiusuraServer();
        }
        else{
                printf("Apertura elenco telefonico avvenuta con successo...\n");
				fflush(stdout);
        }

        /* Testo l'apertura del file Permessi.txt in lettura */

        if(( Permessi = fopen("Permessi.txt", "r")) == NULL){
                printf("Non è possibile aprire il file di lettura Permessi\n\n");
                chiusuraServer();
        }
        else{
                printf("Apertura elenco utenti avvenuta con successo...\n\n");
        }
}
 
int main(int argc, char** argv){

        if(argc != 3){
                printf("ERRORE - Avviare il programma usando il comando: %s [Indirizzo IP] [Porta]", argv[0]);
                chiusuraServer();
        }
        else{

                /* Eseguo il test degli archivi */

                inizializzazione();
                int opzione;
                while(1){

                        /* Seleziono l'opzione dal menù principale*/

                        opzione = modalita();

                        /* Chiamo la funzione specifica per l'opzione selezionata */

                        if(opzione==1) manutenzioneMain();
                        if(opzione==2) startServer(argv);
                        if(opzione==3) chiusuraServer();
                }
        }
}



questa è la funzione


Codice:
/* Server.c */

#include "macro.h"
#include "startServer.h"
#include "funzioniServer.h"
#include <winsock.h>
#include <stdlib.h>
#include <stdio.h>
#pragma comment(lib, "ws2_32.lib") // Risolve problemi con il Linker tipo LNK2019.
#define LISTENQ        (1024)
#define MAX_LINE       (1000)

int ParseCmdLine(int argc, char *argv[], char **szPort); ////controlla se i parametri passati nel main siano corretti, szport mi indica che devo passare solo la porta da prompt,viene aggiornata dopo l'esecuzione del parse.


void startServer(int argc, char**argv){
	    printf("\n\nAvvio server in corso...\n");	
        struct sockaddr_in target;
		struct sockaddr_in accepted;
		short int port;                  /*  port number               */
		char     *endptr;                /*  for strtol()              */
		int acceptedLen= sizeof(accepted);  // accept scriverà la propria taglia
		char buffer[MAX_LINE];      /*  character buffer          */
		WSADATA   wsaData;

			/*  Get command line arguments  */

    ParseCmdLine(argc, argv, &endptr);// e' una funzione
	port = strtol(endptr, &endptr, 0);////permette di convertire una stringa in un intero lungo,accetta dati in numero basi diverse e converte in decimale
	if ( *endptr )
	{
	   fprintf(stderr, "server: porta non riconosciuta.\n");
	  exit(EXIT_FAILURE);
	}
		printf("Server in ascolto sulla porta %d\n",port);

		if (WSAStartup(MAKEWORD(1,1), &wsaData) != 0) {  // Affinchè, windows utilizzi i socket devo mandare in startup il layer dei socket
		printf("errore in WSAStartup()\n");
		exit(EXIT_FAILURE);
	}

        /* Creo il socket */
		SOCKET sock;
		SOCKET newSock;
        printf("\nCreazione socket in corso...");
        sock=socket(AF_INET, SOCK_STREAM, 0);

/* Stabilisco l'indirizzo IP del server secondo argomento da linea di comando, il protocollo utilizzato e il port number (terzo argomento da linea di comando*/
        memset(&target, 0, sizeof(target));
        target.sin_family = AF_INET;
		target.sin_addr.s_addr = htonl(INADDR_ANY);// l'argomento di htons deve essere un intero, uso atoi che converte da stringa a intero;
		target.sin_port =htons(port);//argv[2] è la porta; htons converte il numero di porta voluto, perchè i valori utilizzati
		                                                          //da internet sono diversi da quelli del pc.
		
        /* Effettuo il bind */

        printf("\nBind in corso...");
        if(bind(sock,(struct sockaddr *)&target, sizeof(target))==SOCKET_ERROR){
			printf("Errore nel bind");
		}

        /* Mi metto in ascolto */                

if(listen(sock,LISTENQ) ==SOCKET_ERROR) { // listenq sono il numero di connessioni sospese
	printf("server: Errore durante la listen");
	exit(EXIT_FAILURE);
}

                /* Creo un nuovo socket per la connessione del singolo client */

				while(1) {
                printf("\nSono in attesa di una connessione...\n");
                if((newSock = accept(sock, (struct sockaddr *) &accepted, &acceptedLen))==INVALID_SOCKET){ // accept = attesa di connessione
                        printf("\nErrore: Impossibile creare un nuovo socket!\nConnessione fallita\n");
                }

                                 /* Primo contatto con il client */

		printf("Server: connessione da %s:%d\n", inet_ntoa(accepted.sin_addr),accepted.sin_port);
		while (send(newSock,"OK",strlen("OK"),0)==SOCKET_ERROR) {
			printf("Errore durante la system call");
				}
		printf("\nConnessione avvenuta");
		printf("\nIn attesa del login...");
		
		/* Effettuo il login del client */

                int permessi;
                permessi = login(newSock);
                if(permessi != -1){

                /* In caso di Login invoco la funzione che gestisce le richieste del client */

                        servizio(permessi, newSock);
                }
                /* Il client si è disconnesso */

                printf("\nConnessione terminata.\n");


		/*  Close the connected socket  */

		if ( closesocket(newSock) == SOCKET_ERROR )
		{
	    	fprintf(stderr, "server: errore durante la close.\n");
		    exit(EXIT_FAILURE);
		}
		
				}
	if ( closesocket(sock) == SOCKET_ERROR )
	{
		fprintf(stderr, "server: errore durante la close.\n");
		exit(EXIT_FAILURE);
	}
	WSACleanup();

}

int ParseCmdLine(int argc, char *argv[], char **szPort)
{
     int n = 1;

    while ( n < argc )
	{
		if ( !strncmp(argv[n], "-p", 2) || !strncmp(argv[n], "-P", 2) )
			*szPort = argv[++n];
		else 
			if ( !strncmp(argv[n], "-h", 2) || !strncmp(argv[n], "-H", 2) )// il -h è l'help
			{
			    printf("Sintassi:\n\n");
	    		printf("    server -p (porta) [-h]\n\n");
			    exit(EXIT_SUCCESS);
			}
		++n;
    }
	if (argc==1)
	{
	    printf("Sintassi:\n\n");
		printf("    server -p (porta) [-h]\n\n");
	    exit(EXIT_SUCCESS);
	}
    return 0;
}
pocho183 è offline   Rispondi citando il messaggio o parte di esso
Old 14-03-2013, 22:17   #8
lorenzo001
Senior Member
 
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
E quindi è come ti dicevo io ... dato che hai una funzione

void startServer(int argc, char**argv)

devi chiamarla con

if(opzione==2) startServer(argc, argv);

Cosa non va?
lorenzo001 è offline   Rispondi citando il messaggio o parte di esso
Old 14-03-2013, 22:21   #9
pocho183
Junior Member
 
Iscritto dal: Mar 2013
Messaggi: 23
facendo come mi dici mi da questo errore:

error C2660: 'startServer': la funzione non accetta 2 argomenti

IntelliSense: l'argomento di tipo "int" è incompatibile con il parametro di tipo "char **"

IntelliSense: troppi argomenti nella chiamata di funzione
pocho183 è offline   Rispondi citando il messaggio o parte di esso
Old 14-03-2013, 22:22   #10
lorenzo001
Senior Member
 
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
Scusa, ma quali file ci sono in questo tuo progetto?

Hai presentato due file che si chiamano Server.c ... come è questa storia?

E cosa c'è nel file "startServer.h" ?

Ultima modifica di lorenzo001 : 14-03-2013 alle 22:25.
lorenzo001 è offline   Rispondi citando il messaggio o parte di esso
Old 14-03-2013, 22:26   #11
pocho183
Junior Member
 
Iscritto dal: Mar 2013
Messaggi: 23
dentro file di intestazioni ci sono:
funzioniserver.h
macro.h
manutenzione.h
server.h
startserver.h

dentro file di risorse :
funzioniserver.cpp
manutenzione.cpp
server.cpp
startserver.cpp
pocho183 è offline   Rispondi citando il messaggio o parte di esso
Old 14-03-2013, 22:28   #12
pocho183
Junior Member
 
Iscritto dal: Mar 2013
Messaggi: 23
dentro startserver.h c'è :
/* Avvia il server */

void startServer(char** argv);
pocho183 è offline   Rispondi citando il messaggio o parte di esso
Old 14-03-2013, 22:28   #13
lorenzo001
Senior Member
 
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
E questo è sbagliato.

Nel .h e nel .cpp le funzioni devono avere lo stesso tipo e numero di argomenti. Invece sono diverse.

Ultima modifica di lorenzo001 : 14-03-2013 alle 22:31.
lorenzo001 è offline   Rispondi citando il messaggio o parte di esso
Old 14-03-2013, 22:31   #14
pocho183
Junior Member
 
Iscritto dal: Mar 2013
Messaggi: 23
Ho risolto, l'errore stava dentro startserver.h, mi ero dimenticato che esisteva. Grazie

dentro startserver c'è :

/* Avvia il server */

void startServer(int argc,char** argv);
pocho183 è offline   Rispondi citando il messaggio o parte di esso
Old 14-03-2013, 22:34   #15
lorenzo001
Senior Member
 
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
Quote:
Originariamente inviato da pocho183 Guarda i messaggi
mi ero dimenticato che esisteva.
No comment ...

Quote:
Grazie
Prego
lorenzo001 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Attenti a Poco F7: può essere il best buy del 2025. Recensione Attenti a Poco F7: può essere il best buy...
Recensione Samsung Galaxy Z Fold7: un grande salto generazionale Recensione Samsung Galaxy Z Fold7: un grande sal...
The Edge of Fate è Destiny 2.5. E questo è un problema The Edge of Fate è Destiny 2.5. E questo ...
Ryzen Threadripper 9980X e 9970X alla prova: AMD Zen 5 al massimo livello Ryzen Threadripper 9980X e 9970X alla prova: AMD...
Acer TravelMate P4 14: tanta sostanza per l'utente aziendale Acer TravelMate P4 14: tanta sostanza per l'uten...
TSMC produrrà a 2 nm anche in Ari...
Tesla vuole Musk a tutti i costi: propos...
Spotify aumenta i prezzi: da 10,99 a 11,...
Prezzi folli su AliExpress con Choice Da...
IA ed etica: Fastweb+Vodafone fra le pri...
Pannelli solari nuovi o riciclati? Quest...
Instagram cambia le regole per i Live: n...
Windows 11 SE addio: Microsoft stabilisc...
Kali Linux più facile su macOS gr...
È la fine per le antenne 5G? Al l...
WhatsApp, una taglia da 1 milione di dol...
Sembrava spacciato, poi una bici elettri...
Apple Watch Series 1 diventa obsoleto: a...
ho. Mobile, upgrade a 250 GB senza sovra...
Reddit non avrà post a pagamento,...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 04:39.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v