прямое смешение указателя "shar*stroka"

oleg_kazakof
Offline
Зарегистрирован: 24.04.2015



//IDE 1.6.6

// эта конструкция работает
      (*stroka)--[n];
      (*stroka)--[n];
      (*stroka)--[n];
      (*stroka)--[n];
      (*stroka)--[n];              //возвращаем указатель на начало строки
      Serial.println(stroka[n]);
      n++;
      (*stroka)++[n];
      (*stroka)++[n];
      (*stroka)++[n];
      (*stroka)++[n];
      (*stroka)++[n];

// тоже работает
   for (byte w = 0; w < 5; w++) {(*stroka)--[n];}//возвращаем указатель на начало строки
      Serial.println(stroka[n]);                            //печатаем строку n
      n++;
      for (byte w = 0; w < 5; w++) {(*stroka)++[n];}

// а как заставить работать явное смещение, где туплю?
      (*stroka)[n] = (*stroka)[n] - (*stroka)-5[n];
       
}

 

oleg_kazakof
Offline
Зарегистрирован: 24.04.2015

[code]
//работает 1.6.6 на мониторе "нет конца строки"
char* stroka[] = {
  "ZZZZZ",
  "XXXXX",
  "CCCCC",
  "VVVVV"
};
char st_byf [] = {"  "};
byte mas_sim = 20;// общее количество символов в массиве
void setup() {
  Serial.begin(9600);
}

void loop() {
  static byte n = 0; //номер символа в массиве
  static byte chislo_strok = 4; // число принимаемых строк
  byte kol_sim_v_stroke  = 5;            // количество символов в строке
  byte kol_sim_1 = kol_sim_v_stroke;

  if (chislo_strok > 0) {
    if (Serial.available() > 0) {
      chislo_strok--;
      while (Serial.available() > 0) {
        delay(10);
        if (kol_sim_v_stroke > 0) {
          (*stroka)[n] = Serial.read();// пишем символ
          (*stroka)++[n];              // СМЕЩАЕМ УКАЗАТЕЛЬ В СТРОКЕ
          kol_sim_v_stroke--;
        }
        else {st_byf[0] = Serial.read();}// если символов больше нужного  
      }
      while (kol_sim_v_stroke > 0) {
        kol_sim_v_stroke--;
        (*stroka)[n] = ' ';// дополняем строку пробелами если сиволов не хватает
        (*stroka)++[n];    // СМЕЩАЕМ УКАЗАТЕЛЬ В СТРОКЕ
      }
      for (byte w = 0; w < kol_sim_1; w++) {(*stroka)--[n];}//возвращаем указатель на начало строки
// (*stroka)[n] = ((*stroka)[n] -((*stroka)[n-5]));
      Serial.println(stroka[n]);                            //печатаем строку n
      n++;
      for (byte w = 0; w < kol_sim_1; w++) {(*stroka)++[n];}
    }
  }
  else {
    for (byte i = 0; i < mas_sim; i++) {
      (*stroka)--[n];
    }
    n = 0;                            //номер символа в массиве
    chislo_strok = 4;                 // число принимаемых строк
    Serial.println("  ::::::");
    for (byte i = 0; i < chislo_strok; i++) {
      Serial.println (stroka[i]);
    }
    Serial.println();
  }
}
[/code]
sadman41
Offline
Зарегистрирован: 19.10.2016

(*stroka)--[n]; - это на какой выставке современного искусства такое показывают?
Указатель или сам декрементируйте или индекс, к нему пристегнутый.

oleg_kazakof
Offline
Зарегистрирован: 24.04.2015

sadman41 пишет:
(*stroka)--[n]; - это на какой выставке современного искусства такое показывают? Указатель или сам декрементируйте или индекс, к нему пристегнутый.

но это же работает.

 

SergeiL
SergeiL аватар
Offline
Зарегистрирован: 05.11.2018

oleg_kazakof пишет:

sadman41 пишет:
(*stroka)--[n]; - это на какой выставке современного искусства такое показывают? Указатель или сам декрементируйте или индекс, к нему пристегнутый.

но это же работает.

Ну, то что оно работает, это не говорит, что написано согласно общепринятым правилам, и читаемо.

Например значение по  p[2] это та же самое, что и 2[p] тоже самое, что и *(p+2) - вопрос записи.

Но никто же не использует вариант 2[p].

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

