Errore E0434

di il
8 risposte

Errore E0434

Salve a tutti
ho creato un semplice programmino per testare una mia routine in assembly
ma quando la vado a compilare mi da errore E0434 sulla seguente riga

errore = Trova_Stringa(parametro, dime);
ho provato ad inizializzare il puntatore della struttura a nullptr l'errore si leva
ma in fase di esecuzione va in errore!
come posso risolvere?
per chiareza qui troverete tutto il codice

// cerca stringa.cpp : Questo file contiene la funzione 'main', in cui inizia e termina l'esecuzione del programma.
//

#include <iostream>
using namespace std;
#include <new>
struct Parametro_Trova_Stringa
{
	  char  *dove;
	  char  *cosa;
	__int16 ldove;
	__int16 lcosa;
	__int16 posizione;
	__int8  nvolte;
	__int16 postrov;
};
struct Cerca
{
	char    carattere;
	char    *dove;
	__int8  continua;
	__int8  trovato;
	__int16 ultimo;
	__int16 lunghezza;
	__int16 primo;
	__int16 posini;
};

extern "C" int _stdcall Trova_Stringa(struct Parametro_Trova_Stringa &impresa, int &dimeroutine);
extern "C" int _stdcall LenStringa(char* sorge, int &dimeroutine);
extern "C" int _stdcall Quanti(char *vettore, char *sorge, _int8 *resoconti, int &elementi, int &dimeroutine);
extern "C" int _stdcall Hawkeyes(struct cerca &dato, int &routine);
extern "C" void _stdcall Copia(char* sorgente, char* destinazione, int& numcar);
//#include <e:\classe numerica\test\include\parametri\parametro_trova_stringac.sam>
int main()
{
	char testo[80];
	char parola[80];
	char vettore[9];
	char c = ' ';
	//Parametro_Trova_Stringa parametrox;
	Parametro_Trova_Stringa *parametro = nullptr;
	parametro = new (std::nothrow) Parametro_Trova_Stringa;
	vettore[0] = '+';	vettore[1] = '-'; 	vettore[2] = '.';	vettore[3] = ',';
	vettore[4] = '(';	vettore[5] = ')';	vettore[6] = '[';	vettore[7] = ']';
	vettore[8] = '/';
	_int8 resoconti[10];
	int ltesto, lparola, trovato, locato, errore, dime, indy, elementi;
	indy = 0; lparola = 0; trovato = 0; locato = 0; errore = 0; dime = 0; elementi = 10;
	for (indy = 0; indy < 10; indy++) { resoconti[indy] = 0; }
	for (indy = 0; indy < 80; indy++) { testo[indy] = '\0'; parola[indy]='\0'; }
	std::cout << "prova della routine di ricerca stringa 'file Rocky.asm'\n";
	std::cout << "inserisci un testo : ";
	cin.getline(testo, 80);
	std::cout << "\ninserisci una Parola : ";
	cin.getline(parola, 80);
	ltesto = LenStringa(testo, errore);
	lparola = LenStringa(parola, errore);
	Copia(testo, parametro->dove, ltesto);
	Copia(parola, parametro->cosa, lparola);
	parametro->ldove = ltesto;
	parametro->lcosa = lparola;
	errore = Trova_Stringa(parametro, dime);
	trovato = parametro->nvolte; locato = parametro->postrov;
	std::cout << "la routine Trova_Stringa e' terminata ed occupa  " << dime << " byte in memoria\n";
	switch (errore)
	{
	case 0:
	{
		std::cout << "non ci sono errori ma pultroppo la stringa non è stata trovata!\n";
			break;

	}
	case 1:
	{
		std::cout << "sono state trovate " << trovato << " Stringe\n";
		std::cout << "la prima stringa trovata inizia alla posizione " << locato << " del testo!\n";
		break;
	}
	default:
	{
		std::cout << "la routine e' andata in errore con codice " << errore << "\n";
		break;
	}
	}
	std::cout << "Test finito per ulteriori test rilanciare il programma!\n";
	std::cout << "Iniziamo Test routinte Quanti omonimo file!\n";
	errore = Quanti(vettore, testo, resoconti, elementi, dime);
    std::cout << "la routine Quanti e' terminata ed occupa " << dime << " byte in memoria\n";
	switch (errore)
	{
	case 0:
	{
		std::cout << "non ci sono errori ma pultroppo non ha trovato neanche un valore del vettore\n";
		break;
	}
	case 1:
	{
		std::cout << "sono stati trovati i seguenti elementi del vettore:\n";
		std::cout << "elemento:trovati\n";
		for (indy = 0; indy < 10; indy++)
		{
			if (resoconti[indy] > 0)
			{
				std::cout << "    " << vettore[indy] << "   :   " << resoconti[indy] << "\n";
			}
		}
		break;
	}
	default:
	{
		std::cout << "la routine e' andata in errore con codice " << errore << "\n";
		break;
	}
	}
	delete parametro; return 0;
}
void _stdcall copia(char* sorgente, char* destinazione, int& numcar)
{
	for (int indy=0;indy<numcar;indy++)
	{
		destinazione[indy] = sorgente[indy];
	}
}
ringrazio anticipatamente tutti coloro che mi daranno una mano

8 Risposte

  • Re: Errore E0434

    Semmai

    errore = Trova_Stringa(*parametro, dime);

    ma tutto il resto (assembly) non lo posso provare
  • Re: Errore E0434

    Grazie per la risposta
    quando torno a casa faccio la prova e ti faccio sapere
    per la parte assembler non mi dava problemi in fase di compilazione
    quindi per capire
    se passo una struttura ad una funzione come puntatore devo passarla come se fosse un puntatore di puntatore?
  • Re: Errore E0434

    Se usi

    struct Parametro_Trova_Stringa &impresa

    oppure

    struct Parametro_Trova_Stringa *impresa

    non cambia molto perché verrà passato nello stack sempre il puntatore alla struttura.

    Nel primo caso, la sintassi prevede che tu chiami la funzione passando

    *parametro

    nel secondo caso solo

    parametro.

    In definitiva, l'errore per cui hai aperto il thread è causato solo dal cattivo uso del passaggio del parametri per riferimento in C++.
  • Re: Errore E0434

    Grazie per la spiegazione ne terro conto per il futuro
  • Re: Errore E0434

    Se mostri il codice assembly di quella funzione si può capire cosa sbagli se hai errori
  • Re: Errore E0434

    Era l'unico errore in fase di compilazione
    comunque il file della routine assembly è la seguente:
    la routine dimensioni serve solo a calcolare la dimensione della routine
    codice per la routine Trova_Stringa (quella da testare)
    
       ;-----------------------------------------------------------------------
       ;* Programma  : Cerca una Stringa.                                     *
       ;* File       : Rocky.asm                                              *
       ;* Data       : 25-05-2021                                             *
       ;* Scopo      : Uso Generale.                                          *
       ;* Routine    : Trova_Stringa.                                         *
       ;* Libreria   : Babele.                                                *
       ;* Prototipo C++ : extern "C" int__stdcall Trova_Stringa( struct       *
       ;*          Parametro_Trova_Stringa &sorgente,int &dimeroutine);       *
       ;* Par.Input  : Stringa Sorgente e Stringa Cercare.                    *
       ;* Par.Output : Posizione Stringa Trovata e Volte trovata.             *
       ;* Errori Gestiti :                                                    *
       ;*      ==========================================================     *
       ;*       00 | Stringa non Trovata.                                     *
       ;*       01 | Stringa Trovata.                                         *
       ;*       35 | Stringa non Valida.                                      *
       ;*       42 | Parametro Nullo o non Valido.                            *
       ;*       43 | Dimensione dei Parametri Differenti o non Congrui.       *
       ;*       56 | Parametro Duplicato.                                     *
       ;*       XX | Errore derivante da SubRoutine.                          *
       ;*      =========================================================      *
       ;* Byte su Disco : 13.178   Byte in Memoria : ...   Test : .........   *
       ;-----------------------------------------------------------------------
         .486
         .model flat, stdcall
             option casemap:none
         .data
            routine       dd ?
            dove          dd ?
            cosa          dd ?
           align 4
            jmperrore     dd A001L,E0001,E0002,E0003,E0004,E0005,E0006
            include e:\classe numerica\test\include\cerca.sam
            include e:\classe numerica\test\include\parametri\parametro_trova_stringa.sam
            superenalotto Cerca <?>
            sting         Parametro_Trova_Stringa <?>
            luncerca      dw ?
            lunsorge      dw ?
            primapos      dw ?
            posnew        dw ?
            poscan        dw ?
            ncartrovati   db ?
            trovate       db ?
            errore        db ?
         .code
             extern Cleareg@0:proc,Dimensioni@16:proc,Hawkeyes@8:proc,
                    LenStringa@8:proc
                LenStringa Equ LenStringa@8
                Dimensioni Equ Dimensioni@16
                   Hawkeyes Equ Hawkeyes@8 
                   Cleareg Equ Cleareg@0
             include macro\calcola_dimensione_routine.mac
                  Trova_Stringa proc Arg1:Dword,Arg2:Dword
                            pusha
                     Calcola_Dimensione_Routine errore,routine,A0013,Arg2,E0000
                     A0000: mov errore,0
                            mov  posnew,0   ;---------------------------------
                            mov  primapos,0 ;* Imposta Riferimenti Iniziali. *
                            mov  poscan,0   ;---------------------------------
                            mov  ncartrovati,0
                            mov  trovate,0
                            mov  lunsorge,0
                            mov  luncerca,0
                        Assume Esi:ptr Parametro_Trova_Stringa
                        Assume Edi:ptr Parametro_Trova_Stringa
                            mov  esi,Arg1
                            mov  edi, offset sting
                            mov  edx,[esi].dove ;----------------------------
                            mov  [edi].dove,edx ;* decomprime i parametri.  *
                            mov  edx,[esi].cosa ;----------------------------
                            mov  [edi].cosa,edx
                            mov  dx,[esi].lcosa
                            bswap edx
                            mov  dx,[esi].ldove
                            mov  cx,[esi].posizione
                            bswap ecx
                            mov  cx,[esi].postrov
                            mov  al,[esi].nvolte
                            mov  [edi].nvolte,al
                            mov  [edi].postrov,cx
                            bswap ecx
                            mov  [edi].posizione,cx
                            mov  [edi].ldove,dx
                            bswap edx
                            mov  [edi].lcosa,dx
                        Assume Esi:Nothing   ;------------------------
                            cmp [edi].cosa,0 ;* Controllo Parametri. *
                            jne  A0001       ;------------------------
                     A000A: mov  errore,1
                            jmp short A0001
                     A0001: cmp  [edi].dove,0
                            jne  A001A
                            jmp short A000A  
                     A001A: cmp [edi].posizione,0
                            jge  A001B
                            mov  errore,2
                            jmp  A001I
                     A001B: xor  edx,edx
                            mov  dx,[edi].ldove ;------------------------------
                            cmp  dx,[edi].lcosa ;* Verifica Perdite di tempo! *
                            jge  A001C          ;------------------------------
                            mov  errore,3
                            jmp  A001I
                     A001C: cmp  dx,0
                             jg  A001D
                            push offset routine
                            push [edi].dove     ;---------------------------------
                            call LenStringa     ;* se non sappiamo la dimensione *
                            mov  [edi].ldove,ax ;* la Calcoliamo per dove.       *
                     A001D: cmp  [edi].lcosa,0  ;---------------------------------
                             jg  A001E
                            push offset routine ;---------------------------------
                            push [edi].cosa     ;* se non sappiamo la dimensione *
                            call LenStringa     ;* la calcoliamo per cosa.       *
                            mov  [edi].lcosa,ax ;---------------------------------
                     A001E: cmp  [edi].lcosa,1
                             jg  A001F
                            mov  errore,4
                            jmp  A001I
                     A001F: mov  dx,[edi].posizione
                            add  dx,[edi].lcosa
                            cmp  dx,[edi].ldove
                            jle  A001G
                            mov  errore,5
                            jmp  A001I
                     A001G: mov  dx,[edi].lcosa
                            mov  bx,[edi].ldove
                            mov  cx,[edi].posizione
                            mov  luncerca,dx
                            mov  lunsorge,bx
                            mov  poscan,cx
                            mov  edx,[edi].dove
                            mov  ebx,[edi].cosa
                            mov  dove,edx
                            mov  cosa,ebx
                     A001H: nop
                        Assume Edi:Nothing ;--------------------------
                            cmp  edx,ebx   ;* Evita Stringhe Uguali. *
                            jne  A001I     ;--------------------------
                            mov errore,6
                     A001I: call Cleareg   ;----------------------------
                            nop            ;* Smista Eventuale Errore. *
                            mov  dl,errore ;----------------------------
                            jmp dword ptr [jmperrore + edx *4]
                     E0000: mov  errore,al
                            jmp  A0012     ;--------------------
                    E0001:: mov  errore,35 ;* Gestione Errori. *
                            jmp  A0012     ;--------------------
                    E0002:: mov  errore,42
                            jmp  A0012
                    E0003:: mov  errore,43
                            jmp  A0012
                    E0004:: mov  errore,101
                            jmp  A0012
                    E0005:: mov  errore,56
                            jmp  A0012
                    E0006:: mov  errore,55
                            jmp  A0012
      ;==========================================
       ;* Svolgimento del Compito della Routine. *
       ;==========================================
                    A001L:: mov  esi,dove
                            mov  edi,cosa
                            mov  cx,poscan
                            add  esi,ecx
                            mov  cx,luncerca   ;---
       ;========================================
       ;* Ciclo di Scansione Stringa Sorgente. *
       ;========================================
                     A0002: xor  eax,eax
                            mov  al,byte ptr [edi]
                       Assume Ebx:ptr Cerca
                            mov  ebx,offset superenalotto
                            mov [ebx].carattere,al
                            mov [ebx].dove,esi
                            mov [ebx].continua,0
                            mov [ebx].trovato,0
                            mov [ebx].ultimo,0
                            mov [ebx].lunghezza,0
                            mov [ebx].primo,0
                            mov  ax,poscan
                            mov [ebx].posini,ax
                       Assume Ebx:Nothing
                            xor  ebx,ebx
                            xor  edx,edx        ;-------------------------------
                            xor  eax,eax        ;* Cerca il singolo Carattere. *
                            push offset routine ;-------------------------------
                            push offset superenalotto
                            call Hawkeyes
                            cmp  eax,0
                             je  A0003
                            jmp  E0000      ;-----------------------
                     A0003: xor  eax,eax    ;* Prende i risultati. *
                       Assume Ebx:ptr Cerca ;-----------------------
                            mov  ebx,offset superenalotto
                            mov  ax,[ebx].primo
                            bswap eax
                            mov  al,[ebx].trovato
                       Assume Ebx:nothing ;----------------------
                            cmp  eax,0    ;* Carattere Trovato? *
                            jne  A0004    ;----------------------
                            jmp  A0012
                     A0004: bswap eax        ;------------------------------------
                            inc  ncartrovati ;* Trovato Verifica se e' il primo. *
                            cmp  primapos,0  ;------------------------------------
                            jne  A0005
                            mov  primapos,ax ;-------------
                            nop              ;* Si Primo. *
                            jmp  A0011       ;-------------
                     A0005: inc  posnew
                            cmp  ax,posnew ;------------------------
                             je  A0006     ;* Vedi se Consecutivo. *
                            jmp  A0007     ;------------------------
                     A0006: xor  ebx,ebx
                            xor  edx,edx
                            mov  dl,ncartrovati
                            mov  posnew,ax   ;-------------------------
                            mov  bx,luncerca ;* Si vedi se stringa e' *
                            cmp  bx,dx       ;* stata tutta Trovata   *
                             je  A0007       ;-------------------------
                            jmp  A0008
                     A0007: mov  bx,posnew
                            inc  bx
                            inc  trovate       ;-----------------------------------
                            add  bx,luncerca   ;* Si Stringa Completa Trovata ora *
                            cmp  bx,lunsorge   ;* Verifica se ce ne sono altre.   *
                            jle  A0008         ;* Si Continua Ricerca.            *
                            jmp  A0011         ;* No Termina Ricerca.             *
                     A0008: mov  ncartrovati,0 ;-----------------------------------
                            mov  edi,Arg2
                            dec  edi
                     A0009: mov  poscan,ax
                            mov  bx,poscan
                            inc  ebx
                            xor  edx,edx
                            mov  dl,ncartrovati
                            add  bx,luncerca
                            sub  bx,dx       ;------------------------
                            cmp  bx,lunsorge ;* Test Di Fattibilita' *
                            jle  A0010       ;* Si Continua.         *
                            jmp  A0011       ;* No Termina.          *
                     A0010: inc  poscan      ;------------------------
                            inc  edi
                            jmp  A0002
       ;=============================================
       ;* Fine Ciclo di Scansione Stringa Sorgente. *
       ;=============================================
                     A0011: cmp  byte ptr trovate,0
                             je  A0012
                            mov  errore,1
                     A0012: call Cleareg
                       Assume Esi:ptr Parametro_Trova_Stringa
                            mov  esi,Arg1        ;------------------------
                            mov  bl, trovate     ;*      Caricamento     *
                            mov  dx,primapos     ;* Parametri di Output. *
                            mov  [esi].nvolte,bl ;------------------------
                            mov  [esi].postrov,dx
                       Assume Esi:Nothing
                            popa
                            xor  eax,eax
                            mov  al,errore
                            ret  8
                     A0013:
                  Trova_Stringa Endp
              End
    codice della routine hawkeyes già testata in altre applicazioni e funziona correttamente
    seve a verificare il singolo byte di 2 stringhe
    
         ;----------------------------------------------------------------
         ;*   Programma : verifica se un valore è presente nel vettore.  *
         ;*        file : hawkeyes.Asm                                   *
         ;*        Data : 25-11-2016                                     *
         ;*       Scopo : uso generale.                                  *
         ;*     Routine : Hawkeyes.                                      *
         ;*    Libreria : Babele.                                        *
         ;* Prototipo c++ : extern "C" int __stdcall Hawkeyes(           *
         ;*                 struct cerca &dato,int &routine);            *
         ;*  par. Input : Struttura cerca                                *
         ;*    -----------------------------------------------------     *
         ;*        Campo   |   Necessario |        Scopo                 *
         ;*    -----------------------------------------------------     *
         ;*      carattere | Obbligatorio | carattere da trovare.        *
         ;*      dove      | Obbligatorio | Stringa in cui cercare.      *
         ;*      continua  | Obbligatorio | = 0 Primo.= 1 Tutti.         *
         ;*      trovato   | non riempire |                              *
         ;*      ultimo    | non riempire |                              *
         ;*      lunghezza | obbligatorio | Lunghezza stringa.           *
         ;*      primo     | non riempire |                              *
         ;*      posini    | Facoltativo  | posizione di partenza.       *
         ;*    -----------------------------------------------------     *
         ;*  par. Output : campi non riempiti struttura cerca.           *
         ;*         Note : includere il file include\cerca.sam           *
         ;*  Errori Gestiti :                                            *
         ;*      ============================================            *
         ;*          00 | Nessun Errore.                                 *
         ;*          42 | Parametro non Valido.                          *
         ;*          53 | Parametro Fuori Range.                         *
         ;*          XX | Errore derivante da SubRoutine.                *
         ;*      ============================================            *
         ;* Byte su Disco : 5.995 Byte in Memoria : 179 Test : Superato. *
         ;----------------------------------------------------------------
             .486
             .model flat,stdcall
               option casemap:none
             .data
                   routine dd ?
                   tranquillita dd ?
                   include e:\classe numerica\test\include\cerca.sam
                   errore  db ?
             .code
                  extern Cleareg@0:proc
                                Cleareg Equ Cleareg@0
                Hawkeyes proc Arg1:dword,Arg2:Dword
                           pusha
                           mov  eax,offset A0009
                           mov  ebx,offset A0000
                           sub  eax,ebx
                           mov  esi,Arg2
                           add  eax,9
                           mov byte ptr [esi],al
                           call Cleareg
                    A0000: mov  errore,0
                           mov  esi,Arg1  ;-----------------------------
                           cmp  esi,0     ;* Verifica Esistenza Input. *
                           jne  A0001     ;-----------------------------
                           jmp  E0000
                    A0001: Assume Esi:ptr Cerca   ;------------------------
                           mov  esi,Arg1          ;* Controllo Parametri. *
                           cmp  [esi].lunghezza,0 ;------------------------
                           jle  E0001
                           mov  dx,[esi].posini
                           cmp  dx,[esi].lunghezza
                           jge  E0002
                           mov  dx,[esi].lunghezza
                           cmp [esi].continua,1
                            jg  E0001
                           jmp short A0002
                    E0000: mov errore,al
                           jmp short A0007
                    E0001: mov  errore,42  ;--------------------
                           jmp short A0006 ;* Gestione Errori. *
                    E0002: mov  errore,53  ;--------------------
                           jmp short A0006
                    A0002: mov  [esi].trovato,0
                           mov  [esi].primo,0
                           mov  [esi].ultimo,0
                           mov  edi,[esi].dove
                           mov  cx,[esi].lunghezza ;----------------------
                           mov  dx,[esi].posini    ;* Ricerca Carattere. *
                           add  edi,edx            ;----------------------
                           mov  ebx,edi
                           mov  tranquillita,edi
                           mov  dl,[esi].carattere ;----------------------
                    A0003: cmp byte ptr [edi],dl   ;* Carattere Trovato. *
                           jne  A0007              ;----------------------
                           inc  [esi].trovato
                           mov  ebx,edi          ;----------------------------
                           sub  ebx,tranquillita ;* Calcola offset Elemento. *
                    A0004: cmp  [esi].trovato,1  ;----------------------------
                            je  A0005
                           mov  [esi].ultimo,bx
                           jmp short A0006
                    A0005: mov  [esi].primo,bx  ;--------------------
                    A0006: cmp [esi].continua,1 ;* Devo continuare? *
                            je  A0007           ;* Si!              *
                           xor  ecx,ecx         ;* no!              *
                    A0007: inc  edi             ;--------------------
                           jecxz A0008
                           dec  ecx
                           jmp  A0003
                    A0008: Assume Esi:nothing
                           popa
                           xor  eax,eax
                           mov  al,errore
                           ret  8
                    A0009:
                Hawkeyes Endp
             End
    ultimo modulo LenStringa già testata in altre applicazioni e funziona correttamente
    
       ;---------------------------------------------------------------
       ;*      Programma : Calcola la Dimensione di una Stringa.      *
       ;*           File : LenStringa.Asm                             *
       ;*           Data : 04-12-2012                                 *
       ;*          Scopo : Uso Generale.                              *
       ;*        Routine : LenStringa.                                *
       ;*       Libreria : Babele.                                    *
       ;*  Prototipo c++ : extern "C" int __stdcall LenStringa        *
       ;*                 ( char *stringa,int &dime);                 *
       ;*     Par. Input : Stringa.                                   *
       ;*    Par. Output : Eax = Dimensione Stringa.                  *
       ;*           Note : Registro Esi e' Viene Preservato.          *
       ;* Errori Gestiti : Nessuno.                                   *
       ;*  Byte su Disco : 1.807 Byte in Memoria : 22 Test : Superato *
       ;---------------------------------------------------------------
        .486
        .model flat, stdcall
          option casemap:none
        .code
            LenStringa PROC Arg1:Dword, Arg2:Dword
                           mov ebx,offset A0003
                           mov eax,offset A0000
                           sub ebx,eax
                           mov eax,Arg2
                           mov byte ptr [eax],bl
                    A0000: push esi
                           mov esi,Arg1
                           xor eax,eax
                    A0001: mov dl,byte ptr [esi]
                           cmp dl,0
                            je A0002
                           inc esi
                           inc eax
                           jmp short A0001
                    A0002: pop esi
                           ret 8
                    A0003:
            LenStringa endp
        end
  • Re: Errore E0434

    Grazie oregon
    ho apportato la modifica che mi hai suggerito è viene compilato correttamente
  • Re: Errore E0434

    Ok, bene
Devi accedere o registrarti per scrivere nel forum
8 risposte