Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - MIX fra librerie C e C++
Forum - C/C++ - MIX fra librerie C e C++

Avatar
Fabullo (Normal User)
Newbie


Messaggi: 3
Iscritto: 02/02/2010

Segnala al moderatore
Postato alle 18:41
Martedì, 02/02/2010
Ciao a tutti,

vi sarei infinitamente grado se qualcuno potesse darmi una mano per capire come mai il seguente pezzo di programma funziona in debug ma non in release. Al momento sto utilizzando Visual Studio 2008, ho provato a compilarlo su linux e lì non mi da problemi, ... che palle!!! :grr:

VI RINGRAZIO TANTISSIMOOOOOOOOOOOOOOOO

-----------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------
Codice sorgente - presumibilmente C++

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <assert.h>
  4. #include <time.h>
  5. #include <iostream>
  6. #include <fstream>
  7. #include <math.h>
  8. #include <string.h>
  9. #include <errno.h>
  10. #include <string>
  11. #include <sstream>
  12. #include <errno.h>
  13. #include <vector>
  14. #include <algorithm>
  15. #include <set>
  16.  
  17. using namespace std;
  18.  
  19. typedef struct{
  20.         int progressivo;
  21.         int colonna_temporale_IN[1500];
  22.         int colonna_temporale_OUT[1500];
  23. }risorsa_localita;
  24.  
  25. typedef struct{
  26.         int progressivo;
  27.         vector <risorsa_localita > risorse_localita;
  28. }struttura_risorse_localita;
  29.  
  30. struttura_risorse_localita *vettore_risorse_localita;
  31.  
  32. int main()
  33. {
  34.         int i,j,k;
  35.  
  36.         vettore_risorse_localita=(struttura_risorse_localita *)calloc(1000,sizeof(struttura_risorse_localita));
  37.  
  38.         for(i=0;i<1000;i++){
  39.  
  40.                 vettore_risorse_localita[i].progressivo=i;
  41.  
  42.                 for(j=0;j<5;j++){
  43.  
  44.                                 risorsa_localita risorsa_appoggio;
  45.  
  46.                                 for(k=0;k<1500;k++){risorsa_appoggio.colonna_temporale_IN[k]=0;}
  47.                                 for(k=0;k<1500;k++){risorsa_appoggio.colonna_temporale_OUT[k]=0;}
  48.  
  49.                                 vettore_risorse_localita[i].risorse_localita.push_back(risorsa_appoggio);      
  50.                 }
  51.  
  52.  
  53.                 cout << "PREMI INVIO\n";
  54.                 cin.get();
  55.  
  56.                 return 1;
  57.         }
  58. }



Ultima modifica effettuata da Fabullo il 08/02/2010 alle 11:22
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 20:15
Martedì, 02/02/2010
Testo quotato

Postato originariamente da Fabullo:

Ciao a tutti,

vi sarei infinitamente grado se qualcuno potesse darmi una mano per capire come mai il seguente pezzo di programma funziona in debug ma non in release. Al momento sto utilizzando Visual Studio 2008, ho provato a compilarlo su linux e lì non mi da problemi, ... che palle!!! :grr:

VI RINGRAZIO TANTISSIMOOOOOOOOOOOOOOOO

-----------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------
Codice sorgente - presumibilmente C++

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <assert.h>
  4. #include <time.h>
  5. #include <iostream>
  6. #include <fstream>
  7. #include <math.h>
  8. #include <string.h>
  9. #include <errno.h>
  10. #include <string>
  11. #include <sstream>
  12. #include <errno.h>
  13. #include <vector>
  14. #include <algorithm>
  15. #include <set>
  16.  
  17. using namespace std;
  18.  
  19. typedef struct{
  20.         int progressivo;
  21.         int colonna_temporale_IN[1500];
  22.         int colonna_temporale_OUT[1500];
  23. }risorsa_localita;
  24.  
  25. typedef struct{
  26.         int progressivo;
  27.         vector <risorsa_localita > risorse_localita;
  28. }struttura_risorse_localita;
  29.  
  30. struttura_risorse_localita *vettore_risorse_localita;
  31.  
  32. int main()
  33. {
  34.         int i,j,k;
  35.  
  36.         vettore_risorse_localita=(struttura_risorse_localita *)calloc(1000,sizeof(struttura_risorse_localita));
  37.  
  38.         for(i=0;i<1000;i++){
  39.  
  40.                 vettore_risorse_localita[i].progressivo=i;
  41.  
  42.                 for(j=0;j<5;j++){
  43.  
  44.                                 risorsa_localita risorsa_appoggio;
  45.  
  46.                                 for(k=0;k<1500;k++){risorsa_appoggio.colonna_temporale_IN[k]=0;}
  47.                                 for(k=0;k<1500;k++){risorsa_appoggio.colonna_temporale_OUT[k]=0;}
  48.  
  49.                                 vettore_risorse_localita[i].risorse_localita.push_back(risorsa_appoggio);      
  50.                 }
  51.  
  52.  
  53.                 cout << "PREMI INVIO\n";
  54.                 cin.get();
  55.  
  56.                 return 1;
  57.         }
  58. }





Poi essere più preciso, che problemi ti dà?

PM Quote
Avatar
Fabullo (Normal User)
Newbie


Messaggi: 3
Iscritto: 02/02/2010

Segnala al moderatore
Postato alle 20:41
Martedì, 02/02/2010
Intanto grazie per l'interessamento. Al momento sto utilizzando visual studio 2008 e compilando quel sorgente in configurazione debug non mi da nessun problema. Compilando ed eseguendo in release invece si blocca l'esecuzione precisamente nel seguente punto della libreria vector dicendo:

------------------------------------------------------------------------------------------
Microsoft Visual Studio C Runtime Library has detected a fatal error in TCM di nodo.exe.

Press Break to debug the program or Continue to terminate the program.

-------------------------------------------------------------------------------------------

Codice sorgente - presumibilmente Plain Text

  1.  


iterator insert(const_iterator _Where, const _Ty& _Val)
        {    // insert _Val at _Where
        size_type _Off = size() == 0 ? 0 : _Where - begin();
        _Insert_n(_Where, (size_type)1, _Val);
        return (begin() + _Off);
        }

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 21:48
Martedì, 02/02/2010
Ecco un ottimo esempio per quando si raccomanda di non mischiare codice C e C++ ...

Dato che stai usando un vector, non è bene usare le funzioni di allocazione di memoria del C (malloc, calloc ...) ma usa solo l'apposita keyword new del C++

Quindi, al posto della calloc

vettore_risorse_localita = new struttura_risorse_localita[1000];

E per ottimizzare, per quanto riguarda le for che azzerano i vettori, ne puoi usare una sola, così

Codice sorgente - presumibilmente Plain Text

  1. for(k=0; k<1500; k++)
  2.     risorsa_appoggio.colonna_temporale_IN[k] =
  3.         risorsa_appoggio.colonna_temporale_OUT[k] = 0;



Considera anche l'uso di una memset al posto della for.

P.S. Il fatto che "funzioni" in modalità Debug o con Linux, non ha molta importanza ... ci sono parecchi (strani e complessi) motivi per cui "sembra" funzionare ...


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Fabullo (Normal User)
Newbie


Messaggi: 3
Iscritto: 02/02/2010

Segnala al moderatore
Postato alle 10:05
Mercoledì, 03/02/2010
IO TI AMOOOOOOOOOOO!!!!!!!!!!!!! SONO FUORI DAL MIO UFFICIO A COSTRUIRE UNA STATUA IN ORO E AVORIO A TUA IMMAGINE E SOMIGLIANZA CHE ADORERO' OGNI VOLTA CHE CI PASSO DAVANTI!

(PER CASO CONOSCI ALTRI ESEMPI DI MIX CHE NON FUNZIONANO????)  

Ultima modifica effettuata da Fabullo il 03/02/2010 alle 10:06
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 10:12
Mercoledì, 03/02/2010
Testo quotato

Postato originariamente da Fabullo:

IO TI AMOOOOOOOOOOO!!!!!!!!!!!!! SONO FUORI DAL MIO UFFICIO A COSTRUIRE UNA STATUA IN ORO E AVORIO A TUA IMMAGINE E SOMIGLIANZA CHE ADORERO' OGNI VOLTA CHE CI PASSO DAVANTI!



'sagerato ...

Testo quotato

(PER CASO CONOSCI ALTRI ESEMPI DI MIX CHE NON FUNZIONANO????)  



Non specifici esempi, ma è SEMPRE sconsigliato ... se usi le librerie di C++, devi usare new e delete. Se programmi in C, senza librerie di C++, allora usi la malloc e la free.


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 18:17
Mercoledì, 03/02/2010
Testo quotato

Postato originariamente da nessuno:

Testo quotato

Postato originariamente da Fabullo:

IO TI AMOOOOOOOOOOO!!!!!!!!!!!!! SONO FUORI DAL MIO UFFICIO A COSTRUIRE UNA STATUA IN ORO E AVORIO A TUA IMMAGINE E SOMIGLIANZA CHE ADORERO' OGNI VOLTA CHE CI PASSO DAVANTI!



'sagerato ...

Testo quotato

(PER CASO CONOSCI ALTRI ESEMPI DI MIX CHE NON FUNZIONANO????)  



Non specifici esempi, ma è SEMPRE sconsigliato ... se usi le librerie di C++, devi usare new e delete. Se programmi in C, senza librerie di C++, allora usi la malloc e la free.



:hail: :hail:

PM Quote