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

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

Восстановить пароль Регистрация
 
iSerg
2 / 2 / 1
Регистрация: 20.08.2012
Сообщений: 29
08.09.2014, 11:18     В массив поступают не все элементы #1
Есть такой код:

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     В массив поступают не все элементы
Посмотрите здесь:

C++ дан двумерный массив размерностью Н, заполненный целыми числами, все его отрицательные элементы записать в одномерный массив, все его положительные за
Все положительные элементы записать в массив Y(k), а все отрицательные элементы - в массив Z(m) C++
C++ Массив: Сформировать третий массив, в который включить все отрицательные элементы массива А и все максимальные элементы массива В.
Сформировать и вывести на экран новый массив, который будет содержать вначале все элементы массива A(0), затем все элементы массива B(4) C++
C++ Дан массив целых чисел из 10 элементов.Все элементы кратные 10 заменить 0;Все нечетные элементы удвоить, а четные уменьшить на 2;
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5944 / 5549 / 1783
Регистрация: 18.12.2011
Сообщений: 14,175
Завершенные тесты: 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
6426 / 3800 / 880
Регистрация: 30.01.2014
Сообщений: 6,594
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
6426 / 3800 / 880
Регистрация: 30.01.2014
Сообщений: 6,594
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
6426 / 3800 / 880
Регистрация: 30.01.2014
Сообщений: 6,594
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
6426 / 3800 / 880
Регистрация: 30.01.2014
Сообщений: 6,594
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     В массив поступают не все элементы
Еще ссылки по теме:

C++ Из массива Х(N) все положительные элементы записать в массив У(К), а все отрицательные элементы – в массив Z(М)...
Дан массив A[1.50], элементы которого отличны от нуля. Расположить их в таком порядке, чтобы первыми были все положительные элементы, а затем - все о C++
В массив X записать сначала все положительные элементы M1 а затем все отрицательные элементы M2 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     В массив поступают не все элементы
Ответ Создать тему
Опции темы

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