LINUX.ORG.RU

Вопрос по С, архитектурам, возможно gcc

 , , ,


0

2

Рассмотрим такой кусок кода:

  int validInput;
  double t = 0.0001;
  double v[1], m[1], a[1];
  double *y,*x;
  y = (double*)malloc(max_recursion_number*sizeof(double));
  x = (double*)malloc(max_recursion_number*sizeof(double));
  if(x == NULL || y == NULL)
  {
    printf("Memory allocation failure, exiting.");
    return(EXIT_FAILURE);
  }
  
  x[0] = 1;
  y[0] = 0;
  x[1] = -1;
  y[1] = 0;
  validInput = (argc == 7);
  validInput = validInput && sscanf(argv[1],"%lf", &x[2]); 
  validInput = validInput && sscanf(argv[2],"%lf", &y[2]); 
  validInput = validInput && sscanf(argv[3],"%lf", &v[0]);
  validInput = validInput && sscanf(argv[4],"%lf", &v[1]);
  validInput = validInput && sscanf(argv[5],"%lf", &m[0]) && (m[0] >= 0);
  validInput = validInput && sscanf(argv[6],"%lf", &m[1]) && (m[1] >= 0);
  if(!validInput)
   {
    printf("Input validation failure, please use the program with x(0), y(0), vx(0), vy(0), m1, m2 as the commant line options, exiting. \n");      
    return(EXIT_FAILURE);
   }
   
  x[3] = x[2] + t*v[0];
  y[3] = y[2] + t*v[1];
  printf("%lf %lf %lf %lf \n", x[3], y[3], v[0], v[1]);

1.

primrose > uname -a
SunOS primrose 5.10 Generic_148888-05 sun4v sparc SUNW,SPARC-Enterprise-T5220
primrose > ./projv2 0 0 0 0 0 1
0.000100 0.000000 1.000000 0.000000
primrose > gcc -v
Using built-in specs.
Target: sparc-sun-solaris2.10
Configured with: ../gcc-4.4.2/configure --prefix=/usr/local/gnu --with-gmp=/usr/local
Thread model: posix
gcc version 4.4.2 (GCC) 

2.

[tyakos@Kostya-PC proj]$ uname -a
Linux Kostya-PC 3.17.1-1-ARCH #1 SMP PREEMPT Wed Oct 15 15:04:35 CEST 2014 x86_64 GNU/Linux
[tyakos@Kostya-PC proj]$ gcc -lm projV2.c -oprojv2
[tyakos@Kostya-PC proj]$ ./projv2 0 0 0 0 0 1
0.000000 0.000000 0.000000 0.000000 
[tyakos@Kostya-PC proj]$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.2/lto-wrapper
Target: x86_64-unknown-linux-gnu
Configured with: /build/gcc/src/gcc-4.9.2/configure --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://bugs.archlinux.org/ --enable-languages=c,c++,ada,fortran,go,lto,objc,obj-c++ --enable-shared --enable-threads=posix --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-clocale=gnu --disable-libstdcxx-pch --disable-libssp --enable-gnu-unique-object --enable-linker-build-id --enable-cloog-backend=isl --disable-isl-version-check --disable-cloog-version-check --enable-lto --enable-plugin --enable-install-libiberty --with-linker-hash-style=gnu --disable-multilib --disable-werror --enable-checking=release
Thread model: posix
gcc version 4.9.2 (GCC) 

Так вот, вопрос: у меня руки не из того места растут или это баг? В 2ом случае всё работает безукоризненно.

★★★

Последнее исправление: tyakos (всего исправлений: 1)

double v[1], m[1], a[1];
...
&v[1]
&m[1]

Ну ты понял, да?

Алсо, ты делаешь предположение что max_recursion_number > 3, но не проверяешь это заранее.

slovazap ★★★★★
()
Ответ на: комментарий от slovazap

max_recursion_number определяется ранее, там всегда >3. Ну а я пошёл дальше читать маны. Меня смутило то, что у меня на комьютере (2), всё работало, а на тест сервере - нет.

tyakos ★★★
() автор топика
Ответ на: комментарий от tyakos

Это называется неопределённое поведение, при нём код волен делать абсолютно что угодно. А в каких манах ты собрался читать что нельзя обращаться ко второму элементу массива из одного элемента?

slovazap ★★★★★
()
Ответ на: комментарий от slovazap

Маны для самых маленьких. Да уж, теперь всё ясно.

tyakos ★★★
() автор топика

Всем спасибо, починил, руки немного выпрямил. Если кому-то интересно, могу выставить свой код на обозрение, считает траекторию движения тела под влиянием притяжения 2 фиксированых тел. И отрисовка в текстовом интерфейсе, которой я доволен.

tyakos ★★★
() автор топика
Ответ на: комментарий от Dron

http://pastebin.com/r5iCXQhC

Для отрисовки проверку ввода не доделал. Нормальные примеры: 0 0 1 1 1 1, 0 0 0 1 0 1. Steps: 1000. Советую зажимать Enter.

Буду рад нормальной критике и советам.

tyakos ★★★
() автор топика
Последнее исправление: tyakos (всего исправлений: 1)
Ответ на: комментарий от Dron

Спасибо. Это, фактически, первая моя программа, написаная от начала до конца, поэтому мне приятно :D. Я думаю добавить скип step'ов и автоматическую прокрутку, но не уверен, как сделать паузу :D

tyakos ★★★
() автор топика
Ответ на: комментарий от Dron

Угу, спасибо. А для управления, получается, надо stdin каждый раз проверять. Или есть проще способ?

tyakos ★★★
() автор топика
  • printf(«Memory allocation failure, exiting.»); ---> perror(«malloc»); // выводит сообщение в поток stderr
  • &v[0] ---> v, &v[1] ---> v+1, ...
  • printf(«Input validation failure, please use the program with x(0), y(0), vx(0), vy(0), m1, m2 as the commant line options, exiting. \n»); ---> fputs(«Input validation failure, please use the program with x(0), y(0), vx(0), vy(0), m1, m2 as the commant line options, exiting.\n», stderr);
  • printf(«All iterations successful, collision did not occur in given time \n»); ---> puts(«All iterations successful, collision did not occur in given time»);
  • if(output != (FILE*)NULL) ---> if(output != NULL)
  • char ans; ... ans = getchar(); ---> int ans; ... // «Ловушка» EOF
  • printf(«\n»); ---> putchar('\n');
  • j = j + time_scaling; ---> j += time_scaling;
anonymous
()
Ответ на: комментарий от anonymous

1, 6 - не знал, спасибо. Остальное понятно, знал, но не ясно, почему это лучше. Где можно почитать?

tyakos ★★★
() автор топика
Ответ на: комментарий от tyakos

tyakos

1, 6 - не знал, спасибо.

Пожалуйста.

tyakos

Остальное понятно, знал, но не ясно, почему это лучше. Где можно почитать?

Это вопрос личных предпочтений.

  • 2,4,5,8 - сокращенная запись;
  • 3 - сообщения об ошибках лучше писать в stderr, чем в stdout, чтобы пользователь вашей программы имел возможность перенаправить стандартный вывод и сообщения об ошибках в разные файлы;
  • 7 - «\n» - просим компилятор вывести строку, '\n' - просим его вывести один символ.
Deleted
()
Ответ на: комментарий от tyakos

tyakos

Буду рад нормальной критике и советам.

Это, фактически, первая моя программа, написаная от начала до конца...

Молодцом, так держать!

Deleted
()
Ответ на: комментарий от tyakos

Почитал ещё, про эти curses. С их помощью можно вообще красиво реализовать отрисовку и прочее, но в моём случае - перебор. Наверное, буду как-нибудь читать stdin + usleep.

tyakos ★★★
() автор топика
Ответ на: комментарий от tyakos

Нет, проблемы. Следовательно, вопрос. Как прервать выполнение программы при вводе, не используя curses? Если я просто буду набирать что-либо, оно же не попадёт в stdin? Или попадёт? Часа через 1.5-2 потестирую сам, но может кто-то уже сталкивался?

tyakos ★★★
() автор топика
Ответ на: комментарий от tyakos

Нормально, curses ведь для терминалов и расчитан.

bk_ ★★
()
Ответ на: комментарий от bk_

Скорее всего, мой вопрос был глупым. Почитал ещё, теперь могу перефразировать вопрос. Как дать пользователю т времени, чтобы ввести char, иначе возвратить какое-то значение? Без curses. И желательно, чтобы ещё и enter не надо было нажимать.

tyakos ★★★
() автор топика
Ответ на: комментарий от tyakos

int answer_yn; // line 13

return sqrt((x[a] - x)*(x[a] - x) + (y[a] - y)*(y[a] - y)); // line 251

anonymous
()
Ответ на: комментарий от tyakos
int answer_yn; // line 13

...

return sqrt((x[a] - x[b])*(x[a] - x[b]) + (y[a] - y[b])*(y[a] - y[b])); // line 251
anonymous
()
Ответ на: комментарий от tyakos

А, нет. getchar просто ест /n, который остался после scanf.

tyakos ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.