Вниз  C / C++
- 20.09.2014 / 15:40
aNNiMON
  Супервизор

aNNiMON 
Сейчас: Offline
NeiroNext, тебе нужно прототип класса объявить:
  1. class A;
  2. class B {
  3. public:
  4.     B(A *a);
  5. }
  6.  
  7. class A {
  8. }

__________________
 let live

Изменено aNNiMON (20.09 / 15:40) (всего 2 раза)
- 20.09.2014 / 16:06
NeiroNext
  Пользователь

NeiroNext 
Сейчас: Offline
aNNiMON, Спасибо! Раньше не знал применения этого выражения, хотя применять приходилось :-D
Про обьявление прототипа догадывался, но в основном коде это не сработало и я про него забыл, а зря.
Оказалось что в данном случае в A.cpp нужно дописать инклуд В, помимо обьявления прототипа в A.h, ну или наоборот. В данном случае работает и с одним прототипом в хидере, но в основном проекте где эта ошибка встретилась нужно было еще и в самом *.сpp инклуд дописать.
Еще раз спасибо, при помощи хороших людей наконец точно понял применение обьявления прототипа!
- 20.09.2014 / 16:23
Naik
  Пользователь

Naik 
Сейчас: Offline
Матеиатические функции заработали в Netbeans, нужно зайти в свойства проекта - компоновщик - библиотеки и выбрать "математика"
- 20.09.2014 / 19:02
Naik
  Пользователь

Naik 
Сейчас: Offline
Немного непонятно
  1. typedef struct {
  2.     int cost;
  3.     int items;
  4. } Cell;
  5.  
  6. //...
  7.     Cell** arr = (Cell**) malloc(rows * sizeof(*arr));
  8.     for (int i = 0;i < rows;i++) {
  9.         arr[i] = malloc(cols * sizeof(*arr));
  10.     }

1. Когда первый раз выделяем память, для указателей на указатели, то выделяется память колл. рядов умножить на размер структуры? Зачем, ведь там хранится указатель, на массив, а не структура?

2. Чтобы очистить память от 2д-массива достаточно free(arr)?
- 20.09.2014 / 21:21
aNNiMON
  Супервизор

aNNiMON 
Сейчас: Offline
Naik, 1. Не совсем понял, что ты там про указатели имел в виду, но, по-моему там ошибка во внутреннем цикле - нужно sizeof(**arr), то есть одной ячейки, а sizeof(*arr) - это размер всей строки.
Нам нужно выделить память под двумерный массив структуры. Одна запись структуры в памяти будет занимать грубо говоря sizeof(Cell) = sizeof(cost) + sizeof(items) = 2 * sizeof(int) = 4..32 байта (в зависимости от платформы). Пусть будет 16, как для 32битных систем.
Чтобы создать массив из col элементов структуры, нам потребуется sizeof(arr[]) = col * sizeof(Cell) = col * 2 * sizeof(int) байт, то есть col * 16.
Чтобы создать двумерный массив row x col, нужно sizeof(arr[][]) = row * sizeof(arr[]) = row * col * sizeof(Cell) = row * col * 2 * sizeof(int) байт. То есть row * col * 16 байт.
Даже если ты будешь хранить указатели на row одномерных массивов arr, тебе всё равно нужно row раз выделять память под одномерный массив. Собственно, по-сути это и делается.
Надеюсь, понятно объяснил?

2. Я не знаю, что делает free? Если это аналог delete [] arr в C++, тогда нет. Сначала освобождай каждую строку массива, а потом сам массив. Получается обратная операция той, что была в первом случае.
  1. for(int i = 0; i < row; i++) free(arr[i])
  2. free(arr);
Сначала освобождаем данные в arr[0][0..col], arr[1][0..col], а потом освобождаем указатели на строки arr[0..row][].
__________________
 let live

Изменено aNNiMON (20.09 / 21:31) (всего 3 раза)
- 20.09.2014 / 21:37
ВитаминКО
  Супермодератор

ВитаминКО 
Сейчас: Offline
подкиньте ссылок на книги для быстрого старта кодинга, если есть такие.. (С++) + Qt

а то как то не хочется сначала С, потом Ку-тэ..
__________________
 わからない!!
- 20.09.2014 / 22:24
Ксакеп
  Модератор форума

Ксакеп 
Сейчас: Offline
ВитаминКО, C. Липпман. Не быстрый, но хороший.
- 21.09.2014 / 08:51
Naik
  Пользователь

Naik 
Сейчас: Offline
aNNiMON, Читал, что если в sizeof подставить указатель, то берется его тип. Это просто для того, чтобы если поменять тип массива, то не менять его в sizeof. Так что насколько я понимаю что *arr, что **arr нет разницы, главное тип.
- 21.09.2014 / 18:38
Naik
  Пользователь

Naik 
Сейчас: Offline
Почему так работает
  1. int t;
  2. scanf("%d", &t);
  3. matrix[0][0].cost = &t;
  4. printf("%d ", *matrix[0][0].cost);
а так segmentation fault в рантайме
  1. scanf("%d", matrix[0][0].cost);
  2. printf("%d ", *matrix[0][0].cost);

Вот сама структура
Открыть спойлер
Если в структуре не использовать указатели и читать так scanf("%d", &matrix[0][0].cost); то тоже работает..

Изменено Naik (21.09 / 18:45) (всего 1 раз)
- 21.09.2014 / 18:49
aNNiMON
  Супервизор

aNNiMON 
Сейчас: Offline
Naik, scanf только по ссылке может.
__________________
 let live
Наверх  Всего сообщений: 2777
Фильтровать сообщения
Поиск по теме
Файлы топика (111)