Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как в си объявить массив с возможностью изменения его размера?
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Страницы: 1, 2, 3, 4
ReAl
Цитата(AHTOXA @ Jul 9 2011, 21:57) *
0 errors, 0 warnings. Работаетsm.gif
Так и я могу :-)
«работает в конретном компиляторе» и «обязано работать» -- разные вещи.
Хотя, похоже, что обязано.
011119xx
Право не ожидал столь бурного и порой веселого, если смотреть со стороны, обсуждения. Спасибо всем откликнувшимся. Проблему я для себя решил, как уже писал выше.
XVR
Цитата
По логике операции ?: мне не очень понятно.
С ней как раз все понятно. Ее результатом является rvalue (а не lvalue). Ему нельзя ничего присвоить, и его адрес нельзя получить. Кстати, в С++ это несколько не так - результатом оператора ? может быть референс, а он является lvalue. Т.е. в С++ это будет валидно:

Код
int a,b;

(some?a:b)=1;
sergeeff
Господа-любители экзотических языковых конструкций!

Вы бы хоть ветку новую открыли, что-ли. И так уже 11 страница в топике.
zltigo
QUOTE (sergeeff @ Jul 10 2011, 14:47) *
Господа-любители экзотических языковых конструкций!

На счет того, что в сторону ушло, это да.
То, что почему-то вместо ознакомления с соответствующим разделом стандарта C99 пошел метод тыка sad.gif, тоже не хорошо.
Но на счет "экзотических" совершенно не верное замечание. Нормальные и естественные. Не уподобляться-же в наборе языковых средств Эллочке-Людоедке sm.gif.



sergeeff
Цитата(zltigo @ Jul 10 2011, 14:58) *
На счет того, что в сторону ушло, это да.
То, что почему-то вместо ознакомления с соответствующим разделом стандарта C99 пошел метод тыка sad.gif, тоже не хорошо.
Но на счет "экзотических" совершенно не верное замечание. Нормальные и естественные. Не уподобляться-же в наборе языковых средств Эллочке-Людоедке sm.gif.


Уважаемый гуру!

Я не заскорузлый бюрократ, борющийся с нововведениями. Я против аргументов типа "Я написал что-то. Компилятор съел". Один едиственный, которым я сейчас пользуюсь. И из этого делается заключение: "Супер". При этом никто не показал
- а) эффективность такого решения,
- б)"читабельность" что-ли, полученного текста. Кто-то из коллег без поллитра разберется, как это работает, что иелось ввиду и нет ли там "подводных" камней?

2. В С++ масса нововведений. Некоторые - потрясающе эффективные. Но не все и везде работает. Авторы, чаще всего и пишут, такие компиляторы съели без проблем, а такие - ни в какую. К сожалению.

Я потому и ратую за отдельную ветку. Там можно было бы и проверку развернуть, да и остальные туда для самообразования заглядывали. А какое отношение к обсуждению вопросов о массивах имеет терна́рная усло́вная опера́ция ?
zltigo
QUOTE (sergeeff @ Jul 10 2011, 15:21) *
делается заключение: "Супер". При этом никто не показал
- а) эффективность такого решения,

Эффективность, конечно, может ограничена компилятором, но в общем случае это для компилятора более простая-шаблонно-понятная конструкция в ответ на которую от компилятора можно ожидать лучшей кодогенерации. В те времена, когда изучал 'C' я это проверял. Можете и сейчас на своем компиляторе проверить и Вы.
QUOTE
- б)"читабельность" что-ли, полученного текста.

Читабельность отличная! Естественно для чуть-чуть подготовленного читателя. Плюсы те-же самые, что и для компилятора - компактная шаблонно узнаваемая с полувзгляда конструкция.
QUOTE
Кто-то из коллег без поллитра разберется, как это работает, что иелось ввиду и нет ли там "подводных" камней?

Не припомню уже когда последний раз натыкался на проблемы компиляторов. Просто надо один раз прочитать страничку стандарта и пользоваться. Ошибок в поведении компилятора связанных с явным нарушением стандарта не будет. Практически невероятно. Другое дело, то некими фантазиями выходящими за пределы описанные в стандарте получить некий "результат" зависящий от компилятора можно. По этой причине я и плохо отношусь к методу "тыка".
_Bill
Цитата(GetSmart @ Jul 10 2011, 00:53) *
По логике операции ?: мне не очень понятно. Она может работать с целыми объектами. Но зачем-то вынуждает объект преобразоваться. В то же время простые скобки не вынуждают объект преобразовываться.
Код
double (*p)(double);

p = &(flag ? sin : cos);       // не работает

И не должна работать!!!
Рабочий вариант
Код
double sin(double);
double cos(double);
p = flag? sin : cos;
Или нет?
GetSmart
Цитата(_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 сиё мне неведомо.
XVR
Цитата
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)
GetSmart
Цитата(XVR @ Jul 13 2011, 00:26) *
Вот собственно для этого

Чтобы программист перегрелся? sm.gif

Создавать копию вроде бы команды не было. Видимо зависит от реализации. А значит применять не рекомендуется. Но только со структурами. С массивами и указателями на структуры/юнионами вроде всё должно работать красиво.
XVR
Цитата
Создавать копию вроде бы команды не было.
В С других вариантов нет, увы sad.gif Референсов там нет, а оператор '?' должен вернуть один из 2х своих операндов. И что он может вернуть вместо структуры?
Цитата
Видимо зависит от реализации.
От оптимизатора.
Цитата
С массивами и указателями на структуры/юнионами вроде всё должно работать красиво.
А это все скалярные значения - указатели. Они сами и возвращаются.
demiurg_spb
Дай думаю, загляну на огонёкwink.gif
Да в си массивы несколько выбиваются из общих принципов и подходов относительно скаляров.
Так при передаче массива в качестве аргумента будет передан лишь указатель (вернее даже сказать ссылка в понятиях С++, хотя общепринято что в си нет ссылок...), а если передавать любой скаляр или даже агрегат будет передано значение.
Сам часто пользуюсь этим:
Код
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]"
компилятор кейл. Что собственно и ожидалось.
Dog Pawlowa
Цитата(011119xx @ Jul 10 2011, 14:05) *
Проблему я для себя решил, как уже писал выше.

Если быть совсем точным, Вы не решили проблему, а отказались ее решать wink.gif
GetSmart
Цитата(XVR @ Jul 13 2011, 10:57) *
А это все скалярные значения - указатели. Они сами и возвращаются.

Не. Не поэтому.
Даже если он копию указателя сделает, то значения указателей будут равными. И после операторов [], -> будет уже использоваться исходный объект, а копия указателя была или нет уже не важно. При этом можно смело брать адрес элемента/поля исходного объекта. И даже присваивать ему (то бишь ?: в левой части выражения), как указывал ReAl.
011119xx
Цитата(Dog Pawlowa @ Jul 13 2011, 12:39) *
Если быть совсем точным, Вы не решили проблему, а отказались ее решать wink.gif

Обоснуйте.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.