LINUX.ORG.RU

Помогите написать hello world на c++

 , ,


0

1

Хотел проверить насколько долго будет выполняться код, который многократно копирует большой массив в функцию и пришел вот к такому «результату»:

#include <iostream>
void test(int array[], int count)
{
	array[0] = 123;
	int i = 0;
	int x,y = 123;
	for (i; i < count; i++)
	{
		x = y;
	}
}

int main ()
{
	const unsigned int llong = -1;
	std::cout << llong;
	int array[llong] = {};
	for (int i = 0; i < llong; i++)
		test(array[llong], llong);
}

В итоге компилятор выдает вот такую ошибку и вот такое замечание:

1.cpp: В функции «int main()»:
1.cpp:19:33: ошибка: invalid conversion from «int» to «int*» [-fpermissive]
   19 |             test(array[llong], llong);
      |                  ~~~~~~~~~~~^
      |                             |
      |                             int

1.cpp:2:15: замечание:   при инициализации 1 -го аргумента «void test(int*, int)»
    2 | void test(int array[], int count)
      |           ~~~~^~~~~~~
---------------------------------------------

В чем ошибка? как изменить код, чтобы компилятор не жаловался на несоответсвие типов? что делает -fpermissive?

я знаю в коде много ненужных строчек


test(array[llong], llong);

Замени на test(array, llong);

я знаю в коде много ненужных строчек

Ага. Все.

Tanger ★★★★★
()

invalid conversion from «int» to «int*»

array[llong]

\equiv

*(array + llong)
*this

int array[llong] = {};

Размещаешь на стеке 4 гигабайта -> сегфолт.

копирует большой массив в функцию

Там не копирования массива.

thunar ★★★★★
()
Последнее исправление: thunar (всего исправлений: 4)
Ответ на: комментарий от thunar

да, я только сейчас понял каждый int по 4 байта количеством 4 миллиарда - это примерно 16 гигабайтов.

i61
() автор топика
Ответ на: комментарий от thunar

А что там, если не копирование массива? Вызываем функцию и как любую переменную, кроме ссылок и указателей, копируем в функцию

i61
() автор топика
Ответ на: комментарий от ox55ff

Хватит писать на сишке и называть это c++

а то что, потеряешь уважение в среде красноглазиков-идиоматиков?

seiken ★★★★★
()
Ответ на: комментарий от seiken

А то не пройдёшь ревью кода на нормальной работе.

fluorite ★★★★★
()
Ответ на: комментарий от seiken

а то что

А то стэк порвёт. У него размер приходит извне.

const unsigned int llong = -1;
unsigned int
-1

Вся суть сишников.

ox55ff ★★★★★
()
Ответ на: комментарий от seiken

VLA никогда не были (и не будут) частью C++ вне расширений конкретного компилятора (которых лучше бы не было, но против существующего говнокода ничего не попишешь).

Частью C они были только в стандарте C99 (в C11 и после - опциональная фича). Так что ox55ff прав, с той усиливающей поправкой, что это ещё и специфичная для одной версии стандарта и фактически крайне проблемная часть C.

lwo
()
Ответ на: комментарий от lwo

ах да… это я в режиме «топик не читать - комменты коментить» написал, а из однострочной цитаты этого не было видно.

Там ведь могло бы быть «#define llong 123» перед об’явлением массива… И потом, предложение использовать std::vector только потому что он в стандартной библиотеке есть - это не то же самое, что «отказаться от VLA».

seiken ★★★★★
()
Ответ на: комментарий от seiken

Согласен. Если у массива размер является выражением времени компиляции, то лично я против такого массива в C++ ничего не имею и сам не буду включать заголовок <array> на несколько тысяч строк, чтобы от него избавиться. Хотя у других людей есть вполне объективные причины именно так и делать: поведение массивного недо-типа отвратительное ещё со времён C.

Можно отметить, что std::vector не будет абсолютно оптимальным инструментом в случаях типа этого, когда размер известен заранее и не меняется в процессе работы. Для этого не нужно спекулятивно выделять больше памяти и хранить три указателя, как это делает вектор. Накладной расход мизерный, но в C++ часто идёт речь именно о нулевом. В таком случае можно использовать, как ни странно, std::unique_ptr<T[]>, или написать свою маленькую обёртку вокруг new[]/delete[].

Но вести такие разговоры в присутствии новичка, написавшего то, что написано в шапке, скорее вредно :) так что я посоветую ему изучить один из самых популярных, если не самый, STL-контейнер (коим вектор, как ни крути, является) и проверять свой код на ахинею типа «создадим массив размером -1».

lwo
()
Ответ на: комментарий от i61

Если принципиально именно такой говнокод в стиле начала 90х, то можешь запихать размер массива в константу, массив сделать полем структуры и структуру передавать в функцию по значению.

khrundel ★★★★
()
Ответ на: комментарий от khrundel

aka в точности std::array. Я не к тому, что подход неправильный, он правильный, просто этот велосипед в стандартной библиотеке уже есть. (Правда, в начале 90-х не было, да.)

lwo
()
Последнее исправление: lwo (всего исправлений: 1)
Ответ на: комментарий от khrundel

Передача массива, как поле структуры работает так, как я хотел, каждый раз при вызове функции массив копируется.

i61
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.