URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 10191
[ Назад ]

Исходное сообщение
"значение переменной в строковом массиве"

Отправлено creapt , 02-Дек-17 23:17 
Подскажите пожалуйста.
С++

char OCR_sh[3][5]={"OCR2","OCR1A","OCR1B"};

например: нужно присвоить значение 100 переменной OCR2 (OCR_sh[0]) и в дальнейшем изменять ее значение
OCR_sh[0]=100;
Как, какую функцию применить?


Содержание

Сообщения в этом обсуждении
"значение переменной в строковом массиве"
Отправлено pavlinux , 04-Дек-17 03:47 
> OCR_sh[0]=100;

strcpy(OCR_sh[0], "100");


"значение переменной в строковом массиве"
Отправлено ACCA , 04-Дек-17 20:28 
  • У него нет переменной OCR2
  • Он не может присвоить значение 100 элементу массива OCR_sh[0], у них тип разный
  • Строки "OCR1A" и "OCR1B" в его примере занимают по 6 байтов, он уже вылез за границы char[5]. Хорошо, если компилятор углядит и отругает
  • Ему нельзя пользоваться strcpy, разобьёт и руки порежет. Только strncpy


  • "значение переменной в строковом массиве"
    Отправлено creapt , 04-Дек-17 21:50 
    OCR2, OCR1B, OCR1A это регистры.
    Опишу подробнее: нужно регистры поместить в массив, сравнивать и изменять их значения.

    запись strcpy(OCR_sh[0], "100"); работает, но это немного не то, что хотел.

    OCR_sh[3][5]={"OCR2","OCR1A","OCR1B"}; - возможно, это я неверно написал.


    "значение переменной в строковом массиве"
    Отправлено pavlinux , 04-Дек-17 22:44 
    > ... но это немного не то, что хотел.

    Какой вопрос, такой ответ. :)


    > OCR_sh[3][5]={"OCR2","OCR1A","OCR1B"}; - возможно, это я неверно написал.

    Ты тут написал двухмерный массив из элементов типа char, если его раскрутить, то выглядеть будет так:

    OCR_sh[3][5]= {{'O','C','R','2','\0'}, {'O','C','R','1','A','\0'}, {'O','C','R','1','B','\0'}};

      
    Каждый элемент в кавычках и есть значение переменной, и их 15 штук.
    100 можно присвоить только одной из них.

    OCR_sh[0][0]=100;  


    "значение переменной в строковом массиве"
    Отправлено pavlinux , 04-Дек-17 22:35 
    > У него нет переменной OCR2

    AI скорректировал вопрос.

    > Он не может присвоить значение 100 элементу массива OCR_sh[0], у них тип разный

    Я же смог :) В С всё int, кроме float (этот тоже int, но замороченный)  


    На самом деле, это грязные хаки олдскульных микроконтрольщиков, всех кто пишет "для себя".

    Так они коряво объявляют: Есть три строки, не больше 5 байт в каждой  

    char OCR_sh[3][5]={"OCR2","OCR1A","OCR1B"};

    Так они заменяют строки: зато гарантия, что лишнее не попадёт в регистры.  

    strcpy(OCR_sh[0], "Вротмне");
    strcpy(OCR_sh[1], "ноги,");
    strcpy(OCR_sh[2], "дайтедве");

    Не все компиляторы проверяют размер переменных и матерятся

    > [li] Строки "OCR1A" и "OCR1B" в его примере занимают по 6 байтов,

    Пофег сколько занимают, выделено только 3 раза по 5  

    > он уже вылез за границы char[5]. Хорошо, если компилятор углядит и
    > отругает

    Нед, размер задаётся объявлением: OCR_sh[3][5] и того 15 раз по CHAR_BIT

    > Ему нельзя пользоваться strcpy, разобьёт и руки порежет. Только strncpy

    если всё под контролем, то можно.


    "значение переменной в строковом массиве"
    Отправлено ACCA , 04-Дек-17 23:04 
    >> Он не может присвоить значение 100 элементу массива OCR_sh[0], у них тип разный
    > Я же смог :) В С всё int, кроме float (этот тоже
    > int, но замороченный)

    Ты старый жулик, путающий студентов. "100" и 100 - это очень разные вещи.


    >> [li] Строки "OCR1A" и "OCR1B" в его примере занимают по 6 байтов,
    > Пофег сколько занимают, выделено только 3 раза по 5

    Ни разу не пофиг, оно же инициализировано. Поэтому
       puts(OCR_sh[1]);
       puts(OCR_sh[2]);

    Напечатает то ли
       OCR1AOCR1B
       OCR1B

    то ли
       OCR1A


    то ли
       OCR1A
       OCR1B

    Это если выравнивание выручит.


    > Нед, размер задаётся объявлением: OCR_sh[3][5] и того 15 раз по CHAR_BIT

    Потому и можешь наползти 6-байтовыми строками друг на друга, а последней строкой - на что повезёт.


    >> Ему нельзя пользоваться strcpy, разобьёт и руки порежет. Только strncpy
    > если всё под контролем, то можно.

    Намекаешь, что он не поленится проверить длины строк и размеры буферов?


    "значение переменной в строковом массиве"
    Отправлено pavlinux , 04-Дек-17 23:12 
    > Напечатает то ли

    Ничего не знаю, в ТЗ не было условия про печать :)

    > то ли... то ли ...то ли
    > puts(OCR_sh[2]);

    Такой хак с двухмерным масcивом, превратит его в указатель (начинающейся с адреса OCR_sh[2][0]),
    на одномерный массив размером [5]

    puts((char(*)[5])OCR_sh[2]);

    > Намекаешь, что он не поленится проверить длины строк и размеры буферов?

    Я думаю автор вааааще невдупляет чего творит :)


    Или препод спецом скопипастил такой гадцкий код.
    OCR1A, OCR1B - это регистры таймера AVR ATmega
    http://dfe.petrsu.ru/koi/posob/avrlab/mega16tcnt1.html