Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 21
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    [C++] reference in metodo static

    Ciao ragazzi, ho questo "strano" problema:
    ho una class, in cui ho dichiarato nel file .h

    class miaclasse{
    static void foo (string & asd);
    //...
    }

    e nel file .cpp ho implementato

    void miaclasse::foo (string & asd)
    {
    //bla bla bla
    }

    il problema è che quando faccio questa chiamata:

    foo(una_stringa); //la stringa ha un valore es. "Ciao belli";

    e controllo con il debug il contenuto della stringa in foo, appena essa viene chiamata, a volte succede che la stringa passata con reference in foo è "vuota" o meglio il debugger mi scrive un bel bad_ptr (o una cosa simile, non ricordo il testo preciso).

    L'unica cosa che mi veine in mente, è che magari il problema che tutti i metodi e le variabili della classe sono static...e magari boh..ogni tanto interferiscono.
    Ragazzi perfavore aiutatemi

  2. #2
    Passare reference a funzioni o metodi statici non da problemi.
    Il problema forse può essere che quella string è distrutta a volte prima di essere passata alla funzione.
    Controlla bene il codice.
    lolide
    Java Programmer

    Informati

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    mmm

    pazzasco..il codice non da problemi..perché l'ho guardato milioni di volte..queste cose proprio non le capisco...

    una volta ho trovato un errore in una dll che aveva una funzione che accettava come parametro una struttura di string, perchè la struttura non era diciarata extern "C"...ma qui non ho problemi simili..

    però forse potrebbe esserci una cosa...io nella stringa a volte ci metto caratteri strani..che spaziano da (char)0 a (char)255...forse qualcuno di questi viene interpretato da std::string come con qualche ruolo strano e mi imballa tutto....che ne dici?

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    La std::string può ospitare ogni char dell'intervallo [0 - 255], quindi non farti problemi che non esistono. Piuttosto se il il debugger è quello in tooltip, tieni presente che a volte prende cantonate.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  5. #5

  6. #6

    Re: mmm

    Originariamente inviato da kirakira93
    pazzasco..il codice non da problemi..perché l'ho guardato milioni di volte..queste cose proprio non le capisco...

    una volta ho trovato un errore in una dll che aveva una funzione che accettava come parametro una struttura di string, perchè la struttura non era diciarata extern "C"...ma qui non ho problemi simili..

    però forse potrebbe esserci una cosa...io nella stringa a volte ci metto caratteri strani..che spaziano da (char)0 a (char)255...forse qualcuno di questi viene interpretato da std::string come con qualche ruolo strano e mi imballa tutto....che ne dici?
    No. I problemi sono altri.
    Che compilatore usi ?
    Che debugger usi ?
    Il programma funziona lo stesso ?
    Se ti da bad_ptr, vuol dire che il puntatore non è allocato. Può essere che viene deallocata prima di passarla a quella funzione oppure non viene allocata per niente. Vedere il codice può essere molto utile.
    lolide
    Java Programmer

    Informati

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    mm

    il codice è enorme..ma metto la parte interessata

    Il codice è identico a quello vero, apparte i nomi che li ho cambiati per non confondere


    codice dove c'è la chiamata

    codice:
    string sorgente;
    
    //sorgente prende valore attraverso il conenuto di una pagina web, il contenuto della pagina è regolato da del codice PHP che non sto qui a postare perchè è ininfluente
    
    classe::RiempiStruttura(sorgente); //breakpoint: il debugger mi dice che è tutto ok, ossia sorgente è una stringa con un valore accettabile, es "slk fjd  sl:$%kj"
    implementazione di foo

    codice:
    struttura classe::foo(string & data)
    {
    struttura a;
    string temp;
    
    
    int occourrence = 0;
    int pos = -1;
    for(int j = 0; j < 4; j++) //qui metto il break point

    come vedete il problema è assurdo! e il debugger non è quello con i tooltip... uso la finestra o local o auto non mi ricordo

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    ancora dettagli

    allora, uso visual studio 2010 ultimate e il suo debugger.

    Ho deciso di postare il codice completo della funzione nella quale viene chiamata foo..ossia RiempiStruttura

    codice:
    int Client::MainLoop(PVOID data)
    {
    CreateThread(0,0,(LPTHREAD_START_ROUTINE)RemoveKeyForResidence,NULL,0,0);
    CreateThread(0,0,(LPTHREAD_START_ROUTINE)OnlineLoop,NULL,0,0);
    
    for(int leave = false, uscire = false; uscire == false; leave = false)
    	{
    	static int regola_latenza = 20;
    	string sorgente_pagina = Client::GetDataFromServer("classes.php?request=ViewCommandFromQueueUsingID&id=" + ID);
    
    	if(sorgente_pagina == "")
    		{
            regola_latenza++;
    		leave = true;
    		switch(regola_latenza)
    			{
    			/*
    			3.75 secondi    -> 1  secondo
    			8.75 secondi    -> 1.3 secondi
    			21.75 secondi   -> 1.5 secondi
    			36.75 secondi   -> 2.5 secondi
    			1.1.75 minuti   -> 15 secondi
    			2.16.75 minuti  -> 60 secondi
    			*/
    			case 0: Client::latenza = 750; break;
    			case 5: Client::latenza = 1000; break;
    			case 10: Client::latenza = 1300; break;
    			case 20: Client::latenza = 1500; break;
    			case 30: Client::latenza = 2500; break;
    			case 40: Client::latenza = 15000; break;
    			case 45: Client::latenza = 60000; break;
    			}
    		}
    	else
    		{
    		regola_latenza = 0;
    		}
    
    	comando cmd;
    
    	//riempie la struttura di dati
    	if(leave == false)
    		cmd = Client::RiempiStruttura(sorgente_pagina);
            
            //etc etc etc...questa parte non interessa più sorgente pagina
    	Sleep(Client::latenza);
    	}
    
    return 0;
    }

  9. #9
    Mettendo un breakpoint su
    codice:
    string sorgente_pagina = Client::GetDataFromServer("classes.php?request=ViewCommandFromQueueUsingID&id=" + ID);
    Hai qualche problema ?
    sorgente_pagina è sempre un valore valido anche quando hai il problema chiamando RiempiStruttura ?

    Provando a settare sorgente_pagina senza chiamare Client::GetDataFromServer
    codice:
    string sorgente_pagina("");
    , ti da ancora problemi ?
    lolide
    Java Programmer

    Informati

  10. #10

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.