Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Помощь по СИ

Автор: Alkor
Дата сообщения: 06.11.2005 18:38
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');
Автор: vjunk
Дата сообщения: 06.11.2005 19:55
Замечание не по сущесту, а по стилю - как насчет заменить код

Код:
else if(trans == '\n' || trans == 'q' || trans == 'Q');
else
printf("Invalid input!\tEnter selection (c, d, w, or q): ");
Автор: Karlos Lothar
Дата сообщения: 20.11.2005 16:56
Здравствуйте, уважаемые!
Как думае-те, хорошо ли это и красиво ли?

Код:
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;
}
Автор: chaugi
Дата сообщения: 22.11.2005 20:14
Если 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


Пожалуйста разьясните что и как, устал пробывать что-то найти... Спасибо.
Автор: f_serg
Дата сообщения: 23.11.2005 07:38
chaugi

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

Библиотеку при линковке добавить надо. Насколько я помню, graphics.lib.
Автор: chaugi
Дата сообщения: 23.11.2005 09:36
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'

Нифига не работает помогите...
Автор: WiseAlex
Дата сообщения: 23.11.2005 12:03
chaugi

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

не пойдет. Нужно в настройках линковщика указать библиотеку, для каждого линковщика свои ключи - посмотри насройки или документацию
Автор: vjunk
Дата сообщения: 23.11.2005 13:27
Karlos Lothar

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

Можно, при помощи функции vfprintf.
Автор: chaugi
Дата сообщения: 23.11.2005 15:00
WiseAlex
Можно пожалуйста поподробней про этот линковщик, а то я не особо в этом соображаю.
Автор: Vasilio
Дата сообщения: 28.11.2005 06:50
Прога состоит из 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 то ошибки нет.
Автор: KADABRA
Дата сообщения: 29.11.2005 07:11

Код:
#include <stdio.h>
#include <malloc.h>

int main(void)
{
    long int n;
    scanf("%d", &n);

    long * buffer;
    buffer = (long *)calloc( n, sizeof( long ) );

    return 0;
}
Автор: wInuX
Дата сообщения: 29.11.2005 09:01
в С все переменные должны объявляться в начале блока.


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

int main(void)
{
long int n;
long * buffer;

scanf("%d", &n);
buffer = (long *)calloc( n, sizeof( long ) );

return 0;
}
Автор: KADABRA
Дата сообщения: 29.11.2005 16:27
wInuX
Спасибо. А я уже к С++ привык, думал что в С так-же
Автор: WiseAlex
Дата сообщения: 29.11.2005 18:14
KADABRA

Цитата:
А я уже к С++ привык, думал что в С так-же

только в С99
Автор: KADABRA
Дата сообщения: 29.11.2005 18:40
WiseAlex
Т.е. компилятор, поддерживающий С стадарт 99 года должен понимать мой код?
А тогда MSVC++ 2005 что поддерживает?
Автор: wInuX
Дата сообщения: 30.11.2005 09:02
Microsoft как обычно стандарты не поддерживает. :)
В gcc, например, твой код компилится без ошибок
Автор: WiseAlex
Дата сообщения: 30.11.2005 10:01
KADABRA

Цитата:
А тогда MSVC++ 2005 что поддерживает?

не знаю - пока в руках не держал, а vc2003 только с89
wInuX

Цитата:
Microsoft как обычно стандарты не поддерживает.

на самом деле не все так однозначно и просто. С99 сегодня поддерживает не так много компиляторов для pc, а про не-pc и говорить нечего, поэтому переносимость кода С99 достаточно сомнительна. Будум надеятся, что постепенно с этим станет получше.

Цитата:
В gcc, например, твой код компилится без ошибок

файл точно компилировался как С, а не С++? Кстати в С99 должен быть встроенный тип complex - проверь заодно и его
Автор: wInuX
Дата сообщения: 30.11.2005 10:25
WiseAlex
компилирую точно как С: gcc test.c.
complex - нет, но например long long int - есть. Если я не ошибаюсь между С89 С99 еще один стандарт был (вроде бы С92).

#include<stdio.h>

long long int i;

int main(){
printf("%d",sizeof(i));
return 0;
}

выводит 8;

Добавлено:
забыл, что Complex с большой буквы пишется. все работает.

#include<stdio.h>

_Complex i;

int main(){
printf("%d",sizeof(i));
return 0;
}

выводит 16.
Автор: WiseAlex
Дата сообщения: 30.11.2005 10:54
wInuX
gcc
Автор: KADABRA
Дата сообщения: 30.11.2005 14:41
wInuX
WiseAlex
Спасибо, буду знать - MSVC++ - не для С
Автор: chaugi
Дата сообщения: 15.12.2005 21:48
Помогите пожалуйста разобраться с пойнтерами. Я не понимаю как посылать структуры и переменные в фунции, так чтобы эти переменные и структуры могли изменяться в этих функциях.

Суть проги. Т.к. я ламер, то у меня структуры фиксированного размера, и поэтому я делаю дополнительные переменные для каждой структуры, которые отвечают за их длинну в данном случае chel_kol, rebj_kol. Мне нужно послать эти структуры в процедуру dataprocess для того чтобы там присвоить например 2ум взрослым и одному ребёнку имена. Следовательно значения будут chel_kol=2, rebj_kol=1.

Только я не знаю как это правильно записать. Помогите пожалуйста


Цитата:
# include <stdio.h>

struct chel_struct
{ char name[10];
}

struct rebj_struct
{ char name[10];
}

void dataprocess(int struct chel_struct *c, int struct rebj_struct *r, int *c_kol, int *r_kol);

main()
{ struct berns_struct rebj[100];
struct cilv_struct chel[100];
int chel_kol, rebj_kol;
...
dataprocess(chel,rebj,&chel_kol,&rebj_kol);
...
printf("%s",chel[0].name);
...
}

void dataprocess(int struct chel_struct *c, int struct rebj_struct *r, int *c_kol, int *r_kol)
{ ...
strcpy(c[0].name,"Anna");
strcpy(c[1].name,"Bella");
strcpy(r[0].name,"Bella");
*c_kol=2;
*r_kol=1;
...
...
}


Я написал прогу как понял, но она работает неверно, то детям имена не присваиваются то ещё чего. Работу выполняю в обычном старом Borland C++ 3.11 другой нельзя. Помогите.

Спасибо.
Автор: wInuX
Дата сообщения: 16.12.2005 09:12
Во первых после объявления структуры нужно ставить ';'.
Во вторых в функции main() обявляются масивы из неизвестных структур.
И еще не надо указывать intперед структурой в параметрах функции.


Код:
# include <stdio.h>

struct chel_struct{
char name[10];
};

struct rebj_struct{
char name[10];
};

void dataprocess(struct chel_struct *c, struct rebj_struct *r, int *c_kol, int *r_kol);

int main(){
struct rebj_struct rebj[100];
struct chel_struct chel[100];
int chel_kol, rebj_kol;

dataprocess(chel,rebj,&chel_kol,&rebj_kol);
printf("%s",chel[0].name);
return 0;
}

void dataprocess(struct chel_struct *c, struct rebj_struct *r, int *c_kol, int *r_kol){
strcpy(c[0].name,"Anna");
strcpy(c[1].name,"Bella");
strcpy(r[0].name,"Bella");
*c_kol=2;
*r_kol=1;
}
Автор: tomegadeth
Дата сообщения: 17.12.2005 10:13
а эти не пользуем?
Цитата:
int chel_kol, rebj_kol;


Код:
.
.

dataprocess(chel,rebj,&chel_kol,&rebj_kol);
for(int i = 0; i < chel_kol; i++)
printf("%s\r\n",chel[i].name);
for(int i = 0; i < rebj_kol; i++)
printf("%s\r\n",rebj[i].name);

return 0;
.
Автор: chaugi
Дата сообщения: 17.12.2005 14:32
Скажите а почему

Цитата:
printf("dd.mm.yy: ");
while (yearcheck(gets(text),1)!=1)
printf("dd.mm.yy: ");

в таком случае у меня при проверке правильно введённого года месяца и дня, если вводиться неправильное значение и функция check year возвращает 0, то почему-то у меня не просит ввести текст ещё раз, а просто зацикливается, т.е. зы меня вводт текст и опятна проверку, опять вводит .....? Причём у меня такая же комбинация с другой функциеё проверки предположем правильно введённого имени всё работает нормально, а здесь почемуто зацикливает.
Автор: Xarde
Дата сообщения: 18.12.2005 12:53
chaugi, твой код и служит тебе ответом. Во-первых, ты не прав, считая, что твой код "повторно вводит" значение. Он просто использует старое. Ведь нигде не приведена строка кода, которая производит чтение с консоли. А во-вторых... в общем, алгоритм у тебя такой: если проверка года дала не 1, то напечатать, а затем снова проверить и напечатать. И так до бесконечности, т.к. проверяемое значение не изменяется. Проверяй хоть тысячу лет, но ноль единицей не всё равно сам по себе не станет. Для этого надо чтобы кто-то прибавил к нему 1
Автор: vjunk
Дата сообщения: 20.12.2005 19:55
chaugi
ищи ошибку в функции yearcheck или в распределении памяти
под переменную text - похоже у тебя просто происходит затирание
невыделенной памяти и прога глючит (скажи спасибо, что просто gets
перестаёт работать, а могла-бы и винчестер отформатировать ).
Автор: Xarde
Дата сообщения: 21.12.2005 13:52
Упс, что-то я стал стареть и уже не вижу половины кода. Извиняюсь за свой предыдущий пост - не заметил вызов gets в условии цикла.
В целом согласен с vjunk - надо смотреть на функцию yearcheck.
Автор: grekalov
Дата сообщения: 21.12.2005 16:53
Доброго времени суток! Решил заняться изучением программирования и начал с книги М.Уэйт, С.Прата, Д.Мартин "Язык Си" Москва "МИР" 1988 г. Ошибок в листинге программ достаточно, но удавалось исправить их самому (до вчерашнего вечера). В ниже приведенном примере текста программы не могу понять, почему не отрабатывает до конца программа, доходит до ввода цены и все. Подскажите начинающему???
Вот сам листинг программы:
# include <stdio.h>
# define MAXTIT 40
# define MAXAUT 40
# define MAXBOX 100
# define STOP " "
struct book
{
char title [MAXTIT];
char autor [MAXAUT];
float value;
};
main()
{
struct book libry [MAXBOX];
int count=0;
int index;
printf("Vvedite nazvanie knigi\n");
printf("Najmite klavishu [ENTER] v nachale stroki dlya ostanova\n");
while (strcmp(gets(libry [count].title), STOP)!=0 && count<MAXBOX)
{
printf("Vvedite teper familiyu avtora\n");
gets(libry [count].autor);
printf ("Vvedite teper cenu\n");
scanf("%f", &libry [count++].value);
while (getchar()!='n');
if (count<MAXBOX)
printf ("Vvedite nazvanie sleduyushey knigi\n");
}
printf ("Vot spisok knig:\n");
for (index=0; index<count;index++)
printf ("%s, $s: %2.2\n", libry [index].title,
libry [index].autor, libry [index].value);
}
Автор: wInuX
Дата сообщения: 21.12.2005 17:01
Вместо
while (getchar()!='n');
поставь
while (getchar()!='\n');
Автор: grekalov
Дата сообщения: 21.12.2005 17:07


Цитата:
поставь
while (getchar()!='\n');

пробовал, не помогает

Страницы: 123

Предыдущая тема: Qt (Trolltech Qt, Nokia Qt, Digia Qt)


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.