Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Вопрос по вводу данных в динамический массив и подсчета памяти занимаемой им  (Прочитано 16037 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Янус
Постоялец

ru
Offline Offline
Пол: Мужской

« : 02-08-2008 09:02 » 

Имеется следующая программа пузырьковой сортировки динамического массива:

Код:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i,number,k,t,r,counter=0;
int *pArray=NULL;
printf("\nInput intrger values:\n");
while(1)
 { printf("number="); scanf("%d",&number);
  if (number==0) break;
  counter++;
  pArray=(int *)realloc(pArray,counter*sizeof(int));
  pArray[counter-1]=number;
  }
  for(i=1;i<counter;++i)
   for(k=counter-1;k>=i;--k)
   {
   if(pArray[k-1]>pArray[k])
   {
    t=pArray[k-1];
    pArray[k-1]=pArray[k];
    pArray[k]=t;
    }
    }
     printf("Result:");
  for(i=counter-1; i>=0; i--)
  printf("%d ",pArray[i]);
  r=sizeof(pArray);
  printf("\n");
  printf("%d",r);
  free(pArray);
  }

У меня возникло несколько затруднений с этой программой:
1. Как сделать так что-бы прекращение ввода данных осуществлялось по вводу пустой строки а не 0.
2. Правильно ли работает функция sizeof определяющая размер введенного массива, и если нет то в чем ошибка ?
« Последнее редактирование: 02-08-2008 09:54 от Янус » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 02-08-2008 10:05 » 

Если компилировать на старых компиляторах, то твоя программа может упасть на realloc. Вот описание
Цитата
void * realloc (void *ptr, size_t newsize)
...............
If you pass a null pointer for ptr, realloc behaves just like malloc (newsize). This can be convenient, but beware that older implementations (before ISO C) may not support this behavior, and will probably crash when realloc is passed a null pointer.
Также наверно стоит проверить, что выделилась память.



Цитата
1. Как сделать так что-бы прекращение ввода данных осуществлялось по вводу пустой строки а не 0.
Не сканируй сразу в число. Отсканируй ввод в строку. Проверь, Что она не пустая. А затем уже переводи в число.

Цитата
2. Правильно ли работает функция sizeof определяющая размер введенного массива, и если нет то в чем ошибка ?
sizeof у тебя определяет длину в байтах типа int. Для 32 разрядных компов, будет всегда возрашаться значение 4.
« Последнее редактирование: 02-08-2008 10:08 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #2 : 02-08-2008 10:20 » 

1) Проверь работу пузырька, у тебя там явная ошибка в алгоритме.
2)
Код:
r=sizeof(pArray);
Вернет тебе количество памяти, занимаемой самим указателем. А не длину массива. Стандартных средств, чтобы узнать длину массива я не видел.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Янус
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 04-08-2008 07:17 » 

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

Код:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i,number,k,t,r,l,counter=0;
char number1[80],*str;
int *pArray=NULL;
printf("\nInput intrger values:\n");
while(1)
 { printf("number=");
 gets(number1);
 str=number1;
  if (*str==' ') break;
  number=atoi(str);
  counter++;
  pArray=(int *)realloc(pArray,counter*sizeof(int));
  pArray[counter-1]=number;
  }
  l=1;
  while(l==1)
  {
   l=0;

  for (k=0;k<counter-1;k++)
   {
   if(pArray[k]>pArray[k+1])
   {
    t=pArray[k];
    pArray[k]=pArray[k+1];
    pArray[k+1]=t;
    l=1;
    }
    }
    }
     printf("Result:");
  for(i=counter-1; i>=0; i--)
  printf("%d ",pArray[i]);
  r=32*counter;
  printf("\n");
  printf("Razmer massiva v baitah %d",r);
  free(pArray);
  return 0;
  }

« Последнее редактирование: 04-08-2008 10:30 от Янус » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #4 : 04-08-2008 12:56 » 

Янус, Ты хоть иногда прогоняеш через компилятор свою программу? Или сразу сюда выставляеш?
Вот на этом
Код:
number=atoi(str);
У тебя еше на стадии компилирования должно упасть.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
RXL
Технический
Администратор

Online Online
Пол: Мужской

WWW
« Ответ #5 : 04-08-2008 13:39 » 

Finch, ошибаешься: у него полный бардак с именами:
int number;
char number1[80];
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Aveic
Постоялец

ru
Offline Offline
Пол: Мужской
Yellow


« Ответ #6 : 04-08-2008 14:01 » 

Цитата
Код:
 r=32*counter;
 printf("\n");
 printf("Razmer massiva v baitah %d",r);
Почему 32 умножить на кол-во элементов? Это не есть размер в байтах. Получается это размер в битах  8*sizeof(int)*counter, что собственно и есть 32*counter. Отлично
Что-то одно надо поменять =)
Записан
Янус
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 04-08-2008 14:59 » 

Янус, Ты хоть иногда прогоняеш через компилятор свою программу? Или сразу сюда выставляеш?
Вот на этом
Код:
number=atoi(str);
У тебя еше на стадии компилирования должно упасть.

Прогонял, да с именами не хорошо получилось... Здесь была моя ладья...
« Последнее редактирование: 04-08-2008 15:04 от Янус » Записан
Янус
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 04-08-2008 15:01 » 

Цитата
Код:
 r=32*counter;
 printf("\n");
 printf("Razmer massiva v baitah %d",r);
Почему 32 умножить на кол-во элементов? Это не есть размер в байтах. Получается это размер в битах  8*sizeof(int)*counter, что собственно и есть 32*counter. Отлично
Что-то одно надо поменять =)

Спасибо за подсказку.
Записан
Янус
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 04-08-2008 15:07 » 

За все выше сказанное большое спасибо, но как быть с проверкой на ввод пустой строки ? Может кто-нибудь подсказать как это сделать (или хотя бы намекнуть?)
Записан
Aveic
Постоялец

ru
Offline Offline
Пол: Мужской
Yellow


« Ответ #10 : 04-08-2008 15:43 » new

Можно удалить пробелы слева и справа, потом пройтись по каждому символу и если встретиться что-то кроме is_digit(char), или наоборот ни одного is_digit(char) — то строка, как говориться «инвалид».
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines