Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [C++] Problemi con una semplice funzione

    Ciao!

    Sto scrivendo una dll a cui vengono fornite delle informazioni (tramite la chiamata di alcune funzioni) da un programma (che non posso modificare).

    La maggior parte di queste funzioni non ha problemi, ma ce n'è una che continua a farmi andare in crash tutto il programma!

    codice:
    OEDISPLAY_API void DrawDisplay(const char *  ADisplayType) {
    	/*const char * perova=ADisplayType;
    	if (perova==(char *) 0) 
    		MessageBox (0, "Arrivo", "Hi", MB_ICONINFORMATION); 
    	if (perova==(char *) 1) 
    		MessageBox (0, "Partenza", "Hi", MB_ICONINFORMATION); 
    	if (perova==(char *) 2) 
    		MessageBox (0, "Intermedio", "Hi", MB_ICONINFORMATION);*/ 
    	MessageBox (0, ADisplayType, "Hi", MB_ICONINFORMATION);
    }
    Se eseguo la parte commentata (che mi sembra banale e corretta) va tutto in crash!
    Se eseguo l'ultima riga va in crash dopo aver mostrato il MessageBox, ma solo e soltanto quando ADisplayType è 0. Negli altri casi (può essere solo 0, 1 o 2) non viene mostrata nessuna finestra e tutto continuo normalmente.

    Siete d'accordo con me che è molto strano come comportamento?!

    Io ho una parte della dll scritta in Pascal, dove questa funzione non fa niente di particolare (dovrebbe rendere visibili degli elementi in una finestra creata precedentemente dalla stessa dll).
    codice:
    procedure DrawDisplay(ADisplayType: byte); stdcall;
    var i: integer;
    begin
      if assigned(OEDisplayDemoForm) then begin
        with OEDisplayDemoForm do begin
          gb_TV.Show;
        end;
      end;
    end;
    Ho forse sbagliato qualcosa nella definizione della funzione?

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,469

    Re: [C++] Problemi con una semplice funzione

    Originariamente inviato da BrainBurner
    ... banale e corretta ...
    Forse banale ma non corretta ...

    Nella riga

    perova==(char *) 0

    e nelle altre simili, che senso ha confrontare il valore del puntatore?
    Non sara' certo l'indirizzo del dato che vuoi testare ma il dato ...

    E nell'ultima riga

    MessageBox (0, ADisplayType, "Hi", MB_ICONINFORMATION);

    stai visualizzando una stringa che presumo sia terminata da un NULL, altrimenti un crash non te lo toglie nessuno ...

    In realta' e' importante *come* chiami questa funzione e quale dato le passi ...

  3. #3
    Scusa ma cosa intendi esattamente con una stringa terminata con NULL?

    Quello che ho scritto era solo epr avere un'idea di cosa mi entrava come parametro...

    Ma il programma va in crash anche se lascio la funzione vuota o ci metto un semplice MessageBox per segnalare che la funzione è stata chiamata:
    MessageBox (0, "DrawDisplay", "Hi", MB_ICONINFORMATION);

    Credi che devo modificare qualcosa nella definizione della funzione?

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,469
    Mi mostri come la chiami? E' quello il problema ...

  5. #5
    Anch'io avevo pensato a un errore nella chiamata...

    Ma purtroppo il programma che la chiama è chiuso e compilato. Lo sviluppatore mi ha dato il codice di una dll di esempio (ma comunque incompleta) in pascal per vedere come definire le funzioni.

    Il codice in Pascal della funzione è quello che ho copiato prima...

    È giusto usare unsigned char per il tipo byte, no?

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,469
    Ah ... ma allora il problema e' quello.

    Il parametro e' un byte non un "puntatore a byte" come hai scritto tu ...

    Quindi deve essere

    codice:
    void DrawDisplay(unsigned char ADisplayType)
    {
    	switch(ADisplayType)
    	{
    		case 0:
    			MessageBox (0, "Arrivo", "Hi", MB_ICONINFORMATION); 
    			break;
    		case 1:
    			MessageBox (0, "Partenza", "Hi", MB_ICONINFORMATION); 
    			break;
    		case 2:
    			MessageBox (0, "Intermedio", "Hi", MB_ICONINFORMATION);
    			break;
    		default:
    			char s[2];
    			s[0]=ADisplayType + '0'; s[1]=0;
    			MessageBox(0, s, "Hi", MB_ICONINFORMATION);
    			break;
    	}
    }
    supponendo che il parametro non vada oltre il 9 ...

  7. #7
    Grazie mille! Ma purtroppo neanche adesso vuole funzionare.
    Se solo sapessi come la chiama....

    Anche GetLastError non mi aiuta e il programma va in crash solo dopo aver chiuso il MessageBox!
    Con altre funzioni invece posso visualizzare una MessageBox con lo stesso identico codice e funziona tutto come deve!

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,469
    Un attimo ... se sei sicuro (ma a questo punto ho dei dubbi ...) che sia equivalente a quella funzione pascal, allora e' come ti ho detto. Se ci sono ancora problemi allora c'e' qualcosa che tu non sai nella chiamata o che non ti hanno detto ...

    Del resto, anche guardando la funzione in pascal, vorrei capire cosa ci fa quella con il parametro passato e con la variabile i ...

    Insomma, non c'e' nulla di chiaro ...

    Se vuoi farmi scaricare il programma che chiama la funzione, con un po' di debug del codice assembler, si capisce dov'e' il problema ... decidi tu ...

  9. #9
    Il programma viene da questo sito http://www.sportsoftware.de e si chiama OESpeaker.

    Non l'ho scritto prima solo perché è un lavoraccio installarlo e renderlo funzionante perché devi scaricare anche OE2003, creare una gara, inserire concorrenti, creare le liste di partenza e inserire qualche risultato e poi provare la dll...

    Se vuoi ti spiego megli oi vari passaggi ma mi sembra veramente un lavoro lungo.

    grazie lo stesso! Mi sa che cerco di contattare lo sviluppatore almeno per avere tutto il codice della dll...

    ps: anch'io non proprio capito perché crea quella variabile!

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,469
    Beh ... in effetti la cosa sembra molto impegnativa, almeno come tempo impiegato ... se posso darti una mano bene, pero' ...

    Del resto mi sembra che un chiarimento dall'autore potrebbe essere la migliore soluzione perche' non sai *quanti* parametri servano, *di che tipo* e se servono ...

    La funzione pascal non e' sicuramente molto indicativa, anzi sembra proprio sbagliata ...

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.