"unavailable synchronous data" bei array als Signal/Slot Arg

Alles rund um die Programmierung mit Qt
Antworten
rubikon
Beiträge: 89
Registriert: 27. Mai 2010 13:23

"unavailable synchronous data" bei array als Signal/Slot Arg

Beitrag von rubikon »

Moin.

Ich habe ein Problem wenn ich ein Array (of QStrings) als Argument einem Siganl mitgeben möchte.

Ich habe das mal in einem Minimalbeispiel nachgestellt:

Code: Alles auswählen

typedef QString StringArray[5];

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
	Q_OBJECT
	
public:
	explicit MainWindow(QWidget *parent = 0);
	~MainWindow();

signals:
	void newStringArray(StringArray);

private slots:
	void onNewStringArray(StringArray);
	
private:
	Ui::MainWindow *ui;
};

Code: Alles auswählen

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
	ui->setupUi(this);

	StringArray stringArray;
	stringArray[0] = "xyz";

	connect(this, SIGNAL(newStringArray(StringArray)), this, SLOT(onNewStringArray(StringArray)));

	emit newStringArray(stringArray);
}

void MainWindow::onNewStringArray(StringArray stringArray)
{
	qDebug() << stringArray[0];
}
qDebug kann auf Elemente des Array scheinbar nicht zugreifen:
---------------------------
Microsoft Visual C++ Runtime Library
---------------------------
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
---------------------------
OK
---------------------------
Wenn ich einen Breakpoint setze und mir den Inhalt des Arrays anschauen möchte, sagt mir QtCreator
stringArray <unavailable synchronous data>
Mache ich irgendetwas falsch oder wieso habe ich hier ein Problem?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: "unavailable synchronous data" bei array als Signal/Slot

Beitrag von franzf »

Arrays zerfallen bei der Funktionsübergabe zu einem Zeiger (auf das erste Element). Qt erkennt das "irgendwie" (sry, bin grad zu faul um das genau nachzuschauen) und bastelt sich was zusammen. Dass das nicht hinhaut, erkennst du daran, wenn du dir im MainWindow::MainWindow() und im SLOT jeweils die Adresse von stringArray ausgeben lässt:

Code: Alles auswählen

0x7fff3103e650 
0x7fff3103e618 
[1]    29343 segmentation fault  ./14858
Erkennst du, dass die Adressen nciht mehr übereinstimmen?

Lösung:
1) Du magst OOP nicht und willst den steinigen C-Weg gehen:

Code: Alles auswählen

private slots:
    void onNewStringArray(QString*, int size);
Zeiger + Länge mitgeben (wenn du sagst: StringArray ist in der Länge konstant, ich brauch size nicht: viel Spaß beim Debuggen, wenn sich die Länge doch mal ändert :P)

2) Du magst OOP, dann nimmst du eine QStringList, wenn du immernoch sagst ich habe eine fixe Länge, dann wählst du std::array - das sind Objekte und keine primitiven Arrays, die auch als Parameter prima funktionieren.

Ich würde die wärmstens 2 ans Herz legen.
Antworten