Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> формирование листинга в html формате 
:(
    Опции темы
Vanek091
Дата 4.12.2010, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 4.12.2010

Репутация: нет
Всего: нет



Есть два файла: 
 заголовочный list.h
Код
struct Item                     //opisanie struktur
 {
  struct Item *next;
  struct Item *prev;
 };
struct List
 {
  struct Item *head;
  struct Item *tail;
 };

 void    Add(struct List *l,struct Item *m);        //prototipy
void    Clear(struct List *l);
int     Count(struct List*l);
void    Delete(struct List*l,int n);
int     GetIndex(struct List*l,struct Item*m);
struct  Item*GetItem(struct List*l,int n);
void    Insert(struct List*l,struct Item*m,int n);
void    Print(struct List*l);
struct  Item*Remove(struct List*p,int);

и реализации list.c
Код

#include<stdio.h>
#include<malloc.h>
#include "list.h"

void  Add(struct List *l,struct Item *m)    //dobavlenie
{
         if (l->head==NULL)
         {
         l->head=m;
         l->tail=m;
         m->next=NULL;
         m->prev=NULL;
         }
else
         {
         m->next=NULL;
         m->prev=l->tail;
         l->tail->next=m;
         l->tail=m;
         }
}


void Clear (struct List *l)                 //ochistka spiska
{
    while (l->head->next!=NULL)
    {
        l->head=l->head->next;
        free( l->head->prev );
    }
    free( l->tail );
    l->tail=NULL;
    l->head=NULL;

  }


int Count (struct List *l )        //kolichestvo elementov v spiske
{
struct Item *m=l->head;
int k;
    if (l->head==NULL && l->tail==NULL) return 0;
    do
        {
        m=m->next;
        k++;
        }
    while (m);
    return k;
}


void Delete (struct List *l, int n)   //udalenie elementov
{
struct Item *t;
    if ( !(t=GetItem(l,n)) ) return;
    if ( t->prev ) t->prev->next=t->next;
        else l->head=t->next;
    if ( t->next ) t->next->prev=t->prev;
        else l->tail=t->prev;
    free(t);
    return;
}


int GetIndex (struct List *l,struct Item *m)    //poisk po adresu
{
struct Item *t=l->head;
int k=1;
    if ( !m ) return 0;
    while ( t!=m )
        {
        if ( !(t->next) )    return 0;
        t=t->next;
        k++;
        }
    return k;

}


struct Item *GetItem (struct List *l,int n)         //poisk po nomeru
{
struct Item *m=l->head;
int q=1;
    for ( ; q!=n && m!=NULL ; m=m->next, q++);
   return m;
}


void Insert (struct List *l,struct Item *m,int n)     //vstavka
{
struct Item *t;
    if ( m==NULL )
        {
        return;
        }
    if ( !(t=GetItem( l, n )) )
        {
        Add (l, m);
        return;
        }
    m->next=t;
    m->prev=t->prev;
    if (t->prev) t->prev->next=m;
        else l->head=m;
    t->prev=m;
    return;

}


void Print (struct List *l)                 //vivod spiska
{
struct Item *m=l->head;
int k=0;
    printf ( "\n #\tAdress    Sleduyushiy    Predidushiy  \n" );
    while ( m!=NULL )
        {
        printf ( " %d\t %p\t     %p\t     %p\n", ++k, m, m->next, m->prev );
        m=m->next;
        }
}


struct Item *Remove (struct List *l, int n )    // virezanie
{
    struct Item *t;
    if ( !( t=GetItem(l,n))) return NULL;
    if (t->prev) t->prev->next=t->next;
        else l->head=t->next;
    if (t->next) t->next->prev=t->prev;
        else l->tail=t->prev;
    return t;
}

 на выходе нужно получить html файл ссылками от прототипа функции к ее реализации и наоборот
 код  еще не дописан,но возникли вопросы..
Код
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
void main(void)
{
FILE *fi1, *fi2, *fo;
char  FileZ[20],FileR[20],FileOB[20]={"listing.htm"},s[105]={""},e[2],
       s1[50]={""},s2[50]={""},s3[105],s4[105],s5[105],list[25][20]={""},*chr;
int i,j,sum,sum1,a,b,c,d,f,g,h;
  j=f=0;
 textcolor(1);
 textbackground(7);
 clrscr();
 printf("vvedite imay zaglovochnogo faila : ");
 scanf("%s",FileZ);
 printf("vvedite imay  faila realizatsii : ");
 scanf("%s",FileR);
 fo = fopen(FileOB, "w");
 if (!fo) printf("Oshibka otkritiya konechnogo faila\n");
 else
     {
      fputs("<html>",fo);
      fputs("<body>",fo);
      fputs("<body bgcolor= 'ffc>",fo);
      fputs("<body text='000000'>",fo);
      fi1 = fopen(FileZ, "r+");
      if (!fi1) printf("Oshibka otkritiya zagolovochnogo faila\n");
      else
     {
       while  (fgets(s,sizeof s,fi1)!=NULL)//poka ne konets faila
          {
           i=sum=a=b=c=0;f=j;
           while (s[i]!='\n')//poka ne konets stroki
             {
              if(s[i]=='(') sum++;//schetchik ckobocek
              if(s[i]==')') sum--;//schetchik ckobocek
              if(s[i]==';'&& sum==0 && s[i-1]==')')// yslovie  obiavlenia functsii
                 {
                  chr=strchr (s,'(');
                  a=chr-s;// pozitsia pervoi otkrivaiyshiisa skoboki
                  strncpy(s1,s,a);//zapis v stroky s1 stroki  iz s  stoiashei do skobki
                  s1[a]='\0';//prisvaivanie kontsa stroki v positsii skobki
                  chr=strrchr (s1,' ');
                  b= chr-s1;// pozitsia   pervogo probela do skobki
                  strcpy(s2,s1+b+1);//zapis v stroky s2 stroki  iz s c pozitsii(b+1)  (obrezka stroki do probela)
                  chr=strrchr (s2,'*');//ishem zvezdochky
                  if (chr==NULL)//esli ee net
                  {
                    g=b;//pozitsia nachalanazvaniafunktsii v s
                    strcpy(list[j],s2);//zapis v massiv stroki  s2 -nazvanie funktsii
                   }
                  else//esli zvezdocha est
                  {
                   c= chr-s2;// pozitsia   pervoi zvezochki do skobki
                   strcpy(list[j],s2+c+1);//zapis v massiv stroki iz s2 c pozitsii(c+1) -nazvanie funktsii
                   g=b+c+2;//pozitsia nachalanazvaniafunktsii v s
                  }
                  j++;//schetchik elementov massiva
                  }
              i++;//schetchik  simvolov stroke
             }
            if(j!=f)//esli funktsia
            {
             strcpy(s3,s+g);//kopiruem  nazanie funktsii+vsechto za   nazvaniem
             itoa(j-1,e,10);//preodim j v stroky(indeks silki)
             strncpy(s4,s,g);//kopiruem vse do nazvania functsii
             s4[g]='\0';//propisivaem kontsstroki
             strcat(s4, "<a href='#");// pripisivaem nachalo tega silki
             strcat(s4, e);  //pripisivaem nomer silki
             strcat(s4,"'</a>");//zakrivaen teg
             strcat(s4,s3);//pripisivaem s3
             chr=strchr (s4,'(');
             a=chr-s4;// pozitsia pervoi otkrivaiyshiisa skoboki
             strcpy(s3,s4+a);// kopiruem skobky i vsechto za nei
             strncpy(s5,s4,a);//zapis v stroky s5 stroki  iz s4  stoiashei do skobki (s tegom silki)
             s5 [a]='\0';//prisvaivanie kontsa stroki v positsii skobki
             itoa(j-1+25,e,10);//preodim j v stroky(indeks imeni)
             strcat(s5, "<a name='");// pripisivaem nachalo tega imeni
             strcat(s5, e); //pripisivaem nomer silki
             strcat(s5,"'></a>");//zakrivaen teg
             strcat(s5,s3);//pripisivaem s3
             strcpy(s,s5);//zaisivaem s5 v s
            }
           strcat(s,"<br>");//zapis  tega  kontsa stroki
           fputs(s,fo);//zapis  stroki v html
           printf(s);
          }
        fclose(fi1);
     }
      fi2 = fopen(FileR, "r+");
      if (!fi2) printf("Oshibka otkritiya faila realizatsii\n");
      else
           {
         d=sum1=h=0;
          while (fgets(s,sizeof s,fi2)!=NULL)//poka ne konets faila
              {
                   h=d;i=0;
                   while (s[i]!='\n')//poka ne konets stroki
                     {
                       if(s[i]=='{') sum1++;
                       if(s[i]=='}') sum1--;
                       i++;
                    }
                   if(sum1==0 && h==d)
                 {
                    if (strstr(s,list[d])!=NULL);
                       {
                      itoa(d,e,10);//preodim j v stroky(indeks silki)
                      strcpy(s3, "<a name='");// pripisivaem nachalo tega imeni
                      strcat(s3, e); //pripisivaem nomer silki
                      strcat(s3,"'></a>");//zakrivaen teg
                      strcat(s3,s);//pripisivaem s
                      strcpy(s,s3);//zaisivaem s3v s
                      d++;
                     }
                  }
               strcat(s,"<br>");//zapis  tega  kontsa stroki
               fputs(s,fo);
               printf(s);
             }
        }
       fputs("</body>",fo);
       fputs("</html>",fo);
      fclose(fo);
    }
  for(d=0;d<=j;d++)
  printf("%s\n",&list[d]);
 getch();
}

 1)  назние функций заносится в массив правильно, но если активировать код с 56 по 77 строку почему-то считывается последняя строка дважды(как исправить не знаю)
2)  if (strstr(s,list[d])!=NULL); не знаю почему, но эта строка игнорируется компилятором.... да и вообще пропись тега имени сылки не так работает...

Это сообщение отредактировал(а) Vanek091 - 7.12.2010, 16:07
PM MAIL   Вверх
boostcoder
Дата 4.12.2010, 00:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(Vanek091 @  4.12.2010,  00:28 Найти цитируемый пост)
нужно получить html файл ссылками от прототипа функции к ее реализации и наоборот

лучшее что видел - http://ru.wikipedia.org/wiki/Doxygen
PM WWW   Вверх
Vanek091
Дата 4.12.2010, 00:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 4.12.2010

Репутация: нет
Всего: нет



программа должна быть реализована на С, по заданию
PM MAIL   Вверх
boostcoder
Дата 4.12.2010, 00:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(Vanek091 @  4.12.2010,  00:34 Найти цитируемый пост)
программа должна быть реализована на С

так тебе нужно самому реализовать что-то на подобии Doxygen?

Это сообщение отредактировал(а) boostcoder - 4.12.2010, 00:39
PM WWW   Вверх
Vanek091
Дата 4.12.2010, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 4.12.2010

Репутация: нет
Всего: нет



Цитата(boostcoder @  4.12.2010,  00:38 Найти цитируемый пост)
программа должна быть реализована на Са это тут при чем?ты бы хоть прочел по ссылке, тогда бы не возникло вопросов  

 Я должен написать программку на С которая  создает html файл с листингом в котором есть переход(гиперссылка) с прототипа  к реализации и наоборот.... а ссылку я посмотрел ту что вы дали
  да именно так, что-то на подобии, код что я привел почти работает, его надо только подправить, но я не вижу где именно в нем косяки

Это сообщение отредактировал(а) Vanek091 - 4.12.2010, 00:52
PM MAIL   Вверх
xvr
Дата 6.12.2010, 12:33 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(Vanek091 @  4.12.2010,  00:44 Найти цитируемый пост)
 да именно так, что-то на подобии, код что я привел почти работает, его надо только подправить, но я не вижу где именно в нем косяки
Судя по коду косяков в нем уже нет - все скурили, в процессе написания  smile 
У вас задача гораздо сложнее, чем написание 'Hello world'. Такие задачи с наскока не решаются. 
Разделите задачу на составляющие части, разработайте структуру данных (где будет хранится список функций), напишите отдельные процедуры парсинга файлов заголовков и реализации (лучше даже если они будут и внутри себя порезанны на процедуры, а не предствленны в виде 'кирпичей' кода).

Вам сторонние библиотеки использовать можно? Если да, то рекомендую pcre для парсинга.

PS. Я бы у вас такую программу не принял, даже если бы она работала на все 100%



Это сообщение отредактировал(а) xvr - 6.12.2010, 12:34
PM MAIL   Вверх
Vanek091
Дата 7.12.2010, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 4.12.2010

Репутация: нет
Всего: нет



Цитата(xvr @  6.12.2010,  12:33 Найти цитируемый пост)
Судя по коду косяков в нем уже нет - все скурили, в процессе написания   У вас задача гораздо сложнее, чем написание 'Hello world'. Такие задачи с наскока не решаются. Разделите задачу на составляющие части, разработайте структуру данных (где будет хранится список функций), напишите отдельные процедуры парсинга файлов заголовков и реализации (лучше даже если они будут и внутри себя порезанны на процедуры, а не предствленны в виде 'кирпичей' кода).Вам сторонние библиотеки использовать можно? Если да, то рекомендую pcre для парсинга.PS. Я бы у вас такую программу не принял, даже если бы она работала на все 100%

 если б там не было косяков, то в конце компиляции создавался правильный html файл.
Я лично разбил задачу на несколько частей, а только потом реализовал. эти части выглядят следующим обраом:
заголовочный файл
1) найти все функции
2) занести их в массив для дальнейшего поиска в файле реализации
3) создание  гиперссылок на файл реализации в строке
4) создание имен гиперссылок из файла реализации в строке
5) запись   в html файл
файл реализации
1) поиск имен функций
2) поиск конца тела функции
3) создание имен гиперссылок   для прототипов в строке
4)создание ссылок на объявление прототипа в стоке
5) запись   в html файл
 структура данных где хранится названия функций это строковый массив
 и файлы обрабатываются последовательно..
 относительно функций мне кажется сначала надо написать рабочий"кирпич", а уж потом резать его на функции
 сторонние библиотеки использовать нельзя, и никто не говорил что это конечный вариант программы для сдачи,это всего лишь наработки



Это сообщение отредактировал(а) Vanek091 - 7.12.2010, 15:58
PM MAIL   Вверх
xvr
Дата 7.12.2010, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(Vanek091 @  7.12.2010,  15:50 Найти цитируемый пост)
Я лично разбил задачу на несколько частей, а только потом реализовал.
Это правильно
Цитата(Vanek091 @  7.12.2010,  15:50 Найти цитируемый пост)
относительно функций мне кажется сначала надо написать рабочий"кирпич", а уж потом резать его на функции
А вот это неправильно - 'кирпич' невозможно отлаживать, и невозможно понять не-автору.

Ваш исходный листинг можно разбирать только под угрозой смертной казни  smile 

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


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0794 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.