Mein C++ Qt creator Programm stürzt bei eingaben von umlauten in ein Textfeld ab wie kann ich das verhindern?


20.12.2021, 15:01

diese fehlermeldung kommt wenn ich das programm in debug modus starte


21.12.2021, 21:32

so sieht die Gui oberfläche vom programm aus

regex9  20.12.2021, 12:49

Lässt sich die Fehlergrenze konkreter eingrenzen (Methode / Zeilennummer)?

1Manui1 
Beitragsersteller
 20.12.2021, 12:54

Beim ShowLetter scheint irgendwas nicht zu funktionieren, weil das Wörterzählen klappt

regex9  20.12.2021, 20:07
  1. Wie lautet deine Deklaration für Buchstaben? Welchen Wert erhält die Variable?
  2. Welchen Wert schreibst du in EingabeEdit?
1Manui1 
Beitragsersteller
 20.12.2021, 20:34
  1. int Buchstaben[256]; lautet die variable
  2. in EingabeEdit kommt der text rein den der Benutzer des Programmes analysieren möchte

1 Antwort

Mti was für einen Zeicvhensatz arbeitest Du mit UTF-8 ?? weil das sind unterschiedliche Bytegrößen . dieses toLatin , würde ich nicht nehmen , mach es international richtig , nimm gleich utf-8

und mach dir paar ausgaben in eine logdatei damit du siehst wann es wo abstürtzt


1Manui1 
Beitragsersteller
 20.12.2021, 13:18

was genau meinst du? wie nehme ich utf-8

wie mach ich diese ausgaben?

0
regex9  20.12.2021, 13:45
@1Manui1

1) Gemeint ist dieser Aufruf:

Buchstaben[Area[i].toLatin1()]++;

Wieso wandelst du dort die Zeichenkodierung um und belässt sie nicht bei UTF-8?

2) Entweder du setzt dir einen Breakpoint und wirfst dann einmal den Debug-Modus an (das wäre der von mir bevorzugte Weg der Fehlersuche) oder du setzt Logs in den Debugstream:

qDebug() << "some message";
1
1Manui1 
Beitragsersteller
 20.12.2021, 15:02
@regex9

weil es anders nicht funktioniert hat :(

ich habt ich die Fehlermeldung bei der frage hinzugefügt

0
regex9  21.12.2021, 10:44
@1Manui1

Deine Fehlermeldung konnte ich nun mit einem Testprojekt noch nicht reproduzieren. Sofern du den Debugger bei dir nicht zum Laufen bekommst, solltest du deinen Code erst einmal versuchen, mit den oben erwähnten Debug-Nachrichten auszustecken. Die oberste Priorität sollte erst einmal darin liegen, die Fehlerquelle einzugrenzen. Danach wäre der Kontext von Interesse (Werte der umliegenden Variablen, u.ä.).

0
1Manui1 
Beitragsersteller
 21.12.2021, 21:11
@regex9

Mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_btnBuchstaben_clicked();

    void on_btnWoerter_clicked();

    void on_btnZeichen_clicked();

    void on_btnVokale_clicked();

    void on_btnUmlaute_clicked();

    void on_btnLeeren_clicked();

private:
    Ui::MainWindow *ui;
    int Buchstaben[256];
    void DeleteLetter();
    void CountLetter();
    void ShowLetter();
    void CountWords();


};

#endif // MAINWINDOW_H

0
1Manui1 
Beitragsersteller
 21.12.2021, 21:35
@regex9

ich habe es gerade noch mehr mals versucht und es ist so das das Programm um die Buchstaben darzustellen funktioniert solange keine umlaute im text sind. Sobald das der Fall ist hängt sich das Programm auf und es Passiert egal wie lange man wartet nichts mehr. Man kann dann das Programm nurnoch über Qt creator stoppen

0
1Manui1 
Beitragsersteller
 21.12.2021, 22:19
@regex9

ich hab eine Idee warum bei dir nicht der Fehler aufgetreten ist, unzwar habe ich herausgefunden, dass das Programm nur abstürzt, wenn man Umlaute klein verwendet also ÄÖÜ Funktioniert aber öäü nicht

0
regex9  22.12.2021, 21:38
@1Manui1

Einen Absturz kann ich nach wie vor nicht reproduzieren. Das einzige, was ich sehe, ist, dass du seltsame Sachen in deinem Code machst.

In ShowLetter beispielsweise konvertierst du ein Element deines Arrays in einen String.

zahl = QString::number(Buchstaben[i]);

Das wäre ok, wenn denn die Elemente explizit belegt wären. Das sind sie aber nicht. Wenn du ein Array erstellst, bekommen die Werte initial irgendeinen Wert (nicht unbedingt 0!). Außerdem ist der Variablenname (zahl) missdeutend.

Ich erkenne hinter der gesamten Methode keinen wirklichen Sinn.

Ein anderes Beispiel: CountLetter. Du vertraust darauf, dass das char, welches von toLatin1 zurückgegeben wird, in einen Integer konvertiert werden kann, der in einem validen Wertebereich für dein Array liegt. Wenn ich mir nun einmal die Werte für zwei Sonderzeichen (ä, Ä) ausgeben lasse:

qDebug() << Area[i].toLatin1() << (int)Area[i].toLatin1();

erhalte ich jedesmal einen Wert unter 0. Das heißt, an der Stelle findet ein Überlauf statt. Richtig wäre die Konversion via unicode-Methode.

ushort index = Area[i].unicode();

Wobei auch hier trotzdem noch ein Überlauf stattfinden kann, denn es wird der Unicode-Zeichensatz abgebildet, der den ASCII-Zeichensatz deutlich überbietet. Du solltest erst prüfen, ob der berechnete Index über den erlaubten Bereich geht, bevor du ihn verwendest.

Oder du nutzt eine QMap, statt einem Array. Als Key kann ein QChar herhalten.

0
1Manui1 
Beitragsersteller
 25.12.2021, 10:11
@regex9

ok wie genau würde dann der Code lauten wenn man es so macht wie du es meinst? Wo muss das "ushort index = Area[i].unicode();" hin?

0
regex9  25.12.2021, 14:18
@1Manui1

Mit dieser Zeile wird der Index berechnet, der für dein Buchstabenarray inkrementiert werden soll.

0
1Manui1 
Beitragsersteller
 25.12.2021, 21:54
@regex9

also so?

void MainWindow::CountLetter()
{
    QString Area = ui -> EingabeEdit -> toPlainText();
    for(int i = 0; i < Area.length();i++)
        Buchstaben[Area[i].toLatin1()]++;
        ushort index = Area[i].unicode();
}

und das Programm sagt es kenn "i" nicht

0
regex9  26.12.2021, 05:27
@1Manui1

Das lässt sich leicht prüfen: Erkläre doch einmal Zeile für Zeile, was du da machst und teste es (mit Stift und Papier) selbst mit konkreten Testeingaben wie Öllampe, Däne, bloß, o.ä..

0