Loading...

Във форума е въведено ограничение, което позволява на потребителите единствено да разглеждат публикуваните въпроси.

sun_seeker avatar sun_seeker 15 Точки

Въпрос относно функций и масиви

Здравейте,

Уточнявам, че говоря конкретно за  2-ра и 3-та задача, от домашното за judge, но предполагам ще имам грешки и за напред. 

Описвам едната грешка. Когато изнеса във функция масив и там му променям стойностите на елементите, при компилиране ми дава грешка точно на този ред, където презаписвам стойност в масива. Ако го оставя в int main(), всичко си работи. 

Другата грешка е подобна. Когато кода е във функция, този път int, всичко си работи, не дава грешка, но резултата е грешен. Ако го върна в main(), речултата е верен.

Гледах лекцията отново и отново, уж всичко правя както трябва пък явно не е. Не пускам кода тук за да не нарушавам правилата, но някакъв съвет къде може да греша?  

 

0
C++ Fundamentals
georgi.stef.georgiev avatar georgi.stef.georgiev 921 Точки

Здравей,

Пробвай да изолираш грешката, нещо различно е от това, че подаваш масива във функция. Ето код, който приема масив и му променя елементите във функция, и след това го печата - компилира се нормално без грешки:

#include<iostream>
using namespace std;

void modify(int arr[], int arrSize) {
    for (int i = 0; i < arrSize; i++) {
        arr[i] = i;
    }
}

int main() {
    int arr[10]{};

    modify(arr, 10);

    for (int i = 0; i < 10; i++) {
        cout << arr[i] << " ";
    }

    return 0;
}

Подаваш ли правилно масива като параметър? По правилен начин ли му достъпваш елементи? Да не би нещото, което се мъчиш да присвоиш върху елемент на масива да дава грешка, а не самото присвояване (примерно да имаш някакъв израз, който има грешка в себе си)?

Ако искаш може да публикуваш кода, но просто изтрий от него частта от функцията, която ти работи, и остави само тази, която ти дава грешка. Примерно:

void modify(int arr[], int arrSize) {
    ...
    arr[i] = i; // Тук ми дава грешка. Грешката е: [текст на грешката тук]
    ...
}

int main() {
    int arr[10]{};

    ...

    modify(arr, 10);

    ...

    return 0;
}

Обърни внимание, че в горния пример е ясно всяка променлива каква е (масивът, параметрите, само i не е ясно какво е, но го оставих така без цикъла защото кодът на функцията е само това, а исках да илюстрирам как да орежеш код от това, което публикуваш). И е много важно да ни кажеш каква е грешката. "Дава ми грешка" изобщо не помага, има причина тези грешки да ти се изписват долу, да си имат съобщение, понякога даже да си имат и номер - те ти помагат да разбереш какво точно не е наред на този ред.

Поздрави,

Жоро

0
sun_seeker avatar sun_seeker 15 Точки

Ето кода, поорязох го, но на последната лекция го обяснихте много добре, та едва ли има някой не разбрал как да реши задачата. 

 

  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6. void inputNumbers(vector<vector<int> > arrays, int numArrays, int numElements);
  7. void multiplication(vector<vector<int> > arrays, int numArrays, int numElements);
  8. void sumElements(vector<vector<int> > arrays, int numArrays, int numElements);
  9.  
  10. int main() {
  11.     
  12.     vector<vector<int> > arrays;
  13.     int numArrays;
  14.     int numElements;
  15.     
  16.     cin >> numArrays >> numElements;
  17.     
  18.     inputNumbers(arrays, numArrays, numElements);
  19.     multiplication(arrays, numArrays, numElements);
  20.     sumElements(arrays, numArrays, numElements);
  21.     
  22.     return 0;
  23. }
  24.  
  25. void inputNumbers(vector<vector<int> > arrays, int numArrays, int numElements){
  26. ..............
  27. }
  28.  
  29. // Грешката е на 36-ти ред: "Thread 1: EXC_BAD_ACCESS (code=1, address=0x0)"
  30. void multiplication(vector<vector<int> > arrays, int numArrays, int numElements){
  31.     int something = 0;
  32.     for(int b ......){
  33.         cin >> something;
  34.         for(int c ......){
  35.             
  36.             arrays[b][c] *= something;             // error?!
  37.         }
  38.     }
  39. }
  40. void sumElements(vector<vector<int> > arrays, int numArrays, int numElements){
  41. ...............
  42. }
  43.  
  44.  
  45.  
0
georgi.stef.georgiev avatar georgi.stef.georgiev 921 Точки

Ясно, значи проблемът не е компилационна грешка, а грешка по време на изпълнение - това също е важно.

Грешката, която получаваш, казва, че се опитваш да достъпиш памет, която не е твоя (по-конкретно изглежда сякаш достъпваш адрес 0). Това ме навежда на мисълта, че този vector<vector<int> > arrays няма толкова елементи, колкото смяташ че има.

Тук вече трябва да дебъгваш стъпка по стъпка. Първо хвани и си изпечатай всички стойности на arrays (т.е. изпечатай си входа, след като си го прочел). Виж дали arrays съдържа това, което очакваш, че съдържа като брой елементи. След това до колко стигат b и c (с които достъпваш елементи от arrays в циклите) - дали винаги стойностите им са по-малки от размерите на масивите.

Всъщност отсега виждам къде ти е грешката, като погледнах дефинициите на методите. За ориентир - пробвай да изпечаташ стойностите на arrays в края на inputNumbers (там сигурно ще е вярно), и след това пак ги изпечатай в началото на multiplication. Има ли разлика (изобщо има ли нещо в arrays когато влезеш в multiplication - даже, има ли нещо в arrays между извикването на inputNumbers и multiplication, тоест между 18 и 19 ред)? Масивите се подават по референция винаги, но vector как се подава на функция? inputNumbers върху оригиналния arrays ли работи или върху локално копие на arrays?

Ориентира ли се къде е проблемът? 

0
sun_seeker avatar sun_seeker 15 Точки

Така, в inputNumbers на финала всичко си е в arreys, но когато вляза в multiplication и искам да изпечатам arreys ми дава същата грешка. 

Дори сега направих нова функция, веднага след nputNumbers да ми изпечата arreys и пак ми дава същата грешка. 

Мисля, че се ориентирах. Ще прегледам пак лекцията и ще пробвам да оправя сам проблема. Благодаря за съвета. 

0
georgi.stef.georgiev avatar georgi.stef.georgiev 921 Точки

Точно. Проблемът ти идва от това, че векторът се приема по копие, не по референция. Все едно да направиш функция swap(int a, int b), вместо функция swap(int& a, int& b). При теб проблемът е едно към едно с този пример.

Успех!

0
georgi.stef.georgiev avatar georgi.stef.georgiev 921 Точки

Точно. Проблемът ти идва от това, че векторът се приема по копие, не по референция. Все едно да направиш функция swap(int a, int b), вместо функция swap(int& a, int& b). При теб проблемът е едно към едно с този пример.

Успех!

0
sun_seeker avatar sun_seeker 15 Точки

Готово! Отново благодаря! 

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.