| 
			| 
					
						| CAHTA_ | 
								|  | «  : 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 
								СпокойныйАдминистратор    Offline 
								Пол:    
								Пролетал мимо
								
								
								
								
								
							 | 
								|  | « Ответ #1 : 13-08-2006 21:16 »  |  | 
 
 Было бы не плохо, если бы ты еше и указал ошибки, которые у тебя вылетают.                  line=realloc(line,(strlen(line)+m[i]+1));
Тут явная ошибка. line не является указателем на строку. Она является указателем на массив указателей на строку. Поэтому так, узнавать длину нельзя. |  
						| 
								|  |  
								|  |  Записан | 
 
 Не будите спашяго дракона.              Джаффар (Коша) |  |  | 
	| 
			| 
					
						| CAHTA_ | 
								|  | « Ответ #2 : 13-08-2006 21:22 »  |  | 
 
 а не подскажешь как изменить? ошибок при компиляции нет. прога вылетает при работе! |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Finch 
								СпокойныйАдминистратор    Offline 
								Пол:    
								Пролетал мимо
								
								
								
								
								
							 | 
								|  | « Ответ #3 : 13-08-2006 21:27 »  |  | 
 
 line=realloc(line,(i+1)*sizeof(char *)); |  
						| 
								|  |  
								|  |  Записан | 
 
 Не будите спашяго дракона.              Джаффар (Коша) |  |  | 
	| 
			| 
					
						| CAHTA_ | 
								|  | « Ответ #4 : 13-08-2006 21:39 »  |  | 
 
 хм... вроде работает, а улучьшите нелья ни как? |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Finch 
								СпокойныйАдминистратор    Offline 
								Пол:    
								Пролетал мимо
								
								
								
								
								
							 | 
								|  | « Ответ #5 : 13-08-2006 21:46 »  |  | 
 
 Твою программу можно, а строку куда лучше улучшать?  |  
						| 
								|  |  
								|  |  Записан | 
 
 Не будите спашяго дракона.              Джаффар (Коша) |  |  | 
	| 
			| 
					
						| CAHTA_ | 
								|  | « Ответ #6 : 13-08-2006 21:50 »  |  | 
 
 как лучьше сделать прогу   |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Finch 
								СпокойныйАдминистратор    Offline 
								Пол:    
								Пролетал мимо
								
								
								
								
								
							 | 
								|  | « Ответ #7 : 13-08-2006 21:56 »  |  | 
 
 Во первых: У тебя два повторяюшихся куска кода, можно объединить. Во вторых: Зачем так печатать строку?     for(j=0; j<m[i];j++)printf("%c", line[i][j]);
 
Когда можно распечатать саму строку напрямую printf("%s", line); |  
						| 
								|  |  
								|  |  Записан | 
 
 Не будите спашяго дракона.              Джаффар (Коша) |  |  | 
	| 
			| 
					
						| CAHTA_ | 
								|  | « Ответ #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_ | 
								|  | « Ответ #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) | 
								|  | « Ответ #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_ | 
								|  | « Ответ #14 : 14-08-2006 11:20 »  |  | 
 
 1. изза того что я его не только анализирую но и изменяю2.я плохо знаю С++. =)
 3.можно и так. то что я тут выложил, это только тестовый код, который будет вставлен в основную программу!
 
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Антон (LogRus) | 
								|  | « Ответ #15 : 14-08-2006 11:32 »  |  | 
 
 CAHTA_, ну знаешь пункт 2 не аргумент   |  
						| 
								|  |  
								|  |  Записан | 
 
 Странно всё это.... |  |  | 
	|  |