Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    348

    [C] Errore

    Ciao ho creato un ciclo infinito ma alla seconda iterazione mi da errore!

    questo e' il codice:

    codice:
    while(1)
        {
         aggiornamento();
    }
    La funzione aggiornamento si trovata in un altro file .c

    codice:
    //variabile globale
    MYSQL * mysql;
    
    int collegamentoDB(){
      
       if (! (mysql = mysql_init(mysql))) {
        printf ("Errore nell' allocazione di memoria.\n");                
        return -1;
      }
      
      if (! mysql_real_connect (mysql, host, db_user, db_pass, "",0, NULL, 0)) {
        printf ("Errore nella connessione.\n");
        return -2;
      }
      if (mysql_select_db (mysql, database)) {
        printf ("Errore nella selezione del database.\n");
        return -3;
            
      }	
      return 0;
    
    }
    
    int aggiornamento(){  
      if(collegamentoDB( mysql ) != 0){
    	  return -2;
    	}   
    mysql_close(mysql);
      return 0;
      
    }
    La prima iterazione funziona alla seconda mi da il seguente errore:

    39 if (! (mysql = mysql_init(mysql))) {
    (gdb)
    46 if (! mysql_real_connect (mysql, host, db_user, db_pass, "",0, NULL, 0)) {
    (gdb)

    Program received signal SIGSEGV, Segmentation fault.
    0xb7d0163d in _int_malloc () from /lib/tls/libc.so.6

    se io ho tolgo la riga mysql_close(mysql); funziona, ma ho paura di lasciare aperta la connessione con il db anche quando faccio altre cose!

    La seconda domanda e' alloco dello spazio per una variabile quando esco dalla funzione cioe' termina lo spazio viene liberato oppure devo liberarlo io con free(variabile)?

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    348
    Scusate mi sono doimenticato di mettere il titolo

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Stai utilizzando un puntatore mai inizializzato passandolo alla mysql_init ... ecco l'errore ...

    Semmai devi scrivere

    MYSQL mysql;

    e quindi

    if (!(mysql_init(&mysql)))

    Inoltre, a parte l'errore che hai commesso, ho molte perplessita' circa l'efficacia di un ciclo infinito cosi' "pesante" ... oltre al fatto che inizializzi continuamente la connessione a mysql quando basterebbe farlo solamente una volta ...

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    348
    Per pesante cosa intendi che apro e chiudo la connessione??per che il codice fa parte di un demone e non mi sembrava bello lasciare aperta la connessione al db!pero' non ne so molto in fatto di sicureza etc etc. tu mi consigli di aprirla una volta e chiuderla quando killo il demone??

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Sì ... ma e' pesante anche perche' non fai alcuna pausa nell'interrogazione del db.

    Non puoi continuamente aprire, interrogare, chiudere perche' fai schizzare al 100% a CPU e pregiudichi il funzionamento del sistema.

    Devi introdurre un ritardo (con uno sleep) all'interno del ciclo in modo che l'aggiornamento avvenga, ad esempio, ogni secondo o anche piu'.

    P.S. Ma hai risolto con il codice che ti ho fornito?

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    348
    sai ho provato ma non funziona!forse e dico forse(non prendertela l'ho detto piu' volte che ne sai piu' di tutti) non hai letto che ho messo una variabile globale:
    Mysql * mysql;

    tu mi hai detto di mettere Mysql mysql e con & prendo l'indirizzo pero' faccendo in questo modo non funziona mi da subito al primo ciclo segmention fault


    ah per lo sleep ho in realta' 5 minuti di sleep cioe'

    apro interrogo chiudo stop 5 minuti e poi ripeto il ciclo!

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Fammi rivedere il codice con le correzioni ...

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    348
    allor codice con correzione


    codice:
    MYSQL mysql;
    
    int collegamentoDB(){
      
       if (!(mysql_init(&mysql))) {
    
        printf ("Errore nella allocazione di memoria.\n");                
        return -1;
      }
      
      
      if (! mysql_real_connect (mysql, host, db_user, db_pass, "",0, NULL, 0)) {
        printf ("Errore nella connessione.\n");
        return -2;
      }
    	
      if (mysql_select_db (mysql, database)) {
        printf ("Errore nella selezione del database.\n");
        return -3;
            
      }	
      return 0;
    
    }

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Beh ... mysql non e' piu' un puntatore, dovevi tenerne conto anche nelle altre chiamate ...
    Comunque, prova con questo altro modo di chiamare le varie funzioni utilizzando il puntatore ...

    codice:
    MYSQL *mysql;
    
    int collegamentoDB()
    {
       mysql = mysql_init(NULL);        
    
       mysql_real_connect(mysql, host, db_user, db_pass, "",0, NULL, 0);
    
       mysql_select_db(mysql, database);
    
       return 0;
    }
    e nella funzione chiamante

    codice:
       mysql_close(mysql);
    Non ho inserito la gestione degli errori ... prova senza e poi, se tutto funziona, inserisci il codice relativo ...

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    348
    Perfetto funge!pero' ho un paio di domande da farti.


    1)non ho capito perche' dici che mysql non e' piu' un puntatore?

    2)forse in relazione con la prima, se ho un puntatore dentro ad una funzione, alloco dinamicamente la memoria, quando termina la funzione la memoria viene liberata? nel caso di un ciclo infinio quando richiamo la funzione n volte se la memoria non si libera rischio si saturarla.
    basta utilizzare free(pt) o altri accorgimenti??


    grazie mille!!ciao

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 © 2025 vBulletin Solutions, Inc. All rights reserved.