Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / помогите исправить ошибку!!! / 9 сообщений из 9, страница 1 из 1
05.04.2006, 07:58
    #33645051
dik_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите исправить ошибку!!!
попытался создать динам. массив, вот что из этого вышло, вернее не вышло :(
как вообче исправить этот код?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
int main()
{
int **array ,n;
cout<<"Razmernost massiva= ";
cin>>n;
array=(int**)malloc(n*sizeof(*array));
*array=(int*)malloc(n*sizeof(int));
cout<<"n="<<n<<endl;

for (int i= 0 ; i<n; i++)
{
   for (int j= 0 ; j<n; j++)
   {
      cin>>array[i][j];
      cout<<"i="<<i<<" j="<<j<<" "<<array[i][j]<<endl;
   }
}
...
}
дает ввести только [0][0], [0][1], [0][2]. и усё. а как с остальным быть???
...
Рейтинг: 0 / 0
05.04.2006, 08:20
    #33645080
dik_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите исправить ошибку!!!
Код: plaintext
1.
2.
3.
int **array, n;
array = new int*[n];
for(int i= 0 ; i<n; i++) array[i] = new int[n];
этот вариант работает отлично, а почему первый не работает нефига не понятно. а по логике вроде как должон
...
Рейтинг: 0 / 0
05.04.2006, 08:48
    #33645116
redskin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите исправить ошибку!!!
dik_kпопытался создать динам. массив, вот что из этого вышло, вернее не вышло :(
как вообче исправить этот код?
...

дает ввести только [0][0], [0][1], [0][2]. и усё. а как с остальным быть???

Так в первом фрагменте у тебя память выделяется только под первую строку массива. А остальные?

Сделай так же как во втором примере, будет работать:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
int main()
{
    int **array ,n;
    cout<<"Razmernost massiva= ";
    cin>>n;
    array=(int**)malloc(n*sizeof(*array));
    
    cout<<"n="<<n<<endl;

    for (int i= 0 ; i<n; i++)
    {
       array[i]=(int*)malloc(n*sizeof(int));
       for (int j= 0 ; j<n; j++)
       {
          cin>>array[i][j];
          cout<<"i="<<i<<" j="<<j<<" "<<array[i][j]<<endl;
       }
    }

    // не забудьте освободить ресурсы потом и все такое

    return  0 ;
}
...
Рейтинг: 0 / 0
05.04.2006, 08:58
    #33645130
dik_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите исправить ошибку!!!
да-да, точно, спасибо.
есть ещё вопрос: мне нужен точно такой же массив (с этими же данными) с такой же размерностью. лучше создать другой объект через копирующий конструктор? (я про способ создания идентичного массива)
...
Рейтинг: 0 / 0
05.04.2006, 09:14
    #33645162
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите исправить ошибку!!!
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
int main()
{
int *array[];
int n =  0 ;

cout<<"Type array size:";
cin>>n;
cout<<"n="<<n<<endl;

array= new int[ n ];

for (int i= 0 ; i<n; i++)
{
   cout<<"type " << i <<"-th array element:";
   cin>>array[i];
}

for (int i= 0 ; i<n; i++)
{
   cout<<"i="<<i<<array[i]<<endl;
}
}
...
Рейтинг: 0 / 0
05.04.2006, 09:15
    #33645167
redskin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите исправить ошибку!!!
dik_kда-да, точно, спасибо.
есть ещё вопрос: мне нужен точно такой же массив (с этими же данными) с такой же размерностью. лучше создать другой объект через копирующий конструктор? (я про способ создания идентичного массива)

Ммм... боюсь тут имеет место некоторое недопонимание. Копирующий конструктор применяется для создания копии экземпляра объекта класса. А здесь обычный массив, к нему конструктор (обычный или копирования) не пришьешь...

Совсем лучше будет вместо int** использовать vector<vector<int> > >, тогда копирование это просто v1 = v2.
...
Рейтинг: 0 / 0
05.04.2006, 09:28
    #33645196
dik_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите исправить ошибку!!!
а если не через vector<vector<int> > >, а через int**, то как лучше скопировать?
...
Рейтинг: 0 / 0
05.04.2006, 10:04
    #33645280
dik_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите исправить ошибку!!!
а вообще, векторами лучше пользоваться, чем напр. динам. массивами?
...
Рейтинг: 0 / 0
05.04.2006, 10:12
    #33645297
redskin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите исправить ошибку!!!
dik_kа если не через vector<vector<int> > >, а через int**, то как лучше скопировать?

А какая разница?
Как удобней, так и копировать.
Можно хоть поэлементно:

Код: plaintext
1.
2.
3.
4.
5.
6.
void mcpy(int **dst,  const int * const *src, int n)
{
    for(int i =  0 ; i < n; i++)
        for(int j =  0 ; j < n; j++)
            dst[i][j] = src[i][j];
}

или через memcpy:

Код: plaintext
1.
2.
3.
4.
5.
void mcpy(int **dst,  const int * const *src, int n)
{
    for(int i =  0 ; i < n; i++)
        memcpy(dst[i], (void*)(src[i]), n*sizeof(**dst));
}

В этих случаях память уже должна быть выделена перед вызовом функции. Если надо чтобы при создании копии и память выделялась, то что-нибудь вроде этого:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
int** mcpy(const int * const *src, int n)
{
    int **dst = (int**)malloc(n*sizeof(int*));
    for(int i =  0 ; i < n; i++)
    {   
        dst[i] = (int*)malloc(n*sizeof(int));
        memcpy(dst[i], (void*)(src[i]), n*sizeof(int));
    }
    return dst;
}

dik_kа вообще, векторами лучше пользоваться, чем напр. динам. массивами?

Конечно лучше. Не надо возиться с , malloc/free или new/delete. От ошибок типа

Код: plaintext
1.
2.
    vector<int> v;
    v[ 100 ] =  1 ;

это все равно не спасет, но Segmentation fault всяко лучше чем утечки памяти :)
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / помогите исправить ошибку!!! / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]