Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.05.2009, 16:58   #21
Nitrino
Я ещё только учусь
Форумчанин
 
Регистрация: 06.05.2009
Сообщений: 158
По умолчанию

Помогите пожалуйста не пойму в чём ошибки выдаваемые компилятором
Код:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
#include "keyboard.h"
#define N         5
#define ROW       10
#define COL       35
#define TEXT_C    WHITE
#define TEXT_BG   BLACK
#define CHOICE_BG LIGHTGRAY

struct node
{
   char str[1000];//Строка
   node *sled;//Указатель на след. элемент
   node *pred;//Указатель на пред. элемент
};

//-------------------------------------------------------------

void open_file (node **nsp, node **ksp)
// Построение двунаправленного списка:
// *nsp - указатель на начало списка.
// *ksp - указатель на конец списка.
// Элемент списка содержит строку.
{
  node *rsp;
  int i;
  char strok[1000];
  FILE *fp;
  fp = fopen("1.txt", "w+t");
  *nsp = new(node);
  rsp = *nsp;
  (*nsp)->pred = (*nsp)->sled = NULL;
  fseek(fp,0,SEEK_SET);
  fgets(strok,1000,fp);
  while (strok!=0)
  { rsp->sled = new(node); (*(rsp->sled)).pred = rsp;
    rsp = rsp->sled; rsp->sled = NULL; rsp->str = strok;
    i=ftell(fp);
    fgets(strok,i,fp); }
  *ksp = rsp;
  fclose(fp);
}
//----------------------------------------------------------------


void out_file (node *nsp, node *ksp)
//Вывод содержимого двунаправленного списка.
{
  node *rsp;
  rsp = (*nsp).sled;
  while  (rsp!=NULL)
  {
    printf(" %s\n", rsp->str); rsp = rsp->sled;
  }
  printf("%s\n", ksp);
}

void out_menu( int num, int bg_color );
/* Организация светового меню */
void main ( void )
{
   node *nsp, *ksp;
   int loop;        /* Флаг конца работы            */
   int choice;      /* Текущий выбор пункта меню    */
   int old_choice;  /* Старый выбор пункта меню     */
   double fun, x;   /* Значения функции и аргумента */
   int i;
   textbackground( TEXT_BG ); textcolor( TEXT_C );
   clrscr(); gotoxy( COL, ROW-1 );
   /* Начальный вывод всех пунктов меню */
   i=1; while( i <= N ) { out_menu( i, TEXT_BG ); i++; }
   loop = 1; choice = 1; old_choice = 2;
   while ( loop )
   {
      out_menu( old_choice, TEXT_BG );
      out_menu( choice, CHOICE_BG );
      old_choice = choice;
      switch( GetCh() )
      {
	 case kbUp    :
	    if ( choice>1 ) choice--; else choice = N; break;
	 case kbDown  :
	    if ( choice<N ) choice++; else choice = 1; break;
	 case kbEnter :
	    switch ( choice )
	    {
	       case 1 : open_file (nsp, ksp)  ; break;
	       case 2 : out_file (nsp, ksp)     ; break;
	      // case 3 :           ; break;
	      // case 4 :           ; break;
	       case 5 : loop=0;     continue;
	    }
	    textbackground( TEXT_BG ); gotoxy( COL-5, ROW+6 );

      }
   }
}

/* Функция вывода строки меню с указанным цветом фона */
void out_menu( int num, int bg_color )
{
   textbackground( bg_color ); gotoxy( COL, ROW+num );
   switch( num )
   {
      case 1: cprintf( "1. Открыть файл      " );  break;
      case 2: cprintf( "2. Просмотр файла    " );  break;
      case 3: cprintf( "3. Добавление строки " );  break;
      case 4: cprintf( "4. Удаление строки   " );  break;
      case 5: cprintf( "5. Конец работы      " );  break;
   }
}
Вопрос не относящийся к теме,есть ли bb код скрывающий текст и который будет разворачиваться по нажатию, то длинный код занимает много места

Последний раз редактировалось Nitrino; 28.05.2009 в 23:50.
Nitrino вне форума Ответить с цитированием
Старый 28.05.2009, 23:49   #22
Nitrino
Я ещё только учусь
Форумчанин
 
Регистрация: 06.05.2009
Сообщений: 158
По умолчанию

Компилятор ругается на вот эти строки выделенные красным
на 1 пишет Lvalue required
во втрой Cannot convert 'node *' to 'node * *'
Type mismatch in parameter 'nsp' in call to 'open_file(node * *,node * *)'
Объясните что тут не так?
Nitrino вне форума Ответить с цитированием
Старый 28.05.2009, 23:57   #23
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Совет: пишите инструкции каждую на отдельной строке. Проще будет ошибки отлавливать.

Код:
rsp = rsp->sled; rsp->sled = NULL; rsp->str = strok;
Так нельзя. Используйте strcpy.
Код:
strcpy(rsp->str,strok);
Код:
case 1 : open_file (nsp, ksp)  ; break;
У вас функция принимает указатель на указатель:
Код:
void open_file (node **nsp, node **ksp)
А вы ей даете указатель на структуру.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 29.05.2009, 00:10   #24
Nitrino
Я ещё только учусь
Форумчанин
 
Регистрация: 06.05.2009
Сообщений: 158
По умолчанию

смотрите ну как только я передаю указатель на указатель
Код:
case 1 : open_file (**nsp, **ksp)  ; break;
выдаёт такое
Код:
Error KURS2.CPP 91: Illegal structure operation
что это значит?
Nitrino вне форума Ответить с цитированием
Старый 29.05.2009, 00:29   #25
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Вот так попробуйте:
Код:
case 1 : open_file (&nsp, &ksp)  ; break;
Скомпилить ваш проект не могу, т.к. у меня нет файла keyboard.h и билдеровские функции из conio.h тоже отсутствуют.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 29.05.2009, 00:50   #26
Nitrino
Я ещё только учусь
Форумчанин
 
Регистрация: 06.05.2009
Сообщений: 158
По умолчанию

спасибо это помогло, но только после выбора пункта "открыть файл" программа зависает и больше нельзя выбрать ни какие пункты.
В чём мможет быть подвох? Или может я неправильно написал саму функцию?
Если требуется прикрипил keyboard.h и conio.h
Вложения
Тип файла: rar INCLUDE.rar (2.2 Кб, 10 просмотров)

Последний раз редактировалось Nitrino; 29.05.2009 в 00:54.
Nitrino вне форума Ответить с цитированием
Старый 29.05.2009, 00:57   #27
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Зачем вот это?
Код:
i=ftell(fp);
    fgets(strok,i,fp);
Читайте просто:
Код:
fgets(strok,1000,fp);
Цитата:
программа зависае
В этой функции лишь один цикл. И условием выхода является strok=0. Логично предположить, что программа не считывает файл до конца.

На всякий случай, приведите содержимое файла keyboard.h.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 29.05.2009, 01:06   #28
Nitrino
Я ещё только учусь
Форумчанин
 
Регистрация: 06.05.2009
Сообщений: 158
По умолчанию

Код:
i=ftell(fp);
    fgets(strok,i,fp);
Да это я не правильно написал.Исправил.
после считывания fgets запоминает указатель? или как сделать что бы оно считывало следующую строку
вот содержимое keyboard.h
Код:
/* Функция GetCh будет возвращать обычный код при
нажатии обычных клавиш, а при нажатии спец. клавиш
будет возвращать scan-код клавиши, увеличенный на
256, а при нажатом SHIFT на 512 */
#include <conio.h>
#include <bios.h>
int GetCh (void)
{
int ch;
if ((ch=getch())==0)
ch=getch()|(bioskey(2)&3 ? 0x200 : 0x100);
return ch;
}

