реклама на сайте
подробности

 
 
5 страниц V  < 1 2 3 4 5 >  
Reply to this topicStart new topic
> Можно ли в typedef struct описать массив переменной длины, IAR, C, AVR
demiurg_spb
сообщение Feb 23 2009, 20:34
Сообщение #31


неотягощённый злом
******

Группа: Свой
Сообщений: 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] = 'Ж';
Я не говорю, что так надо писать, я говорю что так можно и это технически грамотно.
Индексы массива тоже являются "одним из способов адресации". ИМХО.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Feb 24 2009, 07:33
Сообщение #32


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Очень жаль, если у вас до сих пор нет понимания разницы между адресом в памяти и индексом в массиве.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 24 2009, 07:42
Сообщение #33


неотягощённый злом
******

Группа: Свой
Сообщений: 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;
ЗЫ: высказывать свои сожаления уместнее в некрологе.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Feb 24 2009, 09:21
Сообщение #34


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Типун вам на язык и долгих лет жизни.

В двоичной системе отрицательное или положительное число - вопрос интерпретации этого представления.

Индексация в массиве - это всегда адрес + смещение. Смещение может быть каким угодно, +/- , но итоговый адрес - всегда положительный. При попытке записать/прочитать чего-нибудь по char* p = (char*)-1, куда будет писаться *p = 0? Можо сказать, по адресу -1 (при этом на вас посмотрят коллеги с некоторым недоумением), можно - по 0хFFFF..FF. Я понимаю, что мы живем в мире условностей, но зачем на ровном месте придумывать новые...
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 24 2009, 09:38
Сообщение #35


неотягощённый злом
******

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



Цитата(sergeeff @ Feb 24 2009, 12:21) *
Типун вам на язык и долгих лет жизни.
smile.gif
На мой взгляд именно -1 в данном случае абсолютно уместно (предыдущий перед нулём - всё однозначно).
А вот что записать 0xffff или ещё чего-нибуть типа 0xffff..ff - это уже надо задуматься, да и переносимость пропадёт в свете недавно выясненных обстоятельств о "размерности" указателей. Я считаю это не условность, а единственно верное решение (ну не совсем единственное, но точно верное). Я забыл к сожалению в какой книжке я это прочитал, но возможные проблемы при смене разрядности процессора - это не миф, и лучше соломку подстелить заранее (писать надежный код должно стать привычкой)... А косые взгляды коллег - это уже другая история и другая причина и кроется она в коллегахsmile.gif


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Feb 24 2009, 09:53
Сообщение #36


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата
это уже надо задуматься


Задумываться - полезно.

Адрес перед нулем - это сильно. Наш ответ Чемберлену.
А давайте начнем размещать объекты по адресам -123456 или -987654. Обеспечим себе место в зале программистской славы!
Go to the top of the page
 
+Quote Post
west329_
сообщение Feb 24 2009, 10:04
Сообщение #37


Местный
***

Группа: Свой
Сообщений: 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);

ответ правильный предупреждений нету, скажите такое решение правильное ?
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 24 2009, 10:38
Сообщение #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) не вызывает ни у кого сомнений - это общепринятая (не побоюсь этого слова) практика с которой Вы просто не сталкивались ранее.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
west329_
сообщение Feb 24 2009, 10:48
Сообщение #39


Местный
***

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Feb 24 2009, 10:55
Сообщение #40


Беспросветный оптимист
******

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



Цитата(west329_ @ Feb 24 2009, 13:48) *
В чем тогда отличие unsigned char от char

один тип кодирует числа от 0 до 255,
другой - от -128 до 127
Вот и вся разница.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 24 2009, 11:09
Сообщение #41


неотягощённый злом
******

Группа: Свой
Сообщений: 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);
...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 24 2009, 11:12
Сообщение #42


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
xemul
сообщение Feb 24 2009, 11:21
Сообщение #43



*****

Группа: Свой
Сообщений: 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Х[], и зачем вообще эти пляски с бубнами?
Цитата
сори, понял ошибу

не похожеsad.gif

ЗЫЖ
p1 = (char*) test1; // test1 - уже указатель. Вы доказываете, что (a+1)-1 тождественно равно a?
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 24 2009, 11:24
Сообщение #44


неотягощённый злом
******

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



Цитата(zltigo @ Feb 24 2009, 14:12) *
Ну и моему взгдляду приятнее
Код
char *test1 = "hello";
char *test2 = "test1 hello test2";

нежели []
Так вроде как создаются ещё и лишние переменные типа указатель на строку, а в случае с [] нет.
И ещё у Вас в примере опечатка: не та последовательность аргументов - надо (test2, test1)....


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
west329_
сообщение Feb 24 2009, 11:38
Сообщение #45


Местный
***

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post

5 страниц V  < 1 2 3 4 5 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 20:58
Рейтинг@Mail.ru


Страница сгенерированна за 0.015 секунд с 7
ELECTRONIX ©2004-2016