The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
значение переменной в строковом массиве, !*! creapt, 02-Дек-17, 23:17  [смотреть все]
Подскажите пожалуйста.
С++

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

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

  • значение переменной в строковом массиве, !*! pavlinux, 03:47 , 04-Дек-17 (1)
    > OCR_sh[0]=100;

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

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

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

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

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

        • значение переменной в строковом массиве, !*! pavlinux, 22:44 , 04-Дек-17 (5)
          > ... но это немного не то, что хотел.

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


          > 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, 22:35 , 04-Дек-17 (4)
        > У него нет переменной 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, 23:04 , 04-Дек-17 (6)
          >> Он не может присвоить значение 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, 23:12 , 04-Дек-17 (7)
            > Напечатает то ли

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

            > то ли... то ли ...то ли
            > 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




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру