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

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

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

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

08.09.2014, 11:18. Просмотров 200. Ответов 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-а.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.09.2014, 11:18     В массив поступают не все элементы
Посмотрите здесь:

Сжать массив, удалив из него все элементы, которые лежат в интервале [a,b]. Освободившиеся в конце элементы массива заполнить нулями. C++
C++ дан целочисленный массив заменить в нём все элементы
C++ Массив: Удалить из массива все отрицательные элементы.
Все положительные элементы записать в массив Y(k), а все отрицательные элементы - в массив Z(m) C++
C++ Из массива X(N) все положительные элементы записать в массив Y(k).
C++ Верно ли,что все элементы массива B входят в массив A
Массив (Заменить все элементы их квадратами) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
6189 / 5792 / 1875
Регистрация: 18.12.2011
Сообщений: 14,797
Завершенные тесты: 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;
}
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[])
- все нормально.
DrOffset
6840 / 4051 / 924
Регистрация: 30.01.2014
Сообщений: 6,855
08.09.2014, 13:05     В массив поступают не все элементы #4
iSerg, надо посмотреть код calculateTimeAndReport.
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;
        }
        
    }
}
DrOffset
6840 / 4051 / 924
Регистрация: 30.01.2014
Сообщений: 6,855
08.09.2014, 15:01     В массив поступают не все элементы #6
Цитата Сообщение от iSerg Посмотреть сообщение
_green[3]
А зачем ты 4й элемент выводишь? )
Нумерация-то с нуля, значит надо выводит _green[2] - это будет 3й элемент.
iSerg
2 / 2 / 1
Регистрация: 20.08.2012
Сообщений: 29
08.09.2014, 15:03  [ТС]     В массив поступают не все элементы #7
Точно. Вот это я туплю . Сказывается неопытность в программировании (четвертый день подряд). Спасибо.
DrOffset
6840 / 4051 / 924
Регистрация: 30.01.2014
Сообщений: 6,855
08.09.2014, 15:05     В массив поступают не все элементы #8
Цитата Сообщение от iSerg Посмотреть сообщение
std::cout << (sizeof(&_green) / sizeof(int)) << "\n";
Так ты размер массива не узнаешь. Получил размер указателя, поделил его на sizeof(int). Что это дало?
Для массива надо отдельным значением передавать размер, потому что массивы преобразуются к указателям при передаче в функцию.
iSerg
2 / 2 / 1
Регистрация: 20.08.2012
Сообщений: 29
08.09.2014, 15:13  [ТС]     В массив поступают не все элементы #9
Цитата Сообщение от DrOffset Посмотреть сообщение
Так ты размер массива не узнаешь. Получил размер указателя, поделил его на sizeof(int). Что это дало?
Для массива надо отдельным значением передавать размер, потому что массивы преобразуются к указателям при передаче в функцию.
я уже вчера понял. Спасибо.
DrOffset
6840 / 4051 / 924
Регистрация: 30.01.2014
Сообщений: 6,855
08.09.2014, 15:14     В массив поступают не все элементы #10
Цитата Сообщение от iSerg Посмотреть сообщение
int greens[sizeSeconds];
Кстати, вот эта запись, которую тебе выше правильно посоветовали заменить на динамическое выделение памяти - это GCC-шное расширение для С++.
Имеется в виду задание размерности массива значением неизвестным на этапе компиляции. Т.е. это нестандартная конструкция, работает только в gcc\mingw. Просто имей это в виду.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.09.2014, 15:17     В массив поступают не все элементы
Еще ссылки по теме:

Переписать в массив М1 все отрицательные элементы массива М C++
Переписать элементы массива a в массив в, удвоив все элементы C++
Дан одномерный массив, найти все отрицательные элементы; элементы, большие данного числа n C++
C++ Переписать в другой массив все положительные элементы массива
Дан массив А (17) все элементы выше 0 на 5, а остальные перенесите на 0 C++

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

Или воспользуйтесь поиском по форуму:
iSerg
2 / 2 / 1
Регистрация: 20.08.2012
Сообщений: 29
08.09.2014, 15:17  [ТС]     В массив поступают не все элементы #11
Цитата Сообщение от DrOffset Посмотреть сообщение
Кстати, вот эта запись, которую тебе выше правильно посоветовали заменить на динамическое выделение памяти - это GCC-шное расширение для С++.
Имеется в виду задание размерности массива значением неизвестным на этапе компиляции. Т.е. это нестандартная конструкция, работает только в gcc\mingw. Просто имей это в виду.
Спасибо. Буду иметь в виду. Давно уже ничего не писал на плюсах. В основном на Objective-C. Начинаешь понемногу путаться.
Yandex
Объявления
08.09.2014, 15:17     В массив поступают не все элементы
Ответ Создать тему
Опции темы

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