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

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

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

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

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

begem0t



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
сложно учить язык когда в книжках такие ляпусы
хотя разбор ошибок тоже полезен
TheChampion
mr_eoi
 спасибо!
 
Добавлено:
это какойто шизоидный пример.... очень долго соображал что там к чему. Когда сообразил и откомпилировал - оказалось что прога не работает
скармливаю ей её же текст - ничего не печатает
проверяю через printf переменную max = 33
а longest  не печатает почемуто
что еще не так в коде?

Всего записей: 901 | Зарегистр. 06-01-2003 | Отправлено: 19:06 05-06-2005
TheChampion

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

Цитата:
следовательно писать main() вполне допустимо

Как бы не так:

Цитата:
The function called at program startup is named main. The implementation declares no
prototype for this function. It shall be defined with a return type of int...

 
Shall содержит приказ, обязательство, так что опускать результат по Стандарту C99 не положено.
 
begem0t
 
Расставь скобки в инструкции
 for(i=0; i<lim-1 && (c=getchar()) !=EOF && c != '\n'; ++i)  
 
Думаю, что должно быть так:
 
  for(i = 0; (i < (lim - 1)) && ((c = getchar()) != EOF) && (c != '\n')); ++i)
 
Из-за отсутствия скобок и приоритета операций результат может быть несколько отличным от задуманного...
 
И еще. Заметь, что было написано в цикле. А теперь посмотри несколькими строчками ниже:
 
if (c=='n')
 
Опечатка!

Всего записей: 656 | Зарегистр. 25-06-2004 | Отправлено: 08:37 06-06-2005 | Исправлено: TheChampion, 08:45 06-06-2005
begem0t



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

Цитата:
if (c=='n')  
 
Опечатка!

точно, исправил
скобки добавил, но результат тотже, printf молчит как партизан.
Надо смотреть почему printf не печатает массив, может массив не работает?

Всего записей: 901 | Зарегистр. 06-01-2003 | Отправлено: 09:07 06-06-2005
TheChampion

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
begem0t
Рассмотрим функцию copy:

Цитата:
 /* copy: копирует из 'from' в 'to' */
void copy(char to[], char from[])
{
int i;
while((to[i]=from[i]) != '\0')
++i;
}  

 
Вопрос: чему равна i изначально? Правильный ответ: Гейтс ее знает! Поэтому работающая функция выглядит так:
 // copy: копирует из 'from' в 'to' --- комментарии в стиле C++ позволены C99
void copy(char to[], char from[])
{
  int i = 0;
  while(to[i] = from[i]) // То же, что и было, но короче, поскольку '\0' == 0
    ++i;
}
 
Вообще, для таких целей (копирование строк) предусмотрена библиотечная функция strcpy().

Всего записей: 656 | Зарегистр. 25-06-2004 | Отправлено: 10:03 06-06-2005 | Исправлено: TheChampion, 10:05 06-06-2005
begem0t



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
TheChampion
заработала!
спасибо большое, а то застрял на этом примере

Всего записей: 901 | Зарегистр. 06-01-2003 | Отправлено: 10:15 06-06-2005 | Исправлено: begem0t, 10:22 06-06-2005
Alkor



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Нужна помощь с while loop .  Вот код и в main() функции по непонятной причине сначала запускается код в else а потом только спрашивает ввод, getTrans().

Код:
#include <stdio.h>
 
void getBalance(double *p_balance);
void transMenu();
char getTrans();
void updateCheque(double *p_balance, double *p_cheque, int *p_cheques, int *p_bounced);
void updateDeposit(double *p_balance, double *p_deposit, int *p_deposits);
void updateWithdrawal(double *p_balance, double *p_withdrawal, int *p_withdrawals);
void updateServiceCharge(double *p_balance, double *p_serviceCharge, int *p_cheques, int *p_bounced, int *p_deposits, int *p_withdrawals);
 
int main()
{
  int bounced = 0, deposits = 0, cheques = 0, withdrawals = 0;
  double balance, serviceCharge, cheque, deposit, withdrawal;
  char trans;
  getBalance(&balance);
  transMenu();
       
  while((trans = getTrans()) != 'q' && trans !='Q')
  {
    if (trans == 'c' || trans == 'C'){
      updateCheque(&balance, &cheque, &cheques, &bounced);
      transMenu();
    }
    else if(trans == 'd' || trans == 'D'){
      updateDeposit(&balance, &deposit, &deposits);
      transMenu();
    }
    else if(trans == 'w' || trans == 'W'){
      updateWithdrawal(&balance, &withdrawal, &withdrawals);  
      transMenu();
    }
    else
      printf("Invalid input!\n");
           
  }
  updateServiceCharge(&balance, &serviceCharge, &cheques, &bounced, &deposits, &withdrawals);
  getchar();
  getchar();
  return 0;
}
void updateServiceCharge(double *p_balance, double *p_serviceCharge, int *p_cheques, int *p_bounced, int *p_deposits, int *p_withdrawals)
{
  *p_serviceCharge = (*p_cheques)*1.5+(*p_bounced)*15.0+(*p_deposits)*0.5+(*p_withdrawals)*0.5;
  *p_balance = *p_balance - *p_serviceCharge;
  printf("\n");
  printf("Transaction       Debit       Credit         Balance\n");
  printf("****************************************************\n");
  printf("Cheque            %.2lf                       %.2lf\n", *p_serviceCharge, *p_balance);
  printf("****************************************************\n\n");  
}
void updateWithdrawal(double *p_balance, double *p_withdrawal, int *p_withdrawals)
{
  printf("Enter amount of withdrawal: ");
  scanf("%lf", p_withdrawal);
  if(*p_withdrawal <= *p_balance && *p_withdrawal>=0){
    *p_balance = *p_balance - *p_withdrawal;
    *p_withdrawals = *p_withdrawals + 1;
    printf("\n");
    printf("Transaction       Debit       Credit         Balance\n");
    printf("****************************************************\n");
    printf("Cheque            %.2lf                       %.2lf\n", *p_withdrawal, *p_balance);
    printf("****************************************************\n\n");
  }
  else{
    printf("Invalid amount!\n");
    updateWithdrawal(p_balance, p_withdrawal, p_withdrawals);
  }
}
void updateDeposit(double *p_balance, double *p_deposit, int *p_deposits)
{
    printf("Enter amount of deposit: ");
    scanf("%lf", p_deposit);
  if(*p_deposit>=0){
    *p_balance = *p_balance + *p_deposit;
    *p_deposits = *p_deposits + 1;
    printf("\n");
    printf("Transaction       Debit       Credit         Balance\n");
    printf("****************************************************\n");
    printf("Cheque                        %.2lf           %.2lf\n", *p_deposit, *p_balance);
    printf("****************************************************\n\n");
  }
  else{
    printf("Invalid amount!\n");
    updateDeposit(p_balance, p_deposit, p_deposits);
  }
}
void updateCheque(double *p_balance, double *p_cheque, int *p_cheques, int *p_bounced)
{
  printf("Enter amount of cheque: ");
  scanf("%lf", p_cheque);
  if(*p_cheque<=*p_balance && *p_cheque>0){
    *p_balance = *p_balance - *p_cheque;
    *p_cheques = *p_cheques + 1;
    printf("\n");
    printf("Transaction       Debit       Credit         Balance\n");
    printf("****************************************************\n");
    printf("Cheque            %.2lf                        %.2lf\n", *p_cheque, *p_balance);
    printf("****************************************************\n\n");
  }
  else if(*p_cheque>*p_balance){
    printf("The amount is greater than balance!\n");
    *p_bounced = *p_bounced + 1;
  }
  else{
    printf("Invalid input!\n");
    updateCheque(p_balance, p_cheque, p_cheques, p_bounced);
  }
}
 
void getBalance(double *p_balance)
{
  printf("Welcome to the Cheque Book Balancer\n\n");
  printf("Please enter the current balance: ");
  scanf("%lf", p_balance);
  printf("\n");
  printf("*******************************************************\n");
  printf("Balance forward                                  %.2lf\n", *p_balance);
  printf("*******************************************************\n\n");
}
 
char getTrans()
{
  char ch;
  scanf("%c", &ch);
  return ch;
}
 
void transMenu()
{
  printf("Transaction Menu\n");
  printf("================\n");
  printf("c - Cheque\n");
  printf("d - Deposit\n");
  printf("w - Withdrawal\n");
  printf("q - Quit\n");
  printf("================\n");
  printf("Enter selection (c, d, w, or q): ");
}
 

