Ответы пользователя по тегу C
  • КАК в D или d C++ проверить наличие элемента array[3][4] ?

    Rio
    @Rio
    Смотря что значит "наличие элемента в массиве". Если массив статический, то элемент там всегда наличествует. А если динамический, то в D можно проверить что такие индексы существуют, вот так например:

    auto array = new int[10][20];
    
    /* ... */
    
    writeln(array.length);  // напишет 20
    writeln(array[0].length); // напишет 10
    
    // проверим, что есть элемент [3][4]
    if ((array.length < 4) || (array[0].length < 3))
    	writeln("fail"); // а вот это не напишет, значит элемент [3][4] доступен.


    Ещё можно явно отлавливать исключение, когда читается несуществующий элемент:
    auto array = new int[10][20];
    
    /* ... */
    
    bool isElementExist(int[10][] a, size_t indexA, size_t indexB)
    {
    	try { auto i = a[indexA][indexB]; }
    	catch { return false; }
    	return true;
    }
    
    /* ... */
    
    writeln(isElementExist(array, 300, 4)); // false
    writeln(isElementExist(array, 3, 4)); // true
    Ответ написан
    Комментировать
  • Соглашение о работе с ядром в подпрограммах языка С++

    Rio
    @Rio
    В C и С++ по-умолчанию стек после вызова очищает вызывающий код. Так сделано было для того, чтобы работали функции с переменным числом параметров (ведь только вызывающий код знает, сколько параметров он положил в стек). В Паскале принято, что стек чистит сама вызываемая функция.

    В разных ОС могут быть различные соглашения вызовов API, в Windows принят паскалевский вариант, поэтому все функции ядра Windows объявлены с модификатором __stdcall. Соответственно, модификатор __cdecl определяет функции, использующие сишный договор о передаче параметров.
    Ответ написан
    1 комментарий