|
|
  |
Можно ли в typedef struct описать массив переменной длины, IAR, C, AVR |
|
|
|
Feb 23 2009, 20:34
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(sergeeff @ Feb 23 2009, 14:48)  А адрес ячейки памяти бывает отрицательный? Относительно чего либо бывает. Вы когда-либо видели код типа: Код char* p = (char*)123; p[0] = '/0'; p[-1] = 'а'; p[-2] = 'п'; p[-3] = 'о'; p[-4] = 'Ж'; Я не говорю, что так надо писать, я говорю что так можно и это технически грамотно. Индексы массива тоже являются "одним из способов адресации". ИМХО.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Feb 24 2009, 07:42
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(sergeeff @ Feb 24 2009, 10:33)  Очень жаль, если у вас до сих пор нет понимания разницы между адресом в памяти и индексом в массиве. У меня есть прекрасное понимание и того и другого - верьте мне. Но я пойду на принцип. Давайте объясните мне принципиальную разницу между адресацией просто ячек памяти и индексацией (синоним-адресация) ячеек памяти массива из байт. На asm будет что-то типа ldi R16,Z+ в обоих случаях. Читая, некоторые не ловят смысл написанного. Часть фразы написана в кавычках... Вышесказанное мной приведено лишь с одной целью - показать, что если физически нет адресов ячеек с отрицательными номерами, то гипотетически ничего не мешает указателю быть знаковым. И что нельзя быть категоричным в своих суждениях. А до этого я пошутил над опечаткой - словом chort - чёрт ( short в оригинале), а west329_ принял во внимание зачем-то выдранное из контекста слово unsigned и понеслось, а изначально об этом речи вообще не велось! У меня не возникало даже мысли о знаковости указателей. Такое тоже возможно - и это тоже нормально (но я так никогда не делал на практике). Код char* p = (char*)-1; for (int i=0; i<10; i++) *++p = 0; ЗЫ: высказывать свои сожаления уместнее в некрологе.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Feb 24 2009, 09:53
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Цитата это уже надо задуматься Задумываться - полезно. Адрес перед нулем - это сильно. Наш ответ Чемберлену. А давайте начнем размещать объекты по адресам -123456 или -987654. Обеспечим себе место в зале программистской славы!
|
|
|
|
|
Feb 24 2009, 10:04
|

Местный
  
Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423

|
Подскажите как правильно поступить, хочу использовать стандартную процедуру С strstr описанную в string.h Цитата char *strstr(const char *s1, const char *s2); Обьясните с чем связано, то что все передаётся через const, масив содержит необязательно символы, можно и числовую последовательность искать, и значения хранятся во временных буферах. собственно выжимка Код ... #include <string.h> ... #define BUFFER_SIZE_P 350 unsigned char buf_phone[BUFFER_SIZE_P]; .. void test (void) { unsigned char *p1, *p2, *p3;
p1 = & test1[0]; p2 = & test2[0]; p3 = strstr( test2, test1); } ... В принципе всё работает и правильно, но компилятор ругается на несовпадение типов, хотя и компилирует. Успокоить компилятор удалось только таким способом Код p3 = (unsigned char*)strstr( (char const*)test2, (char const*)test1); ответ правильный предупреждений нету, скажите такое решение правильное ?
|
|
|
|
|
Feb 24 2009, 10:38
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(west329_ @ Feb 24 2009, 13:04)  Обьясните с чем связано, то что все передаётся через const, масив содержит необязательно символы, можно и числовую последовательность искать, и значения хранятся во временных буферах. Это дополнительное документирование функции. Сразу становится ясно, что функция не модифицирует строки. Цитата скажите такое решение правильное ? Нет. Компилятор ругается на то, что Вы передаете unsigned char* вместо char*. ошибка тут: unsigned char *p1, *p2, *p3; А передавать в качестве аргумента не константу вместо констаны - это нормально и естественно. Плохо когда наоборот. Цитата(sergeeff @ Feb 24 2009, 12:53)  Задумываться - полезно. Я так не думаю. Грубо: думать надо над идеологией, алгоритмом и надёжностью, а не над написанием цифр и букв. Цитата Адрес перед нулем - это сильно. Наш ответ Чемберлену. А давайте начнем размещать объекты по адресам -123456 или -987654. Обеспечим себе место в зале программистской славы! Мне Вас не переубедить. Жизнь Вас научит. Зачем Вы ёрничаете? Любому грамотному программисту всё будет прекрасно понятно. У меня в конторе работают 5 программистов и (-1) не вызывает ни у кого сомнений - это общепринятая (не побоюсь этого слова) практика с которой Вы просто не сталкивались ранее.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Feb 24 2009, 10:48
|

Местный
  
Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423

|
В чем тогда отличие unsigned char от charсори, понял ошибу Код unsigned char test1[] = "hello"; unsigned char test2[] = "test1 hello test2";
void test (void) { char *p1, *p2, *p3;
p1 = (char*) & test1[0]; p2 = (char*) & test2[0]; p3 = strstr( p2, p1); } а такой вариант правильный ?
Сообщение отредактировал west329_ - Feb 24 2009, 10:54
|
|
|
|
|
Feb 24 2009, 10:55
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(west329_ @ Feb 24 2009, 13:48)  В чем тогда отличие unsigned char от char один тип кодирует числа от 0 до 255, другой - от -128 до 127 Вот и вся разница.
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Feb 24 2009, 11:09
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(west329_ @ Feb 24 2009, 13:48)  ...а такой вариант правильный ? Не то чтобы неправильный. Лишние приведения типов, лишние переменные, лишняя писанина - нагромождение... Чем Вас это не привлекает? Код char test1[] = "hello"; char test2[] = "test1 hello test2";
char* p = strstr(test2, test1); ...
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Feb 24 2009, 11:12
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(west329_ @ Feb 24 2009, 13:48)  а такой вариант правильный ? Не плодите сущности: Код char test1[] = "hello"; char test2[] = "test1 hello test2"; p3 = strstr( test1, test2); и все. Точнее почти все - еще для некоторых платформ/компиляторов следует подумать о ценных указаниях по месту размещения этих строк. Ну и моему взгдляду приятнее Код char *test1 = "hello"; char *test2 = "test1 hello test2"; нежели []
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Feb 24 2009, 11:21
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

|
Цитата(west329_ @ Feb 24 2009, 13:48)  Код unsigned char test1[] = "hello"; unsigned char test2[] = "test1 hello test2";
void test (void) { char *p1, *p2, *p3;
p1 = (char*) & test1[0]; p2 = (char*) & test2[0]; p3 = strstr( p2, p1); } а такой вариант правильный ? Одноцветно, пока работаете с символами только из диапазона 0x00..0x7f или только из диапазона 0x80..0xff. Вот только не могу понять, почему unsigned char Вам нравится больше просто char в случае testХ[], и зачем вообще эти пляски с бубнами? Цитата сори, понял ошибу не похоже  ЗЫЖ p1 = (char*) test1; // test1 - уже указатель. Вы доказываете, что (a+1)-1 тождественно равно a?
|
|
|
|
|
Feb 24 2009, 11:24
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(zltigo @ Feb 24 2009, 14:12)  Ну и моему взгдляду приятнее Код char *test1 = "hello"; char *test2 = "test1 hello test2"; нежели [] Так вроде как создаются ещё и лишние переменные типа указатель на строку, а в случае с [] нет. И ещё у Вас в примере опечатка: не та последовательность аргументов - надо (test2, test1)....
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Feb 24 2009, 11:38
|

Местный
  
Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423

|
Код __flash char *test_ = "hello"; __flash char *test_1 = "test1 hello test2";
void test (void) { char *p1, *p2, *p3;
p3 = strstr( test_1, test_); } если так писать то у меня происходит дублирование данных, в SRAM и FLASH если через --string_literals_in_flash, то нет , но код неработает. Цель сделать поиск в буфере строки которая сидит во флеш памяти. Хочется использовать готовую процедуру. похожее на это : Код __flash char *test_ = "hello"; char test_1[350] = "test1 hello test2";
void test (void) { char *p3;
p3 = strstr( test_1, test_); } тако реально сделать ?
Сообщение отредактировал west329_ - Feb 24 2009, 12:02
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|