|
Как в си объявить массив с возможностью изменения его размера? |
|
|
|
 |
Ответов
(150 - 164)
|
Jul 10 2011, 11:39
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата По логике операции ?: мне не очень понятно. С ней как раз все понятно. Ее результатом является rvalue (а не lvalue). Ему нельзя ничего присвоить, и его адрес нельзя получить. Кстати, в С++ это несколько не так - результатом оператора ? может быть референс, а он является lvalue. Т.е. в С++ это будет валидно: Код int a,b;
(some?a:b)=1;
|
|
|
|
|
Jul 10 2011, 11:58
|

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

|
QUOTE (sergeeff @ Jul 10 2011, 14:47)  Господа-любители экзотических языковых конструкций! На счет того, что в сторону ушло, это да. То, что почему-то вместо ознакомления с соответствующим разделом стандарта C99 пошел метод тыка  , тоже не хорошо. Но на счет "экзотических" совершенно не верное замечание. Нормальные и естественные. Не уподобляться-же в наборе языковых средств Эллочке-Людоедке  .
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 10 2011, 12:21
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Цитата(zltigo @ Jul 10 2011, 14:58)  На счет того, что в сторону ушло, это да. То, что почему-то вместо ознакомления с соответствующим разделом стандарта C99 пошел метод тыка  , тоже не хорошо. Но на счет "экзотических" совершенно не верное замечание. Нормальные и естественные. Не уподобляться-же в наборе языковых средств Эллочке-Людоедке  . Уважаемый гуру! Я не заскорузлый бюрократ, борющийся с нововведениями. Я против аргументов типа "Я написал что-то. Компилятор съел". Один едиственный, которым я сейчас пользуюсь. И из этого делается заключение: "Супер". При этом никто не показал - а) эффективность такого решения, - б)"читабельность" что-ли, полученного текста. Кто-то из коллег без поллитра разберется, как это работает, что иелось ввиду и нет ли там "подводных" камней? 2. В С++ масса нововведений. Некоторые - потрясающе эффективные. Но не все и везде работает. Авторы, чаще всего и пишут, такие компиляторы съели без проблем, а такие - ни в какую. К сожалению. Я потому и ратую за отдельную ветку. Там можно было бы и проверку развернуть, да и остальные туда для самообразования заглядывали. А какое отношение к обсуждению вопросов о массивах имеет терна́рная усло́вная опера́ция ?
|
|
|
|
|
Jul 10 2011, 13:17
|

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

|
QUOTE (sergeeff @ Jul 10 2011, 15:21)  делается заключение: "Супер". При этом никто не показал - а) эффективность такого решения, Эффективность, конечно, может ограничена компилятором, но в общем случае это для компилятора более простая-шаблонно-понятная конструкция в ответ на которую от компилятора можно ожидать лучшей кодогенерации. В те времена, когда изучал 'C' я это проверял. Можете и сейчас на своем компиляторе проверить и Вы. QUOTE - б)"читабельность" что-ли, полученного текста. Читабельность отличная! Естественно для чуть-чуть подготовленного читателя. Плюсы те-же самые, что и для компилятора - компактная шаблонно узнаваемая с полувзгляда конструкция. QUOTE Кто-то из коллег без поллитра разберется, как это работает, что иелось ввиду и нет ли там "подводных" камней? Не припомню уже когда последний раз натыкался на проблемы компиляторов. Просто надо один раз прочитать страничку стандарта и пользоваться. Ошибок в поведении компилятора связанных с явным нарушением стандарта не будет. Практически невероятно. Другое дело, то некими фантазиями выходящими за пределы описанные в стандарте получить некий "результат" зависящий от компилятора можно. По этой причине я и плохо отношусь к методу "тыка".
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 12 2011, 16:29
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(GetSmart @ Jul 10 2011, 00:53)  По логике операции ?: мне не очень понятно. Она может работать с целыми объектами. Но зачем-то вынуждает объект преобразоваться. В то же время простые скобки не вынуждают объект преобразовываться. Код double (*p)(double);
p = &(flag ? sin : cos); // не работает И не должна работать!!! Рабочий вариант Код double sin(double); double cos(double); p = flag? sin : cos; Или нет?
|
|
|
|
|
Jul 12 2011, 16:32
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(_Bill @ Jul 12 2011, 21:29)  Или нет? Нет. Достаточно поставить #include <math.h> Cуть во взятии адреса (амперсанд за скобками). Я просто пытался выяснить на каком этапе происходит преобразование объекта (идентификатора функции) в указатель на функцию. В Си получилось немного нелогично. Код struct { int a[3]; } s1, s2; ... p = &((flag ? s1 : s2).a[1]); // работает p = &(flag ? s1 : s2); // не работает Со структурой тоже не получается, хотя она не преобразуется в указатель. Для чего ввели rvalue/lvalue сиё мне неведомо.
Сообщение отредактировал GetSmart - Jul 12 2011, 18:13
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jul 12 2011, 19:26
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата p = &((flag ? s1 : s2).a[1]); // работает Угу, но не так, как вы ожидаете. Оператор '?' вернет копию структуры s1 или s2, и уже на адрес a[1] в этой копии вы и получите указатель Код #include <stdio.h>
struct A { int a[3]; } s1, s2;
int main(int argc, char** argv) { int* p1=&s1.a[1]; int* p2=&s2.a[1]; int* p3=&(argc>1?s1:s2).a[1]; printf("p1=%p, p2=%p, p3=%p\n",p1,p2,p3); return 0; } Цитата > gcc-4 t2.c > a.exe p1=0x404124, p2=0x404130, p3=0x22cd1c Как видим все указатели разные Цитата Для чего ввели rvalue/lvalue сиё мне неведомо. Вот собственно для этого Update - VC вернул указатели на оригинальные структуры (s1 и s2)
|
|
|
|
|
Jul 13 2011, 05:57
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата Создавать копию вроде бы команды не было. В С других вариантов нет, увы  Референсов там нет, а оператор '?' должен вернуть один из 2х своих операндов. И что он может вернуть вместо структуры? Цитата Видимо зависит от реализации. От оптимизатора. Цитата С массивами и указателями на структуры/юнионами вроде всё должно работать красиво. А это все скалярные значения - указатели. Они сами и возвращаются.
|
|
|
|
|
Jul 13 2011, 06:11
|

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

|
Дай думаю, загляну на огонёк  Да в си массивы несколько выбиваются из общих принципов и подходов относительно скаляров. Так при передаче массива в качестве аргумента будет передан лишь указатель (вернее даже сказать ссылка в понятиях С++, хотя общепринято что в си нет ссылок...), а если передавать любой скаляр или даже агрегат будет передано значение. Сам часто пользуюсь этим: Код void set_reference_frame_rotation(const float matrix[3][3]); float matrix[3][3]; set_reference_frame_rotation(matrix); или даже Код void get_reference_frame_rotation(float matrix[3][3]); float matrix[3][3]; get_reference_frame_rotation(matrix); //...do something with matrix что может приводить в замешательство неподготовленных программистов. Ну и в продолжение темы (с натяжкой): Код set_reference_frame_rotation(&matrix); main.c(26): error: #167: argument of type "float (*)[3][3]" is incompatible with parameter of type "float (*)[3]" компилятор кейл. Что собственно и ожидалось.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|