Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826

    [c++]stream e errore return type

    ciao.
    ho la seguente classe:

    .h
    codice:
    class CShaderProgram
    {
    public:
    	CShaderProgram();
    	~CShaderProgram(void);
    	
    	bool compileShaderFromName( const std::string & strShaderName, GLSLShader::GLSLShaderType type );
    	char* m_strProgramName;
    private:
    	const char* loadShaderAsString(const char* file);
    	void printActiveUniforms();
    	void printActiveAttribs();
    	int  m_handle;//handle del programma compilato
    };
    .cpp
    codice:
    #include "StdAfx.h"
    #include "ShaderProgram.h"
    #include "Resources.h"
    #include <iostream>
    #include <fstream>
    CShaderProgram::CShaderProgram()
    {
    }
    
    CShaderProgram::~CShaderProgram(void)
    {
    }
    
    const char* CShaderProgram::loadShaderAsString(const char* file){
        
    	std::ifstream shader_file(file, std::ifstream::in);
        std::string str((std::istreambuf_iterator<char>(shader_file)), std::istreambuf_iterator<char>());
     
        return str.c_str(); //ATTENZIONE PROBLEMA
    }
    
    bool CShaderProgram::compileShaderFromName( const string & strShaderName, GLSLShader::GLSLShaderType type )
    {
    	const char* strSource = loadShaderAsString("C:\\OpenResources\\Shaders\\basic.vert");
    //non riportato perchè non importante
    quando richiamo dall esterno :
    codice:
    CShaderProgram program;
    program.compileShaderFromName("basic.vert", GLSLShader::VERTEX);
    in:
    //ATTENZIONE PROBLEMA
    qui :return str.c_str(); col debug vedo che la stringa è caricata correttamente con il contenuto di
    C:\\OpenResources\\Shaders\\basic.vert, ma dopo che ritorna str si svuota e il valore const char ritornato è non valido
    [0] -18 'î' const char
    [1] -2 'þ' const char
    e cosi via per tutto il contenuto.
    non riesco a capire il perchè!
    grazie.

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Se dichiari str all'interno della funzione è normale che all'uscita tu abbia spazzatura.
    Piuttosto, c'é qualche ragione per non usare std::string come parametro d'uscita e per m_strProgramName?
    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.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    sull str davvero non me n'ero accorto, grazie . poi per quanto riguarda la domanda ti devo confessare che non so mai come alternare l'uso di string e char*, ho delle lacune, ho capito l'uso dei TCHar , unicode ecc.. ma non di std::string, è solo una classe che offre funzionalità aggiuntive all uso dei char* o ci sono delle differenze piu profonde?

    intanto grazie per la risposta.
    ciao

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Vediamo la cosa da una prospettiva diversa.
    In C le stringhe sono array di caratteri NULL terminated (dette anche ASCIIZ). Questo significa che sostanzialmente sono array e vanno trattate come tali. Per dare un minimo supporto alle stringhe ASCIIZ il C mette a disposizione una serie di funzioni di libreria (strcpy per copiare, strcat per concatenare etc.) per poterle manipolare. Queste funzioni però richiedono che chi le usa dia spazio sufficiente alla stringa di destinazione, pena comportamento indefinito, e che in ogni momento del programma sappia esattamente cosa succeda alla sua stringa ASCIIZ. Ne consegue che se tu allochi una stringa ASCIIZ, tu sappia in ogni momento se tale stringa ASCIIZ sia valida, per quanto tempo sia valida, quando deallocarla, non deallocarla due volte ( se no scoppia tutto), sapere se è sufficiente o no per ospitare una sequenza di caratteri e altre cosette che non sto qui a elencare.
    Ora uno potrebbe anche dire: ma invece di dovermi preoccupare di tutto questo io personalmente, non posso in C++ crearmi una classe che gestisca tutte le operazione più comuni su una ASCIIZ string del C e risolvere il problema una volta per tutte?
    Risposta: SI. PUO'. FARE! (urlato alla Frankesten Junior )
    Iniziamo quindi a scrivere una classe String prevedendo ogni possibile caso di utilizzo, salvo poi scoprire che esiste una classe che fa le stesse cose (e probabilmente meglio) nella libreria standard del C++ : std::string.
    Si scopre così che per copiare una std::string si usa = invece di strcpy() o per concatenarle si usa l'operatore + invece di strcat() e che per fare tutto questo non ci si deve preoccupare di dimensionare a priori la stringa, ma provvede da sola a farlo. Tiene traccia della sua dimensione, quando deallocare le strutture interne e quando no etc.
    Detto in parole povere: preferisci lavare i panni a mano o usare una lavatrice?
    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
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    un ultima cosa shodan:
    uso vs2010, la move semantic è disponibile?

    [code]
    std::ifstream shader_file(file, std::ifstream::in);
    std::string str((std::istreambuf_iterator<char>(shader_file)),
    std::istreambuf_iterator<char>());

    return str.c_str(); //move semantic
    [code]

    come potrei utilizzarla?
    non è il caso, lo capisco , ma magari metti che il contenuto del file sia enorme.
    potrei risolvere con la move semantic?
    come?
    grazie.

  6. #6
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Originariamente inviato da giuseppe500
    un ultima cosa shodan:
    uso vs2010, la move semantic è disponibile?
    Si.

    codice:
        std::ifstream shader_file(file, std::ifstream::in);
        std::string str((std::istreambuf_iterator<char>(shader_file)),       
        std::istreambuf_iterator<char>());
     
        return str.c_str(); //move semantic
    come potrei utilizzarla?
    non è il caso, lo capisco , ma magari metti che il contenuto del file sia enorme.
    potrei risolvere con la move semantic?
    come?
    grazie.
    Supponendo che il tipo di ritorno sia std::string basta fare.
    codice:
        std::ifstream shader_file(file, std::ifstream::in);
        std::string str((std::istreambuf_iterator<char>(shader_file)),       
        std::istreambuf_iterator<char>());
     
        return std::move(str); //move semantic
    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.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    ok.
    Ultima cosa non capisco gli R-value , ho letto 200 documentazioni ma non riesco a cpire cosa sono in realtà
    e vedo che tutto gira attorno a questa definizione.
    senza capirli non riesco a capire la move semantic a fondo.

  8. #8
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Siamo abbondantemente off topic rispetto all'argomento di apertura.
    In brevissimo si può dire che il C++11 ha introdotto la move semantics per poter modificare i dati a sinistra di un'espressione (gli rvalue appunto), cosa che prima si poteva fare solo tramite salti mortali e in condizioni particolari.
    Nota che per rvalue si intendono anche i temporanei di un'espressione.
    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.

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.