/*Коды клавиш*/
enum Keyboard_Codes
{
kbF1=315, kbF2, kbF3, kbF4, kbF5, kbF6, kbF7, kbF8, kbF9, kbF10,
kbShiftF1=596, kbShiftF2, kbShiftF3, kbShiftF4, kbShiftF5, kbShiftF6, kbShiftF7, kbShiftF8, kbShiftF9, kbShiftF10,
kbCtrlF1=350, kbCtrlF2, kbCtrlF3, kbCtrlF4, kbCtrlF5, kbCtrlF6, kbCtrlF7, kbCtrlF8, kbCtrlF9, kbCtrlF10,
kbAltF1=376, kbAltF2, kbAltF3, kbAltF4, kbAltF5, kbAltF6, kbAltF7, kbAltF8, kbAltF9, kbAltF10,
kbAlt1=376, kbAlt2, kbAlt3, kbAlt4, kbAlt5, kbAlt6, kbAlt7, kbAlt8, kbAlt9, kbAlt10,
kbAltQ=372, kbAltW, kbAltE, kbAltR, kbAltT, kbAltY, kbAltU, kbAltI, kbAltO, kbAltP,
kbAltA=286, kbAltS, kbAltD, kbAltF, kbAltG, kbAltH, kbAltJ, kbAltK, kbAltL,
kbAltZ=300, kbAltX, kbAltC, kbAltV, kbAltB, kbAltN, kbAltM,
kbCtrlA=1, kbCtrlB, kbCtrlC, kbCtrlD, kbCtrlE, kbCtrlF, kbCtrlG, kbCtrlH, kbCtrlI, kbCtrlJ, kbCtrlK, kbCtrlL, kbCtrlM, kbCtrlN,
kbCtrlO, kbCtrlP, kbCtrlQ, kbCtrlR, kbCtrlS, kbCtrlT, kbCtrlU, kbCtrlV, kbCtrlW, kbCtrlX, kbCtrlY, kbCtrlZ,
kbUp=328, kbDown=336, kbTab=9, kbCtrlUp=397, kbCtrlDown=401, kbCtrlTab=404, kbAltUp=408, kbAltDown=416, kbAltTab=421,
kbShiftUp=584, kbShiftDown=592, kbShiftTab=527,  kbRight=333, kbLeft=331, kbEsc=27, kbCTrlRight=372, kbCtrlLeft=371, kbAltRight=413,
kbAltLeft=411, kbAltEsc=287, kbShiftRight=589, kbShiftLeft=587, kbPgUp=329, kbPgDn=337, kbIns=338, kbCtrlPgUp=388,
kbCtrlPgDn=374, kbCtrlIns=513, kbAltPgUp=409, kbAltPgDn=417, kbAltIns=418, kbShiftPgUp=583,
kbShiftPgDn=593, kbShiftIns=594, kbHome=327, kbEnd=335, kbDel=339, kbCtrlHome=375, kbCtrlEnd=373, kbCtrlDel=515,
kbAltHome=407, kbAltEnd=415, kbAltDel=419, kbShiftHome=583, kbShiftEnd=591, kbShiftDel=595,
kbEnter=13, kbBackSpace=8, kbCtrlEnter=10, kbCtrlBackSpace=127, kbAltEnter=284, kbAltBackSpace=270
};
Nitrino вне форума Ответить с цитированием
Старый 29.05.2009, 01:15   #29
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Мда.. Час от часу не легче...
А что за bios.h? У меня такого тоже нету.

Попробуйте вот что:
объявите указатель:
Код:
char *p;
И вот так цикл измените:
Код:
p = fgets(strok,1000,fp);
  while (p)
  {
   rsp->sled = new(node);
   (*(rsp->sled)).pred = rsp;
    rsp = rsp->sled;
    rsp->sled = NULL;
    strcpy(rsp->str,strok);
    p = fgets(strok,1000,fp);
    }
Поможет?
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 29.05.2009, 01:31   #30
Nitrino
Я ещё только учусь
Форумчанин
 
Регистрация: 06.05.2009
Сообщений: 158
По умолчанию

помогло, программа теперь не зависает и всё работает. Только вот немогу понять почему после выбора "Просмотр файла" файл выводится на экран, но почему то повторяется последняя строчка, с чем это может быть связано?

Что бы вам было проще ориентироваться я могу выложить полностью свой Borland c? нужно?
---------------------------------------------------------------------------------------------
Спасибо с этим сам разобрался

Последний раз редактировалось Nitrino; 29.05.2009 в 01:37.
Nitrino вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Десятичные дроби в двоичном виде Ukrajinec Помощь студентам 2 13.04.2009 11:29
хранение данных в файле (dc++) AsabeasT Общие вопросы Delphi 2 27.03.2009 11:57
Поиск определённого текста в текстовом файле vitawt Общие вопросы Delphi 4 20.01.2008 22:12
Как правильно сохранить настройки текста в ini файле KORN Общие вопросы Delphi 2 30.10.2007 09:14
Поиск и замена текста в файле VAbramyak Общие вопросы Delphi 3 04.04.2007 20:20