Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по программированию на C/С++

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322

Открыть новую тему     Написать ответ в эту тему

Crazy_Shrike



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Вопросы по программированию на C/С++

 
  • Справочники, книги
  • Выбор IDE (среды программирования)
     
    Постарайтесь дать как можно больше информации о возникшей проблеме - это в конце концов в ваших же интересах чтобы вам помогли.

    Решения конкретных задач собираются и обсуждаются в теме Задачи по C/С++ .

    Прежде чем просить помощи в задании...
    Если позарез надо и вы даже готовы заплатить

    Как правильно задавать вопросы, если вы хотите получить ответ.

    Полезные ссылки:
    C++(eng)

  • Всего записей: 241 | Зарегистр. 25-03-2004 | Отправлено: 13:37 06-05-2004 | Исправлено: AZJIO, 19:45 12-05-2014
    AnGo



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Hi, All!
     
    Есть ли здесь знатоки VC++ и BCB 6 в одном флаконе?
    Есть хорошая бибилиотека темплэйтов для работы с деревьями, но беда в том, что она написана для VC++ и под Билдером выдает ошибки такого типа:
     
    [C++ Error] basic_tree.h(88): E2507 'basic_tree<stored_type,tree_type,container_type>::const_iterator::it' is not a direct base class of 'basic_tree<stored_type,tree_type,container_type>::iterator'
     
    [C++ Error] unique_tree.inl(110): E2316 'unique_tree<stored_type,node_compare_type,node_order_compare_type>::insert(const stored_type &)' is not a member of 'unique_tree<stored_type,node_compare_type,node_order_compare_type>'
     
    У самого, что-то лыжи совсем не едут, на мой взгляд в сорцах никакого криминала нет, или я просто не вижу его.
     
    Сама библиотека и примеры к ней живут здесь
     
    http://www.datasoftsolutions.net/
     
    Вообщем, хелп, люди добрые!

    Всего записей: 1078 | Зарегистр. 07-07-2002 | Отправлено: 14:18 15-05-2006
    SaDFromSpb



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Почему вот этот код отрабатывает нормально?

    Код:
     
    #include <iostream>  
    #include <vector>
    using namespace std;
     
    int main(int argc, char* argv[]) {    
        vector<int> vec(3);    
        for (int i=0; i<100; i++)
        {
            vec[i] = 4*i;
            cout << vec[i] << endl;
        }
        cout << vec.size() << endl;
    return 0;
    }
    то есть, выводит числа до 396 и длину вектора, равную 3-м!!! Причем отрабатывает даже если с efense собирать.
    Компилятор
    Цитата:
    c++ (GCC) 3.3.3 20040412 (Red Hat Linux 3.3.3-7)

     
    Добавлено:
    Если вместо operator[] использовать at(), то отваливается, как надо.

    Всего записей: 209 | Зарегистр. 22-06-2004 | Отправлено: 19:46 15-05-2006 | Исправлено: SaDFromSpb, 19:47 15-05-2006
    xitsa



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    to SaDFromSpb
    На самом деле, так как оператор [] не обременен проверкой, идет порча памяти в куче, что чревато глюками при следующем выделении:
    vector<> выделяет блок определенного размера по умолчанию и далее как с обычным массивом, очень легко выйти за пределы и порушить кучу. Чревато трудно отлавливаемыми багами (у себя сумел отловить только при переводе на STLport части кода и включения отладочного режима).
    Плюс в некоторых реализациях STL память по умолчанию выделяется блоками, размерами в страницу (4096 байт), почему и встроенная защита может не сработать.
    В общем, я использую push_back'и и insert'ы вместо выделения сразу необходимого количества элементов по умолчанию — глюков меньше

    Всего записей: 103 | Зарегистр. 25-04-2006 | Отправлено: 22:03 15-05-2006
    SaDFromSpb



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    То есть оператор [] и не должен нифига проверять?
    Это очень печально. Он как-то изящнее выглядит по сравнению с at(), но с другой стороны и проверка должна быть.

    Всего записей: 209 | Зарегистр. 22-06-2004 | Отправлено: 16:31 16-05-2006
    Mickey_from_nsk

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SaDFromSpb
    Увы, согласно стандарта - не должен.
    Кстати, а почему увы?
    Если приходится это проверять, наверно есть сомнения в корректности кода? А если есть сомнения, может алгоритм пересмотреть?

    Всего записей: 636 | Зарегистр. 21-10-2002 | Отправлено: 12:01 17-05-2006
    SaDFromSpb



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Mickey_from_nsk

    Цитата:
    Если приходится это проверять, наверно есть сомнения в корректности кода? А если есть сомнения, может алгоритм пересмотреть?
    Дело в том, что пишется библиотека, которой будет пользоваться неизвестно кто и неизвестно когда.

    Цитата:
    Увы, согласно стандарта - не должен.
    Да... хотя немного странно, ведь для контейнера map квадратные скобки создают новый элемент, если операнд не входит в существующие ключи.

    Всего записей: 209 | Зарегистр. 22-06-2004 | Отправлено: 10:09 18-05-2006
    Mickey_from_nsk

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SaDFromSpb

    Цитата:
    Да... хотя немного странно, ведь для контейнера map квадратные скобки создают новый элемент, если операнд не входит в существующие ключи.

    Но заметь, что и там исключение не бросается. Может дело в единообразии по исключениям?

    Всего записей: 636 | Зарегистр. 21-10-2002 | Отправлено: 12:06 18-05-2006
    Slay1

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Как обращаться к елементам двухмерного массива с помощью указателей?
    Например для одномерного:
    a[i] == *(a+1)
    А для двух a[i][j] == ??

    Всего записей: 9 | Зарегистр. 14-01-2006 | Отправлено: 22:38 18-05-2006
    EVD



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Slay1
    Двухмерный массив это массив, каждый элемент которого одномерный массив.
    Следовательно:

    Код:
     
       a[0][0] = *(*(a+1)+1);
      //a[0][0] = a[1][1];
     

    Всего записей: 123 | Зарегистр. 22-12-2005 | Отправлено: 22:52 18-05-2006 | Исправлено: EVD, 22:52 18-05-2006
    Slay1

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    EVD
    Спасибо!!

    Всего записей: 9 | Зарегистр. 14-01-2006 | Отправлено: 23:12 18-05-2006
    Mickey_from_nsk

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    EVD
    Поправка. Если я не ошибаюсь, то если массив объявлен как  
    int a[10][20]
    То в памяти создается плоский (одномерный) массив, а доступ к элементам по указателю будет как *(a+10*i+j).
    Сказанное тобой справедливо для массивов, объявленных в виде  
    int a[][], а затем выделенных с помощью динамических операторов.

    Всего записей: 636 | Зарегистр. 21-10-2002 | Отправлено: 06:27 19-05-2006
    EVD



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Mickey_from_nsk
    Мне кажется, что ты ошибаешся
    Если бы так и было, то код, приведенный мной, не сработал бы, т.к. у меня там двойное разименование указателя. А код работает. Следовательно конструкция int a[10][20] создает не одномерный массив, а двухмерный (массив из указателей)

    Всего записей: 123 | Зарегистр. 22-12-2005 | Отправлено: 08:05 19-05-2006
    DeviL



    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

    Цитата:
    При выполнении объявления двумерного массива int arr2[4][3] в памяти выделяется участок для хранения значения переменной arr, которая является указателем на массив из четырех указателей. Для этого массива из четырех указателей тоже выделяется память. Каждый из этих четырех указателей содержит адрес массива из трех элементов типа int, и, следовательно, в памяти компьютера выделяется четыре участка для хранения четырех массивов чисел типа int, каждый из которых состоит из трех элементов.


    Цитата:
    объявление arr2[4][3] порождает в программе три разных объекта: указатель с идентификатором arr, безымянный массив из четырех указателей и безымянный массив из двенадцати чисел типа int. Для доступа к безымянным массивам используются адресные выражения с указателем arr. Доступ к элементам массива указателей осуществляется с указанием одного индексного выражения в форме arr2[2] или *(arr2+2). Для доступа к элементам двумерного массива чисел типа int должны быть использованы два индексных выражения в форме arr2[1][2] или эквивалентных ей *(*(arr2+1)+2) и (*(arr2+1))[2].

    Чтобы не осталось неясностей.

    Всего записей: 268 | Зарегистр. 24-10-2003 | Отправлено: 10:50 19-05-2006
    WiseAlex



    Софтовых дел М...
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    DeviL
    как то это странно. например такой код работает:

    Код:
     
    #include <assert.h>
    int array[2][2]={{1,2},{3,4}};
    int main(int argc, _TCHAR* argv[])
    {
      int * pInt = (int*)array;
      assert(*pInt==1);
      pInt = (int*)(array[0]);
      assert(*pInt==1);
      pInt = (int*)(&array[0][0]);
      assert(*pInt==1);
      return 0;
    }
     

    более того pInt - всегда содержит один адрес
    похоже, что
    Цитата:
    безымянный массив из четырех указателей
    чисто "виртуальный" и используется исключительно для операций типа
    Цитата:
    *(*(arr2+1)+2)  
    и физически никогда не создается т.к. мы не можем создат функцию типа int f(int arr[][]); Если бы такой безымянный массив существовал физически, то проблем с этой функцией не возникло
    ---
    добавлено:
    DeviL
    кстати а цитаты откуда?

    Всего записей: 1001 | Зарегистр. 02-03-2003 | Отправлено: 13:33 19-05-2006 | Исправлено: WiseAlex, 22:20 21-05-2006
    SaDFromSpb



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    WiseAlex
    Да.. согласен.

    Код:
      int * pInt0 = (int*)array;
      int * pInt1 = (int*)(array[0]);
      int * pInt2 = (int*)(&array[0][0]);
      assert(pInt0==pInt1);
      assert(pInt1==pInt2);

    Похоже, что массив из указателей - миф какой-то. Кстати эта "виртуальная многомерность этого массива" поддерживается только в пределах блока его объявления. При передаче его по ссылке он уже обычный одномерный. Если б существовал еще массив указателей, была бы возможность его прикручивать, чтобы везде несколько квадратных скобочек использовать. (Хотя может она есть )

    Всего записей: 209 | Зарегистр. 22-06-2004 | Отправлено: 20:25 20-05-2006 | Исправлено: SaDFromSpb, 20:48 20-05-2006
    Venk

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    return CDRF_NOTIFYITEMDRAW

    Дык ить в МСДН написано, что посылая этот идентификатор мы и заставляем колонки прорисовываться по нашему, а если его не послать, то они будут рисоваться по дефолту...
    Хотя попробую.

    Всего записей: 6 | Зарегистр. 20-04-2006 | Отправлено: 10:38 21-05-2006
    Mickey_from_nsk

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    EVD
    А мне кажется, что я, все таки, прав. Давненько не брал я в руки книжек, но смотри, например, здесь (понимаю - не авторитет, но все таки) http://www.madi.ru/study/kafedra/asu/metod/program_c2/2_3.shtml

    Цитата:
    В памяти ЭВМ матрицы размещаются как одномерные массивы: после одной строки записывается следующая за ней.

     
    Если надо кода - пожалуйста.

    Код:
     
    #include <iostream>
    using namespace std;
     
    void main(void)
    {
        int a[2][3] = {{1,2,3},{4,5,6}};
        int *ptr = &a[0][0];
        
        cout << "size of array is " << sizeof(a) << endl;
        for (int i=0; i<6; i++)
        {
            cout << *ptr << " ";
            ptr++;
        }
    }
     

    Результат:
    size of array is 24
    1 2 3 4 5 6

    Всего записей: 636 | Зарегистр. 21-10-2002 | Отправлено: 07:29 22-05-2006
    DeviL



    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    WiseAlex
    Цитата из книги "Программирование на языке Си".
     
    Например в примере Mickey_from_nsk все работает так как стандартом гарантировано последовательное размещение в памяти данных.
    Разница лишь в понимании того, что создается - если создается двумерный массив, а перемещение в нем не как по многомерному, а как по одномерному - то это ошибка проектирования - ибо нах тогда было его создавать!!? работаешь как с одномерным - создавай одномерный! ИМХО - мое личное мнение )
    а насчет "чисто виртуальных" массивов указателей - лично я понял это как например в массиве:

    Код:
    int array[4][4];
     
    array[0] array[1] array[2] array[3] - и есть те самые виртуальные указатели
    каждый из этих указателей указывает на массив из 4-х элементов.
     
    Так, что мне кажется главное правильно проектировать код, а не искать возможность обмануть всех и вся!    

    Всего записей: 268 | Зарегистр. 24-10-2003 | Отправлено: 11:46 22-05-2006
    WiseAlex



    Софтовых дел М...
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    DeviL

    Цитата:
    array[0] array[1] array[2] array[3] - и есть те самые виртуальные указатели

    только физически они нигде не размещены. Это просто абстракция.

    Цитата:
    Так, что мне кажется главное правильно проектировать код, а не искать возможность обмануть всех и вся!

    это к чему?

    Всего записей: 1001 | Зарегистр. 02-03-2003 | Отправлено: 13:31 22-05-2006
    DeviL



    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    WiseAlex

    Код:
    array[4];

    array - тоже самое, но никто не развивает этой темы  .
    Думаю понятно к чему я.

    Цитата:
    это к чему?

    к тому, что я сказал - перемещение по многомерным массивам, как по одномерным - ошибка проектирования и обман того. кто читает код (себя самого).

    Всего записей: 268 | Зарегистр. 24-10-2003 | Отправлено: 17:13 22-05-2006
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по программированию на C/С++


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru