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

 
 
12 страниц V  « < 7 8 9 10 11 > »   
Reply to this topicStart new topic
> Как в си объявить массив с возможностью изменения его размера?
ReAl
сообщение Jul 9 2011, 09:54
Сообщение #121


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(GetSmart @ Jul 9 2011, 12:10) *
Щас доспоритесь до того, что придётся в стандарт вводить допустимость такого
Код
int *p;
void main()
{
p = &115;
...
}


Ну так нельзя, вот так (почти так же) уже давно можно:
Код
struct foo { int a, b; };
struct foo foo1;
void baa(struct foo *);
void fa(int []);
void fap(int (*)[]);

void moo()
{
        foo1 = (struct foo){1, 2};   // Можно для скаляров
        baa( &(struct foo){ 1, 2} ); // Нельзя для скаляров
        fa( (int[]){5} );
        fap( &(int[]){5} );
}
(«почти» ввиду разницы времени жизни, статическому указателю так не присвоить)
Почему нельзя для скаляров делать то, что можно для агрегатов -- непонятно.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
Danis
сообщение Jul 9 2011, 09:56
Сообщение #122


Twilight Zone
***

Группа: Свой
Сообщений: 454
Регистрация: 17-02-09
Из: Челябинск
Пользователь №: 44 990



ИМХО, тему пора закрывать, поскольку она сильно вышла из «берегов» bb-offtopic.gif а Т.С. давно получил, что хотел .


--------------------
Magic Friend
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 9 2011, 10:06
Сообщение #123


Гуру
******

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



QUOTE (sasamy @ Jul 9 2011, 12:21) *
Как же быть если вы отвечаете на мои слова
http://electronix.ru/forum/index.php?showt...st&p=949780
кому и чего я приписываю если вы утверждаете что создается указатель, я говорю что указатель не создается. Что непонятно ?

Указатель создается. Теперь поговорим какой. Тут я думаю, Вам следует почитать первоисточники, благо Вы теперь знаете где их брать sm.gif
Даю намек, что указатели в языке 'C' предусмотрены стандартом разные,
int *ptr
const int *ptr
int * const ptr
const int * const ptr
Это все, подчеркиваю, все называются указателями. Нет в требований, того, что-бы указатель, если использовать придуманый Вами термин не являлись
"адресом-константой". И так, совершенно очевидно создается константный указатель. После чего я этот факт явно подтвердил в ответ на Ваш вопрос "Именно так адрес-константа созданная компилятором для хранения указателя на массив abc[]. Соответственно будет использоваться компилятором, когда потребуется указатель на массив abc[]"
Теперь когда этот указатель создается. Ни в посте на котороый Вы ссылаетесь, ни в каких либо других я не утверждал, что
этот указатель создается при создании объекта, как Вы мне еще и это пытаетесь походя приписать sm.gif.
По этому поводу даже есть мое проигнорированное разъяснение, что этот указатель создается для/при необходимости работы с массивом. Вот цитата из поста с тем самым примером:
QUOTE
Потрудился показать, что для работы с массивом abc[] компилятор выделяет память для указателя abc. Если с массивом НЕ работать, память под указатель выделяться не будет, но и сам массив будет выкинут при оптимизации по причине его нахренненужности.

Но страусам, все это по барабану - при засунутой в песок голове не только думать, но и дышать приходится через другое место.
Посему рождается:
QUOTE
Интересно -- кто-то еще будет на этом форуме слушать ваши советы после такой конкретной тупизны которую вы тут упорно выставляете на показ
....
Это не пример ниразу, поэтому я прошу привести пример на _С_ или цитатут из стандарта языка _С_ где говорится что при создании объекта типа массив созается указатель с которым можно далее работать как с указателем - не как с адресом-константой а как с указателем - взять его адрес, изменить значение в соответствии с типом.

С какого-это испуга некоторые указатели в языке 'C' вдруг стали как-бы т не указателями, и почему для неких неведомых мне "настоящих" указателей Вами выдвинуто требование их автоматического создания при создании объекта объяснить Вы, разумеется не сможете sad.gif. Посему ничего кроме продолжения Вами трепа в стиле:
QUOTE
Интересно -- кто-то еще будет на этом форуме слушать ваши советы после такой конкретной тупизны которую вы тут упорно выставляете на показ.

Я уже не жду.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
SysRq
сообщение Jul 9 2011, 10:06
Сообщение #124


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Мда. zltigo вернулся.
Предгалаю переименовать тему в "Рандеву с zltigo". Традиционнее, и более соответствовать будет.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jul 9 2011, 10:09
Сообщение #125


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(ReAl @ Jul 9 2011, 14:54) *
Ну так нельзя, вот так (почти так же) уже давно можно:
Код
struct foo { int a, b; };
struct foo foo1;
...

void moo()
{
        foo1 = (struct foo){1, 2};   // Можно для скаляров
...
}
(«почти» ввиду разницы времени жизни, статическому указателю так не присвоить)
Почему нельзя для скаляров делать то, что можно для агрегатов -- непонятно.

Я оставил то, что совсем не то, о чём я написал. Это копирование объекта/структуры. Тут же спор об автоматическом создании объекта, на который постоянно (или хоть локально внутри функции) существует/актуален указатель. Копирование - не есть передача указателя на всеобщее юзание. Из-за этого много интересных моментов не проявляется. Например, константой было число 115 или переменной. Если константой, то указатель должен был быть не int *p, а const int *p.

А вот остальное, убранное, в принципе похоже. Однако, как поведёт себя компилятор, когда функция будет объявлена например так:
Код
void baa(const struct foo *);

Догадается ли он поместить структуру в ROM, применительно к ARM-ам? Или если для других платформ, то const заменить на другой атрибут, например __flash.

Сообщение отредактировал GetSmart - Jul 9 2011, 10:57


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 9 2011, 10:23
Сообщение #126


Гуру
******

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



QUOTE (SysRq @ Jul 9 2011, 13:06) *
Мда. zltigo вернулся.
Предгалаю переименовать тему в "Рандеву с zltigo". Традиционнее, и более соответствовать будет.

sad.gif Что поделаешь, если есть форумчане движимые в основном целью, которую максимально четко и откровенно, и за откровенность ему мое уважение! Сфрмулировал novchok:
QUOTE
А если хотите отомстить, подловите на неточностях в темах по армам.
Армы это его больное место, главное качественно подловить, а потом со всего размаху и по полной программе.
Обязательны к употреблению слова "не знаешь Арм нечего тупые советы давать"

Вот и имеем достаточно постоянную группу "имеющих желание, но не имеющих возможности".
Кстати, я и тогда и сейчас отвечу:
QUOTE
Попробуйте! Заодно у Вас есть шанс поучится, а там глядишь и я чего-нибудь в копилочку знаний положу. Учиться нужно постоянно, чем я и занимаюсь на этом форуме!



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jul 9 2011, 10:32
Сообщение #127


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



"...но не имеющих возможности" sm.gif

Я уже как-то указывал zltigo на ошибку в драйвере I2C. Он ответил что-то в духе - я не видел и, типа, у меня всё работает.
Отсюда возникает логичное предположение - писал не он. Хотя заявлял, что он.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 9 2011, 10:39
Сообщение #128


Гуру
******

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



QUOTE (GetSmart @ Jul 9 2011, 13:32) *
Отсюда возникает логичное предположение - писал не он. Хотя заявлял, что он.

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

QUOTE (GetSmart @ Jul 9 2011, 13:32) *
Я уже как-то указывал zltigo на ошибку в драйвере I2C.

Или не ошибке, честно говоря тогда, да и сейчас разбираться в коде написанном на рубеже веков было недосуг. Так и живет, плодится и работает этот код с "ошибкой". Но до чего диагноз данный novichok верен sm.gif - буквы I2C даже в этой теме GetSmart повторил уже не единожды sm.gif.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
sasamy
сообщение Jul 9 2011, 10:42
Сообщение #129


Знающий
****

Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858



Цитата(zltigo @ Jul 9 2011, 14:06) *
Указатель создается. Теперь поговорим какой. Тут я думаю, Вам следует почитать первоисточники, благо Вы теперь знаете где их брать sm.gif
Даю намек, что указатели в языке 'C' предусмотрены стандартом разные,
int *ptr
const int *ptr
int * const ptr
const int * const ptr
Это все, подчеркиваю, все называются указателями. Нет в требований, того, что-бы указатель, если использовать придуманый Вами термин не являлись
"адресом-константой". И так, совершенно очевидно создается константный указатель. После чего я этот факт явно подтвердил в ответ на Ваш вопрос "Именно так адрес-константа созданная компилятором для хранения указателя на массив abc[]. Соответственно будет использоваться компилятором, когда потребуется указатель на массив abc[]"


Если это указатель - возьмите его адрес, даже если это константный указатель у него должен быть адрес - так, или это волшебный указатель ? но только вы ведь обломаетесь - амперсанд вернет не адрес указателя а адрес массива. Указатель _не создается_ - не вводите людей в заблуждение, то что вы привели в ассемблерном листинге - _это не указатель С_, это внутренняя конструкция созданная компилятором для своих внутренних потребностей и скрыта от программиста.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jul 9 2011, 10:59
Сообщение #130


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(zltigo @ Jul 9 2011, 15:39) *
Но до чего диагноз данный novichok верен sm.gif - буквы I2C даже в этой теме GetSmart повторил уже не единожды sm.gif.

Ваш доктор айболит нервно курит в сторонке. И Вы вместе с ним. Оцените суть происходящего, если есть чем. Я ни за кем не гонялся. Нашёл ошибку - один раз сигнализировал. Здесь же на Ваш неадекват по отношению к начинающему (ТС) сначала намекал, что ничего страшного не произошло. Вы же распалились как горящая ёлка. Пришлось ко всему прочему для сравнения и Ваши ошибки выставлять на обзор чтобы в разум привести. А то ведь истерика до сих пор не прошла.

Цитата(zltigo @ Jul 9 2011, 15:39) *
Было-бы крайне глупо выкладывать в интернет под своим именем чужое, посему по этому поводу расслабьтесь. Все мое, и ошибки, буде таковые бывали и будут, тоже мои.

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

Сообщение отредактировал GetSmart - Jul 9 2011, 13:57


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jul 9 2011, 11:35
Сообщение #131


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(GetSmart @ Jul 9 2011, 13:09) *
Я оставил то, что совсем не то, о чём я написал. Это копирование объекта/структуры.
...
А вот остальное, убранное, в принципе похоже.
Автоматически, "на ходу" созданной структуры.
Я для того и написал, чтобы сравнить: в int можно записать 5, в функцию, ожидающую int* -- нельзя передать &5.
А со структурами и массивами -- можно и структуре присвоить не другую заведённую мной ранее структуру, а по-месту сочинённое {1, 2}, и в функцию передать указатель на такой объект.
Код
  foo1 = (struct foo){1,2}; // можно
  a = (int)5;                  // можно (приведение так, для единства стиля)
  moo_foo( & (struct foo){1,2} ); // можно
  moo_int( & (int){5} );             // нельзя
Впрочем, в С++ под ссылку можно передать константу, при этом, равно как и в С99 с показанными структурой и массивом, заводится (меня не касается где) временный объект, инициализируется даннйо константой (как тут структура инициализируется двумя константами) и передаётся на него указатель.

Цитата(GetSmart)
Из-за этого много интересных моментов не проявляется. Например, константой было число 115 или переменной.
Да-да-да :-)
Именно с этим у Фортрана и были весёлые танцы. Вызываешь FOO(42), после чего константа 42 изменилась во всей программе (или, по крайней мере, в единице трансляции), так как FOO внутри себя меняет свой аргумент.
Ну уж это можно как-то разрулить, считать константой и не передавать под int *, передавать только под const int *


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 9 2011, 11:48
Сообщение #132


Гуру
******

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



QUOTE (sasamy @ Jul 9 2011, 13:42) *
Если это указатель

Да, конечно, я уже слышал sad.gif, это Апельсин или Паровоз.
QUOTE
- возьмите его адрес, даже если это константный указатель у него должен быть адрес - так, или это волшебный указатель ? но только вы ведь обломаетесь - амперсанд вернет не адрес указателя а адрес массива. Указатель _не создается_ - не вводите людей в заблуждение, то что вы привели в ассемблерном листинге - _это не указатель С_, это внутренняя конструкция созданная компилятором для своих внутренних потребностей и скрыта от программиста.

Радует уже то, что с указателя втихую сняты обвинения в константности яко-бы неподобающей указателю. Или такти нет? Теперь все это вышенаписанное можно свести к одной "проблеме", что этот указатель, подчеркиваю указатель, а не "Апельсин". Скрыт от программиста. Естественно скрыт, поскольку был создан компилятором а не программистом. Точно так-же компилятор для своих нужд порождает переменные, если они ему нужны, но их не объявил программист. К таким переменным программист так-же не имеет доступа, но это не мешает им быть переменными. Программист может сам явно объявить объект и компилятор им воспользуется. Хотя может и напротив, выкинуть за ненадобностью sm.gif.


QUOTE (GetSmart @ Jul 9 2011, 13:59) *
Ваш доктор айболит нервно курит в сторонке.... Я ни за кем не гонялся.

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

Этот код, как мне помнится, был выложен в ответ на чью-то просьбу в совершенно публичной ветке форума. Вы посчитали, что там яко-бы имеется ошибка. Я по причинам описанным выше вступать в разговоры был-ли мальчик не стал и ответил, так, как ответил.
Все заитересованные лица могли и полагаю, сейчас могут ознакомится с проблемой и составить собственное мнение. Что собственно стряслось, то Вы спустя какое-то количество лет об этом вспоминаете по несколько раз на дню?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jul 9 2011, 11:51
Сообщение #133


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(GetSmart @ Jul 9 2011, 09:39) *
Амперсанд функций и простых переменных так же показывает целостность картины использования амперсанда - есть объект и, если перед ним стоит амперсанд, то будет взят адрес объекта с типом самого объекта. При этом автоматическая подмена объекта/идентификатора массива (и только массива) в указатель на первый его элемент сыграла злую шутку с программистами со старой "прошивкой" sm.gif
Вот как раз идентификаторы функций ведут себя ближе к массивам, чем к переменным. Т.е. идентификатор функции при отсутствии возле него sizeof либо унарного & автоматически приводится к указателю на функцию. Более того, даже тут это делается:
Код
   foo();

Т.е. идентификатор функции сначала автоматически приводится к указателю на функцию, потом этот указатель скармливается круглым скобкам в роли оператора вызова функции. Аналогично массивам, под sizeof(foo) идентификатор функции не превращается автоматически в указатель на. При этом нарушаются требования для оператора sizeof и имеем ошибку. Однако, в отличие от массива, в выражениях &foo означает в точности то же, что и foo. Посему первые две строки функции moo() полностью равноправны.
Код
void foo(void);
void (* volatile pvf)();

void moo()
{
    pvf = foo;  // (1)
    pvf = &foo; // (2)
    pvf();       // (3)
    (*pvf)();   // (4)
}
А вот с последними двумя строками интересно.

С (3) всё правильно, () по стандарту ждут выражение типа "указатель на функцию" (я уже не раз приводил пример с абсолютно легитимным a = (flag ? sin : cos)(x), где в первых скобках мы имеем как раз выражение типа "указатель на функцию").

А вот в (4)... Такое ощущение, что сначала указатель на функцию в результате разименования превращается в тот самый function designator, который тут же автоматически первращается назад в pointer to function, который уже скармливается скобкам. А тут
Код
    (*******pvf)();
это происходит семь раз.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jul 9 2011, 12:36
Сообщение #134


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(ReAl @ Jul 9 2011, 16:51) *
я уже не раз приводил пример с абсолютно легитимным a = (flag ? sin : cos)(x), где в первых скобках мы имеем как раз выражение типа "указатель на функцию"

Сразу же хочется заменить функции на массив. И не только. Можно и на структуры и на юнионы.
По логике, должны прокатить конструкции
Код
a = (flag ? s1 : s2).field1;
a = (flag ? p1 : p2)->field2;
a = (flag ? mass1 : mass2)[10];


Цитата(ReAl @ Jul 9 2011, 16:51) *
это происходит семь раз.

Называется - доигрались sm.gif

Сообщение отредактировал GetSmart - Jul 9 2011, 12:40


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
sasamy
сообщение Jul 9 2011, 12:42
Сообщение #135


Знающий
****

Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858



Цитата(zltigo @ Jul 9 2011, 15:48) *
Радует уже то, что с указателя втихую сняты обвинения в константности яко-бы неподобающей указателю. Или такти нет? Теперь все это вышенаписанное можно свести к одной "проблеме", что этот указатель, подчеркиваю указатель, а не "Апельсин". Скрыт от программиста. Естественно скрыт, поскольку был создан компилятором а не программистом.


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

Код
Disassembly of section .text:

00000000 <main>:
char abc[10];

int main(void)
{
    return (int)abc;
   0:    e59f3004     ldr    r3, [pc, #4]; c <main+0xc>
}
   4:    e1a00003     mov    r0, r3
   8:    e12fff1e     bx    lr
   c:    00000000     .word    0x00000000
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 21:31
Рейтинг@Mail.ru


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