1 Востаннє редагувалося Logans (30.03.2014 14:18:00)

Тема: Передача та отримання масива

Добрий день.

Виникло питання про передачу та отримання масива функціями.
В мене є метод, який приймає текст і розбиває його на деяку послідовність слів записуючи в масив.
Далі для перевірки масиву мені потрібно його передати в іншу функцію, яка знаходиться в іншому класі.

Приклад:

Створення масиву
void FirstClass :: setArray() {
    array[5] = {0, 1, 2, 3, 4};
}
Функція, яка повертає масив
int* FirstClass :: getArray() {
    return array;
}
Функція, яка отримує масив
void CheckClass :: checkArray(int* array) {
    /* Будь-які дії */
}

Проблема в тому, що функція, яка повинання виконувати дії над масивом, приймає лише його перший елемент.

2

Re: Передача та отримання масива

void FirstClass :: setArray() {
    array[5] = {0, 1, 2, 3, 4};
}

Так масиви в С не задаються. Виключення - коли ви декларуєте (оголошуєте) масив.

А так - от варіант:

void FirstClass :: setArray() {
//somewhere was const int lenOfArray
    for(int i = 0; i < lenOfArray; array[i] = i, i++);
}

3

Re: Передача та отримання масива

Як оголошена змінна "array" FirstClass?
Якщо у CheckClass не відомо роміру масиву, то треба додатково його у функцію передавати, типу

void CheckClass :: checkArray(int* array, int size) {
    /* Будь-які дії */
}

А взагалі, краще використовуй std::vector, набагато менше мороки буде

Подякували: koala1

4

Re: Передача та отримання масива

Logans написав:
void FirstClass :: setArray() {
    array[5] = {0, 1, 2, 3, 4};
}

Це створює (проголошує і ініціалізує) локальну в функції setArray змінну array типу int[5] - якщо, звісно, array не було проголошено раніше, але ви про це ані слова не кажете. Ця змінна припиняє своє існування разом з останньою фігурною дужкою функції (точніше, разом із тією фігурною дужкою, в якій вона була проголошена).
Якщо ж array було проголошено раніше (ви про це не казали), то це буде записувати щось (адресу константного масиву) в елемент array[5].

5

Re: Передача та отримання масива

Bartash вибачаюсь за таку помилку, я навів це як приклад, в мене масив заповнюється по іншому.
0x9111A в мою функцію (не ту яку я тут написав) передається 2 масива і їхні розміри, але проблема в тому, що передається лише перший елемент масиву.
koala приношу свої вибачення за неповні дані.

Ось архів з кодами класів:

Post's attachments

Include.rar 1.19 kb, 399 downloads since 2014-03-30 

6

Re: Передача та отримання масива

Переглянув файл - там нема таких класів і функцій. Ви певні, що то саме воно?

7 Востаннє редагувалося Logans (30.03.2014 15:43:20)

Re: Передача та отримання масива

koala написав:

Переглянув файл - там нема таких класів і функцій. Ви певні, що то саме воно?

Те, що я показував раніше - загальний приклад, я гадав, що цього вистачить.
Те, що я представив в архіві - мої оригінальні класи і функції, які я використовую.

В ідеалі вони повинні працювати таким чином:
  1. В класі ShingleText, в метод createShingles передається текст і кількість слів тексту;
  2. Текст розбивається на послідовність слів (шингли) і записується в масив;
  3. Масив сортується;
  4. Масив і довжина масиву передається в клас CheckText в функцію setArrayResult.

І як я вже казав, в теорії передається лише перший елемент масиву.

8

Re: Передача та отримання масива

1. Потенційна проблема: кількість слів випливає з тексту, а якщо випадково передати неправильну кількість - що буде?
2. Код жахливий, але то біс з ним.
3. Нащо передавати параметром методу класу елемент класу? Метод і так знає, які в класі елементи.
4. Де саме вони передаються? Не бачу. Який файл, який рядок?

9 Востаннє редагувалося Logans (30.03.2014 16:22:47)

Re: Передача та отримання масива

koala написав:

1. Потенційна проблема: кількість слів випливає з тексту, а якщо випадково передати неправильну кількість - що буде?
2. Код жахливий, але то біс з ним.
3. Нащо передавати параметром методу класу елемент класу? Метод і так знає, які в класі елементи.
4. Де саме вони передаються? Не бачу. Який файл, який рядок?

1. Кількість слів рахується та передається правильно.
2. Чи це в оформленні, чи і логіці коду? Скажіть будь-ласка, як можна зробити його не таким жахливим?
3. Виправив, дякую.
4. Це відбувається в головній програмі а саме:

Одна з процедур головної форми
MainText* originalText = new MainText;
ShingleText* originalShingles = new  ShingleText;

MainText* suspectText  = new MainText;
ShingleText* suspectShingles = new  ShingleText;

CheckText* Check = new CheckText;

string originalTemp = sysStringToStdString(richTextBox1 -> Text);
string suspectTemp  = sysStringToStdString(richTextBox2 -> Text);

/*--------------------------------------------------------------------*/

originalText -> setInputText(originalTemp);
originalText -> changeText();
originalText -> setWordCount(originalText -> getInputText());
originalShingles -> createShingles(originalText -> getInputText(), 
                                   originalText -> getWordCount());
originalShingles -> sortArrayShingle();

/*--------------------------------------------------------------------*/

suspectText -> setInputText(suspectTemp);
suspectText -> changeText();
suspectText -> setWordCount(suspectText  -> getInputText());
suspectShingles -> createShingles(suspectText  -> getInputText(), 
                                  suspectText  -> getWordCount());
suspectShingles -> sortArrayShingle();

/*--------------------------------------------------------------------*/

Check -> setArrayResult(originalShingles -> getShingle(), 
                        suspectShingles -> getShingle(), 
                        originalShingles -> getShingleSize(), 
                        suspectShingles -> getShingleSize());

10 Востаннє редагувалося koala (30.03.2014 17:27:35)

Re: Передача та отримання масива

Боюся, що всього цього мені не досить, щоб вказати на помилку. Зазвичай просять показати мінімальний шматок коду, що демонструє проблему. Код, який не можна скомпілювати, вочевидь, нічого не демонструє.
Стосовно якості коду:
1. Користуйтеся конструкторами, створення і ініціалізація мають відбуватися одночасно (вкрай бажано).
Не

ShingleText* originalShingles = new  ShingleText;
...
originalShingles -> createShingles(originalText -> getInputText(), 
                                   originalText -> getWordCount());

а

ShingleText* originalShingles = new  ShingleText(originalText -> getInputText(), 
                                   originalText -> getWordCount());

2. Ви передаєте в функції кілька параметрів об'єкту, хоча краще передати сам об'єкт (чи посилання на нього) зі всіма параметрами.
Не

originalShingles -> createShingles(originalText -> getInputText(), 
                                   originalText -> getWordCount());

а

originalShingles -> createShingles( originalText );

Не

Check -> setArrayResult(originalShingles -> getShingle(), 
                        suspectShingles -> getShingle(), 
                        originalShingles -> getShingleSize(), 
                        suspectShingles -> getShingleSize());

а

Check -> setArrayResult( originalShingles, suspectShingles );

3. Не користуйтеся "магічними числами":
Не

shingleArray = new string[_wordCount - 2];

а

const int shingleSize = 3;
...
shingleArray = new string[_wordCount - shingleSize + 1];

4. В createShingles ви робите вкрай неефективно. Алгоритм має перебирати всі слова в рядку і знаходити їхні позиції за один прохід, наприклад, у відповідний масив (пар позиція - довжина, скажімо), а потім можете збирати їх в свої шингли. Ще краще замість масиву використовувати чергу, їх для того і придумали. Ви ж замість  цього кілька разів шукаєте один і той самий пробіл різними функціями.

Подякували: Logans1

11 Востаннє редагувалося Logans (30.03.2014 20:19:48)

Re: Передача та отримання масива

koala дуже вам дякую. Проблему з масивами вирішив, використавши пунк №2 який ви описали вище.

пункт №2

[img]http://cdn.домен агресора/uploads/prod/2014/03/30/f6d/cf0/b263ffaf5fb5ce1befa3fd145e05df3a5fc4cdef.jpg[/img]