Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Какую структуру данных для данной задачи на СИ рекомендуете?

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3

Открыть новую тему     Написать ответ в эту тему

rew



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
ты возвращаешь из функции ссылку на локальную переменную. При том, что при выходе из функции все локальные переменные уничтожаются

угу, прав, надо переделать. у меня просто не было много времени проверять.
 
Добавлено
вроде сча нормально

Код:
 
pstudent removeStudent(pstudentArray sa,int index){
int i;
pstudent removedStudent;
if(index>=0&&index<sa->size){
*removedStudent=sa->students[index];
for(i=index;i<sa->size-1;i++){
sa->students[i]=sa->students[i+1];
}
sa->size--;
sa->students=(pstudent)realloc(sa->students,sizeof(student)*sa->size);
return removedStudent;
}
return NULL;
}
 

 
Добавлено

Цитата:
int removeStudent(pstudentArray sa)  
{  
 
  int i, j;  
  student removedStudent;  
 
  printf("NUMBER# ");  
  flushall();  
  scanf("%d", &j);  
   
  if(j>=0 && j<sa->size)  
  {  
    removedStudent = sa->students[j];  
 
    for(i=j;i<sa->size-1;i++)  
    sa->students[i] = sa->students[i+1];  
 
    sa->size--;  
     
    sa->students = (pstudent)realloc(sa->students,sizeof(student)*sa->size);  
    return &removedStudent;  
  }  
 
  return 0;  
}  

почему все нужно лепить в одну узкоспецифичную функцию?
почему нельзя разделить на несколько, но которые можно будет использовать в нескольких местах?

Код:
 
int deleteStudent(pstudentArray sa){
  int index;    
  pstudent ps;
  printf("NUMBER# ");  
  flushall();  
  scanf("%d", &index);  
  ps=removeStudent(sa,index);
  if(ps!=NULL){
    freeStudent(ps);
    return 1;
  }
  return 0;
}
 

Всего записей: 442 | Зарегистр. 09-09-2001 | Отправлено: 11:19 18-05-2003
Begmart



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Во. Правда нет ввода из файла, есть только фио и оценки, но это всё мелочи, главное то, что всё работает .
 

Код:
 
#include "stdio.h"
#include "alloc.h"
#include "string.h"
 
typedef struct {
    char *fio;
    char *marks;
 
} student, *pstudent;
 
typedef struct {
    pstudent students;
    int count;
} *pStudentsArray;
 
void InitStudentsArray(pStudentsArray psa)
{
    psa->students = NULL;
    psa->count = 0;
}
 
void AddStudent(pStudentsArray psa, pstudent ps)
{
    psa->count++;
    psa->students = (pstudent)realloc(psa->students, sizeof(student) * psa->count);
 
    psa->students[psa->count - 1].fio = (char*)malloc(strlen(ps->fio) + 1);
    strcpy(psa->students[psa->count - 1].fio, ps->fio);
    psa->students[psa->count - 1].marks = (char*)malloc(strlen(ps->marks) + 1);
    strcpy(psa->students[psa->count - 1].marks, ps->marks);
}
 
void DeleteStudent(pStudentsArray psa, int index)
{
    int i;
    if (index >= 0 && index < psa->count)
    {
free(psa->students[index].fio);
free(psa->students[index].marks);
for(i = index; i < psa->count - 1; i++)
   psa->students[i] = psa->students[i + 1];
psa->count--;
psa->students = (pstudent)realloc(psa->students, sizeof(student) * psa->count);
    }
}
 
void ReplaceStudent(pStudentsArray psa, int index, pstudent ps)
{
    if (index >= 0 && index < psa->count)
    {
free(psa->students[index].fio);
free(psa->students[index].marks);
 
psa->students[index].fio = (char*)malloc(strlen(ps->fio) + 1);
strcpy(psa->students[index].fio, ps->fio);
psa->students[index].marks = (char*)malloc(strlen(ps->marks) + 1);
strcpy(psa->students[index].marks, ps->marks);
    }
}
 
void FreeStudentsArray(pStudentsArray psa)
{
    int i, j = psa->count;
    for(i = 0; i < j; i++)
DeleteStudent(psa, 0);
}
 
void PrintAll(pStudentsArray psa)
{
    int i;
    printf("Count: %d\n",psa->count);
 
    for(i = 0; i < psa->count; i++)
printf("#%d %s - %s\n", i + 1, psa->students[i].fio, psa->students[i].marks);
}
 
void main()
{
    pStudentsArray psa;
    pstudent p;
 
    InitStudentsArray(psa);
 
    printf("\n");
 
    p = (pstudent)malloc(sizeof(student));
 
    p->fio = (char*)malloc(6);
    p->marks = (char*)malloc(5);
 
    strcpy(p->fio, "test1");
    strcpy(p->marks, "1111");
    AddStudent(psa, p);
    PrintAll(psa);
 
    strcpy(p->fio, "test2");
    strcpy(p->marks, "2222");
    AddStudent(psa, p);
    PrintAll(psa);
 
    strcpy(p->fio, "test3");
    strcpy(p->marks, "3333");
    AddStudent(psa, p);
    PrintAll(psa);
 
    strcpy(p->fio, "test4");
    strcpy(p->marks, "4444");
    AddStudent(psa, p);
    PrintAll(psa);
 
    strcpy(p->fio, "test5");
    strcpy(p->marks, "5555");
    AddStudent(psa, p);
    PrintAll(psa);
 
    DeleteStudent(psa, 1);
    DeleteStudent(psa, 2);
 
    strcpy(p->fio, "test6");
    strcpy(p->marks, "6666");
    ReplaceStudent(psa, 0, p);
 
    PrintAll(psa);
 
    FreeStudentsArray(psa);
 
    PrintAll(psa);
}
 

 
Добавлено
Кстати, писано на Borland Turbo C++ 3.0, если что. Правда вроде как компилятор должен быть сишный...
 
Добавлено
Кстати 2. Не проверял на строках разной длины . Хотя работать должно...

Всего записей: 99 | Зарегистр. 05-04-2003 | Отправлено: 13:29 18-05-2003
zam

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Функция удаления криво работает, а именно, (дебагер говорит), не получается очистить память для последнего поля ИМЕННО последнего студента free(sa->students[index].marks);  - программа с ошибкой закрывается. Удаление любых студентов, кроме последнего проходит успешно. Если это поле закомментировать, то программа удаляет последнего студента, но хотелось бы понять причину ошибки. Что вы думаете?
 

Код:
 
void deleteStudent(pstudentArray sa)  
{  
    int i;  
int index = 6;
 
    if (index >= 0 && index < sa->size)  
    {  
free(sa->students[index].fio);  
free(sa->students[index].address);  
free(sa->students[index].phone);  
free(sa->students[index].marks);  
 
for(i = index; i < sa->size - 1; i++)  
sa->students[i] = sa->students[i + 1];  
 
sa->size--;  
 
sa->students = (pstudent)realloc(sa->students, sizeof(student) * sa->size);  
    }  
}  

 
Добавлено
 
понял из за чего. в ReadFromFile выделяли память для этого поля для len а нужно для len+1
newStudent->marks = (char*)malloc(len+1);

Всего записей: 185 | Зарегистр. 19-01-2003 | Отправлено: 23:48 21-05-2003 | Исправлено: zam, 23:53 21-05-2003
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Какую структуру данных для данной задачи на СИ рекомендуете?


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2025

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru