Передача больших массивов из MainWindow в QDialogs - PullRequest
1 голос
/ 05 марта 2020

Итак, я довольно новичок в QT, и я в основном закодировал в Java и Python, в то время как это на C ++. Мне было интересно, как я могу передать массив ~ 200 структур, не имея setFunctions в этом диалоге и вызывая их из моего MainWindow с экземпляром указанного QDialog. Это потому, что в моей структуре много данных (около 50 строк), и копирование их звучит неэффективно и хлопотно. Я также не знаю, должен ли я сделать это массивом указателей на структуры, если это будет путь к go. Вот мой код:

MainWindow. cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "tenseselectiondialog.h"
#include <QMessageBox>
#include <iostream>

using namespace std;

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow){
    ui->setupUi(this);
    setWindowTitle("Japanese Conjugator 101");
    tenseSelection = new TenseSelectionDialog();
}

MainWindow::~MainWindow(){
    delete ui;
    delete tenseSelection;
    delete conjugateDialog;
}

void MainWindow::on_actionQuit_triggered(){
    QApplication::quit();
}

void MainWindow::on_actionAbout_Qt_triggered(){
    QString about = "Hey! I am the creator of this program. I want to make the process of learning japanese faster for everybody so here is a program that uses spaced repition of japanese verb conjugation to improve your conjugating skills!";
    QMessageBox::information(this, "About Me", about);
}

void MainWindow::on_actionAbout_triggered(){
    QApplication::aboutQt();
}

void MainWindow::on_startButton_clicked(){
            MainWindow::hide();
            this->tenseSelection->setModal(true);
            this->tenseSelection->exec();
            MainWindow::show();
}

void MainWindow::on_actionContact_Me_triggered()
{
    QString contact = "If you notice any errors/bugs with the program itself or conjugations, please notify me at: tomasnew1@hotmail.com, and I will send out a patch ASAP!";
    QMessageBox::information(this, "Contact Me", contact);

}

MainWindow* MainWindow::get() {
    return this;
}

TenseSelectionDialog. cpp

#include "tenseselectiondialog.h"
#include "ui_tenseselectiondialog.h"
#include "conjugatedialog.h"

TenseSelectionDialog::TenseSelectionDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::TenseSelectionDialog)
{
    ui->setupUi(this);
    setWindowTitle("Japanese Conjugator 101");
    conjugateDialog = new ConjugateDialog();
}

TenseSelectionDialog::~TenseSelectionDialog()
{
    delete ui;
}


void TenseSelectionDialog::on_continueButton_clicked()
{
    this->conjugateDialog->setModal(true);
    this->conjugateDialog->exec();
}

structs.h

#ifndef STRUCTS_H
#define STRUCTS_H

#include <string>
#include <string.h>
#include <algorithm>
#include <cctype>
#include <iostream>
#include <fstream>
#include <iomanip>
#include <cstring>
#include <cassert>
#include <array>

using namespace std;

const string sampleFile = "Japanese verbs";
const string sampleExtension = ".txt";
const string samplePath = "";
const int VERBS = 500;
const int totalTenses = 14;

struct tenseType{
   string currentTense;
   string plainAffirmative;
   string plainNegative;
   string formalAffirmative;
   string formalNegative;
};

struct verbType{

    string verbStem;
    string verbInfinitive;
    string dictionaryFormRomaji;
    string dictionaryFormHiragana;
    string dictionaryFormKanji;
    string verbDefinition;
    int verbGroup;
    string verbEnding;

    tenseType presentTense;
    tenseType volitionalTense;
    tenseType imperativeTense;
    tenseType TaiTense;
    tenseType TaiPastTense;
    tenseType pastTense;
    tenseType pastPresumptiveTense;
    tenseType presentProgressiveTense;
    tenseType pastProgressiveTense;
    tenseType conditionalTaraTense;
    tenseType conditionalEbaTense;
    tenseType potentialTense;
    tenseType causativeTense;
    tenseType passiveTense;
};

void init(verbType verbArray[VERBS]);
void verbInit(verbType verbArray[VERBS], int &count, int flag, string fileName, string fileExtension = sampleExtension, string filePath = samplePath);
string removeSpaces(string str);
void printVerbs(verbType verbArray[VERBS], int count);

#endif // STRUCTS_H

functions. cpp

include "structs.h"

void verbInit(verbType verbArray[VERBS], int &count, int flag, string fileName, string fileExtension, string filePath){
     string fileLine;
     string secondLine;
     string thirdLine;
     string fourthLine;
     string fifthLine;
     string sixthLine;
     string seventhLine;
     ifstream myFile (filePath + fileName + fileExtension);
     int currentIndex = 0;
     int passingInt = 0;
     if (myFile.is_open()){
         while (getline(myFile,fileLine)){
             verbType verb;
             verbArray[currentIndex] = verb;
             verbArray[currentIndex].verbStem = removeSpaces(fileLine);
             getline(myFile,secondLine);
             verbArray[currentIndex].verbInfinitive = removeSpaces(secondLine);
             getline(myFile,thirdLine);
             verbArray[currentIndex].dictionaryFormRomaji = removeSpaces(thirdLine);
             getline(myFile,fourthLine);
             verbArray[currentIndex].dictionaryFormHiragana = fourthLine;
             if (verbArray[currentIndex].dictionaryFormRomaji == "motsu" || verbArray[currentIndex].dictionaryFormRomaji == "matsu"){
                 verbArray[currentIndex].verbEnding = "tsu";
             }else if (verbArray[currentIndex].dictionaryFormRomaji == "arau" || verbArray[currentIndex].dictionaryFormRomaji == "tsukau" ||
                       verbArray[currentIndex].dictionaryFormRomaji == "omou" || verbArray[currentIndex].dictionaryFormRomaji == "utau" ||
                       verbArray[currentIndex].dictionaryFormRomaji == "iu" || verbArray[currentIndex].dictionaryFormRomaji == "morau" ||
                       verbArray[currentIndex].dictionaryFormRomaji == "harau" || verbArray[currentIndex].dictionaryFormRomaji == "kau" ||
                       verbArray[currentIndex].dictionaryFormRomaji == "au" || verbArray[currentIndex].dictionaryFormRomaji == "narau"||
                       verbArray[currentIndex].dictionaryFormRomaji == "warau" || verbArray[currentIndex].dictionaryFormRomaji == "suu" ||
                       verbArray[currentIndex].dictionaryFormRomaji == "chigau"){
                 verbArray[currentIndex].verbEnding = "u";
             }else {
                 verbArray[currentIndex].verbEnding = verbArray[currentIndex].dictionaryFormRomaji.substr(verbArray[currentIndex].dictionaryFormRomaji.length()-2);
             }
             if (flag == 1) {
                 getline(myFile,fifthLine);
                 verbArray[currentIndex].dictionaryFormKanji = fifthLine;
             }
             getline(myFile,sixthLine);
             verbArray[currentIndex].verbDefinition = "to " + sixthLine;
             getline(myFile,seventhLine);
             passingInt = stoi(seventhLine);
             verbArray[currentIndex].verbGroup = passingInt;
             currentIndex++;
             count++;
        }
   }
   for (int i = 0; i < count; i++){
       if (verbArray[i].verbGroup == 1){
           verbArray[i].presentTense.formalAffirmative = verbArray[i].verbInfinitive + "masu";
           verbArray[i].presentTense.formalNegative = verbArray[i].verbInfinitive + "masen";
           verbArray[i].presentTense.plainAffirmative = verbArray[i].dictionaryFormRomaji;
           verbArray[i].presentTense.plainNegative = verbArray[i].verbStem + "anai";
           verbArray[i].pastTense.formalAffirmative = verbArray[i].verbInfinitive + "mashita";
           verbArray[i].pastTense.formalNegative = verbArray[i].verbInfinitive + "masendeshita";
           if (verbArray[i].verbEnding == "u" || verbArray[i].verbEnding == "tsu" || verbArray[i].verbEnding == "ru"){
               verbArray[i].pastTense.plainAffirmative = verbArray[i].verbStem.substr(0, verbArray[i].verbStem.length()-1) + "tta";
           }else if (verbArray[i].verbEnding == "bu" || verbArray[i].verbEnding == "mu" || verbArray[i].verbEnding == "nu"){
               verbArray[i].pastTense.plainAffirmative = verbArray[i].verbStem.substr(0, verbArray[i].verbStem.length()-1) + "nda";
           }else if (verbArray[i].verbEnding == "ku"){
               verbArray[i].pastTense.plainAffirmative = verbArray[i].verbStem.substr(0, verbArray[i].verbStem.length()-1) + "ita";
           }else if (verbArray[i].verbEnding == "gu"){
               verbArray[i].pastTense.plainAffirmative = verbArray[i].verbStem.substr(0, verbArray[i].verbStem.length()-1) + "ida";
           }else if (verbArray[i].verbEnding == "su"){
               verbArray[i].pastTense.plainAffirmative = verbArray[i].verbStem.substr(0, verbArray[i].verbStem.length()-1) + "shita";
           }
           verbArray[i].pastTense.plainNegative = verbArray[i].verbStem + "anakatta";
           verbArray[i].volitionalTense.formalAffirmative = verbArray[i].verbInfinitive + "mashou";
           verbArray[i].volitionalTense.formalNegative = verbArray[i].presentTense.plainNegative + "deshou";
           verbArray[i].volitionalTense.plainAffirmative = verbArray[i].verbStem + "ou";
           verbArray[i].volitionalTense.plainNegative = verbArray[i].presentTense.plainNegative + "darou";
           verbArray[i].TaiTense.formalAffirmative = verbArray[i].verbInfinitive + "tai";
           verbArray[i].TaiTense.formalNegative = verbArray[i].verbInfinitive + "takunai";
           verbArray[i].TaiTense.plainAffirmative = verbArray[i].verbInfinitive + "tai";
           verbArray[i].TaiTense.plainNegative = verbArray[i].verbInfinitive + "takunai";
           verbArray[i].TaiPastTense.formalAffirmative = verbArray[i].verbInfinitive + "takatta";
           verbArray[i].TaiPastTense.formalNegative = verbArray[i].verbInfinitive + "takunakatta";
           verbArray[i].TaiPastTense.plainAffirmative = verbArray[i].verbInfinitive + "takatta";
           verbArray[i].TaiPastTense.plainNegative = verbArray[i].verbInfinitive + "takunakatta";
           if (verbArray[i].verbEnding == "u" || verbArray[i].verbEnding == "tsu" || verbArray[i].verbEnding == "ru"){
               verbArray[i].imperativeTense.formalAffirmative = verbArray[i].verbStem.substr(0, verbArray[i].verbStem.length()-1) + "tte";
           }else if (verbArray[i].verbEnding == "bu" || verbArray[i].verbEnding == "mu" || verbArray[i].verbEnding == "nu"){
               verbArray[i].imperativeTense.formalAffirmative = verbArray[i].verbStem.substr(0, verbArray[i].verbStem.length()-1) + "nde";
           }else if (verbArray[i].verbEnding == "ku"){
               verbArray[i].imperativeTense.formalAffirmative = verbArray[i].verbStem.substr(0, verbArray[i].verbStem.length()-1) + "ite";
           }else if (verbArray[i].verbEnding == "gu"){
               verbArray[i].imperativeTense.formalAffirmative = verbArray[i].verbStem.substr(0, verbArray[i].verbStem.length()-1) + "ide";
           }else if (verbArray[i].verbEnding == "su"){
               verbArray[i].imperativeTense.formalAffirmative = verbArray[i].verbStem.substr(0, verbArray[i].verbStem.length()-1) + "shite";
           }
           verbArray[i].imperativeTense.formalNegative = verbArray[i].verbStem + "anai de kudasai";
           verbArray[i].imperativeTense.plainAffirmative = verbArray[i].verbStem + "e";
           verbArray[i].imperativeTense.plainAffirmative = verbArray[i].dictionaryFormRomaji + "na";
           verbArray[i].potentialTense.formalAffirmative = verbArray[i].verbStem + "emasu";
           verbArray[i].potentialTense.formalNegative = verbArray[i].verbStem + "emasen";
           verbArray[i].potentialTense.plainAffirmative = verbArray[i].verbStem + "eru";
           verbArray[i].potentialTense.plainNegative= verbArray[i].verbStem + "enai";
           verbArray[i].presentProgressiveTense.formalAffirmative = verbArray[i].imperativeTense.formalAffirmative + "imasu";
           verbArray[i].presentProgressiveTense.plainAffirmative = verbArray[i].imperativeTense.formalAffirmative + "iru";
           verbArray[i].presentProgressiveTense.formalNegative = verbArray[i].imperativeTense.formalAffirmative + "imasen";
           verbArray[i].presentProgressiveTense.plainNegative = "N/A";
           verbArray[i].pastProgressiveTense.formalAffirmative = verbArray[i].imperativeTense.formalAffirmative + "imashita";
           verbArray[i].pastProgressiveTense.plainAffirmative = verbArray[i].imperativeTense.formalAffirmative + "ita";
           verbArray[i].pastProgressiveTense.formalNegative = verbArray[i].imperativeTense.formalAffirmative + "imasendeshita";
           verbArray[i].pastProgressiveTense.plainNegative = "N/A";
           verbArray[i].pastPresumptiveTense.formalAffirmative = verbArray[i].pastTense.plainAffirmative + "deshou";
           verbArray[i].pastPresumptiveTense.plainAffirmative = verbArray[i].pastTense.plainAffirmative + "rou";
           verbArray[i].pastPresumptiveTense.formalNegative = verbArray[i].pastTense.plainNegative + "deshou";
           verbArray[i].pastPresumptiveTense.plainNegative = verbArray[i].pastTense.plainNegative + "darou";
           verbArray[i].conditionalEbaTense.plainAffirmative = verbArray[i].verbStem + "eba";
           verbArray[i].conditionalEbaTense.plainNegative = verbArray[i].verbStem + "anakereba";
           verbArray[i].conditionalEbaTense.formalAffirmative = "N/A";
           verbArray[i].conditionalEbaTense.formalNegative = "N/A";
           verbArray[i].conditionalTaraTense.formalAffirmative = verbArray[i].verbStem + "imashitara";
           verbArray[i].conditionalTaraTense.plainAffirmative = verbArray[i].pastTense.plainAffirmative + "ra";
           verbArray[i].conditionalTaraTense.formalNegative = verbArray[i].verbStem + "imasendeshitara";
           verbArray[i].conditionalTaraTense.formalNegative = verbArray[i].verbStem + "anakattara";
           verbArray[i].causativeTense.formalAffirmative = verbArray[i].verbStem + "asemasu";
           verbArray[i].causativeTense.formalNegative = verbArray[i].verbStem + "asemasen";
           verbArray[i].causativeTense.plainAffirmative = verbArray[i].verbStem + "aseru";
           verbArray[i].causativeTense.plainAffirmative = verbArray[i].verbStem + "asenai";
           verbArray[i].passiveTense.formalAffirmative = verbArray[i].verbStem + "aremasu";
           verbArray[i].passiveTense.formalNegative = verbArray[i].verbStem + "aremasen";
           verbArray[i].passiveTense.plainAffirmative = verbArray[i].verbStem + "areru";
           verbArray[i].passiveTense.plainNegative = verbArray[i].verbStem + "arenai";

       }else if (verbArray[i].verbGroup == 2){
           verbArray[i].presentTense.formalAffirmative = verbArray[i].verbInfinitive + "masu";
           verbArray[i].presentTense.formalNegative = verbArray[i].verbInfinitive + "masen";
           verbArray[i].presentTense.plainAffirmative = verbArray[i].dictionaryFormRomaji;
           verbArray[i].presentTense.plainNegative = verbArray[i].verbStem + "nai";
           verbArray[i].pastTense.formalAffirmative = verbArray[i].verbInfinitive + "mashita";
           verbArray[i].pastTense.formalNegative = verbArray[i].verbInfinitive + "masendeshita";
           verbArray[i].pastTense.plainAffirmative = verbArray[i].verbStem + "ta";
           verbArray[i].pastTense.plainNegative = verbArray[i].verbStem + "nakatta";
           verbArray[i].volitionalTense.formalAffirmative = verbArray[i].verbInfinitive + "mashou";
           verbArray[i].volitionalTense.formalNegative = verbArray[i].presentTense.plainNegative + "deshou";
           verbArray[i].volitionalTense.plainAffirmative = verbArray[i].dictionaryFormRomaji + "you";
           verbArray[i].volitionalTense.plainNegative = verbArray[i].presentTense.plainNegative + "darou";
           verbArray[i].TaiTense.formalAffirmative = verbArray[i].verbStem + "tai";
           verbArray[i].TaiTense.formalNegative = verbArray[i].verbStem + "takunai";
           verbArray[i].TaiTense.plainAffirmative = verbArray[i].verbStem + "tai";
           verbArray[i].TaiTense.plainNegative = verbArray[i].verbStem + "takunai";
           verbArray[i].TaiPastTense.formalAffirmative = verbArray[i].verbStem + "takatta";
           verbArray[i].TaiPastTense.formalNegative = verbArray[i].verbStem + "takunakatta";
           verbArray[i].TaiPastTense.plainAffirmative = verbArray[i].verbStem + "takatta";
           verbArray[i].TaiPastTense.plainNegative = verbArray[i].verbStem + "takunakatta";
           verbArray[i].imperativeTense.formalAffirmative = verbArray[i].verbStem + "te kudasai";
           verbArray[i].imperativeTense.formalNegative = verbArray[i].verbStem + "nai de kudasai";
           verbArray[i].imperativeTense.plainAffirmative = verbArray[i].verbStem + "ro";
           verbArray[i].imperativeTense.plainAffirmative = verbArray[i].dictionaryFormRomaji + "na";
           verbArray[i].potentialTense.formalAffirmative = verbArray[i].verbStem + "raremasu";
           verbArray[i].potentialTense.formalNegative = verbArray[i].verbStem + "raremasen";
           verbArray[i].potentialTense.plainAffirmative = verbArray[i].verbStem + "rareru";
           verbArray[i].potentialTense.plainNegative= verbArray[i].verbStem + "rarenai";
           verbArray[i].presentProgressiveTense.formalAffirmative = verbArray[i].imperativeTense.formalAffirmative + "imasu";
           verbArray[i].presentProgressiveTense.plainAffirmative = verbArray[i].imperativeTense.formalAffirmative + "iru";
           verbArray[i].presentProgressiveTense.formalNegative = verbArray[i].imperativeTense.formalAffirmative + "imasen";
           verbArray[i].presentProgressiveTense.plainNegative = "N/A";
           verbArray[i].pastProgressiveTense.formalAffirmative = verbArray[i].imperativeTense.formalAffirmative + "imashita";
           verbArray[i].pastProgressiveTense.plainAffirmative = verbArray[i].imperativeTense.formalAffirmative + "ita";
           verbArray[i].pastProgressiveTense.formalNegative = verbArray[i].imperativeTense.formalAffirmative + "imasendeshita";
           verbArray[i].pastProgressiveTense.plainNegative = "N/A";
           verbArray[i].pastPresumptiveTense.formalAffirmative = verbArray[i].pastTense.plainAffirmative + "deshou";
           verbArray[i].pastPresumptiveTense.plainAffirmative = verbArray[i].pastTense.plainAffirmative + "rou";
           verbArray[i].pastPresumptiveTense.formalNegative = verbArray[i].pastTense.plainNegative + "deshou";
           verbArray[i].pastPresumptiveTense.plainNegative = verbArray[i].pastTense.plainNegative + "darou";
           verbArray[i].conditionalEbaTense.plainAffirmative = verbArray[i].verbStem + "reba";
           verbArray[i].conditionalEbaTense.plainNegative = verbArray[i].verbStem + "nakereba";
           verbArray[i].conditionalEbaTense.formalAffirmative = "N/A";
           verbArray[i].conditionalEbaTense.formalNegative = "N/A";
           verbArray[i].conditionalTaraTense.formalAffirmative = verbArray[i].verbStem + "mashitara";
           verbArray[i].conditionalTaraTense.plainAffirmative = verbArray[i].verbStem + "tara";
           verbArray[i].conditionalTaraTense.formalNegative = verbArray[i].verbStem + "masendeshitara";
           verbArray[i].conditionalTaraTense.formalNegative = verbArray[i].verbStem + "nakattara";
           verbArray[i].causativeTense.formalAffirmative = verbArray[i].verbStem + "sasemasu";
           verbArray[i].causativeTense.formalNegative = verbArray[i].verbStem + "sasemasen";
           verbArray[i].causativeTense.plainAffirmative = verbArray[i].verbStem + "saseru";
           verbArray[i].causativeTense.plainAffirmative = verbArray[i].verbStem + "sasenai";
           verbArray[i].passiveTense.formalAffirmative = verbArray[i].potentialTense.formalAffirmative;
           verbArray[i].passiveTense.formalNegative = verbArray[i].potentialTense.formalNegative;
           verbArray[i].passiveTense.plainAffirmative = verbArray[i].potentialTense.plainAffirmative;
           verbArray[i].passiveTense.plainNegative = verbArray[i].potentialTense.plainNegative;

       }else {
           verbArray[i].presentTense.formalAffirmative = verbArray[i].verbInfinitive + "masu";
           verbArray[i].presentTense.formalNegative = verbArray[i].verbInfinitive + "masen";
           verbArray[i].presentTense.plainAffirmative = verbArray[i].dictionaryFormRomaji;
           verbArray[i].presentTense.plainNegative = verbArray[i].verbStem + "wanai";
           verbArray[i].pastTense.formalAffirmative = verbArray[i].verbInfinitive + "mashita";
           verbArray[i].pastTense.formalNegative = verbArray[i].verbInfinitive + "masendeshita";
           verbArray[i].pastTense.plainAffirmative = verbArray[i].verbStem + "tta";
           verbArray[i].pastTense.plainNegative = verbArray[i].verbStem + "wanakatta";
           verbArray[i].volitionalTense.formalAffirmative = verbArray[i].verbInfinitive + "mashou";
           verbArray[i].volitionalTense.formalNegative = verbArray[i].presentTense.plainNegative + "deshou";
           verbArray[i].volitionalTense.plainAffirmative = verbArray[i].verbStem + "ou";
           verbArray[i].volitionalTense.plainNegative = verbArray[i].presentTense.plainNegative + "darou";
           verbArray[i].TaiTense.formalAffirmative = verbArray[i].verbInfinitive + "tai";
           verbArray[i].TaiTense.formalNegative = verbArray[i].verbInfinitive + "takunai";
           verbArray[i].TaiTense.plainAffirmative = verbArray[i].verbInfinitive + "tai";
           verbArray[i].TaiTense.plainNegative = verbArray[i].verbInfinitive + "takunai";
           verbArray[i].TaiPastTense.formalAffirmative = verbArray[i].verbInfinitive + "takatta";
           verbArray[i].TaiPastTense.formalNegative = verbArray[i].verbInfinitive + "takunakatta";
           verbArray[i].TaiPastTense.plainAffirmative = verbArray[i].verbInfinitive + "takatta";
           verbArray[i].TaiPastTense.plainNegative = verbArray[i].verbInfinitive + "takunakatta";
           verbArray[i].imperativeTense.formalAffirmative = verbArray[i].verbStem.substr(0, verbArray[i].verbStem.length()-1) + "tte";
           verbArray[i].imperativeTense.formalNegative = verbArray[i].verbStem + "wanai de kudasai";
           verbArray[i].imperativeTense.plainAffirmative = verbArray[i].verbStem + "e";
           verbArray[i].imperativeTense.plainAffirmative = verbArray[i].dictionaryFormRomaji + "na";
           verbArray[i].potentialTense.formalAffirmative = verbArray[i].verbStem + "emasu";
           verbArray[i].potentialTense.formalNegative = verbArray[i].verbStem + "emasen";
           verbArray[i].potentialTense.plainAffirmative = verbArray[i].verbStem + "eru";
           verbArray[i].potentialTense.plainNegative= verbArray[i].verbStem + "enai";
           verbArray[i].presentProgressiveTense.formalAffirmative = verbArray[i].imperativeTense.formalAffirmative + "imasu";
           verbArray[i].presentProgressiveTense.plainAffirmative = verbArray[i].imperativeTense.formalAffirmative + "iru";
           verbArray[i].presentProgressiveTense.formalNegative = verbArray[i].imperativeTense.formalAffirmative + "imasen";
           verbArray[i].presentProgressiveTense.plainNegative = "N/A";
           verbArray[i].pastProgressiveTense.formalAffirmative = verbArray[i].imperativeTense.formalAffirmative + "imashita";
           verbArray[i].pastProgressiveTense.plainAffirmative = verbArray[i].imperativeTense.formalAffirmative + "ita";
           verbArray[i].pastProgressiveTense.formalNegative = verbArray[i].imperativeTense.formalAffirmative + "imasendeshita";
           verbArray[i].pastProgressiveTense.plainNegative = "N/A";
           verbArray[i].pastPresumptiveTense.formalAffirmative = verbArray[i].pastTense.plainAffirmative + "deshou";
           verbArray[i].pastPresumptiveTense.plainAffirmative = verbArray[i].pastTense.plainAffirmative + "rou";
           verbArray[i].pastPresumptiveTense.formalNegative = verbArray[i].pastTense.plainNegative + "deshou";
           verbArray[i].pastPresumptiveTense.plainNegative = verbArray[i].pastTense.plainNegative + "darou";
           verbArray[i].conditionalEbaTense.plainAffirmative = verbArray[i].verbStem + "eba";
           verbArray[i].conditionalEbaTense.plainNegative = verbArray[i].verbStem + "wanakereba";
           verbArray[i].conditionalEbaTense.formalAffirmative = "N/A";
           verbArray[i].conditionalEbaTense.formalNegative = "N/A";
           verbArray[i].conditionalTaraTense.formalAffirmative = verbArray[i].verbStem + "imashitara";
           verbArray[i].conditionalTaraTense.plainAffirmative = verbArray[i].pastTense.plainAffirmative + "ra";
           verbArray[i].conditionalTaraTense.formalNegative = verbArray[i].verbStem + "imasendeshitara";
           verbArray[i].conditionalTaraTense.formalNegative = verbArray[i].verbStem + "wanakattara";
           verbArray[i].causativeTense.formalAffirmative = verbArray[i].verbStem + "wasemasu";
           verbArray[i].causativeTense.formalNegative = verbArray[i].verbStem + "wasemasen";
           verbArray[i].causativeTense.plainAffirmative = verbArray[i].verbStem + "waseru";
           verbArray[i].causativeTense.plainAffirmative = verbArray[i].verbStem + "wasenai";
           verbArray[i].passiveTense.formalAffirmative = verbArray[i].verbStem + "waremasu";
           verbArray[i].passiveTense.formalNegative = verbArray[i].verbStem + "waremasen";
           verbArray[i].passiveTense.plainAffirmative = verbArray[i].verbStem + "wareru";
           verbArray[i].passiveTense.plainNegative = verbArray[i].verbStem + "warenai";
       }
   }
}

void printVerbs(verbType verbArray[VERBS], int count){
    for (int i = 0; i < count; i++){
        cout << "Verb Ending: " << setw(20) << verbArray[i].verbEnding << endl;
        cout << "Verb Form Pres " << setw(20) << verbArray[i].presentTense.formalAffirmative << setw(30) << verbArray[i].presentTense.formalNegative << endl;
        cout << "Verb Plain Pres " << setw(20) <<  verbArray[i].presentTense.plainAffirmative << setw(30) << verbArray[i].presentTense.plainNegative << endl;
        cout << "Verb Form Past " << setw(20) << verbArray[i].pastTense.formalAffirmative << setw(30) << verbArray[i].pastTense.formalNegative << endl;
        cout << "Verb Plain Past " << setw(20) << verbArray[i].pastTense.plainAffirmative << setw(30) << verbArray[i].pastTense.plainNegative << endl;

    }
}

string removeSpaces(string str)  {
    string placer = "";
    for (int i = 0; i < str.length(); i++){
        if (!isspace(str[i])){
            placer += str[i];
        }
    }
    return placer;
}

Я не включил свои .h файлы, так как у меня не было достаточно строк, просто знаю, что мои массивы являются частными членами. Спасибо за помощь!

1 Ответ

1 голос
/ 06 марта 2020

1а. Эффективная передача массивов

моя структура содержит много данных (около 50 строк), и копирование по ним звучит неэффективно и хлопотно.

...

void printVerbs(verbType verbArray[VERBS], int count);

Сначала начните использовать контейнеры C ++, такие как std::vector или QVector вместо необработанных массивов C. Контейнерные классы C ++ намного проще в управлении и отладке.

Затем вы можете дешево передавать массивы по const reference :

void printVerbs(const QVector<verbType> &verbArray);

Примечание: вам не нужно проходить count! Вектор знает, сколько элементов он содержит.

Это позволяет достичь 2 вещей:

  • Часть reference гарантирует, что ваши данные не будут скопированы во время вызов функции, потому что функция ссылается на данные, которые уже существуют
  • Часть const гарантирует, что функция не сможет случайно изменить ваши существующие данные.

1б. Копирование массивов без копирования

QVector является неявно общим (также называется «копирование при записи»): https://doc.qt.io/qt-5/implicit-sharing.html Это означает, что вы можете передать копию QVector<verbType> из ваш MainWindow в ваш TenseSelectionDialog и даже сохранить копию как переменную-член в TenseSelectionDialog. Пока ни одна копия не изменена, оба вектора будут совместно использовать одни и те же данные.

В качестве альтернативы, если вы гарантируете, что MainWindow всегда будет переживать TenseSelectionDialog, тогда вы можете TenseSelectionDialog сохранить указатель ссылка на переменную-член MainWindow.

2. Используя массивы (указатели на структуры)

Я также не знаю, должен ли я сделать это массивом указателей на структуры, если это будет путь к go.

Использование массива указателей наиболее полезно, если:

  • Ваш массив будет часто изменяться или копироваться.
    • Вставка или удаление элементов может привести к перемещению содержимого массива в памяти.
    • Перемещение / копирование указателей дешевле, чем больших структур.
  • Ваш массив будет огромным.
    • Данные в массиве хранятся в непрерывном блоке памяти, заданном N * sizeof<ArrayElement>, где N - количество элементов.
    • Если ваша память слишком фрагментирована, ваш P C может не иметь достаточно большого непрерывного блока оперативной памяти для хранения данных.
    • Для больших структур хранение указателей уменьшает количество непрерывной необходимой памяти.

Если эти 2 критерия не применяются, то в США меньше преимуществ нг массив указателей. (Подсказка: ~ 500 элементов крошечные)

Если вы хотите использовать массив указателей, используйте std::shared_ptr вместо необработанных указателей, так что вам не нужно управлять памятью явно.

3. (Другое) Строковое программирование

Если вы хотите использовать QString в своей логике ядра c, ваш код для работы со строками может быть значительно упрощен.

Пример:

string removeSpaces(string str)  {
    string placer = "";
    for (int i = 0; i < str.length(); i++){
        if (!isspace(str[i])){
            placer += str[i];
        }
    }
    return placer;
}

... можно заменить на

QString removeSpaces(QString str) {
    str.remove( QRegularExpression("\s") );
    return str;
}

... или вы можете просто позвонить QString::trimmed(), если хотите удалить только пробелы с концов string.

QString также поддерживает юникод (в отличие от std::string), поэтому вы можете использовать его для хранения хираганы, катаканы и кандзи независимо от платформы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...