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

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

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

« : 13-08-2006 21:01 » 

помогите понять где ощибка...

Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void  main()
{
     char **line;  /* указатель для блока памяти, выделяемого для массива указателей */
     int  i,j,n,  Go;
     int  *m;      /* указатель для блока памяти */


     char mass[255]={0};

     n=1, i=0, j=0;


     line=(char **)calloc(n,sizeof(char*));              // количество строк
     if(line == NULL)
             puts("Memory allocation failed");
     m=(int*)malloc(sizeof(int)*n);

     printf("\n\nline[%i]= ",i);
     scanf("%s", &mass);

     m[i] = strlen(mass);
m[i]++;
     line[i]=(char*)calloc(m[i],sizeof(char));        // длина строки

     strcpy(line[i],mass);
     printf("len = %i   ::>", m[i]);
     for(j=0; j<m[i];j++)
              printf("%c", line[i][j]);
//====================================================
// чтение 9 строк с клавиатуры.
for(Go=0;Go< 10;Go++)
{
     i++;
     printf("\n\nline[%i]= ",i);
     scanf("%s", &mass);
                 m=realloc(m,(sizeof(int)+i));
     m[i] = strlen(mass);
                 line=realloc(line,(strlen(line)+m[i]+1));
                 line[i]=(char*)calloc(m[i],sizeof(char));
strcpy(line[i],mass);
     printf("len[%i] = %i   ::>",i, m[i]);
     for(j=0; j<m[i];j++)
              printf("%c", line[i][j]);
}
//====================================================
     return ;
}

помогите пожалуста.
Записан
Finch
Спокойный
Администратор

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


« Ответ #1 : 13-08-2006 21:16 » 

Было бы не плохо, если бы ты еше и указал ошибки, которые у тебя вылетают.
Код:
                 line=realloc(line,(strlen(line)+m[i]+1));
Тут явная ошибка. line не является указателем на строку. Она является указателем на массив указателей на строку. Поэтому так, узнавать длину нельзя.
Записан

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

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

« Ответ #2 : 13-08-2006 21:22 » 

а не подскажешь как изменить? ошибок при компиляции нет. прога вылетает при работе!
Записан
Finch
Спокойный
Администратор

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


« Ответ #3 : 13-08-2006 21:27 » 

line=realloc(line,(i+1)*sizeof(char *));
Записан

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

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

« Ответ #4 : 13-08-2006 21:39 » 

хм... вроде работает, а улучьшите нелья ни как?
Записан
Finch
Спокойный
Администратор

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


« Ответ #5 : 13-08-2006 21:46 » 

Твою программу можно, а строку куда лучше улучшать?
Записан

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

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

« Ответ #6 : 13-08-2006 21:50 » 

как лучьше сделать прогу Улыбаюсь
Записан
Finch
Спокойный
Администратор

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


« Ответ #7 : 13-08-2006 21:56 » 

Во первых: У тебя два повторяюшихся куска кода, можно объединить.
Во вторых: Зачем так печатать строку?
Код:
    for(j=0; j<m[i];j++)
              printf("%c", line[i][j]);
Когда можно распечатать саму строку напрямую
printf("%s", line);
Записан

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

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

« Ответ #8 : 13-08-2006 22:03 » 

ну да, так тоже можно. но ты наверное имел ввиду printf("%s", line);

Записан
Alex437
Гость
« Ответ #9 : 14-08-2006 10:08 » 

как лучьше сделать прогу Улыбаюсь
У тебя много лишних переменных. Например зачем нужна Go?
Почему вместо этого
Код:
for(Go = 0; Go < 10; Go++) {
    i++;
    //...
можно написать
Код:
for(i = 1; i < 10; ++i) {
    //...
Хотя считывание нулевой строки можно вообще в этот же цикл поместить.

Кроме того, может я что-то не уловил, но не понял зачем нужен массив m.
Почему вместо
Код:
m[i] = strlen(mass);
line=realloc(line,(strlen(line)+m[i]+1));
line[i]=(char*)calloc(m[i],sizeof(char));
strcpy(line[i],mass);
printf("len[%i] = %i   ::>",i, m[i]);
нельзя писать
Код:
line = realloc(line, (strlen(line) + strlen(mass) + 1));
line[i] = (char*)calloc(strlen(mass), sizeof(char));
strcpy(line[i], mass);
printf("len[%i] = %i   ::>", i, strlen(mass));
Записан
CAHTA_
Постоялец

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

« Ответ #10 : 14-08-2006 10:08 » 

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


Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void  main()
{
     char **line;  /* Указатель для блока памяти, выделяемого для массива указателей */
     int  i,j,n;
     int  *m;      /* Указатель для блока памяти */

FILE *config_file = 0;

     char str_buf[512]={0};

   

n=1, i=0, j=0;


//========================================================================================
if( (config_file = fopen("dhcpd.conf.txt", "r")) == NULL)
{ puts("** Error at opening a config file **\n"); return ; }
puts("** The config file is open successfully **\n");
//============================================================================================
line=(char **)calloc(1,sizeof(char*));             
if(line == NULL)   puts("Memory allocation failed");
m=(int*)malloc(sizeof(int)*1);
m[i] = strlen(str_buf);
m[i]++;
line[i]=(char*)calloc(m[i],sizeof(char));       
strcpy(line[i],str_buf);

printf("%s", line[i]);
//============================================================================================

while (!feof(config_file))
{
fgets(str_buf, 510, config_file);
i++;
m=realloc(m,(sizeof(int)+i));
m[i] = strlen(str_buf);
line=realloc(line,(i+1)*sizeof(char *));
line[i]=(char*)calloc(m[i],sizeof(char));
strcpy(line[i],str_buf);
printf("%s", line[i]);

//============================================================================================
     return ;
}
Записан
Alex437
Гость
« Ответ #11 : 14-08-2006 10:54 » 

Может вместо
Код:
m=realloc(m,(sizeof(int)+i));
надо
Код:
m=realloc(m,(sizeof(int)*i));
?

Кстати когда ты выделяешь память через malloc, то ее положено освобождать с помощью free

А вообще чистый Си - кошмар реальный. Все эти маллоки, реаллоки...
Если я правильно понял функциональность первой проги, то на С++ это было бы так:
Код:
void main()
{
vector<string> line;
string s;
for(int i = 0; i < 10; ++i)
{
cout << "\n\nline[" << i << "]= ";
cin >> s;
line.push_back(s);
cout << "len[" << i << "] = " << line.back().length() << "    ::>" << endl;
cout << line.back();
}
}
Записан
Alex437
Гость
« Ответ #12 : 14-08-2006 10:58 » 

Зачем пытаться делать что-то с массивом str_buf, когда он еще не заполнен?

А вторую прогу на С++ можно было бы так написать
Код:
void main()
{
ifstream ifs("dhcpd.conf.txt");
if(!ifs)
{
cout << "** Error at opening a config file **\n";
return;
}
cout << "** The config file is open successfully **\n";

istream_iterator<string> ii(ifs);
istream_iterator<string> eos;
vector<string> line(ii, eos);
copy(line.begin(), line.end(), ostream_iterator<string>(cout, "\n"));
}
« Последнее редактирование: 14-08-2006 11:32 от Alex437 » Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #13 : 14-08-2006 11:10 » 

CAHTA_,
странная строчка: m=realloc(m,(sizeof(int)+i));

теперь вопросы/коментарии:
1. если ты анализируешь конфиг то зачем его загружать весь в память?
2. почему C а не С++? при определённой сноровке это делается в C++ в одну строчку
3. зачем 2 массива m и line а не массив struct{int s; char* line;}?
4. зачем нужен блок :
   line=(char **)calloc(1,sizeof(char*));
               if(line == NULL)   puts("Memory allocation failed");
   m=(int*)malloc(sizeof(int)*1);
   m = strlen(str_buf);
   m++;   line=(char*)calloc(m,sizeof(char));
           strcpy(line,str_buf);
   printf("%s", line);
5. при женалии можно реорганизовать данные так что избавишься от релокации и счетчика i, кстати замени i++ на ++i если ты в точке использования оператора не собираешься использовать старое значение под которое создаётся временный объект.
6. подумай о списке сместо массива
7. проверяй результаты релокации и аллокации

а так всё красиво  Отлично
Записан

Странно всё это....
CAHTA_
Постоялец

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

« Ответ #14 : 14-08-2006 11:20 » 

1. изза того что я его не только анализирую но и изменяю
2.я плохо знаю С++. =)
3.можно и так. то что я тут выложил, это только тестовый код, который будет вставлен в основную программу!
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #15 : 14-08-2006 11:32 » 

CAHTA_, ну знаешь пункт 2 не аргумент Улыбаюсь
Записан

Странно всё это....
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines