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 не аргумент
|
|
|
Записан
|
Странно всё это....
|
|
|
|