Problemi di compilazione

di il
10 risposte

Problemi di compilazione

Salve a tutti sicuramente avrò sbagliato qualcosa in fase di configurazione
infatti non mi da neanche lo sfizio di vedere se ho scritto bene il codice assembler
che mi dà i seguenti errori:
1>PROVAASM.obj : error LNK2019: riferimento al simbolo esterno _LenStringa@4 non risolto nella funzione _wmain
1>PROVAASM.obj : error LNK2019: riferimento al simbolo esterno _pfixstringa@16 non risolto nella funzione _wmain
1>PROVAASM.obj : error LNK2019: riferimento al simbolo esterno _pleftstringa@12 non risolto nella funzione _wmain
1>PROVAASM.obj : error LNK2019: riferimento al simbolo esterno _prightstringa@12 non risolto nella funzione _wmain
1>PROVAASM.obj : error LNK2019: riferimento al simbolo esterno _pmidstringa@12 non risolto nella funzione _wmain
1>C:\Users\vinny\Documents\Visual Studio 2012\Projects\PROVAASM\Debug\PROVAASM.exe : fatal error LNK1120: 5 esterni non risolti
sotto vi posto il sorgente
// PROVAASM.cpp : definisce il punto di ingresso dell'applicazione console.
//

#include "stdafx.h"
#include "iostream"
using std::cin;
using std::cout;
using std::endl;
extern "C" int __stdcall LenStringa(char*);
extern "C" int __stdcall pfixstringa(char*,char*,int,int);
extern "C" int __stdcall pleftstringa(char *,char *,int);
extern "C" int __stdcall prightstringa(char *,char *,int);
extern "C" int __stdcall pmidstringa(char *,char *,int);
int _tmain(int argc, _TCHAR* argv[])
  {
	char pippo[71],pluto[68];
    int ncar,indy,kindy,err,opz;
        ncar=0; err=0; kindy=0; opz=0;
    for (indy=0;indy < 71;indy++) { pippo[indy]=' '; }
    for (indy=0;indy < 68;indy++) { pluto[indy]=' '; }
    cout << "prova funzioni stringa\n";
    cout << "inserisci stringa una stringa max 70 caratteri : ";
    cin.getline(pippo,71);
    cout << "-----menu' funzioni stringa assembler da provare-----\n";
    cout << "1) LeftStringa 2) RightStringa \n";
    cout << "3) MidStringa  4) FixStringa \n";
    for (indy=0;indy<6;indy++)  { cout << "\n"; }
    cout << "     scegli (1-4) ? ";
    cin >> opz;
    switch (opz) {
         case 1: {
                  cout << "quanti caratteri vuoi prendere ? ";
                  cin >> ncar;
                  err = pleftstringa(pippo,pluto,ncar);
                  switch (err)
                        {
                       case 1: {
                                cout << "stringa sorgente non inserita";
                                return 1;
                                break;
                               }
                       case 2: {
                                cout << "numero caratteri da prendere = zero ";
                                return 2;
                                break;
                                }
                        case 3: {
                                 cout << "caratteri da prendere > della stringa ";
                                 return 3;
                                 break;
                                }
                       default: {
                                 err=LenStringa(pippo);
                                 cout << " lunghezza stringa sorgente : " << err << "\n";
                                 cout << "hai preso i seguenti caratteri : " << pluto << "\n";
                                 return 0;
                                 break;
                                }
                        }
				 }
         case 2: {
                  cout << "quanti caratteri vuoi prendere ? ";
                  cin >> ncar;
                  err = prightstringa(pippo,pluto,ncar);
                  switch (err) {
                       case 1: {
                                cout << "stringa sorgente non inserita";
                                return 1;
                                break;
                               }
                       case 2: {
                                cout << "numero caratteri da prendere = zero ";
                                return 2;
                                break;
                                }
                        case 3: {
                                 cout << "caratteri da prendere > della stringa ";
                                 return 3;
                                 break;
                                }
                       default: {
                                 err=LenStringa(pippo);
                                 cout << " lunghezza stringa sorgente : " << err << "\n";
                                 cout << "hai preso i seguenti caratteri : " << pluto << "\n";
                                 return 0;
                                 break; 
                                }
                       }
				 }
         case 3: {
                  cout << "quanti caratteri vuoi prendere ? ";
                  cin >> ncar;
                  err = pmidstringa(pippo,pluto,ncar);
                  switch (err) 
                        {
                       case 1: {
                                cout << "stringa sorgente non inserita";
                                return 1;
                                break;
                               }
                       case 2: {
                                cout << "numero caratteri da prendere = zero ";
                                return 2;
                                break;
                                }
                       case 3: {
                                cout << "caratteri da prendere > della stringa ";
                                return 3;
                                break;
                               }
                      default: {
                                err=LenStringa(pippo);
                                cout << " lunghezza stringa sorgente : " << err << "\n";
                                cout << "hai preso i seguenti caratteri : " << pluto << "\n";
                                return 0;
                                break;
                               }
                        }
				 }
         case 4: {
                  cout << "quanti caratteri vuoi prendere ? ";
                  cin >> ncar;
                  cout << "specifica da dove vuoi partire ? ";
                  cin >> kindy;
                  err = pfixstringa(pippo,pluto,ncar,kindy);
                  switch (err)
                        {
                       case 1: {
                                cout << "stringa sorgente non inserita";
                                return 1;
                                break;
                               }
                       case 2: {
                                cout << "numero caratteri da prendere = zero ";
                                return 2;
                                break;
                                }
                       case 3: {
                                cout << "caratteri da prendere > della stringa ";
                                return 3;
                                break;
                               }
                       case 4: {
                                cout << "posizione di partenza non specificata";
                                return 4;
                                break;
                               }
                       case 5: {
                                cout << "posizione sbagliata per il numero di caratteri che vuoi prendere";
                                return 5;
                                break;
                               }
                      default: {
                                   err=LenStringa(pippo);
                                   cout << " lunghezza stringa sorgente : " << err << "\n";
                                   cout << "hai preso i seguenti caratteri : " << pluto << "\n";
                                   return 0;
                                  break;
                               }
                        }
				 }
         default: {
                   cout << "opzione al momento non supportata \n";
                   cout << "rilancia il programma se vuoi provare di nuovo\n";
                   return 0;
                  }
	}
	}
vi posto anche una routine assembler cosi nel caso vedete come l' ho scritta cosi potete vedere se c'è qualcosa di sbagliato.
.486
     .model flat,stdcall
      option casemap :none
     .code
	  pleftstringa PROC Arg1:DWORD,Arg2:DWORD,Arg3:DWORD
            	mov ecx,Arg3
                mov edi,Arg2
                mov esi,Arg1
                xor eax,eax
                rep movsb 
                mov dword ptr [edi],0
                ret
      pleftstringa endp
                  end

10 Risposte

  • Re: Problemi di compilazione

    Il problema è di linking. Il linker non trova le definizioni delle funzioni ASM da te create e da quell'errore. Di solito significa che il file con le funzioni non è inserito nel progetto, oppure che non c'è corrispondenza nei nomi tra dichiarazioni delle funzioni e i nomi con cui sono definite.
  • Re: Problemi di compilazione

    Ciao shodan
    grazie per l'aiuto l'errore stava che inserivo le funzioni assembler nella parte sbagliata
    cioè io li inserivo nella sessione file di origine invece di inserirli nella sezione file di risorse.
    un bel po' strano sto compilatore!
  • Re: Problemi di compilazione

    Strano. Io ho inserito la tua funzione asm tra i file sorgenti e non ho avuto errori di linking.
    Comunque se hai risolto meglio così.
    Solo un piccolo consiglio.
    nei prototipi delle funzioni è meglio se dai indicazioni su cosa sono i vari parametri.
    Ad esempio:
    
    extern "C" int __stdcall pleftstringa(char* input_string,char* output_string,int nchars_to_copy);
    
    in modo che leggendo il prototipo si abbia idea di cosa siano i vari parametri in gioco.
    Inoltre se quella input_string non viene modificata conviene dichiararla const per evitare equivoci.
    Quindi:
    
    extern "C" int __stdcall pleftstringa(const char* input_string,char* output_string,int nchars_to_copy);
    
  • Re: Problemi di compilazione

    Strano che ti risulti strana la mia soluzione, e pensare che credevo di iniziare a capirci qualcosa con questo compilare e invece e stata solo una botta di C.,
    evidentemente avrò sbagliato a configurare il compilatore
    ma come si fanno a vedere i registri, stack e locazioni di memoria in fase di debug ?
    se non lo si potesse fare mi consigli qualche debbuger che lo faccia (gratuito naturalmente!)
    seguiro il tuo consiglio per quanto riguarda le indicazioni sulle funzioni!
    una domanda semplice
    come faccio a capire se un dato e stato inserito o meno ?
    esempio :
    cout << "specifica da dove vuoi partire ? ";
                       int indy;                  
                       cin >> kindy;
    		   if (kindy == '\0' ) { cout << "carattere nullo " << ncar; ncar=0; }
    cioè come faccio a capire se nell'accettazione di indy (in questo caso) c'è un valore o è stato premuto direttamente invio?
    nell'esempio sopra la scritta mi compare solo se inserisco 0 cosa che, secondo me, non dovrebbe capitare!
    mettendo Null al posto di '\0' la scritta non compare mai.
  • Re: Problemi di compilazione

    smalldragon ha scritto:


    ma come si fanno a vedere i registri, stack e locazioni di memoria in fase di debug ?
    https://www.iprogrammatori.it/forum-programmazione/cplusplus/configurazione-debug-visual-studio-2012-t15465.html#p8488507
    I registri li vedi come ti avevo indicato qui. Ma per lo stack non ti sò dire.

    se non lo si potesse fare mi consigli qualche debbuger che lo faccia (gratuito naturalmente!)
    Sorry, ma non ne conosco.
    una domanda semplice
    come faccio a capire se un dato e stato inserito o meno ?
    esempio :
    cout << "specifica da dove vuoi partire ? ";
                       int indy;                  
                       cin >> kindy;
    		   if (kindy == '\0' ) { cout << "carattere nullo " << ncar; ncar=0; }
    cioè come faccio a capire se nell'accettazione di indy (in questo caso) c'è un valore o è stato premuto direttamente invio?
    Se premi invio il programma continua a richiedere l'input di qualcosa.
    nell'esempio sopra la scritta mi compare solo se inserisco 0 cosa che, secondo me, non dovrebbe capitare!
    Scrivere '\0' equivale a scrivere direttamente 0. E dato che 0 è un numero perfettamente valido per un input di tipo int, la condizione dell'if è vera.
    mettendo Null al posto di '\0' la scritta non compare mai.
    In che senso? Occhio che il C++ è case sensitive e scrivere Null è un errore. Se intendi:
    
    if (kindy == NULL ) { cout << "carattere nullo " << ncar; ncar=0; }
    
    Il NULL è solo una macro che in C++ vale 0 (è proprio una brutale sostituzione fatta dal preprocessore).
    Se intendi il digitare Null da tastiera, l'input non ha senso in un contesto di conversione in int; cin fallisce la conversione e si pone in stato di errore, inficiando i successivi input.
  • Re: Problemi di compilazione

    Allora ho provato a fare debug ---> finestre ---> registri
    ma non mi compare quest ultima mi da solo
    debug ---> finestre ----> punti di interruzione / output / controllo immediato
    dove li becco sti registri ?
  • Re: Problemi di compilazione

    Fa partire il programma con F10 e ripeti la procedura. Io ho fatto così e la voce compare.
  • Re: Problemi di compilazione

    Grazie funziona
    ma sai dove posso scaricare un manuale cosi non sono costretto sempre a romperti le scatole!
  • Re: Problemi di compilazione

    Un manuale su cosa? Sul compilatore o sul C++?
    Per il primo, c'è msdn o domande mirate su google, per il secondo c'è il libro gratuito (credo lo sia ancora) Thinking in C++ di Bruce Eckel sul suo sito.
  • Re: Problemi di compilazione

    Un buon manuale sul compilatore
    visto che come manuale per il linguaggio tengo parecchi libri.
    sinceramente penso che tu sei meglio di msdn sia come chiarezza che come conoscenze.
    msdn sinceramente non è un granchè sia la versione inglese che quella italiana.
    non ha molti esempi e poi le spiegazioni che mette molto spesso sono incomprensibili!
Devi accedere o registrarti per scrivere nel forum
10 risposte