программа написанная в DOC:
в начале кода всякие #define объявления
int main(int argc , char** argv[] ) // 1-ый - вариант
{
//int argc;
//char *argv; //2-ой - вариант
вопрос первый к выше написанному коду, как правильно записывать по 1-ому или 2-ому?
продолжение кода
...
идут объявление переменных и интерсует переменная term
...
int term;
...
проходят некие операции программы
...
term = KF_Next
KF_Next объявленно в одной из нестандартных библиотек:
/* перемещение по полям */
...
#define KF_next (-132)
...
прочитал "мат часть":
Цитата
Директива #define позволяет задать имя для некоторого фрагмента текста, такое обозначение называется макроопределением или макросом. Формат записи: #define NAME Текст замены. Препроцессор просматривает текст программы и заменяет NAME текстом замены. Например: #define COUNT 100 в тексте программы все имена COUNT будут заменяться на 100.
-132 - это число которое передаеться в term, тогда причем здесь перемещение по полям?
ребята что может означать это число, ничего не понимаю.
Iron Bug
7.10.2011, 11:58
1. для main однозначно char *argv[]. тут не вопрос "как записывать", а определение main функции, так что без вариантов. это массив указателей на строки. впрочем, можно записать это как char ** argv. однако, обычно такая запись означает динамическое размещение, а в данном случае его нет. поэтому просто красивее писать как массив, ибо он имеет фиксированную длину.
2. да, -132 будет присвоено данной переменной. что означают какие-то "поля" - понятия не имею, надо разбираться в самом коде. к #define это никакого отношения не имеет.
Спасибо что откликнулся.
другой вопрос в програмном коде записано вот так:
if ( F_open( argv [0], "tpp.flb") != 0)
return fputs("cannot open form library 'tpp.flb'\n", stderr);
пробую заменить на
if ( std::ofstream( argv [0], "tpp.flb") != 0)
return fputs("cannot open form library 'tpp.flb'\n", stderr);
понимаю что ошибка, но как правильно?
или надо это делать через:
is_open - проверка, открыт ли файл
Iron Bug
7.10.2011, 15:19
в данном случае ofstream - это конструктор. и он никогда ничего не возвращает.
правильно будет
ofstream ofs;
ofs.open(filename, mode);
if(ofs.is_open()) { ... }
но у ofstream режим (mode) открытия файла никак не может быть "tpp.flb". там вполне конкретные константы или их комбинация. и F_open
не должен писать в массив аргументов argv (вообще нехорошо туда что-либо писать, да и незачем, по сути).
читать документацию на F_open и на ofstream::open.
Iron Bug, Благодарю)))) вопросы еще будут, извените за мою тупость)
#include <fstream>
ofstream inputStream;
tpp_pr.cpp:122: error: 'ifstream' was not declared in this scope
что за глупость?
Iron Bug
7.10.2011, 15:36
ну вот сюда их все и пиши. чтобы темы от начинающих не плодились. а то обозревать кучу разных тем с вопросами по основам программирования на С++ очень проблематично
да, и прежде чем писать код - нужно читать документацию. а лучше начать с чтения книжки Страуструпа, чтобы упорядочить общие познания о языке. ну и в сети есть море примеров использования всякого всего. например, есть замечательный справочный ресурс по плюсам:
http://www.cplusplus.com/reference/там есть поиск и можно найти и описания, и примеры.
Спасибо за ссылочку будет полезной
Цитата
замечательный справочный ресурс по плюсам:
http://www.cplusplus.com/reference/там есть поиск и можно найти и описания, и примеры.
пользую вот этим
http://www.cppreference.com/wiki/ru/io/open
Litkevich Yuriy
7.10.2011, 18:04
Цитата(TiiL @ 7.10.2011, 18:28)
tpp_pr.cpp:122: error: 'ifstream' was not declared in this scope
что за глупость?
надо заглянуть в файл
fstream и посмотреть какое отношение имеет
ifstream к
ofstream
Алексей1153
7.10.2011, 18:15
Цитата
программа написанная в DOC:
а что это, если не секрет ? )
Алексей1153,
Цитата
Цитата
программа написанная в DOC:
а что это, если не секрет ? )
Программа с экрана получала имя файла, в который записывает результаты расчета, и коэф-нт для этого расчета.
Litkevich Yuriy,
пробовал писать и ifstream и ofstream, ошибка таже самая, хотя в инете в примере
open
Синтаксис:
#include <fstream>
void fstream::open(const char *filename, openmode mode = default_mode);
Функция open() используется с файловыми потоками. Она открывает файл и связывает его с текущим потоком. Параметр mode по умолчанию имеет значение ios::in для потоков ввода (ifstream), ios::out для потоков вывода (ofstream) и ios::in|ios::out для файловых потоков (fstream). Если не удается вызов open(), то поток переходит в состояние non-good, которое может быть проверено.
Пример:
ifstream inputStream;
inputStream.open("file.txt");
if( !inputStream ) {
cerr << "Error opening input stream" << endl;
}
// или
if ( inputStream ) {
// использвование inputStream
}
всё должно работать, в чем же моя проблема((((
Алексей1153
10.10.2011, 13:20
TiiL, это чёрное окно называется консоль. С DOS она в винде не связана никак, разве что похожа текстовым интерфейсом
Алексей1153, да просто написанно это было тогда когда виндоусов не было еще...
Справился со своей синтаксической ошибкой
std::ifstream inputStream;
inputStream.open(...);
Теперь вылезает вот такое:
undefined reference to `rd_open(char*)'
неопределена ссылка что это то может означать?
в коде :
#define fname argv[1] /* Archive file name */
#define sname argv[2] /* Specimen's name */
int main(int argc, char **argv)
{
int fd;
int i;
char *s;
struct ifl itf [] =
{{"GGC", 0}, {"SGC", 0}, {"HEADL", 0} };
double range;
int flage = 0, sort_flage;
char string[256];
int term;
float x;
if ( argc < 2 )
{
fputs ( "bad spawn of gen processing", stderr );
return 1;
}
/* read items */
int item_sz = sizeof ( itf ) / sizeof ( itf [0] ); /* Qty of items needed */
if ( (fd = rd_open( fname)) < 0 /* get archive */
|| rd_fil(fd, &hdr) /* read file header */
|| rd_spec( fd, sname, &spec) /* find&read specimen header */
)
return FATAL;
Iron Bug
10.10.2011, 19:51
Цитата(TiiL @ 7.10.2011, 18:28)
tpp_pr.cpp:122: error: 'ifstream' was not declared in this scope
что за глупость?
а ты про пространство имён не забывай.
либо
using namespace std, либо
std::бла-бла-бла.
Iron Bug, с этим я разобрался вот вопрос мой, который выше твоего сообщения, остаёться открытый.
rd_open определен в другом файле как
Iron Bug, с этим я разобрался вот вопрос мой, который выше твоего сообщения, остаёться открытый.
rd_open определен в другом файле как
Iron Bug, с этим я разобрался вот вопрос мой, который выше твоего сообщения, остаёться открытый.
rd_open определен в другом файле, который я инклудю, как
extern FD rd_open(char* filename); /* readonly */
QT creator подсказывает, направляя на курсор на rd_open:
int rd_open( char* filename)
Вот не догоняю в чем причина? вообще не хочет компилиться(
Iron Bug
11.10.2011, 14:09
это значит, что он не понимает макроса FD и просто вместо него не видит никакого типа значения, возвращаемого из функции. а по умолчанию возврат - int, вот он и пытается предложить этот вариант.
Iron Bug, Если я правильно понимаю, FileData это и есть FD, то есть я ему должен передать значени FD, то есть я должен дать ему файл?
Iron Bug
11.10.2011, 20:47
я хз, что там конкретно инклюдить надобно с этим rd_open. это вообще работа с драйвером RAM-диска под никсами? я с ним не работала, но у него совсем другие параметры: там вроде блоки и ещё что-то. а если это не обращение к драйверу, то, скорее всего, какой-то заголовочник не включен.
ты уточняй, какая ось, какой компилятор и что ты собираешь, собственно. а то непонятно, что это вообще и откуда.
Разобрался! надо было всего то в файле .pro написать LIBS += /path/*.a прямую ссылку на библиотечный файл
Короче подключил всё что нужно всё комплиться но выдает вот такие ошибочки
E:\alexprojects\lib\debug\libsamum.a(dos_arch.o):dos_arch.cpp.data+0x8): multiple definition of `_fmode'
c:/qt/2010.05/mingw/bin/../lib/gcc/mingw32/4.4.0/../../../libmingw32.a(txtmode.o):txtmode.c.data+0x0): first defined here
Ребята, как быть? что это значит?
Iron Bug
12.10.2011, 12:05
Цитата(TiiL @ 12.10.2011, 9:57)
что это значит?
то и значит, что компилятор написал. ты читай текст-то!
написано: символ определён дважды. первый раз - тут: бла-бла-бла.
вот и думай, почему он у тебя дважды определён и как это разруливать, в соответствии с кодом и назначением данной переменной.
вообще, неплохо бы ещё обучиться поиском в гугле по номеру ошибки, если что непонятно. обычно в сети есть примеры и детальное объяснение всех ошибок для любого компилятора.
да текст я прочитал... первел что два раза определяю _fmode, ну например, находит он только txtmode.o. А что с ним делать и как не пойму...
Ладно буду ковыряться.
Извеняюсь за свою тупость.
Iron Bug
12.10.2011, 20:45
_fmode - дефолтный формат для файлов (текст или бинарник), глобальная переменная. и у тебя она в двух модулях определена. бери исходники, ищи эти определения, и правь так, чтобы осталось только одно.
нашел _fmode в одном из файлов "своих" библиотеке dos_arch.cpp
int _fmode = O_BINARY;
закоментировал его и всё заработало.
и теперь заключительный момент... как соединить два проекта:
1-ый tpp;
2-0й tpp_form:
форма диалогового окна, с которой берется имя файла вывода результата программы tpp, некое число для расчета программы tpp, запуск с программы tpp производиться с кнопки
void TPP::on_GoButton_clicked()
?
мысль такая весь проект консольный tpp, который состоит из
1-ое:
#include объявление множество файлов библиотек(хейдеров)
2-ое:
объявлений переменных так понимаю глобальных например
#define fname argv[1] /* Archive file name */
#define sname argv[2] /* Specimen's name */
3-ие:
int main(char argc, char **argv)
{
"код программы"
}
"код программы" поместить в tpp_form под функции int AppCons(void) и эту функцию вызывать по нажатию кнопки void TPP::on_GoButton_clicked(), тогда вопросы такие:
как быть char argc char **argv ?
и будут ли данные с формы занаситься в сам код программы для вычисления?
PS: если я выразился не понятно напишите что именно не ясно. буду интерпретировать вопрос. Спасибо за понимание!
PSS:
Iron Bug, тебе отдельное спасибо, за терпение и ценные советы
Iron Bug
13.10.2011, 9:31
ты чего-то недопонимаешь во взаимодействии программы и интерфейса.
программа чётко определяет два параметра. а уж как там интерфейс их передаёт и откуда берёт - надо смотреть сам код интерфейса. оттуда и исходить.
Задача такая:
из некого большого приложения через консоль запускается моя программа.
то есть в консоль записывается "имя.exe" "архив данных".sar и "название образца, лежащего в этом архиве".
я так понима в argc помещается "имя.exe" - c этим всё понятно.
в argv[1] argv[2] соотвественно архив и имя образца. Вопрос как argv[1] argv[2] поместить в fname и sname используемые под функции, находящейся в том же самом проекте, но в не в main.cpp, а в dialog.cpp? буду очень признательно, а пока читаю мат. часть. моджет что нарою.
Litkevich Yuriy
6.11.2011, 18:13
Цитата(TiiL @ 18.10.2011, 12:06)
Вопрос как argv[1] argv[2] поместить в fname и sname используемые под функции, находящейся в том же самом проекте, но в не в main.cpp, а в dialog.cpp?
не понял связи между ними. Накидай схему того что у тебя есть, понагляднее.
Спасибо отликнулись, но пока с этим проект отложен до лучших времен.
вопрос такой че то не вкуриваю как и что.
есть такое
int main()
{
int file;
file = open("file.txt", O_CREAT | O_WRONLY);
if(file == -1){
perror("error");
}
write(file,"Open File", strlen(" Openfile"));
close(file);
getch();
return 0;
}
какого примерно(требуется пример) записать write что бы в файл записывались значения sizeof или то что бы записывалось, точто происходит под read(fd, fil, sizeof(ZA_Fil))?
Iron Bug
18.11.2011, 15:35
если у тебя файл не открылся, то запись туда невалидна. надо делать выход после сообщения об ошибке.
Iron Bug, ты непонял, всё работает нормально, нужен пример write чтобы в файл записывались данные например значение sizeof. вот как fprintf(file, " %d", sizeof); только чтобы было через write.
Iron Bug
18.11.2011, 16:33
Цитата(TiiL @ 18.11.2011, 19:29)
всё работает нормально
нет. эта программа свалится, если по каким-то причинам не сможет создать файл. например, если нет прав его создавать в текущем каталоге.
касательно печати - sprintf и потом - write
Iron Bug,
Цитата
касательно печати - sprintf и потом - write
не понял немножко поясни(
Iron Bug
18.11.2011, 16:45
а что тут непонятного? ты уже прочитал документацию на обе функции?
первая печатает в строку, вторая - из строки в файл.
я слегка маневр не понял про печатает в строку а потмо эту строку записываю в файл
Спасибо разобрался со всем...
появился вопрос такой :
char* TPPout;
TPPout = ui->OpenFileName->text();
if( (df = fopen ( TPPout , "wt" )) == NULL )
вот так пытаюсь передать имя файла. ошибки
cannot convert 'QString' to 'char*' in assignment.
не догоняю как:
FILE *fopen(const char *filename, const char *mode)
как из ui->OpenFileName->text(); получить const char *filename.
OpenFileName это QLineEdit.
не догоняю как TPPout объявить?
sidsukana
22.11.2011, 9:24
qPrintable(QString);
В твоем случае это будет так
qPrintable(ui->OpenFileName->text());
Еще вот так можно:
QString filename = ui->OpenFileName->text();
char* fname = filename.toAscii().data();
Собственно 1 вариант это макрос на основе 2го.
опять я со своими глупыми вопросами:
int filelength (int fd)
{
struct stat FileData;
fstat(fd, &FileData);
return FileData.st_size;
}
выдаетё ошибки
dos_linux.cpp: In function 'int filelength(int)':
dos_linux.cpp:11: error: new declaration 'int filelength(int)'
Решил проблему: написав int long filelength(int fd).
c:\qt\2010.05\mingw\bin\../lib/gcc/mingw32/4.4.0/../../../../include/io.h:297: error: ambiguates old declaration 'long int filelength(int)'
перевожу:
11: Ошибка: новое объявление filelength();
c:\qt\2010.05\mingw\bin\../lib/gcc/mingw32/4.4.0/../../../../include/io.h:297: error:смущает старое объявление.
что то не могу понять как с этим бороться?
Iron Bug
2.12.2011, 11:42
у тебя просто два раза определена одна и та же функция. убери одну копию.
Ребята подскажите как справить с MAXFlOAT, #include<values.h> не помогает... я так понимаю это под unix вообще переменнная заточена, а как мне в win объявить максимальное значение с плавающей точкой?
Нашёл решение: взял values.h, вытащил из него #define MAXFLOAT 3.40282347E+38F
Цитата(TiiL @ 14.12.2011, 12:52)
Нашёл решение: взял values.h, вытащил из него #define MAXFLOAT 3.40282347E+38F
Открой для себя
http://www.cplusplus.com/reference/std/lim...numeric_limits/ и забудь о всяких константах.
BRE, Ценный совет блогадарствую)
Ребят, чем или как заменить farcalloc? Функция уникальна для системы DOS.
Вроде как решил заменив на malloc.
появились следующие ошибки invalid conversion from 'void*' to 'float*'
REMALLOC ( f.Seqv, NE_TPP, float);
объявление :
# define REMALLOC(p, l, x) /**/ \
if (p) \
p = realloc ( p, sizeof(x) * l ); \
else \
p = ( x* ) (float*)malloc ( sizeof(x) * l )
# define REALLOC(x, n) if(x) x = realloc(x, n); else x = calloc(1, n)
Iron Bug
15.12.2011, 12:50
( x* ) (float*)- это что ещё за нафиг?
Цитата(Iron Bug @ 15.12.2011, 13:50)
( x* ) (float*)- это что ещё за нафиг?
Это же макрос там и не так можно извратится!
Так будет работать и более читабельно:
# define REMALLOC(p, len, type) /**/ \
if (p) \
p = ( type* )realloc ( p, sizeof(type) * len ); \
else \
p = ( type* )malloc ( sizeof(type) * len );
Добрый День, С прошедшими праздниками. И снова я со своими ошибками.
собираю проект, к нему подключаю библиотеки:
INCLUDEPATH +=../lib/
INCLUDEPATH +=../include/
INCLUDEPATH +=../cal_lib/
INCLUDEPATH +=../cal_include/
QMAKE_LIBDIR +=../cal_lib/debug/
LIBS += ../cal_lib/debug/libcal_lib.a\
../lib/debug/libsamum.a
выдаёт ошибки:
E:\works\alexproject\fatigue/fatigue.cpp:91: undefined reference to `rw_cur(char*, _iobuf*, _iobuf*)'
E:\works\alexproject\fatigue/fatigue.cpp:91: undefined reference to `rw_cst(char*, _iobuf*)'
E:\works\alexproject\fatigue/fatigue.cpp:91: undefined reference to `rw_jnt(char*, _iobuf*)'
хедеры где объявлены rw_cur и т.д. вставляю через include.
получается коды:
мой проект:
if ( rw_cur ( cfile, fd_res, fd_res_a )
|| rw_cst ( c_s_file, fd_res )
|| rw_jnt ( c_j_file, fd_res )
)
хедерфайл:
extern int rw_cur ( char * c_file, FILE * fd_res, FILE * fd_res_a );
extern int rw_cst ( char * c_s_file, FILE * fd_res );
extern int rw_jnt ( char * c_j_file, FILE * fd_res );
в чем я нахомутал?
Цитата(TiiL @ 13.1.2012, 10:18)
в чем я нахомутал?
Линкер тебе говорит, что он не может найти реализацию этих функций.
Iron Bug
14.1.2012, 13:22
Цитата
LIBS += ../cal_lib/debug/libcal_lib.a\
../lib/debug/libsamum.a
вот это - это не две строки, а ОДНА. потому что перенос без пробелов. линкер это воспринимает как один путь до библиотеки и в итоге не видит ни того, ни другого файла.
Цитата(Iron Bug @ 14.1.2012, 13:22)
Цитата
LIBS += ../cal_lib/debug/libcal_lib.a\
../lib/debug/libsamum.a
вот это - это не две строки, а ОДНА. потому что перенос без пробелов. линкер это воспринимает как один путь до библиотеки и в итоге не видит ни того, ни другого файла.
Так попробовав вариант:
LIBS +=../path/
LIBS +=../path1/
Так и так не получается(
Как еще можно присоединить библиотеки?
да ты там просто пробел поставь. чтобы у тебя было две строки, а не одна.
Iron Bug, Спасибо.
Поясните мне, пожалуйста, такую вещь maxVаlue() - это верхний предел интервала(переводил magic Gooddy) или это максимальноя значение?
есть width() про него пишут возвращает ширину интервала, ширина недействительных интервалов 0.0, иначе результат MaxValue().
Смогу ли я с помощью этих двух функций сделать getmaxx()(возвращает максимальную координату значение х экрана) ?
Или, извените, я вообще велосипед придумываю? тогда помогите пожалуйста...
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.