|
Си и массив как аргумент функции
|
|||
---|---|---|---|
#18+
Тут пришлось с Си (не С++) поработать. Правильно ли, что вот это вот для компилятора эквивалентно? Код: plaintext 1. 2.
Т.е. первая функция на самом деле видится компилятором как вторая? И по сути "int a[3]" только человек может прочитать, а компилятор тут видит "int *a"? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2020, 15:40 |
|
Си и массив как аргумент функции
|
|||
---|---|---|---|
#18+
petrav, не верно: в первом случае вы передаете целое число а[3] (из некоторого массива а) во втором показатель на целое число по-видимому, в первом случае вы имели ввиду int a[], тогда имело бы смысл говорить об эквивалентности. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2020, 16:29 |
|
Си и массив как аргумент функции
|
|||
---|---|---|---|
#18+
Я-бы рассмотрел еще многомерные. И varrargs. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2020, 16:35 |
|
Си и массив как аргумент функции
|
|||
---|---|---|---|
#18+
mini.weblab в первом случае вы передаете целое число а[3] (из некоторого массива а) во втором показатель на целое число Чё? mini.weblab по-видимому, в первом случае вы имели ввиду int a[] Нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2020, 16:44 |
|
Си и массив как аргумент функции
|
|||
---|---|---|---|
#18+
mini.weblab petrav, void foo(int a[3]); в первом случае вы передаете целое число а[3] (из некоторого массива а) . здесь я неправа, в мануале передают массив так void foo(int *а); void foo(int a[]); ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2020, 16:51 |
|
Си и массив как аргумент функции
|
|||
---|---|---|---|
#18+
petrav Т.е. первая функция на самом деле видится компилятором как вторая? И по сути "int a[3]" только человек может прочитать, а компилятор тут видит "int *a"? Да. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2020, 17:09 |
|
Си и массив как аргумент функции
|
|||
---|---|---|---|
#18+
petrav, 1. я думаю, что все зависит от реализации конкретного компилятора 2. по Кернигану-Ричи, когда речь идет о массиве, все три выражения эквивалентны авторParameter declaration: So as far as f is concerned, the fact that the parameter refers to part of a larger array is of no consequence. ... Of course, it is illegal to refer to objects that are not within the array bounds. f - обозначение декларируемой функции: f(int *arr), f(int arr[]) Код: plaintext 1. 2. 3.
3. В общем случае выражения не будут эквивалентными, т.к. выражении void foo(int *a) будет более общим, как доказательство предложу рассмотреть отсутствие ограничения на количество элементов массива ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2020, 17:19 |
|
Си и массив как аргумент функции
|
|||
---|---|---|---|
#18+
mini.weblab Код: plaintext 1. 2. 3.
3. В общем случае выражения не будут эквивалентными, т.к. выражении void foo(int *a) будет более общим, как доказательство предложу рассмотреть отсутствие ограничения на количество элементов массива Ну вот у меня в Студии (компилятор Си) в функцию "void foo(int a[3])" подставляется и NULL, и массив из 5-ти элементов, и простой указатель на int. И всё без единого варнинга. Во язык, я понимаю. :) Простой и ясный. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2020, 17:24 |
|
Си и массив как аргумент функции
|
|||
---|---|---|---|
#18+
petrav mini.weblab Код: plaintext 1. 2. 3.
3. В общем случае выражения не будут эквивалентными, т.к. выражении void foo(int *a) будет более общим, как доказательство предложу рассмотреть отсутствие ограничения на количество элементов массива Ну вот у меня в Студии (компилятор Си) в функцию "void foo(int a[3])" подставляется и NULL, и массив из 5-ти элементов, и простой указатель на int. И всё без единого варнинга. Во язык, я понимаю. :) Простой и ясный. Это то о чем я говорил. Чортов компиллятор может 80% потенциальных граблей отбросить без этих ПВС-студий еще в фазе компилляции. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2020, 17:32 |
|
Си и массив как аргумент функции
|
|||
---|---|---|---|
#18+
maytonЧортов компиллятор может 80% потенциальных граблей отбросить без этих ПВС-студий еще в фазе компилляции. Может. Но не хочет. Вместо этого почему-то подменяет написанное "передать массив трёх целых по значению" на "передать указатель на любой массив". Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2020, 17:42 |
|
Си и массив как аргумент функции
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov maytonЧортов компиллятор может 80% потенциальных граблей отбросить без этих ПВС-студий еще в фазе компилляции. Может. Но не хочет. Вместо этого почему-то подменяет написанное "передать массив трёх целых по значению" на "передать указатель на любой массив". Потому что так в стандарте написано. Я вспомнил, где-то читал, то ли у Керниган & Ритчи, то ли у Страуструпа, что вот такое "int a[3]" в сигнатуре функции -- это просто подсказка для человека. Но на самом деле там "int *a". Компилятор тут бессилен. Он даже варнинг тут выдать не может. А массивы в Си не передаются по значению и тоже по стандарту. Хотя это косяк из-за не симметрии. Структуры же передаются по значению. У них была странная аргументация: массивы не передаются по значению, что бы из-за ошибки программиста не просадить производительность приложения. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2020, 17:51 |
|
Си и массив как аргумент функции
|
|||
---|---|---|---|
#18+
:) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2020, 17:53 |
|
Си и массив как аргумент функции
|
|||
---|---|---|---|
#18+
petrav Ну вот у меня в Студии ... И всё без единого варнинга. Во язык, я понимаю. :) Простой и ясный. Студия много на себя берет и не предупреждает там где стоило бы. Для начала подними уровень ворнингов на максимальный, это где-то в свойствах проекта. По теме: массив и указатель одно и тоже, передать массив в параметрах нельзя, но передавая массив как указатель размер массива не передается. В шаблонах С++ можно передать массив как массив, но тогда для каждой размерности массива компилируется отдельная функция. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2020, 18:35 |
|
Си и массив как аргумент функции
|
|||
---|---|---|---|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2020, 18:43 |
|
Си и массив как аргумент функции
|
|||
---|---|---|---|
#18+
Dima T petrav Ну вот у меня в Студии ... И всё без единого варнинга. Во язык, я понимаю. :) Простой и ясный. Студия много на себя берет и не предупреждает там где стоило бы. Для начала подними уровень ворнингов на максимальный, это где-то в свойствах проекта. Уровень предупреждений стоит на оптимальном значении -- 3. Выше начинают сыпаться предупреждения на сторонние библиотеки. Даже на Windows.h. Я не знаю как их отфильтровать. Dima T По теме: массив и указатель одно и тоже, передать массив в параметрах нельзя, но передавая массив как указатель размер массива не передается. В шаблонах С++ можно передать массив как массив, но тогда для каждой размерности массива компилируется отдельная функция. Тут другое хуже. Вот так может быть только в заголовочных файлах (исключая вариант если шаблонный метод вызывается только внутри реализации класса): Код: plaintext 1. 2.
А external templates они так и не реализовали почему-то. Вот что мешало? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2020, 18:49 |
|
Си и массив как аргумент функции
|
|||
---|---|---|---|
#18+
petrav А external templates они так и не реализовали почему-то. Вот что мешало? Такие шаблоны сами по себе зло. Не надо путать массивы С с массивами С# или Java. Аналог в C++ тех массивов класс std::vector, используй его. Если хочется передать именно массив С, то передаешь указатель и размер, т.е. Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2020, 18:55 |
|
Си и массив как аргумент функции
|
|||
---|---|---|---|
#18+
petrav А external templates они так и не реализовали почему-то. Вот что мешало? А мешало то что под каждый размер компилируется отдельная функция, как ты представляешь заранее скомпилировать size_t функций? Для x64 size_t это 2 64 ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2020, 18:57 |
|
Си и массив как аргумент функции
|
|||
---|---|---|---|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2020, 19:00 |
|
Си и массив как аргумент функции
|
|||
---|---|---|---|
#18+
Dima T petrav А external templates они так и не реализовали почему-то. Вот что мешало? Такие шаблоны сами по себе зло. Какие такие? External templates зло? Почему? Dima T Не надо их путать массивы С с массивами С# или Java. Аналог в C++ тех массивов класс std::vector, используй его. Если хочется передать именно массив С, то передаешь указатель и размер, т.е. Код: plaintext 1.
Да я это понимаю. Я вопрос задал для очистки совести. Вдруг совершенно неожиданно тут "void foo(int a[3])" я догадался, что "a == NULL" вполне реально. Поскольку я программирую на С++ были необычные ощущения. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2020, 19:01 |
|
Си и массив как аргумент функции
|
|||
---|---|---|---|
#18+
mini.weblab, хватит откровенный бред постить. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2020, 19:01 |
|
Си и массив как аргумент функции
|
|||
---|---|---|---|
#18+
petrav Какие такие? External templates зло? Почему? Про External 22133213 , а зло потому что под каждый размер скомпилируется отдельная функция. Сто вызовов с разным размером - в конечном коде будет 100 разных функций. 1000 - 1000. И задать размер массива можно только явно до компиляции. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2020, 19:05 |
|
Си и массив как аргумент функции
|
|||
---|---|---|---|
#18+
Dima T petrav А external templates они так и не реализовали почему-то. Вот что мешало? А мешало то что под каждый размер компилируется отдельная функция, как ты представляешь заранее скомпилировать size_t функций? Для x64 size_t это 2 64 А как ты себе представляешь в программе руками набить 2 64 массивов: Код: plaintext 1. 2.
Что бы для них скомпилировалось 2 64 шаблонов? Только написав кодогенератор что бы сломать компилятор. И главное, при чём тут external template?! ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2020, 19:07 |
|
Си и массив как аргумент функции
|
|||
---|---|---|---|
#18+
Dima T petrav Какие такие? External templates зло? Почему? Про External 22133213 , а зло потому что под каждый размер скомпилируется отдельная функция. Сто вызовов с разным размером - в конечном коде будет 100 разных функций. 1000 - 1000. И задать размер массива можно только явно до компиляции. Где тут размер массива? Код: plaintext 1. 2.
Может я что-то путаю? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2020, 19:10 |
|
Си и массив как аргумент функции
|
|||
---|---|---|---|
#18+
petrav И главное, при чём тут external template?! external это значит скомпилировать заранее, например DLL. Как скомпилировать DLL не зная что вызовут? Код: plaintext 1. 2. 3. 4.
Если foo() internal, т.е. код шаблона в .h файле, то будет скомпилировано две функции, а если external то надо заранее иметь все возможные варианты. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2020, 19:11 |
|
Си и массив как аргумент функции
|
|||
---|---|---|---|
#18+
Dima T ... массив и указатель одно и тоже. неверно! это не бред, это контрпример! mini.weblab Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2020, 19:15 |
|
|
start [/forum/topic.php?fid=57&msg=39957698&tid=2017420]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
31ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
others: | 288ms |
total: | 415ms |
0 / 0 |