Помогите с объявлением и использованием динамически размещаемого массива в C ++ - PullRequest
0 голосов
/ 12 мая 2011

Мне нужно объявить массив массивов и, используя приведенный ниже код, выполнить это:

int **  maxc = new int *[proc_num];//memory allocated for elements of rows
      for (int i = 0; i < proc_num; i++)
      {
            maxc[i] = new int[n];//memory allocated for  elements of each column.
      }

Проблема в том, что приведенный выше код не компилируется. Я получаю следующую ошибку компиляции:

A value of type "int *" cannot be assigned to an entity of type "int"

Вот полный код:

//#include<math.h>
#include "stdafx.h"
#include <string>
#include <iostream>
#include <vector>
using namespace std;
/*
Banker's algorithm Implementation
*/
 int main(void)
 {
      int n=0;//number of resources we will  be dealing with 
      int proc_num =0;//Total number of processes to share available resources
      int* a = NULL;  // pointer to an int with initial set to point to nothing
     // int* maxc = NULL;
      int* maxR=NULL;
      int* avail = NULL;
      int* avail_temp = NULL;
      //int** alloc = NULL;
      int* unalloc = NULL;

      std::cout<<endl;
      std::cout <<" What is number of resources to be shared? :";
      cin >> n;
      std::cout<<endl;
      while(std::cin.fail())
      {
            std::cout<< " Error Please provide valid number !" <<endl;
            std::cin.clear() ;
            std::cout<<endl;
            std::cout <<" What is number of resources to be shared? :";
            cin >> n;
            std::cout<<endl;
      }

      maxR = new int[n];  // Allocate n ints and save ptr in maxc -- holds the max resources available.
      //get the maximum number of each Resources/ Ie Total Resources Available
      for(int i =0; i < n; i++)
      {
            int maxcin=0;
            std::cout << i;
            std::cout<< ". How many of resource #";
            std::cout<< i;
            std::cout<< " do you need to share ?"; 
            cin>>maxcin;
            maxR[i] = maxcin;
      }
      //<8,7,5,9>");

      std::cout<<endl;
      std::cout << "How many processes to share available resources?";
      cin>>proc_num;
      std::cout<<endl;

      int **  maxc = new int *[proc_num];//memory allocated for elements of rows
      for (int i = 0; i < proc_num; i++)
      {
            maxc[i] = new int*[n];//memory allocated for  elements of each column.
      }
}

Ответы [ 4 ]

2 голосов
/ 12 мая 2011

То, что ошибка теперь вы получаете, полностью отличается от того, что вы опубликовали ранее.В последнем цикле for -

maxc[i] = new int*[n];

должно быть -

maxc[i] = new int[n];

В фрагменте, который вы ранее разместили, это было правильно.Кроме того, вы должны освободить ресурсы, полученные new[], используя delete[], иначе утечка памяти будет преобладать.

2 голосов
/ 12 мая 2011

Проблема, с которой вы сталкиваетесь, находится в этом разделе кода, который вы опубликовали:

int **  maxc = new int *[proc_num];
for (int i = 0; i < proc_num; i++)
{
    maxc[i] = new int*[n];
}

Внутри цикла for вы выделяете новый массив int указателей, но оригиналтип для maxc был типа указатель на указатель.В этом контексте это также может быть истолковано как «1006» - это указатель, который указывает на массив указателей.Это, конечно, выполняется в первом присваивании, когда вы возвращаете указатель из new, который указывает на массив int*.Поэтому оператор внутри цикла for назначает неправильный тип каждому элементу массива.Типом для элементов массива maxc[x] являются int указатели, что означает, что они должны указывать либо на один или несколько объектов типа int, но не на элементы типа int*.Но ваш оператор new в цикле пытается выделить другой массив из указателей int и вернуть указатель на этот выделенный массив, что означает, что возвращаемый тип снова равен int**, и это не правильно.Поэтому вы должны изменить внутреннюю часть вашего цикла следующим образом:

maxc[i] = new int[n]; //allocate an array of int's, and return an int pointer

Я заметил, что первый фрагмент кода, который вы разместили, действительно делает это, так что, возможно, вы столкнулись с простой опечаткой, которую пропустили?1020 * Наконец, когда вы удаляете эту память, поскольку каждая строка была создана с использованием new, вам придется вызывать delete в каждой строке, представляющей массив int.Затем вам нужно будет вызвать delete для столбца, представляющего массив int указателей, которые указывали на массив int.Таким образом, освобождение всей выделенной памяти будет выглядеть следующим образом:

for (int i=0; i < proc_num; i++)
{
    //call delete on each pointer in each column of the array that is pointing to a
    //row array of int's
    delete [] maxc[i];  
}

//call delete on the pointer pointing to the column of 
//the array that contains the original int pointers that were
//pointing to each of the row arrays of int's
delete [] maxc;
1 голос
/ 12 мая 2011

У вас могут быть проблемы с получением правильных объявлений, но ваша настоящая проблема не в том, чтобы использовать стандартные контейнеры для выполнения работы за вас.

Этот код:

  int **  maxc = new int *[proc_num];//memory allocated for elements of rows
  for (int i = 0; i < proc_num; i++)
  {
        maxc[i] = new int*[n];//memory allocated for  elements of each column.
  }

Может быть исправленочтобы сделать его компиляцией.

  int **  maxc = new int *[proc_num];
  for (int i = 0; i < proc_num; i++)
  {
        maxc[i] = new int[n];
             //     ^^^^ Note no star here.
  }

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

Лучшее решение было бы:

std::vector<std::vector<int> >  maxc(proc_num, std::vector<int>(n, 0)); // even initializes all elements to 0

Если вы хотите выглядеть модно, вы посмотрите на увеличить многомерный массив это может дать вам небольшие улучшения производительности (если вы умножаете матрицу и т. д.).

если вы действительно хотите сделать это вручную, тогда я бы начал изучать классы иRAII.

1 голос
/ 12 мая 2011

Это:

int main() {
    int proc_num = 100;
    int n = 42;
    int **  maxc = new int *[proc_num];//memory allocated for elements of rows
    for (int i = 0; i < proc_num; i++) {
            maxc[i] = new int[n];//memory allocated for  elements of each column.
    }
}

компилируется просто отлично для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...