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

 
 
> Как в си объявить массив с возможностью изменения его размера?
011119xx
сообщение Jul 7 2011, 03:36
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



Необходимо в Кейле объявить массив без указания его размера. А потом по необходимости использования массива задать размер в зависимости от условий. Можно ли это сделать на си и как?
Go to the top of the page
 
+Quote Post
12 страниц V  « < 9 10 11 12 >  
Start new topic
Ответов (150 - 164)
ReAl
сообщение Jul 9 2011, 21:01
Сообщение #151


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

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



Цитата(AHTOXA @ Jul 9 2011, 21:57) *
0 errors, 0 warnings. Работаетsm.gif
Так и я могу :-)
«работает в конретном компиляторе» и «обязано работать» -- разные вещи.
Хотя, похоже, что обязано.


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


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



Право не ожидал столь бурного и порой веселого, если смотреть со стороны, обсуждения. Спасибо всем откликнувшимся. Проблему я для себя решил, как уже писал выше.
Go to the top of the page
 
+Quote Post
XVR
сообщение Jul 10 2011, 11:39
Сообщение #153


Гуру
******

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



Цитата
По логике операции ?: мне не очень понятно.
С ней как раз все понятно. Ее результатом является rvalue (а не lvalue). Ему нельзя ничего присвоить, и его адрес нельзя получить. Кстати, в С++ это несколько не так - результатом оператора ? может быть референс, а он является lvalue. Т.е. в С++ это будет валидно:

Код
int a,b;

(some?a:b)=1;
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 10 2011, 11:47
Сообщение #154


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

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



Господа-любители экзотических языковых конструкций!

Вы бы хоть ветку новую открыли, что-ли. И так уже 11 страница в топике.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 10 2011, 11:58
Сообщение #155


Гуру
******

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



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

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





--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 10 2011, 12:21
Сообщение #156


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

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



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


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

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

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

Я потому и ратую за отдельную ветку. Там можно было бы и проверку развернуть, да и остальные туда для самообразования заглядывали. А какое отношение к обсуждению вопросов о массивах имеет терна́рная усло́вная опера́ция ?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 10 2011, 13:17
Сообщение #157


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
_Bill
сообщение Jul 12 2011, 16:29
Сообщение #158


Местный
***

Группа: Участник
Сообщений: 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;
Или нет?
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jul 12 2011, 16:32
Сообщение #159


.
******

Группа: Участник
Сообщений: 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


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


Гуру
******

Группа: Свой
Сообщений: 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)
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jul 12 2011, 19:34
Сообщение #161


.
******

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



Цитата(XVR @ Jul 13 2011, 00:26) *
Вот собственно для этого

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

Создавать копию вроде бы команды не было. Видимо зависит от реализации. А значит применять не рекомендуется. Но только со структурами. С массивами и указателями на структуры/юнионами вроде всё должно работать красиво.

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


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


Гуру
******

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



Цитата
Создавать копию вроде бы команды не было.
В С других вариантов нет, увы sad.gif Референсов там нет, а оператор '?' должен вернуть один из 2х своих операндов. И что он может вернуть вместо структуры?
Цитата
Видимо зависит от реализации.
От оптимизатора.
Цитата
С массивами и указателями на структуры/юнионами вроде всё должно работать красиво.
А это все скалярные значения - указатели. Они сами и возвращаются.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jul 13 2011, 06:11
Сообщение #163


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

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



Дай думаю, загляну на огонёк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]"
компилятор кейл. Что собственно и ожидалось.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Jul 13 2011, 06:39
Сообщение #164


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(011119xx @ Jul 10 2011, 14:05) *
Проблему я для себя решил, как уже писал выше.

Если быть совсем точным, Вы не решили проблему, а отказались ее решать wink.gif


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jul 13 2011, 10:26
Сообщение #165


.
******

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



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

Не. Не поэтому.
Даже если он копию указателя сделает, то значения указателей будут равными. И после операторов [], -> будет уже использоваться исходный объект, а копия указателя была или нет уже не важно. При этом можно смело брать адрес элемента/поля исходного объекта. И даже присваивать ему (то бишь ?: в левой части выражения), как указывал ReAl.

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


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post

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

 


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


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