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

Переменная в качестве номера элемента массива. Array[Var] - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Dmirtiy Vovk
4 / 4 / 0
Регистрация: 07.08.2014
Сообщений: 164
07.08.2014, 13:38     Переменная в качестве номера элемента массива. Array[Var] #1
Мне нужно изменяя некую переменную Var обращатся к различным элементам массива Array[Var].

Компилятор не выдаёт ошибок, но код выполняется не так, как задумано,

Например
C++
1
SomeVar = Array[Var] // в лучшем случае получается что SomeVar принимает значение Var.
Короче не работает, и как я понимаю и не должно.

Помогите придумать выход из ситуации, иначе я просто разочаруюсь в этом очень сложном и очень безпомощьном языке С++.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.08.2014, 13:38     Переменная в качестве номера элемента массива. Array[Var]
Посмотрите здесь:

C++ Нахождения номера самого большего элемента массива целых чисел
Массивы (переменная в качестве размера для массива) C++
C++ Вычислить сумму элементов массива, порядковые номера которых совпадают со значением этого элемента
C++ Зачем взятие адреса нулевого элемента массива, если сама переменная и так его содержит?
Составить программу для нахождения первого элемента массива меньше десяти и его номера C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dmirtiy Vovk
4 / 4 / 0
Регистрация: 07.08.2014
Сообщений: 164
07.08.2014, 20:53  [ТС]     Переменная в качестве номера элемента массива. Array[Var] #21
Это НЕ работает(( строчка ничего не делает с переменной.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dimabubyakin
 Аватар для dimabubyakin
158 / 123 / 44
Регистрация: 16.10.2013
Сообщений: 1,732
Завершенные тесты: 5
07.08.2014, 21:09     Переменная в качестве номера элемента массива. Array[Var] #22
Цитата Сообщение от Dmirtiy Vovk Посмотреть сообщение
Это НЕ работает(( строчка ничего не делает с переменной.
Почему?
C++
1
SomeVar = Array[Var];
Переменной SomeVar присваивается значение массива Array, с индексом Var
Что здесь может быть не так?
Dmirtiy Vovk
4 / 4 / 0
Регистрация: 07.08.2014
Сообщений: 164
07.08.2014, 21:20  [ТС]     Переменная в качестве номера элемента массива. Array[Var] #23
Вот почему, если прошагать, то строчка TempVar = Leds100A[LedNum]; игнорируется.

Зато ранее я успешно использовал заполнение массива по типу:

for(int Element=0,Element < 42, Element++) {
Leds100A[Element] = 12345;
}

Сдесь катит.
Миниатюры
Переменная в качестве номера элемента массива. Array[Var]  
DrOffset
6460 / 3834 / 885
Регистрация: 30.01.2014
Сообщений: 6,629
07.08.2014, 21:27     Переменная в качестве номера элемента массива. Array[Var] #24
Цитата Сообщение от Dmirtiy Vovk Посмотреть сообщение
Помогите придумать выход из ситуации, иначе я просто разочаруюсь в этом очень сложном и очень безпомощьном языке С++.
Отставить панику.
Цитата Сообщение от Dmirtiy Vovk Посмотреть сообщение
Короче не работает, и как я понимаю и не должно.
Должно.

Не мог бы ты быть так любезен и выложить сюда целиком файлик led42.cpp и h-файл у нему (если есть).
А пока общий совет дам. Прежде чем программировать микроконтроллеры, неплохо было бы попрактиковаться в обычных условиях на своем PC, пописать консольные программки или что-то вроде того.
Dmirtiy Vovk
4 / 4 / 0
Регистрация: 07.08.2014
Сообщений: 164
07.08.2014, 21:40  [ТС]     Переменная в качестве номера элемента массива. Array[Var] #25
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
/*Библиотеки*/
#define F_CPU 8000000UL
#include <util/delay.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include <avr/pgmspace.h>
#include <math.h>
 
/*Переменные*/
signed int GlobalTime;
int Line = 1, Column = 1;
int LedNum;
int CurrentDurationEffect;//Переменная хранящая значение длительности эффекта.
int Leds100A[42];//Массив для временного хранения яркости 100.
int ElementFromLedArray;//Текущий элемент массива яркости 100.
int TempVar;//Переменная для хранения промежуточных результатов.
 
/*Прототипы функций:*/
char GetEffect(char);
void SimplyIn();
//char PWMtoLed(char);//Функция генерации шим в нужный диод.
    
void init ()//Загрузка портов
{
sei(); //Разрешение глобальных прерываний , флаг I 
DDRD  = 0b00111111;//Port D and A to output
DDRA  = 0b01111111;
//PORTD = 0b00000001;
//PORTA = 0b00000001;
//PORTB = 0b00000100;//Подтягивающий резистор на PORTB.2
 
//INT2
GICR  = 0b00100000;//Разрешение прерывания по INT0 - INT2.
MCUCSR = 0b01000000;// Прерывание по rising 
//GIFR Это флаги возникших прерываний INTF0 - INTF2. При входе в вектор прерывания они сбрасываются.
 
//TIMER 0
TCCR0 = 0b00000101;//Предделитель частоты 1024.
OCR0  = 0b11101010;//Прерывание при совпадении с 234х1024 ~ 30 ms.
TIMSK = 0b00000010;//Прерывание по Compare Match OCR0
 
//TIMER 1
//TCCR1B = 0b00000101;// Предделитель 1024
//TIMSK =  0b00000100;// Разрешить прерывание для OverFlow Timer 1
//TIMER 2
//TCCR2 = 0b00000101;//Предделитель частоты 1024.
//TIMSK = 0b10000000;//Прерывание по Compare Match OCR2
//OCR2 = 0b11101010;//Прерывание при совпадении с 234х1024 ~ 30 ms.
}
 
ISR(TIMER0_COMP_vect)
{if(GlobalTime > 65000)
 GlobalTime = 0;
 else
 GlobalTime += 30;  
}
 
ISR (INT2_vect)
{
 GlobalTime = 0;
}
 
void SimplyIn(){
    srand(OCR0);
    ElementFromLedArray = 0;//Сбросим на первый элемент
    
    while(ElementFromLedArray<42) {
    Leds100A[ElementFromLedArray] = 3000 + (rand()%2001 - 1000);
    ++ElementFromLedArray;//Увеличиваем элемент массива
    }
    
    //PORTA = 1;
    //PORTD = 1;
    Column = 1;
    Line = 1;
    CurrentDurationEffect = 4000;
    
    //Конфигурация таймера
    GICR = 0;//Запретить прерывания на кнопке INT 2
    OCR0 = 0;//Первый диод не загорится
    TCCR2 |= 0x01;//Предделитель отключен.
    TCCR2 |= 1<<COM21;//Прямой режим Fast PWM
    
    
    GlobalTime = 0;
    TCNT0 = 0;//Обнулить счетчик
    while(CurrentDurationEffect>GlobalTime) {
    
              PORTD = 1 << (Column-1);
              PORTA = 1 << (Line-1);
              LedNum = (Line-1)*6 + Column;
              TempVar = Leds100A[LedNum];
              TempVar = TempVar - GlobalTime;
              TempVar = TempVar * 100;
              TempVar = TempVar / Leds100A[LedNum];
              //TempVar = round(TempVar);
              //TempVar = round((Leds100A[LedNum-1] - GlobalTime) * 100/Leds100A[LedNum-1]);
              OCR2 = TempVar*2.56;
              //OCR2 = round((Leds100A[LedNum-1] - GlobalTime) * 100/Leds100A[LedNum-1]);
              _delay_us(50);
              if(Column != 6)
              ++Column;
              else if(Line == 7)
                   Line = 1;
                   else
                   ++Line;
    }
    
    
    
    TCCR2 = 0;//Отключить ШИМ
    GICR = 0b00100000;//Разрешение прерывания по INT0 - INT2.
}
 
//Программа определения характеристик появления
char GetEffect(char FadeInOrOut)//if Fade in - param = 0, for FadeOut = 1.
{
 if(FadeInOrOut == 0) { SimplyIn(); }
 return 0;
}
 
 
void working()
{             
              do {
              PORTD = 1 << (Column-1);
              PORTA = 1 << (Line-1);
              _delay_us(50);
              LedNum = (Line-1)*6 + Column;
              if(Column == 6)
              { Column = 1;
                if(Line == 7)
                { Line = 1; }
                else
                { ++Line; }
              }
              else
              { ++Column; }
            
              }
              while(LedNum < 42);
}
 
int main()
{  
init();//Один раз инициализируемся
while(1) {
             
             GetEffect (0);
             
             GlobalTime = 0;//Сбросить время перед использованием.
             while(GlobalTime < 20000)  
             { working();}
             
             PORTA = 0x00;
             PORTD = 0x00;
             _delay_ms(1000);
             
}
}
Добавлено через 2 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
и h-файл у нему (если есть).
Так это же вроде результат компиляции. А зачем мне такая компиляция(((

Добавлено через 4 минуты
DrOffset, ты работаешь с Atmel Studio? Почему она пропускает строчки???
Ставлю точки останова, жмакаю F5 , а она нагло перепрыгивает некоторые строки, причем не всегда...
а например при входе в блок(цикл) один раз перепрыгивает или выполняет код неадекватно, затем нормально...
а некоторые строки тупо перепрыгивает всегда!!!
DrOffset
6460 / 3834 / 885
Регистрация: 30.01.2014
Сообщений: 6,629
07.08.2014, 21:45     Переменная в качестве номера элемента массива. Array[Var] #26
Dmirtiy Vovk, еще такой вопрос. Какая разрядность у твоего микроконтроллера?

Добавлено через 2 минуты
Цитата Сообщение от Dmirtiy Vovk Посмотреть сообщение
Ставлю точки останова, жмакаю F5 , а она нагло перепрыгивает некоторые строки, причем не всегда..
Ассемблер надо смотреть, чтобы понять что там происходит. Пока что еще мало информации, чтобы делать выводы.
В штатном режиме такого быть не должно.
Dmirtiy Vovk
4 / 4 / 0
Регистрация: 07.08.2014
Сообщений: 164
07.08.2014, 21:48  [ТС]     Переменная в качестве номера элемента массива. Array[Var] #27
DrOffset, 8 бит, atmega32. Но в настройках стоит

Toolchain > Package Configuration = Atmel AVR 32 bit (C language). Хотя проэкт создавался как C++.

Настройки менять - об стену горох ,остается всегда Atmel AVR 32 bit (C language).
DrOffset
6460 / 3834 / 885
Регистрация: 30.01.2014
Сообщений: 6,629
07.08.2014, 23:10     Переменная в качестве номера элемента массива. Array[Var] #28
Dmirtiy Vovk, ну в общем из того, что ты дал, я понял одно: у тебя слишком много глобальных переменных. Похоже что память кончилась. Размер кода для глобальных переменных обычно больше, чем для локальных. Перерабатывай архитектуру, используй минимально необходимые типы данных. int явно слишком много для твоей задачи. Нет необходимости постоянно держать в глобале какие-то данные (или если они действительно нужны, то лучше объединить их в структуры). Программирование микроконтроллеров сильно отличается от прикладного, поэтому тут могут быть еще какие-то ограничения, в зависимости от твоей железки.
Dmirtiy Vovk
4 / 4 / 0
Регистрация: 07.08.2014
Сообщений: 164
08.08.2014, 01:19  [ТС]     Переменная в качестве номера элемента массива. Array[Var] #29
DrOffset, Стояли не только int. Это я уже поменял когда возникла проблема, чтобы убедиться что разные типы данных делают проблему.

Массив на 42 элемента по 2 байта это 84 байта + 7 переменных по 2 байта = 98 байт ??
При том что в микросхеме 2кб памяти... как ни крути памяти достаточно(((((
_Ivana
2190 / 1395 / 124
Регистрация: 01.03.2013
Сообщений: 4,152
Записей в блоге: 2
08.08.2014, 08:44     Переменная в качестве номера элемента массива. Array[Var] #30
Цитата Сообщение от Dmirtiy Vovk Посмотреть сообщение
Почему она пропускает строчки???
Потому что в действительности (скомпилированном машинном коде) все не так, как в фантазиях разработчика и сиплюсовых строчках на экране. А если еще и оптимизация стоит, да нужные volatile переменные не обозваны, то еще не такее...
Le_Mon
 Аватар для Le_Mon
0 / 0 / 0
Регистрация: 08.08.2014
Сообщений: 16
08.08.2014, 09:39     Переменная в качестве номера элемента массива. Array[Var] #31
Да, код рабочий
DrOffset
6460 / 3834 / 885
Регистрация: 30.01.2014
Сообщений: 6,629
08.08.2014, 13:31     Переменная в качестве номера элемента массива. Array[Var] #32
Цитата Сообщение от Dmirtiy Vovk Посмотреть сообщение
При том что в микросхеме 2кб памяти
Тогда volatile поставь.
C++
1
volatile int var = 0;
и т.д.
Dmirtiy Vovk
4 / 4 / 0
Регистрация: 07.08.2014
Сообщений: 164
09.08.2014, 05:08  [ТС]     Переменная в качестве номера элемента массива. Array[Var] #33
DrOffset, Да , это помогло, а еще помогает полное отключение оптимизации, но тогда библиотека delay.h предупреждает о неточности счета, как я понимаю...

Пока не закрываю тему =)
DrOffset
6460 / 3834 / 885
Регистрация: 30.01.2014
Сообщений: 6,629
09.08.2014, 11:41     Переменная в качестве номера элемента массива. Array[Var] #34
Dmirtiy Vovk, я все-таки буду настаивать на том, что лучший вариант - это избавиться от глобальных переменных вообще. В твоем варианте это можно сделать вполне.
Dmirtiy Vovk
4 / 4 / 0
Регистрация: 07.08.2014
Сообщений: 164
09.08.2014, 12:38  [ТС]     Переменная в качестве номера элемента массива. Array[Var] #35
DrOffset, Я попробую, но у меня с ними напряженные отношения.
Зачем они вобще нужны если работают только внутри блока?
Technogen
9 / 9 / 0
Регистрация: 14.02.2011
Сообщений: 23
09.08.2014, 13:10     Переменная в качестве номера элемента массива. Array[Var] #36
Я извиняюсь, просто тут обсуждают тему с массивами, просто хочу спросить ,кто знает,я читаю книгу С,Дэвис. C++ для чайников 5-е издание, так вот там на странице 96 автор пишет ,что если массив инициализировать как
C++
1
floatArray[25] = {1.0};
то все 25 элементов массива инициализируются как 1.0.Но после компиляции явижу только первый т.е. нулевой индекс как 1.0, а остальные 24 идут как 0.Я что то не пойму, вроде же остальные со слов автора должны идти по 1.0 а не по 0?Или как?Компилятор от Visual studio 2013
Dmirtiy Vovk
4 / 4 / 0
Регистрация: 07.08.2014
Сообщений: 164
09.08.2014, 14:14  [ТС]     Переменная в качестве номера элемента массива. Array[Var] #37
Technogen, Насколько мне извесно , твой компилятор всё правильно делает.

float Array[25] = {1.0,,1.0} // Нулевой элемент будет 1.0 и второй элемент будет 1.0, те что не указаны будут нулями, автор или ты ошибся наверное.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
09.08.2014, 14:47     Переменная в качестве номера элемента массива. Array[Var] #38
Цитата Сообщение от Dmirtiy Vovk Посмотреть сообщение
float Array[25] = {1.0,,1.0}
Такая запись не является допустимой в C++. Нулями инициализируются только последние элементы, пропускать значения нельзя. Это похоже на задание параметров функций по умолчанию. Умолчания могут использовать только для непрерывного набора аргументов с конца списка.
Цитата Сообщение от Technogen Посмотреть сообщение
то все 25 элементов массива инициализируются как 1.0.
Это не правда. Для установки не нулевых значений нужно так или иначе провести явную инициализацию для этих элементов.
Technogen
9 / 9 / 0
Регистрация: 14.02.2011
Сообщений: 23
09.08.2014, 18:24     Переменная в качестве номера элемента массива. Array[Var] #39
Цитата Сообщение от Dmirtiy Vovk
автор или ты ошибся наверное.
Вот четко цитата из книги:
Цитата Сообщение от С,Дэвис. C++ для чайников 5-е издание (96-я стр.)
Все элементы массива можно инициализировать одним и тем же значением, указав его
только один раз. Например, далее все 25 элементов массива floatArray инициализируются
значением 1.0.
C++
1
float floatArray[25] = {1.0};
Цитата Сообщение от Tulosba
Это не правда
Я чо так подумал, может думаю раньше в языке так было или компилятор раньше так допускал, книга то старая очень.Автор использовал Dev-C++ 4.9.8.0 (2003-03-26)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.08.2014, 19:38     Переменная в качестве номера элемента массива. Array[Var]
Еще ссылки по теме:

C++ Составить программу для нахождения номера максимального элемента массива
C++ Описать процедуру NminMax(A,N,NMin,NMax), находящую номера минимального и максимального элемента массива А
C++ Переменная в качестве размера массива

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

Или воспользуйтесь поиском по форуму:
Dmirtiy Vovk
4 / 4 / 0
Регистрация: 07.08.2014
Сообщений: 164
09.08.2014, 19:38  [ТС]     Переменная в качестве номера элемента массива. Array[Var] #40
Technogen, Выкинь все книжки, бери и пиши, даже если не знаешь, я вот тоже ничего не знаю))
По-моему лучше искать информацию только для текущей задачи, чем переворачивать учебники.
Yandex
Объявления
09.08.2014, 19:38     Переменная в качестве номера элемента массива. Array[Var]
Ответ Создать тему
Опции темы

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