2010-01-27 7 views
2

En C++, j'ai une variable char [256] qui est remplie par un appel à une DLL externe qui la remplit de données. De là, je voudrais ajouter le char [] comme un élément ComboBox. Cela crée une erreur de construction car car [] n'est pas un type d'objet System :: Object. Des idées sur la conversion du char [] en quelque chose que je peux ajouter en tant qu'élément à un contrôle ComboBox? Convertir en une chaîne serait très bien, mais je ne suis pas sûr de savoir comment faire cela. Plus si j'essaye de créer une variable telle que:Convertir char [] en System :: Object

string strName; 

crée également une erreur pour manquer ';' avant l'identifiant 'strName'. Je suis un débutant en C++ et je continue d'envelopper mon cerveau, donc merci pour toute aide fournie!

EDIT code complet comme demandé:

#pragma once 

espace de noms FMODMultipleSoundcardWindowed {

#include <string> 
#include "inc/fmod.h" 
#include "inc/fmod_errors.h" 

using namespace System; 
using namespace System::ComponentModel; 
using namespace System::Collections; 
using namespace System::Windows::Forms; 
using namespace System::Data; 
using namespace System::Drawing; 
using namespace std; 


FMOD_SYSTEM  *systemA, *systemB; 
FMOD_SOUND  *soundA, *soundB; 
FMOD_CHANNEL *channelA = 0, *channelB = 0; 
FMOD_DSP  *dspNormalizerA, *dspNormalizerB; 
FMOD_DSP  *dspCompressorA, *dspCompressorB; 
FMOD_DSP  *dspEqualizerA[10], *dspEqualizerB[10]; 
FMOD_DSP  *dspVSTVUA, *dspVSTVUB; 
FMOD_RESULT  result; 
unsigned int dspVSTVUHandleA, dspVSTVUHandleB; 
unsigned int version; 
int    numdrivers, count; 


public ref class Form1 : public System::Windows::Forms::Form 
{ 
public: 
    Form1(void) 
    { 
     InitializeComponent(); 

     result = FMOD_System_Create(&systemA); 
     ERRCHECK(result); 

     result = FMOD_System_GetVersion(systemA, &version); 
     ERRCHECK(result); 

     if (version < FMOD_VERSION) 
     { 
      MessageBox::Show("You are using an old version of FMOD!"); 
     } 

     result = FMOD_System_GetNumDrivers(systemA, &numdrivers); 
     ERRCHECK(result); 

     for (count = 0; count < numdrivers; count++) 
     { 
      char name[256]; 

      result = FMOD_System_GetDriverInfo(systemA, count, name, 256, 0); 
      ERRCHECK(result); 

      m_objPrimaryAudioDeviceComboBox->Items->Add(name[0]); 
     } 
    } 

    void ERRCHECK(FMOD_RESULT result) 
    { 
     if (result != FMOD_OK) 
     { 
      MessageBox::Show("FMOD Error!"); 
      this->Close(); 
     } 
    } 

protected: 
    /// <summary> 
    /// Clean up any resources being used. 
    /// </summary> 
    ~Form1() 
    { 
     if (components) 
     { 
      delete components; 
     } 
    } 
private: System::Windows::Forms::ComboBox^ m_objPrimaryAudioDeviceComboBox; 
protected: 
private: System::Windows::Forms::ComboBox^ m_objSecondaryAudioDeviceComboBox; 

private: 
    System::ComponentModel::Container ^components; 

région pragma Windows Form Designer généré Code

void InitializeComponent(void) 
    { 
     this->m_objPrimaryAudioDeviceComboBox = (gcnew System::Windows::Forms::ComboBox()); 
     this->m_objSecondaryAudioDeviceComboBox = (gcnew System::Windows::Forms::ComboBox()); 
     this->SuspendLayout(); 
     // 
     // m_objPrimaryAudioDeviceComboBox 
     // 
     this->m_objPrimaryAudioDeviceComboBox->FormattingEnabled = true; 
     this->m_objPrimaryAudioDeviceComboBox->Location = System::Drawing::Point(12, 12); 
     this->m_objPrimaryAudioDeviceComboBox->Name = L"m_objPrimaryAudioDeviceComboBox"; 
     this->m_objPrimaryAudioDeviceComboBox->Size = System::Drawing::Size(254, 21); 
     this->m_objPrimaryAudioDeviceComboBox->TabIndex = 0; 
     // 
     // m_objSecondaryAudioDeviceComboBox 
     // 
     this->m_objSecondaryAudioDeviceComboBox->FormattingEnabled = true; 
     this->m_objSecondaryAudioDeviceComboBox->Location = System::Drawing::Point(12, 54); 
     this->m_objSecondaryAudioDeviceComboBox->Name = L"m_objSecondaryAudioDeviceComboBox"; 
     this->m_objSecondaryAudioDeviceComboBox->Size = System::Drawing::Size(254, 21); 
     this->m_objSecondaryAudioDeviceComboBox->TabIndex = 1; 
     // 
     // Form1 
     // 
     this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); 
     this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; 
     this->ClientSize = System::Drawing::Size(440, 426); 
     this->Controls->Add(this->m_objSecondaryAudioDeviceComboBox); 
     this->Controls->Add(this->m_objPrimaryAudioDeviceComboBox); 
     this->Name = L"Form1"; 
     this->Text = L"FMOD Multiple Soundcard with VST"; 
     this->ResumeLayout(false); 

    } 

pragma en dregion

}; 

}

+0

Annexe à ma réponse et les commentaires ci-dessous: mettez la ligne 'include ' en dehors de 'l'espace de noms FMODMultipleSoundcardWindowed {'. Sinon, 'std' se termine par' FMODMultipleSoundcardWindowed :: std'. –

+0

Cela me donne accès à l'objet chaîne comme prévu, ce qui est génial.Mais mon problème d'origine existe que je ne peux pas ajouter une chaîne std: string en tant qu'élément ComboBox car 'impossible de convertir le paramètre 1 de' std :: string 'en' System :: Object^' – Jeff

+0

Édité ma réponse. –

Répondre

1
string strName; 

Tout d'abord, vous devez #include <string> afin d'utiliser std::string. Deuxièmement, vous devez ajouter using namespace std; à votre unité afin de faire référence à un std::string comme string. Vous pouvez également utiliser le code std::string strName à la place. C'est une question de goût. L'utilisation de la forme entièrement qualifiée évite de polluer votre espace de noms avec tous les identifiants de std.

à la question principale:

gcnew String(text.c_str()); 

Cela devrait faire la conversion. text est votre instance std::string et le résultat de l'expression est l'objet chaîne que vous devez transmettre à Add.

+0

Je travaille dans VS2005 avec mon projet C++. Ajouter une référence à std revient à dire que 'std' n'est pas un nom de classe ou d'espace de nom. Quelque chose qui me manque ici? – Jeff

+0

Il devrait être disponible si vous #incluez avant d'utiliser l'espace de noms std; –

+0

Lorsque j'essaie cela, la construction jette plus de 100 erreurs à partir des fichiers cstdio et cstdlib. – Jeff

0

Essayez string strName(name); (en supposant que vous avez votre includes et namespaces droit ...)

MISE À JOUR: On dirait qu'il est System::String vous devez utiliser, pas la chaîne STL .

+0

Noté. Mais je pense qu'il me manque des includes/namespaces. Encore une fois, j'apprends encore et je trouve ces trucs. C++ et les chaînes me bouleversent les idées car ça a toujours été si facile dans VB et C# de travailler avec tout ce que je voulais. – Jeff

+0

Mes excuses :) Comme les autres réponses l'indiquent, vous devriez pouvoir '#include ', puis utiliser 'using namespace std;' ou changer votre appel pour utiliser 'std :: string' au lieu de' string'. Check this out: http://www.devarticles.com/c/a/Cplusplus/The-STL-String-Class/ – acron

0

votre deuxième problème ressemble à votre manque include pour la classe de chaîne, donc il suffit d'ajouter #include <string> en haut de votre fichier, vous devrez peut-être ajouter using namespace std; ou utiliser « std :: string » en fonction de votre système

+0

Lorsque j'essaie cela, la construction jette plus de 100 erreurs à partir des fichiers cstdio et cstdlib. Est-ce que je manque quelque chose? BTW - travailler dans VS2005 C++. Merci de votre aide. – Jeff

+0

peut-être parce que j'ai oublié un point-virgule derrière 'using namespace std': |, fixé ci-dessus – Necrolis

Questions connexes