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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Двумерный массив. Совпадение строки и столбца, и сумма строки с отрицательным элементом 
V
    Опции темы
baldina
Дата 11.7.2011, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

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



Цитата(Kruger2 @  11.7.2011,  16:57 Найти цитируемый пост)
получается тут неправильный код выложили?)

смотрите сами: http://codepad.org/KAP0hVsz
PM MAIL   Вверх
Kruger2
Дата 11.7.2011, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



voral

Код

int main()
{
    int i;
    int **b = NULL;
    
    inMemory(b);
    for (i=0;i<SIZE;++i)
    {
        compareLine(i);
        sum(i);
    }
    freeMemory(b);
system("pause");
return 0;
}


При вызове функции freeMemory программа рушится.

Добавлено через 1 минуту и 29 секунд
baldina
Посмотрел, код рабочий. Следовательно у меня вызов кривой.

Добавлено через 2 минуты и 28 секунд
Но нет освобождения памяти. И в примере выше при попытке высвободить память программа рушится.
PM MAIL   Вверх
voral
Дата 11.7.2011, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 16.3.2008
Где: Иваново

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



На всякий случай
Код

{
       int i; // объявляется переменная i, для нее резервируется память размером sizeof(int)
       int *j; //обявляется переменная j, являющаяся указателем на область памяти содержащую int. Размер выделяемой памяти sizeof(*int)
       j = (int*)malloc(4*sizeof(int)); //выделяем память под массив, адрес заносим в j  Размер выделяемой памяти 4*sizeof(*int)
} // вот достиги онца области видимости переменных i и j
// вышли из блока - осободилась память, занимаемая переменными i (sizeof(int)) и j (sizeof(*int)), но память выделенная нами mallocом  4*sizeof(*int) осталась  зарезерированной. И мы не знаем ее адреса, и уже не сможем осовободить.... Это утечка - что плохо.
Прогнать этот блок Nцать раз и вся оперативка, а потом и своп будут съедены 

PM MAIL WWW   Вверх
Kruger2
Дата 11.7.2011, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Самое обидное что в книге кернигана и ричи 2 строки по динамическому распределению памяти, а у харви дейтела "как програмировать на си" вообще ничего)

Судя по содержанию вспоминают они о нем только в структурах
PM MAIL   Вверх
baldina
Дата 11.7.2011, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

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



Цитата(Kruger2 @  11.7.2011,  17:47 Найти цитируемый пост)
Посмотрел, код рабочий. 

плохо смотрели. не годный код.
PM MAIL   Вверх
voral
Дата 11.7.2011, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 16.3.2008
Где: Иваново

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



тут и я немного прощелкал. Дело в том как передан параметр в inMemory. Пока сам руками не написал не осознал smile. Объяснять времени не осталось, вот то что я написал
Код

#include <stdio.h>
#include <stdlib.h>
#define SIZE 3
int**  inMemory ()
{
    int** Array = (int**)malloc(SIZE*sizeof(int*));
    if(!Array)
    {
        printf("Memory not allocated. \n");
        return 0;
    }
    int i;
    for (i=0; i< SIZE; i++)
    {
        Array[i]= (int *) malloc(SIZE*sizeof (int )+1);
        if (!Array[i])
        {
            printf("Memory not allocated2 \n");
            return 0;
        }
    }
    return Array;
}
void freeMemory(int** Array)
{
    int i;
    for(i=0; i<SIZE; i++)
        free (Array[i]);
    free(Array);
}

int main()
{
    int **b = inMemory();
    if (inMemory(&b)==0) return 1;
    freeMemory(b);
    return 0;
}


PM MAIL WWW   Вверх
baldina
Дата 11.7.2011, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

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



Цитата(voral @  11.7.2011,  18:11 Найти цитируемый пост)
SIZE*sizeof (int )+1

зачем +1
?
PM MAIL   Вверх
voral
Дата 11.7.2011, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 16.3.2008
Где: Иваново

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