Всего записей: 451 | Зарегистр. 16-05-2002 | Отправлено: 22:24 04-11-2005 | Исправлено: Alkor, 22:26 04-11-2005
Xarde



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ох, зря ты пишешь
Цитата:
while((trans = getTrans()) != 'q' && trans !='Q')
.
Разве нельзя использовать do ... while? Или ДО цикла первый раз получить символ и уж потом нормально проверять. Так и понятней будет, и работать будет, независимо от "приколов" компилятора.
Кстати, а можно получить объяснения по поводу того, что за
Цитата:
код в else
? Напиши подробней, как и куда попадает.

Всего записей: 266 | Зарегистр. 06-07-2003 | Отправлено: 22:07 05-11-2005
Alkor



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

Цитата:
Напиши подробней, как и куда попадает.

Вообщем, во время запуска программа запускает код else {этот} а потом только спрашивает ввод (getTrans();).
В данном примере, сначала печатается Invalid input!  Enter selection (c, d, w, or q): а только после запускается getTrans ();.
Надеюсь так понятние.
 

Код:
 
do
  {
    trans = getTrans();
     
    if (trans == 'c' || trans == 'C'){
      updateCheque(&balance, &cheque, &cheques, &bounced);
      transMenu();
    }
    else if(trans == 'd' || trans == 'D'){
      updateDeposit(&balance, &deposit, &deposits);
      transMenu();
    }
    else if(trans == 'w' || trans == 'W'){
      updateWithdrawal(&balance, &withdrawal, &withdrawals);  
      transMenu();
    }
    else
      printf("Invalid input!\tEnter selection (c, d, w, or q): ");
  }
  while (trans != 'q' && trans != 'Q');
 

Всего записей: 451 | Зарегистр. 16-05-2002 | Отправлено: 23:32 05-11-2005 | Исправлено: Alkor, 23:33 05-11-2005
Xarde



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Да, стало понятнее, хотя над качеством объяснений ещё стоит поработать
Точно сказать, в чём проблема не могу. Похоже, первый символ она читает "не тот". Посмотри описание scanf, может надо провести какую-то инициализацию. В крайнем случае попробуй игнорировать первый символ (до цикла его считать и ничего не делать) и посмотри, что будет вторым - если первый из "твоих", то ок.
 
Кстати, а не проще вместо кучи if использовать switch?

Всего записей: 266 | Зарегистр. 06-07-2003 | Отправлено: 10:28 06-11-2005 | Исправлено: Xarde, 10:29 06-11-2005
vjunk

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
scanf лучше вообще без крайней необходимости не использовать,
а уж для ввода одиночного символа и подавно. Я бы переписал
функцию таким образом:
 

Код:
 
char getTrans()
{
  char ch;
  ch=getchar(); /* Получить символ */
  if(ch!='\n')
    {
    while(getchar()!='\n') {} /* Прочитать остаток строки (если есть) */
    }
  return ch;
}  
 

Всего записей: 303 | Зарегистр. 23-02-2005 | Отправлено: 14:40 06-11-2005
Alkor



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
vjunk
Не работает твои вареант.
 
scanf() (getchar() тоже) возвращает два символа: \n и тот который был введен.  Проблема решилась добавлением ещё одного else if в while.

Код:
 
 do
  {
    trans = getTrans();
     
    if (trans == 'c' || trans == 'C'){
      updateCheque(&balance, &cheque, &cheques, &bounced);
      transMenu();
    }
    else if(trans == 'd' || trans == 'D'){
      updateDeposit(&balance, &deposit, &deposits);
      transMenu();
    }
    else if(trans == 'w' || trans == 'W'){
      updateWithdrawal(&balance, &withdrawal, &withdrawals);  
      transMenu();
    }
    else if(trans == '\n' || trans == 'q' || trans == 'Q');  
    else
      printf("Invalid input!\tEnter selection (c, d, w, or q): ");
  }
  while (trans != 'q' && trans != 'Q');  
 

Xarde
Мне ifы больше нравятся чем switchи.
 
Всем спасибо за помощь.

Всего записей: 451 | Зарегистр. 16-05-2002 | Отправлено: 19:38 06-11-2005 | Исправлено: Alkor, 19:45 06-11-2005
vjunk

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Замечание не по сущесту, а по стилю - как насчет заменить код