А в чем , вообще, был вопрос ? Если это урок, то скорее как не нужно писать. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Олег, я не понял Вашей проблемы. Если объясните, то попробую помочь.

b707
Offline
Зарегистрирован: 26.05.2017

Коллеги, обратите внимание, что у ТС не просто символьный массив, а массив массивов.
Поэтому (*stroka)++[n] не такая уж ересь, это всего лишь следующий элемент из массива stroka

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

SergeiL пишет:

Например значение по p[2] это та же самое, что и 2[p] тоже самое, что и *(p+2) - вопрос записи.

Напрасно. Это секретные знания.

А если серьёзно, до такого человек должен сам доходить, когда готов - когда понимает логику синтаксиса и, стало быть, понимает, почему так. Если человеку сказать это, когда он еще не готов и не понимает, он такого может в своих кодах наворотить.

SergeiL пишет:

Но никто же не использует вариант 2[p].

Сильно сказано! Встречается.

oleg_kazakof
Offline
Зарегистрирован: 24.04.2015

ЕвгенийП пишет:

Олег, я не понял Вашей проблемы. Если объясните, то попробую помочь.

Как правильно синтаксически оформить строку 24 стартового топика чтобы она заработала, или это не возможно. Вопрос чисто из интереса, так как с циклами всё работает.

 

 

SergeiL
SergeiL аватар
Offline
Зарегистрирован: 05.11.2018

oleg_kazakof пишет:
Как правильно синтаксически оформить строку 24 стартового топика чтобы она заработала, или это не возможно. Вопрос чисто из интереса, так как с циклами всё работает.

А что вы хотите получить, можете словами написать?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

oleg_kazakof пишет:

Как правильно синтаксически оформить строку 24 стартового топика чтобы она заработала

Так вот я именно и не понял, что значит "заработала". Чего Вы от неё хотите? Объясните словами. А то Вы думаете, что все знают чего Вы там хотели сделать? Таки нет :-(

oleg_kazakof
Offline
Зарегистрирован: 24.04.2015

ЕвгенийП пишет:

oleg_kazakof пишет:

Как правильно синтаксически оформить строку 24 стартового топика чтобы она заработала

Так вот я именно и не понял, что значит "заработала". Чего Вы от неё хотите? Объясните словами. А то Вы думаете, что все знают чего Вы там хотели сделать? Таки нет :-(

заменить  цикл в строке 38  поста #2 на такую или подобную операцию, то есть сместить указатель на 5 позиций одним действием.

(*stroka)[n] = (*stroka)[n] - (*stroka)-5[n];

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

oleg_kazakof,

Вы изумительно умеет объяснять. Для того, чтобы "сместить указатель на 5 позиций" достаточно просто прибавить к нему 5 обычным сложением.

В общем два варианта, или я тупой и не понимаю очевидного, или Вам это не особо и нужно и Вам лень лишнюю строчку написать, может пример привести, чтобы Вас поняли. В любом случае, помочь ничем не могу, т.к. не понимаю что нужно. Объясните - помогу, нет - и суда нет.

SergeiL
SergeiL аватар
Offline
Зарегистрирован: 05.11.2018

Олег, и все таки, опишите что вы пытаетесь получить, так как действия с указателями несколько странные.

Вы гоняете начальный указатель на строку, потом восстанавливаете его в цикле.

Предположительно это можно сделать проще (но не понятно, что нужно), причем несколькими способами.

И с использованием индекса. Думаю что задумка не соответствует написанному.

oleg_kazakof
Offline
Зарегистрирован: 24.04.2015

ЕвгенийП пишет:

oleg_kazakof,

Вы изумительно умеет объяснять. Для того, чтобы "сместить указатель на 5 позиций" достаточно просто прибавить к нему 5 обычным сложением.

ЕвгенийП, скетч в посте#1 получает символы с сериал монитора IDE и заменяет  на них символы в этом массиве

char* stroka[] = {
  "ZZZZZ",
  "XXXXX",
  "CCCCC",
  "VVVVV"};
цикл
 for (byte w = 0; w < 5; w++) {(*stroka)--[n];}
двигает указатель в нужную сторону для дальнейшей обработки.  всё это работает как нужно.
 
вопрос в том как это сделать простым декрементом или инкрементом что то типа такого
(*stroka)[n] = ((*stroka)[n] -5)); вот тут я и туплю. как правильно составить эту строку чтобы указатель сдвинулся на 5 позиций. 
 
b707
Offline
Зарегистрирован: 26.05.2017

oleg_kazakof пишет:

цикл

for (byte w = 0; w < 5; w++) {(*stroka)--[n];}

двигает указатель в нужную сторону для дальнейшей обработки. всё это работает как нужно.

может это и работает "как нужно, но с точки зрения синтаксиса эта запись - лютый бред, в первую очередь из-за индекса. Надеюсь, вы не будете спорить, что например запись

a[5];

- единственная на строке - это бессмыслица?

Если да - то обьясните тогда, какую функцию в теле вашего цикла {(*stroka)--[n];} несет [n] ?

Цитата:

вопрос в том как это сделать простым декрементом или инкрементом что то типа такого (*stroka)[n] = ((*stroka)[n] -5)); вот тут я и туплю. как правильно составить эту строку чтобы указатель сдвинулся на 5 позиций.

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

Чтобы было понятнее: ваш массив stroka - двумерный. Соответственно если взять аналогию из геометрии - у него два измерения x и y. По оси х тут идут буквы в отдельных строчках, по у - меняются целые строчки. В своем коде вы куда пытаетесь переместится на пять - по х или по у?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

oleg_kazakof пишет:
скетч в посте#1 получает символы с сериал монитора IDE и заменяет  на них символы в этом массиве

char* stroka[] = {
  "ZZZZZ",
  "XXXXX",
  "CCCCC",
  "VVVVV"};
цикл
 for (byte w = 0; w < 5; w++) {(*stroka)--[n];}
двигает указатель в нужную сторону для дальнейшей обработки.  всё это работает как нужно.
 
вопрос в том как это сделать простым декрементом или инкрементом что то типа такого
(*stroka)[n] = ((*stroka)[n] -5)); вот тут я и туплю. как правильно составить эту строку чтобы указатель сдвинулся на 5 позиций. 

Ну, хоть что-то, хотя непоняток осталось гораздо больше, чем стало понятно.

В принципе, как я Вам уже писал, конструкция

for (byte w = 0; w < 5; w++) {(*stroka)--[n];}

в Вашем случае эквивалента

(*stroka) -= 5;

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

А раз так, то почему бы Вам не уйти от работы с ними напрямую? Объявите Вашу stroka двумерным массивом и работайте с индексами:

char stroka[][6] {
	"ABCDE",
	"FGHIJ",
	"KLMNO",
	"PQRST"
};


void setup (void) {
	Serial.begin(115200);
	
	stroka[0][2] = '1'; // заменить 'C' на '1'
	stroka[1][0] = '2'; // заменить 'F' на '2'
	stroka[0][0] = '3'; // заменить 'A' на '3'
	stroka[3][4] = '4'; // заменить 'T' на '4'

	for (int i = 0; i < 4; i++) {
		for (int j = 0; j < 5; j++) {
			Serial.print(stroka[i][j]);
		}
		Serial.println();
	}
}

void loop(void) {}

/*
РЕЗУЛЬТАТ:

3B1DE
2GHIJ
KLMNO
PQRS4

 */

 

oleg_kazakof
Offline
Зарегистрирован: 24.04.2015

ЕвгенийП пишет:

В принципе, как я Вам уже писал, конструкция

for (byte w = 0; w < 5; w++) {(*stroka)--[n];}

в Вашем случае эквивалента

(*stroka) -= 5;

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

Спасибо ЕвгенийП, вот я затупил так затупил. Всё работает. 

А массив нужен именно с указателями так как это всего небольшая часть программы, которая печатает на термопринтере кассового аппарата текст набираемый в на экране монитора в IDE.

Но, что самое интересное, при замене цикла на прямой декремент размер используемого флеша и озу НЕ изменился

b707
Offline
Зарегистрирован: 26.05.2017

oleg_kazakof пишет:

Но, что самое интересное, при замене цикла на прямой декремент размер используемого флеша и озу НЕ изменился

оптимизатор выкинул бессмыслицу

oleg_kazakof
Offline
Зарегистрирован: 24.04.2015

b707 пишет:

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

Полностью с Вами согласен, я далеко не программист. 

Если да - то обьясните тогда, какую функцию в теле вашего цикла {(*stroka)--[n];} несет [n] ?

Цитата:

Спасибо выкинул не нужные [n], всё работает и компилятор перестал писать предупреждения. 

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

Сдвигом на пять последовательно заполняется массив с экрана монитора IDE, и выводится обратно в монитор.

Спасибо за подсказку про[n].