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

 
 
19 страниц V  « < 4 5 6 7 8 > »   
Reply to this topicStart new topic
> Си
demiurg_spb
сообщение Feb 28 2013, 07:39
Сообщение #76


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

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



На платформе АVR и так и сяк будет двойной расход памяти flash + копия в озу пока явно не зададим __flash.
Это так к слову...

Цитата(igorle @ Feb 28 2013, 11:37) *
Посмотрите здесь
Это объяснение не на том уровне. Хотелось бы в контексте Си стандарта...


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


Местный
***

Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753



Цитата(demiurg_spb @ Feb 28 2013, 10:39) *
На платформе АVR и так и сяк будет двойной расход памяти flash + копия в озу пока явно не зададим __flash.
Это так к слову...

На MSP430 - все литеральные строки хранятся во флэше. А для инициализированных массивов, если я не хочу переносить их п память, достаточно добавить const

Попутно. Оффтопик. Как вам удается редактировать свои сообщения, без того чтобы было написано "изменен тогда-то и тем-то"?
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 28 2013, 07:58
Сообщение #78


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

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



Цитата(igorle @ Feb 28 2013, 11:45) *
На MSP430 - все литеральные строки хранятся во флэше. А для инициализированных массивов, если я не хочу переносить их п память, достаточно добавить const

Это всё понятно. У MSP430 единое адресное пространство - просто и удобно... И про повсеместный static const я как бы тоже в теме. Меня интересует конкретный отсыл в стандарт и только...
Цитата
Попутно. Оффтопик. Как вам удается редактировать свои сообщения, без того чтобы было написано "изменен тогда-то и тем-то"?
Также как и вам. Нажимаю редактировать -> быстрое...

В avr-gcc вообще все очень непросто со строковыми литералами.
Можете почитать нашу дискуссию на сей счёт: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56263
И был бы очень рад если ещё кто-то меня поддержит в ней!


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
igorle
сообщение Feb 28 2013, 08:27
Сообщение #79


Местный
***

Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753



Цитата(demiurg_spb @ Feb 28 2013, 10:58) *
Также как и вам. Нажимаю редактировать -> быстрое...

Я так делаю - обязательно пишет что меняли текст.

Цитата
Можете почитать нашу дискуссию на сей счёт

Почитал. Познавательно. Я сам с AVR не работаю.
Go to the top of the page
 
+Quote Post
XVR
сообщение Feb 28 2013, 08:29
Сообщение #80


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(demiurg_spb @ Feb 28 2013, 11:39) *
Это объяснение не на том уровне. Хотелось бы в контексте Си стандарта...
Запросто - С99 стандарт, глава 6.4.5 (String Literals), параграф 5
Цитата
In translation phase 7, a byte or code of value zero is appended to each multibyte
character sequence that results from a string literal or literals. The multibyte character
sequence is then used to initialize an array of static storage duration and length just
sufficient to contain the sequence.
Так что возвращать из функции можно biggrin.gif
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 28 2013, 08:33
Сообщение #81


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

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



Цитата(XVR @ Feb 28 2013, 12:29) *
О! Вот это вразумительно!
Спасибо! Приятно осознавать что ты поумнел после содержательной беседы. Серьёзно.
Отдельное спасибо igorle!


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


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(igorle @ Feb 28 2013, 12:27) *
Я так делаю - обязательно пишет что меняли текст.

если после поста были добавлены посты других участников, то добавляется информация о редактировании. Возможно, на случай, что ваш пост процитировали, а вы потом что-то в нем поменяли
Если ваш пост последний - можно редактировать без опасения того, что информация о редактировании появится. Это касается конкретно этого форума. На других встречал упоминание о редактировании вне зависимости от других постов, причем даже была информация о всех редактированиях поста
Go to the top of the page
 
+Quote Post
Буратино
сообщение Feb 28 2013, 12:11
Сообщение #83


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

Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215



igorle ,вы привели программу
Код
void foo1(int argc, char **argv)
{
    while (argc--)
        printf("\"%s\"\n", argv++);
}

void foo(void)
{
    char *my_argv[] = {"Hello", "World", "one", "two", "four"};

    foo1(5, my_argv);
}


Мне кажется, что argv не указатель на указатель, скорее это указатель на массив указателей ! И в аргументах функции foo1 правильнее будет записать *argv[] вместо **argv
И в том виде в котором Вы запостили, код не компилится и нужно либо в аргументах printf разыменовывать argv либо использовать квадр. скобки и индекс для каждого элемента массива.

Мне больше нравится вот так:
Код
void foo1(char *argv[]) {
   while (*argv)
      printf("\"%s\"\n", *argv++);
}

int main(void) {
  
   char *my_argv[] = {"Hello", "World", "one", "two", "four", NULL};
   foo1(my_argv);
}


Мы подчеркнули природу аргумента функции foo1 ,но вынуждено используем "указательные" св-ва масива для упорядоченного, с начала в конец, вывода элементов на "печать".

Кароче трудно как-то все получаетсяsad.gif


--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
Go to the top of the page
 
+Quote Post
igorle
сообщение Feb 28 2013, 13:49
Сообщение #84


Местный
***

Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753



Цитата
Мне кажется, что argv не указатель на указатель, скорее это указатель на массив указателей ! И в аргументах функции foo1 правильнее будет записать *argv[] вместо **argv

С точки зрения языка С, в данном случае (для прототипа функции), обе записи равнозначны. Используйте то, что вам понятнее.
Со временем придет "чуство" того, что имя массива и указатель - это одно и то-же.
Цитата
... код не компилится ...

Да, это я ошибся. Нужно *argv++
Ваш вариант, с последним элементом NULL, правильный, тем более что функция main действительно получает массив argv размером на единицу больше, чем argc, с NULL терминатором.

Цитата
Мы подчеркнули природу аргумента функции foo1 ,но вынуждено используем "указательные" св-ва масива для упорядоченного, с начала в конец, вывода элементов на "печать".

Короче, трудно как-то все получаетсяsad.gif

Массив и указатель - близнецы братья. При использовании - это одно и то-же. Немного практики, и это станет простым и естественным. И будет непонятно, как некоторые языки не используют указатели. Верной дорогой идете!

Сообщение отредактировал igorle - Feb 28 2013, 13:50
Go to the top of the page
 
+Quote Post
Буратино
сообщение Feb 28 2013, 14:33
Сообщение #85


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

Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215



Не думаю, что массив и указатель одно и то же. Указатель это переменная, а массив это массив. Существует тесная, родственная связь механизма доступа к данным в массиве по индексам, и адресной арифметикой указателей, но это все же разные вещи.

Я спрашивал именно о указателе на указатель. Дело в том что гуглится что-то невразумительное на этот счет. В К&R нет подробного освещения вопроса. Уповаю на ваш експириентс. Спасибо!


--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
Go to the top of the page
 
+Quote Post
igorle
сообщение Feb 28 2013, 14:52
Сообщение #86


Местный
***

Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753



Указатель и массив - это не одно и то же. Но имя массива - это указатель на первый его элемент
a[0] то же самое что и *a
a[10] то же самое что и *(a+10)

Понятно, что при определении переменной
int a[] и int *b - разные вещи. Но после этого они во многом ведут себя одинаков. Во многом, но не во всем. a нельзя присваивать новое значение, b - можно.

int a[10];
int *b = a;

Теперь все, что вы хотите делать с a, вы можете делать с b. Обратное не верно
Например b[2] - это то-же самое что и a[2].

Я считаю, что это из области, где легче понять чем объяснить. Даже гугл не поможет. И приходит только с небольшим опытом. Просто поиграйте с указателями. Потом - с указателями на указатели. Это действительно просто. Наш экспириенс не поможет. Можете придумыват, писать и компилировать простые примеры из нескольких строк, и задавать конкретные вопросы если не работает. Когда поймете то что говорили про указатели и массивы - посмотрите примеры про обработку связных списков. Там указатели на указатели очень эффективно работают.

Можете порешать олимпиаду, про которую я говорил в соседней ветке. Там тоже про указатели на указатели. Если не выиграете приз, то хоть согреетесь.

Сообщение отредактировал igorle - Feb 28 2013, 14:54
Go to the top of the page
 
+Quote Post
Tahoe
сообщение Mar 1 2013, 02:45
Сообщение #87


Местный
***

Группа: Свой
Сообщений: 459
Регистрация: 30-03-06
Из: Москва
Пользователь №: 15 600



Цитата(igorle @ Feb 28 2013, 18:52) *
Указатель и массив - это не одно и то же. Но имя массива - это указатель на первый его элемент

Дьявол в мелочах (с).
Тот случай, когда пренебежение терминологией, привело к не верному выводу. А именно, "указатель" != "адрес". Имя массива - не "указатель" на первый элемент, а "адрес" первого элемента.

P.S.
Оказывается, объяснить тоже не сложно. wink.gif
Go to the top of the page
 
+Quote Post
Буратино
сообщение Mar 2 2013, 08:01
Сообщение #88


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

Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215



Я вот думаю, что указатель на указатель используется только как формальный аргумент функции. А в качестве фактического аргумента используют адрес простого указателя. Не вижу смысла в использовании указателя на указатель где-то еще. Естественно могу ошибаться.

Скажите, а где можно посмотреть реализацию отдельных функций описаных в заголовочном файле string.h ?


--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
Go to the top of the page
 
+Quote Post
igorle
сообщение Mar 2 2013, 10:41
Сообщение #89


Местный
***

Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753



Цитата(Буратино @ Mar 2 2013, 11:01) *
Скажите, а где можно посмотреть реализацию отдельных функций описаных в заголовочном файле string.h ?

http://www.uclibc.org/

http://git.uclibc.org/uClibc/tree/libc/string
Go to the top of the page
 
+Quote Post
XVR
сообщение Mar 2 2013, 14:39
Сообщение #90


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(Буратино @ Mar 2 2013, 12:01) *
Я вот думаю, что указатель на указатель используется только как формальный аргумент функции. А в качестве фактического аргумента используют адрес простого указателя. Не вижу смысла в использовании указателя на указатель где-то еще.
Многомерный динамический массив.
Код
int** GenerateArray(int dim1, int dim2)
{
int** rv=new int*[dim1];
for(int i=0;i<dim1;++i)
  rv[i]=new int[dim2];
return rv;
}


// Usage:

int dim1=5;
int dim2=10;

int** my_array=GenerateArray(dim1,dim2);

for(int i=0;i<dim1;++i)
for(int j=0;j<dim2;++j)
   my_array[i][j] = ...

Go to the top of the page
 
+Quote Post

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

 


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


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