Код:
 
else if(trans == '\n' || trans == 'q' || trans == 'Q');  
else
  printf("Invalid input!\tEnter selection (c, d, w, or q): ");  
 

на

Код:
 
else if(trans != '\n' && trans != 'q' && trans != 'Q')
  printf("Invalid input!\tEnter selection (c, d, w, or q): ");  
 


Всего записей: 303 | Зарегистр. 23-02-2005 | Отправлено: 20:55 06-11-2005
Karlos Lothar

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте, уважаемые!
Как думае-те, хорошо ли это и красиво ли?

Код:
 
int readline(FILE *f, char *s, int n)
{
  int i, c;
  n--;
  for(i=0; i<n;)
  {
    c = getc(f);
    switch(c)
    {
      case 13:
        if( (c=getc(f)) != 10 )
          ungetc(c, f);
      case 10:
        s[i++] = 10;
      case EOF:
        goto stop;
      default: s[i++] = c;
    }
  }
  stop:
  s[i] = 0;
  return i;
}

// За свитч без брейка!
Смысл в том, что есть корявые текст.  файлы, новая строка в которых обозначается символами "\r\n", "\n" и просто  "\r" (что fgets() есть отказывается).
 
И еще вопрос, можно ли сделать функцию которая бы принимала параметры в стиле printf(), отправляла бы сообщение на stderr и завершала бы программу?

Всего записей: 4 | Зарегистр. 14-11-2005 | Отправлено: 17:56 20-11-2005
chaugi



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Если Borlan C++ Version 3.1 взять даже встроенный пример, который использует функцию graphics.h то он выдаёт ошибку:
 
Сама программа:

Цитата:
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
 
int main(void)
{
   /* request auto detection */
   int gdriver = DETECT, gmode, errorcode;
   int midx, midy;
   int radius = 100;
 
   /* initialize graphics and local variables */
   initgraph(&gdriver, &gmode, "");
 
   /* read result of initialization */
   errorcode = graphresult();
   if (errorcode != grOk)  /* an error occurred */
   {
      printf("Graphics error: %s\n", grapherrormsg(errorcode));
      printf("Press any key to halt:");
      getch();
      exit(1); /* terminate with an error code */
   }
 
   midx = getmaxx() / 2;
   midy = getmaxy() / 2;
   setcolor(getmaxcolor());
 
   /* draw the circle */
   circle(midx, midy, radius);
 
   /* clean up */
   getch();
   closegraph();
   return 0;
}

 
Ошибка которую выдёт компилятор, причём не указывает в каком точно месте ошибка:
 

Цитата:
Compiling NONAME00.CPP:
Linking NONAME00.EXE:
Linker Error: Undefined symbol _closegraph in module NONAME00.CPP
Linker Error: Undefined symbol _circle in module NONAME00.CPP
Linker Error: Undefined symbol _setcolor in module NONAME00.CPP
Linker Error: Undefined symbol _getmaxcolor in module NONAME00.CPP
Linker Error: Undefined symbol _getmaxy in module NONAME00.CPP
Linker Error: Undefined symbol _getmaxx in module NONAME00.CPP
Linker Error: Undefined symbol _grapherrormsg in module NONAME00.CPP
Linker Error: Undefined symbol _graphresult in module NONAME00.CPP
Linker Error: Undefined symbol _initgraph in module NONAME00.CPP

 
Пожалуйста разьясните что и как, устал пробывать что-то найти... Спасибо.

Всего записей: 321 | Зарегистр. 16-03-2002 | Отправлено: 21:14 22-11-2005
f_serg



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

Цитата:
Пожалуйста разьясните что и как, устал пробывать что-то найти... Спасибо.

Библиотеку при линковке добавить надо. Насколько я помню, graphics.lib.

Всего записей: 1706 | Зарегистр. 11-09-2002 | Отправлено: 08:38 23-11-2005 | Исправлено: f_serg, 08:40 23-11-2005
chaugi



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
f_serg
Если я ясно понял, то надо добавить строчку #include <graphics.lib>?!
 

Цитата:
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <graphics.lib>
 
int main(void)
...  

 
Тогда компилятор выдаёт другой эррор:
 

Цитата:
 Compiling NONAME00.CPP:
 Error NONAME00.CPP 5: Unable to open include file 'GRAPHICS.LIB'

Нифига не работает помогите...

Всего записей: 321 | Зарегистр. 16-03-2002 | Отправлено: 10:36 23-11-2005
WiseAlex



Софтовых дел М...
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
chaugi

Цитата:
#include <graphics.lib>  

не пойдет. Нужно в настройках линковщика указать библиотеку, для каждого линковщика свои ключи - посмотри насройки или документацию

Всего записей: 1001 | Зарегистр. 02-03-2003 | Отправлено: 13:03 23-11-2005
vjunk

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

Цитата:
можно ли сделать функцию которая бы принимала параметры в стиле printf(), отправляла бы сообщение на stderr и завершала бы программу?

Можно, при помощи функции vfprintf.

Всего записей: 303 | Зарегистр. 23-02-2005 | Отправлено: 14:27 23-11-2005
chaugi



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
WiseAlex
Можно пожалуйста поподробней про этот линковщик, а то я не особо в этом соображаю.

Всего записей: 321 | Зарегистр. 16-03-2002 | Отправлено: 16:00 23-11-2005
Vasilio

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Прога состоит из 3-х файлов. Основной AZTTIF.C, из него вызывается функция AztecEncode. Прототип функции AztecEncode  задан в AZTENCOD.H
    int AztecEncode (inputs *in, output *out, int fill, int show);
Описание в AZTENCOD.C
int AztecEncode (inputs *in, output *out, int fill, int show) {
    int i, ok;
    workspace *ws;
    const char spc[2] = { " " };
    char seq[3] = { "AA" };
 
    if (show) ShowMessage(in);
    
    ws = malloc(sizeof(workspace));
    if (ws) {
    
        ok = 1; SAH[0] = 0; SHOW = show;
        if (ECP != 300) {
            XIN = 0; ok = BestPattern(in,ws,20000);
            if ((show)&&(ok)) ShowBest(ws);
        }
        if (ok) ok = FindSize(in,ws,out);
        if ((show)&&(ok)) ShowSize(in,ws,out,ok);
 
        if ((ok)&&(fill)) {
 
/* First clear the entire array of bits:    */
            for (i=0; i<ok; i++) BMAP[i] = 0;
            if (NL) {
                if (MUL > 1) {
                    if (ID[0]) { strcat(SAH,spc); strcat(SAH,ID); strcat(SAH,spc); }
                    seq[1] += MUL-1; strcat(SAH,seq);
                }
 
                if (NL <= 2) { NW = NW/6; GF = 64; PP = 67; }
                else if (NL <= 8) { NW = NW/8; GF = 256; PP = 301; }
                 else if (NL <= 22) { NW = NW/10; GF = 1024; PP = 1033; }
                  else { NW = NW/12; GF = 4096; PP = 4201; }
                if (show) ShowEC(ws);
 
                XIN = 0;
                if (MUL > 1) {
                    for (i=1; i<MUL; i++) {
                        BestPattern(in,ws,SMAX);
                         HLEncode(in,ws);
                        if (ReedSolomon(ws)) {
                            if (show) ShowWords(ws);
                            CreateBitMap(in,ws,out);
                             if (show) ShowModeMsg(ws);
                             CTRX += NROW+1;
                              SAH[strlen(SAH)-2]++;
                        }
                    }
                    BestPattern(in,ws,20000);
                }
                HLEncode(in,ws);
                if (!ReedSolomon(ws)) ok = 0;
                if ((show)&&(ok)) ShowWords(ws);
        
            }
            if (ok) {
                CreateBitMap(in,ws,out);
                 if (show) ShowModeMsg(ws);
                if    (REV) for (i=0; i<ok; i++) BMAP[i] = ~BMAP[i];
            }
        }
        free(ws);
    } else ok = 0;
    return ok;
}
 
При компиляции ошибок нет, а при линковке возникает ошибка
Linker error: undefined symbol _AztecEncode in module azttif.c
Если все описать в одном файле azttif.c то ошибки нет.

Всего записей: 28 | Зарегистр. 06-01-2003 | Отправлено: 07:50 28-11-2005
Открыть новую тему     Написать ответ в эту тему

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

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


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

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

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru