2017-02-03 13 views
0

私は次の接続を持ついくつかのラベルのテキストを変更しようとしています:セグメンテーションフォールト - C++配列

connect(ui->styleSelector, SIGNAL(currentIndexChanged(int)), this, SLOT(setStyle(int))); 
connect(this, SIGNAL(instrumentChanged(QString)), ui->label_inst_1, SLOT(setText(QString))); 
connect(this, SIGNAL(instrumentChanged_2(QString)), ui->label_inst_2, SLOT(setText(QString))); 
connect(this, SIGNAL(instrumentChanged_3(QString)), ui->label_inst_3, SLOT(setText(QString))); 

マイsetStyleスロット:私のクラスに設定

void SamplerModule::setStyle(int style){ 
    m_style = style; 
    emit instrumentChanged(m_instruments[m_style][0]); 
    emit instrumentChanged_2(m_instruments[m_style][1]); 
    emit instrumentChanged_3(m_instruments[m_style][3]); 
} 

そして、私の配列を(コンストラクタ)

QString m_instruments[3][3]; 

m_instruments[0][1] = "Trompette"; 
m_instruments[0][2] = "Basse"; 
m_instruments[0][3] = "Piano"; 

m_instruments[1][1] = "Guitare"; 
m_instruments[1][2] = "Batterie"; 
m_instruments[1][3] = "Basse"; 

m_instruments[2][1] = "Basse"; 
m_instruments[2][2] = "Batterie"; 
m_instruments[2][3] = "Guitare"; 

私はコードを実行しようとしているとき、私は私の信号のためにセグメンテーションフォールトを起こしましたsはm_instruments[x][0]を使用します。

私は本当に理由を理解していません。私のスロットsetStyleにはこの配列にアクセスする権利があるので、なぜこのセグメンテーションに誤りがありますか?


詳細:

私は私のヘッダー内のQString m_instruments[3][3];代わりのQString m_instruments[][3];を設定した場合は、ワンセグ障害が消えます。 の場合、配列はコンストラクタの外部で空になります。

qDebug() << m_instruments[0][0];はコンストラクタに "Trompette"を返しますが、setStyleスロットに ""を返します。あなたのコードで

+1

配列は0でインデックス付けされていることはわかっていますか?したがって、サイズ3の配列は、添字0,1と2を持つ要素を持ちます。このような配列の添字3の要素にアクセスするとエラーになります。 –

+0

私は悪いです、私は何度も、正しいインデックスを戻すことを忘れるすべてを編集しようとしました。これは修正されましたが、セグメンテーションフォルトはまだ存在します。 :/ –

+0

どの値がsetStyle()スロットの引数として渡されていますか? 0,1、または2でない場合は、m_instruments配列の無効なインデックスにアクセスします。 –

答えて

3

、あなたは次の配列リストされています:

QString m_instruments[3][3]; 

をこの配列では、この行の3列要素、0、1、2にアクセスできることを意味し、長さ3×3であり、

m_instruments[0][3] = "Piano"; 

(ワンセグ障害が生じ、あなたのケースで)未定義の動作の原因となる配列の終わりを過ぎているあなたのアクセス要素インデックス 3、。

これはあなたのコードで唯一の問題ではないかもしれませんが、確かにそれらの1つです。

+0

私は悪いです、私は正しいインデックスを戻すことを忘れることを何度も試みました。これは修正されましたが、セグメンテーションフォルトはまだ存在します。 :/ –

+0

@RobinFourcadeあなたはそれが別の場所にないと確信していますか? Segfaultはこのように扱いにくいことがあります。コードが何かを破り*して、最後に落ちて、ここで*死んでしまいます。 – user4581301

+0

確かに、はい! 私は3つの発言をコメントするとすぐに、障害が消えます。私のセレクタからインデックスを変更しているときと、配列にアクセスしようとしたときにのみエラーが発生します。 –

関連する問題