Цитата(baldina @ 11.7.2011,  18:34)
Цитата(voral @  11.7.2011,  18:11 Найти цитируемый пост)
SIZE*sizeof (int )+1

зачем +1
?

Посыпаю голову пеплом - набацал  в спешке. Тут, естественно, это совершенно не нужно. smile
PM MAIL WWW   Вверх
voral
Дата 11.7.2011, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 16.3.2008
Где: Иваново

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



Итак, почему не работало  варианте с фунцнкцией 
Код

InMemory(int **Array)

Это вроде как раз у Кернигана нормально расписано. Параметры функции являются локальными переменными в этой функции. Т.е. в данном случае мы скоипировали значение переменной b в функции main в переменную Array функции inMemory. (т.е. NULL).
Далее этой локальной переменной присвоили значение адреса выделеной malloc памяти и вышли из функции. Но этот адрес выделенной памяти не передался обратно в процедуру main. и b так и осталась равна NULL. Демонтрирую (количество звездочек снизил, чтоб не мешались)
Код

#include <stdio.h>
#include <stdlib.h>
void inMemory (int **A)
{
    A = (int**)malloc(sizeof(int*));
    printf("In: %d\n",A);
}
int main()
{
    int **b = NULL;
    printf("Before: %d\n",b);
    inMemory(b);
    printf("After: %d\n",b);
    free(b);
    return 0;
}

Вывод:
Цитата

Before: 0
In: 85499968                                                                                                                  
After: 0    

Чтобы это обойти нужно передавать параметр не по значению, а по ссылке.
Код

#include <stdio.h>
#include <stdlib.h>
void inMemory (int ***A)
{
    *A = (int**)malloc(sizeof(int*));
    printf("In: %d\n",*A);
}
int main()
{
    int **b = NULL;
    printf("Before: %d\n",b);
    inMemory(&b);
    printf("After: %d\n",b);
    free(b);
    return 0;
}

вывод:
Цитата

Before: 0
In: 85499968
After: 85499968


Кстати до кучи.
Наглядное пояснение, а можно ли не освобождать память. В примере выше убираю строку free(b). И натравливаю на бинарник утилиту для определения утечек valgrind
Цитата

==6629== HEAP SUMMARY:
==6629==     in use at exit: 8 bytes in 1 blocks 
==6629==   total heap usage: 1 allocs, 0 frees, 8 bytes allocated
==6629== 
==6629== LEAK SUMMARY:
==6629==    definitely lost: 8 bytes in 1 blocks


в использовании нпри выходе 8 байт в одном блоке
был один аллок,  0 освобождений, 8 байт занято - это и есть вредная утечка памяти

PM MAIL WWW   Вверх
Kruger2
Дата 13.7.2011, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо. Почитаю ещё литературу, потом буду дальше вас мучитьsmile
PM MAIL   Вверх
krot100500
Дата 27.12.2011, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем привет!)
Благодоря этой темке я слегка разобрался в указателях) за это вам почет и уважуха)
Вообщем попал сюда как получил задание на курсач(такое-же как и у автора)
ну вообщем вот мой код для массива 3 на3 можете сказать что тут не так плиз) я подозреваю что что-то с выводом функции, голову уже сломал всю
Код

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <alloc.h>
#define SIZE 3
void input()
{int i,j;
 int **a;
 a=(int**)malloc(SIZE*sizeof(int*));
 for(i=0;i<SIZE;i++);
 {
  a[i]=(int*)malloc(SIZE*sizeof(int*));
  for(j=0;j<SIZE;j++);
    }
   printf("vvedite element matrici\n");
  for(i=0;i<SIZE;i++)
      {
      for(j=0;j<SIZE;j++)
     {
     printf("a[%d][%d]=",i+1,j+1
     );
       scanf("%d",&a[i][j]);
        }}}
void comp(int **a)
{
int j;
 int i;
 for (i=0;i<SIZE;i++)
  {if (a[i][j]!=a[j][i]);
   printf("sovpadeni'a v %d stroke i stolbce\n",i+1);
   }}
