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

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

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

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

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

KADABRA



Великий покусатель
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Код:
 
#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;
}

Не компилируется в MSVC 2005
 
Причём если убрать строку  
    scanf("%d", &n);
то компилируется  
В чём может быть дело?
 
Добавлено:
Такие ошибки выдаёт:
e:\worksrc\cpp\acm\1100_2\1100_2\main.c(7) : warning C4996: 'scanf' was declared deprecated
        e:\vs8\vc\include\stdio.h(295) : see declaration of 'scanf'
        Message: 'This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'
e:\worksrc\cpp\acm\1100_2\1100_2\main.c(9) : error C2143: syntax error : missing ';' before 'type'
e:\worksrc\cpp\acm\1100_2\1100_2\main.c(10) : error C2065: 'buffer' : undeclared identifier
e:\worksrc\cpp\acm\1100_2\1100_2\main.c(10) : warning C4047: '=' : 'int' differs in levels of indirection from 'long *'


----------
Это не подпись.

Всего записей: 1718 | Зарегистр. 14-07-2003 | Отправлено: 08:11 29-11-2005
wInuX

Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
в С все переменные должны объявляться  в начале блока.
 
 
#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;
}

Всего записей: 155 | Зарегистр. 19-05-2005 | Отправлено: 10:01 29-11-2005
KADABRA



Великий покусатель
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
wInuX
Спасибо. А я уже к С++ привык, думал что в С так-же

----------
Это не подпись.

Всего записей: 1718 | Зарегистр. 14-07-2003 | Отправлено: 17:27 29-11-2005
WiseAlex



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

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

только в С99

Всего записей: 1001 | Зарегистр. 02-03-2003 | Отправлено: 19:14 29-11-2005
KADABRA



Великий покусатель
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
WiseAlex
Т.е. компилятор, поддерживающий С стадарт 99 года должен понимать мой код?
А тогда MSVC++ 2005 что поддерживает?

----------
Это не подпись.

Всего записей: 1718 | Зарегистр. 14-07-2003 | Отправлено: 19:40 29-11-2005
wInuX

Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Microsoft как обычно стандарты не поддерживает. :)
В gcc, например, твой код компилится без ошибок

Всего записей: 155 | Зарегистр. 19-05-2005 | Отправлено: 10:02 30-11-2005
WiseAlex



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

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

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

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

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

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

файл точно компилировался как С, а не С++? Кстати в С99 должен быть встроенный тип complex - проверь заодно и его

Всего записей: 1001 | Зарегистр. 02-03-2003 | Отправлено: 11:01 30-11-2005 | Исправлено: WiseAlex, 11:02 30-11-2005
wInuX

Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
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.

Всего записей: 155 | Зарегистр. 19-05-2005 | Отправлено: 11:25 30-11-2005 | Исправлено: wInuX, 11:25 30-11-2005
WiseAlex



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

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



Великий покусатель
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
wInuX
WiseAlex
Спасибо, буду знать - MSVC++ - не для С

Всего записей: 1718 | Зарегистр. 14-07-2003 | Отправлено: 15:41 30-11-2005
chaugi



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Помогите пожалуйста разобраться с пойнтерами. Я не понимаю как посылать структуры и переменные в фунции, так чтобы эти переменные и структуры могли изменяться в этих функциях.
 
Суть проги. Т.к. я ламер, то у меня структуры фиксированного размера, и поэтому я делаю дополнительные переменные для каждой структуры, которые отвечают за их длинну в данном случае 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 другой нельзя. Помогите.
 
Спасибо.

Всего записей: 321 | Зарегистр. 16-03-2002 | Отправлено: 22:48 15-12-2005 | Исправлено: chaugi, 23:42 15-12-2005
wInuX

Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Во первых после объявления структуры нужно ставить ';'.
Во вторых в функции 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;
}
 

Всего записей: 155 | Зарегистр. 19-05-2005 | Отправлено: 10:12 16-12-2005
tomegadeth



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
а эти не пользуем?
Цитата:
 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;
.
 

и выводим полный список.

Всего записей: 560 | Зарегистр. 22-11-2004 | Отправлено: 11:13 17-12-2005
chaugi



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

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

в таком случае у меня при проверке правильно введённого года месяца и дня, если вводиться неправильное значение и функция check year возвращает 0, то почему-то у меня не просит ввести текст ещё раз, а просто зацикливается, т.е. зы меня вводт текст и опятна проверку, опять вводит .....? Причём у меня такая же комбинация с другой функциеё проверки предположем правильно введённого имени всё работает нормально, а здесь почемуто зацикливает.

Всего записей: 321 | Зарегистр. 16-03-2002 | Отправлено: 15:32 17-12-2005
Xarde



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
chaugi, твой код и служит тебе ответом. Во-первых, ты не прав, считая, что твой код "повторно вводит" значение. Он просто использует старое. Ведь нигде не приведена строка кода, которая производит чтение с консоли. А во-вторых... в общем, алгоритм у тебя такой: если проверка года дала не 1, то напечатать, а затем снова проверить и напечатать. И так до бесконечности, т.к. проверяемое значение не изменяется. Проверяй хоть тысячу лет, но ноль единицей не всё равно сам по себе не станет. Для этого надо чтобы кто-то прибавил к нему 1

Всего записей: 266 | Зарегистр. 06-07-2003 | Отправлено: 13:53 18-12-2005 | Исправлено: Xarde, 14:03 18-12-2005
vjunk

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
chaugi
ищи ошибку в функции yearcheck или в распределении памяти
под переменную text - похоже у тебя просто происходит затирание
невыделенной памяти и прога глючит (скажи спасибо, что просто gets
перестаёт работать, а могла-бы и винчестер отформатировать ).

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



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Упс, что-то я стал стареть и уже не вижу половины кода. Извиняюсь за свой предыдущий пост - не заметил вызов gets в условии цикла.
В целом согласен с vjunk - надо смотреть на функцию yearcheck.

Всего записей: 266 | Зарегистр. 06-07-2003 | Отправлено: 14:52 21-12-2005
grekalov

Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Доброго времени суток! Решил заняться изучением программирования и начал с книги М.Уэйт, С.Прата, Д.Мартин "Язык Си" Москва "МИР" 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);  
}

Всего записей: 64 | Зарегистр. 04-10-2005 | Отправлено: 17:53 21-12-2005
wInuX

Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Вместо  
 while (getchar()!='n');  
поставь
 while (getchar()!='\n');  

Всего записей: 155 | Зарегистр. 19-05-2005 | Отправлено: 18:01 21-12-2005
grekalov

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


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

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

Всего записей: 64 | Зарегистр. 04-10-2005 | Отправлено: 18:07 21-12-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