Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > С++ под Unix и Linux


Автор: Tuman18 16.9.2016, 19:18
Ответьте, пожалуйста, нубу на вопрос: Чем программирование на С++ под Unix отличается от того же под Linux (конкретно, Ubuntu)?

Странный вопрос? Сейчас расскажу почему он у меня возник.

Появился у нас в универе предмет «основы Unix-подобных систем». Но, видно, универ у нас убогий и нас стали обучать Unix-у на эмуляторе Cygwin установленном под Windows XP... Написали мы три маленькие программки на с++, скомпилировали g++, запустили, работает. Дома эти программки надо доделать согласно вариантов... У меня дома установлена Ubuntu 14.04, да вот беда, программки эти, принесенные с университета, не компилируются, выдают кучу ошибок... Вот и стало интересно, почему так. Или программирование под Unix и Ubuntu отличается или это только под эмулятором другой компилятор или это из-за того что я такой нуб... Знает кто?

P.S. Если вина моя, официально разрешаю бить и ругать.

Автор: _zorn_ 16.9.2016, 20:53
Вот и давайте проявлять любопытство (на будущее - система не имеет значения).
Ошибки - я понял что вы постеснялись, но именно они указывают что у вас не так. 
Скорей всего тупо не установлен g++ дома. 

Автор: Tuman18 16.9.2016, 23:04
Ах да... :)
user posted image

А это то что я пытался скомпилировать.

Код

#include <iostream>
#include <stdio.h>
#include <cstdio>
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#define STOP ""
using namespace std;
struct UNIT
{ char name[20]; int amount;
  float price;} work;
int len = sizeof(UNIT);
int fdesc;
char fname[] = "list";

void sozd()
{
  fdesc=open (fname, O_WRONLY | O_CREAT);
  for(int i=1;i<10;i++)
  { puts ("Введите наименование: ");
  getchar();
    gets (work.name);
    if (strcmp(work.name, STOP) == 0) break;
    puts ("Введите количество и цену: ");
      scanf ("%i%f", &work.amount, &work.price);
    write(fdesc, &work, len);
  }

  close (fdesc);
}

void correct()
{
  char s[20]; float c;
  puts ("Введите наименование: ");
  getchar();
  gets(s);
  puts ("Введите новую цену: ");
  scanf("%f",&c);
  fdesc=open (fname, O_RDWR);
  for(int i=0;i<10;i++)
  { int res = read(fdesc, &work, sizeof(UNIT));
    if (res==0) break;
    if (strcmp(work.name, s) == 0)
      { work.price = c;
        lseek(fdesc, -len, 1);
        write (fdesc, &work, len);
          break;
      }
  }
  close(fdesc);
}

void vyvod()
{
  fdesc=open (fname, O_RDONLY);
  for(int i=0;i<10;i++)
    { int res = read(fdesc,&work, len);
      if (res == 0) break;
      printf ("name=%s; amount=%i; price=%f;\n",
        work.name, work.amount, work.price);
    }
    close(fdesc);
}

int main()
{
int r;
puts ("Режимы работы:");
puts ("1 - создание файла; 2 - корректировка ; 3 - вывод");
puts ("Введите режим: ");
scanf ("%i", &r);
switch (r) {
   case 1 : sozd(); break;
   case 2 : correct(); break;
   case 3 : vyvod(); break; }
}


Автор: xvr 16.9.2016, 23:52
В программе ошибка - не хватает #include <string.h>
То, что на cygwin'е это собралось - чистая случайность (string.h оказался включен через какой то другой include файл). Разные версии компилятора. Запустите g++ --version на обоих системах и сравните версии

Автор: Tuman18 17.9.2016, 16:10
Спасибо! include добавил - ошибки пропали, варнинги остались. Зато теперь компилируется и работает!
Версии g++, действительно, очень разные: Ubuntu - 4.8.4, cygwin - 2.95.5/

Автор: xvr 17.9.2016, 16:25
Версии слишком разные (а cygwin явно слишком древний).
А варнинги вполне по делу - не рекомендуется функция gets к применению. Используйте fgets вместо нее

Автор: bsa 20.9.2016, 11:21
Во-первых, речь идет о программе на С++. Тут надо использовать iostream, вместо gets/fgets/open/read/write/scanf/printf...
Во-вторых, подключать надо не string.h, а cstring, так как мы пишем на С++.
В-третьих, open с флагом O_CREAT предполагает наличие третьего параметра, например: S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH

Сколько лет прошло, а в ВУЗах ничего не изменилось. Как было отставание полтора десятка лет, так и осталось...

Автор: azesmcar 20.9.2016, 11:47
Цитата(bsa @  20.9.2016,  11:21 Найти цитируемый пост)
Как было отставание полтора десятка лет, так и осталось.

ну почему же? сейчас они уже отстают на два десятка лет ;) все меняется...

Автор: bsa 20.9.2016, 12:45
azesmcar, ну сейчас хотя бы cygwin. В мое время (конец девяностых - начало двухтысячных) был Borland C++ 3.0 smile

Автор: Olej 30.11.2016, 18:55
Цитата(Tuman18 @ 16.9.2016,  19:18)
Ответьте, пожалуйста, нубу на вопрос: Чем программирование на С++ под Unix отличается от того же под Linux (конкретно, Ubuntu)?


Ничем. smile 

Автор: bankuss 14.12.2016, 08:38
Цитата(Tuman18 @ 16.9.2016,  19:18)
Ответьте, пожалуйста, нубу на вопрос: Чем программирование на С++ под Unix отличается от того же под Linux (конкретно, Ubuntu)?

Ничем. smile


раз ничем, то тогда такой вопрос:
так как недавно перелез на Мак, то решил пару прожек перекомпилить в новой системе. окружение у меня стандартное: xcode + command line tools + clang (так же есть отдельно и gcc), ОС последняя - Sierra.

взял исходники программы (она 2001 года, но код универсальный, под разные ОС, писан на чистом Си) залил в проект xcode. исправил небольшие синтаксические ошибки, стал собирать - все скомпилировалось, но линкер вываливает  с ошибкой типа Linker Error "duplicate symbol" итд итп (сейчас точно не напишу - проект дома). причем такое чувство что он ВСЕ переменные проекта записал в дубли.

запускаю этот проект на linux - все компилируется и собирается нормально. т.е. ошибок в коде нет. (там их и нет -ибо clang компилирует нормально) а вот что нужно линкеру - вообще не ясно. до настроек линкера я так и не добрался, в xcode все как-то запрятано.

Автор: Olej 17.12.2016, 19:15
Цитата(bankuss @ 14.12.2016,  08:38)

взял исходники программы (она 2001 года, но код универсальный, под разные ОС, писан на чистом Си)

На C (хотя тема здесь про C++) не бывает "универсальный код"!
В Linux/UNIX - это POSIX. И только это - C.

В Windows то, что называют C - это нонсенс, чёрт знает что...

Очевидно, у вас в MacOS - это что-то промежуточное между... smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)