void subzero(int **a)
{  
 int i;
    int j, sum, fex;
    sum=0;fex=0;
    for (j=0;j<SIZE;j++)
     {
     sum+=a[i][j];
     if(a[i][j]<0) fex=1;
     }
    if (fex==1)
      printf("v stroke %d est' <0; sum=%d\n",i+1,sum);
      }

void out()
{
int i,j;
 int **a;
printf("matrica\n");
for(i=0;i<SIZE;i++)
 {
 for(j=0;j<SIZE;j++)
 printf("%8d",a[i][j]);
 printf("\n");
}}
int main()

  clrscr();
    int **a;
    input();
    out();
    subzero(a);
    comp(a);
    getch();
    return 0;
}



Добавлено через 4 минуты и 20 секунд
Цитата(voral @  30.6.2011,  18:40 Найти цитируемый пост)
void compareLine(int i)
{
    int j;
    for (j=0;j<SIZE;++j)
        if (A[i][j]!=A[j][i])
            return;
    printf("K=%d\n",i+1);
}

зачем тут операнд return?
PM MAIL   Вверх
voral
Дата 27.12.2011, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 16.3.2008
Где: Иваново

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



Цитата(krot100500 @  27.12.2011,  00:11 Найти цитируемый пост)
зачем тут операнд return? 

Хм... А это разве я писал?
Впрочем очевидно: Это функция проверки условия задачи. Если элемент A[i][j] не равен A[j][i] значит желаемое условие нарушено и дальнейшая проверка элементов не нужна. Следовательно выходим из функции.
PM MAIL WWW   Вверх
voral
Дата 27.12.2011, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 16.3.2008
Где: Иваново

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



Цитата(krot100500 @  27.12.2011,  00:11 Найти цитируемый пост)
ну вообщем вот мой код для массива 3 на3 можете сказать что тут не так плиз)

Форматирование кода - неуд.
Строка 13: Зачем?
Строка 32: Что делает?
Строка 51: в этой области видимости есть переменная. Память под массив не выделена и массив не заполнен. Этот массив в этой функции не имеет ни какого отношение к массиву в функции input


Больше пока не смотрел.....

Добавлено @ 10:34
В догонку массив a в функции input не имеет отношения к массиву a в функции main.

Добавлено @ 10:36
А так же в конце программы не освобождается память.

Это сообщение отредактировал(а) voral - 27.12.2011, 10:52
PM MAIL WWW   Вверх
voral
Дата 27.12.2011, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 16.3.2008
Где: Иваново

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



кстати. Небольшой "секрет". Цикл в 10 строке тоже ни чего не делает.... Вообще. Если отключить оптимизацию просто посчитает до 3. Но ни чего не сделает из того, что вы ожидаете
PM MAIL WWW   Вверх
krot100500
Дата 27.12.2011, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ну вообщем функция void input -вводит массив, взят текс тупо из методички
void subzero -функция нахождение элемента ниже 0 и сумма всех элементов этой строки
void out функция тоже взята из методы ) выводит массив заданый в inpute

Добавлено через 5 минут и 54 секунды
в исходники из методички я особо не разбирался просто коррекция под свой вариант) динамическое распределение памяти для меня лес темный(( примерно понял операнд малок( по Герберту Шилдту)
но там не было сказано про освобождение памяти я об этом узнал тока тут)
ЗЫ Voral свой код всегда узнать можно)) я взял твой код для статического распределения попытался в нем разобраться) вроде как понял что-то) непонял тока почему цикл тока для J есть (в comparline)

Добавлено через 10 минут и 51 секунду
ну вообщем как я понял из лекций прога в кратце будет иметь вид
#include тут все необходимые библиотеки
input{ввод масива с клавы}
comp{кстрока=кстолбцу}
subzero{вычисление суммы с отриц элементом}
out{вывод на экран}
main{в нем как раз обрашение на функции }

PM MAIL   Вверх
Страницы: (7) Все « Первая ... 3 4 [5] 6 7 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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