Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
iSerg
2 / 2 / 1
Регистрация: 20.08.2012
Сообщений: 29
#1

В массив поступают не все элементы - C++

08.09.2014, 11:18. Просмотров 209. Ответов 10
Метки нет (Все метки)

Есть такой код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void TrafficLight::setTimeLights (int seconds[], int sizeSeconds) {
 
    // Doubling seconds per traffic light (greenyellow + red)
    int greens[sizeSeconds];
 
    for (int i = 0; i < sizeSeconds; i++) {
 
        seconds[i] *= 2;
        greens[i] = 1;
        std::cout << seconds[i];
 
    }
 
    this->calculateTimeAndReport(seconds, sizeSeconds, greens);
}
В метод передается массив секунд и количество элементов массива. В seconds все хорошо, поступают все элементы. В greens только первых два, остальных нет (количество элементов может быть разное. Что я делаю не так?

P.S. Например: Поступил массив секунд из трех элементов (30,25,35). В greens начальный старт, т.е. все равно 1. На выходе greens получается 1,1,0. Хотя вместо нуля должна быть 1-а.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.09.2014, 11:18
Здравствуйте! Я подобрал для вас темы с ответами на вопрос В массив поступают не все элементы (C++):

Из массива Х(N) все положительные элементы записать в массив У(К), а все отрицательные элементы – в массив Z(М)... - C++
Пожалуйста помогите решить задачку на си++, заранее спасибо Из массива Х(N) все положительные элементы записать в массив У(К), а все...

Массив: Сформировать третий массив, в который включить все отрицательные элементы массива А и все максимальные элементы массива В. - C++
Даны массивы целых чисел A и B. Сформировать третий массив, в который включить все отрицательные элементы массива А и все максимальные...

Все положительные элементы записать в массив Y(k), а все отрицательные элементы - в массив Z(m) - C++
Из массива X(N) все положительные элементы записать в массив Y(k), а все отрицательные элементы - в массив Z(m). Найти в каждом массиве...

Дан массив целых чисел из 10 элементов.Все элементы кратные 10 заменить 0;Все нечетные элементы удвоить, а четные уменьшить на 2; - C++
Дан массив целых чисел из 50 элементов. Все элементы кратные 10 заменить 0; Все нечетные элементы удвоить, а четные уменьшить на 2; ...

Дан массив A[1.50], элементы которого отличны от нуля. Расположить их в таком порядке, чтобы первыми были все положительные элементы, а затем - все о - C++
Дан массив A, элементы которого отличны от нуля. Расположить их в таком порядке, чтобы первыми были все положительные элементы, а затем -...

В массив X записать сначала все положительные элементы M1 а затем все отрицательные элементы M2 - C++
Из двух массивов M1(10) и M2(10) получить третийX( ) в массиве X записать вначале все положительные элементы массива M1 а затем все...

10
zss
Модератор
Эксперт С++
6404 / 5970 / 1945
Регистрация: 18.12.2011
Сообщений: 15,401
Завершенные тесты: 1
08.09.2014, 11:22 #2
Память надо выделять динамически
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void TrafficLight::setTimeLights (int seconds[], int sizeSeconds) {
 
    // Doubling seconds per traffic light (greenyellow + red)
    int* greens=new int[sizeSeconds];
 
    for (int i = 0; i < sizeSeconds; i++) {
 
        seconds[i] *= 2;
        greens[i] = 1;
        std::cout << seconds[i];
 
    }
    this->calculateTimeAndReport(seconds, sizeSeconds, greens);
    delete[] greens;
}
1
iSerg
2 / 2 / 1
Регистрация: 20.08.2012
Сообщений: 29
08.09.2014, 11:58  [ТС] #3
Спасибо. Но опять же наткнулся на другое. После его обработки в этом методе, я передаю его дальше и мне выводит: 1 1 536870912. До передачи в
C++
1
void TrafficLight::calculateTimeAndReport (int seconds[], int cntSec, int _green[])
- все нормально.
0
DrOffset
7321 / 4421 / 1001
Регистрация: 30.01.2014
Сообщений: 7,259
08.09.2014, 13:05 #4
iSerg, надо посмотреть код calculateTimeAndReport.
0
iSerg
2 / 2 / 1
Регистрация: 20.08.2012
Сообщений: 29
08.09.2014, 13:11  [ТС] #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
void TrafficLight::setTimeLights (int seconds[], int sizeSeconds) {
    
    // Doubling seconds per traffic light (greenyellow + red)
    int *greens = new int[sizeSeconds];
    
    for (int i = 0; i < sizeSeconds; i++) {
        
        seconds[i] *= 2;
        greens[i] = 1;
        std::cout << greens[i];
        
    }
    
    this->calculateTimeAndReport(seconds, sizeSeconds, greens);
}
 
void TrafficLight::calculateTimeAndReport (int seconds[], int cntSec, int _green[]) {
 
    bool catchAllGreenLights = false;
    std::cout << _green[0] << " " << _green[1] << " " << _green[3] << "\n";
    for (int i = 0; i < maxTime; i++) {
        
        // Check if timeline > (greenyellow time + red)
        for (int l = 0; l < cntSec; l++) {
 
            if (_green[l] > seconds[l]) {
                
                
                _green[l] = 1;
                catchAllGreenLights = true;
            } else {
                catchAllGreenLights = false;
                std::cout << (sizeof(&_green) / sizeof(int)) << "\n";
            }
            
        }
        
        std::cout << i << " " << _green[0] << " " << _green[1] << " " << _green[3] << "\n";
        
        if (catchAllGreenLights) {
            
//            i++;
//            std::cout << i << " " << _green[0] << " " << _green[1] << "\n";
            
            if (compareSecondsArrays(seconds, _green)) {
                
//                std::cout << i << " " << _green[0] << " " << _green[1] << "\n";
                break;
            }
        }
        
        for (int t = 0; t < cntSec; t++) {
            
            _green[t] += 1;
        }
        
    }
}
0
DrOffset
7321 / 4421 / 1001
Регистрация: 30.01.2014
Сообщений: 7,259
08.09.2014, 15:01 #6
Цитата Сообщение от iSerg Посмотреть сообщение
_green[3]
А зачем ты 4й элемент выводишь? )
Нумерация-то с нуля, значит надо выводит _green[2] - это будет 3й элемент.
1
iSerg
2 / 2 / 1
Регистрация: 20.08.2012
Сообщений: 29
08.09.2014, 15:03  [ТС] #7
Точно. Вот это я туплю . Сказывается неопытность в программировании (четвертый день подряд). Спасибо.
0
DrOffset
7321 / 4421 / 1001
Регистрация: 30.01.2014
Сообщений: 7,259
08.09.2014, 15:05 #8
Цитата Сообщение от iSerg Посмотреть сообщение
std::cout << (sizeof(&_green) / sizeof(int)) << "\n";
Так ты размер массива не узнаешь. Получил размер указателя, поделил его на sizeof(int). Что это дало?
Для массива надо отдельным значением передавать размер, потому что массивы преобразуются к указателям при передаче в функцию.
0
iSerg
2 / 2 / 1
Регистрация: 20.08.2012
Сообщений: 29
08.09.2014, 15:13  [ТС] #9
Цитата Сообщение от DrOffset Посмотреть сообщение
Так ты размер массива не узнаешь. Получил размер указателя, поделил его на sizeof(int). Что это дало?
Для массива надо отдельным значением передавать размер, потому что массивы преобразуются к указателям при передаче в функцию.
я уже вчера понял. Спасибо.
0
DrOffset
7321 / 4421 / 1001
Регистрация: 30.01.2014
Сообщений: 7,259
08.09.2014, 15:14 #10
Цитата Сообщение от iSerg Посмотреть сообщение
int greens[sizeSeconds];
Кстати, вот эта запись, которую тебе выше правильно посоветовали заменить на динамическое выделение памяти - это GCC-шное расширение для С++.
Имеется в виду задание размерности массива значением неизвестным на этапе компиляции. Т.е. это нестандартная конструкция, работает только в gcc\mingw. Просто имей это в виду.
1
iSerg
2 / 2 / 1
Регистрация: 20.08.2012
Сообщений: 29
08.09.2014, 15:17  [ТС] #11
Цитата Сообщение от DrOffset Посмотреть сообщение
Кстати, вот эта запись, которую тебе выше правильно посоветовали заменить на динамическое выделение памяти - это GCC-шное расширение для С++.
Имеется в виду задание размерности массива значением неизвестным на этапе компиляции. Т.е. это нестандартная конструкция, работает только в gcc\mingw. Просто имей это в виду.
Спасибо. Буду иметь в виду. Давно уже ничего не писал на плюсах. В основном на Objective-C. Начинаешь понемногу путаться.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.09.2014, 15:17
Привет! Вот еще темы с ответами:

Сформировать и вывести на экран новый массив, который будет содержать вначале все элементы массива A(0), затем все элементы массива B(4) - C++
Здравствуйте! Помогите написать парочку программ... 3. Даны массивы A(0) и B(4). Сформировать и вывести на экран новый массив,...

Ввести массив А. В массив В перенести все элементы массива А, стоящие правее максимального элемента, и имеющие нечетный индекс. Массив В отсортировать - C++
Добрый Вечер! Написал первую часть программы по этому заданию&quot;Ввести массив А. В массив В перенести все элементы массива А, стоящие правее...

Дан одномерный массив, найти все отрицательные элементы; элементы, большие данного числа n - C++
дан одномерный массив, найти 1)все отрицательные элементы 2) элементы, большие данного числа n 3)все элементы, начиная с n1-го по...

Из целочисленного массива Х все четные элементы записать в массив Y. Удалить в массивах максимальные элементы - C++
Из целочисленного массива Х(N) все четные элементы записать в массив Y(k). Удалить в массивах максимальные элементы. В программе написать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Yandex
Объявления
08.09.2014, 15:17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru