Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C]Двумерные динамические массивы, что-то с выделением памяти не так наверн 
V
    Опции темы
Асоишница
Дата 11.5.2012, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 13.3.2012

Репутация: нет
Всего: нет



Добрый день. Программа запускается, но не работает- позволяет только ввести первое из всего необходимого(Задание:
Описать процедуру ArrayToMatrix1(A, K, M, N, B), формирующую по вещественному массиву A размера K матрицу B размера M × N (матрица заполняется элементами массива A по строкам). «Лишние» элементы массива игнорируются; если элементов массива недостаточно, то оставшиеся элементы матрицы полагаются равными 0. Двумерный массив B является выходным параметром. С помощью этой процедуры на основе данного массива A размера K и целых чисел M и N сформировать матрицу B размера M × N.). Я пока написала это в main, чтоб если что не было ошибок из-за неправильного оформления процедуры.)
Код

#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <stdlib.h>


void main(){
int *A, **B, i, j, K, N, M;
    printf("Enter quantity of elements of an array A\n");//Введите количество элементов массива А
    scanf("%d",&K);
    A=(int*)malloc(N*sizeof(int));
    B=(int**)malloc(N*sizeof(int));
    printf("Enter array A elements\n");//Введите элементы массива А
        for(i=0;i<N;i++){
        scanf("%d",&A[i]);}
    printf("Enter dimension of an array B: M, N\n");//Введите размерность массива В
    scanf("%d%d",&M,&N);
    for(i=0; i<M; i++){
        B[i]=(int*)malloc(N*sizeof(int));
        for(j=0; j<N; j++){
            B[i][j]=A[i];
        }}
    for(i=0; i<M; i++){
        for(j=0; j<N; j++){
            printf("%d", B[i][j]);
        }}

    free(A);
    free(B);
    getch();
}



подскажите пожалуйста, что не так
PM MAIL   Вверх
feodorv
Дата 12.5.2012, 00:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(Асоишница @  12.5.2012,  00:57 Найти цитируемый пост)
    A=(int*)malloc(N*sizeof(int));
    B=(int**)malloc(N*sizeof(int));

Значение переменной N ещё не задано. А задаёте его значительно позже:
Цитата(Асоишница @  12.5.2012,  00:57 Найти цитируемый пост)
    scanf("%d%d",&M,&N);

(мне, правда, не понятно, как scanf будет работать с шаблоном %d%d).

Нужно строчки с malloc перенести ниже строчки со scanf, или строчку со scanf перенести выше строчек с malloc smile 


Ещё:
Цитата(Асоишница @  12.5.2012,  00:57 Найти цитируемый пост)
    B=(int**)malloc(N*sizeof(int));

В - это массив массивов, поэтому нужно соблюдать размерность элементов этого массива масивов:
Код

    B=(int**)malloc(N*sizeof(int *));

Именно sizeof(int *), а не sizeof(int).


И ещё:
Цитата(Асоишница @  12.5.2012,  00:57 Найти цитируемый пост)
    B=(int**)malloc(N*sizeof(int));

Цитата(Асоишница @  12.5.2012,  00:57 Найти цитируемый пост)
    for(i=0; i<M; i++){
        B[i]=(int*)malloc(N*sizeof(int));

Если M - число строк, то нужно 
Код

B=(int**)malloc(M*sizeof(int *));

То есть M, а не N.


Цитата(Асоишница @  12.5.2012,  00:57 Найти цитируемый пост)
    free(B);

Ну, В Вы освободили. А элементы B (то есть B[0]...B[M-1])?


Остальное даже не смотрел...

Это сообщение отредактировал(а) feodorv - 12.5.2012, 00:42


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Асоишница
Дата 12.5.2012, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 13.3.2012

Репутация: нет
Всего: нет



Цитата(feodorv @  12.5.2012,  00:38 Найти цитируемый пост)
Ну, В Вы освободили. А элементы B (то есть B[0]...B[M-1])?

так и не поняла, что не так....думала, освобождается всё, что касается В......

но вообще спасибо- с Вашей помощью заработало.=))))))правда там ещё кое-что поисправлять надо было)

Это сообщение отредактировал(а) Асоишница - 12.5.2012, 19:12
PM MAIL   Вверх
feodorv
Дата 12.5.2012, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(Асоишница @  12.5.2012,  18:36 Найти цитируемый пост)
    B=(int**)malloc(M*N*sizeof(int*));

Зачем M*N*sizeof(int*) когда M*sizeof(int*) достаточно?


Цитата(Асоишница @  12.5.2012,  18:36 Найти цитируемый пост)
       B[i]=(int*)malloc(M*sizeof(int*));    

Ну а здесь зачем M, когда N нужно; зачем int*, когда нужно просто int?


Поскольку B - это массив массивов, то 
Код

B=(int**)malloc(M*sizeof(int*));

Этим мы выделяем память под М элементов, каждый из которых имеет тип int* (то есть указатель на массив интегер-переменных). 
А вот B[i] - это просто массив целочисленных величин, поэтому
Код

B[i]=(int*)malloc(N*sizeof(int));

Этим мы выделяем память под N штук интегеров. 


Цитата(Асоишница @  12.5.2012,  18:36 Найти цитируемый пост)
правда коряво.....

В чём проявляется эта корявость?


Цитата(Асоишница @  12.5.2012,  18:36 Найти цитируемый пост)
так и не поняла, что не так....думала, освобождается всё, что касается В......

Всё? Смотрим выделение памяти:
Цитата(Асоишница @  12.5.2012,  18:36 Найти цитируемый пост)
    B=(int**)malloc(M*sizeof(int*));

Цитата(Асоишница @  12.5.2012,  18:36 Найти цитируемый пост)
     for(i=0; i<M; i++){
      B[i]=(int*)malloc(M*sizeof(int*));    
      ...
    }

Смотрим высвобождение памяти:
Цитата(Асоишница @  12.5.2012,  18:36 Найти цитируемый пост)
    free(B);

И всё? Вы думаете free(B); высвободит за Вас все B[i]?
На каждый malloc должен быть свой free smile 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0507 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.